filemail-sdk 9.4.6 → 9.4.8
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/dist/src/client/healthMonitor/onlineChecker/onlineChecker.d.ts +10 -1
- package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.d.ts.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.js +103 -12
- package/dist/src/client/healthMonitor/onlineChecker/onlineChecker.js.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.d.ts +5 -0
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.d.ts.map +1 -1
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.js +32 -1
- package/dist/src/client/healthMonitor/onlineChecker/webOnlineChecker.js.map +1 -1
- package/dist/src/client/loggers/utils/logHealthyStatus.js +23 -0
- package/dist/src/client/loggers/utils/logHealthyStatus.js.map +1 -1
- package/dist/src/downloader/chunkDownloader.d.ts.map +1 -1
- package/dist/src/downloader/chunkDownloader.js +18 -1
- package/dist/src/downloader/chunkDownloader.js.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.d.ts +2 -0
- package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.d.ts.map +1 -1
- package/dist/src/uploader/eventArgs/transferUploadCompletedEventArgs.js.map +1 -1
- package/dist/src/uploader/state/transferUploadState.d.ts.map +1 -1
- package/dist/src/uploader/state/transferUploadState.js +7 -1
- package/dist/src/uploader/state/transferUploadState.js.map +1 -1
- package/dist/src/uploader/transferUpload.d.ts.map +1 -1
- package/dist/src/uploader/transferUpload.js +4 -2
- package/dist/src/uploader/transferUpload.js.map +1 -1
- package/dist/src/utils/api/apiError.d.ts +4 -1
- package/dist/src/utils/api/apiError.d.ts.map +1 -1
- package/dist/src/utils/api/apiError.js +2 -0
- package/dist/src/utils/api/apiError.js.map +1 -1
- package/dist/src/utils/api/node/nodeClientBase.d.ts +1 -0
- package/dist/src/utils/api/node/nodeClientBase.d.ts.map +1 -1
- package/dist/src/utils/api/node/nodeClientBase.js +7 -1
- package/dist/src/utils/api/node/nodeClientBase.js.map +1 -1
- package/dist/src/utils/api/web/webClientBase.d.ts +1 -0
- package/dist/src/utils/api/web/webClientBase.d.ts.map +1 -1
- package/dist/src/utils/api/web/webClientBase.js +7 -1
- package/dist/src/utils/api/web/webClientBase.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,14 +5,23 @@ export default abstract class OnlineChecker {
|
|
|
5
5
|
isApiReachable(): Promise<OnlineCheckerResult>;
|
|
6
6
|
isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult>;
|
|
7
7
|
protected isGoogleReachable(): Promise<OnlineCheckerResult>;
|
|
8
|
-
protected probe(url: string, timeoutInMs?: number): Promise<OnlineCheckerResult>;
|
|
8
|
+
protected probe(url: string, timeoutInMs?: number, options?: ProbeRequestOptions): Promise<OnlineCheckerResult>;
|
|
9
|
+
protected probeReadableWithFallback(url: string, timeoutInMs?: number, readableProbeBlockedHint?: string): Promise<OnlineCheckerResult>;
|
|
10
|
+
private createProbeRequestInit;
|
|
9
11
|
private getProbeResponseDetails;
|
|
10
12
|
private tryGetResponseBody;
|
|
11
13
|
private enrichProbeError;
|
|
14
|
+
private applyProbeErrorMetadata;
|
|
15
|
+
private getProbeFailureCategory;
|
|
12
16
|
private getErrorObject;
|
|
13
17
|
}
|
|
14
18
|
export interface OnlineCheckerResult {
|
|
15
19
|
isOnline: boolean;
|
|
16
20
|
error?: Error;
|
|
17
21
|
}
|
|
22
|
+
interface ProbeRequestOptions {
|
|
23
|
+
requestMode?: RequestMode;
|
|
24
|
+
opaqueResponseMeansOnline?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
18
27
|
//# sourceMappingURL=onlineChecker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineChecker.d.ts","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/onlineChecker.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,aAAa;IACvC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEjB,UAAU,EAAE,MAAM;aAOd,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAEnD,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI9C,qBAAqB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;cAI3E,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC;cAIjD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"onlineChecker.d.ts","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/onlineChecker.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,aAAa;IACvC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEjB,UAAU,EAAE,MAAM;aAOd,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAEnD,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI9C,qBAAqB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;cAI3E,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC;cAIjD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC;cAqCvG,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAO,EAAE,wBAAwB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyC3I,OAAO,CAAC,sBAAsB;YAShB,uBAAuB;YAgBvB,kBAAkB;IAWhC,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,uBAAuB;IAuC/B,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,cAAc;CASzB;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB;AASD,UAAU,mBAAmB;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACvC"}
|
|
@@ -14,19 +14,78 @@ export default class OnlineChecker {
|
|
|
14
14
|
async isGoogleReachable() {
|
|
15
15
|
return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`);
|
|
16
16
|
}
|
|
17
|
-
async probe(url, timeoutInMs = 4000) {
|
|
17
|
+
async probe(url, timeoutInMs = 4000, options = {}) {
|
|
18
|
+
const startedAt = Date.now();
|
|
18
19
|
try {
|
|
19
20
|
const timeoutSignal = AbortSignal.timeout(timeoutInMs);
|
|
20
|
-
const result = await fetch(url,
|
|
21
|
-
|
|
21
|
+
const result = await fetch(url, this.createProbeRequestInit(timeoutSignal, options.requestMode));
|
|
22
|
+
const probeDurationInMs = Date.now() - startedAt;
|
|
23
|
+
if (result.ok || (options.opaqueResponseMeansOnline && result.type === `opaque`))
|
|
22
24
|
return { isOnline: true };
|
|
23
25
|
const response = await this.getProbeResponseDetails(result);
|
|
24
|
-
throw this.enrichProbeError(new Error(`Response returned ${result.status} status`), url, response
|
|
26
|
+
throw this.enrichProbeError(new Error(`Response returned ${result.status} status`), url, response, {
|
|
27
|
+
probeRequestMode: options.requestMode,
|
|
28
|
+
probeResponseType: result.type,
|
|
29
|
+
probeTimeoutInMs: timeoutInMs,
|
|
30
|
+
probeDurationInMs,
|
|
31
|
+
probeFailureCategory: `HttpError`,
|
|
32
|
+
});
|
|
25
33
|
}
|
|
26
34
|
catch (error) {
|
|
27
|
-
|
|
35
|
+
const errorObject = this.getErrorObject(error);
|
|
36
|
+
const probeDurationInMs = Date.now() - startedAt;
|
|
37
|
+
return {
|
|
38
|
+
isOnline: false,
|
|
39
|
+
error: this.enrichProbeError(errorObject, url, undefined, {
|
|
40
|
+
probeRequestMode: options.requestMode,
|
|
41
|
+
probeTimeoutInMs: timeoutInMs,
|
|
42
|
+
probeDurationInMs,
|
|
43
|
+
probeFailureCategory: this.getProbeFailureCategory(errorObject),
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
28
46
|
}
|
|
29
47
|
}
|
|
48
|
+
async probeReadableWithFallback(url, timeoutInMs = 4000, readableProbeBlockedHint) {
|
|
49
|
+
const readableResult = await this.probe(url, timeoutInMs, { requestMode: `cors` });
|
|
50
|
+
if (readableResult.isOnline)
|
|
51
|
+
return readableResult;
|
|
52
|
+
const readableError = this.getErrorObject(readableResult.error);
|
|
53
|
+
if (readableError.response !== undefined)
|
|
54
|
+
return readableResult;
|
|
55
|
+
const fallbackResult = await this.probe(url, timeoutInMs, {
|
|
56
|
+
requestMode: `no-cors`,
|
|
57
|
+
opaqueResponseMeansOnline: true,
|
|
58
|
+
});
|
|
59
|
+
if (fallbackResult.isOnline) {
|
|
60
|
+
return {
|
|
61
|
+
isOnline: false,
|
|
62
|
+
error: this.enrichProbeError(readableError, url, undefined, {
|
|
63
|
+
probeFailureCategory: `ReadableResponseBlocked`,
|
|
64
|
+
probeFailureHint: readableProbeBlockedHint,
|
|
65
|
+
probeFallbackRequestMode: `no-cors`,
|
|
66
|
+
probeFallbackSucceeded: true,
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const fallbackError = this.getErrorObject(fallbackResult.error);
|
|
71
|
+
return {
|
|
72
|
+
isOnline: false,
|
|
73
|
+
error: this.enrichProbeError(readableError, url, undefined, {
|
|
74
|
+
probeFallbackRequestMode: `no-cors`,
|
|
75
|
+
probeFallbackSucceeded: false,
|
|
76
|
+
probeFallbackErrorName: fallbackError.name,
|
|
77
|
+
probeFallbackErrorMessage: fallbackError.message,
|
|
78
|
+
}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
createProbeRequestInit(timeoutSignal, requestMode) {
|
|
82
|
+
return {
|
|
83
|
+
method: `GET`,
|
|
84
|
+
cache: `no-store`,
|
|
85
|
+
signal: timeoutSignal,
|
|
86
|
+
...(requestMode ? { mode: requestMode } : {}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
30
89
|
async getProbeResponseDetails(response) {
|
|
31
90
|
const body = await this.tryGetResponseBody(response);
|
|
32
91
|
const headers = {};
|
|
@@ -49,23 +108,55 @@ export default class OnlineChecker {
|
|
|
49
108
|
return undefined;
|
|
50
109
|
}
|
|
51
110
|
}
|
|
52
|
-
enrichProbeError(error, requestUrl, response) {
|
|
111
|
+
enrichProbeError(error, requestUrl, response, diagnostics) {
|
|
53
112
|
const errorToEnrich = this.getErrorObject(error);
|
|
54
113
|
try {
|
|
55
|
-
errorToEnrich
|
|
56
|
-
if (response !== undefined && errorToEnrich.response === undefined)
|
|
57
|
-
errorToEnrich.response = response;
|
|
114
|
+
this.applyProbeErrorMetadata(errorToEnrich, requestUrl, response, diagnostics);
|
|
58
115
|
return errorToEnrich;
|
|
59
116
|
}
|
|
60
117
|
catch {
|
|
61
118
|
const wrappedError = new Error(errorToEnrich.message, { cause: errorToEnrich });
|
|
62
119
|
wrappedError.name = errorToEnrich.name;
|
|
63
|
-
wrappedError
|
|
64
|
-
if (response !== undefined)
|
|
65
|
-
wrappedError.response = response;
|
|
120
|
+
this.applyProbeErrorMetadata(wrappedError, requestUrl, response, diagnostics);
|
|
66
121
|
return wrappedError;
|
|
67
122
|
}
|
|
68
123
|
}
|
|
124
|
+
applyProbeErrorMetadata(errorToEnrich, requestUrl, response, diagnostics) {
|
|
125
|
+
const enrichedError = errorToEnrich;
|
|
126
|
+
enrichedError.requestUrl ??= requestUrl;
|
|
127
|
+
if (response !== undefined && enrichedError.response === undefined)
|
|
128
|
+
enrichedError.response = response;
|
|
129
|
+
if (diagnostics?.probeRequestMode !== undefined)
|
|
130
|
+
enrichedError.probeRequestMode = diagnostics.probeRequestMode;
|
|
131
|
+
if (diagnostics?.probeResponseType !== undefined)
|
|
132
|
+
enrichedError.probeResponseType = diagnostics.probeResponseType;
|
|
133
|
+
if (diagnostics?.probeTimeoutInMs !== undefined)
|
|
134
|
+
enrichedError.probeTimeoutInMs = diagnostics.probeTimeoutInMs;
|
|
135
|
+
if (diagnostics?.probeDurationInMs !== undefined)
|
|
136
|
+
enrichedError.probeDurationInMs = diagnostics.probeDurationInMs;
|
|
137
|
+
if (diagnostics?.probeFailureCategory !== undefined)
|
|
138
|
+
enrichedError.probeFailureCategory = diagnostics.probeFailureCategory;
|
|
139
|
+
if (diagnostics?.probeFailureHint !== undefined)
|
|
140
|
+
enrichedError.probeFailureHint = diagnostics.probeFailureHint;
|
|
141
|
+
if (diagnostics?.probeFallbackRequestMode !== undefined)
|
|
142
|
+
enrichedError.probeFallbackRequestMode = diagnostics.probeFallbackRequestMode;
|
|
143
|
+
if (diagnostics?.probeFallbackSucceeded !== undefined)
|
|
144
|
+
enrichedError.probeFallbackSucceeded = diagnostics.probeFallbackSucceeded;
|
|
145
|
+
if (diagnostics?.probeFallbackErrorName !== undefined)
|
|
146
|
+
enrichedError.probeFallbackErrorName = diagnostics.probeFallbackErrorName;
|
|
147
|
+
if (diagnostics?.probeFallbackErrorMessage !== undefined)
|
|
148
|
+
enrichedError.probeFallbackErrorMessage = diagnostics.probeFallbackErrorMessage;
|
|
149
|
+
}
|
|
150
|
+
getProbeFailureCategory(error) {
|
|
151
|
+
const errorWithMetadata = error;
|
|
152
|
+
if (errorWithMetadata.probeFailureCategory !== undefined)
|
|
153
|
+
return errorWithMetadata.probeFailureCategory;
|
|
154
|
+
const errorMessage = error.message.toLowerCase();
|
|
155
|
+
const isTimeoutError = error.name === `AbortError` || errorMessage.includes(`timeout`) || errorMessage.includes(`aborted`);
|
|
156
|
+
if (isTimeoutError)
|
|
157
|
+
return `Timeout`;
|
|
158
|
+
return `NetworkError`;
|
|
159
|
+
}
|
|
69
160
|
getErrorObject(error) {
|
|
70
161
|
if (error instanceof Error)
|
|
71
162
|
return error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/onlineChecker.ts"],"names":[],"mappings":"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","sourcesContent":["export default abstract class OnlineChecker {\n protected apiBaseUrl: string;\n\n constructor(apiBaseUrl: string) {\n if (!apiBaseUrl || apiBaseUrl.length === 0)\n throw new Error(`Api Base URL is required`);\n\n this.apiBaseUrl = apiBaseUrl;\n }\n\n public abstract isInternetOnline(): Promise<OnlineCheckerResult>;\n\n public async isApiReachable(): Promise<OnlineCheckerResult> {\n return await this.probe(`${this.apiBaseUrl}/heartbeat?d=${Date.now()}`);\n }\n\n public async isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult> {\n return await this.probe(`${fileServerBaseUrl}/up?d=${Date.now()}`);\n }\n\n protected async isGoogleReachable(): Promise<OnlineCheckerResult> {\n return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`);\n }\n\n protected async probe(url: string, timeoutInMs = 4000): Promise<OnlineCheckerResult> {\n try {\n const timeoutSignal = AbortSignal.timeout(timeoutInMs);\n\n const result = await fetch(url, { method: `GET`, mode: `no-cors`, cache: `no-store`, signal: timeoutSignal });\n\n if (result.ok || result.type === `opaque`)\n return { isOnline: true };\n\n const response = await this.getProbeResponseDetails(result);\n\n throw this.enrichProbeError(new Error(`Response returned ${result.status} status`), url, response);\n }\n catch (error) {\n return { isOnline: false, error: this.enrichProbeError(error, url) };\n }\n }\n\n private async getProbeResponseDetails(response: Response): Promise<ProbeResponseDetails> {\n const body = await this.tryGetResponseBody(response);\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n statusText: response.statusText || undefined,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n body,\n };\n }\n\n private async tryGetResponseBody(response: Response): Promise<string | undefined> {\n try {\n const body = await response.text();\n\n return body.length > 0 ? body : undefined;\n }\n catch {\n return undefined;\n }\n }\n\n private enrichProbeError(error: unknown, requestUrl: string, response?: ProbeResponseDetails): Error {\n const errorToEnrich = this.getErrorObject(error) as Error & {\n requestUrl?: string;\n response?: ProbeResponseDetails;\n };\n\n try {\n errorToEnrich.requestUrl ??= requestUrl;\n\n if (response !== undefined && errorToEnrich.response === undefined)\n errorToEnrich.response = response;\n\n return errorToEnrich;\n }\n catch {\n const wrappedError = new Error(errorToEnrich.message, { cause: errorToEnrich }) as Error & {\n requestUrl?: string;\n response?: ProbeResponseDetails;\n };\n\n wrappedError.name = errorToEnrich.name;\n wrappedError.requestUrl = requestUrl;\n\n if (response !== undefined)\n wrappedError.response = response;\n\n return wrappedError;\n }\n }\n\n private getErrorObject(error: unknown): Error {\n if (error instanceof Error)\n return error;\n\n if (typeof error === `string`)\n return new Error(error);\n\n return new Error(`Unknown health monitor probe error`);\n }\n}\n\nexport interface OnlineCheckerResult {\n isOnline: boolean,\n error?: Error,\n}\n\ninterface ProbeResponseDetails {\n status?: number,\n statusText?: string,\n headers?: Record<string, string>,\n body?: string,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"onlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/onlineChecker.ts"],"names":[],"mappings":"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","sourcesContent":["export default abstract class OnlineChecker {\n protected apiBaseUrl: string;\n\n constructor(apiBaseUrl: string) {\n if (!apiBaseUrl || apiBaseUrl.length === 0)\n throw new Error(`Api Base URL is required`);\n\n this.apiBaseUrl = apiBaseUrl;\n }\n\n public abstract isInternetOnline(): Promise<OnlineCheckerResult>;\n\n public async isApiReachable(): Promise<OnlineCheckerResult> {\n return await this.probe(`${this.apiBaseUrl}/heartbeat?d=${Date.now()}`);\n }\n\n public async isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult> {\n return await this.probe(`${fileServerBaseUrl}/up?d=${Date.now()}`);\n }\n\n protected async isGoogleReachable(): Promise<OnlineCheckerResult> {\n return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`);\n }\n\n protected async probe(url: string, timeoutInMs = 4000, options: ProbeRequestOptions = {}): Promise<OnlineCheckerResult> {\n const startedAt = Date.now();\n\n try {\n const timeoutSignal = AbortSignal.timeout(timeoutInMs);\n const result = await fetch(url, this.createProbeRequestInit(timeoutSignal, options.requestMode));\n const probeDurationInMs = Date.now() - startedAt;\n\n if (result.ok || (options.opaqueResponseMeansOnline && result.type === `opaque`))\n return { isOnline: true };\n\n const response = await this.getProbeResponseDetails(result);\n\n throw this.enrichProbeError(new Error(`Response returned ${result.status} status`), url, response, {\n probeRequestMode: options.requestMode,\n probeResponseType: result.type,\n probeTimeoutInMs: timeoutInMs,\n probeDurationInMs,\n probeFailureCategory: `HttpError`,\n });\n }\n catch (error) {\n const errorObject = this.getErrorObject(error);\n const probeDurationInMs = Date.now() - startedAt;\n\n return {\n isOnline: false,\n error: this.enrichProbeError(errorObject, url, undefined, {\n probeRequestMode: options.requestMode,\n probeTimeoutInMs: timeoutInMs,\n probeDurationInMs,\n probeFailureCategory: this.getProbeFailureCategory(errorObject),\n }),\n };\n }\n }\n\n protected async probeReadableWithFallback(url: string, timeoutInMs = 4000, readableProbeBlockedHint?: string): Promise<OnlineCheckerResult> {\n const readableResult = await this.probe(url, timeoutInMs, { requestMode: `cors` });\n\n if (readableResult.isOnline)\n return readableResult;\n\n const readableError = this.getErrorObject(readableResult.error) as ProbeError;\n\n if (readableError.response !== undefined)\n return readableResult;\n\n const fallbackResult = await this.probe(url, timeoutInMs, {\n requestMode: `no-cors`,\n opaqueResponseMeansOnline: true,\n });\n\n if (fallbackResult.isOnline) {\n return {\n isOnline: false,\n error: this.enrichProbeError(readableError, url, undefined, {\n probeFailureCategory: `ReadableResponseBlocked`,\n probeFailureHint: readableProbeBlockedHint,\n probeFallbackRequestMode: `no-cors`,\n probeFallbackSucceeded: true,\n }),\n };\n }\n\n const fallbackError = this.getErrorObject(fallbackResult.error);\n\n return {\n isOnline: false,\n error: this.enrichProbeError(readableError, url, undefined, {\n probeFallbackRequestMode: `no-cors`,\n probeFallbackSucceeded: false,\n probeFallbackErrorName: fallbackError.name,\n probeFallbackErrorMessage: fallbackError.message,\n }),\n };\n }\n\n private createProbeRequestInit(timeoutSignal: AbortSignal, requestMode?: RequestMode): RequestInit {\n return {\n method: `GET`,\n cache: `no-store`,\n signal: timeoutSignal,\n ...(requestMode ? { mode: requestMode } : {}),\n };\n }\n\n private async getProbeResponseDetails(response: Response): Promise<ProbeResponseDetails> {\n const body = await this.tryGetResponseBody(response);\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n statusText: response.statusText || undefined,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n body,\n };\n }\n\n private async tryGetResponseBody(response: Response): Promise<string | undefined> {\n try {\n const body = await response.text();\n\n return body.length > 0 ? body : undefined;\n }\n catch {\n return undefined;\n }\n }\n\n private enrichProbeError(error: unknown, requestUrl: string, response?: ProbeResponseDetails, diagnostics?: ProbeErrorDiagnostics): Error {\n const errorToEnrich = this.getErrorObject(error) as ProbeError;\n\n try {\n this.applyProbeErrorMetadata(errorToEnrich, requestUrl, response, diagnostics);\n\n return errorToEnrich;\n }\n catch {\n const wrappedError = new Error(errorToEnrich.message, { cause: errorToEnrich }) as ProbeError;\n\n wrappedError.name = errorToEnrich.name;\n this.applyProbeErrorMetadata(wrappedError, requestUrl, response, diagnostics);\n\n return wrappedError;\n }\n }\n\n private applyProbeErrorMetadata(errorToEnrich: ProbeError, requestUrl: string, response?: ProbeResponseDetails, diagnostics?: ProbeErrorDiagnostics): void {\n const enrichedError = errorToEnrich;\n\n enrichedError.requestUrl ??= requestUrl;\n\n if (response !== undefined && enrichedError.response === undefined)\n enrichedError.response = response;\n\n if (diagnostics?.probeRequestMode !== undefined)\n enrichedError.probeRequestMode = diagnostics.probeRequestMode;\n\n if (diagnostics?.probeResponseType !== undefined)\n enrichedError.probeResponseType = diagnostics.probeResponseType;\n\n if (diagnostics?.probeTimeoutInMs !== undefined)\n enrichedError.probeTimeoutInMs = diagnostics.probeTimeoutInMs;\n\n if (diagnostics?.probeDurationInMs !== undefined)\n enrichedError.probeDurationInMs = diagnostics.probeDurationInMs;\n\n if (diagnostics?.probeFailureCategory !== undefined)\n enrichedError.probeFailureCategory = diagnostics.probeFailureCategory;\n\n if (diagnostics?.probeFailureHint !== undefined)\n enrichedError.probeFailureHint = diagnostics.probeFailureHint;\n\n if (diagnostics?.probeFallbackRequestMode !== undefined)\n enrichedError.probeFallbackRequestMode = diagnostics.probeFallbackRequestMode;\n\n if (diagnostics?.probeFallbackSucceeded !== undefined)\n enrichedError.probeFallbackSucceeded = diagnostics.probeFallbackSucceeded;\n\n if (diagnostics?.probeFallbackErrorName !== undefined)\n enrichedError.probeFallbackErrorName = diagnostics.probeFallbackErrorName;\n\n if (diagnostics?.probeFallbackErrorMessage !== undefined)\n enrichedError.probeFallbackErrorMessage = diagnostics.probeFallbackErrorMessage;\n }\n\n private getProbeFailureCategory(error: Error): ProbeFailureCategory {\n const errorWithMetadata = error as ProbeError;\n\n if (errorWithMetadata.probeFailureCategory !== undefined)\n return errorWithMetadata.probeFailureCategory;\n\n const errorMessage = error.message.toLowerCase();\n const isTimeoutError = error.name === `AbortError` || errorMessage.includes(`timeout`) || errorMessage.includes(`aborted`);\n\n if (isTimeoutError)\n return `Timeout`;\n\n return `NetworkError`;\n }\n\n private getErrorObject(error: unknown): Error {\n if (error instanceof Error)\n return error;\n\n if (typeof error === `string`)\n return new Error(error);\n\n return new Error(`Unknown health monitor probe error`);\n }\n}\n\nexport interface OnlineCheckerResult {\n isOnline: boolean,\n error?: Error,\n}\n\ninterface ProbeResponseDetails {\n status?: number,\n statusText?: string,\n headers?: Record<string, string>,\n body?: string,\n}\n\ninterface ProbeRequestOptions {\n requestMode?: RequestMode,\n opaqueResponseMeansOnline?: boolean,\n}\n\ntype ProbeFailureCategory = `HttpError` | `NetworkError` | `Timeout` | `ReadableResponseBlocked`;\n\ninterface ProbeErrorDiagnostics {\n probeRequestMode?: RequestMode,\n probeResponseType?: ResponseType,\n probeTimeoutInMs?: number,\n probeDurationInMs?: number,\n probeFailureCategory?: ProbeFailureCategory,\n probeFailureHint?: string,\n probeFallbackRequestMode?: RequestMode,\n probeFallbackSucceeded?: boolean,\n probeFallbackErrorName?: string,\n probeFallbackErrorMessage?: string,\n}\n\ninterface ProbeError extends Error {\n requestUrl?: string,\n response?: ProbeResponseDetails,\n probeRequestMode?: RequestMode,\n probeResponseType?: ResponseType,\n probeTimeoutInMs?: number,\n probeDurationInMs?: number,\n probeFailureCategory?: ProbeFailureCategory,\n probeFailureHint?: string,\n probeFallbackRequestMode?: RequestMode,\n probeFallbackSucceeded?: boolean,\n probeFallbackErrorName?: string,\n probeFallbackErrorMessage?: string,\n}"]}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import OnlineChecker, { OnlineCheckerResult } from "./onlineChecker.js";
|
|
2
2
|
export default class WebOnlineChecker extends OnlineChecker {
|
|
3
3
|
isInternetOnline(): Promise<OnlineCheckerResult>;
|
|
4
|
+
isApiReachable(): Promise<OnlineCheckerResult>;
|
|
5
|
+
isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult>;
|
|
6
|
+
private getReadableProbeBlockedHint;
|
|
7
|
+
private isMixedContentRequest;
|
|
8
|
+
private isCrossOriginRequest;
|
|
4
9
|
}
|
|
5
10
|
//# sourceMappingURL=webOnlineChecker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webOnlineChecker.d.ts","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/webOnlineChecker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,EAAE,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IAC1C,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"webOnlineChecker.d.ts","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/webOnlineChecker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,EAAE,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IAC1C,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAUvC,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAM9C,qBAAqB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMpG,OAAO,CAAC,2BAA2B;IAUnC,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,oBAAoB;CAW/B"}
|
|
@@ -3,7 +3,38 @@ export default class WebOnlineChecker extends OnlineChecker {
|
|
|
3
3
|
async isInternetOnline() {
|
|
4
4
|
if (navigator?.onLine === false)
|
|
5
5
|
return { isOnline: false, error: new Error(`Offline mode detected by browser`) };
|
|
6
|
-
return await this.
|
|
6
|
+
return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`, 4000, {
|
|
7
|
+
requestMode: `no-cors`,
|
|
8
|
+
opaqueResponseMeansOnline: true,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
async isApiReachable() {
|
|
12
|
+
const requestUrl = `${this.apiBaseUrl}/heartbeat?d=${Date.now()}`;
|
|
13
|
+
return await this.probeReadableWithFallback(requestUrl, 4000, this.getReadableProbeBlockedHint(requestUrl));
|
|
14
|
+
}
|
|
15
|
+
async isFileServerReachable(fileServerBaseUrl) {
|
|
16
|
+
const requestUrl = `${fileServerBaseUrl}/up?d=${Date.now()}`;
|
|
17
|
+
return await this.probeReadableWithFallback(requestUrl, 4000, this.getReadableProbeBlockedHint(requestUrl));
|
|
18
|
+
}
|
|
19
|
+
getReadableProbeBlockedHint(requestUrl) {
|
|
20
|
+
if (this.isMixedContentRequest(requestUrl))
|
|
21
|
+
return `Readable browser probe failed while a no-cors fallback succeeded. This usually means the browser blocked mixed-content traffic.`;
|
|
22
|
+
if (this.isCrossOriginRequest(requestUrl))
|
|
23
|
+
return `Readable browser probe failed while a no-cors fallback succeeded. This usually means a CORS or browser policy restriction, not a missing HTTP response from the server.`;
|
|
24
|
+
return `Readable browser probe failed while a no-cors fallback succeeded. This usually means a browser policy restriction, not a missing HTTP response from the server.`;
|
|
25
|
+
}
|
|
26
|
+
isMixedContentRequest(requestUrl) {
|
|
27
|
+
return globalThis.location?.protocol === `https:` && requestUrl.startsWith(`http:`);
|
|
28
|
+
}
|
|
29
|
+
isCrossOriginRequest(requestUrl) {
|
|
30
|
+
try {
|
|
31
|
+
if (!globalThis.location?.origin)
|
|
32
|
+
return false;
|
|
33
|
+
return new URL(requestUrl).origin !== globalThis.location.origin;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
7
38
|
}
|
|
8
39
|
}
|
|
9
40
|
//# sourceMappingURL=webOnlineChecker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webOnlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/webOnlineChecker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAsC,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IAChD,KAAK,CAAC,gBAAgB;QACzB,IAAI,SAAS,EAAE,MAAM,KAAK,KAAK;YAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAErF,OAAO,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"webOnlineChecker.js","sourceRoot":"","sources":["../../../../../src/client/healthMonitor/onlineChecker/webOnlineChecker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAsC,MAAM,oBAAoB,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IAChD,KAAK,CAAC,gBAAgB;QACzB,IAAI,SAAS,EAAE,MAAM,KAAK,KAAK;YAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAErF,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE;YAClF,WAAW,EAAE,SAAS;YACtB,yBAAyB,EAAE,IAAI;SAClC,CAAC,CAAC;IACP,CAAC;IAEe,KAAK,CAAC,cAAc;QAChC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,UAAU,gBAAgB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAElE,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;IAChH,CAAC;IAEe,KAAK,CAAC,qBAAqB,CAAC,iBAAyB;QACjE,MAAM,UAAU,GAAG,GAAG,iBAAiB,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE7D,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC;IAChH,CAAC;IAEO,2BAA2B,CAAC,UAAkB;QAClD,IAAI,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC;YACtC,OAAO,iIAAiI,CAAC;QAE7I,IAAI,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;YACrC,OAAO,yKAAyK,CAAC;QAErL,OAAO,iKAAiK,CAAC;IAC7K,CAAC;IAEO,qBAAqB,CAAC,UAAkB;QAC5C,OAAO,UAAU,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxF,CAAC;IAEO,oBAAoB,CAAC,UAAkB;QAC3C,IAAI,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM;gBAC5B,OAAO,KAAK,CAAC;YAEjB,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrE,CAAC;QACD,MAAM,CAAC;YACH,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;CACJ","sourcesContent":["import OnlineChecker, { OnlineCheckerResult } from \"./onlineChecker.js\";\n\nexport default class WebOnlineChecker extends OnlineChecker {\n public async isInternetOnline(): Promise<OnlineCheckerResult> {\n if (navigator?.onLine === false)\n return { isOnline: false, error: new Error(`Offline mode detected by browser`) };\n\n return await this.probe(`https://www.gstatic.com/generate_204?d=${Date.now()}`, 4000, {\n requestMode: `no-cors`,\n opaqueResponseMeansOnline: true,\n });\n }\n\n public override async isApiReachable(): Promise<OnlineCheckerResult> {\n const requestUrl = `${this.apiBaseUrl}/heartbeat?d=${Date.now()}`;\n\n return await this.probeReadableWithFallback(requestUrl, 4000, this.getReadableProbeBlockedHint(requestUrl));\n }\n\n public override async isFileServerReachable(fileServerBaseUrl: string): Promise<OnlineCheckerResult> {\n const requestUrl = `${fileServerBaseUrl}/up?d=${Date.now()}`;\n\n return await this.probeReadableWithFallback(requestUrl, 4000, this.getReadableProbeBlockedHint(requestUrl));\n }\n\n private getReadableProbeBlockedHint(requestUrl: string): string {\n if (this.isMixedContentRequest(requestUrl))\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means the browser blocked mixed-content traffic.`;\n\n if (this.isCrossOriginRequest(requestUrl))\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means a CORS or browser policy restriction, not a missing HTTP response from the server.`;\n\n return `Readable browser probe failed while a no-cors fallback succeeded. This usually means a browser policy restriction, not a missing HTTP response from the server.`;\n }\n\n private isMixedContentRequest(requestUrl: string): boolean {\n return globalThis.location?.protocol === `https:` && requestUrl.startsWith(`http:`);\n }\n\n private isCrossOriginRequest(requestUrl: string): boolean {\n try {\n if (!globalThis.location?.origin)\n return false;\n\n return new URL(requestUrl).origin !== globalThis.location.origin;\n }\n catch {\n return false;\n }\n }\n}"]}
|
|
@@ -38,6 +38,16 @@ function makeErrorSerializable(error) {
|
|
|
38
38
|
code: errorWithMetadata.code,
|
|
39
39
|
requestUrl: errorWithMetadata.requestUrl,
|
|
40
40
|
response: errorWithMetadata.response,
|
|
41
|
+
probeRequestMode: errorWithMetadata.probeRequestMode,
|
|
42
|
+
probeResponseType: errorWithMetadata.probeResponseType,
|
|
43
|
+
probeTimeoutInMs: errorWithMetadata.probeTimeoutInMs,
|
|
44
|
+
probeDurationInMs: errorWithMetadata.probeDurationInMs,
|
|
45
|
+
probeFailureCategory: errorWithMetadata.probeFailureCategory,
|
|
46
|
+
probeFailureHint: errorWithMetadata.probeFailureHint,
|
|
47
|
+
probeFallbackRequestMode: errorWithMetadata.probeFallbackRequestMode,
|
|
48
|
+
probeFallbackSucceeded: errorWithMetadata.probeFallbackSucceeded,
|
|
49
|
+
probeFallbackErrorName: errorWithMetadata.probeFallbackErrorName,
|
|
50
|
+
probeFallbackErrorMessage: errorWithMetadata.probeFallbackErrorMessage,
|
|
41
51
|
};
|
|
42
52
|
}
|
|
43
53
|
function getFileServerErrorMetadata(event) {
|
|
@@ -47,6 +57,11 @@ function getFileServerErrorMetadata(event) {
|
|
|
47
57
|
return {
|
|
48
58
|
...(fileServerError?.requestUrl ? { fileServerRequestUrl: fileServerError.requestUrl } : {}),
|
|
49
59
|
...(fileServerError?.response ? { fileServerResponse: fileServerError.response } : {}),
|
|
60
|
+
...(fileServerError ? { fileServerErrorSummary: makeHealthMonitorErrorSummary(fileServerError) } : {}),
|
|
61
|
+
...(fileServerError?.probeRequestMode ? { fileServerProbeRequestMode: fileServerError.probeRequestMode } : {}),
|
|
62
|
+
...(fileServerError?.probeFailureCategory ? { fileServerProbeFailureCategory: fileServerError.probeFailureCategory } : {}),
|
|
63
|
+
...(fileServerError?.probeFailureHint ? { fileServerProbeFailureHint: fileServerError.probeFailureHint } : {}),
|
|
64
|
+
...(fileServerError?.probeFallbackSucceeded !== undefined ? { fileServerProbeFallbackSucceeded: fileServerError.probeFallbackSucceeded } : {}),
|
|
50
65
|
};
|
|
51
66
|
}
|
|
52
67
|
function getTransferIdMetadata(event, logEntryMetadata) {
|
|
@@ -60,4 +75,12 @@ function getTransferIdMetadata(event, logEntryMetadata) {
|
|
|
60
75
|
function isSerializableUnhealthyEvent(event) {
|
|
61
76
|
return `reason` in event;
|
|
62
77
|
}
|
|
78
|
+
function makeHealthMonitorErrorSummary(error) {
|
|
79
|
+
const categoryPrefix = error.probeFailureCategory ? `[${error.probeFailureCategory}] ` : ``;
|
|
80
|
+
const hintSuffix = error.probeFailureHint ? ` ${error.probeFailureHint}` : ``;
|
|
81
|
+
const fallbackSuffix = error.probeFallbackSucceeded === false && error.probeFallbackErrorMessage
|
|
82
|
+
? ` Fallback ${error.probeFallbackRequestMode ?? `secondary`} probe also failed with ${error.probeFallbackErrorName ?? `Error`}: ${error.probeFallbackErrorMessage}.`
|
|
83
|
+
: ``;
|
|
84
|
+
return `${categoryPrefix}${error.name}: ${error.message}${hintSuffix}${fallbackSuffix}`;
|
|
85
|
+
}
|
|
63
86
|
//# sourceMappingURL=logHealthyStatus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logHealthyStatus.js","sourceRoot":"","sources":["../../../../../src/client/loggers/utils/logHealthyStatus.ts"],"names":[],"mappings":"AAGA,OAAO,oBAAoB,MAAM,iDAAiD,CAAC;AAEnF,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,MAAc,EAAE,SAAkB,EAAE,KAAsE,EAAE,mBAA4C,EAAE;IAC/L,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG;QACtB,SAAS;QACT,KAAK,EAAE,iBAAiB;QACxB,GAAG,0BAA0B,CAAC,iBAAiB,CAAC;QAChD,GAAG,qBAAqB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;QAC7D,GAAG,gBAAgB;KACtB,CAAC;IAEF,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAkB,EAAE,KAAsE;IACrH,IAAI,SAAS;QACT,OAAO,KAAsC,CAAC;IAElD,MAAM,cAAc,GAAG,KAAwC,CAAC;IAEhE,OAAO;QACH,GAAG,cAAc;QACjB,MAAM,EAAE;YACJ,GAAG,cAAc,CAAC,MAAM;YACxB,QAAQ,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrE,GAAG,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3D,UAAU,EAAE,2BAA2B,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;SAC5E;KACJ,CAAC;AACN,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAiD;IAClF,OAAO;QACH,GAAG,KAAK;QACR,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;KACpF,CAAC;AACN,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAY;IACvC,MAAM,iBAAiB,GAAG,KAIzB,CAAC;IAEF,OAAO;QACH,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,UAAU,EAAE,iBAAiB,CAAC,UAAU;QACxC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;KACvC,CAAC;AACN,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAqC;IACrE,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC;QACpC,OAAO,EAAE,CAAC;IAEd,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;IAEtD,OAAO;QACH,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC;AACN,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAqC,EAAE,gBAAyC;IAC3G,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,KAAK,SAAS;QAC3E,OAAO,EAAE,CAAC;IAEd,MAAM,UAAU,GAAI,KAAmE,CAAC,UAAU,CAAC;IAEnG,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QACzD,OAAO,EAAE,CAAC;IAEd,OAAO,EAAE,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,EAAE,UAAU,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAqC;IACvE,OAAO,QAAQ,IAAI,KAAK,CAAC;AAC7B,CAAC","sourcesContent":["import HealthMonitorHealthyEventArgs from \"../../healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport HealthMonitorUnhealthyEventArgs, { HealthMonitorUnhealthyEventArgsReasonValue } from \"../../healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\nimport Logger from \"../logger.js\";\nimport logEventPropertyName from \"../../../utils/logging/logEventPropertyNames.js\";\n\nexport default function logHealthyStatus(logger: Logger, isHealthy: boolean, event: HealthMonitorHealthyEventArgs | HealthMonitorUnhealthyEventArgs, logEntryMetadata: Record<string, unknown> = {}) {\n const serializableEvent = makeEventSerializable(isHealthy, event);\n const logAdditionalData = {\n isHealthy,\n event: serializableEvent,\n ...getFileServerErrorMetadata(serializableEvent),\n ...getTransferIdMetadata(serializableEvent, logEntryMetadata),\n ...logEntryMetadata,\n };\n\n logger.logInfo(`Transfer health status`, logAdditionalData);\n}\n\nfunction makeEventSerializable(isHealthy: boolean, event: HealthMonitorHealthyEventArgs | HealthMonitorUnhealthyEventArgs): SerializableHealthMonitorEvent {\n if (isHealthy)\n return event as HealthMonitorHealthyEventArgs;\n\n const unhealthyEvent = event as HealthMonitorUnhealthyEventArgs;\n\n return {\n ...unhealthyEvent,\n reason: {\n ...unhealthyEvent.reason,\n internet: makeReasonValueSerializable(unhealthyEvent.reason.internet),\n api: makeReasonValueSerializable(unhealthyEvent.reason.api),\n fileServer: makeReasonValueSerializable(unhealthyEvent.reason.fileServer),\n },\n };\n}\n\nfunction makeReasonValueSerializable(value: HealthMonitorUnhealthyEventArgsReasonValue): SerializableHealthMonitorUnhealthyEventArgsReasonValue {\n return {\n ...value,\n error: value.error === undefined ? undefined : makeErrorSerializable(value.error),\n };\n}\n\nfunction makeErrorSerializable(error: Error): SerializableHealthMonitorError {\n const errorWithMetadata = error as Error & {\n code?: string;\n requestUrl?: string;\n response?: SerializableHealthMonitorErrorResponse;\n };\n\n return {\n name: error.name,\n message: error.message,\n code: errorWithMetadata.code,\n requestUrl: errorWithMetadata.requestUrl,\n response: errorWithMetadata.response,\n };\n}\n\nfunction getFileServerErrorMetadata(event: SerializableHealthMonitorEvent): Record<string, unknown> {\n if (!isSerializableUnhealthyEvent(event))\n return {};\n\n const fileServerError = event.reason.fileServer.error;\n\n return {\n ...(fileServerError?.requestUrl ? { fileServerRequestUrl: fileServerError.requestUrl } : {}),\n ...(fileServerError?.response ? { fileServerResponse: fileServerError.response } : {}),\n };\n}\n\nfunction getTransferIdMetadata(event: SerializableHealthMonitorEvent, logEntryMetadata: Record<string, unknown>): Record<string, unknown> {\n if (logEntryMetadata[logEventPropertyName.TransferIdPropertyName] !== undefined)\n return {};\n\n const transferId = (event as SerializableHealthMonitorEvent & { transferId?: unknown }).transferId;\n\n if (typeof transferId !== `string` || transferId.length === 0)\n return {};\n\n return { [logEventPropertyName.TransferIdPropertyName]: transferId };\n}\n\nfunction isSerializableUnhealthyEvent(event: SerializableHealthMonitorEvent): event is SerializableHealthMonitorUnhealthyEventArgs {\n return `reason` in event;\n}\n\ntype SerializableHealthMonitorEvent = HealthMonitorHealthyEventArgs | SerializableHealthMonitorUnhealthyEventArgs;\n\ninterface SerializableHealthMonitorUnhealthyEventArgs extends Omit<HealthMonitorUnhealthyEventArgs, `reason`> {\n reason: SerializableHealthMonitorUnhealthyEventArgsReason;\n}\n\ninterface SerializableHealthMonitorUnhealthyEventArgsReason {\n internet: SerializableHealthMonitorUnhealthyEventArgsReasonValue,\n api: SerializableHealthMonitorUnhealthyEventArgsReasonValue,\n fileServer: SerializableHealthMonitorUnhealthyEventArgsReasonValue,\n}\n\ninterface SerializableHealthMonitorUnhealthyEventArgsReasonValue extends Omit<HealthMonitorUnhealthyEventArgsReasonValue, `error`> {\n error?: SerializableHealthMonitorError,\n}\n\ninterface SerializableHealthMonitorError {\n name: string,\n message: string,\n code?: string | number,\n requestUrl?: string,\n response?: SerializableHealthMonitorErrorResponse,\n}\n\ninterface SerializableHealthMonitorErrorResponse {\n status?: number,\n statusText?: string,\n headers?: Record<string, string>,\n body?: unknown,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"logHealthyStatus.js","sourceRoot":"","sources":["../../../../../src/client/loggers/utils/logHealthyStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import HealthMonitorHealthyEventArgs from \"../../healthMonitor/events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport HealthMonitorUnhealthyEventArgs, { HealthMonitorUnhealthyEventArgsReasonValue } from \"../../healthMonitor/events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\nimport Logger from \"../logger.js\";\nimport logEventPropertyName from \"../../../utils/logging/logEventPropertyNames.js\";\n\nexport default function logHealthyStatus(logger: Logger, isHealthy: boolean, event: HealthMonitorHealthyEventArgs | HealthMonitorUnhealthyEventArgs, logEntryMetadata: Record<string, unknown> = {}) {\n const serializableEvent = makeEventSerializable(isHealthy, event);\n const logAdditionalData = {\n isHealthy,\n event: serializableEvent,\n ...getFileServerErrorMetadata(serializableEvent),\n ...getTransferIdMetadata(serializableEvent, logEntryMetadata),\n ...logEntryMetadata,\n };\n\n logger.logInfo(`Transfer health status`, logAdditionalData);\n}\n\nfunction makeEventSerializable(isHealthy: boolean, event: HealthMonitorHealthyEventArgs | HealthMonitorUnhealthyEventArgs): SerializableHealthMonitorEvent {\n if (isHealthy)\n return event as HealthMonitorHealthyEventArgs;\n\n const unhealthyEvent = event as HealthMonitorUnhealthyEventArgs;\n\n return {\n ...unhealthyEvent,\n reason: {\n ...unhealthyEvent.reason,\n internet: makeReasonValueSerializable(unhealthyEvent.reason.internet),\n api: makeReasonValueSerializable(unhealthyEvent.reason.api),\n fileServer: makeReasonValueSerializable(unhealthyEvent.reason.fileServer),\n },\n };\n}\n\nfunction makeReasonValueSerializable(value: HealthMonitorUnhealthyEventArgsReasonValue): SerializableHealthMonitorUnhealthyEventArgsReasonValue {\n return {\n ...value,\n error: value.error === undefined ? undefined : makeErrorSerializable(value.error),\n };\n}\n\nfunction makeErrorSerializable(error: Error): SerializableHealthMonitorError {\n const errorWithMetadata = error as Error & {\n code?: string;\n requestUrl?: string;\n response?: SerializableHealthMonitorErrorResponse;\n probeRequestMode?: RequestMode;\n probeResponseType?: ResponseType;\n probeTimeoutInMs?: number;\n probeDurationInMs?: number;\n probeFailureCategory?: string;\n probeFailureHint?: string;\n probeFallbackRequestMode?: RequestMode;\n probeFallbackSucceeded?: boolean;\n probeFallbackErrorName?: string;\n probeFallbackErrorMessage?: string;\n };\n\n return {\n name: error.name,\n message: error.message,\n code: errorWithMetadata.code,\n requestUrl: errorWithMetadata.requestUrl,\n response: errorWithMetadata.response,\n probeRequestMode: errorWithMetadata.probeRequestMode,\n probeResponseType: errorWithMetadata.probeResponseType,\n probeTimeoutInMs: errorWithMetadata.probeTimeoutInMs,\n probeDurationInMs: errorWithMetadata.probeDurationInMs,\n probeFailureCategory: errorWithMetadata.probeFailureCategory,\n probeFailureHint: errorWithMetadata.probeFailureHint,\n probeFallbackRequestMode: errorWithMetadata.probeFallbackRequestMode,\n probeFallbackSucceeded: errorWithMetadata.probeFallbackSucceeded,\n probeFallbackErrorName: errorWithMetadata.probeFallbackErrorName,\n probeFallbackErrorMessage: errorWithMetadata.probeFallbackErrorMessage,\n };\n}\n\nfunction getFileServerErrorMetadata(event: SerializableHealthMonitorEvent): Record<string, unknown> {\n if (!isSerializableUnhealthyEvent(event))\n return {};\n\n const fileServerError = event.reason.fileServer.error;\n\n return {\n ...(fileServerError?.requestUrl ? { fileServerRequestUrl: fileServerError.requestUrl } : {}),\n ...(fileServerError?.response ? { fileServerResponse: fileServerError.response } : {}),\n ...(fileServerError ? { fileServerErrorSummary: makeHealthMonitorErrorSummary(fileServerError) } : {}),\n ...(fileServerError?.probeRequestMode ? { fileServerProbeRequestMode: fileServerError.probeRequestMode } : {}),\n ...(fileServerError?.probeFailureCategory ? { fileServerProbeFailureCategory: fileServerError.probeFailureCategory } : {}),\n ...(fileServerError?.probeFailureHint ? { fileServerProbeFailureHint: fileServerError.probeFailureHint } : {}),\n ...(fileServerError?.probeFallbackSucceeded !== undefined ? { fileServerProbeFallbackSucceeded: fileServerError.probeFallbackSucceeded } : {}),\n };\n}\n\nfunction getTransferIdMetadata(event: SerializableHealthMonitorEvent, logEntryMetadata: Record<string, unknown>): Record<string, unknown> {\n if (logEntryMetadata[logEventPropertyName.TransferIdPropertyName] !== undefined)\n return {};\n\n const transferId = (event as SerializableHealthMonitorEvent & { transferId?: unknown }).transferId;\n\n if (typeof transferId !== `string` || transferId.length === 0)\n return {};\n\n return { [logEventPropertyName.TransferIdPropertyName]: transferId };\n}\n\nfunction isSerializableUnhealthyEvent(event: SerializableHealthMonitorEvent): event is SerializableHealthMonitorUnhealthyEventArgs {\n return `reason` in event;\n}\n\nfunction makeHealthMonitorErrorSummary(error: SerializableHealthMonitorError): string {\n const categoryPrefix = error.probeFailureCategory ? `[${error.probeFailureCategory}] ` : ``;\n const hintSuffix = error.probeFailureHint ? ` ${error.probeFailureHint}` : ``;\n const fallbackSuffix = error.probeFallbackSucceeded === false && error.probeFallbackErrorMessage\n ? ` Fallback ${error.probeFallbackRequestMode ?? `secondary`} probe also failed with ${error.probeFallbackErrorName ?? `Error`}: ${error.probeFallbackErrorMessage}.`\n : ``;\n\n return `${categoryPrefix}${error.name}: ${error.message}${hintSuffix}${fallbackSuffix}`;\n}\n\ntype SerializableHealthMonitorEvent = HealthMonitorHealthyEventArgs | SerializableHealthMonitorUnhealthyEventArgs;\n\ninterface SerializableHealthMonitorUnhealthyEventArgs extends Omit<HealthMonitorUnhealthyEventArgs, `reason`> {\n reason: SerializableHealthMonitorUnhealthyEventArgsReason;\n}\n\ninterface SerializableHealthMonitorUnhealthyEventArgsReason {\n internet: SerializableHealthMonitorUnhealthyEventArgsReasonValue,\n api: SerializableHealthMonitorUnhealthyEventArgsReasonValue,\n fileServer: SerializableHealthMonitorUnhealthyEventArgsReasonValue,\n}\n\ninterface SerializableHealthMonitorUnhealthyEventArgsReasonValue extends Omit<HealthMonitorUnhealthyEventArgsReasonValue, `error`> {\n error?: SerializableHealthMonitorError,\n}\n\ninterface SerializableHealthMonitorError {\n name: string,\n message: string,\n code?: string | number,\n requestUrl?: string,\n response?: SerializableHealthMonitorErrorResponse,\n probeRequestMode?: RequestMode,\n probeResponseType?: ResponseType,\n probeTimeoutInMs?: number,\n probeDurationInMs?: number,\n probeFailureCategory?: string,\n probeFailureHint?: string,\n probeFallbackRequestMode?: RequestMode,\n probeFallbackSucceeded?: boolean,\n probeFallbackErrorName?: string,\n probeFallbackErrorMessage?: string,\n}\n\ninterface SerializableHealthMonitorErrorResponse {\n status?: number,\n statusText?: string,\n headers?: Record<string, string>,\n body?: unknown,\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkDownloader.d.ts","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,qBAAqB,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,gBAAgB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,0BAA0B,MAAM,mDAAmD,CAAC;AAChG,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAIhE,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAEpG,MAAM,CAAC,OAAO,OAAO,eAAe;;
|
|
1
|
+
{"version":3,"file":"chunkDownloader.d.ts","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,qBAAqB,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,gBAAgB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,aAAa,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,uBAAuB,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,0BAA0B,MAAM,mDAAmD,CAAC;AAChG,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAIhE,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAEpG,MAAM,CAAC,OAAO,OAAO,eAAe;;gBAiB5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,qBAAqB,EAC5B,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,eAAe,EACxB,uBAAuB,EAAE,uBAAuB,EAChD,0BAA0B,EAAE,0BAA0B,CAAC,MAAM,CAAC,EAC9D,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,cAAc,EACtB,cAAc,CAAC,EAAE,iCAAiC;IAehD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA8QlC"}
|
|
@@ -21,6 +21,7 @@ export default class ChunkDownloader {
|
|
|
21
21
|
#encryptionData;
|
|
22
22
|
#bytesTransferred = 0;
|
|
23
23
|
#running = false;
|
|
24
|
+
#consecutiveNetworkErrors = 0;
|
|
24
25
|
constructor(transferId, file, chunk, downloadState, options, fileServerClientFactory, chunkStreamProviderFactory, eventsEngine, logger, encryptionData) {
|
|
25
26
|
this.#transferId = transferId;
|
|
26
27
|
this.#options = options;
|
|
@@ -48,12 +49,18 @@ export default class ChunkDownloader {
|
|
|
48
49
|
try {
|
|
49
50
|
this.#downloadState.chunkDownloadStarted(this.#file, this.#chunk);
|
|
50
51
|
this.#addEventListeners();
|
|
51
|
-
|
|
52
|
+
let fileserverMd5Promise = this.#options.checkChunksMd5
|
|
52
53
|
? this.#chunkDownloadClient.getMd5Checksum()
|
|
53
54
|
: null;
|
|
54
55
|
while (writtenCorrectly === false && this.#canRetry(lastError, writeErrors, networkErrors, apiReturnedNotOkResponseStatus)) {
|
|
55
56
|
attempts += 1;
|
|
56
57
|
this.#bytesTransferred = 0;
|
|
58
|
+
if (this.#isDownloadClientRecreateNeeded()) {
|
|
59
|
+
this.#recreateDownloadClient();
|
|
60
|
+
fileserverMd5Promise = this.#options.checkChunksMd5
|
|
61
|
+
? this.#chunkDownloadClient.getMd5Checksum()
|
|
62
|
+
: null;
|
|
63
|
+
}
|
|
57
64
|
const chunkWriter = this.#chunkStreamProviderFactory.provide(this.#file.temporaryDownloadPath, this.#chunk.start ?? 0, this.#chunk.chunkSize, this.#encryptionData);
|
|
58
65
|
try {
|
|
59
66
|
await this.#chunkDownloadClient.download(chunkWriter, this.#encryptionData);
|
|
@@ -62,6 +69,7 @@ export default class ChunkDownloader {
|
|
|
62
69
|
this.#downloadState.possibleSupersizedFile(this.#file);
|
|
63
70
|
throw new DownloadError(`Download request returned incorrect amount of data. Expected=${this.#chunk.chunkSize} Received=${this.#bytesTransferred}`, undefined, DownloadErrorCode.FileserverResponseWrongSize);
|
|
64
71
|
}
|
|
72
|
+
this.#consecutiveNetworkErrors = 0;
|
|
65
73
|
networkErrors = 0;
|
|
66
74
|
this.#downloadState.networkOk();
|
|
67
75
|
if (this.#downloadState.status !== TransferStatus.Aborting) {
|
|
@@ -90,6 +98,7 @@ export default class ChunkDownloader {
|
|
|
90
98
|
if (this.#isApiNotOkResponseStatusResponse(lastError))
|
|
91
99
|
apiReturnedNotOkResponseStatus = true;
|
|
92
100
|
else {
|
|
101
|
+
this.#consecutiveNetworkErrors += 1;
|
|
93
102
|
networkErrors += 1;
|
|
94
103
|
this.#downloadState.networkFailure();
|
|
95
104
|
}
|
|
@@ -136,6 +145,14 @@ export default class ChunkDownloader {
|
|
|
136
145
|
}
|
|
137
146
|
this.#running = false;
|
|
138
147
|
}
|
|
148
|
+
#isDownloadClientRecreateNeeded() {
|
|
149
|
+
return this.#consecutiveNetworkErrors > 0 && this.#consecutiveNetworkErrors % this.#options.fileserverOfflineAfterConsecutiveAttempts === 0;
|
|
150
|
+
}
|
|
151
|
+
#recreateDownloadClient() {
|
|
152
|
+
this.#chunkDownloadClient.removeEventListener(`progress`, this.#onProgress);
|
|
153
|
+
this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerTcpDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);
|
|
154
|
+
this.#chunkDownloadClient.addEventListener(`progress`, this.#onProgress);
|
|
155
|
+
}
|
|
139
156
|
#throwIfRunning() {
|
|
140
157
|
if (this.#running)
|
|
141
158
|
throw new DownloadError(`This instance of chunk downloader is already in use. Please create a new one.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkDownloader.js","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { RequestError } from \"got\";\nimport sleep from \"abortable-sleep\";\n\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport DownloadError from \"./dtos/downloadError.js\";\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\nimport DownloadFileChunkProgress from \"./downloadStatus/downloadFileChunkProgress.js\";\nimport { isBaseResponse } from \"../utils/api/dtos/baseResponse.js\";\n\nimport type DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport type DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\nimport type DownloadOptions from \"./downloadOptions.js\";\nimport type DownloadState from \"./downloadStatus/downloadState.js\";\nimport type FileServerClientFactory from \"../utils/api/fileServerClientFactory.js\";\nimport type ChunkStreamProviderFactory from \"../utils/fileSystem/chunkStreamProviderFactory.js\";\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\nimport type FileServerDownloadClient from \"./api/fileServerDownloadClient.js\";\nimport type ChunkProgressEvent from \"../utils/events/chunkProgressEvent.js\";\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\nimport type DownloadLogger from \"./downloadLogger.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../utils/fileSystem/chunkStreamProvider.js\";\n\nexport default class ChunkDownloader {\n #logger: DownloadLogger;\n #transferId: string;\n #chunk: DownloadFileChunkInfo;\n #file: DownloadFileInfo;\n #downloadState: DownloadState;\n #options: DownloadOptions;\n #fileServerClientFactory: FileServerClientFactory;\n #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\n #eventsEngine: EventsEngine;\n #chunkDownloadClient: FileServerDownloadClient;\n #encryptionData?: ChunkStreamProviderEncryptionData;\n #bytesTransferred = 0;\n #running = false;\n\n constructor(\n transferId: string,\n file: DownloadFileInfo,\n chunk: DownloadFileChunkInfo,\n downloadState: DownloadState,\n options: DownloadOptions,\n fileServerClientFactory: FileServerClientFactory,\n chunkStreamProviderFactory: ChunkStreamProviderFactory<string>,\n eventsEngine: EventsEngine,\n logger: DownloadLogger,\n encryptionData?: ChunkStreamProviderEncryptionData,\n ) {\n this.#transferId = transferId;\n this.#options = options;\n this.#file = file;\n this.#chunk = chunk;\n this.#downloadState = downloadState;\n this.#fileServerClientFactory = fileServerClientFactory;\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#eventsEngine = eventsEngine;\n this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerTcpDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);\n this.#logger = logger;\n this.#encryptionData = encryptionData;\n }\n\n async download(): Promise<void> {\n this.#throwIfRunning();\n this.#throwIfMissingDownloadPath();\n\n this.#running = true;\n\n let writtenCorrectly = false;\n let attempts = 0;\n let writeErrors = 0;\n let networkErrors = 0;\n let apiReturnedNotOkResponseStatus: boolean = false;\n let lastError: Error | null = null;\n let unhandledError: Error | null = null;\n\n try {\n this.#downloadState.chunkDownloadStarted(this.#file, this.#chunk);\n\n this.#addEventListeners();\n\n const fileserverMd5Promise: Promise<string> | null = this.#options.checkChunksMd5\n ? this.#chunkDownloadClient.getMd5Checksum()\n : null;\n\n while (writtenCorrectly === false && this.#canRetry(lastError as Error, writeErrors, networkErrors, apiReturnedNotOkResponseStatus)) {\n attempts += 1;\n\n this.#bytesTransferred = 0;\n\n const chunkWriter = this.#chunkStreamProviderFactory.provide(this.#file.temporaryDownloadPath!, this.#chunk.start ?? 0, this.#chunk.chunkSize, this.#encryptionData);\n\n try {\n await this.#chunkDownloadClient.download(chunkWriter, this.#encryptionData);\n\n if (this.#bytesTransferred !== this.#chunk.chunkSize) {\n if (this.#bytesTransferred > this.#chunk.chunkSize)\n this.#downloadState.possibleSupersizedFile(this.#file);\n\n throw new DownloadError(`Download request returned incorrect amount of data. Expected=${this.#chunk.chunkSize} Received=${this.#bytesTransferred}`, undefined, DownloadErrorCode.FileserverResponseWrongSize);\n }\n\n networkErrors = 0;\n this.#downloadState.networkOk();\n\n if (this.#downloadState.status !== TransferStatus.Aborting) {\n if (fileserverMd5Promise !== null) {\n const remoteMd5 = await fileserverMd5Promise;\n const localMd5 = await chunkWriter.getMd5Checksum(`hex`);\n if (remoteMd5.toLowerCase() === localMd5.toLowerCase())\n writtenCorrectly = true;\n else {\n writeErrors += 1;\n lastError = new DownloadError(`MD5 checksum incorrect: fileserver=${remoteMd5} local=${localMd5}`);\n }\n }\n else\n writtenCorrectly = true;\n }\n }\n catch (error) {\n // note: getting an exception here may be caused by abort or stop operations\n // both operations immediately interrupt HTTP download request by calling chunkDownloadClient.release()\n if (this.#downloadState.pauseImmediately || this.#downloadState.status === TransferStatus.Aborting)\n lastError = null;\n else {\n lastError = error as Error;\n\n if (lastError instanceof RequestError) {\n if (this.#isApiNotOkResponseStatusResponse(lastError))\n apiReturnedNotOkResponseStatus = true;\n else {\n networkErrors += 1;\n this.#downloadState.networkFailure();\n }\n }\n else\n writeErrors += 1;\n\n this.#logger.logError(lastError, `[CHUNK_DOWNLOADER_ERROR] Error in retry loop when downloading chunk attempt=${attempts} writeerrors=${writeErrors} networkerrors=${networkErrors}`, this.#errorInfoDump());\n }\n }\n finally {\n await chunkWriter?.release();\n this.#chunkDownloadClient?.release();\n\n let sleepTime = 0;\n if (this.#downloadState.isThereNetworkProblem)\n sleepTime = this.#options.fileserverOfflineCheckIntervalMillis;\n else if (networkErrors > 0) {\n const pow = Math.min(networkErrors, this.#options.fileserverOfflineAfterConsecutiveAttempts);\n sleepTime = this.#options.fileserverOfflineCheckIntervalMillis * (2 ** (pow - this.#options.fileserverOfflineAfterConsecutiveAttempts));\n }\n\n if (sleepTime > 0)\n await sleep(sleepTime);\n }\n }\n }\n catch (error) {\n unhandledError = error as Error;\n this.#logger.logError(unhandledError, `[CHUNK_DOWNLOADER_ERROR] Unhandled error when downloading chunk`, this.#errorInfoDump());\n }\n finally {\n this.#removeEventListeners();\n }\n\n if (writtenCorrectly)\n this.#downloadState.chunkDownloadCompleted(this.#file, this.#chunk);\n else {\n let downloadError: DownloadError | null = null;\n const failureCode = this.#toFailureCode(unhandledError ?? lastError);\n\n if (unhandledError)\n downloadError = new DownloadError(`Unhandled chunk download error for file ${this.#file.url} chunk ${this.#chunk.chunkNumber}`, { cause: unhandledError as Error }, failureCode);\n else if (lastError)\n downloadError = new DownloadError(`Chunk download failed for file ${this.#file.url} chunk ${this.#chunk.chunkNumber} attempt ${attempts}.`, { cause: lastError as Error }, failureCode);\n\n if (downloadError !== null) {\n this.#downloadState.chunkDownloadFailed(\n this.#file,\n this.#chunk,\n downloadError,\n );\n }\n }\n\n this.#running = false;\n }\n\n #throwIfRunning() {\n if (this.#running)\n throw new DownloadError(`This instance of chunk downloader is already in use. Please create a new one.`);\n }\n\n #throwIfMissingDownloadPath() {\n if (!this.#file.temporaryDownloadPath)\n throw new DownloadError(`Download file ${this.#file.externalId}/${this.#file.name}/${this.#file.downloadPath} is missing the required \"temporaryDownloadPath\"`);\n }\n\n #addEventListeners() {\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Aborting, this.#onAbortRequested);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Pausing, this.#onPauseRequested);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#chunkDownloadClient.addEventListener(`progress`, this.#onProgress);\n }\n\n #removeEventListeners() {\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Aborting, this.#onAbortRequested);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Pausing, this.#onPauseRequested);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#chunkDownloadClient.removeEventListener(`progress`, this.#onProgress);\n }\n\n #canRetry(error: Error | null, writeErrors: number, networkErrors: number, apiReturnedNotOkResponseStatus: boolean) {\n if (this.#downloadState.status === TransferStatus.Aborting || this.#downloadState.status === TransferStatus.Pausing)\n return false;\n\n if (this.#file.isFailed)\n return false;\n\n if (apiReturnedNotOkResponseStatus)\n return false;\n\n if (this.#isDiskFullError(error))\n return false;\n\n if (error && error instanceof RequestError)\n return this.#options.fileserverAttemptLimit <= 0 || networkErrors < this.#options.fileserverAttemptLimit!;\n\n return this.#options.maxWriteAttempts! < 0 || writeErrors < this.#options.maxWriteAttempts!;\n }\n\n #isApiNotOkResponseStatusResponse(error: RequestError): boolean {\n try {\n if (typeof error.response?.body !== `string`)\n return false;\n\n const response = JSON.parse(error.response?.body);\n\n if (!isBaseResponse(response))\n return false;\n\n return response.responsestatus !== `OK`;\n }\n catch {\n return false;\n }\n }\n\n /**\n * This method aborts pending download - it can be achieved only by destroying the download client\n * (which in turn destroys the underlying download HTTP request). This operation\n * will throw an expected exception inside download method (in main while loop). See {@link download} method.\n */\n #interruptDownload = () => {\n this.#chunkDownloadClient?.release();\n };\n\n #onAbortRequested = () => {\n this.#interruptDownload();\n };\n\n #onPauseRequested = () => {\n if (this.#downloadState.pauseImmediately)\n this.#interruptDownload();\n };\n\n #onFileFailed = (args: FileDownloadFailedEventArgs) => {\n if (this.#file.externalId === args.file.id)\n this.#chunkDownloadClient?.release();\n };\n\n #onProgress = (args: ChunkProgressEvent) => {\n this.#bytesTransferred = args.transferredBytesTotal;\n this.#downloadState.chunkDownloadProgressed(this.#file, this.#chunk, args);\n };\n\n #errorInfoDump() {\n return {\n fileid: this.#file.externalId,\n filename: this.#file.name,\n chunk: DownloadFileChunkProgress.FromChunkInfo(this.#chunk),\n };\n }\n\n #toFailureCode(error: Error | null): DownloadErrorCode | undefined {\n if (this.#isDiskFullError(error))\n return DownloadErrorCode.DiskFull;\n\n return undefined;\n }\n\n #isDiskFullError(error: unknown): boolean {\n if (!error)\n return false;\n\n let current = error as { message?: string, code?: string, cause?: unknown } | undefined;\n for (let depth = 0; depth < 8 && current; depth++) {\n if (current.code === `ENOSPC`)\n return true;\n\n if (typeof current.message === `string` && current.message.includes(`ENOSPC`))\n return true;\n\n current = current.cause as { message?: string, code?: string, cause?: unknown } | undefined;\n }\n\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chunkDownloader.js","sourceRoot":"","sources":["../../../src/downloader/chunkDownloader.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,MAAM,iBAAiB,CAAC;AAEpC,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,iBAAiB,MAAM,6BAA6B,CAAC;AAC5D,OAAO,yBAAyB,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAenE,MAAM,CAAC,OAAO,OAAO,eAAe;IAChC,OAAO,CAAiB;IACxB,WAAW,CAAS;IACpB,MAAM,CAAwB;IAC9B,KAAK,CAAmB;IACxB,cAAc,CAAgB;IAC9B,QAAQ,CAAkB;IAC1B,wBAAwB,CAA0B;IAClD,2BAA2B,CAAqC;IAChE,aAAa,CAAe;IAC5B,oBAAoB,CAA2B;IAC/C,eAAe,CAAqC;IACpD,iBAAiB,GAAG,CAAC,CAAC;IACtB,QAAQ,GAAG,KAAK,CAAC;IACjB,yBAAyB,GAAG,CAAC,CAAC;IAE9B,YACI,UAAkB,EAClB,IAAsB,EACtB,KAA4B,EAC5B,aAA4B,EAC5B,OAAwB,EACxB,uBAAgD,EAChD,0BAA8D,EAC9D,YAA0B,EAC1B,MAAsB,EACtB,cAAkD;QAElD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,wBAAwB,GAAG,uBAAuB,CAAC;QACxD,IAAI,CAAC,2BAA2B,GAAG,0BAA0B,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,CAAC,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClM,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAEnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,8BAA8B,GAAY,KAAK,CAAC;QACpD,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,IAAI,cAAc,GAAiB,IAAI,CAAC;QAExC,IAAI,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAElE,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,IAAI,oBAAoB,GAA2B,IAAI,CAAC,QAAQ,CAAC,cAAc;gBAC3E,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE;gBAC5C,CAAC,CAAC,IAAI,CAAC;YAEX,OAAO,gBAAgB,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,SAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,8BAA8B,CAAC,EAAE,CAAC;gBAClI,QAAQ,IAAI,CAAC,CAAC;gBAEd,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAE3B,IAAI,IAAI,CAAC,+BAA+B,EAAE,EAAE,CAAC;oBACzC,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAE/B,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc;wBAC/C,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE;wBAC5C,CAAC,CAAC,IAAI,CAAC;gBACf,CAAC;gBAED,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAErK,IAAI,CAAC;oBACD,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;oBAE5E,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;wBACnD,IAAI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;4BAC9C,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAE3D,MAAM,IAAI,aAAa,CAAC,gEAAgE,IAAI,CAAC,MAAM,CAAC,SAAS,aAAa,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;oBAClN,CAAC;oBAED,IAAI,CAAC,yBAAyB,GAAG,CAAC,CAAC;oBACnC,aAAa,GAAG,CAAC,CAAC;oBAClB,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;oBAEhC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,QAAQ,EAAE,CAAC;wBACzD,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;4BAChC,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC;4BAC7C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;4BACzD,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE;gCAClD,gBAAgB,GAAG,IAAI,CAAC;iCACvB,CAAC;gCACF,WAAW,IAAI,CAAC,CAAC;gCACjB,SAAS,GAAG,IAAI,aAAa,CAAC,sCAAsC,SAAS,UAAU,QAAQ,EAAE,CAAC,CAAC;4BACvG,CAAC;wBACL,CAAC;;4BAEG,gBAAgB,GAAG,IAAI,CAAC;oBAChC,CAAC;gBACL,CAAC;gBACD,OAAO,KAAK,EAAE,CAAC;oBACX,4EAA4E;oBAC5E,uGAAuG;oBACvG,IAAI,IAAI,CAAC,cAAc,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,QAAQ;wBAC9F,SAAS,GAAG,IAAI,CAAC;yBAChB,CAAC;wBACF,SAAS,GAAG,KAAc,CAAC;wBAE3B,IAAI,SAAS,YAAY,YAAY,EAAE,CAAC;4BACpC,IAAI,IAAI,CAAC,iCAAiC,CAAC,SAAS,CAAC;gCACjD,8BAA8B,GAAG,IAAI,CAAC;iCACrC,CAAC;gCACF,IAAI,CAAC,yBAAyB,IAAI,CAAC,CAAC;gCACpC,aAAa,IAAI,CAAC,CAAC;gCACnB,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;4BACzC,CAAC;wBACL,CAAC;;4BAEG,WAAW,IAAI,CAAC,CAAC;wBAErB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,+EAA+E,QAAQ,gBAAgB,WAAW,kBAAkB,aAAa,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;oBACjN,CAAC;gBACL,CAAC;wBACO,CAAC;oBACL,MAAM,WAAW,EAAE,OAAO,EAAE,CAAC;oBAC7B,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;oBAErC,IAAI,SAAS,GAAG,CAAC,CAAC;oBAClB,IAAI,IAAI,CAAC,cAAc,CAAC,qBAAqB;wBACzC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC;yBAC9D,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;wBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;wBAC7F,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,oCAAoC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC,CAAC;oBAC5I,CAAC;oBAED,IAAI,SAAS,GAAG,CAAC;wBACb,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,cAAc,GAAG,KAAc,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,iEAAiE,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACpI,CAAC;gBACO,CAAC;YACL,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,gBAAgB;YAChB,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aACnE,CAAC;YACF,IAAI,aAAa,GAAyB,IAAI,CAAC;YAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,IAAI,SAAS,CAAC,CAAC;YAErE,IAAI,cAAc;gBACd,aAAa,GAAG,IAAI,aAAa,CAAC,2CAA2C,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,cAAuB,EAAE,EAAE,WAAW,CAAC,CAAC;iBAChL,IAAI,SAAS;gBACd,aAAa,GAAG,IAAI,aAAa,CAAC,kCAAkC,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,WAAW,YAAY,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,SAAkB,EAAE,EAAE,WAAW,CAAC,CAAC;YAE5L,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,CAAC,mBAAmB,CACnC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,aAAa,CAChB,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,+BAA+B;QAC3B,OAAO,IAAI,CAAC,yBAAyB,GAAG,CAAC,IAAI,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,QAAQ,CAAC,yCAAyC,KAAK,CAAC,CAAC;IAChJ,CAAC;IAED,uBAAuB;QACnB,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE5E,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,CAAC,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAElM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,CAAC;IAED,eAAe;QACX,IAAI,IAAI,CAAC,QAAQ;YACb,MAAM,IAAI,aAAa,CAAC,+EAA+E,CAAC,CAAC;IACjH,CAAC;IAED,2BAA2B;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB;YACjC,MAAM,IAAI,aAAa,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,kDAAkD,CAAC,CAAC;IACxK,CAAC;IAED,kBAAkB;QACd,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5F,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3F,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAClG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,CAAC;IAED,qBAAqB;QACjB,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/F,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9F,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACrG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAChF,CAAC;IAED,SAAS,CAAC,KAAmB,EAAE,WAAmB,EAAE,aAAqB,EAAE,8BAAuC;QAC9G,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,OAAO;YAC/G,OAAO,KAAK,CAAC;QAEjB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;YACnB,OAAO,KAAK,CAAC;QAEjB,IAAI,8BAA8B;YAC9B,OAAO,KAAK,CAAC;QAEjB,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAC5B,OAAO,KAAK,CAAC;QAEjB,IAAI,KAAK,IAAI,KAAK,YAAY,YAAY;YACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,sBAAsB,IAAI,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,sBAAuB,CAAC;QAE9G,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAiB,GAAG,CAAC,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAiB,CAAC;IAChG,CAAC;IAED,iCAAiC,CAAC,KAAmB;QACjD,IAAI,CAAC;YACD,IAAI,OAAO,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ;gBACxC,OAAO,KAAK,CAAC;YAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAElD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;gBACzB,OAAO,KAAK,CAAC;YAEjB,OAAO,QAAQ,CAAC,cAAc,KAAK,IAAI,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC;YACH,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,kBAAkB,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC,CAAC;IAEF,iBAAiB,GAAG,GAAG,EAAE;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,iBAAiB,GAAG,GAAG,EAAE;QACrB,IAAI,IAAI,CAAC,cAAc,CAAC,gBAAgB;YACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,aAAa,GAAG,CAAC,IAAiC,EAAE,EAAE;QAClD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE;YACtC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC,CAAC;IAEF,WAAW,GAAG,CAAC,IAAwB,EAAE,EAAE;QACvC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC;IAEF,cAAc;QACV,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YAC7B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACzB,KAAK,EAAE,yBAAyB,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;SAC9D,CAAC;IACN,CAAC;IAED,cAAc,CAAC,KAAmB;QAC9B,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAC5B,OAAO,iBAAiB,CAAC,QAAQ,CAAC;QAEtC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,gBAAgB,CAAC,KAAc;QAC3B,IAAI,CAAC,KAAK;YACN,OAAO,KAAK,CAAC;QAEjB,IAAI,OAAO,GAAG,KAAyE,CAAC;QACxF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;gBACzB,OAAO,IAAI,CAAC;YAEhB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACzE,OAAO,IAAI,CAAC;YAEhB,OAAO,GAAG,OAAO,CAAC,KAAyE,CAAC;QAChG,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport { RequestError } from \"got\";\nimport sleep from \"abortable-sleep\";\n\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport DownloadError from \"./dtos/downloadError.js\";\nimport TransferDownloadEvent from \"./dtos/downloadEvent.js\";\nimport DownloadErrorCode from \"./dtos/downloadErrorCode.js\";\nimport DownloadFileChunkProgress from \"./downloadStatus/downloadFileChunkProgress.js\";\nimport { isBaseResponse } from \"../utils/api/dtos/baseResponse.js\";\n\nimport type DownloadFileChunkInfo from \"./dtos/downloadFileChunkInfo.js\";\nimport type DownloadFileInfo from \"./dtos/downloadFileInfo.js\";\nimport type DownloadOptions from \"./downloadOptions.js\";\nimport type DownloadState from \"./downloadStatus/downloadState.js\";\nimport type FileServerClientFactory from \"../utils/api/fileServerClientFactory.js\";\nimport type ChunkStreamProviderFactory from \"../utils/fileSystem/chunkStreamProviderFactory.js\";\nimport type EventsEngine from \"../utils/events/eventsEngine.js\";\nimport type FileServerDownloadClient from \"./api/fileServerDownloadClient.js\";\nimport type ChunkProgressEvent from \"../utils/events/chunkProgressEvent.js\";\nimport type FileDownloadFailedEventArgs from \"./eventArgs/fileDownloadFailedEventArgs.js\";\nimport type DownloadLogger from \"./downloadLogger.js\";\nimport type { ChunkStreamProviderEncryptionData } from \"../utils/fileSystem/chunkStreamProvider.js\";\n\nexport default class ChunkDownloader {\n #logger: DownloadLogger;\n #transferId: string;\n #chunk: DownloadFileChunkInfo;\n #file: DownloadFileInfo;\n #downloadState: DownloadState;\n #options: DownloadOptions;\n #fileServerClientFactory: FileServerClientFactory;\n #chunkStreamProviderFactory: ChunkStreamProviderFactory<string>;\n #eventsEngine: EventsEngine;\n #chunkDownloadClient: FileServerDownloadClient;\n #encryptionData?: ChunkStreamProviderEncryptionData;\n #bytesTransferred = 0;\n #running = false;\n #consecutiveNetworkErrors = 0;\n\n constructor(\n transferId: string,\n file: DownloadFileInfo,\n chunk: DownloadFileChunkInfo,\n downloadState: DownloadState,\n options: DownloadOptions,\n fileServerClientFactory: FileServerClientFactory,\n chunkStreamProviderFactory: ChunkStreamProviderFactory<string>,\n eventsEngine: EventsEngine,\n logger: DownloadLogger,\n encryptionData?: ChunkStreamProviderEncryptionData,\n ) {\n this.#transferId = transferId;\n this.#options = options;\n this.#file = file;\n this.#chunk = chunk;\n this.#downloadState = downloadState;\n this.#fileServerClientFactory = fileServerClientFactory;\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#eventsEngine = eventsEngine;\n this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerTcpDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);\n this.#logger = logger;\n this.#encryptionData = encryptionData;\n }\n\n async download(): Promise<void> {\n this.#throwIfRunning();\n this.#throwIfMissingDownloadPath();\n\n this.#running = true;\n\n let writtenCorrectly = false;\n let attempts = 0;\n let writeErrors = 0;\n let networkErrors = 0;\n let apiReturnedNotOkResponseStatus: boolean = false;\n let lastError: Error | null = null;\n let unhandledError: Error | null = null;\n\n try {\n this.#downloadState.chunkDownloadStarted(this.#file, this.#chunk);\n\n this.#addEventListeners();\n\n let fileserverMd5Promise: Promise<string> | null = this.#options.checkChunksMd5\n ? this.#chunkDownloadClient.getMd5Checksum()\n : null;\n\n while (writtenCorrectly === false && this.#canRetry(lastError as Error, writeErrors, networkErrors, apiReturnedNotOkResponseStatus)) {\n attempts += 1;\n\n this.#bytesTransferred = 0;\n\n if (this.#isDownloadClientRecreateNeeded()) {\n this.#recreateDownloadClient();\n\n fileserverMd5Promise = this.#options.checkChunksMd5\n ? this.#chunkDownloadClient.getMd5Checksum()\n : null;\n }\n\n const chunkWriter = this.#chunkStreamProviderFactory.provide(this.#file.temporaryDownloadPath!, this.#chunk.start ?? 0, this.#chunk.chunkSize, this.#encryptionData);\n\n try {\n await this.#chunkDownloadClient.download(chunkWriter, this.#encryptionData);\n\n if (this.#bytesTransferred !== this.#chunk.chunkSize) {\n if (this.#bytesTransferred > this.#chunk.chunkSize)\n this.#downloadState.possibleSupersizedFile(this.#file);\n\n throw new DownloadError(`Download request returned incorrect amount of data. Expected=${this.#chunk.chunkSize} Received=${this.#bytesTransferred}`, undefined, DownloadErrorCode.FileserverResponseWrongSize);\n }\n\n this.#consecutiveNetworkErrors = 0;\n networkErrors = 0;\n this.#downloadState.networkOk();\n\n if (this.#downloadState.status !== TransferStatus.Aborting) {\n if (fileserverMd5Promise !== null) {\n const remoteMd5 = await fileserverMd5Promise;\n const localMd5 = await chunkWriter.getMd5Checksum(`hex`);\n if (remoteMd5.toLowerCase() === localMd5.toLowerCase())\n writtenCorrectly = true;\n else {\n writeErrors += 1;\n lastError = new DownloadError(`MD5 checksum incorrect: fileserver=${remoteMd5} local=${localMd5}`);\n }\n }\n else\n writtenCorrectly = true;\n }\n }\n catch (error) {\n // note: getting an exception here may be caused by abort or stop operations\n // both operations immediately interrupt HTTP download request by calling chunkDownloadClient.release()\n if (this.#downloadState.pauseImmediately || this.#downloadState.status === TransferStatus.Aborting)\n lastError = null;\n else {\n lastError = error as Error;\n\n if (lastError instanceof RequestError) {\n if (this.#isApiNotOkResponseStatusResponse(lastError))\n apiReturnedNotOkResponseStatus = true;\n else {\n this.#consecutiveNetworkErrors += 1;\n networkErrors += 1;\n this.#downloadState.networkFailure();\n }\n }\n else\n writeErrors += 1;\n\n this.#logger.logError(lastError, `[CHUNK_DOWNLOADER_ERROR] Error in retry loop when downloading chunk attempt=${attempts} writeerrors=${writeErrors} networkerrors=${networkErrors}`, this.#errorInfoDump());\n }\n }\n finally {\n await chunkWriter?.release();\n this.#chunkDownloadClient?.release();\n\n let sleepTime = 0;\n if (this.#downloadState.isThereNetworkProblem)\n sleepTime = this.#options.fileserverOfflineCheckIntervalMillis;\n else if (networkErrors > 0) {\n const pow = Math.min(networkErrors, this.#options.fileserverOfflineAfterConsecutiveAttempts);\n sleepTime = this.#options.fileserverOfflineCheckIntervalMillis * (2 ** (pow - this.#options.fileserverOfflineAfterConsecutiveAttempts));\n }\n\n if (sleepTime > 0)\n await sleep(sleepTime);\n }\n }\n }\n catch (error) {\n unhandledError = error as Error;\n this.#logger.logError(unhandledError, `[CHUNK_DOWNLOADER_ERROR] Unhandled error when downloading chunk`, this.#errorInfoDump());\n }\n finally {\n this.#removeEventListeners();\n }\n\n if (writtenCorrectly)\n this.#downloadState.chunkDownloadCompleted(this.#file, this.#chunk);\n else {\n let downloadError: DownloadError | null = null;\n const failureCode = this.#toFailureCode(unhandledError ?? lastError);\n\n if (unhandledError)\n downloadError = new DownloadError(`Unhandled chunk download error for file ${this.#file.url} chunk ${this.#chunk.chunkNumber}`, { cause: unhandledError as Error }, failureCode);\n else if (lastError)\n downloadError = new DownloadError(`Chunk download failed for file ${this.#file.url} chunk ${this.#chunk.chunkNumber} attempt ${attempts}.`, { cause: lastError as Error }, failureCode);\n\n if (downloadError !== null) {\n this.#downloadState.chunkDownloadFailed(\n this.#file,\n this.#chunk,\n downloadError,\n );\n }\n }\n\n this.#running = false;\n }\n\n #isDownloadClientRecreateNeeded(): boolean {\n return this.#consecutiveNetworkErrors > 0 && this.#consecutiveNetworkErrors % this.#options.fileserverOfflineAfterConsecutiveAttempts === 0;\n }\n\n #recreateDownloadClient() {\n this.#chunkDownloadClient.removeEventListener(`progress`, this.#onProgress);\n\n this.#chunkDownloadClient = this.#fileServerClientFactory.createFileServerTcpDownloadClient(this.#file.url, this.#chunk.start, this.#chunk.end, this.#transferId, this.#file.name, this.#options);\n\n this.#chunkDownloadClient.addEventListener(`progress`, this.#onProgress);\n }\n\n #throwIfRunning() {\n if (this.#running)\n throw new DownloadError(`This instance of chunk downloader is already in use. Please create a new one.`);\n }\n\n #throwIfMissingDownloadPath() {\n if (!this.#file.temporaryDownloadPath)\n throw new DownloadError(`Download file ${this.#file.externalId}/${this.#file.name}/${this.#file.downloadPath} is missing the required \"temporaryDownloadPath\"`);\n }\n\n #addEventListeners() {\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Aborting, this.#onAbortRequested);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.Pausing, this.#onPauseRequested);\n this.#eventsEngine.addEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#chunkDownloadClient.addEventListener(`progress`, this.#onProgress);\n }\n\n #removeEventListeners() {\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Aborting, this.#onAbortRequested);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.Pausing, this.#onPauseRequested);\n this.#eventsEngine.removeEventListener(TransferDownloadEvent.FileDownloadFailed, this.#onFileFailed);\n this.#chunkDownloadClient.removeEventListener(`progress`, this.#onProgress);\n }\n\n #canRetry(error: Error | null, writeErrors: number, networkErrors: number, apiReturnedNotOkResponseStatus: boolean) {\n if (this.#downloadState.status === TransferStatus.Aborting || this.#downloadState.status === TransferStatus.Pausing)\n return false;\n\n if (this.#file.isFailed)\n return false;\n\n if (apiReturnedNotOkResponseStatus)\n return false;\n\n if (this.#isDiskFullError(error))\n return false;\n\n if (error && error instanceof RequestError)\n return this.#options.fileserverAttemptLimit <= 0 || networkErrors < this.#options.fileserverAttemptLimit!;\n\n return this.#options.maxWriteAttempts! < 0 || writeErrors < this.#options.maxWriteAttempts!;\n }\n\n #isApiNotOkResponseStatusResponse(error: RequestError): boolean {\n try {\n if (typeof error.response?.body !== `string`)\n return false;\n\n const response = JSON.parse(error.response?.body);\n\n if (!isBaseResponse(response))\n return false;\n\n return response.responsestatus !== `OK`;\n }\n catch {\n return false;\n }\n }\n\n /**\n * This method aborts pending download - it can be achieved only by destroying the download client\n * (which in turn destroys the underlying download HTTP request). This operation\n * will throw an expected exception inside download method (in main while loop). See {@link download} method.\n */\n #interruptDownload = () => {\n this.#chunkDownloadClient?.release();\n };\n\n #onAbortRequested = () => {\n this.#interruptDownload();\n };\n\n #onPauseRequested = () => {\n if (this.#downloadState.pauseImmediately)\n this.#interruptDownload();\n };\n\n #onFileFailed = (args: FileDownloadFailedEventArgs) => {\n if (this.#file.externalId === args.file.id)\n this.#chunkDownloadClient?.release();\n };\n\n #onProgress = (args: ChunkProgressEvent) => {\n this.#bytesTransferred = args.transferredBytesTotal;\n this.#downloadState.chunkDownloadProgressed(this.#file, this.#chunk, args);\n };\n\n #errorInfoDump() {\n return {\n fileid: this.#file.externalId,\n filename: this.#file.name,\n chunk: DownloadFileChunkProgress.FromChunkInfo(this.#chunk),\n };\n }\n\n #toFailureCode(error: Error | null): DownloadErrorCode | undefined {\n if (this.#isDiskFullError(error))\n return DownloadErrorCode.DiskFull;\n\n return undefined;\n }\n\n #isDiskFullError(error: unknown): boolean {\n if (!error)\n return false;\n\n let current = error as { message?: string, code?: string, cause?: unknown } | undefined;\n for (let depth = 0; depth < 8 && current; depth++) {\n if (current.code === `ENOSPC`)\n return true;\n\n if (typeof current.message === `string` && current.message.includes(`ENOSPC`))\n return true;\n\n current = current.cause as { message?: string, code?: string, cause?: unknown } | undefined;\n }\n\n return false;\n }\n}\n"]}
|
|
@@ -2,6 +2,8 @@ interface TransferUploadCompletedEventArgs {
|
|
|
2
2
|
transferId: string;
|
|
3
3
|
transferKey: string;
|
|
4
4
|
transferDownloadUrl: string;
|
|
5
|
+
fileServerUrl: string;
|
|
6
|
+
region?: string;
|
|
5
7
|
}
|
|
6
8
|
export default TransferUploadCompletedEventArgs;
|
|
7
9
|
//# sourceMappingURL=transferUploadCompletedEventArgs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadCompletedEventArgs.d.ts","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadCompletedEventArgs.ts"],"names":[],"mappings":"AAAA,UAAU,gCAAgC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"transferUploadCompletedEventArgs.d.ts","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadCompletedEventArgs.ts"],"names":[],"mappings":"AAAA,UAAU,gCAAgC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAe,gCAAgC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadCompletedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadCompletedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadCompletedEventArgs {\n transferId: string,\n transferKey: string,\n transferDownloadUrl: string
|
|
1
|
+
{"version":3,"file":"transferUploadCompletedEventArgs.js","sourceRoot":"","sources":["../../../../src/uploader/eventArgs/transferUploadCompletedEventArgs.ts"],"names":[],"mappings":"","sourcesContent":["interface TransferUploadCompletedEventArgs {\n transferId: string,\n transferKey: string,\n transferDownloadUrl: string,\n fileServerUrl: string,\n region?: string,\n}\n\nexport default TransferUploadCompletedEventArgs;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferUploadState.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAEnE,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAKjE,OAAO,KAAK,kBAAkB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,WAAW,MAAM,uCAAuC,CAAC;AAMrE,OAAO,KAAK,+BAA+B,MAAM,sCAAsC,CAAC;AACxF,OAAO,KAAK,gCAAgC,MAAM,uCAAuC,CAAC;AAE1F,OAAO,KAAK,yBAAyB,MAAM,wCAAwC,CAAC;AAEpF,OAAO,KAAK,sBAAsB,MAAM,qCAAqC,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,CAAC,OAAO,OAAO,mBAAmB;;IAmBpC,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,KAAK,IAAI,gCAAgC,CAE5C;gBAEW,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM;gBAChI,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,EAAE,aAAa,EAAE,yBAAyB;IAgBtL,OAAO,CAAC,wBAAwB;IAQhC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAInF,MAAM,IAAI,yBAAyB;IAInC,OAAO;IAuBP,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,+BAA+B;IAIzE,OAAO,CAAC,eAAe;IASvB,WAAW;IAQX,sBAAsB;IAMtB,cAAc;IAQd,sBAAsB;IAMtB,eAAe;IAkBf,uBAAuB;IAMvB,gBAAgB;IAQhB,iBAAiB,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"transferUploadState.d.ts","sourceRoot":"","sources":["../../../../src/uploader/state/transferUploadState.ts"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAEnE,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAKjE,OAAO,KAAK,kBAAkB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,WAAW,MAAM,uCAAuC,CAAC;AAMrE,OAAO,KAAK,+BAA+B,MAAM,sCAAsC,CAAC;AACxF,OAAO,KAAK,gCAAgC,MAAM,uCAAuC,CAAC;AAE1F,OAAO,KAAK,yBAAyB,MAAM,wCAAwC,CAAC;AAEpF,OAAO,KAAK,sBAAsB,MAAM,qCAAqC,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,MAAM,CAAC,OAAO,OAAO,mBAAmB;;IAmBpC,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,KAAK,IAAI,gCAAgC,CAE5C;gBAEW,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM;gBAChI,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,EAAE,aAAa,EAAE,yBAAyB;IAgBtL,OAAO,CAAC,wBAAwB;IAQhC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE;IAInF,MAAM,IAAI,yBAAyB;IAInC,OAAO;IAuBP,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,+BAA+B;IAIzE,OAAO,CAAC,eAAe;IASvB,WAAW;IAQX,sBAAsB;IAMtB,cAAc;IAQd,sBAAsB;IAMtB,eAAe;IAkBf,uBAAuB;IAMvB,gBAAgB;IAQhB,iBAAiB,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM;IAevF,cAAc;IAQd,iBAAiB,CAAC,IAAI,EAAE,uBAAuB;IAO/C,mBAAmB,CAAC,IAAI,EAAE,uBAAuB;IAUjD,gBAAgB,CAAC,IAAI,EAAE,uBAAuB;IAU9C,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAYxG,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,GAAG,IAAI;IAcpJ,OAAO,CAAC,iCAAiC;IAczC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS;IAqBtI,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAyB3L,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAsB1K"}
|