@visulima/storage 1.0.0-alpha.2 → 1.0.0-alpha.20
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 +252 -0
- package/LICENSE.md +1256 -512
- package/README.md +4 -4
- package/dist/adapter/nuxt/module.d.ts +41 -34
- package/dist/adapter/nuxt/module.js +1 -93
- package/dist/handler/http/fetch/index.d.ts +297 -4
- package/dist/handler/http/fetch/index.js +1 -4
- package/dist/handler/http/hono/index.d.ts +1474 -58
- 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 +361 -4
- package/dist/handler/http/node/index.js +1 -4
- 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 +376 -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/AwsLightFile-BTLiRxXj.js +1 -0
- package/dist/packem_shared/AwsLightMetaStorage-DHz1nf_H.js +1 -0
- package/dist/packem_shared/AwsLightStorage-CA9cdfJ6.js +1 -0
- package/dist/packem_shared/AzureFile-BKHru1zB.js +1 -0
- package/dist/packem_shared/AzureSMetaStorage-BqA4jUDJ.js +1 -0
- package/dist/packem_shared/AzureStorage-BKUjCymW.js +1 -0
- package/dist/packem_shared/BaseTransformer-D68eLyz1.js +1 -0
- package/dist/packem_shared/DiskStorage-DNjpDMX9.js +1 -0
- package/dist/packem_shared/DiskStorageWithChecksum-Bb6JX_tC.js +1 -0
- package/dist/packem_shared/ERRORS-B9jkvKwx.js +1 -0
- package/dist/packem_shared/File-alcSNpLq.js +1 -0
- package/dist/packem_shared/GCSConfig-BQ0OpVhe.js +1 -0
- package/dist/packem_shared/GCSFile-CHjX_fJk.js +1 -0
- package/dist/packem_shared/GCSMetaStorage-1UQIN9IN.js +1 -0
- package/dist/packem_shared/GCStorage-PJRb2WWC.js +1 -0
- package/dist/packem_shared/LocalMetaStorage-BWuFvWn4.js +1 -0
- package/dist/packem_shared/MediaTransformer-2C8MJeAg.js +1 -0
- package/dist/packem_shared/MetaStorage-Y4m1dWgd.js +1 -0
- package/dist/packem_shared/Metadata-B6Ir0KO7.js +1 -0
- package/dist/packem_shared/Multipart-Bd9YFFn0.js +1 -0
- package/dist/packem_shared/Multipart-D5bcEvga.js +1 -0
- package/dist/packem_shared/NetlifyBlobFile-CpzkMKng.js +1 -0
- package/dist/packem_shared/NetlifyBlobMetaStorage-dD0oBLom.js +1 -0
- package/dist/packem_shared/NetlifyBlobStorage-ByTwCN-h.js +1 -0
- package/dist/packem_shared/NoOpMetrics-Dky06sf1.js +1 -0
- package/dist/packem_shared/OpenTelemetryMetrics-9uxQMSlg.js +1 -0
- package/dist/packem_shared/Rest-CYEBbtCD.js +1 -0
- package/dist/packem_shared/Rest-DoonVU7B.js +1 -0
- package/dist/packem_shared/S3Client.d-CZ62Jztg.d.ts +20357 -0
- package/dist/packem_shared/S3File-Du6wP0Sz.js +1 -0
- package/dist/packem_shared/S3MetaStorage-vcriiosn.js +1 -0
- package/dist/packem_shared/S3Storage-Fx6-OSc-.js +1 -0
- package/dist/packem_shared/TUS_RESUMABLE-B7KtPVeC.js +1 -0
- package/dist/packem_shared/Tus-Bd_2Ki2G.js +1 -0
- package/dist/packem_shared/Tus-CUBCkuPE.js +1 -0
- package/dist/packem_shared/ValidationError-D8KKJiKA.js +1 -0
- package/dist/packem_shared/VercelBlobFile-CL9MjKcY.js +1 -0
- package/dist/packem_shared/VercelBlobMetaStorage-BsOTx-Su.js +1 -0
- package/dist/packem_shared/VercelBlobStorage-kNkk5Cn4.js +1 -0
- package/dist/packem_shared/_commonjsHelpers-D6W6KoPK.js +1 -0
- package/dist/packem_shared/aws-light-meta-storage-TPyQwLvk.js +4 -0
- package/dist/packem_shared/backblaze-DEflv87m.js +1 -0
- package/dist/packem_shared/base-handler-core-DaggCVsq.js +1 -0
- package/dist/packem_shared/base-handler-fetch-DnarP64X.js +1 -0
- package/dist/packem_shared/base-handler-node-BTes6sql.js +1 -0
- package/dist/packem_shared/cache-qV_5Umeq.js +1 -0
- package/dist/packem_shared/cloudflare-DLAeQvgD.js +1 -0
- package/dist/packem_shared/defaultCloudStorageFileNameValidation-yiM9GxHr.js +1 -0
- package/dist/packem_shared/digitalOcean-nhZUds87.js +1 -0
- package/dist/packem_shared/disk-storage-BvdK4bqF.js +5 -0
- package/dist/packem_shared/disk-storage-with-checksum.d-hEoe2ugb.d.ts +148 -0
- package/dist/packem_shared/gcs-meta-storage-DXqBZ3Xm.js +1 -0
- package/dist/packem_shared/has-content-Bx2p8Okx.js +1 -0
- package/dist/packem_shared/headers-DC2MEOrK.js +27 -0
- package/dist/packem_shared/is-expired-1JuZjDtb.js +1 -0
- package/dist/packem_shared/isRetryableError-DQNSZiBc.js +1 -0
- package/dist/packem_shared/isValidMediaType-B-2UKjZx.js +1 -0
- package/dist/packem_shared/local-meta-storage-Bkwqi_gi.js +1 -0
- package/dist/packem_shared/local-meta-storage.d-Dop9RP9k.d.ts +20 -0
- package/dist/packem_shared/media-transformer.d-LGdEjx6A.d.ts +331 -0
- package/dist/packem_shared/minio-BWwgGXeE.js +1 -0
- package/dist/packem_shared/multipart-base-C6OjBwMS.js +1 -0
- package/dist/packem_shared/part-match-DqD5U7An.js +1 -0
- package/dist/packem_shared/path-D7rMc9nq-B718mbm6.js +1 -0
- package/dist/packem_shared/response-builder-Wdo_fvcF.js +1 -0
- package/dist/packem_shared/rest-base-B2Dv7esY.js +1 -0
- package/dist/packem_shared/restOpenApiSpec-PaIVbESh.js +1 -0
- package/dist/packem_shared/s3-base-storage-xHZNtsGe.js +1 -0
- package/dist/packem_shared/s3-base-storage.d-CczjSe98.d.ts +251 -0
- package/dist/packem_shared/sharedGet-Ce7WGAsc.js +1 -0
- package/dist/packem_shared/storage-m_Cxgiih.js +1 -0
- package/dist/packem_shared/storage.d-BOMUJD96.d.ts +939 -0
- package/dist/packem_shared/tigris-DZoyrMNd.js +1 -0
- package/dist/packem_shared/transformOpenApiSpec-C0vEbDTO.js +1 -0
- package/dist/packem_shared/tus-base.d-C20dSee8.d.ts +99 -0
- package/dist/packem_shared/tusOpenApiSpec-DF0-hlWV.js +1 -0
- package/dist/packem_shared/types.d-B4hqF6yH.d.ts +708 -0
- package/dist/packem_shared/types.d-CNvyxOka.d.ts +49 -0
- package/dist/packem_shared/update-size-DANV7aa2.js +1 -0
- package/dist/packem_shared/validator-DK41xp8N.js +1 -0
- package/dist/packem_shared/waitForStorage-ChSBLhLc.js +1 -0
- package/dist/packem_shared/wasabi-Dmce4x9s.js +1 -0
- package/dist/packem_shared/xhrOpenApiSpec-nyoboz83.js +1 -0
- package/dist/storage/aws/clients/index.d.ts +166 -6
- package/dist/storage/aws/clients/index.js +1 -6
- package/dist/storage/aws/index.d.ts +320 -4
- package/dist/storage/aws/index.js +1 -3
- package/dist/storage/aws-light/index.d.ts +252 -4
- package/dist/storage/aws-light/index.js +1 -3
- package/dist/storage/azure/index.d.ts +10422 -4
- package/dist/storage/azure/index.js +1 -3
- package/dist/storage/gcs/index.d.ts +4107 -5
- package/dist/storage/gcs/index.js +1 -4
- package/dist/storage/local/index.d.ts +7 -4
- package/dist/storage/local/index.js +1 -3
- package/dist/storage/netlify-blob/index.d.ts +142 -4
- package/dist/storage/netlify-blob/index.js +1 -3
- package/dist/storage/vercel-blob/index.d.ts +129 -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 +569 -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 +60 -60
- 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-Cwkkc-z3.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-9MoV2W8q.js +0 -357
- package/dist/packem_shared/BaseTransformer-C2gLib6v.js +0 -82
- package/dist/packem_shared/DiskStorage-CJtTzMQ3.js +0 -12
- package/dist/packem_shared/DiskStorageWithChecksum-BgrG8pvC.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-sYiSjLUx.js +0 -7
- package/dist/packem_shared/GCStorage-DPl1_DAm.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-CNFK_Okz.js +0 -163
- package/dist/packem_shared/Multipart-CtUL7BQw.js +0 -128
- package/dist/packem_shared/NetlifyBlobFile-CXzyjqrD.js +0 -14
- package/dist/packem_shared/NetlifyBlobMetaStorage-DxZ5aDvD.js +0 -9
- package/dist/packem_shared/NetlifyBlobStorage-C6AX-X0P.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-CAOAEkOj.js +0 -267
- package/dist/packem_shared/Rest-DNuLwBrK.js +0 -228
- package/dist/packem_shared/S3File-DZiyk9Qt.js +0 -11
- package/dist/packem_shared/S3MetaStorage-Dz9aDabA.js +0 -76
- package/dist/packem_shared/S3Storage-CgheE2yH.js +0 -316
- package/dist/packem_shared/TUS_RESUMABLE-GJzZ9R-f.js +0 -434
- package/dist/packem_shared/Tus-B8PmlMgR.js +0 -200
- package/dist/packem_shared/Tus-C4F1aYOl.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-BbuEYhOz.js +0 -261
- package/dist/packem_shared/_commonjsHelpers-B85MJLTf.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-BKuf4YLT.js +0 -303
- package/dist/packem_shared/base-handler-fetch-Cr0hLiqg.js +0 -291
- package/dist/packem_shared/base-handler-node-gk5aN9Cx.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-oVDgf-Sw.js +0 -11
- package/dist/packem_shared/digitalOcean-CWQRJM3L.js +0 -21
- package/dist/packem_shared/disk-storage-DkDoHnKB.js +0 -810
- package/dist/packem_shared/gcs-meta-storage-etw4wuh5.js +0 -158
- package/dist/packem_shared/has-content-CY66ehMK.js +0 -3
- package/dist/packem_shared/headers-DoS5nwM-.js +0 -3220
- 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-B3i67SSX.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-GRCcnan7.js +0 -457
- package/dist/packem_shared/restOpenApiSpec-CwcHHY2C.js +0 -800
- package/dist/packem_shared/s3-base-storage-xw6NJFX7.js +0 -510
- package/dist/packem_shared/sharedGet-Cpo7QUyu.js +0 -1019
- package/dist/packem_shared/storage-BwdYUHs3.js +0 -864
- package/dist/packem_shared/tigris-Hac8TKnX.js +0 -21
- package/dist/packem_shared/transformOpenApiSpec-DWM5WtnN.js +0 -975
- package/dist/packem_shared/tusOpenApiSpec-6ohiToBy.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-DS17brnx.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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var h=Object.defineProperty;var r=(i,t)=>h(i,"name",{value:t,configurable:!0});import{BlobServiceClient as s,StorageSharedKeyCredential as p}from"@azure/storage-blob";import{throwErrorCode as c,ERRORS as l}from"./ERRORS-B9jkvKwx.js";import u from"./MetaStorage-Y4m1dWgd.js";import{parseMetadata as f,stringifyMetadata as g}from"./Metadata-B6Ir0KO7.js";var N=Object.defineProperty,C=r((i,t)=>N(i,"name",{value:t,configurable:!0}),"c");let v=class extends u{static{r(this,"N")}constructor(t){super(t),this.config=t;const{client:a,...e}=t;if(a===void 0){const n=e.connectionString||process.env.AZURE_STORAGE_CONNECTION_STRING||void 0;if(n)this.client=s.fromConnectionString(n);else{const d=e.accountKey||process.env.AZURE_STORAGE_ACCOUNT_KEY||void 0,o=e.accountName||process.env.AZURE_STORAGE_ACCOUNT||void 0;if(!e.accountKey)throw new Error("Missing required parameter: Azure blob storage account key.");if(!e.accountName)throw new Error("Missing required parameter: Azure blob storage account name.");const m=new p(o,d);this.client=new s(t.endpoint??`https://${o}.blob.core.windows.net`,m)}}else this.client=a;if(!(e.containerName||process.env.AZURE_STORAGE_CONTAINER))throw new Error("Missing required parameter: Azure container name.");this.containerClient=this.client.getContainerClient(e.containerName)}config;static{C(this,"AzureMetaStorage")}client;containerClient;async get(t){const a=this.containerClient.getAppendBlobClient(this.getMetaName(t));let e;try{e=await a.getProperties()}catch{throw c(l.UNKNOWN_ERROR)}if(!e.metadata)throw c(l.FILE_NOT_FOUND);const n=e.metadata;return n.metadata&&typeof n.metadata=="string"&&(n.metadata=f(n.metadata)),n}async touch(t,a){return this.save(t,a)}async delete(t){await this.containerClient.getBlockBlobClient(this.getMetaName(t)).deleteIfExists()}async save(t,a){const e={...a};return e.metadata&&(e.metadata=g(a.metadata)),await this.containerClient.getAppendBlobClient(this.getMetaName(t)).setMetadata(e,{}),a}async list(){const t=[],a=this.containerClient.listBlobsFlat({prefix:this.prefix});for await(const e of a)t.push(e);return t.filter(e=>e.name.endsWith(this.suffix)).map(e=>({createdAt:e.properties.createdOn,id:this.getIdFromMetaName(e.name)}))}};export{v as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var y=Object.defineProperty;var d=(l,t)=>y(l,"name",{value:t,configurable:!0});import{BlobServiceClient as m,StorageSharedKeyCredential as p}from"@azure/storage-blob";import{L as g}from"./path-D7rMc9nq-B718mbm6.js";import{r as f,d as w,o as b}from"./part-match-DqD5U7An.js";import{throwErrorCode as s,ERRORS as c}from"./ERRORS-B9jkvKwx.js";import{B as C,t as E}from"./storage-m_Cxgiih.js";import{createRetryWrapper as O}from"./isRetryableError-DQNSZiBc.js";import{O as T}from"./local-meta-storage-Bkwqi_gi.js";import N from"./AzureFile-BKHru1zB.js";import R from"./AzureSMetaStorage-BqA4jUDJ.js";import{o as S}from"./has-content-Bx2p8Okx.js";var F=Object.defineProperty,v=d((l,t)=>F(l,"name",{value:t,configurable:!0}),"m");class q extends C{static name="azure";checksumTypes=["md5"];meta;client;containerClient;root;retry;constructor(t){if(super(t),!t.containerName)throw new Error("Missing required parameter: Azure container name.");const e=t.connectionString||process.env.AZURE_STORAGE_CONNECTION_STRING||void 0;if(e)this.client=m.fromConnectionString(e);else{const i=t.accountKey||process.env.AZURE_STORAGE_ACCOUNT_KEY||void 0,n=t.accountName||process.env.AZURE_STORAGE_ACCOUNT||void 0;if(!t.accountKey)throw new Error("Missing required parameter: Azure blob storage account key.");if(!t.accountName)throw new Error("Missing required parameter: Azure blob storage account name.");const a=new p(n,i);this.client=new m(t.endpoint??`https://${n}.blob.core.windows.net`,a)}this.containerClient=this.client.getContainerClient(t.containerName),this.root=t.root?g(t.root).replace(/^\//,""):"";const r={backoffMultiplier:2,initialDelay:1e3,maxDelay:3e4,maxRetries:3,retryableStatusCodes:[408,429,500,502,503,504],shouldRetry:v(i=>{const n=i;if(n.statusCode&&[408,429,500,502,503,504].includes(n.statusCode))return!0;if(i instanceof Error){const a=n.code;if(a==="ECONNRESET"||a==="ETIMEDOUT"||a==="ENOTFOUND"||a==="ECONNREFUSED")return!0}return!1},"shouldRetry"),...t.retryConfig};if(this.retry=O(r),t.metaStorage)this.meta=t.metaStorage;else{let i={...t,...t.metaStorageConfig,logger:this.logger};"directory"in i?(this.logger?.debug("Using local meta storage"),this.meta=new T(i)):(e===i.connectionString&&(i={...i,client:this.client}),this.meta=new R(i))}this.isReady=!1,this.accessCheck().then(()=>{this.isReady=!0}).catch(i=>{this.logger?.error("Storage access check failed: %O",i)})}async create(t){return this.instrumentOperation("create",async()=>{const e={...t};if(t.ttl){const o=typeof t.ttl=="string"?E(t.ttl):t.ttl;o!==void 0&&(e.expiredAt=Date.now()+o)}const r=new N(e);r.name=this.namingFunction(r),await this.validate(r);try{const o=await this.getMeta(r.id);if(o.bytesWritten>=0)return o}catch{}const i=this.containerClient.getBlockBlobClient(this.getFullPath(r.name)),n={};for(const[o,h]of Object.entries(r.metadata||{}))n[o]=JSON.stringify(h);const a=await this.retry(()=>i.uploadData(Buffer.from(""),{blobHTTPHeaders:{blobContentType:r.contentType},metadata:{name:r.name,originalName:r.originalName,...n}}));return a.requestId===void 0?s(c.FILE_ERROR,"azure create upload error"):(r.requestId=a.requestId,r.uri=a._response.headers.get("location"),r.bytesWritten=0,await this.saveMeta(r),r.status="created",await this.onCreate(r),r)})}async delete({id:t}){return this.instrumentOperation("delete",async()=>{const e=await this.getMeta(t);e.status="deleted",await Promise.all([this.deleteMeta(e.id),this.retry(()=>this.containerClient.getBlockBlobClient(this.getFullPath(e.name)).deleteIfExists())]);const r={...e};return await this.onDelete(r),r})}async move(t,e){return this.instrumentOperation("move",async()=>{const r=await this.copy(t,e),i=this.getFullPath(t);return await this.retry(()=>this.containerClient.getBlockBlobClient(i).deleteIfExists()),r})}async write(t){return this.instrumentOperation("write",async()=>{let e;if("contentType"in t&&"metadata"in t&&!("body"in t)&&!("start"in t)?e=t:(e=await this.getMeta(t.id),await this.checkIfExpired(e)),e.status==="completed")return e;if(!f(t,e))return s(c.FILE_CONFLICT);await this.lock(t.id);try{if(S(t)){if((e.bytesWritten===0||Number.isNaN(e.bytesWritten))&&(!e.contentType||e.contentType==="application/octet-stream"))try{const{fileType:a,stream:o}=await w(t.body);a?.mime&&(e.contentType=a.mime),t.body=o}catch{}const r=this.containerClient.getBlockBlobClient(this.getFullPath(e.name)),i=new AbortController;t.body.on("error",()=>{i.abort()});const n=await this.retry(()=>r.uploadStream(t.body,void 0,void 0,{abortSignal:i.signal,blobHTTPHeaders:{blobContentType:e.contentType??"application/octet-stream"},metadata:e.metadata}));if(n.requestId===void 0)return s(c.FILE_ERROR,"azure write upload error");e.requestId=n.requestId,e.bytesWritten+=t.contentLength||0,e.status=b(e),e.status==="completed"&&(e.uri=n._response.headers.get("location"),await this.deleteMeta(e.id))}}finally{await this.unlock(t.id)}return e})}async get({id:t}){return this.instrumentOperation("get",async()=>{const e=this.containerClient.getBlockBlobClient(t);if(!await this.retry(()=>e.exists()))try{return await this.getMeta(t),s(c.GONE)}catch{return s(c.FILE_NOT_FOUND)}const r=await this.retry(()=>e.getProperties()),{contentLength:i,contentType:n,etag:a,expiresOn:o,lastModified:h,metadata:u}=r;return{content:await this.retry(()=>e.downloadToBuffer()),contentType:n,ETag:a,expiredAt:o,id:t,metadata:u||{},modifiedAt:h,name:u?.name||t,originalName:u?.originalName||"",size:i}})}async exists({id:t}){return this.instrumentOperation("exists",async()=>{try{await this.getMeta(t);const e=this.containerClient.getBlockBlobClient(t);return await this.retry(()=>e.exists())}catch{return!1}})}async copy(t,e){return this.instrumentOperation("copy",async()=>{const r=this.containerClient.getBlockBlobClient(this.getFullPath(t));if(!await this.retry(()=>r.exists()))try{return await this.getMeta(t),s(c.GONE)}catch{return s(c.FILE_NOT_FOUND)}const i=this.containerClient.getBlockBlobClient(this.getFullPath(e)),n=await this.retry(()=>i.beginCopyFromURL(r.url));return await this.retry(()=>n.pollUntilDone()),{...await this.getMeta(t),id:e,name:e}})}async list(t=1e3){return this.instrumentOperation("list",async()=>{const e=[];let r=!0,i;for(;r;)try{const n=this.containerClient.listBlobsFlat({includeMetadata:!0,prefix:this.root}).byPage({continuationToken:i,maxPageSize:t}),a=(await this.retry(()=>n.next())).value;a!==void 0&&"segment"in a&&a.segment.blobItems.forEach(o=>{o.deleted||e.push({createdAt:o.properties.createdOn,id:o.name,modifiedAt:o.properties.lastModified})}),r=a?.continuationToken!==void 0,r&&(i=a.continuationToken)}catch(n){const a=this.normalizeError(n instanceof Error?n:new Error(String(n)));throw await this.onError(a),n}return e},{limit:t})}getFullPath(t){return this.assetFolder!==void 0?`${this.assetFolder}/${t}`:t}async accessCheck(){await this.retry(()=>this.containerClient.getProperties())}}export{q as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=Object.defineProperty;var s=(a,t)=>n(a,"name",{value:t,configurable:!0});import{Readable as i}from"node:stream";import c from"mime";import{N as h}from"./cache-qV_5Umeq.js";var f=Object.defineProperty,m=s((a,t)=>f(a,"name",{value:t,configurable:!0}),"n");class C{static{s(this,"l")}constructor(t,e,r){this.storage=t,this.config=e,this.logger=r,this.cache=e.cache??new h}storage;static{m(this,"BaseTransformer")}config;logger;cache;async transformStream(t,e){const r=await this.transform(t,e);if(r&&"buffer"in r){const{buffer:o}=r;return{headers:{"Content-Length":o.length.toString(),"Content-Type":this.getContentTypeFromResult(r)},size:o.length,stream:i.from(o)}}throw new Error("Streaming transformation not supported for this transformer")}clearCache(t){t?this.cache?.delete(t):this.cache?.clear?.()}getCacheStats(){return{maxSize:-1,size:this.cache?.size??0}}getContentTypeFromResult(t){if(t?.format){const e=c.getType(t.format);if(e)return e}return"application/octet-stream"}}export{C as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"node:fs";import"node:fs/promises";import"node:stream";import"./local-meta-storage-Bkwqi_gi.js";import{q as u}from"./disk-storage-BvdK4bqF.js";import"./path-D7rMc9nq-B718mbm6.js";import"./part-match-DqD5U7An.js";import"./ERRORS-B9jkvKwx.js";import"./storage-m_Cxgiih.js";import"./File-alcSNpLq.js";import"./update-size-DANV7aa2.js";import"./has-content-Bx2p8Okx.js";export{u as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var g=Object.defineProperty;var o=(i,t)=>g(i,"name",{value:t,configurable:!0});import{createReadStream as f,createWriteStream as b}from"node:fs";import{truncate as w}from"node:fs/promises";import{Transform as E,pipeline as F}from"node:stream";import{q as C,y as v,m as W,s as R}from"./disk-storage-BvdK4bqF.js";import{y as S}from"./local-meta-storage-Bkwqi_gi.js";import{r as T,d as N,o as O}from"./part-match-DqD5U7An.js";import{throwErrorCode as p,ERRORS as n}from"./ERRORS-B9jkvKwx.js";import{LRUCache as k}from"lru-cache";import{createHash as P}from"node:crypto";import{u as x}from"./update-size-DANV7aa2.js";import{o as M}from"./has-content-Bx2p8Okx.js";var _=Object.defineProperty,I=o((i,t)=>_(i,"name",{value:t,configurable:!0}),"a");class L extends E{static{o(this,"n")}constructor(t,e){super(),this.path=e,this.hashes=t,this.hash=this.hashes.get(e)||P(this.hashes.algorithm),this.hashCopy=this.hash.copy()}path;static{I(this,"RangeChecksum")}hash;hashCopy;hashes;reset(){this.hashes.set(this.path,this.hashCopy)}digest(t="hex"){return this.hash.copy().digest(t)}_transform(t,e,s){this.push(t),this.hash.update(t),s()}_flush(t){t()}}var z=Object.defineProperty,U=o((i,t)=>z(i,"name",{value:t,configurable:!0}),"h");class A extends k{static{o(this,"p")}constructor(t="sha1",e){super({ttl:1e3,ttlAutopurge:!0,...e}),this.algorithm=t}algorithm;static{U(this,"RangeHasher")}hex(t){return this.get(t)?.copy().digest("hex")||""}base64(t){return this.get(t)?.copy().digest("base64")||""}async init(t,e=0){return this.get(t)?.copy()||this.updateFromFs(t,e)}digester(t){return new L(this,t)}async updateFromFs(t,e=0,s){const r=await this.fromFs(t,e,s);return this.set(t,r),r}fromFs(t,e=0,s){return new Promise((r,a)=>{const h=this.digester(t);s!==void 0&&(h.hash=s),f(t,{start:e}).on("error",a).on("end",()=>{r(h.hash)}).pipe(h).resume()})}}var H=Object.defineProperty,l=o((i,t)=>H(i,"name",{value:t,configurable:!0}),"d");class Z extends C{static{o(this,"O")}static{l(this,"DiskStorageWithChecksum")}hashes;constructor(t){super(t),this.hashes=new A(t?.checksum==="sha1"?"sha1":"md5")}async delete({id:t}){try{const e=await this.getMeta(t),s=this.getFilePath(e.name);this.hashes.delete(s),await S(s),await this.deleteMeta(t);const r={...e,status:"deleted"};return await this.onDelete(r),r}catch(e){this.logger?.error("[error]: Could not delete file: %O",e);const s=this.normalizeError(e instanceof Error?e:new Error(String(e)));await this.onError(s)}return{id:t}}async write(t){let e;if("contentType"in t&&"metadata"in t&&!("body"in t)&&!("start"in t)?e=t:(e=await this.getMeta(t.id),await this.checkIfExpired(e)),e.status==="completed")return e;if(t.size!==void 0&&x(e,t.size),!T(t,e))return p(n.FILE_CONFLICT);const s=this.getFilePath(e.name);try{const r=t.start||0;if(await v(s),(e.bytesWritten===0||Number.isNaN(e.bytesWritten))&&(e.bytesWritten=r),await this.hashes.init(s),M(t)){if(this.isUnsupportedChecksum(t.checksumAlgorithm))return p(n.UNSUPPORTED_CHECKSUM_ALGORITHM);if((t.start===0||t.start===void 0)&&(e.bytesWritten===0||Number.isNaN(e.bytesWritten))&&(!e.contentType||e.contentType==="application/octet-stream"))try{const{fileType:m,stream:c}=await N(t.body);m?.mime&&(e.contentType=m.mime),t.body=c}catch{}const[a,h]=await this.lazyWrite({...t,...e});if(h)return await w(s,e.bytesWritten),p(h);typeof a!="number"&&await this.hashes.updateFromFs(s,e.bytesWritten),e.bytesWritten=a}return e.status=O(e),e.hash={algorithm:this.hashes.algorithm,value:this.hashes.hex(s)},e.status==="completed"&&this.hashes.delete(s),await this.saveMeta(e),e}catch(r){await this.hashes.updateFromFs(s,e.bytesWritten);const a=this.normalizeError(r instanceof Error?r:new Error(String(r)));return await this.onError(a),p(n.FILE_ERROR,(typeof a.message=="string"?a.message:String(r))||String(r))}}lazyWrite(t){return new Promise((e,s)=>{const r=this.getFilePath(t.name),a=b(r,{flags:"r+",start:t.start}),h=new W(t.contentLength||Number(t.size)-t.start),m=R(t.checksum,t.checksumAlgorithm),c=this.hashes.digester(r),y=!t.checksum,d=l(u=>{c.reset(),a.close(),e([Number.NaN,u])},"failWithCode");h.on("error",()=>{d(n.FILE_CONFLICT)}),m.on("error",()=>{d(n.CHECKSUM_MISMATCH)}),t.body.on("aborted",()=>{d(y?void 0:n.REQUEST_ABORTED)}),F(t.body,h,m,c,a,u=>{if(u){c.reset(),s(u);return}e([t.start+a.bytesWritten])})})}}export{Z as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var E=Object.defineProperty;var a=(e,o)=>E(e,"name",{value:o,configurable:!0});var c=Object.defineProperty,s=a((e,o)=>c(e,"name",{value:o,configurable:!0}),"s"),l=(e=>(e.BAD_REQUEST="BadRequest",e.CHECKSUM_MISMATCH="ChecksumMismatch",e.FILE_CONFLICT="FileConflict",e.FILE_ERROR="FileError",e.FILE_LOCKED="FileLocked",e.FILE_NOT_ALLOWED="FileNotAllowed",e.FILE_NOT_FOUND="FileNotFound",e.FORBIDDEN="Forbidden",e.GONE="Gone",e.INVALID_FILE_NAME="InvalidFileName",e.INVALID_FILE_SIZE="InvalidFileSize",e.INVALID_RANGE="InvalidRange",e.INVALID_TYPE="Invalidtype",e.METHOD_NOT_ALLOWED="MethodNotAllowed",e.REQUEST_ABORTED="RequestAborted",e.REQUEST_ENTITY_TOO_LARGE="RequestEntityTooLarge",e.STORAGE_BUSY="StorageBusy",e.STORAGE_ERROR="StorageError",e.TOO_MANY_REQUESTS="TooManyRequests",e.UNKNOWN_ERROR="UnknownError",e.UNPROCESSABLE_ENTITY="UnprocessableEntity",e.UNSUPPORTED_CHECKSUM_ALGORITHM="UnsupportedChecksumAlgorithm",e.UNSUPPORTED_MEDIA_TYPE="UnsupportedMediaType",e))(l||{});const d=(()=>{const e={BadRequest:[400,"Bad request"],ChecksumMismatch:[460,"Checksum mismatch"],FileConflict:[409,"File conflict"],FileError:[500,"Something went wrong writing the file"],FileLocked:[423,"File locked"],FileNotAllowed:[403,"File not allowed"],FileNotFound:[404,"Not found"],Forbidden:[403,"Authenticated user is not allowed access"],Gone:[410,"The file for this url no longer exists"],InvalidFileName:[400,"Invalid file name or it cannot be retrieved"],InvalidFileSize:[400,"File size cannot be retrieved"],InvalidRange:[400,"Invalid or missing content-range header"],Invalidtype:[400,'Invalid or missing "content-type" header'],MethodNotAllowed:[405,"Method not allowed"],RequestAborted:[499,"Request aborted"],RequestEntityTooLarge:[413,"Request entity too large"],StorageBusy:[503,"Storage is busy"],StorageError:[503,"Storage error"],TooManyRequests:[429,"Too many requests"],UnknownError:[500,"Something went wrong"],UnprocessableEntity:[422,"Validation failed"],UnsupportedChecksumAlgorithm:[400,"Unsupported checksum algorithm"],UnsupportedMediaType:[415,"Unsupported media type"]},o={};return Object.keys(e).forEach(r=>{const[t,n]=e[r];o[r]={code:r,message:n,statusCode:t}}),o})();class u extends Error{static{a(this,"UploadError")}static{s(this,"UploadError")}name="UploadError";UploadErrorCode="UnknownError";detail;constructor(o="UnknownError",r,t){super(r||o),this.name="UploadError",this.detail=t,Object.values(l).includes(o)&&(this.UploadErrorCode=o)}}const p=s(e=>!!e.UploadErrorCode,"isUploadError"),U=s((e,o)=>{const r=e;let t;r&&typeof r=="string"&&r in d&&(t=d[r]);const n=o||(t?.body&&typeof t.body=="object"&&"message"in t.body?t.body.message:void 0)||t?.message||"UnknownError",i=new u(r,n);throw i.UploadErrorCode=r,typeof o=="string"&&(i.detail=o),i},"throwErrorCode");export{l as ERRORS,d as ErrorMap,u as UploadError,p as isUploadError,U as throwErrorCode};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=Object.defineProperty;var o=(t,i)=>m(t,"name",{value:i,configurable:!0});import p from"@sindresorhus/fnv1a";import{nanoid as f}from"nanoid";var y=Object.defineProperty,a=o((t,i)=>y(t,"name",{value:i,configurable:!0}),"t");const l=a(t=>p(t,{size:64}).toString(16),"hash"),g=a(t=>{if(typeof t.mimeType=="string")return t.mimeType;if(typeof t.type=="string")return t.type;if(typeof t.filetype=="string")return t.filetype},"extractMimeType"),u=a(t=>{if(typeof t.name=="string")return t.name;if(typeof t.title=="string")return t.title;if(typeof t.originalName=="string")return t.originalName;if(typeof t.filename=="string")return t.filename},"extractOriginalName"),d=a(t=>{const{metadata:i,originalName:n,size:e}=t,s=String(i.lastModified??Date.now());return[n,e,s].filter(Boolean).map(String).map(r=>l(r)).join("-")},"generateFileId");class N{static{o(this,"g")}static{a(this,"File")}bytesWritten=Number.NaN;contentType;originalName;id;metadata;name="";size;status;expiredAt;createdAt;modifiedAt;hash;content;ETag;constructor({contentType:i,expiredAt:n,metadata:e,originalName:s,size:r}){this.metadata=e,this.originalName=s||u(e)||(this.id=f()),this.contentType=i||g(e)||"application/octet-stream",this.expiredAt=n,typeof r=="string"||typeof r=="number"?this.size=Number(r):(typeof e.size=="string"||typeof e.size=="number")&&(this.size=Number(e.size)),typeof this.size=="number"&&this.size<=0&&(this.size=void 0),this.id||=d(this)}}export{N as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const o={authScopes:["https://www.googleapis.com/auth/iam","https://www.googleapis.com/auth/cloud-platform","https://www.googleapis.com/auth/devstorage.full_control"],storageAPI:"https://storage.googleapis.com/storage/v1/b",uploadAPI:"https://storage.googleapis.com/upload/storage/v1/b"};export{o as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var t=Object.defineProperty;var a=(e,r)=>t(e,"name",{value:r,configurable:!0});import i from"./File-alcSNpLq.js";var l=Object.defineProperty,o=a((e,r)=>l(e,"name",{value:r,configurable:!0}),"l");class u extends i{static{a(this,"p")}static{o(this,"GCSFile")}GCSUploadURI;uri}export{u as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"node:crypto";import"gaxios";import"google-auth-library";import{E as f}from"./gcs-meta-storage-DXqBZ3Xm.js";import"./MetaStorage-Y4m1dWgd.js";import"./Metadata-B6Ir0KO7.js";import"./GCSConfig-BQ0OpVhe.js";export{f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var g=Object.defineProperty;var d=(c,t)=>g(c,"name",{value:t,configurable:!0});import{randomUUID as f}from"node:crypto";import{request as y}from"gaxios";import{GoogleAuth as w}from"google-auth-library";import{r as C,E,b as R,g as b,d as l}from"./gcs-meta-storage-DXqBZ3Xm.js";import{r as U,d as k,o as $}from"./part-match-DqD5U7An.js";import{throwErrorCode as I,ERRORS as O}from"./ERRORS-B9jkvKwx.js";import{B as S,t as T}from"./storage-m_Cxgiih.js";import{O as v}from"./local-meta-storage-Bkwqi_gi.js";import m from"./GCSConfig-BQ0OpVhe.js";import A from"./GCSFile-CHjX_fJk.js";import{o as B}from"./has-content-Bx2p8Okx.js";var P=Object.defineProperty,j=d((c,t)=>P(c,"name",{value:t,configurable:!0}),"e");class x extends Error{static{d(this,"o")}constructor(t,e,r){super(t),this.code=e,this.config=r}code;config;static{j(this,"FetchError")}name="FetchError"}var G=Object.defineProperty,p=d((c,t)=>G(c,"name",{value:t,configurable:!0}),"m");const q=p(c=>c>=200&&c<300||c===308||c===499,"validateStatus");class Q extends S{static name="gcs";checksumTypes=["md5","crc32c"];meta;bucket;authClient;storageBaseURI;uploadBaseURI;isCustomEndpoint=!1;retryOptions={};useAuthWithCustomEndpoint;userProject;constructor(t){super(t);const e=t.bucket||process.env.GCS_BUCKET;if(!e)throw new Error("GCS bucket is not defined");if(!t.projectId)throw new Error("Sorry, we cannot connect to Cloud Services without a project ID.");this.bucket=e,this.storageBaseURI=`${t.storageAPI||m.storageAPI}/${this.bucket}/o`,this.uploadBaseURI=`${t.uploadAPI||m.uploadAPI}/${this.bucket}/o`,this.isCustomEndpoint=new URL(this.storageBaseURI).hostname!=="storage.googleapis.com";const{retryOptions:r,useAuthWithCustomEndpoint:s,userProject:o}=t;this.userProject=o,this.useAuthWithCustomEndpoint=s||!1,this.retryOptions={...C,...r},t.scopes||=m.authScopes,this.authClient=new w(t);const{bucket:i,metaStorage:n,metaStorageConfig:a,projectId:h}=t;if(n)this.meta=n;else{let u={...t,...a,logger:this.logger};"directory"in u?(this.logger?.debug("Using local meta storage"),this.meta=new v(u)):(i===u.bucket&&h===u.projectId&&(u={...u,authClient:this.authClient}),this.meta=new E(u))}this.isReady=!1,this.accessCheck().then(()=>{this.isReady=!0}).catch(u=>{this.logger?.error("Storage access check failed: %O",u)})}normalizeError(t){if(t.config){const e=+t.code||500;return{code:`GCS${e}`,message:t.message,name:t.name,retryable:e>=499,statusCode:e}}return{code:"GenericUploadError",message:`[${this.constructor.name}] ${t.message}`,name:t.name,statusCode:500}}async create(t){return this.instrumentOperation("create",async()=>{const e={...t};if(t.ttl){const a=typeof t.ttl=="string"?T(t.ttl):t.ttl;a!==void 0&&(e.expiredAt=Date.now()+a)}const r=new A(e);r.name=this.namingFunction(r),await this.validate(r);try{const a=await this.getMeta(r.id);return a.bytesWritten=await this.internalWrite(a),a}catch{}const s={"Content-Type":"application/json; charset=utf-8","X-Goog-Upload-Command":"start","X-Goog-Upload-Protocol":"resumable","X-Upload-Content-Length":r.size.toString(),"X-Upload-Content-Type":r.contentType},o={body:JSON.stringify({metadata:r.metadata}),headers:s,method:"POST",params:{name:r.name,size:r.size,uploadType:"resumable"},url:this.uploadBaseURI},i=await this.makeRequest(o);if(i.status!==200)throw new Error("Expected 200 response from GCS");const n=i.headers.get("X-Goog-Upload-Status")||i.headers.get("x-goog-upload-status");if(n!=="active")throw new Error(`X-Goog-Upload-Status response header expected 'active' got: ${n}`);return r.uri=i.headers.get("location"),this.config.clientDirectUpload?(r.GCSUploadURI=r.uri,this.logger?.debug("send uploadURI to client: %s",r.GCSUploadURI),r.status="created",r):(r.bytesWritten=0,await this.saveMeta(r),r.status="created",await this.onCreate(r),r)})}async write(t){return this.instrumentOperation("write",async()=>{let e;if("contentType"in t&&"metadata"in t&&!("body"in t)&&!("start"in t)?e=t:(e=await this.getMeta(t.id),await this.checkIfExpired(e)),e.status==="completed")return e;if(!U(t,e))return I(O.FILE_CONFLICT);await this.lock(t.id);try{if(B(t)&&(e.bytesWritten===0||Number.isNaN(e.bytesWritten))&&(!e.contentType||e.contentType==="application/octet-stream"))try{const{fileType:r,stream:s}=await k(t.body);r?.mime&&(e.contentType=r.mime),t.body=s}catch{}e.bytesWritten=await this.internalWrite({...e,...t}),e.status=$(e),e.status==="completed"&&(e.uri=`${this.storageBaseURI}/${e.name}`,await this.internalOnComplete(e))}finally{await this.unlock(t.id)}return e})}async delete({id:t}){return this.instrumentOperation("delete",async()=>{const e=await this.getMeta(t);if(!e.uri)throw new Error(`File ${t} does not have a valid URI`);e.status="deleted",await Promise.all([this.makeRequest({method:"DELETE",url:e.uri,validateStatus:q}),this.deleteMeta(e.id)]);const r={...e};return await this.onDelete(r),r})}async copy(t,e){return this.instrumentOperation("copy",async()=>{const r=new URL(`/${this.bucket}/${t}`,"file://"),s=new URL(encodeURI(e),r).pathname,[,o,...i]=s.split("/"),n=i.join("/"),a=`${this.storageBaseURI}/${t}/rewriteTo/b/${o}/o/${n}`;let h={};const u={body:"",headers:{"Content-Type":"application/json"},method:"POST",url:a};do u.body=h.rewriteToken?JSON.stringify({rewriteToken:h.rewriteToken}):"",h=(await this.makeRequest(u)).data||{};while(h.rewriteToken);return await this.getMeta(e)})}async move(t,e){return this.instrumentOperation("move",async()=>{const r=await this.copy(t,e),s=`${this.storageBaseURI}/${t}`;return await this.makeRequest({method:"DELETE",url:s}),r})}async get({id:t}){return this.instrumentOperation("get",async()=>{const{data:e}=await this.makeRequest({params:{alt:"json"},url:`${this.storageBaseURI}/${t}`});if(await this.checkIfExpired({expiredAt:e.timeDeleted}),!e.uri)throw new Error("File URI not found");const r=(await this.makeRequest({params:{alt:"media"},url:e.uri})).data;let s;if(typeof r=="string")s=Buffer.from(r,"utf8");else if(r&&typeof r=="object"&&"data"in r){const o=r.data;s=Buffer.from(o)}else s=Buffer.from(r);return{...e,content:s}})}async exists({id:t}){return this.instrumentOperation("exists",async()=>{try{return await this.getMeta(t),await this.makeRequest({method:"HEAD",url:`${this.storageBaseURI}/${t}`}),!0}catch{return!1}})}async list(t=1e3){return this.instrumentOperation("list",async()=>{const e=[];let r=!0,s={params:{maxResults:t},url:this.storageBaseURI};for(;r;)try{const{data:o}=await this.makeRequest(s);(o?.items||[]).forEach(({name:i,timeCreated:n,updated:a})=>{e.push({createdAt:n,id:i,modifiedAt:a})}),r=o?.nextPageToken!==void 0,r&&(s={...s,params:{...s.params,pageToken:o.nextPageToken}})}catch(o){const i=this.normalizeError(o instanceof Error?o:new Error(String(o)));throw await this.onError(i),o}return e},{limit:t})}async internalWrite(t){const{body:e,bytesWritten:r,size:s,uri:o=""}=t,i=R(t),n={method:"PUT"};if(e?.on){const a=new AbortController;e.on("aborted",()=>{a.abort()}),n.body=e,n.signal=a.signal}n.headers={Accept:"application/json","Content-Range":i,...s===r?{"X-Goog-Upload-Command":"upload, finalize"}:{}};try{const a=await this.makeRequest({url:o,...n});if(a.status===308){const h=a.headers.get("range");return h?b(h):0}if(a.status===200)return this.logger?.debug("uploaded %O",a.data),s;throw new x(String(a.data),`GCS${a.status}`,{uri:o})}catch(a){this.logger?.error(o,a);const h=this.normalizeError(a instanceof Error?a:new Error(String(a)));throw await this.onError(h),a}}internalOnComplete=p(t=>this.deleteMeta(t.id),"internalOnComplete");async makeRequest(t){return typeof t.url=="string"&&(t.url=t.url.replaceAll("/:",":")),t={...t,headers:{"User-Agent":`${l.name}/${l.version}`,"x-goog-api-client":`gl-node/${process.versions.node} gccl/${l.version} gccl-invocation-id/${f()}`},params:{...this.userProject===void 0?{}:{userProject:this.userProject}},retry:!0,retryConfig:this.retryOptions,timeout:6e4},this.isCustomEndpoint&&!this.useAuthWithCustomEndpoint?y(t):this.authClient.request(t)}async accessCheck(){return this.makeRequest({url:this.storageBaseURI.replace("/o","")})}}export{Q as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"node:fs/promises";import"node:os";import{O as f}from"./local-meta-storage-Bkwqi_gi.js";import"./path-D7rMc9nq-B718mbm6.js";import"./ERRORS-B9jkvKwx.js";import"./MetaStorage-Y4m1dWgd.js";import"./Metadata-B6Ir0KO7.js";export{f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var p=Object.defineProperty;var m=(h,e)=>p(h,"name",{value:e,configurable:!0});import{createHash as u}from"node:crypto";import l from"mime";import{N as g}from"./cache-qV_5Umeq.js";import{isKnownContentType as c}from"./isValidMediaType-B-2UKjZx.js";import s from"./ValidationError-D8KKJiKA.js";var v=Object.defineProperty,b=m((h,e)=>v(h,"name",{value:e,configurable:!0}),"h");class F{static{m(this,"v")}constructor(e,t={}){if(this.storage=e,this.logger=t.logger||this.storage.logger,this.config={audioBitrate:128e3,audioCodec:"aac",cache:t.cache??new g,cacheTtl:3600,maxAudioSize:100*1024*1024,maxImageSize:10*1024*1024,maxVideoSize:500*1024*1024,saveTransformedFiles:!1,supportedAudioFormats:[],supportedImageFormats:[],supportedVideoFormats:[],videoBitrate:2e6,videoCodec:"avc",...t},t.ImageTransformer&&((!Array.isArray(this.config.supportedImageFormats)||this.config.supportedImageFormats.length===0)&&(this.config.supportedImageFormats=["jpeg","png","webp","avif","tiff","gif","svg"]),this.imageTransformer=new t.ImageTransformer(this.storage,{cache:this.config.cache,cacheTtl:this.config.cacheTtl,logger:this.logger,maxImageSize:this.config.maxImageSize,supportedFormats:this.config.supportedImageFormats})),t.VideoTransformer&&((!Array.isArray(this.config.supportedVideoFormats)||this.config.supportedVideoFormats.length===0)&&(this.config.supportedVideoFormats=["mp4","webm","mkv","avi","mov","flv","wmv"]),this.videoTransformer=new t.VideoTransformer(this.storage,{cache:this.config.cache,cacheTtl:this.config.cacheTtl,defaultBitrate:this.config.videoBitrate,defaultCodec:this.config.videoCodec,logger:this.logger,maxVideoSize:this.config.maxVideoSize,supportedFormats:this.config.supportedVideoFormats})),t.AudioTransformer&&((!Array.isArray(this.config.supportedAudioFormats)||this.config.supportedAudioFormats.length===0)&&(this.config.supportedAudioFormats=["mp3","wav","ogg","aac","flac","m4a","wma","aiff"]),this.audioTransformer=new t.AudioTransformer(this.storage,{cache:this.config.cache,cacheTtl:this.config.cacheTtl,defaultBitrate:this.config.audioBitrate,defaultCodec:this.config.audioCodec,logger:this.logger,maxAudioSize:this.config.maxAudioSize,supportedFormats:this.config.supportedAudioFormats})),t.AudioTransformer===void 0&&t.ImageTransformer===void 0&&t.VideoTransformer===void 0)throw new Error("MediaTransformer initialization failed: No transformers are configured. At least one transformer (AudioTransformer, ImageTransformer, or VideoTransformer) must be provided in the configuration to enable media processing functionality.")}storage;static{b(this,"MediaTransformer")}imageTransformer;videoTransformer;audioTransformer;config;logger;supportedFormats(){return[...this.config.supportedAudioFormats,...this.config.supportedImageFormats,...this.config.supportedVideoFormats]}async handle(e,t){const a=this.parseQuery(t),r={id:e},o=await this.storage.get(r),i=this.detectMediaType(o.contentType);if(this.validateQueryParameters(a,i),this.config.saveTransformedFiles&&this.hasTransformations(a)){const d=this.generateTransformedFileId(e,a,i);try{const f=await this.storage.get({id:d});return this.logger?.debug?.(`Serving cached transformed file: ${d}`),this.createMediaTransformResult(f,i,o)}catch{this.logger?.debug?.(`Transformed file not found, processing: ${d}`)}}let n;switch(i){case"audio":{if(!this.audioTransformer)throw new Error("Audio transformer not available. Please install audio transformation dependencies or provide an audio transformer instance.");n=await this.handleAudioTransformation(e,a);break}case"image":{if(!this.imageTransformer)throw new Error("Image transformer not available. Please install image transformation dependencies or provide an image transformer instance.");n=await this.handleImageTransformation(e,a);break}case"video":{if(!this.videoTransformer)throw new Error("Video transformer not available. Please install video transformation dependencies or provide a video transformer instance.");n=await this.handleVideoTransformation(e,a);break}default:throw new Error(`Unsupported media type: ${o.contentType}`)}return this.config.saveTransformedFiles&&this.hasTransformations(a)&&await this.saveTransformedFile(n,e,a,i),n}async fetch(e,t){const a=new URLSearchParams(t);return this.handle(e,a)}clearCache(e){this.imageTransformer?.clearCache(e),this.videoTransformer?.clearCache(e),this.audioTransformer?.clearCache(e)}async clearSavedTransformedFiles(){if(this.config.saveTransformedFiles)try{this.logger?.warn?.("clearSavedTransformedFiles requires custom storage implementation to find and delete transformed files")}catch(e){this.logger?.error?.(`Failed to clear saved transformed files: ${e}`)}}async clearSavedTransformedFilesForFile(e){if(this.config.saveTransformedFiles)try{this.logger?.warn?.("clearSavedTransformedFilesForFile requires custom storage implementation")}catch(t){this.logger?.error?.(`Failed to clear saved transformed files for ${e}: ${t}`)}}getCacheStats(){const e={audio:this.audioTransformer?.getCacheStats(),image:this.imageTransformer?.getCacheStats(),video:this.videoTransformer?.getCacheStats()};return e.image===void 0&&delete e.image,e.video===void 0&&delete e.video,e.audio===void 0&&delete e.audio,e}validateQueryParameters(e,t){switch(t){case"audio":{this.validateAudioQueryParameters(e);break}case"image":{this.validateImageQueryParameters(e);break}case"video":{this.validateVideoQueryParameters(e);break}}}validateImageQueryParameters(e){const t=new Set(["alphaQuality","angle","background","bandbool","blur","boolean","brightness","channel","clahe","colourspace","compressionLevel","convolve","cropHeight","cropWidth","delay","dilate","effort","erode","extractChannel","fastShrinkOnLoad","fit","flatten","flip","flop","format","frameRate","gamma","grayscale","greyscale","height","hue","joinChannel","kernel","left","lightness","linear","loop","maxSlope","median","modulate","negate","normalise","normalize","position","quality","recombine","saturation","sharpen","threshold","tint","top","unflatten","width","withoutEnlargement","withoutReduction"]),a=new Set(["bitrate","codec","frameRate","keyFrameInterval","numberOfChannels","sampleRate"]),r=[];for(const n of a)e[n]!==void 0&&r.push(n);if(r.length>0){const n=[...r].toSorted();throw new s(`Invalid query parameters for image transformation: ${n.join(", ")}. Images support: ${[...t].toSorted().join(", ")}. Video/audio parameters (${n.join(", ")}) are not supported for images.`,"INVALID_PARAMS_FOR_IMAGE","image",n,[...t].toSorted())}if(e.fit&&!["contain","cover","fill","inside","outside"].includes(e.fit))throw new s(`Invalid fit value: "${e.fit}". Supported values: "cover", "contain", "fill", "inside", "outside"`,"INVALID_FIT_VALUE","image",["fit"],["cover","contain","fill","inside","outside"]);if(e.format&&!["avif","gif","jpeg","png","tiff","webp"].includes(e.format))throw new s(`Invalid format for image: "${e.format}". Supported formats: jpeg, png, webp, avif, tiff, gif`,"INVALID_FORMAT","image",["format"],["jpeg","png","webp","avif","tiff","gif"]);const o=["left","top","cropWidth","cropHeight"],i=o.filter(n=>e[n]!==void 0);if(i.length>0&&i.length!==o.length)throw new s(`Incomplete crop parameters: ${i.join(", ")}. All crop parameters must be provided: left, top, cropWidth, cropHeight`,"INCOMPLETE_CROP_PARAMS","image",i,o)}validateVideoQueryParameters(e){const t=new Set(["angle","background","bitrate","codec","cropHeight","cropWidth","fit","format","frameRate","height","keyFrameInterval","left","position","quality","top","width","withoutEnlargement","withoutReduction"]),a=new Set(["numberOfChannels","sampleRate"]),r=[];for(const n of a)e[n]!==void 0&&r.push(n);if(r.length>0){const n=[...r].toSorted();throw new s(`Invalid query parameters for video transformation: ${n.join(", ")}. Videos support: ${[...t].toSorted().join(", ")}. Audio-only parameters (${n.join(", ")}) are not supported for videos.`,"INVALID_PARAMS_FOR_VIDEO","video",n,[...t].toSorted())}if(e.fit&&!["contain","cover","fill","inside","outside"].includes(e.fit))throw new s(`Invalid fit value: "${e.fit}". Supported values: "cover", "contain", "fill", "inside", "outside"`,"INVALID_FIT_VALUE","video",["fit"],["cover","contain","fill","inside","outside"]);if(e.codec&&!["av1","avc","hevc","vp8","vp9"].includes(e.codec))throw new s(`Invalid codec for video: "${e.codec}". Supported codecs: avc, hevc, vp8, vp9, av1`,"INVALID_VIDEO_CODEC","video",["codec"],["avc","hevc","vp8","vp9","av1"]);if(e.format&&!["mkv","mp4","ogg","webm"].includes(e.format))throw new s(`Invalid format for video: "${e.format}". Supported formats: mp4, webm, mkv, ogg`,"INVALID_VIDEO_FORMAT","video",["format"],["mp4","webm","mkv","ogg"]);const o=["left","top","cropWidth","cropHeight"],i=o.filter(n=>e[n]!==void 0);if(i.length>0&&i.length!==o.length)throw new s(`Incomplete crop parameters: ${i.join(", ")}. All crop parameters must be provided: left, top, cropWidth, cropHeight`,"INCOMPLETE_CROP_PARAMS","video",i,o);if(e.width!==void 0&&(typeof e.width!="number"||e.width<=0))throw new s(`Invalid width: ${e.width}. Must be a positive number.`,"INVALID_WIDTH","video",["width"],[]);if(e.height!==void 0&&(typeof e.height!="number"||e.height<=0))throw new s(`Invalid height: ${e.height}. Must be a positive number.`,"INVALID_HEIGHT","video",["height"],[]);if(e.bitrate!==void 0&&(typeof e.bitrate!="number"||e.bitrate<=0))throw new s(`Invalid bitrate: ${e.bitrate}. Must be a positive number.`,"INVALID_BITRATE","video",["bitrate"],[]);if(e.frameRate!==void 0&&(typeof e.frameRate!="number"||e.frameRate<=0))throw new s(`Invalid frameRate: ${e.frameRate}. Must be a positive number.`,"INVALID_FRAME_RATE","video",["frameRate"],[]);if(e.keyFrameInterval!==void 0&&(typeof e.keyFrameInterval!="number"||e.keyFrameInterval<=0))throw new s(`Invalid keyFrameInterval: ${e.keyFrameInterval}. Must be a positive number.`,"INVALID_KEY_FRAME_INTERVAL","video",["keyFrameInterval"],[])}generateTransformedFileId(e,t,a){const r=Object.keys(t).filter(n=>t[n]!==void 0).toSorted().map(n=>`${n}:${t[n]}`).join("|"),o=`${e}|${a}|${r}`,i=u("sha256").update(o).digest("hex").slice(0,16);return`${e}_transformed_${i}`}hasTransformations(e){return this.hasImageTransformations(e)||this.hasVideoTransformations(e)||this.hasAudioTransformations(e)}createMediaTransformResult(e,t,a){const r={buffer:e.content,format:this.getFormatFromContentType(e.contentType||""),mediaType:t,originalFile:a,size:e.content.length};switch(t){case"audio":return{...r,bitrate:e.bitrate,duration:e.duration,mediaType:"audio",numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate};case"image":return{...r,height:e.height,mediaType:"image",width:e.width};case"video":return{...r,bitrate:e.bitrate,duration:e.duration,height:e.height,mediaType:"video",width:e.width};default:return r}}getFormatFromContentType(e){return e?l.getExtension(e)||"application/octet-stream":""}async saveTransformedFile(e,t,a,r){try{const o=this.generateTransformedFileId(t,a,r),i={format:e.format,mediaType:r,originalFileId:t,size:e.size,transformation:a,transformedAt:new Date().toISOString()};r==="image"&&e.width&&e.height?(i.width=e.width,i.height=e.height):r==="video"&&e.width&&e.height?(i.width=e.width,i.height=e.height,i.duration=e.duration,i.bitrate=e.bitrate):r==="audio"&&(i.duration=e.duration,i.numberOfChannels=e.numberOfChannels,i.sampleRate=e.sampleRate,i.bitrate=e.bitrate),await this.storage.create({contentType:l.getType(e.format)??void 0,metadata:i,originalName:`${o}.${e.format}`,size:e.size}),this.logger?.debug?.(`Saved transformed file: ${o}`)}catch(o){this.logger?.error?.(`Failed to save transformed file: ${o}`)}}validateAudioQueryParameters(e){const t=new Set(["bitrate","codec","format","numberOfChannels","quality","sampleRate"]),a=new Set(["angle","background","cropHeight","cropWidth","fit","frameRate","height","keyFrameInterval","left","position","top","width","withoutEnlargement","withoutReduction"]),r=[];for(const o of a)e[o]!==void 0&&r.push(o);if(r.length>0){const o=[...r].toSorted();throw new s(`Invalid query parameters for audio transformation: ${o.join(", ")}. Audio supports: ${[...t].toSorted().join(", ")}. Video-only parameters (${o.join(", ")}) are not supported for audio.`,"INVALID_PARAMS_FOR_AUDIO","audio",o,[...t].toSorted())}if(e.codec&&!["aac","flac","mp3","opus","vorbis"].includes(e.codec))throw new s(`Invalid codec for audio: "${e.codec}". Supported codecs: aac, opus, mp3, vorbis, flac`,"INVALID_AUDIO_CODEC","audio",["codec"],["aac","opus","mp3","vorbis","flac"]);if(e.format&&!["aac","flac","mp3","ogg","wav"].includes(e.format))throw new s(`Invalid format for audio: "${e.format}". Supported formats: mp3, wav, ogg, aac, flac`,"INVALID_AUDIO_FORMAT","audio",["format"],["mp3","wav","ogg","aac","flac"]);if(e.bitrate!==void 0&&(typeof e.bitrate!="number"||e.bitrate<=0))throw new s(`Invalid bitrate: ${e.bitrate}. Must be a positive number.`,"INVALID_BITRATE","audio",["bitrate"],[]);if(e.numberOfChannels!==void 0&&(typeof e.numberOfChannels!="number"||e.numberOfChannels<=0||e.numberOfChannels>8))throw new s(`Invalid numberOfChannels: ${e.numberOfChannels}. Must be a number between 1 and 8.`,"INVALID_CHANNEL_COUNT","audio",["numberOfChannels"],["1","2","3","4","5","6","7","8"]);if(e.sampleRate!==void 0){const o=[8e3,11025,16e3,22050,32e3,44100,48e3,88200,96e3,192e3];if(typeof e.sampleRate!="number"||!o.includes(e.sampleRate))throw new s(`Invalid sampleRate: ${e.sampleRate}. Supported sample rates: ${o.join(", ")}`,"INVALID_SAMPLE_RATE","audio",["sampleRate"],o.map(String))}}async handleImageTransformation(e,t){const a=[];this.hasImageTransformations(t)&&((t.width||t.height||t.fit)&&a.push({options:{fit:t.fit,height:t.height,position:t.position,width:t.width,withoutEnlargement:t.withoutEnlargement,withoutReduction:t.withoutReduction},type:"resize"}),t.left!==void 0&&t.top!==void 0&&t.cropWidth&&t.cropHeight&&a.push({options:{height:t.cropHeight,left:t.left,top:t.top,width:t.cropWidth},type:"crop"}),t.angle&&a.push({options:{angle:t.angle,background:t.background},type:"rotate"}),t.format?a.push({options:{format:t.format,quality:t.quality},type:"format"}):t.quality&&a.push({options:{quality:t.quality},type:"quality"}));const r=a.length>0?await this.imageTransformer.transform(e,a):await this.imageTransformer.transform(e,[]);return this.convertImageResult(r)}async handleVideoTransformation(e,t){const a=[];this.hasVideoTransformations(t)&&((t.width||t.height||t.fit)&&a.push({options:{fit:t.fit,height:t.height,position:t.position,width:t.width,withoutEnlargement:t.withoutEnlargement,withoutReduction:t.withoutReduction},type:"resize"}),t.left!==void 0&&t.top!==void 0&&t.cropWidth&&t.cropHeight&&a.push({options:{height:Number(t.cropHeight),left:t.left,top:t.top,width:t.cropWidth},type:"crop"}),t.angle&&a.push({options:{angle:t.angle,background:t.background},type:"rotate"}),(t.codec||t.bitrate)&&a.push({options:{bitrate:t.bitrate||t.quality,codec:t.codec,frameRate:t.frameRate,keyFrameInterval:t.keyFrameInterval},type:"codec"}),t.format&&a.push({options:{format:t.format},type:"format"}));const r=a.length>0?await this.videoTransformer.transform(e,a):await this.videoTransformer.transform(e,[]);return this.convertVideoResult(r)}async handleAudioTransformation(e,t){const a=[];this.hasAudioTransformations(t)&&(t.sampleRate&&a.push({options:{sampleRate:t.sampleRate},type:"resample"}),t.numberOfChannels&&a.push({options:{numberOfChannels:t.numberOfChannels},type:"channels"}),(t.codec||t.bitrate)&&a.push({options:{bitrate:t.bitrate||t.quality,codec:t.codec},type:"codec"}),t.format&&a.push({options:{format:t.format},type:"format"}));const r=a.length>0?await this.audioTransformer.transform(e,a):await this.audioTransformer.transform(e,[]);return this.convertAudioResult(r)}parseQuery(e){if(typeof e=="string")return this.parseURLSearchParams(new URLSearchParams(e));if(e instanceof URLSearchParams)return this.parseURLSearchParams(e);const t=e;return e.left&&(t.left=Number.parseInt(e.left,10)),e.top&&(t.top=Number.parseInt(e.top,10)),e.cropWidth&&(t.cropWidth=Number.parseInt(e.cropWidth,10)),e.cropHeight&&(t.cropHeight=Number.parseInt(e.cropHeight,10)),e.angle&&(t.angle=Number.parseInt(e.angle,10)),e.quality&&(t.quality=Number.parseInt(e.quality,10)),e.width&&(t.width=Number.parseInt(e.width,10)),e.height&&(t.height=Number.parseInt(e.height,10)),e.bitrate&&(t.bitrate=Number.parseInt(e.bitrate,10)),e.frameRate&&(t.frameRate=Number.parseInt(e.frameRate,10)),e.keyFrameInterval&&(t.keyFrameInterval=Number.parseInt(e.keyFrameInterval,10)),e.numberOfChannels&&(t.numberOfChannels=Number.parseInt(e.numberOfChannels,10)),e.sampleRate&&(t.sampleRate=Number.parseInt(e.sampleRate,10)),t}parseBooleanParameter(e){if(e!==null)return e==="true"||e==="1"}parseURLSearchParams(e){const t={};if(e.has("format")&&(t.format=e.get("format")??void 0),e.has("quality")&&(t.quality=e.get("quality")?Number.parseInt(e.get("quality"),10):void 0),e.has("width")&&(t.width=e.get("width")?Number.parseInt(e.get("width"),10):void 0),e.has("height")&&(t.height=e.get("height")?Number.parseInt(e.get("height"),10):void 0),e.has("fit")){const a=e.get("fit");a&&["contain","cover","fill","inside","outside"].includes(a)&&(t.fit=a)}if(e.has("position")&&(t.position=e.get("position")??void 0),e.has("withoutEnlargement")){const a=e.get("withoutEnlargement");t.withoutEnlargement=a==="true"?!0:void 0}if(e.has("withoutReduction")){const a=e.get("withoutReduction");t.withoutReduction=a==="true"?!0:void 0}if(e.has("left")&&(t.left=e.get("left")?Number.parseInt(e.get("left"),10):void 0),e.has("top")&&(t.top=e.get("top")?Number.parseInt(e.get("top"),10):void 0),e.has("cropWidth")&&(t.cropWidth=e.get("cropWidth")?Number.parseInt(e.get("cropWidth"),10):void 0),e.has("cropHeight")&&(t.cropHeight=e.get("cropHeight")?Number.parseInt(e.get("cropHeight"),10):void 0),e.has("angle")){const a=e.get("angle")?Number.parseInt(e.get("angle"),10):void 0;a!==void 0&&(t.angle=a)}if(e.has("background")&&(t.background=e.get("background")??void 0),e.has("blur")&&(t.blur=this.parseBooleanParameter(e.get("blur"))),e.has("sharpen")&&(t.sharpen=this.parseBooleanParameter(e.get("sharpen"))),e.has("median")&&(t.median=e.get("median")?Number.parseInt(e.get("median"),10):void 0),e.has("clahe")&&(t.clahe=this.parseBooleanParameter(e.get("clahe"))),e.has("threshold")&&(t.threshold=e.get("threshold")?Number.parseInt(e.get("threshold"),10):void 0),e.has("gamma")&&(t.gamma=this.parseBooleanParameter(e.get("gamma"))),e.has("negate")&&(t.negate=this.parseBooleanParameter(e.get("negate"))),(e.has("normalise")||e.has("normalize"))&&(t.normalise=this.parseBooleanParameter(e.get("normalise"))||this.parseBooleanParameter(e.get("normalize"))),e.has("flatten")&&(t.flatten=this.parseBooleanParameter(e.get("flatten"))),e.has("unflatten")&&(t.unflatten=this.parseBooleanParameter(e.get("unflatten"))),e.has("flip")&&(t.flip=this.parseBooleanParameter(e.get("flip"))),e.has("flop")&&(t.flop=this.parseBooleanParameter(e.get("flop"))),e.has("affine")&&(t.affine=this.parseBooleanParameter(e.get("affine"))),e.has("dilate")&&(t.dilate=this.parseBooleanParameter(e.get("dilate"))),e.has("erode")&&(t.erode=this.parseBooleanParameter(e.get("erode"))),e.has("pipelineColourspace")&&(t.pipelineColourspace=this.parseBooleanParameter(e.get("pipelineColourspace"))),e.has("toColourspace")&&(t.toColourspace=this.parseBooleanParameter(e.get("toColourspace"))),e.has("removeAlpha")&&(t.removeAlpha=this.parseBooleanParameter(e.get("removeAlpha"))),e.has("ensureAlpha")&&(t.ensureAlpha=this.parseBooleanParameter(e.get("ensureAlpha"))),(e.has("greyscale")||e.has("grayscale"))&&(t.greyscale=this.parseBooleanParameter(e.get("greyscale"))||this.parseBooleanParameter(e.get("grayscale"))),e.has("modulate")&&(t.modulate=this.parseBooleanParameter(e.get("modulate"))),e.has("tint")&&(t.tint=this.parseBooleanParameter(e.get("tint"))),e.has("brightness")&&(t.brightness=e.get("brightness")?Number.parseFloat(e.get("brightness")):void 0),e.has("saturation")&&(t.saturation=e.get("saturation")?Number.parseFloat(e.get("saturation")):void 0),e.has("hue")&&(t.hue=e.get("hue")?Number.parseInt(e.get("hue"),10):void 0),e.has("lightness")&&(t.lightness=e.get("lightness")?Number.parseInt(e.get("lightness"),10):void 0),e.has("kernel")&&(t.kernel=e.get("kernel")??void 0),e.has("fastShrinkOnLoad")&&(t.fastShrinkOnLoad=e.get("fastShrinkOnLoad")==="true"),e.has("codec")){const a=e.get("codec");a&&["avc","hevc","vp8","vp9","av1","aac","opus","mp3","vorbis","flac"].includes(a)&&(t.codec=a)}return e.has("bitrate")&&(t.bitrate=e.get("bitrate")?Number.parseInt(e.get("bitrate"),10):void 0),e.has("frameRate")&&(t.frameRate=e.get("frameRate")?Number.parseInt(e.get("frameRate"),10):void 0),e.has("keyFrameInterval")&&(t.keyFrameInterval=e.get("keyFrameInterval")?Number.parseInt(e.get("keyFrameInterval"),10):void 0),e.has("numberOfChannels")&&(t.numberOfChannels=e.get("numberOfChannels")?Number.parseInt(e.get("numberOfChannels"),10):void 0),e.has("sampleRate")&&(t.sampleRate=e.get("sampleRate")?Number.parseInt(e.get("sampleRate"),10):void 0),t}detectMediaType(e){if(!e)throw new Error("Cannot detect media type: no content type provided");if(!c(e))throw new Error(`Unknown or invalid content type: ${e}`);if(e.startsWith("image/"))return"image";if(e.startsWith("video/"))return"video";if(e.startsWith("audio/"))return"audio";throw new Error(`Unsupported media type for content type: ${e}`)}hasImageTransformations(e){return!!(e.width||e.height||e.fit||e.position||e.withoutEnlargement||e.withoutReduction||e.left!==void 0||e.top!==void 0||e.cropWidth||e.cropHeight||e.angle!==void 0||e.background||e.blur||e.sharpen||e.median||e.clahe||e.threshold!==void 0||e.gamma||e.negate||e.normalise||e.flatten||e.unflatten||e.flip||e.flop||e.greyscale||e.modulate||e.tint||e.brightness!==void 0||e.saturation!==void 0||e.hue!==void 0||e.lightness!==void 0||e.kernel||e.fastShrinkOnLoad||e.affine||e.dilate||e.erode||e.pipelineColourspace||e.toColourspace||e.removeAlpha||e.ensureAlpha||e.format||e.quality)}hasVideoTransformations(e){return!!(e.width||e.height||e.fit||e.position||e.withoutEnlargement||e.withoutReduction||e.left!==void 0||e.top!==void 0||e.cropWidth||e.cropHeight||e.angle||e.background||e.codec||e.bitrate||e.frameRate||e.keyFrameInterval||e.format||e.quality)}hasAudioTransformations(e){return!!(e.sampleRate||e.numberOfChannels||e.codec||e.bitrate||e.format||e.quality)}convertImageResult(e){return{buffer:e.buffer,format:e.format,height:e.height,mediaType:"image",originalFile:e.originalFile,size:e.size,width:e.width}}convertVideoResult(e){return{bitrate:e.bitrate,buffer:e.buffer,duration:e.duration,format:e.format,height:e.height,mediaType:"video",originalFile:e.originalFile,size:e.size,width:e.width}}convertAudioResult(e){return{bitrate:e.bitrate,buffer:e.buffer,duration:e.duration,format:e.format,mediaType:"audio",numberOfChannels:e.numberOfChannels,originalFile:e.originalFile,sampleRate:e.sampleRate,size:e.size}}}export{F as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var r=(t,e)=>s(t,"name",{value:e,configurable:!0});var o=Object.defineProperty,a=r((t,e)=>o(t,"name",{value:e,configurable:!0}),"r");class f{static{r(this,"o")}static{a(this,"MetaStorage")}prefix="";suffix="";logger;constructor(e){this.prefix=e?.prefix??"",this.suffix=e?.suffix??".META",this.logger=e?.logger}async save(e,i){return i}async delete(e){throw new Error("Not implemented")}async get(e){throw new Error("Not implemented")}async touch(e,i){throw new Error("Not implemented")}getMetaName(e){return this.prefix+e+this.suffix}getIdFromMetaName(e){return e.slice(this.prefix.length,-this.suffix.length)}}export{f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var u=Object.defineProperty;var l=(e,t)=>u(e,"name",{value:t,configurable:!0});var d=Object.defineProperty,p=l((e,t)=>d(e,"name",{value:t,configurable:!0}),"o");const c=p(e=>e!==null&&typeof e=="object"&&!Array.isArray(e),"isRecord");var g=Object.defineProperty,n=l((e,t)=>g(e,"name",{value:t,configurable:!0}),"i");const y=" ".codePointAt(0)??32,m=",".codePointAt(0)??44,v=/^[\d+/A-Z]*={0,2}$/i,b=n(e=>{if(typeof e!="string")return!1;const t=Number.parseFloat(e);return!Number.isNaN(t)&&Number.isFinite(t)},"isNumeric");class j{static{l(this,"Metadata")}static{n(this,"Metadata")}psize;pname;pfiletype;ptype;pmimeType;pcontentType;ptitle;pfilename;poriginalName;plastModified}const A=n(e=>c(e),"isMetadata"),h=n(e=>{if(e.length===0)return!1;for(let t=0;t<e.length;t+=1){const a=e.codePointAt(t);if(a>127||a===y||a===m)return!1}return!0},"validateKey"),M=n(e=>e.length%4!==0?!1:v.test(e),"validateValue"),O=n(e=>Object.entries(e).map(([t,a])=>{if(a==null)return t;const i=typeof a=="object"?JSON.stringify(a):String(a),o=Buffer.from(i,"utf8").toString("base64");return`${t} ${o}`}).join(","),"stringifyMetadata"),P=n(e=>{const t={};if(!e||e.trim().length===0)throw new Error("Metadata string is not valid");for(const a of e.split(",")){const i=a.split(" "),[o,f]=i;if((i.length===1||i.length===2)&&h(o)&&(i.length===1||M(f))&&!(o in t)){let r="";i.length===1?r=void 0:f&&(r=Buffer.from(f,"base64").toString("utf8"));let s=r;if(r!==void 0)try{s=JSON.parse(r)}catch{r==="true"?s=!0:r==="false"?s=!1:b(r)&&(s=Number(r))}t[o]=s}else throw new Error("Metadata string is not valid")}return t},"parseMetadata");export{j as Metadata,A as isMetadata,P as parseMetadata,O as stringifyMetadata,h as validateKey,M as validateValue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var h=Object.defineProperty;var d=(s,t)=>h(s,"name",{value:t,configurable:!0});import{Readable as o}from"node:stream";import{parseMultipartRequest as c,MaxFileSizeExceededError as p,MultipartParseError as f}from"@remix-run/multipart-parser";import{n as i}from"./headers-DC2MEOrK.js";import{d as g}from"./validator-DK41xp8N.js";import{O as x}from"./base-handler-fetch-DnarP64X.js";import{F as S}from"./multipart-base-C6OjBwMS.js";var y=Object.defineProperty,l=d((s,t)=>y(s,"name",{value:t,configurable:!0}),"l");const w=/^multipart\/.+|application\/x-www-form-urlencoded$/i,z=l(s=>{try{const t=new URL(s).pathname.split("/").filter(Boolean);return t[t.length-1]||void 0}catch{return}},"getIdFromRequestUrl");class m extends x{static{d(this,"d")}static{l(this,"Multipart")}static methods=["delete","download","get","options","post"];multipartBase;maxFileSize;maxHeaderSize;constructor(t){super(t),this.maxFileSize=t.maxFileSize??Math.min(this.storage.maxUploadSize,1024*1024*1024),this.maxHeaderSize=t.maxHeaderSize??64*1024;const r=this;this.multipartBase=new class extends S{get storage(){return r.storage}get maxFileSize(){return r.maxFileSize}get maxHeaderSize(){return r.maxHeaderSize}buildFileUrl(e,a){return r.buildFileUrl({url:e},a)}createStreamFromBytes(e){return e instanceof Uint8Array?o.from(Buffer.from(e)):e instanceof ArrayBuffer?o.from(Buffer.from(e)):o.from(new Uint8Array(0))}createEmptyStream(){return o.from(new Uint8Array(0))}}}async post(t){const r=t.headers.get("content-type")||"";if(!w.test(r.split(";")[0]||""))throw i(400,"Invalid content-type");try{const e=[];for await(const n of c(t,{maxFileSize:this.maxFileSize,maxHeaderSize:this.maxHeaderSize}))e.push(n);const a=e.find(n=>n.isFile);if(!a)throw i(400,"No file found in multipart request");const u=t.url;return this.multipartBase.handlePost(a,e,u)}catch(e){throw e instanceof p?i(413,"File size limit exceeded"):e instanceof f?i(400,"Invalid multipart request"):e instanceof g&&e.statusCode?i(e.statusCode,e.message||e.body||"Validation failed"):e}}async delete(t){const r=z(t.url);if(!r)throw i(404,"File not found");try{return this.multipartBase.handleDelete(r)}catch(e){throw e.code==="ENOENT"?i(404,"File not found"):e}}async options(t){return{headers:{"Access-Control-Allow-Methods":(this.constructor.methods||m.methods).map(r=>r.toUpperCase()).join(", ")},statusCode:204}}async get(t){throw i(500,"GET requests should be handled via fetch() method")}compose(){this.registeredHandlers.set("POST",this.post.bind(this)),this.registeredHandlers.set("DELETE",this.delete.bind(this)),this.registeredHandlers.set("GET",this.get.bind(this)),this.registeredHandlers.set("OPTIONS",this.options.bind(this)),this.logger?.debug("Registered handler: %s",[...this.registeredHandlers.keys()].join(", "))}}export{m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var l=Object.defineProperty;var d=(s,t)=>l(s,"name",{value:t,configurable:!0});import{Readable as a}from"node:stream";import{parseMultipartRequest as m,MaxFileSizeExceededError as u,MultipartParseError as f}from"@remix-run/multipart-parser/node";import{n as i}from"./headers-DC2MEOrK.js";import{g as h}from"./base-handler-core-DaggCVsq.js";import{d as c}from"./validator-DK41xp8N.js";import{F as p}from"./base-handler-node-BTes6sql.js";import{F as g}from"./multipart-base-C6OjBwMS.js";var x=Object.defineProperty,F=d((s,t)=>x(s,"name",{value:t,configurable:!0}),"d");const S=/^multipart\/.+|application\/x-www-form-urlencoded$/i;class O extends p{static{d(this,"x")}static{F(this,"Multipart")}static methods=["delete","download","get","options","post"];multipartBase;maxFileSize;maxHeaderSize;constructor(t){super(t),this.maxFileSize=t.maxFileSize??Math.min(this.storage.maxUploadSize,1024*1024*1024),this.maxHeaderSize=t.maxHeaderSize??64*1024;const e=this;this.multipartBase=new class extends g{get storage(){return e.storage}get maxFileSize(){return e.maxFileSize}get maxHeaderSize(){return e.maxHeaderSize}buildFileUrl(r,o){return e.buildFileUrl({url:r},o)}createStreamFromBytes(r){return r instanceof Uint8Array||Buffer.isBuffer(r)?a.from(Buffer.from(r)):typeof r=="number"?a.from(Buffer.alloc(0)):a.from(Buffer.from(String(r)))}createEmptyStream(){return a.from(new Uint8Array(0))}}}async post(t){if(!S.test(t.headers["content-type"]?.split(";")[0]??""))throw i(400,"Invalid content-type");try{const e=[];for await(const n of m(t,{maxFileSize:this.maxFileSize,maxHeaderSize:this.maxHeaderSize}))e.push(n);const r=e.find(n=>n.isFile);if(!r)throw i(400,"No file found in multipart request");const o=t.originalUrl||t.url||"";return this.multipartBase.handlePost(r,e,o)}catch(e){throw e instanceof u?i(413,"File size limit exceeded"):e instanceof f?i(400,"Invalid multipart request"):e instanceof c&&e.statusCode?i(e.statusCode,e.message||e.body||"Validation failed"):e}}async delete(t){try{const e=h(t);return this.multipartBase.handleDelete(e)}catch(e){throw this.checkForUndefinedIdOrPath(e),e.code==="ENOENT"?i(404,"File not found"):e}}compose(){this.registeredHandlers.set("POST",this.post.bind(this)),this.registeredHandlers.set("DELETE",this.delete.bind(this)),this.registeredHandlers.set("GET",this.get.bind(this)),this.registeredHandlers.set("OPTIONS",this.options.bind(this)),this.logger?.debug("Registered handler: %s",[...this.registeredHandlers.keys()].join(", "))}}export{O as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var r=Object.defineProperty;var a=(e,t)=>r(e,"name",{value:t,configurable:!0});import l from"./File-alcSNpLq.js";var i=Object.defineProperty,o=a((e,t)=>i(e,"name",{value:t,configurable:!0}),"e");class n extends l{static{a(this,"p")}static{o(this,"NetlifyBlobFile")}url;pathname}export{n as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var r=Object.defineProperty;var a=(t,e)=>r(t,"name",{value:e,configurable:!0});import{O as o}from"./local-meta-storage-Bkwqi_gi.js";var s=Object.defineProperty,l=a((t,e)=>s(t,"name",{value:e,configurable:!0}),"a");class u extends o{static{a(this,"l")}static{l(this,"NetlifyBlobMetaStorage")}constructor(e){super(e)}}export{u as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var p=Object.defineProperty;var h=(o,e)=>p(o,"name",{value:e,configurable:!0});import{getStore as d}from"@netlify/blobs";import{o as f,r as w,a as b}from"./part-match-DqD5U7An.js";import{B as g,t as m,u as E}from"./storage-m_Cxgiih.js";import{createRetryWrapper as O}from"./isRetryableError-DQNSZiBc.js";import{O as N}from"./local-meta-storage-Bkwqi_gi.js";import u from"./NetlifyBlobFile-CpzkMKng.js";import{u as T}from"./update-size-DANV7aa2.js";import{o as k}from"./has-content-Bx2p8Okx.js";var B=Object.defineProperty,y=h((o,e)=>B(o,"name",{value:e,configurable:!0}),"f");class U extends g{static name="netlify-blob";checksumTypes=["md5"];meta;storeName;siteID;token;store;retry;constructor(e){super(e),this.storeName=e.storeName||"default",this.siteID=e.siteID||process.env.NETLIFY_SITE_ID,this.token=e.token||process.env.NETLIFY_TOKEN,this.store=d({name:this.storeName,...this.siteID&&{siteID:this.siteID},...this.token&&{token:this.token}});const t={backoffMultiplier:2,initialDelay:1e3,maxDelay:3e4,maxRetries:3,retryableStatusCodes:[408,429,500,502,503,504],shouldRetry:y(n=>{if(n instanceof Error){const s=n.code;if(s==="ECONNRESET"||s==="ETIMEDOUT"||s==="ENOTFOUND"||s==="ECONNREFUSED")return!0}const i=n;return!!(i.status&&[408,429,500,502,503,504].includes(i.status))},"shouldRetry"),...e.retryConfig};this.retry=O(t);const{metaStorage:a,metaStorageConfig:r}=e;this.meta=a||new N(r),this.isReady=!0}async create(e){return this.instrumentOperation("create",async()=>{const t={...e};if(e.ttl){const r=typeof e.ttl=="string"?m(e.ttl):e.ttl;t.expiredAt=r===void 0?void 0:Date.now()+r}const a=new u(t);a.name=this.namingFunction(a),await this.validate(a);try{const r=await this.getMeta(a.id);if(r.bytesWritten>=0)return r}catch{}return a.bytesWritten=0,a.status=f(a),await this.saveMeta(a),await this.onCreate(a),a})}async write(e){return this.instrumentOperation("write",async()=>{let t;if("contentType"in e&&"metadata"in e&&!("body"in e)&&!("start"in e)?t=e:(t=await this.getMeta(e.id),await this.checkIfExpired(t)),t.status==="completed")return t;if(e.size!==void 0&&T(t,e.size),!w(e,t))throw new Error("File part does not match");await this.lock(e.id);try{if(k(e)){if(this.isUnsupportedChecksum(e.checksumAlgorithm))throw new Error("Unsupported checksum algorithm");const a=[],r=e.body;for await(const i of r)a.push(Buffer.from(i));const n=Buffer.concat(a);if((t.bytesWritten===0||Number.isNaN(t.bytesWritten))&&(!t.contentType||t.contentType==="application/octet-stream"))try{const i=await b(n);i?.mime&&(t.contentType=i.mime)}catch{}await this.retry(()=>this.store.set(t.name,n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength),{metadata:{contentType:t.contentType,...t.metadata}})),t.pathname=t.name,t.url=this.getBlobUrl(t.name),t.bytesWritten=n.length}return t.status=f(t),t.status==="completed"&&await this.internalOnComplete(t),await this.saveMeta(t),t}finally{await this.unlock(e.id)}})}async delete({id:e}){return this.instrumentOperation("delete",async()=>{const t=await this.getMeta(e);if(!t.pathname)throw new Error(`File ${e} does not have a valid pathname`);t.status="deleted";try{await this.retry(()=>this.store.delete(t.pathname))}catch(r){this.logger?.error("Failed to delete blob from Netlify Blob:",r);const n=this.normalizeError(r instanceof Error?r:new Error(String(r)));await this.onError(n)}await this.deleteMeta(t.id);const a={...t};return await this.onDelete(a),a})}async exists({id:e}){return this.instrumentOperation("exists",async()=>{try{const t=await this.getMeta(e);return!t.pathname||t.pathname.length<=0?!1:await this.retry(()=>this.store.get(t.pathname,{type:"blob"}))!=null}catch{return!1}})}async get({id:e}){return this.instrumentOperation("get",async()=>{const t=await this.checkIfExpired(await this.getMeta(e));if(!t.pathname||t.pathname.length<=0)throw new Error("File pathname not found");const a=await this.retry(()=>this.store.get(t.pathname,{type:"blob"}));if(!a)throw new Error("File not found in Netlify Blob");let r;if(typeof a=="string")r=Buffer.from(a,"utf8").buffer;else if(a&&typeof a=="object"&&"arrayBuffer"in a&&typeof a.arrayBuffer=="function")r=await this.retry(()=>a.arrayBuffer());else throw new Error("Invalid blob type returned from Netlify Blob");const n=Buffer.from(r);let i=null;try{i=await this.store.getMetadata?.(t.pathname)??null}catch{}return{content:n,contentType:i?.contentType||t.contentType,ETag:t.ETag,expiredAt:t.expiredAt,id:e,metadata:{...t.metadata,...i?.metadata},modifiedAt:t.modifiedAt,name:t.name,originalName:t.originalName,size:t.size||n.length}})}async copy(e,t){return this.instrumentOperation("copy",async()=>{const a=await this.getMeta(e);if(!a.pathname)throw new Error("Source file pathname not found");const r=await this.retry(()=>this.store.get(a.pathname,{type:"blob"}));if(!r)throw new Error("Source file not found in Netlify Blob");let n=null;try{const l=this.store;l.getMetadata&&a.pathname&&(n=await l.getMetadata(a.pathname))}catch{}let i;if(typeof r=="string")i=Buffer.from(r,"utf8").buffer;else if(r&&typeof r=="object"&&"arrayBuffer"in r){const l=r;i=await this.retry(()=>l.arrayBuffer())}else throw new Error("Invalid blob type returned from Netlify Blob");const s=Buffer.from(i);await this.retry(()=>this.store.set(t,s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength),{metadata:n||{contentType:a.contentType,...a.metadata}}));const c={...a,id:t,name:t,pathname:t,url:this.getBlobUrl(t)};return await this.saveMeta(c),c})}async move(e,t){return this.instrumentOperation("move",async()=>{const a=await this.copy(e,t);return await this.delete({id:e}),a})}async update({id:e},t){return this.instrumentOperation("update",async()=>{const a=await this.getMeta(e),r={...t};if("ttl"in r&&r.ttl!==void 0){const i=r.ttl,s=typeof i=="string"?m(i):i;s!==void 0&&(r.expiredAt=Date.now()+s),delete r.ttl}E(a,r),await this.saveMeta(a);const n={...a,status:"updated"};return await this.onUpdate(n),n})}async list(e=1e3){return this.instrumentOperation("list",async()=>{const t=await this.retry(()=>this.store.list()),a=[];for await(const r of t.blobs){let n=null;try{n=await this.store.getMetadata?.(r.key)??null}catch{}const i=new u({contentType:n?.contentType||"application/octet-stream",metadata:n?.metadata||{},originalName:r.key}),s=r;if(i.createdAt=s.createdAt?.toISOString(),i.id=r.key,i.modifiedAt=s.updatedAt?.toISOString(),i.name=r.key,i.pathname=r.key,i.size=s.size,i.url=this.getBlobUrl(r.key),a.push(i),a.length>=e)break}return a},{limit:e})}internalOnComplete=y(e=>this.deleteMeta(e.id),"internalOnComplete");getBlobUrl(e){return`/api/blobs/${this.storeName}/${e}`}}export{U as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=Object.defineProperty;var r=(t,e)=>n(t,"name",{value:e,configurable:!0});var s=Object.defineProperty,c=r((t,e)=>s(t,"name",{value:e,configurable:!0}),"n");class g{static{r(this,"u")}static{c(this,"NoOpMetrics")}increment(e,i,a){}timing(e,i,a){}gauge(e,i,a){}}export{g as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=Object.defineProperty;var a=(i,e)=>n(i,"name",{value:e,configurable:!0});import{metrics as c}from"@opentelemetry/api";var g=Object.defineProperty,h=a((i,e)=>g(i,"name",{value:e,configurable:!0}),"n");class d{static{a(this,"p")}static{h(this,"OpenTelemetryMetrics")}meter;counters=new Map;histograms=new Map;gauges=new Map;constructor(e){this.meter=e||c.getMeter("@visulima/storage","1.0.0")}increment(e,t=1,s){if(!this.counters.has(e)){const o={description:`Counter for ${e}`};this.counters.set(e,this.meter.createCounter(e,o))}const r=this.counters.get(e);if(!r)throw new Error(`Counter ${e} was not created`);r.add(t,s)}timing(e,t,s){if(!this.histograms.has(e)){const o={description:`Duration histogram for ${e}`,unit:"ms"};this.histograms.set(e,this.meter.createHistogram(e,o))}const r=this.histograms.get(e);if(!r)throw new Error(`Histogram ${e} was not created`);r.record(t,s)}gauge(e,t,s){if(!this.gauges.has(e)){const o={description:`Gauge for ${e}`};this.gauges.set(e,this.meter.createUpDownCounter(e,o))}const r=this.gauges.get(e);if(!r)throw new Error(`Gauge ${e} was not created`);r.add(t,s)}}export{d as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var F=Object.defineProperty;var u=(c,t)=>F(c,"name",{value:t,configurable:!0});import{n as i}from"./headers-DC2MEOrK.js";import{hasBody as f}from"type-is";import{a as n,b as p,g as l,r as U}from"./base-handler-core-DaggCVsq.js";import{F as w}from"./base-handler-node-BTes6sql.js";import{A as O,v as B,a as N,e as I,p as x,b as E}from"./rest-base-B2Dv7esY.js";var H=Object.defineProperty,P=u((c,t)=>H(c,"name",{value:t,configurable:!0}),"g");class m extends w{static{u(this,"p")}static{P(this,"Rest")}static methods=["delete","download","get","head","options","patch","post","put"];restBase;constructor(t){super(t);const s=this;this.restBase=new class extends O{get storage(){return s.storage}buildFileUrl(e,r){return s.buildFileUrlForRest(e,r)}}}compose(){this.registeredHandlers.set("POST",this.post.bind(this)),this.registeredHandlers.set("PUT",this.put.bind(this)),this.registeredHandlers.set("PATCH",this.patch.bind(this)),this.registeredHandlers.set("DELETE",this.delete.bind(this)),this.registeredHandlers.set("HEAD",this.head.bind(this)),this.registeredHandlers.set("GET",this.get.bind(this)),this.registeredHandlers.set("OPTIONS",this.options.bind(this)),this.logger?.debug("Registered handler: %s",[...this.registeredHandlers.keys()].join(", "))}buildFileUrlForRest(t,s){return this.buildFileUrl({url:t},s)}async post(t){const s=n(t,"x-chunked-upload",!0)==="true";B(t,!0);const e=N(t,!0,this.storage.maxUploadSize),r=n(t,"content-type")||"application/octet-stream",a=I(t,e,r),o=t.originalUrl||t.url||"",d=p(t);return this.restBase.handlePost(a,s,o,d,e)}async put(t){let s;try{s=l(t)}catch(g){throw this.checkForUndefinedIdOrPath(g),g}if(!f(t))throw i(400,"Request body is required");const e=Number.parseInt(n(t,"content-length")||"0",10);if(e===0)throw i(400,"Content-Length is required and must be greater than 0");if(e>this.storage.maxUploadSize)throw i(413,`File size exceeds maximum allowed size of ${this.storage.maxUploadSize} bytes`);const r=n(t,"content-type")||"application/octet-stream",a=n(t,"x-file-metadata",!0);let o;if(a)try{o=JSON.parse(a)}catch{}const d=x(t),h={contentType:r,metadata:o||{},originalName:d,size:e},y=t.originalUrl||t.url||"",b=p(t);return this.restBase.handlePut(s,h,y,b,e,o)}async delete(t){const s=new URL(t.url||"","http://localhost").searchParams.get("ids");if(s){const e=s.split(",").map(r=>r.trim()).filter(Boolean);if(e.length===0)throw i(400,"No file IDs provided");return this.restBase.deleteBatch(e)}if((n(t,"content-type")||"").includes("application/json"))try{const e=await U(t,"utf8",1048576),r=JSON.parse(e);if(Array.isArray(r)){if(r.length===0)throw i(400,"No file IDs provided");return this.restBase.deleteBatch(r)}if(typeof r=="object"&&r!==null&&"ids"in r&&Array.isArray(r.ids)){const a=r.ids;if(a.length===0)throw i(400,"No file IDs provided");return this.restBase.deleteBatch(a)}}catch(e){if(e.statusCode===400)throw e}try{const e=l(t);return this.restBase.deleteSingle(e)}catch(e){throw this.checkForUndefinedIdOrPath(e),e.code==="ENOENT"||e.UploadErrorCode==="FILE_NOT_FOUND"?i(404,"File not found"):e}}async patch(t){let s;try{s=l(t)}catch(h){throw this.checkForUndefinedIdOrPath(h),h}if(!f(t))throw i(400,"Request body is required");const e=Number.parseInt(n(t,"content-length")||"0",10);if(e===0)throw i(400,"Content-Length is required and must be greater than 0");const{chunkOffset:r}=E(t);if(r===void 0)throw i(400,"X-Chunk-Offset header is required");const a=n(t,"x-chunk-checksum",!0),o=t.originalUrl||t.url||"",d=p(t);return this.restBase.handlePatch(s,r,e,a,o,d)}async head(t){try{const s=l(t);return this.restBase.handleHead(s)}catch(s){throw this.checkForUndefinedIdOrPath(s),s.UploadErrorCode==="FILE_NOT_FOUND"||s.code==="ENOENT"?i(404,"File not found"):s}}async options(){return this.restBase.handleOptions(m.methods,this.storage.maxUploadSize)}async get(t,s){return super.get(t,s)}}export{m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var N=Object.defineProperty;var u=(o,e)=>N(o,"name",{value:e,configurable:!0});import{n}from"./headers-DC2MEOrK.js";import{ERRORS as f}from"./ERRORS-B9jkvKwx.js";import{b as p}from"./base-handler-core-DaggCVsq.js";import{O as x}from"./base-handler-fetch-DnarP64X.js";import{A as F,c as m}from"./rest-base-B2Dv7esY.js";var O=Object.defineProperty,g=u((o,e)=>O(o,"name",{value:e,configurable:!0}),"c");class y extends x{static{u(this,"g")}static{g(this,"RestFetch")}static methods=["delete","download","get","head","options","patch","post","put"];restBase;constructor(e){super(e);const r=this;this.restBase=new class extends F{get storage(){return r.storage}buildFileUrl(i,t){return r.buildFileUrl({url:i},t)}}}compose(){this.registeredHandlers.set("POST",this.post.bind(this)),this.registeredHandlers.set("PUT",this.put.bind(this)),this.registeredHandlers.set("PATCH",this.patch.bind(this)),this.registeredHandlers.set("DELETE",this.delete.bind(this)),this.registeredHandlers.set("HEAD",this.head.bind(this)),this.registeredHandlers.set("GET",this.get.bind(this)),this.registeredHandlers.set("OPTIONS",this.options.bind(this)),this.logger?.debug("Registered handler: %s",[...this.registeredHandlers.keys()].join(", "))}async post(e){const r=e.headers.get("x-chunked-upload")==="true",i=e.headers.get("content-length"),t=i?Number.parseInt(i,10):0;if(!r){if(!i||Number.isNaN(t)||t===0)throw n(400,"Content-Length is required and must be greater than 0");if(e.body===null)throw n(400,"Request body is required")}if(t>this.storage.maxUploadSize)throw n(413,`File size exceeds maximum allowed size of ${this.storage.maxUploadSize} bytes`);const s=e.headers.get("content-type")||"application/octet-stream",a=B(e,t,s),d=e.url,h=e.body?p(e):void 0;return this.restBase.handlePost(a,r,d,h,t)}async put(e){const r=l(e.url);if(!r)throw n(400,"File ID is required in URL path");if(e.body===null)throw n(400,"Request body is required");const i=e.headers.get("content-length"),t=i?Number.parseInt(i,10):0;if(t===0)throw n(400,"Content-Length is required and must be greater than 0");if(t>this.storage.maxUploadSize)throw n(413,`File size exceeds maximum allowed size of ${this.storage.maxUploadSize} bytes`);const s=e.headers.get("content-type")||"application/octet-stream",a=e.headers.get("x-file-metadata");let d;if(a)try{d=JSON.parse(a)}catch{}const h=m(e.headers.get("content-disposition")),c={contentType:s,metadata:d||{},originalName:h,size:t},b=e.url,w=p(e);return this.restBase.handlePut(r,c,b,w,t,d)}async delete(e){const r=new URL(e.url).searchParams.get("ids");if(r){const t=r.split(",").map(s=>s.trim()).filter(Boolean);if(t.length===0)throw n(400,"No file IDs provided");return this.restBase.deleteBatch(t)}if((e.headers.get("content-type")||"").includes("application/json"))try{const t=await e.text(),s=JSON.parse(t);if(Array.isArray(s)){if(s.length===0)throw n(400,"No file IDs provided");return this.restBase.deleteBatch(s)}if(typeof s=="object"&&s!==null&&"ids"in s&&Array.isArray(s.ids)){const a=s.ids;if(a.length===0)throw n(400,"No file IDs provided");return this.restBase.deleteBatch(a)}}catch(t){if(t.statusCode===400)throw t}const i=l(e.url);if(!i)throw n(404,"File not found");try{return this.restBase.deleteSingle(i)}catch(t){const s=t;throw s.UploadErrorCode===f.FILE_NOT_FOUND||s.code==="ENOENT"?n(404,"File not found"):t}}async patch(e){const r=l(e.url);if(!r)throw n(404,"File not found");if(e.body===null)throw n(400,"Request body is required");const i=e.headers.get("content-length"),t=i?Number.parseInt(i,10):0;if(t===0)throw n(400,"Content-Length is required and must be greater than 0");const s=e.headers.get("x-chunk-offset"),a=s?Number.parseInt(s,10):void 0;if(a===void 0)throw n(400,"X-Chunk-Offset header is required");const d=e.headers.get("x-chunk-checksum")||void 0,h=e.url,c=p(e);return this.restBase.handlePatch(r,a,t,d,h,c)}async head(e){const r=l(e.url);if(!r)throw n(404,"File not found");try{return this.restBase.handleHead(r)}catch(i){const t=i;throw t.UploadErrorCode===f.FILE_NOT_FOUND||t.code==="ENOENT"?n(404,"File not found"):i}}async options(e){return this.restBase.handleOptions(y.methods,this.storage.maxUploadSize)}async get(e){throw n(500,"GET requests should be handled via fetch() method")}}const B=g((o,e,r)=>{const i=o.headers.get("x-total-size"),t=i?Number.parseInt(i,10):e,s=o.headers.get("x-file-metadata");let a={};if(s)try{a=JSON.parse(s)}catch{}const d=m(o.headers.get("content-disposition"));return{contentType:r,metadata:a,originalName:d,size:t}},"extractFileInitFromRequest"),l=g(o=>{try{const e=new URL(o).pathname.split("/").filter(Boolean),r=e[e.length-1];return r&&r.replace(/\.[^.]+$/,"")||null}catch{return null}},"getIdFromRequestUrl");export{y as default};
|