@visulima/storage 1.0.0-alpha.26 → 1.0.0-alpha.27

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.
Files changed (194) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE.md +0 -1104
  3. package/README.md +79 -466
  4. package/dist/adapter/nuxt/module.d.ts +4 -4
  5. package/dist/adapter/nuxt/node_modules/.bin/nuxi +22 -0
  6. package/dist/adapter/nuxt/node_modules/.bin/nuxt +22 -0
  7. package/dist/ai/ai-sdk/index.d.ts +113 -0
  8. package/dist/ai/ai-sdk/index.js +1 -0
  9. package/dist/ai/claude/index.d.ts +177 -0
  10. package/dist/ai/claude/index.js +1 -0
  11. package/dist/ai/openai/index.d.ts +205 -0
  12. package/dist/ai/openai/index.js +1 -0
  13. package/dist/ai/tanstack/index.d.ts +115 -0
  14. package/dist/ai/tanstack/index.js +1 -0
  15. package/dist/handler/http/fetch/index.d.ts +13 -7
  16. package/dist/handler/http/fetch/index.js +1 -1
  17. package/dist/handler/http/hono/index.d.ts +5 -1412
  18. package/dist/handler/http/hono/index.js +1 -1
  19. package/dist/handler/http/nextjs/index.d.ts +4 -4
  20. package/dist/handler/http/nextjs/index.js +1 -1
  21. package/dist/handler/http/node/index.d.ts +7 -7
  22. package/dist/handler/http/node/index.js +1 -1
  23. package/dist/handler/http/solid-start/index.d.ts +4 -4
  24. package/dist/handler/http/solid-start/index.js +1 -1
  25. package/dist/index.d.ts +6 -324
  26. package/dist/index.js +1 -1
  27. package/dist/packem_shared/{AwsLightFile-BTLiRxXj.js → AwsLightFile-BSqjc_rD.js} +1 -1
  28. package/dist/packem_shared/{AwsLightStorage-CA9cdfJ6.js → AwsLightStorage-SH7j-myh.js} +1 -1
  29. package/dist/packem_shared/{AzureFile-BKHru1zB.js → AzureFile-Dgj2Tef4.js} +1 -1
  30. package/dist/packem_shared/{AzureSMetaStorage-BqA4jUDJ.js → AzureSMetaStorage-DV2tNjKh.js} +1 -1
  31. package/dist/packem_shared/AzureStorage-BVYMFEBP.js +1 -0
  32. package/dist/packem_shared/BaseTransformer-Fpcuz4kj.js +1 -0
  33. package/dist/packem_shared/BoxFile-Be0S4N1L.js +1 -0
  34. package/dist/packem_shared/BoxMetaStorage-BUe5Qmqe.js +1 -0
  35. package/dist/packem_shared/BoxStorage-CgC81_So.js +1 -0
  36. package/dist/packem_shared/BunnyFile-Dotl-lO9.js +1 -0
  37. package/dist/packem_shared/BunnyMetaStorage-D0mT6veJ.js +1 -0
  38. package/dist/packem_shared/BunnyStorage-Bl4usdVT.js +1 -0
  39. package/dist/packem_shared/DiskStorage-B5uIDVXr.js +1 -0
  40. package/dist/packem_shared/DiskStorageWithChecksum-CbXWpSOr.js +1 -0
  41. package/dist/packem_shared/DropboxFile-BGVG2kXM.js +1 -0
  42. package/dist/packem_shared/DropboxMetaStorage-CICuUZ1n.js +1 -0
  43. package/dist/packem_shared/DropboxStorage-CPjhDN5B.js +1 -0
  44. package/dist/packem_shared/ERRORS-CyOuSMLY.js +1 -0
  45. package/dist/packem_shared/File-BhfUgJjs.js +1 -0
  46. package/dist/packem_shared/Files-B7hlJcB4.js +1 -0
  47. package/dist/packem_shared/{GCSFile-CHjX_fJk.js → GCSFile-CDQ6IWAz.js} +1 -1
  48. package/dist/packem_shared/{GCSMetaStorage-DV0MBO3W.js → GCSMetaStorage-CqP9ifYB.js} +1 -1
  49. package/dist/packem_shared/GCStorage-XSBKVx90.js +1 -0
  50. package/dist/packem_shared/GoogleDriveFile-D0aGfGbL.js +1 -0
  51. package/dist/packem_shared/GoogleDriveMetaStorage-rghGy3Fa.js +1 -0
  52. package/dist/packem_shared/GoogleDriveStorage-DuB6glUk.js +1 -0
  53. package/dist/packem_shared/LocalMetaStorage-B5uh1snG.js +1 -0
  54. package/dist/packem_shared/MediaTransformer-D-1c9Q_k.js +1 -0
  55. package/dist/packem_shared/Multipart-7FSSy2n1.js +1 -0
  56. package/dist/packem_shared/Multipart-DACQFsrn.js +1 -0
  57. package/dist/packem_shared/{NetlifyBlobFile-CpzkMKng.js → NetlifyBlobFile-PMZLJ8AC.js} +1 -1
  58. package/dist/packem_shared/NetlifyBlobMetaStorage-BcRFPky8.js +1 -0
  59. package/dist/packem_shared/NetlifyBlobStorage-C4qkJv1R.js +1 -0
  60. package/dist/packem_shared/OneDriveFile-XbVVKIJh.js +1 -0
  61. package/dist/packem_shared/OneDriveMetaStorage-B_BkGLzW.js +1 -0
  62. package/dist/packem_shared/OneDriveStorage-Cu0cGcrh.js +1 -0
  63. package/dist/packem_shared/Rest-5NwM1xYj.js +1 -0
  64. package/dist/packem_shared/{Rest-CYEBbtCD.js → Rest-y8Vz2Rt0.js} +1 -1
  65. package/dist/packem_shared/{S3File-Du6wP0Sz.js → S3File-BfmCOET4.js} +1 -1
  66. package/dist/packem_shared/S3Storage-D8dopWoO.js +1 -0
  67. package/dist/packem_shared/SupabaseFile-DZ1iv9gM.js +1 -0
  68. package/dist/packem_shared/SupabaseMetaStorage-BR1UGqnj.js +1 -0
  69. package/dist/packem_shared/SupabaseStorage-CCtMTiN5.js +1 -0
  70. package/dist/packem_shared/{Tus-CUBCkuPE.js → Tus-BCVAbJIi.js} +1 -1
  71. package/dist/packem_shared/Tus-CJMcygk7.js +1 -0
  72. package/dist/packem_shared/UploadThingFile-BpG9mE8K.js +1 -0
  73. package/dist/packem_shared/UploadThingMetaStorage-DyGNyaAq.js +1 -0
  74. package/dist/packem_shared/UploadThingStorage-B_fNzNFO.js +1 -0
  75. package/dist/packem_shared/{VercelBlobFile-CL9MjKcY.js → VercelBlobFile-Cni_1qwD.js} +1 -1
  76. package/dist/packem_shared/{VercelBlobMetaStorage-BsOTx-Su.js → VercelBlobMetaStorage-Do9ZoKrl.js} +1 -1
  77. package/dist/packem_shared/VercelBlobStorage-D5zy4PPQ.js +1 -0
  78. package/dist/packem_shared/agentsListFiles-R-CnGKc4.js +1 -0
  79. package/dist/packem_shared/akamai-BYS9pP8S.js +1 -0
  80. package/dist/packem_shared/approval-BBeX3o4E.js +1 -0
  81. package/dist/packem_shared/approval.d-CMAYH9GF.d.ts +75 -0
  82. package/dist/packem_shared/backblaze-CvdtCvJL.js +1 -0
  83. package/dist/packem_shared/base-handler-core-BfwZ1RS1.js +1 -0
  84. package/dist/packem_shared/base-handler-fetch-CLxqXTQf.js +1 -0
  85. package/dist/packem_shared/base-handler-node-DBZjcqsp.js +1 -0
  86. package/dist/packem_shared/claudeListFiles-DAezbKEi.js +1 -0
  87. package/dist/packem_shared/cloudflare-Bm_Pg6yx.js +1 -0
  88. package/dist/packem_shared/createResponsesFileTools-BCep-qdO.js +1 -0
  89. package/dist/packem_shared/defaultCloudStorageFileNameValidation-6URTv-Mp.js +1 -0
  90. package/dist/packem_shared/detect-file-type-5JhzC9RU.js +1 -0
  91. package/dist/packem_shared/digitalOcean-Lj1NfDzc.js +1 -0
  92. package/dist/packem_shared/disk-storage-CbSSPnOf.js +5 -0
  93. package/dist/packem_shared/{disk-storage-with-checksum.d-hEoe2ugb.d.ts → disk-storage-with-checksum.d-BQMXA4Wl.d.ts} +6 -4
  94. package/dist/packem_shared/executors-DG6hGtvm.js +1 -0
  95. package/dist/packem_shared/executors.d-UtkeCbk1.d.ts +65 -0
  96. package/dist/packem_shared/{gcs-meta-storage-BfJB-ejI.js → gcs-meta-storage-XB-UPJn6.js} +1 -1
  97. package/dist/packem_shared/hetzner-DDxE7Gy7.js +1 -0
  98. package/dist/packem_shared/index.d-DotjipuX.d.ts +89 -0
  99. package/dist/packem_shared/isRetryableError-B6ZS_-5I.js +1 -0
  100. package/dist/packem_shared/listFiles-B6VF05d-.js +1 -0
  101. package/dist/packem_shared/listFiles-BtP6VnUp.js +1 -0
  102. package/dist/packem_shared/{local-meta-storage-Bkwqi_gi.js → local-meta-storage-CT1audnK.js} +1 -1
  103. package/dist/packem_shared/{local-meta-storage.d-Dop9RP9k.d.ts → local-meta-storage.d-B5R1nswK.d.ts} +2 -1
  104. package/dist/packem_shared/{media-transformer.d-CY9CsEOe.d.ts → media-transformer.d-DK7NJncf.d.ts} +2 -2
  105. package/dist/packem_shared/minio-T_Z3iEy7.js +1 -0
  106. package/dist/packem_shared/multipart-base-BxckfvQf.js +1 -0
  107. package/dist/packem_shared/oauth-refresh-Dg2ybc6_.js +1 -0
  108. package/dist/packem_shared/part-match-B5fLLmFw.js +1 -0
  109. package/dist/packem_shared/rest-base-CCv78k7h.js +1 -0
  110. package/dist/packem_shared/s3-base-storage-f_EyFAAt.js +1 -0
  111. package/dist/packem_shared/{s3-base-storage.d-CczjSe98.d.ts → s3-base-storage.d-BROGYJ4F.d.ts} +1 -1
  112. package/dist/packem_shared/storage-CoyB2O-Y.js +1 -0
  113. package/dist/packem_shared/{storage.d-BOMUJD96.d.ts → storage.d-Cr6f2lac.d.ts} +179 -78
  114. package/dist/packem_shared/storj-CVA9mM-7.js +1 -0
  115. package/dist/packem_shared/tigris-wmhjfsH2.js +1 -0
  116. package/dist/packem_shared/{tus-base.d-DNZRXR9X.d.ts → tus-base.d-4-ZfDQwl.d.ts} +3 -3
  117. package/dist/packem_shared/{types.d-D4caL2Fp.d.ts → types.d-BgCmSE94.d.ts} +2 -2
  118. package/dist/packem_shared/{types.d-BCN94sB_.d.ts → types.d-C8eSxqX9.d.ts} +13 -1
  119. package/dist/packem_shared/wasabi-JQzxdrFy.js +1 -0
  120. package/dist/storage/aws/clients/index.d.ts +90 -15
  121. package/dist/storage/aws/clients/index.js +1 -1
  122. package/dist/storage/aws/index.d.ts +16 -15
  123. package/dist/storage/aws/index.js +1 -1
  124. package/dist/storage/aws-light/index.d.ts +5 -3
  125. package/dist/storage/aws-light/index.js +1 -1
  126. package/dist/storage/azure/index.d.ts +4 -10277
  127. package/dist/storage/azure/index.js +1 -1
  128. package/dist/storage/box/index.d.ts +186 -0
  129. package/dist/storage/box/index.js +1 -0
  130. package/dist/storage/bunny/index.d.ts +116 -0
  131. package/dist/storage/bunny/index.js +1 -0
  132. package/dist/storage/dropbox/index.d.ts +129 -0
  133. package/dist/storage/dropbox/index.js +1 -0
  134. package/dist/storage/gcs/index.d.ts +6 -3941
  135. package/dist/storage/gcs/index.js +1 -1
  136. package/dist/storage/google-drive/index.d.ts +145 -0
  137. package/dist/storage/google-drive/index.js +1 -0
  138. package/dist/storage/local/index.d.ts +3 -3
  139. package/dist/storage/local/index.js +1 -1
  140. package/dist/storage/netlify-blob/index.d.ts +4 -2
  141. package/dist/storage/netlify-blob/index.js +1 -1
  142. package/dist/storage/onedrive/index.d.ts +192 -0
  143. package/dist/storage/onedrive/index.js +1 -0
  144. package/dist/storage/supabase/index.d.ts +111 -0
  145. package/dist/storage/supabase/index.js +1 -0
  146. package/dist/storage/uploadthing/index.d.ts +91 -0
  147. package/dist/storage/uploadthing/index.js +1 -0
  148. package/dist/storage/vercel-blob/index.d.ts +17 -2
  149. package/dist/storage/vercel-blob/index.js +1 -1
  150. package/dist/transformer/audio-transformer.d.ts +2 -2
  151. package/dist/transformer/audio-transformer.js +1 -1
  152. package/dist/transformer/image-transformer.d.ts +6 -2
  153. package/dist/transformer/image-transformer.js +1 -1
  154. package/dist/transformer/index.d.ts +3 -3
  155. package/dist/transformer/index.js +1 -1
  156. package/dist/transformer/video-transformer.d.ts +2 -2
  157. package/dist/transformer/video-transformer.js +1 -1
  158. package/package.json +99 -3
  159. package/dist/packem_shared/AzureStorage-BKUjCymW.js +0 -1
  160. package/dist/packem_shared/BaseTransformer-D68eLyz1.js +0 -1
  161. package/dist/packem_shared/DiskStorage-DNjpDMX9.js +0 -1
  162. package/dist/packem_shared/DiskStorageWithChecksum-Bb6JX_tC.js +0 -1
  163. package/dist/packem_shared/ERRORS-B9jkvKwx.js +0 -1
  164. package/dist/packem_shared/File-alcSNpLq.js +0 -1
  165. package/dist/packem_shared/GCStorage-B8dl6TGK.js +0 -1
  166. package/dist/packem_shared/LocalMetaStorage-BWuFvWn4.js +0 -1
  167. package/dist/packem_shared/MediaTransformer-2C8MJeAg.js +0 -1
  168. package/dist/packem_shared/Multipart-Bd9YFFn0.js +0 -1
  169. package/dist/packem_shared/Multipart-D5bcEvga.js +0 -1
  170. package/dist/packem_shared/NetlifyBlobMetaStorage-dD0oBLom.js +0 -1
  171. package/dist/packem_shared/NetlifyBlobStorage-ByTwCN-h.js +0 -1
  172. package/dist/packem_shared/Rest-DoonVU7B.js +0 -1
  173. package/dist/packem_shared/S3Client.d-CZ62Jztg.d.ts +0 -20357
  174. package/dist/packem_shared/S3Storage-Fx6-OSc-.js +0 -1
  175. package/dist/packem_shared/Tus-Bd_2Ki2G.js +0 -1
  176. package/dist/packem_shared/VercelBlobStorage-kNkk5Cn4.js +0 -1
  177. package/dist/packem_shared/backblaze-DEflv87m.js +0 -1
  178. package/dist/packem_shared/base-handler-core-DaggCVsq.js +0 -1
  179. package/dist/packem_shared/base-handler-fetch-DnarP64X.js +0 -1
  180. package/dist/packem_shared/base-handler-node-BTes6sql.js +0 -1
  181. package/dist/packem_shared/cloudflare-DLAeQvgD.js +0 -1
  182. package/dist/packem_shared/defaultCloudStorageFileNameValidation-yiM9GxHr.js +0 -1
  183. package/dist/packem_shared/digitalOcean-nhZUds87.js +0 -1
  184. package/dist/packem_shared/disk-storage-BvdK4bqF.js +0 -5
  185. package/dist/packem_shared/isRetryableError-DQNSZiBc.js +0 -1
  186. package/dist/packem_shared/minio-BWwgGXeE.js +0 -1
  187. package/dist/packem_shared/multipart-base-C6OjBwMS.js +0 -1
  188. package/dist/packem_shared/part-match-DqD5U7An.js +0 -1
  189. package/dist/packem_shared/rest-base-B2Dv7esY.js +0 -1
  190. package/dist/packem_shared/s3-base-storage-xHZNtsGe.js +0 -1
  191. package/dist/packem_shared/storage-m_Cxgiih.js +0 -1
  192. package/dist/packem_shared/tigris-DZoyrMNd.js +0 -1
  193. package/dist/packem_shared/validator-DK41xp8N.js +0 -1
  194. package/dist/packem_shared/wasabi-Dmce4x9s.js +0 -1
@@ -0,0 +1 @@
1
+ var b=Object.defineProperty;var u=(r,e)=>b(r,"name",{value:e,configurable:!0});import{EventEmitter as y}from"node:events";import{format as w}from"node:url";import R from"mime";import{ErrorMap as E}from"./ERRORS-CyOuSMLY.js";import{H as v}from"./headers-DC2MEOrK.js";import{Readable as p}from"node:stream";import U,{hasBody as I}from"type-is";import{B as h}from"./storage-CoyB2O-Y.js";var H=Object.defineProperty,L=u((r,e)=>H(r,"name",{value:e,configurable:!0}),"a");const $=L(r=>r.at(-1),"getLastOne");var B=Object.defineProperty,i=u((r,e)=>B(r,"name",{value:e,configurable:!0}),"n");const N=i(r=>{let e="",t="";const s=c(r,"forwarded");return s&&s.split(";").forEach(a=>{const[n,o]=a.split("=");n==="proto"&&(e=o),n==="host"&&(t=o)}),{host:t,proto:e}},"extractForwarded"),x=i((r,e="utf8",t)=>new Promise((s,a)=>{const n=[];let o=0;r.on("data",l=>{const d=Buffer.isBuffer(l)?l:Buffer.from(l,e);if(o+=d.length,t!==void 0&&o>t){a(new Error("Request body length limit exceeded")),r.destroy();return}n.push(d)}),r.once("end",()=>{s(Buffer.concat(n).toString(e))}),r.once("error",a)}),"readBody"),c=i((r,e,t=!1)=>{const s=r.headers?.[e.toLowerCase()];if(!s||s.length===0)return"";if(t)return s.toString().trim();const a=Array.isArray(s)?s:s.split(",");return $(a).trim()},"getHeader");i(async(r,e=16777216)=>{if(!U(r,["json"]))return{};if(r.body)return{...r.body};if(I(r)){const s=Number.parseInt(c(r,"content-length"),10);if(!Number.isNaN(s)&&s>e)throw new Error("body length limit")}const t=await x(r,"utf8",e);return{...JSON.parse(t)}},"getMetadata");const q=i((r,e,t)=>{const s=[r.getHeader(e),t].flat().filter(Boolean).toString();r.setHeader(e,s)},"appendHeader"),V=i((r,e={})=>{const t=Object.keys(e);t.length>0&&q(r,"Access-Control-Expose-Headers",t),t.forEach(s=>{if(["link","location"].includes(s.toLowerCase())){const a=encodeURI(e[s].toString()).replaceAll("#","%23");r.setHeader(s,a)}else r.setHeader(s,e[s])})},"setHeaders"),F=i(r=>c(r,"host")||c(r,"x-forwarded-host"),"extractHost"),P=i(r=>c(r,"x-forwarded-proto").toLowerCase(),"extractProto"),T=i(r=>{let{host:e,proto:t}=N(r);return e||=F(r),t||=P(r),e?t?`${t}://${e}`:`//${e}`:""},"getBaseUrl"),S=i(r=>{let e=(r.originalUrl||r.url||"").split("?")[0];if(!e)throw new TypeError("Invalid request URL");return e.startsWith("/")||(e=`/${e}`),e.startsWith("http")&&(e=new URL(e).pathname),e},"getRealPath"),O=/^[\da-z]{4,}(?:-[\da-z]{4,}){2,}$/i,X=i(r=>{const e=S(r).split("/").filter(Boolean);if(e.length===0)throw new Error("Invalid request URL");for(let a=e.length-1;a>=0;a-=1){const n=e[a];if(!n)continue;const o=n.replace(/\.[^/.]+$/,"");if(!["files","metadata","upload","download","http-rest","http-rest-chunked"].includes(o.toLowerCase())&&O.test(o))return h.assertSafeId(o),o}const t=e[e.length-1];if(!t)throw new Error("Invalid request URL");const s=t.replace(/\.[^/.]+$/,"");if(["files","metadata","upload","download","http-rest","http-rest-chunked"].includes(s.toLowerCase()))throw new Error("Invalid request URL");if(s.length<8)throw new Error("Invalid request URL");if(e.length>1)return h.assertSafeId(s),s;throw new Error("Invalid request URL")},"getIdFromRequest"),Y=i(r=>"body"in r&&r.body&&typeof r.body.getReader=="function"?p.fromWeb(r.body):"body"in r&&r.body&&r.body instanceof Uint8Array?p.from(Buffer.from(r.body)):r instanceof p?r:p.from(new Uint8Array(0)),"getRequestStream");var j=Object.defineProperty,C=u((r,e)=>j(r,"name",{value:e,configurable:!0}),"r");const Z=C((r,e)=>{const t={};return e.forEach(s=>{t[s]=r[s]}),t},"pick");var k=Object.defineProperty,m=u((r,e)=>k(r,"name",{value:e,configurable:!0}),"d");class _ extends y{static{u(this,"E")}static{m(this,"BaseHandlerCore")}responseType="json";storage;mediaTransformer;disableTerminationForFinishedUploads;logger;get loggerInstance(){return this.logger}internalErrorResponses={};get errorResponses(){return this.internalErrorResponses}constructor({disableTerminationForFinishedUploads:e,mediaTransformer:t,storage:s}){super(),this.storage=s,this.mediaTransformer=t,this.disableTerminationForFinishedUploads=e,this.logger=this.storage?.logger,this.assembleErrors()}set errorResponses(e){this.assembleErrors(e)}assembleErrors=m((e={})=>{this.internalErrorResponses={...E,...this.internalErrorResponses,...this.storage.errorResponses,...e}},"assembleErrors");parseRangeHeader(e,t){if(!e?.startsWith("bytes="))return;const s=e.slice(6).split(",");if(s.length!==1)return;const a=s[0]?.trim();if(!a)return;const n=a.split("-");if(n.length!==2)return;const[o,l]=n;let d,f;if(o&&l)d=Number.parseInt(o,10),f=Number.parseInt(l,10);else if(o&&!l)d=Number.parseInt(o,10),f=t-1;else if(!o&&l){const g=Number.parseInt(l,10);d=Math.max(0,t-g),f=t-1}else return;if(!(Number.isNaN(d)||Number.isNaN(f)||d>=t||f>=t||d>f))return{end:f,start:d}}buildFileUrlFromString(e,t){const s=new URL(e,"http://localhost"),{pathname:a}=s,n=Object.fromEntries(s.searchParams.entries()),o=w({pathname:`${a}/${t.id}`,query:n});return`${this.storage.config.useRelativeLocation?"":T({url:e})}${o}.${R.getExtension(t.contentType)}`}negotiateContentTypeFromHeader(e,t){if(e)return v.getPreferredMediaType(e,t)}checkForUndefinedIdOrPath(e){if(e instanceof Error&&["Id is undefined","Invalid request URL","Path is undefined"].includes(e.message))throw e}}export{_ as E,Z as T,c as a,Y as b,T as c,S as d,X as g,x as r,V as s,O as u};
@@ -0,0 +1 @@
1
+ var E=Object.defineProperty;var u=(h,t)=>E(h,"name",{value:t,configurable:!0});import{H as m,h as b}from"./headers-DC2MEOrK.js";import{ERRORS as g,isUploadError as R}from"./ERRORS-CyOuSMLY.js";import{E as v,T as O}from"./base-handler-core-BfwZ1RS1.js";import{i as H}from"./storage-CoyB2O-Y.js";import{waitForStorage as w}from"./waitForStorage-ChSBLhLc.js";var T=Object.defineProperty,x=u((h,t)=>T(h,"name",{value:t,configurable:!0}),"m");class z extends v{static{u(this,"O")}static{x(this,"BaseHandlerFetch")}static methods=["delete","get","head","options","patch","post","put"];registeredHandlers=new Map;constructor(t){super(t),this.compose()}get handlers(){return this.registeredHandlers}async fetch(t){this.logger?.debug("[fetch request]: %s %s",t.method,t.url);const e=this.registeredHandlers.get(t.method||"GET");if(!e)return this.createErrorResponse({UploadErrorCode:g.METHOD_NOT_ALLOWED});try{await w(this.storage)}catch{return this.createErrorResponse({UploadErrorCode:g.STORAGE_ERROR})}try{const r=await e.call(this,t);return this.handleFetchResponse(t,r)}catch(r){const s=r instanceof Error?r:new Error(String(r)),o={...O(s,["name",...Object.getOwnPropertyNames(s)]),request:{headers:Object.fromEntries(t.headers.entries()),method:t.method,url:t.url}};return this.listenerCount("error")>0&&this.emit("error",o),this.logger?.error("[fetch error]: %O",o),this.createErrorResponse(s)}}async handleFetchResponse(t,e){if(t.method==="HEAD"||t.method==="OPTIONS"){const{headers:n,statusCode:d}=e;return new Response(void 0,{headers:this.convertHeaders({...n,"Access-Control-Expose-Headers":"location,upload-expires,upload-offset,upload-length,upload-metadata,upload-defer-length,tus-resumable,tus-extension,tus-max-size,tus-version,tus-checksum-algorithm,cache-control"}),status:d})}if(t.method==="GET"){const{headers:n,statusCode:d}=e;let c="";return e.content!==void 0?c=new Uint8Array(e.content):typeof e=="object"&&"data"in e&&(c=JSON.stringify(e.data)),new Response(c,{headers:this.convertHeaders({...n,"Access-Control-Expose-Headers":"location,upload-expires,upload-offset,upload-length,upload-metadata,upload-defer-length,tus-resumable,tus-extension,tus-max-size,tus-version,tus-checksum-algorithm,cache-control"}),status:d})}const{headers:r,statusCode:s,...o}=e;if(o.status!==void 0&&this.listenerCount(o.status)>0&&this.emit(o.status,{...o,request:{headers:Object.fromEntries(t.headers.entries()),method:t.method,url:t.url}}),o.status==="completed"){const n=e;n.headers===void 0&&(n.headers={}),n.statusCode===void 0&&(n.statusCode=200);try{await this.storage.onComplete(o,n)}catch(p){throw this.logger?.error("[onComplete error]: %O",p),p}const{headers:d,statusCode:c,...f}=n,{content:j,stream:S,...C}=f;return this.createResponse({body:C,headers:d||r,statusCode:c||s||200})}const y={...r,...e.headers},a=this.convertHeaders({...y,"Access-Control-Expose-Headers":"location,upload-expires,upload-offset,upload-length,upload-metadata,upload-defer-length,tus-resumable,tus-extension,tus-max-size,tus-version,tus-checksum-algorithm,cache-control",...o.hash===void 0?{}:{[`X-Range-${o.hash?.algorithm.toUpperCase()}`]:o.hash?.value}}),l=e.headers||{};l.Location&&!a.location&&!a.Location?a.location=String(l.Location):l.location&&!a.location&&!a.Location?a.location=String(l.location):r.Location&&!a.location&&!a.Location?a.location=String(r.Location):r.location&&!a.location&&!a.Location&&(a.location=String(r.location));let i;return s>=200&&s<300&&(i=Object.keys(o).length>0?{...o}:{},"content"in i&&delete i.content,"stream"in i&&delete i.stream,Object.keys(i).length===0&&(i={})),this.createResponse({body:i,headers:a,statusCode:s||200})}convertHeaders(t){const e={};for(const[r,s]of Object.entries(t))e[r]=Array.isArray(s)?s.join(", "):String(s);return e}createResponse(t){const{body:e,headers:r={},statusCode:s}=t;let o;return s===204?o=null:typeof e=="string"?o=e:e instanceof Buffer?o=new Uint8Array(e):e&&typeof e=="object"?(o=JSON.stringify(e),r["Content-Type"]||(r["Content-Type"]=m.createContentType({charset:"utf8",mediaType:"application/json"}))):e===void 0&&s!==void 0&&s>=200&&s<300&&(o="{}",r["Content-Type"]||(r["Content-Type"]=m.createContentType({charset:"utf8",mediaType:"application/json"}))),new Response(o,{headers:this.convertHeaders(r),status:s})}async createErrorResponse(t){let e;R(t)?e=this.internalErrorResponses[t.UploadErrorCode]:!H(t)&&!b.isHttpError(t)?e=this.storage.normalizeError(t):e={...t,code:t.code||t.name,headers:t.headers||{},message:t.message,name:t.name,statusCode:t.statusCode||500},await this.storage.onError(e);let r;return e.body?typeof e.body=="object"&&e.body!==null?r={body:e.body,headers:e.headers,statusCode:e.statusCode}:r={body:{error:{code:e.code||e.name||"Error",message:e.body||e.message||"Unknown error",name:e.name||"Error"}},headers:e.headers,statusCode:e.statusCode||500}:r={body:{error:{code:e.code||e.name||"Error",message:e.message||"Unknown error",name:e.name||"Error"}},headers:e.headers,statusCode:e.statusCode||500},this.createResponse(r)}buildFileUrl(t,e){return this.buildFileUrlFromString(t.url,e)}negotiateContentType(t,e){return super.negotiateContentTypeFromHeader(t.headers.get("accept")||void 0,e)}}export{z as O};
@@ -0,0 +1 @@
1
+ var M=Object.defineProperty;var C=(i,e)=>M(i,"name",{value:e,configurable:!0});import{paginate as P}from"@visulima/pagination";import{H as T,h as z,n as y}from"./headers-DC2MEOrK.js";import O from"mime";import{isUploadError as $,ERRORS as m}from"./ERRORS-CyOuSMLY.js";import{match as k}from"path-to-regexp";import{T as S,E as q,s as A,d as U,u as x}from"./base-handler-core-BfwZ1RS1.js";import{i as D}from"./storage-CoyB2O-Y.js";import{waitForStorage as _}from"./waitForStorage-ChSBLhLc.js";import{PassThrough as I}from"node:stream";import{e as H}from"./response-builder-Wdo_fvcF.js";var X=Object.defineProperty,G=C((i,e)=>X(i,"name",{value:e,configurable:!0}),"n");const W=k(["/:uuid","/*path/:uuid.:ext/:metadata","/*path/:uuid/:metadata","/*path/:uuid.:ext","/*path/:uuid"],{decode:decodeURIComponent}),L=G(i=>{const e=W(i);if(!e)return;const{params:t}=e;if(!t.uuid)return;const r={uuid:t.uuid};return t.metadata!==void 0&&(r.metadata=t.metadata),t.path!==void 0&&(r.path=t.path),t.ext!==void 0&&(r.ext=t.ext),{params:r,path:e.path}},"filePathUrlMatcher");var B=Object.defineProperty,v=C((i,e)=>B(i,"name",{value:e,configurable:!0}),"a");const J=v((i,e,t)=>{let r=0,a=0;const o=t-e+1;return new I({highWaterMark:Math.min(64*1024,o),transform(n,h,s){const l=n.length,d=r,p=d+l-1;if(r+=l,p<e){s();return}if(d>t){this.end(),s();return}const u=Math.max(0,e-d),f=Math.min(l,t-d+1);if(u<f){const b=n.subarray(u,f);a+=b.length,this.push(b)||i.pause()}a>=o&&(this.end(),i.destroy()),s()}})},"createRangeLimitedStream"),V=v((i,e,t)=>{let r=!1;const a=v(()=>{r||(r=!0,i.destroy())},"cleanup");e.on("drain",()=>{i.resume()}),e.on("close",a),e.on("finish",a),e.on("error",a),i.on("end",()=>{e.end()}),i.on("error",async o=>{r||(await t(e,o),a())}),i.on("data",o=>{e.write(o)||i.pause()}),typeof e.listeners=="function"&&e.listeners("close")?.length===0&&e.on("close",a)},"pipeWithBackpressure");v((i,e,t={})=>({headers:t,size:e,stream:i}),"createStreamResponse");var K=Object.defineProperty,w=C((i,e)=>K(i,"name",{value:e,configurable:!0}),"u");const Q=w((i,e,t)=>{const{headers:r,statusCode:a}=i;e(t,{headers:r,statusCode:a})},"handleHeadOptionsRequest"),Y=w((i,e,t,r,a,o,n)=>{e.body=i?.data===void 0?i:i.data;const{headers:h,statusCode:s}=i,l=i;if(l.stream)if(typeof r=="function")r();else{const d=n(e.headers.range,l.size||0);o(t,l.stream,{headers:h,range:d||void 0,size:l.size,statusCode:s})}else{let d="";i.content!==void 0?d=i.content:typeof i=="object"&&"data"in i&&(d=i.data),typeof r=="function"?r():a(t,{body:d,headers:h,statusCode:s})}},"handleGetRequest"),Z=w(async(i,e,t,r,a,o,n)=>{const{headers:h,statusCode:s,...l}=i;if(typeof r=="function")e._body=!0,e.body=l,r();else{const d=i,p=d.headers?{...d.headers}:{};d.headers===void 0&&(d.headers={}),d.statusCode===void 0&&(d.statusCode=200);try{const u=a.onComplete(l,d,e);u instanceof Promise&&await u}catch(u){throw o?.error&&o.error("[onComplete error]: %O",u),u}Object.keys(d.headers||{}).length===0&&Object.keys(p).length>0?d.headers=p:d.headers&&Object.keys(p).length>0&&(d.headers={...p,...d.headers}),n(e,t,d)}},"handleCompletedUpload"),ee=w((i,e,t,r)=>{const{headers:a,statusCode:o,...n}=i,h=a||{},s=h["X-Chunked-Upload"]==="true"||h["x-chunked-upload"]==="true";let l;const d={...H(h),...a?H(a):{},...n.hash===void 0?{}:{[`X-Range-${n.hash?.algorithm.toUpperCase()}`]:String(n.hash?.value)}};s&&(l=JSON.stringify(n),!d["Content-Type"]&&!d["content-type"]&&(d["Content-Type"]="application/json; charset=utf-8")),e.method==="HEAD"&&(l=""),r(t,{body:l,headers:d,statusCode:o||200})},"handlePartialUpload"),te=w(async(i,e,t,r,a,o,n)=>{const h=i instanceof Error?i:new Error(String(i)),s={...S(h,["name",...Object.getOwnPropertyNames(h)]),request:S(e,["headers","method","url"])};r("error")>0&&t("error",s),a?.error&&a.error("[error]: %O",s),await o(n,h)},"handleUploadError");var re=Object.defineProperty,R=C((i,e)=>re(i,"name",{value:e,configurable:!0}),"C");const g="Content-Type";class N extends q{static{C(this,"F")}static{R(this,"BaseHandlerNode")}static methods=["delete","get","head","options","patch","post","put"];registeredHandlers=new Map;constructor(e){super(e),this.compose()}get handlers(){return this.registeredHandlers}handle=R(async(e,t)=>this.upload(e,t),"handle");upload=R(async(e,t,r)=>{e.on("error",o=>this.logger?.error("[request error]: %O",o)),this.logger?.debug("[request]: %s %s",e.method,e.url);const a=this.registeredHandlers.get(e.method);if(!a){await this.sendError(t,{UploadErrorCode:m.METHOD_NOT_ALLOWED});return}try{await _(this.storage)}catch{await this.sendError(t,{UploadErrorCode:m.STORAGE_ERROR});return}try{const o=await a.call(this,e,t);if(["HEAD","OPTIONS"].includes(e.method))Q(o,this.send.bind(this),t);else if(e.method==="GET"){const n=o;n&&Y(n,e,t,r,this.send.bind(this),this.sendStream.bind(this),this.parseRangeHeader.bind(this))}else{const{headers:n,statusCode:h,...s}=o;this.logger?.debug("[%s]: %s: %d/%d",s.status,s.name,s.bytesWritten,s.size),s.status!==void 0&&this.listenerCount(s.status)>0&&this.emit(s.status,{...s,request:S(e,["headers","method","url"])}),s.status==="completed"?await Z(o,e,t,r,this.storage,this.logger,(l,d,p)=>{this.finish(l,d,p)}):ee(o,e,t,(l,d)=>{this.send(l,{body:d.body,headers:d.headers,statusCode:d.statusCode})})}}catch(o){await te(o,e,this.emit.bind(this),this.listenerCount.bind(this),this.logger,this.sendError.bind(this),t)}},"upload");send(e,{body:t="",headers:r={},statusCode:a=200}){let o;const n={...r};if(typeof t=="string"){if(o=t,n[g]===void 0)n[g]=T.createContentType({mediaType:"text/plain"});else{const h=Array.isArray(n[g])?n[g].join(", "):String(n[g]);n[g]=T.ensureCharset(h)}n["Content-Length"]===void 0&&(n["Content-Length"]=Buffer.byteLength(t))}else t instanceof Buffer?o=t:(o=JSON.stringify(t),n[g]||(n[g]=T.createContentType({charset:"utf8",mediaType:"application/json"})));A(e,n),e.statusCode=a,e.end(o)}async sendError(e,t){let r;$(t)?r=this.internalErrorResponses[t.UploadErrorCode]:!D(t)&&!z.isHttpError(t)?r=this.storage.normalizeError(t):r={...t,code:t.code||t.name,headers:t.headers||{},message:t.message,name:t.name,statusCode:t.statusCode||500},await this.storage.onError(r);let a;r.body?typeof r.body=="object"&&r.body!==null?a={body:r.body,headers:r.headers,statusCode:r.statusCode}:a={body:{error:{code:r.code||r.name||"Error",message:r.body||r.message||"Unknown error",name:r.name||"Error"}},headers:r.headers,statusCode:r.statusCode||500}:a={body:{error:{code:r.code||r.name||"Error",message:r.message||"Unknown error",name:r.name||"Error"}},headers:r.headers,statusCode:r.statusCode||500},this.send(e,a)}sendStream(e,t,{headers:r={},range:a,size:o,statusCode:n=200}){A(e,r),e.statusCode=n;let h=t;a&&o?(e.statusCode=206,e.setHeader("Content-Range",`bytes ${a.start}-${a.end}/${o}`),e.setHeader("Content-Length",a.end-a.start+1),e.setHeader("Accept-Ranges","bytes"),h=J(t,a.start,a.end)):(o&&e.setHeader("Content-Length",o),e.setHeader("Accept-Ranges","bytes")),V(h,e,(s,l)=>this.sendError(s,l))}finish(e,t,r){const a="id"in r&&"headers"in r&&!("body"in r);let o,n,h;if(a){const s=r,l=s.headers||{},d=s.statusCode||200,{headers:p,statusCode:u,...f}=s;o=f,n={...l},h=d}else{const s=r;o=s.body,n=s.headers||{},h=s.statusCode||200}if(o&&typeof o=="object"&&o.content!==void 0){const{content:s,contentType:l}=o;o=s,n={...n,"Content-Type":l}}this.send(t,{body:o||r,headers:n,statusCode:h})}buildFileUrl(e,t){return this.buildFileUrlFromString(e.originalUrl||e.url,t)}negotiateContentType(e,t){return super.negotiateContentTypeFromHeader(e.headers.accept,t)}async options(e,t){return{headers:{"Access-Control-Allow-Methods":(this.constructor.methods||N.methods).map(r=>r.toUpperCase()).join(", ")},statusCode:204}}async get(e,t){const r=L(U(e));if(r?.params.uuid){const{ext:a,metadata:o,uuid:n}=r.params,h=a?n.replace(new RegExp(String.raw`\.${a}$`),""):n;if(o==="metadata"&&U(e).endsWith("/metadata"))try{const s=await this.storage.getMeta(h);return{...s,content:JSON.stringify(s),headers:{"Content-Type":T.createContentType({charset:"utf8",mediaType:"application/json"}),...s.expiredAt===void 0?{}:{"X-Upload-Expires":s.expiredAt.toString()},...s.modifiedAt===void 0?{}:{"Last-Modified":s.modifiedAt.toString()}},statusCode:200}}catch(s){const l=s;throw l.UploadErrorCode===m.FILE_NOT_FOUND||l.UploadErrorCode===m.GONE?y(404,"File metadata not found"):s}if(!x.test(h))return this.list(e,t);try{const s=new URL(e.url||"","http://localhost"),l=Object.fromEntries(s.searchParams.entries());if(Object.keys(l).length>0&&this.mediaTransformer&&this.mediaTransformer)try{const c=await this.mediaTransformer.handle(h,l);return{content:c.buffer,headers:{"Content-Length":String(c.size),"Content-Type":`${c.mediaType}/${c.format}`,"X-Media-Type":c.mediaType,"X-Original-Format":c.originalFile?.contentType?.split("/")[1]||"","X-Transformed-Format":c.format,...c.originalFile?.expiredAt===void 0?{}:{"X-Upload-Expires":c.originalFile.expiredAt.toString()},...c.originalFile?.modifiedAt===void 0?{}:{"Last-Modified":c.originalFile.modifiedAt.toString()},...c.originalFile?.ETag===void 0?{}:{ETag:c.originalFile.ETag}},statusCode:200}}catch(c){if(c.name==="ValidationError")throw y(400,c.message);this.logger?.warn(`Media transformation failed: ${c.message}`)}const d=await this.storage.getMeta(h);if((e.headers.range||d.size&&d.size>1024*1024)&&this.storage.getStream)try{const c=await this.storage.getStream({id:h});let E=c.headers?.["Content-Type"]||d.contentType;return E.includes("image")&&typeof a=="string"&&(E=O.getType(a)||E),{headers:{...c.headers,"Accept-Ranges":"bytes","Content-Type":E},size:c.size,statusCode:200,stream:c.stream,...d,contentType:E}}catch(c){this.logger?.warn(`Streaming failed, falling back to buffer: ${c}`)}const p=await this.storage.get({id:h});let{contentType:u}=p;u.includes("image")&&typeof a=="string"&&(u=O.getType(a)||u);const{ETag:f,expiredAt:b,modifiedAt:F,size:j}=p;return{headers:{"Accept-Ranges":"bytes","Content-Length":String(j),"Content-Type":u,...b===void 0?{}:{"X-Upload-Expires":b.toString()},...F===void 0?{}:{"Last-Modified":F.toString()},...f===void 0?{}:{ETag:f}},statusCode:200,...p,contentType:u}}catch(s){const l=s;throw l.UploadErrorCode===m.FILE_NOT_FOUND||l.UploadErrorCode===m.GONE?y(404,"File not found"):s}}return this.list(e,t)}async list(e,t){const r=new URL(e.url||"","http://localhost"),a=r.searchParams.get("limit"),o=r.searchParams.get("page"),n=await this.storage.list(Number(a||1e3));return n.length===0?{data:[],headers:{},statusCode:200}:o!==void 0&&a!==void 0?{data:P(Number(o),Number(a),n.length,n),headers:{},statusCode:200}:{data:n,headers:{},statusCode:200}}async download(e,t){const r=L(U(e));if(!r?.params.uuid||!x.test(r.params.uuid))throw y(404,"File not found");const{ext:a,uuid:o}=r.params;try{const n=await this.storage.getMeta(o);if(!this.storage.getStream){await this.sendError(t,y(501,"Streaming download not supported"));return}const h=await this.storage.getStream({id:o});let s=h.headers?.["Content-Type"]||n.contentType;s.includes("image")&&typeof a=="string"&&(s=O.getType(a)||s);const l=this.parseRangeHeader(e.headers.range,h.size||0),d={...h.headers,"Accept-Ranges":"bytes","Content-Disposition":T.createContentDisposition({filename:n.originalName||o,type:"attachment"}),"Content-Type":s};this.sendStream(t,h.stream,{headers:d,range:l||void 0,size:h.size,statusCode:l?206:200})}catch(n){const h=n;if(h.UploadErrorCode===m.FILE_NOT_FOUND||h.UploadErrorCode===m.GONE){await this.sendError(t,y(404,"File not found"));return}await this.sendError(t,n)}}checkForUndefinedIdOrPath(e){if(e instanceof Error&&["Id is undefined","Invalid request URL","Path is undefined"].includes(e.message))throw y(404,"File not found")}}export{N as F};
@@ -0,0 +1 @@
1
+ var F=Object.defineProperty;var r=(e,t)=>F(e,"name",{value:t,configurable:!0});import{tool as n}from"@anthropic-ai/claude-agent-sdk";import{T as i,e as o}from"./executors-DG6hGtvm.js";var c=Object.defineProperty,l=r((e,t)=>c(e,"name",{value:t,configurable:!0}),"o");const s={readOnlyHint:!0},p={destructiveHint:!0,readOnlyHint:!1},u={destructiveHint:!1,idempotentHint:!0,readOnlyHint:!1},U=l(e=>({content:[{text:typeof e=="string"?e:JSON.stringify(e),type:"text"}]}),"okResult"),g=l(e=>({content:[{text:e instanceof Error?e.message:String(e),type:"text"}],isError:!0}),"errorResult"),d=l(e=>async t=>{try{return U(await e(t))}catch(a){return g(a)}},"wrap"),w=l(e=>n("listFiles",i.listFiles.description,i.listFiles.input.shape,d(t=>o.listFiles(e,t)),{annotations:s}),"claudeListFiles"),m=l(e=>n("getFileMetadata",i.getFileMetadata.description,i.getFileMetadata.input.shape,d(t=>o.getFileMetadata(e,t)),{annotations:s}),"claudeGetFileMetadata"),H=l(e=>n("downloadFile",i.downloadFile.description,i.downloadFile.input.shape,d(t=>o.downloadFile(e,t)),{annotations:s}),"claudeDownloadFile"),M=l(e=>n("getFileUrl",i.getFileUrl.description,i.getFileUrl.input.shape,d(t=>o.getFileUrl(e,t)),{annotations:s}),"claudeGetFileUrl"),O=l((e,{annotations:t=p}={})=>n("uploadFile",i.uploadFile.description,i.uploadFile.input.shape,d(a=>o.uploadFile(e,a)),{annotations:t}),"claudeUploadFile"),x=l((e,{annotations:t=p}={})=>n("deleteFile",i.deleteFile.description,i.deleteFile.input.shape,d(a=>o.deleteFile(e,a)),{annotations:t}),"claudeDeleteFile"),S=l((e,{annotations:t=u}={})=>n("copyFile",i.copyFile.description,i.copyFile.input.shape,d(a=>o.copyFile(e,a)),{annotations:t}),"claudeCopyFile"),v=l((e,{annotations:t=u}={})=>n("signUploadUrl",i.signUploadUrl.description,i.signUploadUrl.input.shape,d(a=>o.signUploadUrl(e,a)),{annotations:t}),"claudeSignUploadUrl");export{S as claudeCopyFile,x as claudeDeleteFile,H as claudeDownloadFile,m as claudeGetFileMetadata,M as claudeGetFileUrl,w as claudeListFiles,v as claudeSignUploadUrl,O as claudeUploadFile};
@@ -0,0 +1 @@
1
+ var E=Object.defineProperty;var C=(e,r)=>E(e,"name",{value:r,configurable:!0});var n=Object.defineProperty,t=C((e,r)=>n(e,"name",{value:r,configurable:!0}),"t");const a=t(e=>{const r=e?.accessKeyId??process.env.AWS_ACCESS_KEY_ID??process.env.CLOUDFLARE_ACCESS_KEY_ID??process.env.CLOUDFLARE_ACCESS_KEY,s=e?.accountId??process.env.CLOUDFLARE_ACCOUNT_ID,c=e?.jurisdiction??process.env.CLOUDFLARE_JURISDICTION??process.env.CLOUDFLARE_R2_JURISDICTION,o=e?.secretAccessKey??process.env.AWS_SECRET_ACCESS_KEY??process.env.CLOUDFLARE_SECRET_ACCESS_KEY??process.env.CLOUDFLARE_SECRET_KEY;if(!s||!r||!o)throw new Error("Missing required parameters for Cloudflare R2 client.");return{credentials:{accessKeyId:r,secretAccessKey:o},endpoint:`https://${s}.${c?`${c}.`:""}r2.cloudflarestorage.com`,region:"auto"}},"cloudflare");export{a as cloudflare,a as default};
@@ -0,0 +1 @@
1
+ var v=Object.defineProperty;var d=(e,r)=>v(e,"name",{value:r,configurable:!0});import{r as O}from"./approval-BBeX3o4E.js";import{T as F,W as y,e as o}from"./executors-DG6hGtvm.js";import*as k from"zod";var S=Object.defineProperty,h=d((e,r)=>S(e,"name",{value:r,configurable:!0}),"e");const U=h(e=>{const r=k.toJSONSchema(e),{$schema:u,...t}=r;return t},"toOpenAiJsonSchema");var A=Object.defineProperty,i=d((e,r)=>A(e,"name",{value:r,configurable:!0}),"a");const T=["listFiles","getFileMetadata","downloadFile","getFileUrl","uploadFile","deleteFile","copyFile","signUploadUrl"],f=i(e=>y.has(e),"isWriteTool"),_=i(async(e,r,u)=>{const t=F[r].input.safeParse(u);if(!t.success)return{issues:t.error.issues,ok:!1};switch(r){case"copyFile":return{ok:!0,output:await o.copyFile(e,t.data)};case"deleteFile":return{ok:!0,output:await o.deleteFile(e,t.data)};case"downloadFile":return{ok:!0,output:await o.downloadFile(e,t.data)};case"getFileMetadata":return{ok:!0,output:await o.getFileMetadata(e,t.data)};case"getFileUrl":return{ok:!0,output:await o.getFileUrl(e,t.data)};case"listFiles":return{ok:!0,output:await o.listFiles(e,t.data)};case"signUploadUrl":return{ok:!0,output:await o.signUploadUrl(e,t.data)};case"uploadFile":return{ok:!0,output:await o.uploadFile(e,t.data)};default:{const c=r;throw new Error(`Unhandled tool: ${String(c)}`)}}},"dispatch"),N=i(({files:e,overrides:r,readOnly:u=!1,requireApproval:t=!0})=>{const c=T.filter(a=>!(u&&f(a))),m=i(a=>f(a)?O(a,t):!1,"approvalFor"),g=c.map(a=>{const s=F[a],l=r?.[a];return{description:l?.description??s.description,name:a,parameters:U(s.input),strict:l?.strict??!1,type:"function"}}),w=new Set(c);return{definitions:g,execute:i(async a=>{const s=i(n=>({call_id:a.call_id,output:typeof n=="string"?n:JSON.stringify(n),type:"function_call_output"}),"wrap");if(!w.has(a.name))return s({error:`Unknown tool: ${a.name}`});let l;try{l=JSON.parse(a.arguments)}catch(n){return s({error:`Invalid JSON in arguments: ${n.message}`})}const p=await _(e,a.name,l);return p.ok?s(p.output):s({error:"Argument validation failed",issues:p.issues})},"execute"),needsApproval:m}},"createResponsesFileTools");export{N as createResponsesFileTools};
@@ -0,0 +1 @@
1
+ import"node:stream";import"node:timers";import"node:util";import{B as f,d as u,a as F}from"./storage-CoyB2O-Y.js";import"./path-D7rMc9nq-B718mbm6.js";import"type-is";import"./NoOpMetrics-Dky06sf1.js";import"./cache-qV_5Umeq.js";import"./ERRORS-CyOuSMLY.js";import"./is-expired-1JuZjDtb.js";export{f as BaseStorage,u as defaultCloudStorageFileNameValidation,F as defaultFilesystemFileNameValidation};
@@ -0,0 +1 @@
1
+ var F=Object.defineProperty;var l=(r,t)=>F(r,"name",{value:t,configurable:!0});import{PassThrough as w,Transform as P}from"node:stream";import{fileTypeFromBuffer as d}from"file-type";var g=Object.defineProperty,p=l((r,t)=>g(r,"name",{value:t,configurable:!0}),"f");const S=p(async r=>{try{return await d(r)}catch{return}},"detectFileTypeFromBuffer"),j=p(async(r,t)=>{const y=t?.sampleSize??4100;let m;const f=[];let s=0,i=!1,n;const o=new w({highWaterMark:0}),a=new P({objectMode:!1,transform(e,c,T){if(!i&&(f.push(e),s+=e.length,s>=y||s>0)){i=!0;const h=Buffer.concat(f);n=d(h).then(u=>(m=u,u)).catch(()=>{})}T(void 0,e)}});return r.pipe(a).pipe(o),r.on("error",e=>{a.destroy(e),o.destroy(e)}),a.on("error",e=>{o.destroyed||o.destroy(e)}),await Promise.race([new Promise(e=>{if(i){e();return}const c=setTimeout(e,10);a.once("data",()=>{clearTimeout(c),e()}),a.once("end",()=>{clearTimeout(c),e()})}),new Promise(e=>{setTimeout(e,10)})]),n&&await Promise.race([n.then(()=>{}),new Promise(e=>{setTimeout(e,150)})]).catch(()=>{}),{fileType:m,stream:o}},"detectFileTypeFromStream");export{S as a,j as d};
@@ -0,0 +1 @@
1
+ var t=Object.defineProperty;var n=(e,s)=>t(e,"name",{value:s,configurable:!0});var a=Object.defineProperty,o=n((e,s)=>a(e,"name",{value:s,configurable:!0}),"r");const S=o(e=>{const s=e?.key??process.env.AWS_ACCESS_KEY_ID??process.env.SPACES_KEY,r=e?.region??process.env.AWS_REGION??process.env.SPACES_REGION,c=e?.secret??process.env.AWS_SECRET_ACCESS_KEY??process.env.SPACES_SECRET;if(!r||!s||!c)throw new Error("Missing required parameters for DigitalOcean Spaces client.");return{credentials:{accessKeyId:s,secretAccessKey:c},endpoint:`https://${r}.digitaloceanspaces.com`,forcePathStyle:!1,region:"us-east-1"}},"digitalOcean");export{S as default};
@@ -0,0 +1,5 @@
1
+ var ut=Object.defineProperty;var d=(e,t)=>ut(e,"name",{value:t,configurable:!0});import{createReadStream as mt,createWriteStream as dt}from"node:fs";import{truncate as ht,stat as z,copyFile as A}from"node:fs/promises";import{Transform as K,PassThrough as yt,pipeline as ft}from"node:stream";import{f as R,l as gt,w as Q,U as b,_ as pt,i as wt,v as bt,B as vt,y as W}from"./local-meta-storage-CT1audnK.js";import{createRequire as P}from"node:module";import{K as w,C as k,M as X,L as Et,Q as St,O as $t}from"./path-D7rMc9nq-B718mbm6.js";import{g as Ot}from"./_commonjsHelpers-D6W6KoPK.js";import Tt from"crypto";import kt from"fs";import{d as Ft}from"./detect-file-type-5JhzC9RU.js";import{throwErrorCode as p,ERRORS as y,isUploadError as Nt}from"./ERRORS-CyOuSMLY.js";import{createHash as Pt}from"node:crypto";import{B as Dt,a as _t,t as jt}from"./storage-CoyB2O-Y.js";import It from"./File-BhfUgJjs.js";import{o as B,r as Mt}from"./part-match-B5fLLmFw.js";import{u as xt}from"./update-size-DANV7aa2.js";import{o as Rt}from"./has-content-Bx2p8Okx.js";var Lt=Object.defineProperty,Ct=d((e,t)=>Lt(e,"name",{value:t,configurable:!0}),"i$4"),zt=Object.defineProperty,Y=Ct((e,t)=>zt(e,"name",{value:t,configurable:!0}),"t");const At=P(import.meta.url),$=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Wt=Y(e=>{if(typeof $<"u"&&$.versions&&$.versions.node){const[t,r]=$.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return $.getBuiltinModule(e)}return At(e)},"__cjs_getBuiltinModule"),{lstat:Bt,writeFile:Ut}=Wt("node:fs/promises");var Vt=Object.defineProperty,qt=Y((e,t)=>Vt(e,"name",{value:t,configurable:!0}),"o");const M=qt(async e=>{R(e);try{const t=await Bt(e);if(!t.isFile())throw new Error(`Ensure path exists, expected 'file', got '${String(gt(t))}'`)}catch(t){if(t.code==="ENOENT"){await Q(w(b(e))),await Ut(e,new Uint8Array);return}throw t}},"ensureFile");var Ht=Object.defineProperty,G=d((e,t)=>Ht(e,"name",{value:t,configurable:!0}),"t$2"),Kt=Object.defineProperty,J=G((e,t)=>Kt(e,"name",{value:t,configurable:!0}),"t"),Qt=Object.defineProperty,Xt=J((e,t)=>Qt(e,"name",{value:t,configurable:!0}),"t");let U=class extends Error{static{d(this,"l")}static{G(this,"c")}static{J(this,"i")}static{Xt(this,"WalkError")}root;constructor(t,r){super(`${t instanceof Error?t.message:String(t)} for path "${r}"`),this.cause=t,this.root=r}get name(){return"WalkError"}set name(t){throw new Error("Cannot overwrite name of WalkError")}};var Yt=Object.defineProperty,Gt=d((e,t)=>Yt(e,"name",{value:t,configurable:!0}),"n"),Jt=Object.defineProperty,Z=Gt((e,t)=>Jt(e,"name",{value:t,configurable:!0}),"t"),Zt=Object.defineProperty,te=Z((e,t)=>Zt(e,"name",{value:t,configurable:!0}),"g");const V=te(e=>{const t=e.replace(/\.\*/g,".([^/]*)").replace(/\*\*/g,"(.*)").replace(/(?<!\.)\*(?!\*)/g,"([^/]*)").replace(/\?/g,"[^/]").replace(/\.(?!\*)/g,String.raw`\.`).replace(/\{/g,"(").replace(/\}/g,")").replace(/,/g,"|").replace(/\[!(.*?)\]/g,"[^$1]");return new RegExp(`^${t}$`)},"globToRegExp");var ee=Object.defineProperty,re=Z((e,t)=>ee(e,"name",{value:t,configurable:!0}),"n");const N=re((e,t,r,i)=>Array.isArray(t)&&t.length>0&&!t.some(o=>e.endsWith(o))||r&&!r.some(o=>o.test(e))?!1:!i?.some(o=>o.test(e)),"walkInclude");var ie=Object.defineProperty,tt=d((e,t)=>ie(e,"name",{value:t,configurable:!0}),"u$1"),ae=Object.defineProperty,L=tt((e,t)=>ae(e,"name",{value:t,configurable:!0}),"y");const se=P(import.meta.url),O=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,ne=L(e=>{if(typeof O<"u"&&O.versions&&O.versions.node){const[t,r]=O.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return O.getBuiltinModule(e)}return se(e)},"__cjs_getBuiltinModule"),{readdir:oe,realpath:ce,stat:le}=ne("node:fs/promises");var ue=Object.defineProperty,g=L((e,t)=>ue(e,"name",{value:t,configurable:!0}),"r");const me=g(async e=>{const t=Et(e),r=St(t),i=await le(t);return{isDirectory:g(()=>i.isDirectory(),"isDirectory"),isFile:g(()=>i.isFile(),"isFile"),isSymbolicLink:g(()=>i.isSymbolicLink(),"isSymbolicLink"),name:r,path:t}},"_createWalkEntry");async function*F(e,{extensions:t,followSymlinks:r=!1,includeDirs:i=!0,includeFiles:o=!0,includeSymlinks:s=!0,match:n,maxDepth:m=Number.POSITIVE_INFINITY,skip:h}={}){if(R(e),m<0)return;const a=n?n.map(c=>typeof c=="string"?V(c):c):void 0,u=h?h.map(c=>typeof c=="string"?V(c):c):void 0;if(e=k(b(e)),i&&N(e,t,a,u)&&(yield await me(e)),!(m<1||!N(e,void 0,void 0,u)))try{const c=await oe(e,{withFileTypes:!0});for(const l of c){let f=X(e,l.name);if(l.isSymbolicLink())if(r)f=await ce(f);else if(s&&N(f,t,a,u)){yield{isDirectory:g(()=>l.isDirectory(),"isDirectory"),isFile:g(()=>l.isFile(),"isFile"),isSymbolicLink:g(()=>l.isSymbolicLink(),"isSymbolicLink"),name:l.name,path:f};continue}else continue;l.isDirectory()?yield*F(f,{extensions:t,followSymlinks:r,includeDirs:i,includeFiles:o,includeSymlinks:s,match:a,maxDepth:m-1,skip:u}):l.isFile()&&o&&N(f,t,a,u)&&(yield{isDirectory:g(()=>l.isDirectory(),"isDirectory"),isFile:g(()=>l.isFile(),"isFile"),isSymbolicLink:g(()=>l.isSymbolicLink(),"isSymbolicLink"),name:l.name,path:f})}}catch(c){throw c instanceof U?c:new U(c,e)}}d(F,"f$2");tt(F,"D");L(F,"g");g(F,"walk");var de=Object.defineProperty,et=d((e,t)=>de(e,"name",{value:t,configurable:!0}),"t"),he=Object.defineProperty,C=et((e,t)=>he(e,"name",{value:t,configurable:!0}),"t");const ye=P(import.meta.url),T=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,fe=C(e=>{if(typeof T<"u"&&T.versions&&T.versions.node){const[t,r]=T.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return T.getBuiltinModule(e)}return ye(e)},"__cjs_getBuiltinModule"),{accessSync:ge}=fe("node:fs");var pe=Object.defineProperty,we=C((e,t)=>pe(e,"name",{value:t,configurable:!0}),"o");function D(e,t=pt){R(e),e=b(e);try{return ge(e,t),!0}catch{return!1}}d(D,"i$1");et(D,"d");C(D,"m");we(D,"isAccessibleSync");var be=Object.defineProperty,rt=d((e,t)=>be(e,"name",{value:t,configurable:!0}),"v"),ve=Object.defineProperty,S=rt((e,t)=>ve(e,"name",{value:t,configurable:!0}),"i");const Ee=P(import.meta.url),v=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,it=S(e=>{if(typeof v<"u"&&v.versions&&v.versions.node){const[t,r]=v.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return v.getBuiltinModule(e)}return Ee(e)},"__cjs_getBuiltinModule"),{cwd:_}=v,{mkdir:Se,rename:$e,copyFile:Oe,unlink:Te}=it("node:fs/promises"),{mkdirSync:ke,renameSync:Fe,copyFileSync:Ne,unlinkSync:Pe}=it("node:fs");var De=Object.defineProperty,at=S((e,t)=>De(e,"name",{value:t,configurable:!0}),"o");class _e extends Error{static{d(this,"V")}static{rt(this,"O")}static{S(this,"a")}static{at(this,"SameDirectoryError")}constructor(t,r){super(`Source directory "${w(t)}" does not match destination directory "${w(r)}"`),this.name="SameDirectoryError"}}const st=at((e,t)=>{if(!e||!t)throw new Error("Source and destination paths must not be empty");if(w(e)!==w(t))throw new _e(e,t)},"validateSameDirectory");var je=Object.defineProperty,Ie=S((e,t)=>je(e,"name",{value:t,configurable:!0}),"m$1");const nt=Ie(async(e,t,{cwd:r,directoryMode:i,overwrite:o,validateDirectory:s})=>{if(r&&(e=k(r,e),t=k(r,t)),s&&st(e,t),!o&&await wt(t))throw new Error(`The destination file exists: ${t}`);await Se(w(t),{mode:i,recursive:!0});try{await $e(e,t)}catch(n){if(n.code==="EXDEV")await Oe(e,t),await Te(e);else throw n}},"internalMoveFile");var Me=Object.defineProperty,xe=S((e,t)=>Me(e,"name",{value:t,configurable:!0}),"m");const ot=xe((e,t,{cwd:r,directoryMode:i,overwrite:o,validateDirectory:s})=>{if(r&&(e=k(r,e),t=k(r,t)),s&&st(e,t),!o&&D(t))throw new Error(`The destination file exists: ${t}`);ke(w(t),{mode:i,recursive:!0});try{Fe(e,t)}catch(n){if(n.code==="EXDEV")Ne(e,t),Pe(e);else throw n}},"internalMoveFileSync");var Re=Object.defineProperty,j=S((e,t)=>Re(e,"name",{value:t,configurable:!0}),"i");const Le=j(async(e,t,r={})=>{const i={overwrite:!0,validateDirectory:!1,...r,cwd:r.cwd?b(r.cwd):_()};await nt(e,t,i)},"move");j((e,t,r)=>{const i={overwrite:!0,validateDirectory:!1,...r};i.cwd=i.cwd?b(i.cwd):_(),ot(e,t,i)},"moveSync");j(async(e,t,r)=>{const i={overwrite:!0,...r,validateDirectory:!0};i.cwd=i.cwd?b(i.cwd):_(),await nt(e,t,i)},"rename");j((e,t,r)=>{const i={overwrite:!0,...r,validateDirectory:!0};i.cwd=i.cwd?b(i.cwd):_(),ot(e,t,i)},"renameSync");var x,q;function Ce(){if(q)return x;q=1;var e=Object.defineProperty,t=d((a,u)=>e(a,"name",{value:u,configurable:!0}),"i");/*!
2
+ * etag
3
+ * Copyright(c) 2014-2016 Douglas Christopher Wilson
4
+ * MIT Licensed
5
+ */x=n;var r=Tt,i=kt.Stats,o=Object.prototype.toString;function s(a){if(a.length===0)return'"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"';var u=r.createHash("sha1").update(a,"utf8").digest("base64").substring(0,27),c=typeof a=="string"?Buffer.byteLength(a,"utf8"):a.length;return'"'+c.toString(16)+"-"+u+'"'}d(s,"entitytag"),t(s,"entitytag");function n(a,u){if(a==null)throw new TypeError("argument entity is required");var c=m(a),l=u&&typeof u.weak=="boolean"?u.weak:c;if(!c&&typeof a!="string"&&!Buffer.isBuffer(a))throw new TypeError("argument entity must be string, Buffer, or fs.Stats");var f=c?h(a):s(a);return l?"W/"+f:f}d(n,"etag"),t(n,"etag");function m(a){return typeof i=="function"&&a instanceof i?!0:a&&typeof a=="object"&&"ctime"in a&&o.call(a.ctime)==="[object Date]"&&"mtime"in a&&o.call(a.mtime)==="[object Date]"&&"ino"in a&&typeof a.ino=="number"&&"size"in a&&typeof a.size=="number"}d(m,"isstats"),t(m,"isstats");function h(a){var u=a.mtime.getTime().toString(16),c=a.size.toString(16);return'"'+c+"-"+u+'"'}return d(h,"stattag"),t(h,"stattag"),x}d(Ce,"requireEtag");var ze=Ce();const Ae=Ot(ze);var We=Object.defineProperty,ct=d((e,t)=>We(e,"name",{value:t,configurable:!0}),"r");class Be extends K{static{d(this,"StreamChecksum")}constructor(t,r,i="base64"){super(),this.checksum=t,this.algorithm=r,this.encoding=i,this.hash=Pt(r)}checksum;algorithm;encoding;static{ct(this,"StreamChecksum")}length=0;digest="";hash;get calculatedDigest(){return this.digest}_transform(t,r,i){this.push(t),this.hash.update(t),this.length+=t.length,i()}_flush(t){this.digest=this.hash.digest(this.encoding),this.checksum&&this.checksum!==this.digest?t(new Error("Checksum mismatch")):t()}}const Ue=ct((e,t,r="base64")=>t?new Be(e,t,r):new yt,"streamChecksum");var Ve=Object.defineProperty,qe=d((e,t)=>Ve(e,"name",{value:t,configurable:!0}),"o");class He extends K{static{d(this,"m")}constructor(t=Number.POSITIVE_INFINITY){super(),this.limit=t}limit;static{qe(this,"StreamLength")}length=0;_transform(t,r,i){const o=this.length+t.length;this.limit>=o?(this.push(t),this.length=o,i()):i(new Error("Stream length limit exceeded"))}}var Ke=Object.defineProperty,H=d((e,t)=>Ke(e,"name",{value:t,configurable:!0}),"E");class E extends Dt{static name="disk";checksumTypes=["md5","sha1"];get raw(){return{directory:this.directory}}directory;meta;constructor(t){const r={...t,fileNameValidation:t.fileNameValidation??_t};if(super(r),this.directory=r.directory,r.metaStorage)this.meta=r.metaStorage;else{const i={...r,...r.metaStorageConfig,logger:this.logger};this.meta=new bt(i)}this.isReady=!1,this.accessCheck().then(()=>{this.isReady=!0}).catch(i=>{this.logger?.error("Storage access check failed: %O",i)})}normalizeError(t){return super.normalizeError(t)}async create(t){return this.instrumentOperation("create",async()=>{const r={...t};if(t.ttl){const s=typeof t.ttl=="string"?jt(t.ttl):t.ttl;s!==void 0&&(r.expiredAt=Date.now()+s)}r.size!==void 0&&Number(r.size)<0&&p(y.REQUEST_ENTITY_TOO_LARGE,"Request entity too large");const i=new It(r);try{const s=await this.getMeta(i.id);if(s.status==="completed")return s}catch{}i.name=this.namingFunction(i),(i.size===void 0||Number.isNaN(i.size))&&(i.size===void 0||(i.size=this.maxUploadSize)),await this.validate(i);const o=this.getFilePath(i.name);try{await M(o),i.bytesWritten=0}catch(s){const n=this.normalizeError(s instanceof Error?s:new Error(String(s)));await this.onError(n),p(y.FILE_ERROR,n.message)}return i.status=B(i),await this.saveMeta(i),await this.onCreate(i),i})}async write(t){return this.instrumentOperation("write",async()=>{let r;if("contentType"in t&&"metadata"in t&&!("body"in t)&&!("start"in t)?r=t:(r=await this.getMeta(t.id),await this.checkIfExpired(r)),r.status==="completed")return r;if(t.size!==void 0&&xt(r,t.size),!Mt(t,r))return p(y.FILE_CONFLICT);const i=this.getFilePath(r.name),o=await this.lock(i);try{const s=t.start||0;if(await M(i),r.bytesWritten===0&&(r.bytesWritten=s),Rt(t)){if(this.isUnsupportedChecksum(t.checksumAlgorithm))return p(y.UNSUPPORTED_CHECKSUM_ALGORITHM);if((t.start===0||t.start===void 0)&&(r.bytesWritten===0||Number.isNaN(r.bytesWritten))&&(!r.contentType||r.contentType==="application/octet-stream"))try{const{fileType:c,stream:l}=await Ft(t.body);c?.mime&&(r.contentType=c.mime),t.body=l}catch{}const n=t.signal,m={...r,...t,body:t.body};n&&(m.signal=n);const[h,a]=await this.lazyWrite(m);if(a)return await ht(i,r.bytesWritten),p(a);const u=s+(t.contentLength||0);r.bytesWritten=Math.max(r.bytesWritten||0,u),r.bytesWritten=Math.max(r.bytesWritten||0,h),r.status=B(r),await this.saveMeta(r)}else await M(i),r.bytesWritten=0;return r}catch(s){if(Nt(s))throw s;const n=this.normalizeError(s instanceof Error?s:new Error(String(s)));return await this.onError(n),p(y.FILE_ERROR,(typeof n.message=="string"?n.message:String(s))||String(s))}finally{await this.unlock(i,o)}})}async get({id:t}){return this.instrumentOperation("get",async()=>{const r=await this.checkIfExpired(await this.meta.get(t)),{bytesWritten:i,contentType:o,expiredAt:s,metadata:n,modifiedAt:m,name:h,originalName:a,size:u}=r;let c;try{c=await vt(this.getFilePath(h),{buffer:!0})}catch(l){const f=l;if(f.code==="ENOENT"||f.code==="EPERM"){const I=this.normalizeError(l instanceof Error?l:new Error(f.message||String(l)));return await this.onError(I),p(y.FILE_NOT_FOUND,(typeof I.message=="string"?I.message:String(l))||String(l))}const lt=this.normalizeError(l instanceof Error?l:new Error(String(l)));throw await this.onError(lt),l}return{content:c,contentType:o,ETag:Ae(c),expiredAt:s,id:t,metadata:n,modifiedAt:m,name:h,originalName:a,size:u||i}})}async exists({id:t}){return this.instrumentOperation("exists",async()=>{try{const r=await this.getMeta(t),i=this.getFilePath(r.name);return await z(i),!0}catch{return!1}})}async getStream({id:t}){return this.instrumentOperation("getStream",async()=>{try{const r=await this.checkIfExpired(await this.meta.get(t)),{bytesWritten:i,contentType:o,expiredAt:s,modifiedAt:n,name:m,size:h}=r,a=mt(this.getFilePath(m));return{headers:{"Content-Length":String(h||i),"Content-Type":o,...s&&{"X-Upload-Expires":s.toString()},...n&&{"Last-Modified":n.toString()}},size:h||i,stream:a}}catch(r){const i=this.normalizeError(r instanceof Error?r:new Error(String(r)));throw await this.onError(i),p(y.FILE_NOT_FOUND,(typeof i.message=="string"?i.message:String(r))||String(r))}})}async delete({id:t}){return this.instrumentOperation("delete",async()=>{const r=await this.getMeta(t);await W(this.getFilePath(r.name)),await this.deleteMeta(t);const i={...r,status:"deleted"};return await this.onDelete(i),i})}async copy(t,r){return this.instrumentOperation("copy",async()=>{E.assertSafeId(t),E.assertSafeId(r);const i=await this.getMeta(t);return await A(this.getFilePath(i.name),this.getFilePath(r)),{...i,name:r}})}async move(t,r){return this.instrumentOperation("move",async()=>{E.assertSafeId(t),E.assertSafeId(r);const i=await this.getMeta(t),o=this.getFilePath(i.name),s=this.getFilePath(r);try{await Le(o,s)}catch(n){if(n?.code==="EXDEV")await A(o,s),await W(o);else{const m=this.normalizeError(n instanceof Error?n:new Error(String(n)));throw await this.onError(m),n}}return{...i,id:i.id,name:r}})}async list(){return this.instrumentOperation("list",async()=>{const t={followSymlinks:!1,includeDirs:!1,includeFiles:!0,skip:["*.META$"]},r=[],{directory:i}=this;for await(const o of F(i,t)){const{suffix:s}=this.meta,{path:n}=o;if(!n.includes(s)){const{birthtime:m,ctime:h,mtime:a}=await z(n);r.push({createdAt:m||h,id:n.replace(i,""),modifiedAt:a})}}return r})}getFilePath(t){return E.assertSafeId(t),$t(t)&&p(y.INVALID_FILE_NAME,`Invalid file id: "${t}"`),X(this.directory,t)}lazyWrite(t){return new Promise((r,i)=>{const o=dt(this.getFilePath(t.name),{flags:"r+",start:t.start}),s=new He(t.contentLength||t.size-t.start),n=Ue(t.checksum,t.checksumAlgorithm),m=!t.checksum,{signal:h}=t,a=H(()=>{o.close(),s.destroy(),n.destroy()},"cleanupStreams"),u=H(c=>{a(),r([Number.NaN,c])},"failWithCode");if(s.on("error",()=>{u(y.FILE_CONFLICT)}),n.on("error",()=>{u(y.CHECKSUM_MISMATCH)}),t.body.on("aborted",()=>{u(m?void 0:y.REQUEST_ABORTED)}),t.body.on("error",c=>{a(),i(c)}),h?.aborted){u(m?void 0:y.REQUEST_ABORTED);return}h&&h.addEventListener("abort",()=>{a(),o.destroy(),s.destroy(),n.destroy(),t.body.destroy(),r([Number.NaN,m?void 0:y.REQUEST_ABORTED])}),ft(t.body,s,n,o,c=>{if(c){if(a(),h?.aborted){r([Number.NaN,m?void 0:y.REQUEST_ABORTED]);return}r([Number.NaN,y.FILE_ERROR]);return}r([t.start+o.bytesWritten])})})}async accessCheck(){await Q(this.directory)}}export{E as f,He as m,Ue as s,M as y};
@@ -1,4 +1,4 @@
1
- import { F as File, M as MetaStorage, D as DiskStorageOptions, H as HttpError, b as FileInit, d as FilePart, e as FileQuery, a as FileReturn, E as ERRORS, B as BaseStorage, h as DiskStorageWithChecksumOptions } from "./storage.d-BOMUJD96.js";
1
+ import { F as File, M as MetaStorage, D as DiskStorageOptions, H as HttpError, e as FileInit, f as FilePart, g as FileQuery, a as FileReturn, E as ERRORS, B as BaseStorage, h as DiskStorageWithChecksumOptions } from "./storage.d-Cr6f2lac.js";
2
2
  import { Readable } from 'node:stream';
3
3
  /**
4
4
  * Local disk-based storage implementation.
@@ -21,6 +21,9 @@ import { Readable } from 'node:stream';
21
21
  declare class DiskStorage<TFile extends File = File> extends BaseStorage<TFile> {
22
22
  static override readonly name: string;
23
23
  override checksumTypes: string[];
24
+ override get raw(): {
25
+ directory: string;
26
+ };
24
27
  directory: string;
25
28
  meta: MetaStorage<TFile>;
26
29
  constructor(config: DiskStorageOptions<TFile>);
@@ -125,9 +128,8 @@ declare class DiskStorage<TFile extends File = File> extends BaseStorage<TFile>
125
128
  */
126
129
  override list(): Promise<TFile[]>;
127
130
  /**
128
- * Returns path for the uploaded file
129
- * If filename is already an absolute path, returns it as-is.
130
- * Otherwise, joins it with the storage directory.
131
+ * Returns the absolute on-disk path for the uploaded file, always rooted at
132
+ * `this.directory`. Absolute inputs and `..` traversals are rejected.
131
133
  */
132
134
  protected getFilePath(filename: string): string;
133
135
  protected lazyWrite(part: File & FilePart): Promise<[number, ERRORS?]>;
@@ -0,0 +1 @@
1
+ var m=Object.defineProperty;var p=(t,n)=>m(t,"name",{value:n,configurable:!0});import*as e from"zod";const y=1024*1024,u=e.object({limit:e.int().positive().max(1e3).optional().meta({description:"Maximum number of items to return"}),prefix:e.string().trim().optional().meta({description:"Only return keys that start with this prefix"})}),f=e.object({key:e.string().trim().meta({description:"The object key to inspect"})}),g=e.object({binary:e.boolean().optional().meta({description:"When true, returns base64-encoded bytes instead of UTF-8 text"}),key:e.string().trim().meta({description:"The object key to download"}),maxBytes:e.int().positive().optional().meta({description:`Reject downloads larger than this byte count (default ${y}). Verified via head() before transferring.`})}),b=e.object({expiresIn:e.int().positive().optional().meta({description:"Override the adapter default URL expiry in seconds. Ignored by permanent-CDN adapters."}),key:e.string().trim().meta({description:"The object key to build a URL for"}),responseContentDisposition:e.string().trim().optional().meta({description:`Force a Content-Disposition header on the response (e.g. 'attachment; filename="f.txt"'). Strongly recommended for user-uploaded content to prevent inline rendering of HTML/SVG.`})}),h=e.object({content:e.string().meta({description:'File body. Treated as UTF-8 text unless encoding is "base64".'}),contentType:e.string().trim().optional().meta({description:"MIME type recorded with the object"}),encoding:e.enum(["text","base64"]).optional().meta({description:"How to interpret content (default: text)"}),key:e.string().trim().meta({description:"Destination object key"}),metadata:e.record(e.string().trim(),e.string()).optional().meta({description:"Custom string metadata to attach to the object"})}),F=e.object({key:e.string().trim().meta({description:"Object key to delete"})}),k=e.object({from:e.string().trim().meta({description:"Source object key"}),to:e.string().trim().meta({description:"Destination object key"})}),w=e.object({contentType:e.string().trim().optional().meta({description:"Content-Type that the upload must declare"}),expiresIn:e.int().positive().meta({description:"Lifetime of the presigned URL in seconds"}),key:e.string().trim().meta({description:"Destination object key"})}),M={copyFile:{description:"Copy a file to a new key within the configured bucket. The source remains intact.",input:k},deleteFile:{description:"Permanently delete a file from the configured bucket.",input:F},downloadFile:{description:"Download a file and return its contents. Returns UTF-8 text by default; set binary=true to receive base64-encoded bytes. Files larger than maxBytes are rejected before transfer.",input:g},getFileMetadata:{description:"Fetch metadata for a single file (size, content type, etag, custom metadata) without transferring its body.",input:f},getFileUrl:{description:"Return a signed, time-limited URL the caller can use to fetch a file. Adapters that don't support presigning will throw MethodNotAllowed.",input:b},listFiles:{description:"List files in the configured bucket, optionally filtered by key prefix.",input:u},signUploadUrl:{description:"Issue a presigned URL that lets a client upload directly to the configured bucket. Approval-gated by default — the URL grants upload permission until it expires.",input:w},uploadFile:{description:'Upload a file to the configured bucket. Pass content as UTF-8 text by default, or as base64 with encoding="base64" for binary payloads.',input:h}},T=["uploadFile","deleteFile","copyFile","signUploadUrl"],S=new Set(T);var x=Object.defineProperty,s=p((t,n)=>x(t,"name",{value:n,configurable:!0}),"r");const l=s(t=>{if(t!==void 0)return t instanceof Date?t.toISOString():typeof t=="number"?new Date(t).toISOString():t},"serializeLastModified"),j={copyFile:s(async(t,{from:n,to:i})=>{const o=await t.copy(n,i);return{copied:!0,etag:o.etag,from:n,key:o.key,to:i}},"copyFile"),deleteFile:s(async(t,{key:n})=>(await t.delete(n),{deleted:!0,key:n}),"deleteFile"),downloadFile:s(async(t,{binary:n,key:i,maxBytes:o})=>{const r=o??y,c=await t.head(i);if(typeof c.size=="number"&&c.size>r)throw new RangeError(`downloadFile refused: "${i}" is ${c.size} bytes which exceeds the maxBytes limit of ${r}. Use getFileUrl to delegate to the client, or raise maxBytes.`);const a=await t.download(i);if(a.body.byteLength>r)throw new RangeError(`downloadFile refused: "${i}" returned ${a.body.byteLength} bytes which exceeds the maxBytes limit of ${r}. Use getFileUrl instead.`);return n?{content:a.body.toString("base64"),contentType:a.contentType,encoding:"base64",key:a.key,...typeof a.size=="number"?{size:a.size}:{}}:{content:a.body.toString("utf8"),contentType:a.contentType,encoding:"text",key:a.key,...typeof a.size=="number"?{size:a.size}:{}}},"downloadFile"),getFileMetadata:s(async(t,{key:n})=>{const i=await t.head(n);return{contentType:i.contentType,...i.etag?{etag:i.etag}:{},key:i.key,...l(i.lastModified)?{lastModified:l(i.lastModified)}:{},...i.metadata?{metadata:i.metadata}:{},...typeof i.size=="number"?{size:i.size}:{}}},"getFileMetadata"),getFileUrl:s(async(t,{expiresIn:n,key:i,responseContentDisposition:o})=>{const r=await t.url(i,{expiresIn:n,responseContentDisposition:o});return{key:i,url:r}},"getFileUrl"),listFiles:s(async(t,{limit:n,prefix:i})=>({items:(await t.list({limit:n,prefix:i})).map(o=>({contentType:o.contentType,...o.etag?{etag:o.etag}:{},key:o.key,...l(o.lastModified)?{lastModified:l(o.lastModified)}:{},...typeof o.size=="number"?{size:o.size}:{}}))}),"listFiles"),signUploadUrl:s(async(t,{contentType:n,expiresIn:i,key:o})=>{const r=await t.signedUploadUrl(o,{contentType:n,expiresIn:i});return{key:o,url:r}},"signUploadUrl"),uploadFile:s(async(t,{content:n,contentType:i,encoding:o,key:r,metadata:c})=>{const a=o==="base64"?Buffer.from(n,"base64"):Buffer.from(n,"utf8"),d=await t.upload(r,a,{contentType:i,metadata:c});return{contentType:d.contentType,...d.etag?{etag:d.etag}:{},key:d.key,...l(d.lastModified)?{lastModified:l(d.lastModified)}:{},...typeof d.size=="number"?{size:d.size}:{}}},"uploadFile")};export{M as T,S as W,j as e};
@@ -0,0 +1,65 @@
1
+ import { F as Files } from "./index.d-DotjipuX.js";
2
+ import { C as CopyFileInput, D as DeleteFileInput, a as DownloadFileInput, G as GetFileMetadataInput, b as GetFileUrlInput, L as ListFilesInput, S as SignUploadUrlInput, U as UploadFileInput } from "./approval.d-CMAYH9GF.js";
3
+ interface CopyFileResult {
4
+ copied: true;
5
+ etag: string | undefined;
6
+ from: string;
7
+ key: string;
8
+ to: string;
9
+ }
10
+ interface DeleteFileResult {
11
+ deleted: true;
12
+ key: string;
13
+ }
14
+ interface DownloadFileResult {
15
+ content: string;
16
+ contentType: string | undefined;
17
+ encoding: "base64" | "text";
18
+ key: string;
19
+ size?: number;
20
+ }
21
+ interface FileMetadataResult {
22
+ contentType: string | undefined;
23
+ etag?: string;
24
+ key: string;
25
+ lastModified?: string;
26
+ metadata?: Record<string, unknown>;
27
+ size?: number;
28
+ }
29
+ interface FileUrlResult {
30
+ key: string;
31
+ url: string;
32
+ }
33
+ interface ListFilesItem {
34
+ contentType: string | undefined;
35
+ etag?: string;
36
+ key: string;
37
+ lastModified?: string;
38
+ size?: number;
39
+ }
40
+ interface ListFilesResult {
41
+ items: ListFilesItem[];
42
+ }
43
+ interface SignUploadUrlResult {
44
+ key: string;
45
+ url: string;
46
+ }
47
+ interface UploadFileResult {
48
+ contentType: string | undefined;
49
+ etag?: string;
50
+ key: string;
51
+ lastModified?: string;
52
+ size?: number;
53
+ }
54
+ interface Executors {
55
+ copyFile: (files: Files, input: CopyFileInput) => Promise<CopyFileResult>;
56
+ deleteFile: (files: Files, input: DeleteFileInput) => Promise<DeleteFileResult>;
57
+ downloadFile: (files: Files, input: DownloadFileInput) => Promise<DownloadFileResult>;
58
+ getFileMetadata: (files: Files, input: GetFileMetadataInput) => Promise<FileMetadataResult>;
59
+ getFileUrl: (files: Files, input: GetFileUrlInput) => Promise<FileUrlResult>;
60
+ listFiles: (files: Files, input: ListFilesInput) => Promise<ListFilesResult>;
61
+ signUploadUrl: (files: Files, input: SignUploadUrlInput) => Promise<SignUploadUrlResult>;
62
+ uploadFile: (files: Files, input: UploadFileInput) => Promise<UploadFileResult>;
63
+ }
64
+ declare const executors: Executors;
65
+ export { executors as e };
@@ -1 +1 @@
1
- var g=Object.defineProperty;var o=(s,t)=>g(s,"name",{value:t,configurable:!0});import{randomUUID as y}from"node:crypto";import{request as f}from"gaxios";import{GoogleAuth as C}from"google-auth-library";import v from"./MetaStorage-Y4m1dWgd.js";import{stringifyMetadata as R,parseMetadata as E}from"./Metadata-B6Ir0KO7.js";import n from"./GCSConfig-BQ0OpVhe.js";import{o as $}from"./has-content-Bx2p8Okx.js";var I="@visulima/storage",P="1.0.0-alpha.25";const i={name:I,version:P};var A=Object.defineProperty,u=o((s,t)=>A(s,"name",{value:t,configurable:!0}),"n");const T=u(s=>{const t=s.match(/(\d+)-(\d+)/),e=t?.[2]?+t[2]:0;return e>0?e+1:0},"getRangeEnd"),G=u(s=>{if($(s)){const t=s.contentLength?s.start+s.contentLength-1:"*";return`bytes ${s.start}-${t}/${s.size??"*"}`}return`bytes */${s.size??"*"}`},"buildContentRange"),U=u(s=>{if(s.response!==void 0){const{response:t}=s;return t?.data?.error?.errors?.map(({reason:e=""})=>e==="rateLimitExceeded"||e==="userRateLimitExceeded"?!0:!!(e&&e.includes("EAI_AGAIN"))).includes(!0)}return!1},"shouldRetry"),w={retry:3,shouldRetry:U,statusCodesToRetry:[[408,429,500,502,503,504],[100,199],[429],[500,599]]};var b=Object.defineProperty,j=o((s,t)=>b(s,"name",{value:t,configurable:!0}),"p");class N extends v{static{o(this,"E")}constructor(t){super(t),this.config=t;const{authClient:e,...a}=t,r=a.bucket||process.env.GCS_BUCKET;if(e===void 0){if(!r)throw new Error("GCS bucket is not defined");if(!a.projectId)throw new Error("Sorry, we cannot connect to Cloud Services without a project ID.");a.scopes||=n.authScopes,this.authClient=new C(a)}else this.authClient=e;this.storageBaseURI=`${a.storageAPI||n.storageAPI}/${r}/o`,this.uploadBaseURI=`${a.uploadAPI||n.uploadAPI}/${r}/o`;const h=["storage.googleapis.com"],d=new URL(this.storageBaseURI).hostname;this.isCustomEndpoint=!h.includes(d);const{retryOptions:m,useAuthWithCustomEndpoint:p,userProject:l}=t;this.userProject=l,this.useAuthWithCustomEndpoint=p||!1,this.retryOptions={...w,...m},e===void 0&&this.accessCheck().catch(c=>{throw c.code==="404"?new Error(`Bucket ${r} does not exist`):c})}config;static{j(this,"GCSMetaStorage")}authClient;storageBaseURI;uploadBaseURI;isCustomEndpoint=!1;retryOptions={};useAuthWithCustomEndpoint;userProject;async save(t,e){const a={...e};return a.metadata&&(a.metadata=R(e.metadata)),await this.makeRequest({body:JSON.stringify(a),headers:{"Content-Type":"application/json; charset=utf-8"},method:"POST",params:{name:encodeURIComponent(this.getMetaName(t)),uploadType:"media"},url:this.uploadBaseURI}),e}async delete(t){const e=this.getMetaPath(t);await this.makeRequest({method:"DELETE",url:e})}async get(t){const e=this.getMetaPath(t),{data:a}=await this.makeRequest({params:{alt:"media"},url:e});return a.metadata&&typeof a.metadata=="string"&&(a.metadata=E(a.metadata)),a}async touch(t,e){return this.save(t,e)}async accessCheck(){return this.makeRequest({url:this.storageBaseURI.replace("/o","")})}getMetaPath(t){return`${this.storageBaseURI}/${this.getMetaName(t)}`}async makeRequest(t){return typeof t.url=="string"&&(t.url=t.url.replaceAll("/:",":")),t={...t,headers:{"User-Agent":`${i.name}/${i.version}`,"x-goog-api-client":`gl-node/${process.versions.node} gccl/${i.version} gccl-invocation-id/${y()}`},params:{...this.userProject===void 0?{}:{userProject:this.userProject}},retry:!0,retryConfig:this.retryOptions,timeout:6e4},this.isCustomEndpoint&&!this.useAuthWithCustomEndpoint?f(t):this.authClient.request(t)}}export{N as E,G as b,i as d,T as g,w as r};
1
+ var g=Object.defineProperty;var o=(s,t)=>g(s,"name",{value:t,configurable:!0});import{randomUUID as y}from"node:crypto";import{request as f}from"gaxios";import{GoogleAuth as C}from"google-auth-library";import v from"./MetaStorage-Y4m1dWgd.js";import{stringifyMetadata as R,parseMetadata as E}from"./Metadata-B6Ir0KO7.js";import n from"./GCSConfig-BQ0OpVhe.js";import{o as $}from"./has-content-Bx2p8Okx.js";var I="@visulima/storage",P="1.0.0-alpha.26";const i={name:I,version:P};var A=Object.defineProperty,u=o((s,t)=>A(s,"name",{value:t,configurable:!0}),"n");const T=u(s=>{const t=s.match(/(\d+)-(\d+)/),e=t?.[2]?+t[2]:0;return e>0?e+1:0},"getRangeEnd"),G=u(s=>{if($(s)){const t=s.contentLength?s.start+s.contentLength-1:"*";return`bytes ${s.start}-${t}/${s.size??"*"}`}return`bytes */${s.size??"*"}`},"buildContentRange"),U=u(s=>{if(s.response!==void 0){const{response:t}=s;return t?.data?.error?.errors?.map(({reason:e=""})=>e==="rateLimitExceeded"||e==="userRateLimitExceeded"?!0:!!(e&&e.includes("EAI_AGAIN"))).includes(!0)}return!1},"shouldRetry"),w={retry:3,shouldRetry:U,statusCodesToRetry:[[408,429,500,502,503,504],[100,199],[429],[500,599]]};var b=Object.defineProperty,j=o((s,t)=>b(s,"name",{value:t,configurable:!0}),"p");class N extends v{static{o(this,"E")}constructor(t){super(t),this.config=t;const{authClient:e,...a}=t,r=a.bucket||process.env.GCS_BUCKET;if(e===void 0){if(!r)throw new Error("GCS bucket is not defined");if(!a.projectId)throw new Error("Sorry, we cannot connect to Cloud Services without a project ID.");a.scopes||=n.authScopes,this.authClient=new C(a)}else this.authClient=e;this.storageBaseURI=`${a.storageAPI||n.storageAPI}/${r}/o`,this.uploadBaseURI=`${a.uploadAPI||n.uploadAPI}/${r}/o`;const h=["storage.googleapis.com"],d=new URL(this.storageBaseURI).hostname;this.isCustomEndpoint=!h.includes(d);const{retryOptions:m,useAuthWithCustomEndpoint:p,userProject:l}=t;this.userProject=l,this.useAuthWithCustomEndpoint=p||!1,this.retryOptions={...w,...m},e===void 0&&this.accessCheck().catch(c=>{throw c.code==="404"?new Error(`Bucket ${r} does not exist`):c})}config;static{j(this,"GCSMetaStorage")}authClient;storageBaseURI;uploadBaseURI;isCustomEndpoint=!1;retryOptions={};useAuthWithCustomEndpoint;userProject;async save(t,e){const a={...e};return a.metadata&&(a.metadata=R(e.metadata)),await this.makeRequest({body:JSON.stringify(a),headers:{"Content-Type":"application/json; charset=utf-8"},method:"POST",params:{name:encodeURIComponent(this.getMetaName(t)),uploadType:"media"},url:this.uploadBaseURI}),e}async delete(t){const e=this.getMetaPath(t);await this.makeRequest({method:"DELETE",url:e})}async get(t){const e=this.getMetaPath(t),{data:a}=await this.makeRequest({params:{alt:"media"},url:e});return a.metadata&&typeof a.metadata=="string"&&(a.metadata=E(a.metadata)),a}async touch(t,e){return this.save(t,e)}async accessCheck(){return this.makeRequest({url:this.storageBaseURI.replace("/o","")})}getMetaPath(t){return`${this.storageBaseURI}/${this.getMetaName(t)}`}async makeRequest(t){return typeof t.url=="string"&&(t.url=t.url.replaceAll("/:",":")),t={...t,headers:{"User-Agent":`${i.name}/${i.version}`,"x-goog-api-client":`gl-node/${process.versions.node} gccl/${i.version} gccl-invocation-id/${y()}`},params:{...this.userProject===void 0?{}:{userProject:this.userProject}},retry:!0,retryConfig:this.retryOptions,timeout:6e4},this.isCustomEndpoint&&!this.useAuthWithCustomEndpoint?f(t):this.authClient.request(t)}}export{N as E,G as b,i as d,T as g,w as r};
@@ -0,0 +1 @@
1
+ var c=Object.defineProperty;var o=(e,r)=>c(e,"name",{value:r,configurable:!0});var E=Object.defineProperty,a=o((e,r)=>E(e,"name",{value:r,configurable:!0}),"s");const t=new Set(["fsn1","hel1","nbg1"]),_=a(e=>{const r=e?.accessKeyId??process.env.AWS_ACCESS_KEY_ID??process.env.HETZNER_ACCESS_KEY_ID??process.env.HETZNER_ACCESS_KEY,s=e?.location??process.env.HETZNER_LOCATION,n=e?.secretAccessKey??process.env.AWS_SECRET_ACCESS_KEY??process.env.HETZNER_SECRET_ACCESS_KEY??process.env.HETZNER_SECRET_KEY;if(!r||!n||!s)throw new Error("Missing required parameters for Hetzner Object Storage client.");if(!t.has(s))throw new Error(`Invalid Hetzner location "${s}". Expected one of: ${[...t].join(", ")}.`);return{credentials:{accessKeyId:r,secretAccessKey:n},endpoint:`https://${s}.your-objectstorage.com`,forcePathStyle:!1,region:s}},"hetzner");export{_ as default};
@@ -0,0 +1,89 @@
1
+ import { B as BaseStorage } from "./storage.d-Cr6f2lac.js";
2
+ /**
3
+ * Web-standard and Node-native body types accepted by {@link Files.upload}.
4
+ */
5
+ type FileBody = ArrayBuffer | ArrayBufferView | Blob | Buffer | NodeJS.ReadableStream | ReadableStream<Uint8Array> | string;
6
+ interface UploadOptions {
7
+ contentType?: string;
8
+ metadata?: Record<string, unknown>;
9
+ /**
10
+ * Explicit byte length. Required for {@link NodeJS.ReadableStream} and Web `ReadableStream`
11
+ * inputs because their length is not derivable from the value itself; ignored otherwise.
12
+ */
13
+ size?: number;
14
+ storageClass?: string;
15
+ }
16
+ interface SignedReadUrlOptions {
17
+ expiresIn?: number;
18
+ responseContentDisposition?: string;
19
+ responseContentType?: string;
20
+ }
21
+ interface SignedUploadUrlOptions {
22
+ contentLength?: number;
23
+ contentType?: string;
24
+ expiresIn?: number;
25
+ }
26
+ interface ListOptions {
27
+ limit?: number;
28
+ prefix?: string;
29
+ }
30
+ /**
31
+ * Provider-agnostic metadata-only view of an object.
32
+ */
33
+ interface FileObject {
34
+ contentType: string;
35
+ etag?: string;
36
+ key: string;
37
+ lastModified?: Date | number | string;
38
+ metadata?: Record<string, unknown>;
39
+ size?: number;
40
+ }
41
+ interface DownloadResult extends FileObject {
42
+ body: Buffer;
43
+ }
44
+ interface FilesOptions<TStorage extends BaseStorage = BaseStorage> {
45
+ adapter: TStorage;
46
+ }
47
+ /**
48
+ * Files-SDK–style unified facade over a {@link BaseStorage} instance.
49
+ *
50
+ * Provides a small, consistent surface (`upload`, `download`, `head`, `delete`, `copy`,
51
+ * `list`, `url`, `signedUploadUrl`) and a `raw` escape hatch to the adapter's native client.
52
+ *
53
+ * The facade uses the user-supplied `key` as both the storage path and the metadata id,
54
+ * so subsequent operations look up the object by the same key that was used to upload it.
55
+ * @example
56
+ * ```ts
57
+ * import { Files, S3Storage } from "@visulima/storage";
58
+ *
59
+ * const files = new Files({
60
+ * adapter: new S3Storage({ bucket: "uploads", region: "us-east-1" }),
61
+ * });
62
+ *
63
+ * await files.upload("avatars/abc.png", buffer, { contentType: "image/png" });
64
+ * const head = await files.head("avatars/abc.png");
65
+ * const url = await files.url("avatars/abc.png", { expiresIn: 900 });
66
+ * ```
67
+ */
68
+ declare class Files<TStorage extends BaseStorage = BaseStorage> {
69
+ readonly adapter: TStorage;
70
+ constructor(options: FilesOptions<TStorage>);
71
+ /**
72
+ * Escape hatch to the adapter's native client (S3Client, BlobServiceClient, ...).
73
+ * Typed via the `TStorage` parameter, so pinning the adapter type at construction yields a
74
+ * typed view of the native client. Returns `undefined` when the adapter has no native client
75
+ * (e.g. DiskStorage).
76
+ */
77
+ get raw(): TStorage["raw"];
78
+ upload(key: string, body: FileBody, options?: UploadOptions): Promise<FileObject>;
79
+ download(key: string): Promise<DownloadResult>;
80
+ head(key: string): Promise<FileObject>;
81
+ delete(key: string): Promise<void>;
82
+ copy(source: string, destination: string, options?: {
83
+ storageClass?: string;
84
+ }): Promise<FileObject>;
85
+ list(options?: ListOptions): Promise<FileObject[]>;
86
+ url(key: string, options?: SignedReadUrlOptions): Promise<string>;
87
+ signedUploadUrl(key: string, options?: SignedUploadUrlOptions): Promise<string>;
88
+ }
89
+ export { DownloadResult as D, Files as F, ListOptions as L, SignedReadUrlOptions as S, UploadOptions as U, FileBody as a, FileObject as b, FilesOptions as c, SignedUploadUrlOptions as d };
@@ -0,0 +1 @@
1
+ var b=Object.defineProperty;var d=(e,t)=>b(e,"name",{value:t,configurable:!0});var R=Object.defineProperty,i=d((e,t)=>R(e,"name",{value:t,configurable:!0}),"o");const l={backoffMultiplier:2,calculateDelay:void 0,initialDelay:1e3,maxDelay:3e4,maxRetries:3,retryableStatusCodes:[408,429,500,502,503,504],shouldRetry:i(()=>!1,"shouldRetry")},p=i((e,t,a,o)=>{const r=Math.min(t*a**e,o);return Math.floor(Math.random()*r)},"calculateExponentialBackoff"),D=i(e=>new Promise(t=>{setTimeout(t,e)}),"sleep"),h=i((e,t=l.retryableStatusCodes)=>{if(e instanceof Error){const a=e.code,o=e.name;if(a==="ECONNRESET"||a==="ETIMEDOUT"||a==="ENOTFOUND"||a==="ECONNREFUSED"||a==="EAI_AGAIN"||o==="NetworkError"||o==="TimeoutError")return!0;const r=e;if(r.$metadata){const u=r.$metadata.httpStatusCode;if(u&&t.includes(u)||r.$fault==="server")return!0}if(r.statusCode&&t.includes(r.statusCode))return!0;const{retryable:s}=r;return s===!0||typeof s=="string"&&s==="true"}return!1},"isRetryableError"),C=i(async(e,t={})=>{const{backoffMultiplier:a=l.backoffMultiplier,calculateDelay:o=l.calculateDelay,initialDelay:r=l.initialDelay,maxDelay:s=l.maxDelay,maxRetries:u=l.maxRetries,retryableStatusCodes:m=l.retryableStatusCodes,shouldRetry:E=l.shouldRetry}=t;let f;for(let n=0;n<=u;n+=1)try{return await e()}catch(c){if(f=c,n>=u)break;if(!(E(c)||h(c,m)))throw c;const y=o?o(n,c):p(n,r,a,s);y!==void 0&&y>0&&await D(y)}throw f},"retry"),N=i((e={})=>t=>C(t,e),"createRetryWrapper");export{N as createRetryWrapper,h as isRetryableError,C as retry};
@@ -0,0 +1 @@
1
+ var o=Object.defineProperty;var n=(e,i)=>o(e,"name",{value:i,configurable:!0});import{toolDefinition as t}from"@tanstack/ai";import{T as l,e as p}from"./executors-DG6hGtvm.js";var d=Object.defineProperty,r=n((e,i)=>d(e,"name",{value:i,configurable:!0}),"i");const u=r(e=>t({description:l.listFiles.description,inputSchema:l.listFiles.input,name:"listFiles"}).server(i=>p.listFiles(e,i)),"listFiles"),m=r(e=>t({description:l.getFileMetadata.description,inputSchema:l.getFileMetadata.input,name:"getFileMetadata"}).server(i=>p.getFileMetadata(e,i)),"getFileMetadata"),g=r(e=>t({description:l.downloadFile.description,inputSchema:l.downloadFile.input,name:"downloadFile"}).server(i=>p.downloadFile(e,i)),"downloadFile"),v=r(e=>t({description:l.getFileUrl.description,inputSchema:l.getFileUrl.input,name:"getFileUrl"}).server(i=>p.getFileUrl(e,i)),"getFileUrl"),U=r((e,{needsApproval:i=!0}={})=>t({description:l.uploadFile.description,inputSchema:l.uploadFile.input,name:"uploadFile",needsApproval:i}).server(a=>p.uploadFile(e,a)),"uploadFile"),S=r((e,{needsApproval:i=!0}={})=>t({description:l.deleteFile.description,inputSchema:l.deleteFile.input,name:"deleteFile",needsApproval:i}).server(a=>p.deleteFile(e,a)),"deleteFile"),A=r((e,{needsApproval:i=!0}={})=>t({description:l.copyFile.description,inputSchema:l.copyFile.input,name:"copyFile",needsApproval:i}).server(a=>p.copyFile(e,a)),"copyFile"),h=r((e,{needsApproval:i=!0}={})=>t({description:l.signUploadUrl.description,inputSchema:l.signUploadUrl.input,name:"signUploadUrl",needsApproval:i}).server(a=>p.signUploadUrl(e,a)),"signUploadUrl");export{A as copyFile,S as deleteFile,g as downloadFile,m as getFileMetadata,v as getFileUrl,u as listFiles,h as signUploadUrl,U as uploadFile};
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var n=(e,i)=>a(e,"name",{value:i,configurable:!0});import{tool as p}from"ai";import{T as t,e as o}from"./executors-DG6hGtvm.js";var r=Object.defineProperty,l=n((e,i)=>r(e,"name",{value:i,configurable:!0}),"i");const F=l(e=>p({description:t.listFiles.description,execute:l(i=>o.listFiles(e,i),"execute"),inputSchema:t.listFiles.input}),"listFiles"),x=l(e=>p({description:t.getFileMetadata.description,execute:l(i=>o.getFileMetadata(e,i),"execute"),inputSchema:t.getFileMetadata.input}),"getFileMetadata"),g=l(e=>p({description:t.downloadFile.description,execute:l(i=>o.downloadFile(e,i),"execute"),inputSchema:t.downloadFile.input}),"downloadFile"),U=l(e=>p({description:t.getFileUrl.description,execute:l(i=>o.getFileUrl(e,i),"execute"),inputSchema:t.getFileUrl.input}),"getFileUrl"),m=l((e,{needsApproval:i=!0}={})=>p({description:t.uploadFile.description,execute:l(d=>o.uploadFile(e,d),"execute"),inputSchema:t.uploadFile.input,needsApproval:i}),"uploadFile"),v=l((e,{needsApproval:i=!0}={})=>p({description:t.deleteFile.description,execute:l(d=>o.deleteFile(e,d),"execute"),inputSchema:t.deleteFile.input,needsApproval:i}),"deleteFile"),S=l((e,{needsApproval:i=!0}={})=>p({description:t.copyFile.description,execute:l(d=>o.copyFile(e,d),"execute"),inputSchema:t.copyFile.input,needsApproval:i}),"copyFile"),A=l((e,{needsApproval:i=!0}={})=>p({description:t.signUploadUrl.description,execute:l(d=>o.signUploadUrl(e,d),"execute"),inputSchema:t.signUploadUrl.input,needsApproval:i}),"signUploadUrl");export{S as copyFile,v as deleteFile,g as downloadFile,x as getFileMetadata,U as getFileUrl,F as listFiles,A as signUploadUrl,m as uploadFile};
@@ -1 +1 @@
1
- var re=Object.defineProperty;var o=(e,t)=>re(e,"name",{value:t,configurable:!0});import{utimes as ae}from"node:fs/promises";import{tmpdir as oe}from"node:os";import{createRequire as m}from"node:module";import{A as x,M as E,J as ie,K as ne,L as A}from"./path-D7rMc9nq-B718mbm6.js";import{throwErrorCode as D,ERRORS as R}from"./ERRORS-B9jkvKwx.js";import se from"./MetaStorage-Y4m1dWgd.js";import{stringifyMetadata as ce,parseMetadata as ue}from"./Metadata-B6Ir0KO7.js";const P=0,le=4;var fe=Object.defineProperty,pe=o((e,t)=>fe(e,"name",{value:t,configurable:!0}),"t$6"),me=Object.defineProperty,de=pe((e,t)=>me(e,"name",{value:t,configurable:!0}),"t"),ge=Object.defineProperty,be=de((e,t)=>ge(e,"name",{value:t,configurable:!0}),"n");const $=be(e=>{if(!e||!(e instanceof URL)&&typeof e!="string")throw new TypeError("Path must be a non-empty string or URL.")},"assertValidFileOrDirectoryPath");var ve=Object.defineProperty,ye=o((e,t)=>ve(e,"name",{value:t,configurable:!0}),"i$8"),he=Object.defineProperty,$e=ye((e,t)=>he(e,"name",{value:t,configurable:!0}),"r"),we=Object.defineProperty,Oe=$e((e,t)=>we(e,"name",{value:t,configurable:!0}),"i");const S=Oe(e=>{if(e.isFile())return"file";if(e.isDirectory())return"dir";if(e.isSymbolicLink())return"symlink"},"getFileInfoType");var je=Object.defineProperty,Pe=o((e,t)=>je(e,"name",{value:t,configurable:!0}),"i$7"),xe=Object.defineProperty,W=Pe((e,t)=>xe(e,"name",{value:t,configurable:!0}),"s");const Ee=m(import.meta.url),d=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Te=W(e=>{if(typeof d<"u"&&d.versions&&d.versions.node){const[t,r]=d.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return d.getBuiltinModule(e)}return Ee(e)},"__cjs_getBuiltinModule"),{lstat:U,mkdir:_e}=Te("node:fs/promises");var Me=Object.defineProperty,ke=W((e,t)=>Me(e,"name",{value:t,configurable:!0}),"o");const ze=ke(async e=>{$(e);try{const t=await U(e);if(!t.isDirectory())throw new Error(`Ensure path exists, expected 'dir', got '${String(S(t))}'`);return}catch(t){if(t.code!=="ENOENT")throw t}try{await _e(e,{recursive:!0})}catch(t){if(t.code!=="EEXIST")throw t;const r=await U(e);if(!r.isDirectory())throw new Error(`Ensure path exists, expected 'dir', got '${String(S(r))}'`,{cause:t})}},"ensureDir");var Ne=Object.defineProperty,l=o((e,t)=>Ne(e,"name",{value:t,configurable:!0}),"n$7"),Be=Object.defineProperty,s=l((e,t)=>Be(e,"name",{value:t,configurable:!0}),"a");const Fe=m(import.meta.url),g=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Ae=s(e=>{if(typeof g<"u"&&g.versions&&g.versions.node){const[t,r]=g.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return g.getBuiltinModule(e)}return Fe(e)},"__cjs_getBuiltinModule"),{fileURLToPath:De}=Ae("node:url");var Re=Object.defineProperty,p=s((e,t)=>Re(e,"name",{value:t,configurable:!0}),"t$1");function O(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}o(O,"m$4");l(O,"d");s(O,"getDefaultExportFromCjs");p(O,"getDefaultExportFromCjs");function T(e){return e&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}o(T,"h$1");l(T,"O");s(T,"getDefaultExportFromNamespaceIfPresent");p(T,"getDefaultExportFromNamespaceIfPresent");function _(e){return e&&Object.prototype.hasOwnProperty.call(e,"default")&&Object.keys(e).length===1?e.default:e}o(_,"x");l(_,"P");s(_,"getDefaultExportFromNamespaceIfNotNamed");p(_,"getDefaultExportFromNamespaceIfNotNamed");function M(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var t=e.default;if(typeof t=="function"){var r=p(s(l(o(function a(){var i=!1;try{i=this instanceof a}catch{}return i?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)},"a"),"s"),"a"),"a");r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(a){var i=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(r,a,i.get?i:{enumerable:!0,get:p(function(){return e[a]},"get")})}),r}o(M,"y$2");l(M,"_");s(M,"getAugmentedNamespace");p(M,"getAugmentedNamespace");var C,I;function k(){return I||(I=1,C=["3dm","3ds","3g2","3gp","7z","a","aac","adp","afdesign","afphoto","afpub","ai","aif","aiff","alz","ape","apk","appimage","ar","arj","asf","au","avi","bak","baml","bh","bin","bk","bmp","btif","bz2","bzip2","cab","caf","cgm","class","cmx","cpio","cr2","cr3","cur","dat","dcm","deb","dex","djvu","dll","dmg","dng","doc","docm","docx","dot","dotm","dra","DS_Store","dsk","dts","dtshd","dvb","dwg","dxf","ecelp4800","ecelp7470","ecelp9600","egg","eol","eot","epub","exe","f4v","fbs","fh","fla","flac","flatpak","fli","flv","fpx","fst","fvt","g3","gh","gif","graffle","gz","gzip","h261","h263","h264","icns","ico","ief","img","ipa","iso","jar","jpeg","jpg","jpgv","jpm","jxr","key","ktx","lha","lib","lvp","lz","lzh","lzma","lzo","m3u","m4a","m4v","mar","mdi","mht","mid","midi","mj2","mka","mkv","mmr","mng","mobi","mov","movie","mp3","mp4","mp4a","mpeg","mpg","mpga","mxu","nef","npx","numbers","nupkg","o","odp","ods","odt","oga","ogg","ogv","otf","ott","pages","pbm","pcx","pdb","pdf","pea","pgm","pic","png","pnm","pot","potm","potx","ppa","ppam","ppm","pps","ppsm","ppsx","ppt","pptm","pptx","psd","pya","pyc","pyo","pyv","qt","rar","ras","raw","resources","rgb","rip","rlc","rmf","rmvb","rpm","rtf","rz","s3m","s7z","scpt","sgi","shar","snap","sil","sketch","slk","smv","snk","so","stl","suo","sub","swf","tar","tbz","tbz2","tga","tgz","thmx","tif","tiff","tlz","ttc","ttf","txz","udf","uvh","uvi","uvm","uvp","uvs","uvu","viv","vob","war","wav","wax","wbmp","wdp","weba","webm","webp","whl","wim","wm","wma","wmv","wmx","woff","woff2","wrm","wvx","xbm","xif","xla","xlam","xls","xlsb","xlsm","xlsx","xlt","xltm","xltx","xm","xmind","xpi","xpm","xwd","xz","z","zip","zipx"]),C}o(k,"w$2");l(k,"k");s(k,"requireBinaryExtensions");var Se=k();const Ue=O(Se);var Ce=Object.defineProperty,n=s((e,t)=>Ce(e,"name",{value:t,configurable:!0}),"r");const Ie=new Set(Ue),Le=new Set(["/","\\",void 0]),L=Symbol.for("pathe:normalizedAlias"),qe=/(^|[/\\])([^/\\]+?)(?=(?:\.[^.]+)?$)/,We=n((e,t)=>t.split("/").length-e.split("/").length,"compareAliases"),w=n((e="/")=>{const t=e.at(-1);return t==="/"||t==="\\"},"hasTrailingSlash"),V=n(e=>{if(e[L])return e;const t=Object.fromEntries(Object.entries(e).toSorted(([r],[a])=>We(r,a)));for(const r in t)for(const a in t)a===r||r.startsWith(a)||t[r].startsWith(a)&&Le.has(t[r][a.length])&&(t[r]=t[a]+t[r].slice(a.length));return Object.defineProperty(t,L,{enumerable:!1,value:!0}),t},"normalizeAliases");n((e,t)=>{e=x(e),t=V(t);for(const[r,a]of Object.entries(t)){if(!e.startsWith(r))continue;const i=w(r)?r.slice(0,-1):r;if(w(e[i.length]))return E(a,e.slice(r.length))}return e},"resolveAlias");n(e=>qe.exec(e)?.[2],"filename");n((e,t)=>{e=x(e),t=V(t);for(const[r,a]of Object.entries(t).toReversed()){if(!e.startsWith(a))continue;const i=w(a)?a.slice(0,-1):a;if(w(e[i.length]))return E(r,e.slice(a.length))}return e},"reverseResolveAlias");const Ve=/^(?:\.?\.[/\\]|\.\.\B)/,Je=/^(?:msys|cygwin)$/;n(e=>Ve.test(e)||e==="..","isRelative");n(e=>Ie.has(ie(e).slice(1).toLowerCase()),"isBinaryPath");const z=n(e=>x(e instanceof URL?De(e):e),"toPath");n(()=>{if(!globalThis.process)return!1;if(globalThis.process.platform==="win32"||globalThis.process.platform==="cygwin")return!0;const e=globalThis.process.env.OSTYPE;return typeof e!="string"?!1:Je.test(e)},"isWindows");var Ke=Object.defineProperty,J=o((e,t)=>Ke(e,"name",{value:t,configurable:!0}),"t$4"),Xe=Object.defineProperty,N=J((e,t)=>Xe(e,"name",{value:t,configurable:!0}),"s");const Ye=m(import.meta.url),b=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Ge=N(e=>{if(typeof b<"u"&&b.versions&&b.versions.node){const[t,r]=b.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return b.getBuiltinModule(e)}return Ye(e)},"__cjs_getBuiltinModule"),{access:He}=Ge("node:fs/promises");var Qe=Object.defineProperty,Ze=N((e,t)=>Qe(e,"name",{value:t,configurable:!0}),"o");async function u(e,t=P){$(e),e=z(e);try{return await He(e,t),!0}catch{return!1}}o(u,"i$5");J(u,"d");N(u,"m");Ze(u,"isAccessible");var et=Object.defineProperty,K=o((e,t)=>et(e,"name",{value:t,configurable:!0}),"t$3"),tt=Object.defineProperty,X=K((e,t)=>tt(e,"name",{value:t,configurable:!0}),"t"),rt=Object.defineProperty,at=X((e,t)=>rt(e,"name",{value:t,configurable:!0}),"o");let ot=class extends Error{static{o(this,"c")}static{K(this,"i")}static{X(this,"n")}static{at(this,"PermissionError")}constructor(t){super(`EPERM: Operation not permitted, ${t}`)}get code(){return"EPERM"}set code(t){throw new Error("Cannot overwrite code EPERM")}get name(){return"PermissionError"}set name(t){throw new Error("Cannot overwrite name of PermissionError")}};var it=Object.defineProperty,nt=o((e,t)=>it(e,"name",{value:t,configurable:!0}),"f$4"),st=Object.defineProperty,Y=nt((e,t)=>st(e,"name",{value:t,configurable:!0}),"i");const ct=m(import.meta.url),v=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,G=Y(e=>{if(typeof v<"u"&&v.versions&&v.versions.node){const[t,r]=v.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return v.getBuiltinModule(e)}return ct(e)},"__cjs_getBuiltinModule"),{readFile:ut}=G("node:fs/promises"),{unzip:lt,brotliDecompress:ft}=G("node:zlib");var pt=Object.defineProperty,H=Y((e,t)=>pt(e,"name",{value:t,configurable:!0}),"n");const mt={brotli:ft,gzip:lt,none:H((e,t)=>{t(null,e)},"none")},dt=H(async(e,t)=>{if($(e),e=z(e),!await u(e))throw new ot(`unable to read the non-accessible file: ${e}`);if(!await u(e,le))throw new Error(`Unable to read the non-readable file: ${e}`);const{buffer:r,compression:a,encoding:i,flag:c}=t??{};return await ut(e,c?{encoding:i,flag:c}:{encoding:i}).then(async f=>await new Promise((ee,te)=>{mt[a??"none"](f,(B,F)=>{B?te(B):ee(r?F:F.toString())})})).catch(f=>{throw f})},"readFile");var gt=Object.defineProperty,bt=o((e,t)=>gt(e,"name",{value:t,configurable:!0}),"a$4"),vt=Object.defineProperty,yt=bt((e,t)=>vt(e,"name",{value:t,configurable:!0}),"t"),ht=Object.defineProperty,$t=yt((e,t)=>ht(e,"name",{value:t,configurable:!0}),"t");const wt=$t(e=>{const t={force:!0,recursive:!0};return e?.maxRetries!==void 0&&(t.maxRetries=e.maxRetries),e?.retryDelay!==void 0&&(t.retryDelay=e.retryDelay),t},"buildRmOptions");var Ot=Object.defineProperty,jt=o((e,t)=>Ot(e,"name",{value:t,configurable:!0}),"i$2"),Pt=Object.defineProperty,Q=jt((e,t)=>Pt(e,"name",{value:t,configurable:!0}),"s");const xt=m(import.meta.url),y=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Et=Q(e=>{if(typeof y<"u"&&y.versions&&y.versions.node){const[t,r]=y.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return y.getBuiltinModule(e)}return xt(e)},"__cjs_getBuiltinModule"),{unlink:Tt,rm:_t}=Et("node:fs/promises");var Mt=Object.defineProperty,kt=Q((e,t)=>Mt(e,"name",{value:t,configurable:!0}),"i");const zt=kt(async(e,t={})=>{$(e);try{await Tt(e)}catch{}try{await _t(e,wt(t))}catch{}},"remove");var Nt=Object.defineProperty,Bt=o((e,t)=>Nt(e,"name",{value:t,configurable:!0}),"a$2"),Ft=Object.defineProperty,At=Bt((e,t)=>Ft(e,"name",{value:t,configurable:!0}),"t"),Dt=Object.defineProperty,Rt=At((e,t)=>Dt(e,"name",{value:t,configurable:!0}),"e");const St=Rt(e=>{if(typeof e!="string"&&!(e instanceof ArrayBuffer)&&!ArrayBuffer.isView(e))throw new TypeError("File contents must be a string, ArrayBuffer, or ArrayBuffer view.")},"assertValidFileContents");var Ut=Object.defineProperty,Ct=o((e,t)=>Ut(e,"name",{value:t,configurable:!0}),"t"),It=Object.defineProperty,Lt=Ct((e,t)=>It(e,"name",{value:t,configurable:!0}),"r"),qt=Object.defineProperty,Wt=Lt((e,t)=>qt(e,"name",{value:t,configurable:!0}),"f");const Vt=new TextEncoder,Jt=Wt(e=>{if(e instanceof Uint8Array)return e;if(typeof e=="string")return Vt.encode(e);if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e)){const t=e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}throw new TypeError("Invalid contents type. Expected string or ArrayBuffer.")},"toUint8Array");var Kt=Object.defineProperty,Xt=o((e,t)=>Kt(e,"name",{value:t,configurable:!0}),"m"),Yt=Object.defineProperty,Z=Xt((e,t)=>Yt(e,"name",{value:t,configurable:!0}),"s");const Gt=m(import.meta.url),h=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Ht=Z(e=>{if(typeof h<"u"&&h.versions&&h.versions.node){const[t,r]=h.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return h.getBuiltinModule(e)}return Gt(e)},"__cjs_getBuiltinModule"),{mkdir:Qt,writeFile:Zt,stat:er,rename:q,chown:tr,chmod:rr,unlink:ar}=Ht("node:fs/promises");var or=Object.defineProperty,ir=Z((e,t)=>or(e,"name",{value:t,configurable:!0}),"d");const nr=ir(async(e,t,r)=>{r={encoding:"utf8",flag:"w",overwrite:!0,recursive:!0,...r},$(e),St(t),e=z(e);const a=`${e}.tmp`;try{const i=await u(e,P);if(!i&&r.recursive){const f=ne(e);await u(f,P)||await Qt(f,{recursive:!0})}let c;if(await Zt(a,Jt(t),{encoding:r.encoding,flag:r.flag}),i&&!r.overwrite&&(c=await er(e),r.chown??={gid:c.gid,uid:c.uid},await q(e,`${e}.bak`)),r.chown)try{await tr(a,r.chown.uid,r.chown.gid)}catch{}await rr(a,c&&!r.mode?c.mode:r.mode??438),await q(a,e)}catch(i){throw new Error(`Failed to write file at: ${e} - ${i.message}`,{cause:i})}finally{await u(a)&&await ar(`${e}.tmp`)}},"writeFile");var sr=Object.defineProperty,j=o((e,t)=>sr(e,"name",{value:t,configurable:!0}),"a");let vr=class extends se{static{o(this,"O")}static{j(this,"LocalMetaStorage")}directory;constructor(t){super(t),this.directory=A(t?.directory||E(oe(),"Upload_meta")),this.accessCheck().catch(r=>{this.logger?.error("Metadata storage access check failed: %O",r)})}getMetaPath=j(t=>A(`${this.directory}/${this.prefix}${t}${this.suffix}`),"getMetaPath");getIdFromPath=j(t=>t.slice(`${this.directory}/${this.prefix}`.length,-this.suffix.length),"getIdFromPath");async save(t,r){await this.accessCheck();const a={...r};return a.metadata&&(a.metadata=ce(r.metadata)),await nr(this.getMetaPath(t),JSON.stringify(a),{recursive:!0}),r}async touch(t,r){const a=new Date;return await ae(this.getMetaPath(t),a,a),r}async get(t){try{const r=await dt(this.getMetaPath(t));if(r===void 0)throw D(R.FILE_NOT_FOUND);const a=JSON.parse(r);return a.metadata&&typeof a.metadata=="string"&&(a.metadata=ue(a.metadata)),a}catch(r){const a=r,i=r instanceof SyntaxError;throw a.code==="ENOENT"||i?D(R.FILE_NOT_FOUND):r}}async delete(t){await zt(this.getMetaPath(t))}async accessCheck(){await ze(this.directory)}};export{dt as B,vr as O,z as U,P as _,$ as f,u as i,S as l,ze as w,zt as y};
1
+ var re=Object.defineProperty;var o=(e,t)=>re(e,"name",{value:t,configurable:!0});import{utimes as ae}from"node:fs/promises";import{tmpdir as oe}from"node:os";import{createRequire as m}from"node:module";import{A as T,M as _,J as ie,K as ne,L as R}from"./path-D7rMc9nq-B718mbm6.js";import{throwErrorCode as j,ERRORS as P}from"./ERRORS-CyOuSMLY.js";import se from"./MetaStorage-Y4m1dWgd.js";import{stringifyMetadata as ce,parseMetadata as ue}from"./Metadata-B6Ir0KO7.js";const E=0,le=4;var fe=Object.defineProperty,pe=o((e,t)=>fe(e,"name",{value:t,configurable:!0}),"t$6"),me=Object.defineProperty,de=pe((e,t)=>me(e,"name",{value:t,configurable:!0}),"t"),ge=Object.defineProperty,be=de((e,t)=>ge(e,"name",{value:t,configurable:!0}),"n");const $=be(e=>{if(!e||!(e instanceof URL)&&typeof e!="string")throw new TypeError("Path must be a non-empty string or URL.")},"assertValidFileOrDirectoryPath");var ve=Object.defineProperty,ye=o((e,t)=>ve(e,"name",{value:t,configurable:!0}),"i$8"),he=Object.defineProperty,$e=ye((e,t)=>he(e,"name",{value:t,configurable:!0}),"r"),we=Object.defineProperty,Oe=$e((e,t)=>we(e,"name",{value:t,configurable:!0}),"i");const S=Oe(e=>{if(e.isFile())return"file";if(e.isDirectory())return"dir";if(e.isSymbolicLink())return"symlink"},"getFileInfoType");var je=Object.defineProperty,Pe=o((e,t)=>je(e,"name",{value:t,configurable:!0}),"i$7"),xe=Object.defineProperty,q=Pe((e,t)=>xe(e,"name",{value:t,configurable:!0}),"s");const Ee=m(import.meta.url),d=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Te=q(e=>{if(typeof d<"u"&&d.versions&&d.versions.node){const[t,r]=d.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return d.getBuiltinModule(e)}return Ee(e)},"__cjs_getBuiltinModule"),{lstat:I,mkdir:_e}=Te("node:fs/promises");var Me=Object.defineProperty,ke=q((e,t)=>Me(e,"name",{value:t,configurable:!0}),"o");const Ne=ke(async e=>{$(e);try{const t=await I(e);if(!t.isDirectory())throw new Error(`Ensure path exists, expected 'dir', got '${String(S(t))}'`);return}catch(t){if(t.code!=="ENOENT")throw t}try{await _e(e,{recursive:!0})}catch(t){if(t.code!=="EEXIST")throw t;const r=await I(e);if(!r.isDirectory())throw new Error(`Ensure path exists, expected 'dir', got '${String(S(r))}'`,{cause:t})}},"ensureDir");var ze=Object.defineProperty,l=o((e,t)=>ze(e,"name",{value:t,configurable:!0}),"n$7"),Be=Object.defineProperty,s=l((e,t)=>Be(e,"name",{value:t,configurable:!0}),"a");const Fe=m(import.meta.url),g=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Ae=s(e=>{if(typeof g<"u"&&g.versions&&g.versions.node){const[t,r]=g.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return g.getBuiltinModule(e)}return Fe(e)},"__cjs_getBuiltinModule"),{fileURLToPath:De}=Ae("node:url");var Re=Object.defineProperty,p=s((e,t)=>Re(e,"name",{value:t,configurable:!0}),"t$1");function O(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}o(O,"m$4");l(O,"d");s(O,"getDefaultExportFromCjs");p(O,"getDefaultExportFromCjs");function M(e){return e&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}o(M,"h$1");l(M,"O");s(M,"getDefaultExportFromNamespaceIfPresent");p(M,"getDefaultExportFromNamespaceIfPresent");function k(e){return e&&Object.prototype.hasOwnProperty.call(e,"default")&&Object.keys(e).length===1?e.default:e}o(k,"x");l(k,"P");s(k,"getDefaultExportFromNamespaceIfNotNamed");p(k,"getDefaultExportFromNamespaceIfNotNamed");function N(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var t=e.default;if(typeof t=="function"){var r=p(s(l(o(function a(){var i=!1;try{i=this instanceof a}catch{}return i?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)},"a"),"s"),"a"),"a");r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(a){var i=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(r,a,i.get?i:{enumerable:!0,get:p(function(){return e[a]},"get")})}),r}o(N,"y$2");l(N,"_");s(N,"getAugmentedNamespace");p(N,"getAugmentedNamespace");var L,U;function z(){return U||(U=1,L=["3dm","3ds","3g2","3gp","7z","a","aac","adp","afdesign","afphoto","afpub","ai","aif","aiff","alz","ape","apk","appimage","ar","arj","asf","au","avi","bak","baml","bh","bin","bk","bmp","btif","bz2","bzip2","cab","caf","cgm","class","cmx","cpio","cr2","cr3","cur","dat","dcm","deb","dex","djvu","dll","dmg","dng","doc","docm","docx","dot","dotm","dra","DS_Store","dsk","dts","dtshd","dvb","dwg","dxf","ecelp4800","ecelp7470","ecelp9600","egg","eol","eot","epub","exe","f4v","fbs","fh","fla","flac","flatpak","fli","flv","fpx","fst","fvt","g3","gh","gif","graffle","gz","gzip","h261","h263","h264","icns","ico","ief","img","ipa","iso","jar","jpeg","jpg","jpgv","jpm","jxr","key","ktx","lha","lib","lvp","lz","lzh","lzma","lzo","m3u","m4a","m4v","mar","mdi","mht","mid","midi","mj2","mka","mkv","mmr","mng","mobi","mov","movie","mp3","mp4","mp4a","mpeg","mpg","mpga","mxu","nef","npx","numbers","nupkg","o","odp","ods","odt","oga","ogg","ogv","otf","ott","pages","pbm","pcx","pdb","pdf","pea","pgm","pic","png","pnm","pot","potm","potx","ppa","ppam","ppm","pps","ppsm","ppsx","ppt","pptm","pptx","psd","pya","pyc","pyo","pyv","qt","rar","ras","raw","resources","rgb","rip","rlc","rmf","rmvb","rpm","rtf","rz","s3m","s7z","scpt","sgi","shar","snap","sil","sketch","slk","smv","snk","so","stl","suo","sub","swf","tar","tbz","tbz2","tga","tgz","thmx","tif","tiff","tlz","ttc","ttf","txz","udf","uvh","uvi","uvm","uvp","uvs","uvu","viv","vob","war","wav","wax","wbmp","wdp","weba","webm","webp","whl","wim","wm","wma","wmv","wmx","woff","woff2","wrm","wvx","xbm","xif","xla","xlam","xls","xlsb","xlsm","xlsx","xlt","xltm","xltx","xm","xmind","xpi","xpm","xwd","xz","z","zip","zipx"]),L}o(z,"w$2");l(z,"k");s(z,"requireBinaryExtensions");var Se=z();const Ie=O(Se);var Le=Object.defineProperty,n=s((e,t)=>Le(e,"name",{value:t,configurable:!0}),"r");const Ue=new Set(Ie),Ce=new Set(["/","\\",void 0]),C=Symbol.for("pathe:normalizedAlias"),We=/(^|[/\\])([^/\\]+?)(?=(?:\.[^.]+)?$)/,qe=n((e,t)=>t.split("/").length-e.split("/").length,"compareAliases"),w=n((e="/")=>{const t=e.at(-1);return t==="/"||t==="\\"},"hasTrailingSlash"),V=n(e=>{if(e[C])return e;const t=Object.fromEntries(Object.entries(e).toSorted(([r],[a])=>qe(r,a)));for(const r in t)for(const a in t)a===r||r.startsWith(a)||t[r].startsWith(a)&&Ce.has(t[r][a.length])&&(t[r]=t[a]+t[r].slice(a.length));return Object.defineProperty(t,C,{enumerable:!1,value:!0}),t},"normalizeAliases");n((e,t)=>{e=T(e),t=V(t);for(const[r,a]of Object.entries(t)){if(!e.startsWith(r))continue;const i=w(r)?r.slice(0,-1):r;if(w(e[i.length]))return _(a,e.slice(r.length))}return e},"resolveAlias");n(e=>We.exec(e)?.[2],"filename");n((e,t)=>{e=T(e),t=V(t);for(const[r,a]of Object.entries(t).toReversed()){if(!e.startsWith(a))continue;const i=w(a)?a.slice(0,-1):a;if(w(e[i.length]))return _(r,e.slice(a.length))}return e},"reverseResolveAlias");const Ve=/^(?:\.?\.[/\\]|\.\.\B)/,Je=/^(?:msys|cygwin)$/;n(e=>Ve.test(e)||e==="..","isRelative");n(e=>Ue.has(ie(e).slice(1).toLowerCase()),"isBinaryPath");const B=n(e=>T(e instanceof URL?De(e):e),"toPath");n(()=>{if(!globalThis.process)return!1;if(globalThis.process.platform==="win32"||globalThis.process.platform==="cygwin")return!0;const e=globalThis.process.env.OSTYPE;return typeof e!="string"?!1:Je.test(e)},"isWindows");var Ke=Object.defineProperty,J=o((e,t)=>Ke(e,"name",{value:t,configurable:!0}),"t$4"),Xe=Object.defineProperty,F=J((e,t)=>Xe(e,"name",{value:t,configurable:!0}),"s");const Ye=m(import.meta.url),b=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Ge=F(e=>{if(typeof b<"u"&&b.versions&&b.versions.node){const[t,r]=b.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return b.getBuiltinModule(e)}return Ye(e)},"__cjs_getBuiltinModule"),{access:He}=Ge("node:fs/promises");var Qe=Object.defineProperty,Ze=F((e,t)=>Qe(e,"name",{value:t,configurable:!0}),"o");async function u(e,t=E){$(e),e=B(e);try{return await He(e,t),!0}catch{return!1}}o(u,"i$5");J(u,"d");F(u,"m");Ze(u,"isAccessible");var et=Object.defineProperty,K=o((e,t)=>et(e,"name",{value:t,configurable:!0}),"t$3"),tt=Object.defineProperty,X=K((e,t)=>tt(e,"name",{value:t,configurable:!0}),"t"),rt=Object.defineProperty,at=X((e,t)=>rt(e,"name",{value:t,configurable:!0}),"o");let ot=class extends Error{static{o(this,"c")}static{K(this,"i")}static{X(this,"n")}static{at(this,"PermissionError")}constructor(t){super(`EPERM: Operation not permitted, ${t}`)}get code(){return"EPERM"}set code(t){throw new Error("Cannot overwrite code EPERM")}get name(){return"PermissionError"}set name(t){throw new Error("Cannot overwrite name of PermissionError")}};var it=Object.defineProperty,nt=o((e,t)=>it(e,"name",{value:t,configurable:!0}),"f$4"),st=Object.defineProperty,Y=nt((e,t)=>st(e,"name",{value:t,configurable:!0}),"i");const ct=m(import.meta.url),v=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,G=Y(e=>{if(typeof v<"u"&&v.versions&&v.versions.node){const[t,r]=v.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return v.getBuiltinModule(e)}return ct(e)},"__cjs_getBuiltinModule"),{readFile:ut}=G("node:fs/promises"),{unzip:lt,brotliDecompress:ft}=G("node:zlib");var pt=Object.defineProperty,H=Y((e,t)=>pt(e,"name",{value:t,configurable:!0}),"n");const mt={brotli:ft,gzip:lt,none:H((e,t)=>{t(null,e)},"none")},dt=H(async(e,t)=>{if($(e),e=B(e),!await u(e))throw new ot(`unable to read the non-accessible file: ${e}`);if(!await u(e,le))throw new Error(`Unable to read the non-readable file: ${e}`);const{buffer:r,compression:a,encoding:i,flag:c}=t??{};return await ut(e,c?{encoding:i,flag:c}:{encoding:i}).then(async f=>await new Promise((ee,te)=>{mt[a??"none"](f,(A,D)=>{A?te(A):ee(r?D:D.toString())})})).catch(f=>{throw f})},"readFile");var gt=Object.defineProperty,bt=o((e,t)=>gt(e,"name",{value:t,configurable:!0}),"a$4"),vt=Object.defineProperty,yt=bt((e,t)=>vt(e,"name",{value:t,configurable:!0}),"t"),ht=Object.defineProperty,$t=yt((e,t)=>ht(e,"name",{value:t,configurable:!0}),"t");const wt=$t(e=>{const t={force:!0,recursive:!0};return e?.maxRetries!==void 0&&(t.maxRetries=e.maxRetries),e?.retryDelay!==void 0&&(t.retryDelay=e.retryDelay),t},"buildRmOptions");var Ot=Object.defineProperty,jt=o((e,t)=>Ot(e,"name",{value:t,configurable:!0}),"i$2"),Pt=Object.defineProperty,Q=jt((e,t)=>Pt(e,"name",{value:t,configurable:!0}),"s");const xt=m(import.meta.url),y=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Et=Q(e=>{if(typeof y<"u"&&y.versions&&y.versions.node){const[t,r]=y.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return y.getBuiltinModule(e)}return xt(e)},"__cjs_getBuiltinModule"),{unlink:Tt,rm:_t}=Et("node:fs/promises");var Mt=Object.defineProperty,kt=Q((e,t)=>Mt(e,"name",{value:t,configurable:!0}),"i");const Nt=kt(async(e,t={})=>{$(e);try{await Tt(e)}catch{}try{await _t(e,wt(t))}catch{}},"remove");var zt=Object.defineProperty,Bt=o((e,t)=>zt(e,"name",{value:t,configurable:!0}),"a$2"),Ft=Object.defineProperty,At=Bt((e,t)=>Ft(e,"name",{value:t,configurable:!0}),"t"),Dt=Object.defineProperty,Rt=At((e,t)=>Dt(e,"name",{value:t,configurable:!0}),"e");const St=Rt(e=>{if(typeof e!="string"&&!(e instanceof ArrayBuffer)&&!ArrayBuffer.isView(e))throw new TypeError("File contents must be a string, ArrayBuffer, or ArrayBuffer view.")},"assertValidFileContents");var It=Object.defineProperty,Lt=o((e,t)=>It(e,"name",{value:t,configurable:!0}),"t"),Ut=Object.defineProperty,Ct=Lt((e,t)=>Ut(e,"name",{value:t,configurable:!0}),"r"),Wt=Object.defineProperty,qt=Ct((e,t)=>Wt(e,"name",{value:t,configurable:!0}),"f");const Vt=new TextEncoder,Jt=qt(e=>{if(e instanceof Uint8Array)return e;if(typeof e=="string")return Vt.encode(e);if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e)){const t=e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}throw new TypeError("Invalid contents type. Expected string or ArrayBuffer.")},"toUint8Array");var Kt=Object.defineProperty,Xt=o((e,t)=>Kt(e,"name",{value:t,configurable:!0}),"m"),Yt=Object.defineProperty,Z=Xt((e,t)=>Yt(e,"name",{value:t,configurable:!0}),"s");const Gt=m(import.meta.url),h=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,Ht=Z(e=>{if(typeof h<"u"&&h.versions&&h.versions.node){const[t,r]=h.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return h.getBuiltinModule(e)}return Gt(e)},"__cjs_getBuiltinModule"),{mkdir:Qt,writeFile:Zt,stat:er,rename:W,chown:tr,chmod:rr,unlink:ar}=Ht("node:fs/promises");var or=Object.defineProperty,ir=Z((e,t)=>or(e,"name",{value:t,configurable:!0}),"d");const nr=ir(async(e,t,r)=>{r={encoding:"utf8",flag:"w",overwrite:!0,recursive:!0,...r},$(e),St(t),e=B(e);const a=`${e}.tmp`;try{const i=await u(e,E);if(!i&&r.recursive){const f=ne(e);await u(f,E)||await Qt(f,{recursive:!0})}let c;if(await Zt(a,Jt(t),{encoding:r.encoding,flag:r.flag}),i&&!r.overwrite&&(c=await er(e),r.chown??={gid:c.gid,uid:c.uid},await W(e,`${e}.bak`)),r.chown)try{await tr(a,r.chown.uid,r.chown.gid)}catch{}await rr(a,c&&!r.mode?c.mode:r.mode??438),await W(a,e)}catch(i){throw new Error(`Failed to write file at: ${e} - ${i.message}`,{cause:i})}finally{await u(a)&&await ar(`${e}.tmp`)}},"writeFile");var sr=Object.defineProperty,x=o((e,t)=>sr(e,"name",{value:t,configurable:!0}),"a");class vr extends se{static{o(this,"v")}static{x(this,"LocalMetaStorage")}directory;constructor(t){super(t),this.directory=R(t?.directory||_(oe(),"Upload_meta")),this.accessCheck().catch(r=>{this.logger?.error("Metadata storage access check failed: %O",r)})}getMetaPath=x(t=>{const r=R(`${this.directory}/${this.prefix}${t}${this.suffix}`),a=this.directory.endsWith("/")?this.directory:`${this.directory}/`;return r.startsWith(a)?r:j(P.INVALID_FILE_NAME,`Invalid id: "${t}" resolves outside the meta directory`)},"getMetaPath");getIdFromPath=x(t=>t.slice(`${this.directory}/${this.prefix}`.length,-this.suffix.length),"getIdFromPath");async save(t,r){await this.accessCheck();const a={...r};return a.metadata&&(a.metadata=ce(r.metadata)),await nr(this.getMetaPath(t),JSON.stringify(a),{recursive:!0}),r}async touch(t,r){const a=new Date;return await ae(this.getMetaPath(t),a,a),r}async get(t){try{const r=await dt(this.getMetaPath(t));if(r===void 0)throw j(P.FILE_NOT_FOUND);const a=JSON.parse(r);return a.metadata&&typeof a.metadata=="string"&&(a.metadata=ue(a.metadata)),a}catch(r){const a=r,i=r instanceof SyntaxError;throw a.code==="ENOENT"||i?j(P.FILE_NOT_FOUND):r}}async delete(t){await Nt(this.getMetaPath(t))}async accessCheck(){await Ne(this.directory)}}export{dt as B,B as U,E as _,$ as f,u as i,S as l,vr as v,Ne as w,Nt as y};
@@ -1,4 +1,4 @@
1
- import { F as File, L as LocalMetaStorageOptions, M as MetaStorage } from "./storage.d-BOMUJD96.js";
1
+ import { F as File, L as LocalMetaStorageOptions, M as MetaStorage } from "./storage.d-Cr6f2lac.js";
2
2
  import 'node:stream';
3
3
  /**
4
4
  * Stores upload metafiles on local disk
@@ -9,6 +9,7 @@ declare class LocalMetaStorage<T extends File = File> extends MetaStorage<T> {
9
9
  /**
10
10
  * Returns metafile path.
11
11
  * @param id upload id
12
+ * @throws {UploadError} If the id resolves to a path outside the meta directory (e.g. via `..` traversal or absolute paths).
12
13
  */
13
14
  getMetaPath: (id: string) => string;
14
15
  override save(id: string, file: T): Promise<T>;
@@ -1,5 +1,5 @@
1
- import { F as File, a as FileReturn, B as BaseStorage } from "./storage.d-BOMUJD96.js";
2
- import { O as MediaTransformerConfig, Q as MediaTransformResult } from "./types.d-BCN94sB_.js";
1
+ import { F as File, a as FileReturn, B as BaseStorage } from "./storage.d-Cr6f2lac.js";
2
+ import { O as MediaTransformerConfig, Q as MediaTransformResult } from "./types.d-C8eSxqX9.js";
3
3
  /**
4
4
  * Unified media transformer that automatically detects media type and routes to appropriate transformer.
5
5
  * @template TFile The file type used by this transformer.
@@ -0,0 +1 @@
1
+ var E=Object.defineProperty;var o=(e,s)=>E(e,"name",{value:s,configurable:!0});var t=Object.defineProperty,I=o((e,s)=>t(e,"name",{value:s,configurable:!0}),"t");const S=I(e=>{const s=e?.accessKeyId??process.env.AWS_ACCESS_KEY_ID??process.env.MINIO_ACCESS_KEY_ID??process.env.MINIO_ACCESS_KEY,r=e?.endpoint??process.env.AWS_ENDPOINT??process.env.MINIO_ENDPOINT,n=e?.region??process.env.AWS_REGION??process.env.MINIO_REGION,c=e?.secretAccessKey??process.env.AWS_SECRET_ACCESS_KEY??process.env.MINIO_SECRET_ACCESS_KEY??process.env.MINIO_SECRET_KEY;if(!n||!s||!c||!r)throw new Error("Missing required parameters for Minio client.");return{credentials:{accessKeyId:s,secretAccessKey:c},endpoint:r,forcePathStyle:!0,region:n}},"minio");export{S as default};
@@ -0,0 +1 @@
1
+ var h=Object.defineProperty;var d=(s,t)=>h(s,"name",{value:t,configurable:!0});import{n as p}from"./headers-DC2MEOrK.js";var g=Object.defineProperty,b=d((s,t)=>g(s,"name",{value:t,configurable:!0}),"d");class y{static{d(this,"F")}static{b(this,"MultipartBase")}async handlePost(t,i,l){const r={contentType:t.mediaType||"application/octet-stream",metadata:{},originalName:t.filename,size:t.size};for(const e of i)if(!e.isFile&&e.name){let n={};if(e.name==="metadata"&&e.text)try{n=JSON.parse(e.text)}catch{}else e.name&&(n={[e.name]:e.text});Object.assign(r.metadata,n)}const m=await this.storage.create(r),c=this.createStreamFromBytes(t.bytes),o=await this.storage.write({body:c,contentLength:t.size,id:m.id,start:0});let a=o;if(Object.keys(r.metadata).length>0){const e={...o.metadata,...r.metadata};a={...await this.storage.update({id:o.id},{metadata:e}),status:o.status}}const u=this.buildFileUrl(l,a);return{...a,headers:{Location:u,...a.expiredAt===void 0?{}:{"X-Upload-Expires":a.expiredAt.toString()},...a.ETag===void 0?{}:{ETag:a.ETag}},statusCode:200}}async handleDelete(t){const i=await this.storage.delete({id:t});if(i.status===void 0)throw p(404,"File not found");return{...i,headers:{},statusCode:204}}get storage(){throw new Error("storage must be implemented")}buildFileUrl(t,i){throw new Error("buildFileUrl must be implemented")}}export{y as F};
@@ -0,0 +1 @@
1
+ var d=Object.defineProperty;var o=(e,t)=>d(e,"name",{value:t,configurable:!0});var h=Object.defineProperty,a=o((e,t)=>h(e,"name",{value:t,configurable:!0}),"r");const k=a(e=>{let t;const c=e.leewayMs??6e4;return{getAccessToken:a(async()=>{const s=Date.now();if(t&&t.expiresOnMs-c>s)return t.token;const n=await fetch(e.tokenUrl,{body:e.buildBody(),headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST"});if(!n.ok){const i=await n.text().catch(()=>"");throw new Error(`${e.provider}: token exchange failed (${n.status}): ${i||n.statusText}`)}const r=await n.json();if(!r.access_token)throw new Error(`${e.provider}: token response missing access_token`);return t={expiresOnMs:s+(r.expires_in??3600)*1e3,token:r.access_token},e.onRefresh?.(r.access_token),r.access_token},"refresh")}},"createOAuthRefreshHandle");export{k as c};
@@ -0,0 +1 @@
1
+ var i=Object.defineProperty;var r=(e,t)=>i(e,"name",{value:t,configurable:!0});var a=Object.defineProperty,s=r((e,t)=>a(e,"name",{value:t,configurable:!0}),"t");const v=s(e=>e.bytesWritten===e.size?"completed":e.createdAt?"part":"created","getFileStatus");var n=Object.defineProperty,o=r((e,t)=>n(e,"name",{value:t,configurable:!0}),"i");const z=o((e,t)=>e.size!==void 0&&t.size!==void 0&&e.size>0&&t.size>0&&e.size>t.size?!1:t.size===void 0?!0:(e.start||0)+(e.contentLength||0)<=t.size,"partMatch");export{v as o,z as r};
@@ -0,0 +1 @@
1
+ var E=Object.defineProperty;var y=(a,t)=>E(a,"name",{value:t,configurable:!0});import{n as u}from"./headers-DC2MEOrK.js";import{hasBody as X}from"type-is";import{a as c}from"./base-handler-core-BfwZ1RS1.js";import{ERRORS as A}from"./ERRORS-CyOuSMLY.js";import{b,a as z,c as v,d as L}from"./response-builder-Wdo_fvcF.js";var T=Object.defineProperty,f=y((a,t)=>T(a,"name",{value:t,configurable:!0}),"a$1");const D=f((a,t={})=>{const e=c(a,"x-file-metadata",!0);if(!e)return t;try{return{...t,...JSON.parse(e)}}catch{return t}},"parseMetadata"),P=f(a=>{if(!a)return;const t=2e3,e=a.length>t?a.slice(0,Math.max(0,t)):a,r=e.toLowerCase().indexOf("filename");if(r===-1)return;let s=r+8;for(;s<e.length&&(e[s]==="*"||e[s]===" "||e[s]===" ");)s++;if(s>=e.length||e[s]!=="=")return;for(s++;s<e.length&&(e[s]===" "||e[s]===" ");)s++;if(s>=e.length)return;let n=s,o;const i=e[s];return i==='"'||i==="'"?(n=s+1,o=e.indexOf(i,n),o===-1&&(o=e.indexOf(";",n),o===-1&&(o=e.length))):(o=e.indexOf(";",n),o===-1&&(o=e.length)),n>=o?void 0:e.substring(n,o).trim()||void 0},"parseContentDispositionValue"),I=f(a=>{const t=c(a,"content-disposition",!0);return P(t)},"parseContentDisposition"),R=f(a=>{const t=c(a,"x-chunked-upload",!0)==="true",e=c(a,"x-chunk-offset",!0),r=c(a,"x-total-size",!0),s={isChunkedUpload:t};if(e){const n=Number.parseInt(e,10);!Number.isNaN(n)&&n>=0&&(s.chunkOffset=n)}if(r){const n=Number.parseInt(r,10);!Number.isNaN(n)&&n>0&&(s.totalSize=n)}return s},"parseChunkHeaders"),Z=f((a,t=!1)=>{const e=c(a,"x-chunked-upload",!0)==="true";if(!(t&&e)){if(!X(a))throw u(400,"Request body is required");if(Number.parseInt(c(a,"content-length")||"0",10)===0&&!e)throw u(400,"Content-Length is required and must be greater than 0")}},"validateRequestBody"),ee=f((a,t=!1,e)=>{const r=c(a,"x-chunked-upload",!0)==="true",s=Number.parseInt(c(a,"content-length")||"0",10);if(!t&&!r&&s===0)throw u(400,"Content-Length is required and must be greater than 0");if(e!==void 0&&s>e)throw u(413,`File size exceeds maximum allowed size of ${e} bytes`);return s},"validateContentLength"),te=f((a,t,e="application/octet-stream")=>{const r=I(a),s=D(a),{isChunkedUpload:n,totalSize:o}=R(a),i=n&&o?o:t;return n&&o&&(s._chunkedUpload=!0,s._chunks=[],s._totalSize=o),{contentType:e,metadata:s,originalName:r,size:i}},"extractFileInit");f((a,t,e)=>{if(Number.isNaN(a)||a<0)throw u(400,"X-Chunk-Offset must be a valid non-negative number");if(a+t>e)throw u(400,`Chunk exceeds file size. Offset: ${a}, Size: ${t}, Total: ${e}`)},"validateChunk");f((a,t="application/octet-stream")=>c(a,"content-type")||t,"getContentType");var W=Object.defineProperty,g=y((a,t)=>W(a,"name",{value:t,configurable:!0}),"a");const N=g((a,t)=>{if(a.length===0)return!1;const e=[...a].toSorted((n,o)=>n.offset-o.offset),r=e[0];if(r?.offset!==0)return!1;let s=r.length;for(let n=1;n<e.length;n+=1){const o=e[n];if(o){if(o.offset>s)return!1;s=Math.max(s,o.offset+o.length)}}return s>=t},"isUploadComplete"),H=g((a,t,e,r)=>{if(Number.isNaN(a)||a<0)throw new Error("Chunk offset must be a valid non-negative number");if(t<=0)throw new Error("Chunk length must be greater than 0");if(r!==void 0&&t>r)throw new Error(`Chunk size exceeds maximum allowed size of ${r} bytes`);if(a+t>e)throw new Error(`Chunk exceeds file size. Offset: ${a}, Size: ${t}, Total: ${e}`)},"validateChunk"),B=g((a,t)=>{const e=a.find(r=>r.offset===t.offset&&r.length===t.length);return e?t.checksum&&e.checksum!==t.checksum?a.map(r=>r.offset===t.offset?{...r,checksum:t.checksum}:r):a:[...a,t]},"trackChunk"),j=g((a,t)=>{if(a.length===0||t===0)return{bytesWritten:0,percentage:0};const e=[...a].toSorted((o,i)=>o.offset-i.offset);let r=0,s=0;for(const o of e){const i=o.offset+o.length;o.offset<=s?r=Math.max(r,i):r+=o.length,s=Math.max(s,i)}r=Math.min(r,t);const n=t>0?r/t*100:0;return{bytesWritten:r,percentage:n}},"calculateUploadProgress");g(a=>{const t=a.metadata||{};if(t._chunkedUpload===!0&&Array.isArray(t._chunks)){const e=typeof t._totalSize=="number"?t._totalSize:a.size||0;return j(t._chunks,e).bytesWritten}return a.bytesWritten||0},"getBytesWritten");const _=g(a=>(a.metadata||{})._chunkedUpload===!0,"isChunkedUpload"),U=g(a=>{const t=a.metadata||{};if(t._chunkedUpload===!0&&typeof t._totalSize=="number")return t._totalSize},"getTotalSize");var q=Object.defineProperty,$=y((a,t)=>q(a,"name",{value:t,configurable:!0}),"y");class ae{static{y(this,"M")}static{$(this,"RestBase")}async deleteSingle(t){const e=await this.storage.delete({id:t});if(e.status===void 0)throw u(404,"File not found");return{...e,headers:{},statusCode:204}}async handlePost(t,e,r,s,n){if(e&&t.size!==void 0){const d=typeof t.size=="number"?t.size:Number.parseInt(String(t.size),10);if(d>0&&d>this.storage.maxUploadSize)throw u(413,`File size exceeds maximum allowed size of ${this.storage.maxUploadSize} bytes`)}const o=await this.storage.create(t);if(e){const d=this.buildFileUrl(r,o);return b(o,{...z(o,d),"X-Chunked-Upload":"true","X-Upload-ID":o.id},201)}const i=await this.storage.write({body:s,contentLength:n,id:o.id,start:0}),h=this.buildFileUrl(r,i);return b(i,z(i,h),201)}async handlePut(t,e,r,s,n,o){let i,h=!1;try{await this.storage.getMeta(t),h=!0,o&&await this.storage.update({id:t},{metadata:o}),i=await this.storage.write({body:s,contentLength:n,id:t,start:0})}catch(m){const S=m;if(S.UploadErrorCode===A.FILE_NOT_FOUND||S.code==="ENOENT")try{const w=await this.storage.create(e);i=await this.storage.write({body:s,contentLength:n,id:w.id,start:0})}catch(w){throw w}else throw m}const d=this.buildFileUrl(r,i);return b(i,z(i,d),h?200:201)}async handlePatch(t,e,r,s,n,o){let i=await this.storage.getMeta(t);const h=i.metadata||{},d=_(i);if(d){const l=U(i);l&&i.size!==l&&(i={...i,size:l})}const m=typeof h._totalSize=="number"?h._totalSize:i.size||0;if(!d)throw u(400,"File is not a chunked upload. Use POST or PUT for full file uploads.");const S=100*1024*1024;try{H(e,r,m,S)}catch(l){throw l instanceof Error&&l.message.includes("exceeds maximum")?u(413,l.message):u(400,l instanceof Error?l.message:String(l))}if(i.status==="completed"){const l=this.buildFileUrl(n,i);return b(i,{...z(i,l),"X-Upload-Complete":"true"},200)}const w=await this.storage.withLock(`chunks:${t}`,async()=>{const l=(await this.storage.getMeta(t)).metadata??{},M=Array.isArray(l._chunks)?l._chunks:[],x=B(M,{checksum:s,length:r,offset:e});return await this.storage.update({id:t},{metadata:{...l,_chunks:x}}),x});let p=await this.storage.write({body:o,contentLength:r,id:t,start:e}),C=p.bytesWritten>=m;d&&(C=N(w,m),p.status==="completed"&&!C&&(await this.storage.update({id:t},{status:"part"}),p={...p,status:"part"}));const k=C&&p.bytesWritten!==m?{...p,bytesWritten:m}:p,F=this.buildFileUrl(n,k),O={...z(k,F),...v(k,C),"x-upload-offset":String(k.bytesWritten||0)};return b(k,O,C?200:202)}async handleHead(t){let e=await this.storage.getMeta(t);const r=_(e);if(r){const n=U(e);n&&e.size!==n&&(e={...e,size:n})}const s={...L(e)};if(r){const n=e.metadata||{},o=U(e)||e.size||0,i=Array.isArray(n._chunks)?n._chunks:[],h=N(i,o);Object.assign(s,v(e,h))}return b(e,s,200)}handleOptions(t,e){return{headers:{"Access-Control-Allow-Headers":"Authorization, Content-Type, Content-Length, Content-Disposition, X-File-Metadata, X-Chunked-Upload, X-Total-Size, X-Chunk-Offset, X-Chunk-Checksum","Access-Control-Allow-Methods":t.map(r=>r.toUpperCase()).join(", "),"Access-Control-Max-Age":86400,"X-Max-Upload-Size":String(e)},statusCode:204}}async deleteBatch(t){const e=await this.storage.deleteBatch(t);if(e.successfulCount===0&&e.failedCount>0){const r=e.failed.map(s=>s.id).join(", ");throw u(404,`Failed to delete files: ${r}`)}return{data:e.successful,headers:e.failedCount>0?{"X-Delete-Errors":JSON.stringify(e.failed),"X-Delete-Failed":String(e.failedCount),"X-Delete-Successful":String(e.successfulCount)}:{"X-Delete-Successful":String(e.successfulCount)},statusCode:e.successfulCount===t.length?204:207}}get storage(){throw new Error("storage must be implemented")}buildFileUrl(t,e){throw new Error("buildFileUrl must be implemented")}}export{ae as M,ee as a,R as b,P as c,te as e,I as p,Z as v};
@@ -0,0 +1 @@
1
+ var E=Object.defineProperty;var d=(o,t)=>E(o,"name",{value:t,configurable:!0});import{Readable as g}from"node:stream";import{z as M,B as C,$ as T,t as A}from"./storage-CoyB2O-Y.js";import{d as I}from"./detect-file-type-5JhzC9RU.js";import{throwErrorCode as p,ERRORS as m}from"./ERRORS-CyOuSMLY.js";import{createRetryWrapper as O}from"./isRetryableError-B6ZS_-5I.js";import{v as w}from"./local-meta-storage-CT1audnK.js";import{u as z}from"./update-size-DANV7aa2.js";import{r as R,o as S}from"./part-match-B5fLLmFw.js";import{o as x}from"./has-content-Bx2p8Okx.js";var v=Object.defineProperty,B=d((o,t)=>v(o,"name",{value:t,configurable:!0}),"o$1");const L=B((o,t)=>{const e={};return Object.keys(o).forEach(r=>{e[r]=t(o[r])}),e},"mapValues");var N=Object.defineProperty,K=d((o,t)=>N(o,"name",{value:t,configurable:!0}),"t");const $=K(o=>o===Number(o)?o:(M(o)??0)/1e3,"toSeconds");var j=Object.defineProperty,f=d((o,t)=>j(o,"name",{value:t,configurable:!0}),"u");const D=5*1024*1024,F=16*1024*1024;class b extends C{static{d(this,"S3BaseStorage")}static{f(this,"S3BaseStorage")}checksumTypes=["md5","crc32","crc32c","sha1","sha256"];bucket;meta;MAX_PARTS=1e4;partSize;retry;constructor(t){if(super(t),this.bucket=t.bucket,this.partSize=typeof t.partSize=="string"?T(t.partSize):t.partSize||F,this.partSize<D)throw new Error("Minimum allowed partSize value is 5MB");const e={backoffMultiplier:2,initialDelay:1e3,maxDelay:3e4,maxRetries:3,retryableStatusCodes:[408,429,500,502,503,504],shouldRetry:f(i=>{const n=i;return n.statusCode&&[408,429,500,502,503,504].includes(n.statusCode)?!0:n.retryable??!1},"shouldRetry"),...t.retryConfig};this.retry=O(e);const{metaStorage:r,metaStorageConfig:a}=t;if(r)this.meta=r;else{const i={...t,...a,logger:this.logger};"directory"in i?(this.logger?.debug("Using local meta storage"),this.meta=new w(i)):this.meta=new w(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 s=typeof t.ttl=="string"?A(t.ttl):t.ttl;s!==void 0&&(e.expiredAt=Date.now()+s)}const r=new(this.getFileClass())(e);r.name=this.namingFunction(r),await this.validate(r);try{const s=await this.getMeta(r.id);if(s.bytesWritten>=0)return s}catch{}const a=this.getS3Api();let i;try{i=await this.retry(()=>a.createMultipartUpload({ACL:this.getAcl(),Bucket:this.bucket,ContentType:r.contentType,Key:r.name,Metadata:L({originalName:r.originalName,...r.metadata},s=>encodeURI(String(s)))}))}catch{return p(m.FILE_ERROR,"s3 create upload error")}const{UploadId:n}=i||{};return n?(r.UploadId=n,r.bytesWritten=0,this.config.clientDirectUpload&&(r.partSize??=this.partSize),await this.saveMeta(r),r.status="created",await this.onCreate(r),this.config.clientDirectUpload?this.buildPresigned(r):r):p(m.FILE_ERROR,"s3 create upload error")})}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(typeof t.size=="number"&&t.size>0&&z(e,t.size),!R(t,e))return p(m.FILE_CONFLICT);if(this.config.clientDirectUpload)return this.buildPresigned(e);e.Parts??=await this.getParts(e),e.bytesWritten=e.Parts.map(a=>a.Size||0).reduce((a,i)=>a+i,0);const r=await this.lock(t.id);try{if(x(t)){if(this.isUnsupportedChecksum(t.checksumAlgorithm))return p(m.UNSUPPORTED_CHECKSUM_ALGORITHM);if(e.Parts.length===0&&(!e.contentType||e.contentType==="application/octet-stream"))try{const l=t.body instanceof g?t.body:g.fromWeb(t.body),{fileType:h,stream:y}=await I(l);h?.mime&&(e.contentType=h.mime),t.body=y}catch{}if(e.Parts.length>this.MAX_PARTS)throw new Error(`Exceeded ${this.MAX_PARTS} as part of the upload to ${this.bucket}.`);const a=e.Parts.length+1,i=this.getS3Api(),n=e.UploadId;if(!n)throw new Error("UploadId is required");const{ETag:s}=await this.retry(()=>i.uploadPart({Body:t.body,Bucket:this.bucket,ContentLength:t.contentLength||0,Key:e.name,PartNumber:a,UploadId:n,...t.checksumAlgorithm==="md5"?{ContentMD5:t.checksum}:{}})),c={ETag:s,PartNumber:a,Size:t.contentLength};e.Parts=[...e.Parts,c],e.bytesWritten+=t.contentLength||0}if(this.cache.set(e.id,e),e.status=S(e),e.status==="completed"){const[a]=await this.internalOnComplete(e);delete e.Parts,e.uri=a.Location,e.ETag=a.ETag}}finally{await this.unlock(t.id,r)}return e})}async delete({id:t}){return this.instrumentOperation("delete",async()=>{const e=await this.getMeta(t);e.status="deleted",await this.retry(()=>this.abortMultipartUpload(e)),await this.deleteMeta(e.id);const r={...e};return await this.onDelete(r),r})}async copy(t,e,r){return this.instrumentOperation("copy",async()=>{b.assertSafeId(t),b.assertSafeId(e);const a=await this.getMeta(t),i=`${this.bucket}/${t}`,n=this.bucket,s=e,c=this.getS3Api();return await this.retry(()=>c.copyObject({Bucket:n,CopySource:i,Key:s,...r?.storageClass&&{StorageClass:r.storageClass}})),{...a,id:s,name:s}})}async move(t,e){return this.instrumentOperation("move",async()=>{await this.copy(t,e);const r=this.getS3Api();return await this.retry(()=>r.deleteObject({Bucket:this.bucket,Key:t})),await this.getMeta(e)})}async list(t=1e3){return this.instrumentOperation("list",async()=>{const e=this.getS3Api(),r=Math.min(t,1e3);let a={Bucket:this.bucket,MaxKeys:r};const i=[];let n=!0;for(;n&&i.length<t;)try{const s=await this.retry(()=>e.listObjectsV2(a));for(const{Key:c,LastModified:l}of s?.Contents||[]){if(i.length>=t)break;c!==void 0&&i.push({id:c,...l&&{createdAt:l}})}n=s.IsTruncated||!1,n&&s.NextContinuationToken&&i.length<t&&(a={...a,ContinuationToken:s.NextContinuationToken,MaxKeys:Math.min(r,t-i.length)})}catch(s){const c=this.normalizeError(s instanceof Error?s:new Error(String(s)));throw await this.onError(c),s}return i},{limit:t})}async exists({id:t}){return this.instrumentOperation("exists",async()=>{try{await this.getMeta(t);const e=this.getS3Api();return await this.retry(()=>e.headObject({Bucket:this.bucket,Key:t})),!0}catch{return!1}})}async get({id:t}){return this.instrumentOperation("get",async()=>{const e=this.getS3Api(),{Body:r,ContentLength:a,ContentType:i,ETag:n,Expires:s,LastModified:c,Metadata:l}=await this.retry(()=>e.getObject({Bucket:this.bucket,Key:t}));await this.checkIfExpired({expiredAt:s});const h=[];if(r)if(r instanceof g)for await(const u of r)h.push(u instanceof Uint8Array?u:new Uint8Array(u));else{const u=r.getReader();for(;;){const{done:P,value:U}=await u.read();if(P)break;h.push(U)}}const{originalName:y,...k}=l||{};return{content:Buffer.concat(h),contentType:i,ETag:n,expiredAt:s,id:t,metadata:k,modifiedAt:c,name:t,originalName:y||t,size:Number(a)}})}async buildPresigned(t){const e=t;if(e.Parts?.length||(e.Parts=await this.getParts(t)),e.bytesWritten=e.Parts.map(r=>r.Size||0).reduce((r,a)=>r+a,0),t.status=S(e),e.partsUrls?.length||(e.partsUrls=await this.getPartsPresignedUrls(t)),t.status==="completed"){const[r]=await this.internalOnComplete(t);return delete e.Parts,e.uri=r.Location,t}return t}async getPartsPresignedUrls(t){t.partSize??=this.partSize;const e=t.UploadId;if(!e)throw new Error("UploadId is required for getting presigned URLs");const r=Math.trunc(t.size/this.partSize)+1,a=[],i=Math.trunc($(this.config.expiration?.maxAge||"6hrs")),n=this.getS3Api();for(let s=0;s<r;s++)a.push(n.getPresignedUrl({Bucket:this.bucket,expiresIn:i,Key:t.name,PartNumber:s+1,UploadId:e}));return Promise.all(a)}async getParts(t){const e=this.getS3Api(),r=t.UploadId;if(!r)throw new Error("UploadId is required");const{Parts:a=[]}=await this.retry(()=>e.listParts({Bucket:this.bucket,Key:t.name,UploadId:r}));return a}completeMultipartUpload(t){const e=this.getS3Api(),r=t.UploadId;if(!r)throw new Error("UploadId is required");const a=t.Parts?.map(({ETag:i,PartNumber:n})=>{if(!i||!n)throw new Error("ETag and PartNumber are required");return{ETag:i,PartNumber:n}})||[];return this.retry(()=>e.completeMultipartUpload({Bucket:this.bucket,Key:t.name,Parts:a,UploadId:r}))}async abortMultipartUpload(t){if(t.status!=="completed")try{const e=this.getS3Api(),r=t.UploadId;if(!r)return;await this.retry(()=>e.abortMultipartUpload({Bucket:this.bucket,Key:t.name,UploadId:r}))}catch(e){this.logger?.error("abortMultipartUploadError: ",e);const r=this.normalizeError(e instanceof Error?e:new Error(String(e)));await this.onError(r)}}internalOnComplete=f(async t=>{const[e]=await Promise.all([this.completeMultipartUpload(t),this.deleteMeta(t.id)]);return[e,t]},"internalOnComplete")}export{b as S};