@qrvey/object-storage 2.0.0-1158 → 2.0.2-1167
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.
- package/dist/cjs/index-v2.js +23 -5
- package/dist/cjs/index-v2.js.map +1 -1
- package/dist/esm/index-v2.mjs +23 -5
- package/dist/esm/index-v2.mjs.map +1 -1
- package/package.json +2 -2
package/dist/cjs/index-v2.js
CHANGED
|
@@ -1554,17 +1554,35 @@ var AzureBlobMultipartClient = (_a2 = class {
|
|
|
1554
1554
|
etag: blockId
|
|
1555
1555
|
};
|
|
1556
1556
|
}
|
|
1557
|
-
async getPartUploadUrl() {
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1557
|
+
async getPartUploadUrl(key, uploadId, partNumber, options) {
|
|
1558
|
+
var _a3;
|
|
1559
|
+
await this.session(uploadId);
|
|
1560
|
+
const blockId = this.blockIdFor(uploadId, partNumber);
|
|
1561
|
+
const expiresInSeconds = (_a3 = options == null ? void 0 : options.expiresInSeconds) != null ? _a3 : DEFAULT_PRESIGN_SECONDS2;
|
|
1562
|
+
let sasUrl;
|
|
1563
|
+
try {
|
|
1564
|
+
sasUrl = await this.block(key).generateSasUrl({
|
|
1565
|
+
permissions: storageBlob.BlobSASPermissions.parse("cw"),
|
|
1566
|
+
expiresOn: new Date(Date.now() + expiresInSeconds * 1e3)
|
|
1567
|
+
});
|
|
1568
|
+
} catch (error) {
|
|
1569
|
+
throw new ConfigurationError({
|
|
1570
|
+
message: "SAS generation requires shared key credentials (connectionString or accountKey auth)",
|
|
1571
|
+
provider: "azure_blob_storage",
|
|
1572
|
+
cause: error
|
|
1573
|
+
});
|
|
1574
|
+
}
|
|
1575
|
+
await this.store.appendBlock(uploadId, {
|
|
1576
|
+
blockId,
|
|
1577
|
+
partNumber
|
|
1561
1578
|
});
|
|
1579
|
+
return `${sasUrl}&comp=block&blockid=${encodeURIComponent(blockId)}`;
|
|
1562
1580
|
}
|
|
1563
1581
|
async complete(key, uploadId, parts) {
|
|
1564
1582
|
await this.session(uploadId);
|
|
1565
1583
|
const blockIds = [
|
|
1566
1584
|
...parts
|
|
1567
|
-
].sort((a, b) => a.partNumber - b.partNumber).map((p) => p.
|
|
1585
|
+
].sort((a, b) => a.partNumber - b.partNumber).map((p) => this.blockIdFor(uploadId, p.partNumber));
|
|
1568
1586
|
const response = await this.send("multipart.complete", () => this.block(key).commitBlockList(blockIds));
|
|
1569
1587
|
await this.store.delete(uploadId);
|
|
1570
1588
|
return {
|
package/dist/cjs/index-v2.js.map
CHANGED
|
@@ -1 +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_DATALAKE_CONNECTION_STRING","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 =\n env.AZURE_DATALAKE_CONNECTION_STRING ||\n env.AZURE_STORAGE_CONNECTION_STRING;\n if (!connectionString) {\n throw new ConfigurationError({\n provider: AZURE_BLOB_PROVIDER_ID,\n message:\n 'Missing AZURE_DATALAKE_CONNECTION_STRING (or AZURE_STORAGE_CONNECTION_STRING) ' +\n '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"]}
|
|
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_DATALAKE_CONNECTION_STRING","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","sasUrl","encodeURIComponent","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 =\n env.AZURE_DATALAKE_CONNECTION_STRING ||\n env.AZURE_STORAGE_CONNECTION_STRING;\n if (!connectionString) {\n throw new ConfigurationError({\n provider: AZURE_BLOB_PROVIDER_ID,\n message:\n 'Missing AZURE_DATALAKE_CONNECTION_STRING (or AZURE_STORAGE_CONNECTION_STRING) ' +\n '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(\n key: string,\n uploadId: string,\n partNumber: number,\n options?: PresignOptions,\n ): Promise<string> {\n await this.session(uploadId);\n const blockId = this.blockIdFor(uploadId, partNumber);\n const expiresInSeconds =\n options?.expiresInSeconds ?? DEFAULT_PRESIGN_SECONDS;\n let sasUrl: string;\n try {\n sasUrl = await this.block(key).generateSasUrl({\n permissions: BlobSASPermissions.parse('cw'),\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 // Record the block so listParts() reflects it. Callers that complete\n // without an explicit parts list (rebuilding it from listParts) would\n // otherwise commit an empty block list — Azure has no server-side\n // ListParts for staged blocks like S3 does, producing a 0-byte blob.\n await this.store.appendBlock(uploadId, { blockId, partNumber });\n return `${sasUrl}&comp=block&blockid=${encodeURIComponent(blockId)}`;\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) => this.blockIdFor(uploadId, p.partNumber));\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"]}
|
package/dist/esm/index-v2.mjs
CHANGED
|
@@ -1472,17 +1472,35 @@ var AzureBlobMultipartClient = (_a2 = class {
|
|
|
1472
1472
|
etag: blockId
|
|
1473
1473
|
};
|
|
1474
1474
|
}
|
|
1475
|
-
async getPartUploadUrl() {
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1475
|
+
async getPartUploadUrl(key, uploadId, partNumber, options) {
|
|
1476
|
+
var _a3;
|
|
1477
|
+
await this.session(uploadId);
|
|
1478
|
+
const blockId = this.blockIdFor(uploadId, partNumber);
|
|
1479
|
+
const expiresInSeconds = (_a3 = options == null ? void 0 : options.expiresInSeconds) != null ? _a3 : DEFAULT_PRESIGN_SECONDS2;
|
|
1480
|
+
let sasUrl;
|
|
1481
|
+
try {
|
|
1482
|
+
sasUrl = await this.block(key).generateSasUrl({
|
|
1483
|
+
permissions: BlobSASPermissions.parse("cw"),
|
|
1484
|
+
expiresOn: new Date(Date.now() + expiresInSeconds * 1e3)
|
|
1485
|
+
});
|
|
1486
|
+
} catch (error) {
|
|
1487
|
+
throw new ConfigurationError({
|
|
1488
|
+
message: "SAS generation requires shared key credentials (connectionString or accountKey auth)",
|
|
1489
|
+
provider: "azure_blob_storage",
|
|
1490
|
+
cause: error
|
|
1491
|
+
});
|
|
1492
|
+
}
|
|
1493
|
+
await this.store.appendBlock(uploadId, {
|
|
1494
|
+
blockId,
|
|
1495
|
+
partNumber
|
|
1479
1496
|
});
|
|
1497
|
+
return `${sasUrl}&comp=block&blockid=${encodeURIComponent(blockId)}`;
|
|
1480
1498
|
}
|
|
1481
1499
|
async complete(key, uploadId, parts) {
|
|
1482
1500
|
await this.session(uploadId);
|
|
1483
1501
|
const blockIds = [
|
|
1484
1502
|
...parts
|
|
1485
|
-
].sort((a, b) => a.partNumber - b.partNumber).map((p) => p.
|
|
1503
|
+
].sort((a, b) => a.partNumber - b.partNumber).map((p) => this.blockIdFor(uploadId, p.partNumber));
|
|
1486
1504
|
const response = await this.send("multipart.complete", () => this.block(key).commitBlockList(blockIds));
|
|
1487
1505
|
await this.store.delete(uploadId);
|
|
1488
1506
|
return {
|
|
@@ -1 +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_DATALAKE_CONNECTION_STRING","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 =\n env.AZURE_DATALAKE_CONNECTION_STRING ||\n env.AZURE_STORAGE_CONNECTION_STRING;\n if (!connectionString) {\n throw new ConfigurationError({\n provider: AZURE_BLOB_PROVIDER_ID,\n message:\n 'Missing AZURE_DATALAKE_CONNECTION_STRING (or AZURE_STORAGE_CONNECTION_STRING) ' +\n '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"]}
|
|
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_DATALAKE_CONNECTION_STRING","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","sasUrl","encodeURIComponent","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 =\n env.AZURE_DATALAKE_CONNECTION_STRING ||\n env.AZURE_STORAGE_CONNECTION_STRING;\n if (!connectionString) {\n throw new ConfigurationError({\n provider: AZURE_BLOB_PROVIDER_ID,\n message:\n 'Missing AZURE_DATALAKE_CONNECTION_STRING (or AZURE_STORAGE_CONNECTION_STRING) ' +\n '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(\n key: string,\n uploadId: string,\n partNumber: number,\n options?: PresignOptions,\n ): Promise<string> {\n await this.session(uploadId);\n const blockId = this.blockIdFor(uploadId, partNumber);\n const expiresInSeconds =\n options?.expiresInSeconds ?? DEFAULT_PRESIGN_SECONDS;\n let sasUrl: string;\n try {\n sasUrl = await this.block(key).generateSasUrl({\n permissions: BlobSASPermissions.parse('cw'),\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 // Record the block so listParts() reflects it. Callers that complete\n // without an explicit parts list (rebuilding it from listParts) would\n // otherwise commit an empty block list — Azure has no server-side\n // ListParts for staged blocks like S3 does, producing a 0-byte blob.\n await this.store.appendBlock(uploadId, { blockId, partNumber });\n return `${sasUrl}&comp=block&blockid=${encodeURIComponent(blockId)}`;\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) => this.blockIdFor(uploadId, p.partNumber));\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"]}
|
package/package.json
CHANGED
|
@@ -61,12 +61,12 @@
|
|
|
61
61
|
"build:compile:esm": "tsup --config ./tsup.config.esm.ts",
|
|
62
62
|
"build:compile:types": "tsup --config ./tsup.config.types.ts",
|
|
63
63
|
"prepare-publish": "yarn install && yarn test:cov && yarn build",
|
|
64
|
-
"publish-package": "yarn prepare-publish && npm publish --tag=
|
|
64
|
+
"publish-package": "yarn prepare-publish && npm publish --tag=beta",
|
|
65
65
|
"publish-rc": "yarn prepare-publish && npm publish --tag=beta",
|
|
66
66
|
"test": "jest",
|
|
67
67
|
"test:cov": "jest --coverage && chmod +x ./coverageReader.sh && sh ./coverageReader.sh",
|
|
68
68
|
"type-check": "tsc"
|
|
69
69
|
},
|
|
70
70
|
"types": "dist/types/index.d.ts",
|
|
71
|
-
"version": "2.0.
|
|
71
|
+
"version": "2.0.2-1167"
|
|
72
72
|
}
|