electron-updater 4.3.8 → 4.3.9

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 (68) hide show
  1. package/LICENSE +22 -0
  2. package/out/AppAdapter.js +19 -28
  3. package/out/AppAdapter.js.map +1 -1
  4. package/out/AppImageUpdater.js +103 -195
  5. package/out/AppImageUpdater.js.map +1 -1
  6. package/out/AppUpdater.d.ts +1 -1
  7. package/out/AppUpdater.js +517 -771
  8. package/out/AppUpdater.js.map +1 -1
  9. package/out/BaseUpdater.js +79 -103
  10. package/out/BaseUpdater.js.map +1 -1
  11. package/out/DownloadedUpdateHelper.js +150 -223
  12. package/out/DownloadedUpdateHelper.js.map +1 -1
  13. package/out/ElectronAppAdapter.js +35 -63
  14. package/out/ElectronAppAdapter.js.map +1 -1
  15. package/out/MacUpdater.js +132 -201
  16. package/out/MacUpdater.js.map +1 -1
  17. package/out/NoOpLogger.d.ts +6 -0
  18. package/out/NoOpLogger.js +19 -0
  19. package/out/NoOpLogger.js.map +1 -0
  20. package/out/NsisUpdater.js +199 -345
  21. package/out/NsisUpdater.js.map +1 -1
  22. package/out/differentialDownloader/DataSplitter.js +180 -252
  23. package/out/differentialDownloader/DataSplitter.js.map +1 -1
  24. package/out/differentialDownloader/DifferentialDownloader.d.ts +1 -1
  25. package/out/differentialDownloader/DifferentialDownloader.js +242 -355
  26. package/out/differentialDownloader/DifferentialDownloader.js.map +1 -1
  27. package/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js +29 -65
  28. package/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js.map +1 -1
  29. package/out/differentialDownloader/GenericDifferentialDownloader.js +7 -21
  30. package/out/differentialDownloader/GenericDifferentialDownloader.js.map +1 -1
  31. package/out/differentialDownloader/ProgressDifferentialDownloadCallbackTransform.js +79 -107
  32. package/out/differentialDownloader/ProgressDifferentialDownloadCallbackTransform.js.map +1 -1
  33. package/out/differentialDownloader/downloadPlanBuilder.js +99 -123
  34. package/out/differentialDownloader/downloadPlanBuilder.js.map +1 -1
  35. package/out/differentialDownloader/multipleRangeDownloader.js +99 -148
  36. package/out/differentialDownloader/multipleRangeDownloader.js.map +1 -1
  37. package/out/electronHttpExecutor.js +73 -106
  38. package/out/electronHttpExecutor.js.map +1 -1
  39. package/out/event.d.ts +35 -0
  40. package/out/event.js +39 -0
  41. package/out/event.js.map +1 -0
  42. package/out/log.d.ts +11 -0
  43. package/out/log.js +19 -0
  44. package/out/log.js.map +1 -0
  45. package/out/main.d.ts +1 -3
  46. package/out/main.js +60 -196
  47. package/out/main.js.map +1 -1
  48. package/out/providerFactory.js +49 -105
  49. package/out/providerFactory.js.map +1 -1
  50. package/out/providers/BintrayProvider.d.ts +2 -2
  51. package/out/providers/BintrayProvider.js +40 -95
  52. package/out/providers/BintrayProvider.js.map +1 -1
  53. package/out/providers/GenericProvider.d.ts +2 -2
  54. package/out/providers/GenericProvider.js +46 -80
  55. package/out/providers/GenericProvider.js.map +1 -1
  56. package/out/providers/GitHubProvider.d.ts +2 -2
  57. package/out/providers/GitHubProvider.js +122 -201
  58. package/out/providers/GitHubProvider.js.map +1 -1
  59. package/out/providers/PrivateGitHubProvider.js +87 -165
  60. package/out/providers/PrivateGitHubProvider.js.map +1 -1
  61. package/out/providers/Provider.js +122 -173
  62. package/out/providers/Provider.js.map +1 -1
  63. package/out/util.d.ts +5 -0
  64. package/out/util.js +42 -0
  65. package/out/util.js.map +1 -0
  66. package/out/windowsExecutableCodeSignatureVerifier.js +99 -139
  67. package/out/windowsExecutableCodeSignatureVerifier.js.map +1 -1
  68. package/package.json +33 -31
@@ -1,138 +1,114 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.computeOperations = computeOperations;
7
- exports.OperationKind = void 0;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeOperations = exports.OperationKind = void 0;
8
4
  var OperationKind;
9
- exports.OperationKind = OperationKind;
10
-
11
5
  (function (OperationKind) {
12
- OperationKind[OperationKind["COPY"] = 0] = "COPY";
13
- OperationKind[OperationKind["DOWNLOAD"] = 1] = "DOWNLOAD";
14
- })(OperationKind || (exports.OperationKind = OperationKind = {}));
15
-
6
+ OperationKind[OperationKind["COPY"] = 0] = "COPY";
7
+ OperationKind[OperationKind["DOWNLOAD"] = 1] = "DOWNLOAD";
8
+ })(OperationKind = exports.OperationKind || (exports.OperationKind = {}));
16
9
  function computeOperations(oldBlockMap, newBlockMap, logger) {
17
- const nameToOldBlocks = buildBlockFileMap(oldBlockMap.files);
18
- const nameToNewBlocks = buildBlockFileMap(newBlockMap.files);
19
- let lastOperation = null; // for now only one file is supported in block map
20
-
21
- const blockMapFile = newBlockMap.files[0];
22
- const operations = [];
23
- const name = blockMapFile.name;
24
- const oldEntry = nameToOldBlocks.get(name);
25
-
26
- if (oldEntry == null) {
27
- // new file (unrealistic case for now, because in any case both blockmap contain the only file named as "file")
28
- throw new Error(`no file ${name} in old blockmap`);
29
- }
30
-
31
- const newFile = nameToNewBlocks.get(name);
32
- let changedBlockCount = 0;
33
- const {
34
- checksumToOffset: checksumToOldOffset,
35
- checksumToOldSize
36
- } = buildChecksumMap(nameToOldBlocks.get(name), oldEntry.offset, logger);
37
- let newOffset = blockMapFile.offset;
38
-
39
- for (let i = 0; i < newFile.checksums.length; newOffset += newFile.sizes[i], i++) {
40
- const blockSize = newFile.sizes[i];
41
- const checksum = newFile.checksums[i];
42
- let oldOffset = checksumToOldOffset.get(checksum);
43
-
44
- if (oldOffset != null && checksumToOldSize.get(checksum) !== blockSize) {
45
- logger.warn(`Checksum ("${checksum}") matches, but size differs (old: ${checksumToOldSize.get(checksum)}, new: ${blockSize})`);
46
- oldOffset = undefined;
10
+ const nameToOldBlocks = buildBlockFileMap(oldBlockMap.files);
11
+ const nameToNewBlocks = buildBlockFileMap(newBlockMap.files);
12
+ let lastOperation = null;
13
+ // for now only one file is supported in block map
14
+ const blockMapFile = newBlockMap.files[0];
15
+ const operations = [];
16
+ const name = blockMapFile.name;
17
+ const oldEntry = nameToOldBlocks.get(name);
18
+ if (oldEntry == null) {
19
+ // new file (unrealistic case for now, because in any case both blockmap contain the only file named as "file")
20
+ throw new Error(`no file ${name} in old blockmap`);
21
+ }
22
+ const newFile = nameToNewBlocks.get(name);
23
+ let changedBlockCount = 0;
24
+ const { checksumToOffset: checksumToOldOffset, checksumToOldSize } = buildChecksumMap(nameToOldBlocks.get(name), oldEntry.offset, logger);
25
+ let newOffset = blockMapFile.offset;
26
+ for (let i = 0; i < newFile.checksums.length; newOffset += newFile.sizes[i], i++) {
27
+ const blockSize = newFile.sizes[i];
28
+ const checksum = newFile.checksums[i];
29
+ let oldOffset = checksumToOldOffset.get(checksum);
30
+ if (oldOffset != null && checksumToOldSize.get(checksum) !== blockSize) {
31
+ logger.warn(`Checksum ("${checksum}") matches, but size differs (old: ${checksumToOldSize.get(checksum)}, new: ${blockSize})`);
32
+ oldOffset = undefined;
33
+ }
34
+ if (oldOffset === undefined) {
35
+ // download data from new file
36
+ changedBlockCount++;
37
+ if (lastOperation != null && lastOperation.kind === OperationKind.DOWNLOAD && lastOperation.end === newOffset) {
38
+ lastOperation.end += blockSize;
39
+ }
40
+ else {
41
+ lastOperation = {
42
+ kind: OperationKind.DOWNLOAD,
43
+ start: newOffset,
44
+ end: newOffset + blockSize,
45
+ // oldBlocks: null,
46
+ };
47
+ validateAndAdd(lastOperation, operations, checksum, i);
48
+ }
49
+ }
50
+ else {
51
+ // reuse data from old file
52
+ if (lastOperation != null && lastOperation.kind === OperationKind.COPY && lastOperation.end === oldOffset) {
53
+ lastOperation.end += blockSize;
54
+ // lastOperation.oldBlocks!!.push(checksum)
55
+ }
56
+ else {
57
+ lastOperation = {
58
+ kind: OperationKind.COPY,
59
+ start: oldOffset,
60
+ end: oldOffset + blockSize,
61
+ // oldBlocks: [checksum]
62
+ };
63
+ validateAndAdd(lastOperation, operations, checksum, i);
64
+ }
65
+ }
47
66
  }
48
-
49
- if (oldOffset === undefined) {
50
- // download data from new file
51
- changedBlockCount++;
52
-
53
- if (lastOperation != null && lastOperation.kind === OperationKind.DOWNLOAD && lastOperation.end === newOffset) {
54
- lastOperation.end += blockSize;
55
- } else {
56
- lastOperation = {
57
- kind: OperationKind.DOWNLOAD,
58
- start: newOffset,
59
- end: newOffset + blockSize
60
- };
61
- validateAndAdd(lastOperation, operations, checksum, i);
62
- }
63
- } else {
64
- // reuse data from old file
65
- if (lastOperation != null && lastOperation.kind === OperationKind.COPY && lastOperation.end === oldOffset) {
66
- lastOperation.end += blockSize; // lastOperation.oldBlocks!!.push(checksum)
67
- } else {
68
- lastOperation = {
69
- kind: OperationKind.COPY,
70
- start: oldOffset,
71
- end: oldOffset + blockSize
72
- };
73
- validateAndAdd(lastOperation, operations, checksum, i);
74
- }
67
+ if (changedBlockCount > 0) {
68
+ logger.info(`File${blockMapFile.name === "file" ? "" : " " + blockMapFile.name} has ${changedBlockCount} changed blocks`);
75
69
  }
76
- }
77
-
78
- if (changedBlockCount > 0) {
79
- logger.info(`File${blockMapFile.name === "file" ? "" : " " + blockMapFile.name} has ${changedBlockCount} changed blocks`);
80
- }
81
-
82
- return operations;
70
+ return operations;
83
71
  }
84
-
72
+ exports.computeOperations = computeOperations;
85
73
  const isValidateOperationRange = process.env.DIFFERENTIAL_DOWNLOAD_PLAN_BUILDER_VALIDATE_RANGES === "true";
86
-
87
74
  function validateAndAdd(operation, operations, checksum, index) {
88
- if (isValidateOperationRange && operations.length !== 0) {
89
- const lastOperation = operations[operations.length - 1];
90
-
91
- if (lastOperation.kind === operation.kind && operation.start < lastOperation.end && operation.start > lastOperation.start) {
92
- const min = [lastOperation.start, lastOperation.end, operation.start, operation.end].reduce((p, v) => p < v ? p : v);
93
- throw new Error(`operation (block index: ${index}, checksum: ${checksum}, kind: ${OperationKind[operation.kind]}) overlaps previous operation (checksum: ${checksum}):\n` + `abs: ${lastOperation.start} until ${lastOperation.end} and ${operation.start} until ${operation.end}\n` + `rel: ${lastOperation.start - min} until ${lastOperation.end - min} and ${operation.start - min} until ${operation.end - min}`);
75
+ if (isValidateOperationRange && operations.length !== 0) {
76
+ const lastOperation = operations[operations.length - 1];
77
+ if (lastOperation.kind === operation.kind && operation.start < lastOperation.end && operation.start > lastOperation.start) {
78
+ const min = [lastOperation.start, lastOperation.end, operation.start, operation.end].reduce((p, v) => (p < v ? p : v));
79
+ throw new Error(`operation (block index: ${index}, checksum: ${checksum}, kind: ${OperationKind[operation.kind]}) overlaps previous operation (checksum: ${checksum}):\n` +
80
+ `abs: ${lastOperation.start} until ${lastOperation.end} and ${operation.start} until ${operation.end}\n` +
81
+ `rel: ${lastOperation.start - min} until ${lastOperation.end - min} and ${operation.start - min} until ${operation.end - min}`);
82
+ }
94
83
  }
95
- }
96
-
97
- operations.push(operation);
98
- } // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
99
-
100
-
84
+ operations.push(operation);
85
+ }
86
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
101
87
  function buildChecksumMap(file, fileOffset, logger) {
102
- const checksumToOffset = new Map();
103
- const checksumToSize = new Map();
104
- let offset = fileOffset;
105
-
106
- for (let i = 0; i < file.checksums.length; i++) {
107
- const checksum = file.checksums[i];
108
- const size = file.sizes[i];
109
- const existing = checksumToSize.get(checksum);
110
-
111
- if (existing === undefined) {
112
- checksumToOffset.set(checksum, offset);
113
- checksumToSize.set(checksum, size);
114
- } else if (logger.debug != null) {
115
- const sizeExplanation = existing === size ? "(same size)" : `(size: ${existing}, this size: ${size})`;
116
- logger.debug(`${checksum} duplicated in blockmap ${sizeExplanation}, it doesn't lead to broken differential downloader, just corresponding block will be skipped)`);
88
+ const checksumToOffset = new Map();
89
+ const checksumToSize = new Map();
90
+ let offset = fileOffset;
91
+ for (let i = 0; i < file.checksums.length; i++) {
92
+ const checksum = file.checksums[i];
93
+ const size = file.sizes[i];
94
+ const existing = checksumToSize.get(checksum);
95
+ if (existing === undefined) {
96
+ checksumToOffset.set(checksum, offset);
97
+ checksumToSize.set(checksum, size);
98
+ }
99
+ else if (logger.debug != null) {
100
+ const sizeExplanation = existing === size ? "(same size)" : `(size: ${existing}, this size: ${size})`;
101
+ logger.debug(`${checksum} duplicated in blockmap ${sizeExplanation}, it doesn't lead to broken differential downloader, just corresponding block will be skipped)`);
102
+ }
103
+ offset += size;
117
104
  }
118
-
119
- offset += size;
120
- }
121
-
122
- return {
123
- checksumToOffset,
124
- checksumToOldSize: checksumToSize
125
- };
105
+ return { checksumToOffset, checksumToOldSize: checksumToSize };
126
106
  }
127
-
128
107
  function buildBlockFileMap(list) {
129
- const result = new Map();
130
-
131
- for (const item of list) {
132
- result.set(item.name, item);
133
- }
134
-
135
- return result;
136
- }
137
- // __ts-babel@6.0.4
108
+ const result = new Map();
109
+ for (const item of list) {
110
+ result.set(item.name, item);
111
+ }
112
+ return result;
113
+ }
138
114
  //# sourceMappingURL=downloadPlanBuilder.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/differentialDownloader/downloadPlanBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { BlockMap, BlockMapFile } from \"builder-util-runtime/out/blockMapApi\"\nimport { Logger } from \"../main\"\n\nexport enum OperationKind {\n COPY, DOWNLOAD\n}\n\nexport interface Operation {\n kind: OperationKind\n\n // inclusive\n start: number\n // exclusive\n end: number\n\n // debug only\n // oldBlocks: Array<string> | null\n}\n\nexport function computeOperations(oldBlockMap: BlockMap, newBlockMap: BlockMap, logger: Logger): Array<Operation> {\n const nameToOldBlocks = buildBlockFileMap(oldBlockMap.files)\n const nameToNewBlocks = buildBlockFileMap(newBlockMap.files)\n\n let lastOperation: Operation | null = null\n\n // for now only one file is supported in block map\n const blockMapFile = newBlockMap.files[0]\n const operations: Array<Operation> = []\n const name = blockMapFile.name\n const oldEntry = nameToOldBlocks.get(name)\n if (oldEntry == null) {\n // new file (unrealistic case for now, because in any case both blockmap contain the only file named as \"file\")\n throw new Error(`no file ${name} in old blockmap`)\n }\n\n const newFile = nameToNewBlocks.get(name)!!\n let changedBlockCount = 0\n\n const {checksumToOffset: checksumToOldOffset, checksumToOldSize} = buildChecksumMap(nameToOldBlocks.get(name)!!, oldEntry.offset, logger)\n\n let newOffset = blockMapFile.offset\n for (let i = 0; i < newFile.checksums.length; newOffset += newFile.sizes[i], i++) {\n const blockSize = newFile.sizes[i]\n const checksum = newFile.checksums[i]\n let oldOffset = checksumToOldOffset.get(checksum)\n if (oldOffset != null && checksumToOldSize.get(checksum) !== blockSize) {\n logger.warn(`Checksum (\"${checksum}\") matches, but size differs (old: ${checksumToOldSize.get(checksum)}, new: ${blockSize})`)\n oldOffset = undefined\n }\n\n if (oldOffset === undefined) {\n // download data from new file\n changedBlockCount++\n\n if (lastOperation != null && lastOperation.kind === OperationKind.DOWNLOAD && lastOperation.end === newOffset) {\n lastOperation.end += blockSize\n }\n else {\n lastOperation = {\n kind: OperationKind.DOWNLOAD,\n start: newOffset,\n end: newOffset + blockSize,\n // oldBlocks: null,\n }\n validateAndAdd(lastOperation, operations, checksum, i)\n }\n }\n else {\n // reuse data from old file\n if (lastOperation != null && lastOperation.kind === OperationKind.COPY && lastOperation.end === oldOffset) {\n lastOperation.end += blockSize\n // lastOperation.oldBlocks!!.push(checksum)\n }\n else {\n lastOperation = {\n kind: OperationKind.COPY,\n start: oldOffset,\n end: oldOffset + blockSize,\n // oldBlocks: [checksum]\n }\n validateAndAdd(lastOperation, operations, checksum, i)\n }\n }\n }\n\n if (changedBlockCount > 0) {\n logger.info(`File${blockMapFile.name === \"file\" ? \"\" : (\" \" + blockMapFile.name)} has ${changedBlockCount} changed blocks`)\n }\n return operations\n}\n\nconst isValidateOperationRange = process.env.DIFFERENTIAL_DOWNLOAD_PLAN_BUILDER_VALIDATE_RANGES === \"true\"\n\nfunction validateAndAdd(operation: Operation, operations: Array<Operation>, checksum: string, index: number): void {\n if (isValidateOperationRange && operations.length !== 0) {\n const lastOperation = operations[operations.length - 1]\n if (lastOperation.kind === operation.kind && operation.start < lastOperation.end && operation.start > lastOperation.start) {\n const min = [lastOperation.start, lastOperation.end, operation.start, operation.end].reduce((p, v) => p < v ? p : v)\n throw new Error(`operation (block index: ${index}, checksum: ${checksum}, kind: ${OperationKind[operation.kind]}) overlaps previous operation (checksum: ${checksum}):\\n` +\n `abs: ${lastOperation.start} until ${lastOperation.end} and ${operation.start} until ${operation.end}\\n` +\n `rel: ${lastOperation.start - min} until ${lastOperation.end - min} and ${operation.start - min} until ${operation.end - min}`\n )\n }\n }\n operations.push(operation)\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction buildChecksumMap(file: BlockMapFile, fileOffset: number, logger: Logger) {\n const checksumToOffset = new Map<string, number>()\n const checksumToSize = new Map<string, number>()\n let offset = fileOffset\n for (let i = 0; i < file.checksums.length; i++) {\n const checksum = file.checksums[i]\n const size = file.sizes[i]\n\n const existing = checksumToSize.get(checksum)\n if (existing === undefined) {\n checksumToOffset.set(checksum, offset)\n checksumToSize.set(checksum, size)\n }\n else if (logger.debug != null) {\n const sizeExplanation = existing === size ? \"(same size)\" : `(size: ${existing}, this size: ${size})`\n logger.debug(`${checksum} duplicated in blockmap ${sizeExplanation}, it doesn't lead to broken differential downloader, just corresponding block will be skipped)`)\n }\n offset += size\n }\n return {checksumToOffset, checksumToOldSize: checksumToSize}\n}\n\nfunction buildBlockFileMap(list: Array<BlockMapFile>): Map<string, BlockMapFile> {\n const result = new Map<string, BlockMapFile>()\n for (const item of list) {\n result.set(item.name, item)\n }\n return result\n}\n"],"sourceRoot":""}
1
+ {"version":3,"file":"downloadPlanBuilder.js","sourceRoot":"","sources":["../../src/differentialDownloader/downloadPlanBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { BlockMap, BlockMapFile } from \"builder-util-runtime/out/blockMapApi\"\nimport { Logger } from \"../main\"\n\nexport enum OperationKind {\n COPY,\n DOWNLOAD,\n}\n\nexport interface Operation {\n kind: OperationKind\n\n // inclusive\n start: number\n // exclusive\n end: number\n\n // debug only\n // oldBlocks: Array<string> | null\n}\n\nexport function computeOperations(oldBlockMap: BlockMap, newBlockMap: BlockMap, logger: Logger): Array<Operation> {\n const nameToOldBlocks = buildBlockFileMap(oldBlockMap.files)\n const nameToNewBlocks = buildBlockFileMap(newBlockMap.files)\n\n let lastOperation: Operation | null = null\n\n // for now only one file is supported in block map\n const blockMapFile = newBlockMap.files[0]\n const operations: Array<Operation> = []\n const name = blockMapFile.name\n const oldEntry = nameToOldBlocks.get(name)\n if (oldEntry == null) {\n // new file (unrealistic case for now, because in any case both blockmap contain the only file named as \"file\")\n throw new Error(`no file ${name} in old blockmap`)\n }\n\n const newFile = nameToNewBlocks.get(name)!\n let changedBlockCount = 0\n\n const { checksumToOffset: checksumToOldOffset, checksumToOldSize } = buildChecksumMap(nameToOldBlocks.get(name)!, oldEntry.offset, logger)\n\n let newOffset = blockMapFile.offset\n for (let i = 0; i < newFile.checksums.length; newOffset += newFile.sizes[i], i++) {\n const blockSize = newFile.sizes[i]\n const checksum = newFile.checksums[i]\n let oldOffset = checksumToOldOffset.get(checksum)\n if (oldOffset != null && checksumToOldSize.get(checksum) !== blockSize) {\n logger.warn(`Checksum (\"${checksum}\") matches, but size differs (old: ${checksumToOldSize.get(checksum)}, new: ${blockSize})`)\n oldOffset = undefined\n }\n\n if (oldOffset === undefined) {\n // download data from new file\n changedBlockCount++\n\n if (lastOperation != null && lastOperation.kind === OperationKind.DOWNLOAD && lastOperation.end === newOffset) {\n lastOperation.end += blockSize\n } else {\n lastOperation = {\n kind: OperationKind.DOWNLOAD,\n start: newOffset,\n end: newOffset + blockSize,\n // oldBlocks: null,\n }\n validateAndAdd(lastOperation, operations, checksum, i)\n }\n } else {\n // reuse data from old file\n if (lastOperation != null && lastOperation.kind === OperationKind.COPY && lastOperation.end === oldOffset) {\n lastOperation.end += blockSize\n // lastOperation.oldBlocks!!.push(checksum)\n } else {\n lastOperation = {\n kind: OperationKind.COPY,\n start: oldOffset,\n end: oldOffset + blockSize,\n // oldBlocks: [checksum]\n }\n validateAndAdd(lastOperation, operations, checksum, i)\n }\n }\n }\n\n if (changedBlockCount > 0) {\n logger.info(`File${blockMapFile.name === \"file\" ? \"\" : \" \" + blockMapFile.name} has ${changedBlockCount} changed blocks`)\n }\n return operations\n}\n\nconst isValidateOperationRange = process.env.DIFFERENTIAL_DOWNLOAD_PLAN_BUILDER_VALIDATE_RANGES === \"true\"\n\nfunction validateAndAdd(operation: Operation, operations: Array<Operation>, checksum: string, index: number): void {\n if (isValidateOperationRange && operations.length !== 0) {\n const lastOperation = operations[operations.length - 1]\n if (lastOperation.kind === operation.kind && operation.start < lastOperation.end && operation.start > lastOperation.start) {\n const min = [lastOperation.start, lastOperation.end, operation.start, operation.end].reduce((p, v) => (p < v ? p : v))\n throw new Error(\n `operation (block index: ${index}, checksum: ${checksum}, kind: ${OperationKind[operation.kind]}) overlaps previous operation (checksum: ${checksum}):\\n` +\n `abs: ${lastOperation.start} until ${lastOperation.end} and ${operation.start} until ${operation.end}\\n` +\n `rel: ${lastOperation.start - min} until ${lastOperation.end - min} and ${operation.start - min} until ${operation.end - min}`\n )\n }\n }\n operations.push(operation)\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction buildChecksumMap(file: BlockMapFile, fileOffset: number, logger: Logger) {\n const checksumToOffset = new Map<string, number>()\n const checksumToSize = new Map<string, number>()\n let offset = fileOffset\n for (let i = 0; i < file.checksums.length; i++) {\n const checksum = file.checksums[i]\n const size = file.sizes[i]\n\n const existing = checksumToSize.get(checksum)\n if (existing === undefined) {\n checksumToOffset.set(checksum, offset)\n checksumToSize.set(checksum, size)\n } else if (logger.debug != null) {\n const sizeExplanation = existing === size ? \"(same size)\" : `(size: ${existing}, this size: ${size})`\n logger.debug(`${checksum} duplicated in blockmap ${sizeExplanation}, it doesn't lead to broken differential downloader, just corresponding block will be skipped)`)\n }\n offset += size\n }\n return { checksumToOffset, checksumToOldSize: checksumToSize }\n}\n\nfunction buildBlockFileMap(list: Array<BlockMapFile>): Map<string, BlockMapFile> {\n const result = new Map<string, BlockMapFile>()\n for (const item of list) {\n result.set(item.name, item)\n }\n return result\n}\n"]}
@@ -1,161 +1,112 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.executeTasksUsingMultipleRangeRequests = executeTasksUsingMultipleRangeRequests;
7
- exports.checkIsRangesSupported = checkIsRangesSupported;
8
-
9
- function _builderUtilRuntime() {
10
- const data = require("builder-util-runtime");
11
-
12
- _builderUtilRuntime = function () {
13
- return data;
14
- };
15
-
16
- return data;
17
- }
18
-
19
- function _DataSplitter() {
20
- const data = require("./DataSplitter");
21
-
22
- _DataSplitter = function () {
23
- return data;
24
- };
25
-
26
- return data;
27
- }
28
-
29
- function _downloadPlanBuilder() {
30
- const data = require("./downloadPlanBuilder");
31
-
32
- _downloadPlanBuilder = function () {
33
- return data;
34
- };
35
-
36
- return data;
37
- }
38
-
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkIsRangesSupported = exports.executeTasksUsingMultipleRangeRequests = void 0;
4
+ const builder_util_runtime_1 = require("builder-util-runtime");
5
+ const DataSplitter_1 = require("./DataSplitter");
6
+ const downloadPlanBuilder_1 = require("./downloadPlanBuilder");
39
7
  function executeTasksUsingMultipleRangeRequests(differentialDownloader, tasks, out, oldFileFd, reject) {
40
- const w = taskOffset => {
41
- if (taskOffset >= tasks.length) {
42
- if (differentialDownloader.fileMetadataBuffer != null) {
43
- out.write(differentialDownloader.fileMetadataBuffer);
44
- }
45
-
46
- out.end();
47
- return;
48
- }
49
-
50
- const nextOffset = taskOffset + 1000;
51
- doExecuteTasks(differentialDownloader, {
52
- tasks,
53
- start: taskOffset,
54
- end: Math.min(tasks.length, nextOffset),
55
- oldFileFd
56
- }, out, () => w(nextOffset), reject);
57
- };
58
-
59
- return w;
8
+ const w = (taskOffset) => {
9
+ if (taskOffset >= tasks.length) {
10
+ if (differentialDownloader.fileMetadataBuffer != null) {
11
+ out.write(differentialDownloader.fileMetadataBuffer);
12
+ }
13
+ out.end();
14
+ return;
15
+ }
16
+ const nextOffset = taskOffset + 1000;
17
+ doExecuteTasks(differentialDownloader, {
18
+ tasks,
19
+ start: taskOffset,
20
+ end: Math.min(tasks.length, nextOffset),
21
+ oldFileFd,
22
+ }, out, () => w(nextOffset), reject);
23
+ };
24
+ return w;
60
25
  }
61
-
26
+ exports.executeTasksUsingMultipleRangeRequests = executeTasksUsingMultipleRangeRequests;
62
27
  function doExecuteTasks(differentialDownloader, options, out, resolve, reject) {
63
- let ranges = "bytes=";
64
- let partCount = 0;
65
- const partIndexToTaskIndex = new Map();
66
- const partIndexToLength = [];
67
-
68
- for (let i = options.start; i < options.end; i++) {
69
- const task = options.tasks[i];
70
-
71
- if (task.kind === _downloadPlanBuilder().OperationKind.DOWNLOAD) {
72
- ranges += `${task.start}-${task.end - 1}, `;
73
- partIndexToTaskIndex.set(partCount, i);
74
- partCount++;
75
- partIndexToLength.push(task.end - task.start);
28
+ let ranges = "bytes=";
29
+ let partCount = 0;
30
+ const partIndexToTaskIndex = new Map();
31
+ const partIndexToLength = [];
32
+ for (let i = options.start; i < options.end; i++) {
33
+ const task = options.tasks[i];
34
+ if (task.kind === downloadPlanBuilder_1.OperationKind.DOWNLOAD) {
35
+ ranges += `${task.start}-${task.end - 1}, `;
36
+ partIndexToTaskIndex.set(partCount, i);
37
+ partCount++;
38
+ partIndexToLength.push(task.end - task.start);
39
+ }
76
40
  }
77
- }
78
-
79
- if (partCount <= 1) {
80
- // the only remote range - copy
81
- const w = index => {
82
- if (index >= options.end) {
83
- resolve();
41
+ if (partCount <= 1) {
42
+ // the only remote range - copy
43
+ const w = (index) => {
44
+ if (index >= options.end) {
45
+ resolve();
46
+ return;
47
+ }
48
+ const task = options.tasks[index++];
49
+ if (task.kind === downloadPlanBuilder_1.OperationKind.COPY) {
50
+ DataSplitter_1.copyData(task, out, options.oldFileFd, reject, () => w(index));
51
+ }
52
+ else {
53
+ const requestOptions = differentialDownloader.createRequestOptions();
54
+ requestOptions.headers.Range = `bytes=${task.start}-${task.end - 1}`;
55
+ const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {
56
+ if (!checkIsRangesSupported(response, reject)) {
57
+ return;
58
+ }
59
+ response.pipe(out, {
60
+ end: false,
61
+ });
62
+ response.once("end", () => w(index));
63
+ });
64
+ differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject);
65
+ request.end();
66
+ }
67
+ };
68
+ w(options.start);
84
69
  return;
85
- }
86
-
87
- const task = options.tasks[index++];
88
-
89
- if (task.kind === _downloadPlanBuilder().OperationKind.COPY) {
90
- (0, _DataSplitter().copyData)(task, out, options.oldFileFd, reject, () => w(index));
91
- } else {
92
- const requestOptions = differentialDownloader.createRequestOptions();
93
- requestOptions.headers.Range = `bytes=${task.start}-${task.end - 1}`;
94
- const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {
95
- if (!checkIsRangesSupported(response, reject)) {
70
+ }
71
+ const requestOptions = differentialDownloader.createRequestOptions();
72
+ requestOptions.headers.Range = ranges.substring(0, ranges.length - 2);
73
+ const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {
74
+ if (!checkIsRangesSupported(response, reject)) {
75
+ return;
76
+ }
77
+ const contentType = builder_util_runtime_1.safeGetHeader(response, "content-type");
78
+ const m = /^multipart\/.+?(?:; boundary=(?:(?:"(.+)")|(?:([^\s]+))))$/i.exec(contentType);
79
+ if (m == null) {
80
+ reject(new Error(`Content-Type "multipart/byteranges" is expected, but got "${contentType}"`));
96
81
  return;
97
- }
98
-
99
- response.pipe(out, {
100
- end: false
101
- });
102
- response.once("end", () => w(index));
82
+ }
83
+ const dicer = new DataSplitter_1.DataSplitter(out, options, partIndexToTaskIndex, m[1] || m[2], partIndexToLength, resolve);
84
+ dicer.on("error", reject);
85
+ response.pipe(dicer);
86
+ response.on("end", () => {
87
+ setTimeout(() => {
88
+ request.abort();
89
+ reject(new Error("Response ends without calling any handlers"));
90
+ }, 10000);
103
91
  });
104
- differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject);
105
- request.end();
106
- }
107
- };
108
-
109
- w(options.start);
110
- return;
111
- }
112
-
113
- const requestOptions = differentialDownloader.createRequestOptions();
114
- requestOptions.headers.Range = ranges.substring(0, ranges.length - 2);
115
- const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {
116
- if (!checkIsRangesSupported(response, reject)) {
117
- return;
118
- }
119
-
120
- const contentType = (0, _builderUtilRuntime().safeGetHeader)(response, "content-type");
121
- const m = /^multipart\/.+?(?:; boundary=(?:(?:"(.+)")|(?:([^\s]+))))$/i.exec(contentType);
122
-
123
- if (m == null) {
124
- reject(new Error(`Content-Type "multipart/byteranges" is expected, but got "${contentType}"`));
125
- return;
126
- }
127
-
128
- const dicer = new (_DataSplitter().DataSplitter)(out, options, partIndexToTaskIndex, m[1] || m[2], partIndexToLength, resolve);
129
- dicer.on("error", reject);
130
- response.pipe(dicer);
131
- response.on('end', () => {
132
- setTimeout(() => {
133
- request.abort();
134
- reject(new Error("Response ends without calling any handlers"));
135
- }, 10000);
136
92
  });
137
- });
138
- differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject);
139
- request.end();
93
+ differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject);
94
+ request.end();
140
95
  }
141
-
142
96
  function checkIsRangesSupported(response, reject) {
143
- // Electron net handles redirects automatically, our NodeJS test server doesn't use redirects - so, we don't check 3xx codes.
144
- if (response.statusCode >= 400) {
145
- reject((0, _builderUtilRuntime().createHttpError)(response));
146
- return false;
147
- }
148
-
149
- if (response.statusCode !== 206) {
150
- const acceptRanges = (0, _builderUtilRuntime().safeGetHeader)(response, "accept-ranges");
151
-
152
- if (acceptRanges == null || acceptRanges === "none") {
153
- reject(new Error(`Server doesn't support Accept-Ranges (response code ${response.statusCode})`));
154
- return false;
97
+ // Electron net handles redirects automatically, our NodeJS test server doesn't use redirects - so, we don't check 3xx codes.
98
+ if (response.statusCode >= 400) {
99
+ reject(builder_util_runtime_1.createHttpError(response));
100
+ return false;
101
+ }
102
+ if (response.statusCode !== 206) {
103
+ const acceptRanges = builder_util_runtime_1.safeGetHeader(response, "accept-ranges");
104
+ if (acceptRanges == null || acceptRanges === "none") {
105
+ reject(new Error(`Server doesn't support Accept-Ranges (response code ${response.statusCode})`));
106
+ return false;
107
+ }
155
108
  }
156
- }
157
-
158
- return true;
159
- }
160
- // __ts-babel@6.0.4
109
+ return true;
110
+ }
111
+ exports.checkIsRangesSupported = checkIsRangesSupported;
161
112
  //# sourceMappingURL=multipleRangeDownloader.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/differentialDownloader/multipleRangeDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHttpError, safeGetHeader } from \"builder-util-runtime\"\nimport { IncomingMessage } from \"http\"\nimport { Writable } from \"stream\"\nimport { copyData, DataSplitter, PartListDataTask } from \"./DataSplitter\"\nimport { DifferentialDownloader } from \"./DifferentialDownloader\"\nimport { Operation, OperationKind } from \"./downloadPlanBuilder\"\n\nexport function executeTasksUsingMultipleRangeRequests(differentialDownloader: DifferentialDownloader, tasks: Array<Operation>, out: Writable, oldFileFd: number, reject: (error: Error) => void): (taskOffset: number) => void {\n const w = (taskOffset: number): void => {\n if (taskOffset >= tasks.length) {\n if (differentialDownloader.fileMetadataBuffer != null) {\n out.write(differentialDownloader.fileMetadataBuffer)\n }\n out.end()\n return\n }\n\n const nextOffset = taskOffset + 1000\n doExecuteTasks(differentialDownloader, {\n tasks,\n start: taskOffset,\n end: Math.min(tasks.length, nextOffset),\n oldFileFd,\n }, out, () => w(nextOffset), reject)\n }\n return w\n}\n\nfunction doExecuteTasks(differentialDownloader: DifferentialDownloader, options: PartListDataTask, out: Writable, resolve: () => void, reject: (error: Error) => void): void {\n let ranges = \"bytes=\"\n let partCount = 0\n const partIndexToTaskIndex = new Map<number, number>()\n const partIndexToLength: Array<number> = []\n for (let i = options.start; i < options.end; i++) {\n const task = options.tasks[i]\n if (task.kind === OperationKind.DOWNLOAD) {\n ranges += `${task.start}-${task.end - 1}, `\n partIndexToTaskIndex.set(partCount, i)\n partCount++\n partIndexToLength.push(task.end - task.start)\n }\n }\n\n if (partCount <= 1) {\n // the only remote range - copy\n const w = (index: number): void => {\n if (index >= options.end) {\n resolve()\n return\n }\n\n const task = options.tasks[index++]\n\n if (task.kind === OperationKind.COPY) {\n copyData(task, out, options.oldFileFd, reject, () => w(index))\n }\n else {\n const requestOptions = differentialDownloader.createRequestOptions()\n requestOptions.headers!!.Range = `bytes=${task.start}-${task.end - 1}`\n const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {\n if (!checkIsRangesSupported(response, reject)) {\n return\n }\n\n response.pipe(out, {\n end: false\n })\n response.once(\"end\", () => w(index))\n })\n differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject)\n request.end()\n }\n }\n\n w(options.start)\n return\n }\n\n const requestOptions = differentialDownloader.createRequestOptions()\n requestOptions.headers!!.Range = ranges.substring(0, ranges.length - 2)\n const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {\n if (!checkIsRangesSupported(response, reject)) {\n return\n }\n\n const contentType = safeGetHeader(response, \"content-type\")\n const m = /^multipart\\/.+?(?:; boundary=(?:(?:\"(.+)\")|(?:([^\\s]+))))$/i.exec(contentType)\n if (m == null) {\n reject(new Error(`Content-Type \"multipart/byteranges\" is expected, but got \"${contentType}\"`))\n return\n }\n\n const dicer = new DataSplitter(out, options, partIndexToTaskIndex, m[1] || m[2], partIndexToLength, resolve)\n dicer.on(\"error\", reject)\n response.pipe(dicer)\n\n response.on('end', () => {\n setTimeout(() => {\n request.abort()\n reject(new Error(\"Response ends without calling any handlers\"))\n }, 10000)\n })\n })\n differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject)\n request.end()\n}\n\nexport function checkIsRangesSupported(response: IncomingMessage, reject: (error: Error) => void): boolean {\n // Electron net handles redirects automatically, our NodeJS test server doesn't use redirects - so, we don't check 3xx codes.\n if (response.statusCode!! >= 400) {\n reject(createHttpError(response))\n return false\n }\n\n if (response.statusCode !== 206) {\n const acceptRanges = safeGetHeader(response, \"accept-ranges\")\n if (acceptRanges == null || acceptRanges === \"none\") {\n reject(new Error(`Server doesn't support Accept-Ranges (response code ${response.statusCode})`))\n return false\n }\n }\n return true\n}\n"],"sourceRoot":""}
1
+ {"version":3,"file":"multipleRangeDownloader.js","sourceRoot":"","sources":["../../src/differentialDownloader/multipleRangeDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHttpError, safeGetHeader } from \"builder-util-runtime\"\nimport { IncomingMessage } from \"http\"\nimport { Writable } from \"stream\"\nimport { copyData, DataSplitter, PartListDataTask } from \"./DataSplitter\"\nimport { DifferentialDownloader } from \"./DifferentialDownloader\"\nimport { Operation, OperationKind } from \"./downloadPlanBuilder\"\n\nexport function executeTasksUsingMultipleRangeRequests(\n differentialDownloader: DifferentialDownloader,\n tasks: Array<Operation>,\n out: Writable,\n oldFileFd: number,\n reject: (error: Error) => void\n): (taskOffset: number) => void {\n const w = (taskOffset: number): void => {\n if (taskOffset >= tasks.length) {\n if (differentialDownloader.fileMetadataBuffer != null) {\n out.write(differentialDownloader.fileMetadataBuffer)\n }\n out.end()\n return\n }\n\n const nextOffset = taskOffset + 1000\n doExecuteTasks(\n differentialDownloader,\n {\n tasks,\n start: taskOffset,\n end: Math.min(tasks.length, nextOffset),\n oldFileFd,\n },\n out,\n () => w(nextOffset),\n reject\n )\n }\n return w\n}\n\nfunction doExecuteTasks(differentialDownloader: DifferentialDownloader, options: PartListDataTask, out: Writable, resolve: () => void, reject: (error: Error) => void): void {\n let ranges = \"bytes=\"\n let partCount = 0\n const partIndexToTaskIndex = new Map<number, number>()\n const partIndexToLength: Array<number> = []\n for (let i = options.start; i < options.end; i++) {\n const task = options.tasks[i]\n if (task.kind === OperationKind.DOWNLOAD) {\n ranges += `${task.start}-${task.end - 1}, `\n partIndexToTaskIndex.set(partCount, i)\n partCount++\n partIndexToLength.push(task.end - task.start)\n }\n }\n\n if (partCount <= 1) {\n // the only remote range - copy\n const w = (index: number): void => {\n if (index >= options.end) {\n resolve()\n return\n }\n\n const task = options.tasks[index++]\n\n if (task.kind === OperationKind.COPY) {\n copyData(task, out, options.oldFileFd, reject, () => w(index))\n } else {\n const requestOptions = differentialDownloader.createRequestOptions()\n requestOptions.headers!.Range = `bytes=${task.start}-${task.end - 1}`\n const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {\n if (!checkIsRangesSupported(response, reject)) {\n return\n }\n\n response.pipe(out, {\n end: false,\n })\n response.once(\"end\", () => w(index))\n })\n differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject)\n request.end()\n }\n }\n\n w(options.start)\n return\n }\n\n const requestOptions = differentialDownloader.createRequestOptions()\n requestOptions.headers!.Range = ranges.substring(0, ranges.length - 2)\n const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {\n if (!checkIsRangesSupported(response, reject)) {\n return\n }\n\n const contentType = safeGetHeader(response, \"content-type\")\n const m = /^multipart\\/.+?(?:; boundary=(?:(?:\"(.+)\")|(?:([^\\s]+))))$/i.exec(contentType)\n if (m == null) {\n reject(new Error(`Content-Type \"multipart/byteranges\" is expected, but got \"${contentType}\"`))\n return\n }\n\n const dicer = new DataSplitter(out, options, partIndexToTaskIndex, m[1] || m[2], partIndexToLength, resolve)\n dicer.on(\"error\", reject)\n response.pipe(dicer)\n\n response.on(\"end\", () => {\n setTimeout(() => {\n request.abort()\n reject(new Error(\"Response ends without calling any handlers\"))\n }, 10000)\n })\n })\n differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject)\n request.end()\n}\n\nexport function checkIsRangesSupported(response: IncomingMessage, reject: (error: Error) => void): boolean {\n // Electron net handles redirects automatically, our NodeJS test server doesn't use redirects - so, we don't check 3xx codes.\n if (response.statusCode! >= 400) {\n reject(createHttpError(response))\n return false\n }\n\n if (response.statusCode !== 206) {\n const acceptRanges = safeGetHeader(response, \"accept-ranges\")\n if (acceptRanges == null || acceptRanges === \"none\") {\n reject(new Error(`Server doesn't support Accept-Ranges (response code ${response.statusCode})`))\n return false\n }\n }\n return true\n}\n"]}