@adgytec/adgytec-web-utils 0.0.5 → 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 (43) hide show
  1. package/dist/chunks/create +24 -0
  2. package/dist/chunks/create.map +1 -0
  3. package/dist/chunks/decode +15 -15
  4. package/dist/chunks/parse +29 -12
  5. package/dist/chunks/parse.map +1 -1
  6. package/dist/chunks/restrictions +151 -0
  7. package/dist/chunks/restrictions.map +1 -0
  8. package/dist/chunks/schema +227 -195
  9. package/dist/chunks/schema.map +1 -1
  10. package/dist/chunks/uploadDetails +92 -91
  11. package/dist/chunks/uploadDetails.map +1 -1
  12. package/dist/constants/index.d.ts +1 -0
  13. package/dist/constants/index.js +5 -3
  14. package/dist/constants/index.js.map +1 -1
  15. package/dist/constants/media_limits.d.ts +2 -0
  16. package/dist/errorCodes/auth.d.ts +3 -0
  17. package/dist/errorCodes/common.d.ts +2 -0
  18. package/dist/errorCodes/iam.d.ts +2 -0
  19. package/dist/errorCodes/index.d.ts +2 -0
  20. package/dist/errorCodes/index.js +32 -85
  21. package/dist/errorCodes/index.js.map +1 -1
  22. package/dist/errorCodes/media.d.ts +2 -0
  23. package/dist/errorCodes/overrides.d.ts +2 -0
  24. package/dist/errorCodes/pagination.d.ts +2 -0
  25. package/dist/errorCodes/reqBody.d.ts +2 -0
  26. package/dist/errorCodes/restrictions.d.ts +3 -0
  27. package/dist/errorCodes/server.d.ts +2 -0
  28. package/dist/errorSchema/create.d.ts +2 -0
  29. package/dist/errorSchema/index.d.ts +2 -0
  30. package/dist/errorSchema/index.js +53 -49
  31. package/dist/errorSchema/index.js.map +1 -1
  32. package/dist/errorSchema/media.d.ts +1 -1
  33. package/dist/errorSchema/restrictions.d.ts +7 -0
  34. package/dist/errorSchema/schema.d.ts +6 -1
  35. package/dist/errors/index.d.ts +1 -0
  36. package/dist/errors/index.js +4 -3
  37. package/dist/errors/normalization.d.ts +12 -0
  38. package/dist/errors/parse.d.ts +1 -2
  39. package/dist/index.js +116 -99
  40. package/dist/index.js.map +1 -1
  41. package/package.json +1 -1
  42. package/dist/chunks/applicationError +0 -28
  43. package/dist/chunks/applicationError.map +0 -1
@@ -1,48 +1,49 @@
1
- import { v7 as u } from "uuid";
2
- import r from "zod";
3
- import { Queue as m } from "@datastructures-js/queue";
4
- import { httpMethods as c, httpReqHeaders as l, httpRequestCredentials as y } from "../constants/index.js";
5
- import { mediaCodes as d } from "../errorCodes/index.js";
6
- import { A as p, B as n } from "./applicationError";
7
- import { d as f } from "./decode";
8
- const w = (a) => ({
9
- id: u(),
1
+ import { v7 as y } from "uuid";
2
+ import { MediaUploadLimit as c, MediaItemsLimit as h, httpMethods as u, httpReqHeaders as l, httpRequestCredentials as f } from "../constants/index.js";
3
+ import { a as w, n as g } from "./create";
4
+ import s from "zod";
5
+ import { Queue as U } from "@datastructures-js/queue";
6
+ import { m as d } from "./restrictions";
7
+ import { A as p, B as n } from "./schema";
8
+ import { d as C } from "./decode";
9
+ const P = (a) => (a.size > c && w(a.name, a.size, c), {
10
+ id: y(),
10
11
  name: a.name,
11
12
  size: a.size,
12
13
  file: a
13
- }), I = (a) => a.map(w), g = (a) => ({
14
+ }), F = (a) => (a.length > h && g(a.length, h), a.map(P)), R = (a) => ({
14
15
  id: a.id,
15
16
  size: a.size,
16
17
  name: a.name
17
- }), k = (a) => a.map(g), U = r.object({
18
- presignPut: r.url(),
19
- partNumber: r.int().positive().lte(1e4),
20
- partSize: r.int().positive().gt(0)
21
- }), C = r.object({
22
- mediaID: r.uuidv7(),
23
- uploadType: r.literal("multipart"),
24
- multipartPresignPart: r.array(U).nonempty(),
25
- multipartSuccessCallback: r.url()
26
- }), P = r.object({
27
- mediaID: r.uuidv7(),
28
- uploadType: r.literal("singlepart"),
29
- presignPut: r.url(),
30
- singlepartSuccessCallback: r.url()
31
- }), q = r.discriminatedUnion("uploadType", [
32
- C,
33
- P
18
+ }), H = (a) => a.map(R), L = s.object({
19
+ presignPut: s.url(),
20
+ partNumber: s.int().positive().lte(1e4),
21
+ partSize: s.int().positive().gt(0)
22
+ }), S = s.object({
23
+ mediaID: s.uuidv7(),
24
+ uploadType: s.literal("multipart"),
25
+ multipartPresignPart: s.array(L).nonempty(),
26
+ multipartSuccessCallback: s.url()
27
+ }), N = s.object({
28
+ mediaID: s.uuidv7(),
29
+ uploadType: s.literal("singlepart"),
30
+ presignPut: s.url(),
31
+ singlepartSuccessCallback: s.url()
32
+ }), J = s.discriminatedUnion("uploadType", [
33
+ S,
34
+ N
34
35
  ]);
35
- class R {
36
- #s;
36
+ class z {
37
+ #r;
37
38
  #t;
38
39
  #a;
39
40
  #i;
40
41
  #e;
41
42
  #n;
42
43
  #o;
43
- #r;
44
- constructor(t, e, i, s) {
45
- this.#s = t, this.#t = e, this.#a = [], this.#i = /* @__PURE__ */ new Set(), this.#e = s, this.#n = i, this.#o = !1, this.#r = !1;
44
+ #s;
45
+ constructor(t, e, i, r) {
46
+ this.#r = t, this.#t = e, this.#a = [], this.#i = /* @__PURE__ */ new Set(), this.#e = r, this.#n = i, this.#o = !1, this.#s = !1;
46
47
  }
47
48
  get failed() {
48
49
  return this.#o;
@@ -51,7 +52,7 @@ class R {
51
52
  this.#o = !0;
52
53
  }
53
54
  get id() {
54
- return this.#s;
55
+ return this.#r;
55
56
  }
56
57
  get completeURL() {
57
58
  return this.#n;
@@ -72,10 +73,10 @@ class R {
72
73
  return !this.failed && this.#i.size === this.#e;
73
74
  }
74
75
  tryStartComplete() {
75
- return this.#r || !this.canComplete ? !1 : (this.#r = !0, !0);
76
+ return this.#s || !this.canComplete ? !1 : (this.#s = !0, !0);
76
77
  }
77
78
  resetComplete() {
78
- this.#r = !1;
79
+ this.#s = !1;
79
80
  }
80
81
  get totalPartsCount() {
81
82
  return this.#e;
@@ -84,14 +85,14 @@ class R {
84
85
  return this.#i.size;
85
86
  }
86
87
  }
87
- class S {
88
- #s;
88
+ class b {
89
+ #r;
89
90
  #t;
90
91
  #a;
91
92
  #i;
92
93
  #e;
93
- constructor(t, e, i, s) {
94
- this.#s = t, this.#t = e, this.#i = s, this.#a = i, this.#e = !1;
94
+ constructor(t, e, i, r) {
95
+ this.#r = t, this.#t = e, this.#i = r, this.#a = i, this.#e = !1;
95
96
  }
96
97
  get canComplete() {
97
98
  return this.#e;
@@ -100,7 +101,7 @@ class S {
100
101
  this.#e = !0;
101
102
  }
102
103
  get id() {
103
- return this.#s;
104
+ return this.#r;
104
105
  }
105
106
  get blob() {
106
107
  return this.#t;
@@ -112,28 +113,28 @@ class S {
112
113
  return this.#a;
113
114
  }
114
115
  }
115
- const N = {
116
+ const D = {
116
117
  concurrentUploads: 4,
117
118
  retryLimit: 3
118
119
  };
119
- class L {
120
- #s;
120
+ class M {
121
+ #r;
121
122
  #t;
122
123
  #a;
123
124
  #i;
124
125
  #e;
125
126
  #n;
126
- constructor(t, e, i = N, s) {
127
- this.#s = t, this.#t = e, this.#a = i.concurrentUploads, this.#i = i.retryLimit, this.#e = new m(), this.#n = s;
127
+ constructor(t, e, i = D, r) {
128
+ this.#r = t, this.#t = e, this.#a = i.concurrentUploads, this.#i = i.retryLimit, this.#e = new U(), this.#n = r;
128
129
  }
129
130
  #o(t) {
130
131
  return t < this.#i;
131
132
  }
132
- #r(t) {
133
+ #s(t) {
133
134
  this.#e.enqueue(t);
134
135
  }
135
136
  async init() {
136
- this.#t.init(this.#s);
137
+ this.#t.init(this.#r);
137
138
  const t = /* @__PURE__ */ new Set();
138
139
  for await (const e of this.#m()) {
139
140
  const i = e().finally(() => t.delete(i));
@@ -143,7 +144,7 @@ class L {
143
144
  }
144
145
  async #l(t, e) {
145
146
  return await fetch(t, {
146
- method: c.put,
147
+ method: u.put,
147
148
  body: e
148
149
  });
149
150
  }
@@ -159,7 +160,7 @@ class L {
159
160
  });
160
161
  t.allowComplete(), await this.#h(t);
161
162
  } catch (i) {
162
- this.#o(e) ? (this.#t.uploadRetrying(t.id), this.#r({
163
+ this.#o(e) ? (this.#t.uploadRetrying(t.id), this.#s({
163
164
  type: "singlepart-upload",
164
165
  retryCount: e + 1,
165
166
  singlepartObj: t
@@ -169,11 +170,11 @@ class L {
169
170
  async #p(t, e, i = 0) {
170
171
  if (!(t.failed || t.contains(e.partNumber)))
171
172
  try {
172
- const s = await this.#l(
173
+ const r = await this.#l(
173
174
  e.uploadURL,
174
175
  t.blob.slice(e.startByte, e.endByte)
175
176
  );
176
- if (!s.ok)
177
+ if (!r.ok)
177
178
  throw new p(
178
179
  d.multipartPartUploadFailed,
179
180
  {
@@ -181,7 +182,7 @@ class L {
181
182
  partNumber: e.partNumber
182
183
  }
183
184
  );
184
- const o = s.headers.get("ETag");
185
+ const o = r.headers.get("ETag");
185
186
  if (!o)
186
187
  throw new p(d.missingETagValue, {
187
188
  mediaID: t.id,
@@ -196,39 +197,39 @@ class L {
196
197
  t.totalPartsCount
197
198
  ), !t.canComplete) return;
198
199
  await this.#u(t);
199
- } catch (s) {
200
+ } catch (r) {
200
201
  this.#o(i) ? (this.#t.multipartPartUploadRetrying(
201
202
  t.id,
202
203
  e.partNumber
203
- ), this.#r({
204
+ ), this.#s({
204
205
  type: "multipart-part-upload",
205
206
  retryCount: i + 1,
206
207
  multipartObj: t,
207
208
  partInfo: e
208
- })) : (t.fail(), this.#t.failed(t.id, s));
209
+ })) : (t.fail(), this.#t.failed(t.id, r));
209
210
  }
210
211
  }
211
212
  async #c(t, e) {
212
- let i, s;
213
+ let i, r;
213
214
  e && (i = JSON.stringify({
214
215
  partsInfo: e
215
- }), s = {
216
+ }), r = {
216
217
  [l.contentType.key]: l.contentType.valueApplicationJSON
217
- }), this.#n && (s = s || {}, s[l.userLocale.key] = this.#n);
218
+ }), this.#n && (r = r || {}, r[l.userLocale.key] = this.#n);
218
219
  const o = await fetch(t, {
219
- method: c.post,
220
+ method: u.post,
220
221
  body: i,
221
- headers: s,
222
- credentials: y.include
222
+ headers: r,
223
+ credentials: f.include
223
224
  });
224
- await f(o);
225
+ await C(o);
225
226
  }
226
227
  async #h(t, e = 0) {
227
228
  if (t.canComplete)
228
229
  try {
229
230
  await this.#c(t.completeURL), this.#t.itemUploaded(t.id);
230
231
  } catch (i) {
231
- this.#o(e) ? (this.#t.uploadRetrying(t.id), this.#r({
232
+ this.#o(e) ? (this.#t.uploadRetrying(t.id), this.#s({
232
233
  type: "singlepart-complete",
233
234
  retryCount: e + 1,
234
235
  singlepartObj: t
@@ -243,7 +244,7 @@ class L {
243
244
  t.list
244
245
  ), this.#t.itemUploaded(t.id);
245
246
  } catch (i) {
246
- t.resetComplete(), this.#o(e) ? (this.#t.uploadRetrying(t.id), this.#r({
247
+ t.resetComplete(), this.#o(e) ? (this.#t.uploadRetrying(t.id), this.#s({
247
248
  type: "multipart-complete",
248
249
  retryCount: e + 1,
249
250
  multipartObj: t
@@ -251,9 +252,9 @@ class L {
251
252
  }
252
253
  }
253
254
  async *#m() {
254
- for (const t of this.#s) {
255
+ for (const t of this.#r) {
255
256
  if (t.uploadType === "singlepart") {
256
- const o = new S(
257
+ const o = new b(
257
258
  t.mediaID,
258
259
  t.file,
259
260
  t.presignPut,
@@ -264,24 +265,24 @@ class L {
264
265
  };
265
266
  continue;
266
267
  }
267
- const e = new R(
268
+ const e = new z(
268
269
  t.mediaID,
269
270
  t.file,
270
271
  t.multipartSuccessCallback,
271
272
  t.multipartPresignPart.length
272
273
  );
273
- let i = 0, s = 0;
274
+ let i = 0, r = 0;
274
275
  for (const o of t.multipartPresignPart) {
275
- s += o.partSize;
276
- const h = {
276
+ r += o.partSize;
277
+ const m = {
277
278
  partNumber: o.partNumber,
278
279
  uploadURL: o.presignPut,
279
280
  startByte: i,
280
- endByte: s
281
+ endByte: r
281
282
  };
282
283
  yield async () => {
283
- await this.#p(e, h);
284
- }, i = s;
284
+ await this.#p(e, m);
285
+ }, i = r;
285
286
  }
286
287
  }
287
288
  }
@@ -329,11 +330,11 @@ class L {
329
330
  }
330
331
  }
331
332
  }
332
- const $ = async (a, t, e, i) => {
333
- await b([a], t, e, i);
334
- }, b = async (a, t, e, i) => {
335
- await new L(a, t, e, i).init();
336
- }, z = (a, t) => {
333
+ const Q = async (a, t, e, i) => {
334
+ await T([a], t, e, i);
335
+ }, T = async (a, t, e, i) => {
336
+ await new M(a, t, e, i).init();
337
+ }, E = (a, t) => {
337
338
  if (a.id !== t.mediaID)
338
339
  throw new n("media item and response id mismatch");
339
340
  return {
@@ -341,7 +342,7 @@ const $ = async (a, t, e, i) => {
341
342
  file: a.file,
342
343
  size: a.size
343
344
  };
344
- }, F = (a, t) => {
345
+ }, V = (a, t) => {
345
346
  if (a.length !== t.length)
346
347
  throw new n(
347
348
  `items mismatch: mediaInfos=${a.length}, apiResponses=${t.length}`
@@ -350,23 +351,23 @@ const $ = async (a, t, e, i) => {
350
351
  t.map((i) => [i.mediaID, i])
351
352
  );
352
353
  return a.map((i) => {
353
- const s = e.get(i.id);
354
- if (!s)
354
+ const r = e.get(i.id);
355
+ if (!r)
355
356
  throw new n(
356
357
  `Could not find a matching API response for media info with id: ${i.id}`
357
358
  );
358
- return z(i, s);
359
+ return E(i, r);
359
360
  });
360
361
  };
361
362
  export {
362
- q as U,
363
- I as a,
364
- z as b,
365
- F as c,
366
- k as d,
367
- b as e,
368
- w as n,
369
- g as t,
370
- $ as u
363
+ J as U,
364
+ F as a,
365
+ E as b,
366
+ V as c,
367
+ H as d,
368
+ T as e,
369
+ P as n,
370
+ R as t,
371
+ Q as u
371
372
  };
372
373
  //# sourceMappingURL=uploadDetails.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploadDetails","sources":["../../src/media/mediaInfo.ts","../../src/media/toUploadPayload.ts","../../src/media/types/apiResponse.ts","../../src/media/multipartUtil.ts","../../src/media/singlepartUtil.ts","../../src/media/uploadUtil.ts","../../src/media/upload.ts","../../src/media/uploadDetails.ts"],"sourcesContent":["import { v7 as uuidv7 } from \"uuid\";\nimport type { NewMediaInfo, NewMediaInfos } from \"./types\";\n\nexport const newMediaInfo: NewMediaInfo = (item) => {\n return {\n id: uuidv7(),\n name: item.name,\n size: item.size,\n file: item,\n };\n};\n\nexport const newMediaInfos: NewMediaInfos = (items) => {\n return items.map(newMediaInfo);\n};\n","import type { ToUploadPayload, ToUploadPayloads } from \"./types\";\n\nexport const toUploadPayload: ToUploadPayload = (item) => {\n return {\n id: item.id,\n size: item.size,\n name: item.name,\n };\n};\n\nexport const toUploadPayloads: ToUploadPayloads = (items) => {\n return items.map(toUploadPayload);\n};\n","import z from \"zod\";\n\nconst MultipartPartUploadSchema = z.object({\n presignPut: z.url(),\n partNumber: z.int().positive().lte(10000),\n partSize: z.int().positive().gt(0),\n});\n\nconst MultipartSchema = z.object({\n mediaID: z.uuidv7(),\n uploadType: z.literal(\"multipart\"),\n multipartPresignPart: z.array(MultipartPartUploadSchema).nonempty(),\n multipartSuccessCallback: z.url(),\n});\n\nconst SinglepartSchema = z.object({\n mediaID: z.uuidv7(),\n uploadType: z.literal(\"singlepart\"),\n presignPut: z.url(),\n singlepartSuccessCallback: z.url(),\n});\n\nexport const UploadDetailsAPIResSchema = z.discriminatedUnion(\"uploadType\", [\n MultipartSchema,\n SinglepartSchema,\n]);\n\nexport type UploadDetailsAPIRes = z.infer<typeof UploadDetailsAPIResSchema>;\n","import type { MultipartUploadedPartDetails } from \"./types\";\n\nexport class MultipartUtil {\n #id: string;\n #blob: Blob;\n #response: MultipartUploadedPartDetails[];\n #parts: Set<number>;\n #totalParts: number;\n #completeURL: string;\n #failed: boolean;\n #complete: boolean;\n\n constructor(\n id: string,\n blob: Blob,\n completeURL: string,\n totalParts: number\n ) {\n this.#id = id;\n this.#blob = blob;\n this.#response = [];\n this.#parts = new Set();\n this.#totalParts = totalParts;\n this.#completeURL = completeURL;\n this.#failed = false;\n this.#complete = false;\n }\n\n get failed(): boolean {\n return this.#failed;\n }\n\n fail() {\n this.#failed = true;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get completeURL(): string {\n return this.#completeURL;\n }\n\n get blob(): Blob {\n return this.#blob;\n }\n\n add(itemRes: MultipartUploadedPartDetails) {\n if (this.contains(itemRes.partNumber)) {\n return;\n }\n\n this.#response.push(itemRes);\n this.#parts.add(itemRes.partNumber);\n }\n\n contains(partNumber: number): boolean {\n return this.#parts.has(partNumber);\n }\n\n get list(): MultipartUploadedPartDetails[] {\n return this.#response\n .slice()\n .sort((a, b) => a.partNumber - b.partNumber);\n }\n\n get canComplete(): boolean {\n return !this.failed && this.#parts.size === this.#totalParts;\n }\n\n tryStartComplete(): boolean {\n if (this.#complete || !this.canComplete) return false;\n\n this.#complete = true;\n return true;\n }\n\n resetComplete() {\n this.#complete = false;\n }\n\n get totalPartsCount(): number {\n return this.#totalParts;\n }\n\n get uploadedPartsCount(): number {\n return this.#parts.size;\n }\n}\n","export class SinglepartUtil {\n #id: string;\n #blob: Blob;\n #uploadURL: string;\n #completeURL: string;\n #canComplete: boolean;\n\n constructor(\n id: string,\n blob: Blob,\n uploadURL: string,\n completeURL: string\n ) {\n this.#id = id;\n this.#blob = blob;\n this.#completeURL = completeURL;\n this.#uploadURL = uploadURL;\n this.#canComplete = false;\n }\n\n get canComplete(): boolean {\n return this.#canComplete;\n }\n\n allowComplete() {\n this.#canComplete = true;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get blob(): Blob {\n return this.#blob;\n }\n\n get completeURL(): string {\n return this.#completeURL;\n }\n\n get uploadURL(): string {\n return this.#uploadURL;\n }\n}\n","import { Queue } from \"@datastructures-js/queue\";\nimport {\n httpMethods,\n httpReqHeaders,\n httpRequestCredentials,\n} from \"../constants\";\nimport { mediaCodes } from \"../errorCodes\";\nimport { ApplicationError, BaseError } from \"../errors\";\nimport { decodeAPIResponse } from \"../response\";\nimport { MultipartUtil } from \"./multipartUtil\";\nimport { SinglepartUtil } from \"./singlepartUtil\";\nimport type {\n LifecycleHandler,\n MultipartPartInfo,\n MultipartUploadedPartDetails,\n Retry,\n UploadDetails,\n UploadLimits,\n} from \"./types\";\n\nconst defaultUploadLimit: UploadLimits = {\n concurrentUploads: 4,\n retryLimit: 3,\n};\n\nexport class Upload {\n #items: UploadDetails[];\n #lifecycleHandler: LifecycleHandler;\n #concurrentUploads: number;\n #retryLimit: number;\n #retryQueue: Queue<Retry>;\n #languageTag?: string;\n\n constructor(\n uploadItems: UploadDetails[],\n handler: LifecycleHandler,\n limits: UploadLimits = defaultUploadLimit,\n languageTag?: string\n ) {\n this.#items = uploadItems;\n this.#lifecycleHandler = handler;\n this.#concurrentUploads = limits.concurrentUploads;\n this.#retryLimit = limits.retryLimit;\n this.#retryQueue = new Queue();\n this.#languageTag = languageTag;\n }\n\n #canRetry(currentCount: number): boolean {\n return currentCount < this.#retryLimit;\n }\n\n #addRetry(task: Retry) {\n this.#retryQueue.enqueue(task);\n }\n\n async init() {\n this.#lifecycleHandler.init(this.#items);\n\n const running = new Set<Promise<void>>();\n for await (const task of this.#generateTasks()) {\n const p = task().finally(() => running.delete(p));\n running.add(p);\n\n if (running.size >= this.#concurrentUploads) {\n await Promise.race(running);\n }\n }\n\n // wait for all initial task to complete\n await Promise.all(running);\n\n // complete retry action\n await this.#handleRetries();\n\n this.#lifecycleHandler.completed();\n }\n\n async #blobUpload(uploadURL: string, blob: Blob): Promise<Response> {\n return await fetch(uploadURL, {\n method: httpMethods.put,\n body: blob,\n });\n }\n\n async #singlepartUpload(\n singlepartObj: SinglepartUtil,\n retryCount: number = 0\n ) {\n if (singlepartObj.canComplete) {\n return;\n }\n\n try {\n const res = await this.#blobUpload(\n singlepartObj.uploadURL,\n singlepartObj.blob\n );\n if (!res.ok) {\n throw new ApplicationError(mediaCodes.singlepartUploadFailed, {\n mediaID: singlepartObj.id,\n });\n }\n\n singlepartObj.allowComplete();\n await this.#completeSinglepartUpload(singlepartObj);\n } catch (err) {\n if (this.#canRetry(retryCount)) {\n this.#lifecycleHandler.uploadRetrying(singlepartObj.id);\n this.#addRetry({\n type: \"singlepart-upload\",\n retryCount: retryCount + 1,\n singlepartObj: singlepartObj,\n });\n } else {\n this.#lifecycleHandler.failed(singlepartObj.id, err);\n }\n }\n }\n\n async #multipartUpload(\n multipartObj: MultipartUtil,\n partInfo: MultipartPartInfo,\n retryCount: number = 0\n ) {\n if (multipartObj.failed || multipartObj.contains(partInfo.partNumber)) {\n return;\n }\n\n try {\n const res = await this.#blobUpload(\n partInfo.uploadURL,\n multipartObj.blob.slice(partInfo.startByte, partInfo.endByte)\n );\n if (!res.ok) {\n throw new ApplicationError(\n mediaCodes.multipartPartUploadFailed,\n {\n mediaID: multipartObj.id,\n partNumber: partInfo.partNumber,\n }\n );\n }\n\n const etag = res.headers.get(\"ETag\");\n if (!etag) {\n throw new ApplicationError(mediaCodes.missingETagValue, {\n mediaID: multipartObj.id,\n partNumber: partInfo.partNumber,\n });\n }\n\n multipartObj.add({\n partNumber: partInfo.partNumber,\n etag: etag,\n });\n\n this.#lifecycleHandler.multipartPartUploaded(\n multipartObj.id,\n multipartObj.uploadedPartsCount,\n multipartObj.totalPartsCount\n );\n\n if (!multipartObj.canComplete) return;\n await this.#completeMultipartUpload(multipartObj);\n } catch (err) {\n if (this.#canRetry(retryCount)) {\n this.#lifecycleHandler.multipartPartUploadRetrying(\n multipartObj.id,\n partInfo.partNumber\n );\n\n this.#addRetry({\n type: \"multipart-part-upload\",\n retryCount: retryCount + 1,\n multipartObj: multipartObj,\n partInfo: partInfo,\n });\n } else {\n multipartObj.fail();\n this.#lifecycleHandler.failed(multipartObj.id, err);\n }\n }\n }\n\n async #completeUpload(\n completeURL: string,\n body?: MultipartUploadedPartDetails[]\n ) {\n let reqBody: BodyInit | undefined;\n let headers: Record<string, string> | undefined;\n if (body) {\n reqBody = JSON.stringify({\n partsInfo: body,\n });\n\n headers = {\n [httpReqHeaders.contentType.key]:\n httpReqHeaders.contentType.valueApplicationJSON,\n };\n }\n\n if (this.#languageTag) {\n headers = headers || {};\n headers[httpReqHeaders.userLocale.key] = this.#languageTag;\n }\n\n const apiRes = await fetch(completeURL, {\n method: httpMethods.post,\n body: reqBody,\n headers: headers,\n credentials: httpRequestCredentials.include,\n });\n await decodeAPIResponse(apiRes);\n }\n\n async #completeSinglepartUpload(\n singlepartObj: SinglepartUtil,\n retryCount: number = 0\n ) {\n if (!singlepartObj.canComplete) {\n return;\n }\n\n try {\n await this.#completeUpload(singlepartObj.completeURL);\n\n this.#lifecycleHandler.itemUploaded(singlepartObj.id);\n } catch (err) {\n if (this.#canRetry(retryCount)) {\n this.#lifecycleHandler.uploadRetrying(singlepartObj.id);\n this.#addRetry({\n type: \"singlepart-complete\",\n retryCount: retryCount + 1,\n singlepartObj: singlepartObj,\n });\n } else {\n this.#lifecycleHandler.failed(singlepartObj.id, err);\n }\n }\n }\n\n async #completeMultipartUpload(\n multipartObj: MultipartUtil,\n retryCount: number = 0\n ) {\n if (!multipartObj.tryStartComplete()) {\n return;\n }\n\n try {\n await this.#completeUpload(\n multipartObj.completeURL,\n multipartObj.list\n );\n\n this.#lifecycleHandler.itemUploaded(multipartObj.id);\n } catch (err) {\n multipartObj.resetComplete();\n\n if (this.#canRetry(retryCount)) {\n this.#lifecycleHandler.uploadRetrying(multipartObj.id);\n this.#addRetry({\n type: \"multipart-complete\",\n retryCount: retryCount + 1,\n multipartObj: multipartObj,\n });\n } else {\n multipartObj.fail();\n this.#lifecycleHandler.failed(multipartObj.id, err);\n }\n }\n }\n\n async *#generateTasks(): AsyncGenerator<() => Promise<void>> {\n for (const item of this.#items) {\n if (item.uploadType === \"singlepart\") {\n const singlepartObj = new SinglepartUtil(\n item.mediaID,\n item.file,\n item.presignPut,\n item.singlepartSuccessCallback\n );\n\n yield async () => {\n await this.#singlepartUpload(singlepartObj);\n };\n continue;\n }\n\n // multipart\n const multipartObj = new MultipartUtil(\n item.mediaID,\n item.file,\n item.multipartSuccessCallback,\n item.multipartPresignPart.length\n );\n\n // file slice byte range\n let startByte = 0;\n let endByte = 0;\n\n for (const partDetails of item.multipartPresignPart) {\n endByte += partDetails.partSize;\n\n const partInfo: MultipartPartInfo = {\n partNumber: partDetails.partNumber,\n uploadURL: partDetails.presignPut,\n startByte: startByte,\n endByte: endByte,\n };\n\n yield async () => {\n await this.#multipartUpload(multipartObj, partInfo);\n };\n\n startByte = endByte;\n }\n }\n }\n\n #retryTask(task: Retry): Promise<void> {\n // promise assignment\n switch (task.type) {\n case \"singlepart-upload\":\n return this.#singlepartUpload(\n task.singlepartObj,\n task.retryCount\n );\n case \"singlepart-complete\":\n return this.#completeSinglepartUpload(\n task.singlepartObj,\n task.retryCount\n );\n case \"multipart-part-upload\":\n return this.#multipartUpload(\n task.multipartObj,\n task.partInfo,\n task.retryCount\n );\n case \"multipart-complete\":\n return this.#completeMultipartUpload(\n task.multipartObj,\n task.retryCount\n );\n default: {\n const _exhaustiveCheck: never = task;\n void _exhaustiveCheck;\n\n throw new BaseError(\n `Unhandled retry task type: ${(task as { type: string }).type}`\n );\n }\n }\n }\n\n async #handleRetries() {\n const running = new Set<Promise<void>>();\n\n while (true) {\n if (this.#retryQueue.isEmpty()) break;\n\n while (!this.#retryQueue.isEmpty()) {\n const task = this.#retryQueue.dequeue();\n if (!task) break;\n\n const p: Promise<void> = this.#retryTask(task).finally(() =>\n running.delete(p)\n );\n running.add(p);\n\n if (running.size >= this.#concurrentUploads) {\n await Promise.race(running);\n }\n }\n\n await Promise.all(running);\n }\n }\n}\n","import type { UploadItem, UploadItems } from \"./types\";\nimport { Upload } from \"./uploadUtil\";\n\nexport const uploadItem: UploadItem = async (\n item,\n handler,\n limits,\n languageTag\n) => {\n await uploadItems([item], handler, limits, languageTag);\n};\n\nexport const uploadItems: UploadItems = async (\n items,\n handler,\n limits,\n languageTag\n) => {\n const uploadObj = new Upload(items, handler, limits, languageTag);\n await uploadObj.init();\n};\n","import { BaseError } from \"../errors\";\nimport type { NewUploadDetails, NewUploadsDetails } from \"./types\";\n\nexport const newUploadDetails: NewUploadDetails = (mediaInfo, apiResponse) => {\n if (mediaInfo.id !== apiResponse.mediaID) {\n throw new BaseError(\"media item and response id mismatch\");\n }\n\n return {\n ...apiResponse,\n file: mediaInfo.file,\n size: mediaInfo.size,\n };\n};\n\nexport const newUploadsDetails: NewUploadsDetails = (\n mediaInfos,\n apiResponses\n) => {\n if (mediaInfos.length !== apiResponses.length) {\n throw new BaseError(\n `items mismatch: mediaInfos=${mediaInfos.length}, apiResponses=${apiResponses.length}`\n );\n }\n\n const apiResponseMap = new Map(\n apiResponses.map((response) => [response.mediaID, response])\n );\n\n return mediaInfos.map((mediaInfo) => {\n const apiResponse = apiResponseMap.get(mediaInfo.id);\n if (!apiResponse) {\n // This case should not happen if lengths are equal and IDs are unique,\n // but it's good practice to handle it defensively.\n throw new BaseError(\n `Could not find a matching API response for media info with id: ${mediaInfo.id}`\n );\n }\n return newUploadDetails(mediaInfo, apiResponse);\n });\n};\n"],"names":["newMediaInfo","item","uuidv7","newMediaInfos","items","toUploadPayload","toUploadPayloads","MultipartPartUploadSchema","z","MultipartSchema","SinglepartSchema","UploadDetailsAPIResSchema","MultipartUtil","#id","#blob","#response","#parts","#totalParts","#completeURL","#failed","#complete","id","blob","completeURL","totalParts","itemRes","partNumber","a","b","SinglepartUtil","#uploadURL","#canComplete","uploadURL","defaultUploadLimit","Upload","#items","#lifecycleHandler","#concurrentUploads","#retryLimit","#retryQueue","#languageTag","uploadItems","handler","limits","languageTag","Queue","#canRetry","currentCount","#addRetry","task","running","#generateTasks","p","#handleRetries","#blobUpload","httpMethods","#singlepartUpload","singlepartObj","retryCount","ApplicationError","mediaCodes","#completeSinglepartUpload","err","#multipartUpload","multipartObj","partInfo","res","etag","#completeMultipartUpload","#completeUpload","body","reqBody","headers","httpReqHeaders","apiRes","httpRequestCredentials","decodeAPIResponse","startByte","endByte","partDetails","#retryTask","BaseError","uploadItem","newUploadDetails","mediaInfo","apiResponse","newUploadsDetails","mediaInfos","apiResponses","apiResponseMap","response"],"mappings":"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"}
1
+ {"version":3,"file":"uploadDetails","sources":["../../src/media/mediaInfo.ts","../../src/media/toUploadPayload.ts","../../src/media/types/apiResponse.ts","../../src/media/multipartUtil.ts","../../src/media/singlepartUtil.ts","../../src/media/uploadUtil.ts","../../src/media/upload.ts","../../src/media/uploadDetails.ts"],"sourcesContent":["import { v7 as uuidv7 } from \"uuid\";\nimport { MediaItemsLimit, MediaUploadLimit } from \"../constants\";\nimport {\n newMediaItemsLimitExceedError,\n newMediaTooLargeError,\n} from \"../errorSchema\";\nimport type { NewMediaInfo, NewMediaInfos } from \"./types\";\n\nexport const newMediaInfo: NewMediaInfo = (item) => {\n if (item.size > MediaUploadLimit) {\n newMediaTooLargeError(item.name, item.size, MediaUploadLimit);\n }\n\n return {\n id: uuidv7(),\n name: item.name,\n size: item.size,\n file: item,\n };\n};\n\nexport const newMediaInfos: NewMediaInfos = (items) => {\n if (items.length > MediaItemsLimit) {\n newMediaItemsLimitExceedError(items.length, MediaItemsLimit);\n }\n\n return items.map(newMediaInfo);\n};\n","import type { ToUploadPayload, ToUploadPayloads } from \"./types\";\n\nexport const toUploadPayload: ToUploadPayload = (item) => {\n return {\n id: item.id,\n size: item.size,\n name: item.name,\n };\n};\n\nexport const toUploadPayloads: ToUploadPayloads = (items) => {\n return items.map(toUploadPayload);\n};\n","import z from \"zod\";\n\nconst MultipartPartUploadSchema = z.object({\n presignPut: z.url(),\n partNumber: z.int().positive().lte(10000),\n partSize: z.int().positive().gt(0),\n});\n\nconst MultipartSchema = z.object({\n mediaID: z.uuidv7(),\n uploadType: z.literal(\"multipart\"),\n multipartPresignPart: z.array(MultipartPartUploadSchema).nonempty(),\n multipartSuccessCallback: z.url(),\n});\n\nconst SinglepartSchema = z.object({\n mediaID: z.uuidv7(),\n uploadType: z.literal(\"singlepart\"),\n presignPut: z.url(),\n singlepartSuccessCallback: z.url(),\n});\n\nexport const UploadDetailsAPIResSchema = z.discriminatedUnion(\"uploadType\", [\n MultipartSchema,\n SinglepartSchema,\n]);\n\nexport type UploadDetailsAPIRes = z.infer<typeof UploadDetailsAPIResSchema>;\n","import type { MultipartUploadedPartDetails } from \"./types\";\n\nexport class MultipartUtil {\n #id: string;\n #blob: Blob;\n #response: MultipartUploadedPartDetails[];\n #parts: Set<number>;\n #totalParts: number;\n #completeURL: string;\n #failed: boolean;\n #complete: boolean;\n\n constructor(\n id: string,\n blob: Blob,\n completeURL: string,\n totalParts: number\n ) {\n this.#id = id;\n this.#blob = blob;\n this.#response = [];\n this.#parts = new Set();\n this.#totalParts = totalParts;\n this.#completeURL = completeURL;\n this.#failed = false;\n this.#complete = false;\n }\n\n get failed(): boolean {\n return this.#failed;\n }\n\n fail() {\n this.#failed = true;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get completeURL(): string {\n return this.#completeURL;\n }\n\n get blob(): Blob {\n return this.#blob;\n }\n\n add(itemRes: MultipartUploadedPartDetails) {\n if (this.contains(itemRes.partNumber)) {\n return;\n }\n\n this.#response.push(itemRes);\n this.#parts.add(itemRes.partNumber);\n }\n\n contains(partNumber: number): boolean {\n return this.#parts.has(partNumber);\n }\n\n get list(): MultipartUploadedPartDetails[] {\n return this.#response\n .slice()\n .sort((a, b) => a.partNumber - b.partNumber);\n }\n\n get canComplete(): boolean {\n return !this.failed && this.#parts.size === this.#totalParts;\n }\n\n tryStartComplete(): boolean {\n if (this.#complete || !this.canComplete) return false;\n\n this.#complete = true;\n return true;\n }\n\n resetComplete() {\n this.#complete = false;\n }\n\n get totalPartsCount(): number {\n return this.#totalParts;\n }\n\n get uploadedPartsCount(): number {\n return this.#parts.size;\n }\n}\n","export class SinglepartUtil {\n #id: string;\n #blob: Blob;\n #uploadURL: string;\n #completeURL: string;\n #canComplete: boolean;\n\n constructor(\n id: string,\n blob: Blob,\n uploadURL: string,\n completeURL: string\n ) {\n this.#id = id;\n this.#blob = blob;\n this.#completeURL = completeURL;\n this.#uploadURL = uploadURL;\n this.#canComplete = false;\n }\n\n get canComplete(): boolean {\n return this.#canComplete;\n }\n\n allowComplete() {\n this.#canComplete = true;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get blob(): Blob {\n return this.#blob;\n }\n\n get completeURL(): string {\n return this.#completeURL;\n }\n\n get uploadURL(): string {\n return this.#uploadURL;\n }\n}\n","import { Queue } from \"@datastructures-js/queue\";\nimport {\n httpMethods,\n httpReqHeaders,\n httpRequestCredentials,\n} from \"../constants\";\nimport { mediaCodes } from \"../errorCodes\";\nimport { ApplicationError, BaseError } from \"../errors\";\nimport { decodeAPIResponse } from \"../response\";\nimport { MultipartUtil } from \"./multipartUtil\";\nimport { SinglepartUtil } from \"./singlepartUtil\";\nimport type {\n LifecycleHandler,\n MultipartPartInfo,\n MultipartUploadedPartDetails,\n Retry,\n UploadDetails,\n UploadLimits,\n} from \"./types\";\n\nconst defaultUploadLimit: UploadLimits = {\n concurrentUploads: 4,\n retryLimit: 3,\n};\n\nexport class Upload {\n #items: UploadDetails[];\n #lifecycleHandler: LifecycleHandler;\n #concurrentUploads: number;\n #retryLimit: number;\n #retryQueue: Queue<Retry>;\n #languageTag?: string;\n\n constructor(\n uploadItems: UploadDetails[],\n handler: LifecycleHandler,\n limits: UploadLimits = defaultUploadLimit,\n languageTag?: string\n ) {\n this.#items = uploadItems;\n this.#lifecycleHandler = handler;\n this.#concurrentUploads = limits.concurrentUploads;\n this.#retryLimit = limits.retryLimit;\n this.#retryQueue = new Queue();\n this.#languageTag = languageTag;\n }\n\n #canRetry(currentCount: number): boolean {\n return currentCount < this.#retryLimit;\n }\n\n #addRetry(task: Retry) {\n this.#retryQueue.enqueue(task);\n }\n\n async init() {\n this.#lifecycleHandler.init(this.#items);\n\n const running = new Set<Promise<void>>();\n for await (const task of this.#generateTasks()) {\n const p = task().finally(() => running.delete(p));\n running.add(p);\n\n if (running.size >= this.#concurrentUploads) {\n await Promise.race(running);\n }\n }\n\n // wait for all initial task to complete\n await Promise.all(running);\n\n // complete retry action\n await this.#handleRetries();\n\n this.#lifecycleHandler.completed();\n }\n\n async #blobUpload(uploadURL: string, blob: Blob): Promise<Response> {\n return await fetch(uploadURL, {\n method: httpMethods.put,\n body: blob,\n });\n }\n\n async #singlepartUpload(\n singlepartObj: SinglepartUtil,\n retryCount: number = 0\n ) {\n if (singlepartObj.canComplete) {\n return;\n }\n\n try {\n const res = await this.#blobUpload(\n singlepartObj.uploadURL,\n singlepartObj.blob\n );\n if (!res.ok) {\n throw new ApplicationError(mediaCodes.singlepartUploadFailed, {\n mediaID: singlepartObj.id,\n });\n }\n\n singlepartObj.allowComplete();\n await this.#completeSinglepartUpload(singlepartObj);\n } catch (err) {\n if (this.#canRetry(retryCount)) {\n this.#lifecycleHandler.uploadRetrying(singlepartObj.id);\n this.#addRetry({\n type: \"singlepart-upload\",\n retryCount: retryCount + 1,\n singlepartObj: singlepartObj,\n });\n } else {\n this.#lifecycleHandler.failed(singlepartObj.id, err);\n }\n }\n }\n\n async #multipartUpload(\n multipartObj: MultipartUtil,\n partInfo: MultipartPartInfo,\n retryCount: number = 0\n ) {\n if (multipartObj.failed || multipartObj.contains(partInfo.partNumber)) {\n return;\n }\n\n try {\n const res = await this.#blobUpload(\n partInfo.uploadURL,\n multipartObj.blob.slice(partInfo.startByte, partInfo.endByte)\n );\n if (!res.ok) {\n throw new ApplicationError(\n mediaCodes.multipartPartUploadFailed,\n {\n mediaID: multipartObj.id,\n partNumber: partInfo.partNumber,\n }\n );\n }\n\n const etag = res.headers.get(\"ETag\");\n if (!etag) {\n throw new ApplicationError(mediaCodes.missingETagValue, {\n mediaID: multipartObj.id,\n partNumber: partInfo.partNumber,\n });\n }\n\n multipartObj.add({\n partNumber: partInfo.partNumber,\n etag: etag,\n });\n\n this.#lifecycleHandler.multipartPartUploaded(\n multipartObj.id,\n multipartObj.uploadedPartsCount,\n multipartObj.totalPartsCount\n );\n\n if (!multipartObj.canComplete) return;\n await this.#completeMultipartUpload(multipartObj);\n } catch (err) {\n if (this.#canRetry(retryCount)) {\n this.#lifecycleHandler.multipartPartUploadRetrying(\n multipartObj.id,\n partInfo.partNumber\n );\n\n this.#addRetry({\n type: \"multipart-part-upload\",\n retryCount: retryCount + 1,\n multipartObj: multipartObj,\n partInfo: partInfo,\n });\n } else {\n multipartObj.fail();\n this.#lifecycleHandler.failed(multipartObj.id, err);\n }\n }\n }\n\n async #completeUpload(\n completeURL: string,\n body?: MultipartUploadedPartDetails[]\n ) {\n let reqBody: BodyInit | undefined;\n let headers: Record<string, string> | undefined;\n if (body) {\n reqBody = JSON.stringify({\n partsInfo: body,\n });\n\n headers = {\n [httpReqHeaders.contentType.key]:\n httpReqHeaders.contentType.valueApplicationJSON,\n };\n }\n\n if (this.#languageTag) {\n headers = headers || {};\n headers[httpReqHeaders.userLocale.key] = this.#languageTag;\n }\n\n const apiRes = await fetch(completeURL, {\n method: httpMethods.post,\n body: reqBody,\n headers: headers,\n credentials: httpRequestCredentials.include,\n });\n await decodeAPIResponse(apiRes);\n }\n\n async #completeSinglepartUpload(\n singlepartObj: SinglepartUtil,\n retryCount: number = 0\n ) {\n if (!singlepartObj.canComplete) {\n return;\n }\n\n try {\n await this.#completeUpload(singlepartObj.completeURL);\n\n this.#lifecycleHandler.itemUploaded(singlepartObj.id);\n } catch (err) {\n if (this.#canRetry(retryCount)) {\n this.#lifecycleHandler.uploadRetrying(singlepartObj.id);\n this.#addRetry({\n type: \"singlepart-complete\",\n retryCount: retryCount + 1,\n singlepartObj: singlepartObj,\n });\n } else {\n this.#lifecycleHandler.failed(singlepartObj.id, err);\n }\n }\n }\n\n async #completeMultipartUpload(\n multipartObj: MultipartUtil,\n retryCount: number = 0\n ) {\n if (!multipartObj.tryStartComplete()) {\n return;\n }\n\n try {\n await this.#completeUpload(\n multipartObj.completeURL,\n multipartObj.list\n );\n\n this.#lifecycleHandler.itemUploaded(multipartObj.id);\n } catch (err) {\n multipartObj.resetComplete();\n\n if (this.#canRetry(retryCount)) {\n this.#lifecycleHandler.uploadRetrying(multipartObj.id);\n this.#addRetry({\n type: \"multipart-complete\",\n retryCount: retryCount + 1,\n multipartObj: multipartObj,\n });\n } else {\n multipartObj.fail();\n this.#lifecycleHandler.failed(multipartObj.id, err);\n }\n }\n }\n\n async *#generateTasks(): AsyncGenerator<() => Promise<void>> {\n for (const item of this.#items) {\n if (item.uploadType === \"singlepart\") {\n const singlepartObj = new SinglepartUtil(\n item.mediaID,\n item.file,\n item.presignPut,\n item.singlepartSuccessCallback\n );\n\n yield async () => {\n await this.#singlepartUpload(singlepartObj);\n };\n continue;\n }\n\n // multipart\n const multipartObj = new MultipartUtil(\n item.mediaID,\n item.file,\n item.multipartSuccessCallback,\n item.multipartPresignPart.length\n );\n\n // file slice byte range\n let startByte = 0;\n let endByte = 0;\n\n for (const partDetails of item.multipartPresignPart) {\n endByte += partDetails.partSize;\n\n const partInfo: MultipartPartInfo = {\n partNumber: partDetails.partNumber,\n uploadURL: partDetails.presignPut,\n startByte: startByte,\n endByte: endByte,\n };\n\n yield async () => {\n await this.#multipartUpload(multipartObj, partInfo);\n };\n\n startByte = endByte;\n }\n }\n }\n\n #retryTask(task: Retry): Promise<void> {\n // promise assignment\n switch (task.type) {\n case \"singlepart-upload\":\n return this.#singlepartUpload(\n task.singlepartObj,\n task.retryCount\n );\n case \"singlepart-complete\":\n return this.#completeSinglepartUpload(\n task.singlepartObj,\n task.retryCount\n );\n case \"multipart-part-upload\":\n return this.#multipartUpload(\n task.multipartObj,\n task.partInfo,\n task.retryCount\n );\n case \"multipart-complete\":\n return this.#completeMultipartUpload(\n task.multipartObj,\n task.retryCount\n );\n default: {\n const _exhaustiveCheck: never = task;\n void _exhaustiveCheck;\n\n throw new BaseError(\n `Unhandled retry task type: ${(task as { type: string }).type}`\n );\n }\n }\n }\n\n async #handleRetries() {\n const running = new Set<Promise<void>>();\n\n while (true) {\n if (this.#retryQueue.isEmpty()) break;\n\n while (!this.#retryQueue.isEmpty()) {\n const task = this.#retryQueue.dequeue();\n if (!task) break;\n\n const p: Promise<void> = this.#retryTask(task).finally(() =>\n running.delete(p)\n );\n running.add(p);\n\n if (running.size >= this.#concurrentUploads) {\n await Promise.race(running);\n }\n }\n\n await Promise.all(running);\n }\n }\n}\n","import type { UploadItem, UploadItems } from \"./types\";\nimport { Upload } from \"./uploadUtil\";\n\nexport const uploadItem: UploadItem = async (\n item,\n handler,\n limits,\n languageTag\n) => {\n await uploadItems([item], handler, limits, languageTag);\n};\n\nexport const uploadItems: UploadItems = async (\n items,\n handler,\n limits,\n languageTag\n) => {\n const uploadObj = new Upload(items, handler, limits, languageTag);\n await uploadObj.init();\n};\n","import { BaseError } from \"../errors\";\nimport type { NewUploadDetails, NewUploadsDetails } from \"./types\";\n\nexport const newUploadDetails: NewUploadDetails = (mediaInfo, apiResponse) => {\n if (mediaInfo.id !== apiResponse.mediaID) {\n throw new BaseError(\"media item and response id mismatch\");\n }\n\n return {\n ...apiResponse,\n file: mediaInfo.file,\n size: mediaInfo.size,\n };\n};\n\nexport const newUploadsDetails: NewUploadsDetails = (\n mediaInfos,\n apiResponses\n) => {\n if (mediaInfos.length !== apiResponses.length) {\n throw new BaseError(\n `items mismatch: mediaInfos=${mediaInfos.length}, apiResponses=${apiResponses.length}`\n );\n }\n\n const apiResponseMap = new Map(\n apiResponses.map((response) => [response.mediaID, response])\n );\n\n return mediaInfos.map((mediaInfo) => {\n const apiResponse = apiResponseMap.get(mediaInfo.id);\n if (!apiResponse) {\n // This case should not happen if lengths are equal and IDs are unique,\n // but it's good practice to handle it defensively.\n throw new BaseError(\n `Could not find a matching API response for media info with id: ${mediaInfo.id}`\n );\n }\n return newUploadDetails(mediaInfo, apiResponse);\n });\n};\n"],"names":["newMediaInfo","item","MediaUploadLimit","newMediaTooLargeError","uuidv7","newMediaInfos","items","MediaItemsLimit","newMediaItemsLimitExceedError","toUploadPayload","toUploadPayloads","MultipartPartUploadSchema","z","MultipartSchema","SinglepartSchema","UploadDetailsAPIResSchema","MultipartUtil","#id","#blob","#response","#parts","#totalParts","#completeURL","#failed","#complete","id","blob","completeURL","totalParts","itemRes","partNumber","a","b","SinglepartUtil","#uploadURL","#canComplete","uploadURL","defaultUploadLimit","Upload","#items","#lifecycleHandler","#concurrentUploads","#retryLimit","#retryQueue","#languageTag","uploadItems","handler","limits","languageTag","Queue","#canRetry","currentCount","#addRetry","task","running","#generateTasks","p","#handleRetries","#blobUpload","httpMethods","#singlepartUpload","singlepartObj","retryCount","ApplicationError","mediaCodes","#completeSinglepartUpload","err","#multipartUpload","multipartObj","partInfo","res","etag","#completeMultipartUpload","#completeUpload","body","reqBody","headers","httpReqHeaders","apiRes","httpRequestCredentials","decodeAPIResponse","startByte","endByte","partDetails","#retryTask","BaseError","uploadItem","newUploadDetails","mediaInfo","apiResponse","newUploadsDetails","mediaInfos","apiResponses","apiResponseMap","response"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export * from './http_methods';
2
2
  export * from './httpRequestCredentials';
3
3
  export * from './httpRequestHeaders';
4
+ export * from './media_limits';
@@ -8,7 +8,7 @@ const e = {
8
8
  include: "include",
9
9
  sameOrigin: "same-origin",
10
10
  omit: "omit"
11
- }, o = {
11
+ }, i = {
12
12
  contentType: {
13
13
  key: "Content-Type",
14
14
  valueApplicationJSON: "application/json"
@@ -21,10 +21,12 @@ const e = {
21
21
  userLocale: {
22
22
  key: "x-user-locale"
23
23
  }
24
- };
24
+ }, o = 100, a = 1e4 * (10 << 20);
25
25
  export {
26
+ o as MediaItemsLimit,
27
+ a as MediaUploadLimit,
26
28
  e as httpMethods,
27
- o as httpReqHeaders,
29
+ i as httpReqHeaders,
28
30
  t as httpRequestCredentials
29
31
  };
30
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/constants/http_methods.ts","../../src/constants/httpRequestCredentials.ts","../../src/constants/httpRequestHeaders.ts"],"sourcesContent":["export const httpMethods = {\n get: \"GET\",\n post: \"POST\",\n put: \"PUT\",\n patch: \"PATCH\",\n delete: \"DELETE\",\n} as const;\n","export const httpRequestCredentials: Record<string, RequestCredentials> = {\n include: \"include\",\n sameOrigin: \"same-origin\",\n omit: \"omit\",\n} as const;\n","export const httpReqHeaders = {\n contentType: {\n key: \"Content-Type\",\n valueApplicationJSON: \"application/json\",\n },\n authorization: {\n key: \"Authorization\",\n schemeBearer: \"Bearer\",\n schemeBasic: \"Basic\",\n },\n userLocale: {\n key: \"x-user-locale\",\n },\n} as const;\n"],"names":["httpMethods","httpRequestCredentials","httpReqHeaders"],"mappings":"AAAO,MAAMA,IAAc;AAAA,EACvB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AACZ,GCNaC,IAA6D;AAAA,EACtE,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,MAAM;AACV,GCJaC,IAAiB;AAAA,EAC1B,aAAa;AAAA,IACT,KAAK;AAAA,IACL,sBAAsB;AAAA,EAAA;AAAA,EAE1B,eAAe;AAAA,IACX,KAAK;AAAA,IACL,cAAc;AAAA,IACd,aAAa;AAAA,EAAA;AAAA,EAEjB,YAAY;AAAA,IACR,KAAK;AAAA,EAAA;AAEb;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/constants/http_methods.ts","../../src/constants/httpRequestCredentials.ts","../../src/constants/httpRequestHeaders.ts","../../src/constants/media_limits.ts"],"sourcesContent":["export const httpMethods = {\n get: \"GET\",\n post: \"POST\",\n put: \"PUT\",\n patch: \"PATCH\",\n delete: \"DELETE\",\n} as const;\n","export const httpRequestCredentials: Record<string, RequestCredentials> = {\n include: \"include\",\n sameOrigin: \"same-origin\",\n omit: \"omit\",\n} as const;\n","export const httpReqHeaders = {\n contentType: {\n key: \"Content-Type\",\n valueApplicationJSON: \"application/json\",\n },\n authorization: {\n key: \"Authorization\",\n schemeBearer: \"Bearer\",\n schemeBasic: \"Basic\",\n },\n userLocale: {\n key: \"x-user-locale\",\n },\n} as const;\n","export const MediaItemsLimit = 100;\n\n// 10k parts each part 10 mega byte\nexport const MediaUploadLimit = 10000 * (10 << 20);\n"],"names":["httpMethods","httpRequestCredentials","httpReqHeaders","MediaItemsLimit","MediaUploadLimit"],"mappings":"AAAO,MAAMA,IAAc;AAAA,EACvB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AACZ,GCNaC,IAA6D;AAAA,EACtE,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,MAAM;AACV,GCJaC,IAAiB;AAAA,EAC1B,aAAa;AAAA,IACT,KAAK;AAAA,IACL,sBAAsB;AAAA,EAAA;AAAA,EAE1B,eAAe;AAAA,IACX,KAAK;AAAA,IACL,cAAc;AAAA,IACd,aAAa;AAAA,EAAA;AAAA,EAEjB,YAAY;AAAA,IACR,KAAK;AAAA,EAAA;AAEb,GCbaC,IAAkB,KAGlBC,IAAmB,OAAS,MAAM;"}
@@ -0,0 +1,2 @@
1
+ export declare const MediaItemsLimit = 100;
2
+ export declare const MediaUploadLimit: number;
@@ -1,3 +1,4 @@
1
+ import { ErrorNormalization } from '../errors';
1
2
  export declare const authCodes: {
2
3
  readonly invalidApiKey: "invalid-api-key";
3
4
  readonly userNotFound: "user-not-found";
@@ -12,3 +13,5 @@ export declare const authCodes: {
12
13
  readonly userDisabled: "user-disabled";
13
14
  readonly tokenNotFound: "token-not-found";
14
15
  };
16
+ export declare const authOverrides: ErrorNormalization;
17
+ export declare const signedURLOverrides: ErrorNormalization;
@@ -1,3 +1,4 @@
1
+ import { ErrorNormalization } from '../errors';
1
2
  export declare const commonCodes: {
2
3
  readonly invalidId: "invalid-id";
3
4
  readonly routeNotFound: "route-not-found";
@@ -6,3 +7,4 @@ export declare const commonCodes: {
6
7
  readonly unexpectedError: "unexpected-error";
7
8
  readonly zodError: "zod-error";
8
9
  };
10
+ export declare const commonOverrides: ErrorNormalization;
@@ -1,6 +1,8 @@
1
+ import { ErrorNormalization } from '../errors';
1
2
  export declare const iamCodes: {
2
3
  readonly selfPermissionMismatch: "self-permission-mismatch";
3
4
  readonly invalidActor: "invalid-actor";
4
5
  readonly permissionExplicitlyDenied: "permission-explicitly-denied";
5
6
  readonly missingPermission: "missing-permission";
6
7
  };
8
+ export declare const iamOverrides: ErrorNormalization;
@@ -3,6 +3,8 @@ export * from './common';
3
3
  export * from './form';
4
4
  export * from './iam';
5
5
  export * from './media';
6
+ export * from './overrides';
6
7
  export * from './pagination';
7
8
  export * from './reqBody';
9
+ export * from './restrictions';
8
10
  export * from './server';