@qrvey/object-storage 2.0.3-beta → 2.0.4-1170

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/core/providerRegistry.ts","../../src/core/retry.ts","../../src/core/logger.ts","../../src/core/instrumentation.ts","../../src/core/concurrency.ts","../../src/core/batch.ts","../../src/core/range.ts","../../src/providers/aws-s3/config.ts","../../src/providers/aws-s3/clientFactory.ts","../../src/core/clientCache.ts","../../src/core/cacheKey.ts","../../src/providers/aws-s3/errors.ts","../../src/providers/aws-s3/AwsS3Provider.ts","../../src/providers/azure-blob/config.ts","../../src/providers/azure-blob/clientFactory.ts","../../src/providers/azure-blob/errors.ts","../../src/providers/azure-blob/multipartSessionStore.ts","../../src/providers/azure-blob/AzureBlobStorageProvider.ts","../../src/clientFactory.ts","../../src/index-v2.ts"],"names":["StorageError","Error","constructor","options","message","code","retryable","provider","requestId","cause","name","ThrottledError","retryAfterMs","NotFoundError","AuthError","ValidationError","ConfigurationError","NetworkError","IntegrityError","MultipartSessionError","envDefaults","Map","registerProviderEnvDefaults","providerId","factory","set","resolveOptionsFromEnv","env","process","_a","OBJECT_STORAGE_SERVICE","toLowerCase","get","undefined","keys","join","resolveObjectStorageOptions","backOff","LoggerService","logger","recordRetry","warn","recordThrottle","instrument","operation","fn","startedAt","Date","now","result","debug","durationMs","error","meta","DEFAULTS","numOfAttempts","startingDelayMs","maxDelayMs","isRetryableError","withRetry","policy","shouldRetry","retry","startingDelay","maxDelay","jitter","attempt","sleep","Math","min","ms","Promise","resolve","setTimeout","createLimiter","ceiling","max","floor","minMax","growthThreshold","inFlight","consecutiveSuccesses","queue","release","shift","acquire","push","onThrottle","adaptive","reduced","onSuccess","run","pending","length","currentMax","chunk","items","size","chunks","i","slice","mapBatched","batchSize","limiter","batches","all","map","batch","index","BOUNDED","SUFFIX","parseRange","input","bounded","exec","start","Number","end","suffix","suffixLength","toRangeHeader","range","AWS_S3_PROVIDER_ID","isAwsS3StorageOptions","getDefaultAwsS3OptionsFromEnv","region","AWS_REGION","AWS_DEFAULT_REGION","auth","kind","S3Client","fromNodeProviderChain","fromTemporaryCredentials","fromTokenFile","NodeHttpHandler","Agent","DEFAULT_MAX_SIZE","ClientCache","entries","getOrCreate","key","existing","delete","client","maxSize","oldestKey","next","value","oldest","onEvict","clear","createHash","stableCacheKey","parts","JSON","stringify","sortDeep","hashSecret","update","digest","Array","isArray","Object","sort","reduce","acc","DEFAULT_HTTP","connectionTimeoutMs","requestTimeoutMs","maxSockets","cache","destroy","getAwsS3Client","endpoint","http","authKeyParts","buildClient","clearAwsS3ClientCache","credentials","credentialsFor","requestHandler","connectionTimeout","requestTimeout","httpsAgent","keepAlive","params","RoleArn","roleArn","ExternalId","externalId","RoleSessionName","tokenFile","webIdentityTokenFile","accessKeyId","secret","secretAccessKey","THROTTLE_NAMES","Set","NOT_FOUND_NAMES","AUTH_NAMES","mapAwsError","aws","String","status","$metadata","httpStatusCode","base","has","retryAfter","$response","headers","GetObjectCommand","HeadObjectCommand","PutObjectCommand","DeleteObjectCommand","DeleteObjectsCommand","ListObjectsV2Command","HeadBucketCommand","CreateMultipartUploadCommand","UploadPartCommand","CompleteMultipartUploadCommand","AbortMultipartUploadCommand","ListPartsCommand","ListMultipartUploadsCommand","getSignedUrl","Upload","PassThrough","Readable","DELETE_BATCH_SIZE","DEFAULT_PRESIGN_SECONDS","AwsS3Provider","config","bucketName","multipart","retryPolicy","resolved","AwsS3MultipartClient","send","catch","reject","getObject","response","Bucket","Key","Range","VersionId","versionId","body","Body","contentLength","ContentLength","contentType","ContentType","contentEncoding","ContentEncoding","contentDisposition","ContentDisposition","contentLanguage","ContentLanguage","cacheControl","CacheControl","etag","ETag","lastModified","LastModified","metadata","Metadata","getObjectProperties","upload","uploadStream","mapUploadOptions","queueSize","partSize","partSizeBytes","done","createWriteStream","stream","then","abort","deleteMany","batchResults","Delete","Objects","Quiet","failed","Errors","e","Message","deleted","flat","list","Prefix","prefix","MaxKeys","limit","ContinuationToken","continuationToken","Contents","toObjectSummary","nextToken","NextContinuationToken","iterate","token","page","pageSize","listAll","item","headBucket","exists","getDownloadUrl","expiresIn","expiresInSeconds","getUploadUrl","url","create","uploadId","UploadId","uploadPart","partNumber","contentLengthBytes","PartNumber","getPartUploadUrl","complete","MultipartUpload","Parts","a","b","p","listParts","Size","listUploads","Uploads","u","initiatedAt","Initiated","content","AZURE_BLOB_PROVIDER_ID","isAzureBlobStorageOptions","getDefaultAzureBlobOptionsFromEnv","connectionString","AZURE_STORAGE_CONNECTION_STRING","BlobServiceClient","StorageSharedKeyCredential","DefaultAzureCredential","getAzureBlobServiceClient","clearAzureBlobClientCache","fromConnectionString","endpointFor","accountName","accountKey","sasToken","replace","connection","AUTH_CODES","NOT_FOUND_CODES","mapAzureError","azure","details","errorCode","statusCode","DEFAULT_TTL_MS","InMemoryMultipartSessionStore","ttlMs","sessions","session","evictExpired","isExpired","appendBlock","block","blocks","containerName","blobNamePrefix","values","filter","s","blobName","startsWith","createdAt","BlobSASPermissions","randomUUID","PART_NUMBER_WIDTH","AzureBlobStorageProvider","serviceClient","container","getContainerClient","AzureBlobMultipartClient","multipartStore","getBlockBlobClient","offset","count","resolveRange","download","readableStreamBody","rangeInput","props","total","getProperties","blob","mapHttpHeaders","blobHTTPHeaders","data","Buffer","from","aborted","iterator","listBlobsFlat","byPage","maxPageSize","segment","blobItems","properties","generateSasUrl","permissions","parse","expiresOn","store","blockIdFor","padStart","toString","blockId","resolveBlockBody","stageBlock","blockIds","commitBlockList","_key","blobContentType","blobContentEncoding","blobCacheControl","blobContentDisposition","blobContentLanguage","getObjectStorageClient","bucket","optionsHash","buildProvider","clearObjectStorageClientCache","OBJECT_STORAGE_PROVIDERS","freeze","AWS_S3","AZURE_BLOB_STORAGE"],"mappings":"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","sourcesContent":["export interface StorageErrorOptions {\n code: string;\n message: string;\n retryable: boolean;\n provider?: string;\n requestId?: string;\n cause?: unknown;\n}\n\ntype SubclassOptions = Omit<StorageErrorOptions, 'code' | 'retryable'> & {\n code?: string;\n retryable?: boolean;\n};\n\nexport class StorageError extends Error {\n readonly code: string;\n readonly retryable: boolean;\n readonly provider?: string;\n readonly requestId?: string;\n readonly cause?: unknown;\n\n constructor(options: StorageErrorOptions) {\n super(options.message);\n this.name = new.target.name;\n this.code = options.code;\n this.retryable = options.retryable;\n this.provider = options.provider;\n this.requestId = options.requestId;\n this.cause = options.cause;\n }\n}\n\nexport interface ThrottledErrorOptions extends SubclassOptions {\n retryAfterMs?: number;\n}\n\nexport class ThrottledError extends StorageError {\n readonly retryAfterMs?: number;\n\n constructor(options: ThrottledErrorOptions) {\n super({ code: 'THROTTLED', ...options, retryable: true });\n this.retryAfterMs = options.retryAfterMs;\n }\n}\n\nexport class NotFoundError extends StorageError {\n constructor(options: SubclassOptions) {\n super({ code: 'NOT_FOUND', retryable: false, ...options });\n }\n}\n\nexport class AuthError extends StorageError {\n constructor(options: SubclassOptions) {\n super({ code: 'AUTH', retryable: false, ...options });\n }\n}\n\nexport class ValidationError extends StorageError {\n constructor(options: SubclassOptions) {\n super({ code: 'VALIDATION', retryable: false, ...options });\n }\n}\n\nexport class ConfigurationError extends StorageError {\n constructor(options: SubclassOptions) {\n super({ code: 'CONFIGURATION', retryable: false, ...options });\n }\n}\n\nexport class NetworkError extends StorageError {\n constructor(options: SubclassOptions) {\n super({ code: 'NETWORK', retryable: true, ...options });\n }\n}\n\nexport class IntegrityError extends StorageError {\n constructor(options: SubclassOptions) {\n super({ code: 'INTEGRITY', retryable: false, ...options });\n }\n}\n\nexport class MultipartSessionError extends StorageError {\n constructor(options: SubclassOptions) {\n super({ code: 'MULTIPART_SESSION', retryable: false, ...options });\n }\n}\n","import { BaseStorageOptions, ObjectStorageOptions } from './config';\nimport { ConfigurationError } from './errors';\n\ntype EnvOptionsFactory = (env: NodeJS.ProcessEnv) => BaseStorageOptions;\n\nconst envDefaults = new Map<string, EnvOptionsFactory>();\n\nexport function registerProviderEnvDefaults(\n providerId: string,\n factory: EnvOptionsFactory,\n): void {\n envDefaults.set(providerId, factory);\n}\n\nexport function resolveOptionsFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): ObjectStorageOptions {\n const providerId = env.OBJECT_STORAGE_SERVICE?.toLowerCase();\n const factory = providerId ? envDefaults.get(providerId) : undefined;\n if (!factory) {\n throw new ConfigurationError({\n message:\n `Unsupported or missing OBJECT_STORAGE_SERVICE: \"${\n env.OBJECT_STORAGE_SERVICE ?? ''\n }\". ` +\n `Registered providers: ${[...envDefaults.keys()].join(', ')}`,\n });\n }\n return factory(env) as ObjectStorageOptions;\n}\n\nexport function resolveObjectStorageOptions(\n options?: ObjectStorageOptions,\n env: NodeJS.ProcessEnv = process.env,\n): ObjectStorageOptions {\n return options ?? resolveOptionsFromEnv(env);\n}\n","import { backOff, BackoffOptions } from 'exponential-backoff';\nimport { StorageError, ThrottledError } from './errors';\nimport { recordRetry, recordThrottle } from './instrumentation';\nimport { logger } from './logger';\n\nexport interface RetryPolicy {\n numOfAttempts?: number;\n startingDelayMs?: number;\n maxDelayMs?: number;\n retry?: (error: unknown, attempt: number) => boolean;\n}\n\nconst DEFAULTS = {\n numOfAttempts: 5,\n startingDelayMs: 100,\n maxDelayMs: 5000,\n};\n\nexport function isRetryableError(error: unknown): boolean {\n return error instanceof StorageError && error.retryable;\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n policy: RetryPolicy = {},\n): Promise<T> {\n const { numOfAttempts, startingDelayMs, maxDelayMs } = {\n ...DEFAULTS,\n ...policy,\n };\n const shouldRetry = policy.retry ?? isRetryableError;\n\n const options: BackoffOptions = {\n numOfAttempts,\n startingDelay: startingDelayMs,\n maxDelay: maxDelayMs,\n jitter: 'full',\n retry: async (error: unknown, attempt: number) => {\n if (!shouldRetry(error, attempt)) return false;\n\n const code = error instanceof StorageError ? error.code : undefined;\n recordRetry(code);\n if (error instanceof ThrottledError) {\n recordThrottle(error.provider);\n }\n logger.warn('object-storage operation retry', {\n attempt,\n numOfAttempts,\n code,\n });\n\n // Provider-dictated wait (S3 Retry-After / Azure x-ms-retry-after)\n // takes priority over the lib's own exponential schedule.\n if (\n error instanceof ThrottledError &&\n error.retryAfterMs !== undefined\n ) {\n await sleep(Math.min(error.retryAfterMs, maxDelayMs));\n }\n return true;\n },\n };\n\n return backOff(fn, options);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { LoggerService } from '@qrvey/telemetry';\n\nexport const logger = new LoggerService('@qrvey/object-storage');\n","import { StorageError } from './errors';\nimport { logger } from './logger';\n\nexport function recordRetry(code?: string): void {\n logger.warn('objectstorage.retry', { code: code ?? 'unknown' });\n}\n\nexport function recordThrottle(provider?: string): void {\n logger.warn('objectstorage.throttle', { provider: provider ?? 'unknown' });\n}\n\nexport async function instrument<T>(\n provider: string,\n operation: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const startedAt = Date.now();\n try {\n const result = await fn();\n logger.debug('objectstorage.operation', {\n provider,\n operation,\n result: 'ok',\n durationMs: Date.now() - startedAt,\n });\n return result;\n } catch (error) {\n const meta: Record<string, unknown> = {\n provider,\n operation,\n result: 'error',\n durationMs: Date.now() - startedAt,\n };\n if (error instanceof StorageError) {\n meta.code = error.code;\n meta.retryable = error.retryable;\n if (error.requestId) meta.requestId = error.requestId;\n }\n logger.error('objectstorage.operation', meta);\n throw error;\n }\n}\n","import { ThrottledError } from './errors';\nimport { logger } from './logger';\n\nexport interface LimiterOptions {\n max: number;\n adaptive?: boolean;\n minMax?: number;\n growthThreshold?: number;\n}\n\nexport interface Limiter {\n run<T>(fn: () => Promise<T>): Promise<T>;\n readonly inFlight: number;\n readonly pending: number;\n readonly currentMax: number;\n}\n\nexport function createLimiter(options: LimiterOptions): Limiter {\n const ceiling = options.max;\n const floor = options.minMax ?? 1;\n const growthThreshold = options.growthThreshold ?? 10;\n\n let max = options.max;\n let inFlight = 0;\n let consecutiveSuccesses = 0;\n const queue: Array<() => void> = [];\n\n function release(): void {\n inFlight--;\n queue.shift()?.();\n }\n\n function acquire(): Promise<void> {\n if (inFlight < max) {\n inFlight++;\n return Promise.resolve();\n }\n return new Promise((resolve) =>\n queue.push(() => {\n inFlight++;\n resolve();\n }),\n );\n }\n\n function onThrottle(): void {\n if (!options.adaptive) return;\n consecutiveSuccesses = 0;\n const reduced = Math.max(floor, Math.floor(max / 2));\n if (reduced < max) {\n max = reduced;\n logger.warn('object-storage limiter shrunk after throttle', {\n max,\n });\n }\n }\n\n function onSuccess(): void {\n if (!options.adaptive || max >= ceiling) return;\n consecutiveSuccesses++;\n if (consecutiveSuccesses >= growthThreshold) {\n consecutiveSuccesses = 0;\n max = Math.min(ceiling, max + 1);\n }\n }\n\n return {\n async run<T>(fn: () => Promise<T>): Promise<T> {\n await acquire();\n try {\n const result = await fn();\n onSuccess();\n return result;\n } catch (error) {\n if (error instanceof ThrottledError) onThrottle();\n throw error;\n } finally {\n release();\n }\n },\n get inFlight() {\n return inFlight;\n },\n get pending() {\n return queue.length;\n },\n get currentMax() {\n return max;\n },\n };\n}\n","import { Limiter } from './concurrency';\n\nexport function chunk<T>(items: readonly T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n chunks.push(items.slice(i, i + size));\n }\n return chunks;\n}\n\nexport async function mapBatched<T, R>(\n items: readonly T[],\n batchSize: number,\n limiter: Limiter,\n fn: (batch: T[], index: number) => Promise<R>,\n): Promise<R[]> {\n const batches = chunk(items, batchSize);\n return Promise.all(\n batches.map((batch, index) => limiter.run(() => fn(batch, index))),\n );\n}\n","import { ValidationError } from './errors';\n\nexport interface ByteRange {\n start?: number;\n end?: number;\n suffixLength?: number;\n}\n\nconst BOUNDED = /^bytes=(\\d+)-(\\d+)?$/;\nconst SUFFIX = /^bytes=-(\\d+)$/;\n\nexport function parseRange(input: string): ByteRange {\n const bounded = BOUNDED.exec(input);\n if (bounded && bounded[1] !== undefined) {\n const start = Number(bounded[1]);\n const end = bounded[2] !== undefined ? Number(bounded[2]) : undefined;\n if (end !== undefined && end < start) {\n throw new ValidationError({\n message: `Invalid range \"${input}\": end must be >= start`,\n });\n }\n return { start, end };\n }\n\n const suffix = SUFFIX.exec(input);\n if (suffix && suffix[1] !== undefined) {\n return { suffixLength: Number(suffix[1]) };\n }\n\n throw new ValidationError({\n message: `Invalid range \"${input}\": expected \"bytes=start-[end]\" or \"bytes=-suffix\"`,\n });\n}\n\nexport function toRangeHeader(range: ByteRange): string {\n if (range.suffixLength !== undefined) return `bytes=-${range.suffixLength}`;\n return `bytes=${range.start}-${range.end ?? ''}`;\n}\n","import type { AwsCredentialIdentity } from '@aws-sdk/types';\nimport { BaseStorageOptions } from '../../core/config';\nimport { ConfigurationError } from '../../core/errors';\nimport { registerProviderEnvDefaults } from '../../core/providerRegistry';\n\nexport const AWS_S3_PROVIDER_ID = 'aws_s3' as const;\n\nexport type AwsS3Auth =\n | { kind: 'default' }\n | { kind: 'static'; credentials: AwsCredentialIdentity }\n | { kind: 'assumeRole'; roleArn: string; externalId?: string }\n | { kind: 'webIdentity'; roleArn: string; tokenFile?: string };\n\nexport interface AwsS3StorageOptions extends BaseStorageOptions {\n provider: typeof AWS_S3_PROVIDER_ID;\n region: string;\n auth?: AwsS3Auth;\n}\n\ndeclare module '../../core/config' {\n interface ProviderOptionsRegistry {\n aws_s3: AwsS3StorageOptions;\n }\n}\n\nexport function isAwsS3StorageOptions(\n options: BaseStorageOptions,\n): options is AwsS3StorageOptions {\n return options.provider === AWS_S3_PROVIDER_ID;\n}\n\nexport function getDefaultAwsS3OptionsFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): AwsS3StorageOptions {\n const region = env.AWS_REGION || env.AWS_DEFAULT_REGION;\n if (!region) {\n throw new ConfigurationError({\n provider: AWS_S3_PROVIDER_ID,\n message:\n 'Missing AWS_REGION (or AWS_DEFAULT_REGION) for aws_s3 provider',\n });\n }\n return { provider: AWS_S3_PROVIDER_ID, region, auth: { kind: 'default' } };\n}\n\nregisterProviderEnvDefaults(AWS_S3_PROVIDER_ID, getDefaultAwsS3OptionsFromEnv);\n","import { S3Client } from '@aws-sdk/client-s3';\nimport {\n fromNodeProviderChain,\n fromTemporaryCredentials,\n fromTokenFile,\n} from '@aws-sdk/credential-providers';\nimport { NodeHttpHandler } from '@smithy/node-http-handler';\nimport { Agent } from 'https';\nimport { ClientCache } from '../../core/clientCache';\nimport { stableCacheKey, hashSecret } from '../../core/cacheKey';\nimport { HttpOptions } from '../../core/config';\nimport { AwsS3Auth, AwsS3StorageOptions } from './config';\n\nconst DEFAULT_HTTP: Required<HttpOptions> = {\n connectionTimeoutMs: 5000,\n requestTimeoutMs: 120000,\n maxSockets: 64,\n};\n\nconst cache = new ClientCache<S3Client>({\n onEvict: (client) => client.destroy(),\n});\n\nexport function getAwsS3Client(options: AwsS3StorageOptions): S3Client {\n const auth = options.auth ?? { kind: 'default' as const };\n const key = stableCacheKey({\n provider: options.provider,\n region: options.region,\n endpoint: options.endpoint,\n http: options.http,\n auth: authKeyParts(auth),\n });\n return cache.getOrCreate(key, () => buildClient(options, auth));\n}\n\nexport function clearAwsS3ClientCache(): void {\n cache.clear();\n}\n\nfunction buildClient(options: AwsS3StorageOptions, auth: AwsS3Auth): S3Client {\n const http = { ...DEFAULT_HTTP, ...options.http };\n return new S3Client({\n region: options.region,\n endpoint: options.endpoint,\n credentials: credentialsFor(auth),\n requestHandler: new NodeHttpHandler({\n connectionTimeout: http.connectionTimeoutMs,\n requestTimeout: http.requestTimeoutMs,\n httpsAgent: new Agent({\n keepAlive: true,\n maxSockets: http.maxSockets,\n }),\n }),\n });\n}\n\nfunction credentialsFor(auth: AwsS3Auth) {\n switch (auth.kind) {\n case 'default':\n return fromNodeProviderChain();\n case 'static':\n return auth.credentials;\n case 'assumeRole':\n return fromTemporaryCredentials({\n params: {\n RoleArn: auth.roleArn,\n ExternalId: auth.externalId,\n RoleSessionName: 'qrvey-object-storage',\n },\n });\n case 'webIdentity':\n return fromTokenFile({\n roleArn: auth.roleArn,\n ...(auth.tokenFile && { webIdentityTokenFile: auth.tokenFile }),\n });\n }\n}\n\nfunction authKeyParts(auth: AwsS3Auth): Record<string, unknown> {\n switch (auth.kind) {\n case 'default':\n return { kind: auth.kind };\n case 'static':\n return {\n kind: auth.kind,\n accessKeyId: auth.credentials.accessKeyId,\n secret: hashSecret(auth.credentials.secretAccessKey),\n };\n case 'assumeRole':\n return {\n kind: auth.kind,\n roleArn: auth.roleArn,\n externalId: auth.externalId,\n };\n case 'webIdentity':\n return {\n kind: auth.kind,\n roleArn: auth.roleArn,\n tokenFile: auth.tokenFile,\n };\n }\n}\n","import { logger } from './logger';\n\nexport interface ClientCacheOptions<T> {\n maxSize?: number;\n onEvict?: (client: T, key: string) => void;\n}\n\nconst DEFAULT_MAX_SIZE = 32;\n\nexport class ClientCache<T> {\n private readonly entries = new Map<string, T>();\n\n constructor(private readonly options: ClientCacheOptions<T> = {}) {}\n\n getOrCreate(key: string, factory: () => T): T {\n const existing = this.entries.get(key);\n if (existing !== undefined) {\n this.entries.delete(key);\n this.entries.set(key, existing);\n return existing;\n }\n\n const client = factory();\n this.entries.set(key, client);\n logger.debug('object-storage client created', {\n size: this.entries.size,\n });\n\n const maxSize = this.options.maxSize ?? DEFAULT_MAX_SIZE;\n if (this.entries.size > maxSize) {\n const oldestKey = this.entries.keys().next().value as string;\n const oldest = this.entries.get(oldestKey) as T;\n this.entries.delete(oldestKey);\n this.options.onEvict?.(oldest, oldestKey);\n logger.warn('object-storage client evicted from cache', {\n maxSize,\n });\n }\n return client;\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n clear(): void {\n this.entries.clear();\n }\n}\n","import { createHash } from 'crypto';\n\nexport function stableCacheKey(parts: Record<string, unknown>): string {\n return JSON.stringify(sortDeep(parts));\n}\n\nexport function hashSecret(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 16);\n}\n\nfunction sortDeep(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortDeep);\n if (value && typeof value === 'object') {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortDeep((value as Record<string, unknown>)[key]);\n return acc;\n }, {});\n }\n return value;\n}\n","import {\n AuthError,\n NetworkError,\n NotFoundError,\n StorageError,\n ThrottledError,\n} from '../../core/errors';\nimport { AWS_S3_PROVIDER_ID } from './config';\n\nconst THROTTLE_NAMES = new Set([\n 'SlowDown',\n 'ThrottlingException',\n 'Throttling',\n 'TooManyRequestsException',\n 'RequestLimitExceeded',\n 'ProvisionedThroughputExceededException',\n]);\n\nconst NOT_FOUND_NAMES = new Set([\n 'NoSuchKey',\n 'NoSuchBucket',\n 'NotFound',\n 'NoSuchUpload',\n]);\n\nconst AUTH_NAMES = new Set([\n 'AccessDenied',\n 'InvalidAccessKeyId',\n 'SignatureDoesNotMatch',\n 'ExpiredToken',\n 'TokenRefreshRequired',\n 'CredentialsProviderError',\n]);\n\ninterface AwsErrorShape {\n name?: string;\n message?: string;\n $metadata?: { httpStatusCode?: number; requestId?: string };\n $response?: { headers?: Record<string, string> };\n}\n\nexport function mapAwsError(error: unknown): StorageError {\n if (error instanceof StorageError) return error;\n\n const aws = (error ?? {}) as AwsErrorShape;\n const name = aws.name ?? 'UnknownError';\n const message = aws.message ?? String(error);\n const status = aws.$metadata?.httpStatusCode;\n const base = {\n message: `${name}: ${message}`,\n provider: AWS_S3_PROVIDER_ID,\n requestId: aws.$metadata?.requestId,\n cause: error,\n };\n\n if (THROTTLE_NAMES.has(name) || status === 429) {\n const retryAfter = aws.$response?.headers?.['retry-after'];\n return new ThrottledError({\n ...base,\n code: name,\n retryAfterMs:\n retryAfter !== undefined\n ? Number(retryAfter) * 1000\n : undefined,\n });\n }\n if (NOT_FOUND_NAMES.has(name) || status === 404) {\n return new NotFoundError({ ...base, code: name });\n }\n if (AUTH_NAMES.has(name) || status === 403) {\n return new AuthError({ ...base, code: name });\n }\n if ((status !== undefined && status >= 500) || name === 'TimeoutError') {\n return new NetworkError({ ...base, code: name });\n }\n return new StorageError({ ...base, code: name, retryable: false });\n}\n","import {\n S3Client,\n GetObjectCommand,\n HeadObjectCommand,\n PutObjectCommand,\n DeleteObjectCommand,\n DeleteObjectsCommand,\n ListObjectsV2Command,\n HeadBucketCommand,\n CreateMultipartUploadCommand,\n UploadPartCommand,\n CompleteMultipartUploadCommand,\n AbortMultipartUploadCommand,\n ListPartsCommand,\n ListMultipartUploadsCommand,\n} from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { Upload } from '@aws-sdk/lib-storage';\nimport { PassThrough, Readable } from 'stream';\nimport {\n DeleteManyResult,\n GetObjectOptions,\n GetObjectResult,\n HeadBucketResult,\n IterateOptions,\n ListOptions,\n ListResult,\n MultipartClient,\n MultipartPart,\n MultipartPartSummary,\n MultipartUploadSummary,\n ObjectProperties,\n ObjectStorageClient,\n ObjectSummary,\n PresignOptions,\n PresignedUpload,\n UploadBody,\n UploadOptions,\n UploadResult,\n WriteStreamResult,\n} from '../../core/contracts';\nimport { ConfigurationError, NotFoundError } from '../../core/errors';\nimport { instrument } from '../../core/instrumentation';\nimport { parseRange, toRangeHeader } from '../../core/range';\nimport { RetryPolicy, withRetry } from '../../core/retry';\nimport { Limiter, createLimiter } from '../../core/concurrency';\nimport { mapBatched } from '../../core/batch';\nimport { resolveObjectStorageOptions } from '../../core/providerRegistry';\nimport {\n AWS_S3_PROVIDER_ID,\n AwsS3StorageOptions,\n isAwsS3StorageOptions,\n} from './config';\nimport { getAwsS3Client } from './clientFactory';\nimport { mapAwsError } from './errors';\n\nexport interface AwsS3ProviderConfig {\n bucketName: string;\n options?: AwsS3StorageOptions;\n retry?: RetryPolicy;\n limiter?: Limiter;\n}\n\nconst DELETE_BATCH_SIZE = 1000;\nconst DEFAULT_PRESIGN_SECONDS = 3600;\n\nexport class AwsS3Provider implements ObjectStorageClient {\n readonly bucketName: string;\n readonly multipart: MultipartClient;\n private readonly client: S3Client;\n private readonly retryPolicy: RetryPolicy;\n private readonly limiter: Limiter;\n\n constructor(config: AwsS3ProviderConfig) {\n const resolved = resolveObjectStorageOptions(config.options);\n if (!isAwsS3StorageOptions(resolved)) {\n throw new ConfigurationError({\n message: `AwsS3Provider requires aws_s3 options, got provider \"${resolved.provider}\"`,\n });\n }\n this.bucketName = config.bucketName;\n this.client = getAwsS3Client(resolved);\n this.retryPolicy = config.retry ?? {};\n this.limiter =\n config.limiter ?? createLimiter({ max: 10, adaptive: true });\n this.multipart = new AwsS3MultipartClient(\n this.client,\n this.bucketName,\n this.retryPolicy,\n (operation, fn) => this.send(operation, fn),\n );\n }\n\n private send<T>(operation: string, fn: () => Promise<T>): Promise<T> {\n return instrument(AWS_S3_PROVIDER_ID, operation, () =>\n withRetry(\n () => fn().catch((error) => Promise.reject(mapAwsError(error))),\n this.retryPolicy,\n ),\n );\n }\n\n async getObject(\n key: string,\n options?: GetObjectOptions,\n ): Promise<GetObjectResult> {\n const range = options?.range\n ? toRangeHeader(parseRange(options.range))\n : undefined;\n const response = await this.send('getObject', () =>\n this.client.send(\n new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n Range: range,\n VersionId: options?.versionId,\n }),\n ),\n );\n return {\n body: response.Body as Readable,\n contentLength: response.ContentLength,\n contentType: response.ContentType,\n contentEncoding: response.ContentEncoding,\n contentDisposition: response.ContentDisposition,\n contentLanguage: response.ContentLanguage,\n cacheControl: response.CacheControl,\n etag: response.ETag,\n lastModified: response.LastModified,\n metadata: response.Metadata,\n };\n }\n\n async getObjectProperties(key: string): Promise<ObjectProperties> {\n const response = await this.send('getObjectProperties', () =>\n this.client.send(\n new HeadObjectCommand({ Bucket: this.bucketName, Key: key }),\n ),\n );\n return {\n contentLength: response.ContentLength,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n metadata: response.Metadata,\n };\n }\n\n async upload(\n key: string,\n body: UploadBody,\n options?: UploadOptions,\n ): Promise<UploadResult> {\n if (body instanceof Readable) {\n return this.uploadStream(key, body, options);\n }\n const response = await this.send('upload', () =>\n this.client.send(\n new PutObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n Body: body,\n ...mapUploadOptions(options),\n }),\n ),\n );\n return { key, etag: response.ETag, versionId: response.VersionId };\n }\n\n private async uploadStream(\n key: string,\n body: Readable,\n options?: UploadOptions,\n ): Promise<UploadResult> {\n const upload = new Upload({\n client: this.client,\n params: {\n Bucket: this.bucketName,\n Key: key,\n Body: body,\n ...mapUploadOptions(options),\n },\n queueSize: options?.queueSize ?? 5,\n partSize: options?.partSizeBytes ?? 8 * 1024 * 1024,\n });\n return instrument(AWS_S3_PROVIDER_ID, 'upload', async () => {\n try {\n const response = await upload.done();\n return {\n key,\n etag: response.ETag,\n versionId: response.VersionId,\n };\n } catch (error) {\n throw mapAwsError(error);\n }\n });\n }\n\n createWriteStream(key: string, options?: UploadOptions): WriteStreamResult {\n const stream = new PassThrough();\n const upload = new Upload({\n client: this.client,\n params: {\n Bucket: this.bucketName,\n Key: key,\n Body: stream,\n ...mapUploadOptions(options),\n },\n queueSize: options?.queueSize ?? 5,\n partSize: options?.partSizeBytes ?? 8 * 1024 * 1024,\n });\n const done = instrument(AWS_S3_PROVIDER_ID, 'createWriteStream', () =>\n upload\n .done()\n .then((response) => ({\n key,\n etag: response.ETag,\n versionId: response.VersionId,\n }))\n .catch((error) => Promise.reject(mapAwsError(error))),\n );\n return { stream, done, abort: () => upload.abort() };\n }\n\n async delete(key: string): Promise<void> {\n await this.send('delete', () =>\n this.client.send(\n new DeleteObjectCommand({ Bucket: this.bucketName, Key: key }),\n ),\n );\n }\n\n async deleteMany(keys: string[]): Promise<DeleteManyResult[]> {\n const batchResults = await mapBatched(\n keys,\n DELETE_BATCH_SIZE,\n this.limiter,\n async (batch) => {\n const response = await this.send('deleteMany', () =>\n this.client.send(\n new DeleteObjectsCommand({\n Bucket: this.bucketName,\n Delete: {\n Objects: batch.map((key) => ({ Key: key })),\n Quiet: false,\n },\n }),\n ),\n );\n const failed = new Map(\n (response.Errors ?? []).map((e) => [\n e.Key ?? '',\n e.Message ?? 'delete failed',\n ]),\n );\n return batch.map((key) => ({\n key,\n deleted: !failed.has(key),\n error: failed.get(key),\n }));\n },\n );\n return batchResults.flat();\n }\n\n async list(options?: ListOptions): Promise<ListResult> {\n const response = await this.send('list', () =>\n this.client.send(\n new ListObjectsV2Command({\n Bucket: this.bucketName,\n Prefix: options?.prefix,\n MaxKeys: options?.limit,\n ContinuationToken: options?.continuationToken,\n }),\n ),\n );\n return {\n items: (response.Contents ?? []).map(toObjectSummary),\n nextToken: response.NextContinuationToken,\n };\n }\n\n async *iterate(options?: IterateOptions): AsyncIterable<ObjectSummary> {\n let token: string | undefined;\n do {\n const page = await this.list({\n prefix: options?.prefix,\n limit: options?.pageSize,\n continuationToken: token,\n });\n yield* page.items;\n token = page.nextToken;\n } while (token);\n }\n\n async listAll(options?: IterateOptions): Promise<ObjectSummary[]> {\n const items: ObjectSummary[] = [];\n for await (const item of this.iterate(options)) items.push(item);\n return items;\n }\n\n async headBucket(): Promise<HeadBucketResult> {\n try {\n await this.send('headBucket', () =>\n this.client.send(\n new HeadBucketCommand({ Bucket: this.bucketName }),\n ),\n );\n return { exists: true };\n } catch (error) {\n if (error instanceof NotFoundError) return { exists: false };\n throw error;\n }\n }\n\n getDownloadUrl(key: string, options?: PresignOptions): Promise<string> {\n return getSignedUrl(\n this.client,\n new GetObjectCommand({ Bucket: this.bucketName, Key: key }),\n { expiresIn: options?.expiresInSeconds ?? DEFAULT_PRESIGN_SECONDS },\n );\n }\n\n async getUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUpload> {\n const url = await getSignedUrl(\n this.client,\n new PutObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n ContentType: options?.contentType,\n }),\n { expiresIn: options?.expiresInSeconds ?? DEFAULT_PRESIGN_SECONDS },\n );\n return { key, url };\n }\n}\n\nclass AwsS3MultipartClient implements MultipartClient {\n constructor(\n private readonly client: S3Client,\n private readonly bucketName: string,\n private readonly retryPolicy: RetryPolicy,\n private readonly send: <T>(\n operation: string,\n fn: () => Promise<T>,\n ) => Promise<T>,\n ) {}\n\n async create(\n key: string,\n options?: UploadOptions,\n ): Promise<{ uploadId: string }> {\n const response = await this.send('multipart.create', () =>\n this.client.send(\n new CreateMultipartUploadCommand({\n Bucket: this.bucketName,\n Key: key,\n ...mapUploadOptions(options),\n }),\n ),\n );\n return { uploadId: response.UploadId as string };\n }\n\n async uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n body: UploadBody,\n contentLengthBytes?: number,\n ): Promise<MultipartPart> {\n const response = await this.send('multipart.uploadPart', () =>\n this.client.send(\n new UploadPartCommand({\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n Body: body,\n ContentLength: contentLengthBytes,\n }),\n ),\n );\n return { partNumber, etag: response.ETag as string };\n }\n\n getPartUploadUrl(\n key: string,\n uploadId: string,\n partNumber: number,\n options?: PresignOptions,\n ): Promise<string> {\n return getSignedUrl(\n this.client,\n new UploadPartCommand({\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n }),\n { expiresIn: options?.expiresInSeconds ?? DEFAULT_PRESIGN_SECONDS },\n );\n }\n\n async complete(\n key: string,\n uploadId: string,\n parts: MultipartPart[],\n ): Promise<UploadResult> {\n const response = await this.send('multipart.complete', () =>\n this.client.send(\n new CompleteMultipartUploadCommand({\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: [...parts]\n .sort((a, b) => a.partNumber - b.partNumber)\n .map((p) => ({\n PartNumber: p.partNumber,\n ETag: p.etag,\n })),\n },\n }),\n ),\n );\n return { key, etag: response.ETag, versionId: response.VersionId };\n }\n\n async abort(key: string, uploadId: string): Promise<void> {\n await this.send('multipart.abort', () =>\n this.client.send(\n new AbortMultipartUploadCommand({\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n }),\n ),\n );\n }\n\n async listParts(\n key: string,\n uploadId: string,\n ): Promise<MultipartPartSummary[]> {\n const response = await this.send('multipart.listParts', () =>\n this.client.send(\n new ListPartsCommand({\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n }),\n ),\n );\n return (response.Parts ?? []).map((p) => ({\n partNumber: p.PartNumber as number,\n etag: p.ETag as string,\n size: p.Size,\n lastModified: p.LastModified,\n }));\n }\n\n async listUploads(prefix?: string): Promise<MultipartUploadSummary[]> {\n const response = await this.send('multipart.listUploads', () =>\n this.client.send(\n new ListMultipartUploadsCommand({\n Bucket: this.bucketName,\n Prefix: prefix,\n }),\n ),\n );\n return (response.Uploads ?? []).map((u) => ({\n key: u.Key as string,\n uploadId: u.UploadId as string,\n initiatedAt: u.Initiated,\n }));\n }\n}\n\nfunction mapUploadOptions(options?: UploadOptions) {\n return {\n ContentType: options?.contentType,\n ContentEncoding: options?.contentEncoding,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n };\n}\n\nfunction toObjectSummary(content: {\n Key?: string;\n Size?: number;\n ETag?: string;\n LastModified?: Date;\n}): ObjectSummary {\n return {\n key: content.Key as string,\n size: content.Size,\n etag: content.ETag,\n lastModified: content.LastModified,\n };\n}\n","import { BaseStorageOptions } from '../../core/config';\nimport { ConfigurationError } from '../../core/errors';\nimport { registerProviderEnvDefaults } from '../../core/providerRegistry';\n\nexport const AZURE_BLOB_PROVIDER_ID = 'azure_blob_storage' as const;\n\nexport type AzureBlobAuth =\n | { kind: 'connectionString'; connectionString: string }\n | { kind: 'accountKey'; accountName: string; accountKey: string }\n | { kind: 'sas'; accountName: string; sasToken: string }\n | { kind: 'workloadIdentity'; accountName: string };\n\nexport interface AzureBlobStorageOptions extends BaseStorageOptions {\n provider: typeof AZURE_BLOB_PROVIDER_ID;\n auth: AzureBlobAuth;\n}\n\ndeclare module '../../core/config' {\n interface ProviderOptionsRegistry {\n azure_blob_storage: AzureBlobStorageOptions;\n }\n}\n\nexport function isAzureBlobStorageOptions(\n options: BaseStorageOptions,\n): options is AzureBlobStorageOptions {\n return options.provider === AZURE_BLOB_PROVIDER_ID;\n}\n\nexport function getDefaultAzureBlobOptionsFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): AzureBlobStorageOptions {\n const connectionString = env.AZURE_STORAGE_CONNECTION_STRING;\n if (!connectionString) {\n throw new ConfigurationError({\n provider: AZURE_BLOB_PROVIDER_ID,\n message:\n 'Missing AZURE_STORAGE_CONNECTION_STRING for azure_blob_storage provider',\n });\n }\n return {\n provider: AZURE_BLOB_PROVIDER_ID,\n auth: { kind: 'connectionString', connectionString },\n };\n}\n\nregisterProviderEnvDefaults(\n AZURE_BLOB_PROVIDER_ID,\n getDefaultAzureBlobOptionsFromEnv,\n);\n","import {\n BlobServiceClient,\n StorageSharedKeyCredential,\n} from '@azure/storage-blob';\nimport { DefaultAzureCredential } from '@azure/identity';\nimport { ClientCache } from '../../core/clientCache';\nimport { stableCacheKey, hashSecret } from '../../core/cacheKey';\nimport { AzureBlobAuth, AzureBlobStorageOptions } from './config';\n\nconst cache = new ClientCache<BlobServiceClient>();\n\nexport function getAzureBlobServiceClient(\n options: AzureBlobStorageOptions,\n): BlobServiceClient {\n const key = stableCacheKey({\n provider: options.provider,\n endpoint: options.endpoint,\n auth: authKeyParts(options.auth),\n });\n return cache.getOrCreate(key, () => buildClient(options));\n}\n\nexport function clearAzureBlobClientCache(): void {\n cache.clear();\n}\n\nfunction buildClient(options: AzureBlobStorageOptions): BlobServiceClient {\n const auth = options.auth;\n switch (auth.kind) {\n case 'connectionString':\n return BlobServiceClient.fromConnectionString(\n auth.connectionString,\n );\n case 'accountKey':\n return new BlobServiceClient(\n endpointFor(options, auth.accountName),\n new StorageSharedKeyCredential(\n auth.accountName,\n auth.accountKey,\n ),\n );\n case 'sas':\n return new BlobServiceClient(\n `${endpointFor(\n options,\n auth.accountName,\n )}?${auth.sasToken.replace(/^\\?/, '')}`,\n );\n case 'workloadIdentity':\n return new BlobServiceClient(\n endpointFor(options, auth.accountName),\n new DefaultAzureCredential(),\n );\n }\n}\n\nfunction endpointFor(\n options: AzureBlobStorageOptions,\n accountName: string,\n): string {\n return options.endpoint ?? `https://${accountName}.blob.core.windows.net`;\n}\n\nfunction authKeyParts(auth: AzureBlobAuth): Record<string, unknown> {\n switch (auth.kind) {\n case 'connectionString':\n return {\n kind: auth.kind,\n connection: hashSecret(auth.connectionString),\n };\n case 'accountKey':\n return {\n kind: auth.kind,\n accountName: auth.accountName,\n key: hashSecret(auth.accountKey),\n };\n case 'sas':\n return {\n kind: auth.kind,\n accountName: auth.accountName,\n token: hashSecret(auth.sasToken),\n };\n case 'workloadIdentity':\n return { kind: auth.kind, accountName: auth.accountName };\n }\n}\n","import {\n AuthError,\n NetworkError,\n NotFoundError,\n StorageError,\n ThrottledError,\n} from '../../core/errors';\nimport { AZURE_BLOB_PROVIDER_ID } from './config';\n\ninterface AzureErrorShape {\n name?: string;\n message?: string;\n statusCode?: number;\n code?: string;\n details?: { errorCode?: string };\n response?: { headers?: { get?: (name: string) => string | undefined } };\n}\n\nconst AUTH_CODES = new Set([\n 'AuthenticationFailed',\n 'AuthorizationFailure',\n 'AuthorizationPermissionMismatch',\n 'InsufficientAccountPermissions',\n 'InvalidAuthenticationInfo',\n]);\n\nconst NOT_FOUND_CODES = new Set([\n 'BlobNotFound',\n 'ContainerNotFound',\n 'ResourceNotFound',\n]);\n\nexport function mapAzureError(error: unknown): StorageError {\n if (error instanceof StorageError) return error;\n\n const azure = (error ?? {}) as AzureErrorShape;\n const code =\n azure.details?.errorCode ?? azure.code ?? azure.name ?? 'UnknownError';\n const status = azure.statusCode;\n const base = {\n message: `${code}: ${azure.message ?? String(error)}`,\n provider: AZURE_BLOB_PROVIDER_ID,\n requestId: azure.response?.headers?.get?.('x-ms-request-id'),\n cause: error,\n };\n\n if (status === 429 || code === 'ServerBusy') {\n const retryAfter = azure.response?.headers?.get?.('retry-after');\n return new ThrottledError({\n ...base,\n code,\n retryAfterMs:\n retryAfter !== undefined\n ? Number(retryAfter) * 1000\n : undefined,\n });\n }\n if (NOT_FOUND_CODES.has(code) || status === 404) {\n return new NotFoundError({ ...base, code });\n }\n if (AUTH_CODES.has(code) || status === 403 || status === 401) {\n return new AuthError({ ...base, code });\n }\n if (status !== undefined && status >= 500) {\n return new NetworkError({ ...base, code });\n }\n return new StorageError({ ...base, code, retryable: false });\n}\n","export interface MultipartBlockRecord {\n blockId: string;\n partNumber: number;\n}\n\nexport interface MultipartSession {\n uploadId: string;\n blobName: string;\n containerName: string;\n blocks: MultipartBlockRecord[];\n createdAt: number;\n}\n\n/**\n * Azure has no native multipart upload sessions (S3 UploadId semantics).\n * This store tracks which staged blocks belong to which logical upload so\n * concurrent uploads to the same blob name cannot corrupt each other.\n * Default in-memory implementation is single-process only — multi-pod\n * deployments doing distributed multipart must inject a shared store (Redis).\n */\nexport interface MultipartSessionStore {\n create(session: MultipartSession): Promise<void>;\n get(uploadId: string): Promise<MultipartSession | undefined>;\n appendBlock(uploadId: string, block: MultipartBlockRecord): Promise<void>;\n delete(uploadId: string): Promise<void>;\n list(\n containerName: string,\n blobNamePrefix?: string,\n ): Promise<MultipartSession[]>;\n}\n\nconst DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport class InMemoryMultipartSessionStore implements MultipartSessionStore {\n private readonly sessions = new Map<string, MultipartSession>();\n\n constructor(private readonly ttlMs: number = DEFAULT_TTL_MS) {}\n\n async create(session: MultipartSession): Promise<void> {\n this.evictExpired();\n this.sessions.set(session.uploadId, session);\n }\n\n async get(uploadId: string): Promise<MultipartSession | undefined> {\n const session = this.sessions.get(uploadId);\n if (!session) return undefined;\n if (this.isExpired(session)) {\n this.sessions.delete(uploadId);\n return undefined;\n }\n return session;\n }\n\n async appendBlock(\n uploadId: string,\n block: MultipartBlockRecord,\n ): Promise<void> {\n const session = await this.get(uploadId);\n if (session) session.blocks.push(block);\n }\n\n async delete(uploadId: string): Promise<void> {\n this.sessions.delete(uploadId);\n }\n\n async list(\n containerName: string,\n blobNamePrefix?: string,\n ): Promise<MultipartSession[]> {\n this.evictExpired();\n return [...this.sessions.values()].filter(\n (s) =>\n s.containerName === containerName &&\n (blobNamePrefix === undefined ||\n s.blobName.startsWith(blobNamePrefix)),\n );\n }\n\n private isExpired(session: MultipartSession): boolean {\n return Date.now() - session.createdAt > this.ttlMs;\n }\n\n private evictExpired(): void {\n for (const [uploadId, session] of this.sessions) {\n if (this.isExpired(session)) this.sessions.delete(uploadId);\n }\n }\n}\n","import {\n BlobServiceClient,\n ContainerClient,\n BlockBlobClient,\n BlobSASPermissions,\n} from '@azure/storage-blob';\nimport { randomUUID } from 'crypto';\nimport { PassThrough, Readable } from 'stream';\nimport {\n DeleteManyResult,\n GetObjectOptions,\n GetObjectResult,\n HeadBucketResult,\n IterateOptions,\n ListOptions,\n ListResult,\n MultipartClient,\n MultipartPart,\n MultipartPartSummary,\n MultipartUploadSummary,\n ObjectProperties,\n ObjectStorageClient,\n ObjectSummary,\n PresignOptions,\n PresignedUpload,\n UploadBody,\n UploadOptions,\n UploadResult,\n WriteStreamResult,\n} from '../../core/contracts';\nimport {\n ConfigurationError,\n MultipartSessionError,\n NotFoundError,\n ValidationError,\n} from '../../core/errors';\nimport { instrument } from '../../core/instrumentation';\nimport { ByteRange, parseRange } from '../../core/range';\nimport { RetryPolicy, withRetry } from '../../core/retry';\nimport { Limiter, createLimiter } from '../../core/concurrency';\nimport { mapBatched } from '../../core/batch';\nimport { resolveObjectStorageOptions } from '../../core/providerRegistry';\nimport {\n AZURE_BLOB_PROVIDER_ID,\n AzureBlobStorageOptions,\n isAzureBlobStorageOptions,\n} from './config';\nimport { getAzureBlobServiceClient } from './clientFactory';\nimport { mapAzureError } from './errors';\nimport {\n InMemoryMultipartSessionStore,\n MultipartSessionStore,\n} from './multipartSessionStore';\n\nexport interface AzureBlobStorageProviderConfig {\n bucketName: string;\n options?: AzureBlobStorageOptions;\n retry?: RetryPolicy;\n limiter?: Limiter;\n multipartStore?: MultipartSessionStore;\n}\n\nconst DELETE_BATCH_SIZE = 256;\nconst DEFAULT_PRESIGN_SECONDS = 3600;\nconst PART_NUMBER_WIDTH = 5;\n\nexport class AzureBlobStorageProvider implements ObjectStorageClient {\n readonly bucketName: string;\n readonly multipart: MultipartClient;\n private readonly serviceClient: BlobServiceClient;\n private readonly container: ContainerClient;\n private readonly retryPolicy: RetryPolicy;\n private readonly limiter: Limiter;\n\n constructor(config: AzureBlobStorageProviderConfig) {\n const resolved = resolveObjectStorageOptions(config.options);\n if (!isAzureBlobStorageOptions(resolved)) {\n throw new ConfigurationError({\n message: `AzureBlobStorageProvider requires azure_blob_storage options, got provider \"${resolved.provider}\"`,\n });\n }\n this.bucketName = config.bucketName;\n this.serviceClient = getAzureBlobServiceClient(resolved);\n this.container = this.serviceClient.getContainerClient(\n config.bucketName,\n );\n this.retryPolicy = config.retry ?? {};\n this.limiter =\n config.limiter ?? createLimiter({ max: 10, adaptive: true });\n this.multipart = new AzureBlobMultipartClient(\n this.container,\n this.bucketName,\n config.multipartStore ?? new InMemoryMultipartSessionStore(),\n (operation, fn) => this.send(operation, fn),\n );\n }\n\n private send<T>(operation: string, fn: () => Promise<T>): Promise<T> {\n return instrument(AZURE_BLOB_PROVIDER_ID, operation, () =>\n withRetry(\n () =>\n fn().catch((error) => Promise.reject(mapAzureError(error))),\n this.retryPolicy,\n ),\n );\n }\n\n private block(key: string): BlockBlobClient {\n return this.container.getBlockBlobClient(key);\n }\n\n async getObject(\n key: string,\n options?: GetObjectOptions,\n ): Promise<GetObjectResult> {\n const { offset, count } = await this.resolveRange(key, options?.range);\n const response = await this.send('getObject', () =>\n this.block(key).download(offset, count),\n );\n if (!response.readableStreamBody) {\n throw new NotFoundError({\n message: `Empty body downloading \"${key}\"`,\n provider: 'azure_blob_storage',\n });\n }\n return {\n body: response.readableStreamBody as Readable,\n contentLength: response.contentLength,\n contentType: response.contentType,\n contentEncoding: response.contentEncoding,\n contentDisposition: response.contentDisposition,\n contentLanguage: response.contentLanguage,\n cacheControl: response.cacheControl,\n etag: response.etag,\n lastModified: response.lastModified,\n metadata: response.metadata,\n };\n }\n\n private async resolveRange(\n key: string,\n rangeInput?: string,\n ): Promise<{ offset: number; count?: number }> {\n if (!rangeInput) return { offset: 0 };\n const range: ByteRange = parseRange(rangeInput);\n if (range.suffixLength !== undefined) {\n const props = await this.getObjectProperties(key);\n const total = props.contentLength ?? 0;\n const count = Math.min(range.suffixLength, total);\n return { offset: total - count, count };\n }\n const start = range.start as number;\n // RFC 7233 end is inclusive; Azure download() takes (offset, count).\n const count =\n range.end !== undefined ? range.end - start + 1 : undefined;\n return { offset: start, count };\n }\n\n async getObjectProperties(key: string): Promise<ObjectProperties> {\n const response = await this.send('getObjectProperties', () =>\n this.block(key).getProperties(),\n );\n return {\n contentLength: response.contentLength,\n contentType: response.contentType,\n etag: response.etag,\n lastModified: response.lastModified,\n metadata: response.metadata,\n };\n }\n\n async upload(\n key: string,\n body: UploadBody,\n options?: UploadOptions,\n ): Promise<UploadResult> {\n const blob = this.block(key);\n const headers = mapHttpHeaders(options);\n if (body instanceof Readable) {\n const response = await this.send('upload', () =>\n blob.uploadStream(\n body as Readable,\n options?.partSizeBytes,\n options?.queueSize,\n {\n blobHTTPHeaders: headers,\n metadata: options?.metadata,\n },\n ),\n );\n return { key, etag: response.etag };\n }\n const data =\n typeof body === 'string' ? Buffer.from(body) : Buffer.from(body);\n const response = await this.send('upload', () =>\n blob.upload(data, data.length, {\n blobHTTPHeaders: headers,\n metadata: options?.metadata,\n }),\n );\n return { key, etag: response.etag };\n }\n\n createWriteStream(key: string, options?: UploadOptions): WriteStreamResult {\n const stream = new PassThrough();\n let aborted = false;\n const done = this.send('createWriteStream', () =>\n this.block(key).uploadStream(\n stream,\n options?.partSizeBytes,\n options?.queueSize,\n {\n blobHTTPHeaders: mapHttpHeaders(options),\n metadata: options?.metadata,\n },\n ),\n ).then((response) => ({ key, etag: response.etag }));\n return {\n stream,\n done,\n abort: async () => {\n if (!aborted) {\n aborted = true;\n stream.destroy(new Error('upload aborted'));\n }\n },\n };\n }\n\n async delete(key: string): Promise<void> {\n await this.send('delete', () => this.block(key).delete());\n }\n\n async deleteMany(keys: string[]): Promise<DeleteManyResult[]> {\n const batchResults = await mapBatched(\n keys,\n DELETE_BATCH_SIZE,\n this.limiter,\n async (batch) =>\n Promise.all(\n batch.map(async (key) => {\n try {\n await this.delete(key);\n return { key, deleted: true };\n } catch (error) {\n return {\n key,\n deleted: false,\n error:\n error instanceof Error\n ? error.message\n : String(error),\n };\n }\n }),\n ),\n );\n return batchResults.flat();\n }\n\n async list(options?: ListOptions): Promise<ListResult> {\n const iterator = this.container\n .listBlobsFlat({ prefix: options?.prefix })\n .byPage({\n maxPageSize: options?.limit,\n continuationToken: options?.continuationToken || undefined,\n });\n const page = await this.send(\n 'list',\n async () => (await iterator.next()).value,\n );\n const items = (page?.segment?.blobItems ?? []).map(\n (blob: {\n name: string;\n properties: {\n contentLength?: number;\n etag?: string;\n lastModified?: Date;\n };\n }): ObjectSummary => ({\n key: blob.name,\n size: blob.properties.contentLength,\n etag: blob.properties.etag,\n lastModified: blob.properties.lastModified,\n }),\n );\n return { items, nextToken: page?.continuationToken || undefined };\n }\n\n async *iterate(options?: IterateOptions): AsyncIterable<ObjectSummary> {\n let token: string | undefined;\n do {\n const page = await this.list({\n prefix: options?.prefix,\n limit: options?.pageSize,\n continuationToken: token,\n });\n yield* page.items;\n token = page.nextToken;\n } while (token);\n }\n\n async listAll(options?: IterateOptions): Promise<ObjectSummary[]> {\n const items: ObjectSummary[] = [];\n for await (const item of this.iterate(options)) items.push(item);\n return items;\n }\n\n async headBucket(): Promise<HeadBucketResult> {\n try {\n const response = await this.send('headBucket', () =>\n this.container.getProperties(),\n );\n return { exists: true, metadata: response.metadata };\n } catch (error) {\n if (error instanceof NotFoundError) return { exists: false };\n throw error;\n }\n }\n\n async getDownloadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<string> {\n return this.generateSasUrl(key, 'r', options);\n }\n\n async getUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUpload> {\n const url = await this.generateSasUrl(key, 'cw', options);\n return { key, url };\n }\n\n private async generateSasUrl(\n key: string,\n permissions: string,\n options?: PresignOptions,\n ): Promise<string> {\n const expiresInSeconds =\n options?.expiresInSeconds ?? DEFAULT_PRESIGN_SECONDS;\n try {\n return await this.block(key).generateSasUrl({\n permissions: BlobSASPermissions.parse(permissions),\n expiresOn: new Date(Date.now() + expiresInSeconds * 1000),\n });\n } catch (error) {\n throw new ConfigurationError({\n message:\n 'SAS generation requires shared key credentials (connectionString or accountKey auth)',\n provider: 'azure_blob_storage',\n cause: error,\n });\n }\n }\n}\n\nclass AzureBlobMultipartClient implements MultipartClient {\n constructor(\n private readonly container: ContainerClient,\n private readonly containerName: string,\n private readonly store: MultipartSessionStore,\n private readonly send: <T>(\n operation: string,\n fn: () => Promise<T>,\n ) => Promise<T>,\n ) {}\n\n private block(key: string): BlockBlobClient {\n return this.container.getBlockBlobClient(key);\n }\n\n private blockIdFor(uploadId: string, partNumber: number): string {\n return Buffer.from(\n `${uploadId}:${String(partNumber).padStart(\n PART_NUMBER_WIDTH,\n '0',\n )}`,\n ).toString('base64');\n }\n\n async create(key: string): Promise<{ uploadId: string }> {\n const uploadId = randomUUID();\n await this.store.create({\n uploadId,\n blobName: key,\n containerName: this.containerName,\n blocks: [],\n createdAt: Date.now(),\n });\n return { uploadId };\n }\n\n private async session(uploadId: string) {\n const session = await this.store.get(uploadId);\n if (!session) {\n throw new MultipartSessionError({\n message: `Unknown or expired multipart uploadId \"${uploadId}\"`,\n provider: 'azure_blob_storage',\n });\n }\n return session;\n }\n\n async uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n body: UploadBody,\n contentLengthBytes?: number,\n ): Promise<MultipartPart> {\n await this.session(uploadId);\n const blockId = this.blockIdFor(uploadId, partNumber);\n const { data, length } = resolveBlockBody(body, contentLengthBytes);\n await this.send('multipart.uploadPart', () =>\n this.block(key).stageBlock(blockId, data, length),\n );\n await this.store.appendBlock(uploadId, { blockId, partNumber });\n return { partNumber, etag: blockId };\n }\n\n async getPartUploadUrl(): Promise<string> {\n throw new ConfigurationError({\n message:\n 'Azure presigned part upload not supported yet; upload parts server-side via multipart.uploadPart',\n provider: 'azure_blob_storage',\n });\n }\n\n async complete(\n key: string,\n uploadId: string,\n parts: MultipartPart[],\n ): Promise<UploadResult> {\n await this.session(uploadId);\n const blockIds = [...parts]\n .sort((a, b) => a.partNumber - b.partNumber)\n .map((p) => p.etag);\n const response = await this.send('multipart.complete', () =>\n this.block(key).commitBlockList(blockIds),\n );\n await this.store.delete(uploadId);\n return { key, etag: response.etag };\n }\n\n async abort(_key: string, uploadId: string): Promise<void> {\n // Azure GCs uncommitted blocks automatically after 7 days; dropping\n // the session is enough to make the uploadId unusable.\n await this.store.delete(uploadId);\n }\n\n async listParts(\n _key: string,\n uploadId: string,\n ): Promise<MultipartPartSummary[]> {\n const session = await this.session(uploadId);\n return session.blocks.map((b) => ({\n partNumber: b.partNumber,\n etag: b.blockId,\n }));\n }\n\n async listUploads(prefix?: string): Promise<MultipartUploadSummary[]> {\n const sessions = await this.store.list(this.containerName, prefix);\n return sessions.map((s) => ({\n key: s.blobName,\n uploadId: s.uploadId,\n initiatedAt: new Date(s.createdAt),\n }));\n }\n}\n\nfunction resolveBlockBody(\n body: UploadBody,\n contentLengthBytes?: number,\n): { data: Buffer | Readable; length: number } {\n if (body instanceof Readable) {\n if (contentLengthBytes === undefined) {\n throw new ValidationError({\n message:\n 'contentLengthBytes is required when uploading a part from a stream',\n provider: 'azure_blob_storage',\n });\n }\n return { data: body, length: contentLengthBytes };\n }\n const data =\n typeof body === 'string' ? Buffer.from(body) : Buffer.from(body);\n return { data, length: data.length };\n}\n\nfunction mapHttpHeaders(options?: UploadOptions) {\n return {\n blobContentType: options?.contentType,\n blobContentEncoding: options?.contentEncoding,\n blobCacheControl: options?.cacheControl,\n blobContentDisposition: options?.contentDisposition,\n blobContentLanguage: undefined,\n };\n}\n","import { createHash } from 'crypto';\nimport { ClientCache } from './core/clientCache';\nimport { stableCacheKey } from './core/cacheKey';\nimport { ObjectStorageOptions } from './core/config';\nimport { ObjectStorageClient } from './core/contracts';\nimport { ConfigurationError } from './core/errors';\nimport { resolveObjectStorageOptions } from './core/providerRegistry';\nimport { AwsS3Provider, isAwsS3StorageOptions } from './providers/aws-s3';\nimport {\n AzureBlobStorageProvider,\n isAzureBlobStorageOptions,\n} from './providers/azure-blob';\n\n/**\n * Cache of provider-agnostic clients keyed by bucket + config. Reuses the same\n * ObjectStorageClient (and therefore its concurrency limiter) across calls. The\n * underlying SDK client/TCP pool is cached separately per provider; this caches the\n * provider wrapper so callers never manage client lifecycle or caching themselves.\n */\nconst cache = new ClientCache<ObjectStorageClient>();\n\n/**\n * Returns a cached `ObjectStorageClient` for a bucket. The concrete provider\n * (AWS S3 or Azure Blob) is resolved from `options` or the environment — callers\n * (services, `@repo` wrappers) never pick a provider or manage caching.\n */\nexport function getObjectStorageClient(\n bucket: string,\n options?: ObjectStorageOptions,\n): ObjectStorageClient {\n const resolved = resolveObjectStorageOptions(options);\n // Full sha256 of the config — distinguishes region/creds/endpoint without\n // leaking secrets into the in-memory key.\n const optionsHash = createHash('sha256')\n .update(stableCacheKey(resolved as unknown as Record<string, unknown>))\n .digest('hex');\n const key = `${resolved.provider}:${bucket}:${optionsHash}`;\n return cache.getOrCreate(key, () => buildProvider(bucket, resolved));\n}\n\nfunction buildProvider(\n bucket: string,\n options: ObjectStorageOptions,\n): ObjectStorageClient {\n if (isAwsS3StorageOptions(options)) {\n return new AwsS3Provider({ bucketName: bucket, options });\n }\n if (isAzureBlobStorageOptions(options)) {\n return new AzureBlobStorageProvider({ bucketName: bucket, options });\n }\n throw new ConfigurationError({\n message: `Unsupported object storage provider: \"${\n (options as { provider?: string })?.provider ?? 'unknown'\n }\"`,\n });\n}\n\n/** Test/teardown helper. */\nexport function clearObjectStorageClientCache(): void {\n cache.clear();\n}\n","export * from './core/errors';\nexport * from './core/contracts';\nexport type {\n BaseStorageOptions,\n HttpOptions,\n ProviderOptionsRegistry,\n ObjectStorageOptions,\n} from './core/config';\nexport {\n resolveObjectStorageOptions,\n resolveOptionsFromEnv,\n} from './core/providerRegistry';\nexport { withRetry, isRetryableError } from './core/retry';\nexport type { RetryPolicy } from './core/retry';\nexport { createLimiter } from './core/concurrency';\nexport type { Limiter, LimiterOptions } from './core/concurrency';\nexport { chunk, mapBatched } from './core/batch';\nexport { parseRange, toRangeHeader } from './core/range';\nexport type { ByteRange } from './core/range';\n\nexport * from './providers/aws-s3';\nexport * from './providers/azure-blob';\n\nexport {\n getObjectStorageClient,\n clearObjectStorageClientCache,\n} from './clientFactory';\n\nimport { AWS_S3_PROVIDER_ID } from './providers/aws-s3/config';\nimport { AZURE_BLOB_PROVIDER_ID } from './providers/azure-blob/config';\n\nexport const OBJECT_STORAGE_PROVIDERS = Object.freeze({\n AWS_S3: AWS_S3_PROVIDER_ID,\n AZURE_BLOB_STORAGE: AZURE_BLOB_PROVIDER_ID,\n} as const);\n\nexport type ObjectStorageProvider =\n (typeof OBJECT_STORAGE_PROVIDERS)[keyof typeof OBJECT_STORAGE_PROVIDERS];\n"]}
@@ -41,7 +41,6 @@ type GetObjectResponse = {
41
41
  contentDisposition?: string;
42
42
  contentLanguage?: string;
43
43
  body?: Readable;
44
- content?: Readable;
45
44
  };
46
45
 
47
46
  type GetUploadUrlResponse = {
@@ -58,16 +57,9 @@ type CreateUploadWriteStreamResponse = {
58
57
  type HeadBucketResponse = HeadBucketCommandOutput | ContainerGetPropertiesResponse;
59
58
 
60
59
  type ObjectStorageOptions = {
61
- region?: string;
62
- credentials?: AwsCredentialIdentity;
63
- provider?: string;
64
- connectionString?: string;
65
- host?: string;
66
- port?: string | number;
67
- user?: string;
68
- password?: string;
69
- privateKey?: string | Buffer;
70
- secure?: boolean;
60
+ region: string;
61
+ credentials: AwsCredentialIdentity;
62
+ provider: string;
71
63
  };
72
64
 
73
65
  type ListPartsMultipartUploadResponse = {
@@ -141,57 +133,49 @@ declare class ObjectStorageService {
141
133
  *
142
134
  * @param {ListRequestOptions} options - The options to apply to the list operation.
143
135
  * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.
144
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
145
136
  * @return {Promise<ListResponse>} A promise that resolves to the list of objects.
146
137
  */
147
- static list(options: ListRequestOptions, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<ListResponse>;
138
+ static list(options: ListRequestOptions, bucketName?: string): Promise<ListResponse>;
148
139
  /**
149
140
  * Retrieves a list of all objects from the object storage service.
150
141
  *
151
142
  * @param {ListRequestOptions} options - The options to apply to the list operation.
152
143
  * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.
153
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
154
144
  * @return {Promise<ListResponse>} A promise that resolves to the list of all objects.
155
145
  */
156
- static listAll(options: ListRequestOptions, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<ListResponse>;
146
+ static listAll(options: ListRequestOptions, bucketName?: string): Promise<ListResponse>;
157
147
  /**
158
148
  * Retrieves an object from the object storage service.
159
149
  *
160
150
  * @param {string} key - The key of the object to retrieve.
161
151
  * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.
162
- * @param {IGetObjectOptions} [options] - The options to apply to the get operation.
163
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
164
152
  * @return {Promise<GetObjectResponse>} A promise that resolves to the retrieved object.
165
153
  */
166
- static getObject(key: string, bucketName?: string, options?: IGetObjectOptions, objectStorageOptions?: ObjectStorageOptions): Promise<GetObjectResponse>;
154
+ static getObject(key: string, bucketName?: string, options?: IGetObjectOptions): Promise<GetObjectResponse>;
167
155
  /**
168
156
  * Retrieves an object info (without file content) from the object storage service.
169
157
  * @param key - The key of the object to retrieve.
170
- * @param bucketName - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.
171
- * @param objectStorageOptions - The options for the object storage service.
172
158
  * @returns A promise that resolves to the info of the file.
173
159
  */
174
- static getHeadObject(key: string, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<GetObjectResponse>;
160
+ static getHeadObject(key: string, bucketName?: string): Promise<GetObjectResponse>;
175
161
  /**
176
162
  * Retrieves a signed URL for the specified object in the object storage service.
177
163
  *
178
164
  * @param {string} key - The key of the object for which to generate the signed URL.
179
165
  * @param {number} expiresInMinutes - The number of minutes until the signed URL expires.
180
166
  * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.
181
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
182
167
  * @return {Promise<string>} A promise that resolves to the generated signed URL.
183
168
  */
184
- static getDownloadUrl(key: string, expiresInMinutes: number, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<string>;
169
+ static getDownloadUrl(key: string, expiresInMinutes: number, bucketName?: string): Promise<string>;
185
170
  /**
186
171
  * Retrieves an upload URL for the specified object in the object storage service.
187
172
  *
188
173
  * @param {string} key - The key of the object for which to generate the upload URL.
189
174
  * @param {number} expiresInMinutes - The number of minutes until the upload URL expires.
190
175
  * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.
191
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
192
176
  * @return {Promise<string>} A promise that resolves to the generated upload URL.
193
177
  */
194
- static getUploadUrl(key: string, expiresInMinutes: number, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<GetUploadUrlResponse>;
178
+ static getUploadUrl(key: string, expiresInMinutes: number, bucketName?: string): Promise<GetUploadUrlResponse>;
195
179
  /**
196
180
  * Uploads a file to the object storage service.
197
181
  *
@@ -199,30 +183,27 @@ declare class ObjectStorageService {
199
183
  * @param {FileContent} body - The content of the file to upload.
200
184
  * @param {Object} [metadata] - Optional metadata to associate with the object.
201
185
  * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.
202
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
203
186
  * @return {Promise<UploadResponse>} A promise that resolves to the response of the upload operation.
204
187
  */
205
188
  static upload(key: string, body: FileContent, metadata?: {
206
189
  [key: string]: string;
207
- }, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<UploadResponse>;
190
+ }, bucketName?: string): Promise<UploadResponse>;
208
191
  /**
209
192
  * Creates an upload write stream for the specified key in the object storage service.
210
193
  *
211
194
  * @param {string} key - The key of the object to create the upload write stream for.
212
195
  * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.
213
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
214
196
  * @return {Promise<CreateUploadWriteStreamResponse>} A promise that resolves to the response of the upload operation.
215
197
  */
216
- static createUploadWriteStream(key: string, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<CreateUploadWriteStreamResponse>;
198
+ static createUploadWriteStream(key: string, bucketName?: string): Promise<CreateUploadWriteStreamResponse>;
217
199
  /**
218
200
  * Deletes an object or multiple objects from the object storage service.
219
201
  *
220
202
  * @param {string | string[]} key - The key or array of keys of the objects to delete.
221
203
  * @param {string} [bucketName] - The name of the bucket where the objects are stored. If not provided, the default bucket name will be used.
222
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
223
204
  * @return {Promise<{ key: string; deleted: boolean; error?: string }[] | boolean>} A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each object deleted, or a boolean value indicating the success of the deletion.
224
205
  */
225
- static delete(key: string | string[], bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<{
206
+ static delete(key: string | string[], bucketName?: string): Promise<{
226
207
  key: string;
227
208
  deleted: boolean;
228
209
  error?: string;
@@ -231,37 +212,33 @@ declare class ObjectStorageService {
231
212
  * Retrieves the head bucket from the object storage service.
232
213
  *
233
214
  * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.
234
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
235
215
  * @return {Promise<HeadBucketResponse>} A promise that resolves to the head bucket response.
236
216
  */
237
- static getHeadBucket(bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<HeadBucketResponse>;
217
+ static getHeadBucket(bucketName?: string): Promise<HeadBucketResponse>;
238
218
  /**
239
219
  * Generates a unique upload ID for a multipart upload.
240
220
  *
241
221
  * @param {string} key - The key of the object to upload.
242
222
  * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.
243
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
244
223
  * @return {Promise<string>} A promise that resolves to the generated upload ID.
245
224
  */
246
- static generateUploadIdMultipart(key: string, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<string>;
225
+ static generateUploadIdMultipart(key: string, bucketName?: string): Promise<string>;
247
226
  /**
248
227
  * Retrieves a list of multipart uploads for a specified key in the object storage service.
249
228
  *
250
229
  * @param {string} key - The key of the object to retrieve uploads for.
251
230
  * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.
252
231
  * @param {string} [uploadId] - The upload ID to filter the results by.
253
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
254
232
  * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of multipart uploads for the specified key.
255
233
  */
256
- static listMultipartUploadsForKey(key: string, bucketName?: string, uploadId?: string, objectStorageOptions?: ObjectStorageOptions): Promise<ListPartsMultipartUploadResponse>;
234
+ static listMultipartUploadsForKey(key: string, bucketName?: string, uploadId?: string): Promise<ListPartsMultipartUploadResponse>;
257
235
  /**
258
236
  * Retrieves a list of all multipart uploads for a specified bucket in the object storage service.
259
237
  *
260
238
  * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.
261
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
262
239
  * @return {Promise<ListMultipartUploadsResponse>} A promise that resolves to the list of multipart uploads for the specified bucket.
263
240
  */
264
- static listMultipartUploadsForBucket(bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<ListMultipartUploadsResponse>;
241
+ static listMultipartUploadsForBucket(bucketName?: string): Promise<ListMultipartUploadsResponse>;
265
242
  /**
266
243
  * Uploads a multipart file to the specified bucket in the object storage service.
267
244
  *
@@ -270,30 +247,27 @@ declare class ObjectStorageService {
270
247
  * @param {number} partNumber - The number of the part being uploaded.
271
248
  * @param {string} [uploadId] - The ID of the multipart upload.
272
249
  * @param {string} [bucketName] - The name of the bucket to upload the file to. If not provided, the default bucket name will be used.
273
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
274
250
  * @return {Promise<string>} A Promise that resolves to the base64 encoded block ID of the uploaded part.
275
251
  */
276
- static uploadMultipart(key: string, file: FileContent, partNumber: number, uploadId?: string, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<string>;
252
+ static uploadMultipart(key: string, file: FileContent, partNumber: number, uploadId?: string, bucketName?: string): Promise<string>;
277
253
  /**
278
254
  * Completes a multipart upload for the specified object in the object storage service.
279
255
  *
280
256
  * @param {string} key - The key of the object to complete the multipart upload for.
281
257
  * @param {string} uploadId - The ID of the multipart upload to complete.
282
258
  * @param {string} [bucketName] - The name of the bucket to complete the multipart upload in. If not provided, the default bucket name will be used.
283
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
284
259
  * @return {Promise<void>} A Promise that resolves when the multipart upload is completed.
285
260
  */
286
- static completeMultipartUpload(key: string, uploadId: string, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<void>;
261
+ static completeMultipartUpload(key: string, uploadId: string, bucketName?: string): Promise<void>;
287
262
  /**
288
263
  * Aborts a multipart upload for the specified object in the object storage service.
289
264
  *
290
265
  * @param {string} key - The key of the object to abort the multipart upload for.
291
266
  * @param {string} uploadId - The ID of the multipart upload to abort.
292
267
  * @param {string} [bucketName] - The name of the bucket to abort the multipart upload in. If not provided, the default bucket name will be used.
293
- * @param {ObjectStorageOptions} [objectStorageOptions] - The options for the object storage service.
294
268
  * @return {Promise<void>} A Promise that resolves when the multipart upload is aborted.
295
269
  */
296
- static abortMultipartUpload(key: string, uploadId: string, bucketName?: string, objectStorageOptions?: ObjectStorageOptions): Promise<void>;
270
+ static abortMultipartUpload(key: string, uploadId: string, bucketName?: string): Promise<void>;
297
271
  /**
298
272
  * Retrieves a presigned URL for a specific part of a multipart upload.
299
273
  *