filemail-sdk 9.4.0 → 9.4.2

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.
@@ -21,6 +21,7 @@ export default class NodeTransferDownloader implements TransferDownloader {
21
21
  #private;
22
22
  constructor(options: DownloadOptions, envValues: EnvironmentVariables, logger: Logger);
23
23
  private addHealthMonitorEventListeners;
24
+ private getHealthStatusLogEntryMetadata;
24
25
  private addTransferEventListeners;
25
26
  get status(): TransferStatus | null;
26
27
  get state(): DownloadEventArgs | null;
@@ -1 +1 @@
1
- {"version":3,"file":"nodeTransferDownloader.d.ts","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,MAAM,wCAAwC,CAAC;AAErE,OAAO,qBAAqB,MAAM,2CAA2C,CAAC;AAQ9E,OAAO,+BAA+B,MAAM,wDAAwD,CAAC;AAKrG,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,iBAAiB,MAAM,oDAAoD,CAAC;AACxF,OAAO,KAAK,qBAAqB,MAAM,wDAAwD,CAAC;AAChG,OAAO,KAAK,2BAA2B,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAC;AACzE,OAAO,KAAK,sBAAsB,MAAM,yDAAyD,CAAC;AAClG,OAAO,KAAK,4BAA4B,MAAM,+DAA+D,CAAC;AAC9G,OAAO,KAAK,0BAA0B,MAAM,6DAA6D,CAAC;AAC1G,OAAO,KAAK,sBAAsB,MAAM,yDAAyD,CAAC;AAClG,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAClD,OAAO,KAAK,YAAY,MAAM,0CAA0C,CAAC;AACzE,OAAO,KAAK,eAAe,MAAM,6CAA6C,CAAC;AAC/E,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAC;AACzF,OAAO,KAAK,+BAA+B,MAAM,kEAAkE,CAAC;AACpH,OAAO,KAAK,mCAAmC,MAAM,sEAAsE,CAAC;AAE5H,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,kBAAkB;;gBASzD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;IAuBrF,OAAO,CAAC,8BAA8B;IAuBtC,OAAO,CAAC,yBAAyB;IAsCjC,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAElC;IAED,IAAI,KAAK,IAAI,iBAAiB,GAAG,IAAI,CAEpC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,IAAI,aAAa,IAAI,+BAA+B,CAEnD;IAEK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAI9B,MAAM,IAAI,OAAO;IAIjB,KAAK,IAAI,OAAO;IAIhB,gBAAgB,CAAC,SAAS,EACtB,qBAAqB,CAAC,QAAQ,GAC9B,qBAAqB,CAAC,OAAO,GAC7B,qBAAqB,CAAC,OAAO,GAC7B,qBAAqB,CAAC,4BAA4B,GAClD,qBAAqB,CAAC,eAAe,GACrC,qBAAqB,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI;IAE/F,gBAAgB,CAAC,SAAS,EAAE,qBAAqB,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,IAAI,GAAG,IAAI;IAC/H,gBAAgB,CAAC,SAAS,EAAE,qBAAqB,CAAC,OAAO,GAAG,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI;IAChJ,gBAAgB,CAAC,SAAS,EAAE,qBAAqB,CAAC,cAAc,GAAG,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAC9H,gBAAgB,CAAC,SAAS,EAAE,qBAAqB,CAAC,0BAA0B,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,mCAAmC,KAAK,IAAI,GAAG,IAAI;IAEjJ,gBAAgB,CAAC,SAAS,EACtB,qBAAqB,CAAC,oBAAoB,GAC1C,qBAAqB,CAAC,uBAAuB,GAC7C,qBAAqB,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI;IAExG,gBAAgB,CAAC,SAAS,EAAE,qBAAqB,CAAC,mBAAmB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,IAAI,GAAG,IAAI;IAEnI,gBAAgB,CAAC,SAAS,EACtB,qBAAqB,CAAC,sBAAsB,GAC5C,qBAAqB,CAAC,mBAAmB,GACzC,qBAAqB,CAAC,sBAAsB,GAC5C,qBAAqB,CAAC,sBAAsB,GAC5C,qBAAqB,CAAC,qBAAqB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,GAAG,IAAI;IAEtG,gBAAgB,CAAC,SAAS,EAAE,qBAAqB,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,2BAA2B,KAAK,IAAI,GAAG,IAAI;IACjI,gBAAgB,CAAC,SAAS,EAAE,qBAAqB,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,+BAA+B,KAAK,IAAI,GAAG,IAAI;IAMzI,OAAO,CAAC,kCAAkC;IAIpC,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAQjE,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAQvE,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ3E,uBAAuB,IAAI,OAAO,CAAC,YAAY,CAAC;IAQhD,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQrE,eAAe,CAAC,UAAU,GAAE,MAAM,GAAG,IAAW;CAGzD"}
1
+ {"version":3,"file":"nodeTransferDownloader.d.ts","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"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"}
@@ -14,11 +14,13 @@ import TransferDownloaderHealthMonitor from '../../healthMonitor/transferDownloa
14
14
  import logHealthyStatus from '../../loggers/utils/logHealthyStatus.js';
15
15
  import NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';
16
16
  import TransferHealthMonitorEvent from '../../healthMonitor/events/transferHealthMonitorEvent.js';
17
+ import logEventPropertyName from '../../../utils/logging/logEventPropertyNames.js';
17
18
  export default class NodeTransferDownloader {
18
19
  #eventsEngine;
19
20
  #downloader;
20
21
  #logger;
21
22
  #healthMonitor;
23
+ #trackingId;
22
24
  #isHealthy = true;
23
25
  #logHealthyStatusThrottled;
24
26
  constructor(options, envValues, logger) {
@@ -33,6 +35,7 @@ export default class NodeTransferDownloader {
33
35
  this.#logger = new DownloadLogger(logger, optionsResolved.trackingId);
34
36
  this.#eventsEngine = new NodeEventsEngine();
35
37
  this.#healthMonitor = new TransferDownloaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), this.#eventsEngine);
38
+ this.#trackingId = optionsResolved.trackingId;
36
39
  this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient, chunkProvider, fileserverClientFactory, fileSystem, this.#eventsEngine, cryptography, this.#healthMonitor);
37
40
  this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);
38
41
  this.addHealthMonitorEventListeners();
@@ -40,20 +43,33 @@ export default class NodeTransferDownloader {
40
43
  }
41
44
  addHealthMonitorEventListeners() {
42
45
  this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {
43
- this.#logHealthyStatusThrottled(this.#logger, true, eventArgs);
46
+ const logEntryMetadata = this.getHealthStatusLogEntryMetadata();
47
+ this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, logEntryMetadata);
44
48
  if (!this.#isHealthy)
45
- logHealthyStatus(this.#logger, true, eventArgs);
49
+ logHealthyStatus(this.#logger, true, eventArgs, logEntryMetadata);
46
50
  this.#isHealthy = true;
47
51
  });
48
52
  this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {
49
53
  if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)
50
54
  return;
51
- this.#logHealthyStatusThrottled(this.#logger, false, eventArgs);
55
+ const logEntryMetadata = this.getHealthStatusLogEntryMetadata();
56
+ this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, logEntryMetadata);
52
57
  if (this.#isHealthy)
53
- logHealthyStatus(this.#logger, false, eventArgs);
58
+ logHealthyStatus(this.#logger, false, eventArgs, logEntryMetadata);
54
59
  this.#isHealthy = false;
55
60
  });
56
61
  }
62
+ getHealthStatusLogEntryMetadata() {
63
+ const metadata = {
64
+ [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,
65
+ };
66
+ const state = this.#downloader.state;
67
+ if (state?.transferId)
68
+ metadata[logEventPropertyName.TransferIdPropertyName] = state.transferId;
69
+ if (state?.downloadId)
70
+ metadata[logEventPropertyName.DownloadIdPropertyName] = state.downloadId;
71
+ return metadata;
72
+ }
57
73
  addTransferEventListeners() {
58
74
  this.addEventListener(TransferDownloadEvent.DownloadStarted, args => {
59
75
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -1 +1 @@
1
- {"version":3,"file":"nodeTransferDownloader.js","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as guid } from 'uuid';\nimport throttle from \"lodash.throttle\";\n\nimport DownloadOptions from \"../../../downloader/downloadOptions.js\";\nimport DownloaderCore from \"../downloaderCore.js\";\nimport TransferDownloadEvent from \"../../../downloader/dtos/downloadEvent.js\";\nimport NodeFileServerClientFactory from \"../../../utils/api/node/nodeFileServerClientFactory.js\";\nimport NodeChunkStreamProviderFactory from \"../../../utils/fileSystem/node/nodeChunkStreamProviderFactory.js\";\nimport NodeFileSystemService from \"../../../utils/fileSystem/node/nodeFileSystemService.js\";\nimport NodeApiClient from \"../../../utils/api/node/nodeApiClient.js\";\nimport NodeEventsEngine from '../../../utils/events/node/nodeEventsEngine.js';\nimport DownloadLogger from \"../../../downloader/downloadLogger.js\";\nimport NodeCryptographyProvider from '../../../utils/crypto/node/nodeCryptographyProvider.js';\nimport TransferDownloaderHealthMonitor from '../../healthMonitor/transferDownloaderHealthMonitor.js';\nimport logHealthyStatus from '../../loggers/utils/logHealthyStatus.js';\nimport NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';\nimport TransferHealthMonitorEvent from '../../healthMonitor/events/transferHealthMonitorEvent.js';\n\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferDownloader from \"../transferDownloader.js\";\nimport type DownloadEventArgs from '../../../downloader/eventArgs/downloadEventArgs.js';\nimport type FileDownloadEventArgs from '../../../downloader/eventArgs/fileDownloadEventArgs.js';\nimport type FileDownloadFailedEventArgs from '../../../downloader/eventArgs/fileDownloadFailedEventArgs.js';\nimport type TransferStatus from '../../../utils/types/transferStatus.js';\nimport type ChunkDownloadEventArgs from '../../../downloader/eventArgs/chunkDownloadEventArgs.js';\nimport type ChunkDownloadFailedEventArgs from '../../../downloader/eventArgs/chunkDownloadFailedEventArgs.js';\nimport type DownloadCompletedEventArgs from '../../../downloader/eventArgs/downloadCompletedEventArgs.js';\nimport type DownloadPauseEventArgs from \"../../../downloader/eventArgs/downloadPauseEventArgs.js\";\nimport type Logger from \"../../loggers/logger.js\";\nimport type DownloadInfo from \"../../../downloader/dtos/downloadInfo.js\";\nimport type DownloadCommand from \"../../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../../downloader/dtos/downloadFilesCommand.js\";\nimport type DownloadTrackingFailedEventArgs from \"../../../downloader/eventArgs/downloadTrackingFailedEventArgs.js\";\nimport type DownloadMetadataDeterminedEventArgs from '../../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js';\n\nexport default class NodeTransferDownloader implements TransferDownloader {\n readonly #eventsEngine: NodeEventsEngine;\n readonly #downloader: DownloaderCore;\n readonly #logger: DownloadLogger;\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(options: DownloadOptions, envValues: EnvironmentVariables, logger: Logger) {\n const optionsResolved = this.#buildOptions(options);\n\n const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, optionsResolved.apiRequestTotalTimeoutInMs, optionsResolved.apiRetryLimit);\n if (optionsResolved.logintoken)\n apiClient.setLoginToken(optionsResolved.logintoken);\n\n const chunkProvider = new NodeChunkStreamProviderFactory();\n const fileserverClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, optionsResolved.fileserverDownloadIdleTimeMs!, optionsResolved.fileserverAttemptLimit!);\n const fileSystem = new NodeFileSystemService();\n const cryptography = new NodeCryptographyProvider();\n this.#logger = new DownloadLogger(logger, optionsResolved.trackingId!);\n this.#eventsEngine = new NodeEventsEngine();\n this.#healthMonitor = new TransferDownloaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), this.#eventsEngine);\n\n this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient, chunkProvider, fileserverClientFactory, fileSystem, this.#eventsEngine, cryptography, this.#healthMonitor);\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs);\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs);\n\n this.#isHealthy = true;\n });\n\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {\n if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)\n return;\n\n this.#logHealthyStatusThrottled(this.#logger, false, eventArgs);\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs);\n\n this.#isHealthy = false;\n });\n }\n\n private addTransferEventListeners() {\n this.addEventListener(TransferDownloadEvent.DownloadStarted, args => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download started`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.Aborting, args => this.#logger.logInfo(`Download aborting ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Aborted, args => this.#logger.logInfo(`Download aborted ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Pausing, args => this.#logger.logInfo(`Download pausing ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.Paused, args => this.#logger.logInfo(`Download paused ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.RecoveredInterruptedDownload, args => this.#logger.logInfo(`Download recovered ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.DownloadCompleted, args => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download completed`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.FileDownloadStarted, args => this.#logger.logDebug(`File download started`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadCompleted, args => this.#logger.logDebug(`File download completed`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadFailed, args => {\n const { reason, ...errorInfoWithoutException } = args;\n this.#logger.logError(reason, `File download failed`, errorInfoWithoutException);\n });\n this.addEventListener(TransferDownloadEvent.DownloadTrackingFailed, args => {\n const { error, ...errorInfoWithoutException } = args;\n if (error)\n this.#logger.logError(error, `Progress tracking failed`, errorInfoWithoutException);\n else\n this.#logger.logWarning(`Progress tracking failed`, errorInfoWithoutException);\n });\n }\n\n #buildOptions(options: DownloadOptions) {\n const opts = { ...new DownloadOptions(), ...options };\n if (!opts.trackingId)\n opts.trackingId = guid();\n return opts;\n }\n\n get status(): TransferStatus | null {\n return this.#downloader.status;\n }\n\n get state(): DownloadEventArgs | null {\n return this.#downloader.state;\n }\n\n get downloadId(): string | undefined {\n return this.#downloader.downloadId;\n }\n\n get healthMonitor(): TransferDownloaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n async pause(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: false });\n }\n\n async stop(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: true });\n }\n\n resume(): boolean {\n return this.#downloader.resume();\n }\n\n abort(): boolean {\n return this.#downloader.abort();\n }\n\n addEventListener(eventName:\n TransferDownloadEvent.Aborting |\n TransferDownloadEvent.Aborted |\n TransferDownloadEvent.Resumed |\n TransferDownloadEvent.RecoveredInterruptedDownload |\n TransferDownloadEvent.DownloadStarted |\n TransferDownloadEvent.DownloadProgressed, handler: (args: DownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.DownloadCompleted, handler: (args: DownloadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.Pausing | TransferDownloadEvent.Paused, handler: (args: DownloadPauseEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.NetworkFailure | TransferDownloadEvent.NetworkOk, handler: () => void): void\n addEventListener(eventName: TransferDownloadEvent.TransferMetadataDetermined, handler: (args: DownloadMetadataDeterminedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.ChunkDownloadStarted |\n TransferDownloadEvent.ChunkDownloadProgressed |\n TransferDownloadEvent.ChunkDownloadCompleted, handler: (args: ChunkDownloadEventArgs) => void): void;\n\n addEventListener(eventName: TransferDownloadEvent.ChunkDownloadFailed, handler: (args: ChunkDownloadFailedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.PossibleSupersizedFile |\n TransferDownloadEvent.FileDownloadStarted |\n TransferDownloadEvent.FileDownloadProgressed |\n TransferDownloadEvent.FileDownloadCompleting |\n TransferDownloadEvent.FileDownloadCompleted, handler: (args: FileDownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.FileDownloadFailed, handler: (args: FileDownloadFailedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.DownloadTrackingFailed, handler: (args: DownloadTrackingFailedEventArgs) => void): void\n\n addEventListener(eventName: string, handler: (args?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n private cancelHealthyStatusThrottledMethod(promise: Promise<DownloadInfo>) {\n promise.then(downloadInfo => downloadInfo.completion.finally(() => this.#logHealthyStatusThrottled.cancel()));\n }\n\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFilesZipped(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadSpecificFiles(command: DownloadFilesCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadSpecificFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async restartFailedDownloader(): Promise<DownloadInfo> {\n const promise = this.#downloader.restartFailedDownloader();\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\n const promise = this.#downloader.recoverInterruptedDownload(downloadId);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async cleanupDownload(downloadId: string | null = null) {\n await this.#downloader.cleanupDownload(downloadId);\n }\n}"]}
1
+ {"version":3,"file":"nodeTransferDownloader.js","sourceRoot":"","sources":["../../../../../src/client/downloader/node/nodeTransferDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as guid } from 'uuid';\nimport throttle from \"lodash.throttle\";\n\nimport DownloadOptions from \"../../../downloader/downloadOptions.js\";\nimport DownloaderCore from \"../downloaderCore.js\";\nimport TransferDownloadEvent from \"../../../downloader/dtos/downloadEvent.js\";\nimport NodeFileServerClientFactory from \"../../../utils/api/node/nodeFileServerClientFactory.js\";\nimport NodeChunkStreamProviderFactory from \"../../../utils/fileSystem/node/nodeChunkStreamProviderFactory.js\";\nimport NodeFileSystemService from \"../../../utils/fileSystem/node/nodeFileSystemService.js\";\nimport NodeApiClient from \"../../../utils/api/node/nodeApiClient.js\";\nimport NodeEventsEngine from '../../../utils/events/node/nodeEventsEngine.js';\nimport DownloadLogger from \"../../../downloader/downloadLogger.js\";\nimport NodeCryptographyProvider from '../../../utils/crypto/node/nodeCryptographyProvider.js';\nimport TransferDownloaderHealthMonitor from '../../healthMonitor/transferDownloaderHealthMonitor.js';\nimport logHealthyStatus from '../../loggers/utils/logHealthyStatus.js';\nimport NodeOnlineChecker from '../../healthMonitor/onlineChecker/nodeOnlineChecker.js';\nimport TransferHealthMonitorEvent from '../../healthMonitor/events/transferHealthMonitorEvent.js';\nimport logEventPropertyName from '../../../utils/logging/logEventPropertyNames.js';\n\nimport type EnvironmentVariables from \"../../environmentVariables.js\";\nimport type TransferDownloader from \"../transferDownloader.js\";\nimport type DownloadEventArgs from '../../../downloader/eventArgs/downloadEventArgs.js';\nimport type FileDownloadEventArgs from '../../../downloader/eventArgs/fileDownloadEventArgs.js';\nimport type FileDownloadFailedEventArgs from '../../../downloader/eventArgs/fileDownloadFailedEventArgs.js';\nimport type TransferStatus from '../../../utils/types/transferStatus.js';\nimport type ChunkDownloadEventArgs from '../../../downloader/eventArgs/chunkDownloadEventArgs.js';\nimport type ChunkDownloadFailedEventArgs from '../../../downloader/eventArgs/chunkDownloadFailedEventArgs.js';\nimport type DownloadCompletedEventArgs from '../../../downloader/eventArgs/downloadCompletedEventArgs.js';\nimport type DownloadPauseEventArgs from \"../../../downloader/eventArgs/downloadPauseEventArgs.js\";\nimport type Logger from \"../../loggers/logger.js\";\nimport type DownloadInfo from \"../../../downloader/dtos/downloadInfo.js\";\nimport type DownloadCommand from \"../../../downloader/dtos/downloadCommand.js\";\nimport type DownloadFilesCommand from \"../../../downloader/dtos/downloadFilesCommand.js\";\nimport type DownloadTrackingFailedEventArgs from \"../../../downloader/eventArgs/downloadTrackingFailedEventArgs.js\";\nimport type DownloadMetadataDeterminedEventArgs from '../../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js';\n\nexport default class NodeTransferDownloader implements TransferDownloader {\n readonly #eventsEngine: NodeEventsEngine;\n readonly #downloader: DownloaderCore;\n readonly #logger: DownloadLogger;\n readonly #healthMonitor: TransferDownloaderHealthMonitor;\n readonly #trackingId: string | number;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(options: DownloadOptions, envValues: EnvironmentVariables, logger: Logger) {\n const optionsResolved = this.#buildOptions(options);\n\n const apiClient = new NodeApiClient(envValues.apiBaseUrl, envValues.source, envValues.sourceDetails, optionsResolved.apiRequestTotalTimeoutInMs, optionsResolved.apiRetryLimit);\n if (optionsResolved.logintoken)\n apiClient.setLoginToken(optionsResolved.logintoken);\n\n const chunkProvider = new NodeChunkStreamProviderFactory();\n const fileserverClientFactory = new NodeFileServerClientFactory(envValues.source, envValues.sourceDetails, optionsResolved.fileserverDownloadIdleTimeMs!, optionsResolved.fileserverAttemptLimit!);\n const fileSystem = new NodeFileSystemService();\n const cryptography = new NodeCryptographyProvider();\n\n this.#logger = new DownloadLogger(logger, optionsResolved.trackingId!);\n this.#eventsEngine = new NodeEventsEngine();\n this.#healthMonitor = new TransferDownloaderHealthMonitor(new NodeOnlineChecker(envValues.apiBaseUrl), this.#eventsEngine);\n this.#trackingId = optionsResolved.trackingId!;\n\n this.#downloader = new DownloaderCore(optionsResolved, this.#logger, apiClient, chunkProvider, fileserverClientFactory, fileSystem, this.#eventsEngine, cryptography, this.#healthMonitor);\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\n\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, logEntryMetadata);\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, logEntryMetadata);\n\n this.#isHealthy = true;\n });\n\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Unhealthy, eventArgs => {\n if (eventArgs.reason.api.status === `Checking` || eventArgs.reason.fileServer.status === `Checking` || eventArgs.reason.internet.status === `Checking`)\n return;\n\n const logEntryMetadata = this.getHealthStatusLogEntryMetadata();\n\n this.#logHealthyStatusThrottled(this.#logger, false, eventArgs, logEntryMetadata);\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, logEntryMetadata);\n\n this.#isHealthy = false;\n });\n }\n\n private getHealthStatusLogEntryMetadata(): Record<string, unknown> {\n const metadata: Record<string, unknown> = {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n };\n\n const state = this.#downloader.state;\n\n if (state?.transferId)\n metadata[logEventPropertyName.TransferIdPropertyName] = state.transferId;\n\n if (state?.downloadId)\n metadata[logEventPropertyName.DownloadIdPropertyName] = state.downloadId;\n\n return metadata;\n }\n\n private addTransferEventListeners() {\n this.addEventListener(TransferDownloadEvent.DownloadStarted, args => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download started`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.Aborting, args => this.#logger.logInfo(`Download aborting ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Aborted, args => this.#logger.logInfo(`Download aborted ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.Pausing, args => this.#logger.logInfo(`Download pausing ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.Paused, args => this.#logger.logInfo(`Download paused ${args.transferId} / ${args.downloadId} / interrupt:${args.interruptPendingChunks}`));\n this.addEventListener(TransferDownloadEvent.RecoveredInterruptedDownload, args => this.#logger.logInfo(`Download recovered ${args.transferId} / ${args.downloadId}`));\n this.addEventListener(TransferDownloadEvent.DownloadCompleted, args => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { files, ...downloadInfoWithoutFiles } = args;\n this.#logger.logInfo(`Download completed`, downloadInfoWithoutFiles);\n });\n this.addEventListener(TransferDownloadEvent.FileDownloadStarted, args => this.#logger.logDebug(`File download started`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadCompleted, args => this.#logger.logDebug(`File download completed`, args));\n this.addEventListener(TransferDownloadEvent.FileDownloadFailed, args => {\n const { reason, ...errorInfoWithoutException } = args;\n this.#logger.logError(reason, `File download failed`, errorInfoWithoutException);\n });\n this.addEventListener(TransferDownloadEvent.DownloadTrackingFailed, args => {\n const { error, ...errorInfoWithoutException } = args;\n if (error)\n this.#logger.logError(error, `Progress tracking failed`, errorInfoWithoutException);\n else\n this.#logger.logWarning(`Progress tracking failed`, errorInfoWithoutException);\n });\n }\n\n #buildOptions(options: DownloadOptions) {\n const opts = { ...new DownloadOptions(), ...options };\n if (!opts.trackingId)\n opts.trackingId = guid();\n return opts;\n }\n\n get status(): TransferStatus | null {\n return this.#downloader.status;\n }\n\n get state(): DownloadEventArgs | null {\n return this.#downloader.state;\n }\n\n get downloadId(): string | undefined {\n return this.#downloader.downloadId;\n }\n\n get healthMonitor(): TransferDownloaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n async pause(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: false });\n }\n\n async stop(): Promise<boolean> {\n return await this.#downloader.pause({ interruptPendingChunks: true });\n }\n\n resume(): boolean {\n return this.#downloader.resume();\n }\n\n abort(): boolean {\n return this.#downloader.abort();\n }\n\n addEventListener(eventName:\n TransferDownloadEvent.Aborting |\n TransferDownloadEvent.Aborted |\n TransferDownloadEvent.Resumed |\n TransferDownloadEvent.RecoveredInterruptedDownload |\n TransferDownloadEvent.DownloadStarted |\n TransferDownloadEvent.DownloadProgressed, handler: (args: DownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.DownloadCompleted, handler: (args: DownloadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.Pausing | TransferDownloadEvent.Paused, handler: (args: DownloadPauseEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.NetworkFailure | TransferDownloadEvent.NetworkOk, handler: () => void): void\n addEventListener(eventName: TransferDownloadEvent.TransferMetadataDetermined, handler: (args: DownloadMetadataDeterminedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.ChunkDownloadStarted |\n TransferDownloadEvent.ChunkDownloadProgressed |\n TransferDownloadEvent.ChunkDownloadCompleted, handler: (args: ChunkDownloadEventArgs) => void): void;\n\n addEventListener(eventName: TransferDownloadEvent.ChunkDownloadFailed, handler: (args: ChunkDownloadFailedEventArgs) => void): void\n\n addEventListener(eventName:\n TransferDownloadEvent.PossibleSupersizedFile |\n TransferDownloadEvent.FileDownloadStarted |\n TransferDownloadEvent.FileDownloadProgressed |\n TransferDownloadEvent.FileDownloadCompleting |\n TransferDownloadEvent.FileDownloadCompleted, handler: (args: FileDownloadEventArgs) => void): void\n\n addEventListener(eventName: TransferDownloadEvent.FileDownloadFailed, handler: (args: FileDownloadFailedEventArgs) => void): void\n addEventListener(eventName: TransferDownloadEvent.DownloadTrackingFailed, handler: (args: DownloadTrackingFailedEventArgs) => void): void\n\n addEventListener(eventName: string, handler: (args?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n private cancelHealthyStatusThrottledMethod(promise: Promise<DownloadInfo>) {\n promise.then(downloadInfo => downloadInfo.completion.finally(() => this.#logHealthyStatusThrottled.cancel()));\n }\n\n async downloadAllFiles(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadAllFilesZipped(command: DownloadCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadAllFilesZipped(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async downloadSpecificFiles(command: DownloadFilesCommand): Promise<DownloadInfo> {\n const promise = this.#downloader.downloadSpecificFiles(command);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async restartFailedDownloader(): Promise<DownloadInfo> {\n const promise = this.#downloader.restartFailedDownloader();\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async recoverInterruptedDownload(downloadId: string): Promise<DownloadInfo> {\n const promise = this.#downloader.recoverInterruptedDownload(downloadId);\n\n this.cancelHealthyStatusThrottledMethod(promise);\n\n return promise;\n }\n\n async cleanupDownload(downloadId: string | null = null) {\n await this.#downloader.cleanupDownload(downloadId);\n }\n}"]}
@@ -19,6 +19,9 @@ export default abstract class TransferHealthMonitorBase<T> {
19
19
  private transferProgressedEventHandler;
20
20
  private restartHealthCheck;
21
21
  private checkHealth;
22
+ private scheduleHealthCheck;
23
+ private isCurrentRunActive;
24
+ private createNextRunningToken;
22
25
  private clearCurrentPeriodProgressHistory;
23
26
  private determineIsHealthy;
24
27
  protected abstract getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: T): number;
@@ -1 +1 @@
1
- {"version":3,"file":"transferHealthMonitorBase.d.ts","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferHealthMonitorBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAChF,OAAO,6BAA6B,MAAM,qDAAqD,CAAC;AAChG,OAAO,+BAA+B,MAAM,uDAAuD,CAAC;AACpG,OAAO,aAAsC,MAAM,kCAAkC,CAAC;AAEtF,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,yBAAyB,CAAC,CAAC;;IAYrD,SAAS,CAAC,mCAAmC,EAAE,CAAC,GAAG,SAAS,CAAC;gBAIjD,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,mBAAmB,SAAS;IAY1G,KAAK;IAWL,OAAO,CAAC,UAAU;IAOlB,IAAI;IAQJ,OAAO,CAAC,gCAAgC;IAKxC,OAAO,CAAC,oCAAoC;IAK5C,SAAS,CAAC,QAAQ,CAAC,2BAA2B,IAAI,MAAM;IACxD,SAAS,CAAC,QAAQ,CAAC,8BAA8B,IAAI,MAAM;IAE3D,OAAO,CAAC,2BAA2B,CAEjC;IAEF,SAAS,CAAC,QAAQ,CAAC,2CAA2C,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IAE1F,OAAO,CAAC,8BAA8B,CAapC;IAEF,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,WAAW,CAoBjB;IAEF,OAAO,CAAC,iCAAiC;IAIzC,OAAO,CAAC,kBAAkB;IAS1B,SAAS,CAAC,QAAQ,CAAC,6BAA6B,CAAC,+BAA+B,CAAC,EAAE,CAAC,GAAG,MAAM;YAE/E,yCAAyC;IA8BvD,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,aAAa;IAKrB,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,6BAA6B;IAEvE,OAAO,CAAC,oCAAoC;IAa5C,OAAO,CAAC,2CAA2C;IAanD,OAAO,CAAC,+BAA+B;IAavC,OAAO,CAAC,yCAAyC;IAajD,OAAO,CAAC,0BAA0B;IAalC,gBAAgB,CAAC,SAAS,EAAE,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,GAAG,IAAI;IAC9H,gBAAgB,CAAC,SAAS,EAAE,0BAA0B,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,+BAA+B,KAAK,IAAI,GAAG,IAAI;CAIrI"}
1
+ {"version":3,"file":"transferHealthMonitorBase.d.ts","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferHealthMonitorBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAChF,OAAO,6BAA6B,MAAM,qDAAqD,CAAC;AAChG,OAAO,+BAA+B,MAAM,uDAAuD,CAAC;AACpG,OAAO,aAAsC,MAAM,kCAAkC,CAAC;AAEtF,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,yBAAyB,CAAC,CAAC;;IAYrD,SAAS,CAAC,mCAAmC,EAAE,CAAC,GAAG,SAAS,CAAC;gBAMjD,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,mBAAmB,SAAS;IAY1G,KAAK;IAeL,OAAO,CAAC,UAAU;IAOlB,IAAI;IAYJ,OAAO,CAAC,gCAAgC;IAKxC,OAAO,CAAC,oCAAoC;IAK5C,SAAS,CAAC,QAAQ,CAAC,2BAA2B,IAAI,MAAM;IACxD,SAAS,CAAC,QAAQ,CAAC,8BAA8B,IAAI,MAAM;IAE3D,OAAO,CAAC,2BAA2B,CAKjC;IAEF,SAAS,CAAC,QAAQ,CAAC,2CAA2C,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IAE1F,OAAO,CAAC,8BAA8B,CAgBpC;IAEF,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,WAAW,CA0BjB;IAEF,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,iCAAiC;IAIzC,OAAO,CAAC,kBAAkB;IAS1B,SAAS,CAAC,QAAQ,CAAC,6BAA6B,CAAC,+BAA+B,CAAC,EAAE,CAAC,GAAG,MAAM;YAE/E,yCAAyC;IAoCvD,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,aAAa;IAKrB,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,6BAA6B;IAEvE,OAAO,CAAC,oCAAoC;IAa5C,OAAO,CAAC,2CAA2C;IAanD,OAAO,CAAC,+BAA+B;IAavC,OAAO,CAAC,yCAAyC;IAajD,OAAO,CAAC,0BAA0B;IAalC,gBAAgB,CAAC,SAAS,EAAE,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,GAAG,IAAI;IAC9H,gBAAgB,CAAC,SAAS,EAAE,0BAA0B,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,+BAA+B,KAAK,IAAI,GAAG,IAAI;CAIrI"}
@@ -8,6 +8,8 @@ export default class TransferHealthMonitorBase {
8
8
  #currentPeriodProgressHistory = [];
9
9
  lastProgressEventFromPreviousPeriod;
10
10
  #isCurrentlyHealthy = true;
11
+ #isRunning = false;
12
+ #runningToken = 0;
11
13
  constructor(onlineChecker, transferEventsEngine, healthCheckInterval = 15_000) {
12
14
  if (!onlineChecker)
13
15
  throw new Error(`Online checker can't be empty`);
@@ -18,11 +20,13 @@ export default class TransferHealthMonitorBase {
18
20
  this.#healthCheckInterval = healthCheckInterval;
19
21
  }
20
22
  start() {
21
- if (this.#timeout)
23
+ if (this.#isRunning)
22
24
  throw new Error(`Health Monitor is already running`);
25
+ this.#isRunning = true;
23
26
  this.resetState();
24
27
  this.subscribeToTransferRunningEvents();
25
- this.#timeout = setTimeout(() => this.checkHealth(), this.#healthCheckInterval);
28
+ this.createNextRunningToken();
29
+ this.scheduleHealthCheck(this.#runningToken);
26
30
  }
27
31
  resetState() {
28
32
  this.#currentPeriodProgressHistory = [];
@@ -31,6 +35,8 @@ export default class TransferHealthMonitorBase {
31
35
  this.#isCurrentlyHealthy = true;
32
36
  }
33
37
  stop() {
38
+ this.#isRunning = false;
39
+ this.createNextRunningToken();
34
40
  clearTimeout(this.#timeout);
35
41
  this.#timeout = undefined;
36
42
  this.unsubscribeFromTransferRunningEvents();
@@ -44,9 +50,13 @@ export default class TransferHealthMonitorBase {
44
50
  this.#transferEventsEngine.removeEventListener(this.getTransferProgressedEventName(), this.transferProgressedEventHandler);
45
51
  }
46
52
  fileServerKnownEventHandler = (eventArgs) => {
53
+ if (!this.#isRunning)
54
+ return;
47
55
  this.#fileServerUrl = this.getFileServerUrlFromFileServerKnowEventArgs(eventArgs);
48
56
  };
49
57
  transferProgressedEventHandler = (eventArgs) => {
58
+ if (!this.#isRunning)
59
+ return;
50
60
  this.#currentPeriodProgressHistory.push({ time: Date.now(), eventArgs });
51
61
  if (this.#isCurrentlyHealthy)
52
62
  return;
@@ -60,10 +70,11 @@ export default class TransferHealthMonitorBase {
60
70
  this.#currentPeriodProgressHistory = [];
61
71
  this.lastProgressEventFromPreviousPeriod = currentProgressEvent;
62
72
  this.#isCurrentlyHealthy = true;
63
- clearTimeout(this.#timeout);
64
- this.#timeout = setTimeout(() => this.checkHealth(), this.#healthCheckInterval);
73
+ this.scheduleHealthCheck(this.#runningToken);
65
74
  }
66
- checkHealth = async () => {
75
+ checkHealth = async (runningToken) => {
76
+ if (!this.isCurrentRunActive(runningToken))
77
+ return;
67
78
  const history = this.#currentPeriodProgressHistory;
68
79
  const currentPeriodLastProgressEvent = history.length > 0 ? history[history.length - 1].eventArgs : undefined;
69
80
  const isHealthy = this.determineIsHealthy(currentPeriodLastProgressEvent);
@@ -74,11 +85,25 @@ export default class TransferHealthMonitorBase {
74
85
  }
75
86
  else {
76
87
  this.#isCurrentlyHealthy = false;
77
- await this.figureOutUnhealthyReasonWithNotifications();
88
+ await this.figureOutUnhealthyReasonWithNotifications(runningToken);
78
89
  }
90
+ if (!this.isCurrentRunActive(runningToken))
91
+ return;
79
92
  this.clearCurrentPeriodProgressHistory();
80
- this.#timeout = setTimeout(() => this.checkHealth(), this.#healthCheckInterval);
93
+ this.scheduleHealthCheck(runningToken);
81
94
  };
95
+ scheduleHealthCheck(runningToken) {
96
+ clearTimeout(this.#timeout);
97
+ if (!this.isCurrentRunActive(runningToken))
98
+ return;
99
+ this.#timeout = setTimeout(() => this.checkHealth(runningToken), this.#healthCheckInterval);
100
+ }
101
+ isCurrentRunActive(runningToken) {
102
+ return this.#isRunning && this.#runningToken === runningToken;
103
+ }
104
+ createNextRunningToken() {
105
+ this.#runningToken += 1;
106
+ }
82
107
  clearCurrentPeriodProgressHistory() {
83
108
  this.#currentPeriodProgressHistory = [];
84
109
  }
@@ -88,9 +113,11 @@ export default class TransferHealthMonitorBase {
88
113
  const bytesSentThisPeriod = currentTransferredBytesTotalCount - previousPeriodTransferredBytesTotalCount;
89
114
  return bytesSentThisPeriod > 0;
90
115
  }
91
- async figureOutUnhealthyReasonWithNotifications() {
116
+ async figureOutUnhealthyReasonWithNotifications(runningToken) {
92
117
  this.notifyStartedCheckingUnhealthyReason();
93
118
  const { isOnline: isInternetOnline, error: internetOnlineError } = await this.#onlineChecker.isInternetOnline();
119
+ if (!this.isCurrentRunActive(runningToken))
120
+ return;
94
121
  if (isInternetOnline)
95
122
  this.notifyUnhealthyInternetOkRestCheckingReason();
96
123
  else {
@@ -103,6 +130,8 @@ export default class TransferHealthMonitorBase {
103
130
  : Promise.resolve(undefined);
104
131
  const { isOnline: isApiOnline, error: apiOnlineError } = await isApiOnlinePromise;
105
132
  const isFileServerOnlineResult = await isFileServerOnlinePromise;
133
+ if (!this.isCurrentRunActive(runningToken))
134
+ return;
106
135
  if (isApiOnline && isFileServerOnlineResult?.isOnline === true)
107
136
  this.notifyUnhealthyAllOkReason();
108
137
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"transferHealthMonitorBase.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferHealthMonitorBase.ts"],"names":[],"mappings":"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","sourcesContent":["import type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport TransferHealthMonitorEvent from \"./events/transferHealthMonitorEvent.js\";\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport HealthMonitorUnhealthyEventArgs from \"./events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\nimport OnlineChecker, { OnlineCheckerResult } from \"./onlineChecker/onlineChecker.js\";\n\nexport default abstract class TransferHealthMonitorBase<T> {\n readonly #onlineChecker: OnlineChecker;\n readonly #transferEventsEngine: EventsEngine;\n\n #healthCheckInterval: number;\n\n #timeout: ReturnType<typeof setTimeout> | undefined;\n\n #fileServerUrl: string | undefined;\n\n #currentPeriodProgressHistory: { time: number, eventArgs: T }[] = [];\n\n protected lastProgressEventFromPreviousPeriod: T | undefined;\n\n #isCurrentlyHealthy = true;\n\n constructor(onlineChecker: OnlineChecker, transferEventsEngine: EventsEngine, healthCheckInterval = 15_000) {\n if (!onlineChecker)\n throw new Error(`Online checker can't be empty`);\n if (!transferEventsEngine)\n throw new Error(`Events engine can't be empty`);\n\n this.#onlineChecker = onlineChecker;\n this.#transferEventsEngine = transferEventsEngine;\n\n this.#healthCheckInterval = healthCheckInterval;\n }\n\n start() {\n if (this.#timeout)\n throw new Error(`Health Monitor is already running`);\n\n this.resetState();\n\n this.subscribeToTransferRunningEvents();\n\n this.#timeout = setTimeout(() => this.checkHealth(), this.#healthCheckInterval);\n }\n\n private resetState() {\n this.#currentPeriodProgressHistory = [];\n this.lastProgressEventFromPreviousPeriod = undefined;\n this.#timeout = undefined;\n this.#isCurrentlyHealthy = true;\n }\n\n stop() {\n clearTimeout(this.#timeout);\n\n this.#timeout = undefined;\n\n this.unsubscribeFromTransferRunningEvents();\n }\n\n private subscribeToTransferRunningEvents() {\n this.#transferEventsEngine.addEventListener(this.getFileServerKnownEventName(), this.fileServerKnownEventHandler);\n this.#transferEventsEngine.addEventListener(this.getTransferProgressedEventName(), this.transferProgressedEventHandler);\n }\n\n private unsubscribeFromTransferRunningEvents() {\n this.#transferEventsEngine.removeEventListener(this.getFileServerKnownEventName(), this.fileServerKnownEventHandler);\n this.#transferEventsEngine.removeEventListener(this.getTransferProgressedEventName(), this.transferProgressedEventHandler);\n }\n\n protected abstract getFileServerKnownEventName(): string;\n protected abstract getTransferProgressedEventName(): string;\n\n private fileServerKnownEventHandler = (eventArgs: unknown) => {\n this.#fileServerUrl = this.getFileServerUrlFromFileServerKnowEventArgs(eventArgs);\n };\n\n protected abstract getFileServerUrlFromFileServerKnowEventArgs(eventArgs: unknown): string;\n\n private transferProgressedEventHandler = (eventArgs: T) => {\n this.#currentPeriodProgressHistory.push({ time: Date.now(), eventArgs });\n\n if (this.#isCurrentlyHealthy)\n return;\n\n const isHealthy = this.determineIsHealthy(eventArgs);\n\n if (!isHealthy)\n return;\n\n this.notifyHealthy();\n this.restartHealthCheck(eventArgs);\n };\n\n private restartHealthCheck(currentProgressEvent: T) {\n this.#currentPeriodProgressHistory = [];\n this.lastProgressEventFromPreviousPeriod = currentProgressEvent;\n\n this.#isCurrentlyHealthy = true;\n\n clearTimeout(this.#timeout);\n this.#timeout = setTimeout(() => this.checkHealth(), this.#healthCheckInterval);\n }\n\n private checkHealth = async (): Promise<void> => {\n const history = this.#currentPeriodProgressHistory;\n const currentPeriodLastProgressEvent = history.length > 0 ? history[history.length - 1].eventArgs : undefined;\n\n const isHealthy = this.determineIsHealthy(currentPeriodLastProgressEvent);\n\n this.lastProgressEventFromPreviousPeriod = currentPeriodLastProgressEvent || this.lastProgressEventFromPreviousPeriod;\n\n if (isHealthy) {\n this.#isCurrentlyHealthy = true;\n this.notifyHealthy();\n }\n else {\n this.#isCurrentlyHealthy = false;\n await this.figureOutUnhealthyReasonWithNotifications();\n }\n\n this.clearCurrentPeriodProgressHistory();\n\n this.#timeout = setTimeout(() => this.checkHealth(), this.#healthCheckInterval);\n };\n\n private clearCurrentPeriodProgressHistory() {\n this.#currentPeriodProgressHistory = [];\n }\n\n private determineIsHealthy(currentHistoryLastProgressEvent: T | undefined) {\n const currentTransferredBytesTotalCount = this.getTransferredBytesTotalCount(currentHistoryLastProgressEvent);\n const previousPeriodTransferredBytesTotalCount = this.getTransferredBytesTotalCount(this.lastProgressEventFromPreviousPeriod);\n\n const bytesSentThisPeriod = currentTransferredBytesTotalCount - previousPeriodTransferredBytesTotalCount;\n\n return bytesSentThisPeriod > 0;\n }\n\n protected abstract getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: T): number;\n\n private async figureOutUnhealthyReasonWithNotifications(): Promise<void> {\n this.notifyStartedCheckingUnhealthyReason();\n\n const { isOnline: isInternetOnline, error: internetOnlineError } = await this.#onlineChecker.isInternetOnline();\n\n if (isInternetOnline)\n this.notifyUnhealthyInternetOkRestCheckingReason();\n else {\n this.notifyUnhealthyNoInternetReason(internetOnlineError);\n return;\n }\n\n const isApiOnlinePromise = this.#onlineChecker.isApiReachable();\n\n const isFileServerOnlinePromise = this.#fileServerUrl\n ? this.#onlineChecker.isFileServerReachable(this.#fileServerUrl)\n : Promise.resolve(undefined);\n\n const { isOnline: isApiOnline, error: apiOnlineError } = await isApiOnlinePromise;\n const isFileServerOnlineResult = await isFileServerOnlinePromise;\n\n if (isApiOnline && isFileServerOnlineResult?.isOnline === true)\n this.notifyUnhealthyAllOkReason();\n else {\n const fileServerStatus = this.isOnlineResultToStatus(isFileServerOnlineResult);\n\n this.notifyUnhealthyApiOrFileServerErrorReason(fileServerStatus, isFileServerOnlineResult?.error, apiOnlineError);\n }\n }\n\n private isOnlineResultToStatus(isFileServerOnlineResult: OnlineCheckerResult | undefined): `Ok` | `Error` | `Unknown` {\n if (!isFileServerOnlineResult)\n return `Unknown`;\n\n return isFileServerOnlineResult.isOnline ? `Ok` : `Error`;\n }\n\n private notifyHealthy() {\n const eventArgs = this.getHealthyEventArgs();\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Healthy, eventArgs);\n }\n\n protected abstract getHealthyEventArgs(): HealthMonitorHealthyEventArgs;\n\n private notifyStartedCheckingUnhealthyReason() {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Checking` },\n api: { status: `Checking` },\n fileServer: { status: `Checking` },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n private notifyUnhealthyInternetOkRestCheckingReason() {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Ok` },\n api: { status: `Checking` },\n fileServer: { status: `Checking` },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n private notifyUnhealthyNoInternetReason(error?: Error) {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Error`, error },\n api: { status: `Unknown` },\n fileServer: { status: `Unknown` },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n private notifyUnhealthyApiOrFileServerErrorReason(fileServerStatus: `Ok` | `Error` | `Unknown`, fileServerError: Error | undefined, apiError: Error | undefined) {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Ok` },\n api: apiError ? { status: `Error`, error: apiError } : { status: `Ok` },\n fileServer: fileServerError ? { status: `Error`, error: fileServerError } : { status: fileServerStatus },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n private notifyUnhealthyAllOkReason() {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Ok` },\n api: { status: `Ok` },\n fileServer: { status: `Ok` },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n addEventListener(eventName: TransferHealthMonitorEvent.Healthy, handler: (event: HealthMonitorHealthyEventArgs) => void): void\n addEventListener(eventName: TransferHealthMonitorEvent.Unhealthy, handler: (event: HealthMonitorUnhealthyEventArgs) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void {\n this.#transferEventsEngine.addEventListener(eventName, handler);\n }\n}"]}
1
+ {"version":3,"file":"transferHealthMonitorBase.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferHealthMonitorBase.ts"],"names":[],"mappings":"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","sourcesContent":["import type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport TransferHealthMonitorEvent from \"./events/transferHealthMonitorEvent.js\";\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport HealthMonitorUnhealthyEventArgs from \"./events/eventArgs/healthMonitorUnhealthyEventArgs.js\";\nimport OnlineChecker, { OnlineCheckerResult } from \"./onlineChecker/onlineChecker.js\";\n\nexport default abstract class TransferHealthMonitorBase<T> {\n readonly #onlineChecker: OnlineChecker;\n readonly #transferEventsEngine: EventsEngine;\n\n #healthCheckInterval: number;\n\n #timeout: ReturnType<typeof setTimeout> | undefined;\n\n #fileServerUrl: string | undefined;\n\n #currentPeriodProgressHistory: { time: number, eventArgs: T }[] = [];\n\n protected lastProgressEventFromPreviousPeriod: T | undefined;\n\n #isCurrentlyHealthy = true;\n #isRunning = false;\n #runningToken = 0;\n\n constructor(onlineChecker: OnlineChecker, transferEventsEngine: EventsEngine, healthCheckInterval = 15_000) {\n if (!onlineChecker)\n throw new Error(`Online checker can't be empty`);\n if (!transferEventsEngine)\n throw new Error(`Events engine can't be empty`);\n\n this.#onlineChecker = onlineChecker;\n this.#transferEventsEngine = transferEventsEngine;\n\n this.#healthCheckInterval = healthCheckInterval;\n }\n\n start() {\n if (this.#isRunning)\n throw new Error(`Health Monitor is already running`);\n\n this.#isRunning = true;\n\n this.resetState();\n\n this.subscribeToTransferRunningEvents();\n\n this.createNextRunningToken();\n\n this.scheduleHealthCheck(this.#runningToken);\n }\n\n private resetState() {\n this.#currentPeriodProgressHistory = [];\n this.lastProgressEventFromPreviousPeriod = undefined;\n this.#timeout = undefined;\n this.#isCurrentlyHealthy = true;\n }\n\n stop() {\n this.#isRunning = false;\n\n this.createNextRunningToken();\n\n clearTimeout(this.#timeout);\n\n this.#timeout = undefined;\n\n this.unsubscribeFromTransferRunningEvents();\n }\n\n private subscribeToTransferRunningEvents() {\n this.#transferEventsEngine.addEventListener(this.getFileServerKnownEventName(), this.fileServerKnownEventHandler);\n this.#transferEventsEngine.addEventListener(this.getTransferProgressedEventName(), this.transferProgressedEventHandler);\n }\n\n private unsubscribeFromTransferRunningEvents() {\n this.#transferEventsEngine.removeEventListener(this.getFileServerKnownEventName(), this.fileServerKnownEventHandler);\n this.#transferEventsEngine.removeEventListener(this.getTransferProgressedEventName(), this.transferProgressedEventHandler);\n }\n\n protected abstract getFileServerKnownEventName(): string;\n protected abstract getTransferProgressedEventName(): string;\n\n private fileServerKnownEventHandler = (eventArgs: unknown) => {\n if (!this.#isRunning)\n return;\n\n this.#fileServerUrl = this.getFileServerUrlFromFileServerKnowEventArgs(eventArgs);\n };\n\n protected abstract getFileServerUrlFromFileServerKnowEventArgs(eventArgs: unknown): string;\n\n private transferProgressedEventHandler = (eventArgs: T) => {\n if (!this.#isRunning)\n return;\n\n this.#currentPeriodProgressHistory.push({ time: Date.now(), eventArgs });\n\n if (this.#isCurrentlyHealthy)\n return;\n\n const isHealthy = this.determineIsHealthy(eventArgs);\n\n if (!isHealthy)\n return;\n\n this.notifyHealthy();\n this.restartHealthCheck(eventArgs);\n };\n\n private restartHealthCheck(currentProgressEvent: T) {\n this.#currentPeriodProgressHistory = [];\n this.lastProgressEventFromPreviousPeriod = currentProgressEvent;\n\n this.#isCurrentlyHealthy = true;\n\n this.scheduleHealthCheck(this.#runningToken);\n }\n\n private checkHealth = async (runningToken: number): Promise<void> => {\n if (!this.isCurrentRunActive(runningToken))\n return;\n\n const history = this.#currentPeriodProgressHistory;\n const currentPeriodLastProgressEvent = history.length > 0 ? history[history.length - 1].eventArgs : undefined;\n\n const isHealthy = this.determineIsHealthy(currentPeriodLastProgressEvent);\n\n this.lastProgressEventFromPreviousPeriod = currentPeriodLastProgressEvent || this.lastProgressEventFromPreviousPeriod;\n\n if (isHealthy) {\n this.#isCurrentlyHealthy = true;\n this.notifyHealthy();\n }\n else {\n this.#isCurrentlyHealthy = false;\n await this.figureOutUnhealthyReasonWithNotifications(runningToken);\n }\n\n if (!this.isCurrentRunActive(runningToken))\n return;\n\n this.clearCurrentPeriodProgressHistory();\n\n this.scheduleHealthCheck(runningToken);\n };\n\n private scheduleHealthCheck(runningToken: number): void {\n clearTimeout(this.#timeout);\n\n if (!this.isCurrentRunActive(runningToken))\n return;\n\n this.#timeout = setTimeout(() => this.checkHealth(runningToken), this.#healthCheckInterval);\n }\n\n private isCurrentRunActive(runningToken: number): boolean {\n return this.#isRunning && this.#runningToken === runningToken;\n }\n\n private createNextRunningToken() {\n this.#runningToken += 1;\n }\n\n private clearCurrentPeriodProgressHistory() {\n this.#currentPeriodProgressHistory = [];\n }\n\n private determineIsHealthy(currentHistoryLastProgressEvent: T | undefined) {\n const currentTransferredBytesTotalCount = this.getTransferredBytesTotalCount(currentHistoryLastProgressEvent);\n const previousPeriodTransferredBytesTotalCount = this.getTransferredBytesTotalCount(this.lastProgressEventFromPreviousPeriod);\n\n const bytesSentThisPeriod = currentTransferredBytesTotalCount - previousPeriodTransferredBytesTotalCount;\n\n return bytesSentThisPeriod > 0;\n }\n\n protected abstract getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: T): number;\n\n private async figureOutUnhealthyReasonWithNotifications(runningToken: number): Promise<void> {\n this.notifyStartedCheckingUnhealthyReason();\n\n const { isOnline: isInternetOnline, error: internetOnlineError } = await this.#onlineChecker.isInternetOnline();\n\n if (!this.isCurrentRunActive(runningToken))\n return;\n\n if (isInternetOnline)\n this.notifyUnhealthyInternetOkRestCheckingReason();\n else {\n this.notifyUnhealthyNoInternetReason(internetOnlineError);\n return;\n }\n\n const isApiOnlinePromise = this.#onlineChecker.isApiReachable();\n\n const isFileServerOnlinePromise = this.#fileServerUrl\n ? this.#onlineChecker.isFileServerReachable(this.#fileServerUrl)\n : Promise.resolve(undefined);\n\n const { isOnline: isApiOnline, error: apiOnlineError } = await isApiOnlinePromise;\n const isFileServerOnlineResult = await isFileServerOnlinePromise;\n\n if (!this.isCurrentRunActive(runningToken))\n return;\n\n if (isApiOnline && isFileServerOnlineResult?.isOnline === true)\n this.notifyUnhealthyAllOkReason();\n else {\n const fileServerStatus = this.isOnlineResultToStatus(isFileServerOnlineResult);\n\n this.notifyUnhealthyApiOrFileServerErrorReason(fileServerStatus, isFileServerOnlineResult?.error, apiOnlineError);\n }\n }\n\n private isOnlineResultToStatus(isFileServerOnlineResult: OnlineCheckerResult | undefined): `Ok` | `Error` | `Unknown` {\n if (!isFileServerOnlineResult)\n return `Unknown`;\n\n return isFileServerOnlineResult.isOnline ? `Ok` : `Error`;\n }\n\n private notifyHealthy() {\n const eventArgs = this.getHealthyEventArgs();\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Healthy, eventArgs);\n }\n\n protected abstract getHealthyEventArgs(): HealthMonitorHealthyEventArgs;\n\n private notifyStartedCheckingUnhealthyReason() {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Checking` },\n api: { status: `Checking` },\n fileServer: { status: `Checking` },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n private notifyUnhealthyInternetOkRestCheckingReason() {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Ok` },\n api: { status: `Checking` },\n fileServer: { status: `Checking` },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n private notifyUnhealthyNoInternetReason(error?: Error) {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Error`, error },\n api: { status: `Unknown` },\n fileServer: { status: `Unknown` },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n private notifyUnhealthyApiOrFileServerErrorReason(fileServerStatus: `Ok` | `Error` | `Unknown`, fileServerError: Error | undefined, apiError: Error | undefined) {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Ok` },\n api: apiError ? { status: `Error`, error: apiError } : { status: `Ok` },\n fileServer: fileServerError ? { status: `Error`, error: fileServerError } : { status: fileServerStatus },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n private notifyUnhealthyAllOkReason() {\n const eventArgs: HealthMonitorUnhealthyEventArgs = {\n reason: {\n internet: { status: `Ok` },\n api: { status: `Ok` },\n fileServer: { status: `Ok` },\n },\n ...this.lastProgressEventFromPreviousPeriod,\n };\n\n this.#transferEventsEngine.emit(TransferHealthMonitorEvent.Unhealthy, eventArgs);\n }\n\n addEventListener(eventName: TransferHealthMonitorEvent.Healthy, handler: (event: HealthMonitorHealthyEventArgs) => void): void\n addEventListener(eventName: TransferHealthMonitorEvent.Unhealthy, handler: (event: HealthMonitorUnhealthyEventArgs) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void {\n this.#transferEventsEngine.addEventListener(eventName, handler);\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"downloadState.d.ts","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadState.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAEjE,OAAO,aAAa,MAAM,0BAA0B,CAAC;AAIrD,OAAO,KAAK,gBAAgB,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,qBAAqB,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,iBAAiB,MAAM,mCAAmC,CAAC;AAOvE,OAAO,KAAK,kBAAkB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,uBAAuB,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AAGzD,MAAM,CAAC,OAAO,OAAO,aAAa;;gBAsClB,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,uBAAuB;IAoB5K,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,yBAAyB,IAAI,OAAO,CAEvC;IAED,IAAI,qBAAqB,IAAI,MAAM,CAElC;IAED,IAAI,qBAAqB,IAAI,OAAO,CAEnC;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,YAAY,IAAI,iBAAiB,CAEpC;IAgCD,KAAK,IAAI,OAAO;IAYhB,YAAY,CAAC,OAAO,EAAE;QAAE,sBAAsB,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,GAAG,IAAI;IAc3G,MAAM,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAwBxC,MAAM,IAAI,OAAO;IAqBjB,YAAY,IAAI,OAAO;IAcvB,OAAO,IAAI,OAAO;IAalB,YAAY,CAAC,IAAI,EAAE,gBAAgB;IAMnC,YAAY,CAAC,IAAI,EAAE,gBAAgB;IAKnC,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAK/C,WAAW,CAAC,IAAI,EAAE,gBAAgB;IAKlC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAKpD,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAc/D,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAO9D,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAU5C,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAMhF,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAiBjH,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAalF,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IActG,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAsB9B,2BAA2B,IAAI,IAAI;IAOnC,uBAAuB,IAAI,IAAI;IAO/B,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB;IAItD,cAAc;IAed,SAAS;IAST,sBAAsB,CAAC,IAAI,EAAE,gBAAgB;IAwE7C,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAyElE"}
1
+ {"version":3,"file":"downloadState.d.ts","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadState.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAEjE,OAAO,aAAa,MAAM,0BAA0B,CAAC;AAIrD,OAAO,KAAK,gBAAgB,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,qBAAqB,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,iBAAiB,MAAM,mCAAmC,CAAC;AAOvE,OAAO,KAAK,kBAAkB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,uBAAuB,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AAGzD,MAAM,CAAC,OAAO,OAAO,aAAa;;gBAsClB,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,uBAAuB;IAoB5K,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,yBAAyB,IAAI,OAAO,CAEvC;IAED,IAAI,qBAAqB,IAAI,MAAM,CAElC;IAED,IAAI,qBAAqB,IAAI,OAAO,CAEnC;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,YAAY,IAAI,iBAAiB,CAEpC;IAgCD,KAAK,IAAI,OAAO;IAYhB,YAAY,CAAC,OAAO,EAAE;QAAE,sBAAsB,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,GAAG,IAAI;IAsB3G,MAAM,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAuBxC,MAAM,IAAI,OAAO;IAqBjB,YAAY,IAAI,OAAO;IAcvB,OAAO,IAAI,OAAO;IAalB,YAAY,CAAC,IAAI,EAAE,gBAAgB;IAMnC,YAAY,CAAC,IAAI,EAAE,gBAAgB;IAKnC,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAK/C,WAAW,CAAC,IAAI,EAAE,gBAAgB;IAKlC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAKpD,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAc/D,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAO9D,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAU5C,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAMhF,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAiBjH,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAalF,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IActG,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAsB9B,2BAA2B,IAAI,IAAI;IAOnC,uBAAuB,IAAI,IAAI;IAO/B,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB;IAItD,cAAc;IAed,SAAS;IAST,sBAAsB,CAAC,IAAI,EAAE,gBAAgB;IAwE7C,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAyElE"}
@@ -34,7 +34,7 @@ export default class DownloadState {
34
34
  #currentSpeedMeasurementDownloadedBytes = [];
35
35
  #estimatedRemainingTimeSeconds = null;
36
36
  #pauseImmediately = false;
37
- #pausedTrigger;
37
+ #pausedTriggers = [];
38
38
  #resumeResolve;
39
39
  constructor(downloadId, transferId, files, options, eventsEngine, oldState) {
40
40
  this.#downloadId = downloadId;
@@ -112,16 +112,23 @@ export default class DownloadState {
112
112
  return false;
113
113
  }
114
114
  requestPause(options) {
115
- this.#pausedTrigger = undefined;
115
+ if (options.pausedTrigger)
116
+ this.#pausedTriggers.push(options.pausedTrigger);
116
117
  if (this.#status === TransferStatus.Running) {
117
118
  this.#status = TransferStatus.Pausing;
118
119
  this.#pauseImmediately = options.interruptPendingChunks;
119
- this.#pausedTrigger = options.pausedTrigger;
120
120
  const pauseArgs = this.#buildPauseDownloadEventArgs();
121
121
  this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);
122
122
  }
123
- else if (options.pausedTrigger)
123
+ else if (this.#status === TransferStatus.Pausing && options.interruptPendingChunks && !this.#pauseImmediately) {
124
+ this.#pauseImmediately = true;
125
+ const pauseArgs = this.#buildPauseDownloadEventArgs();
126
+ this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);
127
+ }
128
+ else if (this.#status !== TransferStatus.Pausing && options.pausedTrigger) {
129
+ this.#pausedTriggers = this.#pausedTriggers.filter(x => x !== options.pausedTrigger);
124
130
  options.pausedTrigger(false);
131
+ }
125
132
  }
126
133
  paused() {
127
134
  if (this.#status === TransferStatus.Pausing) {
@@ -134,10 +141,9 @@ export default class DownloadState {
134
141
  this.#estimatedRemainingTimeSeconds = null;
135
142
  this.#pauseImmediately = false;
136
143
  this.#eventsEngine.emit(TransferDownloadEvent.Paused, pauseArgs);
137
- if (this.#pausedTrigger) {
138
- this.#pausedTrigger(true);
139
- this.#pausedTrigger = undefined;
140
- }
144
+ const pausedTriggers = this.#pausedTriggers;
145
+ this.#pausedTriggers = [];
146
+ pausedTriggers.forEach(pausedTrigger => pausedTrigger(true));
141
147
  return new Promise(resolve => {
142
148
  this.#resumeResolve = resolve;
143
149
  });
@@ -1 +1 @@
1
- {"version":3,"file":"downloadState.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadState.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferDownloadEvent from \"../dtos/downloadEvent.js\";\nimport DownloadError from \"../dtos/downloadError.js\";\nimport DownloadFileProgress from \"./downloadFileProgress.js\";\nimport DownloadFileChunkProgress from \"./downloadFileChunkProgress.js\";\n\nimport type DownloadFileInfo from \"../dtos/downloadFileInfo.js\";\nimport type DownloadFileChunkInfo from \"../dtos/downloadFileChunkInfo.js\";\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\nimport type DownloadCompletedEventArgs from \"../eventArgs/downloadCompletedEventArgs.js\";\nimport type DownloadPauseEventArgs from \"../eventArgs/downloadPauseEventArgs.js\";\nimport type FileDownloadEventArgs from \"../eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"../eventArgs/fileDownloadFailedEventArgs.js\";\nimport type ChunkDownloadEventArgs from \"../eventArgs/chunkDownloadEventArgs.js\";\nimport type ChunkDownloadFailedEventArgs from \"../eventArgs/chunkDownloadFailedEventArgs.js\";\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\nimport type DownloaderRestoredState from \"../dtos/downloaderRestoredState.js\";\nimport type DownloadOptions from \"../downloadOptions.js\";\nimport type DownloadMetadataDeterminedEventArgs from \"../eventArgs/downloadMetadataDeterminedEventArgs.js\";\n\nexport default class DownloadState {\n readonly #transferId: string;\n readonly #downloadId: string;\n readonly #options: DownloadOptions;\n readonly #eventsEngine: EventsEngine;\n\n readonly #files: Array<DownloadFileInfo>;\n readonly #failedFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\n readonly #pendingFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\n\n #totalSize = 0;\n #networkStatus = true;\n #consecutiveNetworkErrors = 0;\n #status: TransferStatus = TransferStatus.Initialized;\n #firstStartedUnixEpochMillis: number | null = null;\n #startedUnixEpochMillis: number | null = null;\n #elapsedActiveMillis = 0;\n #lastProgressTickUnixEpochMillis: number | null = null;\n #lastSpeedCalc: number | null = null;\n #percent = 0;\n\n /**\n * How many bytes downloaded - counting only completed files.\n */\n #downloadedBytes_bank = 0;\n /**\n * How many bytes downloaded total (bank + pendingFiles).\n */\n #downloadedBytes = 0;\n\n #bytesPerSecondAverage = 0;\n #bytesPerSecondCurrent = 0;\n #currentSpeedMeasurementDownloadedBytes: Array<{ time: number, bytes: number }> = [];\n #estimatedRemainingTimeSeconds: number | null = null;\n #pauseImmediately = false;\n #pausedTrigger?: (pauseTriggered: boolean) => void;\n #resumeResolve?: (status: TransferStatus) => void;\n\n constructor(downloadId: string, transferId: string, files: Array<DownloadFileInfo>, options: DownloadOptions, eventsEngine: EventsEngine, oldState?: DownloaderRestoredState) {\n this.#downloadId = downloadId;\n this.#transferId = transferId;\n this.#eventsEngine = eventsEngine;\n this.#files = files;\n this.#options = options;\n\n if (oldState) {\n this.#elapsedActiveMillis = oldState.activeTime;\n this.#downloadedBytes = oldState.downloadedBytes;\n this.#downloadedBytes_bank = oldState.downloadedBytesBank;\n this.#totalSize = oldState.totalSize;\n this.#percent = oldState.percent;\n }\n else {\n for (const file of this.#files)\n this.#totalSize += file.sizeInBytes;\n }\n }\n\n get isRunning(): boolean {\n return this.#status === TransferStatus.Running;\n }\n\n get status(): TransferStatus {\n return this.#status;\n }\n\n get hasFailedFiles(): boolean {\n return this.#failedFiles.size > 0;\n }\n\n get allFilesCompletedOrFailed(): boolean {\n return this.#files.every(x => x.isCompleted || x.isFailed);\n }\n\n get averageBytesPerSecond(): number {\n return this.#bytesPerSecondAverage;\n }\n\n get isThereNetworkProblem(): boolean {\n return this.#networkStatus === false;\n }\n\n get pauseImmediately(): boolean {\n return this.#pauseImmediately;\n }\n\n get currentState(): DownloadEventArgs {\n return this.#buildDownloadEventArgs();\n }\n\n get #nowUnixEpochMillis() {\n return new Date().getTime();\n }\n\n get #activeTimeMillis() {\n return this.#elapsedActiveMillis + this.#activeTimeMillisSinceLastStart;\n }\n\n get #activeTimeMillisSinceLastStart() {\n if (this.#startedUnixEpochMillis === null)\n return 0;\n\n return (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n }\n\n get #totalTime() {\n if (this.#firstStartedUnixEpochMillis === null)\n return 0;\n\n return this.#nowUnixEpochMillis - this.#firstStartedUnixEpochMillis;\n }\n\n get #remainingBytes() {\n return this.#totalSize - this.#downloadedBytes;\n }\n\n get #isItTimeForGlobalProgressEvent(): boolean {\n return this.#lastProgressTickUnixEpochMillis === null || (this.#nowUnixEpochMillis - this.#lastProgressTickUnixEpochMillis) > this.#options.progressTickMillis;\n }\n\n start(): boolean {\n if (this.#status === TransferStatus.Initialized) { // can start only once!\n this.#status = TransferStatus.Running;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n this.#firstStartedUnixEpochMillis = this.#startedUnixEpochMillis;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs(true);\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadStarted, args);\n return true;\n }\n return false;\n }\n\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\n this.#pausedTrigger = undefined;\n\n if (this.#status === TransferStatus.Running) {\n this.#status = TransferStatus.Pausing;\n this.#pauseImmediately = options.interruptPendingChunks;\n this.#pausedTrigger = options.pausedTrigger;\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\n }\n else if (options.pausedTrigger)\n options.pausedTrigger(false);\n }\n\n paused(): Promise<TransferStatus | null> {\n if (this.#status === TransferStatus.Pausing) {\n this.#status = TransferStatus.Paused;\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#startedUnixEpochMillis = null;\n this.#lastSpeedCalc = null;\n this.#currentSpeedMeasurementDownloadedBytes = [];\n this.#estimatedRemainingTimeSeconds = null;\n this.#pauseImmediately = false;\n this.#eventsEngine.emit(TransferDownloadEvent.Paused, pauseArgs);\n\n if (this.#pausedTrigger) {\n this.#pausedTrigger(true);\n this.#pausedTrigger = undefined;\n }\n\n return new Promise(resolve => {\n this.#resumeResolve = resolve;\n });\n }\n return Promise.resolve(null);\n }\n\n resume(): boolean {\n if (this.#status === TransferStatus.Pausing) {\n this.#status = TransferStatus.Running;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\n return true;\n }\n if (this.#status === TransferStatus.Paused) {\n this.#status = TransferStatus.Running;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\n if (this.#resumeResolve) {\n this.#resumeResolve(TransferStatus.Running);\n this.#resumeResolve = undefined;\n }\n return true;\n }\n return false;\n }\n\n requestAbort(): boolean {\n if (this.#status === TransferStatus.Running || this.#status === TransferStatus.Pausing || this.#status === TransferStatus.Paused) {\n this.#status = TransferStatus.Aborting;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Aborting, args);\n if (this.#resumeResolve) {\n this.#resumeResolve(TransferStatus.Aborting);\n this.#resumeResolve = undefined;\n }\n return true;\n }\n return false;\n }\n\n aborted(): boolean {\n if (this.#status === TransferStatus.Aborting) {\n this.#status = TransferStatus.Aborted;\n if (this.#startedUnixEpochMillis !== null)\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Aborted, args);\n\n return true;\n }\n return false;\n }\n\n fileStarting(file: DownloadFileInfo) {\n file.starting();\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarting, args);\n }\n\n fileCreating(file: DownloadFileInfo) {\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreating, args);\n }\n\n ensureFileStarted(file: DownloadFileInfo): void {\n if (!file.isStarted)\n this.#fileStarted(file);\n }\n\n fileCreated(file: DownloadFileInfo) {\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreated, args);\n }\n\n fileFailedById(fileId: string, reason: DownloadError) {\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\n this.fileFailed(actualFile, reason);\n }\n\n fileFailed(file: DownloadFileInfo, reason: DownloadError): void {\n if (file.isFailed === false) {\n file.fail(reason);\n const args: FileDownloadFailedEventArgs = {\n ...this.#buildFileDownloadEventArgs(file),\n reason,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadFailed, args);\n }\n\n this.#failedFiles.add(file);\n this.#pendingFiles.delete(file);\n }\n\n fileCompleted(fileId: string, finalDownloadPath: string): void {\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\n actualFile.complete(finalDownloadPath);\n const updatedArgs = this.#buildFileDownloadEventArgs(actualFile);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleted, updatedArgs);\n }\n\n fileCompleting(file: DownloadFileInfo): void {\n const removed = this.#pendingFiles.delete(file);\n if (removed || file.sizeInBytes === 0) {\n this.#downloadedBytes_bank += file.sizeInBytes;\n const fileArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleting, fileArgs);\n }\n }\n\n chunkDownloadStarted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\n file.chunkStarted(chunk);\n const args: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadStarted, args);\n }\n\n chunkDownloadProgressed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, progress: ChunkProgressEvent): void {\n if (!file.isStarted)\n this.#fileStarted(file);\n\n this.networkOk();\n\n chunk.setProgress(progress.transferredBytesTotal);\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\n\n if (this.#isItTimeForFileProgressEvent(file))\n this.#fileProgressed(file);\n\n if (this.#isItTimeForGlobalProgressEvent)\n this.#progressed();\n }\n\n chunkDownloadCompleted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\n chunk.complete();\n file.chunkCompleted(chunk);\n file.updateProgress();\n\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadCompleted, chunkArgs);\n\n this.#tryCompleteFile(file);\n }\n\n chunkDownloadFailed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, reason: DownloadError): void {\n chunk.fail(reason);\n file.chunkFailed(chunk);\n\n const args: ChunkDownloadFailedEventArgs = {\n ...this.#buildChunkDownloadEventArgs(file, chunk),\n reason,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadFailed, args);\n\n // we've tried multiple times - but chunk still cannot be downloaded - fail this file\n this.fileFailed(file, reason);\n }\n\n completed(error?: Error): void {\n if (this.#status === TransferStatus.Completed || this.#status === TransferStatus.Failed)\n throw new DownloadError(`Download ${this.#downloadId} completion cannot be triggered in state ${TransferStatus[this.#status]}`);\n\n const failedFiles = this.#mapFailedFiles();\n\n if (!!error || failedFiles.length)\n this.#status = TransferStatus.Failed;\n else\n this.#status = TransferStatus.Completed;\n\n this.#progressed();\n\n const args: DownloadCompletedEventArgs = {\n ...this.#buildDownloadEventArgs(true),\n failedFiles,\n downloadError: error,\n };\n\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadCompleted, args);\n }\n\n registeringTransferDownload(): void {\n if (this.#status !== TransferStatus.Completed) {\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadRegistrationTriggered, args);\n }\n }\n\n registeringFileDownload(): void {\n if (this.#status !== TransferStatus.Completed) {\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadRegistrationTriggered, args);\n }\n }\n\n getCurrentState(withFiles: boolean): DownloadEventArgs {\n return this.#buildDownloadEventArgs(withFiles);\n }\n\n networkFailure() {\n this.#consecutiveNetworkErrors += 1;\n if (this.#options.fileserverOfflineAfterConsecutiveAttempts > -1\n && this.#consecutiveNetworkErrors > this.#options.fileserverOfflineAfterConsecutiveAttempts\n && this.#networkStatus === true) {\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n this.#startedUnixEpochMillis = null;\n this.#lastSpeedCalc = null;\n this.#currentSpeedMeasurementDownloadedBytes = [];\n this.#estimatedRemainingTimeSeconds = null;\n this.#networkStatus = false;\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkFailure);\n }\n }\n\n networkOk() {\n this.#consecutiveNetworkErrors = 0;\n if (this.#networkStatus === false) {\n this.#networkStatus = true;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkOk);\n }\n }\n\n possibleSupersizedFile(file: DownloadFileInfo) {\n // sometimes when FS returns too many bytes the file size could get bigger on disk than it was initially created with\n // truncate the file in this case\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.PossibleSupersizedFile, fileArgs);\n }\n\n #progressed(): void {\n this.#updateProgress();\n\n const globalArgs: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadProgressed, globalArgs);\n }\n\n #fileProgressed(file: DownloadFileInfo): void {\n file.updateProgress();\n\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\n }\n\n #fileStarted(file: DownloadFileInfo): void {\n file.start();\n\n this.#pendingFiles.add(file);\n\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarted, args);\n }\n\n #tryCompleteFile(file: DownloadFileInfo): void {\n if (file.chunks.every(chunk => chunk.isCompleted))\n this.fileCompleting(file);\n }\n\n #isItTimeForFileProgressEvent(file: DownloadFileInfo): boolean {\n return file.lastProgressTick === null || (this.#nowUnixEpochMillis - file.lastProgressTick) > this.#options.progressTickMillis;\n }\n\n #buildFileDownloadEventArgs(file: DownloadFileInfo): FileDownloadEventArgs {\n return {\n transferId: this.#transferId,\n file: this.#mapFileProgress(file),\n activeTime: this.#activeTimeMillis,\n };\n }\n\n #buildChunkDownloadEventArgs(file: DownloadFileInfo, chunk: DownloadFileChunkInfo) {\n return {\n ...this.#buildFileDownloadEventArgs(file),\n chunk: this.#mapChunkProgress(chunk),\n };\n }\n\n #buildDownloadEventArgs(withFiles = false): DownloadEventArgs {\n return {\n status: this.#status,\n downloadId: this.#downloadId,\n transferId: this.#transferId,\n activeTimeMillis: this.#activeTimeMillis,\n totalTimeMillis: this.#totalTime,\n progressPercent: this.#percent,\n bytesPerSecondAverage: this.#bytesPerSecondAverage,\n bytesPerSecondCurrent: this.#bytesPerSecondCurrent,\n estimatedRemainingTimeSeconds: this.#estimatedRemainingTimeSeconds,\n totalSize: this.#totalSize,\n downloadedBytes: this.#downloadedBytes,\n files: withFiles ? this.#mapFilesProgress() : null,\n downloadBaseFolder: this.#options.downloadFolder!,\n };\n }\n\n notifyMetadataDetermined(fileServerUrl: string, region?: string) {\n const eventArgs: DownloadMetadataDeterminedEventArgs = { ...this.#buildDownloadEventArgs(), region, fileServerUrl };\n this.#eventsEngine.emit(TransferDownloadEvent.TransferMetadataDetermined, eventArgs);\n }\n\n #buildPauseDownloadEventArgs(): DownloadPauseEventArgs {\n return { ...this.#buildDownloadEventArgs(), interruptPendingChunks: this.#pauseImmediately };\n }\n\n #updateProgress(): void {\n const now = this.#nowUnixEpochMillis;\n this.#lastProgressTickUnixEpochMillis = now;\n\n this.#downloadedBytes = this.#downloadedBytes_bank;\n for (const file of this.#pendingFiles)\n this.#downloadedBytes += file.downloadedBytes;\n\n this.#currentSpeedMeasurementDownloadedBytes.push({ time: now, bytes: this.#downloadedBytes });\n\n if (this.#totalSize === 0)\n this.#percent = 100;\n else\n this.#percent = Math.min(100, (100 * this.#downloadedBytes) / this.#totalSize);\n\n // all-time bytes/sec\n const activeTime = this.#activeTimeMillis;\n if (activeTime > 0)\n this.#bytesPerSecondAverage = this.#downloadedBytes / (activeTime / 1000);\n\n const shouldWeCalculateSpeed = (this.#lastSpeedCalc === null && this.#activeTimeMillisSinceLastStart > 1500)\n || (this.#lastSpeedCalc !== null && (now - this.#lastSpeedCalc) > 200);\n\n if (shouldWeCalculateSpeed) {\n this.#lastSpeedCalc = now;\n\n // momentary bytes/sec\n const prev = this.#currentSpeedMeasurementDownloadedBytes[0]!;\n const timeDiff = now - prev.time;\n this.#bytesPerSecondCurrent = Math.max(0, this.#downloadedBytes - prev.bytes) / (timeDiff / 1000);\n if (timeDiff > this.#options.momentaryDownloadSpeedTimespanMillis)\n this.#currentSpeedMeasurementDownloadedBytes.shift();\n\n // remaining time (seconds) - based on momentary speed and remaining bytes to download - and smoothing factor\n if (this.#remainingBytes === 0)\n this.#estimatedRemainingTimeSeconds = 0;\n else if (this.#bytesPerSecondCurrent > 0) {\n const newRemaining = this.#remainingBytes / this.#bytesPerSecondCurrent;\n if (this.#estimatedRemainingTimeSeconds)\n this.#estimatedRemainingTimeSeconds = (0.7 * newRemaining) + (0.3 * this.#estimatedRemainingTimeSeconds);\n else\n this.#estimatedRemainingTimeSeconds = newRemaining;\n }\n }\n }\n\n #mapFilesProgress(): Array<DownloadFileProgress> {\n return this.#files.map(x => this.#mapFileProgress(x));\n }\n\n #mapFailedFiles(): Array<DownloadFileProgress> {\n const result: Array<DownloadFileProgress> = [];\n for (const x of this.#failedFiles)\n result.push(this.#mapFileProgress(x));\n return result;\n }\n\n #mapFileProgress(file: DownloadFileInfo): DownloadFileProgress {\n return DownloadFileProgress.FromFileDownloadInfo(file);\n }\n\n #mapChunkProgress(chunk: DownloadFileChunkInfo): DownloadFileChunkProgress {\n return DownloadFileChunkProgress.FromChunkInfo(chunk);\n }\n}\n"]}
1
+ {"version":3,"file":"downloadState.js","sourceRoot":"","sources":["../../../../src/downloader/downloadStatus/downloadState.ts"],"names":[],"mappings":"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","sourcesContent":["import TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferDownloadEvent from \"../dtos/downloadEvent.js\";\nimport DownloadError from \"../dtos/downloadError.js\";\nimport DownloadFileProgress from \"./downloadFileProgress.js\";\nimport DownloadFileChunkProgress from \"./downloadFileChunkProgress.js\";\n\nimport type DownloadFileInfo from \"../dtos/downloadFileInfo.js\";\nimport type DownloadFileChunkInfo from \"../dtos/downloadFileChunkInfo.js\";\nimport type EventsEngine from \"../../utils/events/eventsEngine.js\";\nimport type DownloadEventArgs from \"../eventArgs/downloadEventArgs.js\";\nimport type DownloadCompletedEventArgs from \"../eventArgs/downloadCompletedEventArgs.js\";\nimport type DownloadPauseEventArgs from \"../eventArgs/downloadPauseEventArgs.js\";\nimport type FileDownloadEventArgs from \"../eventArgs/fileDownloadEventArgs.js\";\nimport type FileDownloadFailedEventArgs from \"../eventArgs/fileDownloadFailedEventArgs.js\";\nimport type ChunkDownloadEventArgs from \"../eventArgs/chunkDownloadEventArgs.js\";\nimport type ChunkDownloadFailedEventArgs from \"../eventArgs/chunkDownloadFailedEventArgs.js\";\nimport type ChunkProgressEvent from \"../../utils/events/chunkProgressEvent.js\";\nimport type DownloaderRestoredState from \"../dtos/downloaderRestoredState.js\";\nimport type DownloadOptions from \"../downloadOptions.js\";\nimport type DownloadMetadataDeterminedEventArgs from \"../eventArgs/downloadMetadataDeterminedEventArgs.js\";\n\nexport default class DownloadState {\n readonly #transferId: string;\n readonly #downloadId: string;\n readonly #options: DownloadOptions;\n readonly #eventsEngine: EventsEngine;\n\n readonly #files: Array<DownloadFileInfo>;\n readonly #failedFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\n readonly #pendingFiles: Set<DownloadFileInfo> = new Set<DownloadFileInfo>();\n\n #totalSize = 0;\n #networkStatus = true;\n #consecutiveNetworkErrors = 0;\n #status: TransferStatus = TransferStatus.Initialized;\n #firstStartedUnixEpochMillis: number | null = null;\n #startedUnixEpochMillis: number | null = null;\n #elapsedActiveMillis = 0;\n #lastProgressTickUnixEpochMillis: number | null = null;\n #lastSpeedCalc: number | null = null;\n #percent = 0;\n\n /**\n * How many bytes downloaded - counting only completed files.\n */\n #downloadedBytes_bank = 0;\n /**\n * How many bytes downloaded total (bank + pendingFiles).\n */\n #downloadedBytes = 0;\n\n #bytesPerSecondAverage = 0;\n #bytesPerSecondCurrent = 0;\n #currentSpeedMeasurementDownloadedBytes: Array<{ time: number, bytes: number }> = [];\n #estimatedRemainingTimeSeconds: number | null = null;\n #pauseImmediately = false;\n #pausedTriggers: Array<(pauseTriggered: boolean) => void> = [];\n #resumeResolve?: (status: TransferStatus) => void;\n\n constructor(downloadId: string, transferId: string, files: Array<DownloadFileInfo>, options: DownloadOptions, eventsEngine: EventsEngine, oldState?: DownloaderRestoredState) {\n this.#downloadId = downloadId;\n this.#transferId = transferId;\n this.#eventsEngine = eventsEngine;\n this.#files = files;\n this.#options = options;\n\n if (oldState) {\n this.#elapsedActiveMillis = oldState.activeTime;\n this.#downloadedBytes = oldState.downloadedBytes;\n this.#downloadedBytes_bank = oldState.downloadedBytesBank;\n this.#totalSize = oldState.totalSize;\n this.#percent = oldState.percent;\n }\n else {\n for (const file of this.#files)\n this.#totalSize += file.sizeInBytes;\n }\n }\n\n get isRunning(): boolean {\n return this.#status === TransferStatus.Running;\n }\n\n get status(): TransferStatus {\n return this.#status;\n }\n\n get hasFailedFiles(): boolean {\n return this.#failedFiles.size > 0;\n }\n\n get allFilesCompletedOrFailed(): boolean {\n return this.#files.every(x => x.isCompleted || x.isFailed);\n }\n\n get averageBytesPerSecond(): number {\n return this.#bytesPerSecondAverage;\n }\n\n get isThereNetworkProblem(): boolean {\n return this.#networkStatus === false;\n }\n\n get pauseImmediately(): boolean {\n return this.#pauseImmediately;\n }\n\n get currentState(): DownloadEventArgs {\n return this.#buildDownloadEventArgs();\n }\n\n get #nowUnixEpochMillis() {\n return new Date().getTime();\n }\n\n get #activeTimeMillis() {\n return this.#elapsedActiveMillis + this.#activeTimeMillisSinceLastStart;\n }\n\n get #activeTimeMillisSinceLastStart() {\n if (this.#startedUnixEpochMillis === null)\n return 0;\n\n return (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n }\n\n get #totalTime() {\n if (this.#firstStartedUnixEpochMillis === null)\n return 0;\n\n return this.#nowUnixEpochMillis - this.#firstStartedUnixEpochMillis;\n }\n\n get #remainingBytes() {\n return this.#totalSize - this.#downloadedBytes;\n }\n\n get #isItTimeForGlobalProgressEvent(): boolean {\n return this.#lastProgressTickUnixEpochMillis === null || (this.#nowUnixEpochMillis - this.#lastProgressTickUnixEpochMillis) > this.#options.progressTickMillis;\n }\n\n start(): boolean {\n if (this.#status === TransferStatus.Initialized) { // can start only once!\n this.#status = TransferStatus.Running;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n this.#firstStartedUnixEpochMillis = this.#startedUnixEpochMillis;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs(true);\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadStarted, args);\n return true;\n }\n return false;\n }\n\n requestPause(options: { interruptPendingChunks: boolean, pausedTrigger?: (paused: boolean) => void }): void {\n if (options.pausedTrigger)\n this.#pausedTriggers.push(options.pausedTrigger);\n\n if (this.#status === TransferStatus.Running) {\n this.#status = TransferStatus.Pausing;\n this.#pauseImmediately = options.interruptPendingChunks;\n\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\n }\n else if (this.#status === TransferStatus.Pausing && options.interruptPendingChunks && !this.#pauseImmediately) {\n this.#pauseImmediately = true;\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Pausing, pauseArgs);\n }\n else if (this.#status !== TransferStatus.Pausing && options.pausedTrigger) {\n this.#pausedTriggers = this.#pausedTriggers.filter(x => x !== options.pausedTrigger);\n options.pausedTrigger(false);\n }\n }\n\n paused(): Promise<TransferStatus | null> {\n if (this.#status === TransferStatus.Pausing) {\n this.#status = TransferStatus.Paused;\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n const pauseArgs: DownloadPauseEventArgs = this.#buildPauseDownloadEventArgs();\n this.#startedUnixEpochMillis = null;\n this.#lastSpeedCalc = null;\n this.#currentSpeedMeasurementDownloadedBytes = [];\n this.#estimatedRemainingTimeSeconds = null;\n this.#pauseImmediately = false;\n this.#eventsEngine.emit(TransferDownloadEvent.Paused, pauseArgs);\n\n const pausedTriggers = this.#pausedTriggers;\n this.#pausedTriggers = [];\n pausedTriggers.forEach(pausedTrigger => pausedTrigger(true));\n\n return new Promise(resolve => {\n this.#resumeResolve = resolve;\n });\n }\n return Promise.resolve(null);\n }\n\n resume(): boolean {\n if (this.#status === TransferStatus.Pausing) {\n this.#status = TransferStatus.Running;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\n return true;\n }\n if (this.#status === TransferStatus.Paused) {\n this.#status = TransferStatus.Running;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Resumed, args);\n if (this.#resumeResolve) {\n this.#resumeResolve(TransferStatus.Running);\n this.#resumeResolve = undefined;\n }\n return true;\n }\n return false;\n }\n\n requestAbort(): boolean {\n if (this.#status === TransferStatus.Running || this.#status === TransferStatus.Pausing || this.#status === TransferStatus.Paused) {\n this.#status = TransferStatus.Aborting;\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Aborting, args);\n if (this.#resumeResolve) {\n this.#resumeResolve(TransferStatus.Aborting);\n this.#resumeResolve = undefined;\n }\n return true;\n }\n return false;\n }\n\n aborted(): boolean {\n if (this.#status === TransferStatus.Aborting) {\n this.#status = TransferStatus.Aborted;\n if (this.#startedUnixEpochMillis !== null)\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n const args: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.Aborted, args);\n\n return true;\n }\n return false;\n }\n\n fileStarting(file: DownloadFileInfo) {\n file.starting();\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarting, args);\n }\n\n fileCreating(file: DownloadFileInfo) {\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreating, args);\n }\n\n ensureFileStarted(file: DownloadFileInfo): void {\n if (!file.isStarted)\n this.#fileStarted(file);\n }\n\n fileCreated(file: DownloadFileInfo) {\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileCreated, args);\n }\n\n fileFailedById(fileId: string, reason: DownloadError) {\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\n this.fileFailed(actualFile, reason);\n }\n\n fileFailed(file: DownloadFileInfo, reason: DownloadError): void {\n if (file.isFailed === false) {\n file.fail(reason);\n const args: FileDownloadFailedEventArgs = {\n ...this.#buildFileDownloadEventArgs(file),\n reason,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadFailed, args);\n }\n\n this.#failedFiles.add(file);\n this.#pendingFiles.delete(file);\n }\n\n fileCompleted(fileId: string, finalDownloadPath: string): void {\n const actualFile = (this.#files.find(x => x.externalId === fileId))!;\n actualFile.complete(finalDownloadPath);\n const updatedArgs = this.#buildFileDownloadEventArgs(actualFile);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleted, updatedArgs);\n }\n\n fileCompleting(file: DownloadFileInfo): void {\n const removed = this.#pendingFiles.delete(file);\n if (removed || file.sizeInBytes === 0) {\n this.#downloadedBytes_bank += file.sizeInBytes;\n const fileArgs = this.#buildFileDownloadEventArgs(file!);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadCompleting, fileArgs);\n }\n }\n\n chunkDownloadStarted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\n file.chunkStarted(chunk);\n const args: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadStarted, args);\n }\n\n chunkDownloadProgressed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, progress: ChunkProgressEvent): void {\n if (!file.isStarted)\n this.#fileStarted(file);\n\n this.networkOk();\n\n chunk.setProgress(progress.transferredBytesTotal);\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\n\n if (this.#isItTimeForFileProgressEvent(file))\n this.#fileProgressed(file);\n\n if (this.#isItTimeForGlobalProgressEvent)\n this.#progressed();\n }\n\n chunkDownloadCompleted(file: DownloadFileInfo, chunk: DownloadFileChunkInfo): void {\n chunk.complete();\n file.chunkCompleted(chunk);\n file.updateProgress();\n\n const chunkArgs: ChunkDownloadEventArgs = this.#buildChunkDownloadEventArgs(file, chunk);\n\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadProgressed, chunkArgs);\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadCompleted, chunkArgs);\n\n this.#tryCompleteFile(file);\n }\n\n chunkDownloadFailed(file: DownloadFileInfo, chunk: DownloadFileChunkInfo, reason: DownloadError): void {\n chunk.fail(reason);\n file.chunkFailed(chunk);\n\n const args: ChunkDownloadFailedEventArgs = {\n ...this.#buildChunkDownloadEventArgs(file, chunk),\n reason,\n };\n this.#eventsEngine.emit(TransferDownloadEvent.ChunkDownloadFailed, args);\n\n // we've tried multiple times - but chunk still cannot be downloaded - fail this file\n this.fileFailed(file, reason);\n }\n\n completed(error?: Error): void {\n if (this.#status === TransferStatus.Completed || this.#status === TransferStatus.Failed)\n throw new DownloadError(`Download ${this.#downloadId} completion cannot be triggered in state ${TransferStatus[this.#status]}`);\n\n const failedFiles = this.#mapFailedFiles();\n\n if (!!error || failedFiles.length)\n this.#status = TransferStatus.Failed;\n else\n this.#status = TransferStatus.Completed;\n\n this.#progressed();\n\n const args: DownloadCompletedEventArgs = {\n ...this.#buildDownloadEventArgs(true),\n failedFiles,\n downloadError: error,\n };\n\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadCompleted, args);\n }\n\n registeringTransferDownload(): void {\n if (this.#status !== TransferStatus.Completed) {\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadRegistrationTriggered, args);\n }\n }\n\n registeringFileDownload(): void {\n if (this.#status !== TransferStatus.Completed) {\n const args: DownloadEventArgs = { ...this.#buildDownloadEventArgs() };\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadRegistrationTriggered, args);\n }\n }\n\n getCurrentState(withFiles: boolean): DownloadEventArgs {\n return this.#buildDownloadEventArgs(withFiles);\n }\n\n networkFailure() {\n this.#consecutiveNetworkErrors += 1;\n if (this.#options.fileserverOfflineAfterConsecutiveAttempts > -1\n && this.#consecutiveNetworkErrors > this.#options.fileserverOfflineAfterConsecutiveAttempts\n && this.#networkStatus === true) {\n this.#elapsedActiveMillis += (this.#nowUnixEpochMillis - this.#startedUnixEpochMillis!);\n this.#startedUnixEpochMillis = null;\n this.#lastSpeedCalc = null;\n this.#currentSpeedMeasurementDownloadedBytes = [];\n this.#estimatedRemainingTimeSeconds = null;\n this.#networkStatus = false;\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkFailure);\n }\n }\n\n networkOk() {\n this.#consecutiveNetworkErrors = 0;\n if (this.#networkStatus === false) {\n this.#networkStatus = true;\n this.#startedUnixEpochMillis = this.#nowUnixEpochMillis;\n this.#eventsEngine.emit(TransferDownloadEvent.NetworkOk);\n }\n }\n\n possibleSupersizedFile(file: DownloadFileInfo) {\n // sometimes when FS returns too many bytes the file size could get bigger on disk than it was initially created with\n // truncate the file in this case\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.PossibleSupersizedFile, fileArgs);\n }\n\n #progressed(): void {\n this.#updateProgress();\n\n const globalArgs: DownloadEventArgs = this.#buildDownloadEventArgs();\n this.#eventsEngine.emit(TransferDownloadEvent.DownloadProgressed, globalArgs);\n }\n\n #fileProgressed(file: DownloadFileInfo): void {\n file.updateProgress();\n\n const fileArgs: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadProgressed, fileArgs);\n }\n\n #fileStarted(file: DownloadFileInfo): void {\n file.start();\n\n this.#pendingFiles.add(file);\n\n const args: FileDownloadEventArgs = this.#buildFileDownloadEventArgs(file);\n this.#eventsEngine.emit(TransferDownloadEvent.FileDownloadStarted, args);\n }\n\n #tryCompleteFile(file: DownloadFileInfo): void {\n if (file.chunks.every(chunk => chunk.isCompleted))\n this.fileCompleting(file);\n }\n\n #isItTimeForFileProgressEvent(file: DownloadFileInfo): boolean {\n return file.lastProgressTick === null || (this.#nowUnixEpochMillis - file.lastProgressTick) > this.#options.progressTickMillis;\n }\n\n #buildFileDownloadEventArgs(file: DownloadFileInfo): FileDownloadEventArgs {\n return {\n transferId: this.#transferId,\n file: this.#mapFileProgress(file),\n activeTime: this.#activeTimeMillis,\n };\n }\n\n #buildChunkDownloadEventArgs(file: DownloadFileInfo, chunk: DownloadFileChunkInfo) {\n return {\n ...this.#buildFileDownloadEventArgs(file),\n chunk: this.#mapChunkProgress(chunk),\n };\n }\n\n #buildDownloadEventArgs(withFiles = false): DownloadEventArgs {\n return {\n status: this.#status,\n downloadId: this.#downloadId,\n transferId: this.#transferId,\n activeTimeMillis: this.#activeTimeMillis,\n totalTimeMillis: this.#totalTime,\n progressPercent: this.#percent,\n bytesPerSecondAverage: this.#bytesPerSecondAverage,\n bytesPerSecondCurrent: this.#bytesPerSecondCurrent,\n estimatedRemainingTimeSeconds: this.#estimatedRemainingTimeSeconds,\n totalSize: this.#totalSize,\n downloadedBytes: this.#downloadedBytes,\n files: withFiles ? this.#mapFilesProgress() : null,\n downloadBaseFolder: this.#options.downloadFolder!,\n };\n }\n\n notifyMetadataDetermined(fileServerUrl: string, region?: string) {\n const eventArgs: DownloadMetadataDeterminedEventArgs = { ...this.#buildDownloadEventArgs(), region, fileServerUrl };\n this.#eventsEngine.emit(TransferDownloadEvent.TransferMetadataDetermined, eventArgs);\n }\n\n #buildPauseDownloadEventArgs(): DownloadPauseEventArgs {\n return { ...this.#buildDownloadEventArgs(), interruptPendingChunks: this.#pauseImmediately };\n }\n\n #updateProgress(): void {\n const now = this.#nowUnixEpochMillis;\n this.#lastProgressTickUnixEpochMillis = now;\n\n this.#downloadedBytes = this.#downloadedBytes_bank;\n for (const file of this.#pendingFiles)\n this.#downloadedBytes += file.downloadedBytes;\n\n this.#currentSpeedMeasurementDownloadedBytes.push({ time: now, bytes: this.#downloadedBytes });\n\n if (this.#totalSize === 0)\n this.#percent = 100;\n else\n this.#percent = Math.min(100, (100 * this.#downloadedBytes) / this.#totalSize);\n\n // all-time bytes/sec\n const activeTime = this.#activeTimeMillis;\n if (activeTime > 0)\n this.#bytesPerSecondAverage = this.#downloadedBytes / (activeTime / 1000);\n\n const shouldWeCalculateSpeed = (this.#lastSpeedCalc === null && this.#activeTimeMillisSinceLastStart > 1500)\n || (this.#lastSpeedCalc !== null && (now - this.#lastSpeedCalc) > 200);\n\n if (shouldWeCalculateSpeed) {\n this.#lastSpeedCalc = now;\n\n // momentary bytes/sec\n const prev = this.#currentSpeedMeasurementDownloadedBytes[0]!;\n const timeDiff = now - prev.time;\n this.#bytesPerSecondCurrent = Math.max(0, this.#downloadedBytes - prev.bytes) / (timeDiff / 1000);\n if (timeDiff > this.#options.momentaryDownloadSpeedTimespanMillis)\n this.#currentSpeedMeasurementDownloadedBytes.shift();\n\n // remaining time (seconds) - based on momentary speed and remaining bytes to download - and smoothing factor\n if (this.#remainingBytes === 0)\n this.#estimatedRemainingTimeSeconds = 0;\n else if (this.#bytesPerSecondCurrent > 0) {\n const newRemaining = this.#remainingBytes / this.#bytesPerSecondCurrent;\n if (this.#estimatedRemainingTimeSeconds)\n this.#estimatedRemainingTimeSeconds = (0.7 * newRemaining) + (0.3 * this.#estimatedRemainingTimeSeconds);\n else\n this.#estimatedRemainingTimeSeconds = newRemaining;\n }\n }\n }\n\n #mapFilesProgress(): Array<DownloadFileProgress> {\n return this.#files.map(x => this.#mapFileProgress(x));\n }\n\n #mapFailedFiles(): Array<DownloadFileProgress> {\n const result: Array<DownloadFileProgress> = [];\n for (const x of this.#failedFiles)\n result.push(this.#mapFileProgress(x));\n return result;\n }\n\n #mapFileProgress(file: DownloadFileInfo): DownloadFileProgress {\n return DownloadFileProgress.FromFileDownloadInfo(file);\n }\n\n #mapChunkProgress(chunk: DownloadFileChunkInfo): DownloadFileChunkProgress {\n return DownloadFileChunkProgress.FromChunkInfo(chunk);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transferUpload.d.ts","sourceRoot":"","sources":["../../../src/uploader/transferUpload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transferUpload.d.ts","sourceRoot":"","sources":["../../../src/uploader/transferUpload.ts"],"names":[],"mappings":"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"}
@@ -445,8 +445,14 @@ export default class TransferUpload {
445
445
  if (this.isUploadAppend()) {
446
446
  // There is no possibility to cancel transfer upload append on API for now
447
447
  }
448
- else
449
- await this.cancelApiTransfer(abortSignal);
448
+ else {
449
+ try {
450
+ await this.cancelApiTransfer(abortSignal);
451
+ }
452
+ catch {
453
+ // If API cancel fails we still finalize local transfer state as canceled to avoid hanging in Canceling.
454
+ }
455
+ }
450
456
  this.#transferState.transferCanceled();
451
457
  }
452
458
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"transferUpload.js","sourceRoot":"","sources":["../../../src/uploader/transferUpload.ts"],"names":[],"mappings":"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","sourcesContent":["import sleep from 'abortable-sleep';\n\nimport ApiError from '../utils/api/apiError.js';\nimport FsError from '../utils/fileSystem/fsError.js';\nimport TransferUploadState from \"./state/transferUploadState.js\";\nimport TransferUploadError from \"./transferUploadError.js\";\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport TransferUploadEvent from './transferUploadEvent.js';\nimport ChunksIterator from './chunksIterator/chunksIterator.js';\nimport mergeAbortAndPauseSignals from '../utils/mergeAbortAndPauseSignals.js';\nimport ApiFilemail449Error from '../utils/api/apiFilemail449Error.js';\nimport { promiseAllSettled } from '../utils/promiseAll.js';\nimport { concatUint8Arrays, hexToUint8Array, uint8ArrayToHex } from '../utils/uint8ArrayUtils.js';\n\nimport type ApiClient from \"../utils/api/apiClient.js\";\nimport type { InitializeTransferRequest } from \"../utils/api/dtos/initializeTransferRequest.js\";\nimport type SendFileChunkRequest from '../utils/api/dtos/sendFileChunkRequest.js';\nimport type FileServerClientFactory from '../utils/api/fileServerClientFactory.js';\nimport type FileDetails from \"../utils/fileSystem/fileDetails.js\";\nimport type TransferUploadMetadata from \"./export/transferUploadMetadata.js\";\nimport type TransferUploadInfo from \"./options/transferUploadInfo.js\";\nimport type { TransferUploadAppendInfo } from './options/transferUploadAppendInfo.js';\nimport type ResetTransferRequest from '../utils/api/dtos/resetTransferRequest.js';\nimport type EventsEngine from '../utils/events/eventsEngine.js';\nimport type FileChunkUploadEventArgs from './eventArgs/fileChunkUploadEventArgs.js';\nimport type FileChunkUploadFailedEventArgs from './eventArgs/fileChunkUploadFailedEventArgs.js';\nimport type ChunkProgressEvent from '../utils/events/chunkProgressEvent.js';\nimport type FinalizeTransferRequest from '../utils/api/dtos/finalizeTransferRequest.js';\nimport type FileUploadEventArgs from './eventArgs/fileUploadEventArgs.js';\nimport type TransferUploadCompletedEventArgs from './eventArgs/transferUploadCompletedEventArgs.js';\nimport type CancelTransferRequest from '../utils/api/dtos/cancelTransferRequest.js';\nimport type ConcurrencyReleaser from \"../utils/concurrencyController/concurrencyReleaser.js\";\nimport type FileUploadFailedEventArgs from './eventArgs/fileUploadFailedEventArgs.js';\nimport type TransferUploadProgressedEventArgs from './eventArgs/transferUploadProgressedEventArgs.js';\nimport type FileChunkUploadProgressedEventArgs from './eventArgs/fileChunkUploadProgressedEventArgs.js';\nimport type UploaderChunkStreamProviderFactory from './chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js';\nimport type TransferUploadConfig from './options/transferUploadConfig.js';\nimport type { PauseSignal } from './pauseController.js';\nimport type InitializeTransferResponse from '../utils/api/dtos/initializeTransferResponse.js';\nimport type { InitializeTransferResponseUdpData } from '../utils/api/dtos/initializeTransferResponse.js';\nimport type TransferUploadModeChosenEventArgs from './eventArgs/transferUploadModeChosenEventArgs.js';\nimport type HandshakeRequest from './api/dtos/handshakeRequest.js';\nimport type ChunkStreamProvider from '../utils/fileSystem/chunkStreamProvider.js';\nimport type SendChunkRequest from './api/dtos/sendChunkRequest.js';\nimport type UploadOptimizer from './optimizer/uploadOptimizer.js';\nimport type FileChunkUploadCompletedPartiallyEventArgs from './eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js';\nimport type FileChunkUploadCompletedEventArgs from './eventArgs/fileChunkUploadCompletedEventArgs.js';\nimport type TransferMetadataDeterminedEventArgs from './eventArgs/transferMetadataDeterminedEventArgs.js';\nimport type CryptographyProvider from '../utils/crypto/cryptographyProvider.js';\nimport type { TransferUploadExportData, TransferUploadExportDataMetadata } from './export/transferUploadExportData.js';\n\nexport default class TransferUpload<T extends FileDetails> {\n #totalSizeInBytes: number;\n\n #chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>;\n #apiClient: ApiClient;\n #fileServerClientFactory: FileServerClientFactory;\n #eventsEngine: EventsEngine;\n #info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>;\n #config: TransferUploadConfig;\n #optimizer: UploadOptimizer;\n #cryptography: CryptographyProvider;\n\n #transferState?: TransferUploadState;\n #transferMetadata?: TransferUploadMetadata;\n #transferDownloadUrl?: string;\n\n #pauseSignal: PauseSignal | undefined;\n #abortSignal: AbortSignal | undefined;\n #mergedPauseAndAbortSignal: AbortSignal | undefined;\n\n pauseEventListener: (() => void) | undefined;\n abortEventListener: (() => void) | undefined;\n\n #isUdpUploadMode: boolean;\n #serverLatencyInMs: number | undefined;\n\n #isRunMethodRunning = false;\n\n get status(): TransferStatus {\n return this.#transferState?.status ?? TransferStatus.Initialized;\n }\n\n get completedFilesCount(): number {\n return this.#transferState?.completedFilesCount ?? 0;\n }\n\n get failedFilesCount(): number {\n return this.#transferState?.failedFilesCount ?? 0;\n }\n\n get uploadedBytesCount(): number {\n return this.#transferState?.uploadedBytesCount ?? 0;\n }\n\n get failedBytesCount(): number {\n return this.#transferState?.failedBytesCount ?? 0;\n }\n\n get progressInPercentage(): number {\n if (this.totalSizeInBytes === 0)\n return 0;\n\n return (this.uploadedBytesCount * 100) / this.totalSizeInBytes;\n }\n\n get files(): readonly Readonly<T>[] {\n return this.#info.files;\n }\n\n get totalSizeInBytes(): number {\n return this.#totalSizeInBytes;\n }\n\n get transferId(): string | undefined {\n return this.#transferMetadata?.transferId;\n }\n\n constructor(chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>, config: TransferUploadConfig, optimizer: UploadOptimizer, cryptography: CryptographyProvider) {\n if (info.files.length === 0)\n throw new TransferUploadError(`Files can't be empty`);\n\n this.#totalSizeInBytes = info.files.reduce((partialSum, file) => partialSum + file.fileSizeInBytes, 0);\n this.#isUdpUploadMode = false;\n\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#apiClient = apiClient;\n this.#fileServerClientFactory = fileServerClientFactory;\n this.#eventsEngine = eventsEngine;\n this.#info = info;\n this.#config = config;\n this.#optimizer = optimizer;\n this.#cryptography = cryptography;\n\n if (this.isUploadAppendInfo(this.#info))\n this.createTransferMetadataFromInfo(this.#info);\n }\n\n private isUploadAppend(): boolean {\n return this.isUploadAppendInfo(this.#info);\n }\n\n private isUploadAppendInfo(info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): info is TransferUploadAppendInfo<T> {\n return (info as TransferUploadAppendInfo<T>).transferKey !== undefined;\n }\n\n private createTransferMetadataFromInfo(info: TransferUploadAppendInfo<T>) {\n if (!this.isUploadAppendInfo(info))\n throw new TransferUploadError(`Options are not TransferUploadAppendOptions`);\n\n this.#transferDownloadUrl = info.transferDownloadUrl;\n\n this.#transferMetadata = {\n transferId: info.transferId,\n transferKey: info.transferKey,\n transferFileServerUrl: info.transferFileServerUrl,\n transferRegion: info.transferRegion,\n encryptionData: info.e2eeData,\n };\n }\n\n async run(transferPauseSignal: PauseSignal, transferAbortSignal: AbortSignal): Promise<void> {\n this.throwIfNotPossibleToRun(transferPauseSignal, transferAbortSignal);\n\n this.#isRunMethodRunning = true;\n\n try {\n this.#pauseSignal = transferPauseSignal;\n this.#abortSignal = transferAbortSignal;\n this.#mergedPauseAndAbortSignal = mergeAbortAndPauseSignals(transferPauseSignal, transferAbortSignal);\n\n if (!this.#transferState)\n this.#transferState = new TransferUploadState(this.files, this.#eventsEngine, this.#config.currentRatesTimespanInMs, this.#config.progressEventThrottlingInMs);\n else\n this.#transferState.recover();\n\n this.#transferState.transferRun();\n\n this.addPauseAndStopListeners();\n\n if (!this.#transferMetadata)\n await this.startApiTransferAndCreateMetadata();\n\n this.notifyMetadataDetermined();\n\n await this.pingServerAndChooseUploadMode();\n\n if (this.#isUdpUploadMode && !this.#transferMetadata!.udpData!.handshakeData)\n await this.serverUdpHandshake();\n\n this.#optimizer.start(this.#isUdpUploadMode, this.#serverLatencyInMs!);\n\n const ongoingChunkUploads: Promise<void>[] = [];\n\n for (const file of this.files) {\n const fileStatus = this.#transferState.getFile(file.externalId);\n\n if (fileStatus.isCompleted)\n continue;\n\n const alreadySentChunks = this.#transferState.getChunksForFile(file.externalId);\n const chunksIterator = new ChunksIterator(alreadySentChunks, file.fileSizeInBytes, this.#optimizer);\n\n for (const chunk of chunksIterator.getChunksIterator()) {\n // eslint-disable-next-line no-await-in-loop\n const releaseSemaphore = await this.#optimizer.semaphoreAcquire();\n\n if (this.#optimizer.currentSleepTimeInMs >= 1)\n // eslint-disable-next-line no-await-in-loop\n await sleep(this.#optimizer.currentSleepTimeInMs, this.#mergedPauseAndAbortSignal);\n\n if (this.#transferState!.status !== TransferStatus.Running) {\n releaseSemaphore();\n break;\n }\n\n const promise: Promise<void> = this.sendChunkAndKeepUpdatingState(file, chunk.startPosition, chunk.sizeInBytes, releaseSemaphore);\n\n ongoingChunkUploads.push(promise);\n\n if (this.#transferState!.status !== TransferStatus.Running)\n break;\n }\n\n if (this.#transferState!.status !== TransferStatus.Running)\n break;\n }\n\n await promiseAllSettled(ongoingChunkUploads);\n\n this.#optimizer.stop();\n\n if (this.#transferState.status === TransferStatus.Pausing)\n this.#transferState.transferPaused();\n else if (this.#transferState.status === TransferStatus.Aborting)\n this.#transferState.transferAborted();\n else if (this.uploadedBytesCount !== this.totalSizeInBytes)\n this.#transferState.transferFailed();\n else {\n await this.finalizeTransfer();\n this.#transferState.transferCompleted(this.#transferMetadata!, this.#transferDownloadUrl!);\n }\n }\n catch (error) {\n // We can get here with pausing or aborting status if any API call fails (e.g., finalizeTransfer) so we need to check the status again\n if (!this.#transferState)\n this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);\n else if (this.#transferState.status === TransferStatus.Pausing) {\n this.#transferState.transferPaused();\n return;\n }\n else if (this.#transferState.status === TransferStatus.Aborting) {\n this.#transferState.transferAborted();\n return;\n }\n else\n this.#transferState.transferFailed();\n\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n finally {\n this.removePauseAndStopListeners();\n this.#optimizer.stop();\n this.#isRunMethodRunning = false;\n }\n }\n\n private notifyMetadataDetermined() {\n if (!this.#transferMetadata)\n return;\n\n const eventArgs: TransferMetadataDeterminedEventArgs = {\n transferId: this.#transferMetadata.transferId,\n fileServerUrl: this.#transferMetadata.transferFileServerUrl,\n region: this.#transferMetadata.transferRegion,\n };\n\n this.#eventsEngine.emit(TransferUploadEvent.TransferMetadataDetermined, eventArgs);\n }\n\n private async pingServerAndChooseUploadMode(): Promise<void> {\n try {\n if (this.#config.turnOffUdp)\n throw new Error(`UDP is turned off`);\n\n const udpData = this.#transferMetadata?.udpData;\n\n if (!udpData)\n throw new Error(`No UDP data is available`);\n\n const requestTimeout = this.#config.forceUdp ? 3 * 1000 : this.getPingTimeout(udpData.threshold);\n const retryDelay = 1000;\n\n const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, requestTimeout, this.#mergedPauseAndAbortSignal, undefined, retryDelay);\n\n await udpClient.connect();\n\n const pingResult = await udpClient.ping();\n\n udpClient.close().catch(() => { /* discard */ });\n\n this.#serverLatencyInMs = pingResult.latencyInMs;\n this.#isUdpUploadMode = pingResult.latencyInMs >= udpData.threshold;\n\n const eventArgs: TransferUploadModeChosenEventArgs = { isUdpMode: this.#isUdpUploadMode, latency: pingResult.latencyInMs };\n this.#eventsEngine.emit(TransferUploadEvent.TransferUploadModeChosen, eventArgs);\n }\n catch (error) {\n this.#isUdpUploadMode = false;\n\n const eventArgs: TransferUploadModeChosenEventArgs = { isUdpMode: this.#isUdpUploadMode, error: error as Error };\n this.#eventsEngine.emit(TransferUploadEvent.TransferUploadModeChosen, eventArgs);\n }\n }\n\n private getPingTimeout(udpPingThreshold: number) {\n const pingTimeout = Math.min(3 * 1000, udpPingThreshold * 20);\n return Math.max(500, pingTimeout);\n }\n\n private async serverUdpHandshake(): Promise<void> {\n const transferMetadata = this.#transferMetadata!;\n const udpData = transferMetadata.udpData!;\n\n const requestTimeout = this.getHandshakeTimeout();\n const retryDelay = 1000;\n\n const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, requestTimeout, this.#mergedPauseAndAbortSignal, undefined, retryDelay);\n\n await udpClient.connect();\n\n const handshakeRequest: HandshakeRequest = { transferId: transferMetadata.transferId, transferKey: transferMetadata.transferKey };\n const handshakeResponse = await udpClient.handshake(handshakeRequest);\n\n udpClient.close().catch(() => { /* discard */ });\n\n this.#transferMetadata!.udpData!.handshakeData = handshakeResponse;\n }\n\n private getHandshakeTimeout() {\n const timeout = Math.min(this.#serverLatencyInMs! * 30, 30 * 1000);\n return Math.max(2000, timeout);\n }\n\n private async sendChunkAndKeepUpdatingState(file: T, chunkStartPosition: number, chunkSizeInBytes: number, releaseSemaphore: ConcurrencyReleaser): Promise<void> {\n let uploadedBytesCount = 0;\n\n try {\n this.#transferState!.chunkUploadStarted(file.externalId, chunkStartPosition, chunkSizeInBytes);\n\n const chunkStreamProvider = this.#chunkStreamProviderFactory.createChunkStreamProvider(file, chunkStartPosition, chunkSizeInBytes, this.#transferMetadata?.encryptionData);\n\n const progressEventHandler = (eventArgs: ChunkProgressEvent) => {\n uploadedBytesCount += eventArgs.transferredBytesSinceLastEvent;\n this.#transferState!.chunkUploadProgressed(file.externalId, chunkStartPosition, chunkSizeInBytes, eventArgs);\n };\n\n const response = await this.sendChunk(file, chunkStreamProvider, progressEventHandler);\n\n const latencyInMsIfUdp = this.#isUdpUploadMode ? (response as { latencyInMs: number }).latencyInMs : undefined;\n\n if (uploadedBytesCount === chunkSizeInBytes)\n this.#transferState!.chunkUploadCompleted(file.externalId, chunkStartPosition, chunkSizeInBytes, latencyInMsIfUdp);\n else\n this.#transferState!.chunkUploadCompletedPartially(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal!.paused, latencyInMsIfUdp);\n }\n catch (error) {\n const chunkError = error as Error;\n\n const isTcpPausingError = chunkError.cause !== undefined\n && chunkError.cause instanceof ApiFilemail449Error\n && chunkError.cause.message === `Wrong md5 hash`\n && this.#pauseSignal?.paused === true;\n\n if (isTcpPausingError)\n this.#transferState!.chunkUploadCompletedPartially(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal!.paused);\n else {\n const failedReason = this.getChunkFailedReason(error);\n this.#transferState!.chunkUploadFailed(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, failedReason, error as Error);\n }\n }\n finally {\n releaseSemaphore();\n }\n }\n\n private async sendChunk(file: T, chunkStreamProvider: ChunkStreamProvider, progressEventHandler: (eventArgs: ChunkProgressEvent) => void): Promise<{ latencyInMs: number } | void> {\n if (this.#isUdpUploadMode)\n return await this.sendChunkUsingUdp(file, chunkStreamProvider, progressEventHandler);\n\n return await this.sendChunkUsingTcp(file, chunkStreamProvider, progressEventHandler);\n }\n\n private async sendChunkUsingUdp(file: T, chunkStreamProvider: ChunkStreamProvider, progressEventHandler: (eventArgs: ChunkProgressEvent) => void): Promise<{ latencyInMs: number }> {\n const transferMetadata = this.#transferMetadata!;\n const udpData = transferMetadata.udpData!;\n\n const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, this.#optimizer.currentRequestTimeoutInMs, this.#mergedPauseAndAbortSignal, 0);\n\n const sendChunkRequest: SendChunkRequest = {\n sessionGuid: this.#transferMetadata!.udpData!.handshakeData!.sessionGuid,\n aesKey: this.#transferMetadata!.udpData!.handshakeData!.aesKey,\n chunkStartPosition: chunkStreamProvider.chunkStartPosition,\n fileSizeInBytes: file.fileSizeInBytes,\n fileDestinationPathInTransfer: file.fileDestinationPathInTransfer,\n fileName: file.fileName,\n };\n\n await udpClient.connect();\n\n const result = await udpClient.sendChunk(sendChunkRequest, chunkStreamProvider);\n\n udpClient.close().catch(() => { /* discard */ });\n\n const chunkProgressEventArgs: ChunkProgressEvent = { transferredBytesTotal: chunkStreamProvider.chunkLengthInBytes, transferredBytesSinceLastEvent: chunkStreamProvider.chunkLengthInBytes };\n progressEventHandler(chunkProgressEventArgs);\n\n return result;\n }\n\n private async sendChunkUsingTcp(file: T, chunkStreamProvider: ChunkStreamProvider, progressEventHandler: (eventArgs: ChunkProgressEvent) => void): Promise<void> {\n const request: SendFileChunkRequest = {\n chunkLengthInBytes: chunkStreamProvider.chunkLengthInBytes,\n chunkStartPosition: chunkStreamProvider.chunkStartPosition,\n };\n\n const fileServerClient = this.#fileServerClientFactory.createFileServerTcpUploadClient(this.#transferMetadata!.transferFileServerUrl, this.#transferMetadata!.transferId, this.#transferMetadata!.transferKey, file.fileName, file.fileDestinationPathInTransfer, file.fileSizeInBytes);\n\n const ongoingRequestPromise = fileServerClient.sendFileChunk(request, chunkStreamProvider, this.#pauseSignal!, this.#abortSignal!);\n\n fileServerClient.addEventListener(`progress`, progressEventHandler);\n\n await ongoingRequestPromise;\n }\n\n private getChunkFailedReason(error: unknown) {\n if (error instanceof FsError)\n return `Can't read file. ${error.message}`;\n\n if (error instanceof ApiError)\n return error.cause?.message ? `${error.message}. ${error.cause.message}` : error.message;\n\n return (error as Error)?.message;\n }\n\n private throwIfNotPossibleToRun(pauseSignal: PauseSignal, abortSignal: AbortSignal) {\n if (this.#isRunMethodRunning)\n throw new TransferUploadError(`This transfer is running and cannot be run`);\n\n if (this.#transferState\n && this.#transferState.status !== TransferStatus.Failed\n && this.#transferState.status !== TransferStatus.Aborted\n && this.#transferState.status !== TransferStatus.Initialized\n && this.#transferState.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be run`);\n\n if (this.files.length === 0)\n throw new TransferUploadError(`There are no files passed to the transfer`);\n\n if (pauseSignal.paused)\n throw new TransferUploadError(`Can't run transfer with already paused PauseController`);\n\n if (abortSignal.aborted)\n throw new TransferUploadError(`Can't run transfer with already aborted AbortController`);\n }\n\n private addPauseAndStopListeners() {\n this.pauseEventListener = () => {\n if (this.#transferState!.status !== TransferStatus.Running)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be paused`);\n\n this.#transferState!.transferPauseRequested();\n };\n\n this.abortEventListener = () => {\n if (this.#transferState!.status !== TransferStatus.Running)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be stopped`);\n\n this.#transferState!.transferAbortRequested();\n };\n\n this.#pauseSignal!.addEventListener(`pause`, this.pauseEventListener);\n this.#abortSignal!.addEventListener(`abort`, this.abortEventListener);\n }\n\n private removePauseAndStopListeners() {\n this.#pauseSignal!.removeEventListener(`pause`, this.pauseEventListener!);\n this.#abortSignal!.removeEventListener(`abort`, this.abortEventListener!);\n }\n\n private async startApiTransferAndCreateMetadata() {\n if (this.isUploadAppendInfo(this.#info))\n throw new TransferUploadError(`Options are not TransferUploadOptions`);\n\n try {\n const encryptionDataAndIvSaltHex = await this.generateEncryptionDataAndIvSaltHmacHex(this.#info.e2eeKey);\n\n const request: InitializeTransferRequest = {\n e2ee: Boolean(encryptionDataAndIvSaltHex),\n e2ee_keyhash: encryptionDataAndIvSaltHex?.ivSaltHmacHex,\n transfersize: this.totalSizeInBytes,\n to: this.#info.to,\n from: this.#info.from,\n subject: this.#info.subject,\n message: this.#info.message,\n notify: this.#info.notify,\n confirmation: this.#info.confirmation,\n days: this.#info.days,\n password: this.#info.uploadPassword,\n companyid: this.#info.companyId,\n incominglogintoken: this.#info.incomingLoginToken,\n incomingpageid: this.#info.incomingPageId,\n filerequestid: this.#info.fileRequestId,\n filerequestshareid: this.#info.fileRequestShareId,\n customfields: this.#info.customFields,\n };\n\n const response = await this.#apiClient.initializeTransfer(request, this.#mergedPauseAndAbortSignal);\n\n this.#transferMetadata = {\n transferId: response.transferId,\n transferKey: response.transferKey,\n transferFileServerUrl: response.transferUrl,\n transferRegion: response.transferRegion,\n encryptionData: encryptionDataAndIvSaltHex?.encryptionData,\n udpData: this.getResponseOrForcedUdpData(response),\n };\n }\n catch (error) {\n throw new TransferUploadError(`Error initializing transfer through the API`, { cause: error as Error });\n }\n }\n\n private async generateEncryptionDataAndIvSaltHmacHex(e2eeKey?: string): Promise<{ encryptionData: { iv: Uint8Array, key: Uint8Array }, ivSaltHmacHex: string, salt: Uint8Array, hmac: Uint8Array } | undefined> {\n if (!e2eeKey)\n return undefined;\n\n const salt = this.#cryptography.generateRandomBytes(16);\n const key = await this.#cryptography.deriveKey(e2eeKey, salt);\n const hmac = await this.#cryptography.generateHmac(key);\n const iv = this.#cryptography.generateRandomBytes(16);\n\n const ivSaltHmac = concatUint8Arrays([iv, salt, hmac]);\n const ivSaltHmacHex = uint8ArrayToHex(ivSaltHmac);\n\n return {\n encryptionData: { iv, key },\n hmac,\n salt,\n ivSaltHmacHex,\n };\n }\n\n private getResponseOrForcedUdpData(response: InitializeTransferResponse): InitializeTransferResponseUdpData | undefined {\n if (!this.#config.forceUdp || !response.udp)\n return response.udp;\n\n return {\n ...response.udp,\n threshold: 0,\n };\n }\n\n private async finalizeTransfer(): Promise<void> {\n this.#eventsEngine.emit(TransferUploadEvent.TransferFinalizing);\n\n if (this.isUploadAppend())\n await this.resetApiTransfer();\n else\n await this.finalizeApiTransfer();\n }\n\n private async resetApiTransfer(): Promise<void> {\n try {\n const request: ResetTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n };\n\n await this.#apiClient.resetTransfer(request, this.#mergedPauseAndAbortSignal);\n }\n catch (error) {\n throw new TransferUploadError(`Error resetting transfer through the API`, { cause: error as Error });\n }\n }\n\n private async finalizeApiTransfer(): Promise<void> {\n try {\n const request: FinalizeTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n transferkey: this.#transferMetadata!.transferKey,\n protocol: this.#isUdpUploadMode ? `udp` : `tcp`,\n };\n\n const response = await this.#apiClient.finalizeTransfer(request, this.#mergedPauseAndAbortSignal);\n\n this.#transferDownloadUrl = response.downloadUrl;\n }\n catch (error) {\n throw new TransferUploadError(`Error finalizing transfer through the API`, { cause: error as Error });\n }\n }\n\n async cancel(abortSignal?: AbortSignal): Promise<void> {\n try {\n const isTransferApiInitialized = Boolean(this.#transferState) && Boolean(this.#transferMetadata);\n\n if (!isTransferApiInitialized) {\n this.emitCancelEvents();\n return;\n }\n\n this.throwIfInWrongStateToCancel();\n\n this.#transferState!.transferCancelRequested();\n\n if (this.isUploadAppend()) {\n // There is no possibility to cancel transfer upload append on API for now\n }\n else\n await this.cancelApiTransfer(abortSignal);\n\n this.#transferState!.transferCanceled();\n }\n catch (error) {\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n }\n\n private emitCancelEvents() {\n this.#eventsEngine.emit(TransferUploadEvent.TransferCancelRequested);\n this.#eventsEngine.emit(TransferUploadEvent.TransferCanceled);\n }\n\n private throwIfInWrongStateToCancel() {\n if (!this.#transferState)\n return;\n\n if (this.#transferState.status !== TransferStatus.Failed\n && this.#transferState.status !== TransferStatus.Aborted\n && this.#transferState.status !== TransferStatus.Initialized\n && this.#transferState.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be canceled`);\n }\n\n private async cancelApiTransfer(abortSignal?: AbortSignal): Promise<void> {\n try {\n const request: CancelTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n transferkey: this.#transferMetadata!.transferKey,\n };\n\n await this.#apiClient.cancelTransfer(request, abortSignal);\n }\n catch (error) {\n throw new TransferUploadError(`Error canceling transfer through the API`, { cause: error as Error });\n }\n }\n\n addEventListener(eventName: TransferUploadEvent.TransferRun | TransferUploadEvent.TransferPauseRequested | TransferUploadEvent.TransferPaused | TransferUploadEvent.TransferAbortRequested | TransferUploadEvent.TransferAborted | TransferUploadEvent.TransferCancelRequested | TransferUploadEvent.TransferCanceled | TransferUploadEvent.TransferFailed, handler: () => void): void\n addEventListener(eventName: TransferUploadEvent.FileUploadStarted | TransferUploadEvent.FileUploadCompleted, handler: (event: FileUploadEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileUploadFailed, handler: (event: FileUploadFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadProgressed, handler: (event: FileChunkUploadProgressedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadStarted, handler: (event: FileChunkUploadEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadCompleted, handler: (event: FileChunkUploadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadCompletedPartially, handler: (event: FileChunkUploadCompletedPartiallyEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadFailed, handler: (event: FileChunkUploadFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferProgressed, handler: (event: TransferUploadProgressedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferCompleted, handler: (event: TransferUploadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferUploadModeChosen, handler: (event: TransferUploadModeChosenEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferMetadataDetermined, handler: (event: TransferMetadataDeterminedEventArgs) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n exportAsString(): string {\n const exportData = this.export();\n return JSON.stringify(exportData);\n }\n\n export(): TransferUploadExportData<T> {\n if (!this.#transferState?.files)\n throw new TransferUploadError(`Can't export not started Transfer`); // fileStatuses are not created yet and it really doesn't make any sens to export not started transfer\n\n return {\n transferMetadata: this.getTransferMetadataExportValue(),\n info: this.#info,\n state: this.#transferState.export(),\n };\n }\n\n private getTransferMetadataExportValue(): TransferUploadExportDataMetadata | undefined {\n if (!this.#transferMetadata)\n return undefined;\n\n const { encryptionData, ...rest } = this.#transferMetadata;\n\n return {\n ...rest,\n encryptionData: !encryptionData ? undefined : {\n ivHex: uint8ArrayToHex(encryptionData.iv),\n keyHex: uint8ArrayToHex(encryptionData.key),\n },\n };\n }\n\n static recreate<T extends FileDetails>(transferExportData: TransferUploadExportData<T>, config: TransferUploadConfig, chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, optimizer: UploadOptimizer, cryptography: CryptographyProvider): TransferUpload<T> {\n try {\n TransferUpload.validateRecreateParams(transferExportData);\n\n const transfer = new TransferUpload<T>(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferExportData.info, config, optimizer, cryptography);\n\n transfer.#transferMetadata = this.recreateTransferMetadata(transferExportData.transferMetadata);\n transfer.#transferState = new TransferUploadState(transferExportData.info.files, eventsEngine, config.currentRatesTimespanInMs, config.progressEventThrottlingInMs, transferExportData.state);\n\n return transfer;\n }\n catch (error) {\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n }\n\n private static recreateTransferMetadata(transferMetadata?: TransferUploadExportDataMetadata): TransferUploadMetadata | undefined {\n if (!transferMetadata)\n return undefined;\n\n const { encryptionData, ...rest } = transferMetadata;\n\n return {\n ...rest,\n encryptionData: !encryptionData ? undefined : {\n iv: hexToUint8Array(encryptionData.ivHex),\n key: hexToUint8Array(encryptionData.keyHex),\n },\n };\n }\n\n private static validateRecreateParams<T extends FileDetails>(transferExportData: TransferUploadExportData<T>) {\n if (!transferExportData.info)\n throw new TransferUploadError(`Info must be defined`);\n\n if (!transferExportData.state)\n throw new TransferUploadError(`State must be defined`);\n\n if (transferExportData.transferMetadata && (!transferExportData.transferMetadata.transferId || !transferExportData.transferMetadata.transferKey || !transferExportData.transferMetadata.transferFileServerUrl))\n throw new TransferUploadError(`Not all transfer metadata properties are defined`);\n\n if (transferExportData.transferMetadata?.encryptionData) {\n if (transferExportData.transferMetadata.encryptionData.ivHex.length !== 32)\n throw new TransferUploadError(`Encryption IV must be 16 bytes long`);\n if (transferExportData.transferMetadata.encryptionData.keyHex.length !== 64)\n throw new TransferUploadError(`Encryption key must be 32 bytes long`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"transferUpload.js","sourceRoot":"","sources":["../../../src/uploader/transferUpload.ts"],"names":[],"mappings":"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","sourcesContent":["import sleep from 'abortable-sleep';\n\nimport ApiError from '../utils/api/apiError.js';\nimport FsError from '../utils/fileSystem/fsError.js';\nimport TransferUploadState from \"./state/transferUploadState.js\";\nimport TransferUploadError from \"./transferUploadError.js\";\nimport TransferStatus from \"../utils/types/transferStatus.js\";\nimport TransferUploadEvent from './transferUploadEvent.js';\nimport ChunksIterator from './chunksIterator/chunksIterator.js';\nimport mergeAbortAndPauseSignals from '../utils/mergeAbortAndPauseSignals.js';\nimport ApiFilemail449Error from '../utils/api/apiFilemail449Error.js';\nimport { promiseAllSettled } from '../utils/promiseAll.js';\nimport { concatUint8Arrays, hexToUint8Array, uint8ArrayToHex } from '../utils/uint8ArrayUtils.js';\n\nimport type ApiClient from \"../utils/api/apiClient.js\";\nimport type { InitializeTransferRequest } from \"../utils/api/dtos/initializeTransferRequest.js\";\nimport type SendFileChunkRequest from '../utils/api/dtos/sendFileChunkRequest.js';\nimport type FileServerClientFactory from '../utils/api/fileServerClientFactory.js';\nimport type FileDetails from \"../utils/fileSystem/fileDetails.js\";\nimport type TransferUploadMetadata from \"./export/transferUploadMetadata.js\";\nimport type TransferUploadInfo from \"./options/transferUploadInfo.js\";\nimport type { TransferUploadAppendInfo } from './options/transferUploadAppendInfo.js';\nimport type ResetTransferRequest from '../utils/api/dtos/resetTransferRequest.js';\nimport type EventsEngine from '../utils/events/eventsEngine.js';\nimport type FileChunkUploadEventArgs from './eventArgs/fileChunkUploadEventArgs.js';\nimport type FileChunkUploadFailedEventArgs from './eventArgs/fileChunkUploadFailedEventArgs.js';\nimport type ChunkProgressEvent from '../utils/events/chunkProgressEvent.js';\nimport type FinalizeTransferRequest from '../utils/api/dtos/finalizeTransferRequest.js';\nimport type FileUploadEventArgs from './eventArgs/fileUploadEventArgs.js';\nimport type TransferUploadCompletedEventArgs from './eventArgs/transferUploadCompletedEventArgs.js';\nimport type CancelTransferRequest from '../utils/api/dtos/cancelTransferRequest.js';\nimport type ConcurrencyReleaser from \"../utils/concurrencyController/concurrencyReleaser.js\";\nimport type FileUploadFailedEventArgs from './eventArgs/fileUploadFailedEventArgs.js';\nimport type TransferUploadProgressedEventArgs from './eventArgs/transferUploadProgressedEventArgs.js';\nimport type FileChunkUploadProgressedEventArgs from './eventArgs/fileChunkUploadProgressedEventArgs.js';\nimport type UploaderChunkStreamProviderFactory from './chunkStreamProviderFactory/uploaderChunkStreamProviderFactory.js';\nimport type TransferUploadConfig from './options/transferUploadConfig.js';\nimport type { PauseSignal } from './pauseController.js';\nimport type InitializeTransferResponse from '../utils/api/dtos/initializeTransferResponse.js';\nimport type { InitializeTransferResponseUdpData } from '../utils/api/dtos/initializeTransferResponse.js';\nimport type TransferUploadModeChosenEventArgs from './eventArgs/transferUploadModeChosenEventArgs.js';\nimport type HandshakeRequest from './api/dtos/handshakeRequest.js';\nimport type ChunkStreamProvider from '../utils/fileSystem/chunkStreamProvider.js';\nimport type SendChunkRequest from './api/dtos/sendChunkRequest.js';\nimport type UploadOptimizer from './optimizer/uploadOptimizer.js';\nimport type FileChunkUploadCompletedPartiallyEventArgs from './eventArgs/fileChunkUploadCompletedPartiallyEventArgs.js';\nimport type FileChunkUploadCompletedEventArgs from './eventArgs/fileChunkUploadCompletedEventArgs.js';\nimport type TransferMetadataDeterminedEventArgs from './eventArgs/transferMetadataDeterminedEventArgs.js';\nimport type CryptographyProvider from '../utils/crypto/cryptographyProvider.js';\nimport type { TransferUploadExportData, TransferUploadExportDataMetadata } from './export/transferUploadExportData.js';\n\nexport default class TransferUpload<T extends FileDetails> {\n #totalSizeInBytes: number;\n\n #chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>;\n #apiClient: ApiClient;\n #fileServerClientFactory: FileServerClientFactory;\n #eventsEngine: EventsEngine;\n #info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>;\n #config: TransferUploadConfig;\n #optimizer: UploadOptimizer;\n #cryptography: CryptographyProvider;\n\n #transferState?: TransferUploadState;\n #transferMetadata?: TransferUploadMetadata;\n #transferDownloadUrl?: string;\n\n #pauseSignal: PauseSignal | undefined;\n #abortSignal: AbortSignal | undefined;\n #mergedPauseAndAbortSignal: AbortSignal | undefined;\n\n pauseEventListener: (() => void) | undefined;\n abortEventListener: (() => void) | undefined;\n\n #isUdpUploadMode: boolean;\n #serverLatencyInMs: number | undefined;\n\n #isRunMethodRunning = false;\n\n get status(): TransferStatus {\n return this.#transferState?.status ?? TransferStatus.Initialized;\n }\n\n get completedFilesCount(): number {\n return this.#transferState?.completedFilesCount ?? 0;\n }\n\n get failedFilesCount(): number {\n return this.#transferState?.failedFilesCount ?? 0;\n }\n\n get uploadedBytesCount(): number {\n return this.#transferState?.uploadedBytesCount ?? 0;\n }\n\n get failedBytesCount(): number {\n return this.#transferState?.failedBytesCount ?? 0;\n }\n\n get progressInPercentage(): number {\n if (this.totalSizeInBytes === 0)\n return 0;\n\n return (this.uploadedBytesCount * 100) / this.totalSizeInBytes;\n }\n\n get files(): readonly Readonly<T>[] {\n return this.#info.files;\n }\n\n get totalSizeInBytes(): number {\n return this.#totalSizeInBytes;\n }\n\n get transferId(): string | undefined {\n return this.#transferMetadata?.transferId;\n }\n\n constructor(chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>, config: TransferUploadConfig, optimizer: UploadOptimizer, cryptography: CryptographyProvider) {\n if (info.files.length === 0)\n throw new TransferUploadError(`Files can't be empty`);\n\n this.#totalSizeInBytes = info.files.reduce((partialSum, file) => partialSum + file.fileSizeInBytes, 0);\n this.#isUdpUploadMode = false;\n\n this.#chunkStreamProviderFactory = chunkStreamProviderFactory;\n this.#apiClient = apiClient;\n this.#fileServerClientFactory = fileServerClientFactory;\n this.#eventsEngine = eventsEngine;\n this.#info = info;\n this.#config = config;\n this.#optimizer = optimizer;\n this.#cryptography = cryptography;\n\n if (this.isUploadAppendInfo(this.#info))\n this.createTransferMetadataFromInfo(this.#info);\n }\n\n private isUploadAppend(): boolean {\n return this.isUploadAppendInfo(this.#info);\n }\n\n private isUploadAppendInfo(info: TransferUploadInfo<T> | TransferUploadAppendInfo<T>): info is TransferUploadAppendInfo<T> {\n return (info as TransferUploadAppendInfo<T>).transferKey !== undefined;\n }\n\n private createTransferMetadataFromInfo(info: TransferUploadAppendInfo<T>) {\n if (!this.isUploadAppendInfo(info))\n throw new TransferUploadError(`Options are not TransferUploadAppendOptions`);\n\n this.#transferDownloadUrl = info.transferDownloadUrl;\n\n this.#transferMetadata = {\n transferId: info.transferId,\n transferKey: info.transferKey,\n transferFileServerUrl: info.transferFileServerUrl,\n transferRegion: info.transferRegion,\n encryptionData: info.e2eeData,\n };\n }\n\n async run(transferPauseSignal: PauseSignal, transferAbortSignal: AbortSignal): Promise<void> {\n this.throwIfNotPossibleToRun(transferPauseSignal, transferAbortSignal);\n\n this.#isRunMethodRunning = true;\n\n try {\n this.#pauseSignal = transferPauseSignal;\n this.#abortSignal = transferAbortSignal;\n this.#mergedPauseAndAbortSignal = mergeAbortAndPauseSignals(transferPauseSignal, transferAbortSignal);\n\n if (!this.#transferState)\n this.#transferState = new TransferUploadState(this.files, this.#eventsEngine, this.#config.currentRatesTimespanInMs, this.#config.progressEventThrottlingInMs);\n else\n this.#transferState.recover();\n\n this.#transferState.transferRun();\n\n this.addPauseAndStopListeners();\n\n if (!this.#transferMetadata)\n await this.startApiTransferAndCreateMetadata();\n\n this.notifyMetadataDetermined();\n\n await this.pingServerAndChooseUploadMode();\n\n if (this.#isUdpUploadMode && !this.#transferMetadata!.udpData!.handshakeData)\n await this.serverUdpHandshake();\n\n this.#optimizer.start(this.#isUdpUploadMode, this.#serverLatencyInMs!);\n\n const ongoingChunkUploads: Promise<void>[] = [];\n\n for (const file of this.files) {\n const fileStatus = this.#transferState.getFile(file.externalId);\n\n if (fileStatus.isCompleted)\n continue;\n\n const alreadySentChunks = this.#transferState.getChunksForFile(file.externalId);\n const chunksIterator = new ChunksIterator(alreadySentChunks, file.fileSizeInBytes, this.#optimizer);\n\n for (const chunk of chunksIterator.getChunksIterator()) {\n // eslint-disable-next-line no-await-in-loop\n const releaseSemaphore = await this.#optimizer.semaphoreAcquire();\n\n if (this.#optimizer.currentSleepTimeInMs >= 1)\n // eslint-disable-next-line no-await-in-loop\n await sleep(this.#optimizer.currentSleepTimeInMs, this.#mergedPauseAndAbortSignal);\n\n if (this.#transferState!.status !== TransferStatus.Running) {\n releaseSemaphore();\n break;\n }\n\n const promise: Promise<void> = this.sendChunkAndKeepUpdatingState(file, chunk.startPosition, chunk.sizeInBytes, releaseSemaphore);\n\n ongoingChunkUploads.push(promise);\n\n if (this.#transferState!.status !== TransferStatus.Running)\n break;\n }\n\n if (this.#transferState!.status !== TransferStatus.Running)\n break;\n }\n\n await promiseAllSettled(ongoingChunkUploads);\n\n this.#optimizer.stop();\n\n if (this.#transferState.status === TransferStatus.Pausing)\n this.#transferState.transferPaused();\n else if (this.#transferState.status === TransferStatus.Aborting)\n this.#transferState.transferAborted();\n else if (this.uploadedBytesCount !== this.totalSizeInBytes)\n this.#transferState.transferFailed();\n else {\n await this.finalizeTransfer();\n this.#transferState.transferCompleted(this.#transferMetadata!, this.#transferDownloadUrl!);\n }\n }\n catch (error) {\n // We can get here with pausing or aborting status if any API call fails (e.g., finalizeTransfer) so we need to check the status again\n if (!this.#transferState)\n this.#eventsEngine.emit(TransferUploadEvent.TransferFailed);\n else if (this.#transferState.status === TransferStatus.Pausing) {\n this.#transferState.transferPaused();\n return;\n }\n else if (this.#transferState.status === TransferStatus.Aborting) {\n this.#transferState.transferAborted();\n return;\n }\n else\n this.#transferState.transferFailed();\n\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n finally {\n this.removePauseAndStopListeners();\n this.#optimizer.stop();\n this.#isRunMethodRunning = false;\n }\n }\n\n private notifyMetadataDetermined() {\n if (!this.#transferMetadata)\n return;\n\n const eventArgs: TransferMetadataDeterminedEventArgs = {\n transferId: this.#transferMetadata.transferId,\n fileServerUrl: this.#transferMetadata.transferFileServerUrl,\n region: this.#transferMetadata.transferRegion,\n };\n\n this.#eventsEngine.emit(TransferUploadEvent.TransferMetadataDetermined, eventArgs);\n }\n\n private async pingServerAndChooseUploadMode(): Promise<void> {\n try {\n if (this.#config.turnOffUdp)\n throw new Error(`UDP is turned off`);\n\n const udpData = this.#transferMetadata?.udpData;\n\n if (!udpData)\n throw new Error(`No UDP data is available`);\n\n const requestTimeout = this.#config.forceUdp ? 3 * 1000 : this.getPingTimeout(udpData.threshold);\n const retryDelay = 1000;\n\n const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, requestTimeout, this.#mergedPauseAndAbortSignal, undefined, retryDelay);\n\n await udpClient.connect();\n\n const pingResult = await udpClient.ping();\n\n udpClient.close().catch(() => { /* discard */ });\n\n this.#serverLatencyInMs = pingResult.latencyInMs;\n this.#isUdpUploadMode = pingResult.latencyInMs >= udpData.threshold;\n\n const eventArgs: TransferUploadModeChosenEventArgs = { isUdpMode: this.#isUdpUploadMode, latency: pingResult.latencyInMs };\n this.#eventsEngine.emit(TransferUploadEvent.TransferUploadModeChosen, eventArgs);\n }\n catch (error) {\n this.#isUdpUploadMode = false;\n\n const eventArgs: TransferUploadModeChosenEventArgs = { isUdpMode: this.#isUdpUploadMode, error: error as Error };\n this.#eventsEngine.emit(TransferUploadEvent.TransferUploadModeChosen, eventArgs);\n }\n }\n\n private getPingTimeout(udpPingThreshold: number) {\n const pingTimeout = Math.min(3 * 1000, udpPingThreshold * 20);\n return Math.max(500, pingTimeout);\n }\n\n private async serverUdpHandshake(): Promise<void> {\n const transferMetadata = this.#transferMetadata!;\n const udpData = transferMetadata.udpData!;\n\n const requestTimeout = this.getHandshakeTimeout();\n const retryDelay = 1000;\n\n const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, requestTimeout, this.#mergedPauseAndAbortSignal, undefined, retryDelay);\n\n await udpClient.connect();\n\n const handshakeRequest: HandshakeRequest = { transferId: transferMetadata.transferId, transferKey: transferMetadata.transferKey };\n const handshakeResponse = await udpClient.handshake(handshakeRequest);\n\n udpClient.close().catch(() => { /* discard */ });\n\n this.#transferMetadata!.udpData!.handshakeData = handshakeResponse;\n }\n\n private getHandshakeTimeout() {\n const timeout = Math.min(this.#serverLatencyInMs! * 30, 30 * 1000);\n return Math.max(2000, timeout);\n }\n\n private async sendChunkAndKeepUpdatingState(file: T, chunkStartPosition: number, chunkSizeInBytes: number, releaseSemaphore: ConcurrencyReleaser): Promise<void> {\n let uploadedBytesCount = 0;\n\n try {\n this.#transferState!.chunkUploadStarted(file.externalId, chunkStartPosition, chunkSizeInBytes);\n\n const chunkStreamProvider = this.#chunkStreamProviderFactory.createChunkStreamProvider(file, chunkStartPosition, chunkSizeInBytes, this.#transferMetadata?.encryptionData);\n\n const progressEventHandler = (eventArgs: ChunkProgressEvent) => {\n uploadedBytesCount += eventArgs.transferredBytesSinceLastEvent;\n this.#transferState!.chunkUploadProgressed(file.externalId, chunkStartPosition, chunkSizeInBytes, eventArgs);\n };\n\n const response = await this.sendChunk(file, chunkStreamProvider, progressEventHandler);\n\n const latencyInMsIfUdp = this.#isUdpUploadMode ? (response as { latencyInMs: number }).latencyInMs : undefined;\n\n if (uploadedBytesCount === chunkSizeInBytes)\n this.#transferState!.chunkUploadCompleted(file.externalId, chunkStartPosition, chunkSizeInBytes, latencyInMsIfUdp);\n else\n this.#transferState!.chunkUploadCompletedPartially(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal!.paused, latencyInMsIfUdp);\n }\n catch (error) {\n const chunkError = error as Error;\n\n const isTcpPausingError = chunkError.cause !== undefined\n && chunkError.cause instanceof ApiFilemail449Error\n && chunkError.cause.message === `Wrong md5 hash`\n && this.#pauseSignal?.paused === true;\n\n if (isTcpPausingError)\n this.#transferState!.chunkUploadCompletedPartially(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, this.#pauseSignal!.paused);\n else {\n const failedReason = this.getChunkFailedReason(error);\n this.#transferState!.chunkUploadFailed(file.externalId, chunkStartPosition, chunkSizeInBytes, uploadedBytesCount, failedReason, error as Error);\n }\n }\n finally {\n releaseSemaphore();\n }\n }\n\n private async sendChunk(file: T, chunkStreamProvider: ChunkStreamProvider, progressEventHandler: (eventArgs: ChunkProgressEvent) => void): Promise<{ latencyInMs: number } | void> {\n if (this.#isUdpUploadMode)\n return await this.sendChunkUsingUdp(file, chunkStreamProvider, progressEventHandler);\n\n return await this.sendChunkUsingTcp(file, chunkStreamProvider, progressEventHandler);\n }\n\n private async sendChunkUsingUdp(file: T, chunkStreamProvider: ChunkStreamProvider, progressEventHandler: (eventArgs: ChunkProgressEvent) => void): Promise<{ latencyInMs: number }> {\n const transferMetadata = this.#transferMetadata!;\n const udpData = transferMetadata.udpData!;\n\n const udpClient = this.#fileServerClientFactory.createFileServerUdpUploadClient(udpData.ip, udpData.port, this.#optimizer.currentRequestTimeoutInMs, this.#mergedPauseAndAbortSignal, 0);\n\n const sendChunkRequest: SendChunkRequest = {\n sessionGuid: this.#transferMetadata!.udpData!.handshakeData!.sessionGuid,\n aesKey: this.#transferMetadata!.udpData!.handshakeData!.aesKey,\n chunkStartPosition: chunkStreamProvider.chunkStartPosition,\n fileSizeInBytes: file.fileSizeInBytes,\n fileDestinationPathInTransfer: file.fileDestinationPathInTransfer,\n fileName: file.fileName,\n };\n\n await udpClient.connect();\n\n const result = await udpClient.sendChunk(sendChunkRequest, chunkStreamProvider);\n\n udpClient.close().catch(() => { /* discard */ });\n\n const chunkProgressEventArgs: ChunkProgressEvent = { transferredBytesTotal: chunkStreamProvider.chunkLengthInBytes, transferredBytesSinceLastEvent: chunkStreamProvider.chunkLengthInBytes };\n progressEventHandler(chunkProgressEventArgs);\n\n return result;\n }\n\n private async sendChunkUsingTcp(file: T, chunkStreamProvider: ChunkStreamProvider, progressEventHandler: (eventArgs: ChunkProgressEvent) => void): Promise<void> {\n const request: SendFileChunkRequest = {\n chunkLengthInBytes: chunkStreamProvider.chunkLengthInBytes,\n chunkStartPosition: chunkStreamProvider.chunkStartPosition,\n };\n\n const fileServerClient = this.#fileServerClientFactory.createFileServerTcpUploadClient(this.#transferMetadata!.transferFileServerUrl, this.#transferMetadata!.transferId, this.#transferMetadata!.transferKey, file.fileName, file.fileDestinationPathInTransfer, file.fileSizeInBytes);\n\n const ongoingRequestPromise = fileServerClient.sendFileChunk(request, chunkStreamProvider, this.#pauseSignal!, this.#abortSignal!);\n\n fileServerClient.addEventListener(`progress`, progressEventHandler);\n\n await ongoingRequestPromise;\n }\n\n private getChunkFailedReason(error: unknown) {\n if (error instanceof FsError)\n return `Can't read file. ${error.message}`;\n\n if (error instanceof ApiError)\n return error.cause?.message ? `${error.message}. ${error.cause.message}` : error.message;\n\n return (error as Error)?.message;\n }\n\n private throwIfNotPossibleToRun(pauseSignal: PauseSignal, abortSignal: AbortSignal) {\n if (this.#isRunMethodRunning)\n throw new TransferUploadError(`This transfer is running and cannot be run`);\n\n if (this.#transferState\n && this.#transferState.status !== TransferStatus.Failed\n && this.#transferState.status !== TransferStatus.Aborted\n && this.#transferState.status !== TransferStatus.Initialized\n && this.#transferState.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be run`);\n\n if (this.files.length === 0)\n throw new TransferUploadError(`There are no files passed to the transfer`);\n\n if (pauseSignal.paused)\n throw new TransferUploadError(`Can't run transfer with already paused PauseController`);\n\n if (abortSignal.aborted)\n throw new TransferUploadError(`Can't run transfer with already aborted AbortController`);\n }\n\n private addPauseAndStopListeners() {\n this.pauseEventListener = () => {\n if (this.#transferState!.status !== TransferStatus.Running)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be paused`);\n\n this.#transferState!.transferPauseRequested();\n };\n\n this.abortEventListener = () => {\n if (this.#transferState!.status !== TransferStatus.Running)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be stopped`);\n\n this.#transferState!.transferAbortRequested();\n };\n\n this.#pauseSignal!.addEventListener(`pause`, this.pauseEventListener);\n this.#abortSignal!.addEventListener(`abort`, this.abortEventListener);\n }\n\n private removePauseAndStopListeners() {\n this.#pauseSignal!.removeEventListener(`pause`, this.pauseEventListener!);\n this.#abortSignal!.removeEventListener(`abort`, this.abortEventListener!);\n }\n\n private async startApiTransferAndCreateMetadata() {\n if (this.isUploadAppendInfo(this.#info))\n throw new TransferUploadError(`Options are not TransferUploadOptions`);\n\n try {\n const encryptionDataAndIvSaltHex = await this.generateEncryptionDataAndIvSaltHmacHex(this.#info.e2eeKey);\n\n const request: InitializeTransferRequest = {\n e2ee: Boolean(encryptionDataAndIvSaltHex),\n e2ee_keyhash: encryptionDataAndIvSaltHex?.ivSaltHmacHex,\n transfersize: this.totalSizeInBytes,\n to: this.#info.to,\n from: this.#info.from,\n subject: this.#info.subject,\n message: this.#info.message,\n notify: this.#info.notify,\n confirmation: this.#info.confirmation,\n days: this.#info.days,\n password: this.#info.uploadPassword,\n companyid: this.#info.companyId,\n incominglogintoken: this.#info.incomingLoginToken,\n incomingpageid: this.#info.incomingPageId,\n filerequestid: this.#info.fileRequestId,\n filerequestshareid: this.#info.fileRequestShareId,\n customfields: this.#info.customFields,\n };\n\n const response = await this.#apiClient.initializeTransfer(request, this.#mergedPauseAndAbortSignal);\n\n this.#transferMetadata = {\n transferId: response.transferId,\n transferKey: response.transferKey,\n transferFileServerUrl: response.transferUrl,\n transferRegion: response.transferRegion,\n encryptionData: encryptionDataAndIvSaltHex?.encryptionData,\n udpData: this.getResponseOrForcedUdpData(response),\n };\n }\n catch (error) {\n throw new TransferUploadError(`Error initializing transfer through the API`, { cause: error as Error });\n }\n }\n\n private async generateEncryptionDataAndIvSaltHmacHex(e2eeKey?: string): Promise<{ encryptionData: { iv: Uint8Array, key: Uint8Array }, ivSaltHmacHex: string, salt: Uint8Array, hmac: Uint8Array } | undefined> {\n if (!e2eeKey)\n return undefined;\n\n const salt = this.#cryptography.generateRandomBytes(16);\n const key = await this.#cryptography.deriveKey(e2eeKey, salt);\n const hmac = await this.#cryptography.generateHmac(key);\n const iv = this.#cryptography.generateRandomBytes(16);\n\n const ivSaltHmac = concatUint8Arrays([iv, salt, hmac]);\n const ivSaltHmacHex = uint8ArrayToHex(ivSaltHmac);\n\n return {\n encryptionData: { iv, key },\n hmac,\n salt,\n ivSaltHmacHex,\n };\n }\n\n private getResponseOrForcedUdpData(response: InitializeTransferResponse): InitializeTransferResponseUdpData | undefined {\n if (!this.#config.forceUdp || !response.udp)\n return response.udp;\n\n return {\n ...response.udp,\n threshold: 0,\n };\n }\n\n private async finalizeTransfer(): Promise<void> {\n this.#eventsEngine.emit(TransferUploadEvent.TransferFinalizing);\n\n if (this.isUploadAppend())\n await this.resetApiTransfer();\n else\n await this.finalizeApiTransfer();\n }\n\n private async resetApiTransfer(): Promise<void> {\n try {\n const request: ResetTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n };\n\n await this.#apiClient.resetTransfer(request, this.#mergedPauseAndAbortSignal);\n }\n catch (error) {\n throw new TransferUploadError(`Error resetting transfer through the API`, { cause: error as Error });\n }\n }\n\n private async finalizeApiTransfer(): Promise<void> {\n try {\n const request: FinalizeTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n transferkey: this.#transferMetadata!.transferKey,\n protocol: this.#isUdpUploadMode ? `udp` : `tcp`,\n };\n\n const response = await this.#apiClient.finalizeTransfer(request, this.#mergedPauseAndAbortSignal);\n\n this.#transferDownloadUrl = response.downloadUrl;\n }\n catch (error) {\n throw new TransferUploadError(`Error finalizing transfer through the API`, { cause: error as Error });\n }\n }\n\n async cancel(abortSignal?: AbortSignal): Promise<void> {\n try {\n const isTransferApiInitialized = Boolean(this.#transferState) && Boolean(this.#transferMetadata);\n\n if (!isTransferApiInitialized) {\n this.emitCancelEvents();\n return;\n }\n\n this.throwIfInWrongStateToCancel();\n\n this.#transferState!.transferCancelRequested();\n\n if (this.isUploadAppend()) {\n // There is no possibility to cancel transfer upload append on API for now\n }\n else {\n try {\n await this.cancelApiTransfer(abortSignal);\n }\n catch {\n // If API cancel fails we still finalize local transfer state as canceled to avoid hanging in Canceling.\n }\n }\n\n this.#transferState!.transferCanceled();\n }\n catch (error) {\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n }\n\n private emitCancelEvents() {\n this.#eventsEngine.emit(TransferUploadEvent.TransferCancelRequested);\n this.#eventsEngine.emit(TransferUploadEvent.TransferCanceled);\n }\n\n private throwIfInWrongStateToCancel() {\n if (!this.#transferState)\n return;\n\n if (this.#transferState.status !== TransferStatus.Failed\n && this.#transferState.status !== TransferStatus.Aborted\n && this.#transferState.status !== TransferStatus.Initialized\n && this.#transferState.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transferState!.status]} state and cannot be canceled`);\n }\n\n private async cancelApiTransfer(abortSignal?: AbortSignal): Promise<void> {\n try {\n const request: CancelTransferRequest = {\n transferid: this.#transferMetadata!.transferId,\n transferkey: this.#transferMetadata!.transferKey,\n };\n\n await this.#apiClient.cancelTransfer(request, abortSignal);\n }\n catch (error) {\n throw new TransferUploadError(`Error canceling transfer through the API`, { cause: error as Error });\n }\n }\n\n addEventListener(eventName: TransferUploadEvent.TransferRun | TransferUploadEvent.TransferPauseRequested | TransferUploadEvent.TransferPaused | TransferUploadEvent.TransferAbortRequested | TransferUploadEvent.TransferAborted | TransferUploadEvent.TransferCancelRequested | TransferUploadEvent.TransferCanceled | TransferUploadEvent.TransferFailed, handler: () => void): void\n addEventListener(eventName: TransferUploadEvent.FileUploadStarted | TransferUploadEvent.FileUploadCompleted, handler: (event: FileUploadEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileUploadFailed, handler: (event: FileUploadFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadProgressed, handler: (event: FileChunkUploadProgressedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadStarted, handler: (event: FileChunkUploadEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadCompleted, handler: (event: FileChunkUploadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadCompletedPartially, handler: (event: FileChunkUploadCompletedPartiallyEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.FileChunkUploadFailed, handler: (event: FileChunkUploadFailedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferProgressed, handler: (event: TransferUploadProgressedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferCompleted, handler: (event: TransferUploadCompletedEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferUploadModeChosen, handler: (event: TransferUploadModeChosenEventArgs) => void): void\n addEventListener(eventName: TransferUploadEvent.TransferMetadataDetermined, handler: (event: TransferMetadataDeterminedEventArgs) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void\n addEventListener(eventName: string, handler: (arg?: any) => void): void {\n this.#eventsEngine.addEventListener(eventName, handler);\n }\n\n exportAsString(): string {\n const exportData = this.export();\n return JSON.stringify(exportData);\n }\n\n export(): TransferUploadExportData<T> {\n if (!this.#transferState?.files)\n throw new TransferUploadError(`Can't export not started Transfer`); // fileStatuses are not created yet and it really doesn't make any sens to export not started transfer\n\n return {\n transferMetadata: this.getTransferMetadataExportValue(),\n info: this.#info,\n state: this.#transferState.export(),\n };\n }\n\n private getTransferMetadataExportValue(): TransferUploadExportDataMetadata | undefined {\n if (!this.#transferMetadata)\n return undefined;\n\n const { encryptionData, ...rest } = this.#transferMetadata;\n\n return {\n ...rest,\n encryptionData: !encryptionData ? undefined : {\n ivHex: uint8ArrayToHex(encryptionData.iv),\n keyHex: uint8ArrayToHex(encryptionData.key),\n },\n };\n }\n\n static recreate<T extends FileDetails>(transferExportData: TransferUploadExportData<T>, config: TransferUploadConfig, chunkStreamProviderFactory: UploaderChunkStreamProviderFactory<T>, apiClient: ApiClient, fileServerClientFactory: FileServerClientFactory, eventsEngine: EventsEngine, optimizer: UploadOptimizer, cryptography: CryptographyProvider): TransferUpload<T> {\n try {\n TransferUpload.validateRecreateParams(transferExportData);\n\n const transfer = new TransferUpload<T>(chunkStreamProviderFactory, apiClient, fileServerClientFactory, eventsEngine, transferExportData.info, config, optimizer, cryptography);\n\n transfer.#transferMetadata = this.recreateTransferMetadata(transferExportData.transferMetadata);\n transfer.#transferState = new TransferUploadState(transferExportData.info.files, eventsEngine, config.currentRatesTimespanInMs, config.progressEventThrottlingInMs, transferExportData.state);\n\n return transfer;\n }\n catch (error) {\n if (error instanceof TransferUploadError)\n throw error;\n else\n throw new TransferUploadError(`Unhandled error occured. See 'cause' for more details`, { cause: error as Error });\n }\n }\n\n private static recreateTransferMetadata(transferMetadata?: TransferUploadExportDataMetadata): TransferUploadMetadata | undefined {\n if (!transferMetadata)\n return undefined;\n\n const { encryptionData, ...rest } = transferMetadata;\n\n return {\n ...rest,\n encryptionData: !encryptionData ? undefined : {\n iv: hexToUint8Array(encryptionData.ivHex),\n key: hexToUint8Array(encryptionData.keyHex),\n },\n };\n }\n\n private static validateRecreateParams<T extends FileDetails>(transferExportData: TransferUploadExportData<T>) {\n if (!transferExportData.info)\n throw new TransferUploadError(`Info must be defined`);\n\n if (!transferExportData.state)\n throw new TransferUploadError(`State must be defined`);\n\n if (transferExportData.transferMetadata && (!transferExportData.transferMetadata.transferId || !transferExportData.transferMetadata.transferKey || !transferExportData.transferMetadata.transferFileServerUrl))\n throw new TransferUploadError(`Not all transfer metadata properties are defined`);\n\n if (transferExportData.transferMetadata?.encryptionData) {\n if (transferExportData.transferMetadata.encryptionData.ivHex.length !== 32)\n throw new TransferUploadError(`Encryption IV must be 16 bytes long`);\n if (transferExportData.transferMetadata.encryptionData.keyHex.length !== 64)\n throw new TransferUploadError(`Encryption key must be 32 bytes long`);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "filemail-sdk",
3
- "version": "9.4.0",
3
+ "version": "9.4.2",
4
4
  "description": "Library for transferring files to and from Filemail.com",
5
5
  "author": "Filemail AS",
6
6
  "license": "BSD-3-Clause",