API Reference/Storage API
Storage Instance
Object-style API for S3 file operations
Storage Instance
The StorageInstance
provides a clean, object-style API for all S3 operations. It groups related operations under namespaces for better discoverability.
Getting the Storage Instance
The storage
instance comes from your upload configuration, not created separately:
// lib/upload.ts
import { createUploadConfig } from 'pushduck/server'
const { storage, s3, config } = createUploadConfig()
.provider("cloudflareR2",{
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region: 'auto',
endpoint: process.env.AWS_ENDPOINT_URL,
bucket: process.env.S3_BUCKET_NAME,
accountId: process.env.R2_ACCOUNT_ID,
})
.defaults({
maxFileSize: '10MB',
acl: 'public-read',
})
.paths({
prefix: 'uploads',
generateKey: (file, metadata) => {
const userId = metadata.userId || 'anonymous'
const timestamp = Date.now()
const randomId = Math.random().toString(36).substring(2, 8)
return `${userId}/${timestamp}/${randomId}/${file.name}`
},
})
.build()
// Export the storage instance
export { storage }
Then use it in your API routes:
// app/api/files/route.ts
import { storage } from '@/lib/upload'
export async function GET() {
const files = await storage.list.files()
return Response.json({ files })
}
API Structure
The storage instance organizes operations into logical namespaces:
storage.list.* // File listing operations
storage.metadata.* // File metadata operations
storage.download.* // Download and URL operations
storage.upload.* // Upload operations
storage.delete.* // Delete operations
storage.validation.* // Validation operations
Configuration Methods
getConfig()
Get the current configuration (read-only):
const config = storage.getConfig()
console.log(config.provider.bucket) // 'my-bucket'
getProviderInfo()
Get provider information:
const info = storage.getProviderInfo()
// Returns: { provider: 'aws-s3', bucket: 'my-bucket', region: 'us-east-1' }
Error Handling
All storage operations throw structured PushduckError
instances:
import { isPushduckError } from 'pushduck/server'
try {
const files = await storage.list.files()
} catch (error) {
if (isPushduckError(error)) {
console.log(error.code) // Error code
console.log(error.context) // Additional context
}
}
TypeScript Support
The storage instance is fully typed. Import types as needed:
import type { FileInfo, ListFilesOptions } from 'pushduck/server'
const options: ListFilesOptions = {
prefix: 'uploads/',
maxResults: 100
}
const files: FileInfo[] = await storage.list.files(options)