@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
package/dist/client.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { GrantResponse, UploadErrorCode, UploadInput, UploadStatus, failUpload } from "./uploads/schema.js";
|
|
2
|
+
import { hashFile } from "./client/fingerprint.js";
|
|
3
|
+
import { UploadClientStore } from "./client/store.js";
|
|
4
|
+
import { fetchTransfer, providerUrl, xhrTransfer } from "./client/transport.js";
|
|
5
|
+
import { Context, Effect, Layer, Schedule, Schema } from "effect";
|
|
6
|
+
|
|
7
|
+
// src/client/index.ts
|
|
8
|
+
const decode = (schema, value) => Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => failUpload("BadRequest")));
|
|
9
|
+
const emit = (onProgress, value) => onProgress ? Effect.try({
|
|
10
|
+
try: () => onProgress(value),
|
|
11
|
+
catch: () => failUpload("Unavailable")
|
|
12
|
+
}) : Effect.void;
|
|
13
|
+
const path = (id) => `/uploads/${encodeURIComponent(id)}`;
|
|
14
|
+
const successful = (response) => response.status >= 200 && response.status < 300 ? Effect.void : Effect.fail(failUpload(response.status === 401 || response.status === 403 ? "Expired" : "Unavailable"));
|
|
15
|
+
const make = Effect.fnUntraced(function* (options) {
|
|
16
|
+
const context = yield* Effect.context();
|
|
17
|
+
const base = options.baseUrl.replace(/\/$/u, "");
|
|
18
|
+
const parsed = URL.parse(base, typeof location === "undefined" ? "http://localhost" : location.href);
|
|
19
|
+
if (!parsed || parsed.username || parsed.password || parsed.search || parsed.hash || !(base.startsWith("/") || parsed.protocol === "https:" || parsed.protocol === "http:" && ["localhost", "127.0.0.1"].includes(parsed.hostname))) return yield* failUpload("BadRequest");
|
|
20
|
+
const deadline = options.deadlineMillis ?? 18e5;
|
|
21
|
+
if (!Number.isSafeInteger(deadline) || deadline <= 0) return yield* failUpload("BadRequest");
|
|
22
|
+
const bounded = (effect) => effect.pipe(Effect.timeoutOrElse({
|
|
23
|
+
duration: deadline,
|
|
24
|
+
orElse: () => Effect.fail(failUpload("Unavailable"))
|
|
25
|
+
}));
|
|
26
|
+
const store = options.store ?? UploadClientStore.memory();
|
|
27
|
+
const api = Effect.fnUntraced(function* (method, resourcePath, schema, body) {
|
|
28
|
+
const headers = options.headers ? yield* Effect.provide(options.headers(), context) : {};
|
|
29
|
+
const response = yield* Effect.tryPromise({
|
|
30
|
+
try: (signal) => fetch(base + resourcePath, {
|
|
31
|
+
method,
|
|
32
|
+
credentials: options.credentials ?? "same-origin",
|
|
33
|
+
redirect: "error",
|
|
34
|
+
headers: {
|
|
35
|
+
...headers,
|
|
36
|
+
...body !== void 0 ? { "content-type": "application/json" } : {}
|
|
37
|
+
},
|
|
38
|
+
...body !== void 0 ? { body: JSON.stringify(body) } : {},
|
|
39
|
+
signal
|
|
40
|
+
}),
|
|
41
|
+
catch: () => failUpload("Unavailable")
|
|
42
|
+
});
|
|
43
|
+
const value = yield* Effect.tryPromise({
|
|
44
|
+
try: async (signal) => {
|
|
45
|
+
const reader = response.body?.getReader();
|
|
46
|
+
if (!reader) throw new Error("Missing response");
|
|
47
|
+
const cancel = () => {
|
|
48
|
+
reader.cancel().catch(() => void 0);
|
|
49
|
+
};
|
|
50
|
+
signal.addEventListener("abort", cancel, { once: true });
|
|
51
|
+
let text = "";
|
|
52
|
+
const decoder = new TextDecoder();
|
|
53
|
+
let bytes = 0;
|
|
54
|
+
try {
|
|
55
|
+
while (true) {
|
|
56
|
+
const next = await reader.read();
|
|
57
|
+
if (next.done) break;
|
|
58
|
+
bytes += next.value.length;
|
|
59
|
+
if (bytes > 1048576) throw new Error("Response limit");
|
|
60
|
+
text += decoder.decode(next.value, { stream: true });
|
|
61
|
+
}
|
|
62
|
+
if (signal.aborted) throw new Error("Request interrupted");
|
|
63
|
+
return JSON.parse(text + decoder.decode());
|
|
64
|
+
} finally {
|
|
65
|
+
signal.removeEventListener("abort", cancel);
|
|
66
|
+
await reader.cancel();
|
|
67
|
+
reader.releaseLock();
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
catch: () => failUpload("Unavailable")
|
|
71
|
+
});
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
const error = yield* decode(Schema.Struct({ code: UploadErrorCode }), value);
|
|
74
|
+
return yield* failUpload(error.code);
|
|
75
|
+
}
|
|
76
|
+
return yield* decode(schema, value);
|
|
77
|
+
}, Effect.retry({
|
|
78
|
+
times: 2,
|
|
79
|
+
schedule: Schedule.exponential("100 millis"),
|
|
80
|
+
while: (error) => error.code === "Unavailable"
|
|
81
|
+
}), bounded);
|
|
82
|
+
const ticket = Effect.fnUntraced(function* (id, file, onProgress) {
|
|
83
|
+
const record = yield* store.read(id);
|
|
84
|
+
if (!record || !record.id) return yield* failUpload("NotFound");
|
|
85
|
+
if (record.input.file.size !== file.size || record.input.file.name !== file.name || record.input.file.contentType !== (file.type || "application/octet-stream") || record.input.file.sha256 !== (yield* hashFile(file, onProgress))) return yield* failUpload("Conflict");
|
|
86
|
+
return record;
|
|
87
|
+
});
|
|
88
|
+
const transfer = Effect.fnUntraced(function* (input) {
|
|
89
|
+
const id = (yield* ticket(input.uploadId, input.file, input.onProgress)).id;
|
|
90
|
+
if (!id) return yield* failUpload("NotFound");
|
|
91
|
+
let grant = (yield* api("POST", `${path(id)}/grants`, GrantResponse)).grant;
|
|
92
|
+
const onProtocol = input.onProtocol;
|
|
93
|
+
if (onProtocol) yield* Effect.try({
|
|
94
|
+
try: () => onProtocol(grant._tag === "Multipart" || grant._tag === "Blocks" ? "multipart" : grant._tag === "Resumable" ? "resumable" : grant._tag === "PostForm" ? "post" : grant._tag === "Proxy" ? "proxy" : "single", id),
|
|
95
|
+
catch: () => failUpload("Unavailable")
|
|
96
|
+
});
|
|
97
|
+
let accepted = 0;
|
|
98
|
+
const send = Effect.fnUntraced(function* (url, method, headers, body, offset) {
|
|
99
|
+
const target = yield* providerUrl(url);
|
|
100
|
+
const safeHeaders = Object.fromEntries(Object.entries(headers).filter(([name]) => !["content-length", "host"].includes(name.toLowerCase())));
|
|
101
|
+
return yield* options.transport === "xhr" ? xhrTransfer(target, method, safeHeaders, body, (sent) => input.onProgress?.({
|
|
102
|
+
phase: "uploading",
|
|
103
|
+
bytesSent: offset + sent,
|
|
104
|
+
bytesAccepted: accepted,
|
|
105
|
+
totalBytes: input.file.size,
|
|
106
|
+
measurement: "xhr"
|
|
107
|
+
})) : fetchTransfer(target, method, safeHeaders, body);
|
|
108
|
+
});
|
|
109
|
+
const notify = () => emit(input.onProgress, {
|
|
110
|
+
phase: "uploading",
|
|
111
|
+
bytesAccepted: accepted,
|
|
112
|
+
totalBytes: input.file.size,
|
|
113
|
+
measurement: "provider-accepted"
|
|
114
|
+
});
|
|
115
|
+
const parts = [];
|
|
116
|
+
yield* emit(input.onProgress, {
|
|
117
|
+
phase: "uploading",
|
|
118
|
+
bytesAccepted: 0,
|
|
119
|
+
totalBytes: input.file.size,
|
|
120
|
+
measurement: "indeterminate"
|
|
121
|
+
});
|
|
122
|
+
if (grant._tag === "Proxy") {
|
|
123
|
+
const headers = options.headers ? yield* Effect.provide(options.headers(), context) : {};
|
|
124
|
+
const response = yield* Effect.tryPromise({
|
|
125
|
+
try: (signal) => fetch(`${base}${path(id)}/content`, {
|
|
126
|
+
method: "PUT",
|
|
127
|
+
credentials: options.credentials ?? "same-origin",
|
|
128
|
+
headers: {
|
|
129
|
+
...headers,
|
|
130
|
+
"content-type": input.file.type || "application/octet-stream"
|
|
131
|
+
},
|
|
132
|
+
body: input.file,
|
|
133
|
+
signal,
|
|
134
|
+
redirect: "error"
|
|
135
|
+
}),
|
|
136
|
+
catch: () => failUpload("Unavailable")
|
|
137
|
+
});
|
|
138
|
+
yield* Effect.tryPromise({
|
|
139
|
+
try: async () => {
|
|
140
|
+
await response.body?.cancel();
|
|
141
|
+
},
|
|
142
|
+
catch: () => failUpload("Unavailable")
|
|
143
|
+
});
|
|
144
|
+
yield* successful(response);
|
|
145
|
+
accepted = input.file.size;
|
|
146
|
+
} else if (grant._tag === "SignedRequest") {
|
|
147
|
+
yield* successful(yield* send(grant.url, grant.method, grant.headers, input.file, 0));
|
|
148
|
+
accepted = input.file.size;
|
|
149
|
+
} else if (grant._tag === "PostForm") {
|
|
150
|
+
const form = new FormData();
|
|
151
|
+
for (const [key, value] of Object.entries(grant.fields)) form.append(key, value);
|
|
152
|
+
form.append("file", input.file);
|
|
153
|
+
yield* successful(yield* send(grant.url, "POST", {}, form, 0));
|
|
154
|
+
accepted = input.file.size;
|
|
155
|
+
} else if (grant._tag === "Multipart" || grant._tag === "Blocks") {
|
|
156
|
+
const count = Math.ceil(input.file.size / grant.partBytes);
|
|
157
|
+
if (count > 1e4 || count < 1) return yield* failUpload("BadRequest");
|
|
158
|
+
for (let partNumber = 1; partNumber <= count; partNumber++) {
|
|
159
|
+
const offset = (partNumber - 1) * grant.partBytes;
|
|
160
|
+
const size = Math.min(grant.partBytes, input.file.size - offset);
|
|
161
|
+
const done = grant._tag === "Multipart" ? grant.completed.find((part) => part.partNumber === partNumber) : void 0;
|
|
162
|
+
if (done) {
|
|
163
|
+
parts.push({
|
|
164
|
+
partNumber: done.partNumber,
|
|
165
|
+
receipt: done.etag
|
|
166
|
+
});
|
|
167
|
+
accepted += size;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const selected = (yield* api("POST", `${path(id)}/parts/sign`, GrantResponse, {
|
|
171
|
+
partNumber,
|
|
172
|
+
...grant._tag === "Multipart" && grant.checksum === "sha256" ? { sha256: yield* hashFile(input.file.slice(offset, offset + size)) } : {}
|
|
173
|
+
})).grant;
|
|
174
|
+
if (selected._tag !== "SignedRequest") return yield* failUpload("BadRequest");
|
|
175
|
+
const response = yield* send(selected.url, selected.method, selected.headers, input.file.slice(offset, offset + size), offset);
|
|
176
|
+
yield* successful(response);
|
|
177
|
+
const etag = selected.partReceipt ?? response.headers.get("etag");
|
|
178
|
+
if (!etag) return yield* failUpload("Unsupported");
|
|
179
|
+
parts.push({
|
|
180
|
+
partNumber,
|
|
181
|
+
receipt: etag
|
|
182
|
+
});
|
|
183
|
+
accepted += size;
|
|
184
|
+
yield* notify();
|
|
185
|
+
}
|
|
186
|
+
} else {
|
|
187
|
+
if (grant.offset > input.file.size) return yield* failUpload("BadRequest");
|
|
188
|
+
accepted = grant.offset;
|
|
189
|
+
for (let attempt = 0; accepted < input.file.size && attempt < 1e5; attempt++) {
|
|
190
|
+
const end = Math.min(accepted + grant.chunkBytes, input.file.size);
|
|
191
|
+
const headers = grant.protocol === "gcs" ? {
|
|
192
|
+
...grant.headers,
|
|
193
|
+
"content-range": `bytes ${accepted}-${end - 1}/${input.file.size}`
|
|
194
|
+
} : {
|
|
195
|
+
...grant.headers,
|
|
196
|
+
"tus-resumable": "1.0.0",
|
|
197
|
+
"upload-offset": String(accepted),
|
|
198
|
+
"content-type": "application/offset+octet-stream"
|
|
199
|
+
};
|
|
200
|
+
const response = yield* send(grant.url, grant.protocol === "gcs" ? "PUT" : "PATCH", headers, input.file.slice(accepted, end), accepted);
|
|
201
|
+
if (response.status !== 308) yield* successful(response);
|
|
202
|
+
const observed = (yield* api("POST", `${path(id)}/grants`, GrantResponse)).grant;
|
|
203
|
+
if (observed._tag !== "Resumable" || observed.offset <= accepted || observed.offset > end) return yield* failUpload("Unavailable");
|
|
204
|
+
accepted = observed.offset;
|
|
205
|
+
grant = observed;
|
|
206
|
+
yield* notify();
|
|
207
|
+
}
|
|
208
|
+
if (accepted !== input.file.size) return yield* failUpload("Unavailable");
|
|
209
|
+
}
|
|
210
|
+
yield* notify();
|
|
211
|
+
return {
|
|
212
|
+
uploadId: id,
|
|
213
|
+
parts
|
|
214
|
+
};
|
|
215
|
+
}, bounded);
|
|
216
|
+
const complete = Effect.fnUntraced(function* (input) {
|
|
217
|
+
const result = yield* api("POST", `${path(input.uploadId)}/complete`, UploadStatus, input.parts?.length ? { parts: input.parts } : {});
|
|
218
|
+
if (result.state === "published") {
|
|
219
|
+
const local = yield* store.read(input.uploadId);
|
|
220
|
+
yield* store.remove(input.uploadId);
|
|
221
|
+
if (local) yield* store.remove(local.idempotencyKey);
|
|
222
|
+
yield* emit(input.onProgress, {
|
|
223
|
+
phase: "completed",
|
|
224
|
+
bytesAccepted: local?.input.file.size ?? 0,
|
|
225
|
+
totalBytes: local?.input.file.size ?? 0,
|
|
226
|
+
measurement: "provider-accepted"
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
230
|
+
});
|
|
231
|
+
const create = Effect.fnUntraced(function* (input) {
|
|
232
|
+
const metadata = yield* decode(UploadInput, {
|
|
233
|
+
purpose: input.purpose,
|
|
234
|
+
file: {
|
|
235
|
+
name: input.file.name,
|
|
236
|
+
size: input.file.size,
|
|
237
|
+
contentType: input.file.type || "application/octet-stream",
|
|
238
|
+
sha256: yield* hashFile(input.file, input.onProgress)
|
|
239
|
+
},
|
|
240
|
+
context: input.context,
|
|
241
|
+
...input.strategy ? { strategy: input.strategy } : {}
|
|
242
|
+
});
|
|
243
|
+
const key = input.idempotencyKey ?? crypto.randomUUID();
|
|
244
|
+
const local = {
|
|
245
|
+
version: 1,
|
|
246
|
+
idempotencyKey: key,
|
|
247
|
+
input: metadata
|
|
248
|
+
};
|
|
249
|
+
yield* store.write(key, local);
|
|
250
|
+
yield* emit(input.onProgress, {
|
|
251
|
+
phase: "authorizing",
|
|
252
|
+
bytesAccepted: 0,
|
|
253
|
+
totalBytes: input.file.size,
|
|
254
|
+
measurement: "indeterminate"
|
|
255
|
+
});
|
|
256
|
+
const status = yield* api("POST", "/uploads", UploadStatus, {
|
|
257
|
+
version: 1,
|
|
258
|
+
idempotencyKey: key,
|
|
259
|
+
input: metadata
|
|
260
|
+
});
|
|
261
|
+
const saved = {
|
|
262
|
+
...local,
|
|
263
|
+
id: status.id
|
|
264
|
+
};
|
|
265
|
+
yield* store.write(key, saved);
|
|
266
|
+
yield* store.write(status.id, saved);
|
|
267
|
+
return saved;
|
|
268
|
+
}, bounded);
|
|
269
|
+
return {
|
|
270
|
+
create,
|
|
271
|
+
transfer,
|
|
272
|
+
complete,
|
|
273
|
+
status: (input) => api("GET", path(input.uploadId), UploadStatus),
|
|
274
|
+
abort: (input) => api("DELETE", path(input.uploadId), UploadStatus),
|
|
275
|
+
reconcile: (input) => api("POST", `${path(input.uploadId)}/reconcile`, UploadStatus),
|
|
276
|
+
upload: (input) => Effect.gen(function* () {
|
|
277
|
+
const saved = yield* create(input);
|
|
278
|
+
const sent = yield* transfer({
|
|
279
|
+
uploadId: saved.id,
|
|
280
|
+
file: input.file,
|
|
281
|
+
...input.onProgress ? { onProgress: input.onProgress } : {}
|
|
282
|
+
});
|
|
283
|
+
yield* emit(input.onProgress, {
|
|
284
|
+
phase: "verifying",
|
|
285
|
+
bytesAccepted: input.file.size,
|
|
286
|
+
totalBytes: input.file.size,
|
|
287
|
+
measurement: "provider-accepted"
|
|
288
|
+
});
|
|
289
|
+
return yield* complete({
|
|
290
|
+
...sent,
|
|
291
|
+
...input.onProgress ? { onProgress: input.onProgress } : {}
|
|
292
|
+
});
|
|
293
|
+
}).pipe(Effect.timeoutOrElse({
|
|
294
|
+
duration: deadline,
|
|
295
|
+
orElse: () => Effect.fail(failUpload("Unavailable"))
|
|
296
|
+
})),
|
|
297
|
+
resume: (input) => Effect.gen(function* () {
|
|
298
|
+
const record = yield* store.read(input.uploadId);
|
|
299
|
+
if (!record) return yield* failUpload("NotFound");
|
|
300
|
+
if (record.input.file.size !== input.file.size || record.input.file.name !== input.file.name || record.input.file.contentType !== (input.file.type || "application/octet-stream") || record.input.file.sha256 !== (yield* hashFile(input.file, input.onProgress))) return yield* failUpload("Conflict");
|
|
301
|
+
if (!record.id) yield* create({
|
|
302
|
+
file: input.file,
|
|
303
|
+
purpose: record.input.purpose,
|
|
304
|
+
context: record.input.context,
|
|
305
|
+
idempotencyKey: record.idempotencyKey,
|
|
306
|
+
...record.input.strategy ? { strategy: record.input.strategy } : {}
|
|
307
|
+
});
|
|
308
|
+
const saved = yield* store.read(input.uploadId);
|
|
309
|
+
if (!saved?.id) return yield* failUpload("NotFound");
|
|
310
|
+
yield* ticket(saved.id, input.file, input.onProgress);
|
|
311
|
+
const status = yield* api("GET", path(saved.id), UploadStatus);
|
|
312
|
+
if (status.state === "published") return yield* complete({
|
|
313
|
+
uploadId: saved.id,
|
|
314
|
+
...input.onProgress ? { onProgress: input.onProgress } : {}
|
|
315
|
+
});
|
|
316
|
+
if ([
|
|
317
|
+
"uploading",
|
|
318
|
+
"verifying",
|
|
319
|
+
"publishing"
|
|
320
|
+
].includes(status.state)) {
|
|
321
|
+
const previous = yield* Effect.result(complete({
|
|
322
|
+
uploadId: saved.id,
|
|
323
|
+
...input.onProgress ? { onProgress: input.onProgress } : {}
|
|
324
|
+
}));
|
|
325
|
+
if (previous._tag === "Success") return previous.success;
|
|
326
|
+
if (status.state !== "uploading" || previous.failure.code !== "Unavailable") return yield* previous.failure;
|
|
327
|
+
}
|
|
328
|
+
const sent = yield* transfer({
|
|
329
|
+
...input,
|
|
330
|
+
uploadId: saved.id
|
|
331
|
+
});
|
|
332
|
+
return yield* complete({
|
|
333
|
+
...sent,
|
|
334
|
+
...input.onProgress ? { onProgress: input.onProgress } : {}
|
|
335
|
+
});
|
|
336
|
+
}).pipe(Effect.timeoutOrElse({
|
|
337
|
+
duration: deadline,
|
|
338
|
+
orElse: () => Effect.fail(failUpload("Unavailable"))
|
|
339
|
+
}))
|
|
340
|
+
};
|
|
341
|
+
});
|
|
342
|
+
var UploadClient = class UploadClient extends Context.Service()("@effect-kit/storage/UploadClient") {
|
|
343
|
+
static make = make;
|
|
344
|
+
static layer(options) {
|
|
345
|
+
return Layer.effect(UploadClient, make(options));
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
export { UploadClient, UploadClientStore };
|
|
350
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../src/client/index.ts"],"sourcesContent":["import { Context, Effect, Layer, Schedule, Schema } from \"effect\";\n\nimport {\n GrantResponse,\n UploadErrorCode,\n UploadInput,\n UploadStatus,\n failUpload,\n} from \"../uploads/schema.js\";\nimport { hashFile } from \"./fingerprint.js\";\nimport { UploadClientStore } from \"./store.js\";\nimport type { ClientUploadStore, UploadTicket } from \"./store.js\";\nimport { fetchTransfer, providerUrl, xhrTransfer } from \"./transport.js\";\nimport type { Progress } from \"./transport.js\";\nexport { UploadClientStore };\nexport type { ClientUploadStore, UploadTicket } from \"./store.js\";\nexport type { UploadProgress } from \"./transport.js\";\nexport type UploadProtocol = \"single\" | \"post\" | \"multipart\" | \"resumable\" | \"proxy\";\nexport interface UploadClientOptions<R = never> {\n readonly baseUrl: string;\n readonly credentials?: RequestCredentials;\n readonly headers?: () => Effect.Effect<\n Readonly<Record<string, string>>,\n ReturnType<typeof failUpload>,\n R\n >;\n readonly store?: ClientUploadStore;\n readonly transport?: \"fetch\" | \"xhr\";\n readonly deadlineMillis?: number;\n}\nconst decode = <S extends Schema.Constraint>(schema: S, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => failUpload(\"BadRequest\")));\nconst emit = (onProgress: Progress | undefined, value: Parameters<Progress>[0]) =>\n onProgress\n ? Effect.try({ try: () => onProgress(value), catch: () => failUpload(\"Unavailable\") })\n : Effect.void;\n\nconst path = (id: string) => `/uploads/${encodeURIComponent(id)}`;\n\nconst successful = (response: { readonly status: number }) =>\n response.status >= 200 && response.status < 300\n ? Effect.void\n : Effect.fail(\n failUpload(response.status === 401 || response.status === 403 ? \"Expired\" : \"Unavailable\"),\n );\n\nconst make = Effect.fnUntraced(function* <R>(options: UploadClientOptions<R>) {\n const context = yield* Effect.context<R>();\n const base = options.baseUrl.replace(/\\/$/u, \"\");\n const parsed = URL.parse(\n base,\n typeof location === \"undefined\" ? \"http://localhost\" : location.href,\n );\n if (\n !parsed ||\n parsed.username ||\n parsed.password ||\n parsed.search ||\n parsed.hash ||\n !(\n base.startsWith(\"/\") ||\n parsed.protocol === \"https:\" ||\n (parsed.protocol === \"http:\" && [\"localhost\", \"127.0.0.1\"].includes(parsed.hostname))\n )\n )\n return yield* failUpload(\"BadRequest\");\n const deadline = options.deadlineMillis ?? 30 * 60 * 1000;\n if (!Number.isSafeInteger(deadline) || deadline <= 0) return yield* failUpload(\"BadRequest\");\n const bounded = <A, E, Requirements>(effect: Effect.Effect<A, E, Requirements>) =>\n effect.pipe(\n Effect.timeoutOrElse({\n duration: deadline,\n orElse: () => Effect.fail(failUpload(\"Unavailable\")),\n }),\n );\n const store = options.store ?? UploadClientStore.memory();\n const api = Effect.fnUntraced(\n function* <S extends Schema.Constraint>(\n method: string,\n resourcePath: string,\n schema: S,\n body?: unknown,\n ) {\n const headers = options.headers ? yield* Effect.provide(options.headers(), context) : {};\n const response = yield* Effect.tryPromise({\n try: (signal) =>\n fetch(base + resourcePath, {\n method,\n credentials: options.credentials ?? \"same-origin\",\n redirect: \"error\",\n headers: {\n ...headers,\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal,\n }),\n catch: () => failUpload(\"Unavailable\"),\n });\n const value = yield* Effect.tryPromise({\n try: async (signal) => {\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"Missing response\");\n const cancel = () => {\n void reader.cancel().catch(() => undefined);\n };\n signal.addEventListener(\"abort\", cancel, { once: true });\n let text = \"\";\n const decoder = new TextDecoder();\n let bytes = 0;\n try {\n while (true) {\n // oxlint-disable-next-line no-await-in-loop -- Response bytes must be consumed in order under a size bound.\n const next = await reader.read();\n if (next.done) break;\n bytes += next.value.length;\n if (bytes > 1024 * 1024) throw new Error(\"Response limit\");\n text += decoder.decode(next.value, { stream: true });\n }\n if (signal.aborted) throw new Error(\"Request interrupted\");\n return JSON.parse(text + decoder.decode()) as unknown;\n } finally {\n signal.removeEventListener(\"abort\", cancel);\n await reader.cancel();\n reader.releaseLock();\n }\n },\n catch: () => failUpload(\"Unavailable\"),\n });\n if (!response.ok) {\n const error = yield* decode(Schema.Struct({ code: UploadErrorCode }), value);\n return yield* failUpload(error.code);\n }\n return yield* decode(schema, value);\n },\n Effect.retry({\n times: 2,\n schedule: Schedule.exponential(\"100 millis\"),\n while: (error) => error.code === \"Unavailable\",\n }),\n bounded,\n );\n const ticket = Effect.fnUntraced(function* (id: string, file: File, onProgress?: Progress) {\n const record = yield* store.read(id);\n if (!record || !record.id) return yield* failUpload(\"NotFound\");\n if (\n record.input.file.size !== file.size ||\n record.input.file.name !== file.name ||\n record.input.file.contentType !== (file.type || \"application/octet-stream\") ||\n record.input.file.sha256 !== (yield* hashFile(file, onProgress))\n )\n return yield* failUpload(\"Conflict\");\n return record;\n });\n const transfer = Effect.fnUntraced(function* (input: {\n readonly uploadId: string;\n readonly file: File;\n readonly onProgress?: Progress;\n readonly onProtocol?: (protocol: UploadProtocol, uploadId: string) => void;\n }) {\n const record = yield* ticket(input.uploadId, input.file, input.onProgress);\n const id = record.id;\n if (!id) return yield* failUpload(\"NotFound\");\n let grant = (yield* api(\"POST\", `${path(id)}/grants`, GrantResponse)).grant;\n const onProtocol = input.onProtocol;\n if (onProtocol)\n yield* Effect.try({\n try: () =>\n onProtocol(\n grant._tag === \"Multipart\" || grant._tag === \"Blocks\"\n ? \"multipart\"\n : grant._tag === \"Resumable\"\n ? \"resumable\"\n : grant._tag === \"PostForm\"\n ? \"post\"\n : grant._tag === \"Proxy\"\n ? \"proxy\"\n : \"single\",\n id,\n ),\n catch: () => failUpload(\"Unavailable\"),\n });\n let accepted = 0;\n const send = Effect.fnUntraced(function* (\n url: string,\n method: string,\n headers: Readonly<Record<string, string>>,\n body: Blob | FormData,\n offset: number,\n ) {\n const target = yield* providerUrl(url);\n const safeHeaders = Object.fromEntries(\n Object.entries(headers).filter(\n ([name]) => ![\"content-length\", \"host\"].includes(name.toLowerCase()),\n ),\n );\n return yield* options.transport === \"xhr\"\n ? xhrTransfer(target, method, safeHeaders, body, (sent) =>\n input.onProgress?.({\n phase: \"uploading\",\n bytesSent: offset + sent,\n bytesAccepted: accepted,\n totalBytes: input.file.size,\n measurement: \"xhr\",\n }),\n )\n : fetchTransfer(target, method, safeHeaders, body);\n });\n const notify = () =>\n emit(input.onProgress, {\n phase: \"uploading\",\n bytesAccepted: accepted,\n totalBytes: input.file.size,\n measurement: \"provider-accepted\",\n });\n const parts: Array<{ partNumber: number; receipt: string }> = [];\n yield* emit(input.onProgress, {\n phase: \"uploading\",\n bytesAccepted: 0,\n totalBytes: input.file.size,\n measurement: \"indeterminate\",\n });\n if (grant._tag === \"Proxy\") {\n const headers = options.headers ? yield* Effect.provide(options.headers(), context) : {};\n const response = yield* Effect.tryPromise({\n try: (signal) =>\n fetch(`${base}${path(id)}/content`, {\n method: \"PUT\",\n credentials: options.credentials ?? \"same-origin\",\n headers: { ...headers, \"content-type\": input.file.type || \"application/octet-stream\" },\n body: input.file,\n signal,\n redirect: \"error\",\n }),\n catch: () => failUpload(\"Unavailable\"),\n });\n yield* Effect.tryPromise({\n try: async () => {\n await response.body?.cancel();\n },\n catch: () => failUpload(\"Unavailable\"),\n });\n yield* successful(response);\n accepted = input.file.size;\n } else if (grant._tag === \"SignedRequest\") {\n yield* successful(yield* send(grant.url, grant.method, grant.headers, input.file, 0));\n accepted = input.file.size;\n } else if (grant._tag === \"PostForm\") {\n const form = new FormData();\n for (const [key, value] of Object.entries(grant.fields)) form.append(key, value);\n form.append(\"file\", input.file);\n yield* successful(yield* send(grant.url, \"POST\", {}, form, 0));\n accepted = input.file.size;\n } else if (grant._tag === \"Multipart\" || grant._tag === \"Blocks\") {\n const count = Math.ceil(input.file.size / grant.partBytes);\n if (count > 10000 || count < 1) return yield* failUpload(\"BadRequest\");\n for (let partNumber = 1; partNumber <= count; partNumber++) {\n const offset = (partNumber - 1) * grant.partBytes;\n const size = Math.min(grant.partBytes, input.file.size - offset);\n const done =\n grant._tag === \"Multipart\"\n ? grant.completed.find((part) => part.partNumber === partNumber)\n : undefined;\n if (done) {\n parts.push({ partNumber: done.partNumber, receipt: done.etag });\n accepted += size;\n continue;\n }\n const selected = (yield* api(\"POST\", `${path(id)}/parts/sign`, GrantResponse, {\n partNumber,\n ...(grant._tag === \"Multipart\" && grant.checksum === \"sha256\"\n ? { sha256: yield* hashFile(input.file.slice(offset, offset + size)) }\n : {}),\n })).grant;\n if (selected._tag !== \"SignedRequest\") return yield* failUpload(\"BadRequest\");\n const response = yield* send(\n selected.url,\n selected.method,\n selected.headers,\n input.file.slice(offset, offset + size),\n offset,\n );\n yield* successful(response);\n const etag = selected.partReceipt ?? response.headers.get(\"etag\");\n if (!etag) return yield* failUpload(\"Unsupported\");\n parts.push({ partNumber, receipt: etag });\n accepted += size;\n yield* notify();\n }\n } else {\n if (grant.offset > input.file.size) return yield* failUpload(\"BadRequest\");\n accepted = grant.offset;\n for (let attempt = 0; accepted < input.file.size && attempt < 100000; attempt++) {\n const end = Math.min(accepted + grant.chunkBytes, input.file.size);\n const headers =\n grant.protocol === \"gcs\"\n ? {\n ...grant.headers,\n \"content-range\": `bytes ${accepted}-${end - 1}/${input.file.size}`,\n }\n : {\n ...grant.headers,\n \"tus-resumable\": \"1.0.0\",\n \"upload-offset\": String(accepted),\n \"content-type\": \"application/offset+octet-stream\",\n };\n const response = yield* send(\n grant.url,\n grant.protocol === \"gcs\" ? \"PUT\" : \"PATCH\",\n headers,\n input.file.slice(accepted, end),\n accepted,\n );\n if (response.status !== 308) yield* successful(response);\n const observed = (yield* api(\"POST\", `${path(id)}/grants`, GrantResponse)).grant;\n if (observed._tag !== \"Resumable\" || observed.offset <= accepted || observed.offset > end)\n return yield* failUpload(\"Unavailable\");\n accepted = observed.offset;\n grant = observed;\n yield* notify();\n }\n if (accepted !== input.file.size) return yield* failUpload(\"Unavailable\");\n }\n yield* notify();\n return { uploadId: id, parts };\n }, bounded);\n const complete = Effect.fnUntraced(function* (input: {\n readonly uploadId: string;\n readonly parts?: ReadonlyArray<{ readonly partNumber: number; readonly receipt: string }>;\n readonly onProgress?: Progress;\n }) {\n const result = yield* api(\n \"POST\",\n `${path(input.uploadId)}/complete`,\n UploadStatus,\n input.parts?.length ? { parts: input.parts } : {},\n );\n if (result.state === \"published\") {\n const local = yield* store.read(input.uploadId);\n yield* store.remove(input.uploadId);\n if (local) yield* store.remove(local.idempotencyKey);\n yield* emit(input.onProgress, {\n phase: \"completed\",\n bytesAccepted: local?.input.file.size ?? 0,\n totalBytes: local?.input.file.size ?? 0,\n measurement: \"provider-accepted\",\n });\n }\n return result;\n });\n const create = Effect.fnUntraced(function* (input: {\n readonly file: File;\n readonly purpose: string;\n readonly context: Readonly<Record<string, string>>;\n readonly strategy?: UploadInput[\"strategy\"];\n readonly idempotencyKey?: string;\n readonly onProgress?: Progress;\n }) {\n const metadata = yield* decode(UploadInput, {\n purpose: input.purpose,\n file: {\n name: input.file.name,\n size: input.file.size,\n contentType: input.file.type || \"application/octet-stream\",\n sha256: yield* hashFile(input.file, input.onProgress),\n },\n context: input.context,\n ...(input.strategy ? { strategy: input.strategy } : {}),\n });\n const key = input.idempotencyKey ?? crypto.randomUUID();\n const local: UploadTicket = { version: 1, idempotencyKey: key, input: metadata };\n yield* store.write(key, local);\n yield* emit(input.onProgress, {\n phase: \"authorizing\",\n bytesAccepted: 0,\n totalBytes: input.file.size,\n measurement: \"indeterminate\",\n });\n const status = yield* api(\"POST\", \"/uploads\", UploadStatus, {\n version: 1,\n idempotencyKey: key,\n input: metadata,\n });\n const saved = { ...local, id: status.id };\n yield* store.write(key, saved);\n yield* store.write(status.id, saved);\n return saved;\n }, bounded);\n return {\n create,\n transfer,\n complete,\n status: (input: { readonly uploadId: string }) =>\n api(\"GET\", path(input.uploadId), UploadStatus),\n abort: (input: { readonly uploadId: string }) =>\n api(\"DELETE\", path(input.uploadId), UploadStatus),\n reconcile: (input: { readonly uploadId: string }) =>\n api(\"POST\", `${path(input.uploadId)}/reconcile`, UploadStatus),\n upload: (input: Parameters<typeof create>[0]) =>\n Effect.gen(function* () {\n const saved = yield* create(input);\n const sent = yield* transfer({\n uploadId: saved.id,\n file: input.file,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n });\n yield* emit(input.onProgress, {\n phase: \"verifying\",\n bytesAccepted: input.file.size,\n totalBytes: input.file.size,\n measurement: \"provider-accepted\",\n });\n return yield* complete({\n ...sent,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n });\n }).pipe(\n Effect.timeoutOrElse({\n duration: deadline,\n orElse: () => Effect.fail(failUpload(\"Unavailable\")),\n }),\n ),\n resume: (input: {\n readonly uploadId: string;\n readonly file: File;\n readonly onProgress?: Progress;\n readonly onProtocol?: (protocol: UploadProtocol, uploadId: string) => void;\n }) =>\n Effect.gen(function* () {\n const record = yield* store.read(input.uploadId);\n if (!record) return yield* failUpload(\"NotFound\");\n if (\n record.input.file.size !== input.file.size ||\n record.input.file.name !== input.file.name ||\n record.input.file.contentType !== (input.file.type || \"application/octet-stream\") ||\n record.input.file.sha256 !== (yield* hashFile(input.file, input.onProgress))\n )\n return yield* failUpload(\"Conflict\");\n if (!record.id)\n yield* create({\n file: input.file,\n purpose: record.input.purpose,\n context: record.input.context,\n idempotencyKey: record.idempotencyKey,\n ...(record.input.strategy ? { strategy: record.input.strategy } : {}),\n });\n const saved = yield* store.read(input.uploadId);\n if (!saved?.id) return yield* failUpload(\"NotFound\");\n yield* ticket(saved.id, input.file, input.onProgress);\n const status = yield* api(\"GET\", path(saved.id), UploadStatus);\n if (status.state === \"published\")\n return yield* complete({\n uploadId: saved.id,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n });\n if ([\"uploading\", \"verifying\", \"publishing\"].includes(status.state)) {\n const previous = yield* Effect.result(\n complete({\n uploadId: saved.id,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n }),\n );\n if (previous._tag === \"Success\") return previous.success;\n if (status.state !== \"uploading\" || previous.failure.code !== \"Unavailable\")\n return yield* previous.failure;\n }\n const sent = yield* transfer({ ...input, uploadId: saved.id });\n return yield* complete({\n ...sent,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n });\n }).pipe(\n Effect.timeoutOrElse({\n duration: deadline,\n orElse: () => Effect.fail(failUpload(\"Unavailable\")),\n }),\n ),\n };\n});\nexport class UploadClient extends Context.Service<\n UploadClient,\n Effect.Success<ReturnType<typeof make>>\n>()(\"@effect-kit/storage/UploadClient\") {\n static readonly make = make;\n static layer<R>(options: UploadClientOptions<R>) {\n return Layer.effect(UploadClient, make(options));\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Storage } from "../core/storage.js";
|
|
2
|
+
import { TransferDriver } from "../transfers/dependencies.js";
|
|
3
|
+
import { Context, Effect, Layer } from "effect";
|
|
4
|
+
|
|
5
|
+
// src/composition/layer.ts
|
|
6
|
+
/** Facades expose only the capabilities they enforce. Native protocol/admin services stay private. */
|
|
7
|
+
const storageLayer = (make) => Layer.effectContext(Effect.gen(function* () {
|
|
8
|
+
const previous = yield* TransferDriver;
|
|
9
|
+
const storage = yield* make;
|
|
10
|
+
const context = Context.make(Storage, storage);
|
|
11
|
+
return Context.add(context, TransferDriver, {
|
|
12
|
+
storage,
|
|
13
|
+
underlyingStoreId: previous.underlyingStoreId ?? previous.storage.storeId,
|
|
14
|
+
...previous.underlyingStoreIds ? { underlyingStoreIds: previous.underlyingStoreIds } : {},
|
|
15
|
+
maximumObjectBytes: previous.maximumObjectBytes,
|
|
16
|
+
maximumSingleUploadBytes: previous.maximumSingleUploadBytes,
|
|
17
|
+
transportOverheadBytes: previous.transportOverheadBytes
|
|
18
|
+
});
|
|
19
|
+
}));
|
|
20
|
+
|
|
21
|
+
export { storageLayer };
|
|
22
|
+
//# sourceMappingURL=layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer.js","names":[],"sources":["../../src/composition/layer.ts"],"sourcesContent":["import { Context, Effect, Layer } from \"effect\";\n\nimport { Storage } from \"../core/storage.js\";\nimport type { StorageService } from \"../core/storage.js\";\nimport { TransferDriver } from \"../transfers/dependencies.js\";\n\n/** Facades expose only the capabilities they enforce. Native protocol/admin services stay private. */\nexport const storageLayer = <E, R>(make: Effect.Effect<StorageService, E, R>) =>\n Layer.effectContext(\n Effect.gen(function* () {\n const previous = yield* TransferDriver;\n const storage = yield* make;\n const context = Context.make(Storage, storage);\n\n return Context.add(context, TransferDriver, {\n storage,\n underlyingStoreId: previous.underlyingStoreId ?? previous.storage.storeId,\n ...(previous.underlyingStoreIds ? { underlyingStoreIds: previous.underlyingStoreIds } : {}),\n maximumObjectBytes: previous.maximumObjectBytes,\n maximumSingleUploadBytes: previous.maximumSingleUploadBytes,\n transportOverheadBytes: previous.transportOverheadBytes,\n });\n }),\n );\n"],"mappings":";;;;;;AAOA,MAAa,gBAAsB,SACjC,MAAM,cACJ,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO;CACxB,MAAM,UAAU,OAAO;CACvB,MAAM,UAAU,QAAQ,KAAK,SAAS,OAAO;CAE7C,OAAO,QAAQ,IAAI,SAAS,gBAAgB;EAC1C;EACA,mBAAmB,SAAS,qBAAqB,SAAS,QAAQ;EAClE,GAAI,SAAS,qBAAqB,EAAE,oBAAoB,SAAS,mBAAmB,IAAI,CAAC;EACzF,oBAAoB,SAAS;EAC7B,0BAA0B,SAAS;EACnC,wBAAwB,SAAS;CACnC,CAAC;AACH,CAAC,CACH"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { sha256 } from "../../runtime/portable-hash.js";
|
|
2
|
+
import { storageError } from "../../core/errors.js";
|
|
3
|
+
import { Effect, FileSystem, Path, Sink, Stream } from "effect";
|
|
4
|
+
|
|
5
|
+
// src/composition/representation/staging.ts
|
|
6
|
+
/** Scoped files bound staging without collecting object bytes in memory. */
|
|
7
|
+
const makeStaging = Effect.gen(function* () {
|
|
8
|
+
const fs = yield* FileSystem.FileSystem;
|
|
9
|
+
const path = yield* Path.Path;
|
|
10
|
+
return Effect.fnUntraced(function* (body, maximum) {
|
|
11
|
+
const directory = yield* fs.makeTempDirectoryScoped().pipe(Effect.mapError(() => storageError("stage", "representation", {
|
|
12
|
+
_tag: "ProviderFailure",
|
|
13
|
+
code: "TemporaryDirectory"
|
|
14
|
+
})));
|
|
15
|
+
const filename = path.join(directory, "object");
|
|
16
|
+
const hash = sha256.create();
|
|
17
|
+
let size = 0;
|
|
18
|
+
yield* body.pipe(Stream.tap((chunk) => Effect.suspend(() => {
|
|
19
|
+
size += chunk.length;
|
|
20
|
+
if (size > maximum) return Effect.fail(storageError("stage", "representation", {
|
|
21
|
+
_tag: "LimitExceeded",
|
|
22
|
+
limit: maximum
|
|
23
|
+
}));
|
|
24
|
+
hash.update(chunk);
|
|
25
|
+
return Effect.void;
|
|
26
|
+
})), Stream.run(fs.sink(filename, { mode: 384 }).pipe(Sink.mapError(() => storageError("stage", "representation", {
|
|
27
|
+
_tag: "ProviderFailure",
|
|
28
|
+
code: "TemporaryFile"
|
|
29
|
+
})))));
|
|
30
|
+
return {
|
|
31
|
+
path: filename,
|
|
32
|
+
size,
|
|
33
|
+
checksum: hash.finish(),
|
|
34
|
+
stream: (offset = 0) => fs.stream(filename, {
|
|
35
|
+
offset,
|
|
36
|
+
chunkSize: 65536
|
|
37
|
+
}).pipe(Stream.mapError(() => storageError("stage", "representation", {
|
|
38
|
+
_tag: "ProviderFailure",
|
|
39
|
+
code: "TemporaryRead"
|
|
40
|
+
})))
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
export { makeStaging };
|
|
46
|
+
//# sourceMappingURL=staging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staging.js","names":[],"sources":["../../../src/composition/representation/staging.ts"],"sourcesContent":["import { Effect, FileSystem, Path, Sink, Stream } from \"effect\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { sha256 } from \"../../runtime/portable-hash.js\";\n\n/** Scoped files bound staging without collecting object bytes in memory. */\nexport const makeStaging = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return Effect.fnUntraced(function* <E, R>(\n body: Stream.Stream<Uint8Array, E, R>,\n maximum: number,\n ) {\n const directory = yield* fs.makeTempDirectoryScoped().pipe(\n Effect.mapError(() =>\n storageError(\"stage\", \"representation\", {\n _tag: \"ProviderFailure\",\n code: \"TemporaryDirectory\",\n }),\n ),\n );\n const filename = path.join(directory, \"object\");\n const hash = sha256.create();\n let size = 0;\n yield* body.pipe(\n Stream.tap((chunk) =>\n Effect.suspend(() => {\n size += chunk.length;\n if (size > maximum)\n return Effect.fail(\n storageError(\"stage\", \"representation\", { _tag: \"LimitExceeded\", limit: maximum }),\n );\n hash.update(chunk);\n return Effect.void;\n }),\n ),\n Stream.run(\n fs.sink(filename, { mode: 0o600 }).pipe(\n Sink.mapError(() =>\n storageError(\"stage\", \"representation\", {\n _tag: \"ProviderFailure\",\n code: \"TemporaryFile\",\n }),\n ),\n ),\n ),\n );\n return {\n path: filename,\n size,\n checksum: hash.finish(),\n stream: (offset = 0) =>\n fs.stream(filename, { offset, chunkSize: 65536 }).pipe(\n Stream.mapError(() =>\n storageError(\"stage\", \"representation\", {\n _tag: \"ProviderFailure\",\n code: \"TemporaryRead\",\n }),\n ),\n ),\n };\n });\n});\n"],"mappings":";;;;;;AAMA,MAAa,cAAc,OAAO,IAAI,aAAa;CACjD,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CACzB,OAAO,OAAO,WAAW,WACvB,MACA,SACA;EACA,MAAM,YAAY,OAAO,GAAG,wBAAwB,CAAC,CAAC,KACpD,OAAO,eACL,aAAa,SAAS,kBAAkB;GACtC,MAAM;GACN,MAAM;EACR,CAAC,CACH,CACF;EACA,MAAM,WAAW,KAAK,KAAK,WAAW,QAAQ;EAC9C,MAAM,OAAO,OAAO,OAAO;EAC3B,IAAI,OAAO;EACX,OAAO,KAAK,KACV,OAAO,KAAK,UACV,OAAO,cAAc;GACnB,QAAQ,MAAM;GACd,IAAI,OAAO,SACT,OAAO,OAAO,KACZ,aAAa,SAAS,kBAAkB;IAAE,MAAM;IAAiB,OAAO;GAAQ,CAAC,CACnF;GACF,KAAK,OAAO,KAAK;GACjB,OAAO,OAAO;EAChB,CAAC,CACH,GACA,OAAO,IACL,GAAG,KAAK,UAAU,EAAE,MAAM,IAAM,CAAC,CAAC,CAAC,KACjC,KAAK,eACH,aAAa,SAAS,kBAAkB;GACtC,MAAM;GACN,MAAM;EACR,CAAC,CACH,CACF,CACF,CACF;EACA,OAAO;GACL,MAAM;GACN;GACA,UAAU,KAAK,OAAO;GACtB,SAAS,SAAS,MAChB,GAAG,OAAO,UAAU;IAAE;IAAQ,WAAW;GAAM,CAAC,CAAC,CAAC,KAChD,OAAO,eACL,aAAa,SAAS,kBAAkB;IACtC,MAAM;IACN,MAAM;GACR,CAAC,CACH,CACF;EACJ;CACF,CAAC;AACH,CAAC"}
|