@tranquilload/core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +68 -68
- package/CHANGELOG.md +67 -0
- package/dist/errors.cjs +3 -1
- package/dist/errors.d.cts +2 -2
- package/dist/errors.d.mts +2 -2
- package/dist/errors.mjs +2 -2
- package/dist/index-BaeUV_fj.d.cts +139 -0
- package/dist/index-BaeUV_fj.d.cts.map +1 -0
- package/dist/index-bpWq6tje.d.mts +139 -0
- package/dist/index-bpWq6tje.d.mts.map +1 -0
- package/dist/multipart.cjs +80 -12
- package/dist/multipart.cjs.map +1 -1
- package/dist/multipart.d.cts +2 -2
- package/dist/multipart.d.mts +2 -2
- package/dist/multipart.mjs +80 -12
- package/dist/multipart.mjs.map +1 -1
- package/dist/{normalize-callback-BNBZZ1jT.cjs → normalize-callback-BdLtk9jb.cjs} +2 -2
- package/dist/{normalize-callback-BNBZZ1jT.cjs.map → normalize-callback-BdLtk9jb.cjs.map} +1 -1
- package/dist/{normalize-callback-DQ6C4gaV.mjs → normalize-callback-tcZ_nyq5.mjs} +2 -2
- package/dist/{normalize-callback-DQ6C4gaV.mjs.map → normalize-callback-tcZ_nyq5.mjs.map} +1 -1
- package/dist/oneshot.cjs +2 -2
- package/dist/oneshot.d.cts +2 -2
- package/dist/oneshot.d.mts +2 -2
- package/dist/oneshot.mjs +2 -2
- package/dist/progress.d.cts +2 -2
- package/dist/progress.d.mts +2 -2
- package/dist/{upload-error-BUexBh08.cjs → upload-error-BG1dOOl3.cjs} +26 -1
- package/dist/upload-error-BG1dOOl3.cjs.map +1 -0
- package/dist/{upload-error-B2ISUc_k.d.cts → upload-error-DTYVNlaJ.d.cts} +19 -3
- package/dist/{upload-error-B2ISUc_k.d.cts.map → upload-error-DTYVNlaJ.d.cts.map} +1 -1
- package/dist/{upload-error-zDvpxT9X.mjs → upload-error-Dbz_9j81.mjs} +21 -2
- package/dist/upload-error-Dbz_9j81.mjs.map +1 -0
- package/dist/{upload-error-jol-eoDW.d.mts → upload-error-jBco270d.d.mts} +19 -3
- package/dist/{upload-error-jol-eoDW.d.mts.map → upload-error-jBco270d.d.mts.map} +1 -1
- package/dist/{upload-event-C9TOVp5l.d.mts → upload-event-BT_nXgM9.d.cts} +7 -1
- package/dist/upload-event-BT_nXgM9.d.cts.map +1 -0
- package/dist/{upload-event-D77olieX.d.cts → upload-event-DOGbegxa.d.mts} +7 -1
- package/dist/upload-event-DOGbegxa.d.mts.map +1 -0
- package/package.json +1 -1
- package/src/errors/index.ts +2 -0
- package/src/errors/upload-error.test.ts +35 -0
- package/src/errors/upload-error.ts +27 -0
- package/src/multipart/index.test.ts +164 -1
- package/src/multipart/index.ts +96 -5
- package/src/multipart/upload-stream.test.ts +201 -2
- package/src/multipart/upload-stream.ts +160 -16
- package/src/progress/upload-event.ts +6 -0
- package/dist/index-Ch8xM6Xt.d.cts +0 -60
- package/dist/index-Ch8xM6Xt.d.cts.map +0 -1
- package/dist/index-DBGtgXEd.d.mts +0 -60
- package/dist/index-DBGtgXEd.d.mts.map +0 -1
- package/dist/upload-error-BUexBh08.cjs.map +0 -1
- package/dist/upload-error-zDvpxT9X.mjs.map +0 -1
- package/dist/upload-event-C9TOVp5l.d.mts.map +0 -1
- package/dist/upload-event-D77olieX.d.cts.map +0 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @tranquilload/core@0.1.
|
|
2
|
+
> @tranquilload/core@0.1.1 build /home/runner/work/Tranquilload/Tranquilload/packages/tranquilload-core
|
|
3
3
|
> tsdown
|
|
4
4
|
|
|
5
5
|
[34mℹ[39m tsdown [2mv0.21.0[22m powered by rolldown [2mv1.0.0-rc.7[22m
|
|
@@ -7,82 +7,82 @@
|
|
|
7
7
|
[34mℹ[39m entry: [34msrc/multipart/index.ts, src/oneshot/index.ts, src/pipeline/index.ts, src/services/index.ts, src/errors/index.ts, src/progress/index.ts[39m
|
|
8
8
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
9
9
|
[34mℹ[39m Build start
|
|
10
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mmultipart.cjs[22m [
|
|
11
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1moneshot.cjs[22m [2m 2.83 kB[22m [2m│ gzip:
|
|
12
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mpipeline.cjs[22m [2m 0.92 kB[22m [2m│ gzip:
|
|
13
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[
|
|
14
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[
|
|
15
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mprogress.cjs[22m [2m 0.00 kB[22m [2m│ gzip:
|
|
16
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mmultipart.cjs.map [
|
|
17
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22moneshot.cjs.map [2m 6.41 kB[22m [2m│ gzip:
|
|
18
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mupload-error-
|
|
19
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mupload-error-
|
|
20
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mpipeline.cjs.map [2m 2.17 kB[22m [2m│ gzip:
|
|
21
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mnormalize-callback-
|
|
22
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mcompression-service-Bn86iTJe.cjs.map [2m 1.73 kB[22m [2m│ gzip:
|
|
23
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mnormalize-callback-
|
|
24
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mcompression-service-Bn86iTJe.cjs [2m 1.24 kB[22m [2m│ gzip:
|
|
25
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mlogger-service-cx8vzkXs.cjs.map [2m 0.82 kB[22m [2m│ gzip:
|
|
26
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mlogger-service-cx8vzkXs.cjs [2m 0.58 kB[22m [2m│ gzip:
|
|
27
|
-
[34mℹ[39m [33m[CJS][39m 17 files, total:
|
|
28
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex-
|
|
29
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mupload-error-
|
|
30
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mupload-event-
|
|
10
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mmultipart.cjs[22m [2m15.08 kB[22m [2m│ gzip: 3.94 kB[22m
|
|
11
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1moneshot.cjs[22m [2m 2.83 kB[22m [2m│ gzip: 1.12 kB[22m
|
|
12
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mpipeline.cjs[22m [2m 0.92 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
13
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1merrors.cjs[22m [2m 0.75 kB[22m [2m│ gzip: 0.27 kB[22m
|
|
14
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mservices.cjs[22m [2m 0.62 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
15
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mprogress.cjs[22m [2m 0.00 kB[22m [2m│ gzip: 0.02 kB[22m
|
|
16
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mmultipart.cjs.map [2m37.96 kB[22m [2m│ gzip: 10.59 kB[22m
|
|
17
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22moneshot.cjs.map [2m 6.41 kB[22m [2m│ gzip: 2.27 kB[22m
|
|
18
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mupload-error-BG1dOOl3.cjs.map [2m 4.63 kB[22m [2m│ gzip: 1.28 kB[22m
|
|
19
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mupload-error-BG1dOOl3.cjs [2m 3.90 kB[22m [2m│ gzip: 0.99 kB[22m
|
|
20
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mpipeline.cjs.map [2m 2.17 kB[22m [2m│ gzip: 0.81 kB[22m
|
|
21
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mnormalize-callback-BdLtk9jb.cjs.map [2m 1.99 kB[22m [2m│ gzip: 0.84 kB[22m
|
|
22
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mcompression-service-Bn86iTJe.cjs.map [2m 1.73 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
23
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mnormalize-callback-BdLtk9jb.cjs [2m 1.30 kB[22m [2m│ gzip: 0.54 kB[22m
|
|
24
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mcompression-service-Bn86iTJe.cjs [2m 1.24 kB[22m [2m│ gzip: 0.49 kB[22m
|
|
25
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mlogger-service-cx8vzkXs.cjs.map [2m 0.82 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
26
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mlogger-service-cx8vzkXs.cjs [2m 0.58 kB[22m [2m│ gzip: 0.32 kB[22m
|
|
27
|
+
[34mℹ[39m [33m[CJS][39m 17 files, total: 82.94 kB
|
|
28
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex-BaeUV_fj.d.cts.map [2m1.61 kB[22m [2m│ gzip: 0.59 kB[22m
|
|
29
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mupload-error-DTYVNlaJ.d.cts.map [2m0.98 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
30
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mupload-event-BT_nXgM9.d.cts.map [2m0.62 kB[22m [2m│ gzip: 0.25 kB[22m
|
|
31
31
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22moneshot.d.cts.map [2m0.51 kB[22m [2m│ gzip: 0.27 kB[22m
|
|
32
32
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mmiddleware-CYcctmlY.d.cts.map [2m0.42 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
33
33
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mcompression-service-CiF7Px08.d.cts.map [2m0.36 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
34
34
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mlogger-service-CbN12RhO.d.cts.map [2m0.28 kB[22m [2m│ gzip: 0.20 kB[22m
|
|
35
35
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mpipeline.d.cts.map [2m0.18 kB[22m [2m│ gzip: 0.15 kB[22m
|
|
36
36
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1moneshot.d.cts[22m[39m [2m1.19 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
37
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1merrors.d.cts[22m[39m [2m0.48 kB[22m [2m│ gzip: 0.22 kB[22m
|
|
37
38
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mpipeline.d.cts[22m[39m [2m0.43 kB[22m [2m│ gzip: 0.27 kB[22m
|
|
38
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1merrors.d.cts[22m[39m [2m0.39 kB[22m [2m│ gzip: 0.19 kB[22m
|
|
39
39
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mservices.d.cts[22m[39m [2m0.38 kB[22m [2m│ gzip: 0.18 kB[22m
|
|
40
40
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mprogress.d.cts[22m[39m [2m0.36 kB[22m [2m│ gzip: 0.20 kB[22m
|
|
41
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mmultipart.d.cts[22m[39m [2m0.
|
|
42
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mindex-
|
|
43
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mupload-error-
|
|
44
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mupload-event-
|
|
41
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mmultipart.d.cts[22m[39m [2m0.32 kB[22m [2m│ gzip: 0.18 kB[22m
|
|
42
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mindex-BaeUV_fj.d.cts[39m [2m6.50 kB[22m [2m│ gzip: 2.42 kB[22m
|
|
43
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mupload-error-DTYVNlaJ.d.cts[39m [2m2.82 kB[22m [2m│ gzip: 0.81 kB[22m
|
|
44
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mupload-event-BT_nXgM9.d.cts[39m [2m1.38 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
45
45
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mcompression-service-CiF7Px08.d.cts[39m [2m0.79 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
46
46
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mlogger-service-CbN12RhO.d.cts[39m [2m0.57 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
47
47
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mmiddleware-CYcctmlY.d.cts[39m [2m0.50 kB[22m [2m│ gzip: 0.26 kB[22m
|
|
48
|
-
[34mℹ[39m [33m[CJS][39m 20 files, total:
|
|
49
|
-
[32m✔[39m Build complete in [
|
|
50
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mmultipart.mjs[22m [
|
|
51
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1moneshot.mjs[22m [2m 2.55 kB[22m [2m│ gzip:
|
|
52
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mpipeline.mjs[22m [2m 0.76 kB[22m [2m│ gzip:
|
|
53
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1merrors.mjs[22m [2m 0.
|
|
54
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mservices.mjs[22m [2m 0.35 kB[22m [2m│ gzip:
|
|
55
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mprogress.mjs[22m [2m 0.01 kB[22m [2m│ gzip:
|
|
56
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mmultipart.mjs.map [
|
|
57
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22moneshot.mjs.map [2m 6.07 kB[22m [2m│ gzip:
|
|
58
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mupload-error-
|
|
59
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mupload-error-
|
|
60
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mpipeline.mjs.map [2m 2.09 kB[22m [2m│ gzip:
|
|
61
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mnormalize-callback-
|
|
62
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mcompression-service-Bm1VBnhT.mjs.map [2m 1.67 kB[22m [2m│ gzip:
|
|
63
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex-
|
|
64
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mnormalize-callback-
|
|
65
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[
|
|
66
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[
|
|
67
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mlogger-service-1J5r_akj.mjs.map [2m 0.79 kB[22m [2m│ gzip:
|
|
68
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mupload-event-
|
|
69
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22moneshot.d.mts.map [2m 0.51 kB[22m [2m│ gzip:
|
|
70
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mmiddleware-CAI0cnW2.d.mts.map [2m 0.42 kB[22m [2m│ gzip:
|
|
71
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mlogger-service-1J5r_akj.mjs [2m 0.38 kB[22m [2m│ gzip:
|
|
72
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mcompression-service-DI7ZXVxH.d.mts.map [2m 0.36 kB[22m [2m│ gzip:
|
|
73
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mlogger-service-BF2pZOHN.d.mts.map [2m 0.28 kB[22m [2m│ gzip:
|
|
74
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mpipeline.d.mts.map [2m 0.18 kB[22m [2m│ gzip:
|
|
75
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1moneshot.d.mts[22m[39m [2m 1.19 kB[22m [2m│ gzip:
|
|
76
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[
|
|
77
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[
|
|
78
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mservices.d.mts[22m[39m [2m 0.38 kB[22m [2m│ gzip:
|
|
79
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mprogress.d.mts[22m[39m [2m 0.36 kB[22m [2m│ gzip:
|
|
80
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mmultipart.d.mts[22m[39m [2m 0.
|
|
81
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mindex-
|
|
82
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mupload-error-
|
|
83
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mupload-event-
|
|
84
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mcompression-service-DI7ZXVxH.d.mts[39m [2m 0.79 kB[22m [2m│ gzip:
|
|
85
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mlogger-service-BF2pZOHN.d.mts[39m [2m 0.57 kB[22m [2m│ gzip:
|
|
86
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mmiddleware-CAI0cnW2.d.mts[39m [2m 0.50 kB[22m [2m│ gzip:
|
|
87
|
-
[34mℹ[39m [34m[ESM][39m 37 files, total: 73
|
|
88
|
-
[32m✔[39m Build complete in [
|
|
48
|
+
[34mℹ[39m [33m[CJS][39m 20 files, total: 20.68 kB
|
|
49
|
+
[32m✔[39m Build complete in [32m2670ms[39m
|
|
50
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mmultipart.mjs[22m [2m13.88 kB[22m [2m│ gzip: 3.89 kB[22m
|
|
51
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1moneshot.mjs[22m [2m 2.55 kB[22m [2m│ gzip: 1.05 kB[22m
|
|
52
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mpipeline.mjs[22m [2m 0.76 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
53
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1merrors.mjs[22m [2m 0.44 kB[22m [2m│ gzip: 0.21 kB[22m
|
|
54
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mservices.mjs[22m [2m 0.35 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
55
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mprogress.mjs[22m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
56
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mmultipart.mjs.map [2m36.62 kB[22m [2m│ gzip: 10.29 kB[22m
|
|
57
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22moneshot.mjs.map [2m 6.07 kB[22m [2m│ gzip: 2.17 kB[22m
|
|
58
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mupload-error-Dbz_9j81.mjs.map [2m 4.63 kB[22m [2m│ gzip: 1.29 kB[22m
|
|
59
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mupload-error-Dbz_9j81.mjs [2m 2.99 kB[22m [2m│ gzip: 0.92 kB[22m
|
|
60
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mpipeline.mjs.map [2m 2.09 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
61
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mnormalize-callback-tcZ_nyq5.mjs.map [2m 1.88 kB[22m [2m│ gzip: 0.82 kB[22m
|
|
62
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mcompression-service-Bm1VBnhT.mjs.map [2m 1.67 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
63
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex-bpWq6tje.d.mts.map [2m 1.61 kB[22m [2m│ gzip: 0.59 kB[22m
|
|
64
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mnormalize-callback-tcZ_nyq5.mjs [2m 1.00 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
65
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mupload-error-jBco270d.d.mts.map [2m 0.98 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
66
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mcompression-service-Bm1VBnhT.mjs [2m 0.91 kB[22m [2m│ gzip: 0.44 kB[22m
|
|
67
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mlogger-service-1J5r_akj.mjs.map [2m 0.79 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
68
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mupload-event-DOGbegxa.d.mts.map [2m 0.62 kB[22m [2m│ gzip: 0.25 kB[22m
|
|
69
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22moneshot.d.mts.map [2m 0.51 kB[22m [2m│ gzip: 0.27 kB[22m
|
|
70
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mmiddleware-CAI0cnW2.d.mts.map [2m 0.42 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
71
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mlogger-service-1J5r_akj.mjs [2m 0.38 kB[22m [2m│ gzip: 0.26 kB[22m
|
|
72
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mcompression-service-DI7ZXVxH.d.mts.map [2m 0.36 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
73
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mlogger-service-BF2pZOHN.d.mts.map [2m 0.28 kB[22m [2m│ gzip: 0.20 kB[22m
|
|
74
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mpipeline.d.mts.map [2m 0.18 kB[22m [2m│ gzip: 0.15 kB[22m
|
|
75
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1moneshot.d.mts[22m[39m [2m 1.19 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
76
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1merrors.d.mts[22m[39m [2m 0.48 kB[22m [2m│ gzip: 0.22 kB[22m
|
|
77
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mpipeline.d.mts[22m[39m [2m 0.43 kB[22m [2m│ gzip: 0.27 kB[22m
|
|
78
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mservices.d.mts[22m[39m [2m 0.38 kB[22m [2m│ gzip: 0.18 kB[22m
|
|
79
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mprogress.d.mts[22m[39m [2m 0.36 kB[22m [2m│ gzip: 0.20 kB[22m
|
|
80
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mmultipart.d.mts[22m[39m [2m 0.32 kB[22m [2m│ gzip: 0.18 kB[22m
|
|
81
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mindex-bpWq6tje.d.mts[39m [2m 6.50 kB[22m [2m│ gzip: 2.42 kB[22m
|
|
82
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mupload-error-jBco270d.d.mts[39m [2m 2.82 kB[22m [2m│ gzip: 0.82 kB[22m
|
|
83
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mupload-event-DOGbegxa.d.mts[39m [2m 1.38 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
84
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mcompression-service-DI7ZXVxH.d.mts[39m [2m 0.79 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
85
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mlogger-service-BF2pZOHN.d.mts[39m [2m 0.57 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
86
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mmiddleware-CAI0cnW2.d.mts[39m [2m 0.50 kB[22m [2m│ gzip: 0.27 kB[22m
|
|
87
|
+
[34mℹ[39m [34m[ESM][39m 37 files, total: 97.73 kB
|
|
88
|
+
[32m✔[39m Build complete in [32m2683ms[39m
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# @tranquilload/core
|
|
2
|
+
|
|
3
|
+
## 0.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 6ca9186: Resume safety: opaque `ResumeState`, content-digest validation, pipeline-identity check.
|
|
8
|
+
|
|
9
|
+
The pre-v0.2 resume pattern (re-passing a stored `uploadId` via `initiate`)
|
|
10
|
+
had three silent-corruption gaps: chunkSize drift, content swap, and pipeline
|
|
11
|
+
drift. This release ships an opaque `ResumeState` that the lib produces, you
|
|
12
|
+
persist, and the lib re-validates before any byte is uploaded.
|
|
13
|
+
|
|
14
|
+
**New surface:**
|
|
15
|
+
|
|
16
|
+
- `ResumeState` — opaque, JSON-serializable resume metadata carrying `version`,
|
|
17
|
+
`uploadId`, `chunkSize`, optional `pipelineIdentity`, optional `contentDigest`,
|
|
18
|
+
and the `contentDigestCaptured` flag.
|
|
19
|
+
- `resumeFrom: ResumeState` option on `uploadMultipart` — validates match
|
|
20
|
+
synchronously (version, chunkSize, pipelineIdentity, captured-but-dropped
|
|
21
|
+
digest) and asynchronously (digest value), then uses `resumeFrom.uploadId`
|
|
22
|
+
directly (skipping `initiate`).
|
|
23
|
+
- `getContentDigest: () => string | Promise<string> | Effect<string, UploadError>`
|
|
24
|
+
option — lightweight stable identifier of the source content. Captured on
|
|
25
|
+
fresh init, compared on resume. Stable patterns:
|
|
26
|
+
`` `${name}|${size}|${lastModified}` `` for browser files;
|
|
27
|
+
`` `${path}|${stat.size}|${stat.mtimeMs}` `` for Node fs.
|
|
28
|
+
- `pipelineIdentity: string` option — opaque, strict-equality identifier for
|
|
29
|
+
the upstream pipeline composition.
|
|
30
|
+
- `resumeState: Promise<ResumeState>` on `uploadMultipart`'s return — resolves
|
|
31
|
+
with the state you should persist.
|
|
32
|
+
- `ResumeMismatchError` — new `UploadError` variant with a `reason`
|
|
33
|
+
discriminant: `version_mismatch | chunksize_mismatch | pipeline_mismatch |
|
|
34
|
+
content_mismatch`. Dispatch with `Match.value(err.reason)` inside the
|
|
35
|
+
`Match.tag("ResumeMismatchError", ...)` handler.
|
|
36
|
+
|
|
37
|
+
**Behaviour change (semver-minor under pre-1.0 SemVer):** `initiate` semantics
|
|
38
|
+
are now "always fresh". Users on the v0.1.x legacy pattern (`initiate +
|
|
39
|
+
reconcileCompletedParts + no resumeFrom`) get an unconditional `console.warn`
|
|
40
|
+
pointing at `MIGRATION.md`. A second warning fires when `pipeline` is set
|
|
41
|
+
without `pipelineIdentity` — without an identity, pipeline-mismatch protection
|
|
42
|
+
on resume is disabled.
|
|
43
|
+
|
|
44
|
+
**Resume is now silent.** On the resume branch, the lib does **not** emit a
|
|
45
|
+
synthetic `UploadInitiated` event; the first event after setup is whatever
|
|
46
|
+
the parts stream emits next (`PartCompleted` or `ProgressTick`). The
|
|
47
|
+
`uploadId` Promise resolves synchronously with `resumeFrom.uploadId`. The
|
|
48
|
+
existing fresh-init flow is unchanged.
|
|
49
|
+
|
|
50
|
+
**Bundled fix:** `CircuitOpenError` is now exported from
|
|
51
|
+
`@tranquilload/core/errors`. It was defined internally but had never been
|
|
52
|
+
re-exported, so callers had no way to `instanceof`-check it.
|
|
53
|
+
|
|
54
|
+
**NOT in this release** (explicit non-feature note): auto-re-initiate on dead
|
|
55
|
+
`uploadId` was considered but deferred to a future version. If your stored
|
|
56
|
+
`uploadId` is no longer valid server-side, you'll currently see
|
|
57
|
+
`PartUploadError(1, 1, <404>)` on the first part upload — same as before.
|
|
58
|
+
|
|
59
|
+
See `MIGRATION.md` for the migration guide.
|
|
60
|
+
|
|
61
|
+
- 6ca9186: Validate `chunkSize > 0` in `uploadMultipart` / `uploadMultipartEffect`.
|
|
62
|
+
|
|
63
|
+
Previously, passing `chunkSize: 0` (or `NaN`, `Infinity`, negative values) caused an infinite loop on the first byte of the source stream — the chunking loop `while (buffer.length >= chunkSize)` never terminated.
|
|
64
|
+
|
|
65
|
+
Now: `uploadMultipart` (and the `.effect` escape hatch) throws `TypeError` synchronously at construction time when `chunkSize` is not a positive finite number. Behaviour for all valid `chunkSize` values is unchanged.
|
|
66
|
+
|
|
67
|
+
This is a behaviour change for users who were passing invalid `chunkSize` — but those uploads never worked (they hung forever), so this is semver-patch.
|
package/dist/errors.cjs
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_upload_error = require("./upload-error-
|
|
2
|
+
const require_upload_error = require("./upload-error-BG1dOOl3.cjs");
|
|
3
3
|
exports.AbortError = require_upload_error.AbortError;
|
|
4
|
+
exports.CircuitOpenError = require_upload_error.CircuitOpenError;
|
|
4
5
|
exports.CompleteUploadError = require_upload_error.CompleteUploadError;
|
|
5
6
|
exports.InitiateUploadError = require_upload_error.InitiateUploadError;
|
|
6
7
|
exports.MaxRetriesExceededError = require_upload_error.MaxRetriesExceededError;
|
|
7
8
|
exports.PartUploadError = require_upload_error.PartUploadError;
|
|
8
9
|
exports.PresignedUrlError = require_upload_error.PresignedUrlError;
|
|
9
10
|
exports.ReconcileError = require_upload_error.ReconcileError;
|
|
11
|
+
exports.ResumeMismatchError = require_upload_error.ResumeMismatchError;
|
package/dist/errors.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { AbortError, CompleteUploadError, InitiateUploadError, MaxRetriesExceededError, PartUploadError, PresignedUrlError, ReconcileError, type UploadError };
|
|
1
|
+
import { a as MaxRetriesExceededError, c as ReconcileError, i as InitiateUploadError, l as ResumeMismatchError, n as CircuitOpenError, o as PartUploadError, r as CompleteUploadError, s as PresignedUrlError, t as AbortError, u as UploadError } from "./upload-error-DTYVNlaJ.cjs";
|
|
2
|
+
export { AbortError, CircuitOpenError, CompleteUploadError, InitiateUploadError, MaxRetriesExceededError, PartUploadError, PresignedUrlError, ReconcileError, ResumeMismatchError, type UploadError };
|
package/dist/errors.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { AbortError, CompleteUploadError, InitiateUploadError, MaxRetriesExceededError, PartUploadError, PresignedUrlError, ReconcileError, type UploadError };
|
|
1
|
+
import { a as MaxRetriesExceededError, c as ReconcileError, i as InitiateUploadError, l as ResumeMismatchError, n as CircuitOpenError, o as PartUploadError, r as CompleteUploadError, s as PresignedUrlError, t as AbortError, u as UploadError } from "./upload-error-jBco270d.mjs";
|
|
2
|
+
export { AbortError, CircuitOpenError, CompleteUploadError, InitiateUploadError, MaxRetriesExceededError, PartUploadError, PresignedUrlError, ReconcileError, ResumeMismatchError, type UploadError };
|
package/dist/errors.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as MaxRetriesExceededError, c as ReconcileError, i as InitiateUploadError, o as PartUploadError, r as CompleteUploadError, s as PresignedUrlError, t as AbortError } from "./upload-error-
|
|
2
|
-
export { AbortError, CompleteUploadError, InitiateUploadError, MaxRetriesExceededError, PartUploadError, PresignedUrlError, ReconcileError };
|
|
1
|
+
import { a as MaxRetriesExceededError, c as ReconcileError, i as InitiateUploadError, l as ResumeMismatchError, n as CircuitOpenError, o as PartUploadError, r as CompleteUploadError, s as PresignedUrlError, t as AbortError } from "./upload-error-Dbz_9j81.mjs";
|
|
2
|
+
export { AbortError, CircuitOpenError, CompleteUploadError, InitiateUploadError, MaxRetriesExceededError, PartUploadError, PresignedUrlError, ReconcileError, ResumeMismatchError };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { o as PartUploadError, u as UploadError } from "./upload-error-DTYVNlaJ.cjs";
|
|
2
|
+
import { n as LoggerService } from "./logger-service-CbN12RhO.cjs";
|
|
3
|
+
import { a as UploadEvent, i as UploadCompleted } from "./upload-event-BT_nXgM9.cjs";
|
|
4
|
+
import { t as Transform } from "./middleware-CYcctmlY.cjs";
|
|
5
|
+
import { Effect, Option, Schedule, Stream } from "effect";
|
|
6
|
+
|
|
7
|
+
//#region src/multipart/circuit-breaker.d.ts
|
|
8
|
+
interface CircuitBreakerConfig {
|
|
9
|
+
readonly threshold: number;
|
|
10
|
+
readonly cooldown: number;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/multipart/upload-stream.d.ts
|
|
14
|
+
interface CompletedPart {
|
|
15
|
+
readonly partNumber: number;
|
|
16
|
+
readonly etag: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Opaque resume metadata returned by `uploadMultipart` and persisted by the
|
|
20
|
+
* caller (typically `JSON.stringify` → localStorage). Pass it back as
|
|
21
|
+
* `resumeFrom` on the next session.
|
|
22
|
+
*
|
|
23
|
+
* The lib validates `version`, `chunkSize`, `pipelineIdentity`, and the content
|
|
24
|
+
* digest before any byte is uploaded. A mismatch fails the upload with a typed
|
|
25
|
+
* `ResumeMismatchError` — preventing the silent-corruption classes documented
|
|
26
|
+
* in the v0.2.x release notes.
|
|
27
|
+
*
|
|
28
|
+
* **Schema versioning.** The `version: 1` literal is a tripwire for schema
|
|
29
|
+
* evolution: future v2 schemas widen this union, and a persisted v1 state
|
|
30
|
+
* passed to a future v2 lib will fail with `ResumeMismatchError("version_mismatch")`
|
|
31
|
+
* rather than silently misinterpreting old fields.
|
|
32
|
+
*/
|
|
33
|
+
interface ResumeState {
|
|
34
|
+
readonly version: 1;
|
|
35
|
+
readonly uploadId: string;
|
|
36
|
+
readonly chunkSize: number;
|
|
37
|
+
readonly pipelineIdentity?: string;
|
|
38
|
+
readonly contentDigest?: string;
|
|
39
|
+
/**
|
|
40
|
+
* True if the original session captured a digest. Detects persistence layers
|
|
41
|
+
* that drop the `contentDigest` field (which would otherwise silently bypass
|
|
42
|
+
* content-mismatch validation).
|
|
43
|
+
*/
|
|
44
|
+
readonly contentDigestCaptured: boolean;
|
|
45
|
+
}
|
|
46
|
+
interface UploadMultipartOptions {
|
|
47
|
+
readonly stream: ReadableStream<Uint8Array>;
|
|
48
|
+
readonly chunkSize: number;
|
|
49
|
+
readonly uploadPart: (partNumber: number, chunk: Uint8Array) => string | Promise<string> | Effect.Effect<string, UploadError>;
|
|
50
|
+
readonly completeUpload: (uploadId: string, parts: ReadonlyArray<CompletedPart>) => void | Promise<void> | Effect.Effect<void, UploadError>;
|
|
51
|
+
readonly initiate?: () => {
|
|
52
|
+
uploadId: string;
|
|
53
|
+
} | Promise<{
|
|
54
|
+
uploadId: string;
|
|
55
|
+
}> | Effect.Effect<{
|
|
56
|
+
uploadId: string;
|
|
57
|
+
}, UploadError>;
|
|
58
|
+
readonly reconcileCompletedParts?: () => ReadonlyArray<CompletedPart> | Promise<ReadonlyArray<CompletedPart>> | Effect.Effect<ReadonlyArray<CompletedPart>, UploadError>;
|
|
59
|
+
/**
|
|
60
|
+
* Resume metadata persisted from a previous session. When set, the lib skips
|
|
61
|
+
* the `initiate` callback (the `uploadId` is read from `resumeFrom`) and
|
|
62
|
+
* validates `version`, `chunkSize`, `pipelineIdentity`, and `contentDigest`
|
|
63
|
+
* before any byte is uploaded. A mismatch fails the upload with
|
|
64
|
+
* `ResumeMismatchError`.
|
|
65
|
+
*
|
|
66
|
+
* Synchronous (pre-flight) validation happens at `uploadMultipart()` call
|
|
67
|
+
* time — `TypeError` for an empty `uploadId`, `ResumeMismatchError` for the
|
|
68
|
+
* rest. The asynchronous content-digest *value* match is verified inside
|
|
69
|
+
* the Effect once the upload stream is consumed.
|
|
70
|
+
*/
|
|
71
|
+
readonly resumeFrom?: ResumeState;
|
|
72
|
+
/**
|
|
73
|
+
* Called once on fresh initiate to capture a digest of the source content.
|
|
74
|
+
* On a subsequent resume session, called again and compared to
|
|
75
|
+
* `resumeFrom.contentDigest`; a mismatch fails the upload with
|
|
76
|
+
* `ResumeMismatchError("content_mismatch")` before any byte is uploaded.
|
|
77
|
+
*
|
|
78
|
+
* **MUST be lightweight and stable across sessions.** Suggested patterns:
|
|
79
|
+
* - Browser `File`: `` `${name}|${size}|${lastModified}` ``
|
|
80
|
+
* - Node `Readable` from a file: `` `${path}|${stat.size}|${stat.mtimeMs}` ``
|
|
81
|
+
* - Synchronous strings; avoid full-file crypto hashes on the synchronous path.
|
|
82
|
+
*
|
|
83
|
+
* **MUST NOT consume bytes from the source stream** (passed in
|
|
84
|
+
* `options.stream`). The lib calls `getContentDigest` before any chunk is
|
|
85
|
+
* pulled from the source; consuming from the source here will produce a
|
|
86
|
+
* zero-byte upload because no bytes remain for `chunkStream`.
|
|
87
|
+
*/
|
|
88
|
+
readonly getContentDigest?: () => string | Promise<string> | Effect.Effect<string, UploadError>;
|
|
89
|
+
/**
|
|
90
|
+
* An opaque, stable identifier for the upstream pipeline composition.
|
|
91
|
+
* Captured in `ResumeState` and validated strict-equality on resume.
|
|
92
|
+
* **You own keeping this stable** — if you configure `compress("deflate-raw")`
|
|
93
|
+
* in session A, you must pass the same `pipelineIdentity` on resume.
|
|
94
|
+
*
|
|
95
|
+
* **Strict equality limitation:** a pipeline that is logically identical but
|
|
96
|
+
* produces different identifier strings (e.g. tag bumps, version-stamped
|
|
97
|
+
* strings) triggers `ResumeMismatchError("pipeline_mismatch")`. Pick a stable
|
|
98
|
+
* string (e.g. `"deflate-raw-v1"`) and only change it when the pipeline's
|
|
99
|
+
* *byte-level output* changes.
|
|
100
|
+
*
|
|
101
|
+
* **Compression non-determinism caveat:** even with identical
|
|
102
|
+
* `pipelineIdentity`, a non-deterministic pipeline (e.g. gzip with `mtime`
|
|
103
|
+
* headers, encryption with random salt) produces different bytes per run.
|
|
104
|
+
* Resume against the same uploaded parts only works if the pipeline is
|
|
105
|
+
* byte-deterministic. Verify your pipeline's determinism before relying on
|
|
106
|
+
* this.
|
|
107
|
+
*/
|
|
108
|
+
readonly pipelineIdentity?: string;
|
|
109
|
+
readonly maxConcurrency?: number;
|
|
110
|
+
readonly signal?: AbortSignal;
|
|
111
|
+
readonly retrySchedule?: Schedule.Schedule<unknown, PartUploadError>;
|
|
112
|
+
readonly circuitBreaker?: CircuitBreakerConfig;
|
|
113
|
+
}
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/multipart/index.d.ts
|
|
116
|
+
type UploadResult = UploadCompleted;
|
|
117
|
+
interface Progress {
|
|
118
|
+
readonly bytesUploaded: number;
|
|
119
|
+
readonly totalBytes: Option.Option<number>;
|
|
120
|
+
}
|
|
121
|
+
interface MultipartPublicOptions extends UploadMultipartOptions {
|
|
122
|
+
readonly totalBytes?: number;
|
|
123
|
+
readonly pipeline?: Transform | Effect.Effect<Transform, unknown, unknown>;
|
|
124
|
+
}
|
|
125
|
+
declare const uploadMultipart: {
|
|
126
|
+
(options: MultipartPublicOptions): {
|
|
127
|
+
events: ReadableStream<UploadEvent>;
|
|
128
|
+
result: Promise<UploadResult>;
|
|
129
|
+
getProgress: (() => Promise<Progress>) & {
|
|
130
|
+
effect: Effect.Effect<Progress>;
|
|
131
|
+
};
|
|
132
|
+
uploadId: Promise<string>;
|
|
133
|
+
resumeState: Promise<ResumeState>;
|
|
134
|
+
};
|
|
135
|
+
effect: (options: UploadMultipartOptions) => Stream.Stream<UploadEvent, UploadError, LoggerService>;
|
|
136
|
+
};
|
|
137
|
+
//#endregion
|
|
138
|
+
export { CompletedPart as a, uploadMultipart as i, Progress as n, ResumeState as o, UploadResult as r, UploadMultipartOptions as s, MultipartPublicOptions as t };
|
|
139
|
+
//# sourceMappingURL=index-BaeUV_fj.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BaeUV_fj.d.cts","names":[],"sources":["../src/multipart/circuit-breaker.ts","../src/multipart/upload-stream.ts","../src/multipart/index.ts"],"mappings":";;;;;;;UAIiB,oBAAA;EAAA,SACN,SAAA;EAAA,SACA,QAAA;AAAA;;;UCIM,aAAA;EAAA,SACN,UAAA;EAAA,SACA,IAAA;AAAA;;;;;;AAFX;;;;;AAoBA;;;;;UAAiB,WAAA;EAAA,SACN,OAAA;EAAA,SACA,QAAA;EAAA,SACA,SAAA;EAAA,SACA,gBAAA;EAAA,SACA,aAAA;EAMqB;AAGhC;;;;EAHgC,SAArB,qBAAA;AAAA;AAAA,UAGM,sBAAA;EAAA,SACN,MAAA,EAAQ,cAAA,CAAe,UAAA;EAAA,SACvB,SAAA;EAAA,SACA,UAAA,GACP,UAAA,UACA,KAAA,EAAO,UAAA,cACK,OAAA,WAAkB,MAAA,CAAO,MAAA,SAAe,WAAA;EAAA,SAC7C,cAAA,GACP,QAAA,UACA,KAAA,EAAO,aAAA,CAAc,aAAA,aACX,OAAA,SAAgB,MAAA,CAAO,MAAA,OAAa,WAAA;EAAA,SACvC,QAAA;IACH,QAAA;EAAA,IACF,OAAA;IAAU,QAAA;EAAA,KACV,MAAA,CAAO,MAAA;IAAS,QAAA;EAAA,GAAoB,WAAA;EAAA,SAC/B,uBAAA,SACL,aAAA,CAAc,aAAA,IACd,OAAA,CAAQ,aAAA,CAAc,aAAA,KACtB,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,aAAA,GAAgB,WAAA;EADtB;;;;;;;;;;;;EAAA,SAcjB,UAAA,GAAa,WAAA;EA2CG;;;;;;;;;;;;;;;;EAAA,SA1BhB,gBAAA,kBAEL,OAAA,WACA,MAAA,CAAO,MAAA,SAAe,WAAA;EA3CxB;;;;;;;;;;;;;;;;;;;EAAA,SA+DO,gBAAA;EAAA,SACA,cAAA;EAAA,SACA,MAAA,GAAS,WAAA;EAAA,SACT,aAAA,GAAgB,QAAA,CAAS,QAAA,UAAkB,eAAA;EAAA,SAC3C,cAAA,GAAiB,oBAAA;AAAA;;;KChHhB,YAAA,GAAe,eAAA;AAAA,UAGV,QAAA;EAAA,SACN,aAAA;EAAA,SACA,UAAA,EAAY,MAAA,CAAO,MAAA;AAAA;AAAA,UAGb,sBAAA,SAA+B,sBAAA;EAAA,SACrC,UAAA;EAAA,SACA,QAAA,GAAW,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA;AAAA,cAMnC,eAAA;EAAA,UACF,sBAAA;IAET,MAAA,EAAQ,cAAA,CAAe,WAAA;IACvB,MAAA,EAAQ,OAAA,CAAQ,YAAA;IAChB,WAAA,SAAoB,OAAA,CAAQ,QAAA;MAAe,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,QAAA;IAAA;IACjE,QAAA,EAAU,OAAA;IACV,WAAA,EAAa,OAAA,CAAQ,WAAA;EAAA"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { o as PartUploadError, u as UploadError } from "./upload-error-jBco270d.mjs";
|
|
2
|
+
import { n as LoggerService } from "./logger-service-BF2pZOHN.mjs";
|
|
3
|
+
import { a as UploadEvent, i as UploadCompleted } from "./upload-event-DOGbegxa.mjs";
|
|
4
|
+
import { t as Transform } from "./middleware-CAI0cnW2.mjs";
|
|
5
|
+
import { Effect, Option, Schedule, Stream } from "effect";
|
|
6
|
+
|
|
7
|
+
//#region src/multipart/circuit-breaker.d.ts
|
|
8
|
+
interface CircuitBreakerConfig {
|
|
9
|
+
readonly threshold: number;
|
|
10
|
+
readonly cooldown: number;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/multipart/upload-stream.d.ts
|
|
14
|
+
interface CompletedPart {
|
|
15
|
+
readonly partNumber: number;
|
|
16
|
+
readonly etag: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Opaque resume metadata returned by `uploadMultipart` and persisted by the
|
|
20
|
+
* caller (typically `JSON.stringify` → localStorage). Pass it back as
|
|
21
|
+
* `resumeFrom` on the next session.
|
|
22
|
+
*
|
|
23
|
+
* The lib validates `version`, `chunkSize`, `pipelineIdentity`, and the content
|
|
24
|
+
* digest before any byte is uploaded. A mismatch fails the upload with a typed
|
|
25
|
+
* `ResumeMismatchError` — preventing the silent-corruption classes documented
|
|
26
|
+
* in the v0.2.x release notes.
|
|
27
|
+
*
|
|
28
|
+
* **Schema versioning.** The `version: 1` literal is a tripwire for schema
|
|
29
|
+
* evolution: future v2 schemas widen this union, and a persisted v1 state
|
|
30
|
+
* passed to a future v2 lib will fail with `ResumeMismatchError("version_mismatch")`
|
|
31
|
+
* rather than silently misinterpreting old fields.
|
|
32
|
+
*/
|
|
33
|
+
interface ResumeState {
|
|
34
|
+
readonly version: 1;
|
|
35
|
+
readonly uploadId: string;
|
|
36
|
+
readonly chunkSize: number;
|
|
37
|
+
readonly pipelineIdentity?: string;
|
|
38
|
+
readonly contentDigest?: string;
|
|
39
|
+
/**
|
|
40
|
+
* True if the original session captured a digest. Detects persistence layers
|
|
41
|
+
* that drop the `contentDigest` field (which would otherwise silently bypass
|
|
42
|
+
* content-mismatch validation).
|
|
43
|
+
*/
|
|
44
|
+
readonly contentDigestCaptured: boolean;
|
|
45
|
+
}
|
|
46
|
+
interface UploadMultipartOptions {
|
|
47
|
+
readonly stream: ReadableStream<Uint8Array>;
|
|
48
|
+
readonly chunkSize: number;
|
|
49
|
+
readonly uploadPart: (partNumber: number, chunk: Uint8Array) => string | Promise<string> | Effect.Effect<string, UploadError>;
|
|
50
|
+
readonly completeUpload: (uploadId: string, parts: ReadonlyArray<CompletedPart>) => void | Promise<void> | Effect.Effect<void, UploadError>;
|
|
51
|
+
readonly initiate?: () => {
|
|
52
|
+
uploadId: string;
|
|
53
|
+
} | Promise<{
|
|
54
|
+
uploadId: string;
|
|
55
|
+
}> | Effect.Effect<{
|
|
56
|
+
uploadId: string;
|
|
57
|
+
}, UploadError>;
|
|
58
|
+
readonly reconcileCompletedParts?: () => ReadonlyArray<CompletedPart> | Promise<ReadonlyArray<CompletedPart>> | Effect.Effect<ReadonlyArray<CompletedPart>, UploadError>;
|
|
59
|
+
/**
|
|
60
|
+
* Resume metadata persisted from a previous session. When set, the lib skips
|
|
61
|
+
* the `initiate` callback (the `uploadId` is read from `resumeFrom`) and
|
|
62
|
+
* validates `version`, `chunkSize`, `pipelineIdentity`, and `contentDigest`
|
|
63
|
+
* before any byte is uploaded. A mismatch fails the upload with
|
|
64
|
+
* `ResumeMismatchError`.
|
|
65
|
+
*
|
|
66
|
+
* Synchronous (pre-flight) validation happens at `uploadMultipart()` call
|
|
67
|
+
* time — `TypeError` for an empty `uploadId`, `ResumeMismatchError` for the
|
|
68
|
+
* rest. The asynchronous content-digest *value* match is verified inside
|
|
69
|
+
* the Effect once the upload stream is consumed.
|
|
70
|
+
*/
|
|
71
|
+
readonly resumeFrom?: ResumeState;
|
|
72
|
+
/**
|
|
73
|
+
* Called once on fresh initiate to capture a digest of the source content.
|
|
74
|
+
* On a subsequent resume session, called again and compared to
|
|
75
|
+
* `resumeFrom.contentDigest`; a mismatch fails the upload with
|
|
76
|
+
* `ResumeMismatchError("content_mismatch")` before any byte is uploaded.
|
|
77
|
+
*
|
|
78
|
+
* **MUST be lightweight and stable across sessions.** Suggested patterns:
|
|
79
|
+
* - Browser `File`: `` `${name}|${size}|${lastModified}` ``
|
|
80
|
+
* - Node `Readable` from a file: `` `${path}|${stat.size}|${stat.mtimeMs}` ``
|
|
81
|
+
* - Synchronous strings; avoid full-file crypto hashes on the synchronous path.
|
|
82
|
+
*
|
|
83
|
+
* **MUST NOT consume bytes from the source stream** (passed in
|
|
84
|
+
* `options.stream`). The lib calls `getContentDigest` before any chunk is
|
|
85
|
+
* pulled from the source; consuming from the source here will produce a
|
|
86
|
+
* zero-byte upload because no bytes remain for `chunkStream`.
|
|
87
|
+
*/
|
|
88
|
+
readonly getContentDigest?: () => string | Promise<string> | Effect.Effect<string, UploadError>;
|
|
89
|
+
/**
|
|
90
|
+
* An opaque, stable identifier for the upstream pipeline composition.
|
|
91
|
+
* Captured in `ResumeState` and validated strict-equality on resume.
|
|
92
|
+
* **You own keeping this stable** — if you configure `compress("deflate-raw")`
|
|
93
|
+
* in session A, you must pass the same `pipelineIdentity` on resume.
|
|
94
|
+
*
|
|
95
|
+
* **Strict equality limitation:** a pipeline that is logically identical but
|
|
96
|
+
* produces different identifier strings (e.g. tag bumps, version-stamped
|
|
97
|
+
* strings) triggers `ResumeMismatchError("pipeline_mismatch")`. Pick a stable
|
|
98
|
+
* string (e.g. `"deflate-raw-v1"`) and only change it when the pipeline's
|
|
99
|
+
* *byte-level output* changes.
|
|
100
|
+
*
|
|
101
|
+
* **Compression non-determinism caveat:** even with identical
|
|
102
|
+
* `pipelineIdentity`, a non-deterministic pipeline (e.g. gzip with `mtime`
|
|
103
|
+
* headers, encryption with random salt) produces different bytes per run.
|
|
104
|
+
* Resume against the same uploaded parts only works if the pipeline is
|
|
105
|
+
* byte-deterministic. Verify your pipeline's determinism before relying on
|
|
106
|
+
* this.
|
|
107
|
+
*/
|
|
108
|
+
readonly pipelineIdentity?: string;
|
|
109
|
+
readonly maxConcurrency?: number;
|
|
110
|
+
readonly signal?: AbortSignal;
|
|
111
|
+
readonly retrySchedule?: Schedule.Schedule<unknown, PartUploadError>;
|
|
112
|
+
readonly circuitBreaker?: CircuitBreakerConfig;
|
|
113
|
+
}
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/multipart/index.d.ts
|
|
116
|
+
type UploadResult = UploadCompleted;
|
|
117
|
+
interface Progress {
|
|
118
|
+
readonly bytesUploaded: number;
|
|
119
|
+
readonly totalBytes: Option.Option<number>;
|
|
120
|
+
}
|
|
121
|
+
interface MultipartPublicOptions extends UploadMultipartOptions {
|
|
122
|
+
readonly totalBytes?: number;
|
|
123
|
+
readonly pipeline?: Transform | Effect.Effect<Transform, unknown, unknown>;
|
|
124
|
+
}
|
|
125
|
+
declare const uploadMultipart: {
|
|
126
|
+
(options: MultipartPublicOptions): {
|
|
127
|
+
events: ReadableStream<UploadEvent>;
|
|
128
|
+
result: Promise<UploadResult>;
|
|
129
|
+
getProgress: (() => Promise<Progress>) & {
|
|
130
|
+
effect: Effect.Effect<Progress>;
|
|
131
|
+
};
|
|
132
|
+
uploadId: Promise<string>;
|
|
133
|
+
resumeState: Promise<ResumeState>;
|
|
134
|
+
};
|
|
135
|
+
effect: (options: UploadMultipartOptions) => Stream.Stream<UploadEvent, UploadError, LoggerService>;
|
|
136
|
+
};
|
|
137
|
+
//#endregion
|
|
138
|
+
export { CompletedPart as a, uploadMultipart as i, Progress as n, ResumeState as o, UploadResult as r, UploadMultipartOptions as s, MultipartPublicOptions as t };
|
|
139
|
+
//# sourceMappingURL=index-bpWq6tje.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-bpWq6tje.d.mts","names":[],"sources":["../src/multipart/circuit-breaker.ts","../src/multipart/upload-stream.ts","../src/multipart/index.ts"],"mappings":";;;;;;;UAIiB,oBAAA;EAAA,SACN,SAAA;EAAA,SACA,QAAA;AAAA;;;UCIM,aAAA;EAAA,SACN,UAAA;EAAA,SACA,IAAA;AAAA;;;;;;AAFX;;;;;AAoBA;;;;;UAAiB,WAAA;EAAA,SACN,OAAA;EAAA,SACA,QAAA;EAAA,SACA,SAAA;EAAA,SACA,gBAAA;EAAA,SACA,aAAA;EAMqB;AAGhC;;;;EAHgC,SAArB,qBAAA;AAAA;AAAA,UAGM,sBAAA;EAAA,SACN,MAAA,EAAQ,cAAA,CAAe,UAAA;EAAA,SACvB,SAAA;EAAA,SACA,UAAA,GACP,UAAA,UACA,KAAA,EAAO,UAAA,cACK,OAAA,WAAkB,MAAA,CAAO,MAAA,SAAe,WAAA;EAAA,SAC7C,cAAA,GACP,QAAA,UACA,KAAA,EAAO,aAAA,CAAc,aAAA,aACX,OAAA,SAAgB,MAAA,CAAO,MAAA,OAAa,WAAA;EAAA,SACvC,QAAA;IACH,QAAA;EAAA,IACF,OAAA;IAAU,QAAA;EAAA,KACV,MAAA,CAAO,MAAA;IAAS,QAAA;EAAA,GAAoB,WAAA;EAAA,SAC/B,uBAAA,SACL,aAAA,CAAc,aAAA,IACd,OAAA,CAAQ,aAAA,CAAc,aAAA,KACtB,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,aAAA,GAAgB,WAAA;EADtB;;;;;;;;;;;;EAAA,SAcjB,UAAA,GAAa,WAAA;EA2CG;;;;;;;;;;;;;;;;EAAA,SA1BhB,gBAAA,kBAEL,OAAA,WACA,MAAA,CAAO,MAAA,SAAe,WAAA;EA3CxB;;;;;;;;;;;;;;;;;;;EAAA,SA+DO,gBAAA;EAAA,SACA,cAAA;EAAA,SACA,MAAA,GAAS,WAAA;EAAA,SACT,aAAA,GAAgB,QAAA,CAAS,QAAA,UAAkB,eAAA;EAAA,SAC3C,cAAA,GAAiB,oBAAA;AAAA;;;KChHhB,YAAA,GAAe,eAAA;AAAA,UAGV,QAAA;EAAA,SACN,aAAA;EAAA,SACA,UAAA,EAAY,MAAA,CAAO,MAAA;AAAA;AAAA,UAGb,sBAAA,SAA+B,sBAAA;EAAA,SACrC,UAAA;EAAA,SACA,QAAA,GAAW,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA;AAAA,cAMnC,eAAA;EAAA,UACF,sBAAA;IAET,MAAA,EAAQ,cAAA,CAAe,WAAA;IACvB,MAAA,EAAQ,OAAA,CAAQ,YAAA;IAChB,WAAA,SAAoB,OAAA,CAAQ,QAAA;MAAe,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,QAAA;IAAA;IACjE,QAAA,EAAU,OAAA;IACV,WAAA,EAAa,OAAA,CAAQ,WAAA;EAAA"}
|