@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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — the versioning manager.
|
|
3
|
+
*
|
|
4
|
+
* Versioning retains the prior content of an object whenever a versioned key is
|
|
5
|
+
* overwritten, so historical Versions can be listed, restored, and deleted
|
|
6
|
+
* (Requirement 12). {@link VersioningManager} provides this capability in a
|
|
7
|
+
* **provider-agnostic** way:
|
|
8
|
+
*
|
|
9
|
+
* - When the backing {@link StorageDriver} implements the optional native
|
|
10
|
+
* `versioning` capability, the manager delegates each operation to the driver
|
|
11
|
+
* so a provider with first-class versioning (e.g. S3 bucket versioning) is
|
|
12
|
+
* used directly.
|
|
13
|
+
* - Otherwise the manager **simulates** versioning over the mandatory driver
|
|
14
|
+
* primitives (`put`/`get`/`stat`/`list`/`delete`). Each snapshot copies the
|
|
15
|
+
* current object's bytes and write-time metadata to a reserved key
|
|
16
|
+
* `${VERSION_KEY_PREFIX}<key>/<versionId>` (mirroring the design's
|
|
17
|
+
* `.versions/<key>/<versionId>` layout). Versions are enumerated by listing
|
|
18
|
+
* that reserved prefix and restored/deleted by reading/removing the reserved
|
|
19
|
+
* copy. No cap is imposed on the number of retained Versions (Requirement
|
|
20
|
+
* 12.1).
|
|
21
|
+
*
|
|
22
|
+
* Semantics (Requirement 12):
|
|
23
|
+
* - {@link VersioningManager.snapshot} captures the current content of `key` as
|
|
24
|
+
* a new Version and returns its id, or `null` when there is nothing to
|
|
25
|
+
* snapshot (the key does not yet exist). Crucially, when the snapshot itself
|
|
26
|
+
* fails for any reason — a storage constraint or system error — it returns
|
|
27
|
+
* `null` **without throwing** so the caller's overwrite still proceeds without
|
|
28
|
+
* a Version being created (Requirement 12.5).
|
|
29
|
+
* - {@link VersioningManager.listVersions} returns the {@link VersionInfo}
|
|
30
|
+
* descriptors of the retained Versions for `key` (Requirement 12.2).
|
|
31
|
+
* - {@link VersioningManager.restoreVersion} makes the content of the identified
|
|
32
|
+
* Version the current object content and returns the resulting metadata
|
|
33
|
+
* (Requirement 12.3).
|
|
34
|
+
* - {@link VersioningManager.deleteVersion} removes exactly the identified
|
|
35
|
+
* Version while retaining the rest (Requirement 12.4).
|
|
36
|
+
*
|
|
37
|
+
* The module depends only on the driver contract, the shared type surface, the
|
|
38
|
+
* error hierarchy, the metadata layer, and `node:crypto`, keeping the
|
|
39
|
+
* dependency direction acyclic.
|
|
40
|
+
*
|
|
41
|
+
* _Requirements: 12.1, 12.2, 12.3, 12.4, 12.5_
|
|
42
|
+
*/
|
|
43
|
+
import type { StorageDriver } from "./driver.js";
|
|
44
|
+
import type { StorageObjectMetadata, VersionInfo } from "./types.js";
|
|
45
|
+
/**
|
|
46
|
+
* Provider-agnostic versioning manager built on the driver contract.
|
|
47
|
+
*
|
|
48
|
+
* A single instance is held by the facade and bound to one {@link StorageDriver}
|
|
49
|
+
* for its lifetime, so the native-vs-simulated decision (based on whether the
|
|
50
|
+
* driver exposes a `versioning` capability) is stable across every call.
|
|
51
|
+
*/
|
|
52
|
+
export declare class VersioningManager {
|
|
53
|
+
/** The driver every operation is delegated to or simulated over. */
|
|
54
|
+
private readonly driver;
|
|
55
|
+
constructor(driver: StorageDriver);
|
|
56
|
+
/** The driver's native versioning capability, when present. */
|
|
57
|
+
private get native();
|
|
58
|
+
/**
|
|
59
|
+
* Capture the current content of `key` as a new Version and return its id, or
|
|
60
|
+
* `null` when there is nothing to snapshot (the key does not exist yet).
|
|
61
|
+
*
|
|
62
|
+
* This is invoked by the facade immediately before an overwriting `put` when
|
|
63
|
+
* versioning is enabled. Per Requirement 12.5, a failure of the versioning
|
|
64
|
+
* mechanism must never block the overwrite: any error raised while reading the
|
|
65
|
+
* current object or persisting the snapshot is swallowed and `null` is
|
|
66
|
+
* returned, so the caller proceeds to overwrite without a Version. The prior
|
|
67
|
+
* content retained on success is unlimited in count (Requirement 12.1).
|
|
68
|
+
*/
|
|
69
|
+
snapshot(key: string): Promise<string | null>;
|
|
70
|
+
/**
|
|
71
|
+
* Return the {@link VersionInfo} descriptors of the retained Versions for
|
|
72
|
+
* `key` (Requirement 12.2). For the simulated path the reserved version prefix
|
|
73
|
+
* is listed and each version's `size`/`checksum`/`createdAt` is read from its
|
|
74
|
+
* stored metadata; entries are returned oldest-first by creation time. Only
|
|
75
|
+
* direct Versions of `key` are included — copies belonging to a deeper key
|
|
76
|
+
* that merely shares this key's prefix are excluded.
|
|
77
|
+
*/
|
|
78
|
+
listVersions(key: string): Promise<VersionInfo[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Make the content of the Version identified by `versionId` the current
|
|
81
|
+
* object content for `key` and return the resulting metadata (Requirement
|
|
82
|
+
* 12.3). For the simulated path the reserved copy is read and written back to
|
|
83
|
+
* `key` with its preserved write-time metadata. The overwrite is performed
|
|
84
|
+
* directly against the driver, so restoring does not itself trigger a new
|
|
85
|
+
* snapshot. Throws {@link NotFoundError} when the Version does not exist.
|
|
86
|
+
*/
|
|
87
|
+
restoreVersion(key: string, versionId: string): Promise<StorageObjectMetadata>;
|
|
88
|
+
/**
|
|
89
|
+
* Remove exactly the Version identified by `versionId` for `key` while
|
|
90
|
+
* retaining the remaining Versions (Requirement 12.4). For the simulated path
|
|
91
|
+
* the reserved copy is deleted; deleting a missing Version is an idempotent
|
|
92
|
+
* no-op at the driver level.
|
|
93
|
+
*/
|
|
94
|
+
deleteVersion(key: string, versionId: string): Promise<void>;
|
|
95
|
+
/** The reserved driver key a simulated Version is persisted under. */
|
|
96
|
+
private versionKey;
|
|
97
|
+
/** The reserved driver key prefix that all simulated Versions of `key` share. */
|
|
98
|
+
private versionPrefix;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=versioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../src/versioning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,aAAa,CAAC;AAGvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUrE;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,aAAa;IAIjC,+DAA+D;IAC/D,OAAO,KAAK,MAAM,GAEjB;IAED;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwBnD;;;;;;;OAOG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA6BvD;;;;;;;OAOG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgBpF;;;;;OAKG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,sEAAsE;IACtE,OAAO,CAAC,UAAU;IAIlB,iFAAiF;IACjF,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streetjs/storage — the versioning manager.
|
|
3
|
+
*
|
|
4
|
+
* Versioning retains the prior content of an object whenever a versioned key is
|
|
5
|
+
* overwritten, so historical Versions can be listed, restored, and deleted
|
|
6
|
+
* (Requirement 12). {@link VersioningManager} provides this capability in a
|
|
7
|
+
* **provider-agnostic** way:
|
|
8
|
+
*
|
|
9
|
+
* - When the backing {@link StorageDriver} implements the optional native
|
|
10
|
+
* `versioning` capability, the manager delegates each operation to the driver
|
|
11
|
+
* so a provider with first-class versioning (e.g. S3 bucket versioning) is
|
|
12
|
+
* used directly.
|
|
13
|
+
* - Otherwise the manager **simulates** versioning over the mandatory driver
|
|
14
|
+
* primitives (`put`/`get`/`stat`/`list`/`delete`). Each snapshot copies the
|
|
15
|
+
* current object's bytes and write-time metadata to a reserved key
|
|
16
|
+
* `${VERSION_KEY_PREFIX}<key>/<versionId>` (mirroring the design's
|
|
17
|
+
* `.versions/<key>/<versionId>` layout). Versions are enumerated by listing
|
|
18
|
+
* that reserved prefix and restored/deleted by reading/removing the reserved
|
|
19
|
+
* copy. No cap is imposed on the number of retained Versions (Requirement
|
|
20
|
+
* 12.1).
|
|
21
|
+
*
|
|
22
|
+
* Semantics (Requirement 12):
|
|
23
|
+
* - {@link VersioningManager.snapshot} captures the current content of `key` as
|
|
24
|
+
* a new Version and returns its id, or `null` when there is nothing to
|
|
25
|
+
* snapshot (the key does not yet exist). Crucially, when the snapshot itself
|
|
26
|
+
* fails for any reason — a storage constraint or system error — it returns
|
|
27
|
+
* `null` **without throwing** so the caller's overwrite still proceeds without
|
|
28
|
+
* a Version being created (Requirement 12.5).
|
|
29
|
+
* - {@link VersioningManager.listVersions} returns the {@link VersionInfo}
|
|
30
|
+
* descriptors of the retained Versions for `key` (Requirement 12.2).
|
|
31
|
+
* - {@link VersioningManager.restoreVersion} makes the content of the identified
|
|
32
|
+
* Version the current object content and returns the resulting metadata
|
|
33
|
+
* (Requirement 12.3).
|
|
34
|
+
* - {@link VersioningManager.deleteVersion} removes exactly the identified
|
|
35
|
+
* Version while retaining the rest (Requirement 12.4).
|
|
36
|
+
*
|
|
37
|
+
* The module depends only on the driver contract, the shared type surface, the
|
|
38
|
+
* error hierarchy, the metadata layer, and `node:crypto`, keeping the
|
|
39
|
+
* dependency direction acyclic.
|
|
40
|
+
*
|
|
41
|
+
* _Requirements: 12.1, 12.2, 12.3, 12.4, 12.5_
|
|
42
|
+
*/
|
|
43
|
+
import { randomUUID } from "node:crypto";
|
|
44
|
+
import { NotFoundError } from "./errors.js";
|
|
45
|
+
import { normalizeMetadata, toWriteMetadata } from "./metadata.js";
|
|
46
|
+
/**
|
|
47
|
+
* Reserved key prefix under which simulated Versions are persisted via the
|
|
48
|
+
* driver primitives. A Version of `<key>` lives at
|
|
49
|
+
* `${VERSION_KEY_PREFIX}<key>/<versionId>`. These reserved keys hold historical
|
|
50
|
+
* copies and are never surfaced through the object-operation API.
|
|
51
|
+
*/
|
|
52
|
+
const VERSION_KEY_PREFIX = ".versions/";
|
|
53
|
+
/**
|
|
54
|
+
* Provider-agnostic versioning manager built on the driver contract.
|
|
55
|
+
*
|
|
56
|
+
* A single instance is held by the facade and bound to one {@link StorageDriver}
|
|
57
|
+
* for its lifetime, so the native-vs-simulated decision (based on whether the
|
|
58
|
+
* driver exposes a `versioning` capability) is stable across every call.
|
|
59
|
+
*/
|
|
60
|
+
export class VersioningManager {
|
|
61
|
+
/** The driver every operation is delegated to or simulated over. */
|
|
62
|
+
driver;
|
|
63
|
+
constructor(driver) {
|
|
64
|
+
this.driver = driver;
|
|
65
|
+
}
|
|
66
|
+
/** The driver's native versioning capability, when present. */
|
|
67
|
+
get native() {
|
|
68
|
+
return this.driver.versioning;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Capture the current content of `key` as a new Version and return its id, or
|
|
72
|
+
* `null` when there is nothing to snapshot (the key does not exist yet).
|
|
73
|
+
*
|
|
74
|
+
* This is invoked by the facade immediately before an overwriting `put` when
|
|
75
|
+
* versioning is enabled. Per Requirement 12.5, a failure of the versioning
|
|
76
|
+
* mechanism must never block the overwrite: any error raised while reading the
|
|
77
|
+
* current object or persisting the snapshot is swallowed and `null` is
|
|
78
|
+
* returned, so the caller proceeds to overwrite without a Version. The prior
|
|
79
|
+
* content retained on success is unlimited in count (Requirement 12.1).
|
|
80
|
+
*/
|
|
81
|
+
async snapshot(key) {
|
|
82
|
+
try {
|
|
83
|
+
if (this.native !== undefined) {
|
|
84
|
+
return await this.native.snapshot(key);
|
|
85
|
+
}
|
|
86
|
+
const current = await this.driver.get(key);
|
|
87
|
+
if (!current.found) {
|
|
88
|
+
// Nothing to snapshot: first write to this key creates no Version.
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const versionId = randomUUID();
|
|
92
|
+
await this.driver.put(this.versionKey(key, versionId), current.bytes, toWriteMetadata(current.metadata));
|
|
93
|
+
return versionId;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Requirement 12.5: a versioning failure allows the overwrite to proceed
|
|
97
|
+
// WITHOUT creating a Version. Never propagate the error to the write path.
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Return the {@link VersionInfo} descriptors of the retained Versions for
|
|
103
|
+
* `key` (Requirement 12.2). For the simulated path the reserved version prefix
|
|
104
|
+
* is listed and each version's `size`/`checksum`/`createdAt` is read from its
|
|
105
|
+
* stored metadata; entries are returned oldest-first by creation time. Only
|
|
106
|
+
* direct Versions of `key` are included — copies belonging to a deeper key
|
|
107
|
+
* that merely shares this key's prefix are excluded.
|
|
108
|
+
*/
|
|
109
|
+
async listVersions(key) {
|
|
110
|
+
if (this.native !== undefined) {
|
|
111
|
+
return this.native.list(key);
|
|
112
|
+
}
|
|
113
|
+
const prefix = this.versionPrefix(key);
|
|
114
|
+
const items = await this.driver.list(prefix);
|
|
115
|
+
const versions = [];
|
|
116
|
+
for (const item of items) {
|
|
117
|
+
const versionId = item.key.slice(prefix.length);
|
|
118
|
+
// Skip copies belonging to a deeper key (e.g. Versions of "a/b" when
|
|
119
|
+
// listing Versions of "a"); a direct Version id contains no delimiter.
|
|
120
|
+
if (versionId === "" || versionId.includes("/")) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const metadata = await this.driver.stat(item.key);
|
|
124
|
+
if (metadata === null) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
versions.push({
|
|
128
|
+
versionId,
|
|
129
|
+
size: metadata.size,
|
|
130
|
+
createdAt: metadata.createdAt,
|
|
131
|
+
checksum: metadata.checksum,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
versions.sort((a, b) => a.createdAt - b.createdAt);
|
|
135
|
+
return versions;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Make the content of the Version identified by `versionId` the current
|
|
139
|
+
* object content for `key` and return the resulting metadata (Requirement
|
|
140
|
+
* 12.3). For the simulated path the reserved copy is read and written back to
|
|
141
|
+
* `key` with its preserved write-time metadata. The overwrite is performed
|
|
142
|
+
* directly against the driver, so restoring does not itself trigger a new
|
|
143
|
+
* snapshot. Throws {@link NotFoundError} when the Version does not exist.
|
|
144
|
+
*/
|
|
145
|
+
async restoreVersion(key, versionId) {
|
|
146
|
+
if (this.native !== undefined) {
|
|
147
|
+
return normalizeMetadata(await this.native.restore(key, versionId));
|
|
148
|
+
}
|
|
149
|
+
const versionKey = this.versionKey(key, versionId);
|
|
150
|
+
const result = await this.driver.get(versionKey);
|
|
151
|
+
if (!result.found) {
|
|
152
|
+
throw new NotFoundError(versionKey, `Version "${versionId}" for key "${key}" was not found.`);
|
|
153
|
+
}
|
|
154
|
+
const metadata = await this.driver.put(key, result.bytes, toWriteMetadata(result.metadata));
|
|
155
|
+
return normalizeMetadata(metadata);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Remove exactly the Version identified by `versionId` for `key` while
|
|
159
|
+
* retaining the remaining Versions (Requirement 12.4). For the simulated path
|
|
160
|
+
* the reserved copy is deleted; deleting a missing Version is an idempotent
|
|
161
|
+
* no-op at the driver level.
|
|
162
|
+
*/
|
|
163
|
+
async deleteVersion(key, versionId) {
|
|
164
|
+
if (this.native !== undefined) {
|
|
165
|
+
await this.native.deleteVersion(key, versionId);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
await this.driver.delete(this.versionKey(key, versionId));
|
|
169
|
+
}
|
|
170
|
+
/** The reserved driver key a simulated Version is persisted under. */
|
|
171
|
+
versionKey(key, versionId) {
|
|
172
|
+
return `${this.versionPrefix(key)}${versionId}`;
|
|
173
|
+
}
|
|
174
|
+
/** The reserved driver key prefix that all simulated Versions of `key` share. */
|
|
175
|
+
versionPrefix(key) {
|
|
176
|
+
return `${VERSION_KEY_PREFIX}${key}/`;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=versioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.js","sourceRoot":"","sources":["../src/versioning.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@streetjs/storage",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "StreetJS unified storage framework: a strongly-typed, plugin-first, driver-based object storage layer with zero-dependency in-memory and filesystem drivers, streaming, validation, metadata, multipart, resumable uploads, signed URLs, versioning, lifecycle, access control, and optional cloud provider integrations (S3, R2, Supabase, GCS, Azure, MinIO, Backblaze) isolated behind optional submodules.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./s3": {
|
|
14
|
+
"import": "./dist/drivers/s3.js",
|
|
15
|
+
"types": "./dist/drivers/s3.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./r2": {
|
|
18
|
+
"import": "./dist/drivers/r2.js",
|
|
19
|
+
"types": "./dist/drivers/r2.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./supabase": {
|
|
22
|
+
"import": "./dist/drivers/supabase.js",
|
|
23
|
+
"types": "./dist/drivers/supabase.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./gcs": {
|
|
26
|
+
"import": "./dist/drivers/gcs.js",
|
|
27
|
+
"types": "./dist/drivers/gcs.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./azure": {
|
|
30
|
+
"import": "./dist/drivers/azure.js",
|
|
31
|
+
"types": "./dist/drivers/azure.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"./minio": {
|
|
34
|
+
"import": "./dist/drivers/minio.js",
|
|
35
|
+
"types": "./dist/drivers/minio.d.ts"
|
|
36
|
+
},
|
|
37
|
+
"./backblaze": {
|
|
38
|
+
"import": "./dist/drivers/backblaze.js",
|
|
39
|
+
"types": "./dist/drivers/backblaze.d.ts"
|
|
40
|
+
},
|
|
41
|
+
"./testing": {
|
|
42
|
+
"import": "./dist/testing/index.js",
|
|
43
|
+
"types": "./dist/testing/index.d.ts"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist/**/*.js",
|
|
48
|
+
"dist/**/*.js.map",
|
|
49
|
+
"dist/**/*.d.ts",
|
|
50
|
+
"dist/**/*.d.ts.map",
|
|
51
|
+
"README.md",
|
|
52
|
+
"CHANGELOG.md",
|
|
53
|
+
"LICENSE"
|
|
54
|
+
],
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsc",
|
|
57
|
+
"test": "node --test dist/tests/*.test.js",
|
|
58
|
+
"example": "node dist/examples/storage-demo.js",
|
|
59
|
+
"lint": "tsc --noEmit",
|
|
60
|
+
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
|
|
61
|
+
},
|
|
62
|
+
"keywords": [
|
|
63
|
+
"streetjs",
|
|
64
|
+
"street-framework",
|
|
65
|
+
"storage",
|
|
66
|
+
"object-storage",
|
|
67
|
+
"file-storage",
|
|
68
|
+
"s3",
|
|
69
|
+
"r2",
|
|
70
|
+
"supabase",
|
|
71
|
+
"gcs",
|
|
72
|
+
"azure",
|
|
73
|
+
"minio",
|
|
74
|
+
"backblaze",
|
|
75
|
+
"signed-url",
|
|
76
|
+
"multipart",
|
|
77
|
+
"streaming",
|
|
78
|
+
"typescript",
|
|
79
|
+
"esm"
|
|
80
|
+
],
|
|
81
|
+
"author": "street contributors",
|
|
82
|
+
"license": "MIT",
|
|
83
|
+
"homepage": "https://hassanmubiru.github.io/StreetJS/",
|
|
84
|
+
"repository": {
|
|
85
|
+
"type": "git",
|
|
86
|
+
"url": "git+https://github.com/hassanmubiru/StreetJS.git"
|
|
87
|
+
},
|
|
88
|
+
"bugs": {
|
|
89
|
+
"url": "https://github.com/hassanmubiru/StreetJS/issues"
|
|
90
|
+
},
|
|
91
|
+
"dependencies": {
|
|
92
|
+
"streetjs": "^1.0.25"
|
|
93
|
+
},
|
|
94
|
+
"devDependencies": {
|
|
95
|
+
"@types/node": "^25.9.2",
|
|
96
|
+
"fast-check": "^4.8.0",
|
|
97
|
+
"typescript": "^6.0.3"
|
|
98
|
+
},
|
|
99
|
+
"peerDependencies": {
|
|
100
|
+
"typescript": ">=5.0.0",
|
|
101
|
+
"@aws-sdk/client-s3": ">=3.0.0",
|
|
102
|
+
"@aws-sdk/s3-request-presigner": ">=3.0.0",
|
|
103
|
+
"@supabase/supabase-js": ">=2.0.0",
|
|
104
|
+
"@google-cloud/storage": ">=7.0.0",
|
|
105
|
+
"@azure/storage-blob": ">=12.0.0",
|
|
106
|
+
"minio": ">=8.0.0"
|
|
107
|
+
},
|
|
108
|
+
"peerDependenciesMeta": {
|
|
109
|
+
"typescript": {
|
|
110
|
+
"optional": true
|
|
111
|
+
},
|
|
112
|
+
"@aws-sdk/client-s3": {
|
|
113
|
+
"optional": true
|
|
114
|
+
},
|
|
115
|
+
"@aws-sdk/s3-request-presigner": {
|
|
116
|
+
"optional": true
|
|
117
|
+
},
|
|
118
|
+
"@supabase/supabase-js": {
|
|
119
|
+
"optional": true
|
|
120
|
+
},
|
|
121
|
+
"@google-cloud/storage": {
|
|
122
|
+
"optional": true
|
|
123
|
+
},
|
|
124
|
+
"@azure/storage-blob": {
|
|
125
|
+
"optional": true
|
|
126
|
+
},
|
|
127
|
+
"minio": {
|
|
128
|
+
"optional": true
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"engines": {
|
|
132
|
+
"node": ">=22.0.0"
|
|
133
|
+
},
|
|
134
|
+
"publishConfig": {
|
|
135
|
+
"access": "public"
|
|
136
|
+
}
|
|
137
|
+
}
|