filemail-sdk 9.4.4 → 9.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/src/client/healthMonitor/transferDownloaderHealthMonitor.d.ts +1 -1
  2. package/dist/src/client/healthMonitor/transferDownloaderHealthMonitor.d.ts.map +1 -1
  3. package/dist/src/client/healthMonitor/transferDownloaderHealthMonitor.js +1 -1
  4. package/dist/src/client/healthMonitor/transferDownloaderHealthMonitor.js.map +1 -1
  5. package/dist/src/client/healthMonitor/transferHealthMonitorBase.d.ts +1 -1
  6. package/dist/src/client/healthMonitor/transferHealthMonitorBase.d.ts.map +1 -1
  7. package/dist/src/client/healthMonitor/transferHealthMonitorBase.js +1 -1
  8. package/dist/src/client/healthMonitor/transferHealthMonitorBase.js.map +1 -1
  9. package/dist/src/client/healthMonitor/transferUploaderHealthMonitor.d.ts +1 -1
  10. package/dist/src/client/healthMonitor/transferUploaderHealthMonitor.d.ts.map +1 -1
  11. package/dist/src/client/healthMonitor/transferUploaderHealthMonitor.js +3 -2
  12. package/dist/src/client/healthMonitor/transferUploaderHealthMonitor.js.map +1 -1
  13. package/dist/src/client/uploader/transferUploaderBase.d.ts +1 -0
  14. package/dist/src/client/uploader/transferUploaderBase.d.ts.map +1 -1
  15. package/dist/src/client/uploader/transferUploaderBase.js +15 -8
  16. package/dist/src/client/uploader/transferUploaderBase.js.map +1 -1
  17. package/dist/src/uploader/api/node/nodeFileServerUdpClient.js +1 -1
  18. package/dist/src/uploader/api/node/nodeFileServerUdpClient.js.map +1 -1
  19. package/dist/src/uploader/api/node/nodeFileServerUploadClient.js +3 -3
  20. package/dist/src/uploader/api/node/nodeFileServerUploadClient.js.map +1 -1
  21. package/dist/src/uploader/api/web/webFileServerUploadClient.js +1 -1
  22. package/dist/src/uploader/api/web/webFileServerUploadClient.js.map +1 -1
  23. package/dist/src/uploader/transferFailureAbortReason.d.ts +4 -0
  24. package/dist/src/uploader/transferFailureAbortReason.d.ts.map +1 -0
  25. package/dist/src/uploader/transferFailureAbortReason.js +9 -0
  26. package/dist/src/uploader/transferFailureAbortReason.js.map +1 -0
  27. package/dist/src/uploader/transferUpload.d.ts +2 -0
  28. package/dist/src/uploader/transferUpload.d.ts.map +1 -1
  29. package/dist/src/uploader/transferUpload.js +18 -3
  30. package/dist/src/uploader/transferUpload.js.map +1 -1
  31. package/dist/src/utils/fileSystem/chunkStreamProvider.d.ts +2 -2
  32. package/dist/src/utils/fileSystem/chunkStreamProvider.d.ts.map +1 -1
  33. package/dist/src/utils/fileSystem/chunkStreamProvider.js.map +1 -1
  34. package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.d.ts +9 -4
  35. package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.d.ts.map +1 -1
  36. package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js +117 -26
  37. package/dist/src/utils/fileSystem/node/nodeChunkStreamProvider.js.map +1 -1
  38. package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.d.ts +2 -2
  39. package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.d.ts.map +1 -1
  40. package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js +2 -2
  41. package/dist/src/utils/fileSystem/web/chunkStreamProvider/webChunkStreamProvider.js.map +1 -1
  42. package/package.json +1 -1
@@ -2,7 +2,7 @@ import DownloadEventArgs from "../../downloader/eventArgs/downloadEventArgs.js";
2
2
  import HealthMonitorHealthyEventArgs from "./events/eventArgs/healthMonitorHealthyEventArgs.js";
3
3
  import TransferHealthMonitorBase from "./transferHealthMonitorBase.js";
4
4
  export default class TransferDownloaderHealthMonitor extends TransferHealthMonitorBase<DownloadEventArgs> {
5
- protected getFileServerUrlFromFileServerKnowEventArgs(eventArgs: unknown): string;
5
+ protected getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs: unknown): string;
6
6
  protected getFileServerKnownEventName(): string;
7
7
  protected getTransferProgressedEventName(): string;
8
8
  protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: DownloadEventArgs): number;
@@ -1 +1 @@
1
- {"version":3,"file":"transferDownloaderHealthMonitor.d.ts","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferDownloaderHealthMonitor.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,iDAAiD,CAAC;AAEhF,OAAO,6BAA6B,MAAM,qDAAqD,CAAC;AAChG,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,yBAAyB,CAAC,iBAAiB,CAAC;IACrG,SAAS,CAAC,2CAA2C,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IASjF,SAAS,CAAC,2BAA2B,IAAI,MAAM;IAI/C,SAAS,CAAC,8BAA8B,IAAI,MAAM;IAIlD,SAAS,CAAC,6BAA6B,CAAC,+BAA+B,CAAC,EAAE,iBAAiB,GAAG,MAAM;IAIpG,SAAS,CAAC,mBAAmB,IAAI,6BAA6B;CASjE"}
1
+ {"version":3,"file":"transferDownloaderHealthMonitor.d.ts","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferDownloaderHealthMonitor.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,iDAAiD,CAAC;AAEhF,OAAO,6BAA6B,MAAM,qDAAqD,CAAC;AAChG,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,yBAAyB,CAAC,iBAAiB,CAAC;IACrG,SAAS,CAAC,+CAA+C,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IASrF,SAAS,CAAC,2BAA2B,IAAI,MAAM;IAI/C,SAAS,CAAC,8BAA8B,IAAI,MAAM;IAIlD,SAAS,CAAC,6BAA6B,CAAC,+BAA+B,CAAC,EAAE,iBAAiB,GAAG,MAAM;IAIpG,SAAS,CAAC,mBAAmB,IAAI,6BAA6B;CASjE"}
@@ -1,7 +1,7 @@
1
1
  import TransferDownloadEvent from "../../downloader/dtos/downloadEvent.js";
2
2
  import TransferHealthMonitorBase from "./transferHealthMonitorBase.js";
3
3
  export default class TransferDownloaderHealthMonitor extends TransferHealthMonitorBase {
4
- getFileServerUrlFromFileServerKnowEventArgs(eventArgs) {
4
+ getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs) {
5
5
  const fileServerUrl = eventArgs.fileServerUrl;
6
6
  if (!fileServerUrl)
7
7
  throw new Error(`Event args are not of DownloadMetadataDeterminedEventArgs type`);
@@ -1 +1 @@
1
- {"version":3,"file":"transferDownloaderHealthMonitor.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferDownloaderHealthMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,wCAAwC,CAAC;AAI3E,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,yBAA4C;IAC3F,2CAA2C,CAAC,SAAkB;QACpE,MAAM,aAAa,GAAI,SAAiD,CAAC,aAAa,CAAC;QAEvF,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEtF,OAAO,aAAa,CAAC;IACzB,CAAC;IAES,2BAA2B;QACjC,OAAO,qBAAqB,CAAC,0BAA0B,CAAC;IAC5D,CAAC;IAES,8BAA8B;QACpC,OAAO,qBAAqB,CAAC,kBAAkB,CAAC;IACpD,CAAC;IAES,6BAA6B,CAAC,+BAAmD;QACvF,OAAO,+BAA+B,EAAE,eAAe,IAAI,CAAC,CAAC;IACjE,CAAC;IAES,mBAAmB;QACzB,OAAO;YACH,0BAA0B,EAAE,IAAI,CAAC,mCAAmC,EAAE,eAAe;YACrF,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,qBAAqB;YAC7F,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,qBAAqB;YAC7F,oBAAoB,EAAE,IAAI,CAAC,mCAAmC,EAAE,eAAe;YAC/E,gBAAgB,EAAE,IAAI,CAAC,mCAAmC,EAAE,6BAA6B,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,EAAE,6BAA6B;SAC3L,CAAC;IACN,CAAC;CACJ","sourcesContent":["import TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\nimport DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\nimport DownloadMetadataDeterminedEventArgs from \"../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js\";\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport TransferHealthMonitorBase from \"./transferHealthMonitorBase.js\";\n\nexport default class TransferDownloaderHealthMonitor extends TransferHealthMonitorBase<DownloadEventArgs> {\n protected getFileServerUrlFromFileServerKnowEventArgs(eventArgs: unknown): string {\n const fileServerUrl = (eventArgs as DownloadMetadataDeterminedEventArgs).fileServerUrl;\n\n if (!fileServerUrl)\n throw new Error(`Event args are not of DownloadMetadataDeterminedEventArgs type`);\n\n return fileServerUrl;\n }\n\n protected getFileServerKnownEventName(): string {\n return TransferDownloadEvent.TransferMetadataDetermined;\n }\n\n protected getTransferProgressedEventName(): string {\n return TransferDownloadEvent.DownloadProgressed;\n }\n\n protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: DownloadEventArgs): number {\n return currentHistoryLastProgressEvent?.downloadedBytes ?? 0;\n }\n\n protected getHealthyEventArgs(): HealthMonitorHealthyEventArgs {\n return {\n transferredBytesTotalCount: this.lastProgressEventFromPreviousPeriod?.downloadedBytes,\n averageSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.bytesPerSecondAverage,\n currentSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.bytesPerSecondCurrent,\n progressInPercentage: this.lastProgressEventFromPreviousPeriod?.progressPercent,\n remainingSeconds: this.lastProgressEventFromPreviousPeriod?.estimatedRemainingTimeSeconds === null ? undefined : this.lastProgressEventFromPreviousPeriod?.estimatedRemainingTimeSeconds,\n };\n }\n}"]}
1
+ {"version":3,"file":"transferDownloaderHealthMonitor.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferDownloaderHealthMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,wCAAwC,CAAC;AAI3E,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,yBAA4C;IAC3F,+CAA+C,CAAC,SAAkB;QACxE,MAAM,aAAa,GAAI,SAAiD,CAAC,aAAa,CAAC;QAEvF,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEtF,OAAO,aAAa,CAAC;IACzB,CAAC;IAES,2BAA2B;QACjC,OAAO,qBAAqB,CAAC,0BAA0B,CAAC;IAC5D,CAAC;IAES,8BAA8B;QACpC,OAAO,qBAAqB,CAAC,kBAAkB,CAAC;IACpD,CAAC;IAES,6BAA6B,CAAC,+BAAmD;QACvF,OAAO,+BAA+B,EAAE,eAAe,IAAI,CAAC,CAAC;IACjE,CAAC;IAES,mBAAmB;QACzB,OAAO;YACH,0BAA0B,EAAE,IAAI,CAAC,mCAAmC,EAAE,eAAe;YACrF,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,qBAAqB;YAC7F,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,qBAAqB;YAC7F,oBAAoB,EAAE,IAAI,CAAC,mCAAmC,EAAE,eAAe;YAC/E,gBAAgB,EAAE,IAAI,CAAC,mCAAmC,EAAE,6BAA6B,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,EAAE,6BAA6B;SAC3L,CAAC;IACN,CAAC;CACJ","sourcesContent":["import TransferDownloadEvent from \"../../downloader/dtos/downloadEvent.js\";\nimport DownloadEventArgs from \"../../downloader/eventArgs/downloadEventArgs.js\";\nimport DownloadMetadataDeterminedEventArgs from \"../../downloader/eventArgs/downloadMetadataDeterminedEventArgs.js\";\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport TransferHealthMonitorBase from \"./transferHealthMonitorBase.js\";\n\nexport default class TransferDownloaderHealthMonitor extends TransferHealthMonitorBase<DownloadEventArgs> {\n protected getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs: unknown): string {\n const fileServerUrl = (eventArgs as DownloadMetadataDeterminedEventArgs).fileServerUrl;\n\n if (!fileServerUrl)\n throw new Error(`Event args are not of DownloadMetadataDeterminedEventArgs type`);\n\n return fileServerUrl;\n }\n\n protected getFileServerKnownEventName(): string {\n return TransferDownloadEvent.TransferMetadataDetermined;\n }\n\n protected getTransferProgressedEventName(): string {\n return TransferDownloadEvent.DownloadProgressed;\n }\n\n protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: DownloadEventArgs): number {\n return currentHistoryLastProgressEvent?.downloadedBytes ?? 0;\n }\n\n protected getHealthyEventArgs(): HealthMonitorHealthyEventArgs {\n return {\n transferredBytesTotalCount: this.lastProgressEventFromPreviousPeriod?.downloadedBytes,\n averageSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.bytesPerSecondAverage,\n currentSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.bytesPerSecondCurrent,\n progressInPercentage: this.lastProgressEventFromPreviousPeriod?.progressPercent,\n remainingSeconds: this.lastProgressEventFromPreviousPeriod?.estimatedRemainingTimeSeconds === null ? undefined : this.lastProgressEventFromPreviousPeriod?.estimatedRemainingTimeSeconds,\n };\n }\n}"]}
@@ -15,7 +15,7 @@ export default abstract class TransferHealthMonitorBase<T> {
15
15
  protected abstract getFileServerKnownEventName(): string;
16
16
  protected abstract getTransferProgressedEventName(): string;
17
17
  private fileServerKnownEventHandler;
18
- protected abstract getFileServerUrlFromFileServerKnowEventArgs(eventArgs: unknown): string;
18
+ protected abstract getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs: unknown): string;
19
19
  private transferProgressedEventHandler;
20
20
  private restartHealthCheck;
21
21
  private checkHealth;
@@ -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;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"}
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,+CAA+C,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IAE9F,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"}
@@ -52,7 +52,7 @@ export default class TransferHealthMonitorBase {
52
52
  fileServerKnownEventHandler = (eventArgs) => {
53
53
  if (!this.#isRunning)
54
54
  return;
55
- this.#fileServerUrl = this.getFileServerUrlFromFileServerKnowEventArgs(eventArgs);
55
+ this.#fileServerUrl = this.getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs);
56
56
  };
57
57
  transferProgressedEventHandler = (eventArgs) => {
58
58
  if (!this.#isRunning)
@@ -1 +1 @@
1
- {"version":3,"file":"transferHealthMonitorBase.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferHealthMonitorBase.ts"],"names":[],"mappings":"AACA,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAKhF,MAAM,CAAC,OAAO,OAAgB,yBAAyB;IAC1C,cAAc,CAAgB;IAC9B,qBAAqB,CAAe;IAE7C,oBAAoB,CAAS;IAE7B,QAAQ,CAA4C;IAEpD,cAAc,CAAqB;IAEnC,6BAA6B,GAAqC,EAAE,CAAC;IAE3D,mCAAmC,CAAgB;IAE7D,mBAAmB,GAAG,IAAI,CAAC;IAC3B,UAAU,GAAG,KAAK,CAAC;IACnB,aAAa,GAAG,CAAC,CAAC;IAElB,YAAY,aAA4B,EAAE,oBAAkC,EAAE,mBAAmB,GAAG,MAAM;QACtG,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACrD,IAAI,CAAC,oBAAoB;YACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAEpD,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAElD,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC;IACpD,CAAC;IAED,KAAK;QACD,IAAI,IAAI,CAAC,UAAU;YACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAEzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAExC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IAEO,UAAU;QACd,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,mCAAmC,GAAG,SAAS,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,IAAI;QACA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAE1B,IAAI,CAAC,oCAAoC,EAAE,CAAC;IAChD,CAAC;IAEO,gCAAgC;QACpC,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAClH,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5H,CAAC;IAEO,oCAAoC;QACxC,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACrH,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC/H,CAAC;IAKO,2BAA2B,GAAG,CAAC,SAAkB,EAAE,EAAE;QACzD,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO;QAEX,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,2CAA2C,CAAC,SAAS,CAAC,CAAC;IACtF,CAAC,CAAC;IAIM,8BAA8B,GAAG,CAAC,SAAY,EAAE,EAAE;QACtD,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO;QAEX,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAEzE,IAAI,IAAI,CAAC,mBAAmB;YACxB,OAAO;QAEX,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAErD,IAAI,CAAC,SAAS;YACV,OAAO;QAEX,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC;IAEM,kBAAkB,CAAC,oBAAuB;QAC9C,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,mCAAmC,GAAG,oBAAoB,CAAC;QAEhE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAEhC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IAEO,WAAW,GAAG,KAAK,EAAE,YAAoB,EAAiB,EAAE;QAChE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACtC,OAAO;QAEX,MAAM,OAAO,GAAG,IAAI,CAAC,6BAA6B,CAAC;QACnD,MAAM,8BAA8B,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAE9G,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;QAE1E,IAAI,CAAC,mCAAmC,GAAG,8BAA8B,IAAI,IAAI,CAAC,mCAAmC,CAAC;QAEtH,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC;aACI,CAAC;YACF,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,MAAM,IAAI,CAAC,yCAAyC,CAAC,YAAY,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACtC,OAAO;QAEX,IAAI,CAAC,iCAAiC,EAAE,CAAC;QAEzC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEM,mBAAmB,CAAC,YAAoB;QAC5C,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACtC,OAAO;QAEX,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAChG,CAAC;IAEO,kBAAkB,CAAC,YAAoB;QAC3C,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY,CAAC;IAClE,CAAC;IAEO,sBAAsB;QAC1B,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,iCAAiC;QACrC,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC;IAC5C,CAAC;IAEO,kBAAkB,CAAC,+BAA8C;QACrE,MAAM,iCAAiC,GAAG,IAAI,CAAC,6BAA6B,CAAC,+BAA+B,CAAC,CAAC;QAC9G,MAAM,wCAAwC,GAAG,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAE9H,MAAM,mBAAmB,GAAG,iCAAiC,GAAG,wCAAwC,CAAC;QAEzG,OAAO,mBAAmB,GAAG,CAAC,CAAC;IACnC,CAAC;IAIO,KAAK,CAAC,yCAAyC,CAAC,YAAoB;QACxE,IAAI,CAAC,oCAAoC,EAAE,CAAC;QAE5C,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;QAEhH,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACtC,OAAO;QAEX,IAAI,gBAAgB;YAChB,IAAI,CAAC,2CAA2C,EAAE,CAAC;aAClD,CAAC;YACF,IAAI,CAAC,+BAA+B,CAAC,mBAAmB,CAAC,CAAC;YAC1D,OAAO;QACX,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QAEhE,MAAM,yBAAyB,GAAG,IAAI,CAAC,cAAc;YACjD,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC;YAChE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEjC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,kBAAkB,CAAC;QAClF,MAAM,wBAAwB,GAAG,MAAM,yBAAyB,CAAC;QAEjE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACtC,OAAO;QAEX,IAAI,WAAW,IAAI,wBAAwB,EAAE,QAAQ,KAAK,IAAI;YAC1D,IAAI,CAAC,0BAA0B,EAAE,CAAC;aACjC,CAAC;YACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,CAAC;YAE/E,IAAI,CAAC,yCAAyC,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QACtH,CAAC;IACL,CAAC;IAEO,sBAAsB,CAAC,wBAAyD;QACpF,IAAI,CAAC,wBAAwB;YACzB,OAAO,SAAS,CAAC;QAErB,OAAO,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9D,CAAC;IAEO,aAAa;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnF,CAAC;IAIO,oCAAoC;QACxC,MAAM,SAAS,GAAoC;YAC/C,MAAM,EAAE;gBACJ,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;gBAChC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;gBAC3B,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;aACrC;YACD,GAAG,IAAI,CAAC,mCAAmC;SAC9C,CAAC;QAEF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,CAAC;IAEO,2CAA2C;QAC/C,MAAM,SAAS,GAAoC;YAC/C,MAAM,EAAE;gBACJ,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAC1B,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;gBAC3B,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;aACrC;YACD,GAAG,IAAI,CAAC,mCAAmC;SAC9C,CAAC;QAEF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,CAAC;IAEO,+BAA+B,CAAC,KAAa;QACjD,MAAM,SAAS,GAAoC;YAC/C,MAAM,EAAE;gBACJ,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;gBACpC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;gBAC1B,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;aACpC;YACD,GAAG,IAAI,CAAC,mCAAmC;SAC9C,CAAC;QAEF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,CAAC;IAEO,yCAAyC,CAAC,gBAA4C,EAAE,eAAkC,EAAE,QAA2B;QAC3J,MAAM,SAAS,GAAoC;YAC/C,MAAM,EAAE;gBACJ,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAC1B,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;gBACvE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE;aAC3G;YACD,GAAG,IAAI,CAAC,mCAAmC;SAC9C,CAAC;QAEF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,CAAC;IAEO,0BAA0B;QAC9B,MAAM,SAAS,GAAoC;YAC/C,MAAM,EAAE;gBACJ,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAC1B,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBACrB,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;aAC/B;YACD,GAAG,IAAI,CAAC,mCAAmC;SAC9C,CAAC;QAEF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,CAAC;IAID,gBAAgB,CAAC,SAAiB,EAAE,OAA4B;QAC5D,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;CACJ","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
+ {"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.getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs);\n };\n\n protected abstract getFileServerBaseUrlFromFileServerKnowEventArgs(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}"]}
@@ -2,7 +2,7 @@ import TransferUploadProgressedEventArgs from "../../uploader/eventArgs/transfer
2
2
  import HealthMonitorHealthyEventArgs from "./events/eventArgs/healthMonitorHealthyEventArgs.js";
3
3
  import TransferHealthMonitorBase from "./transferHealthMonitorBase.js";
4
4
  export default class TransferUploaderHealthMonitor extends TransferHealthMonitorBase<TransferUploadProgressedEventArgs> {
5
- protected getFileServerUrlFromFileServerKnowEventArgs(eventArgs: unknown): string;
5
+ protected getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs: unknown): string;
6
6
  protected getFileServerKnownEventName(): string;
7
7
  protected getTransferProgressedEventName(): string;
8
8
  protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: TransferUploadProgressedEventArgs): number;
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploaderHealthMonitor.d.ts","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferUploaderHealthMonitor.ts"],"names":[],"mappings":"AACA,OAAO,iCAAiC,MAAM,+DAA+D,CAAC;AAE9G,OAAO,6BAA6B,MAAM,qDAAqD,CAAC;AAChG,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,yBAAyB,CAAC,iCAAiC,CAAC;IACnH,SAAS,CAAC,2CAA2C,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IASjF,SAAS,CAAC,2BAA2B,IAAI,MAAM;IAI/C,SAAS,CAAC,8BAA8B,IAAI,MAAM;IAIlD,SAAS,CAAC,6BAA6B,CAAC,+BAA+B,CAAC,EAAE,iCAAiC,GAAG,MAAM;IAIpH,SAAS,CAAC,mBAAmB,IAAI,6BAA6B;CASjE"}
1
+ {"version":3,"file":"transferUploaderHealthMonitor.d.ts","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferUploaderHealthMonitor.ts"],"names":[],"mappings":"AACA,OAAO,iCAAiC,MAAM,+DAA+D,CAAC;AAE9G,OAAO,6BAA6B,MAAM,qDAAqD,CAAC;AAChG,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,yBAAyB,CAAC,iCAAiC,CAAC;IACnH,SAAS,CAAC,+CAA+C,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IAUrF,SAAS,CAAC,2BAA2B,IAAI,MAAM;IAI/C,SAAS,CAAC,8BAA8B,IAAI,MAAM;IAIlD,SAAS,CAAC,6BAA6B,CAAC,+BAA+B,CAAC,EAAE,iCAAiC,GAAG,MAAM;IAIpH,SAAS,CAAC,mBAAmB,IAAI,6BAA6B;CASjE"}
@@ -1,11 +1,12 @@
1
1
  import TransferUploadEvent from "../../uploader/transferUploadEvent.js";
2
2
  import TransferHealthMonitorBase from "./transferHealthMonitorBase.js";
3
3
  export default class TransferUploaderHealthMonitor extends TransferHealthMonitorBase {
4
- getFileServerUrlFromFileServerKnowEventArgs(eventArgs) {
4
+ getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs) {
5
5
  const fileServerUrl = eventArgs.fileServerUrl;
6
6
  if (!fileServerUrl)
7
7
  throw new Error(`Event args are not of TransferMetadataDeterminedEventArgs type`);
8
- return fileServerUrl;
8
+ const fileServerBaseUrl = new URL(fileServerUrl).origin;
9
+ return fileServerBaseUrl;
9
10
  }
10
11
  getFileServerKnownEventName() {
11
12
  return TransferUploadEvent.TransferMetadataDetermined;
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploaderHealthMonitor.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferUploaderHealthMonitor.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,uCAAuC,CAAC;AAExE,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,yBAA4D;IACzG,2CAA2C,CAAC,SAAkB;QACpE,MAAM,aAAa,GAAI,SAAiD,CAAC,aAAa,CAAC;QAEvF,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEtF,OAAO,aAAa,CAAC;IACzB,CAAC;IAES,2BAA2B;QACjC,OAAO,mBAAmB,CAAC,0BAA0B,CAAC;IAC1D,CAAC;IAES,8BAA8B;QACpC,OAAO,mBAAmB,CAAC,kBAAkB,CAAC;IAClD,CAAC;IAES,6BAA6B,CAAC,+BAAmE;QACvG,OAAO,+BAA+B,EAAE,uBAAuB,IAAI,CAAC,CAAC;IACzE,CAAC;IAES,mBAAmB;QACzB,OAAO;YACH,0BAA0B,EAAE,IAAI,CAAC,mCAAmC,EAAE,uBAAuB;YAC7F,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,4BAA4B;YACpG,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,4BAA4B;YACpG,oBAAoB,EAAE,IAAI,CAAC,mCAAmC,EAAE,oBAAoB;YACpF,gBAAgB,EAAE,IAAI,CAAC,mCAAmC,EAAE,gBAAgB;SAC/E,CAAC;IACN,CAAC;CACJ","sourcesContent":["import { TransferMetadataDeterminedEventArgs } from \"../../index.node.js\";\nimport TransferUploadProgressedEventArgs from \"../../uploader/eventArgs/transferUploadProgressedEventArgs.js\";\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport TransferHealthMonitorBase from \"./transferHealthMonitorBase.js\";\n\nexport default class TransferUploaderHealthMonitor extends TransferHealthMonitorBase<TransferUploadProgressedEventArgs> {\n protected getFileServerUrlFromFileServerKnowEventArgs(eventArgs: unknown): string {\n const fileServerUrl = (eventArgs as TransferMetadataDeterminedEventArgs).fileServerUrl;\n\n if (!fileServerUrl)\n throw new Error(`Event args are not of TransferMetadataDeterminedEventArgs type`);\n\n return fileServerUrl;\n }\n\n protected getFileServerKnownEventName(): string {\n return TransferUploadEvent.TransferMetadataDetermined;\n }\n\n protected getTransferProgressedEventName(): string {\n return TransferUploadEvent.TransferProgressed;\n }\n\n protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: TransferUploadProgressedEventArgs): number {\n return currentHistoryLastProgressEvent?.uploadedBytesTotalCount ?? 0;\n }\n\n protected getHealthyEventArgs(): HealthMonitorHealthyEventArgs {\n return {\n transferredBytesTotalCount: this.lastProgressEventFromPreviousPeriod?.uploadedBytesTotalCount,\n averageSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.averageSpeedInBytesPerSecond,\n currentSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.currentSpeedInBytesPerSecond,\n progressInPercentage: this.lastProgressEventFromPreviousPeriod?.progressInPercentage,\n remainingSeconds: this.lastProgressEventFromPreviousPeriod?.remainingSeconds,\n };\n }\n}"]}
1
+ {"version":3,"file":"transferUploaderHealthMonitor.js","sourceRoot":"","sources":["../../../../src/client/healthMonitor/transferUploaderHealthMonitor.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,uCAAuC,CAAC;AAExE,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,yBAA4D;IACzG,+CAA+C,CAAC,SAAkB;QACxE,MAAM,aAAa,GAAI,SAAiD,CAAC,aAAa,CAAC;QACvF,IAAI,CAAC,aAAa;YACd,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAEtF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;QAExD,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAES,2BAA2B;QACjC,OAAO,mBAAmB,CAAC,0BAA0B,CAAC;IAC1D,CAAC;IAES,8BAA8B;QACpC,OAAO,mBAAmB,CAAC,kBAAkB,CAAC;IAClD,CAAC;IAES,6BAA6B,CAAC,+BAAmE;QACvG,OAAO,+BAA+B,EAAE,uBAAuB,IAAI,CAAC,CAAC;IACzE,CAAC;IAES,mBAAmB;QACzB,OAAO;YACH,0BAA0B,EAAE,IAAI,CAAC,mCAAmC,EAAE,uBAAuB;YAC7F,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,4BAA4B;YACpG,4BAA4B,EAAE,IAAI,CAAC,mCAAmC,EAAE,4BAA4B;YACpG,oBAAoB,EAAE,IAAI,CAAC,mCAAmC,EAAE,oBAAoB;YACpF,gBAAgB,EAAE,IAAI,CAAC,mCAAmC,EAAE,gBAAgB;SAC/E,CAAC;IACN,CAAC;CACJ","sourcesContent":["import { TransferMetadataDeterminedEventArgs } from \"../../index.node.js\";\nimport TransferUploadProgressedEventArgs from \"../../uploader/eventArgs/transferUploadProgressedEventArgs.js\";\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\nimport HealthMonitorHealthyEventArgs from \"./events/eventArgs/healthMonitorHealthyEventArgs.js\";\nimport TransferHealthMonitorBase from \"./transferHealthMonitorBase.js\";\n\nexport default class TransferUploaderHealthMonitor extends TransferHealthMonitorBase<TransferUploadProgressedEventArgs> {\n protected getFileServerBaseUrlFromFileServerKnowEventArgs(eventArgs: unknown): string {\n const fileServerUrl = (eventArgs as TransferMetadataDeterminedEventArgs).fileServerUrl;\n if (!fileServerUrl)\n throw new Error(`Event args are not of TransferMetadataDeterminedEventArgs type`);\n\n const fileServerBaseUrl = new URL(fileServerUrl).origin;\n\n return fileServerBaseUrl;\n }\n\n protected getFileServerKnownEventName(): string {\n return TransferUploadEvent.TransferMetadataDetermined;\n }\n\n protected getTransferProgressedEventName(): string {\n return TransferUploadEvent.TransferProgressed;\n }\n\n protected getTransferredBytesTotalCount(currentHistoryLastProgressEvent?: TransferUploadProgressedEventArgs): number {\n return currentHistoryLastProgressEvent?.uploadedBytesTotalCount ?? 0;\n }\n\n protected getHealthyEventArgs(): HealthMonitorHealthyEventArgs {\n return {\n transferredBytesTotalCount: this.lastProgressEventFromPreviousPeriod?.uploadedBytesTotalCount,\n averageSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.averageSpeedInBytesPerSecond,\n currentSpeedInBytesPerSecond: this.lastProgressEventFromPreviousPeriod?.currentSpeedInBytesPerSecond,\n progressInPercentage: this.lastProgressEventFromPreviousPeriod?.progressInPercentage,\n remainingSeconds: this.lastProgressEventFromPreviousPeriod?.remainingSeconds,\n };\n }\n}"]}
@@ -20,6 +20,7 @@ export default abstract class TransferUploaderBase<T extends NodeFileDetails | W
20
20
  private tryGetApiFilemailError;
21
21
  private addHealthMonitorEventListeners;
22
22
  private addTransferEventListeners;
23
+ private failTransfer;
23
24
  private logTrace;
24
25
  private logDebug;
25
26
  private logInfo;
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploaderBase.d.ts","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderBase.ts"],"names":[],"mappings":"AAIA,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAU9D,OAAO,KAAK,eAAe,MAAM,gDAAgD,CAAC;AAClF,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,oBAAoB,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,sBAAsB,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,cAAc,MAAM,8CAA8C,CAAC;AAE/E,OAAO,KAAK,6BAA6B,MAAM,mDAAmD,CAAC;AAInG,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,oBAAoB,CAAC,CAAC,SAAS,eAAe,GAAG,cAAc,CAAE,YAAW,gBAAgB,CAAC,CAAC,CAAC;;gBAwB7G,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,6BAA6B,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAiBrN,IAAI,QAAQ,IAAI,cAAc,CAAC,CAAC,CAAC,CAEhC;IAED,IAAI,aAAa,IAAI,6BAA6B,CAEjD;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAEM,KAAK;IAWL,IAAI;IAWE,MAAM,CAAC,WAAW,CAAC,EAAE,WAAW;IAMvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C5B,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,8BAA8B;IAuBtC,OAAO,CAAC,yBAAyB;IA4DjC,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,iBAAiB;CAG5B"}
1
+ {"version":3,"file":"transferUploaderBase.d.ts","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderBase.ts"],"names":[],"mappings":"AAIA,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAW9D,OAAO,KAAK,eAAe,MAAM,gDAAgD,CAAC;AAClF,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,oBAAoB,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,sBAAsB,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,cAAc,MAAM,8CAA8C,CAAC;AAE/E,OAAO,KAAK,6BAA6B,MAAM,mDAAmD,CAAC;AAInG,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,oBAAoB,CAAC,CAAC,SAAS,eAAe,GAAG,cAAc,CAAE,YAAW,gBAAgB,CAAC,CAAC,CAAC;;gBAwB7G,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,6BAA6B,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAiBrN,IAAI,QAAQ,IAAI,cAAc,CAAC,CAAC,CAAC,CAEhC;IAED,IAAI,aAAa,IAAI,6BAA6B,CAEjD;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAEM,KAAK;IAWL,IAAI;IAWE,MAAM,CAAC,WAAW,CAAC,EAAE,WAAW;IAMvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C5B,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,8BAA8B;IAuBtC,OAAO,CAAC,yBAAyB;IA4DjC,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,iBAAiB;CAG5B"}
@@ -6,6 +6,7 @@ import TransferStatus from "../../utils/types/transferStatus.js";
6
6
  import TransferUploadEvent from "../../uploader/transferUploadEvent.js";
7
7
  import FsError from "../../utils/fileSystem/fsError.js";
8
8
  import TransferUploadError from "../../uploader/transferUploadError.js";
9
+ import { createTransferFailureAbortReason } from "../../uploader/transferFailureAbortReason.js";
9
10
  import logEventPropertyName from "../../utils/logging/logEventPropertyNames.js";
10
11
  import ApiFilemailError from "../../utils/api/apiFilemailError.js";
11
12
  import logHealthyStatus from "../loggers/utils/logHealthyStatus.js";
@@ -48,21 +49,21 @@ export default class TransferUploaderBase {
48
49
  return this.#failedReason;
49
50
  }
50
51
  pause() {
51
- this.logInfo(`Pause called`);
52
+ this.logInfo(`Pause called on uploader client`);
52
53
  if (!this.#pauseController)
53
54
  throw new TransferUploadError(`Can't pause not started transfer`);
54
55
  this.#isShuttingDown = true;
55
56
  this.#pauseController.pause();
56
57
  }
57
58
  stop() {
58
- this.logInfo(`Stop called`);
59
+ this.logInfo(`Stop called on uploader client`);
59
60
  if (!this.#abortController)
60
61
  throw new TransferUploadError(`Can't stop not started transfer`);
61
62
  this.#isShuttingDown = true;
62
- this.#abortController.abort();
63
+ this.#abortController.abort(new Error(`Transfer stop requested`));
63
64
  }
64
65
  async cancel(abortSignal) {
65
- this.logInfo(`Cancel called`);
66
+ this.logInfo(`Cancel called on uploader client`);
66
67
  await this.#transfer.cancel(abortSignal);
67
68
  }
68
69
  async start() {
@@ -149,13 +150,13 @@ export default class TransferUploaderBase {
149
150
  const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);
150
151
  if (isFileAccessError && !this.#isShuttingDown) {
151
152
  this.#failedReason = `Can't read ${fullFilePathOrName} anymore`;
152
- this.logWarning(`${this.#failedReason}. Aborting...`);
153
- this.stop();
153
+ this.logWarning(`${this.#failedReason}. Failing transfer...`);
154
+ this.failTransfer();
154
155
  }
155
156
  if (!this.#config.infiniteRetries && !this.#isShuttingDown) {
156
157
  this.#failedReason = `Uploading ${fullFilePathOrName} failed after ${this.#config.chunkUploadRetryLimit} retries`;
157
- this.logWarning(`${this.#failedReason}. Aborting...`);
158
- this.stop();
158
+ this.logWarning(`${this.#failedReason}. Failing transfer...`);
159
+ this.failTransfer();
159
160
  }
160
161
  });
161
162
  this.#transfer.addEventListener(TransferUploadEvent.FileUploadFailed, eventArgs => {
@@ -181,6 +182,12 @@ export default class TransferUploaderBase {
181
182
  this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));
182
183
  this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));
183
184
  }
185
+ failTransfer() {
186
+ if (!this.#abortController)
187
+ throw new TransferUploadError(`Can't fail not started transfer`);
188
+ this.#isShuttingDown = true;
189
+ this.#abortController.abort(createTransferFailureAbortReason());
190
+ }
184
191
  logTrace(message) {
185
192
  const logEntryMetadata = this.getLogEntryMetadata();
186
193
  this.#logger.logTrace(message, logEntryMetadata);
@@ -1 +1 @@
1
- {"version":3,"file":"transferUploaderBase.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderBase.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport sleep from \"abortable-sleep\";\nimport throttle from \"lodash.throttle\";\n\nimport TransferUpload from \"../../uploader/transferUpload.js\";\nimport PauseController from \"../../uploader/pauseController.js\";\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\nimport FsError from \"../../utils/fileSystem/fsError.js\";\nimport TransferUploadError from \"../../uploader/transferUploadError.js\";\nimport logEventPropertyName from \"../../utils/logging/logEventPropertyNames.js\";\nimport ApiFilemailError from \"../../utils/api/apiFilemailError.js\";\nimport logHealthyStatus from \"../loggers/utils/logHealthyStatus.js\";\n\nimport type NodeFileDetails from \"../../utils/fileSystem/node/nodeFileDetails.js\";\nimport type Logger from \"../loggers/logger.js\";\nimport type EnvironmentVariables from \"../environmentVariables.js\";\nimport type TransferUploader from \"./transferUploader.js\";\nimport type ReadonlyTransferUploadStateFile from \"../../uploader/state/readonlyTransferUploadStateFile.js\";\nimport type TransferUploaderConfig from \"./transferUploaderConfig.js\";\nimport type WebFileDetails from \"../../utils/fileSystem/web/webFileDetails.js\";\nimport TransferHealthMonitorEvent from \"../healthMonitor/events/transferHealthMonitorEvent.js\";\nimport type TransferUploaderHealthMonitor from \"../healthMonitor/transferUploaderHealthMonitor.js\";\n\nconst TransferFailedSleepInMs = 500;\n\nexport default abstract class TransferUploaderBase<T extends NodeFileDetails | WebFileDetails> implements TransferUploader<T> {\n #logger: Logger;\n #trackingId: number | string;\n\n #fileDetails: T[];\n\n #config: TransferUploaderConfig;\n #envValues: EnvironmentVariables;\n\n #pauseController?: PauseController;\n #abortController?: AbortController;\n\n #transfer: TransferUpload<T>;\n #healthMonitor: TransferUploaderHealthMonitor;\n\n #isShuttingDown = false;\n\n #failedReason?: string;\n\n #isUdp?: boolean;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(transfer: TransferUpload<T>, fileDetails: T[], config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger, healthMonitor: TransferUploaderHealthMonitor, trackingId: number | string) {\n this.#logger = logger;\n this.#trackingId = trackingId;\n\n this.#config = config;\n this.#envValues = envValues;\n\n this.#fileDetails = fileDetails;\n this.#transfer = transfer;\n this.#healthMonitor = healthMonitor;\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n get transfer(): TransferUpload<T> {\n return this.#transfer;\n }\n\n get healthMonitor(): TransferUploaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n get failedReason(): string | undefined {\n return this.#failedReason;\n }\n\n public pause() {\n this.logInfo(`Pause called`);\n\n if (!this.#pauseController)\n throw new TransferUploadError(`Can't pause not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#pauseController.pause();\n }\n\n public stop() {\n this.logInfo(`Stop called`);\n\n if (!this.#abortController)\n throw new TransferUploadError(`Can't stop not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#abortController.abort();\n }\n\n public async cancel(abortSignal?: AbortSignal) {\n this.logInfo(`Cancel called`);\n\n await this.#transfer.cancel(abortSignal);\n }\n\n async start(): Promise<void> {\n if (this.#transfer.status !== TransferStatus.Failed && this.#transfer.status !== TransferStatus.Aborted && this.#transfer.status !== TransferStatus.Initialized && this.#transfer.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transfer.status]} state and cannot be run`);\n\n this.logInfo(`Starting upload. Already uploaded bytes: ${this.transfer.uploadedBytesCount}/${this.#transfer.totalSizeInBytes}B, completed files: ${this.transfer.completedFilesCount}.`);\n\n const logMessageEntries = this.#transfer.files.map(f => `'Sending ${f.fileName}' with id = ${f.externalId}. It will be put into '${f.fileDestinationPathInTransfer}' folder.`);\n this.logInfo(`Transfer file details:\\n${logMessageEntries.join(`\\n`)}`);\n\n this.#failedReason = undefined;\n this.#isShuttingDown = false;\n\n this.#pauseController = new PauseController();\n this.#abortController = new AbortController();\n\n this.#healthMonitor.start();\n\n do {\n /* eslint-disable no-await-in-loop */\n try {\n await this.#transfer.run(this.#pauseController.signal, this.#abortController.signal);\n }\n catch (error) {\n this.logError(error as TransferUploadError, `Transfer upload run method exception`);\n\n this.setFailedReasonFromError(error as TransferUploadError);\n this.#isShuttingDown = true;\n\n break;\n }\n finally {\n // @ts-ignore Typescript's brainfart\n if (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown) {\n this.logWarning(`Retrying transfer in ${TransferFailedSleepInMs}ms.`);\n\n await sleep(TransferFailedSleepInMs);\n }\n }\n }\n while (this.#transfer.progressInPercentage < 100 && !this.#isShuttingDown);\n\n this.#healthMonitor.stop();\n this.#logHealthyStatusThrottled.cancel();\n\n this.logInfo(`Upload finished in status ${TransferStatus[this.#transfer.status]} having ${this.#transfer.progressInPercentage}% completed`);\n }\n\n private setFailedReasonFromError(error: TransferUploadError) {\n const apiFilemailError = this.tryGetApiFilemailError(error);\n\n if (apiFilemailError) {\n this.#failedReason = apiFilemailError.reason;\n return;\n }\n\n if (error.message.startsWith(`Unhandled error occured`) && error.cause) {\n this.#failedReason = error.cause.message;\n return;\n }\n\n this.#failedReason = error.message;\n }\n\n private tryGetApiFilemailError(error: Error): ApiFilemailError | null {\n if (error instanceof ApiFilemailError)\n return error;\n\n if (error.cause)\n return this.tryGetApiFilemailError(error.cause);\n\n return null;\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, this.getLogEntryMetadata());\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, this.getLogEntryMetadata());\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, this.getLogEntryMetadata());\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, this.getLogEntryMetadata());\n\n this.#isHealthy = false;\n });\n }\n\n private addTransferEventListeners() {\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => {\n this.#isUdp = eventArgs.isUdpMode;\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadFailed, eventArgs => {\n const isTimeoutError = eventArgs.error.message.includes(`Timeout`);\n const errorMessage = `File ${eventArgs.fileStatus.externalId} chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} upload failed: ${eventArgs.reason}`;\n\n if (this.#isUdp && isTimeoutError)\n this.logDebug(errorMessage);\n else\n this.logError(eventArgs.error, errorMessage);\n\n const isFileAccessError = eventArgs.error.cause instanceof FsError;\n const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);\n\n if (isFileAccessError && !this.#isShuttingDown) {\n this.#failedReason = `Can't read ${fullFilePathOrName} anymore`;\n\n this.logWarning(`${this.#failedReason}. Aborting...`);\n this.stop();\n }\n\n if (!this.#config.infiniteRetries && !this.#isShuttingDown) {\n this.#failedReason = `Uploading ${fullFilePathOrName} failed after ${this.#config.chunkUploadRetryLimit} retries`;\n\n this.logWarning(`${this.#failedReason}. Aborting...`);\n this.stop();\n }\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadFailed, eventArgs => {\n const isTimeoutError = eventArgs.reason?.includes(`Timeout`);\n const errorMessage = `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload failed: ${eventArgs.reason}`;\n\n if (this.#isUdp && isTimeoutError)\n this.logWarning(errorMessage);\n else\n this.logError(new Error(errorMessage));\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferRun, () => this.logInfo(`Transfer run.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAbortRequested, () => this.logInfo(`Transfer abort requested`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAborted, async () => this.logInfo(`Transfer aborted.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCancelRequested, () => this.logInfo(`Transfer cancel requested.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCanceled, () => this.logInfo(`Transfer canceled.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferFailed, () => this.logError(new Error(`Transfer failed.`)));\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => this.logInfo(`Transfer upload mode chosen. Is UDP: ${eventArgs.isUdpMode}; Latency: ${eventArgs.latency ?? `<unkown>`}; Error: ${eventArgs.error ?? `<none>`}`));\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferCompleted, eventArgs => this.logInfo(`Transfer completed successfully. ID: ${eventArgs.transferId}, URL: ${eventArgs.transferDownloadUrl}`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadProgressed, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} progressed: ${eventArgs.transferredBytesSinceLastEvent} bytes sinc last event. Total progress: ${this.#transfer?.progressInPercentage}%.`));\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadStarted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload started.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload completed.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadStarted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload started`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));\n }\n\n private logTrace(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logTrace(message, logEntryMetadata);\n }\n\n private logDebug(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logDebug(message, logEntryMetadata);\n }\n\n private logInfo(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logInfo(message, logEntryMetadata);\n }\n\n private logWarning(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logWarning(message, logEntryMetadata);\n }\n\n private logError(error: Error, message?: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logError(error, message, logEntryMetadata);\n }\n\n private getLogEntryMetadata() {\n return {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n [logEventPropertyName.TransferIdPropertyName]: this.#transfer.transferId,\n };\n }\n\n private getFullFilePathOrFileName(fileStatus: ReadonlyTransferUploadStateFile): string {\n const fileDetails = this.#fileDetails.find(f => f.externalId === fileStatus.externalId);\n\n if (!fileDetails)\n return fileStatus.fileName;\n\n if (this.isNodeFileDetails(fileDetails))\n return fileDetails.fileFullPath;\n\n return fileDetails.file.name;\n }\n\n private isNodeFileDetails(fileDetails: NodeFileDetails | WebFileDetails): fileDetails is NodeFileDetails {\n return typeof (fileDetails as NodeFileDetails).fileFullPath === `string`;\n }\n}"]}
1
+ {"version":3,"file":"transferUploaderBase.js","sourceRoot":"","sources":["../../../../src/client/uploader/transferUploaderBase.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport sleep from \"abortable-sleep\";\nimport throttle from \"lodash.throttle\";\n\nimport TransferUpload from \"../../uploader/transferUpload.js\";\nimport PauseController from \"../../uploader/pauseController.js\";\nimport TransferStatus from \"../../utils/types/transferStatus.js\";\nimport TransferUploadEvent from \"../../uploader/transferUploadEvent.js\";\nimport FsError from \"../../utils/fileSystem/fsError.js\";\nimport TransferUploadError from \"../../uploader/transferUploadError.js\";\nimport { createTransferFailureAbortReason } from \"../../uploader/transferFailureAbortReason.js\";\nimport logEventPropertyName from \"../../utils/logging/logEventPropertyNames.js\";\nimport ApiFilemailError from \"../../utils/api/apiFilemailError.js\";\nimport logHealthyStatus from \"../loggers/utils/logHealthyStatus.js\";\n\nimport type NodeFileDetails from \"../../utils/fileSystem/node/nodeFileDetails.js\";\nimport type Logger from \"../loggers/logger.js\";\nimport type EnvironmentVariables from \"../environmentVariables.js\";\nimport type TransferUploader from \"./transferUploader.js\";\nimport type ReadonlyTransferUploadStateFile from \"../../uploader/state/readonlyTransferUploadStateFile.js\";\nimport type TransferUploaderConfig from \"./transferUploaderConfig.js\";\nimport type WebFileDetails from \"../../utils/fileSystem/web/webFileDetails.js\";\nimport TransferHealthMonitorEvent from \"../healthMonitor/events/transferHealthMonitorEvent.js\";\nimport type TransferUploaderHealthMonitor from \"../healthMonitor/transferUploaderHealthMonitor.js\";\n\nconst TransferFailedSleepInMs = 500;\n\nexport default abstract class TransferUploaderBase<T extends NodeFileDetails | WebFileDetails> implements TransferUploader<T> {\n #logger: Logger;\n #trackingId: number | string;\n\n #fileDetails: T[];\n\n #config: TransferUploaderConfig;\n #envValues: EnvironmentVariables;\n\n #pauseController?: PauseController;\n #abortController?: AbortController;\n\n #transfer: TransferUpload<T>;\n #healthMonitor: TransferUploaderHealthMonitor;\n\n #isShuttingDown = false;\n\n #failedReason?: string;\n\n #isUdp?: boolean;\n\n #isHealthy = true;\n #logHealthyStatusThrottled: ReturnType<typeof throttle>;\n\n constructor(transfer: TransferUpload<T>, fileDetails: T[], config: TransferUploaderConfig, envValues: EnvironmentVariables, logger: Logger, healthMonitor: TransferUploaderHealthMonitor, trackingId: number | string) {\n this.#logger = logger;\n this.#trackingId = trackingId;\n\n this.#config = config;\n this.#envValues = envValues;\n\n this.#fileDetails = fileDetails;\n this.#transfer = transfer;\n this.#healthMonitor = healthMonitor;\n\n this.#logHealthyStatusThrottled = throttle(logHealthyStatus, 20_000);\n\n this.addHealthMonitorEventListeners();\n this.addTransferEventListeners();\n }\n\n get transfer(): TransferUpload<T> {\n return this.#transfer;\n }\n\n get healthMonitor(): TransferUploaderHealthMonitor {\n return this.#healthMonitor;\n }\n\n get failedReason(): string | undefined {\n return this.#failedReason;\n }\n\n public pause() {\n this.logInfo(`Pause called on uploader client`);\n\n if (!this.#pauseController)\n throw new TransferUploadError(`Can't pause not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#pauseController.pause();\n }\n\n public stop() {\n this.logInfo(`Stop called on uploader client`);\n\n if (!this.#abortController)\n throw new TransferUploadError(`Can't stop not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#abortController.abort(new Error(`Transfer stop requested`));\n }\n\n public async cancel(abortSignal?: AbortSignal) {\n this.logInfo(`Cancel called on uploader client`);\n\n await this.#transfer.cancel(abortSignal);\n }\n\n async start(): Promise<void> {\n if (this.#transfer.status !== TransferStatus.Failed && this.#transfer.status !== TransferStatus.Aborted && this.#transfer.status !== TransferStatus.Initialized && this.#transfer.status !== TransferStatus.Paused)\n throw new TransferUploadError(`Transfer is in ${TransferStatus[this.#transfer.status]} state and cannot be run`);\n\n this.logInfo(`Starting upload. Already uploaded bytes: ${this.transfer.uploadedBytesCount}/${this.#transfer.totalSizeInBytes}B, completed files: ${this.transfer.completedFilesCount}.`);\n\n const logMessageEntries = this.#transfer.files.map(f => `'Sending ${f.fileName}' with id = ${f.externalId}. It will be put into '${f.fileDestinationPathInTransfer}' folder.`);\n this.logInfo(`Transfer file details:\\n${logMessageEntries.join(`\\n`)}`);\n\n this.#failedReason = undefined;\n this.#isShuttingDown = false;\n\n this.#pauseController = new PauseController();\n this.#abortController = new AbortController();\n\n this.#healthMonitor.start();\n\n do {\n /* eslint-disable no-await-in-loop */\n try {\n await this.#transfer.run(this.#pauseController.signal, this.#abortController.signal);\n }\n catch (error) {\n this.logError(error as TransferUploadError, `Transfer upload run method exception`);\n\n this.setFailedReasonFromError(error as TransferUploadError);\n this.#isShuttingDown = true;\n\n break;\n }\n finally {\n // @ts-ignore Typescript's brainfart\n if (this.#transfer.status !== TransferStatus.Completed && !this.#isShuttingDown) {\n this.logWarning(`Retrying transfer in ${TransferFailedSleepInMs}ms.`);\n\n await sleep(TransferFailedSleepInMs);\n }\n }\n }\n while (this.#transfer.progressInPercentage < 100 && !this.#isShuttingDown);\n\n this.#healthMonitor.stop();\n this.#logHealthyStatusThrottled.cancel();\n\n this.logInfo(`Upload finished in status ${TransferStatus[this.#transfer.status]} having ${this.#transfer.progressInPercentage}% completed`);\n }\n\n private setFailedReasonFromError(error: TransferUploadError) {\n const apiFilemailError = this.tryGetApiFilemailError(error);\n\n if (apiFilemailError) {\n this.#failedReason = apiFilemailError.reason;\n return;\n }\n\n if (error.message.startsWith(`Unhandled error occured`) && error.cause) {\n this.#failedReason = error.cause.message;\n return;\n }\n\n this.#failedReason = error.message;\n }\n\n private tryGetApiFilemailError(error: Error): ApiFilemailError | null {\n if (error instanceof ApiFilemailError)\n return error;\n\n if (error.cause)\n return this.tryGetApiFilemailError(error.cause);\n\n return null;\n }\n\n private addHealthMonitorEventListeners() {\n this.#healthMonitor.addEventListener(TransferHealthMonitorEvent.Healthy, eventArgs => {\n this.#logHealthyStatusThrottled(this.#logger, true, eventArgs, this.getLogEntryMetadata());\n\n if (!this.#isHealthy)\n logHealthyStatus(this.#logger, true, eventArgs, this.getLogEntryMetadata());\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, this.getLogEntryMetadata());\n\n if (this.#isHealthy)\n logHealthyStatus(this.#logger, false, eventArgs, this.getLogEntryMetadata());\n\n this.#isHealthy = false;\n });\n }\n\n private addTransferEventListeners() {\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => {\n this.#isUdp = eventArgs.isUdpMode;\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadFailed, eventArgs => {\n const isTimeoutError = eventArgs.error.message.includes(`Timeout`);\n const errorMessage = `File ${eventArgs.fileStatus.externalId} chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} upload failed: ${eventArgs.reason}`;\n\n if (this.#isUdp && isTimeoutError)\n this.logDebug(errorMessage);\n else\n this.logError(eventArgs.error, errorMessage);\n\n const isFileAccessError = eventArgs.error.cause instanceof FsError;\n const fullFilePathOrName = this.getFullFilePathOrFileName(eventArgs.fileStatus);\n\n if (isFileAccessError && !this.#isShuttingDown) {\n this.#failedReason = `Can't read ${fullFilePathOrName} anymore`;\n\n this.logWarning(`${this.#failedReason}. Failing transfer...`);\n this.failTransfer();\n }\n\n if (!this.#config.infiniteRetries && !this.#isShuttingDown) {\n this.#failedReason = `Uploading ${fullFilePathOrName} failed after ${this.#config.chunkUploadRetryLimit} retries`;\n\n this.logWarning(`${this.#failedReason}. Failing transfer...`);\n this.failTransfer();\n }\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadFailed, eventArgs => {\n const isTimeoutError = eventArgs.reason?.includes(`Timeout`);\n const errorMessage = `File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload failed: ${eventArgs.reason}`;\n\n if (this.#isUdp && isTimeoutError)\n this.logWarning(errorMessage);\n else\n this.logError(new Error(errorMessage));\n });\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferRun, () => this.logInfo(`Transfer run.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAbortRequested, () => this.logInfo(`Transfer abort requested`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferAborted, async () => this.logInfo(`Transfer aborted.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCancelRequested, () => this.logInfo(`Transfer cancel requested.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferCanceled, () => this.logInfo(`Transfer canceled.`));\n this.#transfer.addEventListener(TransferUploadEvent.TransferFailed, () => this.logError(new Error(`Transfer failed.`)));\n this.#transfer.addEventListener(TransferUploadEvent.TransferUploadModeChosen, eventArgs => this.logInfo(`Transfer upload mode chosen. Is UDP: ${eventArgs.isUdpMode}; Latency: ${eventArgs.latency ?? `<unkown>`}; Error: ${eventArgs.error ?? `<none>`}`));\n\n this.#transfer.addEventListener(TransferUploadEvent.TransferCompleted, eventArgs => this.logInfo(`Transfer completed successfully. ID: ${eventArgs.transferId}, URL: ${eventArgs.transferDownloadUrl}`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadProgressed, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} progressed: ${eventArgs.transferredBytesSinceLastEvent} bytes sinc last event. Total progress: ${this.#transfer?.progressInPercentage}%.`));\n\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadStarted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload started.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileUploadCompleted, eventArgs => this.logDebug(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId} - upload completed.`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadStarted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload started`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompleted, eventArgs => this.logTrace(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - upload completed`));\n this.#transfer.addEventListener(TransferUploadEvent.FileChunkUploadCompletedPartially, eventArgs => this.logWarning(`File ${eventArgs.fileStatus.fileName} having external id = ${eventArgs.fileStatus.externalId}, chunk starting at ${eventArgs.chunkStartPosition} having size ${eventArgs.chunkSizeInBytes} - uploaded partially - only ${eventArgs.uploadedBytesCount} bytes uploaded`));\n }\n\n private failTransfer() {\n if (!this.#abortController)\n throw new TransferUploadError(`Can't fail not started transfer`);\n\n this.#isShuttingDown = true;\n\n this.#abortController.abort(createTransferFailureAbortReason());\n }\n\n private logTrace(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logTrace(message, logEntryMetadata);\n }\n\n private logDebug(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logDebug(message, logEntryMetadata);\n }\n\n private logInfo(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logInfo(message, logEntryMetadata);\n }\n\n private logWarning(message: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logWarning(message, logEntryMetadata);\n }\n\n private logError(error: Error, message?: string) {\n const logEntryMetadata = this.getLogEntryMetadata();\n this.#logger.logError(error, message, logEntryMetadata);\n }\n\n private getLogEntryMetadata() {\n return {\n [logEventPropertyName.TrackingIdPropertyName]: this.#trackingId,\n [logEventPropertyName.TransferIdPropertyName]: this.#transfer.transferId,\n };\n }\n\n private getFullFilePathOrFileName(fileStatus: ReadonlyTransferUploadStateFile): string {\n const fileDetails = this.#fileDetails.find(f => f.externalId === fileStatus.externalId);\n\n if (!fileDetails)\n return fileStatus.fileName;\n\n if (this.isNodeFileDetails(fileDetails))\n return fileDetails.fileFullPath;\n\n return fileDetails.file.name;\n }\n\n private isNodeFileDetails(fileDetails: NodeFileDetails | WebFileDetails): fileDetails is NodeFileDetails {\n return typeof (fileDetails as NodeFileDetails).fileFullPath === `string`;\n }\n}"]}
@@ -148,7 +148,7 @@ export default class NodeFileServerUdpClient {
148
148
  }
149
149
  async sendChunkCall(request, chunkStreamProvider) {
150
150
  const packetGuid = newGuid();
151
- const chunkReadStream = await chunkStreamProvider.getChunkReadStream();
151
+ const chunkReadStream = await chunkStreamProvider.getChunkReadStream(undefined, this.#abortSignal);
152
152
  const chunkBytes = await this.readStreamToEnd(chunkReadStream);
153
153
  const udpRequest = this.createSendChunkRequest(packetGuid, request, chunkBytes);
154
154
  return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));
@@ -1 +1 @@
1
- {"version":3,"file":"nodeFileServerUdpClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/node/nodeFileServerUdpClient.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport path from 'path';\nimport { clearTimeout } from 'timers';\nimport { publicEncrypt, randomBytes, createCipheriv } from 'crypto';\n\nimport type { RemoteInfo } from 'dgram';\nimport type { ReadableStream as NodeReadableStream } from \"stream/web\";\n\nimport UdpClient from 'promisified-udp-client';\nimport sleep from 'abortable-sleep';\n\nimport { v4 as newGuid, parse as guidToBytes, stringify as bytesToGuid } from 'uuid';\n\nimport FsError from '../../../utils/fileSystem/fsError.js';\n\nimport type LatencyResponse from \"../dtos/pingResponse.js\";\nimport type HandshakeRequest from '../dtos/handshakeRequest.js';\nimport type SendChunkRequest from '../dtos/sendChunkRequest.js';\nimport type FileServerUdpClient from '../fileServerUdpClient.js';\nimport type HandshakeResponse from '../dtos/handshakeResponse.js';\nimport type ChunkStreamProvider from '../../../utils/fileSystem/chunkStreamProvider.js';\n\nconst pingPrefix = Buffer.from(`P2`);\nconst handshakePrefix = Buffer.from(`H2`);\nconst chunkDataPrefix = Buffer.from(`D2`);\nconst encryptedPrefix = Buffer.from(`E2`);\n\nconst filemailPublicKey = `-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmW7lnKl2UN7gLrLjsIP\nWMMA2Nc8zROtwcGuumiN5bpw8ju/58MSE2DiYnGJKOVXxI2A52FgVK4I9hXKstwZ\n5Sotcf3BXw1wMusnHwVGYRsQob76EJKiqQODc/pLyLtRDiFRY5tgafkW0dU1X8AU\nkjtAawPp7ed/Z6DJaV2jWOQyJ9sCBXGhnNSExPOeSFvRKFM5vfurPXPXG4ii6tGU\nXaqjVeX5+b9dJFTJ2HzUSUxAkYUCS1y4E9jehlimM7gGTR0m7ISQa/bg1eE1X8iA\nD2DVevYVGqs9A6p+e/WJ2dMXU4XxBmfxWZe+szqgfU3wqvOmCS5JrGUKi6SAx8a5\nWQIDAQAB\n-----END PUBLIC KEY-----`;\n\nexport default class NodeFileServerUdpClient implements FileServerUdpClient {\n #address: string;\n #port: number;\n\n #requestTimeout: number;\n #retries: number;\n #retryDelay: number;\n\n #abortSignal?: AbortSignal;\n\n #udpClient: UdpClient;\n\n constructor(address: string, port: number, requestTimeout: number, retries: number, abortSignal?: AbortSignal, retryDelay: number = 1000) {\n this.#address = address;\n this.#port = port;\n this.#requestTimeout = requestTimeout;\n this.#retries = retries;\n this.#retryDelay = retryDelay;\n this.#abortSignal = abortSignal;\n\n this.#udpClient = new UdpClient(abortSignal);\n }\n\n addMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.addMessageListener(listener);\n }\n\n removeMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.removeMessageListener(listener);\n }\n\n addErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.addErrorListener(listener);\n }\n\n removeErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.removeErrorListener(listener);\n }\n\n async connect(): Promise<void> {\n await this.#udpClient.connect(this.#port, this.#address);\n }\n\n async close(): Promise<void> {\n await this.#udpClient.close();\n }\n\n private async retryMechanism<T>(apiCall: () => Promise<T>): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.#retries; attempt++) {\n try {\n const result = await apiCall();\n return result;\n }\n catch (error) {\n if (attempt < this.#retries) {\n lastError = error as Error;\n await sleep(this.#retryDelay * attempt, this.#abortSignal);\n }\n\n if (this.#abortSignal?.aborted)\n throw new Error(`Aborted`);\n }\n }\n\n throw lastError;\n }\n\n async ping(): Promise<LatencyResponse> {\n return await this.retryMechanism(async () => await this.pingCall());\n }\n\n async handshake(request: HandshakeRequest): Promise<HandshakeResponse> {\n return await this.retryMechanism(async () => await this.handshakeCall(request));\n }\n\n async sendChunk(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\n try {\n return await this.retryMechanism(async () => await this.sendChunkCall(request, chunkStreamProvider));\n }\n catch (error) {\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\n throw new FsError((error as Error).message);\n\n throw error;\n }\n finally {\n if (!chunkStreamProvider.isReleased)\n await chunkStreamProvider.release();\n }\n }\n\n private isWrappedCreatingFileReadStreamException(error: Error): boolean {\n return error.message === `CreatingFileReadStreamException`;\n }\n\n private async pingCall(): Promise<LatencyResponse> {\n const packetGuid = newGuid();\n\n const udpRequest = this.createPingRequest(packetGuid);\n\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\n }\n\n private createPingRequest(packetGuid: string): Buffer {\n const guidBytes = guidToBytes(packetGuid);\n return Buffer.concat([pingPrefix, guidBytes]);\n }\n\n private createLatencyResponse(sentTime: number, responseTime: number): LatencyResponse {\n return {\n latencyInMs: responseTime - sentTime,\n };\n }\n\n private async handshakeCall(request: HandshakeRequest): Promise<HandshakeResponse> {\n const packetGuid = newGuid();\n const sessionGuid = newGuid();\n const aesKey = this.generateAes256Key();\n\n const udpRequest = this.createHandshakeRequest(packetGuid, sessionGuid, aesKey, request);\n\n return await this.makeCall(udpRequest, packetGuid, () => this.createHandshakeResponse(sessionGuid, aesKey));\n }\n\n private generateAes256Key(): Buffer {\n return randomBytes(32);\n }\n\n private createHandshakeRequest(packetGuid: string, sessionGuid: string, aesKey: Buffer, request: HandshakeRequest) {\n const packetGuidBytes = guidToBytes(packetGuid);\n const sessionGuidBytes = guidToBytes(sessionGuid);\n const transferKeyBytes = guidToBytes(this.transferKeyToGuid(request.transferKey));\n const transferIdBytes = Buffer.from(request.transferId);\n\n const encryptableRequestPart = Buffer.concat([\n packetGuidBytes,\n sessionGuidBytes,\n transferKeyBytes,\n transferIdBytes,\n aesKey,\n ]);\n\n const encryptedRequestPart = this.publicRsaEncrypt(encryptableRequestPart);\n\n return Buffer.concat([handshakePrefix, encryptedRequestPart]);\n }\n\n private transferKeyToGuid(transferKey: string): string {\n return `${transferKey.slice(0, 8)}-${transferKey.slice(8, 12)}-${transferKey.slice(12, 16)}-${transferKey.slice(16, 20)}-${transferKey.slice(20)}`;\n }\n\n private publicRsaEncrypt(data: Buffer) {\n return publicEncrypt(filemailPublicKey, data);\n }\n\n private createHandshakeResponse(sessionGuid: string, aesKey: Buffer): HandshakeResponse {\n return {\n aesKey,\n sessionGuid,\n };\n }\n\n private async sendChunkCall(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\n const packetGuid = newGuid();\n\n const chunkReadStream = await chunkStreamProvider.getChunkReadStream();\n const chunkBytes = await this.readStreamToEnd(chunkReadStream);\n\n const udpRequest = this.createSendChunkRequest(packetGuid, request, chunkBytes);\n\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\n }\n\n private async readStreamToEnd(stream: ReadableStream | NodeReadableStream) {\n const reader = stream.getReader();\n\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done)\n break;\n\n if (value)\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\n const merged = new Uint8Array(totalLength);\n\n let offset = 0;\n\n for (const c of chunks) {\n merged.set(c, offset);\n offset += c.length;\n }\n\n return Buffer.from(merged);\n }\n\n private createSendChunkRequest(packetGuid: string, request: SendChunkRequest, chunkBytes: Buffer) {\n const fullDestinationFileNameString = path.posix.join(request.fileDestinationPathInTransfer, request.fileName);\n const fullDestinationFileName = Buffer.from(fullDestinationFileNameString);\n\n const fullDestinationFileNameLength = Buffer.alloc(2);\n fullDestinationFileNameLength.writeUint16BE(fullDestinationFileName.length);\n\n const fileSize = Buffer.alloc(8);\n fileSize.writeBigInt64BE(BigInt(request.fileSizeInBytes));\n\n const chunkStartPosition = Buffer.alloc(8);\n chunkStartPosition.writeBigInt64BE(BigInt(request.chunkStartPosition));\n\n const encryptableRequestPart = Buffer.concat([\n chunkDataPrefix,\n fullDestinationFileNameLength,\n fileSize,\n chunkStartPosition,\n fullDestinationFileName,\n chunkBytes,\n ]);\n\n const aesKey = Buffer.from(request.aesKey).subarray(0, 16); // .subarray directly on request.aesKey throws in Electron\n\n const { encryptedData, iv, authTag } = this.aesEncrypt(encryptableRequestPart, aesKey);\n\n const packetGuidBytes = guidToBytes(packetGuid);\n const sessionGuidBytes = guidToBytes(request.sessionGuid);\n\n return Buffer.concat([\n encryptedPrefix,\n packetGuidBytes,\n sessionGuidBytes,\n iv,\n authTag,\n encryptedData,\n ]);\n }\n\n private aesEncrypt(data: Buffer, aesKey: Buffer): { encryptedData: Buffer, iv: Buffer, authTag: Buffer } {\n const iv = randomBytes(12);\n\n const cipher = createCipheriv(`aes-128-gcm`, aesKey, iv);\n\n let encryptedData = cipher.update(data);\n encryptedData = Buffer.concat([encryptedData, cipher.final()]);\n\n const authTag = cipher.getAuthTag();\n\n return { encryptedData, iv, authTag };\n }\n\n private async makeCall<T>(request: string | readonly any[] | Uint8Array, packetGuid: string, createResponse?: (sentTime: number, responseTime: number, message: Buffer) => T): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const sentTime = new Date().getTime();\n\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(`Timeout`));\n }, this.#requestTimeout);\n\n const responseListener = (msg: Buffer) => {\n const responseTime = new Date().getTime();\n\n if (!this.isAckResponse(msg, packetGuid))\n return;\n\n cleanup();\n\n if (!createResponse)\n resolve(undefined as any);\n else {\n const response = createResponse(sentTime, responseTime, msg);\n resolve(response);\n }\n };\n\n this.addMessageListener(responseListener);\n\n const sendPromise = this.#udpClient.send(request);\n\n const errorAndAbortHandler = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const abortSignalListener = () => errorAndAbortHandler(new Error(`Aborted`));\n\n const cleanup = () => {\n this.removeMessageListener(responseListener);\n clearTimeout(timeout);\n this.#abortSignal?.removeEventListener(`abort`, abortSignalListener);\n };\n\n sendPromise.catch(error => errorAndAbortHandler(error));\n this.#abortSignal?.addEventListener(`abort`, abortSignalListener);\n });\n }\n\n private isAckResponse(msg: Buffer, guid: string) {\n try {\n if (!this.isAck(msg) || msg.length !== 18)\n return false;\n\n const responseGuid = bytesToGuid(msg, 2);\n\n return guid === responseGuid;\n }\n catch {\n return false;\n }\n }\n\n private isAck(msg: Buffer) {\n const prefix = msg.subarray(0, 2).toString(`utf8`);\n return prefix === `A1`;\n }\n}"]}
1
+ {"version":3,"file":"nodeFileServerUdpClient.js","sourceRoot":"","sources":["../../../../../src/uploader/api/node/nodeFileServerUdpClient.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport path from 'path';\nimport { clearTimeout } from 'timers';\nimport { publicEncrypt, randomBytes, createCipheriv } from 'crypto';\n\nimport type { RemoteInfo } from 'dgram';\nimport type { ReadableStream as NodeReadableStream } from \"stream/web\";\n\nimport UdpClient from 'promisified-udp-client';\nimport sleep from 'abortable-sleep';\n\nimport { v4 as newGuid, parse as guidToBytes, stringify as bytesToGuid } from 'uuid';\n\nimport FsError from '../../../utils/fileSystem/fsError.js';\n\nimport type LatencyResponse from \"../dtos/pingResponse.js\";\nimport type HandshakeRequest from '../dtos/handshakeRequest.js';\nimport type SendChunkRequest from '../dtos/sendChunkRequest.js';\nimport type FileServerUdpClient from '../fileServerUdpClient.js';\nimport type HandshakeResponse from '../dtos/handshakeResponse.js';\nimport type ChunkStreamProvider from '../../../utils/fileSystem/chunkStreamProvider.js';\n\nconst pingPrefix = Buffer.from(`P2`);\nconst handshakePrefix = Buffer.from(`H2`);\nconst chunkDataPrefix = Buffer.from(`D2`);\nconst encryptedPrefix = Buffer.from(`E2`);\n\nconst filemailPublicKey = `-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmW7lnKl2UN7gLrLjsIP\nWMMA2Nc8zROtwcGuumiN5bpw8ju/58MSE2DiYnGJKOVXxI2A52FgVK4I9hXKstwZ\n5Sotcf3BXw1wMusnHwVGYRsQob76EJKiqQODc/pLyLtRDiFRY5tgafkW0dU1X8AU\nkjtAawPp7ed/Z6DJaV2jWOQyJ9sCBXGhnNSExPOeSFvRKFM5vfurPXPXG4ii6tGU\nXaqjVeX5+b9dJFTJ2HzUSUxAkYUCS1y4E9jehlimM7gGTR0m7ISQa/bg1eE1X8iA\nD2DVevYVGqs9A6p+e/WJ2dMXU4XxBmfxWZe+szqgfU3wqvOmCS5JrGUKi6SAx8a5\nWQIDAQAB\n-----END PUBLIC KEY-----`;\n\nexport default class NodeFileServerUdpClient implements FileServerUdpClient {\n #address: string;\n #port: number;\n\n #requestTimeout: number;\n #retries: number;\n #retryDelay: number;\n\n #abortSignal?: AbortSignal;\n\n #udpClient: UdpClient;\n\n constructor(address: string, port: number, requestTimeout: number, retries: number, abortSignal?: AbortSignal, retryDelay: number = 1000) {\n this.#address = address;\n this.#port = port;\n this.#requestTimeout = requestTimeout;\n this.#retries = retries;\n this.#retryDelay = retryDelay;\n this.#abortSignal = abortSignal;\n\n this.#udpClient = new UdpClient(abortSignal);\n }\n\n addMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.addMessageListener(listener);\n }\n\n removeMessageListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.removeMessageListener(listener);\n }\n\n addErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.addErrorListener(listener);\n }\n\n removeErrorListener(listener: (msg: Buffer, rinfo: RemoteInfo) => void) {\n this.#udpClient.removeErrorListener(listener);\n }\n\n async connect(): Promise<void> {\n await this.#udpClient.connect(this.#port, this.#address);\n }\n\n async close(): Promise<void> {\n await this.#udpClient.close();\n }\n\n private async retryMechanism<T>(apiCall: () => Promise<T>): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.#retries; attempt++) {\n try {\n const result = await apiCall();\n return result;\n }\n catch (error) {\n if (attempt < this.#retries) {\n lastError = error as Error;\n await sleep(this.#retryDelay * attempt, this.#abortSignal);\n }\n\n if (this.#abortSignal?.aborted)\n throw new Error(`Aborted`);\n }\n }\n\n throw lastError;\n }\n\n async ping(): Promise<LatencyResponse> {\n return await this.retryMechanism(async () => await this.pingCall());\n }\n\n async handshake(request: HandshakeRequest): Promise<HandshakeResponse> {\n return await this.retryMechanism(async () => await this.handshakeCall(request));\n }\n\n async sendChunk(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\n try {\n return await this.retryMechanism(async () => await this.sendChunkCall(request, chunkStreamProvider));\n }\n catch (error) {\n if (this.isWrappedCreatingFileReadStreamException(error as Error))\n throw new FsError((error as Error).message);\n\n throw error;\n }\n finally {\n if (!chunkStreamProvider.isReleased)\n await chunkStreamProvider.release();\n }\n }\n\n private isWrappedCreatingFileReadStreamException(error: Error): boolean {\n return error.message === `CreatingFileReadStreamException`;\n }\n\n private async pingCall(): Promise<LatencyResponse> {\n const packetGuid = newGuid();\n\n const udpRequest = this.createPingRequest(packetGuid);\n\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\n }\n\n private createPingRequest(packetGuid: string): Buffer {\n const guidBytes = guidToBytes(packetGuid);\n return Buffer.concat([pingPrefix, guidBytes]);\n }\n\n private createLatencyResponse(sentTime: number, responseTime: number): LatencyResponse {\n return {\n latencyInMs: responseTime - sentTime,\n };\n }\n\n private async handshakeCall(request: HandshakeRequest): Promise<HandshakeResponse> {\n const packetGuid = newGuid();\n const sessionGuid = newGuid();\n const aesKey = this.generateAes256Key();\n\n const udpRequest = this.createHandshakeRequest(packetGuid, sessionGuid, aesKey, request);\n\n return await this.makeCall(udpRequest, packetGuid, () => this.createHandshakeResponse(sessionGuid, aesKey));\n }\n\n private generateAes256Key(): Buffer {\n return randomBytes(32);\n }\n\n private createHandshakeRequest(packetGuid: string, sessionGuid: string, aesKey: Buffer, request: HandshakeRequest) {\n const packetGuidBytes = guidToBytes(packetGuid);\n const sessionGuidBytes = guidToBytes(sessionGuid);\n const transferKeyBytes = guidToBytes(this.transferKeyToGuid(request.transferKey));\n const transferIdBytes = Buffer.from(request.transferId);\n\n const encryptableRequestPart = Buffer.concat([\n packetGuidBytes,\n sessionGuidBytes,\n transferKeyBytes,\n transferIdBytes,\n aesKey,\n ]);\n\n const encryptedRequestPart = this.publicRsaEncrypt(encryptableRequestPart);\n\n return Buffer.concat([handshakePrefix, encryptedRequestPart]);\n }\n\n private transferKeyToGuid(transferKey: string): string {\n return `${transferKey.slice(0, 8)}-${transferKey.slice(8, 12)}-${transferKey.slice(12, 16)}-${transferKey.slice(16, 20)}-${transferKey.slice(20)}`;\n }\n\n private publicRsaEncrypt(data: Buffer) {\n return publicEncrypt(filemailPublicKey, data);\n }\n\n private createHandshakeResponse(sessionGuid: string, aesKey: Buffer): HandshakeResponse {\n return {\n aesKey,\n sessionGuid,\n };\n }\n\n private async sendChunkCall(request: SendChunkRequest, chunkStreamProvider: ChunkStreamProvider): Promise<LatencyResponse> {\n const packetGuid = newGuid();\n\n const chunkReadStream = await chunkStreamProvider.getChunkReadStream(undefined, this.#abortSignal);\n const chunkBytes = await this.readStreamToEnd(chunkReadStream);\n\n const udpRequest = this.createSendChunkRequest(packetGuid, request, chunkBytes);\n\n return await this.makeCall(udpRequest, packetGuid, (sentTime, responseTime) => this.createLatencyResponse(sentTime, responseTime));\n }\n\n private async readStreamToEnd(stream: ReadableStream | NodeReadableStream) {\n const reader = stream.getReader();\n\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done)\n break;\n\n if (value)\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\n const merged = new Uint8Array(totalLength);\n\n let offset = 0;\n\n for (const c of chunks) {\n merged.set(c, offset);\n offset += c.length;\n }\n\n return Buffer.from(merged);\n }\n\n private createSendChunkRequest(packetGuid: string, request: SendChunkRequest, chunkBytes: Buffer) {\n const fullDestinationFileNameString = path.posix.join(request.fileDestinationPathInTransfer, request.fileName);\n const fullDestinationFileName = Buffer.from(fullDestinationFileNameString);\n\n const fullDestinationFileNameLength = Buffer.alloc(2);\n fullDestinationFileNameLength.writeUint16BE(fullDestinationFileName.length);\n\n const fileSize = Buffer.alloc(8);\n fileSize.writeBigInt64BE(BigInt(request.fileSizeInBytes));\n\n const chunkStartPosition = Buffer.alloc(8);\n chunkStartPosition.writeBigInt64BE(BigInt(request.chunkStartPosition));\n\n const encryptableRequestPart = Buffer.concat([\n chunkDataPrefix,\n fullDestinationFileNameLength,\n fileSize,\n chunkStartPosition,\n fullDestinationFileName,\n chunkBytes,\n ]);\n\n const aesKey = Buffer.from(request.aesKey).subarray(0, 16); // .subarray directly on request.aesKey throws in Electron\n\n const { encryptedData, iv, authTag } = this.aesEncrypt(encryptableRequestPart, aesKey);\n\n const packetGuidBytes = guidToBytes(packetGuid);\n const sessionGuidBytes = guidToBytes(request.sessionGuid);\n\n return Buffer.concat([\n encryptedPrefix,\n packetGuidBytes,\n sessionGuidBytes,\n iv,\n authTag,\n encryptedData,\n ]);\n }\n\n private aesEncrypt(data: Buffer, aesKey: Buffer): { encryptedData: Buffer, iv: Buffer, authTag: Buffer } {\n const iv = randomBytes(12);\n\n const cipher = createCipheriv(`aes-128-gcm`, aesKey, iv);\n\n let encryptedData = cipher.update(data);\n encryptedData = Buffer.concat([encryptedData, cipher.final()]);\n\n const authTag = cipher.getAuthTag();\n\n return { encryptedData, iv, authTag };\n }\n\n private async makeCall<T>(request: string | readonly any[] | Uint8Array, packetGuid: string, createResponse?: (sentTime: number, responseTime: number, message: Buffer) => T): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const sentTime = new Date().getTime();\n\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(`Timeout`));\n }, this.#requestTimeout);\n\n const responseListener = (msg: Buffer) => {\n const responseTime = new Date().getTime();\n\n if (!this.isAckResponse(msg, packetGuid))\n return;\n\n cleanup();\n\n if (!createResponse)\n resolve(undefined as any);\n else {\n const response = createResponse(sentTime, responseTime, msg);\n resolve(response);\n }\n };\n\n this.addMessageListener(responseListener);\n\n const sendPromise = this.#udpClient.send(request);\n\n const errorAndAbortHandler = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const abortSignalListener = () => errorAndAbortHandler(new Error(`Aborted`));\n\n const cleanup = () => {\n this.removeMessageListener(responseListener);\n clearTimeout(timeout);\n this.#abortSignal?.removeEventListener(`abort`, abortSignalListener);\n };\n\n sendPromise.catch(error => errorAndAbortHandler(error));\n this.#abortSignal?.addEventListener(`abort`, abortSignalListener);\n });\n }\n\n private isAckResponse(msg: Buffer, guid: string) {\n try {\n if (!this.isAck(msg) || msg.length !== 18)\n return false;\n\n const responseGuid = bytesToGuid(msg, 2);\n\n return guid === responseGuid;\n }\n catch {\n return false;\n }\n }\n\n private isAck(msg: Buffer) {\n const prefix = msg.subarray(0, 2).toString(`utf8`);\n return prefix === `A1`;\n }\n}"]}
@@ -56,14 +56,14 @@ export default class NodeFileServerUploadClient extends NodeFileServerClientBase
56
56
  /* eslint-disable no-param-reassign */
57
57
  if (!isRetry)
58
58
  return;
59
- const readableStream = await chunkStreamProvider.getChunkReadStream(pauseSignal);
59
+ const readableStream = await chunkStreamProvider.getChunkReadStream(pauseSignal, abortSignal);
60
60
  options.body = Readable.fromWeb(readableStream);
61
61
  },
62
62
  ],
63
63
  },
64
64
  });
65
- const md5checksum = await chunkStreamProvider.getMd5Checksum(`base64`, pauseSignal);
66
- const readableStream = await chunkStreamProvider.getChunkReadStream(pauseSignal);
65
+ const md5checksum = await chunkStreamProvider.getMd5Checksum(`base64`, pauseSignal, abortSignal);
66
+ const readableStream = await chunkStreamProvider.getChunkReadStream(pauseSignal, abortSignal);
67
67
  const body = Readable.fromWeb(readableStream);
68
68
  ongoingRequestPromise = gotChunkInstance.post(this.#uploadUrl, {
69
69
  body,