@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,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — {@link S3StorageDriver} (Amazon S3), submodule `./s3`.
|
|
3
|
+
*
|
|
4
|
+
* This module is the concrete Amazon S3 provider driver, exposed only through
|
|
5
|
+
* the optional subpath export `@streetjs/storage/s3` (Requirement 3.3). It is
|
|
6
|
+
* **not** re-exported from the package entry point `src/index.ts`, so importing
|
|
7
|
+
* the base package never pulls in this file or any AWS SDK.
|
|
8
|
+
*
|
|
9
|
+
* ## What this module adds over the base
|
|
10
|
+
*
|
|
11
|
+
* The entire {@link StorageDriver} contract mapping already lives in the shared
|
|
12
|
+
* {@link createS3StyleDriver} / {@link S3StyleDriver} base (task 28.1) built over
|
|
13
|
+
* the structural {@link S3ClientLike}. Amazon S3, Cloudflare R2, MinIO and the
|
|
14
|
+
* Backblaze B2 S3 API differ only in **how the client is built/configured**, not
|
|
15
|
+
* in how the contract is satisfied — so this module contributes only:
|
|
16
|
+
*
|
|
17
|
+
* 1. {@link createS3StorageDriver} — wrap an **injected** {@link S3ClientLike}
|
|
18
|
+
* (the preferred, SDK-free path) as a `name: "s3"` driver by delegating to the
|
|
19
|
+
* base. No AWS SDK is loaded on this path.
|
|
20
|
+
* 2. {@link createS3StorageDriverFromConfig} — construct an {@link S3ClientLike}
|
|
21
|
+
* from `bucket`/`region`/`endpoint`/`credentials` using a **lazy dynamic
|
|
22
|
+
* `import()`** of the AWS SDK performed *inside* the function. The SDK is
|
|
23
|
+
* therefore resolved only when this construction path actually runs, never at
|
|
24
|
+
* module load, keeping the AWS SDK an optional peer concern of the consumer
|
|
25
|
+
* (Requirement 3.1). If the SDK cannot be loaded and no client was injected, a
|
|
26
|
+
* descriptive {@link StorageConfigError} is thrown.
|
|
27
|
+
*
|
|
28
|
+
* ## SDK isolation (Requirements 2.1, 3.3)
|
|
29
|
+
*
|
|
30
|
+
* There is **no top-level `import` of any AWS SDK** in this file — only `streetjs`
|
|
31
|
+
* (for {@link Clock}), this package's own type surface, and the shared base. The
|
|
32
|
+
* `@aws-sdk/client-s3` / `@aws-sdk/s3-request-presigner` packages are declared as
|
|
33
|
+
* **optional peer dependencies** in `package.json`; they are pulled in only by
|
|
34
|
+
* the lazy `import()` inside {@link createS3StorageDriverFromConfig}. The dynamic
|
|
35
|
+
* specifier is held in a variable so the build never statically requires the SDK
|
|
36
|
+
* to be installed.
|
|
37
|
+
*
|
|
38
|
+
* _Requirements: 2.1, 2.3, 3.3_
|
|
39
|
+
*/
|
|
40
|
+
import { StorageConfigError } from "../errors.js";
|
|
41
|
+
import { createS3StyleDriver, } from "./s3-base.js";
|
|
42
|
+
/** The stable driver name surfaced as {@link StorageDriver.name} for this driver. */
|
|
43
|
+
const DRIVER_NAME = "s3";
|
|
44
|
+
// ── Public factories ─────────────────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* Wrap an **injected** {@link S3ClientLike} as an Amazon S3 {@link StorageDriver}
|
|
47
|
+
* (`name: "s3"`). This is the preferred path: no AWS SDK is required because the
|
|
48
|
+
* caller supplies the structural client, and the whole {@link StorageDriver}
|
|
49
|
+
* contract is satisfied by the shared base (Requirement 2.3).
|
|
50
|
+
*
|
|
51
|
+
* @throws {StorageConfigError} when `client` is missing or does not implement the
|
|
52
|
+
* mandatory {@link S3ClientLike} object operations. To build a client from
|
|
53
|
+
* credentials instead, use {@link createS3StorageDriverFromConfig}.
|
|
54
|
+
*/
|
|
55
|
+
export function createS3StorageDriver(client, options = {}) {
|
|
56
|
+
if (!isS3ClientLike(client)) {
|
|
57
|
+
throw new StorageConfigError('createS3StorageDriver requires an injected S3ClientLike implementing ' +
|
|
58
|
+
'putObject/getObject/deleteObject/listObjects. Pass a structural client, ' +
|
|
59
|
+
'or use createS3StorageDriverFromConfig to construct one from credentials ' +
|
|
60
|
+
'via the optional "@aws-sdk/client-s3" peer dependency.', { provider: DRIVER_NAME });
|
|
61
|
+
}
|
|
62
|
+
return createS3StyleDriver(client, {
|
|
63
|
+
name: DRIVER_NAME,
|
|
64
|
+
clock: options.clock,
|
|
65
|
+
capabilities: options.capabilities,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Construct an Amazon S3 {@link StorageDriver} from connection configuration.
|
|
70
|
+
*
|
|
71
|
+
* When `config.client` is supplied it is wrapped directly (no SDK is loaded).
|
|
72
|
+
* Otherwise this **lazily `import()`s** `@aws-sdk/client-s3` and builds a client
|
|
73
|
+
* over the SDK — the SDK is resolved only here, at construction time, never at
|
|
74
|
+
* module load. If the SDK cannot be loaded, a descriptive {@link StorageConfigError}
|
|
75
|
+
* is thrown so a missing optional peer dependency surfaces clearly rather than as
|
|
76
|
+
* an opaque module-resolution failure (Requirements 2.1, 3.3).
|
|
77
|
+
*/
|
|
78
|
+
export async function createS3StorageDriverFromConfig(config) {
|
|
79
|
+
const client = config.client !== undefined && config.client !== null
|
|
80
|
+
? config.client
|
|
81
|
+
: await buildS3ClientFromSdk(config);
|
|
82
|
+
return createS3StorageDriver(client, {
|
|
83
|
+
clock: config.clock,
|
|
84
|
+
capabilities: config.capabilities,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// ── Internal: structural client guard ──────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Structural check that `value` implements the mandatory {@link S3ClientLike}
|
|
90
|
+
* object operations. Optional methods (`headObject`, multipart, `presignUrl`) are
|
|
91
|
+
* not required and are feature-detected by the base.
|
|
92
|
+
*/
|
|
93
|
+
function isS3ClientLike(value) {
|
|
94
|
+
if (value === null || typeof value !== "object") {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const candidate = value;
|
|
98
|
+
return (typeof candidate.putObject === "function" &&
|
|
99
|
+
typeof candidate.getObject === "function" &&
|
|
100
|
+
typeof candidate.deleteObject === "function" &&
|
|
101
|
+
typeof candidate.listObjects === "function");
|
|
102
|
+
}
|
|
103
|
+
// ── Internal: lazy AWS SDK client construction ─────────────────────────────────
|
|
104
|
+
/**
|
|
105
|
+
* Build an {@link S3ClientLike} over the real AWS SDK, loaded lazily.
|
|
106
|
+
*
|
|
107
|
+
* The SDK module specifiers are held in variables so the TypeScript build never
|
|
108
|
+
* statically resolves (and therefore never requires) the optional peer
|
|
109
|
+
* dependencies. Any load failure is wrapped in a {@link StorageConfigError}.
|
|
110
|
+
*/
|
|
111
|
+
async function buildS3ClientFromSdk(config) {
|
|
112
|
+
// Held in a variable so the compiler treats this as a dynamic (untyped) import
|
|
113
|
+
// and does not require "@aws-sdk/client-s3" to be installed to build.
|
|
114
|
+
const clientModuleId = "@aws-sdk/client-s3";
|
|
115
|
+
let sdk;
|
|
116
|
+
try {
|
|
117
|
+
sdk = (await import(clientModuleId));
|
|
118
|
+
}
|
|
119
|
+
catch (cause) {
|
|
120
|
+
throw new StorageConfigError('The AWS SDK ("@aws-sdk/client-s3") is required to construct an S3 client ' +
|
|
121
|
+
"from credentials but could not be loaded. Install it as an optional peer " +
|
|
122
|
+
"dependency, or inject a structural S3ClientLike via createS3StorageDriver.", { provider: DRIVER_NAME, cause });
|
|
123
|
+
}
|
|
124
|
+
const bucket = config.bucket;
|
|
125
|
+
const sdkClient = new sdk.S3Client({
|
|
126
|
+
region: config.region,
|
|
127
|
+
endpoint: config.endpoint,
|
|
128
|
+
forcePathStyle: config.forcePathStyle,
|
|
129
|
+
credentials: config.credentials,
|
|
130
|
+
});
|
|
131
|
+
const commands = sdk;
|
|
132
|
+
const send = (command) => sdkClient.send(command);
|
|
133
|
+
const command = (name, input) => new commands[name](input);
|
|
134
|
+
return {
|
|
135
|
+
async putObject({ key, body, contentType, metadata }) {
|
|
136
|
+
const out = await send(command("PutObjectCommand", {
|
|
137
|
+
Bucket: bucket,
|
|
138
|
+
Key: key,
|
|
139
|
+
Body: body,
|
|
140
|
+
ContentType: contentType,
|
|
141
|
+
Metadata: metadata,
|
|
142
|
+
}));
|
|
143
|
+
return { etag: out.ETag ?? "" };
|
|
144
|
+
},
|
|
145
|
+
async getObject({ key }) {
|
|
146
|
+
let out;
|
|
147
|
+
try {
|
|
148
|
+
out = await send(command("GetObjectCommand", { Bucket: bucket, Key: key }));
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
if (isNotFound(error)) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
body: await collectBody(out.Body),
|
|
158
|
+
contentType: out.ContentType,
|
|
159
|
+
etag: out.ETag,
|
|
160
|
+
size: out.ContentLength,
|
|
161
|
+
lastModified: toEpochMs(out.LastModified),
|
|
162
|
+
metadata: out.Metadata,
|
|
163
|
+
};
|
|
164
|
+
},
|
|
165
|
+
async deleteObject({ key }) {
|
|
166
|
+
await send(command("DeleteObjectCommand", { Bucket: bucket, Key: key }));
|
|
167
|
+
},
|
|
168
|
+
async listObjects({ prefix, limit, cursor }) {
|
|
169
|
+
const out = await send(command("ListObjectsV2Command", {
|
|
170
|
+
Bucket: bucket,
|
|
171
|
+
Prefix: prefix,
|
|
172
|
+
MaxKeys: limit,
|
|
173
|
+
ContinuationToken: cursor,
|
|
174
|
+
}));
|
|
175
|
+
const contents = out.Contents ?? [];
|
|
176
|
+
const items = [];
|
|
177
|
+
for (const entry of contents) {
|
|
178
|
+
if (entry.Key === undefined) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
items.push({
|
|
182
|
+
key: entry.Key,
|
|
183
|
+
size: entry.Size ?? 0,
|
|
184
|
+
updatedAt: toEpochMs(entry.LastModified) ?? 0,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return items;
|
|
188
|
+
},
|
|
189
|
+
async headObject({ key }) {
|
|
190
|
+
let out;
|
|
191
|
+
try {
|
|
192
|
+
out = await send(command("HeadObjectCommand", { Bucket: bucket, Key: key }));
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (isNotFound(error)) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
contentType: out.ContentType,
|
|
202
|
+
etag: out.ETag,
|
|
203
|
+
size: out.ContentLength,
|
|
204
|
+
lastModified: toEpochMs(out.LastModified),
|
|
205
|
+
metadata: out.Metadata,
|
|
206
|
+
};
|
|
207
|
+
},
|
|
208
|
+
async createMultipartUpload({ key, contentType, metadata }) {
|
|
209
|
+
const out = await send(command("CreateMultipartUploadCommand", {
|
|
210
|
+
Bucket: bucket,
|
|
211
|
+
Key: key,
|
|
212
|
+
ContentType: contentType,
|
|
213
|
+
Metadata: metadata,
|
|
214
|
+
}));
|
|
215
|
+
return { uploadId: out.UploadId ?? "" };
|
|
216
|
+
},
|
|
217
|
+
async uploadPart({ key, uploadId, partNumber, body }) {
|
|
218
|
+
const out = await send(command("UploadPartCommand", {
|
|
219
|
+
Bucket: bucket,
|
|
220
|
+
Key: key,
|
|
221
|
+
UploadId: uploadId,
|
|
222
|
+
PartNumber: partNumber,
|
|
223
|
+
Body: body,
|
|
224
|
+
}));
|
|
225
|
+
return { etag: out.ETag ?? "" };
|
|
226
|
+
},
|
|
227
|
+
async completeMultipartUpload({ key, uploadId, parts }) {
|
|
228
|
+
const out = await send(command("CompleteMultipartUploadCommand", {
|
|
229
|
+
Bucket: bucket,
|
|
230
|
+
Key: key,
|
|
231
|
+
UploadId: uploadId,
|
|
232
|
+
MultipartUpload: {
|
|
233
|
+
Parts: parts.map((part) => ({ PartNumber: part.partNumber, ETag: part.etag })),
|
|
234
|
+
},
|
|
235
|
+
}));
|
|
236
|
+
return { etag: out.ETag ?? "" };
|
|
237
|
+
},
|
|
238
|
+
async abortMultipartUpload({ key, uploadId }) {
|
|
239
|
+
await send(command("AbortMultipartUploadCommand", {
|
|
240
|
+
Bucket: bucket,
|
|
241
|
+
Key: key,
|
|
242
|
+
UploadId: uploadId,
|
|
243
|
+
}));
|
|
244
|
+
},
|
|
245
|
+
async presignUrl({ key, op, expiresInMs }) {
|
|
246
|
+
// Held in a variable for the same lazy, build-independent reason as above.
|
|
247
|
+
const presignModuleId = "@aws-sdk/s3-request-presigner";
|
|
248
|
+
let presigner;
|
|
249
|
+
try {
|
|
250
|
+
presigner = (await import(presignModuleId));
|
|
251
|
+
}
|
|
252
|
+
catch (cause) {
|
|
253
|
+
throw new StorageConfigError('The AWS SDK presigner ("@aws-sdk/s3-request-presigner") is required to ' +
|
|
254
|
+
"mint presigned URLs but could not be loaded. Install it as an optional " +
|
|
255
|
+
"peer dependency.", { provider: DRIVER_NAME, cause });
|
|
256
|
+
}
|
|
257
|
+
const commandName = op === "PUT"
|
|
258
|
+
? "PutObjectCommand"
|
|
259
|
+
: op === "DELETE"
|
|
260
|
+
? "DeleteObjectCommand"
|
|
261
|
+
: "GetObjectCommand";
|
|
262
|
+
return presigner.getSignedUrl(sdkClient, command(commandName, { Bucket: bucket, Key: key }), {
|
|
263
|
+
expiresIn: Math.max(1, Math.round(expiresInMs / 1000)),
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/** Convert an SDK `Date` (or `undefined`) to epoch ms. */
|
|
269
|
+
function toEpochMs(date) {
|
|
270
|
+
return date instanceof Date ? date.getTime() : undefined;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Detect the SDK's "object does not exist" signals so a missing key maps to the
|
|
274
|
+
* base's `null` convention rather than a thrown error.
|
|
275
|
+
*/
|
|
276
|
+
function isNotFound(error) {
|
|
277
|
+
if (error === null || typeof error !== "object") {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
const err = error;
|
|
281
|
+
return (err.name === "NoSuchKey" ||
|
|
282
|
+
err.name === "NotFound" ||
|
|
283
|
+
err.Code === "NoSuchKey" ||
|
|
284
|
+
err.$metadata?.httpStatusCode === 404);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Collect an SDK response body into a `Uint8Array`. Prefers the SDK's
|
|
288
|
+
* `transformToByteArray()` helper and falls back to async iteration for stream
|
|
289
|
+
* bodies.
|
|
290
|
+
*/
|
|
291
|
+
async function collectBody(body) {
|
|
292
|
+
if (body === null || body === undefined) {
|
|
293
|
+
return new Uint8Array(0);
|
|
294
|
+
}
|
|
295
|
+
const maybe = body;
|
|
296
|
+
if (typeof maybe.transformToByteArray === "function") {
|
|
297
|
+
return new Uint8Array(await maybe.transformToByteArray());
|
|
298
|
+
}
|
|
299
|
+
if (typeof maybe[Symbol.asyncIterator] === "function") {
|
|
300
|
+
const chunks = [];
|
|
301
|
+
for await (const chunk of body) {
|
|
302
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
303
|
+
}
|
|
304
|
+
return new Uint8Array(Buffer.concat(chunks));
|
|
305
|
+
}
|
|
306
|
+
if (body instanceof Uint8Array) {
|
|
307
|
+
return body.slice();
|
|
308
|
+
}
|
|
309
|
+
return new Uint8Array(0);
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=s3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/drivers/s3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,mBAAmB,GAIpB,MAAM,cAAc,CAAC;AAEtB,qFAAqF;AACrF,MAAM,WAAW,GAAG,IAAI,CAAC;AAqDzB,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAoB,EACpB,UAAkC,EAAE;IAEpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,kBAAkB,CAC1B,uEAAuE;YACrE,0EAA0E;YAC1E,2EAA2E;YAC3E,wDAAwD,EAC1D,EAAE,QAAQ,EAAE,WAAW,EAAE,CAC1B,CAAC;IACJ,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,EAAE;QACjC,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,MAA6B;IAE7B,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QACnD,CAAC,CAAC,MAAM,CAAC,MAAM;QACf,CAAC,CAAC,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEzC,OAAO,qBAAqB,CAAC,MAAM,EAAE;QACnC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAElF;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,KAAqD,CAAC;IACxE,OAAO,CACL,OAAO,SAAS,CAAC,SAAS,KAAK,UAAU;QACzC,OAAO,SAAS,CAAC,SAAS,KAAK,UAAU;QACzC,OAAO,SAAS,CAAC,YAAY,KAAK,UAAU;QAC5C,OAAO,SAAS,CAAC,WAAW,KAAK,UAAU,CAC5C,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF;;;;;;GAMG;AACH,KAAK,UAAU,oBAAoB,CAAC,MAA6B;IAC/D,+EAA+E;IAC/E,sEAAsE;IACtE,MAAM,cAAc,GAAG,oBAAoB,CAAC;IAC5C,IAAI,GAAU,CAAC;IACf,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAqB,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAC1B,2EAA2E;YACzE,2EAA2E;YAC3E,4EAA4E,EAC9E,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CACjC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAA+C,CAAC;IACjE,MAAM,IAAI,GAAG,CAAI,OAAkB,EAAc,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAe,CAAC;IAC1F,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,KAAc,EAAa,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAEvF,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE;YAClD,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,OAAO,CAAC,kBAAkB,EAAE;gBAC1B,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG;gBACR,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,WAAW;gBACxB,QAAQ,EAAE,QAAQ;aACnB,CAAC,CACH,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE;YACrB,IAAI,GAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,IAAI,CACd,OAAO,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC1D,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,MAAM,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;gBACjC,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,aAAa;gBACvB,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;gBACzC,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE;YACxB,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,OAAO,CAAC,sBAAsB,EAAE;gBAC9B,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,KAAK;gBACd,iBAAiB,EAAE,MAAM;aAC1B,CAAC,CACH,CAAC;YACF,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YACpC,MAAM,KAAK,GAAiB,EAAE,CAAC;YAC/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC5B,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC;oBACT,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;oBACrB,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;iBAC9C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE;YACtB,IAAI,GAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,IAAI,CACd,OAAO,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC3D,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO;gBACL,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,aAAa;gBACvB,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;gBACzC,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,qBAAqB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE;YACxD,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,OAAO,CAAC,8BAA8B,EAAE;gBACtC,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG;gBACR,WAAW,EAAE,WAAW;gBACxB,QAAQ,EAAE,QAAQ;aACnB,CAAC,CACH,CAAC;YACF,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC1C,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE;YAClD,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,OAAO,CAAC,mBAAmB,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,UAAU;gBACtB,IAAI,EAAE,IAAI;aACX,CAAC,CACH,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,uBAAuB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;YACpD,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,OAAO,CAAC,gCAAgC,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,QAAQ;gBAClB,eAAe,EAAE;oBACf,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBAC/E;aACF,CAAC,CACH,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE;YAC1C,MAAM,IAAI,CACR,OAAO,CAAC,6BAA6B,EAAE;gBACrC,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,QAAQ;aACnB,CAAC,CACH,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE;YACvC,2EAA2E;YAC3E,MAAM,eAAe,GAAG,+BAA+B,CAAC;YACxD,IAAI,SAEH,CAAC;YACF,IAAI,CAAC;gBACH,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAgC,CAAC;YAC7E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,kBAAkB,CAC1B,yEAAyE;oBACvE,yEAAyE;oBACzE,kBAAkB,EACpB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CACjC,CAAC;YACJ,CAAC;YACD,MAAM,WAAW,GACf,EAAE,KAAK,KAAK;gBACV,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,EAAE,KAAK,QAAQ;oBACf,CAAC,CAAC,qBAAqB;oBACvB,CAAC,CAAC,kBAAkB,CAAC;YAC3B,OAAO,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE;gBAC3F,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAqDD,0DAA0D;AAC1D,SAAS,SAAS,CAAC,IAAsB;IACvC,OAAO,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAIX,CAAC;IACF,OAAO,CACL,GAAG,CAAC,IAAI,KAAK,WAAW;QACxB,GAAG,CAAC,IAAI,KAAK,UAAU;QACvB,GAAG,CAAC,IAAI,KAAK,WAAW;QACxB,GAAG,CAAC,SAAS,EAAE,cAAc,KAAK,GAAG,CACtC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,WAAW,CAAC,IAAa;IACtC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,KAAK,GAAG,IAGb,CAAC;IACF,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,UAAU,EAAE,CAAC;QACrD,OAAO,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,UAAU,EAAE,CAAC;QACtD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAA8B,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAmB,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — SupabaseStorageDriver (submodule `@streetjs/storage/supabase`).
|
|
3
|
+
*
|
|
4
|
+
* Supabase Storage is **not** an S3-wire-compatible provider — its SDK exposes a
|
|
5
|
+
* bucket-scoped file API (`storage.from(bucket).upload/download/remove/list/info`)
|
|
6
|
+
* rather than the `putObject`/`getObject` verbs the S3-style base is built on. So,
|
|
7
|
+
* unlike `s3.ts`/`r2.ts`/`minio.ts`/`backblaze.ts`, this driver does **not**
|
|
8
|
+
* extend the shared S3 base ({@link ../drivers/s3-base}); it maps the
|
|
9
|
+
* {@link StorageDriver} contract directly onto a purpose-built structural
|
|
10
|
+
* {@link SupabaseStorageClientLike} that mirrors just the Supabase Storage calls
|
|
11
|
+
* it needs.
|
|
12
|
+
*
|
|
13
|
+
* ## Two ways to obtain a driver
|
|
14
|
+
*
|
|
15
|
+
* - {@link createSupabaseStorageDriver} wraps an **already-constructed,
|
|
16
|
+
* injected** {@link SupabaseStorageClientLike} and returns a driver
|
|
17
|
+
* synchronously. This is the SDK-free path: no provider SDK is touched, so it
|
|
18
|
+
* is fully testable with an in-memory fake and needs no `@supabase/supabase-js`
|
|
19
|
+
* install.
|
|
20
|
+
* - {@link connectSupabaseStorageDriver} **builds its own client** from Supabase
|
|
21
|
+
* connection config. It resolves `@supabase/supabase-js` through a **lazy
|
|
22
|
+
* dynamic `import()` performed inside the function** (never at module top
|
|
23
|
+
* level), so the optional peer dependency is only required when this path is
|
|
24
|
+
* actually used. If the SDK is not installed and no client was injected, it
|
|
25
|
+
* throws {@link StorageConfigError} (provider `"supabase"`, Requirement 1.5).
|
|
26
|
+
*
|
|
27
|
+
* ## Capability delegation (Requirement 2.3)
|
|
28
|
+
*
|
|
29
|
+
* The driver implements only the **mandatory primitives** (`put`/`get`/`exists`/
|
|
30
|
+
* `delete`/`stat`/`list`/`putStream`/`getStream`), producing every
|
|
31
|
+
* {@link StorageObjectMetadata} through the shared metadata layer
|
|
32
|
+
* ({@link buildObjectMetadata}) so the field set is identical to Memory/Local/S3,
|
|
33
|
+
* and reporting a missing key consistently ({@link MaybeObject} `{ found: false }`
|
|
34
|
+
* for `get`, `null` for `stat`, {@link NotFoundError} for `getStream`). Advanced
|
|
35
|
+
* capabilities (`multipart`/`resumable`/`versioning`/`signedUrl`/`lifecycle`) are
|
|
36
|
+
* intentionally left `undefined` so the facade simulates them over the
|
|
37
|
+
* primitives, keeping behavior identical across providers.
|
|
38
|
+
*
|
|
39
|
+
* ## SDK isolation (Requirements 2.1, 3.3)
|
|
40
|
+
*
|
|
41
|
+
* This module imports **no provider SDK at the top level** — only Node built-ins,
|
|
42
|
+
* `streetjs` (for the injected {@link Clock}), and this package's own type
|
|
43
|
+
* surface. `@supabase/supabase-js` is referenced solely via a dynamic `import()`
|
|
44
|
+
* with a non-literal specifier inside {@link connectSupabaseStorageDriver}, so
|
|
45
|
+
* `tsc` never requires the SDK to be present and `streetjs` stays the only
|
|
46
|
+
* runtime dependency. This driver is a submodule-only export
|
|
47
|
+
* (`./supabase` → `dist/drivers/supabase.js`); it is intentionally not
|
|
48
|
+
* re-exported from the package's main `index.ts`.
|
|
49
|
+
*
|
|
50
|
+
* _Requirements: 2.1, 2.3, 3.3_
|
|
51
|
+
*/
|
|
52
|
+
import { type Clock } from "streetjs";
|
|
53
|
+
import type { MaybeObject, NodeReadable, StorageDriver } from "../driver.js";
|
|
54
|
+
import type { ListOptions, StorageListItem, StorageObjectMetadata, WriteMetadata } from "../types.js";
|
|
55
|
+
/** Input to {@link SupabaseStorageClientLike.upload}. */
|
|
56
|
+
export interface SupabaseUploadInput {
|
|
57
|
+
/** The object path (key) within the bucket. */
|
|
58
|
+
readonly path: string;
|
|
59
|
+
/** The bytes to store. */
|
|
60
|
+
readonly body: Uint8Array;
|
|
61
|
+
/** Declared content type, mapped to Supabase's `contentType` upload option. */
|
|
62
|
+
readonly contentType?: string;
|
|
63
|
+
/** Custom metadata (string→string) to persist; used to round-trip the field set. */
|
|
64
|
+
readonly metadata?: Record<string, string>;
|
|
65
|
+
/** Whether to overwrite an existing object at `path` (Supabase `upsert`). */
|
|
66
|
+
readonly upsert?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** Result of {@link SupabaseStorageClientLike.upload}. */
|
|
69
|
+
export interface SupabaseUploadResult {
|
|
70
|
+
/** The object's entity tag, when the service returns one. */
|
|
71
|
+
readonly etag?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Object attributes as surfaced by Supabase Storage (`info(path)` / `list`
|
|
75
|
+
* entries). Every field is optional and loosely typed because Supabase returns
|
|
76
|
+
* timestamps as ISO-8601 strings and nests size/mimetype/user metadata under a
|
|
77
|
+
* `metadata` map; the driver normalizes them. Caller-supplied user metadata lives
|
|
78
|
+
* under the nested {@link userMetadata} map (Supabase's custom "metadata").
|
|
79
|
+
*/
|
|
80
|
+
export interface SupabaseObjectInfo {
|
|
81
|
+
/** Byte length. Supabase may return this as a number or numeric string. */
|
|
82
|
+
readonly size?: number | string;
|
|
83
|
+
/** Declared content type / mimetype. */
|
|
84
|
+
readonly contentType?: string;
|
|
85
|
+
/** Entity tag, when present. */
|
|
86
|
+
readonly etag?: string;
|
|
87
|
+
/** Creation time as an ISO-8601 string. */
|
|
88
|
+
readonly createdAt?: string;
|
|
89
|
+
/** Last-updated time as an ISO-8601 string. */
|
|
90
|
+
readonly updatedAt?: string;
|
|
91
|
+
/** Caller-supplied custom metadata (string→string). */
|
|
92
|
+
readonly userMetadata?: Record<string, string>;
|
|
93
|
+
}
|
|
94
|
+
/** A single object entry returned by {@link SupabaseStorageClientLike.list}. */
|
|
95
|
+
export interface SupabaseListEntry {
|
|
96
|
+
/** The object path (full key). */
|
|
97
|
+
readonly name: string;
|
|
98
|
+
/** Byte length of the object, when the listing includes it. */
|
|
99
|
+
readonly size?: number | string;
|
|
100
|
+
/** Last-updated time as an ISO-8601 string, when the listing includes it. */
|
|
101
|
+
readonly updatedAt?: string;
|
|
102
|
+
}
|
|
103
|
+
/** Options accepted by {@link SupabaseStorageClientLike.list}. */
|
|
104
|
+
export interface SupabaseListInput {
|
|
105
|
+
/** Only list objects whose path begins with this prefix. */
|
|
106
|
+
readonly prefix: string;
|
|
107
|
+
/** Best-effort maximum number of results the caller wants. */
|
|
108
|
+
readonly limit?: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The **minimal, bucket-scoped structural interface** this driver depends on.
|
|
112
|
+
*
|
|
113
|
+
* It describes just the Supabase Storage operations the driver needs — never any
|
|
114
|
+
* concrete `@supabase/supabase-js` type — so the SDK stays an optional peer
|
|
115
|
+
* concern of the consumer (Requirement 3.1). `download`/`info` return `null` for
|
|
116
|
+
* a missing object so not-found maps to the contract's consistent semantics
|
|
117
|
+
* rather than a thrown error.
|
|
118
|
+
*/
|
|
119
|
+
export interface SupabaseStorageClientLike {
|
|
120
|
+
/** Store `body` under `path` with optional content type and custom metadata. */
|
|
121
|
+
upload(input: SupabaseUploadInput): Promise<SupabaseUploadResult>;
|
|
122
|
+
/** Download the object's bytes, or `null` when it does not exist. */
|
|
123
|
+
download(path: string): Promise<Uint8Array | null>;
|
|
124
|
+
/** Remove the object at `path` (a no-op when it is already absent). */
|
|
125
|
+
remove(path: string): Promise<void>;
|
|
126
|
+
/** Report whether an object exists at `path`. */
|
|
127
|
+
exists(path: string): Promise<boolean>;
|
|
128
|
+
/** Fetch the object's attributes, or `null` when it does not exist. */
|
|
129
|
+
info(path: string): Promise<SupabaseObjectInfo | null>;
|
|
130
|
+
/** List objects whose path begins with `input.prefix`. */
|
|
131
|
+
list(input: SupabaseListInput): Promise<readonly SupabaseListEntry[]>;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Options for the Supabase driver. The provider name is fixed to `"supabase"`
|
|
135
|
+
* and is not caller-configurable, so provider identity stays stable.
|
|
136
|
+
*/
|
|
137
|
+
export interface SupabaseStorageDriverOptions {
|
|
138
|
+
/** Injected clock for deterministic timestamps in tests. Default `systemClock`. */
|
|
139
|
+
readonly clock?: Clock;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Maps the {@link StorageDriver} contract onto an injected
|
|
143
|
+
* {@link SupabaseStorageClientLike}.
|
|
144
|
+
*
|
|
145
|
+
* Object identity fields (`etag`/`checksum`/`size`) and timestamps are computed
|
|
146
|
+
* locally at write time — the checksum/etag are the sha-256 hex digest of the
|
|
147
|
+
* stored bytes, the size is the byte length, and timestamps come from the
|
|
148
|
+
* injected {@link Clock} — then encoded into the object's custom metadata so they
|
|
149
|
+
* round-trip on read. Advanced capabilities are left `undefined` for facade
|
|
150
|
+
* simulation.
|
|
151
|
+
*/
|
|
152
|
+
export declare class SupabaseStorageDriver implements StorageDriver {
|
|
153
|
+
/** Stable driver name. */
|
|
154
|
+
readonly name = "supabase";
|
|
155
|
+
private readonly client;
|
|
156
|
+
private readonly clock;
|
|
157
|
+
constructor(client: SupabaseStorageClientLike, options?: SupabaseStorageDriverOptions);
|
|
158
|
+
/**
|
|
159
|
+
* Store `bytes` under `key`, computing size and sha-256 checksum locally and
|
|
160
|
+
* taking timestamps from the injected clock. When overwriting, the original
|
|
161
|
+
* `createdAt` is preserved (a preceding attribute read). The typed metadata is
|
|
162
|
+
* encoded into the object's custom-metadata map so it round-trips on read
|
|
163
|
+
* (Requirements 4.1, 10.1, 10.2).
|
|
164
|
+
*/
|
|
165
|
+
put(key: string, bytes: Uint8Array, metadata: WriteMetadata): Promise<StorageObjectMetadata>;
|
|
166
|
+
/**
|
|
167
|
+
* Read the object at `key`, returning a discriminated {@link MaybeObject} so
|
|
168
|
+
* absence is reported rather than thrown (Requirements 4.2, 2.4). Metadata is
|
|
169
|
+
* rebuilt from the object's attributes and encoded custom metadata via the
|
|
170
|
+
* shared metadata layer.
|
|
171
|
+
*/
|
|
172
|
+
get(key: string): Promise<MaybeObject>;
|
|
173
|
+
/** Report whether an object is stored under `key` (Requirement 4.3). */
|
|
174
|
+
exists(key: string): Promise<boolean>;
|
|
175
|
+
/** Delete the object at `key`; deleting a missing key is a no-op (Requirement 4.4). */
|
|
176
|
+
delete(key: string): Promise<void>;
|
|
177
|
+
/**
|
|
178
|
+
* Return the metadata for `key` without its content, or `null` when absent
|
|
179
|
+
* (Requirement 4.10).
|
|
180
|
+
*/
|
|
181
|
+
stat(key: string): Promise<StorageObjectMetadata | null>;
|
|
182
|
+
/**
|
|
183
|
+
* List objects whose key begins with `prefix`, sorted by key for deterministic
|
|
184
|
+
* ordering (Requirement 4.9). Honors optional `cursor` (exclusive resume
|
|
185
|
+
* point) and `limit`.
|
|
186
|
+
*/
|
|
187
|
+
list(prefix: string, options?: ListOptions): Promise<StorageListItem[]>;
|
|
188
|
+
/**
|
|
189
|
+
* Consume a Node {@link Readable} and persist the assembled bytes under `key`
|
|
190
|
+
* with the same computed metadata as {@link put} (Requirement 5.1). Chunks are
|
|
191
|
+
* drained through a `pipeline` (correct backpressure and error propagation),
|
|
192
|
+
* then handed to {@link put}.
|
|
193
|
+
*/
|
|
194
|
+
putStream(key: string, stream: NodeReadable, metadata: WriteMetadata): Promise<StorageObjectMetadata>;
|
|
195
|
+
/**
|
|
196
|
+
* Return a Node {@link Readable} of the stored bytes at `key` (Requirement
|
|
197
|
+
* 5.2). Throws {@link NotFoundError} for a missing key (Requirement 5.5).
|
|
198
|
+
*/
|
|
199
|
+
getStream(key: string): Promise<NodeReadable>;
|
|
200
|
+
/**
|
|
201
|
+
* Rebuild the typed {@link StorageObjectMetadata} field set from the object's
|
|
202
|
+
* attributes and the encoded custom-metadata map, applying the shared layer's
|
|
203
|
+
* canonical defaults. Provider-supplied values are used as best-effort
|
|
204
|
+
* fallbacks when the encoded fields are absent (e.g. an object written outside
|
|
205
|
+
* this driver): `etag`/`createdAt`/`updatedAt` back-fill the identity/timestamp
|
|
206
|
+
* fields, keeping the shape consistent across providers.
|
|
207
|
+
*/
|
|
208
|
+
private decodeMeta;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Wrap an injected {@link SupabaseStorageClientLike} as a Supabase driver.
|
|
212
|
+
* Synchronous and SDK-free: the caller supplies the client, so no provider SDK
|
|
213
|
+
* is resolved here.
|
|
214
|
+
*
|
|
215
|
+
* @throws {StorageConfigError} when no client is injected — use
|
|
216
|
+
* {@link connectSupabaseStorageDriver} to build a client from connection
|
|
217
|
+
* options instead.
|
|
218
|
+
*/
|
|
219
|
+
export declare function createSupabaseStorageDriver(client: SupabaseStorageClientLike, options?: SupabaseStorageDriverOptions): StorageDriver;
|
|
220
|
+
/**
|
|
221
|
+
* Connection configuration for {@link connectSupabaseStorageDriver}. `url` and
|
|
222
|
+
* `key` are forwarded to `createClient`; `bucket` scopes the resulting storage
|
|
223
|
+
* client.
|
|
224
|
+
*/
|
|
225
|
+
export interface SupabaseStorageConfig extends SupabaseStorageDriverOptions {
|
|
226
|
+
/** The Supabase project URL (required). */
|
|
227
|
+
readonly url: string;
|
|
228
|
+
/** The Supabase API key — service-role or anon (required). */
|
|
229
|
+
readonly key: string;
|
|
230
|
+
/** The Supabase Storage bucket the driver operates within (required). */
|
|
231
|
+
readonly bucket: string;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Build a Supabase driver that owns its client, resolving `@supabase/supabase-js`
|
|
235
|
+
* lazily.
|
|
236
|
+
*
|
|
237
|
+
* The SDK is loaded through a dynamic `import()` with a non-literal specifier so
|
|
238
|
+
* it is never a static/top-level dependency: `tsc` does not require it to be
|
|
239
|
+
* installed, and it is only resolved when this function runs. When the SDK
|
|
240
|
+
* cannot be resolved, a {@link StorageConfigError} is thrown (Requirement 1.5) —
|
|
241
|
+
* callers that cannot install the SDK should use
|
|
242
|
+
* {@link createSupabaseStorageDriver} with their own
|
|
243
|
+
* {@link SupabaseStorageClientLike} instead.
|
|
244
|
+
*/
|
|
245
|
+
export declare function connectSupabaseStorageDriver(config: SupabaseStorageConfig): Promise<StorageDriver>;
|
|
246
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/drivers/supabase.ts"],"names":[],"mappings":"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"}
|