@effect-kit/storage 0.0.0-stage → 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +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,161 @@
|
|
|
1
|
+
import { StorageError } from "../core/errors.js";
|
|
2
|
+
import { MetadataService, StorageMetadata, StorageVersions, VersionsService } from "../lifecycle.js";
|
|
3
|
+
import "../index.js";
|
|
4
|
+
import { GcsStorage, GcsStorageService } from "../gcs.js";
|
|
5
|
+
import { Context, Effect, Layer } from "effect";
|
|
6
|
+
declare const GcsVersions_base: Context.ServiceClass<GcsVersions, "@effect-kit/storage/gcs/GcsVersions", VersionsService>;
|
|
7
|
+
export declare class GcsVersions extends GcsVersions_base {
|
|
8
|
+
static make(storage: GcsStorageService): VersionsService;
|
|
9
|
+
static readonly layer: Layer.Layer<GcsVersions | StorageVersions, never, GcsStorage>;
|
|
10
|
+
}
|
|
11
|
+
declare const GcsMetadata_base: Context.ServiceClass<GcsMetadata, "@effect-kit/storage/gcs/GcsMetadata", MetadataService>;
|
|
12
|
+
export declare class GcsMetadata extends GcsMetadata_base {
|
|
13
|
+
static make(storage: GcsStorageService): MetadataService;
|
|
14
|
+
static readonly layer: Layer.Layer<GcsMetadata | StorageMetadata, never, GcsStorage>;
|
|
15
|
+
}
|
|
16
|
+
declare const recovery: (storage: GcsStorageService) => {
|
|
17
|
+
restoreDeleted: (input: {
|
|
18
|
+
readonly ref: {
|
|
19
|
+
readonly storeId: string;
|
|
20
|
+
readonly key: string;
|
|
21
|
+
readonly version: {
|
|
22
|
+
readonly _tag: "S3Version";
|
|
23
|
+
readonly id: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly _tag: "GcsGeneration";
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly metageneration?: string | undefined;
|
|
28
|
+
} | {
|
|
29
|
+
readonly _tag: "AzureVersion";
|
|
30
|
+
readonly id: string;
|
|
31
|
+
} | {
|
|
32
|
+
readonly _tag: "AzureSnapshot";
|
|
33
|
+
readonly id: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly _tag: "OpaqueVersion";
|
|
36
|
+
readonly provider: string;
|
|
37
|
+
readonly id: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
readonly restoreToken?: string | undefined;
|
|
41
|
+
readonly copySourceAcl?: boolean | undefined;
|
|
42
|
+
}) => Effect.Effect<{
|
|
43
|
+
readonly contentType?: string | undefined;
|
|
44
|
+
readonly contentEncoding?: string | undefined;
|
|
45
|
+
readonly contentLanguage?: string | undefined;
|
|
46
|
+
readonly contentDisposition?: string | undefined;
|
|
47
|
+
readonly cacheControl?: string | undefined;
|
|
48
|
+
readonly customMetadata?: {
|
|
49
|
+
readonly [x: string]: string;
|
|
50
|
+
} | undefined;
|
|
51
|
+
readonly ref: {
|
|
52
|
+
readonly storeId: string;
|
|
53
|
+
readonly key: string;
|
|
54
|
+
readonly version?: {
|
|
55
|
+
readonly _tag: "S3Version";
|
|
56
|
+
readonly id: string;
|
|
57
|
+
} | {
|
|
58
|
+
readonly _tag: "GcsGeneration";
|
|
59
|
+
readonly id: string;
|
|
60
|
+
readonly metageneration?: string | undefined;
|
|
61
|
+
} | {
|
|
62
|
+
readonly _tag: "AzureVersion";
|
|
63
|
+
readonly id: string;
|
|
64
|
+
} | {
|
|
65
|
+
readonly _tag: "AzureSnapshot";
|
|
66
|
+
readonly id: string;
|
|
67
|
+
} | {
|
|
68
|
+
readonly _tag: "OpaqueVersion";
|
|
69
|
+
readonly provider: string;
|
|
70
|
+
readonly id: string;
|
|
71
|
+
} | undefined;
|
|
72
|
+
};
|
|
73
|
+
readonly size?: number | undefined;
|
|
74
|
+
readonly etag?: string | undefined;
|
|
75
|
+
readonly lastModified?: import("effect/DateTime").Utc | undefined;
|
|
76
|
+
readonly checksums?: readonly {
|
|
77
|
+
readonly algorithm: string;
|
|
78
|
+
readonly encoding: "base64" | "hex";
|
|
79
|
+
readonly scope: "composite" | "full-object";
|
|
80
|
+
readonly value: string;
|
|
81
|
+
readonly partCount?: number | undefined;
|
|
82
|
+
}[] | undefined;
|
|
83
|
+
readonly storageClass?: string | undefined;
|
|
84
|
+
}, StorageError, never>;
|
|
85
|
+
};
|
|
86
|
+
declare const GcsRecovery_base: Context.ServiceClass<GcsRecovery, "@effect-kit/storage/gcs/GcsRecovery", {
|
|
87
|
+
restoreDeleted: (input: {
|
|
88
|
+
readonly ref: {
|
|
89
|
+
readonly storeId: string;
|
|
90
|
+
readonly key: string;
|
|
91
|
+
readonly version: {
|
|
92
|
+
readonly _tag: "S3Version";
|
|
93
|
+
readonly id: string;
|
|
94
|
+
} | {
|
|
95
|
+
readonly _tag: "GcsGeneration";
|
|
96
|
+
readonly id: string;
|
|
97
|
+
readonly metageneration?: string | undefined;
|
|
98
|
+
} | {
|
|
99
|
+
readonly _tag: "AzureVersion";
|
|
100
|
+
readonly id: string;
|
|
101
|
+
} | {
|
|
102
|
+
readonly _tag: "AzureSnapshot";
|
|
103
|
+
readonly id: string;
|
|
104
|
+
} | {
|
|
105
|
+
readonly _tag: "OpaqueVersion";
|
|
106
|
+
readonly provider: string;
|
|
107
|
+
readonly id: string;
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
readonly restoreToken?: string | undefined;
|
|
111
|
+
readonly copySourceAcl?: boolean | undefined;
|
|
112
|
+
}) => Effect.Effect<{
|
|
113
|
+
readonly contentType?: string | undefined;
|
|
114
|
+
readonly contentEncoding?: string | undefined;
|
|
115
|
+
readonly contentLanguage?: string | undefined;
|
|
116
|
+
readonly contentDisposition?: string | undefined;
|
|
117
|
+
readonly cacheControl?: string | undefined;
|
|
118
|
+
readonly customMetadata?: {
|
|
119
|
+
readonly [x: string]: string;
|
|
120
|
+
} | undefined;
|
|
121
|
+
readonly ref: {
|
|
122
|
+
readonly storeId: string;
|
|
123
|
+
readonly key: string;
|
|
124
|
+
readonly version?: {
|
|
125
|
+
readonly _tag: "S3Version";
|
|
126
|
+
readonly id: string;
|
|
127
|
+
} | {
|
|
128
|
+
readonly _tag: "GcsGeneration";
|
|
129
|
+
readonly id: string;
|
|
130
|
+
readonly metageneration?: string | undefined;
|
|
131
|
+
} | {
|
|
132
|
+
readonly _tag: "AzureVersion";
|
|
133
|
+
readonly id: string;
|
|
134
|
+
} | {
|
|
135
|
+
readonly _tag: "AzureSnapshot";
|
|
136
|
+
readonly id: string;
|
|
137
|
+
} | {
|
|
138
|
+
readonly _tag: "OpaqueVersion";
|
|
139
|
+
readonly provider: string;
|
|
140
|
+
readonly id: string;
|
|
141
|
+
} | undefined;
|
|
142
|
+
};
|
|
143
|
+
readonly size?: number | undefined;
|
|
144
|
+
readonly etag?: string | undefined;
|
|
145
|
+
readonly lastModified?: import("effect/DateTime").Utc | undefined;
|
|
146
|
+
readonly checksums?: readonly {
|
|
147
|
+
readonly algorithm: string;
|
|
148
|
+
readonly encoding: "base64" | "hex";
|
|
149
|
+
readonly scope: "composite" | "full-object";
|
|
150
|
+
readonly value: string;
|
|
151
|
+
readonly partCount?: number | undefined;
|
|
152
|
+
}[] | undefined;
|
|
153
|
+
readonly storageClass?: string | undefined;
|
|
154
|
+
}, StorageError, never>;
|
|
155
|
+
}>;
|
|
156
|
+
export declare class GcsRecovery extends GcsRecovery_base {
|
|
157
|
+
static readonly make: typeof recovery;
|
|
158
|
+
static readonly layer: Layer.Layer<GcsRecovery, never, GcsStorage>;
|
|
159
|
+
}
|
|
160
|
+
export {};
|
|
161
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { storageError } from "../core/errors.js";
|
|
2
|
+
import { decodeRequest } from "../internal/request-validation.js";
|
|
3
|
+
import { decodeCursor, encodeCursor } from "../internal/listing-cursor.js";
|
|
4
|
+
import { decodeJson, jsonRequest } from "../providers/gcs/transport.js";
|
|
5
|
+
import { metadata, nativeHeaders, objectPath, target } from "../providers/gcs/mapping.js";
|
|
6
|
+
import { GcsStorage } from "../gcs.js";
|
|
7
|
+
import { MetadataMerge, MetadataReplace, RestoreVersion, StorageMetadata, StorageVersions, VersionQuery, VersionRef } from "../lifecycle.js";
|
|
8
|
+
import { mergeHeaders, replaceHeaders } from "../lifecycle/metadata.js";
|
|
9
|
+
import { Context, Effect, Layer, Redacted, Schema } from "effect";
|
|
10
|
+
|
|
11
|
+
// src/providers/gcs/lifecycle.ts
|
|
12
|
+
var GcsVersions = class GcsVersions extends Context.Service()("@effect-kit/storage/gcs/GcsVersions") {
|
|
13
|
+
static make(storage) {
|
|
14
|
+
return StorageVersions.make({
|
|
15
|
+
listPage: Effect.fnUntraced(function* (input = {}) {
|
|
16
|
+
const value = yield* decodeRequest(VersionQuery, input, "listVersions", "gcs");
|
|
17
|
+
const identity = JSON.stringify([
|
|
18
|
+
"versions",
|
|
19
|
+
value.prefix,
|
|
20
|
+
value.limit,
|
|
21
|
+
value.deleted
|
|
22
|
+
]);
|
|
23
|
+
const token = yield* decodeCursor("gcs", value.cursor, storage.storeId, identity, "listVersions");
|
|
24
|
+
const response = yield* jsonRequest(storage, "listVersions", false, {
|
|
25
|
+
uri: `${storage.config.apiEndpoint}/storage/v1/b/${encodeURIComponent(storage.config.bucket)}/o`,
|
|
26
|
+
qs: {
|
|
27
|
+
prefix: value.prefix,
|
|
28
|
+
maxResults: value.limit ?? 1e3,
|
|
29
|
+
pageToken: token,
|
|
30
|
+
...value.deleted ? { softDeleted: "true" } : { versions: "true" }
|
|
31
|
+
},
|
|
32
|
+
json: true
|
|
33
|
+
});
|
|
34
|
+
const page = yield* decodeJson(Schema.Struct({
|
|
35
|
+
items: Schema.optional(Schema.Array(Schema.Unknown)),
|
|
36
|
+
nextPageToken: Schema.optional(Schema.String)
|
|
37
|
+
}), response.body, "listVersions");
|
|
38
|
+
return {
|
|
39
|
+
entries: yield* Effect.forEach(page.items ?? [], (raw) => Effect.gen(function* () {
|
|
40
|
+
const observed = yield* metadata(storage, raw, "listVersions");
|
|
41
|
+
const recovery = yield* decodeJson(Schema.Struct({ restoreToken: Schema.optional(Schema.String) }), raw, "listVersions");
|
|
42
|
+
return {
|
|
43
|
+
_tag: "Version",
|
|
44
|
+
metadata: observed,
|
|
45
|
+
deleted: value.deleted ?? false,
|
|
46
|
+
...recovery.restoreToken ? { recoveryToken: Redacted.make(recovery.restoreToken) } : {}
|
|
47
|
+
};
|
|
48
|
+
})),
|
|
49
|
+
...page.nextPageToken ? { cursor: encodeCursor(storage.storeId, identity, page.nextPageToken) } : {}
|
|
50
|
+
};
|
|
51
|
+
}),
|
|
52
|
+
deleteVersion: Effect.fnUntraced(function* (input) {
|
|
53
|
+
const { ref } = yield* decodeRequest(Schema.Struct({ ref: VersionRef }), input, "deleteVersion", "gcs", true);
|
|
54
|
+
const address = yield* target(storage, { ref }, "delete");
|
|
55
|
+
yield* jsonRequest(storage, "deleteVersion", true, {
|
|
56
|
+
uri: address.uri,
|
|
57
|
+
method: "DELETE",
|
|
58
|
+
qs: {
|
|
59
|
+
...address.qs,
|
|
60
|
+
ifGenerationMatch: ref.version.id
|
|
61
|
+
},
|
|
62
|
+
json: true
|
|
63
|
+
});
|
|
64
|
+
}),
|
|
65
|
+
removeDeleteMarker: () => Effect.fail(storageError("removeDeleteMarker", "gcs", {
|
|
66
|
+
_tag: "Unsupported",
|
|
67
|
+
capability: "s3-delete-markers"
|
|
68
|
+
}, "not-started")),
|
|
69
|
+
restore: Effect.fnUntraced(function* (input) {
|
|
70
|
+
const value = yield* decodeRequest(RestoreVersion, input, "restoreVersion", "gcs", true);
|
|
71
|
+
yield* target(storage, { ref: value.source }, "restoreVersion");
|
|
72
|
+
if (value.condition._tag !== "CreateOnly") return yield* storageError("restoreVersion", "gcs", {
|
|
73
|
+
_tag: "Unsupported",
|
|
74
|
+
capability: "etag-destination-generation-condition"
|
|
75
|
+
}, "not-started");
|
|
76
|
+
let token;
|
|
77
|
+
for (let attempt = 0; attempt < 1e3; attempt++) {
|
|
78
|
+
const result = yield* storage.rewrite({
|
|
79
|
+
source: value.source,
|
|
80
|
+
destinationKey: value.destinationKey,
|
|
81
|
+
preconditions: { ifGenerationMatch: "0" },
|
|
82
|
+
...token ? { token } : {}
|
|
83
|
+
});
|
|
84
|
+
if (result._tag === "Completed") return result.metadata;
|
|
85
|
+
token = result.token;
|
|
86
|
+
}
|
|
87
|
+
return yield* storageError("restoreVersion", "gcs", {
|
|
88
|
+
_tag: "TransportFailure",
|
|
89
|
+
code: "RewriteBudgetExceeded"
|
|
90
|
+
}, "unknown");
|
|
91
|
+
})
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
static layer = Layer.effectContext(Effect.map(GcsStorage, (storage) => {
|
|
95
|
+
const service = GcsVersions.make(storage);
|
|
96
|
+
return Context.make(GcsVersions, service).pipe(Context.add(StorageVersions, service));
|
|
97
|
+
}));
|
|
98
|
+
};
|
|
99
|
+
var GcsMetadata = class GcsMetadata extends Context.Service()("@effect-kit/storage/gcs/GcsMetadata") {
|
|
100
|
+
static make(storage) {
|
|
101
|
+
const update = Effect.fnUntraced(function* (input, patch) {
|
|
102
|
+
const address = yield* target(storage, { ref: input.ref }, "updateMetadata");
|
|
103
|
+
if (input.condition) return yield* storageError("updateMetadata", "gcs", {
|
|
104
|
+
_tag: "Unsupported",
|
|
105
|
+
capability: "etag-metadata-write-condition"
|
|
106
|
+
}, "not-started");
|
|
107
|
+
if (input.ref.version?._tag !== "GcsGeneration" || !input.ref.version.metageneration) return yield* storageError("updateMetadata", "gcs", {
|
|
108
|
+
_tag: "InvalidInput",
|
|
109
|
+
field: "generation-and-metageneration"
|
|
110
|
+
}, "not-started");
|
|
111
|
+
const current = yield* storage.head({ ref: input.ref });
|
|
112
|
+
const headers = patch ? mergeHeaders(current, patch) : replaceHeaders(current, input.headers);
|
|
113
|
+
const body = nativeHeaders(headers);
|
|
114
|
+
const response = yield* jsonRequest(storage, "updateMetadata", true, {
|
|
115
|
+
uri: address.uri,
|
|
116
|
+
method: "PATCH",
|
|
117
|
+
qs: {
|
|
118
|
+
...address.qs,
|
|
119
|
+
ifGenerationMatch: input.ref.version.id,
|
|
120
|
+
ifMetagenerationMatch: input.ref.version.metageneration
|
|
121
|
+
},
|
|
122
|
+
json: {
|
|
123
|
+
contentType: body.contentType ?? null,
|
|
124
|
+
contentEncoding: body.contentEncoding ?? null,
|
|
125
|
+
contentLanguage: body.contentLanguage ?? null,
|
|
126
|
+
contentDisposition: body.contentDisposition ?? null,
|
|
127
|
+
cacheControl: body.cacheControl ?? null,
|
|
128
|
+
metadata: body.metadata ?? null
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
return yield* metadata(storage, response.body, "updateMetadata");
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
replace: (input) => decodeRequest(MetadataReplace, input, "updateMetadata", "gcs", true).pipe(Effect.flatMap((value) => update(value))),
|
|
135
|
+
merge: (input) => decodeRequest(MetadataMerge, input, "updateMetadata", "gcs", true).pipe(Effect.flatMap((value) => update({
|
|
136
|
+
ref: value.ref,
|
|
137
|
+
headers: {},
|
|
138
|
+
condition: value.condition
|
|
139
|
+
}, value.patch)))
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
static layer = Layer.effectContext(Effect.map(GcsStorage, (storage) => {
|
|
143
|
+
const service = GcsMetadata.make(storage);
|
|
144
|
+
return Context.make(GcsMetadata, service).pipe(Context.add(StorageMetadata, service));
|
|
145
|
+
}));
|
|
146
|
+
};
|
|
147
|
+
const RecoveryRequest = Schema.Struct({
|
|
148
|
+
ref: VersionRef,
|
|
149
|
+
restoreToken: Schema.optional(Schema.NonEmptyString),
|
|
150
|
+
copySourceAcl: Schema.optional(Schema.Boolean)
|
|
151
|
+
});
|
|
152
|
+
const recovery = (storage) => ({ restoreDeleted: Effect.fnUntraced(function* (input) {
|
|
153
|
+
const value = yield* decodeRequest(RecoveryRequest, input, "restoreDeleted", "gcs", true);
|
|
154
|
+
const address = yield* target(storage, { ref: value.ref }, "restoreDeleted");
|
|
155
|
+
const response = yield* jsonRequest(storage, "restoreDeleted", true, {
|
|
156
|
+
uri: `${storage.config.apiEndpoint}${objectPath(storage, value.ref.key)}/restore`,
|
|
157
|
+
method: "POST",
|
|
158
|
+
qs: {
|
|
159
|
+
...address.qs,
|
|
160
|
+
restoreToken: value.restoreToken,
|
|
161
|
+
copySourceAcl: value.copySourceAcl === void 0 ? void 0 : String(value.copySourceAcl),
|
|
162
|
+
ifGenerationMatch: "0"
|
|
163
|
+
},
|
|
164
|
+
json: {}
|
|
165
|
+
});
|
|
166
|
+
return yield* metadata(storage, response.body, "restoreDeleted");
|
|
167
|
+
}) });
|
|
168
|
+
var GcsRecovery = class GcsRecovery extends Context.Service()("@effect-kit/storage/gcs/GcsRecovery") {
|
|
169
|
+
static make = recovery;
|
|
170
|
+
static layer = Layer.effect(GcsRecovery, Effect.map(GcsStorage, recovery));
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export { GcsMetadata, GcsRecovery, GcsVersions };
|
|
174
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","names":[],"sources":["../../src/providers/gcs/lifecycle.ts"],"sourcesContent":["import { Context, Effect, Layer, Redacted, Schema } from \"effect\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { decodeCursor, encodeCursor } from \"../../internal/listing-cursor.js\";\nimport { decodeRequest } from \"../../internal/request-validation.js\";\nimport {\n MetadataMerge,\n MetadataReplace,\n RestoreVersion,\n StorageMetadata,\n StorageVersions,\n VersionQuery,\n VersionRef,\n} from \"../../lifecycle/index.js\";\nimport type { MetadataService, VersionEntry, VersionsService } from \"../../lifecycle/index.js\";\nimport { mergeHeaders, replaceHeaders } from \"../../lifecycle/metadata.js\";\nimport { GcsStorage } from \"./index.js\";\nimport type { GcsStorageService } from \"./index.js\";\nimport { metadata, nativeHeaders, objectPath, target } from \"./mapping.js\";\nimport { decodeJson, jsonRequest } from \"./transport.js\";\n\nexport class GcsVersions extends Context.Service<GcsVersions, VersionsService>()(\n \"@effect-kit/storage/gcs/GcsVersions\",\n) {\n static make(storage: GcsStorageService): VersionsService {\n return StorageVersions.make({\n listPage: Effect.fnUntraced(function* (input = {}) {\n const value = yield* decodeRequest(VersionQuery, input, \"listVersions\", \"gcs\");\n const identity = JSON.stringify([\"versions\", value.prefix, value.limit, value.deleted]);\n const token = yield* decodeCursor(\n \"gcs\",\n value.cursor,\n storage.storeId,\n identity,\n \"listVersions\",\n );\n const response = yield* jsonRequest(storage, \"listVersions\", false, {\n uri: `${storage.config.apiEndpoint}/storage/v1/b/${encodeURIComponent(storage.config.bucket)}/o`,\n qs: {\n prefix: value.prefix,\n maxResults: value.limit ?? 1000,\n pageToken: token,\n ...(value.deleted ? { softDeleted: \"true\" } : { versions: \"true\" }),\n },\n json: true,\n });\n const page = yield* decodeJson(\n Schema.Struct({\n items: Schema.optional(Schema.Array(Schema.Unknown)),\n nextPageToken: Schema.optional(Schema.String),\n }),\n response.body,\n \"listVersions\",\n );\n const entries: VersionEntry[] = yield* Effect.forEach(page.items ?? [], (raw) =>\n Effect.gen(function* () {\n const observed = yield* metadata(storage, raw, \"listVersions\");\n const recovery = yield* decodeJson(\n Schema.Struct({ restoreToken: Schema.optional(Schema.String) }),\n raw,\n \"listVersions\",\n );\n return {\n _tag: \"Version\" as const,\n metadata: observed,\n deleted: value.deleted ?? false,\n ...(recovery.restoreToken\n ? { recoveryToken: Redacted.make(recovery.restoreToken) }\n : {}),\n };\n }),\n );\n return {\n entries,\n ...(page.nextPageToken\n ? { cursor: encodeCursor(storage.storeId, identity, page.nextPageToken) }\n : {}),\n };\n }),\n deleteVersion: Effect.fnUntraced(function* (input) {\n const { ref } = yield* decodeRequest(\n Schema.Struct({ ref: VersionRef }),\n input,\n \"deleteVersion\",\n \"gcs\",\n true,\n );\n const address = yield* target(storage, { ref }, \"delete\");\n yield* jsonRequest(storage, \"deleteVersion\", true, {\n uri: address.uri,\n method: \"DELETE\",\n qs: { ...address.qs, ifGenerationMatch: ref.version.id },\n json: true,\n });\n }),\n removeDeleteMarker: () =>\n Effect.fail(\n storageError(\n \"removeDeleteMarker\",\n \"gcs\",\n { _tag: \"Unsupported\", capability: \"s3-delete-markers\" },\n \"not-started\",\n ),\n ),\n restore: Effect.fnUntraced(function* (input) {\n const value = yield* decodeRequest(RestoreVersion, input, \"restoreVersion\", \"gcs\", true);\n yield* target(storage, { ref: value.source }, \"restoreVersion\");\n if (value.condition._tag !== \"CreateOnly\")\n return yield* storageError(\n \"restoreVersion\",\n \"gcs\",\n { _tag: \"Unsupported\", capability: \"etag-destination-generation-condition\" },\n \"not-started\",\n );\n let token: string | undefined;\n for (let attempt = 0; attempt < 1000; attempt++) {\n const result = yield* storage.rewrite({\n source: value.source,\n destinationKey: value.destinationKey,\n preconditions: { ifGenerationMatch: \"0\" },\n ...(token ? { token } : {}),\n });\n if (result._tag === \"Completed\") return result.metadata;\n token = result.token;\n }\n return yield* storageError(\n \"restoreVersion\",\n \"gcs\",\n { _tag: \"TransportFailure\", code: \"RewriteBudgetExceeded\" },\n \"unknown\",\n );\n }),\n });\n }\n static readonly layer = Layer.effectContext(\n Effect.map(GcsStorage, (storage) => {\n const service = GcsVersions.make(storage);\n return Context.make(GcsVersions, service).pipe(Context.add(StorageVersions, service));\n }),\n );\n}\nexport class GcsMetadata extends Context.Service<GcsMetadata, MetadataService>()(\n \"@effect-kit/storage/gcs/GcsMetadata\",\n) {\n static make(storage: GcsStorageService): MetadataService {\n const update = Effect.fnUntraced(function* (\n input: typeof MetadataReplace.Type,\n patch?: (typeof MetadataMerge.Type)[\"patch\"],\n ) {\n const address = yield* target(storage, { ref: input.ref }, \"updateMetadata\");\n if (input.condition)\n return yield* storageError(\n \"updateMetadata\",\n \"gcs\",\n { _tag: \"Unsupported\", capability: \"etag-metadata-write-condition\" },\n \"not-started\",\n );\n if (input.ref.version?._tag !== \"GcsGeneration\" || !input.ref.version.metageneration)\n return yield* storageError(\n \"updateMetadata\",\n \"gcs\",\n { _tag: \"InvalidInput\", field: \"generation-and-metageneration\" },\n \"not-started\",\n );\n const current = yield* storage.head({ ref: input.ref });\n const headers = patch ? mergeHeaders(current, patch) : replaceHeaders(current, input.headers);\n const body = nativeHeaders(headers);\n const response = yield* jsonRequest(storage, \"updateMetadata\", true, {\n uri: address.uri,\n method: \"PATCH\",\n qs: {\n ...address.qs,\n ifGenerationMatch: input.ref.version.id,\n ifMetagenerationMatch: input.ref.version.metageneration,\n },\n json: {\n contentType: body.contentType ?? null,\n contentEncoding: body.contentEncoding ?? null,\n contentLanguage: body.contentLanguage ?? null,\n contentDisposition: body.contentDisposition ?? null,\n cacheControl: body.cacheControl ?? null,\n metadata: body.metadata ?? null,\n },\n });\n return yield* metadata(storage, response.body, \"updateMetadata\");\n });\n return {\n replace: (input) =>\n decodeRequest(MetadataReplace, input, \"updateMetadata\", \"gcs\", true).pipe(\n Effect.flatMap((value) => update(value)),\n ),\n merge: (input) =>\n decodeRequest(MetadataMerge, input, \"updateMetadata\", \"gcs\", true).pipe(\n Effect.flatMap((value) =>\n update({ ref: value.ref, headers: {}, condition: value.condition }, value.patch),\n ),\n ),\n };\n }\n static readonly layer = Layer.effectContext(\n Effect.map(GcsStorage, (storage) => {\n const service = GcsMetadata.make(storage);\n return Context.make(GcsMetadata, service).pipe(Context.add(StorageMetadata, service));\n }),\n );\n}\nconst RecoveryRequest = Schema.Struct({\n ref: VersionRef,\n restoreToken: Schema.optional(Schema.NonEmptyString),\n copySourceAcl: Schema.optional(Schema.Boolean),\n});\nconst recovery = (storage: GcsStorageService) => ({\n restoreDeleted: Effect.fnUntraced(function* (input: typeof RecoveryRequest.Type) {\n const value = yield* decodeRequest(RecoveryRequest, input, \"restoreDeleted\", \"gcs\", true);\n const address = yield* target(storage, { ref: value.ref }, \"restoreDeleted\");\n const response = yield* jsonRequest(storage, \"restoreDeleted\", true, {\n uri: `${storage.config.apiEndpoint}${objectPath(storage, value.ref.key)}/restore`,\n method: \"POST\",\n qs: {\n ...address.qs,\n restoreToken: value.restoreToken,\n copySourceAcl: value.copySourceAcl === undefined ? undefined : String(value.copySourceAcl),\n ifGenerationMatch: \"0\",\n },\n json: {},\n });\n return yield* metadata(storage, response.body, \"restoreDeleted\");\n }),\n});\nexport class GcsRecovery extends Context.Service<GcsRecovery, ReturnType<typeof recovery>>()(\n \"@effect-kit/storage/gcs/GcsRecovery\",\n) {\n static readonly make = recovery;\n static readonly layer = Layer.effect(GcsRecovery, Effect.map(GcsStorage, recovery));\n}\n"],"mappings":";;;;;;;;;;;AAqBA,IAAa,cAAb,MAAa,oBAAoB,QAAQ,QAAsC,CAAC,CAC9E,qCACF,CAAC,CAAC;CACA,OAAO,KAAK,SAA6C;EACvD,OAAO,gBAAgB,KAAK;GAC1B,UAAU,OAAO,WAAW,WAAW,QAAQ,CAAC,GAAG;IACjD,MAAM,QAAQ,OAAO,cAAc,cAAc,OAAO,gBAAgB,KAAK;IAC7E,MAAM,WAAW,KAAK,UAAU;KAAC;KAAY,MAAM;KAAQ,MAAM;KAAO,MAAM;IAAO,CAAC;IACtF,MAAM,QAAQ,OAAO,aACnB,OACA,MAAM,QACN,QAAQ,SACR,UACA,cACF;IACA,MAAM,WAAW,OAAO,YAAY,SAAS,gBAAgB,OAAO;KAClE,KAAK,GAAG,QAAQ,OAAO,YAAY,gBAAgB,mBAAmB,QAAQ,OAAO,MAAM,EAAE;KAC7F,IAAI;MACF,QAAQ,MAAM;MACd,YAAY,MAAM,SAAS;MAC3B,WAAW;MACX,GAAI,MAAM,UAAU,EAAE,aAAa,OAAO,IAAI,EAAE,UAAU,OAAO;KACnE;KACA,MAAM;IACR,CAAC;IACD,MAAM,OAAO,OAAO,WAClB,OAAO,OAAO;KACZ,OAAO,OAAO,SAAS,OAAO,MAAM,OAAO,OAAO,CAAC;KACnD,eAAe,OAAO,SAAS,OAAO,MAAM;IAC9C,CAAC,GACD,SAAS,MACT,cACF;IAmBA,OAAO;KACL,gBAnBqC,OAAO,QAAQ,KAAK,SAAS,CAAC,IAAI,QACvE,OAAO,IAAI,aAAa;MACtB,MAAM,WAAW,OAAO,SAAS,SAAS,KAAK,cAAc;MAC7D,MAAM,WAAW,OAAO,WACtB,OAAO,OAAO,EAAE,cAAc,OAAO,SAAS,OAAO,MAAM,EAAE,CAAC,GAC9D,KACA,cACF;MACA,OAAO;OACL,MAAM;OACN,UAAU;OACV,SAAS,MAAM,WAAW;OAC1B,GAAI,SAAS,eACT,EAAE,eAAe,SAAS,KAAK,SAAS,YAAY,EAAE,IACtD,CAAC;MACP;KACF,CAAC,CACH;KAGE,GAAI,KAAK,gBACL,EAAE,QAAQ,aAAa,QAAQ,SAAS,UAAU,KAAK,aAAa,EAAE,IACtE,CAAC;IACP;GACF,CAAC;GACD,eAAe,OAAO,WAAW,WAAW,OAAO;IACjD,MAAM,EAAE,QAAQ,OAAO,cACrB,OAAO,OAAO,EAAE,KAAK,WAAW,CAAC,GACjC,OACA,iBACA,OACA,IACF;IACA,MAAM,UAAU,OAAO,OAAO,SAAS,EAAE,IAAI,GAAG,QAAQ;IACxD,OAAO,YAAY,SAAS,iBAAiB,MAAM;KACjD,KAAK,QAAQ;KACb,QAAQ;KACR,IAAI;MAAE,GAAG,QAAQ;MAAI,mBAAmB,IAAI,QAAQ;KAAG;KACvD,MAAM;IACR,CAAC;GACH,CAAC;GACD,0BACE,OAAO,KACL,aACE,sBACA,OACA;IAAE,MAAM;IAAe,YAAY;GAAoB,GACvD,aACF,CACF;GACF,SAAS,OAAO,WAAW,WAAW,OAAO;IAC3C,MAAM,QAAQ,OAAO,cAAc,gBAAgB,OAAO,kBAAkB,OAAO,IAAI;IACvF,OAAO,OAAO,SAAS,EAAE,KAAK,MAAM,OAAO,GAAG,gBAAgB;IAC9D,IAAI,MAAM,UAAU,SAAS,cAC3B,OAAO,OAAO,aACZ,kBACA,OACA;KAAE,MAAM;KAAe,YAAY;IAAwC,GAC3E,aACF;IACF,IAAI;IACJ,KAAK,IAAI,UAAU,GAAG,UAAU,KAAM,WAAW;KAC/C,MAAM,SAAS,OAAO,QAAQ,QAAQ;MACpC,QAAQ,MAAM;MACd,gBAAgB,MAAM;MACtB,eAAe,EAAE,mBAAmB,IAAI;MACxC,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;KAC3B,CAAC;KACD,IAAI,OAAO,SAAS,aAAa,OAAO,OAAO;KAC/C,QAAQ,OAAO;IACjB;IACA,OAAO,OAAO,aACZ,kBACA,OACA;KAAE,MAAM;KAAoB,MAAM;IAAwB,GAC1D,SACF;GACF,CAAC;EACH,CAAC;CACH;CACA,OAAgB,QAAQ,MAAM,cAC5B,OAAO,IAAI,aAAa,YAAY;EAClC,MAAM,UAAU,YAAY,KAAK,OAAO;EACxC,OAAO,QAAQ,KAAK,aAAa,OAAO,CAAC,CAAC,KAAK,QAAQ,IAAI,iBAAiB,OAAO,CAAC;CACtF,CAAC,CACH;AACF;AACA,IAAa,cAAb,MAAa,oBAAoB,QAAQ,QAAsC,CAAC,CAC9E,qCACF,CAAC,CAAC;CACA,OAAO,KAAK,SAA6C;EACvD,MAAM,SAAS,OAAO,WAAW,WAC/B,OACA,OACA;GACA,MAAM,UAAU,OAAO,OAAO,SAAS,EAAE,KAAK,MAAM,IAAI,GAAG,gBAAgB;GAC3E,IAAI,MAAM,WACR,OAAO,OAAO,aACZ,kBACA,OACA;IAAE,MAAM;IAAe,YAAY;GAAgC,GACnE,aACF;GACF,IAAI,MAAM,IAAI,SAAS,SAAS,mBAAmB,CAAC,MAAM,IAAI,QAAQ,gBACpE,OAAO,OAAO,aACZ,kBACA,OACA;IAAE,MAAM;IAAgB,OAAO;GAAgC,GAC/D,aACF;GACF,MAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,KAAK,MAAM,IAAI,CAAC;GACtD,MAAM,UAAU,QAAQ,aAAa,SAAS,KAAK,IAAI,eAAe,SAAS,MAAM,OAAO;GAC5F,MAAM,OAAO,cAAc,OAAO;GAClC,MAAM,WAAW,OAAO,YAAY,SAAS,kBAAkB,MAAM;IACnE,KAAK,QAAQ;IACb,QAAQ;IACR,IAAI;KACF,GAAG,QAAQ;KACX,mBAAmB,MAAM,IAAI,QAAQ;KACrC,uBAAuB,MAAM,IAAI,QAAQ;IAC3C;IACA,MAAM;KACJ,aAAa,KAAK,eAAe;KACjC,iBAAiB,KAAK,mBAAmB;KACzC,iBAAiB,KAAK,mBAAmB;KACzC,oBAAoB,KAAK,sBAAsB;KAC/C,cAAc,KAAK,gBAAgB;KACnC,UAAU,KAAK,YAAY;IAC7B;GACF,CAAC;GACD,OAAO,OAAO,SAAS,SAAS,SAAS,MAAM,gBAAgB;EACjE,CAAC;EACD,OAAO;GACL,UAAU,UACR,cAAc,iBAAiB,OAAO,kBAAkB,OAAO,IAAI,CAAC,CAAC,KACnE,OAAO,SAAS,UAAU,OAAO,KAAK,CAAC,CACzC;GACF,QAAQ,UACN,cAAc,eAAe,OAAO,kBAAkB,OAAO,IAAI,CAAC,CAAC,KACjE,OAAO,SAAS,UACd,OAAO;IAAE,KAAK,MAAM;IAAK,SAAS,CAAC;IAAG,WAAW,MAAM;GAAU,GAAG,MAAM,KAAK,CACjF,CACF;EACJ;CACF;CACA,OAAgB,QAAQ,MAAM,cAC5B,OAAO,IAAI,aAAa,YAAY;EAClC,MAAM,UAAU,YAAY,KAAK,OAAO;EACxC,OAAO,QAAQ,KAAK,aAAa,OAAO,CAAC,CAAC,KAAK,QAAQ,IAAI,iBAAiB,OAAO,CAAC;CACtF,CAAC,CACH;AACF;AACA,MAAM,kBAAkB,OAAO,OAAO;CACpC,KAAK;CACL,cAAc,OAAO,SAAS,OAAO,cAAc;CACnD,eAAe,OAAO,SAAS,OAAO,OAAO;AAC/C,CAAC;AACD,MAAM,YAAY,aAAgC,EAChD,gBAAgB,OAAO,WAAW,WAAW,OAAoC;CAC/E,MAAM,QAAQ,OAAO,cAAc,iBAAiB,OAAO,kBAAkB,OAAO,IAAI;CACxF,MAAM,UAAU,OAAO,OAAO,SAAS,EAAE,KAAK,MAAM,IAAI,GAAG,gBAAgB;CAC3E,MAAM,WAAW,OAAO,YAAY,SAAS,kBAAkB,MAAM;EACnE,KAAK,GAAG,QAAQ,OAAO,cAAc,WAAW,SAAS,MAAM,IAAI,GAAG,EAAE;EACxE,QAAQ;EACR,IAAI;GACF,GAAG,QAAQ;GACX,cAAc,MAAM;GACpB,eAAe,MAAM,kBAAkB,SAAY,SAAY,OAAO,MAAM,aAAa;GACzF,mBAAmB;EACrB;EACA,MAAM,CAAC;CACT,CAAC;CACD,OAAO,OAAO,SAAS,SAAS,SAAS,MAAM,gBAAgB;AACjE,CAAC,EACH;AACA,IAAa,cAAb,MAAa,oBAAoB,QAAQ,QAAkD,CAAC,CAC1F,qCACF,CAAC,CAAC;CACA,OAAgB,OAAO;CACvB,OAAgB,QAAQ,MAAM,OAAO,aAAa,OAAO,IAAI,YAAY,QAAQ,CAAC;AACpF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ObjectRef } from "../core/object.js";
|
|
2
|
+
import { StorageError } from "../core/errors.js";
|
|
3
|
+
import { GrantConstraint } from "../core/capabilities.js";
|
|
4
|
+
import { GcsStorage } from "../gcs.js";
|
|
5
|
+
import { Context, DateTime, Effect, Layer, Redacted, Schema } from "effect";
|
|
6
|
+
declare const PostRequest: Schema.Struct<{
|
|
7
|
+
readonly key: Schema.NonEmptyString;
|
|
8
|
+
readonly expiresInSeconds: Schema.Int;
|
|
9
|
+
readonly minBytes: Schema.optional<Schema.Natural>;
|
|
10
|
+
readonly maxBytes: Schema.Natural;
|
|
11
|
+
readonly contentType: Schema.optional<Schema.String>;
|
|
12
|
+
}>;
|
|
13
|
+
export type GcsPostRequest = typeof PostRequest.Type;
|
|
14
|
+
export interface GcsPostGrant {
|
|
15
|
+
readonly method: "POST";
|
|
16
|
+
readonly ref: ObjectRef;
|
|
17
|
+
readonly url: Redacted.Redacted<string>;
|
|
18
|
+
readonly fields: Redacted.Redacted<Readonly<Record<string, string>>>;
|
|
19
|
+
readonly expiresAt: DateTime.Utc;
|
|
20
|
+
readonly constraints: ReadonlyArray<GrantConstraint>;
|
|
21
|
+
}
|
|
22
|
+
declare const GcsPost_base: Context.ServiceClass<GcsPost, "@effect-kit/storage/gcs/GcsPost", {
|
|
23
|
+
readonly create: (input: GcsPostRequest) => Effect.Effect<GcsPostGrant, StorageError>;
|
|
24
|
+
}>;
|
|
25
|
+
export declare class GcsPost extends GcsPost_base {
|
|
26
|
+
static layer(options?: {
|
|
27
|
+
readonly authorityExpiresAt?: DateTime.Utc;
|
|
28
|
+
}): Layer.Layer<GcsPost, never, GcsStorage>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=post.d.ts.map
|
package/dist/gcs/post.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { HeaderValue } from "../core/object.js";
|
|
2
|
+
import { storageError } from "../core/errors.js";
|
|
3
|
+
import { GcsKey } from "../providers/gcs/validation.js";
|
|
4
|
+
import { GcsStorage } from "../gcs.js";
|
|
5
|
+
import { Clock, Context, DateTime, Effect, Layer, Redacted, Schema } from "effect";
|
|
6
|
+
|
|
7
|
+
// src/providers/gcs/post.ts
|
|
8
|
+
const PostRequest = Schema.Struct({
|
|
9
|
+
key: GcsKey,
|
|
10
|
+
expiresInSeconds: Schema.Int.check(Schema.isBetween({
|
|
11
|
+
minimum: 1,
|
|
12
|
+
maximum: 604800
|
|
13
|
+
})),
|
|
14
|
+
minBytes: Schema.optional(Schema.Natural),
|
|
15
|
+
maxBytes: Schema.Natural,
|
|
16
|
+
contentType: Schema.optional(HeaderValue)
|
|
17
|
+
});
|
|
18
|
+
var GcsPost = class GcsPost extends Context.Service()("@effect-kit/storage/gcs/GcsPost") {
|
|
19
|
+
static layer(options = {}) {
|
|
20
|
+
return Layer.effect(GcsPost, Effect.gen(function* () {
|
|
21
|
+
const storage = yield* GcsStorage;
|
|
22
|
+
return GcsPost.of({ create: Effect.fnUntraced(function* (input) {
|
|
23
|
+
const value = yield* Schema.decodeUnknownEffect(PostRequest, { onExcessProperty: "error" })(input).pipe(Effect.mapError(() => storageError("post", "gcs", {
|
|
24
|
+
_tag: "InvalidInput",
|
|
25
|
+
field: "policy"
|
|
26
|
+
}, "not-started")));
|
|
27
|
+
const now = yield* Clock.currentTimeMillis;
|
|
28
|
+
const expiry = Math.floor(Math.min(now + value.expiresInSeconds * 1e3, options.authorityExpiresAt ? DateTime.toEpochMillis(options.authorityExpiresAt) : Infinity) / 1e3) * 1e3;
|
|
29
|
+
if ((value.minBytes ?? 0) > value.maxBytes || value.key.includes(`\${filename}`) || expiry <= now || storage.config.apiEndpoint !== "https://storage.googleapis.com" || storage.config.kmsKeyName || storage.config.customerKey) return yield* storageError("post", "gcs", {
|
|
30
|
+
_tag: "Unsupported",
|
|
31
|
+
capability: "policy-or-authority"
|
|
32
|
+
}, "not-started");
|
|
33
|
+
const [grant] = yield* Effect.tryPromise({
|
|
34
|
+
try: () => storage.client.bucket(storage.config.bucket).file(value.key).generateSignedPostPolicyV4({
|
|
35
|
+
expires: expiry,
|
|
36
|
+
fields: value.contentType ? { "Content-Type": value.contentType } : {},
|
|
37
|
+
conditions: [[
|
|
38
|
+
"content-length-range",
|
|
39
|
+
value.minBytes ?? 0,
|
|
40
|
+
value.maxBytes
|
|
41
|
+
]]
|
|
42
|
+
}),
|
|
43
|
+
catch: () => storageError("post", "gcs", { _tag: "AccessDenied" }, "not-started")
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
method: "POST",
|
|
47
|
+
ref: {
|
|
48
|
+
storeId: storage.storeId,
|
|
49
|
+
key: value.key
|
|
50
|
+
},
|
|
51
|
+
url: Redacted.make(grant.url),
|
|
52
|
+
fields: Redacted.make(grant.fields),
|
|
53
|
+
expiresAt: DateTime.makeUnsafe(expiry),
|
|
54
|
+
constraints: [{
|
|
55
|
+
kind: "minimum-bytes",
|
|
56
|
+
enforcement: "provider",
|
|
57
|
+
value: value.minBytes ?? 0
|
|
58
|
+
}, {
|
|
59
|
+
kind: "maximum-bytes",
|
|
60
|
+
enforcement: "provider",
|
|
61
|
+
value: value.maxBytes
|
|
62
|
+
}]
|
|
63
|
+
};
|
|
64
|
+
}) });
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { GcsPost };
|
|
70
|
+
//# sourceMappingURL=post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.js","names":[],"sources":["../../src/providers/gcs/post.ts"],"sourcesContent":["import { Clock, Context, DateTime, Effect, Layer, Redacted, Schema } from \"effect\";\n\nimport type { GrantConstraint } from \"../../core/capabilities.js\";\nimport { storageError } from \"../../core/errors.js\";\nimport type { StorageError } from \"../../core/errors.js\";\nimport { HeaderValue } from \"../../core/object.js\";\nimport type { ObjectRef } from \"../../core/object.js\";\nimport { GcsStorage } from \"./index.js\";\nimport { GcsKey } from \"./validation.js\";\n\nconst PostRequest = Schema.Struct({\n key: GcsKey,\n expiresInSeconds: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 604800 })),\n minBytes: Schema.optional(Schema.Natural),\n maxBytes: Schema.Natural,\n contentType: Schema.optional(HeaderValue),\n});\nexport type GcsPostRequest = typeof PostRequest.Type;\nexport interface GcsPostGrant {\n readonly method: \"POST\";\n readonly ref: ObjectRef;\n readonly url: Redacted.Redacted<string>;\n readonly fields: Redacted.Redacted<Readonly<Record<string, string>>>;\n readonly expiresAt: DateTime.Utc;\n readonly constraints: ReadonlyArray<GrantConstraint>;\n}\nexport class GcsPost extends Context.Service<\n GcsPost,\n { readonly create: (input: GcsPostRequest) => Effect.Effect<GcsPostGrant, StorageError> }\n>()(\"@effect-kit/storage/gcs/GcsPost\") {\n static layer(options: { readonly authorityExpiresAt?: DateTime.Utc } = {}) {\n return Layer.effect(\n GcsPost,\n Effect.gen(function* () {\n const storage = yield* GcsStorage;\n return GcsPost.of({\n create: Effect.fnUntraced(function* (input) {\n const value = yield* Schema.decodeUnknownEffect(PostRequest, {\n onExcessProperty: \"error\",\n })(input).pipe(\n Effect.mapError(() =>\n storageError(\n \"post\",\n \"gcs\",\n { _tag: \"InvalidInput\", field: \"policy\" },\n \"not-started\",\n ),\n ),\n );\n const now = yield* Clock.currentTimeMillis;\n const expiry =\n Math.floor(\n Math.min(\n now + value.expiresInSeconds * 1000,\n options.authorityExpiresAt\n ? DateTime.toEpochMillis(options.authorityExpiresAt)\n : Infinity,\n ) / 1000,\n ) * 1000;\n if (\n (value.minBytes ?? 0) > value.maxBytes ||\n value.key.includes(`\\${filename}`) ||\n expiry <= now ||\n storage.config.apiEndpoint !== \"https://storage.googleapis.com\" ||\n storage.config.kmsKeyName ||\n storage.config.customerKey\n )\n return yield* storageError(\n \"post\",\n \"gcs\",\n { _tag: \"Unsupported\", capability: \"policy-or-authority\" },\n \"not-started\",\n );\n const [grant] = yield* Effect.tryPromise({\n try: () =>\n storage.client\n .bucket(storage.config.bucket)\n .file(value.key)\n .generateSignedPostPolicyV4({\n expires: expiry,\n fields: value.contentType ? { \"Content-Type\": value.contentType } : {},\n conditions: [[\"content-length-range\", value.minBytes ?? 0, value.maxBytes]],\n }),\n catch: () => storageError(\"post\", \"gcs\", { _tag: \"AccessDenied\" }, \"not-started\"),\n });\n return {\n method: \"POST\" as const,\n ref: { storeId: storage.storeId, key: value.key },\n url: Redacted.make(grant.url),\n fields: Redacted.make(grant.fields),\n expiresAt: DateTime.makeUnsafe(expiry),\n constraints: [\n {\n kind: \"minimum-bytes\",\n enforcement: \"provider\" as const,\n value: value.minBytes ?? 0,\n },\n { kind: \"maximum-bytes\", enforcement: \"provider\" as const, value: value.maxBytes },\n ],\n };\n }),\n });\n }),\n );\n }\n}\n"],"mappings":";;;;;;;AAUA,MAAM,cAAc,OAAO,OAAO;CAChC,KAAK;CACL,kBAAkB,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAO,CAAC,CAAC;CACpF,UAAU,OAAO,SAAS,OAAO,OAAO;CACxC,UAAU,OAAO;CACjB,aAAa,OAAO,SAAS,WAAW;AAC1C,CAAC;AAUD,IAAa,UAAb,MAAa,gBAAgB,QAAQ,QAGnC,CAAC,CAAC,iCAAiC,CAAC,CAAC;CACrC,OAAO,MAAM,UAA0D,CAAC,GAAG;EACzE,OAAO,MAAM,OACX,SACA,OAAO,IAAI,aAAa;GACtB,MAAM,UAAU,OAAO;GACvB,OAAO,QAAQ,GAAG,EAChB,QAAQ,OAAO,WAAW,WAAW,OAAO;IAC1C,MAAM,QAAQ,OAAO,OAAO,oBAAoB,aAAa,EAC3D,kBAAkB,QACpB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KACR,OAAO,eACL,aACE,QACA,OACA;KAAE,MAAM;KAAgB,OAAO;IAAS,GACxC,aACF,CACF,CACF;IACA,MAAM,MAAM,OAAO,MAAM;IACzB,MAAM,SACJ,KAAK,MACH,KAAK,IACH,MAAM,MAAM,mBAAmB,KAC/B,QAAQ,qBACJ,SAAS,cAAc,QAAQ,kBAAkB,IACjD,QACN,IAAI,GACN,IAAI;IACN,KACG,MAAM,YAAY,KAAK,MAAM,YAC9B,MAAM,IAAI,SAAS,cAAc,KACjC,UAAU,OACV,QAAQ,OAAO,gBAAgB,oCAC/B,QAAQ,OAAO,cACf,QAAQ,OAAO,aAEf,OAAO,OAAO,aACZ,QACA,OACA;KAAE,MAAM;KAAe,YAAY;IAAsB,GACzD,aACF;IACF,MAAM,CAAC,SAAS,OAAO,OAAO,WAAW;KACvC,WACE,QAAQ,OACL,OAAO,QAAQ,OAAO,MAAM,CAAC,CAC7B,KAAK,MAAM,GAAG,CAAC,CACf,2BAA2B;MAC1B,SAAS;MACT,QAAQ,MAAM,cAAc,EAAE,gBAAgB,MAAM,YAAY,IAAI,CAAC;MACrE,YAAY,CAAC;OAAC;OAAwB,MAAM,YAAY;OAAG,MAAM;MAAQ,CAAC;KAC5E,CAAC;KACL,aAAa,aAAa,QAAQ,OAAO,EAAE,MAAM,eAAe,GAAG,aAAa;IAClF,CAAC;IACD,OAAO;KACL,QAAQ;KACR,KAAK;MAAE,SAAS,QAAQ;MAAS,KAAK,MAAM;KAAI;KAChD,KAAK,SAAS,KAAK,MAAM,GAAG;KAC5B,QAAQ,SAAS,KAAK,MAAM,MAAM;KAClC,WAAW,SAAS,WAAW,MAAM;KACrC,aAAa,CACX;MACE,MAAM;MACN,aAAa;MACb,OAAO,MAAM,YAAY;KAC3B,GACA;MAAE,MAAM;MAAiB,aAAa;MAAqB,OAAO,MAAM;KAAS,CACnF;IACF;GACF,CAAC,EACH,CAAC;EACH,CAAC,CACH;CACF;AACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { StorageSigning } from "../core/capabilities.js";
|
|
2
|
+
import { GcsStorage } from "../gcs.js";
|
|
3
|
+
import { DateTime, Layer } from "effect";
|
|
4
|
+
/** Explicitly selected signing authority; ADC data access alone need not permit signBlob. */
|
|
5
|
+
export declare const GcsSigning: {
|
|
6
|
+
layer(options?: {
|
|
7
|
+
readonly authorityExpiresAt?: DateTime.Utc;
|
|
8
|
+
}): Layer.Layer<StorageSigning, never, GcsStorage>;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=signing.d.ts.map
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { storageError } from "../core/errors.js";
|
|
2
|
+
import { StorageSigning } from "../core/capabilities.js";
|
|
3
|
+
import { target } from "../providers/gcs/mapping.js";
|
|
4
|
+
import { GcsStorage } from "../gcs.js";
|
|
5
|
+
import { signingRequest } from "../internal/signing-request.js";
|
|
6
|
+
import { Clock, DateTime, Effect, Layer, Redacted } from "effect";
|
|
7
|
+
|
|
8
|
+
// src/providers/gcs/signing.ts
|
|
9
|
+
/** Explicitly selected signing authority; ADC data access alone need not permit signBlob. */
|
|
10
|
+
const GcsSigning = { layer(options = {}) {
|
|
11
|
+
return Layer.effect(StorageSigning, Effect.gen(function* () {
|
|
12
|
+
const storage = yield* GcsStorage;
|
|
13
|
+
return StorageSigning.of({ sign: Effect.fnUntraced(function* (request) {
|
|
14
|
+
yield* signingRequest(request, "gcs");
|
|
15
|
+
if (storage.config.customerKey) return yield* storageError("sign", "gcs", {
|
|
16
|
+
_tag: "Unsupported",
|
|
17
|
+
capability: "customer-key-signing"
|
|
18
|
+
}, "not-started");
|
|
19
|
+
const address = yield* target(storage, { ref: request.ref }, "sign");
|
|
20
|
+
if (request.method === "PUT" && (request.ref.version || storage.config.kmsKeyName)) return yield* storageError("sign", "gcs", {
|
|
21
|
+
_tag: "Unsupported",
|
|
22
|
+
capability: "generation-or-kms-write-signing"
|
|
23
|
+
}, "not-started");
|
|
24
|
+
const now = yield* Clock.currentTimeMillis;
|
|
25
|
+
const expiry = Math.floor(Math.min(now + request.expiresInSeconds * 1e3, options.authorityExpiresAt ? DateTime.toEpochMillis(options.authorityExpiresAt) : Infinity) / 1e3) * 1e3;
|
|
26
|
+
if (!Number.isSafeInteger(request.expiresInSeconds) || request.expiresInSeconds <= 0 || request.expiresInSeconds > 604800 || expiry <= now || storage.config.apiEndpoint !== "https://storage.googleapis.com") return yield* storageError("sign", "gcs", {
|
|
27
|
+
_tag: "InvalidInput",
|
|
28
|
+
field: "expiry-or-endpoint"
|
|
29
|
+
}, "not-started");
|
|
30
|
+
if (request.method === "HEAD") return yield* storageError("sign", "gcs", {
|
|
31
|
+
_tag: "Unsupported",
|
|
32
|
+
capability: "head-signing"
|
|
33
|
+
}, "not-started");
|
|
34
|
+
const action = {
|
|
35
|
+
GET: "read",
|
|
36
|
+
PUT: "write",
|
|
37
|
+
DELETE: "delete"
|
|
38
|
+
}[request.method];
|
|
39
|
+
const [url] = yield* Effect.tryPromise({
|
|
40
|
+
try: () => storage.client.bucket(storage.config.bucket).file(address.ref.key).getSignedUrl({
|
|
41
|
+
version: "v4",
|
|
42
|
+
action,
|
|
43
|
+
expires: expiry,
|
|
44
|
+
...address.ref.version ? { queryParams: { generation: address.ref.version.id } } : {}
|
|
45
|
+
}),
|
|
46
|
+
catch: () => storageError("sign", "gcs", { _tag: "AccessDenied" }, "not-started")
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
method: request.method,
|
|
50
|
+
url: Redacted.make(url),
|
|
51
|
+
headers: Redacted.make({}),
|
|
52
|
+
ref: address.ref,
|
|
53
|
+
expiresAt: DateTime.makeUnsafe(expiry),
|
|
54
|
+
constraints: []
|
|
55
|
+
};
|
|
56
|
+
}) });
|
|
57
|
+
}));
|
|
58
|
+
} };
|
|
59
|
+
|
|
60
|
+
export { GcsSigning };
|
|
61
|
+
//# sourceMappingURL=signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.js","names":[],"sources":["../../src/providers/gcs/signing.ts"],"sourcesContent":["import { Clock, DateTime, Effect, Layer, Redacted } from \"effect\";\n\nimport { StorageSigning } from \"../../core/capabilities.js\";\nimport type { SignedRequest } from \"../../core/capabilities.js\";\nimport { storageError } from \"../../core/errors.js\";\nimport { signingRequest } from \"../../internal/signing-request.js\";\nimport { GcsStorage } from \"./index.js\";\nimport { target } from \"./mapping.js\";\n\n/** Explicitly selected signing authority; ADC data access alone need not permit signBlob. */\nexport const GcsSigning = {\n layer(options: { readonly authorityExpiresAt?: DateTime.Utc } = {}) {\n return Layer.effect(\n StorageSigning,\n Effect.gen(function* () {\n const storage = yield* GcsStorage;\n return StorageSigning.of({\n sign: Effect.fnUntraced(function* (request) {\n yield* signingRequest(request, \"gcs\");\n if (storage.config.customerKey)\n return yield* storageError(\n \"sign\",\n \"gcs\",\n { _tag: \"Unsupported\", capability: \"customer-key-signing\" },\n \"not-started\",\n );\n const address = yield* target(storage, { ref: request.ref }, \"sign\");\n if (request.method === \"PUT\" && (request.ref.version || storage.config.kmsKeyName))\n return yield* storageError(\n \"sign\",\n \"gcs\",\n { _tag: \"Unsupported\", capability: \"generation-or-kms-write-signing\" },\n \"not-started\",\n );\n const now = yield* Clock.currentTimeMillis;\n const expiry =\n Math.floor(\n Math.min(\n now + request.expiresInSeconds * 1000,\n options.authorityExpiresAt\n ? DateTime.toEpochMillis(options.authorityExpiresAt)\n : Infinity,\n ) / 1000,\n ) * 1000;\n if (\n !Number.isSafeInteger(request.expiresInSeconds) ||\n request.expiresInSeconds <= 0 ||\n request.expiresInSeconds > 604800 ||\n expiry <= now ||\n storage.config.apiEndpoint !== \"https://storage.googleapis.com\"\n )\n return yield* storageError(\n \"sign\",\n \"gcs\",\n { _tag: \"InvalidInput\", field: \"expiry-or-endpoint\" },\n \"not-started\",\n );\n if (request.method === \"HEAD\")\n return yield* storageError(\n \"sign\",\n \"gcs\",\n { _tag: \"Unsupported\", capability: \"head-signing\" },\n \"not-started\",\n );\n const actions = { GET: \"read\", PUT: \"write\", DELETE: \"delete\" } as const;\n const action = actions[request.method];\n const [url] = yield* Effect.tryPromise({\n try: () =>\n storage.client\n .bucket(storage.config.bucket)\n .file(address.ref.key)\n .getSignedUrl({\n version: \"v4\",\n action,\n expires: expiry,\n ...(address.ref.version\n ? { queryParams: { generation: address.ref.version.id } }\n : {}),\n }),\n catch: () => storageError(\"sign\", \"gcs\", { _tag: \"AccessDenied\" }, \"not-started\"),\n });\n return {\n method: request.method,\n url: Redacted.make(url),\n headers: Redacted.make({}),\n ref: address.ref,\n expiresAt: DateTime.makeUnsafe(expiry),\n constraints: [],\n } satisfies SignedRequest;\n }),\n });\n }),\n );\n },\n};\n"],"mappings":";;;;;;;;;AAUA,MAAa,aAAa,EACxB,MAAM,UAA0D,CAAC,GAAG;CAClE,OAAO,MAAM,OACX,gBACA,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO;EACvB,OAAO,eAAe,GAAG,EACvB,MAAM,OAAO,WAAW,WAAW,SAAS;GAC1C,OAAO,eAAe,SAAS,KAAK;GACpC,IAAI,QAAQ,OAAO,aACjB,OAAO,OAAO,aACZ,QACA,OACA;IAAE,MAAM;IAAe,YAAY;GAAuB,GAC1D,aACF;GACF,MAAM,UAAU,OAAO,OAAO,SAAS,EAAE,KAAK,QAAQ,IAAI,GAAG,MAAM;GACnE,IAAI,QAAQ,WAAW,UAAU,QAAQ,IAAI,WAAW,QAAQ,OAAO,aACrE,OAAO,OAAO,aACZ,QACA,OACA;IAAE,MAAM;IAAe,YAAY;GAAkC,GACrE,aACF;GACF,MAAM,MAAM,OAAO,MAAM;GACzB,MAAM,SACJ,KAAK,MACH,KAAK,IACH,MAAM,QAAQ,mBAAmB,KACjC,QAAQ,qBACJ,SAAS,cAAc,QAAQ,kBAAkB,IACjD,QACN,IAAI,GACN,IAAI;GACN,IACE,CAAC,OAAO,cAAc,QAAQ,gBAAgB,KAC9C,QAAQ,oBAAoB,KAC5B,QAAQ,mBAAmB,UAC3B,UAAU,OACV,QAAQ,OAAO,gBAAgB,kCAE/B,OAAO,OAAO,aACZ,QACA,OACA;IAAE,MAAM;IAAgB,OAAO;GAAqB,GACpD,aACF;GACF,IAAI,QAAQ,WAAW,QACrB,OAAO,OAAO,aACZ,QACA,OACA;IAAE,MAAM;IAAe,YAAY;GAAe,GAClD,aACF;GAEF,MAAM,SAAS;IADG,KAAK;IAAQ,KAAK;IAAS,QAAQ;GAChC,EAAE,QAAQ;GAC/B,MAAM,CAAC,OAAO,OAAO,OAAO,WAAW;IACrC,WACE,QAAQ,OACL,OAAO,QAAQ,OAAO,MAAM,CAAC,CAC7B,KAAK,QAAQ,IAAI,GAAG,CAAC,CACrB,aAAa;KACZ,SAAS;KACT;KACA,SAAS;KACT,GAAI,QAAQ,IAAI,UACZ,EAAE,aAAa,EAAE,YAAY,QAAQ,IAAI,QAAQ,GAAG,EAAE,IACtD,CAAC;IACP,CAAC;IACL,aAAa,aAAa,QAAQ,OAAO,EAAE,MAAM,eAAe,GAAG,aAAa;GAClF,CAAC;GACD,OAAO;IACL,QAAQ,QAAQ;IAChB,KAAK,SAAS,KAAK,GAAG;IACtB,SAAS,SAAS,KAAK,CAAC,CAAC;IACzB,KAAK,QAAQ;IACb,WAAW,SAAS,WAAW,MAAM;IACrC,aAAa,CAAC;GAChB;EACF,CAAC,EACH,CAAC;CACH,CAAC,CACH;AACF,EACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { UploadError } from "../uploads/schema.js";
|
|
2
|
+
import { UploadGrantDriver } from "../uploads/driver.js";
|
|
3
|
+
import { GcsStorage } from "../gcs.js";
|
|
4
|
+
import { Layer } from "effect";
|
|
5
|
+
export declare const GcsUploadGrants: {
|
|
6
|
+
layer(options?: {
|
|
7
|
+
readonly chunkBytes?: number;
|
|
8
|
+
}): Layer.Layer<UploadGrantDriver, UploadError, GcsStorage>;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=uploads.d.ts.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { failUpload } from "../uploads/schema.js";
|
|
2
|
+
import { UploadGrantDriver } from "../uploads/driver.js";
|
|
3
|
+
import { operationMetadata } from "../uploads/verification.js";
|
|
4
|
+
import { GcsStorage } from "../gcs.js";
|
|
5
|
+
import { Clock, Effect, Layer, Redacted, Schema } from "effect";
|
|
6
|
+
|
|
7
|
+
// src/providers/gcs/uploads.ts
|
|
8
|
+
const decode = (remote) => Schema.decodeUnknownEffect(Schema.Struct({
|
|
9
|
+
url: Schema.String,
|
|
10
|
+
total: Schema.Natural,
|
|
11
|
+
expiresAt: Schema.Number
|
|
12
|
+
}))(remote).pipe(Effect.mapError(() => failUpload("Conflict")));
|
|
13
|
+
const GcsUploadGrants = { layer(options = {}) {
|
|
14
|
+
return Layer.effect(UploadGrantDriver, Effect.gen(function* () {
|
|
15
|
+
const storage = yield* GcsStorage;
|
|
16
|
+
const chunkBytes = options.chunkBytes ?? 8 * 1024 ** 2;
|
|
17
|
+
if (chunkBytes < 262144 || chunkBytes % 262144 || chunkBytes > 64 * 1024 ** 2) return yield* failUpload("BadRequest");
|
|
18
|
+
return UploadGrantDriver.of({
|
|
19
|
+
maximumGrantLifetimeMillis: 60486e4,
|
|
20
|
+
begin: Effect.fnUntraced(function* (record) {
|
|
21
|
+
if (storage.config.customerKey || !["auto", "resumable"].includes(record.input.strategy ?? "auto")) return yield* failUpload("Unsupported");
|
|
22
|
+
const upload = yield* storage.offsets.create({
|
|
23
|
+
key: record.stagingKey,
|
|
24
|
+
contentLength: record.input.file.size,
|
|
25
|
+
contentType: record.input.file.contentType,
|
|
26
|
+
customMetadata: operationMetadata(record),
|
|
27
|
+
condition: { _tag: "CreateOnly" }
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
...yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({
|
|
31
|
+
url: Schema.String,
|
|
32
|
+
total: Schema.Natural
|
|
33
|
+
})))(Redacted.value(upload.handle)).pipe(Effect.mapError(() => failUpload("Unavailable"))),
|
|
34
|
+
expiresAt: (yield* Clock.currentTimeMillis) + 6048e5
|
|
35
|
+
};
|
|
36
|
+
}),
|
|
37
|
+
grant: Effect.fnUntraced(function* (record, expiresAt) {
|
|
38
|
+
const remote = yield* decode(record.remote ? Redacted.value(record.remote) : void 0);
|
|
39
|
+
const state = yield* storage.offsets.query({
|
|
40
|
+
protocol: "gcs-resumable-v1",
|
|
41
|
+
ref: {
|
|
42
|
+
storeId: storage.storeId,
|
|
43
|
+
key: record.stagingKey
|
|
44
|
+
},
|
|
45
|
+
handle: Redacted.make(JSON.stringify(remote))
|
|
46
|
+
});
|
|
47
|
+
if (state._tag === "Expired") return yield* failUpload("Expired");
|
|
48
|
+
if (state._tag === "Unknown") return yield* failUpload("Unavailable");
|
|
49
|
+
return {
|
|
50
|
+
_tag: "Resumable",
|
|
51
|
+
protocol: "gcs",
|
|
52
|
+
url: remote.url,
|
|
53
|
+
headers: {},
|
|
54
|
+
offset: state._tag === "Completed" ? record.input.file.size : state.committedOffset,
|
|
55
|
+
chunkBytes,
|
|
56
|
+
expiresAt: Math.min(expiresAt, remote.expiresAt)
|
|
57
|
+
};
|
|
58
|
+
}),
|
|
59
|
+
abort: Effect.fnUntraced(function* (record) {
|
|
60
|
+
if (record.remote === void 0) return;
|
|
61
|
+
const remote = yield* decode(record.remote ? Redacted.value(record.remote) : void 0);
|
|
62
|
+
yield* storage.offsets.cancel({
|
|
63
|
+
protocol: "gcs-resumable-v1",
|
|
64
|
+
ref: {
|
|
65
|
+
storeId: storage.storeId,
|
|
66
|
+
key: record.stagingKey
|
|
67
|
+
},
|
|
68
|
+
handle: Redacted.make(JSON.stringify(remote))
|
|
69
|
+
});
|
|
70
|
+
})
|
|
71
|
+
});
|
|
72
|
+
}));
|
|
73
|
+
} };
|
|
74
|
+
|
|
75
|
+
export { GcsUploadGrants };
|
|
76
|
+
//# sourceMappingURL=uploads.js.map
|