@visulima/storage 1.0.0-alpha.1 → 1.0.0-alpha.10

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 (225) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/LICENSE.md +6 -6
  3. package/README.md +33 -14
  4. package/dist/adapter/nuxt/module.d.ts +39 -0
  5. package/dist/adapter/nuxt/module.js +93 -0
  6. package/dist/adapter/nuxt/package.json +20 -0
  7. package/dist/handler/base/base-handler-core.d.ts +91 -0
  8. package/dist/handler/base/base-handler-fetch.d.ts +76 -0
  9. package/dist/handler/base/base-handler-node.d.ts +137 -0
  10. package/dist/handler/http/fetch/index.d.ts +4 -0
  11. package/dist/handler/http/fetch/index.js +4 -0
  12. package/dist/handler/http/hono/index.d.ts +67 -0
  13. package/dist/handler/http/hono/index.js +65 -0
  14. package/dist/handler/http/nextjs/index.d.ts +61 -0
  15. package/dist/handler/http/nextjs/index.js +37 -0
  16. package/dist/handler/http/node/index.d.ts +4 -0
  17. package/dist/handler/http/node/index.js +8 -0
  18. package/dist/handler/http/solid-start/index.d.ts +60 -0
  19. package/dist/handler/http/solid-start/index.js +44 -0
  20. package/dist/handler/multipart/multipart-base.d.ts +84 -0
  21. package/dist/handler/multipart/multipart-fetch.d.ts +64 -0
  22. package/dist/handler/multipart/multipart.d.ts +49 -0
  23. package/dist/handler/rest/rest-base.d.ts +106 -0
  24. package/dist/handler/rest/rest-fetch.d.ts +88 -0
  25. package/dist/handler/rest/rest.d.ts +93 -0
  26. package/dist/handler/tus/tus-base.d.ts +152 -0
  27. package/dist/handler/tus/tus-fetch.d.ts +72 -0
  28. package/dist/handler/tus/tus.d.ts +78 -0
  29. package/dist/handler/types.d.ts +53 -0
  30. package/dist/handler/utils/request-parser.d.ts +72 -0
  31. package/dist/handler/utils/response-builder.d.ts +83 -0
  32. package/dist/handler/utils/storage-utils.d.ts +10 -0
  33. package/dist/handler/utils/stream-utils.d.ts +29 -0
  34. package/dist/handler/utils/upload-handlers.d.ts +76 -0
  35. package/dist/index.d.ts +17 -0
  36. package/dist/index.js +13 -0
  37. package/dist/metrics/index.d.ts +2 -0
  38. package/dist/metrics/no-op-metrics.d.ts +15 -0
  39. package/dist/metrics/opentelemetry-metrics.d.ts +55 -0
  40. package/dist/openapi/index.d.ts +5 -0
  41. package/dist/openapi/index.js +5 -0
  42. package/dist/openapi/rest.d.ts +7 -0
  43. package/dist/openapi/shared.d.ts +13 -0
  44. package/dist/openapi/transform.d.ts +3 -0
  45. package/dist/openapi/tus.d.ts +7 -0
  46. package/dist/openapi/xhr.d.ts +7 -0
  47. package/dist/packem_shared/AwsLightFile-tTneXZgG.js +11 -0
  48. package/dist/packem_shared/AwsLightMetaStorage-BWSOtVaN.js +4 -0
  49. package/dist/packem_shared/AwsLightStorage-Blv-GP4v.js +133 -0
  50. package/dist/packem_shared/AzureFile-CesgFzps.js +8 -0
  51. package/dist/packem_shared/AzureSMetaStorage-CFs-OYJT.js +88 -0
  52. package/dist/packem_shared/AzureStorage-B0v048hG.js +357 -0
  53. package/dist/packem_shared/BaseTransformer-C2gLib6v.js +82 -0
  54. package/dist/packem_shared/DiskStorage-Ck5yGQsq.js +12 -0
  55. package/dist/packem_shared/DiskStorageWithChecksum-BRl-V5x2.js +238 -0
  56. package/dist/packem_shared/ERRORS-D0apMqnc.js +97 -0
  57. package/dist/packem_shared/File-Bb3P23dr.js +69 -0
  58. package/dist/packem_shared/GCSConfig-vPP22kN6.js +11 -0
  59. package/dist/packem_shared/GCSFile-BIEunhAN.js +8 -0
  60. package/dist/packem_shared/GCSMetaStorage-CNX_Nc7d.js +7 -0
  61. package/dist/packem_shared/GCStorage-kdkXVebX.js +406 -0
  62. package/dist/packem_shared/LocalMetaStorage-CZHhKkMd.js +7 -0
  63. package/dist/packem_shared/MediaTransformer-D6658DL1.js +1197 -0
  64. package/dist/packem_shared/MetaStorage-pECeFOad.js +46 -0
  65. package/dist/packem_shared/Metadata-DRLXeJ0F.js +89 -0
  66. package/dist/packem_shared/Multipart-CRV21AUU.js +128 -0
  67. package/dist/packem_shared/Multipart-D2ryPMjD.js +163 -0
  68. package/dist/packem_shared/NetlifyBlobFile-CXzyjqrD.js +14 -0
  69. package/dist/packem_shared/NetlifyBlobMetaStorage-DxZ5aDvD.js +9 -0
  70. package/dist/packem_shared/NetlifyBlobStorage-CLPtjHqd.js +376 -0
  71. package/dist/packem_shared/NoOpMetrics-DhAk5rXc.js +10 -0
  72. package/dist/packem_shared/OpenTelemetryMetrics-BnxhqIaH.js +67 -0
  73. package/dist/packem_shared/Rest-DcxBMBjU.js +228 -0
  74. package/dist/packem_shared/Rest-DjwU3puo.js +267 -0
  75. package/dist/packem_shared/S3File-DZiyk9Qt.js +11 -0
  76. package/dist/packem_shared/S3MetaStorage-Dz9aDabA.js +76 -0
  77. package/dist/packem_shared/S3Storage-DHmTk-hU.js +316 -0
  78. package/dist/packem_shared/TUS_RESUMABLE-Dtfsffnj.js +434 -0
  79. package/dist/packem_shared/Tus-DFVlZHaX.js +200 -0
  80. package/dist/packem_shared/Tus-DaN0FmOy.js +195 -0
  81. package/dist/packem_shared/ValidationError-BfF1aE4h.js +26 -0
  82. package/dist/packem_shared/VercelBlobFile-BCg4aTEq.js +18 -0
  83. package/dist/packem_shared/VercelBlobMetaStorage-Bd9F-VFm.js +9 -0
  84. package/dist/packem_shared/VercelBlobStorage-DD9LMOS6.js +261 -0
  85. package/dist/packem_shared/_commonjsHelpers-BqLXS_qQ.js +5 -0
  86. package/dist/packem_shared/aws-light-meta-storage-DKJBgbR6.js +446 -0
  87. package/dist/packem_shared/backblaze-BlMnIcBC.js +20 -0
  88. package/dist/packem_shared/base-handler-core-BoAqTyz7.js +303 -0
  89. package/dist/packem_shared/base-handler-fetch-D4u2xits.js +291 -0
  90. package/dist/packem_shared/base-handler-node-DGzcHHAy.js +730 -0
  91. package/dist/packem_shared/cache-B88MXQ_2.js +18 -0
  92. package/dist/packem_shared/cloudflare-Bi1q8wXE.js +21 -0
  93. package/dist/packem_shared/defaultCloudStorageFileNameValidation-DUuacjWv.js +11 -0
  94. package/dist/packem_shared/digitalOcean-CWQRJM3L.js +21 -0
  95. package/dist/packem_shared/disk-storage-CD47QI30.js +810 -0
  96. package/dist/packem_shared/gcs-meta-storage-BiQ1dySn.js +158 -0
  97. package/dist/packem_shared/has-content-CY66ehMK.js +3 -0
  98. package/dist/packem_shared/headers-YLRp1dLo.js +1318 -0
  99. package/dist/packem_shared/is-expired-CTThU1q5.js +8 -0
  100. package/dist/packem_shared/isRetryableError-Dycp7127.js +82 -0
  101. package/dist/packem_shared/isValidMediaType-BeDgiObq.js +35 -0
  102. package/dist/packem_shared/local-meta-storage-By-3SNBI.js +649 -0
  103. package/dist/packem_shared/minio-C2YBZQOw.js +22 -0
  104. package/dist/packem_shared/multipart-base-C994naBi.js +102 -0
  105. package/dist/packem_shared/part-match-BMNqHDYD.js +96 -0
  106. package/dist/packem_shared/path-CR6YkPXX-7R1-9CMk.js +161 -0
  107. package/dist/packem_shared/response-builder-BtnRiBUI.js +45 -0
  108. package/dist/packem_shared/rest-base-D9URIFkc.js +457 -0
  109. package/dist/packem_shared/restOpenApiSpec-D1JC_Jto.js +800 -0
  110. package/dist/packem_shared/s3-base-storage-C1DIHTYY.js +510 -0
  111. package/dist/packem_shared/sharedGet-Cpo7QUyu.js +1019 -0
  112. package/dist/packem_shared/storage-C6NSXb8h.js +1175 -0
  113. package/dist/packem_shared/tigris-Hac8TKnX.js +21 -0
  114. package/dist/packem_shared/transformOpenApiSpec-DWM5WtnN.js +975 -0
  115. package/dist/packem_shared/tusOpenApiSpec-mBZkl7he.js +740 -0
  116. package/dist/packem_shared/update-size-CCGm6i1J.js +8 -0
  117. package/dist/packem_shared/validator-BeX_lJet.js +78 -0
  118. package/dist/packem_shared/waitForStorage-Cscw85sx.js +18 -0
  119. package/dist/packem_shared/wasabi-DIyflHSd.js +21 -0
  120. package/dist/packem_shared/xhrOpenApiSpec-B1V5Dxrj.js +264 -0
  121. package/dist/storage/aws/clients/backblaze.d.ts +12 -0
  122. package/dist/storage/aws/clients/cloudflare.d.ts +13 -0
  123. package/dist/storage/aws/clients/digital-ocean.d.ts +12 -0
  124. package/dist/storage/aws/clients/index.d.ts +6 -0
  125. package/dist/storage/aws/clients/index.js +6 -0
  126. package/dist/storage/aws/clients/minio.d.ts +13 -0
  127. package/dist/storage/aws/clients/tigris.d.ts +12 -0
  128. package/dist/storage/aws/clients/types.d.ts +95 -0
  129. package/dist/storage/aws/clients/wasabi.d.ts +12 -0
  130. package/dist/storage/aws/index.d.ts +4 -0
  131. package/dist/storage/aws/index.js +3 -0
  132. package/dist/storage/aws/s3-base-storage.d.ts +248 -0
  133. package/dist/storage/aws/s3-client-adapter.d.ts +110 -0
  134. package/dist/storage/aws/s3-file.d.ts +10 -0
  135. package/dist/storage/aws/s3-meta-storage.d.ts +15 -0
  136. package/dist/storage/aws/s3-storage.d.ts +70 -0
  137. package/dist/storage/aws/types.d.ts +119 -0
  138. package/dist/storage/aws-light/aws-light-api-adapter.d.ts +130 -0
  139. package/dist/storage/aws-light/aws-light-file.d.ts +10 -0
  140. package/dist/storage/aws-light/aws-light-meta-storage.d.ts +19 -0
  141. package/dist/storage/aws-light/aws-light-storage.d.ts +65 -0
  142. package/dist/storage/aws-light/index.d.ts +4 -0
  143. package/dist/storage/aws-light/index.js +3 -0
  144. package/dist/storage/aws-light/types.d.ts +37 -0
  145. package/dist/storage/azure/azure-file.d.ts +6 -0
  146. package/dist/storage/azure/azure-meta-storage.d.ts +15 -0
  147. package/dist/storage/azure/azure-storage.d.ts +69 -0
  148. package/dist/storage/azure/index.d.ts +4 -0
  149. package/dist/storage/azure/index.js +3 -0
  150. package/dist/storage/azure/types.d.ts +62 -0
  151. package/dist/storage/gcs/fetch-error.d.ts +11 -0
  152. package/dist/storage/gcs/gcs-config.d.ts +2 -0
  153. package/dist/storage/gcs/gcs-file.d.ts +6 -0
  154. package/dist/storage/gcs/gcs-meta-storage.d.ts +27 -0
  155. package/dist/storage/gcs/gcs-storage.d.ts +91 -0
  156. package/dist/storage/gcs/index.d.ts +5 -0
  157. package/dist/storage/gcs/index.js +4 -0
  158. package/dist/storage/gcs/types.d.ts +55 -0
  159. package/dist/storage/gcs/utils.d.ts +7 -0
  160. package/dist/storage/local/disk-storage-with-checksum.d.ts +15 -0
  161. package/dist/storage/local/disk-storage.d.ts +135 -0
  162. package/dist/storage/local/index.d.ts +4 -0
  163. package/dist/storage/local/index.js +3 -0
  164. package/dist/storage/local/local-meta-storage.d.ts +32 -0
  165. package/dist/storage/meta-storage.d.ts +30 -0
  166. package/dist/storage/netlify-blob/index.d.ts +4 -0
  167. package/dist/storage/netlify-blob/index.js +3 -0
  168. package/dist/storage/netlify-blob/netlify-blob-file.d.ts +12 -0
  169. package/dist/storage/netlify-blob/netlify-blob-meta-storage.d.ts +7 -0
  170. package/dist/storage/netlify-blob/netlify-blob-storage.d.ts +93 -0
  171. package/dist/storage/netlify-blob/types.d.ts +30 -0
  172. package/dist/storage/storage.d.ts +353 -0
  173. package/dist/storage/types.d.ts +221 -0
  174. package/dist/storage/utils/file/file.d.ts +25 -0
  175. package/dist/storage/utils/file/get-file-status.d.ts +9 -0
  176. package/dist/storage/utils/file/has-content.d.ts +9 -0
  177. package/dist/storage/utils/file/index.d.ts +10 -0
  178. package/dist/storage/utils/file/is-expired.d.ts +8 -0
  179. package/dist/storage/utils/file/metadata.d.ts +18 -0
  180. package/dist/storage/utils/file/part-match.d.ts +11 -0
  181. package/dist/storage/utils/file/types.d.ts +37 -0
  182. package/dist/storage/utils/file/update-metadata.d.ts +10 -0
  183. package/dist/storage/utils/file/update-size.d.ts +10 -0
  184. package/dist/storage/vercel-blob/index.d.ts +4 -0
  185. package/dist/storage/vercel-blob/index.js +3 -0
  186. package/dist/storage/vercel-blob/types.d.ts +32 -0
  187. package/dist/storage/vercel-blob/vercel-blob-file.d.ts +16 -0
  188. package/dist/storage/vercel-blob/vercel-blob-meta-storage.d.ts +7 -0
  189. package/dist/storage/vercel-blob/vercel-blob-storage.d.ts +76 -0
  190. package/dist/transformer/audio-transformer.d.ts +128 -0
  191. package/dist/transformer/audio-transformer.js +278 -0
  192. package/dist/transformer/base-transformer.d.ts +63 -0
  193. package/dist/transformer/image-transformer.d.ts +571 -0
  194. package/dist/transformer/image-transformer.js +1100 -0
  195. package/dist/transformer/index.d.ts +5 -0
  196. package/dist/transformer/index.js +4 -0
  197. package/dist/transformer/media-transformer.d.ts +332 -0
  198. package/dist/transformer/types.d.ts +652 -0
  199. package/dist/transformer/utils.d.ts +33 -0
  200. package/dist/transformer/validation-error.d.ts +23 -0
  201. package/dist/transformer/video-transformer.d.ts +145 -0
  202. package/dist/transformer/video-transformer.js +310 -0
  203. package/dist/utils/cache.d.ts +32 -0
  204. package/dist/utils/chunked-upload.d.ts +65 -0
  205. package/dist/utils/detect-file-type.d.ts +28 -0
  206. package/dist/utils/errors.d.ts +74 -0
  207. package/dist/utils/file-path-url-matcher.d.ts +18 -0
  208. package/dist/utils/headers.d.ts +111 -0
  209. package/dist/utils/http.d.ts +92 -0
  210. package/dist/utils/locker.d.ts +26 -0
  211. package/dist/utils/pipes/stream-checksum.d.ts +47 -0
  212. package/dist/utils/pipes/stream-length.d.ts +22 -0
  213. package/dist/utils/primitives/get-last-one.d.ts +3 -0
  214. package/dist/utils/primitives/is-record.d.ts +2 -0
  215. package/dist/utils/primitives/map-values.d.ts +9 -0
  216. package/dist/utils/primitives/pick.d.ts +2 -0
  217. package/dist/utils/primitives/to-milliseconds.d.ts +12 -0
  218. package/dist/utils/primitives/to-seconds.d.ts +12 -0
  219. package/dist/utils/range-checksum.d.ts +33 -0
  220. package/dist/utils/range-hasher.d.ts +46 -0
  221. package/dist/utils/retry.d.ts +64 -0
  222. package/dist/utils/types.d.ts +108 -0
  223. package/dist/utils/validation-error.d.ts +22 -0
  224. package/dist/utils/validator.d.ts +36 -0
  225. package/package.json +10 -9
@@ -0,0 +1,49 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { UploadFile } from "../../storage/utils/index.d.ts";
3
+ import BaseHandlerNode from "../base/base-handler-node.d.ts";
4
+ import type { Handlers, ResponseFile, UploadOptions } from "../types.d.ts";
5
+ /**
6
+ * Multipart/form-data upload handler (Node.js version).
7
+ * @example
8
+ * ```ts
9
+ * const multipart = new Multipart({
10
+ * storage,
11
+ * maxFileSize: 100 * 1024 * 1024, // 100MB
12
+ * });
13
+ *
14
+ * app.use('/files', multipart.handle);
15
+ * ```
16
+ */
17
+ declare class Multipart<TFile extends UploadFile, NodeRequest extends IncomingMessage = IncomingMessage, NodeResponse extends ServerResponse = ServerResponse> extends BaseHandlerNode<TFile, NodeRequest, NodeResponse> {
18
+ /**
19
+ * Limiting enabled http method handler
20
+ */
21
+ static readonly methods: Handlers[];
22
+ private readonly multipartBase;
23
+ /**
24
+ * Maximum file size allowed for multipart uploads
25
+ */
26
+ private maxFileSize;
27
+ /**
28
+ * Maximum header size allowed for multipart parser
29
+ */
30
+ private maxHeaderSize;
31
+ constructor(options: UploadOptions<TFile>);
32
+ /**
33
+ * Handles multipart/form-data POST requests for file uploads.
34
+ * @param request Node.js IncomingMessage containing multipart data.
35
+ * @returns Promise resolving to ResponseFile with upload result.
36
+ */
37
+ post(request: NodeRequest): Promise<ResponseFile<TFile>>;
38
+ /**
39
+ * Delete an uploaded file.
40
+ * @param request Node.js IncomingMessage with file ID
41
+ * @returns Promise resolving to ResponseFile with deletion result
42
+ */
43
+ delete(request: NodeRequest): Promise<ResponseFile<TFile>>;
44
+ /**
45
+ * Compose and register HTTP method handlers.
46
+ */
47
+ protected compose(): void;
48
+ }
49
+ export default Multipart;
@@ -0,0 +1,106 @@
1
+ import type { FileInit, UploadFile } from "../../storage/utils/index.d.ts";
2
+ import type { ResponseFile, ResponseList } from "../types.d.ts";
3
+ /**
4
+ * Base class containing shared REST API business logic.
5
+ * Platform-agnostic - contains no Node.js or Web API specific code.
6
+ * @template TFile The file type used by this handler.
7
+ */
8
+ declare abstract class RestBase<TFile extends UploadFile> {
9
+ /**
10
+ * Handle single file deletion.
11
+ * @param id File ID to delete
12
+ * @returns Promise resolving to ResponseFile with deletion result
13
+ */
14
+ deleteSingle(id: string): Promise<ResponseFile<TFile>>;
15
+ /**
16
+ * Handle file creation (POST).
17
+ * @param config File initialization config
18
+ * @param isChunkedUpload Whether this is a chunked upload initialization
19
+ * @param requestUrl Request URL for Location header
20
+ * @param bodyStream Request body stream (for non-chunked uploads)
21
+ * @param contentLength Content length (for non-chunked uploads)
22
+ * @returns Promise resolving to ResponseFile with upload result
23
+ */
24
+ handlePost(config: FileInit, isChunkedUpload: boolean, requestUrl: string, bodyStream: unknown, contentLength: number): Promise<ResponseFile<TFile>>;
25
+ /**
26
+ * Handle file update or creation (PUT).
27
+ * @param id File ID from URL
28
+ * @param config File initialization config (for new files)
29
+ * @param requestUrl Request URL for Location header
30
+ * @param bodyStream Request body stream
31
+ * @param contentLength Content length
32
+ * @param metadata Optional metadata to merge (for updates)
33
+ * @returns Promise resolving to ResponseFile with upload result
34
+ */
35
+ handlePut(id: string, config: FileInit, requestUrl: string, bodyStream: unknown, contentLength: number, metadata?: Record<string, unknown>): Promise<ResponseFile<TFile>>;
36
+ /**
37
+ * Handle chunked upload chunk (PATCH).
38
+ * @param id File ID from URL
39
+ * @param chunkOffset Chunk offset in bytes
40
+ * @param contentLength Chunk content length
41
+ * @param chunkChecksum Optional chunk checksum
42
+ * @param requestUrl Request URL for Location header
43
+ * @param bodyStream Request body stream
44
+ * @returns Promise resolving to ResponseFile with upload progress
45
+ */
46
+ handlePatch(id: string, chunkOffset: number, contentLength: number, chunkChecksum: string | undefined, requestUrl: string, bodyStream: unknown): Promise<ResponseFile<TFile>>;
47
+ /**
48
+ * Handle file metadata retrieval (HEAD).
49
+ * @param id File ID from URL
50
+ * @returns Promise resolving to ResponseFile with metadata headers
51
+ */
52
+ handleHead(id: string): Promise<ResponseFile<TFile>>;
53
+ /**
54
+ * Handle OPTIONS request with REST API capabilities.
55
+ * @param methods Array of supported HTTP methods
56
+ * @param maxUploadSize Maximum upload size
57
+ * @returns ResponseFile with CORS headers
58
+ */
59
+ handleOptions(methods: string[], maxUploadSize: number): ResponseFile<TFile>;
60
+ /**
61
+ * Handle batch file deletion.
62
+ * @param ids Array of file IDs to delete
63
+ * @returns Promise resolving to ResponseList with deletion results
64
+ */
65
+ deleteBatch(ids: string[]): Promise<ResponseList<TFile>>;
66
+ /**
67
+ * Storage instance for file operations.
68
+ */
69
+ protected get storage(): {
70
+ create: (config: FileInit) => Promise<TFile>;
71
+ delete: (options: {
72
+ id: string;
73
+ }) => Promise<TFile>;
74
+ deleteBatch: (ids: string[]) => Promise<{
75
+ failed: {
76
+ error: string;
77
+ id: string;
78
+ }[];
79
+ failedCount: number;
80
+ successful: TFile[];
81
+ successfulCount: number;
82
+ }>;
83
+ getMeta: (id: string) => Promise<TFile>;
84
+ maxUploadSize: number;
85
+ update: (options: {
86
+ id: string;
87
+ }, updates: {
88
+ metadata?: Record<string, unknown>;
89
+ status?: string;
90
+ }) => Promise<void>;
91
+ write: (options: {
92
+ body: unknown;
93
+ contentLength: number;
94
+ id: string;
95
+ start: number;
96
+ }) => Promise<TFile>;
97
+ };
98
+ /**
99
+ * Build file URL from request URL and file data.
100
+ * @param _requestUrl Request URL string
101
+ * @param _file File object containing ID and content type
102
+ * @returns Constructed file URL with extension based on content type
103
+ */
104
+ protected buildFileUrl(_requestUrl: string, _file: TFile): string;
105
+ }
106
+ export default RestBase;
@@ -0,0 +1,88 @@
1
+ import type { UploadFile } from "../../storage/utils/index.d.ts";
2
+ import BaseHandlerFetch from "../base/base-handler-fetch.d.ts";
3
+ import type { Handlers, ResponseFile, ResponseList, UploadOptions } from "../types.d.ts";
4
+ /**
5
+ * REST API handler for direct binary file uploads (Web API Fetch version).
6
+ *
7
+ * This handler provides a clean REST interface for file operations using Web API Request/Response:
8
+ * - POST: Create a new file with raw binary data or initialize chunked upload
9
+ * - PUT: Create or update a file (requires ID in URL)
10
+ * - PATCH: Upload chunks for chunked uploads (requires ID in URL)
11
+ * - GET: Retrieve a file or list files
12
+ * - DELETE: Delete a file (single) or multiple files (via ?ids=id1,id2 or JSON body)
13
+ * - HEAD: Get file metadata and upload progress
14
+ * - OPTIONS: CORS preflight
15
+ * @example
16
+ * ```ts
17
+ * const rest = new RestFetch({
18
+ * storage,
19
+ * });
20
+ *
21
+ * // Use with Hono, Cloudflare Workers, etc.
22
+ * app.all('/files/*', async (c) => {
23
+ * return rest.fetch(c.req.raw);
24
+ * });
25
+ * ```
26
+ */
27
+ declare class RestFetch<TFile extends UploadFile> extends BaseHandlerFetch<TFile> {
28
+ /**
29
+ * Limiting enabled http method handler
30
+ */
31
+ static readonly methods: Handlers[];
32
+ private readonly restBase;
33
+ constructor(options: UploadOptions<TFile>);
34
+ /**
35
+ * Compose and register HTTP method handlers.
36
+ */
37
+ protected compose(): void;
38
+ /**
39
+ * Creates a new file via POST request with raw binary data.
40
+ * Supports both full file uploads and chunked upload initialization.
41
+ * @param request Web API Request with file data.
42
+ * @returns Promise resolving to ResponseFile with upload result.
43
+ */
44
+ post(request: Request): Promise<ResponseFile<TFile>>;
45
+ /**
46
+ * Create or update a file via PUT request.
47
+ * Requires file ID in the URL path.
48
+ * @param request Web API Request with file ID and data
49
+ * @returns Promise resolving to ResponseFile with upload result
50
+ */
51
+ put(request: Request): Promise<ResponseFile<TFile>>;
52
+ /**
53
+ * Delete an uploaded file or multiple files.
54
+ * Supports single file (ID in URL) or batch delete (via ?ids=id1,id2 or JSON body).
55
+ * @param request Web API Request with file ID(s)
56
+ * @returns Promise resolving to ResponseFile (single) or ResponseList (batch) with deletion result
57
+ */
58
+ delete(request: Request): Promise<ResponseFile<TFile> | ResponseList<TFile>>;
59
+ /**
60
+ * Uploads a chunk via PATCH request for chunked uploads.
61
+ * Headers required: X-Chunk-Offset (byte offset), Content-Length (chunk size).
62
+ * Optional: X-Chunk-Checksum (SHA256 checksum for validation).
63
+ * @param request Web API Request with chunk data.
64
+ * @returns Promise resolving to ResponseFile with upload progress.
65
+ */
66
+ patch(request: Request): Promise<ResponseFile<TFile>>;
67
+ /**
68
+ * Get file metadata via HEAD request.
69
+ * For chunked uploads, also returns upload progress information.
70
+ * @param request Web API Request with file ID
71
+ * @returns Promise resolving to ResponseFile with metadata headers
72
+ */
73
+ head(request: Request): Promise<ResponseFile<TFile>>;
74
+ /**
75
+ * Handle OPTIONS requests with REST API capabilities.
76
+ * @param _request Web API Request
77
+ * @returns Promise resolving to ResponseFile with CORS headers
78
+ */
79
+ options(_request: Request): Promise<ResponseFile<TFile>>;
80
+ /**
81
+ * Retrieves a file or list of files based on the request path.
82
+ * Delegates to BaseHandlerFetch.fetch() method.
83
+ * @param _request Web API Request
84
+ * @returns Promise resolving to Web API Response
85
+ */
86
+ get(_request: Request): Promise<ResponseFile<TFile> | ResponseList<TFile>>;
87
+ }
88
+ export default RestFetch;
@@ -0,0 +1,93 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { UploadFile } from "../../storage/utils/index.d.ts";
3
+ import BaseHandlerNode from "../base/base-handler-node.d.ts";
4
+ import type { Handlers, ResponseFile, ResponseList, UploadOptions } from "../types.d.ts";
5
+ /**
6
+ * REST API handler for direct binary file uploads (Node.js version).
7
+ *
8
+ * This handler provides a clean REST interface for file operations:
9
+ * - POST: Create a new file with raw binary data or initialize chunked upload
10
+ * - PUT: Create or update a file (requires ID in URL)
11
+ * - PATCH: Upload chunks for chunked uploads (requires ID in URL)
12
+ * - GET: Retrieve a file or list files
13
+ * - DELETE: Delete a file (single) or multiple files (via ?ids=id1,id2 or JSON body)
14
+ * - HEAD: Get file metadata and upload progress
15
+ * - OPTIONS: CORS preflight
16
+ * @example
17
+ * ```ts
18
+ * const rest = new Rest({
19
+ * storage,
20
+ * });
21
+ *
22
+ * app.use('/files', rest.handle);
23
+ * ```
24
+ */
25
+ declare class Rest<TFile extends UploadFile, NodeRequest extends IncomingMessage = IncomingMessage, NodeResponse extends ServerResponse = ServerResponse> extends BaseHandlerNode<TFile, NodeRequest, NodeResponse> {
26
+ /**
27
+ * Limiting enabled http method handler
28
+ */
29
+ static readonly methods: Handlers[];
30
+ private readonly restBase;
31
+ constructor(options: UploadOptions<TFile>);
32
+ /**
33
+ * Compose and register HTTP method handlers.
34
+ */
35
+ protected compose(): void;
36
+ /**
37
+ * Build file URL from request and file data.
38
+ * @param requestUrl Request URL string
39
+ * @param file File object containing ID and content type
40
+ * @returns Constructed file URL with extension based on content type
41
+ */
42
+ protected buildFileUrlForRest(requestUrl: string, file: TFile): string;
43
+ /**
44
+ * Creates a new file via POST request with raw binary data.
45
+ * Supports both full file uploads and chunked upload initialization.
46
+ * @param request Node.js IncomingMessage with file data.
47
+ * @returns Promise resolving to ResponseFile with upload result.
48
+ */
49
+ post(request: NodeRequest): Promise<ResponseFile<TFile>>;
50
+ /**
51
+ * Create or update a file via PUT request.
52
+ * Requires file ID in the URL path.
53
+ * @param request Node.js IncomingMessage with file ID and data
54
+ * @returns Promise resolving to ResponseFile with upload result
55
+ */
56
+ put(request: NodeRequest): Promise<ResponseFile<TFile>>;
57
+ /**
58
+ * Delete an uploaded file or multiple files.
59
+ * Supports single file (ID in URL) or batch delete (via ?ids=id1,id2 or JSON body).
60
+ * @param request Node.js IncomingMessage with file ID(s)
61
+ * @returns Promise resolving to ResponseFile (single) or ResponseList (batch) with deletion result
62
+ */
63
+ delete(request: NodeRequest): Promise<ResponseFile<TFile> | ResponseList<TFile>>;
64
+ /**
65
+ * Uploads a chunk via PATCH request for chunked uploads.
66
+ * Headers required: X-Chunk-Offset (byte offset), Content-Length (chunk size).
67
+ * Optional: X-Chunk-Checksum (SHA256 checksum for validation).
68
+ * @param request Node.js IncomingMessage with chunk data.
69
+ * @returns Promise resolving to ResponseFile with upload progress.
70
+ */
71
+ patch(request: NodeRequest): Promise<ResponseFile<TFile>>;
72
+ /**
73
+ * Get file metadata via HEAD request.
74
+ * For chunked uploads, also returns upload progress information.
75
+ * @param request Node.js IncomingMessage with file ID
76
+ * @returns Promise resolving to ResponseFile with metadata headers
77
+ */
78
+ head(request: NodeRequest): Promise<ResponseFile<TFile>>;
79
+ /**
80
+ * Handle OPTIONS requests with REST API capabilities.
81
+ * @returns Promise resolving to ResponseFile with CORS headers
82
+ */
83
+ options(): Promise<ResponseFile<TFile>>;
84
+ /**
85
+ * Retrieves a file or list of files based on the request path.
86
+ * Delegates to BaseHandlerNode.get() method.
87
+ * @param request Node.js IncomingMessage with optional originalUrl.
88
+ * @param response Node.js ServerResponse.
89
+ * @returns Promise resolving to a single file, paginated list, or array of files.
90
+ */
91
+ get(request: NodeRequest, response: NodeResponse): Promise<ResponseFile<TFile> | ResponseList<TFile>>;
92
+ }
93
+ export default Rest;
@@ -0,0 +1,152 @@
1
+ import type { Checksum, FileInit, UploadFile } from "../../storage/utils/index.d.ts";
2
+ import { Metadata } from "../../storage/utils/index.d.ts";
3
+ import type { Headers } from "../../utils/types.d.ts";
4
+ import type { ResponseFile } from "../types.d.ts";
5
+ /**
6
+ * Parse TUS protocol metadata string into object.
7
+ * @param encoded Base64-encoded metadata string (optional, defaults to empty string)
8
+ * @returns Parsed metadata object with decoded values
9
+ */
10
+ export declare const parseMetadata: (encoded?: string) => Metadata;
11
+ /**
12
+ * Serialize metadata object to TUS protocol format.
13
+ * @param object Metadata object to serialize
14
+ * @returns Base64-encoded metadata string in TUS format
15
+ */
16
+ export declare const serializeMetadata: (object: Metadata | Record<string, unknown> | undefined) => string;
17
+ /**
18
+ * Base class containing shared TUS protocol business logic.
19
+ * Platform-agnostic - contains no Node.js or Web API specific code.
20
+ * @template TFile The file type used by this handler.
21
+ */
22
+ export declare abstract class TusBase<TFile extends UploadFile> {
23
+ /**
24
+ * Storage instance for file operations.
25
+ */
26
+ protected get storage(): {
27
+ checkIfExpired: (file: TFile) => Promise<void>;
28
+ checksumTypes: string[];
29
+ config: {
30
+ useRelativeLocation?: boolean;
31
+ };
32
+ create: (config: FileInit) => Promise<TFile>;
33
+ delete: (options: {
34
+ id: string;
35
+ }) => Promise<TFile>;
36
+ getMeta: (id: string) => Promise<TFile>;
37
+ getStream?: (options: {
38
+ id: string;
39
+ }) => Promise<{
40
+ size?: number;
41
+ stream: unknown;
42
+ }>;
43
+ maxUploadSize: number;
44
+ tusExtension: string[];
45
+ update: (options: {
46
+ id: string;
47
+ }, updates: {
48
+ id?: string;
49
+ metadata?: Record<string, unknown>;
50
+ size?: number;
51
+ }) => Promise<TFile>;
52
+ write: (options: {
53
+ body: unknown;
54
+ checksum?: string;
55
+ checksumAlgorithm?: string;
56
+ contentLength: number;
57
+ id: string;
58
+ start: number;
59
+ }) => Promise<TFile>;
60
+ };
61
+ /**
62
+ * Whether to disable termination for finished uploads.
63
+ * Must be implemented by subclasses via getter.
64
+ */
65
+ protected abstract get disableTerminationForFinishedUploads(): boolean;
66
+ /**
67
+ * Build file URL from request URL and file data.
68
+ * @param _requestUrl Request URL string
69
+ * @param _file File object containing ID
70
+ * @returns Constructed file URL for TUS protocol
71
+ */
72
+ protected buildFileUrl(_requestUrl: string, _file: TFile): string;
73
+ /**
74
+ * Handle OPTIONS request with TUS protocol capabilities.
75
+ * @param methods Array of supported HTTP methods
76
+ * @returns ResponseFile with TUS headers
77
+ */
78
+ handleOptions(methods: string[]): ResponseFile<TFile>;
79
+ /**
80
+ * Handle TUS POST (create upload).
81
+ * @param uploadLength Upload length header value
82
+ * @param uploadDeferLength Upload defer length header value
83
+ * @param uploadConcat Upload concat header value
84
+ * @param metadataHeader Upload metadata header value
85
+ * @param requestUrl Request URL for Location header
86
+ * @param bodyStream Request body stream (for creation-with-upload)
87
+ * @param contentLength Content length (for creation-with-upload)
88
+ * @param contentType Content type (for creation-with-upload)
89
+ * @returns Promise resolving to ResponseFile with upload result
90
+ */
91
+ handlePost(uploadLength: string | undefined, uploadDeferLength: string | undefined, uploadConcat: string | undefined, metadataHeader: string | undefined, requestUrl: string, bodyStream: unknown, contentLength: number, contentType: string): Promise<ResponseFile<TFile>>;
92
+ /**
93
+ * Handle TUS PATCH (write chunk).
94
+ * @param id File ID from URL
95
+ * @param uploadOffset Upload offset header value
96
+ * @param uploadLength Optional upload length header value (for defer-length)
97
+ * @param metadataHeader Optional upload metadata header value
98
+ * @param checksum Optional checksum
99
+ * @param checksumAlgorithm Optional checksum algorithm
100
+ * @param requestUrl Request URL for Location header
101
+ * @param bodyStream Request body stream
102
+ * @param contentLength Content length
103
+ * @returns Promise resolving to ResponseFile with upload progress
104
+ */
105
+ handlePatch(id: string, uploadOffset: number, uploadLength: string | undefined, metadataHeader: string | undefined, checksum: string | undefined, checksumAlgorithm: string | undefined, _requestUrl: string, bodyStream: unknown, contentLength: number): Promise<ResponseFile<TFile>>;
106
+ /**
107
+ * Handle TUS HEAD (get upload status).
108
+ * @param id File ID from URL
109
+ * @returns Promise resolving to ResponseFile with upload status headers
110
+ */
111
+ handleHead(id: string): Promise<ResponseFile<TFile>>;
112
+ /**
113
+ * Handle TUS GET (get upload metadata).
114
+ * @param id File ID from URL
115
+ * @returns Promise resolving to ResponseFile with file metadata as JSON
116
+ */
117
+ handleGet(id: string): Promise<ResponseFile<TFile>>;
118
+ /**
119
+ * Handle TUS DELETE (terminate upload).
120
+ * @param id File ID from URL
121
+ * @returns Promise resolving to ResponseFile with deletion confirmation
122
+ */
123
+ handleDelete(id: string): Promise<ResponseFile<TFile>>;
124
+ /**
125
+ * Build TUS protocol headers including required Tus-Resumable and optional Upload-Expires.
126
+ * @param file Upload file object with metadata
127
+ * @param headers Additional headers to include
128
+ * @returns Headers object with TUS protocol headers
129
+ */
130
+ protected buildHeaders(file: UploadFile, headers?: Headers): Headers;
131
+ /**
132
+ * Extract checksum algorithm and value from Upload-Checksum header.
133
+ * @param checksumHeader Upload-Checksum header value
134
+ * @returns Object containing checksum algorithm and value
135
+ */
136
+ extractChecksum(checksumHeader: string | undefined): Checksum;
137
+ /**
138
+ * Validate Tus-Resumable header value.
139
+ * @param tusResumable Tus-Resumable header value
140
+ * @throws {Error} 412 if version doesn't match or header is missing
141
+ */
142
+ validateTusResumableHeader(tusResumable: string | undefined): void;
143
+ /**
144
+ * Concatenate partial uploads into a final upload.
145
+ * @param finalFile Final file that will contain concatenated content
146
+ * @param partialFiles Array of partial upload files to concatenate
147
+ * @returns Promise resolving when concatenation is complete
148
+ */
149
+ protected concatenateFiles(finalFile: TFile, partialFiles: TFile[]): Promise<void>;
150
+ }
151
+ export declare const TUS_RESUMABLE: string;
152
+ export declare const TUS_VERSION: string;
@@ -0,0 +1,72 @@
1
+ import type { UploadFile } from "../../storage/utils/index.d.ts";
2
+ import BaseHandlerFetch from "../base/base-handler-fetch.d.ts";
3
+ import type { Handlers, ResponseFile, UploadOptions } from "../types.d.ts";
4
+ export { TUS_RESUMABLE, TUS_VERSION } from "./tus-base.d.ts";
5
+ /**
6
+ * TUS resumable upload protocol handler (Web API Fetch version).
7
+ *
8
+ * [tus resumable upload protocol](https://github.com/tus/tus-resumable-upload-protocol/blob/master/protocol.md)
9
+ * @example
10
+ * ```ts
11
+ * const tus = new TusFetch({storage});
12
+ *
13
+ * // Use with Hono, Cloudflare Workers, etc.
14
+ * app.all('/files/*', async (c) => {
15
+ * return tus.fetch(c.req.raw);
16
+ * });
17
+ * ```
18
+ */
19
+ export declare class Tus<TFile extends UploadFile> extends BaseHandlerFetch<TFile> {
20
+ /**
21
+ * Limiting enabled http method handler
22
+ */
23
+ static readonly methods: Handlers[];
24
+ private readonly tusBase;
25
+ constructor(options: UploadOptions<TFile>);
26
+ /**
27
+ * Handle OPTIONS requests with TUS protocol capabilities.
28
+ * @returns Promise resolving to ResponseFile with TUS headers
29
+ */
30
+ options(): Promise<ResponseFile<TFile>>;
31
+ /**
32
+ * Creates a new TUS upload and optionally starts uploading data.
33
+ * @param request Web API Request with TUS headers.
34
+ * @returns Promise resolving to ResponseFile with upload location and offset.
35
+ */
36
+ post(request: Request): Promise<ResponseFile<TFile>>;
37
+ /**
38
+ * Write a chunk of data to an existing TUS upload.
39
+ * @param request Web API Request with chunk data and TUS headers
40
+ * @returns Promise resolving to ResponseFile with updated offset
41
+ */
42
+ patch(request: Request): Promise<ResponseFile<TFile>>;
43
+ /**
44
+ * Get current upload offset and metadata for TUS resumable uploads.
45
+ * @param request Web API Request with upload ID
46
+ * @returns Promise resolving to ResponseFile with upload-offset and metadata headers
47
+ */
48
+ head(request: Request): Promise<ResponseFile<TFile>>;
49
+ /**
50
+ * Get TUS upload metadata and current status.
51
+ * @param request Web API Request with upload ID
52
+ * @returns Promise resolving to ResponseFile with file metadata as JSON
53
+ */
54
+ get(request: Request): Promise<ResponseFile<TFile>>;
55
+ /**
56
+ * Delete a TUS upload and its associated data.
57
+ * @param request Web API Request with upload ID
58
+ * @returns Promise resolving to ResponseFile with deletion confirmation
59
+ */
60
+ delete(request: Request): Promise<ResponseFile<TFile>>;
61
+ /**
62
+ * Compose and register HTTP method handlers.
63
+ */
64
+ protected compose(): void;
65
+ /**
66
+ * Build file URL for TUS uploads (without file extension).
67
+ * @param requestUrl Request URL string
68
+ * @param file File object containing ID
69
+ * @returns Constructed file URL for TUS protocol
70
+ */
71
+ protected buildFileUrlForTus(requestUrl: string, file: TFile): string;
72
+ }
@@ -0,0 +1,78 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { UploadFile } from "../../storage/utils/index.d.ts";
3
+ import type { UploadResponse } from "../../utils/types.d.ts";
4
+ import BaseHandlerNode from "../base/base-handler-node.d.ts";
5
+ import type { Handlers, ResponseFile, UploadOptions } from "../types.d.ts";
6
+ export { TUS_RESUMABLE, TUS_VERSION } from "./tus-base.d.ts";
7
+ /**
8
+ * TUS resumable upload protocol handler (Node.js version).
9
+ *
10
+ * [tus resumable upload protocol](https://github.com/tus/tus-resumable-upload-protocol/blob/master/protocol.md)
11
+ * @example
12
+ * ```ts
13
+ * const tus = new Tus({storage});
14
+ *
15
+ * app.all('/files', tus.handle);
16
+ * ```
17
+ */
18
+ export declare class Tus<TFile extends UploadFile, NodeRequest extends IncomingMessage = IncomingMessage, NodeResponse extends ServerResponse = ServerResponse> extends BaseHandlerNode<TFile, NodeRequest, NodeResponse> {
19
+ /**
20
+ * Limiting enabled http method handler
21
+ */
22
+ static readonly methods: Handlers[];
23
+ disableTerminationForFinishedUploads: boolean;
24
+ private readonly tusBase;
25
+ constructor(options: UploadOptions<TFile>);
26
+ /**
27
+ * Handle OPTIONS requests with TUS protocol capabilities.
28
+ * @returns Promise resolving to ResponseFile with TUS headers
29
+ */
30
+ options(): Promise<ResponseFile<TFile>>;
31
+ /**
32
+ * Creates a new TUS upload and optionally starts uploading data.
33
+ * @param request Node.js IncomingMessage with TUS headers.
34
+ * @returns Promise resolving to ResponseFile with upload location and offset.
35
+ */
36
+ post(request: NodeRequest): Promise<ResponseFile<TFile>>;
37
+ /**
38
+ * Write a chunk of data to an existing TUS upload.
39
+ * @param request Node.js IncomingMessage with chunk data and TUS headers
40
+ * @returns Promise resolving to ResponseFile with updated offset
41
+ */
42
+ patch(request: NodeRequest): Promise<ResponseFile<TFile>>;
43
+ /**
44
+ * Get current upload offset and metadata for TUS resumable uploads.
45
+ * @param request Node.js IncomingMessage with upload ID
46
+ * @returns Promise resolving to ResponseFile with upload-offset and metadata headers
47
+ */
48
+ head(request: NodeRequest): Promise<ResponseFile<TFile>>;
49
+ /**
50
+ * Get TUS upload metadata and current status.
51
+ * @param request Node.js IncomingMessage with upload ID
52
+ * @returns Promise resolving to ResponseFile with file metadata as JSON
53
+ */
54
+ get(request: NodeRequest): Promise<ResponseFile<TFile>>;
55
+ /**
56
+ * Delete a TUS upload and its associated data.
57
+ * @param request Node.js IncomingMessage with upload ID
58
+ * @returns Promise resolving to ResponseFile with deletion confirmation
59
+ */
60
+ delete(request: NodeRequest): Promise<ResponseFile<TFile>>;
61
+ /**
62
+ * Send TUS protocol response with required headers.
63
+ * @param response Node.js ServerResponse to send response to
64
+ * @param uploadResponse Response data with body, headers, and status code
65
+ */
66
+ send(response: NodeResponse, { body, headers, statusCode }: UploadResponse): void;
67
+ /**
68
+ * Compose and register HTTP method handlers.
69
+ */
70
+ protected compose(): void;
71
+ /**
72
+ * Build file URL for TUS uploads (without file extension).
73
+ * @param requestUrl Request URL string
74
+ * @param file File object containing ID
75
+ * @returns Constructed file URL for TUS protocol
76
+ */
77
+ protected buildFileUrlForTus(requestUrl: string, file: TFile): string;
78
+ }