@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,502 @@
|
|
|
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 { createHash } from "node:crypto";
|
|
53
|
+
import { Readable, Writable } from "node:stream";
|
|
54
|
+
import { pipeline } from "node:stream/promises";
|
|
55
|
+
import { systemClock } from "streetjs";
|
|
56
|
+
import { NotFoundError, StorageConfigError } from "../errors.js";
|
|
57
|
+
import { buildObjectMetadata } from "../metadata.js";
|
|
58
|
+
/** The stable driver name surfaced as {@link StorageDriver.name} for Supabase. */
|
|
59
|
+
const SUPABASE_DRIVER_NAME = "supabase";
|
|
60
|
+
// ── Reserved user-metadata keys ────────────────────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* Reserved custom-metadata keys used to round-trip the typed metadata field set
|
|
63
|
+
* through Supabase's string→string custom-metadata map. Prefixed so they never
|
|
64
|
+
* collide with a caller's own custom fields.
|
|
65
|
+
*/
|
|
66
|
+
const MK = {
|
|
67
|
+
checksum: "x-street-checksum",
|
|
68
|
+
createdAt: "x-street-created-at",
|
|
69
|
+
updatedAt: "x-street-updated-at",
|
|
70
|
+
owner: "x-street-owner",
|
|
71
|
+
tenant: "x-street-tenant",
|
|
72
|
+
accessLevel: "x-street-access-level",
|
|
73
|
+
custom: "x-street-custom",
|
|
74
|
+
};
|
|
75
|
+
// ── The Supabase driver ─────────────────────────────────────────────────────────
|
|
76
|
+
/**
|
|
77
|
+
* Maps the {@link StorageDriver} contract onto an injected
|
|
78
|
+
* {@link SupabaseStorageClientLike}.
|
|
79
|
+
*
|
|
80
|
+
* Object identity fields (`etag`/`checksum`/`size`) and timestamps are computed
|
|
81
|
+
* locally at write time — the checksum/etag are the sha-256 hex digest of the
|
|
82
|
+
* stored bytes, the size is the byte length, and timestamps come from the
|
|
83
|
+
* injected {@link Clock} — then encoded into the object's custom metadata so they
|
|
84
|
+
* round-trip on read. Advanced capabilities are left `undefined` for facade
|
|
85
|
+
* simulation.
|
|
86
|
+
*/
|
|
87
|
+
export class SupabaseStorageDriver {
|
|
88
|
+
/** Stable driver name. */
|
|
89
|
+
name = SUPABASE_DRIVER_NAME;
|
|
90
|
+
client;
|
|
91
|
+
clock;
|
|
92
|
+
constructor(client, options = {}) {
|
|
93
|
+
this.client = client;
|
|
94
|
+
this.clock = options.clock ?? systemClock;
|
|
95
|
+
}
|
|
96
|
+
// ── Mandatory primitives ──────────────────────────────────────────────────
|
|
97
|
+
/**
|
|
98
|
+
* Store `bytes` under `key`, computing size and sha-256 checksum locally and
|
|
99
|
+
* taking timestamps from the injected clock. When overwriting, the original
|
|
100
|
+
* `createdAt` is preserved (a preceding attribute read). The typed metadata is
|
|
101
|
+
* encoded into the object's custom-metadata map so it round-trips on read
|
|
102
|
+
* (Requirements 4.1, 10.1, 10.2).
|
|
103
|
+
*/
|
|
104
|
+
async put(key, bytes, metadata) {
|
|
105
|
+
const stored = bytes.slice();
|
|
106
|
+
const checksum = sha256Hex(stored);
|
|
107
|
+
const now = this.clock();
|
|
108
|
+
const existing = await this.stat(key);
|
|
109
|
+
const objectMetadata = buildObjectMetadata({
|
|
110
|
+
key,
|
|
111
|
+
size: stored.byteLength,
|
|
112
|
+
checksum,
|
|
113
|
+
createdAt: existing?.createdAt ?? now,
|
|
114
|
+
updatedAt: now,
|
|
115
|
+
write: metadata,
|
|
116
|
+
});
|
|
117
|
+
await this.client.upload({
|
|
118
|
+
path: key,
|
|
119
|
+
body: stored,
|
|
120
|
+
contentType: objectMetadata.contentType,
|
|
121
|
+
metadata: encodeUserMetadata(objectMetadata),
|
|
122
|
+
upsert: true,
|
|
123
|
+
});
|
|
124
|
+
return objectMetadata;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Read the object at `key`, returning a discriminated {@link MaybeObject} so
|
|
128
|
+
* absence is reported rather than thrown (Requirements 4.2, 2.4). Metadata is
|
|
129
|
+
* rebuilt from the object's attributes and encoded custom metadata via the
|
|
130
|
+
* shared metadata layer.
|
|
131
|
+
*/
|
|
132
|
+
async get(key) {
|
|
133
|
+
const bytes = await this.client.download(key);
|
|
134
|
+
if (bytes === null) {
|
|
135
|
+
return { found: false };
|
|
136
|
+
}
|
|
137
|
+
const info = await this.client.info(key);
|
|
138
|
+
const metadata = this.decodeMeta(key, bytes.byteLength, info);
|
|
139
|
+
return { found: true, bytes: bytes.slice(), metadata };
|
|
140
|
+
}
|
|
141
|
+
/** Report whether an object is stored under `key` (Requirement 4.3). */
|
|
142
|
+
async exists(key) {
|
|
143
|
+
return this.client.exists(key);
|
|
144
|
+
}
|
|
145
|
+
/** Delete the object at `key`; deleting a missing key is a no-op (Requirement 4.4). */
|
|
146
|
+
async delete(key) {
|
|
147
|
+
await this.client.remove(key);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Return the metadata for `key` without its content, or `null` when absent
|
|
151
|
+
* (Requirement 4.10).
|
|
152
|
+
*/
|
|
153
|
+
async stat(key) {
|
|
154
|
+
const info = await this.client.info(key);
|
|
155
|
+
if (info === null) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
const size = parseSize(info.size);
|
|
159
|
+
return this.decodeMeta(key, size, info);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* List objects whose key begins with `prefix`, sorted by key for deterministic
|
|
163
|
+
* ordering (Requirement 4.9). Honors optional `cursor` (exclusive resume
|
|
164
|
+
* point) and `limit`.
|
|
165
|
+
*/
|
|
166
|
+
async list(prefix, options) {
|
|
167
|
+
const entries = await this.client.list({ prefix, limit: options?.limit });
|
|
168
|
+
let items = entries
|
|
169
|
+
.filter((entry) => typeof entry.name === "string")
|
|
170
|
+
.map((entry) => ({
|
|
171
|
+
key: entry.name,
|
|
172
|
+
size: parseSize(entry.size),
|
|
173
|
+
updatedAt: parseIso(entry.updatedAt) ?? 0,
|
|
174
|
+
}))
|
|
175
|
+
.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
176
|
+
const cursor = options?.cursor;
|
|
177
|
+
if (cursor !== undefined) {
|
|
178
|
+
items = items.filter((item) => item.key > cursor);
|
|
179
|
+
}
|
|
180
|
+
return typeof options?.limit === "number" ? items.slice(0, options.limit) : items;
|
|
181
|
+
}
|
|
182
|
+
// ── Streaming ───────────────────────────────────────────────────────────────
|
|
183
|
+
/**
|
|
184
|
+
* Consume a Node {@link Readable} and persist the assembled bytes under `key`
|
|
185
|
+
* with the same computed metadata as {@link put} (Requirement 5.1). Chunks are
|
|
186
|
+
* drained through a `pipeline` (correct backpressure and error propagation),
|
|
187
|
+
* then handed to {@link put}.
|
|
188
|
+
*/
|
|
189
|
+
async putStream(key, stream, metadata) {
|
|
190
|
+
const chunks = [];
|
|
191
|
+
const collector = new Writable({
|
|
192
|
+
write(chunk, _encoding, callback) {
|
|
193
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
194
|
+
callback();
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
await pipeline(stream, collector);
|
|
198
|
+
return this.put(key, new Uint8Array(Buffer.concat(chunks)), metadata);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Return a Node {@link Readable} of the stored bytes at `key` (Requirement
|
|
202
|
+
* 5.2). Throws {@link NotFoundError} for a missing key (Requirement 5.5).
|
|
203
|
+
*/
|
|
204
|
+
async getStream(key) {
|
|
205
|
+
const bytes = await this.client.download(key);
|
|
206
|
+
if (bytes === null) {
|
|
207
|
+
throw new NotFoundError(key);
|
|
208
|
+
}
|
|
209
|
+
return Readable.from([Buffer.from(bytes)]);
|
|
210
|
+
}
|
|
211
|
+
// ── Internal helpers ──────────────────────────────────────────────────────
|
|
212
|
+
/**
|
|
213
|
+
* Rebuild the typed {@link StorageObjectMetadata} field set from the object's
|
|
214
|
+
* attributes and the encoded custom-metadata map, applying the shared layer's
|
|
215
|
+
* canonical defaults. Provider-supplied values are used as best-effort
|
|
216
|
+
* fallbacks when the encoded fields are absent (e.g. an object written outside
|
|
217
|
+
* this driver): `etag`/`createdAt`/`updatedAt` back-fill the identity/timestamp
|
|
218
|
+
* fields, keeping the shape consistent across providers.
|
|
219
|
+
*/
|
|
220
|
+
decodeMeta(key, size, info) {
|
|
221
|
+
const attrs = info ?? {};
|
|
222
|
+
const um = attrs.userMetadata ?? {};
|
|
223
|
+
const now = this.clock();
|
|
224
|
+
const checksum = um[MK.checksum] ?? attrs.etag ?? "";
|
|
225
|
+
const createdAt = parseEpoch(um[MK.createdAt]) ?? parseIso(attrs.createdAt) ?? now;
|
|
226
|
+
const updatedAt = parseEpoch(um[MK.updatedAt]) ?? parseIso(attrs.updatedAt) ?? createdAt;
|
|
227
|
+
const write = {
|
|
228
|
+
contentType: attrs.contentType,
|
|
229
|
+
owner: um[MK.owner],
|
|
230
|
+
tenant: um[MK.tenant],
|
|
231
|
+
accessLevel: decodeAccessLevel(um[MK.accessLevel]),
|
|
232
|
+
custom: parseCustom(um[MK.custom]),
|
|
233
|
+
};
|
|
234
|
+
return buildObjectMetadata({
|
|
235
|
+
key,
|
|
236
|
+
size,
|
|
237
|
+
checksum,
|
|
238
|
+
etag: attrs.etag ?? checksum,
|
|
239
|
+
createdAt,
|
|
240
|
+
updatedAt,
|
|
241
|
+
write,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Wrap an injected {@link SupabaseStorageClientLike} as a Supabase driver.
|
|
247
|
+
* Synchronous and SDK-free: the caller supplies the client, so no provider SDK
|
|
248
|
+
* is resolved here.
|
|
249
|
+
*
|
|
250
|
+
* @throws {StorageConfigError} when no client is injected — use
|
|
251
|
+
* {@link connectSupabaseStorageDriver} to build a client from connection
|
|
252
|
+
* options instead.
|
|
253
|
+
*/
|
|
254
|
+
export function createSupabaseStorageDriver(client, options = {}) {
|
|
255
|
+
if (client === undefined || client === null) {
|
|
256
|
+
throw new StorageConfigError("createSupabaseStorageDriver requires an injected SupabaseStorageClientLike. " +
|
|
257
|
+
"Pass a structural client, or use connectSupabaseStorageDriver(config) " +
|
|
258
|
+
"to build one from a bucket using the optional '@supabase/supabase-js' peer dependency.", { provider: SUPABASE_DRIVER_NAME });
|
|
259
|
+
}
|
|
260
|
+
return new SupabaseStorageDriver(client, options);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Build a Supabase driver that owns its client, resolving `@supabase/supabase-js`
|
|
264
|
+
* lazily.
|
|
265
|
+
*
|
|
266
|
+
* The SDK is loaded through a dynamic `import()` with a non-literal specifier so
|
|
267
|
+
* it is never a static/top-level dependency: `tsc` does not require it to be
|
|
268
|
+
* installed, and it is only resolved when this function runs. When the SDK
|
|
269
|
+
* cannot be resolved, a {@link StorageConfigError} is thrown (Requirement 1.5) —
|
|
270
|
+
* callers that cannot install the SDK should use
|
|
271
|
+
* {@link createSupabaseStorageDriver} with their own
|
|
272
|
+
* {@link SupabaseStorageClientLike} instead.
|
|
273
|
+
*/
|
|
274
|
+
export async function connectSupabaseStorageDriver(config) {
|
|
275
|
+
if (!config.url || !config.key || !config.bucket) {
|
|
276
|
+
throw new StorageConfigError("Supabase driver requires url, key, and bucket.", { provider: SUPABASE_DRIVER_NAME });
|
|
277
|
+
}
|
|
278
|
+
// Lazy, non-literal dynamic import so the Supabase SDK stays an optional peer
|
|
279
|
+
// that `tsc` never resolves statically and Node only loads on this path.
|
|
280
|
+
const specifier = "@supabase/supabase-js";
|
|
281
|
+
let sdk;
|
|
282
|
+
try {
|
|
283
|
+
sdk = (await import(specifier));
|
|
284
|
+
}
|
|
285
|
+
catch (cause) {
|
|
286
|
+
throw new StorageConfigError('Supabase driver requires the optional peer dependency "@supabase/supabase-js". ' +
|
|
287
|
+
"Install it, or inject your own SupabaseStorageClientLike via createSupabaseStorageDriver().", { provider: SUPABASE_DRIVER_NAME, cause });
|
|
288
|
+
}
|
|
289
|
+
let bucketApi;
|
|
290
|
+
try {
|
|
291
|
+
const supabase = sdk.createClient(config.url, config.key);
|
|
292
|
+
bucketApi = supabase.storage.from(config.bucket);
|
|
293
|
+
}
|
|
294
|
+
catch (cause) {
|
|
295
|
+
throw new StorageConfigError(`Failed to construct a Supabase Storage client for bucket "${config.bucket}".`, { provider: SUPABASE_DRIVER_NAME, cause });
|
|
296
|
+
}
|
|
297
|
+
const client = adaptSupabaseBucketApi(bucketApi);
|
|
298
|
+
return createSupabaseStorageDriver(client, { clock: config.clock });
|
|
299
|
+
}
|
|
300
|
+
// ── SDK → SupabaseStorageClientLike adapter ────────────────────────────────────
|
|
301
|
+
/**
|
|
302
|
+
* Adapt a `@supabase/supabase-js` storage bucket API into the structural
|
|
303
|
+
* {@link SupabaseStorageClientLike} this driver consumes. Only the methods the
|
|
304
|
+
* driver uses are mapped; the SDK's `{ data, error }` envelopes are narrowed
|
|
305
|
+
* through the local structural types below so this module never imports concrete
|
|
306
|
+
* SDK types. A missing object is mapped to `null` so not-found semantics stay
|
|
307
|
+
* consistent.
|
|
308
|
+
*/
|
|
309
|
+
function adaptSupabaseBucketApi(api) {
|
|
310
|
+
return {
|
|
311
|
+
async upload(input) {
|
|
312
|
+
const { error } = await api.upload(input.path, Buffer.from(input.body), {
|
|
313
|
+
contentType: input.contentType,
|
|
314
|
+
upsert: input.upsert ?? true,
|
|
315
|
+
metadata: input.metadata,
|
|
316
|
+
});
|
|
317
|
+
if (error) {
|
|
318
|
+
throw asError(error);
|
|
319
|
+
}
|
|
320
|
+
return {};
|
|
321
|
+
},
|
|
322
|
+
async download(path) {
|
|
323
|
+
const { data, error } = await api.download(path);
|
|
324
|
+
if (error) {
|
|
325
|
+
if (isNotFound(error)) {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
throw asError(error);
|
|
329
|
+
}
|
|
330
|
+
if (data === null || data === undefined) {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
const buffer = await data.arrayBuffer();
|
|
334
|
+
return new Uint8Array(buffer);
|
|
335
|
+
},
|
|
336
|
+
async remove(path) {
|
|
337
|
+
const { error } = await api.remove([path]);
|
|
338
|
+
if (error && !isNotFound(error)) {
|
|
339
|
+
throw asError(error);
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
async exists(path) {
|
|
343
|
+
const { data, error } = await api.download(path);
|
|
344
|
+
if (error) {
|
|
345
|
+
if (isNotFound(error)) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
throw asError(error);
|
|
349
|
+
}
|
|
350
|
+
return data !== null && data !== undefined;
|
|
351
|
+
},
|
|
352
|
+
async info(path) {
|
|
353
|
+
const { data, error } = await api.info(path);
|
|
354
|
+
if (error) {
|
|
355
|
+
if (isNotFound(error)) {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
throw asError(error);
|
|
359
|
+
}
|
|
360
|
+
if (data === null || data === undefined) {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
const meta = data.metadata ?? {};
|
|
364
|
+
return {
|
|
365
|
+
size: data.size ?? meta.size,
|
|
366
|
+
contentType: data.contentType ?? meta.mimetype,
|
|
367
|
+
etag: data.etag ?? meta.eTag,
|
|
368
|
+
createdAt: data.created_at,
|
|
369
|
+
updatedAt: data.updated_at,
|
|
370
|
+
userMetadata: data.userMetadata,
|
|
371
|
+
};
|
|
372
|
+
},
|
|
373
|
+
async list(input) {
|
|
374
|
+
const { data, error } = await api.list(input.prefix, { limit: input.limit });
|
|
375
|
+
if (error) {
|
|
376
|
+
throw asError(error);
|
|
377
|
+
}
|
|
378
|
+
const rows = data ?? [];
|
|
379
|
+
return rows.map((row) => {
|
|
380
|
+
const meta = row.metadata ?? {};
|
|
381
|
+
return {
|
|
382
|
+
name: row.name,
|
|
383
|
+
size: meta.size,
|
|
384
|
+
updatedAt: row.updated_at,
|
|
385
|
+
};
|
|
386
|
+
});
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Recognize the Supabase "object does not exist" condition so
|
|
392
|
+
* `download`/`info`/`remove` can map to `null`/no-op rather than throwing.
|
|
393
|
+
* Supabase surfaces a `statusCode`/`status` of `404` or a `"not_found"` code.
|
|
394
|
+
*/
|
|
395
|
+
function isNotFound(error) {
|
|
396
|
+
if (error === null || typeof error !== "object") {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
const candidate = error;
|
|
400
|
+
const statusCode = candidate.statusCode;
|
|
401
|
+
const status = candidate.status;
|
|
402
|
+
return (statusCode === 404 ||
|
|
403
|
+
statusCode === "404" ||
|
|
404
|
+
status === 404 ||
|
|
405
|
+
candidate.error === "not_found" ||
|
|
406
|
+
(typeof candidate.message === "string" && /not[_ ]?found/i.test(candidate.message)));
|
|
407
|
+
}
|
|
408
|
+
/** Coerce a Supabase `{ data, error }` error payload into an `Error`. */
|
|
409
|
+
function asError(error) {
|
|
410
|
+
if (error instanceof Error) {
|
|
411
|
+
return error;
|
|
412
|
+
}
|
|
413
|
+
if (error !== null && typeof error === "object") {
|
|
414
|
+
const message = error.message;
|
|
415
|
+
if (typeof message === "string") {
|
|
416
|
+
return new Error(message);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
return new Error(String(error));
|
|
420
|
+
}
|
|
421
|
+
// ── Module-private encoding helpers ────────────────────────────────────────────
|
|
422
|
+
/** Compute the lowercase sha-256 hex digest of `bytes`. */
|
|
423
|
+
function sha256Hex(bytes) {
|
|
424
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
425
|
+
}
|
|
426
|
+
/** Encode a built object's typed metadata into the Supabase custom-metadata map. */
|
|
427
|
+
function encodeUserMetadata(metadata) {
|
|
428
|
+
const map = {
|
|
429
|
+
[MK.checksum]: metadata.checksum,
|
|
430
|
+
[MK.createdAt]: String(metadata.createdAt),
|
|
431
|
+
[MK.updatedAt]: String(metadata.updatedAt),
|
|
432
|
+
[MK.accessLevel]: metadata.accessLevel,
|
|
433
|
+
[MK.custom]: JSON.stringify(metadata.custom ?? {}),
|
|
434
|
+
};
|
|
435
|
+
if (metadata.owner !== undefined) {
|
|
436
|
+
map[MK.owner] = metadata.owner;
|
|
437
|
+
}
|
|
438
|
+
if (metadata.tenant !== undefined) {
|
|
439
|
+
map[MK.tenant] = metadata.tenant;
|
|
440
|
+
}
|
|
441
|
+
return map;
|
|
442
|
+
}
|
|
443
|
+
/** Parse a Supabase `size` (number or numeric string), defaulting to `0`. */
|
|
444
|
+
function parseSize(value) {
|
|
445
|
+
if (typeof value === "number") {
|
|
446
|
+
return Number.isFinite(value) ? value : 0;
|
|
447
|
+
}
|
|
448
|
+
if (typeof value === "string") {
|
|
449
|
+
const parsed = Number(value);
|
|
450
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
451
|
+
}
|
|
452
|
+
return 0;
|
|
453
|
+
}
|
|
454
|
+
/** Parse an epoch-ms string, returning `undefined` when absent or non-numeric. */
|
|
455
|
+
function parseEpoch(value) {
|
|
456
|
+
if (value === undefined) {
|
|
457
|
+
return undefined;
|
|
458
|
+
}
|
|
459
|
+
const parsed = Number(value);
|
|
460
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
461
|
+
}
|
|
462
|
+
/** Parse an ISO-8601 timestamp to epoch ms, or `undefined`. */
|
|
463
|
+
function parseIso(value) {
|
|
464
|
+
if (value === undefined) {
|
|
465
|
+
return undefined;
|
|
466
|
+
}
|
|
467
|
+
const parsed = Date.parse(value);
|
|
468
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
469
|
+
}
|
|
470
|
+
/** Parse the encoded custom-field JSON, tolerating malformed values. */
|
|
471
|
+
function parseCustom(value) {
|
|
472
|
+
if (value === undefined) {
|
|
473
|
+
return {};
|
|
474
|
+
}
|
|
475
|
+
try {
|
|
476
|
+
const parsed = JSON.parse(value);
|
|
477
|
+
if (parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
478
|
+
return parsed;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
catch {
|
|
482
|
+
// Fall through to the empty default on malformed JSON.
|
|
483
|
+
}
|
|
484
|
+
return {};
|
|
485
|
+
}
|
|
486
|
+
/** The recognized access levels, used to validate the decoded value. */
|
|
487
|
+
const ACCESS_LEVELS = [
|
|
488
|
+
"public",
|
|
489
|
+
"private",
|
|
490
|
+
"signed",
|
|
491
|
+
"authenticated",
|
|
492
|
+
"role-based",
|
|
493
|
+
"tenant-aware",
|
|
494
|
+
];
|
|
495
|
+
/** Decode an access-level string, returning `undefined` for an unknown value. */
|
|
496
|
+
function decodeAccessLevel(value) {
|
|
497
|
+
if (value !== undefined && ACCESS_LEVELS.includes(value)) {
|
|
498
|
+
return value;
|
|
499
|
+
}
|
|
500
|
+
return undefined;
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/drivers/supabase.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — typed error hierarchy
|
|
3
|
+
*
|
|
4
|
+
* Every error thrown by the storage framework derives from {@link StorageError},
|
|
5
|
+
* so consumers can catch the whole family with a single `instanceof StorageError`
|
|
6
|
+
* check while still discriminating on concrete subclasses for specific handling.
|
|
7
|
+
*
|
|
8
|
+
* Each subclass carries descriptive, strongly typed fields appropriate to its
|
|
9
|
+
* purpose (the offending key, the validation message, the access context, the
|
|
10
|
+
* unsupported image source, etc.) and sets `this.name`. Because TypeScript emits
|
|
11
|
+
* to ES2022 with `Error` subclassing, we call `Object.setPrototypeOf` in every
|
|
12
|
+
* constructor to keep the prototype chain intact for `instanceof` under ESM/TS.
|
|
13
|
+
*
|
|
14
|
+
* _Requirements: 1.5, 5.5, 9.4, 11.3, 14.4_
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Base class for every error raised by `@streetjs/storage`.
|
|
18
|
+
*
|
|
19
|
+
* Catch this to handle any storage failure; narrow to a subclass for specific
|
|
20
|
+
* cases. Carries an optional `cause` (the underlying error, when this error
|
|
21
|
+
* wraps another) following the standard `Error` `cause` convention.
|
|
22
|
+
*/
|
|
23
|
+
export declare class StorageError extends Error {
|
|
24
|
+
/** The underlying error this error wraps, when applicable. */
|
|
25
|
+
readonly cause?: unknown;
|
|
26
|
+
constructor(message: string, options?: {
|
|
27
|
+
cause?: unknown;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Raised when `createStorage` (or another configuration step) receives an
|
|
32
|
+
* invalid or unusable configuration — for example an unknown provider name.
|
|
33
|
+
*
|
|
34
|
+
* Carries the optional `provider` that triggered the failure so callers can
|
|
35
|
+
* surface a precise, descriptive configuration error (Requirement 1.5).
|
|
36
|
+
*/
|
|
37
|
+
export declare class StorageConfigError extends StorageError {
|
|
38
|
+
/** The provider name (or other config value) that was rejected, if known. */
|
|
39
|
+
readonly provider?: string;
|
|
40
|
+
constructor(message: string, options?: {
|
|
41
|
+
provider?: string;
|
|
42
|
+
cause?: unknown;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Raised when an operation targets an object key that does not exist — for
|
|
47
|
+
* example `getStream` on a missing key (Requirement 5.5).
|
|
48
|
+
*
|
|
49
|
+
* Carries the offending `key` so callers know exactly which object was absent.
|
|
50
|
+
*/
|
|
51
|
+
export declare class NotFoundError extends StorageError {
|
|
52
|
+
/** The object key that was not found. */
|
|
53
|
+
readonly key: string;
|
|
54
|
+
constructor(key: string, message?: string, options?: {
|
|
55
|
+
cause?: unknown;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Raised when the validation pipeline rejects an upload before any content is
|
|
60
|
+
* persisted, leaving no partial object stored (Requirement 9.4).
|
|
61
|
+
*
|
|
62
|
+
* Carries the human-readable `validationError` text describing why the upload
|
|
63
|
+
* was rejected, plus the optional `key` the upload targeted.
|
|
64
|
+
*/
|
|
65
|
+
export declare class ValidationError extends StorageError {
|
|
66
|
+
/** The descriptive text explaining why validation failed. */
|
|
67
|
+
readonly validationError: string;
|
|
68
|
+
/** The object key the rejected upload targeted, when known. */
|
|
69
|
+
readonly key?: string;
|
|
70
|
+
constructor(validationError: string, options?: {
|
|
71
|
+
key?: string;
|
|
72
|
+
message?: string;
|
|
73
|
+
cause?: unknown;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Raised when a caller lacks the access required by an object's access level,
|
|
78
|
+
* denying the operation (Requirement 11.3).
|
|
79
|
+
*
|
|
80
|
+
* Carries the access context — the `key`, the attempted `operation`, and the
|
|
81
|
+
* object's `accessLevel` — so the denial can be logged and explained precisely.
|
|
82
|
+
*/
|
|
83
|
+
export declare class AuthorizationError extends StorageError {
|
|
84
|
+
/** The object key the denied operation targeted, when known. */
|
|
85
|
+
readonly key?: string;
|
|
86
|
+
/** The operation that was denied (e.g. "read", "write", "delete"). */
|
|
87
|
+
readonly operation?: string;
|
|
88
|
+
/** The access level that governed the denied object, when known. */
|
|
89
|
+
readonly accessLevel?: string;
|
|
90
|
+
constructor(message: string, options?: {
|
|
91
|
+
key?: string;
|
|
92
|
+
operation?: string;
|
|
93
|
+
accessLevel?: string;
|
|
94
|
+
cause?: unknown;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Raised when the image processor is asked to transform a source that is not a
|
|
99
|
+
* supported image format; the source object is left unmodified (Requirement 14.4).
|
|
100
|
+
*
|
|
101
|
+
* Carries the offending source `format` and/or `key` so the error precisely
|
|
102
|
+
* identifies what could not be processed.
|
|
103
|
+
*/
|
|
104
|
+
export declare class UnsupportedImageError extends StorageError {
|
|
105
|
+
/** The detected/declared source format that is not supported, when known. */
|
|
106
|
+
readonly format?: string;
|
|
107
|
+
/** The source object key that could not be processed, when known. */
|
|
108
|
+
readonly key?: string;
|
|
109
|
+
constructor(message: string, options?: {
|
|
110
|
+
format?: string;
|
|
111
|
+
key?: string;
|
|
112
|
+
cause?: unknown;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQ3D;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAEf,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAM9E;AAED;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAET,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAMzE;AAED;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;gBAGpB,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQhE;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,gEAAgE;IAChE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBAG5B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;CASJ;AAED;;;;;;GAMG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;gBAGpB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQ/D"}
|