@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,376 +0,0 @@
|
|
|
1
|
-
import { getStore } from '@netlify/blobs';
|
|
2
|
-
import { g as getFileStatus, p as partMatch, a as detectFileTypeFromBuffer } from './part-match-BMNqHDYD.js';
|
|
3
|
-
import { B as BaseStorage, t as toMilliseconds, u as updateMetadata } from './storage-C6NSXb8h.js';
|
|
4
|
-
import { createRetryWrapper } from './isRetryableError-Dycp7127.js';
|
|
5
|
-
import { L as LocalMetaStorage } from './local-meta-storage-By-3SNBI.js';
|
|
6
|
-
import NetlifyBlobFile from './NetlifyBlobFile-CXzyjqrD.js';
|
|
7
|
-
import { u as updateSize } from './update-size-CCGm6i1J.js';
|
|
8
|
-
import { h as hasContent } from './has-content-CY66ehMK.js';
|
|
9
|
-
|
|
10
|
-
class NetlifyBlobStorage extends BaseStorage {
|
|
11
|
-
static name = "netlify-blob";
|
|
12
|
-
checksumTypes = ["md5"];
|
|
13
|
-
meta;
|
|
14
|
-
storeName;
|
|
15
|
-
siteID;
|
|
16
|
-
token;
|
|
17
|
-
store;
|
|
18
|
-
retry;
|
|
19
|
-
constructor(config) {
|
|
20
|
-
super(config);
|
|
21
|
-
this.storeName = config.storeName || "default";
|
|
22
|
-
this.siteID = config.siteID || process.env.NETLIFY_SITE_ID;
|
|
23
|
-
this.token = config.token || process.env.NETLIFY_TOKEN;
|
|
24
|
-
this.store = getStore({
|
|
25
|
-
name: this.storeName,
|
|
26
|
-
...this.siteID && { siteID: this.siteID },
|
|
27
|
-
...this.token && { token: this.token }
|
|
28
|
-
});
|
|
29
|
-
const retryConfig = {
|
|
30
|
-
backoffMultiplier: 2,
|
|
31
|
-
initialDelay: 1e3,
|
|
32
|
-
maxDelay: 3e4,
|
|
33
|
-
maxRetries: 3,
|
|
34
|
-
retryableStatusCodes: [408, 429, 500, 502, 503, 504],
|
|
35
|
-
shouldRetry: (error) => {
|
|
36
|
-
if (error instanceof Error) {
|
|
37
|
-
const errorWithCode = error;
|
|
38
|
-
const errorCode = errorWithCode.code;
|
|
39
|
-
if (errorCode === "ECONNRESET" || errorCode === "ETIMEDOUT" || errorCode === "ENOTFOUND" || errorCode === "ECONNREFUSED") {
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
const errorWithStatus = error;
|
|
44
|
-
return Boolean(errorWithStatus.status && [408, 429, 500, 502, 503, 504].includes(errorWithStatus.status));
|
|
45
|
-
},
|
|
46
|
-
...config.retryConfig
|
|
47
|
-
};
|
|
48
|
-
this.retry = createRetryWrapper(retryConfig);
|
|
49
|
-
const { metaStorage, metaStorageConfig } = config;
|
|
50
|
-
this.meta = metaStorage || new LocalMetaStorage(metaStorageConfig);
|
|
51
|
-
this.isReady = true;
|
|
52
|
-
}
|
|
53
|
-
async create(config) {
|
|
54
|
-
return this.instrumentOperation("create", async () => {
|
|
55
|
-
const processedConfig = { ...config };
|
|
56
|
-
if (config.ttl) {
|
|
57
|
-
const ttlMs = typeof config.ttl === "string" ? toMilliseconds(config.ttl) : config.ttl;
|
|
58
|
-
processedConfig.expiredAt = ttlMs === void 0 ? void 0 : Date.now() + ttlMs;
|
|
59
|
-
}
|
|
60
|
-
const file = new NetlifyBlobFile(processedConfig);
|
|
61
|
-
file.name = this.namingFunction(file);
|
|
62
|
-
await this.validate(file);
|
|
63
|
-
try {
|
|
64
|
-
const existing = await this.getMeta(file.id);
|
|
65
|
-
if (existing.bytesWritten >= 0) {
|
|
66
|
-
return existing;
|
|
67
|
-
}
|
|
68
|
-
} catch {
|
|
69
|
-
}
|
|
70
|
-
file.bytesWritten = 0;
|
|
71
|
-
file.status = getFileStatus(file);
|
|
72
|
-
await this.saveMeta(file);
|
|
73
|
-
await this.onCreate(file);
|
|
74
|
-
return file;
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
async write(part) {
|
|
78
|
-
return this.instrumentOperation("write", async () => {
|
|
79
|
-
let file;
|
|
80
|
-
if ("contentType" in part && "metadata" in part && !("body" in part) && !("start" in part)) {
|
|
81
|
-
file = part;
|
|
82
|
-
} else {
|
|
83
|
-
file = await this.getMeta(part.id);
|
|
84
|
-
await this.checkIfExpired(file);
|
|
85
|
-
}
|
|
86
|
-
if (file.status === "completed") {
|
|
87
|
-
return file;
|
|
88
|
-
}
|
|
89
|
-
if (part.size !== void 0) {
|
|
90
|
-
updateSize(file, part.size);
|
|
91
|
-
}
|
|
92
|
-
if (!partMatch(part, file)) {
|
|
93
|
-
throw new Error("File part does not match");
|
|
94
|
-
}
|
|
95
|
-
await this.lock(part.id);
|
|
96
|
-
try {
|
|
97
|
-
if (hasContent(part)) {
|
|
98
|
-
if (this.isUnsupportedChecksum(part.checksumAlgorithm)) {
|
|
99
|
-
throw new Error("Unsupported checksum algorithm");
|
|
100
|
-
}
|
|
101
|
-
const chunks = [];
|
|
102
|
-
const stream = part.body;
|
|
103
|
-
for await (const chunk of stream) {
|
|
104
|
-
chunks.push(Buffer.from(chunk));
|
|
105
|
-
}
|
|
106
|
-
const buffer = Buffer.concat(chunks);
|
|
107
|
-
if ((file.bytesWritten === 0 || Number.isNaN(file.bytesWritten)) && (!file.contentType || file.contentType === "application/octet-stream")) {
|
|
108
|
-
try {
|
|
109
|
-
const fileType = await detectFileTypeFromBuffer(buffer);
|
|
110
|
-
if (fileType?.mime) {
|
|
111
|
-
file.contentType = fileType.mime;
|
|
112
|
-
}
|
|
113
|
-
} catch {
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
await this.retry(
|
|
117
|
-
() => this.store.set(file.name, buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength), {
|
|
118
|
-
metadata: {
|
|
119
|
-
contentType: file.contentType,
|
|
120
|
-
...file.metadata
|
|
121
|
-
}
|
|
122
|
-
})
|
|
123
|
-
);
|
|
124
|
-
file.pathname = file.name;
|
|
125
|
-
file.url = this.getBlobUrl(file.name);
|
|
126
|
-
file.bytesWritten = buffer.length;
|
|
127
|
-
}
|
|
128
|
-
file.status = getFileStatus(file);
|
|
129
|
-
if (file.status === "completed") {
|
|
130
|
-
await this.internalOnComplete(file);
|
|
131
|
-
}
|
|
132
|
-
await this.saveMeta(file);
|
|
133
|
-
return file;
|
|
134
|
-
} finally {
|
|
135
|
-
await this.unlock(part.id);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Deletes an upload and its metadata.
|
|
141
|
-
* @param query File query containing the file ID to delete.
|
|
142
|
-
* @param query.id File ID to delete.
|
|
143
|
-
* @returns Promise resolving to the deleted file object with status: "deleted".
|
|
144
|
-
* @throws {UploadError} If the file metadata cannot be found.
|
|
145
|
-
*/
|
|
146
|
-
async delete({ id }) {
|
|
147
|
-
return this.instrumentOperation("delete", async () => {
|
|
148
|
-
const file = await this.getMeta(id);
|
|
149
|
-
if (!file.pathname) {
|
|
150
|
-
throw new Error(`File ${id} does not have a valid pathname`);
|
|
151
|
-
}
|
|
152
|
-
file.status = "deleted";
|
|
153
|
-
try {
|
|
154
|
-
await this.retry(() => this.store.delete(file.pathname));
|
|
155
|
-
} catch (error) {
|
|
156
|
-
this.logger?.error("Failed to delete blob from Netlify Blob:", error);
|
|
157
|
-
const httpError = this.normalizeError(error instanceof Error ? error : new Error(String(error)));
|
|
158
|
-
await this.onError(httpError);
|
|
159
|
-
}
|
|
160
|
-
await this.deleteMeta(file.id);
|
|
161
|
-
const deletedFile = { ...file };
|
|
162
|
-
await this.onDelete(deletedFile);
|
|
163
|
-
return deletedFile;
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Checks if a file exists by verifying both metadata and the actual Netlify Blob.
|
|
168
|
-
* Returns true only if both the metadata and the blob exist.
|
|
169
|
-
* @param query File query containing the file ID to check.
|
|
170
|
-
* @returns Promise resolving to true if both metadata and blob exist, false otherwise.
|
|
171
|
-
*/
|
|
172
|
-
async exists({ id }) {
|
|
173
|
-
return this.instrumentOperation("exists", async () => {
|
|
174
|
-
try {
|
|
175
|
-
const file = await this.getMeta(id);
|
|
176
|
-
if (!file.pathname || file.pathname.length <= 0) {
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
const blob = await this.retry(() => this.store.get(file.pathname, { type: "blob" }));
|
|
180
|
-
return blob !== null && blob !== void 0;
|
|
181
|
-
} catch {
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
async get({ id }) {
|
|
187
|
-
return this.instrumentOperation("get", async () => {
|
|
188
|
-
const file = await this.checkIfExpired(await this.getMeta(id));
|
|
189
|
-
if (!file.pathname || file.pathname.length <= 0) {
|
|
190
|
-
throw new Error("File pathname not found");
|
|
191
|
-
}
|
|
192
|
-
const blob = await this.retry(() => this.store.get(file.pathname, { type: "blob" }));
|
|
193
|
-
if (!blob) {
|
|
194
|
-
throw new Error("File not found in Netlify Blob");
|
|
195
|
-
}
|
|
196
|
-
let arrayBuffer;
|
|
197
|
-
if (typeof blob === "string") {
|
|
198
|
-
arrayBuffer = Buffer.from(blob, "utf8").buffer;
|
|
199
|
-
} else if (blob && typeof blob === "object" && "arrayBuffer" in blob && typeof blob.arrayBuffer === "function") {
|
|
200
|
-
arrayBuffer = await this.retry(() => blob.arrayBuffer());
|
|
201
|
-
} else {
|
|
202
|
-
throw new Error("Invalid blob type returned from Netlify Blob");
|
|
203
|
-
}
|
|
204
|
-
const content = Buffer.from(arrayBuffer);
|
|
205
|
-
let blobMetadata = null;
|
|
206
|
-
try {
|
|
207
|
-
const metadata = await this.store.getMetadata?.(file.pathname);
|
|
208
|
-
blobMetadata = metadata ?? null;
|
|
209
|
-
} catch {
|
|
210
|
-
}
|
|
211
|
-
return {
|
|
212
|
-
content,
|
|
213
|
-
contentType: blobMetadata?.contentType || file.contentType,
|
|
214
|
-
ETag: file.ETag,
|
|
215
|
-
expiredAt: file.expiredAt,
|
|
216
|
-
id,
|
|
217
|
-
metadata: {
|
|
218
|
-
...file.metadata,
|
|
219
|
-
...blobMetadata?.metadata
|
|
220
|
-
},
|
|
221
|
-
modifiedAt: file.modifiedAt,
|
|
222
|
-
name: file.name,
|
|
223
|
-
originalName: file.originalName,
|
|
224
|
-
size: file.size || content.length
|
|
225
|
-
};
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Copies an upload file to a new location.
|
|
230
|
-
* @param name Source file name/ID.
|
|
231
|
-
* @param destination Destination file name/ID.
|
|
232
|
-
* @returns Promise resolving to the copied file object.
|
|
233
|
-
* @throws {UploadError} If the source file cannot be found.
|
|
234
|
-
*/
|
|
235
|
-
async copy(name, destination) {
|
|
236
|
-
return this.instrumentOperation("copy", async () => {
|
|
237
|
-
const sourceFile = await this.getMeta(name);
|
|
238
|
-
if (!sourceFile.pathname) {
|
|
239
|
-
throw new Error("Source file pathname not found");
|
|
240
|
-
}
|
|
241
|
-
const sourceBlob = await this.retry(() => this.store.get(sourceFile.pathname, { type: "blob" }));
|
|
242
|
-
if (!sourceBlob) {
|
|
243
|
-
throw new Error("Source file not found in Netlify Blob");
|
|
244
|
-
}
|
|
245
|
-
let sourceMetadata = null;
|
|
246
|
-
try {
|
|
247
|
-
const storeWithMetadata = this.store;
|
|
248
|
-
if (storeWithMetadata.getMetadata && sourceFile.pathname) {
|
|
249
|
-
sourceMetadata = await storeWithMetadata.getMetadata(sourceFile.pathname);
|
|
250
|
-
}
|
|
251
|
-
} catch {
|
|
252
|
-
}
|
|
253
|
-
let arrayBuffer;
|
|
254
|
-
if (typeof sourceBlob === "string") {
|
|
255
|
-
arrayBuffer = Buffer.from(sourceBlob, "utf8").buffer;
|
|
256
|
-
} else if (sourceBlob && typeof sourceBlob === "object" && "arrayBuffer" in sourceBlob) {
|
|
257
|
-
const blobWithArrayBuffer = sourceBlob;
|
|
258
|
-
arrayBuffer = await this.retry(() => blobWithArrayBuffer.arrayBuffer());
|
|
259
|
-
} else {
|
|
260
|
-
throw new Error("Invalid blob type returned from Netlify Blob");
|
|
261
|
-
}
|
|
262
|
-
const buffer = Buffer.from(arrayBuffer);
|
|
263
|
-
await this.retry(
|
|
264
|
-
() => this.store.set(destination, buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength), {
|
|
265
|
-
metadata: sourceMetadata || {
|
|
266
|
-
contentType: sourceFile.contentType,
|
|
267
|
-
...sourceFile.metadata
|
|
268
|
-
}
|
|
269
|
-
})
|
|
270
|
-
);
|
|
271
|
-
const copiedFile = {
|
|
272
|
-
...sourceFile,
|
|
273
|
-
id: destination,
|
|
274
|
-
name: destination,
|
|
275
|
-
pathname: destination,
|
|
276
|
-
url: this.getBlobUrl(destination)
|
|
277
|
-
};
|
|
278
|
-
await this.saveMeta(copiedFile);
|
|
279
|
-
return copiedFile;
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Moves an upload file to a new location.
|
|
284
|
-
* @param name Source file name/ID.
|
|
285
|
-
* @param destination Destination file name/ID.
|
|
286
|
-
* @returns Promise resolving to the moved file object.
|
|
287
|
-
* @throws {UploadError} If the source file cannot be found.
|
|
288
|
-
*/
|
|
289
|
-
async move(name, destination) {
|
|
290
|
-
return this.instrumentOperation("move", async () => {
|
|
291
|
-
const copiedFile = await this.copy(name, destination);
|
|
292
|
-
await this.delete({ id: name });
|
|
293
|
-
return copiedFile;
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Updates file metadata with user-provided key-value pairs.
|
|
298
|
-
* Updates the metadata file (overwrites it) but does not update Netlify Blob metadata
|
|
299
|
-
* since the Netlify Blob API doesn't support metadata updates.
|
|
300
|
-
* @param query File query containing the file ID to update.
|
|
301
|
-
* @param query.id File ID to update.
|
|
302
|
-
* @param metadata Partial file object containing fields to update.
|
|
303
|
-
* @returns Promise resolving to the updated file object.
|
|
304
|
-
* @throws {UploadError} If the file cannot be found (ERRORS.FILE_NOT_FOUND).
|
|
305
|
-
* @remarks
|
|
306
|
-
* Supports TTL (time-to-live) option: if metadata contains a 'ttl' field,
|
|
307
|
-
* it will be converted to an 'expiredAt' timestamp.
|
|
308
|
-
* TTL can be a number (milliseconds) or string (e.g., "1h", "30m", "7d").
|
|
309
|
-
*/
|
|
310
|
-
async update({ id }, metadata) {
|
|
311
|
-
return this.instrumentOperation("update", async () => {
|
|
312
|
-
const file = await this.getMeta(id);
|
|
313
|
-
const processedMetadata = { ...metadata };
|
|
314
|
-
if ("ttl" in processedMetadata && processedMetadata.ttl !== void 0) {
|
|
315
|
-
const ttlValue = processedMetadata.ttl;
|
|
316
|
-
const ttlMs = typeof ttlValue === "string" ? toMilliseconds(ttlValue) : ttlValue;
|
|
317
|
-
if (ttlMs !== void 0) {
|
|
318
|
-
processedMetadata.expiredAt = Date.now() + ttlMs;
|
|
319
|
-
}
|
|
320
|
-
delete processedMetadata.ttl;
|
|
321
|
-
}
|
|
322
|
-
updateMetadata(file, processedMetadata);
|
|
323
|
-
await this.saveMeta(file);
|
|
324
|
-
const updatedFile = { ...file, status: "updated" };
|
|
325
|
-
await this.onUpdate(updatedFile);
|
|
326
|
-
return updatedFile;
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
async list(limit = 1e3) {
|
|
330
|
-
return this.instrumentOperation(
|
|
331
|
-
"list",
|
|
332
|
-
async () => {
|
|
333
|
-
const listResult = await this.retry(() => this.store.list());
|
|
334
|
-
const files = [];
|
|
335
|
-
for await (const blob of listResult.blobs) {
|
|
336
|
-
let metadata = null;
|
|
337
|
-
try {
|
|
338
|
-
const fetchedMetadata = await this.store.getMetadata?.(blob.key);
|
|
339
|
-
metadata = fetchedMetadata ?? null;
|
|
340
|
-
} catch {
|
|
341
|
-
}
|
|
342
|
-
const file = new NetlifyBlobFile({
|
|
343
|
-
contentType: metadata?.contentType || "application/octet-stream",
|
|
344
|
-
metadata: metadata?.metadata || {},
|
|
345
|
-
originalName: blob.key
|
|
346
|
-
});
|
|
347
|
-
const blobWithDates = blob;
|
|
348
|
-
file.createdAt = blobWithDates.createdAt?.toISOString();
|
|
349
|
-
file.id = blob.key;
|
|
350
|
-
file.modifiedAt = blobWithDates.updatedAt?.toISOString();
|
|
351
|
-
file.name = blob.key;
|
|
352
|
-
file.pathname = blob.key;
|
|
353
|
-
file.size = blobWithDates.size;
|
|
354
|
-
file.url = this.getBlobUrl(blob.key);
|
|
355
|
-
files.push(file);
|
|
356
|
-
if (files.length >= limit) {
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
return files;
|
|
361
|
-
},
|
|
362
|
-
{ limit }
|
|
363
|
-
);
|
|
364
|
-
}
|
|
365
|
-
internalOnComplete = (file) => this.deleteMeta(file.id);
|
|
366
|
-
/**
|
|
367
|
-
* Generate a URL for a blob in Netlify Blob store
|
|
368
|
-
* Note: Netlify Blob doesn't provide direct public URLs like Vercel Blob
|
|
369
|
-
* In production, you would typically serve these through Netlify Functions or Edge Functions
|
|
370
|
-
*/
|
|
371
|
-
getBlobUrl(pathname) {
|
|
372
|
-
return `/api/blobs/${this.storeName}/${pathname}`;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
export { NetlifyBlobStorage as default };
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { metrics } from '@opentelemetry/api';
|
|
2
|
-
|
|
3
|
-
class OpenTelemetryMetrics {
|
|
4
|
-
meter;
|
|
5
|
-
counters = /* @__PURE__ */ new Map();
|
|
6
|
-
histograms = /* @__PURE__ */ new Map();
|
|
7
|
-
gauges = /* @__PURE__ */ new Map();
|
|
8
|
-
/**
|
|
9
|
-
* Creates a new OpenTelemetryMetrics instance.
|
|
10
|
-
* @param meter OpenTelemetry Meter instance. If not provided, uses the default meter.
|
|
11
|
-
* @throws {Error} If \@opentelemetry/api is not installed
|
|
12
|
-
*/
|
|
13
|
-
constructor(meter) {
|
|
14
|
-
this.meter = meter || metrics.getMeter("@visulima/storage", "1.0.0");
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Increment a counter metric.
|
|
18
|
-
*/
|
|
19
|
-
increment(name, value = 1, attributes) {
|
|
20
|
-
if (!this.counters.has(name)) {
|
|
21
|
-
const options = {
|
|
22
|
-
description: `Counter for ${name}`
|
|
23
|
-
};
|
|
24
|
-
this.counters.set(name, this.meter.createCounter(name, options));
|
|
25
|
-
}
|
|
26
|
-
const counter = this.counters.get(name);
|
|
27
|
-
if (!counter) {
|
|
28
|
-
throw new Error(`Counter ${name} was not created`);
|
|
29
|
-
}
|
|
30
|
-
counter.add(value, attributes);
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Record a duration/timing metric in milliseconds.
|
|
34
|
-
*/
|
|
35
|
-
timing(name, duration, attributes) {
|
|
36
|
-
if (!this.histograms.has(name)) {
|
|
37
|
-
const options = {
|
|
38
|
-
description: `Duration histogram for ${name}`,
|
|
39
|
-
unit: "ms"
|
|
40
|
-
};
|
|
41
|
-
this.histograms.set(name, this.meter.createHistogram(name, options));
|
|
42
|
-
}
|
|
43
|
-
const histogram = this.histograms.get(name);
|
|
44
|
-
if (!histogram) {
|
|
45
|
-
throw new Error(`Histogram ${name} was not created`);
|
|
46
|
-
}
|
|
47
|
-
histogram.record(duration, attributes);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Set a gauge metric value.
|
|
51
|
-
*/
|
|
52
|
-
gauge(name, value, attributes) {
|
|
53
|
-
if (!this.gauges.has(name)) {
|
|
54
|
-
const options = {
|
|
55
|
-
description: `Gauge for ${name}`
|
|
56
|
-
};
|
|
57
|
-
this.gauges.set(name, this.meter.createUpDownCounter(name, options));
|
|
58
|
-
}
|
|
59
|
-
const gauge = this.gauges.get(name);
|
|
60
|
-
if (!gauge) {
|
|
61
|
-
throw new Error(`Gauge ${name} was not created`);
|
|
62
|
-
}
|
|
63
|
-
gauge.add(value, attributes);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export { OpenTelemetryMetrics as default };
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
import { c as createHttpError } from './headers-YLRp1dLo.js';
|
|
2
|
-
import { hasBody } from 'type-is';
|
|
3
|
-
import { a as getHeader, b as getRequestStream, g as getIdFromRequest, r as readBody } from './base-handler-core-BoAqTyz7.js';
|
|
4
|
-
import { B as BaseHandlerNode } from './base-handler-node-DGzcHHAy.js';
|
|
5
|
-
import { R as RestBase, v as validateRequestBody, a as validateContentLength, e as extractFileInit, p as parseContentDisposition, b as parseChunkHeaders } from './rest-base-D9URIFkc.js';
|
|
6
|
-
|
|
7
|
-
class Rest extends BaseHandlerNode {
|
|
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.buildFileUrlForRest(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
|
-
* Build file URL from request and file data.
|
|
42
|
-
* @param requestUrl Request URL string
|
|
43
|
-
* @param file File object containing ID and content type
|
|
44
|
-
* @returns Constructed file URL with extension based on content type
|
|
45
|
-
*/
|
|
46
|
-
buildFileUrlForRest(requestUrl, file) {
|
|
47
|
-
return this.buildFileUrl({ url: requestUrl }, file);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Creates a new file via POST request with raw binary data.
|
|
51
|
-
* Supports both full file uploads and chunked upload initialization.
|
|
52
|
-
* @param request Node.js IncomingMessage with file data.
|
|
53
|
-
* @returns Promise resolving to ResponseFile with upload result.
|
|
54
|
-
*/
|
|
55
|
-
async post(request) {
|
|
56
|
-
const isChunkedUpload = getHeader(request, "x-chunked-upload", true) === "true";
|
|
57
|
-
validateRequestBody(request, true);
|
|
58
|
-
const contentLength = validateContentLength(request, true, this.storage.maxUploadSize);
|
|
59
|
-
const contentType = getHeader(request, "content-type") || "application/octet-stream";
|
|
60
|
-
const config = extractFileInit(request, contentLength, contentType);
|
|
61
|
-
const requestUrl = request.originalUrl || request.url;
|
|
62
|
-
const bodyStream = getRequestStream(request);
|
|
63
|
-
return this.restBase.handlePost(config, isChunkedUpload, requestUrl, bodyStream, contentLength);
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Create or update a file via PUT request.
|
|
67
|
-
* Requires file ID in the URL path.
|
|
68
|
-
* @param request Node.js IncomingMessage with file ID and data
|
|
69
|
-
* @returns Promise resolving to ResponseFile with upload result
|
|
70
|
-
*/
|
|
71
|
-
async put(request) {
|
|
72
|
-
let id;
|
|
73
|
-
try {
|
|
74
|
-
id = getIdFromRequest(request);
|
|
75
|
-
} catch (error) {
|
|
76
|
-
this.checkForUndefinedIdOrPath(error);
|
|
77
|
-
throw error;
|
|
78
|
-
}
|
|
79
|
-
if (!hasBody(request)) {
|
|
80
|
-
throw createHttpError(400, "Request body is required");
|
|
81
|
-
}
|
|
82
|
-
const contentLength = Number.parseInt(getHeader(request, "content-length") || "0", 10);
|
|
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 = getHeader(request, "content-type") || "application/octet-stream";
|
|
90
|
-
const metadataHeader = getHeader(request, "x-file-metadata", true);
|
|
91
|
-
let metadata;
|
|
92
|
-
if (metadataHeader) {
|
|
93
|
-
try {
|
|
94
|
-
metadata = JSON.parse(metadataHeader);
|
|
95
|
-
} catch {
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const originalName = parseContentDisposition(request);
|
|
99
|
-
const config = {
|
|
100
|
-
contentType,
|
|
101
|
-
metadata: metadata || {},
|
|
102
|
-
originalName,
|
|
103
|
-
size: contentLength
|
|
104
|
-
};
|
|
105
|
-
const requestUrl = request.originalUrl || 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 Node.js IncomingMessage 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 || "", "http://localhost");
|
|
117
|
-
const idsParameter = url.searchParams.get("ids");
|
|
118
|
-
if (idsParameter) {
|
|
119
|
-
const ids = idsParameter.split(",").map((id) => id.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 = getHeader(request, "content-type") || "";
|
|
126
|
-
if (contentType.includes("application/json")) {
|
|
127
|
-
try {
|
|
128
|
-
const body = await readBody(request, "utf8", 1024 * 1024);
|
|
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
|
-
try {
|
|
150
|
-
const id = getIdFromRequest(request);
|
|
151
|
-
return this.restBase.deleteSingle(id);
|
|
152
|
-
} catch (error) {
|
|
153
|
-
this.checkForUndefinedIdOrPath(error);
|
|
154
|
-
if (error.code === "ENOENT" || error.UploadErrorCode === "FILE_NOT_FOUND") {
|
|
155
|
-
throw createHttpError(404, "File not found");
|
|
156
|
-
}
|
|
157
|
-
throw error;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Uploads a chunk via PATCH request for chunked uploads.
|
|
162
|
-
* Headers required: X-Chunk-Offset (byte offset), Content-Length (chunk size).
|
|
163
|
-
* Optional: X-Chunk-Checksum (SHA256 checksum for validation).
|
|
164
|
-
* @param request Node.js IncomingMessage with chunk data.
|
|
165
|
-
* @returns Promise resolving to ResponseFile with upload progress.
|
|
166
|
-
*/
|
|
167
|
-
async patch(request) {
|
|
168
|
-
let id;
|
|
169
|
-
try {
|
|
170
|
-
id = getIdFromRequest(request);
|
|
171
|
-
} catch (error) {
|
|
172
|
-
this.checkForUndefinedIdOrPath(error);
|
|
173
|
-
throw error;
|
|
174
|
-
}
|
|
175
|
-
if (!hasBody(request)) {
|
|
176
|
-
throw createHttpError(400, "Request body is required");
|
|
177
|
-
}
|
|
178
|
-
const contentLength = Number.parseInt(getHeader(request, "content-length") || "0", 10);
|
|
179
|
-
if (contentLength === 0) {
|
|
180
|
-
throw createHttpError(400, "Content-Length is required and must be greater than 0");
|
|
181
|
-
}
|
|
182
|
-
const { chunkOffset } = parseChunkHeaders(request);
|
|
183
|
-
if (chunkOffset === void 0) {
|
|
184
|
-
throw createHttpError(400, "X-Chunk-Offset header is required");
|
|
185
|
-
}
|
|
186
|
-
const chunkChecksum = getHeader(request, "x-chunk-checksum", true);
|
|
187
|
-
const requestUrl = request.originalUrl || request.url;
|
|
188
|
-
const bodyStream = getRequestStream(request);
|
|
189
|
-
return this.restBase.handlePatch(id, chunkOffset, contentLength, chunkChecksum, requestUrl, bodyStream);
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Get file metadata via HEAD request.
|
|
193
|
-
* For chunked uploads, also returns upload progress information.
|
|
194
|
-
* @param request Node.js IncomingMessage with file ID
|
|
195
|
-
* @returns Promise resolving to ResponseFile with metadata headers
|
|
196
|
-
*/
|
|
197
|
-
async head(request) {
|
|
198
|
-
try {
|
|
199
|
-
const id = getIdFromRequest(request);
|
|
200
|
-
return this.restBase.handleHead(id);
|
|
201
|
-
} catch (error) {
|
|
202
|
-
this.checkForUndefinedIdOrPath(error);
|
|
203
|
-
if (error.UploadErrorCode === "FILE_NOT_FOUND" || error.code === "ENOENT") {
|
|
204
|
-
throw createHttpError(404, "File not found");
|
|
205
|
-
}
|
|
206
|
-
throw error;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Handle OPTIONS requests with REST API capabilities.
|
|
211
|
-
* @returns Promise resolving to ResponseFile with CORS headers
|
|
212
|
-
*/
|
|
213
|
-
async options() {
|
|
214
|
-
return this.restBase.handleOptions(Rest.methods, this.storage.maxUploadSize);
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Retrieves a file or list of files based on the request path.
|
|
218
|
-
* Delegates to BaseHandlerNode.get() method.
|
|
219
|
-
* @param request Node.js IncomingMessage with optional originalUrl.
|
|
220
|
-
* @param response Node.js ServerResponse.
|
|
221
|
-
* @returns Promise resolving to a single file, paginated list, or array of files.
|
|
222
|
-
*/
|
|
223
|
-
async get(request, response) {
|
|
224
|
-
return super.get(request, response);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export { Rest as default };
|