@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
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { storageError } from "../../core/errors.js";
|
|
2
|
+
import { decodeRequest } from "../../internal/request-validation.js";
|
|
3
|
+
import { call } from "./transport.js";
|
|
4
|
+
import { Effect, Redacted, Schema } from "effect";
|
|
5
|
+
import * as Tigris from "@tigrisdata/storage";
|
|
6
|
+
|
|
7
|
+
// src/providers/tigris/configuration.ts
|
|
8
|
+
const Bucket = Schema.NonEmptyString;
|
|
9
|
+
const Strings = Schema.Union([Schema.String, Schema.Array(Schema.String)]);
|
|
10
|
+
const Cors = Schema.Struct({
|
|
11
|
+
allowedOrigins: Strings,
|
|
12
|
+
allowedMethods: Schema.optional(Strings),
|
|
13
|
+
allowedHeaders: Schema.optional(Strings),
|
|
14
|
+
exposeHeaders: Schema.optional(Strings),
|
|
15
|
+
maxAge: Schema.optional(Schema.Natural)
|
|
16
|
+
});
|
|
17
|
+
const Tier = Schema.Literals([
|
|
18
|
+
"STANDARD",
|
|
19
|
+
"STANDARD_IA",
|
|
20
|
+
"GLACIER",
|
|
21
|
+
"GLACIER_IR"
|
|
22
|
+
]);
|
|
23
|
+
const Lifecycle = Schema.Struct({
|
|
24
|
+
id: Schema.optional(Schema.String),
|
|
25
|
+
enabled: Schema.optional(Schema.Boolean),
|
|
26
|
+
storageClass: Schema.optional(Schema.Literals([
|
|
27
|
+
"STANDARD_IA",
|
|
28
|
+
"GLACIER",
|
|
29
|
+
"GLACIER_IR"
|
|
30
|
+
])),
|
|
31
|
+
days: Schema.optional(Schema.Natural),
|
|
32
|
+
date: Schema.optional(Schema.String),
|
|
33
|
+
expiration: Schema.optional(Schema.Struct({
|
|
34
|
+
days: Schema.optional(Schema.Natural),
|
|
35
|
+
date: Schema.optional(Schema.String)
|
|
36
|
+
})),
|
|
37
|
+
filter: Schema.optional(Schema.Struct({ prefix: Schema.String }))
|
|
38
|
+
});
|
|
39
|
+
const Settings = Schema.Struct({
|
|
40
|
+
access: Schema.optional(Schema.Literals(["public", "private"])),
|
|
41
|
+
allowObjectAcl: Schema.optional(Schema.Boolean),
|
|
42
|
+
defaultTier: Schema.optional(Tier),
|
|
43
|
+
disableDirectoryListing: Schema.optional(Schema.Boolean),
|
|
44
|
+
cacheControl: Schema.optional(Schema.String),
|
|
45
|
+
customDomain: Schema.optional(Schema.String),
|
|
46
|
+
enableAdditionalHeaders: Schema.optional(Schema.Boolean),
|
|
47
|
+
softDelete: Schema.optional(Schema.Union([Schema.Struct({
|
|
48
|
+
enabled: Schema.Literal(true),
|
|
49
|
+
retentionDays: Schema.Int.check(Schema.isGreaterThan(0))
|
|
50
|
+
}), Schema.Struct({ enabled: Schema.Literal(false) })]))
|
|
51
|
+
});
|
|
52
|
+
/** Native replacement operations have no provider CAS. Inspect with head before applying. */
|
|
53
|
+
const configuration = (native) => ({
|
|
54
|
+
update: Effect.fnUntraced(function* (input) {
|
|
55
|
+
const value = yield* decodeRequest(Schema.Struct({
|
|
56
|
+
bucket: Bucket,
|
|
57
|
+
settings: Settings,
|
|
58
|
+
intent: Schema.Literal("change-storage-protection")
|
|
59
|
+
}), input, "updateBucket", "tigris", true);
|
|
60
|
+
const config = yield* native;
|
|
61
|
+
return yield* call("updateBucket", true, () => Tigris.updateBucket(value.bucket, {
|
|
62
|
+
...structuredClone(value.settings),
|
|
63
|
+
config
|
|
64
|
+
}));
|
|
65
|
+
}),
|
|
66
|
+
setCors: Effect.fnUntraced(function* (input) {
|
|
67
|
+
const value = yield* decodeRequest(Schema.Struct({
|
|
68
|
+
bucket: Bucket,
|
|
69
|
+
rules: Schema.Array(Cors)
|
|
70
|
+
}), input, "setCors", "tigris", true);
|
|
71
|
+
const config = yield* native;
|
|
72
|
+
return yield* call("setCors", true, () => Tigris.setBucketCors(value.bucket, {
|
|
73
|
+
rules: structuredClone(value.rules),
|
|
74
|
+
override: true,
|
|
75
|
+
config
|
|
76
|
+
}));
|
|
77
|
+
}),
|
|
78
|
+
setLifecycle: Effect.fnUntraced(function* (input) {
|
|
79
|
+
const value = yield* decodeRequest(Schema.Struct({
|
|
80
|
+
bucket: Bucket,
|
|
81
|
+
rules: Schema.Array(Lifecycle),
|
|
82
|
+
intent: Schema.Literal("change-storage-protection")
|
|
83
|
+
}), input, "setLifecycle", "tigris", true);
|
|
84
|
+
const config = yield* native;
|
|
85
|
+
return yield* call("setLifecycle", true, () => Tigris.setBucketLifecycle(value.bucket, {
|
|
86
|
+
lifecycleRules: structuredClone(value.rules),
|
|
87
|
+
config
|
|
88
|
+
}));
|
|
89
|
+
}),
|
|
90
|
+
setNotifications: Effect.fnUntraced(function* (input) {
|
|
91
|
+
const value = yield* decodeRequest(Schema.Struct({
|
|
92
|
+
bucket: Bucket,
|
|
93
|
+
enabled: Schema.Boolean,
|
|
94
|
+
url: Schema.optional(Schema.String),
|
|
95
|
+
filter: Schema.optional(Schema.String),
|
|
96
|
+
token: Schema.optional(Schema.Redacted(Schema.NonEmptyString))
|
|
97
|
+
}), input, "setNotifications", "tigris", true);
|
|
98
|
+
const url = value.url ? URL.parse(value.url) : void 0;
|
|
99
|
+
if (value.enabled && (!url || url.protocol !== "https:" || url.username || url.password || !value.token)) return yield* storageError("setNotifications", "tigris", {
|
|
100
|
+
_tag: "InvalidInput",
|
|
101
|
+
field: "authenticated-https-webhook"
|
|
102
|
+
}, "not-started");
|
|
103
|
+
const config = yield* native;
|
|
104
|
+
return yield* call("setNotifications", true, () => Tigris.setBucketNotifications(value.bucket, {
|
|
105
|
+
override: true,
|
|
106
|
+
notificationConfig: {
|
|
107
|
+
enabled: value.enabled,
|
|
108
|
+
...value.url ? { url: value.url } : {},
|
|
109
|
+
...value.filter ? { filter: value.filter } : {},
|
|
110
|
+
...value.token ? { auth: { token: Redacted.value(value.token) } } : {}
|
|
111
|
+
},
|
|
112
|
+
config
|
|
113
|
+
}));
|
|
114
|
+
})
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
export { configuration };
|
|
118
|
+
//# sourceMappingURL=configuration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.js","names":[],"sources":["../../../src/providers/tigris/configuration.ts"],"sourcesContent":["import { Effect, Redacted, Schema } from \"effect\";\n\nimport * as Tigris from \"@tigrisdata/storage\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { decodeRequest } from \"../../internal/request-validation.js\";\nimport { call } from \"./transport.js\";\n\nconst Bucket = Schema.NonEmptyString;\nconst Strings = Schema.Union([Schema.String, Schema.Array(Schema.String)]);\nconst Cors = Schema.Struct({\n allowedOrigins: Strings,\n allowedMethods: Schema.optional(Strings),\n allowedHeaders: Schema.optional(Strings),\n exposeHeaders: Schema.optional(Strings),\n maxAge: Schema.optional(Schema.Natural),\n});\nconst Tier = Schema.Literals([\"STANDARD\", \"STANDARD_IA\", \"GLACIER\", \"GLACIER_IR\"]);\nconst Lifecycle = Schema.Struct({\n id: Schema.optional(Schema.String),\n enabled: Schema.optional(Schema.Boolean),\n storageClass: Schema.optional(Schema.Literals([\"STANDARD_IA\", \"GLACIER\", \"GLACIER_IR\"])),\n days: Schema.optional(Schema.Natural),\n date: Schema.optional(Schema.String),\n expiration: Schema.optional(\n Schema.Struct({ days: Schema.optional(Schema.Natural), date: Schema.optional(Schema.String) }),\n ),\n filter: Schema.optional(Schema.Struct({ prefix: Schema.String })),\n});\nconst Settings = Schema.Struct({\n access: Schema.optional(Schema.Literals([\"public\", \"private\"])),\n allowObjectAcl: Schema.optional(Schema.Boolean),\n defaultTier: Schema.optional(Tier),\n disableDirectoryListing: Schema.optional(Schema.Boolean),\n cacheControl: Schema.optional(Schema.String),\n customDomain: Schema.optional(Schema.String),\n enableAdditionalHeaders: Schema.optional(Schema.Boolean),\n softDelete: Schema.optional(\n Schema.Union([\n Schema.Struct({\n enabled: Schema.Literal(true),\n retentionDays: Schema.Int.check(Schema.isGreaterThan(0)),\n }),\n Schema.Struct({ enabled: Schema.Literal(false) }),\n ]),\n ),\n});\n\n/** Native replacement operations have no provider CAS. Inspect with head before applying. */\nexport const configuration = (\n native: Effect.Effect<Tigris.TigrisConfig, ReturnType<typeof storageError>>,\n) => ({\n update: Effect.fnUntraced(function* (input: {\n readonly bucket: string;\n readonly settings: typeof Settings.Type;\n readonly intent: \"change-storage-protection\";\n }) {\n const value = yield* decodeRequest(\n Schema.Struct({\n bucket: Bucket,\n settings: Settings,\n intent: Schema.Literal(\"change-storage-protection\"),\n }),\n input,\n \"updateBucket\",\n \"tigris\",\n true,\n );\n const config = yield* native;\n return yield* call(\"updateBucket\", true, () =>\n Tigris.updateBucket(value.bucket, {\n ...(structuredClone(value.settings) as Omit<Tigris.UpdateBucketOptions, \"config\">),\n config,\n }),\n );\n }),\n setCors: Effect.fnUntraced(function* (input: {\n readonly bucket: string;\n readonly rules: ReadonlyArray<typeof Cors.Type>;\n }) {\n const value = yield* decodeRequest(\n Schema.Struct({ bucket: Bucket, rules: Schema.Array(Cors) }),\n input,\n \"setCors\",\n \"tigris\",\n true,\n );\n const config = yield* native;\n return yield* call(\"setCors\", true, () =>\n Tigris.setBucketCors(value.bucket, {\n rules: structuredClone(value.rules) as Tigris.BucketCorsRule[],\n override: true,\n config,\n }),\n );\n }),\n setLifecycle: Effect.fnUntraced(function* (input: {\n readonly bucket: string;\n readonly rules: ReadonlyArray<typeof Lifecycle.Type>;\n readonly intent: \"change-storage-protection\";\n }) {\n const value = yield* decodeRequest(\n Schema.Struct({\n bucket: Bucket,\n rules: Schema.Array(Lifecycle),\n intent: Schema.Literal(\"change-storage-protection\"),\n }),\n input,\n \"setLifecycle\",\n \"tigris\",\n true,\n );\n const config = yield* native;\n return yield* call(\"setLifecycle\", true, () =>\n Tigris.setBucketLifecycle(value.bucket, {\n lifecycleRules: structuredClone(value.rules) as Tigris.BucketLifecycleRule[],\n config,\n }),\n );\n }),\n setNotifications: Effect.fnUntraced(function* (input: {\n readonly bucket: string;\n readonly enabled: boolean;\n readonly url?: string;\n readonly filter?: string;\n readonly token?: Redacted.Redacted<string>;\n }) {\n const value = yield* decodeRequest(\n Schema.Struct({\n bucket: Bucket,\n enabled: Schema.Boolean,\n url: Schema.optional(Schema.String),\n filter: Schema.optional(Schema.String),\n token: Schema.optional(Schema.Redacted(Schema.NonEmptyString)),\n }),\n input,\n \"setNotifications\",\n \"tigris\",\n true,\n );\n const url = value.url ? URL.parse(value.url) : undefined;\n if (\n value.enabled &&\n (!url || url.protocol !== \"https:\" || url.username || url.password || !value.token)\n )\n return yield* storageError(\n \"setNotifications\",\n \"tigris\",\n { _tag: \"InvalidInput\", field: \"authenticated-https-webhook\" },\n \"not-started\",\n );\n const config = yield* native;\n return yield* call(\"setNotifications\", true, () =>\n Tigris.setBucketNotifications(value.bucket, {\n override: true,\n notificationConfig: {\n enabled: value.enabled,\n ...(value.url ? { url: value.url } : {}),\n ...(value.filter ? { filter: value.filter } : {}),\n ...(value.token ? { auth: { token: Redacted.value(value.token) } } : {}),\n },\n config,\n }),\n );\n }),\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { storageError } from "../../core/errors.js";
|
|
2
|
+
import { decodeRequest } from "../../internal/request-validation.js";
|
|
3
|
+
import { request } from "../s3/transport.js";
|
|
4
|
+
import { extendRequest } from "../s3/request-extension.js";
|
|
5
|
+
import { Effect, Schema } from "effect";
|
|
6
|
+
import { CreateBucketCommand, DeleteBucketCommand, ListBucketsCommand } from "@aws-sdk/client-s3";
|
|
7
|
+
|
|
8
|
+
// src/providers/tigris/snapshots.ts
|
|
9
|
+
const Bucket = Schema.String.check(Schema.isPattern(/^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/u));
|
|
10
|
+
const createBucket = Effect.fnUntraced(function* (storage, input) {
|
|
11
|
+
const value = yield* decodeRequest(Schema.Struct({
|
|
12
|
+
bucket: Bucket,
|
|
13
|
+
sourceBucket: Schema.optional(Bucket),
|
|
14
|
+
snapshot: Schema.optional(Schema.NonEmptyString)
|
|
15
|
+
}), input, "createBucket", "tigris", true);
|
|
16
|
+
const command = new CreateBucketCommand({ Bucket: value.bucket });
|
|
17
|
+
extendRequest(command, { headers: {
|
|
18
|
+
"X-Amz-Acl": "private",
|
|
19
|
+
"X-Amz-Acl-Public-List-Objects-Enabled": "false",
|
|
20
|
+
...value.sourceBucket ? { "X-Tigris-Fork-Source-Bucket": value.sourceBucket } : {},
|
|
21
|
+
...value.snapshot ? { "X-Tigris-Fork-Source-Bucket-Snapshot": value.snapshot } : {}
|
|
22
|
+
} });
|
|
23
|
+
yield* request(storage, "createBucket", true, (signal) => storage.client.send(command, { abortSignal: signal }));
|
|
24
|
+
return {
|
|
25
|
+
_tag: "Accepted",
|
|
26
|
+
bucket: value.bucket
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
const snapshots = (storage) => ({
|
|
30
|
+
create: Effect.fnUntraced(function* (input) {
|
|
31
|
+
const value = yield* decodeRequest(Schema.Struct({
|
|
32
|
+
bucket: Bucket,
|
|
33
|
+
name: Schema.optional(Schema.String.check(Schema.isPattern(/^[A-Za-z0-9._-]{1,128}$/u)))
|
|
34
|
+
}), input, "createSnapshot", "tigris", true);
|
|
35
|
+
let version;
|
|
36
|
+
const command = new CreateBucketCommand({ Bucket: value.bucket });
|
|
37
|
+
extendRequest(command, {
|
|
38
|
+
headers: { "X-Tigris-Snapshot": value.name ? `true; name=${value.name}` : "true" },
|
|
39
|
+
observeHeaders: (headers) => {
|
|
40
|
+
version = headers["x-tigris-snapshot-version"];
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
yield* request(storage, "createSnapshot", true, (signal) => storage.client.send(command, { abortSignal: signal }));
|
|
44
|
+
if (!version) return yield* storageError("createSnapshot", "tigris", {
|
|
45
|
+
_tag: "ProviderFailure",
|
|
46
|
+
code: "MissingSnapshotReceipt"
|
|
47
|
+
}, "unknown");
|
|
48
|
+
return { snapshotVersion: version };
|
|
49
|
+
}),
|
|
50
|
+
listPage: Effect.fnUntraced(function* (input) {
|
|
51
|
+
const value = yield* decodeRequest(Schema.Struct({
|
|
52
|
+
bucket: Bucket,
|
|
53
|
+
cursor: Schema.optional(Schema.NonEmptyString),
|
|
54
|
+
limit: Schema.optional(Schema.Int.check(Schema.isBetween({
|
|
55
|
+
minimum: 1,
|
|
56
|
+
maximum: 1e3
|
|
57
|
+
})))
|
|
58
|
+
}), input, "listSnapshots", "tigris");
|
|
59
|
+
const command = new ListBucketsCommand({
|
|
60
|
+
ContinuationToken: value.cursor,
|
|
61
|
+
MaxBuckets: value.limit
|
|
62
|
+
});
|
|
63
|
+
extendRequest(command, { headers: { "X-Tigris-Snapshot": value.bucket } });
|
|
64
|
+
const response = yield* request(storage, "listSnapshots", false, (signal) => storage.client.send(command, { abortSignal: signal }));
|
|
65
|
+
return {
|
|
66
|
+
snapshots: (response.Buckets ?? []).map((snapshot) => ({
|
|
67
|
+
version: snapshot.Name?.split(";")[0],
|
|
68
|
+
name: snapshot.Name?.split("; name=")[1],
|
|
69
|
+
createdAt: snapshot.CreationDate
|
|
70
|
+
})),
|
|
71
|
+
cursor: response.ContinuationToken
|
|
72
|
+
};
|
|
73
|
+
}),
|
|
74
|
+
delete: Effect.fnUntraced(function* (input) {
|
|
75
|
+
const value = yield* decodeRequest(Schema.Struct({
|
|
76
|
+
bucket: Bucket,
|
|
77
|
+
version: Schema.NonEmptyString,
|
|
78
|
+
intent: Schema.Literal("delete-snapshot")
|
|
79
|
+
}), input, "deleteSnapshot", "tigris", true);
|
|
80
|
+
const command = new DeleteBucketCommand({ Bucket: value.bucket });
|
|
81
|
+
extendRequest(command, { headers: { "X-Tigris-Snapshot-Version": value.version } });
|
|
82
|
+
yield* request(storage, "deleteSnapshot", true, (signal) => storage.client.send(command, { abortSignal: signal }));
|
|
83
|
+
})
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
export { Bucket, createBucket, snapshots };
|
|
87
|
+
//# sourceMappingURL=snapshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshots.js","names":[],"sources":["../../../src/providers/tigris/snapshots.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport { CreateBucketCommand, DeleteBucketCommand, ListBucketsCommand } from \"@aws-sdk/client-s3\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { decodeRequest } from \"../../internal/request-validation.js\";\nimport type { S3StorageService } from \"../s3/index.js\";\nimport { extendRequest } from \"../s3/request-extension.js\";\nimport { request } from \"../s3/transport.js\";\n\nexport const Bucket = Schema.String.check(Schema.isPattern(/^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/u));\nexport const createBucket = Effect.fnUntraced(function* (\n storage: S3StorageService,\n input: { readonly bucket: string; readonly sourceBucket?: string; readonly snapshot?: string },\n) {\n const value = yield* decodeRequest(\n Schema.Struct({\n bucket: Bucket,\n sourceBucket: Schema.optional(Bucket),\n snapshot: Schema.optional(Schema.NonEmptyString),\n }),\n input,\n \"createBucket\",\n \"tigris\",\n true,\n );\n const command = new CreateBucketCommand({ Bucket: value.bucket });\n extendRequest(command, {\n headers: {\n \"X-Amz-Acl\": \"private\",\n \"X-Amz-Acl-Public-List-Objects-Enabled\": \"false\",\n ...(value.sourceBucket ? { \"X-Tigris-Fork-Source-Bucket\": value.sourceBucket } : {}),\n ...(value.snapshot ? { \"X-Tigris-Fork-Source-Bucket-Snapshot\": value.snapshot } : {}),\n },\n });\n yield* request(storage, \"createBucket\", true, (signal) =>\n storage.client.send(command, { abortSignal: signal }),\n );\n return { _tag: \"Accepted\" as const, bucket: value.bucket };\n});\nexport const snapshots = (storage: S3StorageService) => ({\n create: Effect.fnUntraced(function* (input: { readonly bucket: string; readonly name?: string }) {\n const value = yield* decodeRequest(\n Schema.Struct({\n bucket: Bucket,\n name: Schema.optional(Schema.String.check(Schema.isPattern(/^[A-Za-z0-9._-]{1,128}$/u))),\n }),\n input,\n \"createSnapshot\",\n \"tigris\",\n true,\n );\n let version: string | undefined;\n const command = new CreateBucketCommand({ Bucket: value.bucket });\n extendRequest(command, {\n headers: { \"X-Tigris-Snapshot\": value.name ? `true; name=${value.name}` : \"true\" },\n observeHeaders: (headers) => {\n version = headers[\"x-tigris-snapshot-version\"];\n },\n });\n yield* request(storage, \"createSnapshot\", true, (signal) =>\n storage.client.send(command, { abortSignal: signal }),\n );\n if (!version)\n return yield* storageError(\n \"createSnapshot\",\n \"tigris\",\n { _tag: \"ProviderFailure\", code: \"MissingSnapshotReceipt\" },\n \"unknown\",\n );\n return { snapshotVersion: version };\n }),\n listPage: Effect.fnUntraced(function* (input: {\n readonly bucket: string;\n readonly cursor?: string;\n readonly limit?: number;\n }) {\n const value = yield* decodeRequest(\n Schema.Struct({\n bucket: Bucket,\n cursor: Schema.optional(Schema.NonEmptyString),\n limit: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 1000 }))),\n }),\n input,\n \"listSnapshots\",\n \"tigris\",\n );\n const command = new ListBucketsCommand({\n ContinuationToken: value.cursor,\n MaxBuckets: value.limit,\n });\n extendRequest(command, { headers: { \"X-Tigris-Snapshot\": value.bucket } });\n const response = yield* request(storage, \"listSnapshots\", false, (signal) =>\n storage.client.send(command, { abortSignal: signal }),\n );\n return {\n snapshots: (response.Buckets ?? []).map((snapshot) => ({\n version: snapshot.Name?.split(\";\")[0],\n name: snapshot.Name?.split(\"; name=\")[1],\n createdAt: snapshot.CreationDate,\n })),\n cursor: response.ContinuationToken,\n };\n }),\n delete: Effect.fnUntraced(function* (input: {\n readonly bucket: string;\n readonly version: string;\n readonly intent: \"delete-snapshot\";\n }) {\n const value = yield* decodeRequest(\n Schema.Struct({\n bucket: Bucket,\n version: Schema.NonEmptyString,\n intent: Schema.Literal(\"delete-snapshot\"),\n }),\n input,\n \"deleteSnapshot\",\n \"tigris\",\n true,\n );\n const command = new DeleteBucketCommand({ Bucket: value.bucket });\n extendRequest(command, { headers: { \"X-Tigris-Snapshot-Version\": value.version } });\n yield* request(storage, \"deleteSnapshot\", true, (signal) =>\n storage.client.send(command, { abortSignal: signal }),\n );\n }),\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { storageError } from "../../core/errors.js";
|
|
2
|
+
import { providerError } from "../../internal/node/provider-errors.js";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
|
|
5
|
+
// src/providers/tigris/transport.ts
|
|
6
|
+
const call = (operation, mutation, run) => Effect.tryPromise({
|
|
7
|
+
try: run,
|
|
8
|
+
catch: (error) => providerError("tigris", operation, mutation, error)
|
|
9
|
+
}).pipe(Effect.flatMap((result) => result.error ? Effect.fail(providerError("tigris", operation, mutation, result.error)) : Effect.succeed(result.data)), Effect.timeoutOrElse({
|
|
10
|
+
duration: "30 seconds",
|
|
11
|
+
orElse: () => Effect.fail(storageError(operation, "tigris", {
|
|
12
|
+
_tag: "TransportFailure",
|
|
13
|
+
code: "DeadlineExceeded"
|
|
14
|
+
}, mutation ? "unknown" : "not-applicable"))
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
export { call };
|
|
18
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","names":[],"sources":["../../../src/providers/tigris/transport.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { providerError } from \"../../internal/node/provider-errors.js\";\nexport const call = <A>(\n operation: string,\n mutation: boolean,\n run: () => Promise<{ data: A; error?: never } | { error: Error; data?: never }>,\n) =>\n Effect.tryPromise({\n try: run,\n catch: (error) => providerError(\"tigris\", operation, mutation, error),\n }).pipe(\n Effect.flatMap((result) =>\n result.error\n ? Effect.fail(providerError(\"tigris\", operation, mutation, result.error))\n : Effect.succeed(result.data),\n ),\n Effect.timeoutOrElse({\n duration: \"30 seconds\",\n orElse: () =>\n Effect.fail(\n storageError(\n operation,\n \"tigris\",\n { _tag: \"TransportFailure\", code: \"DeadlineExceeded\" },\n mutation ? \"unknown\" : \"not-applicable\",\n ),\n ),\n }),\n );\n"],"mappings":";;;;;AAIA,MAAa,QACX,WACA,UACA,QAEA,OAAO,WAAW;CAChB,KAAK;CACL,QAAQ,UAAU,cAAc,UAAU,WAAW,UAAU,KAAK;AACtE,CAAC,CAAC,CAAC,KACD,OAAO,SAAS,WACd,OAAO,QACH,OAAO,KAAK,cAAc,UAAU,WAAW,UAAU,OAAO,KAAK,CAAC,IACtE,OAAO,QAAQ,OAAO,IAAI,CAChC,GACA,OAAO,cAAc;CACnB,UAAU;CACV,cACE,OAAO,KACL,aACE,WACA,UACA;EAAE,MAAM;EAAoB,MAAM;CAAmB,GACrD,WAAW,YAAY,gBACzB,CACF;AACJ,CAAC,CACH"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { StorageError } from "../../core/errors.js";
|
|
2
|
+
import { Effect, Redacted } from "effect";
|
|
3
|
+
type Secret = Redacted.Redacted<string> | Effect.Effect<Redacted.Redacted<string>, StorageError>;
|
|
4
|
+
export interface VercelConfig {
|
|
5
|
+
readonly storeId: string;
|
|
6
|
+
readonly access: "public" | "private";
|
|
7
|
+
readonly credential: {
|
|
8
|
+
readonly mode: "token" | "oidc";
|
|
9
|
+
readonly token: Secret;
|
|
10
|
+
};
|
|
11
|
+
readonly maxObjectBytes?: number;
|
|
12
|
+
readonly maxUnknownLengthBytes?: number;
|
|
13
|
+
readonly requestTimeoutMillis?: number;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { storageError } from "../../core/errors.js";
|
|
2
|
+
import { Effect, Redacted, Schema } from "effect";
|
|
3
|
+
|
|
4
|
+
// src/providers/vercel/config.ts
|
|
5
|
+
const Positive = Schema.Int.check(Schema.isGreaterThan(0));
|
|
6
|
+
const Config$1 = Schema.Struct({
|
|
7
|
+
storeId: Schema.String.check(Schema.isPattern(/^(?:store_)?[A-Za-z0-9]+$/u)),
|
|
8
|
+
access: Schema.Literals(["public", "private"]),
|
|
9
|
+
credential: Schema.Struct({
|
|
10
|
+
mode: Schema.Literals(["token", "oidc"]),
|
|
11
|
+
token: Schema.declare((value) => Redacted.isRedacted(value) || Effect.isEffect(value))
|
|
12
|
+
}),
|
|
13
|
+
maxObjectBytes: Schema.optional(Positive),
|
|
14
|
+
maxUnknownLengthBytes: Schema.optional(Positive),
|
|
15
|
+
requestTimeoutMillis: Schema.optional(Positive)
|
|
16
|
+
});
|
|
17
|
+
const resolveConfig = Effect.fnUntraced(function* (input) {
|
|
18
|
+
yield* Schema.decodeUnknownEffect(Config$1, { onExcessProperty: "error" })(input).pipe(Effect.mapError(() => storageError("make", "vercel", {
|
|
19
|
+
_tag: "InvalidConfiguration",
|
|
20
|
+
field: "config"
|
|
21
|
+
})));
|
|
22
|
+
yield* retryPolicy();
|
|
23
|
+
const override = process.env.VERCEL_BLOB_API_URL ?? process.env.NEXT_PUBLIC_VERCEL_BLOB_API_URL;
|
|
24
|
+
const endpoint = override ? URL.parse(override) : void 0;
|
|
25
|
+
if (override && (!endpoint || !["https:", "http:"].includes(endpoint.protocol) || endpoint.username || endpoint.password || endpoint.search || endpoint.hash || endpoint.pathname !== "/")) return yield* storageError("make", "vercel", {
|
|
26
|
+
_tag: "InvalidConfiguration",
|
|
27
|
+
field: "VERCEL_BLOB_API_URL"
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
...input,
|
|
31
|
+
apiOrigin: endpoint?.origin,
|
|
32
|
+
storeId: input.storeId.replace(/^store_/u, ""),
|
|
33
|
+
maxObjectBytes: input.maxObjectBytes ?? 1024 ** 3,
|
|
34
|
+
maxUnknownLengthBytes: input.maxUnknownLengthBytes ?? 8 * 1024 ** 2,
|
|
35
|
+
requestTimeoutMillis: input.requestTimeoutMillis ?? 3e4
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
/** The pinned SDK reads this switch per request; never change global application policy here. */
|
|
39
|
+
const retryPolicy = () => Effect.suspend(() => {
|
|
40
|
+
const version = process.env.VERCEL_BLOB_API_VERSION_OVERRIDE ?? process.env.NEXT_PUBLIC_VERCEL_BLOB_API_VERSION_OVERRIDE;
|
|
41
|
+
return process.env.VERCEL_BLOB_RETRIES === "0" && (version === void 0 || version === "13") ? Effect.void : Effect.fail(storageError("sdk.policy", "vercel", {
|
|
42
|
+
_tag: "InvalidConfiguration",
|
|
43
|
+
field: "sdk-retries-or-api-version"
|
|
44
|
+
}, "not-started"));
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export { resolveConfig, retryPolicy };
|
|
48
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","names":["Config"],"sources":["../../../src/providers/vercel/config.ts"],"sourcesContent":["import { Effect, Redacted, Schema } from \"effect\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport type { StorageError } from \"../../core/errors.js\";\n\ntype Secret = Redacted.Redacted<string> | Effect.Effect<Redacted.Redacted<string>, StorageError>;\nexport interface VercelConfig {\n readonly storeId: string;\n readonly access: \"public\" | \"private\";\n readonly credential: { readonly mode: \"token\" | \"oidc\"; readonly token: Secret };\n readonly maxObjectBytes?: number;\n readonly maxUnknownLengthBytes?: number;\n readonly requestTimeoutMillis?: number;\n}\nconst Positive = Schema.Int.check(Schema.isGreaterThan(0));\nconst Config = Schema.Struct({\n storeId: Schema.String.check(Schema.isPattern(/^(?:store_)?[A-Za-z0-9]+$/u)),\n access: Schema.Literals([\"public\", \"private\"]),\n credential: Schema.Struct({\n mode: Schema.Literals([\"token\", \"oidc\"]),\n token: Schema.declare<Secret>(\n (value): value is Secret => Redacted.isRedacted(value) || Effect.isEffect(value),\n ),\n }),\n maxObjectBytes: Schema.optional(Positive),\n maxUnknownLengthBytes: Schema.optional(Positive),\n requestTimeoutMillis: Schema.optional(Positive),\n});\nexport const resolveConfig = Effect.fnUntraced(function* (input: VercelConfig) {\n yield* Schema.decodeUnknownEffect(Config, { onExcessProperty: \"error\" })(input).pipe(\n Effect.mapError(() =>\n storageError(\"make\", \"vercel\", { _tag: \"InvalidConfiguration\", field: \"config\" }),\n ),\n );\n yield* retryPolicy();\n const override = process.env.VERCEL_BLOB_API_URL ?? process.env.NEXT_PUBLIC_VERCEL_BLOB_API_URL;\n const endpoint = override ? URL.parse(override) : undefined;\n if (\n override &&\n (!endpoint ||\n ![\"https:\", \"http:\"].includes(endpoint.protocol) ||\n endpoint.username ||\n endpoint.password ||\n endpoint.search ||\n endpoint.hash ||\n endpoint.pathname !== \"/\")\n )\n return yield* storageError(\"make\", \"vercel\", {\n _tag: \"InvalidConfiguration\",\n field: \"VERCEL_BLOB_API_URL\",\n });\n return {\n ...input,\n apiOrigin: endpoint?.origin,\n storeId: input.storeId.replace(/^store_/u, \"\"),\n maxObjectBytes: input.maxObjectBytes ?? 1024 ** 3,\n maxUnknownLengthBytes: input.maxUnknownLengthBytes ?? 8 * 1024 ** 2,\n requestTimeoutMillis: input.requestTimeoutMillis ?? 30000,\n };\n});\nexport type VercelConnection = {\n readonly config: Effect.Success<ReturnType<typeof resolveConfig>>;\n};\n/** The pinned SDK reads this switch per request; never change global application policy here. */\nexport const retryPolicy = () =>\n Effect.suspend(() => {\n const version =\n process.env.VERCEL_BLOB_API_VERSION_OVERRIDE ??\n process.env.NEXT_PUBLIC_VERCEL_BLOB_API_VERSION_OVERRIDE;\n return process.env.VERCEL_BLOB_RETRIES === \"0\" && (version === undefined || version === \"13\")\n ? Effect.void\n : Effect.fail(\n storageError(\n \"sdk.policy\",\n \"vercel\",\n { _tag: \"InvalidConfiguration\", field: \"sdk-retries-or-api-version\" },\n \"not-started\",\n ),\n );\n });\n"],"mappings":";;;;AAcA,MAAM,WAAW,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;AACzD,MAAMA,WAAS,OAAO,OAAO;CAC3B,SAAS,OAAO,OAAO,MAAM,OAAO,UAAU,4BAA4B,CAAC;CAC3E,QAAQ,OAAO,SAAS,CAAC,UAAU,SAAS,CAAC;CAC7C,YAAY,OAAO,OAAO;EACxB,MAAM,OAAO,SAAS,CAAC,SAAS,MAAM,CAAC;EACvC,OAAO,OAAO,SACX,UAA2B,SAAS,WAAW,KAAK,KAAK,OAAO,SAAS,KAAK,CACjF;CACF,CAAC;CACD,gBAAgB,OAAO,SAAS,QAAQ;CACxC,uBAAuB,OAAO,SAAS,QAAQ;CAC/C,sBAAsB,OAAO,SAAS,QAAQ;AAChD,CAAC;AACD,MAAa,gBAAgB,OAAO,WAAW,WAAW,OAAqB;CAC7E,OAAO,OAAO,oBAAoBA,UAAQ,EAAE,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAC9E,OAAO,eACL,aAAa,QAAQ,UAAU;EAAE,MAAM;EAAwB,OAAO;CAAS,CAAC,CAClF,CACF;CACA,OAAO,YAAY;CACnB,MAAM,WAAW,QAAQ,IAAI,uBAAuB,QAAQ,IAAI;CAChE,MAAM,WAAW,WAAW,IAAI,MAAM,QAAQ,IAAI;CAClD,IACE,aACC,CAAC,YACA,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,SAAS,SAAS,QAAQ,KAC/C,SAAS,YACT,SAAS,YACT,SAAS,UACT,SAAS,QACT,SAAS,aAAa,MAExB,OAAO,OAAO,aAAa,QAAQ,UAAU;EAC3C,MAAM;EACN,OAAO;CACT,CAAC;CACH,OAAO;EACL,GAAG;EACH,WAAW,UAAU;EACrB,SAAS,MAAM,QAAQ,QAAQ,YAAY,EAAE;EAC7C,gBAAgB,MAAM,kBAAkB,QAAQ;EAChD,uBAAuB,MAAM,yBAAyB,IAAI,QAAQ;EAClE,sBAAsB,MAAM,wBAAwB;CACtD;AACF,CAAC;;AAKD,MAAa,oBACX,OAAO,cAAc;CACnB,MAAM,UACJ,QAAQ,IAAI,oCACZ,QAAQ,IAAI;CACd,OAAO,QAAQ,IAAI,wBAAwB,QAAQ,YAAY,UAAa,YAAY,QACpF,OAAO,OACP,OAAO,KACL,aACE,cACA,UACA;EAAE,MAAM;EAAwB,OAAO;CAA6B,GACpE,aACF,CACF;AACN,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ObjectKey, ObjectMetadata } from "../../core/object.js";
|
|
2
|
+
import { storageError } from "../../core/errors.js";
|
|
3
|
+
import { DateTime, Effect, Option, Schema } from "effect";
|
|
4
|
+
import * as Blob from "@vercel/blob";
|
|
5
|
+
|
|
6
|
+
// src/providers/vercel/mapping.ts
|
|
7
|
+
const validateKey = Effect.fnUntraced(function* (key, operation) {
|
|
8
|
+
yield* Schema.decodeUnknownEffect(ObjectKey)(key).pipe(Effect.mapError(() => storageError(operation, "vercel", {
|
|
9
|
+
_tag: "InvalidInput",
|
|
10
|
+
field: "key"
|
|
11
|
+
}, "not-started")));
|
|
12
|
+
if (key.startsWith("/") || /^https?:/iu.test(key) || key.split("/").some((part) => !part || part === "." || part === "..") || new TextEncoder().encode(key).length > 950) return yield* storageError(operation, "vercel", {
|
|
13
|
+
_tag: "InvalidInput",
|
|
14
|
+
field: "key"
|
|
15
|
+
}, "not-started");
|
|
16
|
+
return key;
|
|
17
|
+
});
|
|
18
|
+
const writeOptions = Effect.fnUntraced(function* (headers, operation) {
|
|
19
|
+
if (Object.keys(headers.customMetadata ?? {}).filter((key) => key !== "effect-storage-operation").length || headers.contentDisposition || headers.contentLanguage || headers.contentEncoding || headers.cacheControl) return yield* storageError(operation, "vercel", {
|
|
20
|
+
_tag: "Unsupported",
|
|
21
|
+
capability: "object-headers"
|
|
22
|
+
}, "not-started");
|
|
23
|
+
return {
|
|
24
|
+
...headers.contentType ? { contentType: headers.contentType } : {},
|
|
25
|
+
addRandomSuffix: false
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
const Observation = Schema.Struct({
|
|
29
|
+
pathname: Schema.String,
|
|
30
|
+
etag: Schema.optional(Schema.String),
|
|
31
|
+
size: Schema.optional(Schema.NullOr(Schema.Natural)),
|
|
32
|
+
contentType: Schema.optional(Schema.NullOr(Schema.String)),
|
|
33
|
+
contentDisposition: Schema.optional(Schema.String),
|
|
34
|
+
cacheControl: Schema.optional(Schema.String)
|
|
35
|
+
});
|
|
36
|
+
const metadata = Effect.fnUntraced(function* (connection, value, operation, key, mutation = false) {
|
|
37
|
+
const observed = yield* Schema.decodeUnknownEffect(Observation)(value).pipe(Effect.mapError(() => storageError(operation, "vercel", { _tag: "ProviderFailure" }, mutation ? "unknown" : "not-applicable")));
|
|
38
|
+
if (key !== void 0 && observed.pathname !== key) return yield* storageError(operation, "vercel", { _tag: "IntegrityMismatch" }, mutation ? "unknown" : "not-applicable");
|
|
39
|
+
const uploadedAt = value !== null && typeof value === "object" ? Reflect.get(value, "uploadedAt") : void 0;
|
|
40
|
+
const modified = uploadedAt instanceof Date ? Option.getOrUndefined(DateTime.make(uploadedAt)) : void 0;
|
|
41
|
+
return yield* Schema.decodeUnknownEffect(Schema.toType(ObjectMetadata))({
|
|
42
|
+
ref: {
|
|
43
|
+
storeId: `vercel:${connection.config.access}:${connection.config.storeId}`,
|
|
44
|
+
key: observed.pathname
|
|
45
|
+
},
|
|
46
|
+
...observed.size !== void 0 && observed.size !== null ? { size: observed.size } : {},
|
|
47
|
+
...observed.etag ? { etag: observed.etag } : {},
|
|
48
|
+
...observed.contentType ? { contentType: observed.contentType } : {},
|
|
49
|
+
...observed.contentDisposition ? { contentDisposition: observed.contentDisposition } : {},
|
|
50
|
+
...observed.cacheControl ? { cacheControl: observed.cacheControl } : {},
|
|
51
|
+
...modified ? { lastModified: modified } : {}
|
|
52
|
+
}).pipe(Effect.mapError(() => storageError(operation, "vercel", { _tag: "ProviderFailure" }, mutation ? "unknown" : "not-applicable")));
|
|
53
|
+
});
|
|
54
|
+
function providerError(operation, mutation, error) {
|
|
55
|
+
const overwriteRejected = mutation && error instanceof Blob.BlobError && error.message.startsWith("Vercel Blob: This blob already exists,");
|
|
56
|
+
const readStatus = error instanceof Blob.BlobError ? /^Vercel Blob: Failed to fetch blob: (\d{3}) /u.exec(error.message)?.[1] : void 0;
|
|
57
|
+
const reason = readStatus === "401" || readStatus === "403" ? { _tag: "AccessDenied" } : readStatus === "412" || overwriteRejected ? { _tag: "PreconditionFailed" } : readStatus === "416" ? { _tag: "RangeNotSatisfiable" } : error instanceof Blob.BlobStoreNotFoundError ? {
|
|
58
|
+
_tag: "InvalidConfiguration",
|
|
59
|
+
field: "store"
|
|
60
|
+
} : error instanceof Blob.BlobNotFoundError ? { _tag: "NotFound" } : error instanceof Blob.BlobAccessError || error instanceof Blob.BlobStoreSuspendedError ? { _tag: "AccessDenied" } : error instanceof Blob.BlobClientTokenExpiredError ? { _tag: "Expired" } : error instanceof Blob.BlobPreconditionFailedError ? { _tag: "PreconditionFailed" } : error instanceof Blob.BlobServiceRateLimited ? {
|
|
61
|
+
_tag: "Throttled",
|
|
62
|
+
retryAfterMillis: Math.max(0, error.retryAfter * 1e3)
|
|
63
|
+
} : error instanceof Blob.BlobContentTypeNotAllowedError || error instanceof Blob.BlobPathnameMismatchError || error instanceof Blob.BlobFileTooLargeError ? {
|
|
64
|
+
_tag: "InvalidInput",
|
|
65
|
+
field: "upload"
|
|
66
|
+
} : { _tag: "TransportFailure" };
|
|
67
|
+
const rejected = [
|
|
68
|
+
"NotFound",
|
|
69
|
+
"AccessDenied",
|
|
70
|
+
"Expired",
|
|
71
|
+
"PreconditionFailed",
|
|
72
|
+
"InvalidInput",
|
|
73
|
+
"Throttled"
|
|
74
|
+
].includes(reason._tag);
|
|
75
|
+
return storageError(operation, "vercel", reason, mutation ? rejected ? "rejected" : "unknown" : "not-applicable");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { metadata, providerError, validateKey, writeOptions };
|
|
79
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","names":[],"sources":["../../../src/providers/vercel/mapping.ts"],"sourcesContent":["import { DateTime, Effect, Option, Schema } from \"effect\";\n\nimport * as Blob from \"@vercel/blob\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport type { ObjectHeaders } from \"../../core/object.js\";\nimport { ObjectKey, ObjectMetadata } from \"../../core/object.js\";\nimport type { VercelConnection } from \"./config.js\";\n\nexport const validateKey = Effect.fnUntraced(function* (key: string, operation: string) {\n yield* Schema.decodeUnknownEffect(ObjectKey)(key).pipe(\n Effect.mapError(() =>\n storageError(operation, \"vercel\", { _tag: \"InvalidInput\", field: \"key\" }, \"not-started\"),\n ),\n );\n if (\n key.startsWith(\"/\") ||\n /^https?:/iu.test(key) ||\n key.split(\"/\").some((part) => !part || part === \".\" || part === \"..\") ||\n new TextEncoder().encode(key).length > 950\n )\n return yield* storageError(\n operation,\n \"vercel\",\n { _tag: \"InvalidInput\", field: \"key\" },\n \"not-started\",\n );\n return key;\n});\nexport const writeOptions = Effect.fnUntraced(function* (\n headers: ObjectHeaders,\n operation: string,\n) {\n const metadata = Object.keys(headers.customMetadata ?? {}).filter(\n (key) => key !== \"effect-storage-operation\",\n );\n if (\n metadata.length ||\n headers.contentDisposition ||\n headers.contentLanguage ||\n headers.contentEncoding ||\n headers.cacheControl\n )\n return yield* storageError(\n operation,\n \"vercel\",\n { _tag: \"Unsupported\", capability: \"object-headers\" },\n \"not-started\",\n );\n return {\n ...(headers.contentType ? { contentType: headers.contentType } : {}),\n addRandomSuffix: false,\n };\n});\nconst Observation = Schema.Struct({\n pathname: Schema.String,\n etag: Schema.optional(Schema.String),\n size: Schema.optional(Schema.NullOr(Schema.Natural)),\n contentType: Schema.optional(Schema.NullOr(Schema.String)),\n contentDisposition: Schema.optional(Schema.String),\n cacheControl: Schema.optional(Schema.String),\n});\nexport const metadata = Effect.fnUntraced(function* (\n connection: VercelConnection,\n value: unknown,\n operation: string,\n key?: string,\n mutation = false,\n) {\n const observed = yield* Schema.decodeUnknownEffect(Observation)(value).pipe(\n Effect.mapError(() =>\n storageError(\n operation,\n \"vercel\",\n { _tag: \"ProviderFailure\" },\n mutation ? \"unknown\" : \"not-applicable\",\n ),\n ),\n );\n if (key !== undefined && observed.pathname !== key)\n return yield* storageError(\n operation,\n \"vercel\",\n { _tag: \"IntegrityMismatch\" },\n mutation ? \"unknown\" : \"not-applicable\",\n );\n const uploadedAt =\n value !== null && typeof value === \"object\" ? Reflect.get(value, \"uploadedAt\") : undefined;\n const modified =\n uploadedAt instanceof Date ? Option.getOrUndefined(DateTime.make(uploadedAt)) : undefined;\n return yield* Schema.decodeUnknownEffect(Schema.toType(ObjectMetadata))({\n ref: {\n storeId: `vercel:${connection.config.access}:${connection.config.storeId}`,\n key: observed.pathname,\n },\n ...(observed.size !== undefined && observed.size !== null ? { size: observed.size } : {}),\n ...(observed.etag ? { etag: observed.etag } : {}),\n ...(observed.contentType ? { contentType: observed.contentType } : {}),\n ...(observed.contentDisposition ? { contentDisposition: observed.contentDisposition } : {}),\n ...(observed.cacheControl ? { cacheControl: observed.cacheControl } : {}),\n ...(modified ? { lastModified: modified } : {}),\n }).pipe(\n Effect.mapError(() =>\n storageError(\n operation,\n \"vercel\",\n { _tag: \"ProviderFailure\" },\n mutation ? \"unknown\" : \"not-applicable\",\n ),\n ),\n );\n});\nexport function providerError(operation: string, mutation: boolean, error: unknown) {\n // The SDK exposes create-only collisions as generic bad_request errors, without a typed code.\n const overwriteRejected =\n mutation &&\n error instanceof Blob.BlobError &&\n error.message.startsWith(\"Vercel Blob: This blob already exists,\");\n const readStatus =\n error instanceof Blob.BlobError\n ? /^Vercel Blob: Failed to fetch blob: (\\d{3}) /u.exec(error.message)?.[1]\n : undefined;\n const reason =\n readStatus === \"401\" || readStatus === \"403\"\n ? { _tag: \"AccessDenied\" as const }\n : readStatus === \"412\" || overwriteRejected\n ? { _tag: \"PreconditionFailed\" as const }\n : readStatus === \"416\"\n ? { _tag: \"RangeNotSatisfiable\" as const }\n : error instanceof Blob.BlobStoreNotFoundError\n ? { _tag: \"InvalidConfiguration\" as const, field: \"store\" }\n : error instanceof Blob.BlobNotFoundError\n ? { _tag: \"NotFound\" as const }\n : error instanceof Blob.BlobAccessError ||\n error instanceof Blob.BlobStoreSuspendedError\n ? { _tag: \"AccessDenied\" as const }\n : error instanceof Blob.BlobClientTokenExpiredError\n ? { _tag: \"Expired\" as const }\n : error instanceof Blob.BlobPreconditionFailedError\n ? { _tag: \"PreconditionFailed\" as const }\n : error instanceof Blob.BlobServiceRateLimited\n ? {\n _tag: \"Throttled\" as const,\n retryAfterMillis: Math.max(0, error.retryAfter * 1000),\n }\n : error instanceof Blob.BlobContentTypeNotAllowedError ||\n error instanceof Blob.BlobPathnameMismatchError ||\n error instanceof Blob.BlobFileTooLargeError\n ? { _tag: \"InvalidInput\" as const, field: \"upload\" }\n : { _tag: \"TransportFailure\" as const };\n const rejected = [\n \"NotFound\",\n \"AccessDenied\",\n \"Expired\",\n \"PreconditionFailed\",\n \"InvalidInput\",\n \"Throttled\",\n ].includes(reason._tag);\n return storageError(\n operation,\n \"vercel\",\n reason,\n mutation ? (rejected ? \"rejected\" : \"unknown\") : \"not-applicable\",\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { ObjectRef } from "../../core/object.js";
|
|
2
|
+
import { storageError } from "../../core/errors.js";
|
|
3
|
+
import { webUploadBody } from "../../internal/web-upload-body.js";
|
|
4
|
+
import { metadata, validateKey, writeOptions } from "./mapping.js";
|
|
5
|
+
import { call } from "./transport.js";
|
|
6
|
+
import { Effect, Redacted, Schema } from "effect";
|
|
7
|
+
import * as Blob from "@vercel/blob";
|
|
8
|
+
|
|
9
|
+
// src/providers/vercel/multipart.ts
|
|
10
|
+
const Handle = Schema.Struct({
|
|
11
|
+
key: Schema.String,
|
|
12
|
+
uploadId: Schema.String
|
|
13
|
+
});
|
|
14
|
+
function multipart(connection) {
|
|
15
|
+
const decode = Effect.fnUntraced(function* (upload) {
|
|
16
|
+
yield* Schema.decodeUnknownEffect(Schema.Struct({
|
|
17
|
+
ref: ObjectRef,
|
|
18
|
+
uploadId: Schema.Redacted(Schema.String)
|
|
19
|
+
}))(upload).pipe(Effect.mapError(() => storageError("multipart", "vercel", { _tag: "InvalidSession" })));
|
|
20
|
+
if (upload.ref.storeId !== `vercel:${connection.config.access}:${connection.config.storeId}` || upload.ref.version) return yield* storageError("multipart", "vercel", { _tag: "InvalidSession" });
|
|
21
|
+
yield* validateKey(upload.ref.key, "multipart");
|
|
22
|
+
return yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Handle))(Redacted.value(upload.uploadId)).pipe(Effect.mapError(() => storageError("multipart", "vercel", { _tag: "InvalidSession" })));
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
limits: {
|
|
26
|
+
minimumPartBytes: 5 * 1024 ** 2,
|
|
27
|
+
maximumPartBytes: 256 * 1024 ** 2,
|
|
28
|
+
maximumParts: 1e4,
|
|
29
|
+
completeConditions: []
|
|
30
|
+
},
|
|
31
|
+
initiate: Effect.fnUntraced(function* (input) {
|
|
32
|
+
yield* validateKey(input.key, "initiate");
|
|
33
|
+
const headers = yield* writeOptions(input.headers ?? {}, "initiate");
|
|
34
|
+
const result = yield* call(connection, "initiate", true, (options) => Blob.createMultipartUpload(input.key, {
|
|
35
|
+
...options,
|
|
36
|
+
...headers,
|
|
37
|
+
access: connection.config.access,
|
|
38
|
+
allowOverwrite: true
|
|
39
|
+
}));
|
|
40
|
+
yield* Schema.decodeUnknownEffect(Handle)(result).pipe(Effect.mapError(() => storageError("initiate", "vercel", { _tag: "ProviderFailure" }, "unknown")));
|
|
41
|
+
return {
|
|
42
|
+
ref: {
|
|
43
|
+
storeId: `vercel:${connection.config.access}:${connection.config.storeId}`,
|
|
44
|
+
key: input.key
|
|
45
|
+
},
|
|
46
|
+
uploadId: Redacted.make(JSON.stringify(result))
|
|
47
|
+
};
|
|
48
|
+
}),
|
|
49
|
+
uploadPart: Effect.fnUntraced(function* (input) {
|
|
50
|
+
const handle = yield* decode(input.upload);
|
|
51
|
+
if (!Number.isSafeInteger(input.partNumber) || input.partNumber < 1 || input.partNumber > 1e4) return yield* storageError("part", "vercel", {
|
|
52
|
+
_tag: "InvalidInput",
|
|
53
|
+
field: "partNumber"
|
|
54
|
+
}, "not-started");
|
|
55
|
+
return yield* webUploadBody("vercel", {
|
|
56
|
+
body: input.body,
|
|
57
|
+
...input.contentLength !== void 0 ? { contentLength: input.contentLength } : {},
|
|
58
|
+
maxBytes: 256 * 1024 ** 2
|
|
59
|
+
}, connection.config.maxUnknownLengthBytes, (body, length) => call(connection, "part", true, (options) => Blob.uploadPart(input.upload.ref.key, body instanceof Uint8Array ? new ReadableStream({ start(controller) {
|
|
60
|
+
controller.enqueue(body);
|
|
61
|
+
controller.close();
|
|
62
|
+
} }) : body, {
|
|
63
|
+
...options,
|
|
64
|
+
...handle,
|
|
65
|
+
access: connection.config.access,
|
|
66
|
+
partNumber: input.partNumber
|
|
67
|
+
})).pipe(Effect.map((part) => ({
|
|
68
|
+
...part,
|
|
69
|
+
size: length
|
|
70
|
+
}))));
|
|
71
|
+
}),
|
|
72
|
+
complete: Effect.fnUntraced(function* (input) {
|
|
73
|
+
if (input.condition) return yield* storageError("complete", "vercel", {
|
|
74
|
+
_tag: "Unsupported",
|
|
75
|
+
capability: "conditional-multipart-completion"
|
|
76
|
+
}, "not-started");
|
|
77
|
+
const handle = yield* decode(input.upload);
|
|
78
|
+
yield* Schema.decodeUnknownEffect(Schema.Array(Schema.Struct({
|
|
79
|
+
partNumber: Schema.Int.check(Schema.isBetween({
|
|
80
|
+
minimum: 1,
|
|
81
|
+
maximum: 1e4
|
|
82
|
+
})),
|
|
83
|
+
etag: Schema.NonEmptyString,
|
|
84
|
+
size: Schema.optional(Schema.Natural)
|
|
85
|
+
})).check(Schema.isMaxLength(1e4)))(input.parts).pipe(Effect.mapError(() => storageError("complete", "vercel", {
|
|
86
|
+
_tag: "InvalidInput",
|
|
87
|
+
field: "parts"
|
|
88
|
+
}, "not-started")));
|
|
89
|
+
if (input.parts.length === 0 || input.parts.some((part, index) => part.partNumber !== index + 1)) return yield* storageError("complete", "vercel", {
|
|
90
|
+
_tag: "InvalidInput",
|
|
91
|
+
field: "parts"
|
|
92
|
+
}, "not-started");
|
|
93
|
+
return yield* call(connection, "complete", true, (options) => Blob.completeMultipartUpload(input.upload.ref.key, [...input.parts], {
|
|
94
|
+
...options,
|
|
95
|
+
...handle,
|
|
96
|
+
access: connection.config.access,
|
|
97
|
+
addRandomSuffix: false,
|
|
98
|
+
allowOverwrite: true
|
|
99
|
+
})).pipe(Effect.flatMap((result) => metadata(connection, result, "complete", input.upload.ref.key, true)));
|
|
100
|
+
}),
|
|
101
|
+
listParts: () => Effect.fail(storageError("listParts", "vercel", {
|
|
102
|
+
_tag: "Unsupported",
|
|
103
|
+
capability: "multipart-inventory"
|
|
104
|
+
})),
|
|
105
|
+
abort: () => Effect.fail(storageError("abort", "vercel", {
|
|
106
|
+
_tag: "Unsupported",
|
|
107
|
+
capability: "remote-multipart-abort"
|
|
108
|
+
}))
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export { multipart };
|
|
113
|
+
//# sourceMappingURL=multipart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multipart.js","names":[],"sources":["../../../src/providers/vercel/multipart.ts"],"sourcesContent":["import { Effect, Redacted, Schema } from \"effect\";\n\nimport * as Blob from \"@vercel/blob\";\n\nimport type { MultipartHandle, MultipartUploads } from \"../../core/contracts/multipart.js\";\nimport { storageError } from \"../../core/errors.js\";\nimport { ObjectRef } from \"../../core/object.js\";\nimport { webUploadBody } from \"../../internal/web-upload-body.js\";\nimport type { VercelConnection } from \"./config.js\";\nimport { metadata, validateKey, writeOptions } from \"./mapping.js\";\nimport { call } from \"./transport.js\";\n\nconst Handle = Schema.Struct({ key: Schema.String, uploadId: Schema.String });\nexport function multipart(connection: VercelConnection): MultipartUploads {\n const decode = Effect.fnUntraced(function* (upload: MultipartHandle) {\n yield* Schema.decodeUnknownEffect(\n Schema.Struct({ ref: ObjectRef, uploadId: Schema.Redacted(Schema.String) }),\n )(upload).pipe(\n Effect.mapError(() => storageError(\"multipart\", \"vercel\", { _tag: \"InvalidSession\" })),\n );\n if (\n upload.ref.storeId !== `vercel:${connection.config.access}:${connection.config.storeId}` ||\n upload.ref.version\n )\n return yield* storageError(\"multipart\", \"vercel\", { _tag: \"InvalidSession\" });\n yield* validateKey(upload.ref.key, \"multipart\");\n return yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Handle))(\n Redacted.value(upload.uploadId),\n ).pipe(Effect.mapError(() => storageError(\"multipart\", \"vercel\", { _tag: \"InvalidSession\" })));\n });\n return {\n limits: {\n minimumPartBytes: 5 * 1024 ** 2,\n maximumPartBytes: 256 * 1024 ** 2,\n maximumParts: 10000,\n completeConditions: [],\n },\n initiate: Effect.fnUntraced(function* (input) {\n yield* validateKey(input.key, \"initiate\");\n const headers = yield* writeOptions(input.headers ?? {}, \"initiate\");\n const result = yield* call(connection, \"initiate\", true, (options) =>\n Blob.createMultipartUpload(input.key, {\n ...options,\n ...headers,\n access: connection.config.access,\n allowOverwrite: true,\n }),\n );\n yield* Schema.decodeUnknownEffect(Handle)(result).pipe(\n Effect.mapError(() =>\n storageError(\"initiate\", \"vercel\", { _tag: \"ProviderFailure\" }, \"unknown\"),\n ),\n );\n return {\n ref: {\n storeId: `vercel:${connection.config.access}:${connection.config.storeId}`,\n key: input.key,\n },\n uploadId: Redacted.make(JSON.stringify(result)),\n };\n }),\n uploadPart: Effect.fnUntraced(function* (input) {\n const handle = yield* decode(input.upload);\n if (\n !Number.isSafeInteger(input.partNumber) ||\n input.partNumber < 1 ||\n input.partNumber > 10000\n )\n return yield* storageError(\n \"part\",\n \"vercel\",\n { _tag: \"InvalidInput\", field: \"partNumber\" },\n \"not-started\",\n );\n return yield* webUploadBody(\n \"vercel\",\n {\n body: input.body,\n ...(input.contentLength !== undefined ? { contentLength: input.contentLength } : {}),\n maxBytes: 256 * 1024 ** 2,\n },\n connection.config.maxUnknownLengthBytes,\n (body, length) =>\n call(connection, \"part\", true, (options) =>\n Blob.uploadPart(\n input.upload.ref.key,\n body instanceof Uint8Array\n ? new ReadableStream({\n start(controller) {\n controller.enqueue(body);\n controller.close();\n },\n })\n : body,\n {\n ...options,\n ...handle,\n access: connection.config.access,\n partNumber: input.partNumber,\n },\n ),\n ).pipe(Effect.map((part) => ({ ...part, size: length }))),\n );\n }),\n complete: Effect.fnUntraced(function* (input) {\n if (input.condition)\n return yield* storageError(\n \"complete\",\n \"vercel\",\n { _tag: \"Unsupported\", capability: \"conditional-multipart-completion\" },\n \"not-started\",\n );\n const handle = yield* decode(input.upload);\n yield* Schema.decodeUnknownEffect(\n Schema.Array(\n Schema.Struct({\n partNumber: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 10000 })),\n etag: Schema.NonEmptyString,\n size: Schema.optional(Schema.Natural),\n }),\n ).check(Schema.isMaxLength(10000)),\n )(input.parts).pipe(\n Effect.mapError(() =>\n storageError(\n \"complete\",\n \"vercel\",\n { _tag: \"InvalidInput\", field: \"parts\" },\n \"not-started\",\n ),\n ),\n );\n if (\n input.parts.length === 0 ||\n input.parts.some((part, index) => part.partNumber !== index + 1)\n )\n return yield* storageError(\n \"complete\",\n \"vercel\",\n { _tag: \"InvalidInput\", field: \"parts\" },\n \"not-started\",\n );\n return yield* call(connection, \"complete\", true, (options) =>\n Blob.completeMultipartUpload(input.upload.ref.key, [...input.parts], {\n ...options,\n ...handle,\n access: connection.config.access,\n addRandomSuffix: false,\n allowOverwrite: true,\n }),\n ).pipe(\n Effect.flatMap((result) =>\n metadata(connection, result, \"complete\", input.upload.ref.key, true),\n ),\n );\n }),\n listParts: () =>\n Effect.fail(\n storageError(\"listParts\", \"vercel\", {\n _tag: \"Unsupported\",\n capability: \"multipart-inventory\",\n }),\n ),\n abort: () =>\n Effect.fail(\n storageError(\"abort\", \"vercel\", {\n _tag: \"Unsupported\",\n capability: \"remote-multipart-abort\",\n }),\n ),\n };\n}\n"],"mappings":"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"}
|