@nestm/storage 0.1.0-alpha.7 → 0.1.0-alpha.8

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.
Files changed (74) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +217 -18
  3. package/SECURITY.md +34 -5
  4. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts +14 -3
  5. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts.map +1 -1
  6. package/dist/ai-sdk/ai-sdk-workspace-tools.js +54 -23
  7. package/dist/ai-sdk/ai-sdk-workspace-tools.js.map +1 -1
  8. package/dist/ai-sdk/index.d.ts +1 -1
  9. package/dist/ai-sdk/index.d.ts.map +1 -1
  10. package/dist/ai-sdk/index.js.map +1 -1
  11. package/dist/files-sdk/files-sdk.driver.d.ts +54 -10
  12. package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
  13. package/dist/files-sdk/files-sdk.driver.js +784 -63
  14. package/dist/files-sdk/files-sdk.driver.js.map +1 -1
  15. package/dist/files-sdk/fs/index.d.ts +4 -4
  16. package/dist/files-sdk/fs/index.d.ts.map +1 -1
  17. package/dist/files-sdk/fs/index.js +242 -9
  18. package/dist/files-sdk/fs/index.js.map +1 -1
  19. package/dist/files-sdk/index.d.ts +1 -1
  20. package/dist/files-sdk/index.d.ts.map +1 -1
  21. package/dist/files-sdk/index.js.map +1 -1
  22. package/dist/files-sdk/provider/index.d.ts +9 -5
  23. package/dist/files-sdk/provider/index.d.ts.map +1 -1
  24. package/dist/files-sdk/provider/index.js +53 -15
  25. package/dist/files-sdk/provider/index.js.map +1 -1
  26. package/dist/files-sdk/s3/construction-metadata.d.ts +7 -0
  27. package/dist/files-sdk/s3/construction-metadata.d.ts.map +1 -0
  28. package/dist/files-sdk/s3/construction-metadata.js +13 -0
  29. package/dist/files-sdk/s3/construction-metadata.js.map +1 -0
  30. package/dist/files-sdk/s3/index.d.ts +39 -19
  31. package/dist/files-sdk/s3/index.d.ts.map +1 -1
  32. package/dist/files-sdk/s3/index.js +936 -113
  33. package/dist/files-sdk/s3/index.js.map +1 -1
  34. package/dist/gateway/storage-gateway.controller.d.ts.map +1 -1
  35. package/dist/gateway/storage-gateway.controller.js +25 -5
  36. package/dist/gateway/storage-gateway.controller.js.map +1 -1
  37. package/dist/storage-etag.d.ts +13 -0
  38. package/dist/storage-etag.d.ts.map +1 -0
  39. package/dist/storage-etag.js +31 -0
  40. package/dist/storage-etag.js.map +1 -0
  41. package/dist/storage.client.d.ts +3 -1
  42. package/dist/storage.client.d.ts.map +1 -1
  43. package/dist/storage.client.js +87 -22
  44. package/dist/storage.client.js.map +1 -1
  45. package/dist/storage.driver.d.ts +21 -1
  46. package/dist/storage.driver.d.ts.map +1 -1
  47. package/dist/storage.driver.js.map +1 -1
  48. package/dist/storage.types.d.ts +90 -19
  49. package/dist/storage.types.d.ts.map +1 -1
  50. package/dist/storage.types.js.map +1 -1
  51. package/dist/testing/index.d.ts +1 -0
  52. package/dist/testing/index.d.ts.map +1 -1
  53. package/dist/testing/index.js +1 -0
  54. package/dist/testing/index.js.map +1 -1
  55. package/dist/testing/provider-conformance.d.ts +65 -0
  56. package/dist/testing/provider-conformance.d.ts.map +1 -0
  57. package/dist/testing/provider-conformance.js +853 -0
  58. package/dist/testing/provider-conformance.js.map +1 -0
  59. package/dist/workspace/index.d.ts +1 -0
  60. package/dist/workspace/index.d.ts.map +1 -1
  61. package/dist/workspace/index.js +1 -0
  62. package/dist/workspace/index.js.map +1 -1
  63. package/dist/workspace/storage-workspace.cursor.d.ts +68 -3
  64. package/dist/workspace/storage-workspace.cursor.d.ts.map +1 -1
  65. package/dist/workspace/storage-workspace.cursor.js +402 -39
  66. package/dist/workspace/storage-workspace.cursor.js.map +1 -1
  67. package/dist/workspace/storage-workspace.d.ts.map +1 -1
  68. package/dist/workspace/storage-workspace.js +54 -46
  69. package/dist/workspace/storage-workspace.js.map +1 -1
  70. package/dist/workspace/storage-workspace.types.d.ts +10 -2
  71. package/dist/workspace/storage-workspace.types.d.ts.map +1 -1
  72. package/dist/workspace/storage-workspace.types.js +1 -0
  73. package/dist/workspace/storage-workspace.types.js.map +1 -1
  74. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-conformance.js","sourceRoot":"","sources":["../../src/testing/provider-conformance.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepStrictEqual, equal, fail, match, ok } from 'node:assert/strict';\nimport { randomUUID } from 'node:crypto';\nimport { inspect } from 'node:util';\n\nimport type { StorageClient } from '../storage.client.js';\nimport { isCanonicalStorageEtag } from '../storage-etag.js';\nimport {\n isStorageError,\n StorageErrorCode,\n type StorageError,\n} from '../storage.error.js';\nimport type {\n StorageCapabilities,\n StorageConditionalCopyDestinationCapability,\n StorageConditionalCopySourceCapability,\n StorageConditionalDeleteCapability,\n StorageConditionalMultipartCompletionCapability,\n StorageConditionalReadCapability,\n StorageConditionalWriteCapability,\n StorageObject,\n StorageListResult,\n StoragePhysicalKeyCapability,\n StorageSignedUploadPolicyCapability,\n StorageUploadResult,\n} from '../storage.types.js';\n\nconst CONDITIONAL_CAPABILITY_KEYS = [\n 'conditionalCreate',\n 'conditionalReplace',\n 'conditionalDelete',\n 'conditionalRead',\n 'conditionalCopySource',\n 'conditionalCopyDestination',\n 'conditionalMultipartCompletion',\n] as const;\nconst DEFAULT_MULTIPART_BYTES = 5 * 1024 * 1024 + 1;\nconst PASSED = Object.freeze({ status: 'passed' as const });\n\nexport interface StorageProviderConformanceCapabilities {\n readonly conditionalCreate?: StorageConditionalWriteCapability;\n readonly conditionalReplace?: StorageConditionalWriteCapability;\n readonly conditionalDelete?: StorageConditionalDeleteCapability;\n readonly conditionalRead?: StorageConditionalReadCapability;\n readonly conditionalCopySource?: StorageConditionalCopySourceCapability;\n readonly conditionalCopyDestination?: StorageConditionalCopyDestinationCapability;\n readonly conditionalMultipartCompletion?: StorageConditionalMultipartCompletionCapability;\n readonly physicalKey: StoragePhysicalKeyCapability;\n readonly signedUploadPolicy?: StorageSignedUploadPolicyCapability;\n}\n\nexport interface StorageProviderConformanceFixture {\n readonly client: StorageClient;\n /**\n * Builds a new client and driver for the same logical store and backend\n * configuration. The harness owns the returned client and shuts it down.\n */\n readonly createReplica: () => StorageClient | Promise<StorageClient>;\n /**\n * Returns the number of operations dispatched to the provider driver. When\n * supplied, the contract proves invalid inputs fail before provider I/O.\n */\n readonly dispatchCount?: () => number;\n /**\n * Resolves the current immutable version for a logical key. Providers that\n * advertise version predicates should supply this for a version-enabled\n * test bucket. Returning undefined visibly skips only the version subcases.\n */\n readonly resolveVersion?: (key: string) => Promise<string | undefined>;\n /**\n * Optional provider-aware cleanup. This is useful for versioned buckets,\n * where a plain delete would leave historical object versions behind.\n */\n readonly cleanup?: (keys: readonly string[]) => void | Promise<void>;\n readonly close?: () => void | Promise<void>;\n}\n\nexport interface StorageProviderConformanceOptions {\n readonly createFixture:\n | (() => StorageProviderConformanceFixture)\n | (() => Promise<StorageProviderConformanceFixture>);\n readonly expected: StorageProviderConformanceCapabilities;\n /** Values such as test credentials that must never occur in public errors. */\n readonly forbiddenErrorValues?: readonly string[];\n readonly multipartBytes?: number;\n readonly provider: string;\n}\n\nexport type StorageProviderConformanceCaseResult =\n typeof PASSED | { readonly reason: string; readonly status: 'skipped' };\n\nexport interface StorageProviderConformanceCase {\n readonly name: string;\n run(): Promise<StorageProviderConformanceCaseResult>;\n}\n\ninterface CaseContext {\n readonly client: StorageClient;\n readonly dispatchCount?: () => number;\n createReplica(): Promise<StorageClient>;\n key(label: string): string;\n resolveVersion(key: string): Promise<string | undefined>;\n track(key: string): string;\n}\n\ntype CaseOperation = (\n context: CaseContext,\n) =>\n | StorageProviderConformanceCaseResult\n | Promise<StorageProviderConformanceCaseResult | void>\n | void;\n\n/**\n * Builds runner-agnostic provider contract cases. A test runner can register\n * each returned case independently and translate a `skipped` result into its\n * native skip primitive. Every case receives a fresh client and namespace.\n */\nexport function createStorageProviderConformanceCases(\n options: StorageProviderConformanceOptions,\n): readonly StorageProviderConformanceCase[] {\n positiveSafeInteger(\n options.expected.physicalKey.maxBytes,\n 'expected.physicalKey.maxBytes',\n );\n positiveSafeInteger(\n options.multipartBytes ?? DEFAULT_MULTIPART_BYTES,\n 'multipartBytes',\n );\n ok(options.provider.trim().length > 0, 'provider must not be empty');\n\n const expected = options.expected;\n return Object.freeze([\n providerCase(\n options,\n 'declares the exact provider capability matrix',\n ({ client }) => {\n deepStrictEqual(\n conditionalCapabilitiesOf(client.capabilities),\n expected,\n `${options.provider} advertised a capability matrix different from its verified profile`,\n );\n },\n ),\n providerCase(\n options,\n 'performs baseline upload, read, and delete operations',\n async (context) => {\n const key = context.key('baseline.txt');\n await seed(context, key, 'baseline');\n assertOptionalResultEtag(\n await context.client.head(key),\n 'provider head returned a non-canonical ETag',\n );\n equal(await readText(context.client, key), 'baseline');\n await context.client.delete(key);\n equal(await context.client.exists(key), false);\n },\n ),\n listCursorReplayCase(options),\n providerCase(\n options,\n 'rejects an over-budget physical key before dispatch',\n async ({ client }) => {\n const key = 'x'.repeat(expected.physicalKey.maxBytes + 1);\n const error = await expectStorageError(\n () => client.upload(key, 'must-not-dispatch'),\n StorageErrorCode.LIMIT_EXCEEDED,\n options,\n );\n equal(error.permanent, true);\n },\n ),\n invalidPreconditionEtagCase(options),\n conditionalCreateCase(options),\n conditionalReplaceCase(options),\n conditionalDeleteCase(options),\n conditionalReadEtagCase(options),\n conditionalReadVersionCase(options),\n conditionalCopySourceEtagCase(options),\n conditionalCopySourceVersionCase(options),\n conditionalCopyDestinationCreateCase(options),\n conditionalCopyDestinationReplaceCase(options),\n ...conditionalCopyAtomicityCases(options),\n conditionalMultipartCreateCase(options),\n conditionalMultipartReplaceCase(options),\n providerCase(\n options,\n 'sanitizes a provider not-found response',\n async (context) => {\n await expectStorageError(\n () => context.client.head(context.key('missing.txt')),\n StorageErrorCode.NOT_FOUND,\n options,\n );\n },\n ),\n ]);\n}\n\nfunction listCursorReplayCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n return providerCase(\n options,\n 'replays portable list cursors after descendants and limit changes',\n async (context) => {\n await verifyCursorReplay(context, 'cursor-replay-flat', [\n '01.txt',\n '02.txt',\n '03.txt',\n '04.txt',\n '05.txt',\n ]);\n if (context.client.capabilities.delimiter) {\n await verifyCursorReplay(\n context,\n 'cursor-replay-delimited',\n [\n '01.txt',\n '02-dir/inside.txt',\n '03.txt',\n '04-dir/inside.txt',\n '05.txt',\n ],\n '/',\n );\n }\n },\n );\n}\n\nasync function verifyCursorReplay(\n context: CaseContext,\n label: string,\n names: readonly [string, string, string, string, string],\n delimiter?: string,\n): Promise<void> {\n const [firstName, ...remainingNames] = names;\n const firstKey = context.key(`${label}/${firstName}`);\n const prefix = firstKey.slice(0, -firstName.length);\n await seed(context, firstKey, firstName);\n for (const name of remainingNames) {\n await seed(context, context.track(`${prefix}${name}`), name);\n }\n\n const request: CursorReplayRequest = {\n ...(delimiter === undefined ? {} : { delimiter }),\n limit: 1,\n prefix,\n };\n const first = await context.client.list(request);\n assertPageSize(first, 1);\n const cursor = requiredCursor(\n first,\n 'provider omitted a continuation cursor while matching entries remained',\n );\n\n const replayRequest = { ...request, cursor };\n const expected = await context.client.list(replayRequest);\n assertPageSize(expected, 1);\n const descendantCursor = requiredCursor(\n expected,\n 'provider omitted a descendant cursor while matching entries remained',\n );\n\n // Follow a cursor derived from the input before replaying its ancestor. A\n // consuming cursor implementation will now fail or change the page.\n const descendant = await context.client.list({\n ...request,\n cursor: descendantCursor,\n });\n assertPageSize(descendant, 1);\n const replayed = await context.client.list(replayRequest);\n assertEquivalentListPage(\n replayed,\n expected,\n 'reusing a provider cursor after its descendant changed the page',\n );\n await assertEquivalentNextPage(\n context.client,\n replayed,\n descendant,\n request,\n 'replayed cursor returned a continuation for a different position',\n );\n\n const wider = await context.client.list({\n ...replayRequest,\n limit: 2,\n });\n assertPageSize(wider, 2);\n deepStrictEqual(\n logicalEntryIds(wider),\n [...logicalEntryIds(expected), ...logicalEntryIds(descendant)].sort(),\n 'changing the page limit changed the cursor starting position',\n );\n const afterWider = await context.client.list({\n ...request,\n cursor: requiredCursor(\n descendant,\n 'provider ended before the wider-page continuation could be verified',\n ),\n });\n await assertEquivalentNextPage(\n context.client,\n wider,\n afterWider,\n request,\n 'changed-limit cursor returned a continuation for a different position',\n );\n\n const replica = await context.createReplica();\n const replicaReplay = await replica.list(replayRequest);\n assertEquivalentListPage(\n replicaReplay,\n expected,\n 'an independently constructed replica resumed at a different page',\n );\n await assertEquivalentNextPage(\n replica,\n replicaReplay,\n descendant,\n request,\n 'replica cursor returned a continuation for a different position',\n );\n\n const replicaWider = await replica.list({ ...replayRequest, limit: 2 });\n assertEquivalentListPage(\n replicaWider,\n wider,\n 'a replica changed the page returned with a different limit',\n );\n await assertEquivalentNextPage(\n replica,\n replicaWider,\n afterWider,\n request,\n 'replica changed-limit cursor returned a continuation for a different position',\n );\n}\n\ninterface CursorReplayRequest {\n readonly delimiter?: string;\n readonly limit: number;\n readonly prefix: string;\n}\n\nfunction comparableListPage(page: StorageListResult): unknown {\n return {\n items: page.items.map((item) => ({\n contentType: item.contentType,\n etag: item.etag,\n key: item.key,\n lastModified: item.lastModified?.toISOString(),\n metadata: item.metadata,\n name: item.name,\n size: item.size,\n })),\n prefixes: page.prefixes,\n };\n}\n\nfunction assertEquivalentListPage(\n actual: StorageListResult,\n expected: StorageListResult,\n message: string,\n): void {\n deepStrictEqual(\n comparableListPage(actual),\n comparableListPage(expected),\n message,\n );\n equal(\n actual.cursor === undefined,\n expected.cursor === undefined,\n `${message}: continuation presence differed`,\n );\n}\n\nasync function assertEquivalentNextPage(\n client: StorageClient,\n actual: StorageListResult,\n expectedNext: StorageListResult,\n request: CursorReplayRequest,\n message: string,\n): Promise<void> {\n const cursor = requiredCursor(\n actual,\n `${message}: provider did not return a continuation cursor`,\n );\n const actualNext = await client.list({ ...request, cursor });\n assertEquivalentListPage(actualNext, expectedNext, message);\n}\n\nfunction assertPageSize(page: StorageListResult, expected: number): void {\n equal(\n page.items.length + (page.prefixes?.length ?? 0),\n expected,\n 'provider ignored the list page limit across items and common prefixes',\n );\n}\n\nfunction requiredCursor(page: StorageListResult, message: string): string {\n ok(page.cursor !== undefined && page.cursor.length > 0, message);\n return page.cursor;\n}\n\nfunction logicalEntryIds(page: StorageListResult): string[] {\n return [\n ...page.items.map((item) => `item:${item.key}`),\n ...(page.prefixes ?? []).map((prefix) => `prefix:${prefix}`),\n ].sort();\n}\n\nfunction invalidPreconditionEtagCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n return providerCase(\n options,\n 'rejects invalid conditional ETags before dispatch or mutation',\n async (context) => {\n const source = context.key('invalid-etag-source.txt');\n const destination = context.key('invalid-etag-destination.txt');\n await seed(context, source, 'source-original');\n await seed(context, destination, 'destination-original');\n\n const countDispatches = context.dispatchCount;\n const dispatchedBefore = countDispatches?.();\n const invalidEtag = '\"stale\",\"current\"';\n const operations = [\n () =>\n context.client.uploadConditional(source, 'must-not-replace', {\n condition: { etag: invalidEtag, type: 'replace' },\n }),\n () =>\n context.client.downloadConditional(source, {\n condition: { etag: invalidEtag },\n }),\n () =>\n context.client.deleteConditional(source, {\n condition: { etag: invalidEtag },\n }),\n () =>\n context.client.promote(source, destination, {\n sourceEtag: invalidEtag,\n }),\n () =>\n context.client.promote(source, destination, {\n destination: { etag: invalidEtag, type: 'replace' },\n }),\n ] as const;\n\n for (const operation of operations) {\n const error = await expectStorageError(\n operation,\n StorageErrorCode.INVALID_ARGUMENT,\n options,\n );\n equal(error.permanent, true);\n }\n\n if (countDispatches !== undefined && dispatchedBefore !== undefined) {\n equal(\n countDispatches(),\n dispatchedBefore,\n 'invalid conditional ETags reached the provider driver',\n );\n }\n equal(await readText(context.client, source), 'source-original');\n equal(\n await readText(context.client, destination),\n 'destination-original',\n );\n },\n );\n}\n\nfunction conditionalCreateCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const capability = options.expected.conditionalCreate;\n return providerCase(\n options,\n capability === undefined\n ? 'fails closed when conditional create is unsupported'\n : 'enforces conditional create atomically',\n async (context) => {\n const key = context.key('conditional-create.txt');\n if (capability === undefined) {\n await expectStorageError(\n () =>\n context.client.uploadConditional(key, 'blocked', {\n condition: { type: 'create' },\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await context.client.exists(key), false);\n return;\n }\n\n const created = await context.client.uploadConditional(key, 'created', {\n condition: { type: 'create' },\n });\n assertResultEtag(created, capability.resultEtag);\n await expectStorageError(\n () =>\n context.client.uploadConditional(key, 'overwritten', {\n condition: { type: 'create' },\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n equal(await readText(context.client, key), 'created');\n },\n );\n}\n\nfunction conditionalReplaceCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const capability = options.expected.conditionalReplace;\n return providerCase(\n options,\n capability === undefined\n ? 'fails closed when conditional replace is unsupported'\n : 'enforces conditional replace atomically',\n async (context) => {\n const key = context.key('conditional-replace.txt');\n const original = await seed(context, key, 'original');\n const etag = await resultEtag(context.client, key, original);\n if (capability === undefined) {\n await expectStorageError(\n () =>\n context.client.uploadConditional(key, 'blocked', {\n condition: { etag, type: 'replace' },\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await readText(context.client, key), 'original');\n return;\n }\n\n const replaced = await context.client.uploadConditional(key, 'replaced', {\n condition: { etag, type: 'replace' },\n });\n assertResultEtag(replaced, capability.resultEtag);\n await expectStorageError(\n () =>\n context.client.uploadConditional(key, 'stale-overwrite', {\n condition: { etag, type: 'replace' },\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n equal(await readText(context.client, key), 'replaced');\n },\n );\n}\n\nfunction conditionalDeleteCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const capability = options.expected.conditionalDelete;\n return providerCase(\n options,\n capability?.etag === true\n ? 'enforces ETag-conditional delete atomically'\n : 'fails closed when ETag-conditional delete is unsupported',\n async (context) => {\n const key = context.key('conditional-delete.txt');\n const original = await seed(context, key, 'retained');\n const etag = await resultEtag(context.client, key, original);\n if (capability?.etag !== true) {\n await expectStorageError(\n () =>\n context.client.deleteConditional(key, {\n condition: { etag },\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await context.client.exists(key), true);\n return;\n }\n\n await expectStorageError(\n () =>\n context.client.deleteConditional(key, {\n condition: { etag: staleEtag(etag) },\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n equal(await context.client.exists(key), true);\n await context.client.deleteConditional(key, { condition: { etag } });\n equal(await context.client.exists(key), false);\n },\n );\n}\n\nfunction conditionalReadEtagCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const supported = options.expected.conditionalRead?.etag === true;\n return providerCase(\n options,\n supported\n ? 'reads only the requested ETag identity'\n : 'fails closed when ETag-conditional read is unsupported',\n async (context) => {\n const key = context.key('conditional-read-etag.txt');\n const original = await seed(context, key, 'observed');\n const etag = await resultEtag(context.client, key, original);\n if (!supported) {\n await expectStorageError(\n () =>\n context.client.downloadConditional(key, {\n condition: { etag },\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n return;\n }\n\n equal(\n await objectText(\n await context.client.downloadConditional(key, {\n condition: { etag },\n }),\n ),\n 'observed',\n );\n await seed(context, key, 'changed');\n await expectStorageError(\n () =>\n context.client.downloadConditional(key, {\n condition: { etag },\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n },\n );\n}\n\nfunction conditionalReadVersionCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const supported = options.expected.conditionalRead?.version === true;\n return providerCase(\n options,\n supported\n ? 'reads an immutable provider version'\n : 'fails closed when version-conditional read is unsupported',\n async (context) => {\n const key = context.key('conditional-read-version.txt');\n await seed(context, key, 'version-one');\n if (!supported) {\n await expectStorageError(\n () =>\n context.client.downloadConditional(key, {\n condition: { version: 'unsupported-version' },\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n return;\n }\n\n const version = await context.resolveVersion(key);\n if (version === undefined) {\n return skippedVersion(options.provider);\n }\n await seed(context, key, 'version-two');\n equal(\n await objectText(\n await context.client.downloadConditional(key, {\n condition: { version },\n }),\n ),\n 'version-one',\n );\n },\n );\n}\n\nfunction conditionalCopySourceEtagCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const supported = options.expected.conditionalCopySource?.etag === true;\n return providerCase(\n options,\n supported\n ? 'copies only the requested source ETag'\n : 'fails closed when source-ETag copy is unsupported',\n async (context) => {\n const source = context.key('copy-source-etag.txt');\n const destination = context.key('copy-source-etag-result.txt');\n const original = await seed(context, source, 'source-one');\n const etag = await resultEtag(context.client, source, original);\n if (!supported) {\n await expectStorageError(\n () =>\n context.client.promote(source, destination, { sourceEtag: etag }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await context.client.exists(destination), false);\n return;\n }\n\n await context.client.promote(source, destination, { sourceEtag: etag });\n equal(await readText(context.client, destination), 'source-one');\n const staleDestination = context.key('copy-source-etag-stale.txt');\n await seed(context, source, 'source-two');\n await expectStorageError(\n () =>\n context.client.promote(source, staleDestination, {\n sourceEtag: etag,\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n equal(await context.client.exists(staleDestination), false);\n },\n );\n}\n\nfunction conditionalCopySourceVersionCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const supported = options.expected.conditionalCopySource?.version === true;\n return providerCase(\n options,\n supported\n ? 'copies an immutable source version'\n : 'fails closed when source-version copy is unsupported',\n async (context) => {\n const source = context.key('copy-source-version.txt');\n const destination = context.key('copy-source-version-result.txt');\n await seed(context, source, 'source-version-one');\n if (!supported) {\n await expectStorageError(\n () =>\n context.client.promote(source, destination, {\n sourceVersion: 'unsupported-version',\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await context.client.exists(destination), false);\n return;\n }\n\n const version = await context.resolveVersion(source);\n if (version === undefined) {\n return skippedVersion(options.provider);\n }\n await seed(context, source, 'source-version-two');\n await context.client.promote(source, destination, {\n sourceVersion: version,\n });\n equal(await readText(context.client, destination), 'source-version-one');\n },\n );\n}\n\nfunction conditionalCopyDestinationCreateCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const supported =\n options.expected.conditionalCopyDestination?.create === true;\n return providerCase(\n options,\n supported\n ? 'enforces create-only copy at the destination'\n : 'fails closed when create-only destination copy is unsupported',\n async (context) => {\n const source = context.key('copy-destination-create-source.txt');\n const destination = context.key('copy-destination-create-result.txt');\n await seed(context, source, 'copy-created');\n if (!supported) {\n await expectStorageError(\n () =>\n context.client.promote(source, destination, {\n destination: { type: 'create' },\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await context.client.exists(destination), false);\n return;\n }\n\n await context.client.promote(source, destination, {\n destination: { type: 'create' },\n });\n equal(await readText(context.client, destination), 'copy-created');\n await expectStorageError(\n () =>\n context.client.promote(source, destination, {\n destination: { type: 'create' },\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n },\n );\n}\n\nfunction conditionalCopyDestinationReplaceCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const supported =\n options.expected.conditionalCopyDestination?.replace === true;\n return providerCase(\n options,\n supported\n ? 'enforces ETag replacement at the copy destination'\n : 'fails closed when destination replacement copy is unsupported',\n async (context) => {\n const source = context.key('copy-destination-replace-source.txt');\n const destination = context.key('copy-destination-replace-result.txt');\n await seed(context, source, 'replacement');\n const original = await seed(context, destination, 'destination-old');\n const etag = await resultEtag(context.client, destination, original);\n if (!supported) {\n await expectStorageError(\n () =>\n context.client.promote(source, destination, {\n destination: { etag, type: 'replace' },\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await readText(context.client, destination), 'destination-old');\n return;\n }\n\n await context.client.promote(source, destination, {\n destination: { etag, type: 'replace' },\n });\n equal(await readText(context.client, destination), 'replacement');\n await expectStorageError(\n () =>\n context.client.promote(source, destination, {\n destination: { etag, type: 'replace' },\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n },\n );\n}\n\ntype SourceCopyPredicate = 'etag' | 'version';\ntype DestinationCopyPredicate = 'create' | 'replace';\n\nfunction conditionalCopyAtomicityCases(\n options: StorageProviderConformanceOptions,\n): readonly StorageProviderConformanceCase[] {\n const destination = options.expected.conditionalCopyDestination;\n const source = options.expected.conditionalCopySource;\n const sources: SourceCopyPredicate[] = [\n ...(source?.etag === true ? (['etag'] as const) : []),\n ...(source?.version === true ? (['version'] as const) : []),\n ];\n const destinations: DestinationCopyPredicate[] = [\n ...(destination?.create === true ? (['create'] as const) : []),\n ...(destination?.replace === true ? (['replace'] as const) : []),\n ];\n if (sources.length === 0 || destinations.length === 0) {\n return [conditionalCopyNonAtomicCase(options, 'etag', 'create')];\n }\n if (destination?.atomicWithSource !== true) {\n return sources.flatMap((sourcePredicate) =>\n destinations.map((destinationPredicate) =>\n conditionalCopyNonAtomicCase(\n options,\n sourcePredicate,\n destinationPredicate,\n ),\n ),\n );\n }\n\n return sources.flatMap((sourcePredicate) =>\n destinations.map((destinationPredicate) =>\n providerCase(\n options,\n `combines ${sourcePredicate} source and ${destinationPredicate} destination copy predicates atomically`,\n (context) =>\n verifyAtomicCopyCombination(\n context,\n options,\n sourcePredicate,\n destinationPredicate,\n ),\n ),\n ),\n );\n}\n\nasync function verifyAtomicCopyCombination(\n context: CaseContext,\n options: StorageProviderConformanceOptions,\n sourcePredicate: SourceCopyPredicate,\n destinationPredicate: DestinationCopyPredicate,\n): Promise<StorageProviderConformanceCaseResult | void> {\n const label = `${sourcePredicate}-${destinationPredicate}`;\n const sourceKey = context.key(`copy-atomic-${label}-source.txt`);\n const destinationKey = context.key(`copy-atomic-${label}-result.txt`);\n const original = await seed(context, sourceKey, 'source-original');\n const originalSource = await sourceCopyCondition(\n context,\n sourceKey,\n original,\n sourcePredicate,\n );\n if (originalSource === undefined) return skippedVersion(options.provider);\n\n const validDestination = await destinationCopyCondition(\n context,\n destinationKey,\n destinationPredicate,\n 'destination-original',\n );\n\n const staleSource =\n sourcePredicate === 'etag'\n ? originalSource\n : { sourceVersion: `missing-${randomUUID()}` };\n if (sourcePredicate === 'etag') {\n await seed(context, sourceKey, 'source-current');\n }\n await expectAnyStorageError(\n () =>\n context.client.promote(sourceKey, destinationKey, {\n ...staleSource,\n ...validDestination,\n }),\n options,\n );\n await assertDestinationContent(\n context,\n destinationKey,\n destinationPredicate,\n 'destination-original',\n );\n\n const currentSource = await sourceCopyCondition(\n context,\n sourceKey,\n await context.client.head(sourceKey),\n sourcePredicate,\n );\n if (currentSource === undefined) return skippedVersion(options.provider);\n const staleDestination = await staleDestinationCopyCondition(\n context,\n destinationKey,\n destinationPredicate,\n );\n await expectStorageError(\n () =>\n context.client.promote(sourceKey, destinationKey, {\n ...currentSource,\n ...staleDestination,\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n equal(await readText(context.client, destinationKey), 'destination-raced');\n\n const successDestination = await currentDestinationCopyCondition(\n context,\n destinationKey,\n destinationPredicate,\n );\n await context.client.promote(sourceKey, destinationKey, {\n ...currentSource,\n ...successDestination,\n });\n equal(\n await readText(context.client, destinationKey),\n sourcePredicate === 'etag' ? 'source-current' : 'source-original',\n );\n\n await verifyAtomicCopyRace(\n context,\n options,\n sourcePredicate,\n destinationPredicate,\n label,\n );\n}\n\nasync function verifyAtomicCopyRace(\n context: CaseContext,\n options: StorageProviderConformanceOptions,\n sourcePredicate: SourceCopyPredicate,\n destinationPredicate: DestinationCopyPredicate,\n label: string,\n): Promise<void> {\n const staleSourceKey = context.key(`copy-race-${label}-stale.txt`);\n const validSourceKey = context.key(`copy-race-${label}-valid.txt`);\n const destinationKey = context.key(`copy-race-${label}-destination.txt`);\n const staleResult = await seed(context, staleSourceKey, 'stale-original');\n const observedStale = await sourceCopyCondition(\n context,\n staleSourceKey,\n staleResult,\n sourcePredicate,\n );\n ok(\n observedStale !== undefined,\n 'versioned provider stopped resolving versions during the atomicity race',\n );\n const staleCondition =\n sourcePredicate === 'etag'\n ? observedStale\n : { sourceVersion: `missing-${randomUUID()}` };\n if (sourcePredicate === 'etag') {\n await seed(context, staleSourceKey, 'stale-current');\n }\n\n const validResult = await seed(context, validSourceKey, 'race-winner');\n const validCondition = await sourceCopyCondition(\n context,\n validSourceKey,\n validResult,\n sourcePredicate,\n );\n ok(\n validCondition !== undefined,\n 'versioned provider did not resolve the valid race source version',\n );\n const destinationCondition = await destinationCopyCondition(\n context,\n destinationKey,\n destinationPredicate,\n 'race-destination',\n );\n\n const staleAttempt = expectAnyStorageError(\n () =>\n context.client.promote(staleSourceKey, destinationKey, {\n ...staleCondition,\n ...destinationCondition,\n }),\n options,\n );\n await Promise.resolve();\n const validAttempt = context.client.promote(validSourceKey, destinationKey, {\n ...validCondition,\n ...destinationCondition,\n });\n await Promise.all([staleAttempt, validAttempt]);\n equal(await readText(context.client, destinationKey), 'race-winner');\n}\n\nasync function sourceCopyCondition(\n context: CaseContext,\n key: string,\n result: StorageUploadResult | { readonly etag?: string },\n predicate: SourceCopyPredicate,\n): Promise<\n | { readonly sourceEtag: string }\n | { readonly sourceVersion: string }\n | undefined\n> {\n if (predicate === 'etag') {\n return {\n sourceEtag: await resultEtag(context.client, key, result),\n };\n }\n const version = await context.resolveVersion(key);\n return version === undefined ? undefined : { sourceVersion: version };\n}\n\nasync function destinationCopyCondition(\n context: CaseContext,\n key: string,\n predicate: DestinationCopyPredicate,\n body: string,\n): Promise<\n | { readonly destination: { readonly type: 'create' } }\n | {\n readonly destination: {\n readonly etag: string;\n readonly type: 'replace';\n };\n }\n> {\n if (predicate === 'create') {\n return { destination: { type: 'create' } };\n }\n const result = await seed(context, key, body);\n return {\n destination: {\n etag: await resultEtag(context.client, key, result),\n type: 'replace',\n },\n };\n}\n\nasync function staleDestinationCopyCondition(\n context: CaseContext,\n key: string,\n predicate: DestinationCopyPredicate,\n): ReturnType<typeof destinationCopyCondition> {\n if (predicate === 'create') {\n await seed(context, key, 'destination-raced');\n return { destination: { type: 'create' } };\n }\n const observed = await context.client.head(key);\n const etag = await resultEtag(context.client, key, observed);\n await seed(context, key, 'destination-raced');\n return { destination: { etag, type: 'replace' } };\n}\n\nasync function currentDestinationCopyCondition(\n context: CaseContext,\n key: string,\n predicate: DestinationCopyPredicate,\n): ReturnType<typeof destinationCopyCondition> {\n if (predicate === 'create') {\n await context.client.delete(key);\n return { destination: { type: 'create' } };\n }\n const current = await context.client.head(key);\n return {\n destination: {\n etag: await resultEtag(context.client, key, current),\n type: 'replace',\n },\n };\n}\n\nasync function assertDestinationContent(\n context: CaseContext,\n key: string,\n predicate: DestinationCopyPredicate,\n expected: string,\n): Promise<void> {\n if (predicate === 'create') {\n equal(await context.client.exists(key), false);\n } else {\n equal(await readText(context.client, key), expected);\n }\n}\n\nfunction conditionalCopyNonAtomicCase(\n options: StorageProviderConformanceOptions,\n sourcePredicate: SourceCopyPredicate,\n destinationPredicate: DestinationCopyPredicate,\n): StorageProviderConformanceCase {\n return providerCase(\n options,\n `fails closed for combined ${sourcePredicate} source and ${destinationPredicate} destination when copy predicates are not atomic`,\n async (context) => {\n const sourceKey = context.key('copy-atomic-source.txt');\n const destinationKey = context.key('copy-atomic-result.txt');\n const original = await seed(context, sourceKey, 'atomic-copy');\n let sourceCondition: { sourceEtag: string } | { sourceVersion: string };\n if (sourcePredicate === 'version') {\n sourceCondition = { sourceVersion: 'unsupported-version' };\n } else {\n sourceCondition = {\n sourceEtag: await resultEtag(context.client, sourceKey, original),\n };\n }\n const destinationCondition =\n destinationPredicate === 'replace'\n ? {\n destination: {\n etag: await resultEtag(\n context.client,\n destinationKey,\n await seed(context, destinationKey, 'destination-old'),\n ),\n type: 'replace' as const,\n },\n }\n : { destination: { type: 'create' as const } };\n const promotion = { ...sourceCondition, ...destinationCondition };\n const dispatchedBefore = context.dispatchCount?.();\n await expectStorageError(\n () => context.client.promote(sourceKey, destinationKey, promotion),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n if (dispatchedBefore !== undefined) {\n equal(\n context.dispatchCount?.(),\n dispatchedBefore,\n 'non-atomic combined promotion reached the provider driver',\n );\n }\n if (destinationPredicate === 'replace') {\n equal(\n await readText(context.client, destinationKey),\n 'destination-old',\n );\n } else {\n equal(await context.client.exists(destinationKey), false);\n }\n },\n );\n}\n\nfunction conditionalMultipartCreateCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const supported =\n options.expected.conditionalMultipartCompletion?.create === true;\n return providerCase(\n options,\n supported\n ? 'enforces create-only multipart completion'\n : 'fails closed when conditional multipart create is unsupported',\n async (context) => {\n const key = context.key('multipart-create.bin');\n if (!supported) {\n await expectStorageError(\n () =>\n context.client.uploadConditional(key, 'blocked', {\n condition: { type: 'create' },\n multipart: true,\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await context.client.exists(key), false);\n return;\n }\n\n const body = multipartBody(options);\n const result = await context.client.uploadConditional(key, body, {\n condition: { type: 'create' },\n multipart: { concurrency: 1, partSize: 5 * 1024 * 1024 },\n });\n assertResultEtag(\n result,\n options.expected.conditionalCreate?.resultEtag === true,\n );\n await expectStorageError(\n () =>\n context.client.uploadConditional(key, body, {\n condition: { type: 'create' },\n multipart: { concurrency: 1, partSize: 5 * 1024 * 1024 },\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n },\n );\n}\n\nfunction conditionalMultipartReplaceCase(\n options: StorageProviderConformanceOptions,\n): StorageProviderConformanceCase {\n const supported =\n options.expected.conditionalMultipartCompletion?.replace === true;\n return providerCase(\n options,\n supported\n ? 'enforces ETag-conditional multipart replacement'\n : 'fails closed when conditional multipart replace is unsupported',\n async (context) => {\n const key = context.key('multipart-replace.bin');\n const original = await seed(context, key, 'multipart-original');\n const etag = await resultEtag(context.client, key, original);\n if (!supported) {\n await expectStorageError(\n () =>\n context.client.uploadConditional(key, 'blocked', {\n condition: { etag, type: 'replace' },\n multipart: true,\n }),\n StorageErrorCode.NOT_SUPPORTED,\n options,\n );\n equal(await readText(context.client, key), 'multipart-original');\n return;\n }\n\n const body = multipartBody(options);\n const result = await context.client.uploadConditional(key, body, {\n condition: { etag, type: 'replace' },\n multipart: { concurrency: 1, partSize: 5 * 1024 * 1024 },\n });\n assertResultEtag(\n result,\n options.expected.conditionalReplace?.resultEtag === true,\n );\n await expectStorageError(\n () =>\n context.client.uploadConditional(key, body, {\n condition: { etag, type: 'replace' },\n multipart: { concurrency: 1, partSize: 5 * 1024 * 1024 },\n }),\n StorageErrorCode.CONFLICT,\n options,\n );\n },\n );\n}\n\nfunction providerCase(\n options: StorageProviderConformanceOptions,\n name: string,\n operation: CaseOperation,\n): StorageProviderConformanceCase {\n return Object.freeze({\n name,\n async run(): Promise<StorageProviderConformanceCaseResult> {\n return withFixture(options, operation);\n },\n });\n}\n\nasync function withFixture(\n options: StorageProviderConformanceOptions,\n operation: CaseOperation,\n): Promise<StorageProviderConformanceCaseResult> {\n const fixture = await options.createFixture();\n const keys = new Set<string>();\n const replicas: StorageClient[] = [];\n const namespace = `nestm-conformance/${safeSegment(options.provider)}/${randomUUID()}`;\n const context: CaseContext = {\n client: fixture.client,\n ...(fixture.dispatchCount === undefined\n ? {}\n : { dispatchCount: fixture.dispatchCount }),\n async createReplica() {\n const replica = await fixture.createReplica();\n ok(\n replica !== fixture.client && !replicas.includes(replica),\n 'createReplica must return a fresh StorageClient instance',\n );\n replicas.push(replica);\n equal(\n replica.name,\n fixture.client.name,\n 'createReplica must address the same logical store name',\n );\n return replica;\n },\n key(label) {\n const key = `${namespace}/${label}`;\n keys.add(key);\n return key;\n },\n resolveVersion(key) {\n return fixture.resolveVersion?.(key) ?? Promise.resolve(undefined);\n },\n track(key) {\n keys.add(key);\n return key;\n },\n };\n\n const noError = Symbol('no-error');\n let operationError: unknown | typeof noError = noError;\n let result: StorageProviderConformanceCaseResult = PASSED;\n try {\n result = (await operation(context)) ?? PASSED;\n } catch (error: unknown) {\n operationError = error;\n }\n\n let cleanupError: unknown | typeof noError = noError;\n try {\n if (fixture.cleanup === undefined) {\n await cleanupWithClient(fixture.client, [...keys]);\n } else {\n await fixture.cleanup([...keys]);\n }\n } catch (error: unknown) {\n cleanupError = error;\n }\n for (const replica of replicas.reverse()) {\n try {\n await replica.onApplicationShutdown();\n } catch (error: unknown) {\n if (cleanupError === noError) cleanupError = error;\n }\n }\n try {\n await fixture.client.onApplicationShutdown();\n } catch (error: unknown) {\n if (cleanupError === noError) cleanupError = error;\n }\n try {\n await fixture.close?.();\n } catch (error: unknown) {\n if (cleanupError === noError) cleanupError = error;\n }\n\n if (operationError !== noError) throw operationError;\n if (cleanupError !== noError) throw cleanupError;\n return result;\n}\n\nasync function cleanupWithClient(\n client: StorageClient,\n keys: readonly string[],\n): Promise<void> {\n for (const key of keys) {\n try {\n await client.delete(key);\n } catch (error: unknown) {\n if (!isStorageError(error) || error.code !== StorageErrorCode.NOT_FOUND) {\n throw error;\n }\n }\n }\n}\n\nfunction conditionalCapabilitiesOf(\n capabilities: Readonly<StorageCapabilities>,\n): StorageProviderConformanceCapabilities {\n const conditional: Partial<StorageProviderConformanceCapabilities> = {};\n for (const key of CONDITIONAL_CAPABILITY_KEYS) {\n const capability = capabilities[key];\n if (capability !== undefined) {\n Object.assign(conditional, { [key]: capability });\n }\n }\n ok(\n capabilities.physicalKey !== undefined,\n 'provider must declare its complete physical-key byte budget',\n );\n return {\n ...conditional,\n physicalKey: capabilities.physicalKey,\n ...(capabilities.signedUploadPolicy === undefined\n ? {}\n : { signedUploadPolicy: capabilities.signedUploadPolicy }),\n };\n}\n\nasync function seed(\n context: CaseContext,\n key: string,\n body: string | Uint8Array,\n): Promise<StorageUploadResult> {\n context.track(key);\n const result = await context.client.upload(key, body);\n assertOptionalResultEtag(\n result,\n 'provider upload returned a non-canonical ETag',\n );\n return result;\n}\n\nasync function resultEtag(\n client: StorageClient,\n key: string,\n result: { readonly etag?: string },\n): Promise<string> {\n const etag = result.etag ?? (await client.head(key)).etag;\n ok(\n isCanonicalStorageEtag(etag),\n 'provider did not return a canonical bare strong ETag',\n );\n return etag;\n}\n\nfunction assertResultEtag(\n result: StorageUploadResult,\n required: boolean,\n): void {\n assertOptionalResultEtag(\n result,\n 'conditional write returned a non-canonical ETag',\n );\n if (required) {\n ok(\n isCanonicalStorageEtag(result.etag),\n 'conditional write committed without the advertised result ETag',\n );\n }\n}\n\nfunction assertOptionalResultEtag(\n result: { readonly etag?: string },\n message: string,\n): void {\n ok(result.etag === undefined || isCanonicalStorageEtag(result.etag), message);\n}\n\nasync function readText(client: StorageClient, key: string): Promise<string> {\n return objectText(await client.downloadStream(key));\n}\n\nasync function objectText(object: StorageObject): Promise<string> {\n assertOptionalResultEtag(\n object,\n 'provider download returned a non-canonical ETag',\n );\n return new Response(object.body).text();\n}\n\nasync function expectStorageError(\n operation: () => Promise<unknown>,\n code: StorageError['code'],\n options: StorageProviderConformanceOptions,\n): Promise<StorageError> {\n try {\n await operation();\n } catch (error: unknown) {\n ok(isStorageError(error), 'provider operation did not return StorageError');\n equal(error.code, code);\n assertSanitizedError(error, options.forbiddenErrorValues ?? []);\n return error;\n }\n fail(`provider operation unexpectedly succeeded; expected ${code}`);\n}\n\nasync function expectAnyStorageError(\n operation: () => Promise<unknown>,\n options: StorageProviderConformanceOptions,\n): Promise<StorageError> {\n try {\n await operation();\n } catch (error: unknown) {\n ok(isStorageError(error), 'provider operation did not return StorageError');\n assertSanitizedError(error, options.forbiddenErrorValues ?? []);\n return error;\n }\n fail('provider operation unexpectedly succeeded');\n}\n\nfunction assertSanitizedError(\n error: StorageError,\n forbiddenValues: readonly string[],\n): void {\n equal(error.cause, undefined, 'public storage error retained a raw cause');\n ok(error.message.length <= 512, 'public storage error is unexpectedly large');\n match(\n error.message,\n /^[^\\r\\n]*$/u,\n 'public storage error contains line breaks',\n );\n ok(\n !/<(?:Error|Code|Message|RequestId|HostId)>/iu.test(error.message),\n 'public storage error contains a serialized provider response',\n );\n const serialized = `${inspect(error, { depth: null })}\\n${JSON.stringify({ error })}`;\n ok(\n !/(?:\\$metadata|request.?id|host.?id|<Error>|<Message>)/iu.test(serialized),\n 'public storage error serialization contains provider response metadata',\n );\n for (const value of forbiddenValues) {\n if (value.length > 0) {\n ok(\n !serialized.includes(value),\n 'public storage error serialization contains a forbidden provider value',\n );\n }\n }\n}\n\nfunction staleEtag(etag: string): string {\n return etag === 'nestm-conformance-stale-etag'\n ? 'nestm-conformance-other-etag'\n : 'nestm-conformance-stale-etag';\n}\n\nfunction multipartBody(options: StorageProviderConformanceOptions): Uint8Array {\n return new Uint8Array(options.multipartBytes ?? DEFAULT_MULTIPART_BYTES);\n}\n\nfunction skippedVersion(\n provider: string,\n): StorageProviderConformanceCaseResult {\n return {\n reason: `${provider} returned no version ID; use a dedicated version-enabled bucket to exercise this advertised subcapability`,\n status: 'skipped',\n };\n}\n\nfunction positiveSafeInteger(value: number, label: string): void {\n ok(\n Number.isSafeInteger(value) && value > 0,\n `${label} must be a positive safe integer`,\n );\n}\n\nfunction safeSegment(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/gu, '-')\n .replace(/^-+|-+$/gu, '') || 'provider'\n );\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  export { StorageWorkspaceError, isStorageWorkspaceError, } from './storage-workspace.error.js';
2
+ export { Aes256GcmStorageWorkspaceCursorCodec, STORAGE_WORKSPACE_CURSOR_VERSION, STORAGE_WORKSPACE_MAX_CURSOR_BYTES, type Aes256GcmStorageWorkspaceCursorCodecOptions, type StorageWorkspaceCursorCodec, type StorageWorkspaceCursorConfiguration, type StorageWorkspaceCursorEncodeOptions, } from './storage-workspace.cursor.js';
2
3
  export { createStorageWorkspace, mountStorageWorkspace, } from './storage-workspace.js';
3
4
  export { DEFAULT_STORAGE_WORKSPACE_LIMITS, STORAGE_WORKSPACE_PERMISSIONS, type MountStorageWorkspaceOptions, type StorageWorkspaceBody, type StorageWorkspace, type StorageWorkspaceDirectory, type StorageWorkspaceEntry, type StorageWorkspaceFile, type StorageWorkspaceLimits, type StorageWorkspaceListOptions, type StorageWorkspaceMountOptions, type StorageWorkspaceMutationOptions, type StorageWorkspacePage, type StorageWorkspacePermission, type StorageWorkspaceReadOptions, type StorageWorkspaceSearchMatch, type StorageWorkspaceSearchOptions, type StorageWorkspaceTextFile, type StorageWorkspaceWriteOptions, } from './storage-workspace.types.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gCAAgC,EAChC,6BAA6B,EAC7B,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,KAAK,4BAA4B,GAClC,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oCAAoC,EACpC,gCAAgC,EAChC,kCAAkC,EAClC,KAAK,2CAA2C,EAChD,KAAK,2BAA2B,EAChC,KAAK,mCAAmC,EACxC,KAAK,mCAAmC,GACzC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gCAAgC,EAChC,6BAA6B,EAC7B,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,KAAK,4BAA4B,GAClC,MAAM,8BAA8B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { StorageWorkspaceError, isStorageWorkspaceError, } from './storage-workspace.error.js';
2
+ export { Aes256GcmStorageWorkspaceCursorCodec, STORAGE_WORKSPACE_CURSOR_VERSION, STORAGE_WORKSPACE_MAX_CURSOR_BYTES, } from './storage-workspace.cursor.js';
2
3
  export { createStorageWorkspace, mountStorageWorkspace, } from './storage-workspace.js';
3
4
  export { DEFAULT_STORAGE_WORKSPACE_LIMITS, STORAGE_WORKSPACE_PERMISSIONS, } from './storage-workspace.types.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gCAAgC,EAChC,6BAA6B,GAkB9B,MAAM,8BAA8B,CAAC","sourcesContent":["export {\n StorageWorkspaceError,\n isStorageWorkspaceError,\n} from './storage-workspace.error.js';\nexport {\n createStorageWorkspace,\n mountStorageWorkspace,\n} from './storage-workspace.js';\nexport {\n DEFAULT_STORAGE_WORKSPACE_LIMITS,\n STORAGE_WORKSPACE_PERMISSIONS,\n type MountStorageWorkspaceOptions,\n type StorageWorkspaceBody,\n type StorageWorkspace,\n type StorageWorkspaceDirectory,\n type StorageWorkspaceEntry,\n type StorageWorkspaceFile,\n type StorageWorkspaceLimits,\n type StorageWorkspaceListOptions,\n type StorageWorkspaceMountOptions,\n type StorageWorkspaceMutationOptions,\n type StorageWorkspacePage,\n type StorageWorkspacePermission,\n type StorageWorkspaceReadOptions,\n type StorageWorkspaceSearchMatch,\n type StorageWorkspaceSearchOptions,\n type StorageWorkspaceTextFile,\n type StorageWorkspaceWriteOptions,\n} from './storage-workspace.types.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oCAAoC,EACpC,gCAAgC,EAChC,kCAAkC,GAKnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gCAAgC,EAChC,6BAA6B,GAkB9B,MAAM,8BAA8B,CAAC","sourcesContent":["export {\n StorageWorkspaceError,\n isStorageWorkspaceError,\n} from './storage-workspace.error.js';\nexport {\n Aes256GcmStorageWorkspaceCursorCodec,\n STORAGE_WORKSPACE_CURSOR_VERSION,\n STORAGE_WORKSPACE_MAX_CURSOR_BYTES,\n type Aes256GcmStorageWorkspaceCursorCodecOptions,\n type StorageWorkspaceCursorCodec,\n type StorageWorkspaceCursorConfiguration,\n type StorageWorkspaceCursorEncodeOptions,\n} from './storage-workspace.cursor.js';\nexport {\n createStorageWorkspace,\n mountStorageWorkspace,\n} from './storage-workspace.js';\nexport {\n DEFAULT_STORAGE_WORKSPACE_LIMITS,\n STORAGE_WORKSPACE_PERMISSIONS,\n type MountStorageWorkspaceOptions,\n type StorageWorkspaceBody,\n type StorageWorkspace,\n type StorageWorkspaceDirectory,\n type StorageWorkspaceEntry,\n type StorageWorkspaceFile,\n type StorageWorkspaceLimits,\n type StorageWorkspaceListOptions,\n type StorageWorkspaceMountOptions,\n type StorageWorkspaceMutationOptions,\n type StorageWorkspacePage,\n type StorageWorkspacePermission,\n type StorageWorkspaceReadOptions,\n type StorageWorkspaceSearchMatch,\n type StorageWorkspaceSearchOptions,\n type StorageWorkspaceTextFile,\n type StorageWorkspaceWriteOptions,\n} from './storage-workspace.types.js';\n"]}
@@ -1,6 +1,71 @@
1
- export declare class StorageWorkspaceCursorStore {
1
+ import type { StorageWorkspaceLimits, StorageWorkspaceSearchMatch } from './storage-workspace.types.js';
2
+ export declare const STORAGE_WORKSPACE_CURSOR_VERSION: 1;
3
+ export declare const STORAGE_WORKSPACE_MAX_CURSOR_BYTES = 4096;
4
+ export interface StorageWorkspaceCursorEncodeOptions {
5
+ /** Absolute Unix timestamp in milliseconds used by durable stores for TTL. */
6
+ readonly expiresAt: number;
7
+ }
8
+ /**
9
+ * Server-side opaque cursor contract. Implementations must either authenticate
10
+ * and encrypt payloads or keep them behind a shared durable random token.
11
+ * Tokens use only `[A-Za-z0-9._-]`, are at most 4,096 bytes, and `decode` must
12
+ * be non-destructive so the same token remains replayable until its authenticated
13
+ * expiry. Durable stores must expire records at `options.expiresAt` and read
14
+ * rather than consume them. Missing or expired records should fail with
15
+ * `StorageErrorCode.NOT_FOUND` or `StorageErrorCode.INVALID_ARGUMENT`;
16
+ * availability failures retain their operational storage error code.
17
+ */
18
+ export interface StorageWorkspaceCursorCodec {
19
+ encode(payload: Uint8Array, options: StorageWorkspaceCursorEncodeOptions): Promise<string> | string;
20
+ decode(token: string): Promise<Uint8Array> | Uint8Array;
21
+ }
22
+ export interface StorageWorkspaceCursorConfiguration {
23
+ /** Codec shared by every replica that serves this logical mount. */
24
+ readonly codec: StorageWorkspaceCursorCodec;
25
+ /** Stable server-derived mount or binding identity. */
26
+ readonly mountId: string;
27
+ /** Stable trusted tenant/workspace scope. */
28
+ readonly scope: string;
29
+ }
30
+ export interface Aes256GcmStorageWorkspaceCursorCodecOptions {
31
+ /** Key used for newly issued cursors. */
32
+ readonly activeKeyId: string;
33
+ /** Decryption key ring. Retain rotated keys for at least one cursor TTL. */
34
+ readonly keys: Readonly<Record<string, Uint8Array>>;
35
+ }
36
+ /** Stateless AES-256-GCM cursor codec suitable for shared multi-replica use. */
37
+ export declare class Aes256GcmStorageWorkspaceCursorCodec implements StorageWorkspaceCursorCodec {
2
38
  #private;
3
- issue<State>(binding: string, state: State, ttlMs: number): string;
4
- consume<State>(cursor: string, binding: string): State;
39
+ constructor(options: Aes256GcmStorageWorkspaceCursorCodecOptions);
40
+ encode(payload: Uint8Array, options: StorageWorkspaceCursorEncodeOptions): string;
41
+ decode(token: string): Uint8Array;
42
+ }
43
+ interface StorageWorkspaceCursorBinding {
44
+ readonly limits: Readonly<StorageWorkspaceLimits>;
45
+ readonly prefix: string;
46
+ readonly store: string;
47
+ }
48
+ export interface StorageWorkspaceListCursorData {
49
+ readonly backendCursor: string;
50
+ readonly directory: string;
51
+ readonly limit: number;
52
+ readonly operation: 'list';
53
+ readonly recursive: boolean;
54
+ }
55
+ export interface StorageWorkspaceSearchCursorData {
56
+ readonly backendCursor: string;
57
+ readonly caseInsensitive: boolean;
58
+ readonly directory: string;
59
+ readonly limit: number;
60
+ readonly match: StorageWorkspaceSearchMatch;
61
+ readonly operation: 'search';
62
+ readonly query: string;
63
+ readonly scanned: number;
5
64
  }
65
+ export type StorageWorkspaceCursorData = StorageWorkspaceListCursorData | StorageWorkspaceSearchCursorData;
66
+ export declare function resolveStorageWorkspaceCursorConfiguration(configuration: StorageWorkspaceCursorConfiguration | undefined): Readonly<StorageWorkspaceCursorConfiguration> | undefined;
67
+ export declare function issueStorageWorkspaceCursor(configuration: Readonly<StorageWorkspaceCursorConfiguration> | undefined, binding: StorageWorkspaceCursorBinding, cursor: StorageWorkspaceCursorData): Promise<string>;
68
+ export declare function decodeStorageWorkspaceCursor(configuration: Readonly<StorageWorkspaceCursorConfiguration> | undefined, binding: StorageWorkspaceCursorBinding, operation: 'list', token: string): Promise<StorageWorkspaceListCursorData>;
69
+ export declare function decodeStorageWorkspaceCursor(configuration: Readonly<StorageWorkspaceCursorConfiguration> | undefined, binding: StorageWorkspaceCursorBinding, operation: 'search', token: string): Promise<StorageWorkspaceSearchCursorData>;
70
+ export {};
6
71
  //# sourceMappingURL=storage-workspace.cursor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-workspace.cursor.d.ts","sourceRoot":"","sources":["../../src/workspace/storage-workspace.cursor.ts"],"names":[],"mappings":"AAcA,qBAAa,2BAA2B;;IAGtC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBjE;IAED,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAsBrD;CAUF"}
1
+ {"version":3,"file":"storage-workspace.cursor.d.ts","sourceRoot":"","sources":["../../src/workspace/storage-workspace.cursor.ts"],"names":[],"mappings":"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"}