@visulima/storage 1.0.0-alpha.9 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +562 -0
- package/LICENSE.md +237 -568
- package/README.md +82 -466
- package/dist/adapter/nuxt/module.d.ts +41 -34
- package/dist/adapter/nuxt/module.js +1 -93
- package/dist/adapter/nuxt/package.json +0 -6
- package/dist/ai/ai-sdk/index.d.ts +113 -0
- package/dist/ai/ai-sdk/index.js +1 -0
- package/dist/ai/claude/index.d.ts +177 -0
- package/dist/ai/claude/index.js +1 -0
- package/dist/ai/openai/index.d.ts +205 -0
- package/dist/ai/openai/index.js +1 -0
- package/dist/ai/tanstack/index.d.ts +115 -0
- package/dist/ai/tanstack/index.js +1 -0
- package/dist/handler/http/fetch/index.d.ts +303 -4
- package/dist/handler/http/fetch/index.js +1 -4
- package/dist/handler/http/hono/index.d.ts +73 -64
- package/dist/handler/http/hono/index.js +1 -65
- package/dist/handler/http/nextjs/index.d.ts +66 -58
- package/dist/handler/http/nextjs/index.js +1 -37
- package/dist/handler/http/node/index.d.ts +368 -4
- package/dist/handler/http/node/index.js +1 -8
- package/dist/handler/http/solid-start/index.d.ts +66 -57
- package/dist/handler/http/solid-start/index.js +1 -44
- package/dist/index.d.ts +106 -17
- package/dist/index.js +1 -13
- package/dist/openapi/index.d.ts +24 -5
- package/dist/openapi/index.js +1 -5
- package/dist/packem_shared/AbstractBaseStorage-CiPEMcuo.js +1 -0
- package/dist/packem_shared/AwsLightFile-CpZrubaV.js +1 -0
- package/dist/packem_shared/AwsLightMetaStorage-DPqJ9LTr.js +1 -0
- package/dist/packem_shared/AwsLightStorage-BK-WPL0h.js +1 -0
- package/dist/packem_shared/AzureFile-DFSaVe25.js +1 -0
- package/dist/packem_shared/AzureSMetaStorage-ByzM6Aix.js +1 -0
- package/dist/packem_shared/AzureStorage-1UvDIQZd.js +1 -0
- package/dist/packem_shared/BaseTransformer-Buw5lX_3.js +1 -0
- package/dist/packem_shared/BoxFile-CseIoPW1.js +1 -0
- package/dist/packem_shared/BoxMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/BoxStorage-DbGqBLux.js +1 -0
- package/dist/packem_shared/BunS3File-BcYmsz1n.js +1 -0
- package/dist/packem_shared/BunS3MetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/BunS3Storage-DNvimm9e.js +1 -0
- package/dist/packem_shared/BunnyFile-BgEOlcYI.js +1 -0
- package/dist/packem_shared/BunnyMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/BunnyStorage-C7d0opLL.js +1 -0
- package/dist/packem_shared/CloudinaryFile-Bo5B-vM1.js +1 -0
- package/dist/packem_shared/CloudinaryMetaStorage-DPVnmNe5.js +1 -0
- package/dist/packem_shared/CloudinaryStorage-Dc3XA2lP.js +1 -0
- package/dist/packem_shared/DiskStorage-CI07TVNu.js +1 -0
- package/dist/packem_shared/DiskStorageWithChecksum-vFCubS6K.js +1 -0
- package/dist/packem_shared/DropboxFile-BFb7eOzy.js +1 -0
- package/dist/packem_shared/DropboxMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/DropboxStorage-CY9Ggu3m.js +1 -0
- package/dist/packem_shared/ERRORS-BIBxE2oR.js +1 -0
- package/dist/packem_shared/File-W8aOo15X.js +1 -0
- package/dist/packem_shared/Files-CpIcMjP0.js +1 -0
- package/dist/packem_shared/FirebaseFile-BLaBxa2A.js +1 -0
- package/dist/packem_shared/FirebaseMetaStorage-DPVnmNe5.js +1 -0
- package/dist/packem_shared/FirebaseStorage-D6O9CJXN.js +2 -0
- package/dist/packem_shared/FtpFile-ClWDYnt2.js +1 -0
- package/dist/packem_shared/FtpMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/FtpStorage-DbEjbq8z.js +1 -0
- package/dist/packem_shared/GCSConfig-BQ0OpVhe.js +1 -0
- package/dist/packem_shared/GCSFile-Cero7qZN.js +1 -0
- package/dist/packem_shared/GCSMetaStorage-BuPA0DDW.js +1 -0
- package/dist/packem_shared/GCStorage-i9t5TQc1.js +1 -0
- package/dist/packem_shared/GoogleDriveFile-DHpLhzg9.js +1 -0
- package/dist/packem_shared/GoogleDriveMetaStorage-Cbwa1CHV.js +1 -0
- package/dist/packem_shared/GoogleDriveStorage-Bklsz7Bh.js +1 -0
- package/dist/packem_shared/LocalMetaStorage-BhicZnNl.js +1 -0
- package/dist/packem_shared/MediaTransformer-D2kUsklW.js +1 -0
- package/dist/packem_shared/MemoryMetaStorage-Ksgh9pe7.js +1 -0
- package/dist/packem_shared/MemoryStorage-9gbWd09l.js +1 -0
- package/dist/packem_shared/MetaStorage-DPEUyWgN.js +1 -0
- package/dist/packem_shared/Metadata-B7CcBueg.js +1 -0
- package/dist/packem_shared/Multipart-CQjYqU--.js +1 -0
- package/dist/packem_shared/Multipart-D0ok6BBy.js +1 -0
- package/dist/packem_shared/NetlifyBlobFile-DoFhkzaH.js +1 -0
- package/dist/packem_shared/NetlifyBlobMetaStorage-DPVnmNe5.js +1 -0
- package/dist/packem_shared/NetlifyBlobStorage-CkpCCoN1.js +1 -0
- package/dist/packem_shared/NoOpMetrics-BLo6u4NY.js +1 -0
- package/dist/packem_shared/OneDriveFile-CNNJYI43.js +1 -0
- package/dist/packem_shared/OneDriveMetaStorage-Cbwa1CHV.js +1 -0
- package/dist/packem_shared/OneDriveStorage-CP6MvGAa.js +1 -0
- package/dist/packem_shared/OpenTelemetryMetrics-DJDQsNKp.js +1 -0
- package/dist/packem_shared/PocketBaseFile-DpJpxl3e.js +1 -0
- package/dist/packem_shared/PocketBaseMetaStorage-DOTLwVE7.js +1 -0
- package/dist/packem_shared/PocketBaseStorage-2qhbI2PW.js +1 -0
- package/dist/packem_shared/Rest-CI_BiZPv.js +1 -0
- package/dist/packem_shared/Rest-DvfN4-kf.js +1 -0
- package/dist/packem_shared/S3File-CpZrubaV.js +1 -0
- package/dist/packem_shared/S3MetaStorage-CMonflzp.js +1 -0
- package/dist/packem_shared/S3Storage-YGeNk3Tt.js +1 -0
- package/dist/packem_shared/SftpFile-ClWDYnt2.js +1 -0
- package/dist/packem_shared/SftpMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/SftpStorage-2Hz396Xr.js +1 -0
- package/dist/packem_shared/SharePointFile-Blz9FS4h.js +1 -0
- package/dist/packem_shared/SharePointMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/SharePointStorage-CrX2Pk6C.js +1 -0
- package/dist/packem_shared/SupabaseFile-Bo5B-vM1.js +1 -0
- package/dist/packem_shared/SupabaseMetaStorage-Cbwa1CHV.js +1 -0
- package/dist/packem_shared/SupabaseStorage-Dc_DBX29.js +1 -0
- package/dist/packem_shared/TUS_RESUMABLE-CyTSRvPU.js +1 -0
- package/dist/packem_shared/Tus-BBVt2ky3.js +1 -0
- package/dist/packem_shared/Tus-BlBZykIL.js +1 -0
- package/dist/packem_shared/UploadControl-DZJhI9Wh.js +1 -0
- package/dist/packem_shared/UploadThingFile-BTFMpcIA.js +1 -0
- package/dist/packem_shared/UploadThingMetaStorage-DPVnmNe5.js +1 -0
- package/dist/packem_shared/UploadThingStorage-BChykYSe.js +1 -0
- package/dist/packem_shared/ValidationError-3B06DFyE.js +1 -0
- package/dist/packem_shared/VercelBlobFile-CVQwKlZk.js +1 -0
- package/dist/packem_shared/VercelBlobMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/VercelBlobStorage-CsRyPfw3.js +1 -0
- package/dist/packem_shared/_commonjsHelpers-CWAkuNXM.js +1 -0
- package/dist/packem_shared/agentsCopyFile-Dl5iffdH.js +1 -0
- package/dist/packem_shared/akamai-DthkaFul.js +1 -0
- package/dist/packem_shared/alibaba-BEi25O1g.js +1 -0
- package/dist/packem_shared/approval-fVHwBp7u.js +1 -0
- package/dist/packem_shared/approval.d-CMAYH9GF.d.ts +75 -0
- package/dist/packem_shared/aws-light-meta-storage-DGrn72VJ.js +4 -0
- package/dist/packem_shared/azure-meta-storage-ClbEsfI4.js +1 -0
- package/dist/packem_shared/backblaze-m1N5NZ9q.js +1 -0
- package/dist/packem_shared/base-handler-core-D-9Ku1h-.js +1 -0
- package/dist/packem_shared/base-handler-fetch-CfkNakv8.js +1 -0
- package/dist/packem_shared/base-handler-node-BF1v1qDa.js +1 -0
- package/dist/packem_shared/cache-Cw3QjoVN.js +1 -0
- package/dist/packem_shared/claudeCopyFile-BX9O4ORk.js +1 -0
- package/dist/packem_shared/cloudflare-CdUTErlo.js +1 -0
- package/dist/packem_shared/copyFile-49FtxXcm.js +1 -0
- package/dist/packem_shared/copyFile-BUPezT_c.js +1 -0
- package/dist/packem_shared/createResponsesFileTools-6Tvt2PNr.js +1 -0
- package/dist/packem_shared/createRetryWrapper-CxgiV_hH.js +1 -0
- package/dist/packem_shared/detect-file-type-BA7UBLKA.js +1 -0
- package/dist/packem_shared/digitalOcean-B2uB6pgz.js +1 -0
- package/dist/packem_shared/disk-storage-CsQcYW3s.js +1 -0
- package/dist/packem_shared/disk-storage-with-checksum.d-B-VGEsfl.d.ts +156 -0
- package/dist/packem_shared/executors-BDzMjc4y.js +1 -0
- package/dist/packem_shared/executors.d-BZP2rWo3.d.ts +69 -0
- package/dist/packem_shared/exoscale-BDa1Gjth.js +1 -0
- package/dist/packem_shared/filebase-CsFYJIwB.js +1 -0
- package/dist/packem_shared/files.d-CH0iLBNC.d.ts +655 -0
- package/dist/packem_shared/gcs-meta-storage-B1RrMqH3.js +1 -0
- package/dist/packem_shared/get-file-status-y3wTtDQs.js +1 -0
- package/dist/packem_shared/getFormatFromContentType-DCTTPQHm.js +1 -0
- package/dist/packem_shared/has-content-50BsqrWw.js +1 -0
- package/dist/packem_shared/headers-BAiAKekR.js +26 -0
- package/dist/packem_shared/hetzner-BGGFiRGD.js +1 -0
- package/dist/packem_shared/ibmCos-j-3TfJ5p.js +1 -0
- package/dist/packem_shared/idriveE2-C6pQ5pQ0.js +1 -0
- package/dist/packem_shared/index-nZWCQrSe.js +5 -0
- package/dist/packem_shared/internal-D_cZIFwI.js +1 -0
- package/dist/packem_shared/is-expired-CBEk6XBi.js +1 -0
- package/dist/packem_shared/local-meta-storage-iuJnu90B.js +11 -0
- package/dist/packem_shared/local-meta-storage.d-D9PBfkn6.d.ts +21 -0
- package/dist/packem_shared/media-transformer.d-Quf4ai47.d.ts +331 -0
- package/dist/packem_shared/memory-storage.d-4EU1cMt1.d.ts +101 -0
- package/dist/packem_shared/minio-NKquuBfS.js +1 -0
- package/dist/packem_shared/multipart-base-BOzY19lb.js +1 -0
- package/dist/packem_shared/oauth-refresh-EdGzlcOZ.js +1 -0
- package/dist/packem_shared/oracleCloud-DslqNpn6.js +1 -0
- package/dist/packem_shared/ovhCloud-CMHE6uLV.js +1 -0
- package/dist/packem_shared/part-match-D-9dGX42.js +1 -0
- package/dist/packem_shared/path-0oTTdkvl-DvWvbDbh.js +1 -0
- package/dist/packem_shared/posix-dirname-CfpH5wZi.js +1 -0
- package/dist/packem_shared/response-builder-CbSA8qPa.js +1 -0
- package/dist/packem_shared/rest-base-e0reNDE_.js +1 -0
- package/dist/packem_shared/restOpenApiSpec-Csv513qf.js +1 -0
- package/dist/packem_shared/s3-base-storage-BoTyhuzO.js +1 -0
- package/dist/packem_shared/s3-base-storage.d-BQgP5B-t.d.ts +287 -0
- package/dist/packem_shared/scaleway-U1In3v70.js +1 -0
- package/dist/packem_shared/sharedErrorSchemaObject-YN65aAKj.js +1 -0
- package/dist/packem_shared/storage-0j5nCAUp.js +1 -0
- package/dist/packem_shared/storage.d-CEM1upWM.d.ts +1176 -0
- package/dist/packem_shared/storj-Cb59q9kF.js +1 -0
- package/dist/packem_shared/sync-DhR3536K.js +1 -0
- package/dist/packem_shared/tencent-Q1y2GENc.js +1 -0
- package/dist/packem_shared/tigris-BELKoyyp.js +1 -0
- package/dist/packem_shared/transformOpenApiSpec-CIEAgpBD.js +1 -0
- package/dist/packem_shared/tus-base.d-DLzKE54M.d.ts +106 -0
- package/dist/packem_shared/tusOpenApiSpec-D96B03t5.js +1 -0
- package/dist/packem_shared/types.d-Bon9GVVe.d.ts +104 -0
- package/dist/packem_shared/types.d-CggTCgXr.d.ts +49 -0
- package/dist/packem_shared/types.d-CrUWY4On.d.ts +720 -0
- package/dist/packem_shared/update-size-DuNuLyxj.js +1 -0
- package/dist/packem_shared/vultr-B491cQ4e.js +1 -0
- package/dist/packem_shared/waitForStorage-ByQmG4xF.js +1 -0
- package/dist/packem_shared/wasabi-DFrwIoab.js +1 -0
- package/dist/packem_shared/xhrOpenApiSpec-DQR4h6M8.js +1 -0
- package/dist/packem_shared/yandex-CwzHuEKP.js +1 -0
- package/dist/storage/aws/clients/index.d.ts +612 -6
- package/dist/storage/aws/clients/index.js +1 -6
- package/dist/storage/aws/index.d.ts +332 -4
- package/dist/storage/aws/index.js +1 -3
- package/dist/storage/aws-light/index.d.ts +259 -4
- package/dist/storage/aws-light/index.js +1 -3
- package/dist/storage/azure/index.d.ts +236 -4
- package/dist/storage/azure/index.js +1 -3
- package/dist/storage/box/index.d.ts +189 -0
- package/dist/storage/box/index.js +1 -0
- package/dist/storage/bun-s3/index.d.ts +200 -0
- package/dist/storage/bun-s3/index.js +1 -0
- package/dist/storage/bunny/index.d.ts +119 -0
- package/dist/storage/bunny/index.js +1 -0
- package/dist/storage/cloudinary/index.d.ts +121 -0
- package/dist/storage/cloudinary/index.js +1 -0
- package/dist/storage/dropbox/index.d.ts +132 -0
- package/dist/storage/dropbox/index.js +1 -0
- package/dist/storage/firebase/index.d.ts +192 -0
- package/dist/storage/firebase/index.js +1 -0
- package/dist/storage/ftp/index.d.ts +91 -0
- package/dist/storage/ftp/index.js +1 -0
- package/dist/storage/gcs/index.d.ts +195 -5
- package/dist/storage/gcs/index.js +1 -4
- package/dist/storage/google-drive/index.d.ts +148 -0
- package/dist/storage/google-drive/index.js +1 -0
- package/dist/storage/local/index.d.ts +7 -4
- package/dist/storage/local/index.js +1 -3
- package/dist/storage/memory/index.d.ts +6 -0
- package/dist/storage/memory/index.js +1 -0
- package/dist/storage/netlify-blob/index.d.ts +147 -4
- package/dist/storage/netlify-blob/index.js +1 -3
- package/dist/storage/onedrive/index.d.ts +103 -0
- package/dist/storage/onedrive/index.js +1 -0
- package/dist/storage/pocketbase/index.d.ts +172 -0
- package/dist/storage/pocketbase/index.js +1 -0
- package/dist/storage/sftp/index.d.ts +92 -0
- package/dist/storage/sftp/index.js +1 -0
- package/dist/storage/sharepoint/index.d.ts +180 -0
- package/dist/storage/sharepoint/index.js +1 -0
- package/dist/storage/supabase/index.d.ts +115 -0
- package/dist/storage/supabase/index.js +1 -0
- package/dist/storage/uploadthing/index.d.ts +95 -0
- package/dist/storage/uploadthing/index.js +1 -0
- package/dist/storage/vercel-blob/index.d.ts +189 -4
- package/dist/storage/vercel-blob/index.js +1 -3
- package/dist/transformer/audio-transformer.d.ts +127 -125
- package/dist/transformer/audio-transformer.js +1 -278
- package/dist/transformer/image-transformer.d.ts +573 -568
- package/dist/transformer/image-transformer.js +1 -1100
- package/dist/transformer/index.d.ts +62 -5
- package/dist/transformer/index.js +1 -4
- package/dist/transformer/video-transformer.d.ts +144 -142
- package/dist/transformer/video-transformer.js +1 -310
- package/package.json +218 -67
- package/dist/handler/base/base-handler-core.d.ts +0 -91
- package/dist/handler/base/base-handler-fetch.d.ts +0 -76
- package/dist/handler/base/base-handler-node.d.ts +0 -137
- package/dist/handler/multipart/multipart-base.d.ts +0 -84
- package/dist/handler/multipart/multipart-fetch.d.ts +0 -64
- package/dist/handler/multipart/multipart.d.ts +0 -49
- package/dist/handler/rest/rest-base.d.ts +0 -106
- package/dist/handler/rest/rest-fetch.d.ts +0 -88
- package/dist/handler/rest/rest.d.ts +0 -93
- package/dist/handler/tus/tus-base.d.ts +0 -152
- package/dist/handler/tus/tus-fetch.d.ts +0 -72
- package/dist/handler/tus/tus.d.ts +0 -78
- package/dist/handler/types.d.ts +0 -53
- package/dist/handler/utils/request-parser.d.ts +0 -72
- package/dist/handler/utils/response-builder.d.ts +0 -83
- package/dist/handler/utils/storage-utils.d.ts +0 -10
- package/dist/handler/utils/stream-utils.d.ts +0 -29
- package/dist/handler/utils/upload-handlers.d.ts +0 -76
- package/dist/metrics/index.d.ts +0 -2
- package/dist/metrics/no-op-metrics.d.ts +0 -15
- package/dist/metrics/opentelemetry-metrics.d.ts +0 -55
- package/dist/openapi/rest.d.ts +0 -7
- package/dist/openapi/shared.d.ts +0 -13
- package/dist/openapi/transform.d.ts +0 -3
- package/dist/openapi/tus.d.ts +0 -7
- package/dist/openapi/xhr.d.ts +0 -7
- package/dist/packem_shared/AwsLightFile-tTneXZgG.js +0 -11
- package/dist/packem_shared/AwsLightMetaStorage-BWSOtVaN.js +0 -4
- package/dist/packem_shared/AwsLightStorage-Blv-GP4v.js +0 -133
- package/dist/packem_shared/AzureFile-CesgFzps.js +0 -8
- package/dist/packem_shared/AzureSMetaStorage-CFs-OYJT.js +0 -88
- package/dist/packem_shared/AzureStorage-B0v048hG.js +0 -357
- package/dist/packem_shared/BaseTransformer-C2gLib6v.js +0 -82
- package/dist/packem_shared/DiskStorage-Ck5yGQsq.js +0 -12
- package/dist/packem_shared/DiskStorageWithChecksum-BRl-V5x2.js +0 -238
- package/dist/packem_shared/ERRORS-D0apMqnc.js +0 -97
- package/dist/packem_shared/File-Bb3P23dr.js +0 -69
- package/dist/packem_shared/GCSConfig-vPP22kN6.js +0 -11
- package/dist/packem_shared/GCSFile-BIEunhAN.js +0 -8
- package/dist/packem_shared/GCSMetaStorage-CHZKMe7N.js +0 -7
- package/dist/packem_shared/GCStorage-C-gAuP0j.js +0 -406
- package/dist/packem_shared/LocalMetaStorage-CZHhKkMd.js +0 -7
- package/dist/packem_shared/MediaTransformer-D6658DL1.js +0 -1197
- package/dist/packem_shared/MetaStorage-pECeFOad.js +0 -46
- package/dist/packem_shared/Metadata-DRLXeJ0F.js +0 -89
- package/dist/packem_shared/Multipart-CRV21AUU.js +0 -128
- package/dist/packem_shared/Multipart-D2ryPMjD.js +0 -163
- package/dist/packem_shared/NetlifyBlobFile-CXzyjqrD.js +0 -14
- package/dist/packem_shared/NetlifyBlobMetaStorage-DxZ5aDvD.js +0 -9
- package/dist/packem_shared/NetlifyBlobStorage-CLPtjHqd.js +0 -376
- package/dist/packem_shared/NoOpMetrics-DhAk5rXc.js +0 -10
- package/dist/packem_shared/OpenTelemetryMetrics-BnxhqIaH.js +0 -67
- package/dist/packem_shared/Rest-DcxBMBjU.js +0 -228
- package/dist/packem_shared/Rest-DjwU3puo.js +0 -267
- package/dist/packem_shared/S3File-DZiyk9Qt.js +0 -11
- package/dist/packem_shared/S3MetaStorage-Dz9aDabA.js +0 -76
- package/dist/packem_shared/S3Storage-DHmTk-hU.js +0 -316
- package/dist/packem_shared/TUS_RESUMABLE-Dtfsffnj.js +0 -434
- package/dist/packem_shared/Tus-DFVlZHaX.js +0 -200
- package/dist/packem_shared/Tus-DaN0FmOy.js +0 -195
- package/dist/packem_shared/ValidationError-BfF1aE4h.js +0 -26
- package/dist/packem_shared/VercelBlobFile-BCg4aTEq.js +0 -18
- package/dist/packem_shared/VercelBlobMetaStorage-Bd9F-VFm.js +0 -9
- package/dist/packem_shared/VercelBlobStorage-DD9LMOS6.js +0 -261
- package/dist/packem_shared/_commonjsHelpers-BqLXS_qQ.js +0 -5
- package/dist/packem_shared/aws-light-meta-storage-DKJBgbR6.js +0 -446
- package/dist/packem_shared/backblaze-BlMnIcBC.js +0 -20
- package/dist/packem_shared/base-handler-core-BoAqTyz7.js +0 -303
- package/dist/packem_shared/base-handler-fetch-D4u2xits.js +0 -291
- package/dist/packem_shared/base-handler-node-DGzcHHAy.js +0 -730
- package/dist/packem_shared/cache-B88MXQ_2.js +0 -18
- package/dist/packem_shared/cloudflare-Bi1q8wXE.js +0 -21
- package/dist/packem_shared/defaultCloudStorageFileNameValidation-DUuacjWv.js +0 -11
- package/dist/packem_shared/digitalOcean-CWQRJM3L.js +0 -21
- package/dist/packem_shared/disk-storage-CD47QI30.js +0 -810
- package/dist/packem_shared/gcs-meta-storage-CJ8Uts_d.js +0 -158
- package/dist/packem_shared/has-content-CY66ehMK.js +0 -3
- package/dist/packem_shared/headers-YLRp1dLo.js +0 -1318
- package/dist/packem_shared/is-expired-CTThU1q5.js +0 -8
- package/dist/packem_shared/isRetryableError-Dycp7127.js +0 -82
- package/dist/packem_shared/isValidMediaType-BeDgiObq.js +0 -35
- package/dist/packem_shared/local-meta-storage-By-3SNBI.js +0 -649
- package/dist/packem_shared/minio-C2YBZQOw.js +0 -22
- package/dist/packem_shared/multipart-base-C994naBi.js +0 -102
- package/dist/packem_shared/part-match-BMNqHDYD.js +0 -96
- package/dist/packem_shared/path-CR6YkPXX-7R1-9CMk.js +0 -161
- package/dist/packem_shared/response-builder-BtnRiBUI.js +0 -45
- package/dist/packem_shared/rest-base-D9URIFkc.js +0 -457
- package/dist/packem_shared/restOpenApiSpec-D1JC_Jto.js +0 -800
- package/dist/packem_shared/s3-base-storage-C1DIHTYY.js +0 -510
- package/dist/packem_shared/sharedGet-Cpo7QUyu.js +0 -1019
- package/dist/packem_shared/storage-C6NSXb8h.js +0 -1175
- package/dist/packem_shared/tigris-Hac8TKnX.js +0 -21
- package/dist/packem_shared/transformOpenApiSpec-DWM5WtnN.js +0 -975
- package/dist/packem_shared/tusOpenApiSpec-mBZkl7he.js +0 -740
- package/dist/packem_shared/update-size-CCGm6i1J.js +0 -8
- package/dist/packem_shared/validator-BeX_lJet.js +0 -78
- package/dist/packem_shared/waitForStorage-Cscw85sx.js +0 -18
- package/dist/packem_shared/wasabi-DIyflHSd.js +0 -21
- package/dist/packem_shared/xhrOpenApiSpec-B1V5Dxrj.js +0 -264
- package/dist/storage/aws/clients/backblaze.d.ts +0 -12
- package/dist/storage/aws/clients/cloudflare.d.ts +0 -13
- package/dist/storage/aws/clients/digital-ocean.d.ts +0 -12
- package/dist/storage/aws/clients/minio.d.ts +0 -13
- package/dist/storage/aws/clients/tigris.d.ts +0 -12
- package/dist/storage/aws/clients/types.d.ts +0 -95
- package/dist/storage/aws/clients/wasabi.d.ts +0 -12
- package/dist/storage/aws/s3-base-storage.d.ts +0 -248
- package/dist/storage/aws/s3-client-adapter.d.ts +0 -110
- package/dist/storage/aws/s3-file.d.ts +0 -10
- package/dist/storage/aws/s3-meta-storage.d.ts +0 -15
- package/dist/storage/aws/s3-storage.d.ts +0 -70
- package/dist/storage/aws/types.d.ts +0 -119
- package/dist/storage/aws-light/aws-light-api-adapter.d.ts +0 -130
- package/dist/storage/aws-light/aws-light-file.d.ts +0 -10
- package/dist/storage/aws-light/aws-light-meta-storage.d.ts +0 -19
- package/dist/storage/aws-light/aws-light-storage.d.ts +0 -65
- package/dist/storage/aws-light/types.d.ts +0 -37
- package/dist/storage/azure/azure-file.d.ts +0 -6
- package/dist/storage/azure/azure-meta-storage.d.ts +0 -15
- package/dist/storage/azure/azure-storage.d.ts +0 -69
- package/dist/storage/azure/types.d.ts +0 -62
- package/dist/storage/gcs/fetch-error.d.ts +0 -11
- package/dist/storage/gcs/gcs-config.d.ts +0 -2
- package/dist/storage/gcs/gcs-file.d.ts +0 -6
- package/dist/storage/gcs/gcs-meta-storage.d.ts +0 -27
- package/dist/storage/gcs/gcs-storage.d.ts +0 -91
- package/dist/storage/gcs/types.d.ts +0 -55
- package/dist/storage/gcs/utils.d.ts +0 -7
- package/dist/storage/local/disk-storage-with-checksum.d.ts +0 -15
- package/dist/storage/local/disk-storage.d.ts +0 -135
- package/dist/storage/local/local-meta-storage.d.ts +0 -32
- package/dist/storage/meta-storage.d.ts +0 -30
- package/dist/storage/netlify-blob/netlify-blob-file.d.ts +0 -12
- package/dist/storage/netlify-blob/netlify-blob-meta-storage.d.ts +0 -7
- package/dist/storage/netlify-blob/netlify-blob-storage.d.ts +0 -93
- package/dist/storage/netlify-blob/types.d.ts +0 -30
- package/dist/storage/storage.d.ts +0 -353
- package/dist/storage/types.d.ts +0 -221
- package/dist/storage/utils/file/file.d.ts +0 -25
- package/dist/storage/utils/file/get-file-status.d.ts +0 -9
- package/dist/storage/utils/file/has-content.d.ts +0 -9
- package/dist/storage/utils/file/index.d.ts +0 -10
- package/dist/storage/utils/file/is-expired.d.ts +0 -8
- package/dist/storage/utils/file/metadata.d.ts +0 -18
- package/dist/storage/utils/file/part-match.d.ts +0 -11
- package/dist/storage/utils/file/types.d.ts +0 -37
- package/dist/storage/utils/file/update-metadata.d.ts +0 -10
- package/dist/storage/utils/file/update-size.d.ts +0 -10
- package/dist/storage/vercel-blob/types.d.ts +0 -32
- package/dist/storage/vercel-blob/vercel-blob-file.d.ts +0 -16
- package/dist/storage/vercel-blob/vercel-blob-meta-storage.d.ts +0 -7
- package/dist/storage/vercel-blob/vercel-blob-storage.d.ts +0 -76
- package/dist/transformer/base-transformer.d.ts +0 -63
- package/dist/transformer/media-transformer.d.ts +0 -332
- package/dist/transformer/types.d.ts +0 -652
- package/dist/transformer/utils.d.ts +0 -33
- package/dist/transformer/validation-error.d.ts +0 -23
- package/dist/utils/cache.d.ts +0 -32
- package/dist/utils/chunked-upload.d.ts +0 -65
- package/dist/utils/detect-file-type.d.ts +0 -28
- package/dist/utils/errors.d.ts +0 -74
- package/dist/utils/file-path-url-matcher.d.ts +0 -18
- package/dist/utils/headers.d.ts +0 -111
- package/dist/utils/http.d.ts +0 -92
- package/dist/utils/locker.d.ts +0 -26
- package/dist/utils/pipes/stream-checksum.d.ts +0 -47
- package/dist/utils/pipes/stream-length.d.ts +0 -22
- package/dist/utils/primitives/get-last-one.d.ts +0 -3
- package/dist/utils/primitives/is-record.d.ts +0 -2
- package/dist/utils/primitives/map-values.d.ts +0 -9
- package/dist/utils/primitives/pick.d.ts +0 -2
- package/dist/utils/primitives/to-milliseconds.d.ts +0 -12
- package/dist/utils/primitives/to-seconds.d.ts +0 -12
- package/dist/utils/range-checksum.d.ts +0 -33
- package/dist/utils/range-hasher.d.ts +0 -46
- package/dist/utils/retry.d.ts +0 -64
- package/dist/utils/types.d.ts +0 -108
- package/dist/utils/validation-error.d.ts +0 -22
- package/dist/utils/validator.d.ts +0 -36
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
import { c as createHttpError } from './headers-YLRp1dLo.js';
|
|
2
|
-
import { ERRORS } from './ERRORS-D0apMqnc.js';
|
|
3
|
-
import { b as getRequestStream } from './base-handler-core-BoAqTyz7.js';
|
|
4
|
-
import { B as BaseHandlerFetch } from './base-handler-fetch-D4u2xits.js';
|
|
5
|
-
import { R as RestBase, c as parseContentDispositionValue } from './rest-base-D9URIFkc.js';
|
|
6
|
-
|
|
7
|
-
class RestFetch extends BaseHandlerFetch {
|
|
8
|
-
/**
|
|
9
|
-
* Limiting enabled http method handler
|
|
10
|
-
*/
|
|
11
|
-
static methods = ["delete", "download", "get", "head", "options", "patch", "post", "put"];
|
|
12
|
-
restBase;
|
|
13
|
-
constructor(options) {
|
|
14
|
-
super(options);
|
|
15
|
-
const restInstance = this;
|
|
16
|
-
this.restBase = new class extends RestBase {
|
|
17
|
-
// eslint-disable-next-line class-methods-use-this
|
|
18
|
-
get storage() {
|
|
19
|
-
return restInstance.storage;
|
|
20
|
-
}
|
|
21
|
-
// eslint-disable-next-line class-methods-use-this
|
|
22
|
-
buildFileUrl(requestUrl, file) {
|
|
23
|
-
return restInstance.buildFileUrl({ url: requestUrl }, file);
|
|
24
|
-
}
|
|
25
|
-
}();
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Compose and register HTTP method handlers.
|
|
29
|
-
*/
|
|
30
|
-
compose() {
|
|
31
|
-
this.registeredHandlers.set("POST", this.post.bind(this));
|
|
32
|
-
this.registeredHandlers.set("PUT", this.put.bind(this));
|
|
33
|
-
this.registeredHandlers.set("PATCH", this.patch.bind(this));
|
|
34
|
-
this.registeredHandlers.set("DELETE", this.delete.bind(this));
|
|
35
|
-
this.registeredHandlers.set("HEAD", this.head.bind(this));
|
|
36
|
-
this.registeredHandlers.set("GET", this.get.bind(this));
|
|
37
|
-
this.registeredHandlers.set("OPTIONS", this.options.bind(this));
|
|
38
|
-
this.logger?.debug("Registered handler: %s", [...this.registeredHandlers.keys()].join(", "));
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Creates a new file via POST request with raw binary data.
|
|
42
|
-
* Supports both full file uploads and chunked upload initialization.
|
|
43
|
-
* @param request Web API Request with file data.
|
|
44
|
-
* @returns Promise resolving to ResponseFile with upload result.
|
|
45
|
-
*/
|
|
46
|
-
async post(request) {
|
|
47
|
-
const isChunkedUpload = request.headers.get("x-chunked-upload") === "true";
|
|
48
|
-
const contentLengthHeader = request.headers.get("content-length");
|
|
49
|
-
const contentLength = contentLengthHeader ? Number.parseInt(contentLengthHeader, 10) : 0;
|
|
50
|
-
if (!isChunkedUpload) {
|
|
51
|
-
if (!contentLengthHeader || Number.isNaN(contentLength) || contentLength === 0) {
|
|
52
|
-
throw createHttpError(400, "Content-Length is required and must be greater than 0");
|
|
53
|
-
}
|
|
54
|
-
if (request.body === null) {
|
|
55
|
-
throw createHttpError(400, "Request body is required");
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (contentLength > this.storage.maxUploadSize) {
|
|
59
|
-
throw createHttpError(413, `File size exceeds maximum allowed size of ${this.storage.maxUploadSize} bytes`);
|
|
60
|
-
}
|
|
61
|
-
const contentType = request.headers.get("content-type") || "application/octet-stream";
|
|
62
|
-
const config = extractFileInitFromRequest(request, contentLength, contentType);
|
|
63
|
-
const requestUrl = request.url;
|
|
64
|
-
const bodyStream = request.body ? getRequestStream(request) : void 0;
|
|
65
|
-
return this.restBase.handlePost(config, isChunkedUpload, requestUrl, bodyStream, contentLength);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Create or update a file via PUT request.
|
|
69
|
-
* Requires file ID in the URL path.
|
|
70
|
-
* @param request Web API Request with file ID and data
|
|
71
|
-
* @returns Promise resolving to ResponseFile with upload result
|
|
72
|
-
*/
|
|
73
|
-
async put(request) {
|
|
74
|
-
const id = getIdFromRequestUrl(request.url);
|
|
75
|
-
if (!id) {
|
|
76
|
-
throw createHttpError(400, "File ID is required in URL path");
|
|
77
|
-
}
|
|
78
|
-
if (request.body === null) {
|
|
79
|
-
throw createHttpError(400, "Request body is required");
|
|
80
|
-
}
|
|
81
|
-
const contentLengthHeader = request.headers.get("content-length");
|
|
82
|
-
const contentLength = contentLengthHeader ? Number.parseInt(contentLengthHeader, 10) : 0;
|
|
83
|
-
if (contentLength === 0) {
|
|
84
|
-
throw createHttpError(400, "Content-Length is required and must be greater than 0");
|
|
85
|
-
}
|
|
86
|
-
if (contentLength > this.storage.maxUploadSize) {
|
|
87
|
-
throw createHttpError(413, `File size exceeds maximum allowed size of ${this.storage.maxUploadSize} bytes`);
|
|
88
|
-
}
|
|
89
|
-
const contentType = request.headers.get("content-type") || "application/octet-stream";
|
|
90
|
-
const metadataHeader = request.headers.get("x-file-metadata");
|
|
91
|
-
let metadata;
|
|
92
|
-
if (metadataHeader) {
|
|
93
|
-
try {
|
|
94
|
-
metadata = JSON.parse(metadataHeader);
|
|
95
|
-
} catch {
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const originalName = parseContentDispositionValue(request.headers.get("content-disposition"));
|
|
99
|
-
const config = {
|
|
100
|
-
contentType,
|
|
101
|
-
metadata: metadata || {},
|
|
102
|
-
originalName,
|
|
103
|
-
size: contentLength
|
|
104
|
-
};
|
|
105
|
-
const requestUrl = request.url;
|
|
106
|
-
const bodyStream = getRequestStream(request);
|
|
107
|
-
return this.restBase.handlePut(id, config, requestUrl, bodyStream, contentLength, metadata);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Delete an uploaded file or multiple files.
|
|
111
|
-
* Supports single file (ID in URL) or batch delete (via ?ids=id1,id2 or JSON body).
|
|
112
|
-
* @param request Web API Request with file ID(s)
|
|
113
|
-
* @returns Promise resolving to ResponseFile (single) or ResponseList (batch) with deletion result
|
|
114
|
-
*/
|
|
115
|
-
async delete(request) {
|
|
116
|
-
const url = new URL(request.url);
|
|
117
|
-
const idsParameter = url.searchParams.get("ids");
|
|
118
|
-
if (idsParameter) {
|
|
119
|
-
const ids = idsParameter.split(",").map((id2) => id2.trim()).filter(Boolean);
|
|
120
|
-
if (ids.length === 0) {
|
|
121
|
-
throw createHttpError(400, "No file IDs provided");
|
|
122
|
-
}
|
|
123
|
-
return this.restBase.deleteBatch(ids);
|
|
124
|
-
}
|
|
125
|
-
const contentType = request.headers.get("content-type") || "";
|
|
126
|
-
if (contentType.includes("application/json")) {
|
|
127
|
-
try {
|
|
128
|
-
const body = await request.text();
|
|
129
|
-
const parsed = JSON.parse(body);
|
|
130
|
-
if (Array.isArray(parsed)) {
|
|
131
|
-
if (parsed.length === 0) {
|
|
132
|
-
throw createHttpError(400, "No file IDs provided");
|
|
133
|
-
}
|
|
134
|
-
return this.restBase.deleteBatch(parsed);
|
|
135
|
-
}
|
|
136
|
-
if (typeof parsed === "object" && parsed !== null && "ids" in parsed && Array.isArray(parsed.ids)) {
|
|
137
|
-
const idsArray = parsed.ids;
|
|
138
|
-
if (idsArray.length === 0) {
|
|
139
|
-
throw createHttpError(400, "No file IDs provided");
|
|
140
|
-
}
|
|
141
|
-
return this.restBase.deleteBatch(idsArray);
|
|
142
|
-
}
|
|
143
|
-
} catch (error) {
|
|
144
|
-
if (error.statusCode === 400) {
|
|
145
|
-
throw error;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
const id = getIdFromRequestUrl(request.url);
|
|
150
|
-
if (!id) {
|
|
151
|
-
throw createHttpError(404, "File not found");
|
|
152
|
-
}
|
|
153
|
-
try {
|
|
154
|
-
return this.restBase.deleteSingle(id);
|
|
155
|
-
} catch (error) {
|
|
156
|
-
const errorWithCode = error;
|
|
157
|
-
if (errorWithCode.UploadErrorCode === ERRORS.FILE_NOT_FOUND || errorWithCode.code === "ENOENT") {
|
|
158
|
-
throw createHttpError(404, "File not found");
|
|
159
|
-
}
|
|
160
|
-
throw error;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Uploads a chunk via PATCH request for chunked uploads.
|
|
165
|
-
* Headers required: X-Chunk-Offset (byte offset), Content-Length (chunk size).
|
|
166
|
-
* Optional: X-Chunk-Checksum (SHA256 checksum for validation).
|
|
167
|
-
* @param request Web API Request with chunk data.
|
|
168
|
-
* @returns Promise resolving to ResponseFile with upload progress.
|
|
169
|
-
*/
|
|
170
|
-
async patch(request) {
|
|
171
|
-
const id = getIdFromRequestUrl(request.url);
|
|
172
|
-
if (!id) {
|
|
173
|
-
throw createHttpError(404, "File not found");
|
|
174
|
-
}
|
|
175
|
-
if (request.body === null) {
|
|
176
|
-
throw createHttpError(400, "Request body is required");
|
|
177
|
-
}
|
|
178
|
-
const contentLengthHeader = request.headers.get("content-length");
|
|
179
|
-
const contentLength = contentLengthHeader ? Number.parseInt(contentLengthHeader, 10) : 0;
|
|
180
|
-
if (contentLength === 0) {
|
|
181
|
-
throw createHttpError(400, "Content-Length is required and must be greater than 0");
|
|
182
|
-
}
|
|
183
|
-
const chunkOffsetHeader = request.headers.get("x-chunk-offset");
|
|
184
|
-
const chunkOffset = chunkOffsetHeader ? Number.parseInt(chunkOffsetHeader, 10) : void 0;
|
|
185
|
-
if (chunkOffset === void 0) {
|
|
186
|
-
throw createHttpError(400, "X-Chunk-Offset header is required");
|
|
187
|
-
}
|
|
188
|
-
const chunkChecksum = request.headers.get("x-chunk-checksum") || void 0;
|
|
189
|
-
const requestUrl = request.url;
|
|
190
|
-
const bodyStream = getRequestStream(request);
|
|
191
|
-
return this.restBase.handlePatch(id, chunkOffset, contentLength, chunkChecksum, requestUrl, bodyStream);
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Get file metadata via HEAD request.
|
|
195
|
-
* For chunked uploads, also returns upload progress information.
|
|
196
|
-
* @param request Web API Request with file ID
|
|
197
|
-
* @returns Promise resolving to ResponseFile with metadata headers
|
|
198
|
-
*/
|
|
199
|
-
async head(request) {
|
|
200
|
-
const id = getIdFromRequestUrl(request.url);
|
|
201
|
-
if (!id) {
|
|
202
|
-
throw createHttpError(404, "File not found");
|
|
203
|
-
}
|
|
204
|
-
try {
|
|
205
|
-
return this.restBase.handleHead(id);
|
|
206
|
-
} catch (error) {
|
|
207
|
-
const errorWithCode = error;
|
|
208
|
-
if (errorWithCode.UploadErrorCode === ERRORS.FILE_NOT_FOUND || errorWithCode.code === "ENOENT") {
|
|
209
|
-
throw createHttpError(404, "File not found");
|
|
210
|
-
}
|
|
211
|
-
throw error;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Handle OPTIONS requests with REST API capabilities.
|
|
216
|
-
* @param _request Web API Request
|
|
217
|
-
* @returns Promise resolving to ResponseFile with CORS headers
|
|
218
|
-
*/
|
|
219
|
-
async options(_request) {
|
|
220
|
-
return this.restBase.handleOptions(RestFetch.methods, this.storage.maxUploadSize);
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Retrieves a file or list of files based on the request path.
|
|
224
|
-
* Delegates to BaseHandlerFetch.fetch() method.
|
|
225
|
-
* @param _request Web API Request
|
|
226
|
-
* @returns Promise resolving to Web API Response
|
|
227
|
-
*/
|
|
228
|
-
// eslint-disable-next-line class-methods-use-this
|
|
229
|
-
async get(_request) {
|
|
230
|
-
throw createHttpError(500, "GET requests should be handled via fetch() method");
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
const extractFileInitFromRequest = (request, contentLength, contentType) => {
|
|
234
|
-
const totalSizeHeader = request.headers.get("x-total-size");
|
|
235
|
-
const totalSize = totalSizeHeader ? Number.parseInt(totalSizeHeader, 10) : contentLength;
|
|
236
|
-
const metadataHeader = request.headers.get("x-file-metadata");
|
|
237
|
-
let metadata = {};
|
|
238
|
-
if (metadataHeader) {
|
|
239
|
-
try {
|
|
240
|
-
metadata = JSON.parse(metadataHeader);
|
|
241
|
-
} catch {
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
const originalName = parseContentDispositionValue(request.headers.get("content-disposition"));
|
|
245
|
-
return {
|
|
246
|
-
contentType,
|
|
247
|
-
metadata,
|
|
248
|
-
originalName,
|
|
249
|
-
size: totalSize
|
|
250
|
-
};
|
|
251
|
-
};
|
|
252
|
-
const getIdFromRequestUrl = (url) => {
|
|
253
|
-
try {
|
|
254
|
-
const urlObject = new URL(url);
|
|
255
|
-
const pathParts = urlObject.pathname.split("/").filter(Boolean);
|
|
256
|
-
const lastPart = pathParts[pathParts.length - 1];
|
|
257
|
-
if (!lastPart) {
|
|
258
|
-
return null;
|
|
259
|
-
}
|
|
260
|
-
const id = lastPart.replace(/\.[^.]+$/, "");
|
|
261
|
-
return id || null;
|
|
262
|
-
} catch {
|
|
263
|
-
return null;
|
|
264
|
-
}
|
|
265
|
-
};
|
|
266
|
-
|
|
267
|
-
export { RestFetch as default };
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { S3Client, HeadObjectCommand, DeleteObjectCommand, PutObjectCommand, waitUntilBucketExists } from '@aws-sdk/client-s3';
|
|
2
|
-
import { fromIni } from '@aws-sdk/credential-providers';
|
|
3
|
-
import MetaStorage from './MetaStorage-pECeFOad.js';
|
|
4
|
-
import { parseMetadata, stringifyMetadata } from './Metadata-DRLXeJ0F.js';
|
|
5
|
-
import { i as isExpired } from './is-expired-CTThU1q5.js';
|
|
6
|
-
|
|
7
|
-
class S3MetaStorage extends MetaStorage {
|
|
8
|
-
constructor(config) {
|
|
9
|
-
super(config);
|
|
10
|
-
this.config = config;
|
|
11
|
-
const { client, ...metaConfig } = config;
|
|
12
|
-
const bucket = metaConfig.bucket || process.env.S3_BUCKET;
|
|
13
|
-
if (client === void 0) {
|
|
14
|
-
if (!bucket) {
|
|
15
|
-
throw new Error("S3 bucket is not defined");
|
|
16
|
-
}
|
|
17
|
-
const keyFile = metaConfig.keyFile || process.env.S3_KEYFILE;
|
|
18
|
-
if (keyFile) {
|
|
19
|
-
metaConfig.credentials = fromIni({ configFilepath: keyFile });
|
|
20
|
-
}
|
|
21
|
-
this.client = new S3Client(metaConfig);
|
|
22
|
-
this.accessCheck(bucket).catch((error) => {
|
|
23
|
-
throw error;
|
|
24
|
-
});
|
|
25
|
-
} else {
|
|
26
|
-
this.client = client;
|
|
27
|
-
}
|
|
28
|
-
this.bucket = bucket;
|
|
29
|
-
}
|
|
30
|
-
bucket;
|
|
31
|
-
client;
|
|
32
|
-
async get(id) {
|
|
33
|
-
const Key = this.getMetaName(id);
|
|
34
|
-
const parameters = { Bucket: this.bucket, Key };
|
|
35
|
-
const { Expires, Metadata } = await this.client.send(new HeadObjectCommand(parameters));
|
|
36
|
-
if (Expires && isExpired({ expiredAt: Expires })) {
|
|
37
|
-
await this.delete(Key);
|
|
38
|
-
throw new Error(`Metafile ${id} not found`);
|
|
39
|
-
}
|
|
40
|
-
if (Metadata?.metadata !== void 0) {
|
|
41
|
-
const file = JSON.parse(decodeURIComponent(Metadata.metadata));
|
|
42
|
-
if (file.metadata && typeof file.metadata === "string") {
|
|
43
|
-
file.metadata = parseMetadata(file.metadata);
|
|
44
|
-
}
|
|
45
|
-
return file;
|
|
46
|
-
}
|
|
47
|
-
throw new Error(`Metafile ${id} not found`);
|
|
48
|
-
}
|
|
49
|
-
async touch(id, file) {
|
|
50
|
-
return this.save(id, file);
|
|
51
|
-
}
|
|
52
|
-
async delete(id) {
|
|
53
|
-
const parameters = { Bucket: this.bucket, Key: this.getMetaName(id) };
|
|
54
|
-
await this.client.send(new DeleteObjectCommand(parameters));
|
|
55
|
-
}
|
|
56
|
-
async save(id, file) {
|
|
57
|
-
const transformedMetadata = { ...file };
|
|
58
|
-
if (transformedMetadata.metadata) {
|
|
59
|
-
transformedMetadata.metadata = stringifyMetadata(file.metadata);
|
|
60
|
-
}
|
|
61
|
-
const metadata = encodeURIComponent(JSON.stringify(transformedMetadata));
|
|
62
|
-
const parameters = {
|
|
63
|
-
Bucket: this.bucket,
|
|
64
|
-
ContentLength: 0,
|
|
65
|
-
Key: this.getMetaName(id),
|
|
66
|
-
Metadata: { metadata }
|
|
67
|
-
};
|
|
68
|
-
await this.client.send(new PutObjectCommand(parameters));
|
|
69
|
-
return file;
|
|
70
|
-
}
|
|
71
|
-
async accessCheck(bucket, maxWaitTime = 30) {
|
|
72
|
-
await waitUntilBucketExists({ client: this.client, maxWaitTime }, { Bucket: bucket });
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export { S3MetaStorage as default };
|
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
import { Readable } from 'node:stream';
|
|
2
|
-
import { CreateMultipartUploadCommand, UploadPartCommand, CompleteMultipartUploadCommand, AbortMultipartUploadCommand, ListPartsCommand, GetObjectCommand, HeadObjectCommand, DeleteObjectCommand, CopyObjectCommand, ListObjectsV2Command, waitUntilBucketExists, S3Client } from '@aws-sdk/client-s3';
|
|
3
|
-
import { fromIni } from '@aws-sdk/credential-providers';
|
|
4
|
-
import { S as S3BaseStorage } from './s3-base-storage-C1DIHTYY.js';
|
|
5
|
-
import { ReadableStream } from 'node:stream/web';
|
|
6
|
-
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
|
7
|
-
import S3File from './S3File-DZiyk9Qt.js';
|
|
8
|
-
import S3MetaStorage from './S3MetaStorage-Dz9aDabA.js';
|
|
9
|
-
|
|
10
|
-
class S3ClientAdapter {
|
|
11
|
-
constructor(client, _bucket) {
|
|
12
|
-
this.client = client;
|
|
13
|
-
}
|
|
14
|
-
async createMultipartUpload(params) {
|
|
15
|
-
const command = new CreateMultipartUploadCommand({
|
|
16
|
-
ACL: params.ACL,
|
|
17
|
-
Bucket: params.Bucket,
|
|
18
|
-
ContentType: params.ContentType,
|
|
19
|
-
Key: params.Key,
|
|
20
|
-
Metadata: params.Metadata
|
|
21
|
-
});
|
|
22
|
-
const response = await this.client.send(command);
|
|
23
|
-
if (!response.UploadId) {
|
|
24
|
-
throw new Error("Failed to create multipart upload");
|
|
25
|
-
}
|
|
26
|
-
return { UploadId: response.UploadId };
|
|
27
|
-
}
|
|
28
|
-
async uploadPart(params) {
|
|
29
|
-
const body = params.Body instanceof ReadableStream ? Readable.fromWeb(params.Body) : params.Body;
|
|
30
|
-
const command = new UploadPartCommand({
|
|
31
|
-
Body: body,
|
|
32
|
-
Bucket: params.Bucket,
|
|
33
|
-
ContentLength: params.ContentLength,
|
|
34
|
-
ContentMD5: params.ContentMD5,
|
|
35
|
-
Key: params.Key,
|
|
36
|
-
PartNumber: params.PartNumber,
|
|
37
|
-
UploadId: params.UploadId
|
|
38
|
-
});
|
|
39
|
-
const response = await this.client.send(command);
|
|
40
|
-
if (!response.ETag) {
|
|
41
|
-
throw new Error("Failed to upload part");
|
|
42
|
-
}
|
|
43
|
-
return { ETag: response.ETag };
|
|
44
|
-
}
|
|
45
|
-
async completeMultipartUpload(params) {
|
|
46
|
-
const command = new CompleteMultipartUploadCommand({
|
|
47
|
-
Bucket: params.Bucket,
|
|
48
|
-
Key: params.Key,
|
|
49
|
-
MultipartUpload: {
|
|
50
|
-
Parts: params.Parts.map(({ ETag, PartNumber }) => {
|
|
51
|
-
return { ETag, PartNumber };
|
|
52
|
-
})
|
|
53
|
-
},
|
|
54
|
-
UploadId: params.UploadId
|
|
55
|
-
});
|
|
56
|
-
const response = await this.client.send(command);
|
|
57
|
-
if (!response.Location) {
|
|
58
|
-
throw new Error("Failed to complete multipart upload");
|
|
59
|
-
}
|
|
60
|
-
return {
|
|
61
|
-
ETag: response.ETag,
|
|
62
|
-
Location: response.Location
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
async abortMultipartUpload(params) {
|
|
66
|
-
const command = new AbortMultipartUploadCommand({
|
|
67
|
-
Bucket: params.Bucket,
|
|
68
|
-
Key: params.Key,
|
|
69
|
-
UploadId: params.UploadId
|
|
70
|
-
});
|
|
71
|
-
await this.client.send(command);
|
|
72
|
-
}
|
|
73
|
-
async listParts(params) {
|
|
74
|
-
const command = new ListPartsCommand({
|
|
75
|
-
Bucket: params.Bucket,
|
|
76
|
-
Key: params.Key,
|
|
77
|
-
UploadId: params.UploadId
|
|
78
|
-
});
|
|
79
|
-
const response = await this.client.send(command);
|
|
80
|
-
const parts = [];
|
|
81
|
-
if (response.Parts) {
|
|
82
|
-
for (const part of response.Parts) {
|
|
83
|
-
if (part.ETag && part.PartNumber) {
|
|
84
|
-
parts.push({
|
|
85
|
-
ETag: part.ETag,
|
|
86
|
-
PartNumber: part.PartNumber,
|
|
87
|
-
Size: part.Size
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return { Parts: parts.length > 0 ? parts : void 0 };
|
|
93
|
-
}
|
|
94
|
-
async getObject(params) {
|
|
95
|
-
const command = new GetObjectCommand({
|
|
96
|
-
Bucket: params.Bucket,
|
|
97
|
-
Key: params.Key
|
|
98
|
-
});
|
|
99
|
-
const response = await this.client.send(command);
|
|
100
|
-
let body;
|
|
101
|
-
if (response.Body) {
|
|
102
|
-
const sdkStream = response.Body;
|
|
103
|
-
if (sdkStream instanceof Readable) {
|
|
104
|
-
body = sdkStream;
|
|
105
|
-
} else if (typeof sdkStream === "object" && "transform" in sdkStream && sdkStream instanceof ReadableStream) {
|
|
106
|
-
body = sdkStream;
|
|
107
|
-
} else {
|
|
108
|
-
body = Readable.from(sdkStream);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
Body: body,
|
|
113
|
-
ContentLength: response.ContentLength,
|
|
114
|
-
ContentType: response.ContentType,
|
|
115
|
-
ETag: response.ETag,
|
|
116
|
-
Expires: response.Expires,
|
|
117
|
-
LastModified: response.LastModified,
|
|
118
|
-
Metadata: response.Metadata
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
async headObject(params) {
|
|
122
|
-
const command = new HeadObjectCommand({
|
|
123
|
-
Bucket: params.Bucket,
|
|
124
|
-
Key: params.Key
|
|
125
|
-
});
|
|
126
|
-
const response = await this.client.send(command);
|
|
127
|
-
return {
|
|
128
|
-
ContentLength: response.ContentLength,
|
|
129
|
-
ContentType: response.ContentType,
|
|
130
|
-
ETag: response.ETag,
|
|
131
|
-
Expires: response.Expires,
|
|
132
|
-
LastModified: response.LastModified
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
async deleteObject(params) {
|
|
136
|
-
const command = new DeleteObjectCommand({
|
|
137
|
-
Bucket: params.Bucket,
|
|
138
|
-
Key: params.Key
|
|
139
|
-
});
|
|
140
|
-
await this.client.send(command);
|
|
141
|
-
}
|
|
142
|
-
async copyObject(params) {
|
|
143
|
-
const commandInput = {
|
|
144
|
-
Bucket: params.Bucket,
|
|
145
|
-
CopySource: params.CopySource,
|
|
146
|
-
Key: params.Key
|
|
147
|
-
};
|
|
148
|
-
if (params.StorageClass) {
|
|
149
|
-
commandInput.StorageClass = params.StorageClass;
|
|
150
|
-
}
|
|
151
|
-
const command = new CopyObjectCommand(commandInput);
|
|
152
|
-
await this.client.send(command);
|
|
153
|
-
}
|
|
154
|
-
async listObjectsV2(params) {
|
|
155
|
-
const command = new ListObjectsV2Command({
|
|
156
|
-
Bucket: params.Bucket,
|
|
157
|
-
ContinuationToken: params.ContinuationToken,
|
|
158
|
-
MaxKeys: params.MaxKeys
|
|
159
|
-
});
|
|
160
|
-
const response = await this.client.send(command);
|
|
161
|
-
return {
|
|
162
|
-
Contents: response.Contents?.map((item) => {
|
|
163
|
-
return {
|
|
164
|
-
Key: item.Key,
|
|
165
|
-
LastModified: item.LastModified
|
|
166
|
-
};
|
|
167
|
-
}),
|
|
168
|
-
IsTruncated: response.IsTruncated,
|
|
169
|
-
NextContinuationToken: response.NextContinuationToken
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
async getPresignedUrl(params) {
|
|
173
|
-
const command = new UploadPartCommand({
|
|
174
|
-
Bucket: params.Bucket,
|
|
175
|
-
Key: params.Key,
|
|
176
|
-
PartNumber: params.PartNumber,
|
|
177
|
-
UploadId: params.UploadId
|
|
178
|
-
});
|
|
179
|
-
return getSignedUrl(this.client, command, { expiresIn: params.expiresIn });
|
|
180
|
-
}
|
|
181
|
-
async checkBucketAccess(params) {
|
|
182
|
-
await waitUntilBucketExists({ client: this.client, maxWaitTime: 30 }, { Bucket: params.Bucket });
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
class S3Storage extends S3BaseStorage {
|
|
187
|
-
static name = "s3";
|
|
188
|
-
s3Api;
|
|
189
|
-
constructor(config) {
|
|
190
|
-
const { bucket = process.env.S3_BUCKET, region = process.env.S3_REGION } = config;
|
|
191
|
-
if (!bucket) {
|
|
192
|
-
throw new Error("S3 bucket is not defined");
|
|
193
|
-
}
|
|
194
|
-
if (!region) {
|
|
195
|
-
throw new Error("S3 region is not defined");
|
|
196
|
-
}
|
|
197
|
-
config.region = region;
|
|
198
|
-
const keyFile = config.keyFile || process.env.S3_KEYFILE;
|
|
199
|
-
if (keyFile) {
|
|
200
|
-
config.credentials = fromIni({ configFilepath: keyFile });
|
|
201
|
-
}
|
|
202
|
-
const client = new S3Client(config);
|
|
203
|
-
super({
|
|
204
|
-
bucket,
|
|
205
|
-
clientDirectUpload: config.clientDirectUpload,
|
|
206
|
-
expiration: config.expiration?.maxAge ? { maxAge: String(config.expiration.maxAge) } : void 0,
|
|
207
|
-
filename: config.filename,
|
|
208
|
-
logger: config.logger,
|
|
209
|
-
metaStorage: config.metaStorage,
|
|
210
|
-
metaStorageConfig: config.metaStorageConfig ? { ...config.metaStorageConfig, ...config } : { ...config },
|
|
211
|
-
partSize: config.partSize,
|
|
212
|
-
retryConfig: {
|
|
213
|
-
...config.retryConfig,
|
|
214
|
-
shouldRetry: (error) => {
|
|
215
|
-
const errorWithMetadata = error;
|
|
216
|
-
if (errorWithMetadata.$metadata) {
|
|
217
|
-
const statusCode = errorWithMetadata.$metadata.httpStatusCode;
|
|
218
|
-
if (statusCode && [408, 429, 500, 502, 503, 504].includes(statusCode)) {
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
if (errorWithMetadata.$fault === "server") {
|
|
222
|
-
return true;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return errorWithMetadata.retryable ?? false;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
this.s3Api = new S3ClientAdapter(client, bucket);
|
|
230
|
-
const { metaStorage, metaStorageConfig } = config;
|
|
231
|
-
if (!metaStorage) {
|
|
232
|
-
const metaConfig = { ...config, ...metaStorageConfig, logger: this.logger };
|
|
233
|
-
const localMeta = "directory" in metaConfig;
|
|
234
|
-
if (!localMeta) {
|
|
235
|
-
this.meta = new S3MetaStorage(metaConfig);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (this.config.clientDirectUpload) {
|
|
239
|
-
this.onCreate = async () => {
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Normalizes AWS S3 errors with S3-specific context.
|
|
245
|
-
*/
|
|
246
|
-
normalizeError(error) {
|
|
247
|
-
if (error.$metadata) {
|
|
248
|
-
return {
|
|
249
|
-
code: error.Code || error.name,
|
|
250
|
-
message: error.message,
|
|
251
|
-
name: error.name,
|
|
252
|
-
statusCode: error.$metadata.httpStatusCode || 500
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
return super.normalizeError(error);
|
|
256
|
-
}
|
|
257
|
-
async update({ id }, metadata) {
|
|
258
|
-
if (this.config.clientDirectUpload) {
|
|
259
|
-
const file = await this.getMeta(id);
|
|
260
|
-
return this.buildPresigned({ ...file, ...metadata });
|
|
261
|
-
}
|
|
262
|
-
return super.update({ id }, metadata);
|
|
263
|
-
}
|
|
264
|
-
async getStream({ id }) {
|
|
265
|
-
return this.instrumentOperation("getStream", async () => {
|
|
266
|
-
const s3Api = this.getS3Api();
|
|
267
|
-
const { Body, ContentLength, ContentType, ETag, Expires, LastModified } = await this.retry(
|
|
268
|
-
() => s3Api.getObject({
|
|
269
|
-
Bucket: this.bucket,
|
|
270
|
-
Key: id
|
|
271
|
-
})
|
|
272
|
-
);
|
|
273
|
-
await this.checkIfExpired({ expiredAt: Expires });
|
|
274
|
-
const stream = Body;
|
|
275
|
-
const readableStream = new Readable({
|
|
276
|
-
read() {
|
|
277
|
-
stream.on("data", (chunk) => {
|
|
278
|
-
this.push(chunk);
|
|
279
|
-
});
|
|
280
|
-
stream.on("end", () => {
|
|
281
|
-
this.push(null);
|
|
282
|
-
});
|
|
283
|
-
stream.on("error", (error) => {
|
|
284
|
-
this.destroy(error);
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
return {
|
|
289
|
-
headers: {
|
|
290
|
-
"Content-Length": ContentLength?.toString() ?? "0",
|
|
291
|
-
"Content-Type": ContentType,
|
|
292
|
-
...ETag && { ETag },
|
|
293
|
-
...Expires && { "X-Upload-Expires": Expires.toString() },
|
|
294
|
-
...LastModified && { "Last-Modified": LastModified.toString() }
|
|
295
|
-
},
|
|
296
|
-
size: Number(ContentLength),
|
|
297
|
-
stream: readableStream
|
|
298
|
-
};
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
getS3Api() {
|
|
302
|
-
return this.s3Api;
|
|
303
|
-
}
|
|
304
|
-
// eslint-disable-next-line class-methods-use-this
|
|
305
|
-
getFileClass() {
|
|
306
|
-
return S3File;
|
|
307
|
-
}
|
|
308
|
-
getAcl() {
|
|
309
|
-
return this.config.acl;
|
|
310
|
-
}
|
|
311
|
-
async accessCheck(_maxWaitTime = 30) {
|
|
312
|
-
await this.s3Api.checkBucketAccess({ Bucket: this.bucket });
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
export { S3Storage as default };
|