@streetjs/storage 1.0.0
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/LICENSE +21 -0
- package/README.md +719 -0
- package/dist/access.d.ts +95 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +114 -0
- package/dist/access.js.map +1 -0
- package/dist/cli/commands.d.ts +88 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +369 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/generators.d.ts +41 -0
- package/dist/cli/generators.d.ts.map +1 -0
- package/dist/cli/generators.js +119 -0
- package/dist/cli/generators.js.map +1 -0
- package/dist/directory.d.ts +88 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +148 -0
- package/dist/directory.js.map +1 -0
- package/dist/driver.d.ts +83 -0
- package/dist/driver.d.ts.map +1 -0
- package/dist/driver.js +16 -0
- package/dist/driver.js.map +1 -0
- package/dist/drivers/azure.d.ts +239 -0
- package/dist/drivers/azure.d.ts.map +1 -0
- package/dist/drivers/azure.js +476 -0
- package/dist/drivers/azure.js.map +1 -0
- package/dist/drivers/backblaze.d.ts +105 -0
- package/dist/drivers/backblaze.d.ts.map +1 -0
- package/dist/drivers/backblaze.js +279 -0
- package/dist/drivers/backblaze.js.map +1 -0
- package/dist/drivers/gcs.d.ts +239 -0
- package/dist/drivers/gcs.d.ts.map +1 -0
- package/dist/drivers/gcs.js +454 -0
- package/dist/drivers/gcs.js.map +1 -0
- package/dist/drivers/local.d.ts +126 -0
- package/dist/drivers/local.d.ts.map +1 -0
- package/dist/drivers/local.js +321 -0
- package/dist/drivers/local.js.map +1 -0
- package/dist/drivers/memory.d.ts +104 -0
- package/dist/drivers/memory.d.ts.map +1 -0
- package/dist/drivers/memory.js +197 -0
- package/dist/drivers/memory.js.map +1 -0
- package/dist/drivers/minio.d.ts +90 -0
- package/dist/drivers/minio.d.ts.map +1 -0
- package/dist/drivers/minio.js +276 -0
- package/dist/drivers/minio.js.map +1 -0
- package/dist/drivers/r2.d.ts +100 -0
- package/dist/drivers/r2.d.ts.map +1 -0
- package/dist/drivers/r2.js +240 -0
- package/dist/drivers/r2.js.map +1 -0
- package/dist/drivers/s3-base.d.ts +270 -0
- package/dist/drivers/s3-base.d.ts.map +1 -0
- package/dist/drivers/s3-base.js +436 -0
- package/dist/drivers/s3-base.js.map +1 -0
- package/dist/drivers/s3.d.ts +111 -0
- package/dist/drivers/s3.d.ts.map +1 -0
- package/dist/drivers/s3.js +311 -0
- package/dist/drivers/s3.js.map +1 -0
- package/dist/drivers/supabase.d.ts +246 -0
- package/dist/drivers/supabase.d.ts.map +1 -0
- package/dist/drivers/supabase.js +502 -0
- package/dist/drivers/supabase.js.map +1 -0
- package/dist/errors.d.ts +115 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +131 -0
- package/dist/errors.js.map +1 -0
- package/dist/examples/storage-demo.d.ts +53 -0
- package/dist/examples/storage-demo.d.ts.map +1 -0
- package/dist/examples/storage-demo.js +242 -0
- package/dist/examples/storage-demo.js.map +1 -0
- package/dist/facade.d.ts +192 -0
- package/dist/facade.d.ts.map +1 -0
- package/dist/facade.js +898 -0
- package/dist/facade.js.map +1 -0
- package/dist/image.d.ts +94 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +224 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/events.d.ts +108 -0
- package/dist/integrations/events.d.ts.map +1 -0
- package/dist/integrations/events.js +111 -0
- package/dist/integrations/events.js.map +1 -0
- package/dist/integrations/queue.d.ts +89 -0
- package/dist/integrations/queue.d.ts.map +1 -0
- package/dist/integrations/queue.js +91 -0
- package/dist/integrations/queue.js.map +1 -0
- package/dist/integrations/realtime.d.ts +95 -0
- package/dist/integrations/realtime.d.ts.map +1 -0
- package/dist/integrations/realtime.js +90 -0
- package/dist/integrations/realtime.js.map +1 -0
- package/dist/lifecycle.d.ts +137 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +240 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/metadata.d.ts +109 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +139 -0
- package/dist/metadata.js.map +1 -0
- package/dist/multipart.d.ts +108 -0
- package/dist/multipart.d.ts.map +1 -0
- package/dist/multipart.js +200 -0
- package/dist/multipart.js.map +1 -0
- package/dist/observability.d.ts +82 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +175 -0
- package/dist/observability.js.map +1 -0
- package/dist/plugin.d.ts +82 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +100 -0
- package/dist/plugin.js.map +1 -0
- package/dist/resumable.d.ts +118 -0
- package/dist/resumable.d.ts.map +1 -0
- package/dist/resumable.js +223 -0
- package/dist/resumable.js.map +1 -0
- package/dist/search.d.ts +57 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +172 -0
- package/dist/search.js.map +1 -0
- package/dist/signed-url.d.ts +110 -0
- package/dist/signed-url.d.ts.map +1 -0
- package/dist/signed-url.js +237 -0
- package/dist/signed-url.js.map +1 -0
- package/dist/testing/index.d.ts +219 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +393 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tests/access.test.d.ts +2 -0
- package/dist/tests/access.test.d.ts.map +1 -0
- package/dist/tests/access.test.js +270 -0
- package/dist/tests/access.test.js.map +1 -0
- package/dist/tests/azure-driver.test.d.ts +2 -0
- package/dist/tests/azure-driver.test.d.ts.map +1 -0
- package/dist/tests/azure-driver.test.js +183 -0
- package/dist/tests/azure-driver.test.js.map +1 -0
- package/dist/tests/backblaze-driver.test.d.ts +2 -0
- package/dist/tests/backblaze-driver.test.d.ts.map +1 -0
- package/dist/tests/backblaze-driver.test.js +185 -0
- package/dist/tests/backblaze-driver.test.js.map +1 -0
- package/dist/tests/bridge-degradation.test.d.ts +2 -0
- package/dist/tests/bridge-degradation.test.d.ts.map +1 -0
- package/dist/tests/bridge-degradation.test.js +138 -0
- package/dist/tests/bridge-degradation.test.js.map +1 -0
- package/dist/tests/cli.test.d.ts +2 -0
- package/dist/tests/cli.test.d.ts.map +1 -0
- package/dist/tests/cli.test.js +127 -0
- package/dist/tests/cli.test.js.map +1 -0
- package/dist/tests/contract.d.ts +131 -0
- package/dist/tests/contract.d.ts.map +1 -0
- package/dist/tests/contract.js +222 -0
- package/dist/tests/contract.js.map +1 -0
- package/dist/tests/contract.test.d.ts +2 -0
- package/dist/tests/contract.test.d.ts.map +1 -0
- package/dist/tests/contract.test.js +110 -0
- package/dist/tests/contract.test.js.map +1 -0
- package/dist/tests/directory.test.d.ts +2 -0
- package/dist/tests/directory.test.d.ts.map +1 -0
- package/dist/tests/directory.test.js +125 -0
- package/dist/tests/directory.test.js.map +1 -0
- package/dist/tests/errors.test.d.ts +2 -0
- package/dist/tests/errors.test.d.ts.map +1 -0
- package/dist/tests/errors.test.js +93 -0
- package/dist/tests/errors.test.js.map +1 -0
- package/dist/tests/events-bridge.test.d.ts +2 -0
- package/dist/tests/events-bridge.test.d.ts.map +1 -0
- package/dist/tests/events-bridge.test.js +228 -0
- package/dist/tests/events-bridge.test.js.map +1 -0
- package/dist/tests/example-smoke.test.d.ts +2 -0
- package/dist/tests/example-smoke.test.d.ts.map +1 -0
- package/dist/tests/example-smoke.test.js +34 -0
- package/dist/tests/example-smoke.test.js.map +1 -0
- package/dist/tests/gcs-driver.test.d.ts +2 -0
- package/dist/tests/gcs-driver.test.d.ts.map +1 -0
- package/dist/tests/gcs-driver.test.js +197 -0
- package/dist/tests/gcs-driver.test.js.map +1 -0
- package/dist/tests/image.test.d.ts +2 -0
- package/dist/tests/image.test.d.ts.map +1 -0
- package/dist/tests/image.test.js +102 -0
- package/dist/tests/image.test.js.map +1 -0
- package/dist/tests/lifecycle.test.d.ts +2 -0
- package/dist/tests/lifecycle.test.d.ts.map +1 -0
- package/dist/tests/lifecycle.test.js +171 -0
- package/dist/tests/lifecycle.test.js.map +1 -0
- package/dist/tests/local-driver.test.d.ts +2 -0
- package/dist/tests/local-driver.test.d.ts.map +1 -0
- package/dist/tests/local-driver.test.js +153 -0
- package/dist/tests/local-driver.test.js.map +1 -0
- package/dist/tests/local-streaming.test.d.ts +2 -0
- package/dist/tests/local-streaming.test.d.ts.map +1 -0
- package/dist/tests/local-streaming.test.js +121 -0
- package/dist/tests/local-streaming.test.js.map +1 -0
- package/dist/tests/memory-driver.test.d.ts +2 -0
- package/dist/tests/memory-driver.test.d.ts.map +1 -0
- package/dist/tests/memory-driver.test.js +180 -0
- package/dist/tests/memory-driver.test.js.map +1 -0
- package/dist/tests/memory-streaming.test.d.ts +2 -0
- package/dist/tests/memory-streaming.test.d.ts.map +1 -0
- package/dist/tests/memory-streaming.test.js +92 -0
- package/dist/tests/memory-streaming.test.js.map +1 -0
- package/dist/tests/minio-driver.test.d.ts +2 -0
- package/dist/tests/minio-driver.test.d.ts.map +1 -0
- package/dist/tests/minio-driver.test.js +146 -0
- package/dist/tests/minio-driver.test.js.map +1 -0
- package/dist/tests/non-s3-integration.test.d.ts +2 -0
- package/dist/tests/non-s3-integration.test.d.ts.map +1 -0
- package/dist/tests/non-s3-integration.test.js +201 -0
- package/dist/tests/non-s3-integration.test.js.map +1 -0
- package/dist/tests/observability.registration.test.d.ts +2 -0
- package/dist/tests/observability.registration.test.d.ts.map +1 -0
- package/dist/tests/observability.registration.test.js +103 -0
- package/dist/tests/observability.registration.test.js.map +1 -0
- package/dist/tests/observability.test.d.ts +2 -0
- package/dist/tests/observability.test.d.ts.map +1 -0
- package/dist/tests/observability.test.js +240 -0
- package/dist/tests/observability.test.js.map +1 -0
- package/dist/tests/plugin.test.d.ts +2 -0
- package/dist/tests/plugin.test.d.ts.map +1 -0
- package/dist/tests/plugin.test.js +112 -0
- package/dist/tests/plugin.test.js.map +1 -0
- package/dist/tests/prop-concurrent.test.d.ts +2 -0
- package/dist/tests/prop-concurrent.test.d.ts.map +1 -0
- package/dist/tests/prop-concurrent.test.js +59 -0
- package/dist/tests/prop-concurrent.test.js.map +1 -0
- package/dist/tests/prop-copy.test.d.ts +2 -0
- package/dist/tests/prop-copy.test.d.ts.map +1 -0
- package/dist/tests/prop-copy.test.js +63 -0
- package/dist/tests/prop-copy.test.js.map +1 -0
- package/dist/tests/prop-delete.test.d.ts +2 -0
- package/dist/tests/prop-delete.test.d.ts.map +1 -0
- package/dist/tests/prop-delete.test.js +35 -0
- package/dist/tests/prop-delete.test.js.map +1 -0
- package/dist/tests/prop-directory.test.d.ts +2 -0
- package/dist/tests/prop-directory.test.d.ts.map +1 -0
- package/dist/tests/prop-directory.test.js +118 -0
- package/dist/tests/prop-directory.test.js.map +1 -0
- package/dist/tests/prop-driver-conformance.test.d.ts +2 -0
- package/dist/tests/prop-driver-conformance.test.d.ts.map +1 -0
- package/dist/tests/prop-driver-conformance.test.js +110 -0
- package/dist/tests/prop-driver-conformance.test.js.map +1 -0
- package/dist/tests/prop-driver-equivalence.test.d.ts +2 -0
- package/dist/tests/prop-driver-equivalence.test.d.ts.map +1 -0
- package/dist/tests/prop-driver-equivalence.test.js +163 -0
- package/dist/tests/prop-driver-equivalence.test.js.map +1 -0
- package/dist/tests/prop-lifecycle.test.d.ts +2 -0
- package/dist/tests/prop-lifecycle.test.d.ts.map +1 -0
- package/dist/tests/prop-lifecycle.test.js +83 -0
- package/dist/tests/prop-lifecycle.test.js.map +1 -0
- package/dist/tests/prop-list.test.d.ts +2 -0
- package/dist/tests/prop-list.test.d.ts.map +1 -0
- package/dist/tests/prop-list.test.js +53 -0
- package/dist/tests/prop-list.test.js.map +1 -0
- package/dist/tests/prop-metadata.test.d.ts +2 -0
- package/dist/tests/prop-metadata.test.d.ts.map +1 -0
- package/dist/tests/prop-metadata.test.js +87 -0
- package/dist/tests/prop-metadata.test.js.map +1 -0
- package/dist/tests/prop-move.test.d.ts +2 -0
- package/dist/tests/prop-move.test.d.ts.map +1 -0
- package/dist/tests/prop-move.test.js +67 -0
- package/dist/tests/prop-move.test.js.map +1 -0
- package/dist/tests/prop-multipart-abort.test.d.ts +2 -0
- package/dist/tests/prop-multipart-abort.test.d.ts.map +1 -0
- package/dist/tests/prop-multipart-abort.test.js +48 -0
- package/dist/tests/prop-multipart-abort.test.js.map +1 -0
- package/dist/tests/prop-multipart.test.d.ts +2 -0
- package/dist/tests/prop-multipart.test.d.ts.map +1 -0
- package/dist/tests/prop-multipart.test.js +65 -0
- package/dist/tests/prop-multipart.test.js.map +1 -0
- package/dist/tests/prop-resumable.test.d.ts +2 -0
- package/dist/tests/prop-resumable.test.d.ts.map +1 -0
- package/dist/tests/prop-resumable.test.js +78 -0
- package/dist/tests/prop-resumable.test.js.map +1 -0
- package/dist/tests/prop-search.test.d.ts +2 -0
- package/dist/tests/prop-search.test.d.ts.map +1 -0
- package/dist/tests/prop-search.test.js +120 -0
- package/dist/tests/prop-search.test.js.map +1 -0
- package/dist/tests/prop-signed-url.test.d.ts +2 -0
- package/dist/tests/prop-signed-url.test.d.ts.map +1 -0
- package/dist/tests/prop-signed-url.test.js +74 -0
- package/dist/tests/prop-signed-url.test.js.map +1 -0
- package/dist/tests/prop-streaming.test.d.ts +2 -0
- package/dist/tests/prop-streaming.test.d.ts.map +1 -0
- package/dist/tests/prop-streaming.test.js +34 -0
- package/dist/tests/prop-streaming.test.js.map +1 -0
- package/dist/tests/prop-upload-download.test.d.ts +2 -0
- package/dist/tests/prop-upload-download.test.d.ts.map +1 -0
- package/dist/tests/prop-upload-download.test.js +30 -0
- package/dist/tests/prop-upload-download.test.js.map +1 -0
- package/dist/tests/prop-validation.test.d.ts +2 -0
- package/dist/tests/prop-validation.test.d.ts.map +1 -0
- package/dist/tests/prop-validation.test.js +50 -0
- package/dist/tests/prop-validation.test.js.map +1 -0
- package/dist/tests/prop-versioning.test.d.ts +2 -0
- package/dist/tests/prop-versioning.test.d.ts.map +1 -0
- package/dist/tests/prop-versioning.test.js +74 -0
- package/dist/tests/prop-versioning.test.js.map +1 -0
- package/dist/tests/queue-bridge.test.d.ts +2 -0
- package/dist/tests/queue-bridge.test.d.ts.map +1 -0
- package/dist/tests/queue-bridge.test.js +111 -0
- package/dist/tests/queue-bridge.test.js.map +1 -0
- package/dist/tests/r2-driver.test.d.ts +2 -0
- package/dist/tests/r2-driver.test.d.ts.map +1 -0
- package/dist/tests/r2-driver.test.js +143 -0
- package/dist/tests/r2-driver.test.js.map +1 -0
- package/dist/tests/realtime-bridge.test.d.ts +2 -0
- package/dist/tests/realtime-bridge.test.d.ts.map +1 -0
- package/dist/tests/realtime-bridge.test.js +106 -0
- package/dist/tests/realtime-bridge.test.js.map +1 -0
- package/dist/tests/resumable.test.d.ts +2 -0
- package/dist/tests/resumable.test.d.ts.map +1 -0
- package/dist/tests/resumable.test.js +104 -0
- package/dist/tests/resumable.test.js.map +1 -0
- package/dist/tests/s3-base.test.d.ts +2 -0
- package/dist/tests/s3-base.test.d.ts.map +1 -0
- package/dist/tests/s3-base.test.js +289 -0
- package/dist/tests/s3-base.test.js.map +1 -0
- package/dist/tests/s3-integration.test.d.ts +2 -0
- package/dist/tests/s3-integration.test.d.ts.map +1 -0
- package/dist/tests/s3-integration.test.js +270 -0
- package/dist/tests/s3-integration.test.js.map +1 -0
- package/dist/tests/s3.test.d.ts +2 -0
- package/dist/tests/s3.test.d.ts.map +1 -0
- package/dist/tests/s3.test.js +203 -0
- package/dist/tests/s3.test.js.map +1 -0
- package/dist/tests/scaffold.test.d.ts +2 -0
- package/dist/tests/scaffold.test.d.ts.map +1 -0
- package/dist/tests/scaffold.test.js +13 -0
- package/dist/tests/scaffold.test.js.map +1 -0
- package/dist/tests/search.test.d.ts +2 -0
- package/dist/tests/search.test.d.ts.map +1 -0
- package/dist/tests/search.test.js +106 -0
- package/dist/tests/search.test.js.map +1 -0
- package/dist/tests/supabase-driver.test.d.ts +2 -0
- package/dist/tests/supabase-driver.test.d.ts.map +1 -0
- package/dist/tests/supabase-driver.test.js +196 -0
- package/dist/tests/supabase-driver.test.js.map +1 -0
- package/dist/tests/testing-utilities.test.d.ts +2 -0
- package/dist/tests/testing-utilities.test.d.ts.map +1 -0
- package/dist/tests/testing-utilities.test.js +138 -0
- package/dist/tests/testing-utilities.test.js.map +1 -0
- package/dist/tests/validation.test.d.ts +2 -0
- package/dist/tests/validation.test.d.ts.map +1 -0
- package/dist/tests/validation.test.js +135 -0
- package/dist/tests/validation.test.js.map +1 -0
- package/dist/tests/versioning.test.d.ts +2 -0
- package/dist/tests/versioning.test.d.ts.map +1 -0
- package/dist/tests/versioning.test.js +128 -0
- package/dist/tests/versioning.test.js.map +1 -0
- package/dist/types.d.ts +232 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +105 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +225 -0
- package/dist/validation.js.map +1 -0
- package/dist/versioning.d.ts +100 -0
- package/dist/versioning.d.ts.map +1 -0
- package/dist/versioning.js +179 -0
- package/dist/versioning.js.map +1 -0
- package/package.json +137 -0
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — Azure Blob Storage driver submodule (`@streetjs/storage/azure`).
|
|
3
|
+
*
|
|
4
|
+
* Azure Blob Storage does **not** speak the S3 wire shape, so — unlike
|
|
5
|
+
* `s3.ts`/`r2.ts`/`minio.ts`/`backblaze.ts`, which specialize the shared
|
|
6
|
+
* {@link createS3StyleDriver} base — this driver maps the {@link StorageDriver}
|
|
7
|
+
* contract **directly** onto a structural Azure Blob client
|
|
8
|
+
* ({@link AzureBlobClientLike}). It computes object identity fields
|
|
9
|
+
* (`size`/`checksum`/`etag`) and timestamps locally and assembles every
|
|
10
|
+
* {@link StorageObjectMetadata} through the shared metadata layer
|
|
11
|
+
* ({@link buildObjectMetadata}) so the field set is identical to Memory/Local
|
|
12
|
+
* and every other provider (Requirement 2.1, 10.1).
|
|
13
|
+
*
|
|
14
|
+
* ## SDK isolation (Requirements 3.1, 3.3)
|
|
15
|
+
*
|
|
16
|
+
* This module imports **no provider SDK** at the top level — only Node built-ins,
|
|
17
|
+
* `streetjs` (for the injected {@link Clock}), and this package's own type
|
|
18
|
+
* surface. There are two ways to obtain a driver:
|
|
19
|
+
*
|
|
20
|
+
* 1. **Inject a structural client.** {@link createAzureBlobDriver} accepts an
|
|
21
|
+
* already-built {@link AzureBlobClientLike} (real SDK adapter or a test
|
|
22
|
+
* double) and maps the contract onto it. The `@azure/storage-blob` SDK stays
|
|
23
|
+
* an optional peer concern of the consumer and is never touched by this
|
|
24
|
+
* package.
|
|
25
|
+
*
|
|
26
|
+
* 2. **Let the driver build its own client.** {@link connectAzureBlobDriver}
|
|
27
|
+
* resolves the optional `@azure/storage-blob` peer SDK with a **lazy dynamic
|
|
28
|
+
* `import()`** performed *inside the function* (never at module top level),
|
|
29
|
+
* constructs a container-scoped client, adapts it to
|
|
30
|
+
* {@link AzureBlobClientLike}, and hands it to {@link createAzureBlobDriver}.
|
|
31
|
+
* If the SDK is absent, it throws {@link StorageConfigError} rather than a raw
|
|
32
|
+
* module-resolution error.
|
|
33
|
+
*
|
|
34
|
+
* Because the driver lives behind the `./azure` subpath export
|
|
35
|
+
* (`dist/drivers/azure.js`) and is *not* re-exported from the package index, a
|
|
36
|
+
* consumer only loads this code — and any SDK it lazily resolves — when they
|
|
37
|
+
* import `@streetjs/storage/azure`. `package.json` lists `@azure/storage-blob`
|
|
38
|
+
* as an optional peer dependency, never a runtime dependency, keeping `streetjs`
|
|
39
|
+
* the only runtime dependency.
|
|
40
|
+
*
|
|
41
|
+
* ## Capability delegation (Requirement 2.3)
|
|
42
|
+
*
|
|
43
|
+
* Only the **mandatory primitives** (`put`/`get`/`exists`/`delete`/`stat`/
|
|
44
|
+
* `list`/`putStream`/`getStream`) are implemented. The advanced capabilities
|
|
45
|
+
* (`multipart`/`resumable`/`versioning`/`signedUrl`/`lifecycle`) are left
|
|
46
|
+
* `undefined` so the facade's cross-cutting layer supplies a provider-agnostic
|
|
47
|
+
* simulation over the primitives, keeping observable behavior identical across
|
|
48
|
+
* providers.
|
|
49
|
+
*
|
|
50
|
+
* _Requirements: 2.1, 2.3, 3.3_
|
|
51
|
+
*/
|
|
52
|
+
import { createHash } from "node:crypto";
|
|
53
|
+
import { Readable, Writable } from "node:stream";
|
|
54
|
+
import { pipeline } from "node:stream/promises";
|
|
55
|
+
import { systemClock } from "streetjs";
|
|
56
|
+
import { StorageConfigError, NotFoundError } from "../errors.js";
|
|
57
|
+
import { buildObjectMetadata } from "../metadata.js";
|
|
58
|
+
/** The stable {@link StorageDriver.name} surfaced by every Azure Blob driver. */
|
|
59
|
+
const AZURE_DRIVER_NAME = "azure";
|
|
60
|
+
// ── Metadata encoding keys ────────────────────────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* Reserved blob-metadata keys used to round-trip the typed metadata field set
|
|
63
|
+
* through Azure's string→string blob metadata map. Azure blob metadata names
|
|
64
|
+
* must be valid C# identifiers (letters/digits/underscore, no hyphens), so these
|
|
65
|
+
* keys are underscore-delimited rather than the `x-...-` style used by the
|
|
66
|
+
* S3-style base. The `street_` prefix keeps them from colliding with a caller's
|
|
67
|
+
* own custom fields.
|
|
68
|
+
*/
|
|
69
|
+
const MK = {
|
|
70
|
+
checksum: "street_checksum",
|
|
71
|
+
createdAt: "street_created_at",
|
|
72
|
+
updatedAt: "street_updated_at",
|
|
73
|
+
owner: "street_owner",
|
|
74
|
+
tenant: "street_tenant",
|
|
75
|
+
accessLevel: "street_access_level",
|
|
76
|
+
custom: "street_custom",
|
|
77
|
+
};
|
|
78
|
+
// ── The Azure Blob driver ──────────────────────────────────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* Maps the {@link StorageDriver} contract directly onto an injected
|
|
81
|
+
* {@link AzureBlobClientLike}.
|
|
82
|
+
*
|
|
83
|
+
* Unlike the S3-compatible providers, Azure Blob does not share the S3 wire
|
|
84
|
+
* shape, so this driver does not build on {@link createS3StyleDriver}. It
|
|
85
|
+
* computes size/checksum/etag and timestamps locally, encodes the typed metadata
|
|
86
|
+
* into the blob metadata map so it round-trips on read, and reports a missing
|
|
87
|
+
* key consistently ({@link MaybeObject} `{ found: false }` for `get`, `null` for
|
|
88
|
+
* `stat`, {@link NotFoundError} for `getStream`).
|
|
89
|
+
*/
|
|
90
|
+
export class AzureBlobDriver {
|
|
91
|
+
/** Stable driver name. */
|
|
92
|
+
name = AZURE_DRIVER_NAME;
|
|
93
|
+
client;
|
|
94
|
+
clock;
|
|
95
|
+
constructor(client, options = {}) {
|
|
96
|
+
this.client = client;
|
|
97
|
+
this.clock = options.clock ?? systemClock;
|
|
98
|
+
}
|
|
99
|
+
// ── Mandatory primitives ──────────────────────────────────────────────────
|
|
100
|
+
/**
|
|
101
|
+
* Store `bytes` under `key`, computing size and sha-256 checksum locally and
|
|
102
|
+
* taking timestamps from the injected clock. When overwriting, the original
|
|
103
|
+
* `createdAt` is preserved (a preceding attribute read). The typed metadata is
|
|
104
|
+
* encoded into the blob metadata map so it round-trips on read
|
|
105
|
+
* (Requirements 4.1, 10.1, 10.2).
|
|
106
|
+
*/
|
|
107
|
+
async put(key, bytes, metadata) {
|
|
108
|
+
const stored = bytes.slice();
|
|
109
|
+
const checksum = sha256Hex(stored);
|
|
110
|
+
const now = this.clock();
|
|
111
|
+
const existing = await this.stat(key);
|
|
112
|
+
const objectMetadata = buildObjectMetadata({
|
|
113
|
+
key,
|
|
114
|
+
size: stored.byteLength,
|
|
115
|
+
checksum,
|
|
116
|
+
createdAt: existing?.createdAt ?? now,
|
|
117
|
+
updatedAt: now,
|
|
118
|
+
write: metadata,
|
|
119
|
+
});
|
|
120
|
+
await this.client.upload({
|
|
121
|
+
blobName: key,
|
|
122
|
+
body: stored,
|
|
123
|
+
contentType: objectMetadata.contentType,
|
|
124
|
+
metadata: encodeMetadata(objectMetadata),
|
|
125
|
+
});
|
|
126
|
+
return objectMetadata;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Read the object at `key`, returning a discriminated {@link MaybeObject} so
|
|
130
|
+
* absence is reported rather than thrown (Requirements 4.2, 2.4). Metadata is
|
|
131
|
+
* rebuilt from the blob attributes and encoded metadata via the shared layer.
|
|
132
|
+
*/
|
|
133
|
+
async get(key) {
|
|
134
|
+
const out = await this.client.download({ blobName: key });
|
|
135
|
+
if (out === null) {
|
|
136
|
+
return { found: false };
|
|
137
|
+
}
|
|
138
|
+
const bytes = out.body.slice();
|
|
139
|
+
const metadata = this.decodeMeta(key, {
|
|
140
|
+
contentType: out.contentType,
|
|
141
|
+
etag: out.etag,
|
|
142
|
+
contentLength: bytes.byteLength,
|
|
143
|
+
lastModified: out.lastModified,
|
|
144
|
+
metadata: out.metadata,
|
|
145
|
+
});
|
|
146
|
+
return { found: true, bytes, metadata };
|
|
147
|
+
}
|
|
148
|
+
/** Report whether an object is stored under `key` (Requirement 4.3). */
|
|
149
|
+
async exists(key) {
|
|
150
|
+
return this.client.exists({ blobName: key });
|
|
151
|
+
}
|
|
152
|
+
/** Delete the object at `key`; deleting a missing key is a no-op (Requirement 4.4). */
|
|
153
|
+
async delete(key) {
|
|
154
|
+
await this.client.deleteBlob({ blobName: key });
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Return the metadata for `key` without its content, or `null` when absent
|
|
158
|
+
* (Requirement 4.10).
|
|
159
|
+
*/
|
|
160
|
+
async stat(key) {
|
|
161
|
+
const props = await this.client.getProperties({ blobName: key });
|
|
162
|
+
if (props === null) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return this.decodeMeta(key, props);
|
|
166
|
+
}
|
|
167
|
+
/** List objects whose key begins with `prefix` (Requirement 4.9). */
|
|
168
|
+
async list(prefix, options) {
|
|
169
|
+
const items = await this.client.listBlobs({ prefix, limit: options?.limit });
|
|
170
|
+
const sorted = [...items].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
171
|
+
const limited = typeof options?.limit === "number" ? sorted.slice(0, options.limit) : sorted;
|
|
172
|
+
return limited.map((item) => ({
|
|
173
|
+
key: item.name,
|
|
174
|
+
size: item.contentLength,
|
|
175
|
+
updatedAt: item.lastModified,
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
// ── Streaming ───────────────────────────────────────────────────────────────
|
|
179
|
+
/**
|
|
180
|
+
* Consume a Node {@link Readable} and persist the assembled bytes under `key`
|
|
181
|
+
* with the same computed metadata as {@link put} (Requirement 5.1). Chunks are
|
|
182
|
+
* drained through a `pipeline` (correct backpressure and error propagation),
|
|
183
|
+
* then handed to {@link put}.
|
|
184
|
+
*/
|
|
185
|
+
async putStream(key, stream, metadata) {
|
|
186
|
+
const chunks = [];
|
|
187
|
+
const collector = new Writable({
|
|
188
|
+
write(chunk, _encoding, callback) {
|
|
189
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
190
|
+
callback();
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
await pipeline(stream, collector);
|
|
194
|
+
return this.put(key, new Uint8Array(Buffer.concat(chunks)), metadata);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Return a Node {@link Readable} of the stored bytes at `key` (Requirement
|
|
198
|
+
* 5.2). Throws {@link NotFoundError} for a missing key (Requirement 5.5).
|
|
199
|
+
*/
|
|
200
|
+
async getStream(key) {
|
|
201
|
+
const out = await this.client.download({ blobName: key });
|
|
202
|
+
if (out === null) {
|
|
203
|
+
throw new NotFoundError(key);
|
|
204
|
+
}
|
|
205
|
+
return Readable.from([Buffer.from(out.body)]);
|
|
206
|
+
}
|
|
207
|
+
// ── Internal helpers ──────────────────────────────────────────────────────
|
|
208
|
+
/**
|
|
209
|
+
* Rebuild the typed {@link StorageObjectMetadata} field set from blob
|
|
210
|
+
* attributes and the encoded metadata map, applying the shared layer's
|
|
211
|
+
* canonical defaults. Provider-supplied values back-fill identity/timestamp
|
|
212
|
+
* fields when the encoded ones are absent (e.g. a blob written outside this
|
|
213
|
+
* driver), keeping the shape consistent across providers.
|
|
214
|
+
*/
|
|
215
|
+
decodeMeta(key, props) {
|
|
216
|
+
const bm = props.metadata ?? {};
|
|
217
|
+
const now = this.clock();
|
|
218
|
+
const checksum = bm[MK.checksum] ?? props.etag ?? "";
|
|
219
|
+
const createdAt = parseEpoch(bm[MK.createdAt]) ?? props.lastModified ?? now;
|
|
220
|
+
const updatedAt = parseEpoch(bm[MK.updatedAt]) ?? props.lastModified ?? createdAt;
|
|
221
|
+
const write = {
|
|
222
|
+
contentType: props.contentType,
|
|
223
|
+
owner: bm[MK.owner],
|
|
224
|
+
tenant: bm[MK.tenant],
|
|
225
|
+
accessLevel: decodeAccessLevel(bm[MK.accessLevel]),
|
|
226
|
+
custom: parseCustom(bm[MK.custom]),
|
|
227
|
+
};
|
|
228
|
+
return buildObjectMetadata({
|
|
229
|
+
key,
|
|
230
|
+
size: props.contentLength ?? 0,
|
|
231
|
+
checksum,
|
|
232
|
+
etag: props.etag ?? checksum,
|
|
233
|
+
createdAt,
|
|
234
|
+
updatedAt,
|
|
235
|
+
write,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Create an Azure-Blob-backed {@link StorageDriver} over an **injected**
|
|
241
|
+
* structural {@link AzureBlobClientLike}.
|
|
242
|
+
*
|
|
243
|
+
* This is the primary, SDK-free entry point: the caller supplies a client that
|
|
244
|
+
* already speaks the {@link AzureBlobClientLike} shape (built from
|
|
245
|
+
* `@azure/storage-blob`, or a test double), and this function maps the contract
|
|
246
|
+
* onto it. No provider SDK is imported.
|
|
247
|
+
*
|
|
248
|
+
* @throws {StorageConfigError} when no client is injected — use
|
|
249
|
+
* {@link connectAzureBlobDriver} to build a client from connection options.
|
|
250
|
+
*/
|
|
251
|
+
export function createAzureBlobDriver(client, options = {}) {
|
|
252
|
+
if (client === undefined || client === null) {
|
|
253
|
+
throw new StorageConfigError("createAzureBlobDriver requires an injected Azure Blob client. " +
|
|
254
|
+
"Pass an AzureBlobClientLike, or use connectAzureBlobDriver(options) to " +
|
|
255
|
+
"build one from a connection string using the optional " +
|
|
256
|
+
"'@azure/storage-blob' peer dependency.", { provider: AZURE_DRIVER_NAME });
|
|
257
|
+
}
|
|
258
|
+
return new AzureBlobDriver(client, options);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Build an Azure-Blob-backed {@link StorageDriver}, constructing the underlying
|
|
262
|
+
* client from `connection` options using the optional `@azure/storage-blob` peer
|
|
263
|
+
* SDK.
|
|
264
|
+
*
|
|
265
|
+
* The SDK is resolved with a **lazy dynamic `import()`** performed inside this
|
|
266
|
+
* function, so the peer dependency is only touched when a caller actually asks
|
|
267
|
+
* the driver to build its own client. The resolved SDK client is adapted to the
|
|
268
|
+
* structural {@link AzureBlobClientLike} and handed to {@link createAzureBlobDriver}.
|
|
269
|
+
*
|
|
270
|
+
* @throws {StorageConfigError} when the `@azure/storage-blob` SDK is not
|
|
271
|
+
* installed, or when the client cannot be constructed from the supplied options.
|
|
272
|
+
*/
|
|
273
|
+
export async function connectAzureBlobDriver(connection, options = {}) {
|
|
274
|
+
const sdk = await loadAzureSdk();
|
|
275
|
+
let containerClient;
|
|
276
|
+
try {
|
|
277
|
+
const service = sdk.BlobServiceClient.fromConnectionString(connection.connectionString);
|
|
278
|
+
containerClient = service.getContainerClient(connection.container);
|
|
279
|
+
}
|
|
280
|
+
catch (cause) {
|
|
281
|
+
throw new StorageConfigError(`Failed to construct an Azure Blob client for container "${connection.container}".`, { provider: AZURE_DRIVER_NAME, cause });
|
|
282
|
+
}
|
|
283
|
+
const client = adaptAzureContainerClient(containerClient);
|
|
284
|
+
return createAzureBlobDriver(client, options);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Lazily resolve the optional `@azure/storage-blob` peer SDK. The module
|
|
288
|
+
* specifier is held in a variable so the compiler does not statically resolve
|
|
289
|
+
* (and therefore require) the optional peer at build time; the resolution
|
|
290
|
+
* happens only at call time.
|
|
291
|
+
*
|
|
292
|
+
* @throws {StorageConfigError} when the SDK is not installed.
|
|
293
|
+
*/
|
|
294
|
+
async function loadAzureSdk() {
|
|
295
|
+
const specifier = "@azure/storage-blob";
|
|
296
|
+
try {
|
|
297
|
+
return (await import(specifier));
|
|
298
|
+
}
|
|
299
|
+
catch (cause) {
|
|
300
|
+
throw new StorageConfigError("The optional '@azure/storage-blob' peer dependency is not installed. " +
|
|
301
|
+
"Install it (`npm install @azure/storage-blob`) to build an Azure Blob " +
|
|
302
|
+
"client from a connection string, or inject your own AzureBlobClientLike " +
|
|
303
|
+
"via createAzureBlobDriver(client).", { provider: AZURE_DRIVER_NAME, cause });
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// ── SDK → AzureBlobClientLike adapter ──────────────────────────────────────────
|
|
307
|
+
/**
|
|
308
|
+
* Adapt an Azure `ContainerClient` into the structural {@link AzureBlobClientLike}
|
|
309
|
+
* the driver consumes, scoping every call to that container. Not-found responses
|
|
310
|
+
* (a 404 `RestError`/`BlobNotFound`) are mapped to `null`/no-op so absence is
|
|
311
|
+
* reported consistently rather than thrown.
|
|
312
|
+
*/
|
|
313
|
+
function adaptAzureContainerClient(container) {
|
|
314
|
+
return {
|
|
315
|
+
async upload(input) {
|
|
316
|
+
const blob = container.getBlockBlobClient(input.blobName);
|
|
317
|
+
const body = Buffer.from(input.body);
|
|
318
|
+
const result = await blob.upload(body, body.byteLength, {
|
|
319
|
+
blobHTTPHeaders: input.contentType !== undefined
|
|
320
|
+
? { blobContentType: input.contentType }
|
|
321
|
+
: undefined,
|
|
322
|
+
metadata: input.metadata,
|
|
323
|
+
});
|
|
324
|
+
return { etag: result.etag };
|
|
325
|
+
},
|
|
326
|
+
async download(input) {
|
|
327
|
+
const blob = container.getBlockBlobClient(input.blobName);
|
|
328
|
+
let response;
|
|
329
|
+
try {
|
|
330
|
+
response = await blob.download();
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
if (isNotFound(error)) {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
throw error;
|
|
337
|
+
}
|
|
338
|
+
const body = response.readableStreamBody
|
|
339
|
+
? await collectStream(response.readableStreamBody)
|
|
340
|
+
: new Uint8Array(0);
|
|
341
|
+
return {
|
|
342
|
+
body,
|
|
343
|
+
contentType: response.contentType,
|
|
344
|
+
etag: response.etag,
|
|
345
|
+
contentLength: response.contentLength ?? body.byteLength,
|
|
346
|
+
lastModified: response.lastModified?.getTime(),
|
|
347
|
+
metadata: response.metadata,
|
|
348
|
+
};
|
|
349
|
+
},
|
|
350
|
+
async getProperties(input) {
|
|
351
|
+
const blob = container.getBlockBlobClient(input.blobName);
|
|
352
|
+
try {
|
|
353
|
+
const props = await blob.getProperties();
|
|
354
|
+
return {
|
|
355
|
+
contentType: props.contentType,
|
|
356
|
+
etag: props.etag,
|
|
357
|
+
contentLength: props.contentLength,
|
|
358
|
+
lastModified: props.lastModified?.getTime(),
|
|
359
|
+
metadata: props.metadata,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
if (isNotFound(error)) {
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
throw error;
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
async deleteBlob(input) {
|
|
370
|
+
const blob = container.getBlockBlobClient(input.blobName);
|
|
371
|
+
await blob.deleteIfExists();
|
|
372
|
+
},
|
|
373
|
+
async exists(input) {
|
|
374
|
+
const blob = container.getBlockBlobClient(input.blobName);
|
|
375
|
+
return blob.exists();
|
|
376
|
+
},
|
|
377
|
+
async listBlobs(input) {
|
|
378
|
+
const items = [];
|
|
379
|
+
for await (const blob of container.listBlobsFlat({ prefix: input.prefix })) {
|
|
380
|
+
items.push({
|
|
381
|
+
name: blob.name,
|
|
382
|
+
contentLength: blob.properties?.contentLength ?? 0,
|
|
383
|
+
lastModified: blob.properties?.lastModified?.getTime() ?? 0,
|
|
384
|
+
});
|
|
385
|
+
if (typeof input.limit === "number" && items.length >= input.limit) {
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return items;
|
|
390
|
+
},
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
// ── Metadata encode/decode helpers ──────────────────────────────────────────────
|
|
394
|
+
/** Encode a built object's typed metadata into the Azure blob metadata map. */
|
|
395
|
+
function encodeMetadata(metadata) {
|
|
396
|
+
const map = {
|
|
397
|
+
[MK.checksum]: metadata.checksum,
|
|
398
|
+
[MK.createdAt]: String(metadata.createdAt),
|
|
399
|
+
[MK.updatedAt]: String(metadata.updatedAt),
|
|
400
|
+
[MK.accessLevel]: metadata.accessLevel,
|
|
401
|
+
[MK.custom]: JSON.stringify(metadata.custom ?? {}),
|
|
402
|
+
};
|
|
403
|
+
if (metadata.owner !== undefined) {
|
|
404
|
+
map[MK.owner] = metadata.owner;
|
|
405
|
+
}
|
|
406
|
+
if (metadata.tenant !== undefined) {
|
|
407
|
+
map[MK.tenant] = metadata.tenant;
|
|
408
|
+
}
|
|
409
|
+
return map;
|
|
410
|
+
}
|
|
411
|
+
/** Compute the lowercase sha-256 hex digest of `bytes`. */
|
|
412
|
+
function sha256Hex(bytes) {
|
|
413
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
414
|
+
}
|
|
415
|
+
/** Collect a Node readable stream into a single {@link Uint8Array}. */
|
|
416
|
+
async function collectStream(stream) {
|
|
417
|
+
const chunks = [];
|
|
418
|
+
for await (const chunk of stream) {
|
|
419
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : Buffer.from(chunk));
|
|
420
|
+
}
|
|
421
|
+
return new Uint8Array(Buffer.concat(chunks));
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Detect an Azure "blob does not exist" error so absence maps to `null`/no-op
|
|
425
|
+
* rather than a thrown error, keeping not-found semantics identical across
|
|
426
|
+
* providers.
|
|
427
|
+
*/
|
|
428
|
+
function isNotFound(error) {
|
|
429
|
+
if (error === null || typeof error !== "object") {
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
const code = error.code;
|
|
433
|
+
const statusCode = error.statusCode;
|
|
434
|
+
return code === "BlobNotFound" || code === "ContainerNotFound" || statusCode === 404;
|
|
435
|
+
}
|
|
436
|
+
/** Parse an epoch-ms string, returning `undefined` when absent or non-numeric. */
|
|
437
|
+
function parseEpoch(value) {
|
|
438
|
+
if (value === undefined) {
|
|
439
|
+
return undefined;
|
|
440
|
+
}
|
|
441
|
+
const parsed = Number(value);
|
|
442
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
443
|
+
}
|
|
444
|
+
/** Parse the encoded custom-field JSON, tolerating malformed values. */
|
|
445
|
+
function parseCustom(value) {
|
|
446
|
+
if (value === undefined) {
|
|
447
|
+
return {};
|
|
448
|
+
}
|
|
449
|
+
try {
|
|
450
|
+
const parsed = JSON.parse(value);
|
|
451
|
+
if (parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
452
|
+
return parsed;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
// Fall through to the empty default on malformed JSON.
|
|
457
|
+
}
|
|
458
|
+
return {};
|
|
459
|
+
}
|
|
460
|
+
/** The recognized access levels, used to validate the decoded value. */
|
|
461
|
+
const ACCESS_LEVELS = [
|
|
462
|
+
"public",
|
|
463
|
+
"private",
|
|
464
|
+
"signed",
|
|
465
|
+
"authenticated",
|
|
466
|
+
"role-based",
|
|
467
|
+
"tenant-aware",
|
|
468
|
+
];
|
|
469
|
+
/** Decode an access-level string, returning `undefined` for an unknown value. */
|
|
470
|
+
function decodeAccessLevel(value) {
|
|
471
|
+
if (value !== undefined && ACCESS_LEVELS.includes(value)) {
|
|
472
|
+
return value;
|
|
473
|
+
}
|
|
474
|
+
return undefined;
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=azure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure.js","sourceRoot":"","sources":["../../src/drivers/azure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — the Backblaze B2 driver submodule (`@streetjs/storage/backblaze`).
|
|
3
|
+
*
|
|
4
|
+
* Backblaze B2 exposes a **fully S3-compatible API**, so this driver is a thin
|
|
5
|
+
* specialization of the shared S3-style base ({@link createS3StyleDriver} in
|
|
6
|
+
* `s3-base.ts`): it only differs in how the underlying client is
|
|
7
|
+
* built/configured (a B2 S3 endpoint and B2 application-key credentials), never
|
|
8
|
+
* in how the {@link StorageDriver} contract is satisfied. The driver name is
|
|
9
|
+
* fixed to `"backblaze"`.
|
|
10
|
+
*
|
|
11
|
+
* ## SDK isolation (Requirements 3.1, 3.3)
|
|
12
|
+
*
|
|
13
|
+
* This module imports **no provider SDK at the top level** — only this package's
|
|
14
|
+
* own type surface and the shared S3-style base. It supports two construction
|
|
15
|
+
* modes:
|
|
16
|
+
*
|
|
17
|
+
* 1. **Injected structural client** — the caller passes an {@link S3ClientLike}
|
|
18
|
+
* (the minimal, SDK-shaped structural interface the base depends on). The SDK
|
|
19
|
+
* is then entirely a concern of the caller; this package resolves nothing.
|
|
20
|
+
* ({@link createBackblazeB2Driver} with a client, synchronous.)
|
|
21
|
+
* 2. **Self-built client from connection config** — the driver constructs its own
|
|
22
|
+
* S3-compatible client for the B2 endpoint using a **lazy dynamic `import()`**
|
|
23
|
+
* performed inside the factory at construction time (never at module top
|
|
24
|
+
* level), so `@aws-sdk/client-s3` is resolved only when this submodule is
|
|
25
|
+
* actually used to build a client. If that optional peer SDK is absent (and no
|
|
26
|
+
* client was injected), a descriptive {@link StorageConfigError} is thrown.
|
|
27
|
+
* ({@link createBackblazeB2Driver} with a config, asynchronous.)
|
|
28
|
+
*
|
|
29
|
+
* Because this driver lives behind the `./backblaze` subpath export and the base
|
|
30
|
+
* package never imports it, `streetjs` stays the only runtime dependency and the
|
|
31
|
+
* B2/S3 SDK remains an optional peer dependency.
|
|
32
|
+
*
|
|
33
|
+
* _Requirements: 2.1, 2.3, 3.3_
|
|
34
|
+
*/
|
|
35
|
+
import { type Clock } from "streetjs";
|
|
36
|
+
import type { StorageDriver } from "../driver.js";
|
|
37
|
+
import { S3StyleDriver, type S3ClientLike, type S3NativeCapabilities } from "./s3-base.js";
|
|
38
|
+
/** The stable driver name surfaced as {@link StorageDriver.name}. */
|
|
39
|
+
export declare const BACKBLAZE_DRIVER_NAME = "backblaze";
|
|
40
|
+
/**
|
|
41
|
+
* Options shared by both construction modes. Native capability objects supplied
|
|
42
|
+
* here are delegated by the base; anything omitted is simulated by the facade
|
|
43
|
+
* over the mandatory primitives (identical behavior across providers).
|
|
44
|
+
*/
|
|
45
|
+
export interface BackblazeB2DriverOptions {
|
|
46
|
+
/** Overrides the driver name. Defaults to `"backblaze"`; changing it is rare. */
|
|
47
|
+
readonly name?: string;
|
|
48
|
+
/** Injected clock for deterministic timestamps in tests. Default `systemClock`. */
|
|
49
|
+
readonly clock?: Clock;
|
|
50
|
+
/** Native capability objects (versioning/lifecycle/signed URLs) to delegate. */
|
|
51
|
+
readonly capabilities?: S3NativeCapabilities;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* B2 application-key credentials, expressed in S3 terms. The B2 `keyId` maps to
|
|
55
|
+
* `accessKeyId` and the B2 `applicationKey` maps to `secretAccessKey`.
|
|
56
|
+
*/
|
|
57
|
+
export interface BackblazeB2Credentials {
|
|
58
|
+
readonly accessKeyId: string;
|
|
59
|
+
readonly secretAccessKey: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Connection config used when the driver **builds its own** S3-compatible client
|
|
63
|
+
* for the Backblaze B2 endpoint (the lazy-`import()` path).
|
|
64
|
+
*/
|
|
65
|
+
export interface BackblazeB2ConnectionConfig extends BackblazeB2DriverOptions {
|
|
66
|
+
/** The B2 bucket name every object operation targets. */
|
|
67
|
+
readonly bucket: string;
|
|
68
|
+
/**
|
|
69
|
+
* The B2 S3-compatible endpoint, e.g. `https://s3.us-west-002.backblazeb2.com`.
|
|
70
|
+
*/
|
|
71
|
+
readonly endpoint: string;
|
|
72
|
+
/**
|
|
73
|
+
* The B2 region label embedded in the endpoint, e.g. `us-west-002`. Defaults to
|
|
74
|
+
* `"auto"` when omitted (the S3 client requires some region value).
|
|
75
|
+
*/
|
|
76
|
+
readonly region?: string;
|
|
77
|
+
/** The B2 application-key credentials (as S3 access/secret keys). */
|
|
78
|
+
readonly credentials: BackblazeB2Credentials;
|
|
79
|
+
/**
|
|
80
|
+
* Use path-style addressing (`endpoint/bucket/key`) instead of virtual-hosted
|
|
81
|
+
* style. Defaults to `false`; B2's S3 endpoint supports virtual-hosted style.
|
|
82
|
+
*/
|
|
83
|
+
readonly forcePathStyle?: boolean;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a Backblaze B2 {@link StorageDriver} from an **injected**
|
|
87
|
+
* {@link S3ClientLike}. Synchronous: no SDK is resolved by this package.
|
|
88
|
+
*/
|
|
89
|
+
export declare function createBackblazeB2Driver(client: S3ClientLike, options?: BackblazeB2DriverOptions): StorageDriver;
|
|
90
|
+
/**
|
|
91
|
+
* Create a Backblaze B2 {@link StorageDriver} that **builds its own** client for
|
|
92
|
+
* the B2 S3 endpoint. Asynchronous: the SDK is resolved through a lazy dynamic
|
|
93
|
+
* `import()`; a {@link StorageConfigError} is thrown when it is absent.
|
|
94
|
+
*/
|
|
95
|
+
export declare function createBackblazeB2Driver(config: BackblazeB2ConnectionConfig): Promise<StorageDriver>;
|
|
96
|
+
/**
|
|
97
|
+
* A Backblaze B2 driver as a concrete class over an injected {@link S3ClientLike},
|
|
98
|
+
* for callers who prefer `new` construction. Equivalent to
|
|
99
|
+
* {@link createBackblazeB2Driver} with an injected client; the name defaults to
|
|
100
|
+
* `"backblaze"`.
|
|
101
|
+
*/
|
|
102
|
+
export declare class BackblazeB2Driver extends S3StyleDriver {
|
|
103
|
+
constructor(client: S3ClientLike, options?: BackblazeB2DriverOptions);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=backblaze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backblaze.d.ts","sourceRoot":"","sources":["../../src/drivers/backblaze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAIH,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAEL,aAAa,EACb,KAAK,YAAY,EAIjB,KAAK,oBAAoB,EAG1B,MAAM,cAAc,CAAC;AAEtB,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,cAAc,CAAC;AAOjD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,gFAAgF;IAChF,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA4B,SAAQ,wBAAwB;IAC3E,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC7C;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,wBAAwB,GACjC,aAAa,CAAC;AACjB;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,aAAa,CAAC,CAAC;AAW1B;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,wBAA6B;CAOzE"}
|