@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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — MinIO driver submodule (`@streetjs/storage/minio`).
|
|
3
|
+
*
|
|
4
|
+
* MinIO speaks the S3 API against a **self-hosted endpoint**, so this driver is a
|
|
5
|
+
* thin endpoint specialization of the shared S3-style base
|
|
6
|
+
* ({@link createS3StyleDriver}). It contributes nothing to the contract mapping —
|
|
7
|
+
* that lives entirely in `s3-base.ts` — and only differs in how the underlying
|
|
8
|
+
* {@link S3ClientLike} is obtained and in the stable driver name (`"minio"`).
|
|
9
|
+
*
|
|
10
|
+
* ## SDK isolation (Requirements 3.1, 3.3)
|
|
11
|
+
*
|
|
12
|
+
* This module imports **no provider SDK** at the top level. There are two ways to
|
|
13
|
+
* obtain a driver:
|
|
14
|
+
*
|
|
15
|
+
* 1. **Inject a structural client.** {@link createMinIODriver} accepts an
|
|
16
|
+
* already-built {@link S3ClientLike} and delegates straight to the base with
|
|
17
|
+
* `name: "minio"`. The `minio` SDK stays an optional peer concern of the
|
|
18
|
+
* consumer and is never touched by this package.
|
|
19
|
+
*
|
|
20
|
+
* 2. **Let the driver build its own client.** {@link connectMinIODriver} resolves
|
|
21
|
+
* the optional `minio` peer SDK with a **lazy dynamic `import()`** performed
|
|
22
|
+
* *inside the function* (never at module top level), constructs a MinIO client
|
|
23
|
+
* from the supplied endpoint/credentials, adapts it to {@link S3ClientLike},
|
|
24
|
+
* and hands it to the base. If the SDK is absent, it throws
|
|
25
|
+
* {@link StorageConfigError} rather than a raw module-resolution error.
|
|
26
|
+
*
|
|
27
|
+
* Because the driver lives behind the `./minio` subpath export
|
|
28
|
+
* (`dist/drivers/minio.js`) and is *not* re-exported from the package index, a
|
|
29
|
+
* consumer only loads this code — and any SDK it lazily resolves — when they
|
|
30
|
+
* import `@streetjs/storage/minio`. `package.json` lists `minio` as an optional
|
|
31
|
+
* peer dependency, never a runtime dependency, keeping `streetjs` the only
|
|
32
|
+
* runtime dependency.
|
|
33
|
+
*
|
|
34
|
+
* _Requirements: 2.1, 2.3, 3.3_
|
|
35
|
+
*/
|
|
36
|
+
import type { StorageDriver } from "../driver.js";
|
|
37
|
+
import { type S3ClientLike, type S3StyleDriverOptions } from "./s3-base.js";
|
|
38
|
+
/**
|
|
39
|
+
* Options for {@link createMinIODriver}. Extends the shared
|
|
40
|
+
* {@link S3StyleDriverOptions} (clock, native capabilities) but pins the driver
|
|
41
|
+
* name to `"minio"` — the name is not caller-configurable for this
|
|
42
|
+
* specialization.
|
|
43
|
+
*/
|
|
44
|
+
export type MinIODriverOptions = Omit<S3StyleDriverOptions, "name">;
|
|
45
|
+
/**
|
|
46
|
+
* Create a MinIO-backed {@link StorageDriver} over an **injected** structural
|
|
47
|
+
* {@link S3ClientLike}.
|
|
48
|
+
*
|
|
49
|
+
* This is the primary, SDK-free entry point: the caller supplies a client that
|
|
50
|
+
* already speaks the {@link S3ClientLike} shape (built from the `minio` SDK, an
|
|
51
|
+
* S3 SDK pointed at a MinIO endpoint, or a test double), and this function
|
|
52
|
+
* delegates to the shared base with `name: "minio"`. No provider SDK is imported.
|
|
53
|
+
*
|
|
54
|
+
* @throws {StorageConfigError} when no client is injected — use
|
|
55
|
+
* {@link connectMinIODriver} to build a client from endpoint options instead.
|
|
56
|
+
*/
|
|
57
|
+
export declare function createMinIODriver(client: S3ClientLike, options?: MinIODriverOptions): StorageDriver;
|
|
58
|
+
/** Connection/endpoint options for building a MinIO client via {@link connectMinIODriver}. */
|
|
59
|
+
export interface MinIOConnectionOptions {
|
|
60
|
+
/** Bucket the driver operates within (required — MinIO is bucket-scoped). */
|
|
61
|
+
readonly bucket: string;
|
|
62
|
+
/** MinIO server hostname, e.g. `"127.0.0.1"` or `"minio.example.com"`. */
|
|
63
|
+
readonly endPoint: string;
|
|
64
|
+
/** TCP port of the MinIO server. Defaults to the SDK default when omitted. */
|
|
65
|
+
readonly port?: number;
|
|
66
|
+
/** Whether to use TLS. Defaults to `true`. */
|
|
67
|
+
readonly useSSL?: boolean;
|
|
68
|
+
/** Access key (username) for the MinIO server. */
|
|
69
|
+
readonly accessKey: string;
|
|
70
|
+
/** Secret key (password) for the MinIO server. */
|
|
71
|
+
readonly secretKey: string;
|
|
72
|
+
/** Optional region hint (MinIO tolerates any value; defaults to `"us-east-1"`). */
|
|
73
|
+
readonly region?: string;
|
|
74
|
+
/** Optional session token for temporary credentials. */
|
|
75
|
+
readonly sessionToken?: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Build a MinIO-backed {@link StorageDriver}, constructing the underlying client
|
|
79
|
+
* from `connection` options using the optional `minio` peer SDK.
|
|
80
|
+
*
|
|
81
|
+
* The SDK is resolved with a **lazy dynamic `import()`** performed inside this
|
|
82
|
+
* function, so the peer dependency is only touched when a caller actually asks
|
|
83
|
+
* the driver to build its own client. The resolved SDK client is adapted to the
|
|
84
|
+
* structural {@link S3ClientLike} and handed to {@link createMinIODriver}.
|
|
85
|
+
*
|
|
86
|
+
* @throws {StorageConfigError} when the `minio` SDK is not installed, or when the
|
|
87
|
+
* client cannot be constructed from the supplied options.
|
|
88
|
+
*/
|
|
89
|
+
export declare function connectMinIODriver(connection: MinIOConnectionOptions, options?: MinIODriverOptions): Promise<StorageDriver>;
|
|
90
|
+
//# sourceMappingURL=minio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minio.d.ts","sourceRoot":"","sources":["../../src/drivers/minio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAEL,KAAK,YAAY,EAOjB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AAKtB;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,kBAAuB,GAC/B,aAAa,CAUf;AAED,8FAA8F;AAC9F,MAAM,WAAW,sBAAsB;IACrC,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,sBAAsB,EAClC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — MinIO driver submodule (`@streetjs/storage/minio`).
|
|
3
|
+
*
|
|
4
|
+
* MinIO speaks the S3 API against a **self-hosted endpoint**, so this driver is a
|
|
5
|
+
* thin endpoint specialization of the shared S3-style base
|
|
6
|
+
* ({@link createS3StyleDriver}). It contributes nothing to the contract mapping —
|
|
7
|
+
* that lives entirely in `s3-base.ts` — and only differs in how the underlying
|
|
8
|
+
* {@link S3ClientLike} is obtained and in the stable driver name (`"minio"`).
|
|
9
|
+
*
|
|
10
|
+
* ## SDK isolation (Requirements 3.1, 3.3)
|
|
11
|
+
*
|
|
12
|
+
* This module imports **no provider SDK** at the top level. There are two ways to
|
|
13
|
+
* obtain a driver:
|
|
14
|
+
*
|
|
15
|
+
* 1. **Inject a structural client.** {@link createMinIODriver} accepts an
|
|
16
|
+
* already-built {@link S3ClientLike} and delegates straight to the base with
|
|
17
|
+
* `name: "minio"`. The `minio` SDK stays an optional peer concern of the
|
|
18
|
+
* consumer and is never touched by this package.
|
|
19
|
+
*
|
|
20
|
+
* 2. **Let the driver build its own client.** {@link connectMinIODriver} resolves
|
|
21
|
+
* the optional `minio` peer SDK with a **lazy dynamic `import()`** performed
|
|
22
|
+
* *inside the function* (never at module top level), constructs a MinIO client
|
|
23
|
+
* from the supplied endpoint/credentials, adapts it to {@link S3ClientLike},
|
|
24
|
+
* and hands it to the base. If the SDK is absent, it throws
|
|
25
|
+
* {@link StorageConfigError} rather than a raw module-resolution error.
|
|
26
|
+
*
|
|
27
|
+
* Because the driver lives behind the `./minio` subpath export
|
|
28
|
+
* (`dist/drivers/minio.js`) and is *not* re-exported from the package index, a
|
|
29
|
+
* consumer only loads this code — and any SDK it lazily resolves — when they
|
|
30
|
+
* import `@streetjs/storage/minio`. `package.json` lists `minio` as an optional
|
|
31
|
+
* peer dependency, never a runtime dependency, keeping `streetjs` the only
|
|
32
|
+
* runtime dependency.
|
|
33
|
+
*
|
|
34
|
+
* _Requirements: 2.1, 2.3, 3.3_
|
|
35
|
+
*/
|
|
36
|
+
import { StorageConfigError } from "../errors.js";
|
|
37
|
+
import { createS3StyleDriver, } from "./s3-base.js";
|
|
38
|
+
/** The stable {@link StorageDriver.name} surfaced by every MinIO driver. */
|
|
39
|
+
const MINIO_DRIVER_NAME = "minio";
|
|
40
|
+
/**
|
|
41
|
+
* Create a MinIO-backed {@link StorageDriver} over an **injected** structural
|
|
42
|
+
* {@link S3ClientLike}.
|
|
43
|
+
*
|
|
44
|
+
* This is the primary, SDK-free entry point: the caller supplies a client that
|
|
45
|
+
* already speaks the {@link S3ClientLike} shape (built from the `minio` SDK, an
|
|
46
|
+
* S3 SDK pointed at a MinIO endpoint, or a test double), and this function
|
|
47
|
+
* delegates to the shared base with `name: "minio"`. No provider SDK is imported.
|
|
48
|
+
*
|
|
49
|
+
* @throws {StorageConfigError} when no client is injected — use
|
|
50
|
+
* {@link connectMinIODriver} to build a client from endpoint options instead.
|
|
51
|
+
*/
|
|
52
|
+
export function createMinIODriver(client, options = {}) {
|
|
53
|
+
if (client === undefined || client === null) {
|
|
54
|
+
throw new StorageConfigError("createMinIODriver requires an injected S3-compatible client. " +
|
|
55
|
+
"Pass an S3ClientLike, or use connectMinIODriver(options) to build one " +
|
|
56
|
+
"from a MinIO endpoint using the optional 'minio' peer dependency.", { provider: MINIO_DRIVER_NAME });
|
|
57
|
+
}
|
|
58
|
+
return createS3StyleDriver(client, { ...options, name: MINIO_DRIVER_NAME });
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Build a MinIO-backed {@link StorageDriver}, constructing the underlying client
|
|
62
|
+
* from `connection` options using the optional `minio` peer SDK.
|
|
63
|
+
*
|
|
64
|
+
* The SDK is resolved with a **lazy dynamic `import()`** performed inside this
|
|
65
|
+
* function, so the peer dependency is only touched when a caller actually asks
|
|
66
|
+
* the driver to build its own client. The resolved SDK client is adapted to the
|
|
67
|
+
* structural {@link S3ClientLike} and handed to {@link createMinIODriver}.
|
|
68
|
+
*
|
|
69
|
+
* @throws {StorageConfigError} when the `minio` SDK is not installed, or when the
|
|
70
|
+
* client cannot be constructed from the supplied options.
|
|
71
|
+
*/
|
|
72
|
+
export async function connectMinIODriver(connection, options = {}) {
|
|
73
|
+
const sdk = await loadMinioSdk();
|
|
74
|
+
let sdkClient;
|
|
75
|
+
try {
|
|
76
|
+
sdkClient = new sdk.Client({
|
|
77
|
+
endPoint: connection.endPoint,
|
|
78
|
+
port: connection.port,
|
|
79
|
+
useSSL: connection.useSSL ?? true,
|
|
80
|
+
accessKey: connection.accessKey,
|
|
81
|
+
secretKey: connection.secretKey,
|
|
82
|
+
region: connection.region,
|
|
83
|
+
sessionToken: connection.sessionToken,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (cause) {
|
|
87
|
+
throw new StorageConfigError(`Failed to construct a MinIO client for endpoint "${connection.endPoint}".`, { provider: MINIO_DRIVER_NAME, cause });
|
|
88
|
+
}
|
|
89
|
+
const client = adaptMinioClient(sdkClient, connection.bucket);
|
|
90
|
+
return createMinIODriver(client, options);
|
|
91
|
+
}
|
|
92
|
+
// ── Lazy SDK loading ────────────────────────────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* Lazily resolve the optional `minio` peer SDK. The module specifier is held in
|
|
95
|
+
* a variable so the compiler does not statically resolve (and therefore require)
|
|
96
|
+
* the optional peer at build time; the resolution happens only at call time.
|
|
97
|
+
*
|
|
98
|
+
* @throws {StorageConfigError} when the SDK is not installed.
|
|
99
|
+
*/
|
|
100
|
+
async function loadMinioSdk() {
|
|
101
|
+
const specifier = "minio";
|
|
102
|
+
try {
|
|
103
|
+
return (await import(specifier));
|
|
104
|
+
}
|
|
105
|
+
catch (cause) {
|
|
106
|
+
throw new StorageConfigError("The optional 'minio' peer dependency is not installed. Install it " +
|
|
107
|
+
"(`npm install minio`) to build a MinIO client from endpoint options, " +
|
|
108
|
+
"or inject your own S3ClientLike via createMinIODriver(client).", { provider: MINIO_DRIVER_NAME, cause });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// ── SDK → S3ClientLike adapter ────────────────────────────────────────────────
|
|
112
|
+
/** User-metadata prefix MinIO/S3 uses for caller-supplied metadata keys. */
|
|
113
|
+
const USER_META_PREFIX = "x-amz-meta-";
|
|
114
|
+
/** Content-Type header key recognized by the MinIO SDK `metaData` map. */
|
|
115
|
+
const CONTENT_TYPE_KEY = "Content-Type";
|
|
116
|
+
/**
|
|
117
|
+
* Adapt a MinIO SDK client into the structural {@link S3ClientLike} the base
|
|
118
|
+
* driver consumes, scoping every call to `bucket`. Multipart methods are left
|
|
119
|
+
* unimplemented so the facade simulates multipart over the primitives, keeping
|
|
120
|
+
* behavior identical across providers (Requirement 2.3).
|
|
121
|
+
*/
|
|
122
|
+
function adaptMinioClient(sdk, bucket) {
|
|
123
|
+
return {
|
|
124
|
+
async putObject(input) {
|
|
125
|
+
const metaData = encodeMetaData(input.contentType, input.metadata);
|
|
126
|
+
const body = Buffer.from(input.body);
|
|
127
|
+
const result = await sdk.putObject(bucket, input.key, body, body.byteLength, metaData);
|
|
128
|
+
return { etag: result.etag };
|
|
129
|
+
},
|
|
130
|
+
async getObject(input) {
|
|
131
|
+
let stat;
|
|
132
|
+
try {
|
|
133
|
+
stat = await sdk.statObject(bucket, input.key);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (isNotFound(error)) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
let stream;
|
|
142
|
+
try {
|
|
143
|
+
stream = await sdk.getObject(bucket, input.key);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (isNotFound(error)) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
const body = await collectStream(stream);
|
|
152
|
+
const decoded = decodeMetaData(stat.metaData);
|
|
153
|
+
return {
|
|
154
|
+
body,
|
|
155
|
+
contentType: decoded.contentType,
|
|
156
|
+
etag: stat.etag,
|
|
157
|
+
size: stat.size,
|
|
158
|
+
lastModified: stat.lastModified?.getTime(),
|
|
159
|
+
metadata: decoded.userMetadata,
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
async deleteObject(input) {
|
|
163
|
+
try {
|
|
164
|
+
await sdk.removeObject(bucket, input.key);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (isNotFound(error)) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
async listObjects(input) {
|
|
174
|
+
const stream = sdk.listObjectsV2(bucket, input.prefix, input.delimiter !== true);
|
|
175
|
+
const items = [];
|
|
176
|
+
await new Promise((resolve, reject) => {
|
|
177
|
+
stream.on("data", (entry) => {
|
|
178
|
+
if (typeof entry.name === "string") {
|
|
179
|
+
items.push({
|
|
180
|
+
key: entry.name,
|
|
181
|
+
size: entry.size ?? 0,
|
|
182
|
+
updatedAt: entry.lastModified?.getTime() ?? 0,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
stream.on("error", reject);
|
|
187
|
+
stream.on("end", resolve);
|
|
188
|
+
stream.on("close", resolve);
|
|
189
|
+
});
|
|
190
|
+
const sorted = items.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
191
|
+
return typeof input.limit === "number" ? sorted.slice(0, input.limit) : sorted;
|
|
192
|
+
},
|
|
193
|
+
async headObject(input) {
|
|
194
|
+
try {
|
|
195
|
+
const stat = await sdk.statObject(bucket, input.key);
|
|
196
|
+
const decoded = decodeMetaData(stat.metaData);
|
|
197
|
+
return {
|
|
198
|
+
contentType: decoded.contentType,
|
|
199
|
+
etag: stat.etag,
|
|
200
|
+
size: stat.size,
|
|
201
|
+
lastModified: stat.lastModified?.getTime(),
|
|
202
|
+
metadata: decoded.userMetadata,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (isNotFound(error)) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
async presignUrl(input) {
|
|
213
|
+
const expirySeconds = Math.max(1, Math.round(input.expiresInMs / 1000));
|
|
214
|
+
return sdk.presignedUrl(input.op, bucket, input.key, expirySeconds);
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
// ── metadata encode/decode helpers ─────────────────────────────────────────────
|
|
219
|
+
/** Encode content type + user metadata into the MinIO SDK `metaData` header map. */
|
|
220
|
+
function encodeMetaData(contentType, metadata) {
|
|
221
|
+
const map = {};
|
|
222
|
+
if (contentType !== undefined) {
|
|
223
|
+
map[CONTENT_TYPE_KEY] = contentType;
|
|
224
|
+
}
|
|
225
|
+
if (metadata !== undefined) {
|
|
226
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
227
|
+
map[`${USER_META_PREFIX}${key}`] = value;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return map;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Decode a MinIO SDK `metaData` map back into a content type and the caller's
|
|
234
|
+
* user-metadata map, stripping the `x-amz-meta-` prefix. MinIO lowercases header
|
|
235
|
+
* keys, so lookups are case-insensitive.
|
|
236
|
+
*/
|
|
237
|
+
function decodeMetaData(metaData) {
|
|
238
|
+
const userMetadata = {};
|
|
239
|
+
let contentType;
|
|
240
|
+
if (metaData !== undefined) {
|
|
241
|
+
for (const [rawKey, value] of Object.entries(metaData)) {
|
|
242
|
+
const key = rawKey.toLowerCase();
|
|
243
|
+
if (key === CONTENT_TYPE_KEY.toLowerCase()) {
|
|
244
|
+
contentType = value;
|
|
245
|
+
}
|
|
246
|
+
else if (key.startsWith(USER_META_PREFIX)) {
|
|
247
|
+
userMetadata[key.slice(USER_META_PREFIX.length)] = value;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return { contentType, userMetadata };
|
|
252
|
+
}
|
|
253
|
+
/** Collect a Node {@link Readable} into a single {@link Uint8Array}. */
|
|
254
|
+
async function collectStream(stream) {
|
|
255
|
+
const chunks = [];
|
|
256
|
+
for await (const chunk of stream) {
|
|
257
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
258
|
+
}
|
|
259
|
+
return new Uint8Array(Buffer.concat(chunks));
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Detect a MinIO/S3 "object does not exist" error so absence maps to `null`
|
|
263
|
+
* rather than a thrown error, keeping not-found semantics identical to the base.
|
|
264
|
+
*/
|
|
265
|
+
function isNotFound(error) {
|
|
266
|
+
if (error === null || typeof error !== "object") {
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
const code = error.code;
|
|
270
|
+
const statusCode = error.statusCode;
|
|
271
|
+
return (code === "NoSuchKey" ||
|
|
272
|
+
code === "NotFound" ||
|
|
273
|
+
code === "NoSuchObject" ||
|
|
274
|
+
statusCode === 404);
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=minio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minio.js","sourceRoot":"","sources":["../../src/drivers/minio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — CloudflareR2Driver (submodule `@streetjs/storage/r2`).
|
|
3
|
+
*
|
|
4
|
+
* Cloudflare R2 speaks the S3 API, so this driver is a thin **endpoint/credential
|
|
5
|
+
* specialization** of the shared S3-style base ({@link createS3StyleDriver} in
|
|
6
|
+
* `s3-base.ts`). It differs from `s3.ts` only in how the underlying client is
|
|
7
|
+
* built — R2 uses an account-specific endpoint
|
|
8
|
+
* (`https://<accountId>.r2.cloudflarestorage.com`) with `region: "auto"` — never
|
|
9
|
+
* in how the {@link StorageDriver} contract is satisfied.
|
|
10
|
+
*
|
|
11
|
+
* ## Two ways to obtain a driver
|
|
12
|
+
*
|
|
13
|
+
* - {@link createCloudflareR2Driver} wraps an **already-constructed, injected**
|
|
14
|
+
* structural {@link S3ClientLike} and returns a driver synchronously. This is
|
|
15
|
+
* the SDK-free path: no provider SDK is touched, so it is fully testable with
|
|
16
|
+
* an in-memory fake and needs no `@aws-sdk/*` install.
|
|
17
|
+
* - {@link connectCloudflareR2Driver} **builds its own client** from R2
|
|
18
|
+
* connection config. It resolves the S3-compatible SDK through a **lazy
|
|
19
|
+
* dynamic `import()` performed inside the function** (never at module top
|
|
20
|
+
* level), so the optional peer dependency is only required when this path is
|
|
21
|
+
* actually used. If the SDK is not installed and no client was injected, it
|
|
22
|
+
* throws {@link StorageConfigError} (Requirement 1.5).
|
|
23
|
+
*
|
|
24
|
+
* ## SDK isolation (Requirements 2.1, 3.3)
|
|
25
|
+
*
|
|
26
|
+
* This module imports **no provider SDK at the top level** — only this package's
|
|
27
|
+
* own base/types/errors. The AWS S3 SDK (which R2 uses) is referenced solely via
|
|
28
|
+
* a dynamic `import()` with a non-literal specifier inside
|
|
29
|
+
* {@link connectCloudflareR2Driver}, so `tsc` never requires the SDK to be
|
|
30
|
+
* present and `streetjs` stays the only runtime dependency. This driver is a
|
|
31
|
+
* submodule-only export (`./r2` → `dist/drivers/r2.js`); it is intentionally not
|
|
32
|
+
* re-exported from the package's main `index.ts`.
|
|
33
|
+
*
|
|
34
|
+
* _Requirements: 2.1, 2.3, 3.3_
|
|
35
|
+
*/
|
|
36
|
+
import type { Clock } from "streetjs";
|
|
37
|
+
import type { StorageDriver } from "../driver.js";
|
|
38
|
+
import { S3StyleDriver, type S3ClientLike, type S3NativeCapabilities } from "./s3-base.js";
|
|
39
|
+
/**
|
|
40
|
+
* Options for the R2 driver. Mirrors the S3-style base options but omits `name`
|
|
41
|
+
* — the R2 driver's name is fixed to `"r2"` so provider identity is stable.
|
|
42
|
+
*/
|
|
43
|
+
export interface CloudflareR2DriverOptions {
|
|
44
|
+
/** Injected clock for deterministic timestamps in tests. Default `systemClock`. */
|
|
45
|
+
readonly clock?: Clock;
|
|
46
|
+
/**
|
|
47
|
+
* Native capability objects to delegate to. Any capability omitted here (and
|
|
48
|
+
* not derivable from the client) is left `undefined` so the facade simulates
|
|
49
|
+
* it over the primitives.
|
|
50
|
+
*/
|
|
51
|
+
readonly capabilities?: S3NativeCapabilities;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Connection configuration for {@link connectCloudflareR2Driver}. These are the
|
|
55
|
+
* R2-specific coordinates used to build the endpoint and sign requests.
|
|
56
|
+
*/
|
|
57
|
+
export interface CloudflareR2Config extends CloudflareR2DriverOptions {
|
|
58
|
+
/** Cloudflare account id — forms the R2 endpoint host. */
|
|
59
|
+
readonly accountId: string;
|
|
60
|
+
/** Target R2 bucket name. */
|
|
61
|
+
readonly bucket: string;
|
|
62
|
+
/** R2 access key id (S3-compatible credential). */
|
|
63
|
+
readonly accessKeyId: string;
|
|
64
|
+
/** R2 secret access key (S3-compatible credential). */
|
|
65
|
+
readonly secretAccessKey: string;
|
|
66
|
+
/**
|
|
67
|
+
* Override the derived endpoint. Defaults to
|
|
68
|
+
* `https://<accountId>.r2.cloudflarestorage.com`.
|
|
69
|
+
*/
|
|
70
|
+
readonly endpoint?: string;
|
|
71
|
+
/** S3 SDK region. R2 ignores region but the SDK requires one; default `"auto"`. */
|
|
72
|
+
readonly region?: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The CloudflareR2 {@link StorageDriver}: the shared S3-style base pinned to the
|
|
76
|
+
* `"r2"` provider name. Construction is identical to the base — supply an
|
|
77
|
+
* {@link S3ClientLike} — the only difference is the fixed name.
|
|
78
|
+
*/
|
|
79
|
+
export declare class CloudflareR2Driver extends S3StyleDriver {
|
|
80
|
+
constructor(client: S3ClientLike, options?: CloudflareR2DriverOptions);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Wrap an injected {@link S3ClientLike} as an R2 driver, delegating to
|
|
84
|
+
* {@link createS3StyleDriver} with the name `"r2"`. Synchronous and SDK-free:
|
|
85
|
+
* the caller supplies the client, so no provider SDK is resolved here.
|
|
86
|
+
*/
|
|
87
|
+
export declare function createCloudflareR2Driver(client: S3ClientLike, options?: CloudflareR2DriverOptions): StorageDriver;
|
|
88
|
+
/**
|
|
89
|
+
* Build an R2 driver that owns its client, resolving the S3-compatible SDK
|
|
90
|
+
* lazily.
|
|
91
|
+
*
|
|
92
|
+
* The SDK is loaded through a dynamic `import()` with a non-literal specifier so
|
|
93
|
+
* it is never a static/top-level dependency: `tsc` does not require it to be
|
|
94
|
+
* installed, and it is only resolved when this function runs. When the SDK
|
|
95
|
+
* cannot be resolved, a {@link StorageConfigError} is thrown (Requirement 1.5) —
|
|
96
|
+
* callers that cannot install the SDK should use {@link createCloudflareR2Driver}
|
|
97
|
+
* with their own {@link S3ClientLike} instead.
|
|
98
|
+
*/
|
|
99
|
+
export declare function connectCloudflareR2Driver(config: CloudflareR2Config): Promise<StorageDriver>;
|
|
100
|
+
//# sourceMappingURL=r2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../src/drivers/r2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAEL,aAAa,EACb,KAAK,YAAY,EAKjB,KAAK,oBAAoB,EAG1B,MAAM,cAAc,CAAC;AAKtB;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,yBAAyB;IACnE,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,yBAA8B;CAG1E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,yBAA8B,GACtC,aAAa,CAEf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,aAAa,CAAC,CAuCxB"}
|