@effect-kit/storage 0.0.0-stage → 0.1.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/CHANGELOG.md +18 -0
- package/LICENSE +204 -0
- package/README.md +369 -2
- package/dist/_virtual/_rolldown/runtime.js +17 -0
- package/dist/azure/account-admin.d.ts +116 -0
- package/dist/azure/account-admin.js +90 -0
- package/dist/azure/account-admin.js.map +1 -0
- package/dist/azure/admin.d.ts +68 -0
- package/dist/azure/admin.js +85 -0
- package/dist/azure/admin.js.map +1 -0
- package/dist/azure/archive.d.ts +95 -0
- package/dist/azure/archive.js +52 -0
- package/dist/azure/archive.js.map +1 -0
- package/dist/azure/events.d.ts +40 -0
- package/dist/azure/events.js +62 -0
- package/dist/azure/events.js.map +1 -0
- package/dist/azure/governance.d.ts +139 -0
- package/dist/azure/governance.js +59 -0
- package/dist/azure/governance.js.map +1 -0
- package/dist/azure/identity.d.ts +4 -0
- package/dist/azure/identity.js +8 -0
- package/dist/azure/identity.js.map +1 -0
- package/dist/azure/lifecycle.d.ts +21 -0
- package/dist/azure/lifecycle.js +193 -0
- package/dist/azure/lifecycle.js.map +1 -0
- package/dist/azure/signing.d.ts +17 -0
- package/dist/azure/signing.js +71 -0
- package/dist/azure/signing.js.map +1 -0
- package/dist/azure/uploads.d.ts +11 -0
- package/dist/azure/uploads.js +83 -0
- package/dist/azure/uploads.js.map +1 -0
- package/dist/azure.d.ts +427 -0
- package/dist/azure.js +77 -0
- package/dist/azure.js.map +1 -0
- package/dist/b2/admin.d.ts +149 -0
- package/dist/b2/admin.js +157 -0
- package/dist/b2/admin.js.map +1 -0
- package/dist/b2.d.ts +15 -0
- package/dist/b2.js +15 -0
- package/dist/b2.js.map +1 -0
- package/dist/browser.d.ts +7 -0
- package/dist/browser.js +11 -0
- package/dist/browser.js.map +1 -0
- package/dist/bun.d.ts +14 -0
- package/dist/bun.js +17 -0
- package/dist/bun.js.map +1 -0
- package/dist/cache.d.ts +18 -0
- package/dist/cache.js +116 -0
- package/dist/cache.js.map +1 -0
- package/dist/client/atoms/controller.d.ts +10 -0
- package/dist/client/atoms/controller.js +267 -0
- package/dist/client/atoms/controller.js.map +1 -0
- package/dist/client/atoms/state.d.ts +17 -0
- package/dist/client/atoms/state.js +11 -0
- package/dist/client/atoms/state.js.map +1 -0
- package/dist/client/atoms.d.ts +59 -0
- package/dist/client/atoms.js +39 -0
- package/dist/client/atoms.js.map +1 -0
- package/dist/client/fingerprint.js +28 -0
- package/dist/client/fingerprint.js.map +1 -0
- package/dist/client/store.d.ts +31 -0
- package/dist/client/store.js +56 -0
- package/dist/client/store.js.map +1 -0
- package/dist/client/transport.d.ts +11 -0
- package/dist/client/transport.js +78 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client.d.ts +259 -0
- package/dist/client.js +350 -0
- package/dist/client.js.map +1 -0
- package/dist/composition/layer.js +22 -0
- package/dist/composition/layer.js.map +1 -0
- package/dist/composition/representation/staging.js +46 -0
- package/dist/composition/representation/staging.js.map +1 -0
- package/dist/composition/representation/storage.js +188 -0
- package/dist/composition/representation/storage.js.map +1 -0
- package/dist/composition.d.ts +20 -0
- package/dist/composition.js +124 -0
- package/dist/composition.js.map +1 -0
- package/dist/compression.d.ts +16 -0
- package/dist/compression.js +38 -0
- package/dist/compression.js.map +1 -0
- package/dist/content.d.ts +590 -0
- package/dist/content.js +168 -0
- package/dist/content.js.map +1 -0
- package/dist/core/capabilities.d.ts +53 -0
- package/dist/core/capabilities.js +9 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/contracts/multipart.d.ts +56 -0
- package/dist/core/contracts/resumable.d.ts +70 -0
- package/dist/core/errors.d.ts +55 -0
- package/dist/core/errors.js +55 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/object.d.ts +97 -0
- package/dist/core/object.js +55 -0
- package/dist/core/object.js.map +1 -0
- package/dist/core/ranges.d.ts +17 -0
- package/dist/core/ranges.js +27 -0
- package/dist/core/ranges.js.map +1 -0
- package/dist/core/requests.d.ts +185 -0
- package/dist/core/requests.js +42 -0
- package/dist/core/requests.js.map +1 -0
- package/dist/core/storage.d.ts +249 -0
- package/dist/core/storage.js +173 -0
- package/dist/core/storage.js.map +1 -0
- package/dist/deno.d.ts +14 -0
- package/dist/deno.js +17 -0
- package/dist/deno.js.map +1 -0
- package/dist/encryption/age.d.ts +14 -0
- package/dist/encryption/age.js +46 -0
- package/dist/encryption/age.js.map +1 -0
- package/dist/encryption.d.ts +16 -0
- package/dist/encryption.js +16 -0
- package/dist/encryption.js.map +1 -0
- package/dist/events.d.ts +57 -0
- package/dist/events.js +106 -0
- package/dist/events.js.map +1 -0
- package/dist/filesystem.d.ts +23 -0
- package/dist/filesystem.js +75 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/gcs/admin.d.ts +470 -0
- package/dist/gcs/admin.js +206 -0
- package/dist/gcs/admin.js.map +1 -0
- package/dist/gcs/events.d.ts +41 -0
- package/dist/gcs/events.js +45 -0
- package/dist/gcs/events.js.map +1 -0
- package/dist/gcs/governance.d.ts +158 -0
- package/dist/gcs/governance.js +100 -0
- package/dist/gcs/governance.js.map +1 -0
- package/dist/gcs/lifecycle.d.ts +161 -0
- package/dist/gcs/lifecycle.js +174 -0
- package/dist/gcs/lifecycle.js.map +1 -0
- package/dist/gcs/post.d.ts +31 -0
- package/dist/gcs/post.js +70 -0
- package/dist/gcs/post.js.map +1 -0
- package/dist/gcs/signing.d.ts +10 -0
- package/dist/gcs/signing.js +61 -0
- package/dist/gcs/signing.js.map +1 -0
- package/dist/gcs/uploads.d.ts +10 -0
- package/dist/gcs/uploads.js +76 -0
- package/dist/gcs/uploads.js.map +1 -0
- package/dist/gcs.d.ts +888 -0
- package/dist/gcs.js +91 -0
- package/dist/gcs.js.map +1 -0
- package/dist/hetzner/admin.d.ts +112 -0
- package/dist/hetzner/admin.js +19 -0
- package/dist/hetzner/admin.js.map +1 -0
- package/dist/hetzner.d.ts +15 -0
- package/dist/hetzner.js +15 -0
- package/dist/hetzner.js.map +1 -0
- package/dist/http/api.d.ts +236 -0
- package/dist/http/api.js +54 -0
- package/dist/http/api.js.map +1 -0
- package/dist/http/download.js +99 -0
- package/dist/http/download.js.map +1 -0
- package/dist/http/schema.d.ts +3 -0
- package/dist/http/schema.js +4 -0
- package/dist/http.d.ts +35 -0
- package/dist/http.js +178 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +9 -0
- package/dist/internal/http/control-plane.js +71 -0
- package/dist/internal/http/control-plane.js.map +1 -0
- package/dist/internal/listing-cursor.js +44 -0
- package/dist/internal/listing-cursor.js.map +1 -0
- package/dist/internal/node/provider-errors.js +16 -0
- package/dist/internal/node/provider-errors.js.map +1 -0
- package/dist/internal/node/upload-body.js +111 -0
- package/dist/internal/node/upload-body.js.map +1 -0
- package/dist/internal/provider-response.js +14 -0
- package/dist/internal/provider-response.js.map +1 -0
- package/dist/internal/public-urls.js +30 -0
- package/dist/internal/public-urls.js.map +1 -0
- package/dist/internal/read-condition.js +11 -0
- package/dist/internal/read-condition.js.map +1 -0
- package/dist/internal/request-validation.js +24 -0
- package/dist/internal/request-validation.js.map +1 -0
- package/dist/internal/signing-request.js +22 -0
- package/dist/internal/signing-request.js.map +1 -0
- package/dist/internal/web-upload-body.js +71 -0
- package/dist/internal/web-upload-body.js.map +1 -0
- package/dist/lifecycle/configuration-state.js +26 -0
- package/dist/lifecycle/configuration-state.js.map +1 -0
- package/dist/lifecycle/metadata.js +28 -0
- package/dist/lifecycle/metadata.js.map +1 -0
- package/dist/lifecycle.d.ts +269 -0
- package/dist/lifecycle.js +72 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/migrations.d.ts +537 -0
- package/dist/migrations.js +296 -0
- package/dist/migrations.js.map +1 -0
- package/dist/minio/admin.d.ts +112 -0
- package/dist/minio/admin.js +19 -0
- package/dist/minio/admin.js.map +1 -0
- package/dist/minio.d.ts +15 -0
- package/dist/minio.js +15 -0
- package/dist/minio.js.map +1 -0
- package/dist/mirror.d.ts +830 -0
- package/dist/mirror.js +290 -0
- package/dist/mirror.js.map +1 -0
- package/dist/node.d.ts +14 -0
- package/dist/node.js +17 -0
- package/dist/node.js.map +1 -0
- package/dist/providers/azure/blocks.js +94 -0
- package/dist/providers/azure/blocks.js.map +1 -0
- package/dist/providers/azure/config.d.ts +41 -0
- package/dist/providers/azure/config.js +62 -0
- package/dist/providers/azure/config.js.map +1 -0
- package/dist/providers/azure/mapping.js +83 -0
- package/dist/providers/azure/mapping.js.map +1 -0
- package/dist/providers/azure/native.js +88 -0
- package/dist/providers/azure/native.js.map +1 -0
- package/dist/providers/azure/primitives.js +203 -0
- package/dist/providers/azure/primitives.js.map +1 -0
- package/dist/providers/azure/properties.d.ts +180 -0
- package/dist/providers/azure/properties.js +55 -0
- package/dist/providers/azure/properties.js.map +1 -0
- package/dist/providers/azure/transport.js +14 -0
- package/dist/providers/azure/transport.js.map +1 -0
- package/dist/providers/azure/validation.js +11 -0
- package/dist/providers/azure/validation.js.map +1 -0
- package/dist/providers/filesystem/envelope.js +56 -0
- package/dist/providers/filesystem/envelope.js.map +1 -0
- package/dist/providers/filesystem/identity.js +68 -0
- package/dist/providers/filesystem/identity.js.map +1 -0
- package/dist/providers/filesystem/layout.d.ts +15 -0
- package/dist/providers/filesystem/layout.js +112 -0
- package/dist/providers/filesystem/layout.js.map +1 -0
- package/dist/providers/filesystem/list.js +82 -0
- package/dist/providers/filesystem/list.js.map +1 -0
- package/dist/providers/filesystem/operations.js +134 -0
- package/dist/providers/filesystem/operations.js.map +1 -0
- package/dist/providers/gcs/config.d.ts +34 -0
- package/dist/providers/gcs/config.js +60 -0
- package/dist/providers/gcs/config.js.map +1 -0
- package/dist/providers/gcs/iam.js +45 -0
- package/dist/providers/gcs/iam.js.map +1 -0
- package/dist/providers/gcs/mapping.js +118 -0
- package/dist/providers/gcs/mapping.js.map +1 -0
- package/dist/providers/gcs/native.d.ts +11 -0
- package/dist/providers/gcs/native.js +122 -0
- package/dist/providers/gcs/native.js.map +1 -0
- package/dist/providers/gcs/primitives.js +194 -0
- package/dist/providers/gcs/primitives.js.map +1 -0
- package/dist/providers/gcs/resumable.js +145 -0
- package/dist/providers/gcs/resumable.js.map +1 -0
- package/dist/providers/gcs/tier.d.ts +176 -0
- package/dist/providers/gcs/tier.js +34 -0
- package/dist/providers/gcs/tier.js.map +1 -0
- package/dist/providers/gcs/transport.js +123 -0
- package/dist/providers/gcs/transport.js.map +1 -0
- package/dist/providers/gcs/upload.js +28 -0
- package/dist/providers/gcs/upload.js.map +1 -0
- package/dist/providers/gcs/validation.js +10 -0
- package/dist/providers/gcs/validation.js.map +1 -0
- package/dist/providers/r2-workers/binding.d.ts +102 -0
- package/dist/providers/r2-workers/body.js +82 -0
- package/dist/providers/r2-workers/body.js.map +1 -0
- package/dist/providers/r2-workers/list.js +62 -0
- package/dist/providers/r2-workers/list.js.map +1 -0
- package/dist/providers/r2-workers/mapping.js +140 -0
- package/dist/providers/r2-workers/mapping.js.map +1 -0
- package/dist/providers/r2-workers/multipart.js +121 -0
- package/dist/providers/r2-workers/multipart.js.map +1 -0
- package/dist/providers/r2-workers/primitives.js +80 -0
- package/dist/providers/r2-workers/primitives.js.map +1 -0
- package/dist/providers/s3/admin-configuration.d.ts +19 -0
- package/dist/providers/s3/admin-configuration.js +171 -0
- package/dist/providers/s3/admin-configuration.js.map +1 -0
- package/dist/providers/s3/bulk-delete.d.ts +43 -0
- package/dist/providers/s3/bulk-delete.js +58 -0
- package/dist/providers/s3/bulk-delete.js.map +1 -0
- package/dist/providers/s3/config.d.ts +43 -0
- package/dist/providers/s3/config.js +89 -0
- package/dist/providers/s3/config.js.map +1 -0
- package/dist/providers/s3/copy.d.ts +115 -0
- package/dist/providers/s3/copy.js +122 -0
- package/dist/providers/s3/copy.js.map +1 -0
- package/dist/providers/s3/lifecycle-validation.js +33 -0
- package/dist/providers/s3/lifecycle-validation.js.map +1 -0
- package/dist/providers/s3/listing.js +56 -0
- package/dist/providers/s3/listing.js.map +1 -0
- package/dist/providers/s3/metadata.d.ts +10 -0
- package/dist/providers/s3/metadata.js +90 -0
- package/dist/providers/s3/metadata.js.map +1 -0
- package/dist/providers/s3/multipart.d.ts +41 -0
- package/dist/providers/s3/multipart.js +299 -0
- package/dist/providers/s3/multipart.js.map +1 -0
- package/dist/providers/s3/native-models.d.ts +82 -0
- package/dist/providers/s3/native-models.js +91 -0
- package/dist/providers/s3/native-models.js.map +1 -0
- package/dist/providers/s3/object-mapping.js +114 -0
- package/dist/providers/s3/object-mapping.js.map +1 -0
- package/dist/providers/s3/primitives.d.ts +8 -0
- package/dist/providers/s3/primitives.js +235 -0
- package/dist/providers/s3/primitives.js.map +1 -0
- package/dist/providers/s3/profile.d.ts +25 -0
- package/dist/providers/s3/profile.js +46 -0
- package/dist/providers/s3/profile.js.map +1 -0
- package/dist/providers/s3/request-extension.js +29 -0
- package/dist/providers/s3/request-extension.js.map +1 -0
- package/dist/providers/s3/service.js +55 -0
- package/dist/providers/s3/service.js.map +1 -0
- package/dist/providers/s3/signing-credentials.js +32 -0
- package/dist/providers/s3/signing-credentials.js.map +1 -0
- package/dist/providers/s3/tags.d.ts +10 -0
- package/dist/providers/s3/tags.js +65 -0
- package/dist/providers/s3/tags.js.map +1 -0
- package/dist/providers/s3/tier.d.ts +171 -0
- package/dist/providers/s3/tier.js +100 -0
- package/dist/providers/s3/tier.js.map +1 -0
- package/dist/providers/s3/transfer-driver.js +72 -0
- package/dist/providers/s3/transfer-driver.js.map +1 -0
- package/dist/providers/s3/transport.js +94 -0
- package/dist/providers/s3/transport.js.map +1 -0
- package/dist/providers/s3/upload-body.js +10 -0
- package/dist/providers/s3/upload-body.js.map +1 -0
- package/dist/providers/s3/validation.js +31 -0
- package/dist/providers/s3/validation.js.map +1 -0
- package/dist/providers/s3/versions.d.ts +10 -0
- package/dist/providers/s3/versions.js +143 -0
- package/dist/providers/s3/versions.js.map +1 -0
- package/dist/providers/s3-compatible/config.d.ts +36 -0
- package/dist/providers/s3-compatible/config.js +174 -0
- package/dist/providers/s3-compatible/config.js.map +1 -0
- package/dist/providers/s3-compatible/service.js +48 -0
- package/dist/providers/s3-compatible/service.js.map +1 -0
- package/dist/providers/supabase/config.d.ts +20 -0
- package/dist/providers/supabase/config.js +41 -0
- package/dist/providers/supabase/config.js.map +1 -0
- package/dist/providers/supabase/mapping.js +60 -0
- package/dist/providers/supabase/mapping.js.map +1 -0
- package/dist/providers/supabase/primitives.js +205 -0
- package/dist/providers/supabase/primitives.js.map +1 -0
- package/dist/providers/supabase/transport.js +64 -0
- package/dist/providers/supabase/transport.js.map +1 -0
- package/dist/providers/supabase/tus.js +163 -0
- package/dist/providers/supabase/tus.js.map +1 -0
- package/dist/providers/tigris/configuration.js +118 -0
- package/dist/providers/tigris/configuration.js.map +1 -0
- package/dist/providers/tigris/snapshots.js +87 -0
- package/dist/providers/tigris/snapshots.js.map +1 -0
- package/dist/providers/tigris/transport.js +18 -0
- package/dist/providers/tigris/transport.js.map +1 -0
- package/dist/providers/vercel/config.d.ts +16 -0
- package/dist/providers/vercel/config.js +48 -0
- package/dist/providers/vercel/config.js.map +1 -0
- package/dist/providers/vercel/mapping.js +79 -0
- package/dist/providers/vercel/mapping.js.map +1 -0
- package/dist/providers/vercel/multipart.js +113 -0
- package/dist/providers/vercel/multipart.js.map +1 -0
- package/dist/providers/vercel/primitives.js +168 -0
- package/dist/providers/vercel/primitives.js.map +1 -0
- package/dist/providers/vercel/transport.js +32 -0
- package/dist/providers/vercel/transport.js.map +1 -0
- package/dist/providers/wasabi/compliance.d.ts +52 -0
- package/dist/providers/wasabi/compliance.js +89 -0
- package/dist/providers/wasabi/compliance.js.map +1 -0
- package/dist/providers/wasabi/xml.js +55 -0
- package/dist/providers/wasabi/xml.js.map +1 -0
- package/dist/r2/admin.d.ts +126 -0
- package/dist/r2/admin.js +138 -0
- package/dist/r2/admin.js.map +1 -0
- package/dist/r2/events.d.ts +41 -0
- package/dist/r2/events.js +37 -0
- package/dist/r2/events.js.map +1 -0
- package/dist/r2-workers.d.ts +24 -0
- package/dist/r2-workers.js +115 -0
- package/dist/r2-workers.js.map +1 -0
- package/dist/r2.d.ts +15 -0
- package/dist/r2.js +15 -0
- package/dist/r2.js.map +1 -0
- package/dist/react.d.ts +73 -0
- package/dist/react.js +49 -0
- package/dist/react.js.map +1 -0
- package/dist/representation.d.ts +24 -0
- package/dist/representation.js +7 -0
- package/dist/representation.js.map +1 -0
- package/dist/runtime/bun-filesystem.js +136 -0
- package/dist/runtime/bun-filesystem.js.map +1 -0
- package/dist/runtime/file-target.d.ts +10 -0
- package/dist/runtime/file-target.js +66 -0
- package/dist/runtime/file-target.js.map +1 -0
- package/dist/runtime/filesystem.d.ts +6 -0
- package/dist/runtime/filesystem.js +68 -0
- package/dist/runtime/filesystem.js.map +1 -0
- package/dist/runtime/node-hash.d.ts +4 -0
- package/dist/runtime/node-hash.js +31 -0
- package/dist/runtime/node-hash.js.map +1 -0
- package/dist/runtime/node-protection.d.ts +4 -0
- package/dist/runtime/node-protection.js +46 -0
- package/dist/runtime/node-protection.js.map +1 -0
- package/dist/runtime/portable-hash.d.ts +3 -0
- package/dist/runtime/portable-hash.js +31 -0
- package/dist/runtime/portable-hash.js.map +1 -0
- package/dist/runtime/session-store.d.ts +12 -0
- package/dist/runtime/session-store.js +19 -0
- package/dist/runtime/session-store.js.map +1 -0
- package/dist/runtime/web-protection.d.ts +7 -0
- package/dist/runtime/web-protection.js +54 -0
- package/dist/runtime/web-protection.js.map +1 -0
- package/dist/s3/admin.d.ts +183 -0
- package/dist/s3/admin.js +197 -0
- package/dist/s3/admin.js.map +1 -0
- package/dist/s3/archive.d.ts +25 -0
- package/dist/s3/archive.js +113 -0
- package/dist/s3/archive.js.map +1 -0
- package/dist/s3/events.d.ts +42 -0
- package/dist/s3/events.js +69 -0
- package/dist/s3/events.js.map +1 -0
- package/dist/s3/governance.d.ts +319 -0
- package/dist/s3/governance.js +108 -0
- package/dist/s3/governance.js.map +1 -0
- package/dist/s3/lifecycle.d.ts +4 -0
- package/dist/s3/lifecycle.js +5 -0
- package/dist/s3/post.d.ts +31 -0
- package/dist/s3/post.js +93 -0
- package/dist/s3/post.js.map +1 -0
- package/dist/s3/signing.d.ts +105 -0
- package/dist/s3/signing.js +198 -0
- package/dist/s3/signing.js.map +1 -0
- package/dist/s3/uploads.d.ts +11 -0
- package/dist/s3/uploads.js +173 -0
- package/dist/s3/uploads.js.map +1 -0
- package/dist/s3.d.ts +37 -0
- package/dist/s3.js +114 -0
- package/dist/s3.js.map +1 -0
- package/dist/scaleway/admin.d.ts +112 -0
- package/dist/scaleway/admin.js +19 -0
- package/dist/scaleway/admin.js.map +1 -0
- package/dist/scaleway.d.ts +15 -0
- package/dist/scaleway.js +15 -0
- package/dist/scaleway.js.map +1 -0
- package/dist/session-events.d.ts +22 -0
- package/dist/session-events.js +22 -0
- package/dist/session-events.js.map +1 -0
- package/dist/sessions/checkpoint.d.ts +423 -0
- package/dist/sessions/checkpoint.js +102 -0
- package/dist/sessions/checkpoint.js.map +1 -0
- package/dist/sessions/download.d.ts +17 -0
- package/dist/sessions/download.js +111 -0
- package/dist/sessions/download.js.map +1 -0
- package/dist/sessions/native-upload.js +168 -0
- package/dist/sessions/native-upload.js.map +1 -0
- package/dist/sessions/store.d.ts +40 -0
- package/dist/sessions/store.js +77 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/upload.d.ts +10 -0
- package/dist/sessions/upload.js +329 -0
- package/dist/sessions/upload.js.map +1 -0
- package/dist/sessions.d.ts +98 -0
- package/dist/sessions.js +268 -0
- package/dist/sessions.js.map +1 -0
- package/dist/spaces/admin.d.ts +112 -0
- package/dist/spaces/admin.js +19 -0
- package/dist/spaces/admin.js.map +1 -0
- package/dist/spaces.d.ts +15 -0
- package/dist/spaces.js +15 -0
- package/dist/spaces.js.map +1 -0
- package/dist/supabase/admin.d.ts +77 -0
- package/dist/supabase/admin.js +74 -0
- package/dist/supabase/admin.js.map +1 -0
- package/dist/supabase/s3.d.ts +311 -0
- package/dist/supabase/s3.js +153 -0
- package/dist/supabase/s3.js.map +1 -0
- package/dist/supabase/signing.d.ts +23 -0
- package/dist/supabase/signing.js +93 -0
- package/dist/supabase/signing.js.map +1 -0
- package/dist/supabase/tus-uploads.d.ts +13 -0
- package/dist/supabase/tus-uploads.js +109 -0
- package/dist/supabase/tus-uploads.js.map +1 -0
- package/dist/supabase/uploads.d.ts +5 -0
- package/dist/supabase/uploads.js +32 -0
- package/dist/supabase/uploads.js.map +1 -0
- package/dist/supabase.d.ts +100 -0
- package/dist/supabase.js +50 -0
- package/dist/supabase.js.map +1 -0
- package/dist/testing/body-failure.js +18 -0
- package/dist/testing/body-failure.js.map +1 -0
- package/dist/testing/conformance/assertions.d.ts +10 -0
- package/dist/testing/conformance/assertions.js +21 -0
- package/dist/testing/conformance/assertions.js.map +1 -0
- package/dist/testing/conformance/core-cases.js +107 -0
- package/dist/testing/conformance/core-cases.js.map +1 -0
- package/dist/testing/conformance/list-cases.js +72 -0
- package/dist/testing/conformance/list-cases.js.map +1 -0
- package/dist/testing/conformance/read-cases.js +105 -0
- package/dist/testing/conformance/read-cases.js.map +1 -0
- package/dist/testing/conformance.d.ts +23 -0
- package/dist/testing/conformance.js +37 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/faults.d.ts +258 -0
- package/dist/testing/faults.js +111 -0
- package/dist/testing/faults.js.map +1 -0
- package/dist/testing/memory-list.js +79 -0
- package/dist/testing/memory-list.js.map +1 -0
- package/dist/testing/memory-state.d.ts +18 -0
- package/dist/testing/memory-state.js +57 -0
- package/dist/testing/memory-state.js.map +1 -0
- package/dist/testing/memory-upload.js +123 -0
- package/dist/testing/memory-upload.js.map +1 -0
- package/dist/testing/memory.d.ts +23 -0
- package/dist/testing/memory.js +121 -0
- package/dist/testing/memory.js.map +1 -0
- package/dist/testing.d.ts +6 -0
- package/dist/testing.js +6 -0
- package/dist/tigris/events.d.ts +42 -0
- package/dist/tigris/events.js +42 -0
- package/dist/tigris/events.js.map +1 -0
- package/dist/tigris/native.d.ts +438 -0
- package/dist/tigris/native.js +166 -0
- package/dist/tigris/native.js.map +1 -0
- package/dist/tigris.d.ts +15 -0
- package/dist/tigris.js +15 -0
- package/dist/tigris.js.map +1 -0
- package/dist/transfers/budget.js +50 -0
- package/dist/transfers/budget.js.map +1 -0
- package/dist/transfers/copy.js +250 -0
- package/dist/transfers/copy.js.map +1 -0
- package/dist/transfers/dependencies.d.ts +10 -0
- package/dist/transfers/dependencies.js +11 -0
- package/dist/transfers/dependencies.js.map +1 -0
- package/dist/transfers/download.js +132 -0
- package/dist/transfers/download.js.map +1 -0
- package/dist/transfers/managed-runtime.d.ts +34 -0
- package/dist/transfers/managed-runtime.js +30 -0
- package/dist/transfers/managed-runtime.js.map +1 -0
- package/dist/transfers/models.d.ts +160 -0
- package/dist/transfers/native-upload.js +195 -0
- package/dist/transfers/native-upload.js.map +1 -0
- package/dist/transfers/part-receipts.js +32 -0
- package/dist/transfers/part-receipts.js.map +1 -0
- package/dist/transfers/planner.d.ts +19 -0
- package/dist/transfers/planner.js +153 -0
- package/dist/transfers/planner.js.map +1 -0
- package/dist/transfers/reader.js +81 -0
- package/dist/transfers/reader.js.map +1 -0
- package/dist/transfers/runtime.d.ts +19 -0
- package/dist/transfers/runtime.js +132 -0
- package/dist/transfers/runtime.js.map +1 -0
- package/dist/transfers/sources.d.ts +22 -0
- package/dist/transfers/sources.js +83 -0
- package/dist/transfers/sources.js.map +1 -0
- package/dist/transfers/upload.js +235 -0
- package/dist/transfers/upload.js.map +1 -0
- package/dist/transfers.d.ts +31 -0
- package/dist/transfers.js +82 -0
- package/dist/transfers.js.map +1 -0
- package/dist/uploads/driver.d.ts +22 -0
- package/dist/uploads/driver.js +18 -0
- package/dist/uploads/driver.js.map +1 -0
- package/dist/uploads/policy.d.ts +39 -0
- package/dist/uploads/schema.d.ts +278 -0
- package/dist/uploads/schema.js +167 -0
- package/dist/uploads/schema.js.map +1 -0
- package/dist/uploads/signed-driver.d.ts +8 -0
- package/dist/uploads/signed-driver.js +36 -0
- package/dist/uploads/signed-driver.js.map +1 -0
- package/dist/uploads/store.d.ts +26 -0
- package/dist/uploads/store.js +51 -0
- package/dist/uploads/store.js.map +1 -0
- package/dist/uploads/verification.js +86 -0
- package/dist/uploads/verification.js.map +1 -0
- package/dist/uploads.d.ts +518 -0
- package/dist/uploads.js +330 -0
- package/dist/uploads.js.map +1 -0
- package/dist/vercel/authorized-uploads.d.ts +7 -0
- package/dist/vercel/authorized-uploads.js +15 -0
- package/dist/vercel/authorized-uploads.js.map +1 -0
- package/dist/vercel/client.d.ts +16 -0
- package/dist/vercel/client.js +28 -0
- package/dist/vercel/client.js.map +1 -0
- package/dist/vercel/signing.d.ts +19 -0
- package/dist/vercel/signing.js +120 -0
- package/dist/vercel/signing.js.map +1 -0
- package/dist/vercel/uploads.d.ts +36 -0
- package/dist/vercel/uploads.js +161 -0
- package/dist/vercel/uploads.js.map +1 -0
- package/dist/vercel.d.ts +86 -0
- package/dist/vercel.js +46 -0
- package/dist/vercel.js.map +1 -0
- package/dist/wasabi/admin.d.ts +112 -0
- package/dist/wasabi/admin.js +19 -0
- package/dist/wasabi/admin.js.map +1 -0
- package/dist/wasabi/native.d.ts +200 -0
- package/dist/wasabi/native.js +132 -0
- package/dist/wasabi/native.js.map +1 -0
- package/dist/wasabi.d.ts +15 -0
- package/dist/wasabi.js +15 -0
- package/dist/wasabi.js.map +1 -0
- package/dist/workflows/content/collection.js +122 -0
- package/dist/workflows/content/collection.js.map +1 -0
- package/dist/workflows/content/references.js +113 -0
- package/dist/workflows/content/references.js.map +1 -0
- package/dist/workflows/content/schema.d.ts +58 -0
- package/dist/workflows/content/schema.js +64 -0
- package/dist/workflows/content/schema.js.map +1 -0
- package/dist/workflows/endpoint.js +16 -0
- package/dist/workflows/endpoint.js.map +1 -0
- package/dist/workflows/migrations/schema.d.ts +149 -0
- package/dist/workflows/migrations/schema.js +58 -0
- package/dist/workflows/migrations/schema.js.map +1 -0
- package/dist/workflows/mirror/operations.js +175 -0
- package/dist/workflows/mirror/operations.js.map +1 -0
- package/dist/workflows/mirror/schema.d.ts +68 -0
- package/dist/workflows/mirror/schema.js +57 -0
- package/dist/workflows/mirror/schema.js.map +1 -0
- package/dist/workflows/mirror/view.js +103 -0
- package/dist/workflows/mirror/view.js.map +1 -0
- package/dist/workflows/objects.js +54 -0
- package/dist/workflows/objects.js.map +1 -0
- package/dist/workflows/store.d.ts +13 -0
- package/dist/workflows/store.js +58 -0
- package/dist/workflows/store.js.map +1 -0
- package/package.json +513 -3
package/dist/mirror.js
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { ObjectHeaders } from "./core/object.js";
|
|
2
|
+
import { digestText } from "./runtime/portable-hash.js";
|
|
3
|
+
import { StorageError, storageError } from "./core/errors.js";
|
|
4
|
+
import { DeleteRequest, PutRequest } from "./core/requests.js";
|
|
5
|
+
import { Storage } from "./core/storage.js";
|
|
6
|
+
import { TransferDriver, endpointStoreIds } from "./transfers/dependencies.js";
|
|
7
|
+
import { Transfers } from "./transfers.js";
|
|
8
|
+
import { makeRecordStore, workflowError } from "./workflows/store.js";
|
|
9
|
+
import { buildEndpoint } from "./workflows/endpoint.js";
|
|
10
|
+
import { pin } from "./workflows/objects.js";
|
|
11
|
+
import { makeStaging } from "./composition/representation/staging.js";
|
|
12
|
+
import { MirrorOperation, MirrorPointer, MirrorRepairPlan } from "./workflows/mirror/schema.js";
|
|
13
|
+
import { makeOperations, marker, pointerKey } from "./workflows/mirror/operations.js";
|
|
14
|
+
import { makeView } from "./workflows/mirror/view.js";
|
|
15
|
+
import { Context, Effect, Layer, Schema, Stream } from "effect";
|
|
16
|
+
import { SecureRandom } from "effect/crypto";
|
|
17
|
+
|
|
18
|
+
// src/workflows/mirror/index.ts
|
|
19
|
+
var MirrorStore = class MirrorStore extends Context.Service()("@effect-kit/storage/MirrorStore") {
|
|
20
|
+
static make(options) {
|
|
21
|
+
return makeRecordStore(options, "mirror");
|
|
22
|
+
}
|
|
23
|
+
static layer(options) {
|
|
24
|
+
return Layer.effect(MirrorStore, MirrorStore.make(options));
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const ensureRequired = (operation) => operation.outcomes.every((outcome) => !outcome.required || outcome.state === "succeeded") ? Effect.void : Effect.fail(new StorageError({
|
|
28
|
+
operation: operation.kind,
|
|
29
|
+
provider: "mirror",
|
|
30
|
+
reason: { _tag: "PartialFailure" },
|
|
31
|
+
mutationOutcome: "partial",
|
|
32
|
+
requestId: operation.id
|
|
33
|
+
}));
|
|
34
|
+
const make = Effect.fnUntraced(function* (configuration) {
|
|
35
|
+
const store = yield* MirrorStore;
|
|
36
|
+
const random = yield* SecureRandom.SecureRandom;
|
|
37
|
+
const stage = yield* makeStaging;
|
|
38
|
+
const selected = [{
|
|
39
|
+
endpoint: configuration.primary,
|
|
40
|
+
required: true
|
|
41
|
+
}, ...configuration.replicas.map((replica) => ({
|
|
42
|
+
endpoint: replica.storage,
|
|
43
|
+
required: replica.required
|
|
44
|
+
}))];
|
|
45
|
+
const physicalStores = selected.flatMap(({ endpoint }) => endpointStoreIds(endpoint));
|
|
46
|
+
if (!configuration.configurationId || !Number.isSafeInteger(configuration.maxBytes) || configuration.maxBytes < 1 || selected.length < 2 || selected.length > 9 || new Set(physicalStores).size !== physicalStores.length) return yield* workflowError("InvalidMirrorConfiguration");
|
|
47
|
+
const endpoints = yield* Effect.forEach(selected, (value) => Transfers.make(configuration.transfer).pipe(Effect.provideService(Storage, value.endpoint.storage), Effect.provideService(TransferDriver, value.endpoint), Effect.map((transfers) => ({
|
|
48
|
+
...value,
|
|
49
|
+
transfers
|
|
50
|
+
}))));
|
|
51
|
+
const maximumObjectBytes = Math.min(configuration.maxBytes, configuration.primary.maximumSingleUploadBytes, ...selected.filter((entry) => entry.required).map((entry) => entry.endpoint.maximumObjectBytes));
|
|
52
|
+
const putConditions = ["create-only", "if-match"].filter((condition) => selected.every((entry) => !entry.required || entry.endpoint.storage.capabilities.putConditions.includes(condition)));
|
|
53
|
+
const binding = digestText(JSON.stringify([configuration.configurationId, endpoints.map((entry) => [entry.endpoint.storage.storeId, entry.required])]));
|
|
54
|
+
yield* store.exclusive(Effect.gen(function* () {
|
|
55
|
+
const previous = yield* store.read("configuration", Schema.String);
|
|
56
|
+
if (previous && previous !== binding) return yield* workflowError("MirrorStoreConfigurationConflict");
|
|
57
|
+
if (!previous) yield* store.write("configuration", Schema.String, binding);
|
|
58
|
+
}));
|
|
59
|
+
const storeId = `mirror:${binding}`;
|
|
60
|
+
const operations = makeOperations(store, binding, endpoints);
|
|
61
|
+
const { virtual, current, resolve, listPage } = makeView(store, binding, endpoints, operations);
|
|
62
|
+
const write = (request) => store.exclusive(Effect.scoped(Effect.gen(function* () {
|
|
63
|
+
if (request.condition && !putConditions.includes(request.condition._tag === "CreateOnly" ? "create-only" : "if-match")) return yield* storageError("put", "mirror", {
|
|
64
|
+
_tag: "Unsupported",
|
|
65
|
+
capability: "write-condition"
|
|
66
|
+
}, "not-started");
|
|
67
|
+
yield* Schema.decodeUnknownEffect(PutRequest)(request).pipe(Effect.mapError(() => workflowError("InvalidWrite")));
|
|
68
|
+
if (!(request.body instanceof Uint8Array) && !Stream.isStream(request.body)) return yield* workflowError("InvalidBody");
|
|
69
|
+
const headers = yield* Schema.decodeUnknownEffect(ObjectHeaders)(request).pipe(Effect.mapError(() => workflowError("InvalidHeaders")));
|
|
70
|
+
if (headers.customMetadata?.["effect-storage-mirror"] !== void 0) return yield* workflowError("ReservedMetadata");
|
|
71
|
+
const staged = yield* stage(request.body instanceof Uint8Array ? Stream.succeed(request.body) : request.body, Math.min(maximumObjectBytes, request.maxBytes ?? maximumObjectBytes));
|
|
72
|
+
if (request.contentLength !== void 0 && request.contentLength !== staged.size) return yield* workflowError("LengthMismatch");
|
|
73
|
+
const id = request.id ?? (yield* random.uuidV4());
|
|
74
|
+
if (!/^[A-Za-z0-9_-]{1,128}$/u.test(id)) return yield* workflowError("InvalidOperationId");
|
|
75
|
+
const requestHash = digestText(JSON.stringify([
|
|
76
|
+
request.key,
|
|
77
|
+
headers,
|
|
78
|
+
request.condition,
|
|
79
|
+
staged.size,
|
|
80
|
+
staged.checksum.value
|
|
81
|
+
]));
|
|
82
|
+
const existing = yield* store.read(`operation:${id}`, MirrorOperation);
|
|
83
|
+
if (existing) {
|
|
84
|
+
if (existing.binding !== binding || existing.key !== request.key || existing.kind !== "put" || existing.requestHash !== requestHash) return yield* workflowError("OperationConflict");
|
|
85
|
+
const repaired = yield* operations.repair(existing);
|
|
86
|
+
if (repaired.outcomes[0]?.state === "succeeded" || repaired.state === "superseded") return {
|
|
87
|
+
operation: repaired,
|
|
88
|
+
metadata: repaired.outcomes[0]?.metadata ? virtual(repaired, repaired.outcomes[0].metadata) : void 0
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const previous = yield* store.read(pointerKey(request.key), MirrorPointer);
|
|
92
|
+
if (existing && previous && previous.generation > existing.generation) return yield* workflowError("SupersededOperation");
|
|
93
|
+
const previousOperation = previous?.kind === "put" ? yield* operations.load(previous.id) : void 0;
|
|
94
|
+
if (request.condition?._tag === "CreateOnly" && previousOperation && previousOperation.id !== id) return yield* storageError("put", "mirror", { _tag: "PreconditionFailed" }, "not-started");
|
|
95
|
+
if (request.condition?._tag === "IfMatch" && (!previousOperation || request.condition.etag !== `"mirror:${previousOperation.id}"`)) return yield* storageError("put", "mirror", { _tag: "PreconditionFailed" }, "not-started");
|
|
96
|
+
const operation = existing ?? (yield* operations.create(id, request.key, "put", staged.size, staged.checksum.value, requestHash));
|
|
97
|
+
const previousMetadata = previousOperation?.outcomes[0]?.metadata;
|
|
98
|
+
const physical = yield* Effect.result(configuration.primary.storage.put({
|
|
99
|
+
...headers,
|
|
100
|
+
key: request.key,
|
|
101
|
+
body: staged.stream(),
|
|
102
|
+
contentLength: staged.size,
|
|
103
|
+
maxBytes: maximumObjectBytes,
|
|
104
|
+
customMetadata: {
|
|
105
|
+
...headers.customMetadata,
|
|
106
|
+
[marker]: id
|
|
107
|
+
},
|
|
108
|
+
condition: previousMetadata?.etag ? {
|
|
109
|
+
_tag: "IfMatch",
|
|
110
|
+
etag: previousMetadata.etag
|
|
111
|
+
} : { _tag: "CreateOnly" }
|
|
112
|
+
}));
|
|
113
|
+
if (physical._tag === "Failure") yield* operations.save({
|
|
114
|
+
...operation,
|
|
115
|
+
outcomes: operation.outcomes.map((outcome, index) => index === 0 ? {
|
|
116
|
+
...outcome,
|
|
117
|
+
state: "unknown",
|
|
118
|
+
error: physical.failure
|
|
119
|
+
} : outcome)
|
|
120
|
+
});
|
|
121
|
+
const repaired = yield* operations.repair(yield* operations.load(operation.id));
|
|
122
|
+
return {
|
|
123
|
+
operation: repaired,
|
|
124
|
+
metadata: repaired.outcomes[0]?.metadata ? virtual(repaired, repaired.outcomes[0].metadata) : void 0
|
|
125
|
+
};
|
|
126
|
+
})));
|
|
127
|
+
const remove = (request) => store.exclusive(Effect.gen(function* () {
|
|
128
|
+
yield* Schema.decodeUnknownEffect(DeleteRequest)(request).pipe(Effect.mapError(() => workflowError("InvalidDelete")));
|
|
129
|
+
const key = "key" in request ? request.key : request.ref.key;
|
|
130
|
+
if ("ref" in request && request.ref.storeId !== storeId) return yield* workflowError("ForeignReference");
|
|
131
|
+
const previous = yield* store.read(pointerKey(key), MirrorPointer);
|
|
132
|
+
if (previous?.kind === "delete") return yield* operations.repair(yield* operations.load(previous.id));
|
|
133
|
+
const operation = yield* current(request, false);
|
|
134
|
+
if (request.condition && request.condition.etag !== `"mirror:${operation.id}"`) return yield* storageError("delete", "mirror", { _tag: "PreconditionFailed" }, "not-started");
|
|
135
|
+
const tombstone = yield* operations.create(yield* random.uuidV4(), operation.key, "delete", 0, "");
|
|
136
|
+
yield* operations.activate(tombstone);
|
|
137
|
+
return yield* operations.repair(tombstone);
|
|
138
|
+
}));
|
|
139
|
+
const storage = Storage.make({
|
|
140
|
+
provider: "mirror",
|
|
141
|
+
storeId,
|
|
142
|
+
capabilities: {
|
|
143
|
+
putConditions,
|
|
144
|
+
getConditions: ["if-match", "if-none-match"],
|
|
145
|
+
deleteConditions: ["if-match"],
|
|
146
|
+
versionedReads: "current-only",
|
|
147
|
+
ranges: configuration.primary.storage.capabilities.ranges.filter((range) => endpoints.every((endpoint) => endpoint.endpoint.storage.capabilities.ranges.includes(range))),
|
|
148
|
+
list: {
|
|
149
|
+
maxPageSize: 1e3,
|
|
150
|
+
delimiter: false,
|
|
151
|
+
cursorPersistence: "provider",
|
|
152
|
+
snapshot: false
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
put: (request) => write(request).pipe(Effect.flatMap((receipt) => ensureRequired(receipt.operation).pipe(Effect.flatMap(() => receipt.metadata ? Effect.succeed(receipt.metadata) : Effect.fail(workflowError("MissingPrimaryReceipt")))))),
|
|
156
|
+
delete: (request) => remove(request).pipe(Effect.flatMap(ensureRequired)),
|
|
157
|
+
head: (request) => store.exclusive(Effect.gen(function* () {
|
|
158
|
+
const operation = yield* current(request);
|
|
159
|
+
const source = yield* resolve(operation);
|
|
160
|
+
return virtual(operation, source.metadata);
|
|
161
|
+
})),
|
|
162
|
+
get: (request) => store.exclusive(Effect.gen(function* () {
|
|
163
|
+
const operation = yield* current(request);
|
|
164
|
+
const source = yield* resolve(operation);
|
|
165
|
+
const metadata = virtual(operation, source.metadata);
|
|
166
|
+
if (request.condition?._tag === "IfMatch" && request.condition.etag !== metadata.etag && request.condition.etag !== "*") return yield* storageError("get", "mirror", { _tag: "PreconditionFailed" });
|
|
167
|
+
if (request.condition?._tag === "IfNoneMatch" && (request.condition.etag === metadata.etag || request.condition.etag === "*")) return {
|
|
168
|
+
_tag: "NotModified",
|
|
169
|
+
metadata
|
|
170
|
+
};
|
|
171
|
+
const value = yield* source.endpoint.storage.get({
|
|
172
|
+
...yield* pin(source.metadata),
|
|
173
|
+
...request.range ? { range: request.range } : {}
|
|
174
|
+
});
|
|
175
|
+
if (value._tag !== "Object") return yield* workflowError("ReplicaChanged");
|
|
176
|
+
return {
|
|
177
|
+
...value,
|
|
178
|
+
metadata
|
|
179
|
+
};
|
|
180
|
+
})),
|
|
181
|
+
listPage
|
|
182
|
+
});
|
|
183
|
+
const applyRepair = Effect.fnUntraced(function* (id, limit = 100) {
|
|
184
|
+
let plan = yield* store.read(`repair:${id}`, MirrorRepairPlan);
|
|
185
|
+
if (!plan || plan.binding !== binding || !Number.isSafeInteger(limit) || limit < 1 || limit > 1e3) return yield* workflowError("InvalidRepairPlan");
|
|
186
|
+
if (plan.state === "partial") plan = {
|
|
187
|
+
...plan,
|
|
188
|
+
offset: 0,
|
|
189
|
+
unresolved: 0
|
|
190
|
+
};
|
|
191
|
+
for (let attempted = 0; plan.offset < plan.count && attempted < limit; attempted++) {
|
|
192
|
+
const operationId = yield* store.read(`repair:${id}:${plan.offset}`, Schema.String);
|
|
193
|
+
const repaired = operationId ? yield* operations.repair(yield* operations.load(operationId)) : void 0;
|
|
194
|
+
const unresolved = plan.unresolved + (repaired && ["pending", "partial"].includes(repaired.state) ? 1 : 0);
|
|
195
|
+
plan = {
|
|
196
|
+
id: plan.id,
|
|
197
|
+
binding: plan.binding,
|
|
198
|
+
count: plan.count,
|
|
199
|
+
prefix: plan.prefix,
|
|
200
|
+
unresolved,
|
|
201
|
+
offset: plan.offset + 1,
|
|
202
|
+
state: plan.offset + 1 >= plan.count ? unresolved ? "partial" : "completed" : "applying"
|
|
203
|
+
};
|
|
204
|
+
yield* store.write(`repair:${id}`, MirrorRepairPlan, plan);
|
|
205
|
+
}
|
|
206
|
+
return plan;
|
|
207
|
+
});
|
|
208
|
+
return {
|
|
209
|
+
storage,
|
|
210
|
+
maximumObjectBytes,
|
|
211
|
+
write,
|
|
212
|
+
remove,
|
|
213
|
+
status: (id) => store.exclusive(operations.load(id)),
|
|
214
|
+
statusFor: (key) => store.exclusive(Effect.gen(function* () {
|
|
215
|
+
const pointer = yield* store.read(pointerKey(key), MirrorPointer);
|
|
216
|
+
return pointer ? yield* operations.load(pointer.id) : void 0;
|
|
217
|
+
})),
|
|
218
|
+
planRepair: (request) => store.exclusive(Effect.gen(function* () {
|
|
219
|
+
yield* Schema.decodeUnknownEffect(Schema.String)(request.prefix).pipe(Effect.mapError(() => workflowError("InvalidPrefix")));
|
|
220
|
+
const id = yield* random.uuidV4();
|
|
221
|
+
let count = 0;
|
|
222
|
+
const upper = (yield* store.read("sequence", Schema.Natural)) ?? 0;
|
|
223
|
+
for (let index = 1; index <= upper; index++) {
|
|
224
|
+
const operationId = yield* store.read(`index:${index}`, Schema.String);
|
|
225
|
+
if (!operationId) continue;
|
|
226
|
+
const operation = yield* operations.load(operationId);
|
|
227
|
+
const pointer = yield* store.read(pointerKey(operation.key), MirrorPointer);
|
|
228
|
+
if (!operation.key.startsWith(request.prefix) || pointer && pointer.generation > operation.generation) continue;
|
|
229
|
+
yield* store.write(`repair:${id}:${count++}`, Schema.String, operation.id);
|
|
230
|
+
}
|
|
231
|
+
const plan = {
|
|
232
|
+
id,
|
|
233
|
+
binding,
|
|
234
|
+
prefix: request.prefix,
|
|
235
|
+
count,
|
|
236
|
+
unresolved: 0,
|
|
237
|
+
offset: 0,
|
|
238
|
+
state: count ? "planned" : "completed"
|
|
239
|
+
};
|
|
240
|
+
yield* store.write(`repair:${id}`, MirrorRepairPlan, plan);
|
|
241
|
+
return plan;
|
|
242
|
+
})),
|
|
243
|
+
inspectRepair: (id, page = {}) => store.exclusive(Effect.gen(function* () {
|
|
244
|
+
const plan = yield* store.read(`repair:${id}`, MirrorRepairPlan);
|
|
245
|
+
if (!plan || plan.binding !== binding) return yield* workflowError("InvalidRepairPlan");
|
|
246
|
+
const offset = page.offset ?? 0;
|
|
247
|
+
const limit = page.limit ?? 100;
|
|
248
|
+
if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(limit) || limit < 1 || limit > 1e3) return yield* workflowError("InvalidPage");
|
|
249
|
+
const entries = [];
|
|
250
|
+
for (let index = offset; index < Math.min(plan.count, offset + limit); index++) {
|
|
251
|
+
const operationId = yield* store.read(`repair:${id}:${index}`, Schema.String);
|
|
252
|
+
if (operationId) entries.push(yield* operations.load(operationId));
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
plan,
|
|
256
|
+
entries,
|
|
257
|
+
...offset + entries.length < plan.count ? { nextOffset: offset + entries.length } : {}
|
|
258
|
+
};
|
|
259
|
+
})),
|
|
260
|
+
applyRepair: (id, options) => store.exclusive(applyRepair(id, options?.limit))
|
|
261
|
+
};
|
|
262
|
+
});
|
|
263
|
+
var StorageMirror = class StorageMirror extends Context.Service()("@effect-kit/storage/StorageMirror") {
|
|
264
|
+
static make = make;
|
|
265
|
+
static layer(options) {
|
|
266
|
+
return Layer.effectContext(Effect.gen(function* () {
|
|
267
|
+
const primary = yield* buildEndpoint(options.primary);
|
|
268
|
+
const replicas = yield* Effect.forEach(options.replicas, (replica) => buildEndpoint(replica.storage).pipe(Effect.map((endpoint) => ({
|
|
269
|
+
storage: endpoint,
|
|
270
|
+
required: replica.required
|
|
271
|
+
}))));
|
|
272
|
+
const mirror = yield* make({
|
|
273
|
+
...options,
|
|
274
|
+
primary,
|
|
275
|
+
replicas
|
|
276
|
+
});
|
|
277
|
+
return Context.make(StorageMirror, mirror).pipe(Context.add(Storage, mirror.storage), Context.add(TransferDriver, {
|
|
278
|
+
storage: mirror.storage,
|
|
279
|
+
maximumObjectBytes: mirror.maximumObjectBytes,
|
|
280
|
+
maximumSingleUploadBytes: mirror.maximumObjectBytes,
|
|
281
|
+
transportOverheadBytes: primary.transportOverheadBytes,
|
|
282
|
+
underlyingStoreId: primary.underlyingStoreId ?? primary.storage.storeId,
|
|
283
|
+
underlyingStoreIds: [...endpointStoreIds(primary), ...replicas.flatMap((replica) => endpointStoreIds(replica.storage))]
|
|
284
|
+
}));
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
export { MirrorOperation, MirrorRepairPlan, MirrorStore, StorageMirror };
|
|
290
|
+
//# sourceMappingURL=mirror.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror.js","names":[],"sources":["../src/workflows/mirror/index.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema, Stream } from \"effect\";\nimport type { Scope } from \"effect\";\nimport { SecureRandom } from \"effect/crypto\";\n\nimport { makeStaging } from \"../../composition/representation/staging.js\";\nimport { StorageError, storageError } from \"../../core/errors.js\";\nimport { ObjectHeaders } from \"../../core/object.js\";\nimport { DeleteRequest, PutRequest } from \"../../core/requests.js\";\nimport type { GetResult } from \"../../core/requests.js\";\nimport { Storage } from \"../../core/storage.js\";\nimport { digestText } from \"../../runtime/portable-hash.js\";\nimport { endpointStoreIds, TransferDriver } from \"../../transfers/dependencies.js\";\nimport { Transfers } from \"../../transfers/index.js\";\nimport type { TransferEndpoint, TransferPolicy } from \"../../transfers/models.js\";\nimport { buildEndpoint } from \"../endpoint.js\";\nimport { pin } from \"../objects.js\";\nimport { makeRecordStore, workflowError } from \"../store.js\";\nimport type { RecordStore, WorkflowStoreOptions } from \"../store.js\";\nimport { makeOperations, marker, pointerKey } from \"./operations.js\";\nimport { MirrorOperation, MirrorPointer, MirrorRepairPlan } from \"./schema.js\";\nimport { makeView } from \"./view.js\";\n\nexport { MirrorOperation, MirrorRepairPlan };\nexport type { WorkflowStoreOptions as MirrorStoreOptions } from \"../store.js\";\nexport class MirrorStore extends Context.Service<MirrorStore, RecordStore>()(\n \"@effect-kit/storage/MirrorStore\",\n) {\n static make(options: WorkflowStoreOptions) {\n return makeRecordStore(options, \"mirror\");\n }\n static layer(options: WorkflowStoreOptions) {\n return Layer.effect(MirrorStore, MirrorStore.make(options));\n }\n}\nexport interface MirrorOptions {\n readonly configurationId: string;\n readonly primary: TransferEndpoint;\n readonly replicas: ReadonlyArray<{\n readonly storage: TransferEndpoint;\n readonly required: boolean;\n }>;\n readonly maxBytes: number;\n readonly transfer?: TransferPolicy;\n}\nconst ensureRequired = (operation: MirrorOperation): Effect.Effect<void, StorageError> =>\n operation.outcomes.every((outcome) => !outcome.required || outcome.state === \"succeeded\")\n ? Effect.void\n : Effect.fail(\n new StorageError({\n operation: operation.kind,\n provider: \"mirror\",\n reason: { _tag: \"PartialFailure\" },\n mutationOutcome: \"partial\",\n requestId: operation.id,\n }),\n );\n\nconst make = Effect.fnUntraced(function* (configuration: MirrorOptions) {\n const store = yield* MirrorStore;\n const random = yield* SecureRandom.SecureRandom;\n const stage = yield* makeStaging;\n const selected = [\n { endpoint: configuration.primary, required: true },\n ...configuration.replicas.map((replica) => ({\n endpoint: replica.storage,\n required: replica.required,\n })),\n ];\n const physicalStores = selected.flatMap(({ endpoint }) => endpointStoreIds(endpoint));\n if (\n !configuration.configurationId ||\n !Number.isSafeInteger(configuration.maxBytes) ||\n configuration.maxBytes < 1 ||\n selected.length < 2 ||\n selected.length > 9 ||\n new Set(physicalStores).size !== physicalStores.length\n )\n return yield* workflowError(\"InvalidMirrorConfiguration\");\n const endpoints = yield* Effect.forEach(selected, (value) =>\n Transfers.make(configuration.transfer).pipe(\n Effect.provideService(Storage, value.endpoint.storage),\n Effect.provideService(TransferDriver, value.endpoint),\n Effect.map((transfers) => ({ ...value, transfers })),\n ),\n );\n const maximumObjectBytes = Math.min(\n configuration.maxBytes,\n configuration.primary.maximumSingleUploadBytes,\n ...selected.filter((entry) => entry.required).map((entry) => entry.endpoint.maximumObjectBytes),\n );\n const putConditions = ([\"create-only\", \"if-match\"] as const).filter((condition) =>\n selected.every(\n (entry) =>\n !entry.required || entry.endpoint.storage.capabilities.putConditions.includes(condition),\n ),\n );\n const binding = digestText(\n JSON.stringify([\n configuration.configurationId,\n endpoints.map((entry) => [entry.endpoint.storage.storeId, entry.required]),\n ]),\n );\n yield* store.exclusive(\n Effect.gen(function* () {\n const previous = yield* store.read(\"configuration\", Schema.String);\n if (previous && previous !== binding)\n return yield* workflowError(\"MirrorStoreConfigurationConflict\");\n if (!previous) yield* store.write(\"configuration\", Schema.String, binding);\n }),\n );\n const storeId = `mirror:${binding}`;\n const operations = makeOperations(store, binding, endpoints);\n const { virtual, current, resolve, listPage } = makeView(store, binding, endpoints, operations);\n const write = <E = never, R = never>(request: PutRequest<E, R> & { readonly id?: string }) =>\n store.exclusive(\n Effect.scoped(\n Effect.gen(function* () {\n if (\n request.condition &&\n !putConditions.includes(\n request.condition._tag === \"CreateOnly\" ? \"create-only\" : \"if-match\",\n )\n )\n return yield* storageError(\n \"put\",\n \"mirror\",\n { _tag: \"Unsupported\", capability: \"write-condition\" },\n \"not-started\",\n );\n yield* Schema.decodeUnknownEffect(PutRequest)(request).pipe(\n Effect.mapError(() => workflowError(\"InvalidWrite\")),\n );\n if (!(request.body instanceof Uint8Array) && !Stream.isStream(request.body))\n return yield* workflowError(\"InvalidBody\");\n const headers = yield* Schema.decodeUnknownEffect(ObjectHeaders)(request).pipe(\n Effect.mapError(() => workflowError(\"InvalidHeaders\")),\n );\n if (headers.customMetadata?.[marker] !== undefined)\n return yield* workflowError(\"ReservedMetadata\");\n const staged = yield* stage(\n request.body instanceof Uint8Array ? Stream.succeed(request.body) : request.body,\n Math.min(maximumObjectBytes, request.maxBytes ?? maximumObjectBytes),\n );\n if (request.contentLength !== undefined && request.contentLength !== staged.size)\n return yield* workflowError(\"LengthMismatch\");\n const id = request.id ?? (yield* random.uuidV4());\n if (!/^[A-Za-z0-9_-]{1,128}$/u.test(id))\n return yield* workflowError(\"InvalidOperationId\");\n const requestHash = digestText(\n JSON.stringify([\n request.key,\n headers,\n request.condition,\n staged.size,\n staged.checksum.value,\n ]),\n );\n const existing = yield* store.read(`operation:${id}`, MirrorOperation);\n if (existing) {\n if (\n existing.binding !== binding ||\n existing.key !== request.key ||\n existing.kind !== \"put\" ||\n existing.requestHash !== requestHash\n )\n return yield* workflowError(\"OperationConflict\");\n const repaired = yield* operations.repair(existing);\n if (repaired.outcomes[0]?.state === \"succeeded\" || repaired.state === \"superseded\")\n return {\n operation: repaired,\n metadata: repaired.outcomes[0]?.metadata\n ? virtual(repaired, repaired.outcomes[0].metadata)\n : undefined,\n };\n }\n const previous = yield* store.read(pointerKey(request.key), MirrorPointer);\n if (existing && previous && previous.generation > existing.generation)\n return yield* workflowError(\"SupersededOperation\");\n const previousOperation =\n previous?.kind === \"put\" ? yield* operations.load(previous.id) : undefined;\n if (\n request.condition?._tag === \"CreateOnly\" &&\n previousOperation &&\n previousOperation.id !== id\n )\n return yield* storageError(\n \"put\",\n \"mirror\",\n { _tag: \"PreconditionFailed\" },\n \"not-started\",\n );\n if (\n request.condition?._tag === \"IfMatch\" &&\n (!previousOperation || request.condition.etag !== `\"mirror:${previousOperation.id}\"`)\n )\n return yield* storageError(\n \"put\",\n \"mirror\",\n { _tag: \"PreconditionFailed\" },\n \"not-started\",\n );\n const operation =\n existing ??\n (yield* operations.create(\n id,\n request.key,\n \"put\",\n staged.size,\n staged.checksum.value,\n requestHash,\n ));\n const previousMetadata = previousOperation?.outcomes[0]?.metadata;\n const physical = yield* Effect.result(\n configuration.primary.storage.put({\n ...headers,\n key: request.key,\n body: staged.stream(),\n contentLength: staged.size,\n maxBytes: maximumObjectBytes,\n customMetadata: { ...headers.customMetadata, [marker]: id },\n condition: previousMetadata?.etag\n ? { _tag: \"IfMatch\", etag: previousMetadata.etag }\n : { _tag: \"CreateOnly\" },\n }),\n );\n if (physical._tag === \"Failure\")\n yield* operations.save({\n ...operation,\n outcomes: operation.outcomes.map((outcome, index) =>\n index === 0 ? { ...outcome, state: \"unknown\", error: physical.failure } : outcome,\n ),\n });\n const repaired = yield* operations.repair(yield* operations.load(operation.id));\n return {\n operation: repaired,\n metadata: repaired.outcomes[0]?.metadata\n ? virtual(repaired, repaired.outcomes[0].metadata)\n : undefined,\n };\n }),\n ),\n );\n const remove = (request: DeleteRequest) =>\n store.exclusive(\n Effect.gen(function* () {\n yield* Schema.decodeUnknownEffect(DeleteRequest)(request).pipe(\n Effect.mapError(() => workflowError(\"InvalidDelete\")),\n );\n const key = \"key\" in request ? request.key : request.ref.key;\n if (\"ref\" in request && request.ref.storeId !== storeId)\n return yield* workflowError(\"ForeignReference\");\n const previous = yield* store.read(pointerKey(key), MirrorPointer);\n if (previous?.kind === \"delete\")\n return yield* operations.repair(yield* operations.load(previous.id));\n const operation = yield* current(request, false);\n if (request.condition && request.condition.etag !== `\"mirror:${operation.id}\"`)\n return yield* storageError(\n \"delete\",\n \"mirror\",\n { _tag: \"PreconditionFailed\" },\n \"not-started\",\n );\n const tombstone = yield* operations.create(\n yield* random.uuidV4(),\n operation.key,\n \"delete\",\n 0,\n \"\",\n );\n yield* operations.activate(tombstone);\n return yield* operations.repair(tombstone);\n }),\n );\n const storage = Storage.make({\n provider: \"mirror\",\n storeId,\n capabilities: {\n putConditions,\n getConditions: [\"if-match\", \"if-none-match\"],\n deleteConditions: [\"if-match\"],\n versionedReads: \"current-only\",\n ranges: configuration.primary.storage.capabilities.ranges.filter((range) =>\n endpoints.every((endpoint) =>\n endpoint.endpoint.storage.capabilities.ranges.includes(range),\n ),\n ),\n list: { maxPageSize: 1000, delimiter: false, cursorPersistence: \"provider\", snapshot: false },\n },\n put: (request) =>\n write(request).pipe(\n Effect.flatMap((receipt) =>\n ensureRequired(receipt.operation).pipe(\n Effect.flatMap(() =>\n receipt.metadata\n ? Effect.succeed(receipt.metadata)\n : Effect.fail(workflowError(\"MissingPrimaryReceipt\")),\n ),\n ),\n ),\n ),\n delete: (request) => remove(request).pipe(Effect.flatMap(ensureRequired)),\n head: (request) =>\n store.exclusive(\n Effect.gen(function* () {\n const operation = yield* current(request);\n const source = yield* resolve(operation);\n return virtual(operation, source.metadata);\n }),\n ),\n get: (request): Effect.Effect<GetResult, StorageError, Scope.Scope> =>\n store.exclusive(\n Effect.gen(function* () {\n const operation = yield* current(request);\n const source = yield* resolve(operation);\n const metadata = virtual(operation, source.metadata);\n if (\n request.condition?._tag === \"IfMatch\" &&\n request.condition.etag !== metadata.etag &&\n request.condition.etag !== \"*\"\n )\n return yield* storageError(\"get\", \"mirror\", { _tag: \"PreconditionFailed\" });\n if (\n request.condition?._tag === \"IfNoneMatch\" &&\n (request.condition.etag === metadata.etag || request.condition.etag === \"*\")\n )\n return { _tag: \"NotModified\", metadata };\n const value = yield* source.endpoint.storage.get({\n ...(yield* pin(source.metadata)),\n ...(request.range ? { range: request.range } : {}),\n });\n if (value._tag !== \"Object\") return yield* workflowError(\"ReplicaChanged\");\n return { ...value, metadata };\n }),\n ),\n listPage,\n });\n const applyRepair = Effect.fnUntraced(function* (id: string, limit = 100) {\n let plan = yield* store.read(`repair:${id}`, MirrorRepairPlan);\n if (\n !plan ||\n plan.binding !== binding ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 1000\n )\n return yield* workflowError(\"InvalidRepairPlan\");\n if (plan.state === \"partial\") plan = { ...plan, offset: 0, unresolved: 0 };\n for (let attempted = 0; plan.offset < plan.count && attempted < limit; attempted++) {\n const operationId = yield* store.read(`repair:${id}:${plan.offset}`, Schema.String);\n const repaired = operationId\n ? yield* operations.repair(yield* operations.load(operationId))\n : undefined;\n const unresolved: number =\n plan.unresolved + (repaired && [\"pending\", \"partial\"].includes(repaired.state) ? 1 : 0);\n plan = {\n id: plan.id,\n binding: plan.binding,\n count: plan.count,\n prefix: plan.prefix,\n unresolved,\n offset: plan.offset + 1,\n state: plan.offset + 1 >= plan.count ? (unresolved ? \"partial\" : \"completed\") : \"applying\",\n };\n yield* store.write(`repair:${id}`, MirrorRepairPlan, plan);\n }\n return plan;\n });\n return {\n storage,\n maximumObjectBytes,\n write,\n remove,\n status: (id: string) => store.exclusive(operations.load(id)),\n statusFor: (key: string) =>\n store.exclusive(\n Effect.gen(function* () {\n const pointer = yield* store.read(pointerKey(key), MirrorPointer);\n return pointer ? yield* operations.load(pointer.id) : undefined;\n }),\n ),\n planRepair: (request: { readonly prefix: string }) =>\n store.exclusive(\n Effect.gen(function* () {\n yield* Schema.decodeUnknownEffect(Schema.String)(request.prefix).pipe(\n Effect.mapError(() => workflowError(\"InvalidPrefix\")),\n );\n const id = yield* random.uuidV4();\n let count = 0;\n const upper = (yield* store.read(\"sequence\", Schema.Natural)) ?? 0;\n for (let index = 1; index <= upper; index++) {\n const operationId = yield* store.read(`index:${index}`, Schema.String);\n if (!operationId) continue;\n const operation = yield* operations.load(operationId);\n const pointer = yield* store.read(pointerKey(operation.key), MirrorPointer);\n if (\n !operation.key.startsWith(request.prefix) ||\n (pointer && pointer.generation > operation.generation)\n )\n continue;\n yield* store.write(`repair:${id}:${count++}`, Schema.String, operation.id);\n }\n const plan: MirrorRepairPlan = {\n id,\n binding,\n prefix: request.prefix,\n count,\n unresolved: 0,\n offset: 0,\n state: count ? \"planned\" : \"completed\",\n };\n yield* store.write(`repair:${id}`, MirrorRepairPlan, plan);\n return plan;\n }),\n ),\n inspectRepair: (id: string, page: { readonly offset?: number; readonly limit?: number } = {}) =>\n store.exclusive(\n Effect.gen(function* () {\n const plan = yield* store.read(`repair:${id}`, MirrorRepairPlan);\n if (!plan || plan.binding !== binding) return yield* workflowError(\"InvalidRepairPlan\");\n const offset = page.offset ?? 0;\n const limit = page.limit ?? 100;\n if (\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 1000\n )\n return yield* workflowError(\"InvalidPage\");\n const entries: MirrorOperation[] = [];\n for (let index = offset; index < Math.min(plan.count, offset + limit); index++) {\n const operationId = yield* store.read(`repair:${id}:${index}`, Schema.String);\n if (operationId) entries.push(yield* operations.load(operationId));\n }\n return {\n plan,\n entries,\n ...(offset + entries.length < plan.count\n ? { nextOffset: offset + entries.length }\n : {}),\n };\n }),\n ),\n applyRepair: (id: string, options?: { readonly limit?: number }) =>\n store.exclusive(applyRepair(id, options?.limit)),\n };\n});\n\nexport class StorageMirror extends Context.Service<\n StorageMirror,\n Effect.Success<ReturnType<typeof make>>\n>()(\"@effect-kit/storage/StorageMirror\") {\n static readonly make = make;\n static layer<EP, RP, ER, RR>(\n options: Omit<MirrorOptions, \"primary\" | \"replicas\"> & {\n readonly primary: Layer.Layer<Storage | TransferDriver, EP, RP>;\n readonly replicas: ReadonlyArray<{\n readonly storage: Layer.Layer<Storage | TransferDriver, ER, RR>;\n readonly required: boolean;\n }>;\n },\n ) {\n return Layer.effectContext(\n Effect.gen(function* () {\n const primary = yield* buildEndpoint(options.primary);\n const replicas = yield* Effect.forEach(options.replicas, (replica) =>\n buildEndpoint(replica.storage).pipe(\n Effect.map((endpoint) => ({\n storage: endpoint,\n required: replica.required,\n })),\n ),\n );\n const mirror = yield* make({ ...options, primary, replicas });\n return Context.make(StorageMirror, mirror).pipe(\n Context.add(Storage, mirror.storage),\n Context.add(TransferDriver, {\n storage: mirror.storage,\n maximumObjectBytes: mirror.maximumObjectBytes,\n maximumSingleUploadBytes: mirror.maximumObjectBytes,\n transportOverheadBytes: primary.transportOverheadBytes,\n underlyingStoreId: primary.underlyingStoreId ?? primary.storage.storeId,\n underlyingStoreIds: [\n ...endpointStoreIds(primary),\n ...replicas.flatMap((replica) => endpointStoreIds(replica.storage)),\n ],\n }),\n );\n }),\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { StorageError } from "./core/errors.js";
|
|
2
|
+
import "./index.js";
|
|
3
|
+
import { TransferHash } from "./transfers/dependencies.js";
|
|
4
|
+
import { UploadSessionStore } from "./sessions/store.js";
|
|
5
|
+
import { sha256 } from "./runtime/node-hash.js";
|
|
6
|
+
import { aes256Gcm } from "./runtime/node-protection.js";
|
|
7
|
+
import { FileSessionStoreOptions } from "./runtime/session-store.js";
|
|
8
|
+
import { atomicFileStore } from "./runtime/filesystem.js";
|
|
9
|
+
import { fileDownloadTarget } from "./runtime/file-target.js";
|
|
10
|
+
import { Layer } from "effect";
|
|
11
|
+
export declare const layer: Layer.Layer<import("effect/crypto/Digest").Digest | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom | TransferHash, never, never>;
|
|
12
|
+
export declare const sessionStore: (options: FileSessionStoreOptions) => Layer.Layer<UploadSessionStore, import("effect/persistence/KeyValueStore").KeyValueStoreError | StorageError, import("effect/crypto/Digest").Digest | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom>;
|
|
13
|
+
export { type FileSessionStoreOptions, aes256Gcm, atomicFileStore, fileDownloadTarget, sha256 };
|
|
14
|
+
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TransferHash } from "./transfers/dependencies.js";
|
|
2
|
+
import { sha256 } from "./runtime/node-hash.js";
|
|
3
|
+
import { aes256Gcm } from "./runtime/node-protection.js";
|
|
4
|
+
import { atomicFileStore } from "./runtime/filesystem.js";
|
|
5
|
+
import { fileSessionStore } from "./runtime/session-store.js";
|
|
6
|
+
import { fileDownloadTarget } from "./runtime/file-target.js";
|
|
7
|
+
import { Effect, Layer } from "effect";
|
|
8
|
+
import * as NodeCrypto from "@effect/platform-node/NodeCrypto";
|
|
9
|
+
import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
|
|
10
|
+
import * as NodePath from "@effect/platform-node/NodePath";
|
|
11
|
+
|
|
12
|
+
// src/runtime/node.ts
|
|
13
|
+
const layer = Layer.mergeAll(NodeFileSystem.layer, NodePath.layer, NodeCrypto.layerSecureRandom, NodeCrypto.layerDigest, Layer.succeed(TransferHash, sha256));
|
|
14
|
+
const sessionStore = (options) => fileSessionStore(options, Effect.sync(() => aes256Gcm(options.key)));
|
|
15
|
+
|
|
16
|
+
export { aes256Gcm, atomicFileStore, fileDownloadTarget, layer, sessionStore, sha256 };
|
|
17
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","names":[],"sources":["../src/runtime/node.ts"],"sourcesContent":["import * as NodeCrypto from \"@effect/platform-node/NodeCrypto\";\nimport * as NodeFileSystem from \"@effect/platform-node/NodeFileSystem\";\nimport * as NodePath from \"@effect/platform-node/NodePath\";\nimport { Effect, Layer } from \"effect\";\n\nimport { TransferHash } from \"../transfers/dependencies.js\";\nimport { sha256 } from \"./node-hash.js\";\nimport { aes256Gcm } from \"./node-protection.js\";\nimport { fileSessionStore } from \"./session-store.js\";\nimport type { FileSessionStoreOptions } from \"./session-store.js\";\n\nexport { sha256, aes256Gcm };\nexport { atomicFileStore } from \"./filesystem.js\";\nexport { fileDownloadTarget } from \"./file-target.js\";\nexport type { FileSessionStoreOptions } from \"./session-store.js\";\n\nexport const layer = Layer.mergeAll(\n NodeFileSystem.layer,\n NodePath.layer,\n NodeCrypto.layerSecureRandom,\n NodeCrypto.layerDigest,\n Layer.succeed(TransferHash, sha256),\n);\nexport const sessionStore = (options: FileSessionStoreOptions) =>\n fileSessionStore(\n options,\n Effect.sync(() => aes256Gcm(options.key)),\n );\n"],"mappings":";;;;;;;;;;;;AAgBA,MAAa,QAAQ,MAAM,SACzB,eAAe,OACf,SAAS,OACT,WAAW,mBACX,WAAW,aACX,MAAM,QAAQ,cAAc,MAAM,CACpC;AACA,MAAa,gBAAgB,YAC3B,iBACE,SACA,OAAO,WAAW,UAAU,QAAQ,GAAG,CAAC,CAC1C"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { storageError } from "../../core/errors.js";
|
|
2
|
+
import { uploadBody } from "../../internal/node/upload-body.js";
|
|
3
|
+
import { encryption, lease } from "./config.js";
|
|
4
|
+
import { condition, metadata, nativeHeaders, target, writeMetadata } from "./mapping.js";
|
|
5
|
+
import { request } from "./transport.js";
|
|
6
|
+
import { Effect, Schema } from "effect";
|
|
7
|
+
|
|
8
|
+
// src/providers/azure/blocks.ts
|
|
9
|
+
const BlockId = Schema.NonEmptyString.check(Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u), Schema.isMaxLength(88));
|
|
10
|
+
const mapBlocks = (blocks) => (blocks ?? []).map((block) => ({
|
|
11
|
+
blockId: block.name,
|
|
12
|
+
size: block.size
|
|
13
|
+
}));
|
|
14
|
+
function blockUploads(connection) {
|
|
15
|
+
const blob = Effect.fnUntraced(function* (ref) {
|
|
16
|
+
const address = yield* target(connection, { ref }, "blocks");
|
|
17
|
+
if (ref.version) return yield* storageError("blocks", "azure", {
|
|
18
|
+
_tag: "InvalidInput",
|
|
19
|
+
field: "ref.version"
|
|
20
|
+
}, "not-started");
|
|
21
|
+
return connection.client.getBlockBlobClient(address.ref.key);
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
limits: {
|
|
25
|
+
maximumBlockBytes: 4194304e3,
|
|
26
|
+
maximumBlocks: 5e4
|
|
27
|
+
},
|
|
28
|
+
stage: Effect.fnUntraced(function* (input) {
|
|
29
|
+
const client = yield* blob(input.ref);
|
|
30
|
+
yield* Schema.decodeUnknownEffect(BlockId)(input.blockId).pipe(Effect.mapError(() => storageError("stageBlock", "azure", {
|
|
31
|
+
_tag: "InvalidInput",
|
|
32
|
+
field: "blockId"
|
|
33
|
+
}, "not-started")));
|
|
34
|
+
if (!input.contentLength || input.contentLength > 4194304e3) return yield* storageError("stageBlock", "azure", {
|
|
35
|
+
_tag: "InvalidInput",
|
|
36
|
+
field: "contentLength"
|
|
37
|
+
}, "not-started");
|
|
38
|
+
yield* uploadBody({
|
|
39
|
+
provider: "azure",
|
|
40
|
+
maxUnknownLengthBytes: connection.config.maxUnknownLengthBytes
|
|
41
|
+
}, input, "stageBlock", (body, length) => request(connection, "stageBlock", true, (signal) => client.stageBlock(input.blockId, body, length, {
|
|
42
|
+
abortSignal: signal,
|
|
43
|
+
conditions: lease(connection.config),
|
|
44
|
+
...encryption(connection.config),
|
|
45
|
+
contentChecksumAlgorithm: connection.config.checksumAlgorithm
|
|
46
|
+
})));
|
|
47
|
+
}),
|
|
48
|
+
list: Effect.fnUntraced(function* (ref) {
|
|
49
|
+
const client = yield* blob(ref);
|
|
50
|
+
const result = yield* request(connection, "listBlocks", false, (signal) => client.getBlockList("all", {
|
|
51
|
+
abortSignal: signal,
|
|
52
|
+
conditions: lease(connection.config)
|
|
53
|
+
})).pipe(Effect.catchReason("StorageError", "NotFound", () => Effect.succeed({
|
|
54
|
+
committedBlocks: [],
|
|
55
|
+
uncommittedBlocks: []
|
|
56
|
+
})));
|
|
57
|
+
return {
|
|
58
|
+
committed: mapBlocks(result.committedBlocks),
|
|
59
|
+
uncommitted: mapBlocks(result.uncommittedBlocks)
|
|
60
|
+
};
|
|
61
|
+
}),
|
|
62
|
+
commit: Effect.fnUntraced(function* (input) {
|
|
63
|
+
const client = yield* blob(input.ref);
|
|
64
|
+
if (input.blockIds.length > 5e4 || new Set(input.blockIds).size !== input.blockIds.length || new Set(input.blockIds.map((id) => Buffer.from(id, "base64").length)).size > 1) return yield* storageError("commitBlocks", "azure", {
|
|
65
|
+
_tag: "InvalidInput",
|
|
66
|
+
field: "blockIds"
|
|
67
|
+
}, "not-started");
|
|
68
|
+
yield* Effect.forEach(input.blockIds, (id) => Schema.decodeUnknownEffect(BlockId)(id).pipe(Effect.mapError(() => storageError("commitBlocks", "azure", {
|
|
69
|
+
_tag: "InvalidInput",
|
|
70
|
+
field: "blockId"
|
|
71
|
+
}, "not-started"))));
|
|
72
|
+
const headers = input.headers ?? {};
|
|
73
|
+
const customMetadata = yield* writeMetadata(headers);
|
|
74
|
+
const result = yield* request(connection, "commitBlocks", true, (signal) => client.commitBlockList([...input.blockIds], {
|
|
75
|
+
abortSignal: signal,
|
|
76
|
+
conditions: {
|
|
77
|
+
...condition(input.condition),
|
|
78
|
+
...lease(connection.config)
|
|
79
|
+
},
|
|
80
|
+
blobHTTPHeaders: nativeHeaders(headers),
|
|
81
|
+
metadata: customMetadata,
|
|
82
|
+
...encryption(connection.config)
|
|
83
|
+
}));
|
|
84
|
+
return metadata(connection, input.ref.key, {
|
|
85
|
+
...result,
|
|
86
|
+
...headers,
|
|
87
|
+
metadata: customMetadata
|
|
88
|
+
});
|
|
89
|
+
})
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export { blockUploads };
|
|
94
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","names":[],"sources":["../../../src/providers/azure/blocks.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport type { BlockUploads } from \"../../core/contracts/resumable.js\";\nimport { storageError } from \"../../core/errors.js\";\nimport type { ObjectRef } from \"../../core/object.js\";\nimport { uploadBody } from \"../../internal/node/upload-body.js\";\nimport { encryption, lease } from \"./config.js\";\nimport type { AzureConnection } from \"./config.js\";\nimport { condition, metadata, nativeHeaders, target, writeMetadata } from \"./mapping.js\";\nimport { request } from \"./transport.js\";\n\nconst BlockId = Schema.NonEmptyString.check(\n Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u),\n Schema.isMaxLength(88),\n);\nconst mapBlocks = (blocks: ReadonlyArray<{ name: string; size: number }> | undefined) =>\n (blocks ?? []).map((block) => ({ blockId: block.name, size: block.size }));\n\nexport function blockUploads(connection: AzureConnection): BlockUploads {\n const blob = Effect.fnUntraced(function* (ref: ObjectRef) {\n const address = yield* target(connection, { ref }, \"blocks\");\n if (ref.version)\n return yield* storageError(\n \"blocks\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"ref.version\" },\n \"not-started\",\n );\n return connection.client.getBlockBlobClient(address.ref.key);\n });\n return {\n limits: { maximumBlockBytes: 4000 * 1024 * 1024, maximumBlocks: 50_000 },\n stage: Effect.fnUntraced(function* (input) {\n const client = yield* blob(input.ref);\n yield* Schema.decodeUnknownEffect(BlockId)(input.blockId).pipe(\n Effect.mapError(() =>\n storageError(\n \"stageBlock\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"blockId\" },\n \"not-started\",\n ),\n ),\n );\n if (!input.contentLength || input.contentLength > 4000 * 1024 * 1024)\n return yield* storageError(\n \"stageBlock\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"contentLength\" },\n \"not-started\",\n );\n yield* uploadBody(\n { provider: \"azure\", maxUnknownLengthBytes: connection.config.maxUnknownLengthBytes },\n input,\n \"stageBlock\",\n (body, length) =>\n request(connection, \"stageBlock\", true, (signal) =>\n client.stageBlock(input.blockId, body, length, {\n abortSignal: signal,\n conditions: lease(connection.config),\n ...encryption(connection.config),\n contentChecksumAlgorithm: connection.config.checksumAlgorithm,\n }),\n ),\n );\n }),\n list: Effect.fnUntraced(function* (ref) {\n const client = yield* blob(ref);\n const result = yield* request(connection, \"listBlocks\", false, (signal) =>\n client.getBlockList(\"all\", { abortSignal: signal, conditions: lease(connection.config) }),\n ).pipe(\n Effect.catchReason(\"StorageError\", \"NotFound\", () =>\n Effect.succeed({ committedBlocks: [], uncommittedBlocks: [] }),\n ),\n );\n return {\n committed: mapBlocks(result.committedBlocks),\n uncommitted: mapBlocks(result.uncommittedBlocks),\n };\n }),\n commit: Effect.fnUntraced(function* (input) {\n const client = yield* blob(input.ref);\n if (\n input.blockIds.length > 50_000 ||\n new Set(input.blockIds).size !== input.blockIds.length ||\n new Set(input.blockIds.map((id) => Buffer.from(id, \"base64\").length)).size > 1\n )\n return yield* storageError(\n \"commitBlocks\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"blockIds\" },\n \"not-started\",\n );\n yield* Effect.forEach(input.blockIds, (id) =>\n Schema.decodeUnknownEffect(BlockId)(id).pipe(\n Effect.mapError(() =>\n storageError(\n \"commitBlocks\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"blockId\" },\n \"not-started\",\n ),\n ),\n ),\n );\n const headers = input.headers ?? {};\n const customMetadata = yield* writeMetadata(headers);\n const result = yield* request(connection, \"commitBlocks\", true, (signal) =>\n client.commitBlockList([...input.blockIds], {\n abortSignal: signal,\n conditions: { ...condition(input.condition), ...lease(connection.config) },\n blobHTTPHeaders: nativeHeaders(headers),\n metadata: customMetadata,\n ...encryption(connection.config),\n }),\n );\n return metadata(connection, input.ref.key, {\n ...result,\n ...headers,\n metadata: customMetadata,\n });\n }),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { StorageError } from "../../core/errors.js";
|
|
2
|
+
import "../../index.js";
|
|
3
|
+
import { Effect, Redacted } from "effect";
|
|
4
|
+
import { ContainerClient, newPipeline } from "@azure/storage-blob";
|
|
5
|
+
export interface AzureConfig {
|
|
6
|
+
/** Complete container URL; an existing SAS must be wrapped in Redacted. */
|
|
7
|
+
readonly containerUrl: string | Redacted.Redacted<string>;
|
|
8
|
+
readonly storeId?: string;
|
|
9
|
+
readonly credential?: Parameters<typeof newPipeline>[0];
|
|
10
|
+
readonly requestTimeoutMillis?: number;
|
|
11
|
+
readonly maxUnknownLengthBytes?: number;
|
|
12
|
+
readonly leaseId?: Redacted.Redacted<string>;
|
|
13
|
+
readonly encryption?: {
|
|
14
|
+
readonly scope: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly key: Redacted.Redacted<string>;
|
|
17
|
+
readonly keySHA256: string;
|
|
18
|
+
};
|
|
19
|
+
readonly checksumAlgorithm?: "None" | "StorageCrc64";
|
|
20
|
+
readonly profile?: "block-blob";
|
|
21
|
+
}
|
|
22
|
+
export declare const resolveConfig: (input: AzureConfig) => Effect.Effect<{
|
|
23
|
+
containerUrl: string;
|
|
24
|
+
storeId: string;
|
|
25
|
+
requestTimeoutMillis: number;
|
|
26
|
+
maxUnknownLengthBytes: number;
|
|
27
|
+
checksumAlgorithm: "None" | "StorageCrc64";
|
|
28
|
+
leaseId: Redacted.Redacted<string> | undefined;
|
|
29
|
+
encryption: {
|
|
30
|
+
scope: string;
|
|
31
|
+
} | {
|
|
32
|
+
key: Redacted.Redacted<string>;
|
|
33
|
+
keySHA256: string;
|
|
34
|
+
} | undefined;
|
|
35
|
+
}, StorageError, never>;
|
|
36
|
+
export type ResolvedAzureConfig = Effect.Success<ReturnType<typeof resolveConfig>>;
|
|
37
|
+
export interface AzureConnection {
|
|
38
|
+
readonly client: ContainerClient;
|
|
39
|
+
readonly config: ResolvedAzureConfig;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { HeaderValue } from "../../core/object.js";
|
|
2
|
+
import { storageError } from "../../core/errors.js";
|
|
3
|
+
import { Effect, Redacted, Schema } from "effect";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
|
|
6
|
+
// src/providers/azure/config.ts
|
|
7
|
+
const resolveConfig = Effect.fnUntraced(function* (input) {
|
|
8
|
+
yield* Schema.decodeUnknownEffect(Schema.Struct({
|
|
9
|
+
containerUrl: Schema.Union([Schema.String, Schema.Redacted(Schema.String)]),
|
|
10
|
+
storeId: Schema.optional(Schema.NonEmptyString),
|
|
11
|
+
credential: Schema.optional(Schema.Unknown),
|
|
12
|
+
requestTimeoutMillis: Schema.optional(Schema.Int.check(Schema.isGreaterThan(0))),
|
|
13
|
+
maxUnknownLengthBytes: Schema.optional(Schema.Int.check(Schema.isGreaterThan(0))),
|
|
14
|
+
leaseId: Schema.optional(Schema.Redacted(Schema.NonEmptyString)),
|
|
15
|
+
encryption: Schema.optional(Schema.Union([Schema.Struct({ scope: HeaderValue.check(Schema.isNonEmpty()) }), Schema.Struct({
|
|
16
|
+
key: Schema.Redacted(Schema.NonEmptyString),
|
|
17
|
+
keySHA256: Schema.NonEmptyString
|
|
18
|
+
})])),
|
|
19
|
+
checksumAlgorithm: Schema.optional(Schema.Literals(["None", "StorageCrc64"])),
|
|
20
|
+
profile: Schema.optional(Schema.Literal("block-blob"))
|
|
21
|
+
}), { onExcessProperty: "error" })(input).pipe(Effect.mapError(() => storageError("make", "azure", {
|
|
22
|
+
_tag: "InvalidConfiguration",
|
|
23
|
+
field: "config"
|
|
24
|
+
})));
|
|
25
|
+
const rawUrl = Redacted.isRedacted(input.containerUrl) ? Redacted.value(input.containerUrl) : input.containerUrl;
|
|
26
|
+
const url = URL.parse(rawUrl);
|
|
27
|
+
if (!url || !["http:", "https:"].includes(url.protocol) || url.username || url.password || url.hash || url.pathname === "/" || url.search && !Redacted.isRedacted(input.containerUrl) || input.encryption && url.protocol !== "https:") return yield* storageError("make", "azure", {
|
|
28
|
+
_tag: "InvalidConfiguration",
|
|
29
|
+
field: "containerUrl-or-encryption"
|
|
30
|
+
});
|
|
31
|
+
if (input.encryption && "key" in input.encryption) {
|
|
32
|
+
const encoded = Redacted.value(input.encryption.key);
|
|
33
|
+
const bytes = Buffer.from(encoded, "base64");
|
|
34
|
+
if (bytes.length !== 32 || bytes.toString("base64") !== encoded || createHash("sha256").update(bytes).digest("base64") !== input.encryption.keySHA256) return yield* storageError("make", "azure", {
|
|
35
|
+
_tag: "InvalidConfiguration",
|
|
36
|
+
field: "encryption.key"
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const publicUrl = `${url.origin}${url.pathname.replace(/\/$/u, "")}`;
|
|
40
|
+
return {
|
|
41
|
+
containerUrl: publicUrl,
|
|
42
|
+
storeId: input.storeId ?? `azure:${createHash("sha256").update(publicUrl).digest("hex")}`,
|
|
43
|
+
requestTimeoutMillis: input.requestTimeoutMillis ?? 3e4,
|
|
44
|
+
maxUnknownLengthBytes: input.maxUnknownLengthBytes ?? 16777216,
|
|
45
|
+
checksumAlgorithm: input.checksumAlgorithm ?? "None",
|
|
46
|
+
leaseId: input.leaseId,
|
|
47
|
+
encryption: input.encryption ? { ...input.encryption } : void 0
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
function encryption(config) {
|
|
51
|
+
return !config.encryption ? {} : "scope" in config.encryption ? { encryptionScope: config.encryption.scope } : { customerProvidedKey: {
|
|
52
|
+
encryptionAlgorithm: "AES256",
|
|
53
|
+
encryptionKey: Redacted.value(config.encryption.key),
|
|
54
|
+
encryptionKeySha256: config.encryption.keySHA256
|
|
55
|
+
} };
|
|
56
|
+
}
|
|
57
|
+
function lease(config) {
|
|
58
|
+
return config.leaseId ? { leaseId: Redacted.value(config.leaseId) } : {};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { encryption, lease, resolveConfig };
|
|
62
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../../src/providers/azure/config.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { Effect, Redacted, Schema } from \"effect\";\n\nimport type { ContainerClient, newPipeline } from \"@azure/storage-blob\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { HeaderValue } from \"../../core/object.js\";\n\nexport interface AzureConfig {\n /** Complete container URL; an existing SAS must be wrapped in Redacted. */\n readonly containerUrl: string | Redacted.Redacted<string>;\n readonly storeId?: string;\n readonly credential?: Parameters<typeof newPipeline>[0];\n readonly requestTimeoutMillis?: number;\n readonly maxUnknownLengthBytes?: number;\n readonly leaseId?: Redacted.Redacted<string>;\n readonly encryption?:\n | { readonly scope: string }\n | { readonly key: Redacted.Redacted<string>; readonly keySHA256: string };\n readonly checksumAlgorithm?: \"None\" | \"StorageCrc64\";\n readonly profile?: \"block-blob\";\n}\nexport const resolveConfig = Effect.fnUntraced(function* (input: AzureConfig) {\n yield* Schema.decodeUnknownEffect(\n Schema.Struct({\n containerUrl: Schema.Union([Schema.String, Schema.Redacted(Schema.String)]),\n storeId: Schema.optional(Schema.NonEmptyString),\n credential: Schema.optional(Schema.Unknown),\n requestTimeoutMillis: Schema.optional(Schema.Int.check(Schema.isGreaterThan(0))),\n maxUnknownLengthBytes: Schema.optional(Schema.Int.check(Schema.isGreaterThan(0))),\n leaseId: Schema.optional(Schema.Redacted(Schema.NonEmptyString)),\n encryption: Schema.optional(\n Schema.Union([\n Schema.Struct({ scope: HeaderValue.check(Schema.isNonEmpty()) }),\n Schema.Struct({\n key: Schema.Redacted(Schema.NonEmptyString),\n keySHA256: Schema.NonEmptyString,\n }),\n ]),\n ),\n checksumAlgorithm: Schema.optional(Schema.Literals([\"None\", \"StorageCrc64\"])),\n profile: Schema.optional(Schema.Literal(\"block-blob\")),\n }),\n { onExcessProperty: \"error\" },\n )(input).pipe(\n Effect.mapError(() =>\n storageError(\"make\", \"azure\", { _tag: \"InvalidConfiguration\", field: \"config\" }),\n ),\n );\n const rawUrl = Redacted.isRedacted(input.containerUrl)\n ? Redacted.value(input.containerUrl)\n : input.containerUrl;\n const url = URL.parse(rawUrl);\n if (\n !url ||\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.hash ||\n url.pathname === \"/\" ||\n (url.search && !Redacted.isRedacted(input.containerUrl)) ||\n (input.encryption && url.protocol !== \"https:\")\n )\n return yield* storageError(\"make\", \"azure\", {\n _tag: \"InvalidConfiguration\",\n field: \"containerUrl-or-encryption\",\n });\n if (input.encryption && \"key\" in input.encryption) {\n const encoded = Redacted.value(input.encryption.key);\n const bytes = Buffer.from(encoded, \"base64\");\n if (\n bytes.length !== 32 ||\n bytes.toString(\"base64\") !== encoded ||\n createHash(\"sha256\").update(bytes).digest(\"base64\") !== input.encryption.keySHA256\n )\n return yield* storageError(\"make\", \"azure\", {\n _tag: \"InvalidConfiguration\",\n field: \"encryption.key\",\n });\n }\n const publicUrl = `${url.origin}${url.pathname.replace(/\\/$/u, \"\")}`;\n return {\n containerUrl: publicUrl,\n storeId: input.storeId ?? `azure:${createHash(\"sha256\").update(publicUrl).digest(\"hex\")}`,\n requestTimeoutMillis: input.requestTimeoutMillis ?? 30_000,\n maxUnknownLengthBytes: input.maxUnknownLengthBytes ?? 16 * 1024 * 1024,\n checksumAlgorithm: input.checksumAlgorithm ?? \"None\",\n leaseId: input.leaseId,\n encryption: input.encryption ? { ...input.encryption } : undefined,\n };\n});\nexport type ResolvedAzureConfig = Effect.Success<ReturnType<typeof resolveConfig>>;\nexport interface AzureConnection {\n readonly client: ContainerClient;\n readonly config: ResolvedAzureConfig;\n}\nexport function encryption(config: ResolvedAzureConfig) {\n return !config.encryption\n ? {}\n : \"scope\" in config.encryption\n ? { encryptionScope: config.encryption.scope }\n : {\n customerProvidedKey: {\n encryptionAlgorithm: \"AES256\" as const,\n encryptionKey: Redacted.value(config.encryption.key),\n encryptionKeySha256: config.encryption.keySHA256,\n },\n };\n}\nexport function lease(config: ResolvedAzureConfig) {\n return config.leaseId ? { leaseId: Redacted.value(config.leaseId) } : {};\n}\n"],"mappings":"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"}
|