@bedelightful/upload-sdk 0.0.7

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 (239) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +132 -0
  3. package/dist/es/Exception/BaseException.js +14 -0
  4. package/dist/es/Exception/BaseException.js.map +1 -0
  5. package/dist/es/Exception/DownloadException.js +40 -0
  6. package/dist/es/Exception/DownloadException.js.map +1 -0
  7. package/dist/es/Exception/HttpException.js +50 -0
  8. package/dist/es/Exception/HttpException.js.map +1 -0
  9. package/dist/es/Exception/InitException.js +49 -0
  10. package/dist/es/Exception/InitException.js.map +1 -0
  11. package/dist/es/Exception/UploadException.js +50 -0
  12. package/dist/es/Exception/UploadException.js.map +1 -0
  13. package/dist/es/index.d.ts +867 -0
  14. package/dist/es/index.js +162 -0
  15. package/dist/es/index.js.map +1 -0
  16. package/dist/es/modules/Kodo/defaultUpload.js +38 -0
  17. package/dist/es/modules/Kodo/defaultUpload.js.map +1 -0
  18. package/dist/es/modules/Kodo/index.js +8 -0
  19. package/dist/es/modules/Kodo/index.js.map +1 -0
  20. package/dist/es/modules/Local/index.js +31 -0
  21. package/dist/es/modules/Local/index.js.map +1 -0
  22. package/dist/es/modules/MinIO/MultipartUpload.js +335 -0
  23. package/dist/es/modules/MinIO/MultipartUpload.js.map +1 -0
  24. package/dist/es/modules/MinIO/STSUpload.js +10 -0
  25. package/dist/es/modules/MinIO/STSUpload.js.map +1 -0
  26. package/dist/es/modules/MinIO/defaultUpload.js +124 -0
  27. package/dist/es/modules/MinIO/defaultUpload.js.map +1 -0
  28. package/dist/es/modules/MinIO/index.js +16 -0
  29. package/dist/es/modules/MinIO/index.js.map +1 -0
  30. package/dist/es/modules/OBS/MultipartUpload.js +269 -0
  31. package/dist/es/modules/OBS/MultipartUpload.js.map +1 -0
  32. package/dist/es/modules/OBS/STSUpload.js +71 -0
  33. package/dist/es/modules/OBS/STSUpload.js.map +1 -0
  34. package/dist/es/modules/OBS/defaultUpload.js +59 -0
  35. package/dist/es/modules/OBS/defaultUpload.js.map +1 -0
  36. package/dist/es/modules/OBS/index.js +16 -0
  37. package/dist/es/modules/OBS/index.js.map +1 -0
  38. package/dist/es/modules/OBS/utils/index.js +25 -0
  39. package/dist/es/modules/OBS/utils/index.js.map +1 -0
  40. package/dist/es/modules/OSS/MultipartUpload.js +232 -0
  41. package/dist/es/modules/OSS/MultipartUpload.js.map +1 -0
  42. package/dist/es/modules/OSS/STSUpload.js +48 -0
  43. package/dist/es/modules/OSS/STSUpload.js.map +1 -0
  44. package/dist/es/modules/OSS/defaultUpload.js +53 -0
  45. package/dist/es/modules/OSS/defaultUpload.js.map +1 -0
  46. package/dist/es/modules/OSS/index.js +16 -0
  47. package/dist/es/modules/OSS/index.js.map +1 -0
  48. package/dist/es/modules/OSS/utils/helper.js +137 -0
  49. package/dist/es/modules/OSS/utils/helper.js.map +1 -0
  50. package/dist/es/modules/OSS/utils/signature.js +96 -0
  51. package/dist/es/modules/OSS/utils/signature.js.map +1 -0
  52. package/dist/es/modules/TOS/MultipartUpload.js +288 -0
  53. package/dist/es/modules/TOS/MultipartUpload.js.map +1 -0
  54. package/dist/es/modules/TOS/STSUpload.js +92 -0
  55. package/dist/es/modules/TOS/STSUpload.js.map +1 -0
  56. package/dist/es/modules/TOS/defaultUpload.js +65 -0
  57. package/dist/es/modules/TOS/defaultUpload.js.map +1 -0
  58. package/dist/es/modules/TOS/index.js +16 -0
  59. package/dist/es/modules/TOS/index.js.map +1 -0
  60. package/dist/es/modules/TOS/utils/TosClientError.js +15 -0
  61. package/dist/es/modules/TOS/utils/TosClientError.js.map +1 -0
  62. package/dist/es/modules/TOS/utils/index.js +38 -0
  63. package/dist/es/modules/TOS/utils/index.js.map +1 -0
  64. package/dist/es/modules/TOS/utils/signatureV4.js +269 -0
  65. package/dist/es/modules/TOS/utils/signatureV4.js.map +1 -0
  66. package/dist/es/modules/TOS/utils/signatureV4Credentials.js +21 -0
  67. package/dist/es/modules/TOS/utils/signatureV4Credentials.js.map +1 -0
  68. package/dist/es/modules/TOS/utils/universal/crypto.browser.js +56 -0
  69. package/dist/es/modules/TOS/utils/universal/crypto.browser.js.map +1 -0
  70. package/dist/es/modules/TOS/utils/utils.js +18 -0
  71. package/dist/es/modules/TOS/utils/utils.js.map +1 -0
  72. package/dist/es/modules/index.js +20 -0
  73. package/dist/es/modules/index.js.map +1 -0
  74. package/dist/es/types/Kodo.js +1 -0
  75. package/dist/es/types/Kodo.js.map +1 -0
  76. package/dist/es/types/Local.js +1 -0
  77. package/dist/es/types/Local.js.map +1 -0
  78. package/dist/es/types/MinIO.js +1 -0
  79. package/dist/es/types/MinIO.js.map +1 -0
  80. package/dist/es/types/OBS.js +8 -0
  81. package/dist/es/types/OBS.js.map +1 -0
  82. package/dist/es/types/OSS.js +1 -0
  83. package/dist/es/types/OSS.js.map +1 -0
  84. package/dist/es/types/TOS.js +1 -0
  85. package/dist/es/types/TOS.js.map +1 -0
  86. package/dist/es/types/error.js +1 -0
  87. package/dist/es/types/error.js.map +1 -0
  88. package/dist/es/types/index.js +13 -0
  89. package/dist/es/types/index.js.map +1 -0
  90. package/dist/es/types/log.js +1 -0
  91. package/dist/es/types/log.js.map +1 -0
  92. package/dist/es/types/request.js +1 -0
  93. package/dist/es/types/request.js.map +1 -0
  94. package/dist/es/utils/EventEmitter.js +32 -0
  95. package/dist/es/utils/EventEmitter.js.map +1 -0
  96. package/dist/es/utils/UploadManger.js +276 -0
  97. package/dist/es/utils/UploadManger.js.map +1 -0
  98. package/dist/es/utils/UploadTask.js +13 -0
  99. package/dist/es/utils/UploadTask.js.map +1 -0
  100. package/dist/es/utils/checkDataFormat.js +41 -0
  101. package/dist/es/utils/checkDataFormat.js.map +1 -0
  102. package/dist/es/utils/global.js +83 -0
  103. package/dist/es/utils/global.js.map +1 -0
  104. package/dist/es/utils/index.js +20 -0
  105. package/dist/es/utils/index.js.map +1 -0
  106. package/dist/es/utils/logPubSub.js +59 -0
  107. package/dist/es/utils/logPubSub.js.map +1 -0
  108. package/dist/es/utils/multipart.js +159 -0
  109. package/dist/es/utils/multipart.js.map +1 -0
  110. package/dist/es/utils/nanoid.js +10 -0
  111. package/dist/es/utils/nanoid.js.map +1 -0
  112. package/dist/es/utils/regExpUtil.js +21 -0
  113. package/dist/es/utils/regExpUtil.js.map +1 -0
  114. package/dist/es/utils/request.js +234 -0
  115. package/dist/es/utils/request.js.map +1 -0
  116. package/dist/es/utils/response.js +20 -0
  117. package/dist/es/utils/response.js.map +1 -0
  118. package/dist/index.d.ts +867 -0
  119. package/dist/index.js +60913 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/index.min.js +130 -0
  122. package/dist/index.min.js.map +1 -0
  123. package/dist/lib/Exception/BaseException.js +37 -0
  124. package/dist/lib/Exception/BaseException.js.map +1 -0
  125. package/dist/lib/Exception/DownloadException.js +65 -0
  126. package/dist/lib/Exception/DownloadException.js.map +1 -0
  127. package/dist/lib/Exception/HttpException.js +75 -0
  128. package/dist/lib/Exception/HttpException.js.map +1 -0
  129. package/dist/lib/Exception/InitException.js +73 -0
  130. package/dist/lib/Exception/InitException.js.map +1 -0
  131. package/dist/lib/Exception/UploadException.js +75 -0
  132. package/dist/lib/Exception/UploadException.js.map +1 -0
  133. package/dist/lib/index.d.cts +867 -0
  134. package/dist/lib/index.js +203 -0
  135. package/dist/lib/index.js.map +1 -0
  136. package/dist/lib/modules/Kodo/defaultUpload.js +61 -0
  137. package/dist/lib/modules/Kodo/defaultUpload.js.map +1 -0
  138. package/dist/lib/modules/Kodo/index.js +28 -0
  139. package/dist/lib/modules/Kodo/index.js.map +1 -0
  140. package/dist/lib/modules/Local/index.js +50 -0
  141. package/dist/lib/modules/Local/index.js.map +1 -0
  142. package/dist/lib/modules/MinIO/MultipartUpload.js +357 -0
  143. package/dist/lib/modules/MinIO/MultipartUpload.js.map +1 -0
  144. package/dist/lib/modules/MinIO/STSUpload.js +33 -0
  145. package/dist/lib/modules/MinIO/STSUpload.js.map +1 -0
  146. package/dist/lib/modules/MinIO/defaultUpload.js +158 -0
  147. package/dist/lib/modules/MinIO/defaultUpload.js.map +1 -0
  148. package/dist/lib/modules/MinIO/index.js +35 -0
  149. package/dist/lib/modules/MinIO/index.js.map +1 -0
  150. package/dist/lib/modules/OBS/MultipartUpload.js +296 -0
  151. package/dist/lib/modules/OBS/MultipartUpload.js.map +1 -0
  152. package/dist/lib/modules/OBS/STSUpload.js +104 -0
  153. package/dist/lib/modules/OBS/STSUpload.js.map +1 -0
  154. package/dist/lib/modules/OBS/defaultUpload.js +88 -0
  155. package/dist/lib/modules/OBS/defaultUpload.js.map +1 -0
  156. package/dist/lib/modules/OBS/index.js +45 -0
  157. package/dist/lib/modules/OBS/index.js.map +1 -0
  158. package/dist/lib/modules/OBS/utils/index.js +49 -0
  159. package/dist/lib/modules/OBS/utils/index.js.map +1 -0
  160. package/dist/lib/modules/OSS/MultipartUpload.js +259 -0
  161. package/dist/lib/modules/OSS/MultipartUpload.js.map +1 -0
  162. package/dist/lib/modules/OSS/STSUpload.js +71 -0
  163. package/dist/lib/modules/OSS/STSUpload.js.map +1 -0
  164. package/dist/lib/modules/OSS/defaultUpload.js +76 -0
  165. package/dist/lib/modules/OSS/defaultUpload.js.map +1 -0
  166. package/dist/lib/modules/OSS/index.js +35 -0
  167. package/dist/lib/modules/OSS/index.js.map +1 -0
  168. package/dist/lib/modules/OSS/utils/helper.js +173 -0
  169. package/dist/lib/modules/OSS/utils/helper.js.map +1 -0
  170. package/dist/lib/modules/OSS/utils/signature.js +132 -0
  171. package/dist/lib/modules/OSS/utils/signature.js.map +1 -0
  172. package/dist/lib/modules/TOS/MultipartUpload.js +315 -0
  173. package/dist/lib/modules/TOS/MultipartUpload.js.map +1 -0
  174. package/dist/lib/modules/TOS/STSUpload.js +125 -0
  175. package/dist/lib/modules/TOS/STSUpload.js.map +1 -0
  176. package/dist/lib/modules/TOS/defaultUpload.js +94 -0
  177. package/dist/lib/modules/TOS/defaultUpload.js.map +1 -0
  178. package/dist/lib/modules/TOS/index.js +45 -0
  179. package/dist/lib/modules/TOS/index.js.map +1 -0
  180. package/dist/lib/modules/TOS/utils/TosClientError.js +34 -0
  181. package/dist/lib/modules/TOS/utils/TosClientError.js.map +1 -0
  182. package/dist/lib/modules/TOS/utils/index.js +64 -0
  183. package/dist/lib/modules/TOS/utils/index.js.map +1 -0
  184. package/dist/lib/modules/TOS/utils/signatureV4.js +294 -0
  185. package/dist/lib/modules/TOS/utils/signatureV4.js.map +1 -0
  186. package/dist/lib/modules/TOS/utils/signatureV4Credentials.js +44 -0
  187. package/dist/lib/modules/TOS/utils/signatureV4Credentials.js.map +1 -0
  188. package/dist/lib/modules/TOS/utils/universal/crypto.browser.js +93 -0
  189. package/dist/lib/modules/TOS/utils/universal/crypto.browser.js.map +1 -0
  190. package/dist/lib/modules/TOS/utils/utils.js +42 -0
  191. package/dist/lib/modules/TOS/utils/utils.js.map +1 -0
  192. package/dist/lib/modules/index.js +50 -0
  193. package/dist/lib/modules/index.js.map +1 -0
  194. package/dist/lib/types/Kodo.js +17 -0
  195. package/dist/lib/types/Kodo.js.map +1 -0
  196. package/dist/lib/types/Local.js +17 -0
  197. package/dist/lib/types/Local.js.map +1 -0
  198. package/dist/lib/types/MinIO.js +17 -0
  199. package/dist/lib/types/MinIO.js.map +1 -0
  200. package/dist/lib/types/OBS.js +32 -0
  201. package/dist/lib/types/OBS.js.map +1 -0
  202. package/dist/lib/types/OSS.js +17 -0
  203. package/dist/lib/types/OSS.js.map +1 -0
  204. package/dist/lib/types/TOS.js +17 -0
  205. package/dist/lib/types/TOS.js.map +1 -0
  206. package/dist/lib/types/error.js +17 -0
  207. package/dist/lib/types/error.js.map +1 -0
  208. package/dist/lib/types/index.js +37 -0
  209. package/dist/lib/types/index.js.map +1 -0
  210. package/dist/lib/types/log.js +17 -0
  211. package/dist/lib/types/log.js.map +1 -0
  212. package/dist/lib/types/request.js +17 -0
  213. package/dist/lib/types/request.js.map +1 -0
  214. package/dist/lib/utils/EventEmitter.js +51 -0
  215. package/dist/lib/utils/EventEmitter.js.map +1 -0
  216. package/dist/lib/utils/UploadManger.js +309 -0
  217. package/dist/lib/utils/UploadManger.js.map +1 -0
  218. package/dist/lib/utils/UploadTask.js +32 -0
  219. package/dist/lib/utils/UploadTask.js.map +1 -0
  220. package/dist/lib/utils/checkDataFormat.js +70 -0
  221. package/dist/lib/utils/checkDataFormat.js.map +1 -0
  222. package/dist/lib/utils/global.js +106 -0
  223. package/dist/lib/utils/global.js.map +1 -0
  224. package/dist/lib/utils/index.js +44 -0
  225. package/dist/lib/utils/index.js.map +1 -0
  226. package/dist/lib/utils/logPubSub.js +78 -0
  227. package/dist/lib/utils/logPubSub.js.map +1 -0
  228. package/dist/lib/utils/multipart.js +197 -0
  229. package/dist/lib/utils/multipart.js.map +1 -0
  230. package/dist/lib/utils/nanoid.js +33 -0
  231. package/dist/lib/utils/nanoid.js.map +1 -0
  232. package/dist/lib/utils/regExpUtil.js +44 -0
  233. package/dist/lib/utils/regExpUtil.js.map +1 -0
  234. package/dist/lib/utils/request.js +264 -0
  235. package/dist/lib/utils/request.js.map +1 -0
  236. package/dist/lib/utils/response.js +43 -0
  237. package/dist/lib/utils/response.js.map +1 -0
  238. package/dist/package.json +120 -0
  239. package/package.json +120 -0
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var MultipartUpload_exports = {};
31
+ __export(MultipartUpload_exports, {
32
+ MultipartUpload: () => MultipartUpload
33
+ });
34
+ module.exports = __toCommonJS(MultipartUpload_exports);
35
+ var import_client_s3 = require("@aws-sdk/client-s3");
36
+ var import_mime = __toESM(require("mime"), 1);
37
+ var import_InitException = require("../../Exception/InitException");
38
+ var import_UploadException = require("../../Exception/UploadException");
39
+ var import_types = require("../../types");
40
+ var import_checkDataFormat = require("../../utils/checkDataFormat");
41
+ var import_multipart = require("../../utils/multipart");
42
+ var import_regExpUtil = require("../../utils/regExpUtil");
43
+ var import_request = require("../../utils/request");
44
+ var import_response = require("../../utils/response");
45
+ var import_STSUpload = require("./STSUpload");
46
+ const S3_MIN_PART_SIZE = 5 * 1024 * 1024;
47
+ const UPLOAD_STATUS_CODE = {
48
+ CANCEL: 5001,
49
+ PAUSE: 5002
50
+ };
51
+ function createAbortError(taskId, message) {
52
+ const abortError = new Error(message);
53
+ if (taskId) {
54
+ const abortState = (0, import_request.getTaskAbortState)(taskId);
55
+ abortError.status = abortState === "pause" ? UPLOAD_STATUS_CODE.PAUSE : UPLOAD_STATUS_CODE.CANCEL;
56
+ } else {
57
+ abortError.status = UPLOAD_STATUS_CODE.CANCEL;
58
+ }
59
+ return abortError;
60
+ }
61
+ __name(createAbortError, "createAbortError");
62
+ function createS3Client(params) {
63
+ const { endpoint, region, credentials } = params;
64
+ const { access_key_id, secret_access_key, session_token } = credentials;
65
+ return new import_client_s3.S3Client({
66
+ region,
67
+ endpoint,
68
+ credentials: {
69
+ accessKeyId: access_key_id,
70
+ secretAccessKey: secret_access_key,
71
+ sessionToken: session_token
72
+ },
73
+ // Force path-style for MinIO compatibility
74
+ forcePathStyle: true
75
+ });
76
+ }
77
+ __name(createS3Client, "createS3Client");
78
+ async function initMultipartUpload(name, params, option, abortSignal, taskId) {
79
+ const { bucket } = params;
80
+ const s3Client = createS3Client(params);
81
+ const command = new import_client_s3.CreateMultipartUploadCommand({
82
+ Bucket: bucket,
83
+ Key: name,
84
+ ContentType: option.mime || void 0
85
+ });
86
+ try {
87
+ const response = await s3Client.send(command, abortSignal ? { abortSignal } : {});
88
+ return {
89
+ bucket: response.Bucket || bucket,
90
+ name: response.Key || name,
91
+ UploadId: response.UploadId || ""
92
+ };
93
+ } catch (error) {
94
+ if (error.name === "AbortError" || error.name === "CanceledError") {
95
+ throw createAbortError(taskId, "Upload initialization aborted");
96
+ }
97
+ if (error.name === "InvalidAccessKeyId" || error.name === "SignatureDoesNotMatch" || error.$metadata?.httpStatusCode === 403) {
98
+ throw new import_UploadException.UploadException(
99
+ import_UploadException.UploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED,
100
+ "Failed to initialize multipart upload: Invalid credentials"
101
+ );
102
+ }
103
+ throw error;
104
+ }
105
+ }
106
+ __name(initMultipartUpload, "initMultipartUpload");
107
+ async function completeMultipartUpload(name, UploadId, parts, params, options, fileSize, abortSignal, taskId) {
108
+ const { bucket } = params;
109
+ const s3Client = createS3Client(params);
110
+ const sortedParts = parts.concat().sort((a, b) => a.number - b.number).filter((item, index, arr) => {
111
+ const prevItem = arr[index - 1];
112
+ return !index || prevItem && item.number !== prevItem.number;
113
+ });
114
+ const command = new import_client_s3.CompleteMultipartUploadCommand({
115
+ Bucket: bucket,
116
+ Key: name,
117
+ UploadId,
118
+ MultipartUpload: {
119
+ Parts: sortedParts.map((part) => ({
120
+ PartNumber: part.number,
121
+ ETag: part.etag
122
+ }))
123
+ }
124
+ });
125
+ try {
126
+ const response = await s3Client.send(command, abortSignal ? { abortSignal } : {});
127
+ if (options.progress) {
128
+ options.progress(100, fileSize, fileSize, null);
129
+ }
130
+ return (0, import_response.normalizeSuccessResponse)(name, import_types.PlatformType.Minio, {
131
+ etag: response.ETag || "",
132
+ location: response.Location || ""
133
+ });
134
+ } catch (error) {
135
+ if (error.name === "AbortError" || error.name === "CanceledError") {
136
+ throw createAbortError(taskId, "Upload completion aborted");
137
+ }
138
+ if (error.name === "InvalidAccessKeyId" || error.name === "SignatureDoesNotMatch" || error.$metadata?.httpStatusCode === 403) {
139
+ throw new import_UploadException.UploadException(
140
+ import_UploadException.UploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED,
141
+ "Failed to complete multipart upload: Invalid credentials"
142
+ );
143
+ }
144
+ throw error;
145
+ }
146
+ }
147
+ __name(completeMultipartUpload, "completeMultipartUpload");
148
+ async function uploadPart(name, UploadId, partNo, data, params, abortSignal, taskId) {
149
+ const { bucket } = params;
150
+ const s3Client = createS3Client(params);
151
+ let bodyData;
152
+ if (data.content instanceof ArrayBuffer) {
153
+ bodyData = new Uint8Array(data.content);
154
+ } else if (data.content instanceof Blob) {
155
+ const arrayBuffer = await data.content.arrayBuffer();
156
+ bodyData = new Uint8Array(arrayBuffer);
157
+ } else {
158
+ bodyData = data.content;
159
+ }
160
+ const command = new import_client_s3.UploadPartCommand({
161
+ Bucket: bucket,
162
+ Key: name,
163
+ UploadId,
164
+ PartNumber: partNo,
165
+ Body: bodyData
166
+ });
167
+ try {
168
+ const response = await s3Client.send(command, abortSignal ? { abortSignal } : {});
169
+ if (!response.ETag) {
170
+ throw new import_InitException.InitException(import_InitException.InitExceptionCode.UPLOAD_HEAD_NO_EXPOSE_ETAG);
171
+ }
172
+ return {
173
+ name,
174
+ etag: response.ETag,
175
+ res: response
176
+ };
177
+ } catch (error) {
178
+ if (error.name === "AbortError" || error.name === "CanceledError") {
179
+ throw createAbortError(taskId, "Upload part aborted");
180
+ }
181
+ if (error.name === "InvalidAccessKeyId" || error.name === "SignatureDoesNotMatch" || error.$metadata?.httpStatusCode === 403) {
182
+ const errorDetails = [
183
+ "MinIO/S3 multipart upload authentication failed.",
184
+ "Possible causes:",
185
+ "1. Access Key ID or Secret Access Key is incorrect",
186
+ "2. Region or endpoint configuration mismatch",
187
+ "3. System time difference exceeds 15 minutes",
188
+ "4. Credentials do not have permission to upload to this bucket/path",
189
+ "5. Session token has expired (for temporary credentials)"
190
+ ].join(" ");
191
+ throw new import_UploadException.UploadException(
192
+ import_UploadException.UploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED,
193
+ errorDetails
194
+ );
195
+ }
196
+ throw error;
197
+ }
198
+ }
199
+ __name(uploadPart, "uploadPart");
200
+ async function resumeMultipart(checkpoint, params, options) {
201
+ const taskId = options.taskId;
202
+ const { file, fileSize, partSize, UploadId, doneParts, name } = checkpoint;
203
+ const internalDoneParts = doneParts.length > 0 ? [...doneParts] : [];
204
+ const partOffs = (0, import_multipart.divideParts)(fileSize, partSize);
205
+ const numParts = partOffs.length;
206
+ let multipartFinish = false;
207
+ const opt = { ...options, partSize };
208
+ const uploadPartJob = /* @__PURE__ */ __name((partNo) => (
209
+ // eslint-disable-next-line no-async-promise-executor
210
+ new Promise(async (resolve, reject) => {
211
+ try {
212
+ const pi = partOffs[partNo - 1];
213
+ if (!pi) {
214
+ reject(new Error(`Part ${partNo} not found`));
215
+ return;
216
+ }
217
+ const content = await (0, import_multipart.createBuffer)(file, pi.start, pi.end);
218
+ const data = {
219
+ content,
220
+ size: pi.end - pi.start
221
+ };
222
+ const abortSignal = taskId ? (0, import_request.createAbortSignal)(taskId) : void 0;
223
+ const result = await uploadPart(name, UploadId, partNo, data, params, abortSignal, taskId);
224
+ if (!multipartFinish) {
225
+ checkpoint.doneParts.push({
226
+ number: partNo,
227
+ etag: result.etag
228
+ });
229
+ if (typeof options.progress === "function") {
230
+ const completedParts = checkpoint.doneParts.length;
231
+ const progressPercent = completedParts / numParts * 100;
232
+ const uploadedSize = Math.min(completedParts * partSize, fileSize);
233
+ options.progress(
234
+ progressPercent,
235
+ uploadedSize,
236
+ fileSize,
237
+ checkpoint
238
+ );
239
+ }
240
+ resolve({
241
+ number: partNo,
242
+ etag: result.etag
243
+ });
244
+ } else {
245
+ resolve();
246
+ }
247
+ } catch (err) {
248
+ const tempErr = new Error();
249
+ tempErr.name = err.name;
250
+ tempErr.message = err.message;
251
+ tempErr.stack = err.stack;
252
+ tempErr.partNum = partNo;
253
+ tempErr.status = err.status;
254
+ reject(tempErr);
255
+ }
256
+ })
257
+ ), "uploadPartJob");
258
+ const all = Array.from(new Array(numParts), (_, i) => i + 1);
259
+ const done = internalDoneParts.map((p) => p.number);
260
+ const todo = all.filter((p) => done.indexOf(p) < 0);
261
+ const defaultParallel = 5;
262
+ const parallel = opt.parallel || defaultParallel;
263
+ const jobErr = await (0, import_multipart.parallelSend)(
264
+ todo,
265
+ parallel,
266
+ (value) => new Promise((resolve, reject) => {
267
+ uploadPartJob(value).then((result) => {
268
+ if (result) {
269
+ internalDoneParts.push(result);
270
+ }
271
+ resolve();
272
+ }).catch((err) => {
273
+ reject(err);
274
+ });
275
+ })
276
+ );
277
+ multipartFinish = true;
278
+ if (jobErr && jobErr.length > 0) {
279
+ const error = jobErr[0];
280
+ if (!error) {
281
+ throw new import_UploadException.UploadException(import_UploadException.UploadExceptionCode.UPLOAD_MULTIPART_ERROR, "Unknown upload error");
282
+ }
283
+ if (error.status === UPLOAD_STATUS_CODE.CANCEL || error.status === UPLOAD_STATUS_CODE.PAUSE) {
284
+ throw error;
285
+ }
286
+ throw new import_UploadException.UploadException(
287
+ import_UploadException.UploadExceptionCode.UPLOAD_MULTIPART_ERROR,
288
+ error.message.replace("[Uploader] ", ""),
289
+ error.partNum
290
+ );
291
+ }
292
+ const completeAbortSignal = taskId ? (0, import_request.createAbortSignal)(taskId) : void 0;
293
+ return completeMultipartUpload(name, UploadId, internalDoneParts, params, opt, fileSize, completeAbortSignal, taskId);
294
+ }
295
+ __name(resumeMultipart, "resumeMultipart");
296
+ const MultipartUpload = /* @__PURE__ */ __name(async (file, key, params, option) => {
297
+ const options = { ...option };
298
+ const { region, bucket, dir, credentials, endpoint } = params;
299
+ if (!region || !bucket || !dir || !endpoint || !credentials || !credentials.access_key_id || !credentials.secret_access_key) {
300
+ throw new import_InitException.InitException(
301
+ import_InitException.InitExceptionCode.MISSING_CREDENTIALS_PARAMS_FOR_UPLOAD,
302
+ "s3",
303
+ "region",
304
+ "bucket",
305
+ "dir",
306
+ "endpoint",
307
+ "credentials.access_key_id",
308
+ "credentials.secret_access_key"
309
+ );
310
+ }
311
+ const name = `${dir}${key}`;
312
+ if (!options.mime) {
313
+ if ((0, import_checkDataFormat.isFile)(file)) {
314
+ options.mime = file.type;
315
+ } else if ((0, import_checkDataFormat.isBlob)(file)) {
316
+ options.mime = file.type;
317
+ } else {
318
+ options.mime = import_mime.default.getType((0, import_regExpUtil.parseExtname)(name));
319
+ }
320
+ }
321
+ if (options.checkpoint && options.checkpoint.UploadId) {
322
+ if (file)
323
+ options.checkpoint.file = file;
324
+ return resumeMultipart(options.checkpoint, params, options);
325
+ }
326
+ options.headers = options.headers || {};
327
+ const fileSize = file.size;
328
+ if (fileSize < S3_MIN_PART_SIZE) {
329
+ return (0, import_STSUpload.STSUpload)(file, key, params, { ...options });
330
+ }
331
+ if (options.partSize && !(parseInt(String(options.partSize), 10) === options.partSize)) {
332
+ throw new import_InitException.InitException(import_InitException.InitExceptionCode.UPLOAD_API_OPTION_PARTSIZE_MUST_INT);
333
+ }
334
+ if (options.partSize && options.partSize < S3_MIN_PART_SIZE) {
335
+ throw new import_InitException.InitException(
336
+ import_InitException.InitExceptionCode.UPLOAD_API_OPTION_PARTSIZE_IS_SMALL,
337
+ S3_MIN_PART_SIZE
338
+ );
339
+ }
340
+ const taskId = options.taskId;
341
+ const initAbortSignal = taskId ? (0, import_request.createAbortSignal)(taskId) : void 0;
342
+ const { UploadId } = await initMultipartUpload(name, params, {
343
+ headers: { ...options.headers },
344
+ mime: options.mime
345
+ }, initAbortSignal, taskId);
346
+ const partSize = (0, import_multipart.getPartSize)(fileSize, options.partSize, S3_MIN_PART_SIZE);
347
+ const checkpoint = (0, import_multipart.initCheckpoint)(file, name, fileSize, partSize, UploadId);
348
+ if (options && options.progress) {
349
+ options.progress(0, 0, fileSize, checkpoint);
350
+ }
351
+ return resumeMultipart(checkpoint, params, options);
352
+ }, "MultipartUpload");
353
+ // Annotate the CommonJS export names for ESM import in node:
354
+ 0 && (module.exports = {
355
+ MultipartUpload
356
+ });
357
+ //# sourceMappingURL=MultipartUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/MinIO/MultipartUpload.ts"],"sourcesContent":["import {\n\tCompleteMultipartUploadCommand,\n\tCreateMultipartUploadCommand,\n\tS3Client,\n\tUploadPartCommand,\n} from \"@aws-sdk/client-s3\"\nimport mime from \"mime\"\nimport { InitException, InitExceptionCode } from \"../../Exception/InitException\"\nimport { UploadException, UploadExceptionCode } from \"../../Exception/UploadException\"\nimport type { PlatformMultipartUploadOption, PlatformRequest } from \"../../types\"\nimport { PlatformType } from \"../../types\"\nimport type { ErrorType } from \"../../types/error\"\nimport type { MinIO } from \"../../types/MinIO\"\nimport { isBlob, isFile } from \"../../utils/checkDataFormat\"\nimport {\n\tcreateBuffer,\n\tdivideParts,\n\tgetPartSize,\n\tinitCheckpoint,\n\tparallelSend,\n} from \"../../utils/multipart\"\nimport { parseExtname } from \"../../utils/regExpUtil\"\nimport { createAbortSignal, getTaskAbortState } from \"../../utils/request\"\nimport { normalizeSuccessResponse } from \"../../utils/response\"\nimport { STSUpload } from \"./STSUpload\"\n\n// AWS S3 minimum part size is 5MB\nconst S3_MIN_PART_SIZE = 5 * 1024 * 1024\n\n// Upload abort status codes\nconst UPLOAD_STATUS_CODE = {\n\tCANCEL: 5001,\n\tPAUSE: 5002,\n} as const\n\n/**\n * Create an abort error with correct status code based on task abort state\n * @param {string} taskId Task ID\n * @param {string} message Error message\n * @returns Error with status property\n */\nfunction createAbortError(taskId: string | undefined, message: string): Error {\n\tconst abortError = new Error(message) as any\n\tif (taskId) {\n\t\tconst abortState = getTaskAbortState(taskId)\n\t\tabortError.status = abortState === \"pause\" ? UPLOAD_STATUS_CODE.PAUSE : UPLOAD_STATUS_CODE.CANCEL\n\t} else {\n\t\tabortError.status = UPLOAD_STATUS_CODE.CANCEL // Default to cancel\n\t}\n\treturn abortError\n}\n\n/**\n * Create S3Client instance with provided credentials\n */\nfunction createS3Client(params: MinIO.STSAuthParams): S3Client {\n\tconst { endpoint, region, credentials } = params\n\tconst { access_key_id, secret_access_key, session_token } = credentials\n\n\treturn new S3Client({\n\t\tregion,\n\t\tendpoint,\n\t\tcredentials: {\n\t\t\taccessKeyId: access_key_id,\n\t\t\tsecretAccessKey: secret_access_key,\n\t\t\tsessionToken: session_token,\n\t\t},\n\t\t// Force path-style for MinIO compatibility\n\t\tforcePathStyle: true,\n\t})\n}\n\n/**\n * @description: Initialize multipart upload to get UploadId from S3\n * @param {string} name Object key\n * @param {MinIO.STSAuthParams} params Credentials parameters\n * @param {MinIO.InitMultipartUploadOption} option Upload options\n * @param {AbortSignal} abortSignal Optional abort signal for cancellation\n * @param {string} taskId Optional task ID for error handling\n */\nasync function initMultipartUpload(\n\tname: string,\n\tparams: MinIO.STSAuthParams,\n\toption: MinIO.InitMultipartUploadOption,\n\tabortSignal?: AbortSignal,\n\ttaskId?: string,\n) {\n\tconst { bucket } = params\n\n\t// Create S3 client\n\tconst s3Client = createS3Client(params)\n\n\t// Create command\n\tconst command = new CreateMultipartUploadCommand({\n\t\tBucket: bucket,\n\t\tKey: name,\n\t\tContentType: option.mime || undefined,\n\t})\n\n\ttry {\n\t\tconst response = await s3Client.send(command, abortSignal ? { abortSignal } : {})\n\n\t\treturn {\n\t\t\tbucket: response.Bucket || bucket,\n\t\t\tname: response.Key || name,\n\t\t\tUploadId: response.UploadId || \"\",\n\t\t}\n\t} catch (error: any) {\n\t\t// Handle abort errors\n\t\tif (error.name === \"AbortError\" || error.name === \"CanceledError\") {\n\t\t\tthrow createAbortError(taskId, \"Upload initialization aborted\")\n\t\t}\n\t\t\n\t\tif (error.name === \"InvalidAccessKeyId\" || error.name === \"SignatureDoesNotMatch\" || error.$metadata?.httpStatusCode === 403) {\n\t\t\tthrow new UploadException(\n\t\t\t\tUploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED,\n\t\t\t\t\"Failed to initialize multipart upload: Invalid credentials\",\n\t\t\t)\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * @description: Complete multipart upload after all parts are uploaded\n * @param {String} name Object key\n * @param {String} UploadId Upload ID\n * @param {Array} parts Part information array\n * @param {MinIO.STSAuthParams} params Credentials parameters\n * @param {MinIO.CompleteMultipartUploadOptions} options Upload options\n * @param {number} fileSize Total file size\n * @param {AbortSignal} abortSignal Optional abort signal for cancellation\n * @param {string} taskId Optional task ID for error handling\n */\nasync function completeMultipartUpload(\n\tname: string,\n\tUploadId: string,\n\tparts: Array<{ number: number; etag: string }>,\n\tparams: MinIO.STSAuthParams,\n\toptions: MinIO.CompleteMultipartUploadOptions,\n\tfileSize: number,\n\tabortSignal?: AbortSignal,\n\ttaskId?: string,\n) {\n\tconst { bucket } = params\n\n\t// Create S3 client\n\tconst s3Client = createS3Client(params)\n\n\t// Sort parts by part number and remove duplicates\n\tconst sortedParts = parts\n\t\t.concat()\n\t\t.sort((a, b) => a.number - b.number)\n\t\t.filter((item, index, arr) => {\n\t\t\tconst prevItem = arr[index - 1]\n\t\t\treturn !index || (prevItem && item.number !== prevItem.number)\n\t\t})\n\n\t// Create command\n\tconst command = new CompleteMultipartUploadCommand({\n\t\tBucket: bucket,\n\t\tKey: name,\n\t\tUploadId: UploadId,\n\t\tMultipartUpload: {\n\t\t\tParts: sortedParts.map((part) => ({\n\t\t\t\tPartNumber: part.number,\n\t\t\t\tETag: part.etag,\n\t\t\t})),\n\t\t},\n\t})\n\n\ttry {\n\t\tconst response = await s3Client.send(command, abortSignal ? { abortSignal } : {})\n\n\t\t// Report 100% completion with actual file size\n\t\tif (options.progress) {\n\t\t\toptions.progress(100, fileSize, fileSize, null)\n\t\t}\n\n\t\treturn normalizeSuccessResponse(name, PlatformType.Minio, {\n\t\t\tetag: response.ETag || \"\",\n\t\t\tlocation: response.Location || \"\",\n\t\t})\n\t} catch (error: any) {\n\t\t// Handle abort errors\n\t\tif (error.name === \"AbortError\" || error.name === \"CanceledError\") {\n\t\t\tthrow createAbortError(taskId, \"Upload completion aborted\")\n\t\t}\n\t\t\n\t\tif (error.name === \"InvalidAccessKeyId\" || error.name === \"SignatureDoesNotMatch\" || error.$metadata?.httpStatusCode === 403) {\n\t\t\tthrow new UploadException(\n\t\t\t\tUploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED,\n\t\t\t\t\"Failed to complete multipart upload: Invalid credentials\",\n\t\t\t)\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * @description: Upload a single part\n * @param {String} name Object key\n * @param {String} UploadId Upload ID\n * @param {number} partNo Part number\n * @param {MinIO.PartInfo} data Part data\n * @param {MinIO.STSAuthParams} params Credentials parameters\n * @param {AbortSignal} abortSignal Optional abort signal for cancellation\n * @param {string} taskId Optional task ID for error handling\n */\nasync function uploadPart(\n\tname: string,\n\tUploadId: string,\n\tpartNo: number,\n\tdata: MinIO.PartInfo,\n\tparams: MinIO.STSAuthParams,\n\tabortSignal?: AbortSignal,\n\ttaskId?: string,\n) {\n\tconst { bucket } = params\n\n\t// Create S3 client\n\tconst s3Client = createS3Client(params)\n\n\t// Convert data.content to Uint8Array if needed\n\tlet bodyData: Uint8Array\n\tif (data.content instanceof ArrayBuffer) {\n\t\tbodyData = new Uint8Array(data.content)\n\t} else if (data.content instanceof Blob) {\n\t\tconst arrayBuffer = await data.content.arrayBuffer()\n\t\tbodyData = new Uint8Array(arrayBuffer)\n\t} else {\n\t\tbodyData = data.content as Uint8Array\n\t}\n\n\t// Create command\n\tconst command = new UploadPartCommand({\n\t\tBucket: bucket,\n\t\tKey: name,\n\t\tUploadId: UploadId,\n\t\tPartNumber: partNo,\n\t\tBody: bodyData,\n\t})\n\n\ttry {\n\t\t// Send command with optional abort signal\n\t\tconst response = await s3Client.send(command, abortSignal ? { abortSignal } : {})\n\n\t\tif (!response.ETag) {\n\t\t\tthrow new InitException(InitExceptionCode.UPLOAD_HEAD_NO_EXPOSE_ETAG)\n\t\t}\n\n\t\treturn {\n\t\t\tname,\n\t\t\tetag: response.ETag,\n\t\t\tres: response,\n\t\t}\n\t} catch (error: any) {\n\t\t// Handle abort errors\n\t\tif (error.name === \"AbortError\" || error.name === \"CanceledError\") {\n\t\t\tthrow createAbortError(taskId, \"Upload part aborted\")\n\t\t}\n\t\t\n\t\tif (error.name === \"InvalidAccessKeyId\" || error.name === \"SignatureDoesNotMatch\" || error.$metadata?.httpStatusCode === 403) {\n\t\t\tconst errorDetails = [\n\t\t\t\t\"MinIO/S3 multipart upload authentication failed.\",\n\t\t\t\t\"Possible causes:\",\n\t\t\t\t\"1. Access Key ID or Secret Access Key is incorrect\",\n\t\t\t\t\"2. Region or endpoint configuration mismatch\",\n\t\t\t\t\"3. System time difference exceeds 15 minutes\",\n\t\t\t\t\"4. Credentials do not have permission to upload to this bucket/path\",\n\t\t\t\t\"5. Session token has expired (for temporary credentials)\",\n\t\t\t].join(\" \")\n\t\t\t\n\t\t\tthrow new UploadException(\n\t\t\t\tUploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED,\n\t\t\t\terrorDetails,\n\t\t\t)\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * @description: Resume multipart upload or perform multipart upload\n * @param {Object} checkpoint Upload checkpoint information\n * @param {MinIO.STSAuthParams} params Credentials parameters\n * @param {MinIO.MultipartUploadOption} options Upload options\n */\nasync function resumeMultipart(\n\tcheckpoint: MinIO.Checkpoint,\n\tparams: MinIO.STSAuthParams,\n\toptions: MinIO.MultipartUploadOption,\n) {\n\tconst taskId = options.taskId\n\tconst { file, fileSize, partSize, UploadId, doneParts, name } = checkpoint\n\tconst internalDoneParts = doneParts.length > 0 ? [...doneParts] : []\n\tconst partOffs = divideParts(fileSize, partSize)\n\tconst numParts = partOffs.length\n\tlet multipartFinish = false\n\tconst opt = { ...options, partSize }\n\n\tconst uploadPartJob = (partNo: number): Promise<void | MinIO.DonePart> =>\n\t\t// eslint-disable-next-line no-async-promise-executor\n\t\tnew Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst pi = partOffs[partNo - 1]\n\t\t\t\tif (!pi) {\n\t\t\t\t\treject(new Error(`Part ${partNo} not found`))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst content = await createBuffer(file, pi.start, pi.end)\n\t\t\t\tconst data = {\n\t\t\t\t\tcontent,\n\t\t\t\t\tsize: pi.end - pi.start,\n\t\t\t\t}\n\n\t\t\t\t// Create abort signal for this upload part if taskId exists\n\t\t\t\tconst abortSignal = taskId ? createAbortSignal(taskId) : undefined\n\n\t\t\t\tconst result = await uploadPart(name, UploadId, partNo, data, params, abortSignal, taskId)\n\n\t\t\t\tif (!multipartFinish) {\n\t\t\t\t\tcheckpoint.doneParts.push({\n\t\t\t\t\t\tnumber: partNo,\n\t\t\t\t\t\tetag: result.etag,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (typeof options.progress === \"function\") {\n\t\t\t\t\t\tconst completedParts = checkpoint.doneParts.length\n\t\t\t\t\t\tconst progressPercent = (completedParts / numParts) * 100\n\t\t\t\t\t\t// Calculate actual uploaded size considering last part may be smaller\n\t\t\t\t\t\tconst uploadedSize = Math.min(completedParts * partSize, fileSize)\n\t\t\t\t\t\toptions.progress(\n\t\t\t\t\t\t\tprogressPercent,\n\t\t\t\t\t\t\tuploadedSize,\n\t\t\t\t\t\t\tfileSize,\n\t\t\t\t\t\t\tcheckpoint,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tnumber: partNo,\n\t\t\t\t\t\tetag: result.etag,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tresolve()\n\t\t\t\t}\n\t\t\t} catch (err: any) {\n\t\t\t\tconst tempErr = new Error() as unknown as ErrorType.UploadPartException\n\t\t\t\ttempErr.name = err.name\n\t\t\t\ttempErr.message = err.message\n\t\t\t\ttempErr.stack = err.stack\n\t\t\t\ttempErr.partNum = partNo\n\t\t\t\ttempErr.status = err.status\n\n\t\t\t\treject(tempErr)\n\t\t\t}\n\t\t})\n\n\tconst all = Array.from(new Array(numParts), (_, i) => i + 1)\n\tconst done = internalDoneParts.map((p) => p.number)\n\tconst todo = all.filter((p) => done.indexOf(p) < 0)\n\tconst defaultParallel = 5\n\tconst parallel = opt.parallel || defaultParallel\n\n\t// Upload in parallel\n\tconst jobErr: ErrorType.UploadPartException[] = await parallelSend(\n\t\ttodo,\n\t\tparallel,\n\t\t(value) =>\n\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\tuploadPartJob(value)\n\t\t\t\t\t.then((result: MinIO.DonePart | void) => {\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tinternalDoneParts.push(result)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve()\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t})\n\t\t\t}),\n\t)\n\n\tmultipartFinish = true\n\n\tif (jobErr && jobErr.length > 0) {\n\t\tconst error = jobErr[0]\n\t\tif (!error) {\n\t\t\tthrow new UploadException(UploadExceptionCode.UPLOAD_MULTIPART_ERROR, \"Unknown upload error\")\n\t\t}\n\t\t// Check if upload was cancelled or paused\n\t\tif (error.status === UPLOAD_STATUS_CODE.CANCEL || error.status === UPLOAD_STATUS_CODE.PAUSE) {\n\t\t\tthrow error as Error\n\t\t}\n\t\tthrow new UploadException(\n\t\t\tUploadExceptionCode.UPLOAD_MULTIPART_ERROR,\n\t\t\terror.message.replace(\"[Uploader] \", \"\"),\n\t\t\terror.partNum,\n\t\t)\n\t}\n\n\t// Create abort signal for completion if taskId exists\n\tconst completeAbortSignal = taskId ? createAbortSignal(taskId) : undefined\n\treturn completeMultipartUpload(name, UploadId, internalDoneParts, params, opt, fileSize, completeAbortSignal, taskId)\n}\n\n/**\n * @description: Multipart upload interface, supports resumable upload\n * @param {File | Blob} file File to upload\n * @param {String} key Object key\n * @param {MinIO.STSAuthParams} params Credentials parameters\n * @param {MinIO.MultipartUploadOption} option Upload options\n */\nexport const MultipartUpload: PlatformRequest<\n\tMinIO.STSAuthParams,\n\tPlatformMultipartUploadOption\n> = async (\n\tfile: File | Blob,\n\tkey: string,\n\tparams: MinIO.STSAuthParams,\n\toption: PlatformMultipartUploadOption,\n) => {\n\tconst options = { ...option }\n\tconst { region, bucket, dir, credentials, endpoint } = params\n\n\tif (!region || !bucket || !dir || !endpoint || !credentials || \n\t !credentials.access_key_id || !credentials.secret_access_key) {\n\t\tthrow new InitException(\n\t\t\tInitExceptionCode.MISSING_CREDENTIALS_PARAMS_FOR_UPLOAD,\n\t\t\t\"s3\",\n\t\t\t\"region\",\n\t\t\t\"bucket\",\n\t\t\t\"dir\",\n\t\t\t\"endpoint\",\n\t\t\t\"credentials.access_key_id\",\n\t\t\t\"credentials.secret_access_key\",\n\t\t)\n\t}\n\n\tconst name = `${dir}${key}`\n\n\t// Determine MIME type\n\tif (!options.mime) {\n\t\tif (isFile(file)) {\n\t\t\toptions.mime = file.type\n\t\t} else if (isBlob(file)) {\n\t\t\toptions.mime = file.type\n\t\t} else {\n\t\t\toptions.mime = mime.getType(parseExtname(name))\n\t\t}\n\t}\n\n\t// Resume from checkpoint if available\n\tif (options.checkpoint && options.checkpoint.UploadId) {\n\t\t// Update file reference in checkpoint\n\t\tif (file) options.checkpoint.file = file\n\n\t\treturn resumeMultipart(options.checkpoint, params, options)\n\t}\n\n\toptions.headers = options.headers || {}\n\n\tconst fileSize = file.size\n\n\t// Use simple upload for files smaller than minimum part size\n\tif (fileSize < S3_MIN_PART_SIZE) {\n\t\treturn STSUpload(file, key, params, { ...options })\n\t}\n\n\t// Validate part size\n\tif (options.partSize && !(parseInt(String(options.partSize), 10) === options.partSize)) {\n\t\tthrow new InitException(InitExceptionCode.UPLOAD_API_OPTION_PARTSIZE_MUST_INT)\n\t}\n\n\tif (options.partSize && options.partSize < S3_MIN_PART_SIZE) {\n\t\tthrow new InitException(\n\t\t\tInitExceptionCode.UPLOAD_API_OPTION_PARTSIZE_IS_SMALL,\n\t\t\tS3_MIN_PART_SIZE,\n\t\t)\n\t}\n\n\t// Initialize multipart upload\n\tconst taskId = options.taskId\n\tconst initAbortSignal = taskId ? createAbortSignal(taskId) : undefined\n\tconst { UploadId } = await initMultipartUpload(name, params, {\n\t\theaders: { ...options.headers },\n\t\tmime: options.mime,\n\t}, initAbortSignal, taskId)\n\n\t// Calculate part size\n\tconst partSize = getPartSize(fileSize, <number>options.partSize, S3_MIN_PART_SIZE)\n\n\tconst checkpoint: MinIO.Checkpoint = initCheckpoint(file, name, fileSize, partSize, UploadId)\n\n\tif (options && options.progress) {\n\t\toptions.progress(0, 0, fileSize, checkpoint)\n\t}\n\n\treturn resumeMultipart(checkpoint, params, options)\n}\n\n\n\n\n\n"],"mappings":"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","names":["mime"]}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var STSUpload_exports = {};
21
+ __export(STSUpload_exports, {
22
+ STSUpload: () => STSUpload
23
+ });
24
+ module.exports = __toCommonJS(STSUpload_exports);
25
+ var import_defaultUpload = require("./defaultUpload");
26
+ const STSUpload = /* @__PURE__ */ __name(async (file, key, params, option) => {
27
+ return (0, import_defaultUpload.signedUpload)(file, key, params, option);
28
+ }, "STSUpload");
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ STSUpload
32
+ });
33
+ //# sourceMappingURL=STSUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/MinIO/STSUpload.ts"],"sourcesContent":["import type { PlatformRequest, PlatformSimpleUploadOption } from \"../../types\"\nimport type { MinIO } from \"../../types/MinIO\"\nimport { signedUpload } from \"./defaultUpload\"\n\n/**\n * @description: STS upload for small files using PUT Object\n * This is essentially a wrapper around signedUpload for consistency with other platforms\n * @param {File | Blob} file File to upload\n * @param {String} key Object key\n * @param {MinIO.STSAuthParams} params Credentials parameters\n * @param {PlatformSimpleUploadOption} option Upload options\n */\nexport const STSUpload: PlatformRequest<MinIO.STSAuthParams, PlatformSimpleUploadOption> = async (\n\tfile,\n\tkey,\n\tparams,\n\toption,\n) => {\n\treturn signedUpload(file, key, params, option)\n}\n\n\n\n\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,2BAA6B;AAUtB,MAAM,YAA8E,8BAC1F,MACA,KACA,QACA,WACI;AACJ,aAAO,mCAAa,MAAM,KAAK,QAAQ,MAAM;AAC9C,GAP2F;","names":[]}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var defaultUpload_exports = {};
31
+ __export(defaultUpload_exports, {
32
+ defaultUpload: () => defaultUpload,
33
+ signedUpload: () => signedUpload
34
+ });
35
+ module.exports = __toCommonJS(defaultUpload_exports);
36
+ var import_client_s3 = require("@aws-sdk/client-s3");
37
+ var import_mime = __toESM(require("mime"), 1);
38
+ var import_InitException = require("../../Exception/InitException");
39
+ var import_UploadException = require("../../Exception/UploadException");
40
+ var import_types = require("../../types");
41
+ var import_regExpUtil = require("../../utils/regExpUtil");
42
+ var import_request = require("../../utils/request");
43
+ var import_response = require("../../utils/response");
44
+ function createS3Client(params) {
45
+ const { endpoint, region, credentials } = params;
46
+ const { access_key_id, secret_access_key, session_token } = credentials;
47
+ return new import_client_s3.S3Client({
48
+ region,
49
+ endpoint,
50
+ credentials: {
51
+ accessKeyId: access_key_id,
52
+ secretAccessKey: secret_access_key,
53
+ sessionToken: session_token
54
+ },
55
+ // Force path-style for MinIO compatibility
56
+ forcePathStyle: true
57
+ });
58
+ }
59
+ __name(createS3Client, "createS3Client");
60
+ const defaultUpload = /* @__PURE__ */ __name(async (file, key, params, option) => {
61
+ const { url, fields = {}, dir } = params;
62
+ const combinedKey = `${dir}${key}`;
63
+ const formData = new FormData();
64
+ formData.append("key", combinedKey);
65
+ Object.entries(fields).forEach(([fieldKey, fieldValue]) => {
66
+ formData.append(fieldKey, String(fieldValue));
67
+ });
68
+ formData.append("file", file);
69
+ return (0, import_request.request)({
70
+ method: "POST",
71
+ url,
72
+ data: formData,
73
+ taskId: option.taskId,
74
+ onProgress: option?.progress ? option.progress : () => {
75
+ },
76
+ withoutWrapper: true,
77
+ fail: (status, reject) => {
78
+ if (status === 403) {
79
+ reject(new import_UploadException.UploadException(import_UploadException.UploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED));
80
+ }
81
+ }
82
+ }).then((res) => {
83
+ return (0, import_response.normalizeSuccessResponse)(combinedKey, import_types.PlatformType.Minio, res.headers);
84
+ });
85
+ }, "defaultUpload");
86
+ const signedUpload = /* @__PURE__ */ __name(async (file, key, params, option) => {
87
+ const {
88
+ bucket,
89
+ region,
90
+ dir,
91
+ credentials,
92
+ endpoint
93
+ } = params;
94
+ if (!bucket || !region || !dir || !endpoint || !credentials || !credentials.access_key_id || !credentials.secret_access_key) {
95
+ throw new import_InitException.InitException(
96
+ import_InitException.InitExceptionCode.MISSING_CREDENTIALS_PARAMS_FOR_UPLOAD,
97
+ "s3",
98
+ "bucket",
99
+ "region",
100
+ "dir",
101
+ "endpoint",
102
+ "credentials.access_key_id",
103
+ "credentials.secret_access_key"
104
+ );
105
+ }
106
+ if (file?.size > 5 * 1024 * 1024 * 1024) {
107
+ throw new import_InitException.InitException(import_InitException.InitExceptionCode.UPLOAD_FILE_TO_BIG, key);
108
+ }
109
+ const objectKey = `${dir}${key}`;
110
+ let contentType = null;
111
+ const fileMimeType = import_mime.default.getType((0, import_regExpUtil.parseExtname)(key));
112
+ if (fileMimeType) {
113
+ contentType = fileMimeType;
114
+ }
115
+ const s3Client = createS3Client(params);
116
+ try {
117
+ const fileBuffer = await file.arrayBuffer();
118
+ const command = new import_client_s3.PutObjectCommand({
119
+ Bucket: bucket,
120
+ Key: objectKey,
121
+ Body: new Uint8Array(fileBuffer),
122
+ ContentType: contentType || void 0
123
+ });
124
+ if (option?.progress) {
125
+ option.progress(0, 0, file.size, null);
126
+ }
127
+ const response = await s3Client.send(command);
128
+ if (option?.progress) {
129
+ option.progress(100, file.size, file.size, null);
130
+ }
131
+ return (0, import_response.normalizeSuccessResponse)(objectKey, import_types.PlatformType.Minio, {
132
+ etag: response.ETag || ""
133
+ });
134
+ } catch (error) {
135
+ if (error.name === "InvalidAccessKeyId" || error.name === "SignatureDoesNotMatch" || error.$metadata?.httpStatusCode === 403) {
136
+ const errorDetails = [
137
+ "MinIO/S3 upload authentication failed.",
138
+ "Possible causes:",
139
+ "1. Access Key ID or Secret Access Key is incorrect",
140
+ "2. Region or endpoint configuration mismatch",
141
+ "3. System time difference exceeds 15 minutes",
142
+ "4. Credentials do not have permission to upload to this bucket/path",
143
+ "5. Session token has expired (for temporary credentials)"
144
+ ].join(" ");
145
+ throw new import_UploadException.UploadException(
146
+ import_UploadException.UploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED,
147
+ errorDetails
148
+ );
149
+ }
150
+ throw error;
151
+ }
152
+ }, "signedUpload");
153
+ // Annotate the CommonJS export names for ESM import in node:
154
+ 0 && (module.exports = {
155
+ defaultUpload,
156
+ signedUpload
157
+ });
158
+ //# sourceMappingURL=defaultUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/MinIO/defaultUpload.ts"],"sourcesContent":["import { PutObjectCommand, S3Client } from \"@aws-sdk/client-s3\"\nimport mime from \"mime\"\nimport { InitException, InitExceptionCode } from \"../../Exception/InitException\"\nimport { UploadException, UploadExceptionCode } from \"../../Exception/UploadException\"\nimport type { PlatformRequest, PlatformSimpleUploadOption } from \"../../types\"\nimport { PlatformType } from \"../../types\"\nimport type { MinIO } from \"../../types/MinIO\"\nimport { parseExtname } from \"../../utils/regExpUtil\"\nimport { request } from \"../../utils/request\"\nimport { normalizeSuccessResponse } from \"../../utils/response\"\n\n/**\n * Create S3Client instance with provided credentials\n */\nfunction createS3Client(params: MinIO.STSAuthParams): S3Client {\n\tconst { endpoint, region, credentials } = params\n\tconst { access_key_id, secret_access_key, session_token } = credentials\n\n\treturn new S3Client({\n\t\tregion,\n\t\tendpoint,\n\t\tcredentials: {\n\t\t\taccessKeyId: access_key_id,\n\t\t\tsecretAccessKey: secret_access_key,\n\t\t\tsessionToken: session_token,\n\t\t},\n\t\t// Force path-style for MinIO compatibility\n\t\tforcePathStyle: true,\n\t})\n}\n\n/**\n * @description: Simple upload using pre-signed URL\n * @param {File | Blob} file File to upload\n * @param {String} key Object key\n * @param {MinIO.AuthParams} params Pre-signed URL parameters\n * @param {PlatformSimpleUploadOption} option Upload options\n */\nexport const defaultUpload: PlatformRequest<MinIO.AuthParams, PlatformSimpleUploadOption> = async (\n\tfile,\n\tkey,\n\tparams,\n\toption,\n) => {\n\tconst { url, fields = {}, dir } = params\n\n\tconst combinedKey = `${dir}${key}`\n\n\tconst formData = new FormData()\n\n\tformData.append('key', combinedKey)\n\n\t// Add form fields in the correct order (policy-based fields first)\n\tObject.entries(fields).forEach(([fieldKey, fieldValue]) => {\n\t\tformData.append(fieldKey, String(fieldValue))\n\t})\n\n\t// File must be added last in POST form upload\n\tformData.append(\"file\", file)\n\n\t// Send POST request\n\treturn request<MinIO.PostResponse>({\n\t\tmethod: \"POST\",\n\t\turl: url,\n\t\tdata: formData,\n\t\ttaskId: option.taskId,\n\t\tonProgress: option?.progress ? option.progress : () => {},\n\t\twithoutWrapper: true,\n\t\tfail: (status, reject) => {\n\t\t\tif (status === 403) {\n\t\t\t\treject(new UploadException(UploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED))\n\t\t\t}\n\t\t},\n\t}).then((res) => {\n\t\treturn normalizeSuccessResponse(combinedKey, PlatformType.Minio, res.headers)\n\t})\n}\n\n/**\n * @description: Simple upload using AccessKey/SecretKey with AWS SDK\n * @param {File | Blob} file File to upload\n * @param {String} key Object key\n * @param {MinIO.STSAuthParams} params Credentials parameters\n * @param {PlatformSimpleUploadOption} option Upload options\n */\nexport const signedUpload: PlatformRequest<MinIO.STSAuthParams, PlatformSimpleUploadOption> = async (\n\tfile,\n\tkey,\n\tparams,\n\toption,\n) => {\n\tconst {\n\t\tbucket,\n\t\tregion,\n\t\tdir,\n\t\tcredentials,\n\t\tendpoint,\n\t} = params\n\n\tif (!bucket || !region || !dir || !endpoint || !credentials || \n\t !credentials.access_key_id || !credentials.secret_access_key) {\n\t\tthrow new InitException(\n\t\t\tInitExceptionCode.MISSING_CREDENTIALS_PARAMS_FOR_UPLOAD,\n\t\t\t\"s3\",\n\t\t\t\"bucket\",\n\t\t\t\"region\",\n\t\t\t\"dir\",\n\t\t\t\"endpoint\",\n\t\t\t\"credentials.access_key_id\",\n\t\t\t\"credentials.secret_access_key\",\n\t\t)\n\t}\n\n\t// S3 PUT Object upload limit is 5GB\n\tif (file?.size > 5 * 1024 * 1024 * 1024) {\n\t\tthrow new InitException(InitExceptionCode.UPLOAD_FILE_TO_BIG, key)\n\t}\n\n\tconst objectKey = `${dir}${key}`\n\n\t// Determine content type\n\tlet contentType: string | null = null\n\tconst fileMimeType = mime.getType(parseExtname(key))\n\tif (fileMimeType) {\n\t\tcontentType = fileMimeType\n\t}\n\n\t// Create S3 client\n\tconst s3Client = createS3Client(params)\n\n\ttry {\n\t\t// Convert File/Blob to ArrayBuffer for AWS SDK\n\t\tconst fileBuffer = await file.arrayBuffer()\n\n\t\t// Create PutObject command\n\t\tconst command = new PutObjectCommand({\n\t\t\tBucket: bucket,\n\t\t\tKey: objectKey,\n\t\t\tBody: new Uint8Array(fileBuffer),\n\t\t\tContentType: contentType || undefined,\n\t\t})\n\n\t\t// Execute upload with progress tracking\n\t\t// Note: AWS SDK doesn't natively support progress for PutObject in browser\n\t\t// We'll simulate it by reporting 0% -> 100% on completion\n\t\tif (option?.progress) {\n\t\t\toption.progress(0, 0, file.size, null)\n\t\t}\n\n\t\tconst response = await s3Client.send(command)\n\n\t\tif (option?.progress) {\n\t\t\toption.progress(100, file.size, file.size, null)\n\t\t}\n\n\t\t// Return normalized response\n\t\treturn normalizeSuccessResponse(objectKey, PlatformType.Minio, {\n\t\t\tetag: response.ETag || \"\",\n\t\t})\n\t} catch (error: any) {\n\t\t// Handle AWS SDK errors\n\t\tif (error.name === \"InvalidAccessKeyId\" || error.name === \"SignatureDoesNotMatch\" || error.$metadata?.httpStatusCode === 403) {\n\t\t\tconst errorDetails = [\n\t\t\t\t\"MinIO/S3 upload authentication failed.\",\n\t\t\t\t\"Possible causes:\",\n\t\t\t\t\"1. Access Key ID or Secret Access Key is incorrect\",\n\t\t\t\t\"2. Region or endpoint configuration mismatch\",\n\t\t\t\t\"3. System time difference exceeds 15 minutes\",\n\t\t\t\t\"4. Credentials do not have permission to upload to this bucket/path\",\n\t\t\t\t\"5. Session token has expired (for temporary credentials)\",\n\t\t\t].join(\" \")\n\t\t\t\n\t\t\tthrow new UploadException(\n\t\t\t\tUploadExceptionCode.UPLOAD_CREDENTIALS_IS_EXPIRED,\n\t\t\t\terrorDetails,\n\t\t\t)\n\t\t}\n\t\t\n\t\t// Re-throw other errors\n\t\tthrow error\n\t}\n}\n\n\n\n\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAC,uBAA2C;AAC5C,kBAAiB;AACjB,2BAAiD;AACjD,6BAAqD;AAErD,mBAA6B;AAE7B,wBAA6B;AAC7B,qBAAwB;AACxB,sBAAyC;AAKzC,SAAS,eAAe,QAAuC;AAC9D,QAAM,EAAE,UAAU,QAAQ,YAAY,IAAI;AAC1C,QAAM,EAAE,eAAe,mBAAmB,cAAc,IAAI;AAE5D,SAAO,IAAI,0BAAS;AAAA,IACnB;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACZ,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,cAAc;AAAA,IACf;AAAA;AAAA,IAEA,gBAAgB;AAAA,EACjB,CAAC;AACF;AAfS;AAwBF,MAAM,gBAA+E,8BAC3F,MACA,KACA,QACA,WACI;AACJ,QAAM,EAAE,KAAK,SAAS,CAAC,GAAG,IAAI,IAAI;AAElC,QAAM,cAAc,GAAG,GAAG,GAAG,GAAG;AAEhC,QAAM,WAAW,IAAI,SAAS;AAE9B,WAAS,OAAO,OAAO,WAAW;AAGlC,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,UAAU,MAAM;AAC1D,aAAS,OAAO,UAAU,OAAO,UAAU,CAAC;AAAA,EAC7C,CAAC;AAGD,WAAS,OAAO,QAAQ,IAAI;AAG5B,aAAO,wBAA4B;AAAA,IAClC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,OAAO;AAAA,IACf,YAAY,QAAQ,WAAW,OAAO,WAAW,MAAM;AAAA,IAAC;AAAA,IACxD,gBAAgB;AAAA,IAChB,MAAM,CAAC,QAAQ,WAAW;AACzB,UAAI,WAAW,KAAK;AACnB,eAAO,IAAI,uCAAgB,2CAAoB,6BAA6B,CAAC;AAAA,MAC9E;AAAA,IACD;AAAA,EACD,CAAC,EAAE,KAAK,CAAC,QAAQ;AAChB,eAAO,0CAAyB,aAAa,0BAAa,OAAO,IAAI,OAAO;AAAA,EAC7E,CAAC;AACF,GAtC4F;AA+CrF,MAAM,eAAiF,8BAC7F,MACA,KACA,QACA,WACI;AACJ,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAEJ,MAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,eAC5C,CAAC,YAAY,iBAAiB,CAAC,YAAY,mBAAmB;AACjE,UAAM,IAAI;AAAA,MACT,uCAAkB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAGA,MAAI,MAAM,OAAO,IAAI,OAAO,OAAO,MAAM;AACxC,UAAM,IAAI,mCAAc,uCAAkB,oBAAoB,GAAG;AAAA,EAClE;AAEA,QAAM,YAAY,GAAG,GAAG,GAAG,GAAG;AAG9B,MAAI,cAA6B;AACjC,QAAM,eAAe,YAAAA,QAAK,YAAQ,gCAAa,GAAG,CAAC;AACnD,MAAI,cAAc;AACjB,kBAAc;AAAA,EACf;AAGA,QAAM,WAAW,eAAe,MAAM;AAEtC,MAAI;AAEH,UAAM,aAAa,MAAM,KAAK,YAAY;AAG1C,UAAM,UAAU,IAAI,kCAAiB;AAAA,MACpC,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM,IAAI,WAAW,UAAU;AAAA,MAC/B,aAAa,eAAe;AAAA,IAC7B,CAAC;AAKD,QAAI,QAAQ,UAAU;AACrB,aAAO,SAAS,GAAG,GAAG,KAAK,MAAM,IAAI;AAAA,IACtC;AAEA,UAAM,WAAW,MAAM,SAAS,KAAK,OAAO;AAE5C,QAAI,QAAQ,UAAU;AACrB,aAAO,SAAS,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI;AAAA,IAChD;AAGA,eAAO,0CAAyB,WAAW,0BAAa,OAAO;AAAA,MAC9D,MAAM,SAAS,QAAQ;AAAA,IACxB,CAAC;AAAA,EACF,SAAS,OAAY;AAEpB,QAAI,MAAM,SAAS,wBAAwB,MAAM,SAAS,2BAA2B,MAAM,WAAW,mBAAmB,KAAK;AAC7H,YAAM,eAAe;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,EAAE,KAAK,GAAG;AAEV,YAAM,IAAI;AAAA,QACT,2CAAoB;AAAA,QACpB;AAAA,MACD;AAAA,IACD;AAGA,UAAM;AAAA,EACP;AACD,GAhG8F;","names":["mime"]}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var MinIO_exports = {};
21
+ __export(MinIO_exports, {
22
+ default: () => MinIO_default
23
+ });
24
+ module.exports = __toCommonJS(MinIO_exports);
25
+ var import_MultipartUpload = require("./MultipartUpload");
26
+ var import_STSUpload = require("./STSUpload");
27
+ var import_defaultUpload = require("./defaultUpload");
28
+ const upload = /* @__PURE__ */ __name((file, key, params, option) => {
29
+ if (Object.prototype.hasOwnProperty.call(params, "credentials")) {
30
+ return (0, import_MultipartUpload.MultipartUpload)(file, key, params, option);
31
+ }
32
+ return (0, import_defaultUpload.defaultUpload)(file, key, params, option);
33
+ }, "upload");
34
+ var MinIO_default = { upload, defaultUpload: import_defaultUpload.defaultUpload, signedUpload: import_defaultUpload.signedUpload, MultipartUpload: import_MultipartUpload.MultipartUpload, STSUpload: import_STSUpload.STSUpload };
35
+ //# sourceMappingURL=index.js.map