ObjectStackObjectStack

Storage

Storage protocol schemas

Storage Service Protocol

Defines the API contract for client-side file operations. Focuses on secure, direct-to-cloud uploads (Presigned URLs) rather than proxying bytes through the API server.

Source: packages/spec/src/api/storage.zod.ts

TypeScript Usage

import { CompleteChunkedUploadRequestSchema, CompleteChunkedUploadResponseSchema, CompleteUploadRequestSchema, FileDownloadUrlResponseSchema, FileTypeValidationSchema, FileUploadResponseSchema, GetPresignedUrlRequestSchema, InitiateChunkedUploadRequestSchema, InitiateChunkedUploadResponseSchema, PresignedUrlResponseSchema, RawUploadResponseSchema, UploadChunkRequestSchema, UploadChunkResponseSchema, UploadProgressSchema } from '@objectstack/spec/api';
import type { CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CompleteUploadRequest, FileDownloadUrlResponse, FileTypeValidation, FileUploadResponse, GetPresignedUrlRequest, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, PresignedUrlResponse, RawUploadResponse, UploadChunkRequest, UploadChunkResponse, UploadProgress } from '@objectstack/spec/api';

// Validate data
const result = CompleteChunkedUploadRequestSchema.parse(data);

CompleteChunkedUploadRequest

Properties

PropertyTypeRequiredDescription
uploadIdstringMultipart upload session ID
parts{ chunkIndex: integer; eTag: string }[]Ordered list of uploaded parts for assembly

CompleteChunkedUploadResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +266 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
data{ fileId: string; key: string; size: integer; mimeType: string; … }

CompleteUploadRequest

Properties

PropertyTypeRequiredDescription
fileIdstringFile ID returned from presigned request
eTagstringoptionalS3 ETag verification

FileDownloadUrlResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +266 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
data{ url: string }

FileTypeValidation

Properties

PropertyTypeRequiredDescription
modeEnum<'whitelist' | 'blacklist'>whitelist = only allow listed types, blacklist = block listed types
mimeTypesstring[]List of MIME types to allow or block (e.g., "image/jpeg", "application/pdf")
extensionsstring[]optionalList of file extensions to allow or block (e.g., ".jpg", ".pdf")
maxFileSizeintegeroptionalMaximum file size in bytes
minFileSizeintegeroptionalMinimum file size in bytes (e.g., reject empty files)

FileUploadResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +266 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
data{ path: string; name: string; size: integer; mimeType: string; … }Uploaded file metadata

GetPresignedUrlRequest

Properties

PropertyTypeRequiredDescription
filenamestringOriginal filename
mimeTypestringFile MIME type
sizenumberFile size in bytes
scopestringTarget storage scope (e.g. user, private, public)
bucketstringoptionalSpecific bucket override (admin only)

InitiateChunkedUploadRequest

Properties

PropertyTypeRequiredDescription
filenamestringOriginal filename
mimeTypestringFile MIME type
totalSizeintegerTotal file size in bytes
chunkSizeintegerSize of each chunk in bytes (minimum 5MB per S3 spec)
scopestringTarget storage scope
bucketstringoptionalSpecific bucket override (admin only)
metadataRecord<string, string>optionalCustom metadata key-value pairs

InitiateChunkedUploadResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +266 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
data{ uploadId: string; resumeToken: string; fileId: string; totalChunks: integer; … }

PresignedUrlResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +266 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
data{ uploadUrl: string; downloadUrl?: string; fileId: string; method: Enum<'PUT' | 'POST'>; … }

RawUploadResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +266 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
data{ key: string }

UploadChunkRequest

Properties

PropertyTypeRequiredDescription
uploadIdstringMultipart upload session ID
chunkIndexintegerZero-based chunk index
resumeTokenstringResume token from initiate response

UploadChunkResponse

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +266 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
data{ chunkIndex: integer; eTag: string; bytesReceived: integer }

UploadProgress

Properties

PropertyTypeRequiredDescription
successbooleanOperation success status
error{ code: Enum<'VALIDATION_ERROR' | 'INVALID_FIELD' | 'MISSING_REQUIRED_FIELD' | … +266 more>; message: string; category?: string; httpStatus?: integer; … }optionalError details if success is false
meta{ timestamp: string; duration?: number; requestId?: string; traceId?: string }optionalResponse metadata
data{ uploadId: string; fileId: string; filename: string; totalSize: integer; … }

On this page