@wlindabla/file_uploader 1.0.0 → 2.0.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/README.md +54 -28
- package/dist/cjs/cache/index.d.ts +198 -0
- package/dist/cjs/cache/index.js +318 -0
- package/dist/cjs/cache/index.js.map +1 -0
- package/dist/cjs/core/index.d.ts +271 -0
- package/dist/cjs/core/index.js +762 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/events/chunk/index.d.ts +27 -0
- package/dist/cjs/events/chunk/index.js +70 -0
- package/dist/cjs/events/chunk/index.js.map +1 -0
- package/dist/cjs/events/complete/index.d.ts +64 -0
- package/dist/cjs/events/complete/index.js +152 -0
- package/dist/cjs/events/complete/index.js.map +1 -0
- package/dist/cjs/events/index.d.ts +95 -0
- package/dist/cjs/events/index.js +85 -0
- package/dist/cjs/events/index.js.map +1 -0
- package/dist/cjs/events/initialize/index.d.ts +45 -0
- package/dist/cjs/events/initialize/index.js +105 -0
- package/dist/cjs/events/initialize/index.js.map +1 -0
- package/dist/cjs/events/state/index.d.ts +67 -0
- package/dist/cjs/events/state/index.js +145 -0
- package/dist/cjs/events/state/index.js.map +1 -0
- package/dist/cjs/exceptions/index.d.ts +84 -0
- package/dist/{exceptions → cjs/exceptions}/index.js +38 -18
- package/dist/cjs/exceptions/index.js.map +1 -0
- package/dist/cjs/index.d.ts +14 -0
- package/dist/cjs/index.js +33 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/subscribers/index.d.ts +34 -0
- package/dist/cjs/subscribers/index.js +187 -0
- package/dist/cjs/subscribers/index.js.map +1 -0
- package/dist/cjs/types/index.d.ts +110 -0
- package/dist/cjs/types/index.js +53 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/utils/index.d.ts +72 -0
- package/dist/cjs/utils/index.js +208 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/esm/cache/index.d.mts +198 -0
- package/dist/esm/cache/index.js +4 -0
- package/dist/{index.js.map → esm/cache/index.js.map} +1 -1
- package/dist/{events/initialize/index.js → esm/chunk-3JTTZCSQ.js} +25 -19
- package/dist/esm/chunk-3JTTZCSQ.js.map +1 -0
- package/dist/{events/state/index.js → esm/chunk-6225YMFE.js} +38 -20
- package/dist/esm/chunk-6225YMFE.js.map +1 -0
- package/dist/esm/chunk-7QVYU63E.js +6 -0
- package/dist/esm/chunk-7QVYU63E.js.map +1 -0
- package/dist/{events/complete/index.js → esm/chunk-BNMI7DW3.js} +25 -19
- package/dist/esm/chunk-BNMI7DW3.js.map +1 -0
- package/dist/{subscribers/index.js → esm/chunk-HYNJBWW5.js} +36 -34
- package/dist/esm/chunk-HYNJBWW5.js.map +1 -0
- package/dist/{events/index.js → esm/chunk-JDL3U4OX.js} +7 -37
- package/dist/esm/chunk-JDL3U4OX.js.map +1 -0
- package/dist/{events/chunk/index.js → esm/chunk-LD2DWZRJ.js} +14 -11
- package/dist/esm/chunk-LD2DWZRJ.js.map +1 -0
- package/dist/{utils/index.js → esm/chunk-MFYC4PBP.js} +15 -22
- package/dist/esm/chunk-MFYC4PBP.js.map +1 -0
- package/dist/esm/chunk-NXYS73I4.js +125 -0
- package/dist/esm/chunk-NXYS73I4.js.map +1 -0
- package/dist/{cache/index.js → esm/chunk-PFALORWQ.js} +10 -11
- package/dist/esm/chunk-PFALORWQ.js.map +1 -0
- package/dist/{core/index.js → esm/chunk-TONVXBLH.js} +239 -231
- package/dist/esm/chunk-TONVXBLH.js.map +1 -0
- package/dist/{types/index.js → esm/chunk-X757PBC5.js} +5 -7
- package/dist/esm/chunk-X757PBC5.js.map +1 -0
- package/dist/esm/core/index.d.mts +271 -0
- package/dist/esm/core/index.js +12 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/events/chunk/index.d.mts +27 -0
- package/dist/esm/events/chunk/index.js +4 -0
- package/dist/esm/events/chunk/index.js.map +1 -0
- package/dist/esm/events/complete/index.d.mts +64 -0
- package/dist/esm/events/complete/index.js +4 -0
- package/dist/esm/events/complete/index.js.map +1 -0
- package/dist/esm/events/index.d.mts +95 -0
- package/dist/esm/events/index.js +8 -0
- package/dist/esm/events/index.js.map +1 -0
- package/dist/esm/events/initialize/index.d.mts +45 -0
- package/dist/esm/events/initialize/index.js +4 -0
- package/dist/esm/events/initialize/index.js.map +1 -0
- package/dist/esm/events/state/index.d.mts +67 -0
- package/dist/esm/events/state/index.js +4 -0
- package/dist/esm/events/state/index.js.map +1 -0
- package/dist/esm/exceptions/index.d.mts +84 -0
- package/dist/esm/exceptions/index.js +4 -0
- package/dist/esm/exceptions/index.js.map +1 -0
- package/dist/esm/index.d.mts +14 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/subscribers/index.d.mts +34 -0
- package/dist/esm/subscribers/index.js +10 -0
- package/dist/esm/subscribers/index.js.map +1 -0
- package/dist/esm/types/index.d.mts +110 -0
- package/dist/esm/types/index.js +4 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/utils/index.d.mts +72 -0
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/package.json +165 -14
- package/dist/cache/index.js.map +0 -1
- package/dist/core/index.js.map +0 -1
- package/dist/events/chunk/index.js.map +0 -1
- package/dist/events/complete/index.js.map +0 -1
- package/dist/events/index.js.map +0 -1
- package/dist/events/initialize/index.js.map +0 -1
- package/dist/events/state/index.js.map +0 -1
- package/dist/exceptions/index.js.map +0 -1
- package/dist/index.js +0 -49
- package/dist/subscribers/index.js.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/utils/index.js.map +0 -1
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
import { InitializeUploadFailureException } from './chunk-NXYS73I4.js';
|
|
2
|
+
import { HttpFileUploaderEvents } from './chunk-JDL3U4OX.js';
|
|
3
|
+
import { FinalizeUploadFailureEvent } from './chunk-BNMI7DW3.js';
|
|
4
|
+
import { InitializeUploadStartedEvent, InitializeUploadFailureEvent, InitializeUploadSuccessEvent } from './chunk-3JTTZCSQ.js';
|
|
5
|
+
import { __name } from './chunk-7QVYU63E.js';
|
|
6
|
+
import { safeFetch, HttpFetchError } from '@wlindabla/http_client/core';
|
|
2
7
|
|
|
3
|
-
var
|
|
4
|
-
var http_client = require('@wlindabla/http_client');
|
|
5
|
-
var exceptions = require('../exceptions');
|
|
6
|
-
|
|
7
|
-
var __defProp = Object.defineProperty;
|
|
8
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
9
|
-
class InitializeUploadSubscriber {
|
|
8
|
+
var InitializeUploadSubscriber = class {
|
|
10
9
|
constructor(eventDispatcher) {
|
|
11
10
|
this.eventDispatcher = eventDispatcher;
|
|
12
11
|
}
|
|
12
|
+
eventDispatcher;
|
|
13
13
|
static {
|
|
14
14
|
__name(this, "InitializeUploadSubscriber");
|
|
15
15
|
}
|
|
16
16
|
getSubscribedEvents() {
|
|
17
17
|
return {
|
|
18
|
-
[
|
|
18
|
+
[HttpFileUploaderEvents.INITIALIZE_UPLOAD]: { listener: "onInitializeUpload", priority: 100 }
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
@@ -29,15 +29,15 @@ class InitializeUploadSubscriber {
|
|
|
29
29
|
event.stopPropagation();
|
|
30
30
|
const initialzeUploadRequestOptions = event.initUploadOptions;
|
|
31
31
|
this.eventDispatcher.dispatch(
|
|
32
|
-
new
|
|
32
|
+
new InitializeUploadStartedEvent(
|
|
33
33
|
initialzeUploadRequestOptions.fileName,
|
|
34
34
|
initialzeUploadRequestOptions.fileSize,
|
|
35
35
|
initialzeUploadRequestOptions.fileHash
|
|
36
36
|
),
|
|
37
|
-
|
|
37
|
+
HttpFileUploaderEvents.INITIALIZE_UPLOAD_STARTED
|
|
38
38
|
);
|
|
39
39
|
try {
|
|
40
|
-
const response = await
|
|
40
|
+
const response = await safeFetch({
|
|
41
41
|
url: initialzeUploadRequestOptions.endpointInit,
|
|
42
42
|
methodSend: "POST",
|
|
43
43
|
headers: {
|
|
@@ -59,17 +59,17 @@ class InitializeUploadSubscriber {
|
|
|
59
59
|
const status = response.status;
|
|
60
60
|
if (response.failed) {
|
|
61
61
|
console.error(`Initialize upload failed (HTTP ${status}):`, response);
|
|
62
|
-
const errorUploadFailure = new
|
|
62
|
+
const errorUploadFailure = new InitializeUploadFailureException(
|
|
63
63
|
response,
|
|
64
64
|
`Server returned error: HTTP ${response.status}`
|
|
65
65
|
);
|
|
66
66
|
this.eventDispatcher.dispatch(
|
|
67
|
-
new
|
|
67
|
+
new InitializeUploadFailureEvent(
|
|
68
68
|
errorUploadFailure,
|
|
69
69
|
status,
|
|
70
70
|
response.data
|
|
71
71
|
),
|
|
72
|
-
|
|
72
|
+
HttpFileUploaderEvents.INITIALIZE_UPLOAD_FAILURE
|
|
73
73
|
);
|
|
74
74
|
throw errorUploadFailure;
|
|
75
75
|
}
|
|
@@ -77,39 +77,41 @@ class InitializeUploadSubscriber {
|
|
|
77
77
|
if (!responseData || typeof responseData !== "object") {
|
|
78
78
|
const validationError = "Invalid server response: expected object, got " + typeof responseData;
|
|
79
79
|
console.error("Invalid response structure:", responseData);
|
|
80
|
-
|
|
80
|
+
const err = new InitializeUploadFailureException(
|
|
81
81
|
responseData,
|
|
82
82
|
validationError
|
|
83
83
|
);
|
|
84
|
+
throw err;
|
|
84
85
|
}
|
|
85
86
|
let sessionId = responseData.mediaId || responseData.mediaIdFromServer || responseData.sessionId || responseData.uploadId;
|
|
86
87
|
if (!sessionId) {
|
|
87
88
|
const missingKeyError = 'Server response missing required field: "mediaId","mediaIdFromServer", "sessionId", or "uploadId"';
|
|
88
89
|
console.error("Missing session ID in response:", responseData);
|
|
89
|
-
|
|
90
|
+
const err = new InitializeUploadFailureException(
|
|
90
91
|
responseData,
|
|
91
92
|
missingKeyError
|
|
92
93
|
);
|
|
94
|
+
throw err;
|
|
93
95
|
}
|
|
94
96
|
if (typeof sessionId === "number") {
|
|
95
97
|
sessionId = sessionId.toString();
|
|
96
98
|
}
|
|
97
99
|
event.setMediaId(sessionId);
|
|
98
100
|
this.eventDispatcher.dispatch(
|
|
99
|
-
new
|
|
101
|
+
new InitializeUploadSuccessEvent(
|
|
100
102
|
status,
|
|
101
103
|
sessionId,
|
|
102
104
|
responseData
|
|
103
105
|
),
|
|
104
|
-
|
|
106
|
+
HttpFileUploaderEvents.INITIALIZE_UPLOAD_SUCCESS
|
|
105
107
|
);
|
|
106
108
|
} catch (error) {
|
|
107
|
-
if (error instanceof
|
|
109
|
+
if (error instanceof HttpFetchError) {
|
|
108
110
|
this.eventDispatcher.dispatch(
|
|
109
|
-
new
|
|
111
|
+
new InitializeUploadFailureEvent(
|
|
110
112
|
error instanceof Error ? error : new Error(String(error))
|
|
111
113
|
),
|
|
112
|
-
|
|
114
|
+
HttpFileUploaderEvents.INITIALIZE_UPLOAD_FAILURE
|
|
113
115
|
);
|
|
114
116
|
return;
|
|
115
117
|
}
|
|
@@ -117,23 +119,24 @@ class InitializeUploadSubscriber {
|
|
|
117
119
|
throw error;
|
|
118
120
|
}
|
|
119
121
|
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
+
};
|
|
123
|
+
var FinalizeUploadSubscriber = class {
|
|
122
124
|
constructor(eventDispatcher) {
|
|
123
125
|
this.eventDispatcher = eventDispatcher;
|
|
124
126
|
}
|
|
127
|
+
eventDispatcher;
|
|
125
128
|
static {
|
|
126
129
|
__name(this, "FinalizeUploadSubscriber");
|
|
127
130
|
}
|
|
128
131
|
getSubscribedEvents() {
|
|
129
132
|
return {
|
|
130
|
-
[
|
|
133
|
+
[HttpFileUploaderEvents.FINALIZE_UPLOAD]: { listener: "onFinalizeUpload", priority: 100 }
|
|
131
134
|
};
|
|
132
135
|
}
|
|
133
136
|
async onFinalizeUpload(event) {
|
|
134
137
|
event.stopPropagation();
|
|
135
138
|
try {
|
|
136
|
-
const responseFinalizeUpload = await
|
|
139
|
+
const responseFinalizeUpload = await safeFetch({
|
|
137
140
|
url: event.endPoint,
|
|
138
141
|
methodSend: "POST",
|
|
139
142
|
headers: {
|
|
@@ -144,19 +147,18 @@ class FinalizeUploadSubscriber {
|
|
|
144
147
|
});
|
|
145
148
|
event.setResponse(responseFinalizeUpload);
|
|
146
149
|
} catch (error) {
|
|
147
|
-
if (error instanceof
|
|
150
|
+
if (error instanceof HttpFetchError) {
|
|
148
151
|
this.eventDispatcher.dispatch(
|
|
149
|
-
new
|
|
150
|
-
|
|
152
|
+
new FinalizeUploadFailureEvent(error),
|
|
153
|
+
HttpFileUploaderEvents.FINALIZE_UPLOAD_FAILURE
|
|
151
154
|
);
|
|
152
155
|
return;
|
|
153
156
|
}
|
|
154
157
|
throw error;
|
|
155
158
|
}
|
|
156
159
|
}
|
|
157
|
-
}
|
|
160
|
+
};
|
|
158
161
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
//# sourceMappingURL=
|
|
162
|
-
//# sourceMappingURL=index.js.map
|
|
162
|
+
export { FinalizeUploadSubscriber, InitializeUploadSubscriber };
|
|
163
|
+
//# sourceMappingURL=chunk-HYNJBWW5.js.map
|
|
164
|
+
//# sourceMappingURL=chunk-HYNJBWW5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/subscribers/index.ts"],"names":[],"mappings":"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","file":"chunk-HYNJBWW5.js","sourcesContent":["/*\n * This file is part of the project by AGBOKOUDJO Franck.\n *\n * (c) AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * Phone: +229 0167 25 18 86\n * LinkedIn: https://www.linkedin.com/in/internationales-web-apps-services-120520193/\n * Company: INTERNATIONALES WEB APPS & SERVICES\n *\n * For more information, please feel free to contact the author.\n */\n\nimport {\n EventSubscriberInterface,\n EventDispatcherInterface\n} from \"@wlindabla/event_dispatcher\";\n\nimport {\n HttpFileUploaderEvents,\n InitializingUploadEvent,\n InitializeUploadStartedEvent,\n InitializeUploadSuccessEvent,\n InitializeUploadFailureEvent,\n FinalizeUploadEvent,\n FinalizeUploadFailureEvent\n} from \"../events\";\n\nimport {\n HttpFetchError,\n safeFetch\n} from \"@wlindabla/http_client/core\";\n\nimport { InitializeUploadResponse } from \"../types\";\n\nimport { InitializeUploadFailureException } from \"../exceptions\";\n\nexport class InitializeUploadSubscriber implements EventSubscriberInterface {\n constructor(private readonly eventDispatcher: EventDispatcherInterface) {}\n\n public getSubscribedEvents(): Record<string, string | { listener: string; priority?: number | undefined; }> {\n return {\n [HttpFileUploaderEvents.INITIALIZE_UPLOAD]: { listener: \"onInitializeUpload\", priority: 100}\n }\n }\n\n /**\n * Initializes upload session with the server.\n * \n * @param fileHash - SHA-256 hash of the file (first 1MB)\n * @returns Session ID from server, or null if initialization failed\n * @throws {FileUploadInitializationError} If server returns error or network fails\n */\n public async onInitializeUpload(event:InitializingUploadEvent):Promise<void>{\n event.stopPropagation();\n const initialzeUploadRequestOptions = event.initUploadOptions;\n\n this.eventDispatcher.dispatch(\n new InitializeUploadStartedEvent(\n initialzeUploadRequestOptions.fileName,\n initialzeUploadRequestOptions.fileSize,\n initialzeUploadRequestOptions.fileHash\n ),\n HttpFileUploaderEvents.INITIALIZE_UPLOAD_STARTED\n );\n \n try {\n const response = await safeFetch({\n url:initialzeUploadRequestOptions.endpointInit,\n methodSend: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...initialzeUploadRequestOptions.headers\n },\n data: {\n fileName:initialzeUploadRequestOptions.fileName,\n fileSize:initialzeUploadRequestOptions.fileSize,\n fileHash:initialzeUploadRequestOptions.fileHash,\n fileType: initialzeUploadRequestOptions.fileType,\n metadata: initialzeUploadRequestOptions.metadata,\n },\n responseType: \"json\",\n retryCount: 3,\n retryOnStatusCode: true,\n timeout: 45000\n });\n\n const status = response.status;\n \n // Handle error responses (4xx, 5xx)\n if (response.failed) {\n console.error(`Initialize upload failed (HTTP ${status}):`, response);\n\n const errorUploadFailure =new InitializeUploadFailureException(\n response,\n `Server returned error: HTTP ${response.status}`\n );\n\n this.eventDispatcher.dispatch(\n new InitializeUploadFailureEvent(\n errorUploadFailure,\n status,\n response.data),\n HttpFileUploaderEvents.INITIALIZE_UPLOAD_FAILURE\n\n );\n \n throw errorUploadFailure;\n }\n\n const responseData = response.data as InitializeUploadResponse;\n\n // Validate server response struct\n if (!responseData || typeof responseData !== 'object') {\n const validationError = 'Invalid server response: expected object, got ' + typeof responseData\n console.error('Invalid response structure:', responseData);\n\n const err=new InitializeUploadFailureException(\n responseData,\n validationError\n );\n throw err;\n }\n // Extract session ID\n let sessionId =\n responseData.mediaId ||\n responseData.mediaIdFromServer ||\n responseData.sessionId ||\n responseData.uploadId;\n\n if (!sessionId) {\n const missingKeyError = 'Server response missing required field: \"mediaId\",\"mediaIdFromServer\", \"sessionId\", or \"uploadId\"';\n\n console.error('Missing session ID in response:', responseData);\n const err=new InitializeUploadFailureException(\n responseData,\n missingKeyError\n );\n throw err;\n }\n\n if (typeof sessionId === \"number\") { sessionId = sessionId.toString(); }\n\n event.setMediaId(sessionId);\n\n this.eventDispatcher.dispatch(\n new InitializeUploadSuccessEvent(\n status,\n sessionId,\n responseData\n ),\n HttpFileUploaderEvents.INITIALIZE_UPLOAD_SUCCESS\n );\n\n } catch (error) {\n if (error instanceof HttpFetchError) {\n this.eventDispatcher.dispatch(\n new InitializeUploadFailureEvent(\n error instanceof Error ? error : new Error(String(error)),\n ),\n HttpFileUploaderEvents.INITIALIZE_UPLOAD_FAILURE\n );\n return;\n }\n console.error('Initialize upload exception:', error);\n\n throw error;\n }\n }\n}\n\nexport class FinalizeUploadSubscriber implements EventSubscriberInterface{\n\n constructor(private readonly eventDispatcher: EventDispatcherInterface) {}\n\n public getSubscribedEvents(): Record<string, string | { listener: string; priority?: number | undefined; }> {\n return {\n [HttpFileUploaderEvents.FINALIZE_UPLOAD]: { listener: \"onFinalizeUpload\", priority: 100 }\n }\n }\n\n public async onFinalizeUpload(event: FinalizeUploadEvent): Promise<void>{\n event.stopPropagation();\n try {\n const responseFinalizeUpload = await safeFetch({\n url: event.endPoint,\n methodSend: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...event.headers\n },\n data: { mediaId: event.mediaId, mediaHash: event.mediaHash }\n });\n\n event.setResponse(responseFinalizeUpload)\n } catch (error) {\n if (error instanceof HttpFetchError) {\n this.eventDispatcher.dispatch(\n new FinalizeUploadFailureEvent(error),\n HttpFileUploaderEvents.FINALIZE_UPLOAD_FAILURE\n );\n return;\n }\n\n throw error;\n }\n }\n}"]}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { __name } from './chunk-7QVYU63E.js';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
var chunk = require('./chunk');
|
|
6
|
-
var complete = require('./complete');
|
|
7
|
-
|
|
8
|
-
var __defProp = Object.defineProperty;
|
|
9
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
10
|
-
class HttpFileUploaderEvents {
|
|
3
|
+
// src/events/index.ts
|
|
4
|
+
var HttpFileUploaderEvents = class {
|
|
11
5
|
static {
|
|
12
6
|
__name(this, "HttpFileUploaderEvents");
|
|
13
7
|
}
|
|
@@ -53,32 +47,8 @@ class HttpFileUploaderEvents {
|
|
|
53
47
|
constructor() {
|
|
54
48
|
throw new Error("HttpFileUploaderEvents is an abstract class and cannot be instantiated");
|
|
55
49
|
}
|
|
56
|
-
}
|
|
50
|
+
};
|
|
57
51
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
enumerable: true,
|
|
62
|
-
get: function () { return initialize[k]; }
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
Object.keys(state).forEach(function (k) {
|
|
66
|
-
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
67
|
-
enumerable: true,
|
|
68
|
-
get: function () { return state[k]; }
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
Object.keys(chunk).forEach(function (k) {
|
|
72
|
-
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
73
|
-
enumerable: true,
|
|
74
|
-
get: function () { return chunk[k]; }
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
Object.keys(complete).forEach(function (k) {
|
|
78
|
-
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
79
|
-
enumerable: true,
|
|
80
|
-
get: function () { return complete[k]; }
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
//# sourceMappingURL=index.js.map
|
|
84
|
-
//# sourceMappingURL=index.js.map
|
|
52
|
+
export { HttpFileUploaderEvents };
|
|
53
|
+
//# sourceMappingURL=chunk-JDL3U4OX.js.map
|
|
54
|
+
//# sourceMappingURL=chunk-JDL3U4OX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/events/index.ts"],"names":[],"mappings":";;;AAqDO,IAAe,yBAAf,MAAsC;AAAA,EArD7C;AAqD6C,IAAA,MAAA,CAAA,IAAA,EAAA,wBAAA,CAAA;AAAA;AAAA,EAEzC,OAAgB,iBAAA,GAAoB,oBAAA;AAAA;AAAA,EAGpC,OAAgB,yBAAA,GAA4B,yBAAA;AAAA;AAAA,EAG5C,OAAgB,yBAAA,GAA4B,yBAAA;AAAA;AAAA,EAG5C,OAAgB,yBAAA,GAA4B,yBAAA;AAAA;AAAA,EAG5C,OAAgB,0BAAA,GAA6B,yBAAA;AAAA;AAAA,EAG7C,OAAgB,0BAAA,GAA6B,yBAAA;AAAA;AAAA,EAG7C,OAAgB,yBAAA,GAA4B,wBAAA;AAAA;AAAA,EAG5C,OAAgB,sCAAA,GAAyC,mCAAA;AAAA;AAAA,EAGzD,OAAgB,yBAAA,GAA4B,wBAAA;AAAA;AAAA,EAG5C,OAAgB,kCAAA,GAAqC,gCAAA;AAAA;AAAA,EAGrD,OAAgB,yBAAA,GAA4B,wBAAA;AAAA;AAAA,EAG5C,OAAgB,aAAA,GAAgB,cAAA;AAAA;AAAA,EAGhC,OAAgB,cAAA,GAAiB,eAAA;AAAA;AAAA,EAGjC,OAAgB,gBAAA,GAAmB,iBAAA;AAAA;AAAA,EAGnC,OAAgB,oBAAA,GAAuB,oBAAA;AAAA;AAAA,EAGvC,OAAgB,uBAAA,GAA0B,uBAAA;AAAA;AAAA,EAG1C,OAAgB,sBAAA,GAAyB,sBAAA;AAAA;AAAA,EAGzC,OAAgB,qBAAA,GAAwB,qBAAA;AAAA,EAExC,OAAgB,eAAA,GAAkB,gBAAA;AAAA,EAElC,OAAgB,uBAAA,GAA0B,uBAAA;AAAA;AAAA,EAG1C,OAAgB,2BAAA,GAA8B,0BAAA;AAAA,EAEtC,WAAA,GAAc;AAElB,IAAA,MAAM,IAAI,MAAM,wEAAwE,CAAA;AAAA,EAC5F;AACJ","file":"chunk-JDL3U4OX.js","sourcesContent":["/*\n * This file is part of the project by AGBOKOUDJO Franck.\n *\n * (c) AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * Phone: +229 0167 25 18 86\n * LinkedIn: https://www.linkedin.com/in/internationales-web-apps-services-120520193/\n * Company: INTERNATIONALES WEB APPS & SERVICES\n *\n * For more information, please feel free to contact the author.\n */\n\n/**\n * HttpFileUploaderEvents - Event Constants for File Upload Operations\n * \n * This abstract class provides a centralized collection of event name constants\n * used throughout the file upload lifecycle. It follows the Symfony event\n * dispatcher pattern, providing a type-safe way to reference events.\n * \n * The events are organized into five categories:\n * - **Initialize Events**: Events related to upload session initialization\n * - **Chunk Upload Events**: Events fired during individual chunk uploads\n * - **Upload State Events**: Events tracking upload state changes (pause, resume, cancel)\n * - **Completion Events**: Events fired when upload completes or fails\n * - **Metadata Events**: Events related to media metadata operations\n * \n * @example\n * ```typescript\n * import { HttpFileUploaderEvents } from '@wlindabla/file_uploader';\n * \n * // Listen to chunk upload success\n * dispatcher.addListener(\n * HttpFileUploaderEvents.MEDIA_CHUNK_UPLOAD_SUCCESS,\n * (event: ChunkUploadSuccessEvent) => {\n * console.log('Chunk uploaded:', event.progress);\n * }\n * );\n * \n * // Listen to upload state changes\n * dispatcher.addListener(\n * HttpFileUploaderEvents.UPLOAD_STATE_CHANGED,\n * (event: UploadStateChangedEvent) => {\n * console.log(`State changed: ${event.oldState} → ${event.newState}`);\n * }\n * );\n * ```\n * \n * @author AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * @version 1.0.0\n * @since 1.0.0\n * \n * @see {@link https://github.com/Agbokoudjo/file_uploader | GitHub Repository}\n * @see {@link EventDispatcherInterface} for event dispatcher usage\n */\nexport abstract class HttpFileUploaderEvents {\n\n static readonly INITIALIZE_UPLOAD = \"initializingUpload\"\n \n /** Dispatched when upload initialization starts */\n static readonly INITIALIZE_UPLOAD_STARTED = \"initializeUploadStarted\";\n\n /** Dispatched when upload initialization succeeds */\n static readonly INITIALIZE_UPLOAD_SUCCESS = \"initializeUploadSuccess\";\n\n /** Dispatched when upload initialization fails */\n static readonly INITIALIZE_UPLOAD_FAILURE = \"initializeUploadFailure\";\n\n /** Dispatched when a chunk upload starts */\n static readonly MEDIA_CHUNK_UPLOAD_STARTED = \"mediaChunkUploadStarted\";\n\n /** Dispatched when a chunk is uploaded successfully */\n static readonly MEDIA_CHUNK_UPLOAD_SUCCESS = \"mediaChunkUploadSuccess\";\n\n /** Dispatched when a chunk upload fails */\n static readonly MEDIA_CHUNK_UPLOAD_FAILED = \"mediaChunkUploadFailed\";\n\n /** Dispatched when the server returns an HTTP error for a chunk */\n static readonly MEDIA_CHUNK_UPLOAD_HTTP_ERROR_RESPONSE = \"mediaChunkUploadHttpErrorResponse\";\n\n /** Dispatched to provide the status of a chunk */\n static readonly MEDIA_CHUNK_UPLOAD_STATUS = \"mediaChunkUploadStatus\";\n\n /** Dispatched when maximum retry attempts are exceeded for a chunk */\n static readonly MEDIA_CHUNK_UPLOAD_MAXRETRY_EXPIRE = \"mediaChunkUploadMaxRetryExpire\";\n\n /** Dispatched when a chunk upload resumes */\n static readonly MEDIA_CHUNK_UPLOAD_RESUME = \"mediaChunkUploadResume\";\n\n /** Dispatched when the upload is paused */\n static readonly UPLOAD_PAUSED = \"uploadPaused\";\n\n /** Dispatched when the upload resumes after being paused */\n static readonly UPLOAD_RESUMED = \"uploadResumed\";\n\n /** Dispatched when the upload is cancelled */\n static readonly UPLOAD_CANCELLED = \"uploadCancelled\";\n\n /** Dispatched when the upload state changes */\n static readonly UPLOAD_STATE_CHANGED = \"uploadStateChanged\";\n\n /** Dispatched when the upload completes successfully */\n static readonly DOWNLOAD_MEDIA_COMPLETE = \"downloadMediaComplete\";\n\n /** Dispatched when the upload fails completely */\n static readonly DOWNLOAD_MEDIA_FAILURE = \"downloadMediaFailure\";\n\n /** Dispatched when the upload resumes from a saved state */\n static readonly DOWNLOAD_MEDIA_RESUME = \"downloadMediaResume\";\n\n static readonly FINALIZE_UPLOAD = \"finalizeUpload\";\n\n static readonly FINALIZE_UPLOAD_FAILURE = \"finalizeUploadFailure\";\n\n /** Dispatched when media metadata is saved successfully */\n static readonly MEDIA_METADATA_SAVE_SUCCESS = \"mediaMetadataSaveSuccess\";\n\n private constructor() {\n // This class cannot be instantiated\n throw new Error('HttpFileUploaderEvents is an abstract class and cannot be instantiated');\n }\n}\n\nexport * from \"./initialize\"\nexport * from \"./state\";\nexport * from \"./chunk\";\nexport * from \"./complete\";"]}
|
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
|
|
1
|
+
import { __name } from './chunk-7QVYU63E.js';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
class ChunkUploadHttpErrorResponseEvent {
|
|
3
|
+
// src/events/chunk/index.ts
|
|
4
|
+
var ChunkUploadHttpErrorResponseEvent = class {
|
|
6
5
|
constructor(errorPayload, statusResponse, urlEndpoint, chunkInfo) {
|
|
7
6
|
this.errorPayload = errorPayload;
|
|
8
7
|
this.statusResponse = statusResponse;
|
|
9
8
|
this.urlEndpoint = urlEndpoint;
|
|
10
9
|
this.chunkInfo = chunkInfo;
|
|
11
10
|
}
|
|
11
|
+
errorPayload;
|
|
12
|
+
statusResponse;
|
|
13
|
+
urlEndpoint;
|
|
14
|
+
chunkInfo;
|
|
12
15
|
static {
|
|
13
16
|
__name(this, "ChunkUploadHttpErrorResponseEvent");
|
|
14
17
|
}
|
|
15
18
|
get chunkIndex() {
|
|
16
19
|
return this.chunkInfo.index;
|
|
17
20
|
}
|
|
18
|
-
}
|
|
19
|
-
|
|
21
|
+
};
|
|
22
|
+
var UploadChunkStartedEvent = class {
|
|
20
23
|
constructor(_chunkInfo) {
|
|
21
24
|
this._chunkInfo = _chunkInfo;
|
|
22
25
|
}
|
|
26
|
+
_chunkInfo;
|
|
23
27
|
static {
|
|
24
28
|
__name(this, "UploadChunkStartedEvent");
|
|
25
29
|
}
|
|
@@ -35,9 +39,8 @@ class UploadChunkStartedEvent {
|
|
|
35
39
|
get chunkIndex() {
|
|
36
40
|
return this._chunkInfo.index;
|
|
37
41
|
}
|
|
38
|
-
}
|
|
42
|
+
};
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
//# sourceMappingURL=
|
|
43
|
-
//# sourceMappingURL=index.js.map
|
|
44
|
+
export { ChunkUploadHttpErrorResponseEvent, UploadChunkStartedEvent };
|
|
45
|
+
//# sourceMappingURL=chunk-LD2DWZRJ.js.map
|
|
46
|
+
//# sourceMappingURL=chunk-LD2DWZRJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/events/chunk/index.ts"],"names":[],"mappings":";;;AAeO,IAAM,oCAAN,MAAwC;AAAA,EAC3C,WAAA,CACoB,YAAA,EACA,cAAA,EACA,WAAA,EACA,SAAA,EAClB;AAJkB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAChB;AAAA,EAJgB,YAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EApBxB;AAe+C,IAAA,MAAA,CAAA,IAAA,EAAA,mCAAA,CAAA;AAAA;AAAA,EAQ3C,IAAW,UAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,SAAA,CAAU,KAAA;AAAA,EAAO;AACnE;AAKO,IAAM,0BAAN,MAA8B;AAAA,EACjC,YAA6B,UAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAAyB;AAAA,EAAzB,UAAA;AAAA,EA9BjC;AA6BqC,IAAA,MAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;AAAA;AAAA,EAGjC,IAAW,KAAA,GAAgB;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,KAAA;AAAA,EAAO;AAAA,EAE3D,IAAW,GAAA,GAAc;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,GAAA;AAAA,EAAK;AAAA,EAEvD,IAAW,YAAA,GAA6B;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,MAAA;AAAA,EAAQ;AAAA,EAEzE,IAAW,UAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,UAAA,CAAW,KAAA;AAAA,EAAO;AACpE","file":"chunk-LD2DWZRJ.js","sourcesContent":["/*\n * This file is part of the project by AGBOKOUDJO Franck.\n *\n * (c) AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * Phone: +229 0167 25 18 86\n * LinkedIn: https://www.linkedin.com/in/internationales-web-apps-services-120520193/\n * Company: INTERNATIONALES WEB APPS & SERVICES\n *\n * For more information, please feel free to contact the author.\n */\nimport { ChunkInfo, UploadStatus } from \"../../types\";\n\n/**\n * Event data for MEDIA_CHUNK_UPLOAD_HTTP_ERROR_RESPONSE\n */\nexport class ChunkUploadHttpErrorResponseEvent {\n constructor(\n public readonly errorPayload: string | Record<string, string | unknown> | unknown,\n public readonly statusResponse: number,\n public readonly urlEndpoint: string | URL | Request,\n public readonly chunkInfo: ChunkInfo\n ) { }\n\n public get chunkIndex(): number { return this.chunkInfo.index; }\n}\n\n/**\n * Event data for MEDIA_CHUNK_UPLOAD_STARTED\n */\nexport class UploadChunkStartedEvent {\n constructor(private readonly _chunkInfo: ChunkInfo) { }\n\n public get start(): number { return this._chunkInfo.start; }\n\n public get end(): number { return this._chunkInfo.end; }\n\n public get uploadStatus(): UploadStatus { return this._chunkInfo.status; }\n\n public get chunkIndex(): number { return this._chunkInfo.index; }\n}"]}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { DEFAULT_CONFIG } from './chunk-X757PBC5.js';
|
|
2
|
+
import { __name } from './chunk-7QVYU63E.js';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var __defProp = Object.defineProperty;
|
|
6
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
-
class FileUtils {
|
|
4
|
+
// src/utils/index.ts
|
|
5
|
+
var FileUtils = class {
|
|
8
6
|
static {
|
|
9
7
|
__name(this, "FileUtils");
|
|
10
8
|
}
|
|
@@ -31,7 +29,7 @@ class FileUtils {
|
|
|
31
29
|
if (minutes > 0) return `${minutes}m ${secs}s`;
|
|
32
30
|
return `${secs}s`;
|
|
33
31
|
}
|
|
34
|
-
static calculateChunkSize(fileSize, speedMbps, config =
|
|
32
|
+
static calculateChunkSize(fileSize, speedMbps, config = DEFAULT_CONFIG) {
|
|
35
33
|
const fileSizeMB = fileSize / this.MB;
|
|
36
34
|
if (speedMbps && speedMbps < config.slowSpeedThresholdMbps) {
|
|
37
35
|
return Math.min(
|
|
@@ -64,7 +62,7 @@ class FileUtils {
|
|
|
64
62
|
reader.readAsArrayBuffer(file.slice(0, 1024 * 1024));
|
|
65
63
|
});
|
|
66
64
|
}
|
|
67
|
-
}
|
|
65
|
+
};
|
|
68
66
|
function updateProgressBarHTMLNotified(progress, media_id, filename, providerName = "LocalVideo") {
|
|
69
67
|
const progressBarId = `progress-bar-item_${providerName}_${media_id}`;
|
|
70
68
|
const progressBarContainer = document.querySelector(`#${progressBarId}`);
|
|
@@ -113,7 +111,7 @@ function createChunkFormData(chunk, options) {
|
|
|
113
111
|
return formData;
|
|
114
112
|
}
|
|
115
113
|
__name(createChunkFormData, "createChunkFormData");
|
|
116
|
-
|
|
114
|
+
var ChunkFormDataBuilder = class {
|
|
117
115
|
static {
|
|
118
116
|
__name(this, "ChunkFormDataBuilder");
|
|
119
117
|
}
|
|
@@ -149,8 +147,8 @@ class ChunkFormDataBuilder {
|
|
|
149
147
|
build() {
|
|
150
148
|
return this.formData;
|
|
151
149
|
}
|
|
152
|
-
}
|
|
153
|
-
|
|
150
|
+
};
|
|
151
|
+
var ExponentialBackoffStrategy = class {
|
|
154
152
|
static {
|
|
155
153
|
__name(this, "ExponentialBackoffStrategy");
|
|
156
154
|
}
|
|
@@ -160,8 +158,8 @@ class ExponentialBackoffStrategy {
|
|
|
160
158
|
getDelay(attempt) {
|
|
161
159
|
return Math.pow(2, attempt) * 1e3;
|
|
162
160
|
}
|
|
163
|
-
}
|
|
164
|
-
|
|
161
|
+
};
|
|
162
|
+
var LinearBackoffStrategy = class {
|
|
165
163
|
static {
|
|
166
164
|
__name(this, "LinearBackoffStrategy");
|
|
167
165
|
}
|
|
@@ -171,13 +169,8 @@ class LinearBackoffStrategy {
|
|
|
171
169
|
getDelay(attempt) {
|
|
172
170
|
return (attempt + 1) * 1e3;
|
|
173
171
|
}
|
|
174
|
-
}
|
|
172
|
+
};
|
|
175
173
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
exports.LinearBackoffStrategy = LinearBackoffStrategy;
|
|
180
|
-
exports.createChunkFormData = createChunkFormData;
|
|
181
|
-
exports.updateProgressBarHTMLNotified = updateProgressBarHTMLNotified;
|
|
182
|
-
//# sourceMappingURL=index.js.map
|
|
183
|
-
//# sourceMappingURL=index.js.map
|
|
174
|
+
export { ChunkFormDataBuilder, ExponentialBackoffStrategy, FileUtils, LinearBackoffStrategy, createChunkFormData, updateProgressBarHTMLNotified };
|
|
175
|
+
//# sourceMappingURL=chunk-MFYC4PBP.js.map
|
|
176
|
+
//# sourceMappingURL=chunk-MFYC4PBP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/index.ts"],"names":[],"mappings":"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","file":"chunk-MFYC4PBP.js","sourcesContent":["/*\n * This file is part of the project by AGBOKOUDJO Franck.\n *\n * (c) AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * Phone: +229 0167 25 18 86\n * LinkedIn: https://www.linkedin.com/in/internationales-web-apps-services-120520193/\n * Company: INTERNATIONALES WEB APPS & SERVICES\n *\n * For more information, please feel free to contact the author.\n */\nimport {\n ChunkSizeConfig,\n DEFAULT_CONFIG\n} from \"../types\";\n\nexport class FileUtils {\n static readonly MB = 1024 * 1024;\n static readonly GB = 1024 * 1024 * 1024;\n\n static bytesToMB(bytes: number): number {\n return parseFloat((bytes / this.MB).toFixed(2));\n }\n\n static bytesToGB(bytes: number): number {\n return parseFloat((bytes / this.GB).toFixed(2));\n }\n\n static formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n static formatDuration(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n\n if (hours > 0) return `${hours}h ${minutes}m ${secs}s`;\n if (minutes > 0) return `${minutes}m ${secs}s`;\n return `${secs}s`;\n }\n\n static calculateChunkSize(\n fileSize: number,\n speedMbps?: number,\n config: ChunkSizeConfig = DEFAULT_CONFIG\n ): number {\n const fileSizeMB = fileSize / this.MB;\n\n // Handle slow connections\n if (speedMbps && speedMbps < config.slowSpeedThresholdMbps) {\n return Math.min(\n config.defaultChunkSizeMB * this.MB,\n config.slowSpeedChunkSizeMB * this.MB\n );\n }\n\n // Adjust based on file size\n for (const threshold of config.fileSizeThresholds) {\n if (fileSizeMB <= threshold.maxSizeMB) {\n return threshold.chunkSizeMB * this.MB;\n }\n }\n\n return config.defaultChunkSizeMB * this.MB;\n }\n\n static generateFileHash(file: File|Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = async (e) => {\n try {\n const buffer = e.target?.result as ArrayBuffer;\n const hashBuffer = await crypto.subtle.digest('SHA-256', buffer.slice(0, 1024 * 1024));\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n resolve(hashHex);\n } catch (error) {\n reject(error);\n }\n };\n reader.onerror = reject;\n reader.readAsArrayBuffer(file.slice(0, 1024 * 1024)); // Hash first 1MB\n });\n }\n}\n\nexport function updateProgressBarHTMLNotified(\n progress: number,\n media_id: number,\n filename: string,\n providerName = \"LocalVideo\"\n): string {\n const progressBarId = `progress-bar-item_${providerName}_${media_id}`;\n // On cherche la barre de progression interne (celle qui a la classe .progress-bar)\n const progressBarContainer = document.querySelector(`#${progressBarId}`);\n const progressBarInner = progressBarContainer?.querySelector('.progress-bar') as HTMLElement;\n\n if (progressBarInner) {\n // Mise à jour du DOM existant\n const roundedProgress = Math.round(progress);\n progressBarInner.style.width = `${progress}%`;\n progressBarInner.setAttribute('aria-valuenow', progress.toString());\n progressBarInner.innerText = `${roundedProgress}%`;\n\n return progressBarContainer!.innerHTML;\n } else {\n // Génération du template initial\n return `\n <div id=\"${progressBarId}\" class=\"mb-2\" style=\"width:100%;\">\n <small class=\"control-label text-dark fw-bolder filename-label w-100 d-block text-truncate\" title=\"${filename}\">\n ${filename}\n </small>\n <div class=\"progress\">\n <div class=\"progress-bar bg-success progress-bar-striped progress-bar-animated\"\n role=\"progressbar\"\n style=\"width: ${progress}%;\"\n aria-valuenow=\"${progress}\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\">${Math.round(progress)}%</div>\n </div>\n </div>`;\n }\n}\n\n/**\n * Options for creating chunk FormData\n */\nexport interface ChunkFormDataOptions {\n chunkIndex: number;\n totalChunks: number;\n mediaId: string;\n fileName: string;\n fileSize: number;\n fileHash: string;\n metadata?: Record<string, string | Blob>;\n}\n\n/**\n * Creates FormData for uploading a single file chunk.\n * \n * @param chunk - The chunk blob to upload\n * @param options - Chunk upload options\n * @returns FormData ready to be sent to the server\n * \n * @example\n * ```typescript\n * const formData = createChunkFormData(blob, {\n * chunkIndex: 5,\n * totalChunks: 10,\n * mediaId: 'abc123',\n * fileName: 'video.mp4',\n * fileSize: 104857600,\n * fileHash: 'sha256...'\n * });\n * ```\n */\nexport function createChunkFormData(\n chunk: Blob,\n options: ChunkFormDataOptions\n): FormData {\n const formData = new FormData();\n\n // Chunk data\n formData.append('chunk', chunk);\n formData.append('chunkIndex', options.chunkIndex.toString());\n formData.append('chunkSize', chunk.size.toString());\n formData.append('totalChunks', options.totalChunks.toString());\n\n // File metadata\n formData.append('fileName', options.fileName);\n formData.append('fileSize', options.fileSize.toString());\n formData.append('fileHash', options.fileHash);\n\n // Media ID (returned by server after metadata registration)\n formData.append('mediaId', options.mediaId);\n\n // Optional additional data\n if (options.metadata) {\n for (const [key, value] of Object.entries(options.metadata)) {\n if (typeof value === 'string' || value instanceof Blob) {\n formData.append(key, value);\n }\n }\n }\n\n return formData;\n}\n\n/**\n * Builder pattern for creating chunk FormData with fluent API.\n */\nexport class ChunkFormDataBuilder {\n private formData: FormData ;\n\n constructor(chunk: Blob) {\n this.formData = new FormData();\n\n this.formData.append('chunk', chunk);\n this.formData.append('chunkSize', chunk.size.toString());\n }\n\n withChunkInfo(chunkIndex: number, totalChunks: number): this {\n this.formData.append('chunkIndex', chunkIndex.toString());\n this.formData.append('totalChunks', totalChunks.toString());\n return this;\n }\n\n withFileInfo(fileName: string, fileSize: number, fileHash: string): this {\n this.formData.append('fileName', fileName);\n this.formData.append('fileSize', fileSize.toString());\n this.formData.append('fileHash', fileHash);\n return this;\n }\n\n withSessionId(sessionId: string): this {\n this.formData.append('sessionId', sessionId);\n return this;\n }\n\n withMetadata(metadata: Record<string, string | Blob>): this {\n for (const [key, value] of Object.entries(metadata)) {\n if (typeof value === 'string' || value instanceof Blob) {\n this.formData.append(key, value);\n }\n }\n return this;\n }\n\n build(): FormData {\n return this.formData;\n }\n}\n\n// Stratégie de retry configurable\ninterface RetryStrategyInterface {\n shouldRetry(attempt: number, maxRetries: number, error: Error): boolean;\n getDelay(attempt: number): number;\n}\n\nexport class ExponentialBackoffStrategy implements RetryStrategyInterface {\n shouldRetry(attempt: number, maxRetries: number): boolean {\n return attempt < maxRetries;\n }\n\n getDelay(attempt: number): number {\n return Math.pow(2, attempt) * 1000;\n }\n}\n\nexport class LinearBackoffStrategy implements RetryStrategyInterface {\n shouldRetry(attempt: number, maxRetries: number): boolean {\n return attempt < maxRetries;\n }\n\n getDelay(attempt: number): number {\n return (attempt + 1) * 1000; // 1s, 2s, 3s...\n }\n}\n"]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { __name } from './chunk-7QVYU63E.js';
|
|
2
|
+
|
|
3
|
+
// src/exceptions/index.ts
|
|
4
|
+
var InitializeUploadFailureException = class _InitializeUploadFailureException extends Error {
|
|
5
|
+
constructor(responseData, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.responseData = responseData;
|
|
8
|
+
this.name = "InitializeUploadFailureException";
|
|
9
|
+
if (Error.captureStackTrace) {
|
|
10
|
+
Error.captureStackTrace(this, _InitializeUploadFailureException);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
responseData;
|
|
14
|
+
static {
|
|
15
|
+
__name(this, "InitializeUploadFailureException");
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var ChunkUploadHttpErrorException = class _ChunkUploadHttpErrorException extends Error {
|
|
19
|
+
constructor(errorPayload, statusResponse) {
|
|
20
|
+
super();
|
|
21
|
+
this.errorPayload = errorPayload;
|
|
22
|
+
this.statusResponse = statusResponse;
|
|
23
|
+
this.name = "ChunkUploadHttpErrorException";
|
|
24
|
+
if (Error.captureStackTrace) {
|
|
25
|
+
Error.captureStackTrace(this, _ChunkUploadHttpErrorException);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
errorPayload;
|
|
29
|
+
statusResponse;
|
|
30
|
+
static {
|
|
31
|
+
__name(this, "ChunkUploadHttpErrorException");
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var FileUploadChunkError = class _FileUploadChunkError extends Error {
|
|
35
|
+
static {
|
|
36
|
+
__name(this, "FileUploadChunkError");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The detailed chunk error information
|
|
40
|
+
*/
|
|
41
|
+
chunkError;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a new FileUploadChunkError
|
|
44
|
+
*
|
|
45
|
+
* @param message - Human-readable error message
|
|
46
|
+
* @param chunkError - Detailed information about the chunk failure
|
|
47
|
+
*/
|
|
48
|
+
constructor(message, chunkError) {
|
|
49
|
+
super(message, { cause: chunkError.error });
|
|
50
|
+
this.name = "FileUploadChunkError";
|
|
51
|
+
this.chunkError = chunkError;
|
|
52
|
+
if (Error.captureStackTrace) {
|
|
53
|
+
Error.captureStackTrace(this, _FileUploadChunkError);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Gets the index of the chunk that failed
|
|
58
|
+
*/
|
|
59
|
+
get chunkIndex() {
|
|
60
|
+
return this.chunkError.chunk.index;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Gets the attempt number when the chunk failed
|
|
64
|
+
*/
|
|
65
|
+
get attemptNumber() {
|
|
66
|
+
return this.chunkError.attempt;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Indicates whether a retry will be attempted
|
|
70
|
+
*/
|
|
71
|
+
get willRetry() {
|
|
72
|
+
return this.chunkError.willRetry;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Gets the underlying error that caused the chunk upload to fail
|
|
76
|
+
*/
|
|
77
|
+
get underlyingError() {
|
|
78
|
+
return this.chunkError.error;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Gets the full chunk information
|
|
82
|
+
*/
|
|
83
|
+
get chunk() {
|
|
84
|
+
return this.chunkError.chunk;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Returns a JSON representation of the error
|
|
88
|
+
*/
|
|
89
|
+
toJSON() {
|
|
90
|
+
return {
|
|
91
|
+
name: this.name,
|
|
92
|
+
message: this.message,
|
|
93
|
+
chunkIndex: this.chunkIndex,
|
|
94
|
+
attempt: this.attemptNumber,
|
|
95
|
+
willRetry: this.willRetry,
|
|
96
|
+
underlyingError: {
|
|
97
|
+
name: this.underlyingError.name,
|
|
98
|
+
message: this.underlyingError.message
|
|
99
|
+
},
|
|
100
|
+
stack: this.stack
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
var UploadCancelledException = class _UploadCancelledException extends Error {
|
|
105
|
+
constructor(chunkIndex, totalChunks, uploadedBytes, message) {
|
|
106
|
+
super(message);
|
|
107
|
+
this.chunkIndex = chunkIndex;
|
|
108
|
+
this.totalChunks = totalChunks;
|
|
109
|
+
this.uploadedBytes = uploadedBytes;
|
|
110
|
+
this.name = "UploadCancelledException";
|
|
111
|
+
if (Error.captureStackTrace) {
|
|
112
|
+
Error.captureStackTrace(this, _UploadCancelledException);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
chunkIndex;
|
|
116
|
+
totalChunks;
|
|
117
|
+
uploadedBytes;
|
|
118
|
+
static {
|
|
119
|
+
__name(this, "UploadCancelledException");
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export { ChunkUploadHttpErrorException, FileUploadChunkError, InitializeUploadFailureException, UploadCancelledException };
|
|
124
|
+
//# sourceMappingURL=chunk-NXYS73I4.js.map
|
|
125
|
+
//# sourceMappingURL=chunk-NXYS73I4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/exceptions/index.ts"],"names":[],"mappings":"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","file":"chunk-NXYS73I4.js","sourcesContent":["/*\n * This file is part of the project by AGBOKOUDJO Franck.\n *\n * (c) AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * Phone: +229 0167 25 18 86\n * LinkedIn: https://www.linkedin.com/in/internationales-web-apps-services-120520193/\n * Company: INTERNATIONALES WEB APPS & SERVICES\n *\n * For more information, please feel free to contact the author.\n */\n\nimport { ChunkInfo, ChunkError } from \"../types\";\n\nexport class InitializeUploadFailureException extends Error {\n constructor(public readonly responseData: any, message: string) {\n super(message);\n this.name = \"InitializeUploadFailureException\";\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, InitializeUploadFailureException);\n }\n }\n}\n\n/**\n * Exception data for MEDIA_CHUNK_UPLOAD_HTTP_ERROR_RESPONSE\n */\nexport class ChunkUploadHttpErrorException extends Error {\n constructor(\n public readonly errorPayload: string | Record<string, string | unknown> | unknown,\n public readonly statusResponse: number\n ) {\n super();\n\n this.name = \"ChunkUploadHttpErrorException\";\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ChunkUploadHttpErrorException);\n }\n }\n}\n\n/**\n * Custom error thrown during chunked file upload operations.\n * \n * This error provides detailed information about which chunk failed,\n * the underlying error, and whether a retry will be attempted.\n * \n * @example\n * ```typescript\n * try {\n * await uploadChunk(chunk);\n * } catch (error) {\n * throw new FileUploadChunkError(\n * `Failed to upload chunk ${chunkIndex}`,\n * chunkError\n * );\n * }\n * \n * // Later in error handler\n * if (error instanceof FileUploadChunkError) {\n * console.log(`Chunk ${error.chunkIndex} failed`);\n * console.log(`Will retry: ${error.willRetry}`);\n * }\n * ```\n */\nexport class FileUploadChunkError extends Error {\n\n /**\n * The detailed chunk error information\n */\n public readonly chunkError: ChunkError;\n\n /**\n * Creates a new FileUploadChunkError\n * \n * @param message - Human-readable error message\n * @param chunkError - Detailed information about the chunk failure\n */\n constructor(message: string, chunkError: ChunkError) {\n super(message, { cause: chunkError.error });\n\n this.name = \"FileUploadChunkError\";\n this.chunkError = chunkError;\n\n // Maintain proper stack trace in V8 engines (Chrome, Node.js)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FileUploadChunkError);\n }\n }\n\n /**\n * Gets the index of the chunk that failed\n */\n get chunkIndex(): number {\n return this.chunkError.chunk.index;\n }\n\n /**\n * Gets the attempt number when the chunk failed\n */\n get attemptNumber(): number {\n return this.chunkError.attempt;\n }\n\n /**\n * Indicates whether a retry will be attempted\n */\n get willRetry(): boolean {\n return this.chunkError.willRetry;\n }\n\n /**\n * Gets the underlying error that caused the chunk upload to fail\n */\n get underlyingError(): Error {\n return this.chunkError.error;\n }\n\n /**\n * Gets the full chunk information\n */\n get chunk(): ChunkInfo {\n return this.chunkError.chunk;\n }\n \n /**\n * Returns a JSON representation of the error\n */\n toJSON(): object {\n return {\n name: this.name,\n message: this.message,\n chunkIndex: this.chunkIndex,\n attempt: this.attemptNumber,\n willRetry: this.willRetry,\n underlyingError: {\n name: this.underlyingError.name,\n message: this.underlyingError.message\n },\n stack: this.stack\n };\n }\n}\n\n\nexport class UploadCancelledException extends Error {\n constructor(\n public readonly chunkIndex: number,\n public readonly totalChunks: number,\n public readonly uploadedBytes: number,\n message: string\n ) {\n super(message);\n this.name = \"UploadCancelledException\";\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, UploadCancelledException);\n }\n }\n}"]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { __name } from './chunk-7QVYU63E.js';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
class DefaultUploadResumeCacheAdapter {
|
|
3
|
+
// src/cache/index.ts
|
|
4
|
+
var DefaultUploadResumeCacheAdapter = class {
|
|
6
5
|
static {
|
|
7
6
|
__name(this, "DefaultUploadResumeCacheAdapter");
|
|
8
7
|
}
|
|
@@ -277,19 +276,19 @@ class DefaultUploadResumeCacheAdapter {
|
|
|
277
276
|
get usage() {
|
|
278
277
|
return this.cache.size / this.maxCacheSize * 100;
|
|
279
278
|
}
|
|
280
|
-
}
|
|
281
|
-
|
|
279
|
+
};
|
|
280
|
+
var UploadCacheError = class extends Error {
|
|
282
281
|
constructor(message, code) {
|
|
283
282
|
super(message);
|
|
284
283
|
this.code = code;
|
|
285
284
|
this.name = "UploadCacheError";
|
|
286
285
|
}
|
|
286
|
+
code;
|
|
287
287
|
static {
|
|
288
288
|
__name(this, "UploadCacheError");
|
|
289
289
|
}
|
|
290
|
-
}
|
|
290
|
+
};
|
|
291
291
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
//# sourceMappingURL=
|
|
295
|
-
//# sourceMappingURL=index.js.map
|
|
292
|
+
export { DefaultUploadResumeCacheAdapter, UploadCacheError };
|
|
293
|
+
//# sourceMappingURL=chunk-PFALORWQ.js.map
|
|
294
|
+
//# sourceMappingURL=chunk-PFALORWQ.js.map
|