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.
- package/LICENSE +22 -0
- package/out/AppAdapter.js +19 -28
- package/out/AppAdapter.js.map +1 -1
- package/out/AppImageUpdater.js +103 -195
- package/out/AppImageUpdater.js.map +1 -1
- package/out/AppUpdater.d.ts +1 -1
- package/out/AppUpdater.js +517 -771
- package/out/AppUpdater.js.map +1 -1
- package/out/BaseUpdater.js +79 -103
- package/out/BaseUpdater.js.map +1 -1
- package/out/DownloadedUpdateHelper.js +150 -223
- package/out/DownloadedUpdateHelper.js.map +1 -1
- package/out/ElectronAppAdapter.js +35 -63
- package/out/ElectronAppAdapter.js.map +1 -1
- package/out/MacUpdater.js +132 -201
- package/out/MacUpdater.js.map +1 -1
- package/out/NoOpLogger.d.ts +6 -0
- package/out/NoOpLogger.js +19 -0
- package/out/NoOpLogger.js.map +1 -0
- package/out/NsisUpdater.js +199 -345
- package/out/NsisUpdater.js.map +1 -1
- package/out/differentialDownloader/DataSplitter.js +180 -252
- package/out/differentialDownloader/DataSplitter.js.map +1 -1
- package/out/differentialDownloader/DifferentialDownloader.d.ts +1 -1
- package/out/differentialDownloader/DifferentialDownloader.js +242 -355
- package/out/differentialDownloader/DifferentialDownloader.js.map +1 -1
- package/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js +29 -65
- package/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js.map +1 -1
- package/out/differentialDownloader/GenericDifferentialDownloader.js +7 -21
- package/out/differentialDownloader/GenericDifferentialDownloader.js.map +1 -1
- package/out/differentialDownloader/ProgressDifferentialDownloadCallbackTransform.js +79 -107
- package/out/differentialDownloader/ProgressDifferentialDownloadCallbackTransform.js.map +1 -1
- package/out/differentialDownloader/downloadPlanBuilder.js +99 -123
- package/out/differentialDownloader/downloadPlanBuilder.js.map +1 -1
- package/out/differentialDownloader/multipleRangeDownloader.js +99 -148
- package/out/differentialDownloader/multipleRangeDownloader.js.map +1 -1
- package/out/electronHttpExecutor.js +73 -106
- package/out/electronHttpExecutor.js.map +1 -1
- package/out/event.d.ts +35 -0
- package/out/event.js +39 -0
- package/out/event.js.map +1 -0
- package/out/log.d.ts +11 -0
- package/out/log.js +19 -0
- package/out/log.js.map +1 -0
- package/out/main.d.ts +1 -3
- package/out/main.js +60 -196
- package/out/main.js.map +1 -1
- package/out/providerFactory.js +49 -105
- package/out/providerFactory.js.map +1 -1
- package/out/providers/BintrayProvider.d.ts +2 -2
- package/out/providers/BintrayProvider.js +40 -95
- package/out/providers/BintrayProvider.js.map +1 -1
- package/out/providers/GenericProvider.d.ts +2 -2
- package/out/providers/GenericProvider.js +46 -80
- package/out/providers/GenericProvider.js.map +1 -1
- package/out/providers/GitHubProvider.d.ts +2 -2
- package/out/providers/GitHubProvider.js +122 -201
- package/out/providers/GitHubProvider.js.map +1 -1
- package/out/providers/PrivateGitHubProvider.js +87 -165
- package/out/providers/PrivateGitHubProvider.js.map +1 -1
- package/out/providers/Provider.js +122 -173
- package/out/providers/Provider.js.map +1 -1
- package/out/util.d.ts +5 -0
- package/out/util.js +42 -0
- package/out/util.js.map +1 -0
- package/out/windowsExecutableCodeSignatureVerifier.js +99 -139
- package/out/windowsExecutableCodeSignatureVerifier.js.map +1 -1
- package/package.json +33 -31
|
@@ -1,274 +1,202 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
var _fs = require("fs");
|
|
20
|
-
|
|
21
|
-
function _stream() {
|
|
22
|
-
const data = require("stream");
|
|
23
|
-
|
|
24
|
-
_stream = function () {
|
|
25
|
-
return data;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
return data;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function _downloadPlanBuilder() {
|
|
32
|
-
const data = require("./downloadPlanBuilder");
|
|
33
|
-
|
|
34
|
-
_downloadPlanBuilder = function () {
|
|
35
|
-
return data;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
return data;
|
|
39
|
-
}
|
|
40
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataSplitter = exports.copyData = void 0;
|
|
4
|
+
const builder_util_runtime_1 = require("builder-util-runtime");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const stream_1 = require("stream");
|
|
7
|
+
const downloadPlanBuilder_1 = require("./downloadPlanBuilder");
|
|
41
8
|
const DOUBLE_CRLF = Buffer.from("\r\n\r\n");
|
|
42
9
|
var ReadState;
|
|
43
|
-
|
|
44
10
|
(function (ReadState) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
11
|
+
ReadState[ReadState["INIT"] = 0] = "INIT";
|
|
12
|
+
ReadState[ReadState["HEADER"] = 1] = "HEADER";
|
|
13
|
+
ReadState[ReadState["BODY"] = 2] = "BODY";
|
|
48
14
|
})(ReadState || (ReadState = {}));
|
|
49
|
-
|
|
50
15
|
function copyData(task, out, oldFileFd, reject, resolve) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
16
|
+
const readStream = fs_1.createReadStream("", {
|
|
17
|
+
fd: oldFileFd,
|
|
18
|
+
autoClose: false,
|
|
19
|
+
start: task.start,
|
|
20
|
+
// end is inclusive
|
|
21
|
+
end: task.end - 1,
|
|
22
|
+
});
|
|
23
|
+
readStream.on("error", reject);
|
|
24
|
+
readStream.once("end", resolve);
|
|
25
|
+
readStream.pipe(out, {
|
|
26
|
+
end: false,
|
|
27
|
+
});
|
|
63
28
|
}
|
|
64
|
-
|
|
65
|
-
class DataSplitter extends
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
this.ignoreByteCount = this.boundaryLength - 2;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
get isFinished() {
|
|
87
|
-
return this.partIndex === this.partIndexToLength.length;
|
|
88
|
-
} // noinspection JSUnusedGlobalSymbols
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
_write(data, encoding, callback) {
|
|
92
|
-
if (this.isFinished) {
|
|
93
|
-
console.error(`Trailing ignored data: ${data.length} bytes`);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
this.handleData(data).then(callback).catch(callback);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
async handleData(chunk) {
|
|
101
|
-
let start = 0;
|
|
102
|
-
|
|
103
|
-
if (this.ignoreByteCount !== 0 && this.remainingPartDataCount !== 0) {
|
|
104
|
-
throw (0, _builderUtilRuntime().newError)("Internal error", "ERR_DATA_SPLITTER_BYTE_COUNT_MISMATCH");
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (this.ignoreByteCount > 0) {
|
|
108
|
-
const toIgnore = Math.min(this.ignoreByteCount, chunk.length);
|
|
109
|
-
this.ignoreByteCount -= toIgnore;
|
|
110
|
-
start = toIgnore;
|
|
111
|
-
} else if (this.remainingPartDataCount > 0) {
|
|
112
|
-
const toRead = Math.min(this.remainingPartDataCount, chunk.length);
|
|
113
|
-
this.remainingPartDataCount -= toRead;
|
|
114
|
-
await this.processPartData(chunk, 0, toRead);
|
|
115
|
-
start = toRead;
|
|
29
|
+
exports.copyData = copyData;
|
|
30
|
+
class DataSplitter extends stream_1.Writable {
|
|
31
|
+
constructor(out, options, partIndexToTaskIndex, boundary, partIndexToLength, finishHandler) {
|
|
32
|
+
super();
|
|
33
|
+
this.out = out;
|
|
34
|
+
this.options = options;
|
|
35
|
+
this.partIndexToTaskIndex = partIndexToTaskIndex;
|
|
36
|
+
this.partIndexToLength = partIndexToLength;
|
|
37
|
+
this.finishHandler = finishHandler;
|
|
38
|
+
this.partIndex = -1;
|
|
39
|
+
this.headerListBuffer = null;
|
|
40
|
+
this.readState = ReadState.INIT;
|
|
41
|
+
this.ignoreByteCount = 0;
|
|
42
|
+
this.remainingPartDataCount = 0;
|
|
43
|
+
this.actualPartLength = 0;
|
|
44
|
+
this.boundaryLength = boundary.length + 4; /* size of \r\n-- */
|
|
45
|
+
// first chunk doesn't start with \r\n
|
|
46
|
+
this.ignoreByteCount = this.boundaryLength - 2;
|
|
116
47
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
return;
|
|
48
|
+
get isFinished() {
|
|
49
|
+
return this.partIndex === this.partIndexToLength.length;
|
|
120
50
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
start = headerListEnd;
|
|
130
|
-
this.readState = ReadState.BODY; // header list is ignored, we don't need it
|
|
131
|
-
|
|
132
|
-
this.headerListBuffer = null;
|
|
51
|
+
// noinspection JSUnusedGlobalSymbols
|
|
52
|
+
_write(data, encoding, callback) {
|
|
53
|
+
if (this.isFinished) {
|
|
54
|
+
console.error(`Trailing ignored data: ${data.length} bytes`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.handleData(data).then(callback).catch(callback);
|
|
133
58
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
} else {
|
|
139
|
-
this.partIndex++;
|
|
140
|
-
let taskIndex = this.partIndexToTaskIndex.get(this.partIndex);
|
|
141
|
-
|
|
142
|
-
if (taskIndex == null) {
|
|
143
|
-
if (this.isFinished) {
|
|
144
|
-
taskIndex = this.options.end;
|
|
145
|
-
} else {
|
|
146
|
-
throw (0, _builderUtilRuntime().newError)("taskIndex is null", "ERR_DATA_SPLITTER_TASK_INDEX_IS_NULL");
|
|
147
|
-
}
|
|
59
|
+
async handleData(chunk) {
|
|
60
|
+
let start = 0;
|
|
61
|
+
if (this.ignoreByteCount !== 0 && this.remainingPartDataCount !== 0) {
|
|
62
|
+
throw builder_util_runtime_1.newError("Internal error", "ERR_DATA_SPLITTER_BYTE_COUNT_MISMATCH");
|
|
148
63
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
if (prevTaskIndex < taskIndex) {
|
|
155
|
-
await this.copyExistingData(prevTaskIndex, taskIndex);
|
|
156
|
-
} else if (prevTaskIndex > taskIndex) {
|
|
157
|
-
throw (0, _builderUtilRuntime().newError)("prevTaskIndex must be < taskIndex", "ERR_DATA_SPLITTER_TASK_INDEX_ASSERT_FAILED");
|
|
64
|
+
if (this.ignoreByteCount > 0) {
|
|
65
|
+
const toIgnore = Math.min(this.ignoreByteCount, chunk.length);
|
|
66
|
+
this.ignoreByteCount -= toIgnore;
|
|
67
|
+
start = toIgnore;
|
|
158
68
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
69
|
+
else if (this.remainingPartDataCount > 0) {
|
|
70
|
+
const toRead = Math.min(this.remainingPartDataCount, chunk.length);
|
|
71
|
+
this.remainingPartDataCount -= toRead;
|
|
72
|
+
await this.processPartData(chunk, 0, toRead);
|
|
73
|
+
start = toRead;
|
|
164
74
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
if (start === -1) {
|
|
169
|
-
this.readState = ReadState.HEADER;
|
|
170
|
-
return;
|
|
75
|
+
if (start === chunk.length) {
|
|
76
|
+
return;
|
|
171
77
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
start = end + this.boundaryLength;
|
|
185
|
-
|
|
186
|
-
if (start >= chunk.length) {
|
|
187
|
-
this.ignoreByteCount = this.boundaryLength - (chunk.length - end);
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
copyExistingData(index, end) {
|
|
194
|
-
return new Promise((resolve, reject) => {
|
|
195
|
-
const w = () => {
|
|
196
|
-
if (index === end) {
|
|
197
|
-
resolve();
|
|
198
|
-
return;
|
|
78
|
+
if (this.readState === ReadState.HEADER) {
|
|
79
|
+
const headerListEnd = this.searchHeaderListEnd(chunk, start);
|
|
80
|
+
if (headerListEnd === -1) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
start = headerListEnd;
|
|
84
|
+
this.readState = ReadState.BODY;
|
|
85
|
+
// header list is ignored, we don't need it
|
|
86
|
+
this.headerListBuffer = null;
|
|
199
87
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
88
|
+
while (true) {
|
|
89
|
+
if (this.readState === ReadState.BODY) {
|
|
90
|
+
this.readState = ReadState.INIT;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.partIndex++;
|
|
94
|
+
let taskIndex = this.partIndexToTaskIndex.get(this.partIndex);
|
|
95
|
+
if (taskIndex == null) {
|
|
96
|
+
if (this.isFinished) {
|
|
97
|
+
taskIndex = this.options.end;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
throw builder_util_runtime_1.newError("taskIndex is null", "ERR_DATA_SPLITTER_TASK_INDEX_IS_NULL");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const prevTaskIndex = this.partIndex === 0 ? this.options.start : this.partIndexToTaskIndex.get(this.partIndex - 1) + 1; /* prev part is download, next maybe copy */
|
|
104
|
+
if (prevTaskIndex < taskIndex) {
|
|
105
|
+
await this.copyExistingData(prevTaskIndex, taskIndex);
|
|
106
|
+
}
|
|
107
|
+
else if (prevTaskIndex > taskIndex) {
|
|
108
|
+
throw builder_util_runtime_1.newError("prevTaskIndex must be < taskIndex", "ERR_DATA_SPLITTER_TASK_INDEX_ASSERT_FAILED");
|
|
109
|
+
}
|
|
110
|
+
if (this.isFinished) {
|
|
111
|
+
this.onPartEnd();
|
|
112
|
+
this.finishHandler();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
start = this.searchHeaderListEnd(chunk, start);
|
|
116
|
+
if (start === -1) {
|
|
117
|
+
this.readState = ReadState.HEADER;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const partLength = this.partIndexToLength[this.partIndex];
|
|
122
|
+
const end = start + partLength;
|
|
123
|
+
const effectiveEnd = Math.min(end, chunk.length);
|
|
124
|
+
await this.processPartStarted(chunk, start, effectiveEnd);
|
|
125
|
+
this.remainingPartDataCount = partLength - (effectiveEnd - start);
|
|
126
|
+
if (this.remainingPartDataCount > 0) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
start = end + this.boundaryLength;
|
|
130
|
+
if (start >= chunk.length) {
|
|
131
|
+
this.ignoreByteCount = this.boundaryLength - (chunk.length - end);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
206
134
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
135
|
+
}
|
|
136
|
+
copyExistingData(index, end) {
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
const w = () => {
|
|
139
|
+
if (index === end) {
|
|
140
|
+
resolve();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const task = this.options.tasks[index];
|
|
144
|
+
if (task.kind !== downloadPlanBuilder_1.OperationKind.COPY) {
|
|
145
|
+
reject(new Error("Task kind must be COPY"));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
copyData(task, this.out, this.options.oldFileFd, reject, () => {
|
|
149
|
+
index++;
|
|
150
|
+
w();
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
w();
|
|
211
154
|
});
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
w();
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
searchHeaderListEnd(chunk, readOffset) {
|
|
219
|
-
const headerListEnd = chunk.indexOf(DOUBLE_CRLF, readOffset);
|
|
220
|
-
|
|
221
|
-
if (headerListEnd !== -1) {
|
|
222
|
-
return headerListEnd + DOUBLE_CRLF.length;
|
|
223
|
-
} // not all headers data were received, save to buffer
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
const partialChunk = readOffset === 0 ? chunk : chunk.slice(readOffset);
|
|
227
|
-
|
|
228
|
-
if (this.headerListBuffer == null) {
|
|
229
|
-
this.headerListBuffer = partialChunk;
|
|
230
|
-
} else {
|
|
231
|
-
this.headerListBuffer = Buffer.concat([this.headerListBuffer, partialChunk]);
|
|
232
155
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
156
|
+
searchHeaderListEnd(chunk, readOffset) {
|
|
157
|
+
const headerListEnd = chunk.indexOf(DOUBLE_CRLF, readOffset);
|
|
158
|
+
if (headerListEnd !== -1) {
|
|
159
|
+
return headerListEnd + DOUBLE_CRLF.length;
|
|
160
|
+
}
|
|
161
|
+
// not all headers data were received, save to buffer
|
|
162
|
+
const partialChunk = readOffset === 0 ? chunk : chunk.slice(readOffset);
|
|
163
|
+
if (this.headerListBuffer == null) {
|
|
164
|
+
this.headerListBuffer = partialChunk;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.headerListBuffer = Buffer.concat([this.headerListBuffer, partialChunk]);
|
|
168
|
+
}
|
|
169
|
+
return -1;
|
|
242
170
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
this.onPartEnd();
|
|
171
|
+
onPartEnd() {
|
|
172
|
+
const expectedLength = this.partIndexToLength[this.partIndex - 1];
|
|
173
|
+
if (this.actualPartLength !== expectedLength) {
|
|
174
|
+
throw builder_util_runtime_1.newError(`Expected length: ${expectedLength} differs from actual: ${this.actualPartLength}`, "ERR_DATA_SPLITTER_LENGTH_MISMATCH");
|
|
175
|
+
}
|
|
176
|
+
this.actualPartLength = 0;
|
|
250
177
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
178
|
+
processPartStarted(data, start, end) {
|
|
179
|
+
if (this.partIndex !== 0) {
|
|
180
|
+
this.onPartEnd();
|
|
181
|
+
}
|
|
182
|
+
return this.processPartData(data, start, end);
|
|
183
|
+
}
|
|
184
|
+
processPartData(data, start, end) {
|
|
185
|
+
this.actualPartLength += end - start;
|
|
186
|
+
const out = this.out;
|
|
187
|
+
if (out.write(start === 0 && data.length === end ? data : data.slice(start, end))) {
|
|
188
|
+
return Promise.resolve();
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
return new Promise((resolve, reject) => {
|
|
192
|
+
out.on("error", reject);
|
|
193
|
+
out.once("drain", () => {
|
|
194
|
+
out.removeListener("error", reject);
|
|
195
|
+
resolve();
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
269
199
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
} exports.DataSplitter = DataSplitter;
|
|
273
|
-
// __ts-babel@6.0.4
|
|
200
|
+
}
|
|
201
|
+
exports.DataSplitter = DataSplitter;
|
|
274
202
|
//# sourceMappingURL=DataSplitter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/differentialDownloader/DataSplitter.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAP,CAAY,UAAZ,CAApB;AAEA,IAAK,SAAL;;AAAA,CAAA,UAAK,SAAL,EAAc;AACZ,EAAA,SAAA,CAAA,SAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAAM,EAAA,SAAA,CAAA,SAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAQ,EAAA,SAAA,CAAA,SAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AACf,CAFD,EAAK,SAAS,KAAT,SAAS,GAAA,EAAA,CAAd;;AAWM,SAAU,QAAV,CAAmB,IAAnB,EAAoC,GAApC,EAAmD,SAAnD,EAAsE,MAAtE,EAAsG,OAAtG,EAAyH;AAC7H,QAAM,UAAU,GAAG,0BAAiB,EAAjB,EAAqB;AACtC,IAAA,EAAE,EAAE,SADkC;AAEtC,IAAA,SAAS,EAAE,KAF2B;AAGtC,IAAA,KAAK,EAAE,IAAI,CAAC,KAH0B;AAItC;AACA,IAAA,GAAG,EAAE,IAAI,CAAC,GAAL,GAAW;AALsB,GAArB,CAAnB;AAOA,EAAA,UAAU,CAAC,EAAX,CAAc,OAAd,EAAuB,MAAvB;AACA,EAAA,UAAU,CAAC,IAAX,CAAgB,KAAhB,EAAuB,OAAvB;AACA,EAAA,UAAU,CAAC,IAAX,CAAgB,GAAhB,EAAqB;AACnB,IAAA,GAAG,EAAE;AADc,GAArB;AAGD;;AAEK,MAAO,YAAP,SAA4B,kBAA5B,CAAoC;AAUxC,EAAA,WAAA,CAA6B,GAA7B,EAA6D,OAA7D,EAAyG,oBAAzG,EAAoJ,QAApJ,EAAuL,iBAAvL,EAA0O,aAA1O,EAAkQ;AAChQ;AAD2B,SAAA,GAAA,GAAA,GAAA;AAAgC,SAAA,OAAA,GAAA,OAAA;AAA4C,SAAA,oBAAA,GAAA,oBAAA;AAA8E,SAAA,iBAAA,GAAA,iBAAA;AAAmD,SAAA,aAAA,GAAA,aAAA;AAT1O,SAAA,SAAA,GAAY,CAAC,CAAb;AAEQ,SAAA,gBAAA,GAAkC,IAAlC;AACA,SAAA,SAAA,GAAY,SAAS,CAAC,IAAtB;AACA,SAAA,eAAA,GAAkB,CAAlB;AACA,SAAA,sBAAA,GAAyB,CAAzB;AA+JA,SAAA,gBAAA,GAAmB,CAAnB;AAxJN,SAAK,cAAL,GAAsB,QAAQ,CAAC,MAAT,GAAkB,CAAxC;AAA0C;AAC1C;;AACA,SAAK,eAAL,GAAuB,KAAK,cAAL,GAAsB,CAA7C;AACD;;AAED,MAAI,UAAJ,GAAc;AACZ,WAAO,KAAK,SAAL,KAAmB,KAAK,iBAAL,CAAuB,MAAjD;AACD,GApBuC,CAsBxC;;;AACA,EAAA,MAAM,CAAC,IAAD,EAAe,QAAf,EAAiC,QAAjC,EAAkE;AACtE,QAAI,KAAK,UAAT,EAAqB;AACnB,MAAA,OAAO,CAAC,KAAR,CAAc,0BAA0B,IAAI,CAAC,MAAM,QAAnD;AACA;AACD;;AAED,SAAK,UAAL,CAAgB,IAAhB,EACG,IADH,CACQ,QADR,EAEG,KAFH,CAES,QAFT;AAGD;;AAEO,QAAM,UAAN,CAAiB,KAAjB,EAA8B;AACpC,QAAI,KAAK,GAAG,CAAZ;;AAEA,QAAI,KAAK,eAAL,KAAyB,CAAzB,IAA8B,KAAK,sBAAL,KAAgC,CAAlE,EAAqE;AACnE,YAAM,oCAAS,gBAAT,EAA2B,uCAA3B,CAAN;AACD;;AAED,QAAI,KAAK,eAAL,GAAuB,CAA3B,EAA8B;AAC5B,YAAM,QAAQ,GAAG,IAAI,CAAC,GAAL,CAAS,KAAK,eAAd,EAA+B,KAAK,CAAC,MAArC,CAAjB;AACA,WAAK,eAAL,IAAwB,QAAxB;AACA,MAAA,KAAK,GAAG,QAAR;AACD,KAJD,MAKK,IAAI,KAAK,sBAAL,GAA8B,CAAlC,EAAqC;AACxC,YAAM,MAAM,GAAG,IAAI,CAAC,GAAL,CAAS,KAAK,sBAAd,EAAsC,KAAK,CAAC,MAA5C,CAAf;AACA,WAAK,sBAAL,IAA+B,MAA/B;AACA,YAAM,KAAK,eAAL,CAAqB,KAArB,EAA4B,CAA5B,EAA+B,MAA/B,CAAN;AACA,MAAA,KAAK,GAAG,MAAR;AACD;;AAED,QAAI,KAAK,KAAK,KAAK,CAAC,MAApB,EAA4B;AAC1B;AACD;;AAED,QAAI,KAAK,SAAL,KAAmB,SAAS,CAAC,MAAjC,EAAyC;AACvC,YAAM,aAAa,GAAG,KAAK,mBAAL,CAAyB,KAAzB,EAAgC,KAAhC,CAAtB;;AACA,UAAI,aAAa,KAAK,CAAC,CAAvB,EAA0B;AACxB;AACD;;AAED,MAAA,KAAK,GAAG,aAAR;AACA,WAAK,SAAL,GAAiB,SAAS,CAAC,IAA3B,CAPuC,CAQvC;;AACA,WAAK,gBAAL,GAAwB,IAAxB;AACD;;AAED,WAAO,IAAP,EAAa;AACX,UAAI,KAAK,SAAL,KAAmB,SAAS,CAAC,IAAjC,EAAuC;AACrC,aAAK,SAAL,GAAiB,SAAS,CAAC,IAA3B;AACD,OAFD,MAGK;AACH,aAAK,SAAL;AAEA,YAAI,SAAS,GAAG,KAAK,oBAAL,CAA0B,GAA1B,CAA8B,KAAK,SAAnC,CAAhB;;AACA,YAAI,SAAS,IAAI,IAAjB,EAAuB;AACrB,cAAI,KAAK,UAAT,EAAqB;AACnB,YAAA,SAAS,GAAG,KAAK,OAAL,CAAa,GAAzB;AACD,WAFD,MAGK;AACH,kBAAM,oCAAS,mBAAT,EAA8B,sCAA9B,CAAN;AACD;AACF;;AAED,cAAM,aAAa,GAAG,KAAK,SAAL,KAAmB,CAAnB,GAAuB,KAAK,OAAL,CAAa,KAApC,GAA6C,KAAK,oBAAL,CAA0B,GAA1B,CAA8B,KAAK,SAAL,GAAiB,CAA/C,IAAsD;AAAE;AAA3H;;AACA,YAAI,aAAa,GAAG,SAApB,EAA+B;AAC7B,gBAAM,KAAK,gBAAL,CAAsB,aAAtB,EAAqC,SAArC,CAAN;AACD,SAFD,MAGK,IAAI,aAAa,GAAG,SAApB,EAA+B;AAClC,gBAAM,oCAAS,mCAAT,EAA8C,4CAA9C,CAAN;AACD;;AAED,YAAI,KAAK,UAAT,EAAqB;AACnB,eAAK,SAAL;AACA,eAAK,aAAL;AACA;AACD;;AAED,QAAA,KAAK,GAAG,KAAK,mBAAL,CAAyB,KAAzB,EAAgC,KAAhC,CAAR;;AAEA,YAAI,KAAK,KAAK,CAAC,CAAf,EAAkB;AAChB,eAAK,SAAL,GAAiB,SAAS,CAAC,MAA3B;AACA;AACD;AACF;;AAED,YAAM,UAAU,GAAG,KAAK,iBAAL,CAAuB,KAAK,SAA5B,CAAnB;AACA,YAAM,GAAG,GAAG,KAAK,GAAG,UAApB;AACA,YAAM,YAAY,GAAG,IAAI,CAAC,GAAL,CAAS,GAAT,EAAc,KAAK,CAAC,MAApB,CAArB;AACA,YAAM,KAAK,kBAAL,CAAwB,KAAxB,EAA+B,KAA/B,EAAsC,YAAtC,CAAN;AACA,WAAK,sBAAL,GAA8B,UAAU,IAAI,YAAY,GAAG,KAAnB,CAAxC;;AACA,UAAI,KAAK,sBAAL,GAA8B,CAAlC,EAAqC;AACnC;AACD;;AAED,MAAA,KAAK,GAAG,GAAG,GAAG,KAAK,cAAnB;;AACA,UAAI,KAAK,IAAI,KAAK,CAAC,MAAnB,EAA2B;AACzB,aAAK,eAAL,GAAuB,KAAK,cAAL,IAAuB,KAAK,CAAC,MAAN,GAAe,GAAtC,CAAvB;AACA;AACD;AACF;AACF;;AAEO,EAAA,gBAAgB,CAAC,KAAD,EAAgB,GAAhB,EAA2B;AACjD,WAAO,IAAI,OAAJ,CAAY,CAAC,OAAD,EAAU,MAAV,KAAoB;AACrC,YAAM,CAAC,GAAG,MAAW;AACnB,YAAI,KAAK,KAAK,GAAd,EAAmB;AACjB,UAAA,OAAO;AACP;AACD;;AAED,cAAM,IAAI,GAAG,KAAK,OAAL,CAAa,KAAb,CAAmB,KAAnB,CAAb;;AACA,YAAI,IAAI,CAAC,IAAL,KAAc,qCAAc,IAAhC,EAAsC;AACpC,UAAA,MAAM,CAAC,IAAI,KAAJ,CAAU,wBAAV,CAAD,CAAN;AACA;AACD;;AAED,QAAA,QAAQ,CAAC,IAAD,EAAO,KAAK,GAAZ,EAAiB,KAAK,OAAL,CAAa,SAA9B,EAAyC,MAAzC,EAAiD,MAAK;AAC5D,UAAA,KAAK;AACL,UAAA,CAAC;AACF,SAHO,CAAR;AAID,OAhBD;;AAiBA,MAAA,CAAC;AACF,KAnBM,CAAP;AAoBD;;AAEO,EAAA,mBAAmB,CAAC,KAAD,EAAgB,UAAhB,EAAkC;AAC3D,UAAM,aAAa,GAAG,KAAK,CAAC,OAAN,CAAc,WAAd,EAA2B,UAA3B,CAAtB;;AACA,QAAI,aAAa,KAAK,CAAC,CAAvB,EAA0B;AACxB,aAAO,aAAa,GAAG,WAAW,CAAC,MAAnC;AACD,KAJ0D,CAM3D;;;AACA,UAAM,YAAY,GAAG,UAAU,KAAK,CAAf,GAAmB,KAAnB,GAA2B,KAAK,CAAC,KAAN,CAAY,UAAZ,CAAhD;;AACA,QAAI,KAAK,gBAAL,IAAyB,IAA7B,EAAmC;AACjC,WAAK,gBAAL,GAAwB,YAAxB;AACD,KAFD,MAGK;AACH,WAAK,gBAAL,GAAwB,MAAM,CAAC,MAAP,CAAc,CAAC,KAAK,gBAAN,EAAwB,YAAxB,CAAd,CAAxB;AACD;;AACD,WAAO,CAAC,CAAR;AACD;;AAIO,EAAA,SAAS,GAAA;AACf,UAAM,cAAc,GAAG,KAAK,iBAAL,CAAuB,KAAK,SAAL,GAAiB,CAAxC,CAAvB;;AACA,QAAI,KAAK,gBAAL,KAA0B,cAA9B,EAA8C;AAC5C,YAAM,oCAAS,oBAAoB,cAAc,yBAAyB,KAAK,gBAAgB,EAAzF,EAA6F,mCAA7F,CAAN;AACD;;AACD,SAAK,gBAAL,GAAwB,CAAxB;AACD;;AAEO,EAAA,kBAAkB,CAAC,IAAD,EAAe,KAAf,EAA8B,GAA9B,EAAyC;AACjE,QAAI,KAAK,SAAL,KAAmB,CAAvB,EAA0B;AACxB,WAAK,SAAL;AACD;;AACD,WAAO,KAAK,eAAL,CAAqB,IAArB,EAA2B,KAA3B,EAAkC,GAAlC,CAAP;AACD;;AAEO,EAAA,eAAe,CAAC,IAAD,EAAe,KAAf,EAA8B,GAA9B,EAAyC;AAC9D,SAAK,gBAAL,IAAyB,GAAG,GAAG,KAA/B;AACA,UAAM,GAAG,GAAG,KAAK,GAAjB;;AACA,QAAI,GAAG,CAAC,KAAJ,CAAU,KAAK,KAAK,CAAV,IAAe,IAAI,CAAC,MAAL,KAAgB,GAA/B,GAAqC,IAArC,GAA4C,IAAI,CAAC,KAAL,CAAW,KAAX,EAAkB,GAAlB,CAAtD,CAAJ,EAAmF;AACjF,aAAO,OAAO,CAAC,OAAR,EAAP;AACD,KAFD,MAGK;AACH,aAAO,IAAI,OAAJ,CAAY,CAAC,OAAD,EAAU,MAAV,KAAoB;AACrC,QAAA,GAAG,CAAC,EAAJ,CAAO,OAAP,EAAgB,MAAhB;AACA,QAAA,GAAG,CAAC,IAAJ,CAAS,OAAT,EAAkB,MAAK;AACrB,UAAA,GAAG,CAAC,cAAJ,CAAmB,OAAnB,EAA4B,MAA5B;AACA,UAAA,OAAO;AACR,SAHD;AAID,OANM,CAAP;AAOD;AACF;;AArMuC,C","sourcesContent":["import { newError } from \"builder-util-runtime\"\nimport { createReadStream } from \"fs\"\nimport { Writable } from \"stream\"\nimport { Operation, OperationKind } from \"./downloadPlanBuilder\"\n\nconst DOUBLE_CRLF = Buffer.from(\"\\r\\n\\r\\n\")\n\nenum ReadState {\n INIT, HEADER, BODY\n}\n\nexport interface PartListDataTask {\n readonly oldFileFd: number\n readonly tasks: Array<Operation>\n readonly start: number\n readonly end: number\n}\n\nexport function copyData(task: Operation, out: Writable, oldFileFd: number, reject: (error: Error) => void, resolve: () => void): void {\n const readStream = createReadStream(\"\", {\n fd: oldFileFd,\n autoClose: false,\n start: task.start,\n // end is inclusive\n end: task.end - 1,\n })\n readStream.on(\"error\", reject)\n readStream.once(\"end\", resolve)\n readStream.pipe(out, {\n end: false\n })\n}\n\nexport class DataSplitter extends Writable {\n partIndex = -1\n\n private headerListBuffer: Buffer | null = null\n private readState = ReadState.INIT\n private ignoreByteCount = 0\n private remainingPartDataCount = 0\n\n private readonly boundaryLength: number\n\n constructor(private readonly out: Writable, private readonly options: PartListDataTask, private readonly partIndexToTaskIndex: Map<number, number>, boundary: string, private readonly partIndexToLength: Array<number>, private readonly finishHandler: () => any) {\n super()\n\n this.boundaryLength = boundary.length + 4 /* size of \\r\\n-- */\n // first chunk doesn't start with \\r\\n\n this.ignoreByteCount = this.boundaryLength - 2\n }\n\n get isFinished(): boolean {\n return this.partIndex === this.partIndexToLength.length\n }\n\n // noinspection JSUnusedGlobalSymbols\n _write(data: Buffer, encoding: string, callback: (error?: Error) => void): void {\n if (this.isFinished) {\n console.error(`Trailing ignored data: ${data.length} bytes`)\n return\n }\n\n this.handleData(data)\n .then(callback)\n .catch(callback)\n }\n\n private async handleData(chunk: Buffer): Promise<undefined> {\n let start = 0\n\n if (this.ignoreByteCount !== 0 && this.remainingPartDataCount !== 0) {\n throw newError(\"Internal error\", \"ERR_DATA_SPLITTER_BYTE_COUNT_MISMATCH\")\n }\n\n if (this.ignoreByteCount > 0) {\n const toIgnore = Math.min(this.ignoreByteCount, chunk.length)\n this.ignoreByteCount -= toIgnore\n start = toIgnore\n }\n else if (this.remainingPartDataCount > 0) {\n const toRead = Math.min(this.remainingPartDataCount, chunk.length)\n this.remainingPartDataCount -= toRead\n await this.processPartData(chunk, 0, toRead)\n start = toRead\n }\n\n if (start === chunk.length) {\n return\n }\n\n if (this.readState === ReadState.HEADER) {\n const headerListEnd = this.searchHeaderListEnd(chunk, start)\n if (headerListEnd === -1) {\n return\n }\n\n start = headerListEnd\n this.readState = ReadState.BODY\n // header list is ignored, we don't need it\n this.headerListBuffer = null\n }\n\n while (true) {\n if (this.readState === ReadState.BODY) {\n this.readState = ReadState.INIT\n }\n else {\n this.partIndex++\n\n let taskIndex = this.partIndexToTaskIndex.get(this.partIndex)\n if (taskIndex == null) {\n if (this.isFinished) {\n taskIndex = this.options.end\n }\n else {\n throw newError(\"taskIndex is null\", \"ERR_DATA_SPLITTER_TASK_INDEX_IS_NULL\")\n }\n }\n\n const prevTaskIndex = this.partIndex === 0 ? this.options.start : (this.partIndexToTaskIndex.get(this.partIndex - 1)!! + 1 /* prev part is download, next maybe copy */)\n if (prevTaskIndex < taskIndex) {\n await this.copyExistingData(prevTaskIndex, taskIndex)\n }\n else if (prevTaskIndex > taskIndex) {\n throw newError(\"prevTaskIndex must be < taskIndex\", \"ERR_DATA_SPLITTER_TASK_INDEX_ASSERT_FAILED\")\n }\n\n if (this.isFinished) {\n this.onPartEnd()\n this.finishHandler()\n return\n }\n\n start = this.searchHeaderListEnd(chunk, start)\n\n if (start === -1) {\n this.readState = ReadState.HEADER\n return\n }\n }\n\n const partLength = this.partIndexToLength[this.partIndex]\n const end = start + partLength\n const effectiveEnd = Math.min(end, chunk.length)\n await this.processPartStarted(chunk, start, effectiveEnd)\n this.remainingPartDataCount = partLength - (effectiveEnd - start)\n if (this.remainingPartDataCount > 0) {\n return\n }\n\n start = end + this.boundaryLength\n if (start >= chunk.length) {\n this.ignoreByteCount = this.boundaryLength - (chunk.length - end)\n return\n }\n }\n }\n\n private copyExistingData(index: number, end: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const w = (): void => {\n if (index === end) {\n resolve()\n return\n }\n\n const task = this.options.tasks[index]\n if (task.kind !== OperationKind.COPY) {\n reject(new Error(\"Task kind must be COPY\"))\n return\n }\n\n copyData(task, this.out, this.options.oldFileFd, reject, () => {\n index++\n w()\n })\n }\n w()\n })\n }\n\n private searchHeaderListEnd(chunk: Buffer, readOffset: number): number {\n const headerListEnd = chunk.indexOf(DOUBLE_CRLF, readOffset)\n if (headerListEnd !== -1) {\n return headerListEnd + DOUBLE_CRLF.length\n }\n\n // not all headers data were received, save to buffer\n const partialChunk = readOffset === 0 ? chunk : chunk.slice(readOffset)\n if (this.headerListBuffer == null) {\n this.headerListBuffer = partialChunk\n }\n else {\n this.headerListBuffer = Buffer.concat([this.headerListBuffer, partialChunk])\n }\n return -1\n }\n\n private actualPartLength = 0\n\n private onPartEnd(): void {\n const expectedLength = this.partIndexToLength[this.partIndex - 1]\n if (this.actualPartLength !== expectedLength) {\n throw newError(`Expected length: ${expectedLength} differs from actual: ${this.actualPartLength}`, \"ERR_DATA_SPLITTER_LENGTH_MISMATCH\")\n }\n this.actualPartLength = 0\n }\n\n private processPartStarted(data: Buffer, start: number, end: number): Promise<void> {\n if (this.partIndex !== 0) {\n this.onPartEnd()\n }\n return this.processPartData(data, start, end)\n }\n\n private processPartData(data: Buffer, start: number, end: number): Promise<void> {\n this.actualPartLength += end - start\n const out = this.out\n if (out.write(start === 0 && data.length === end ? data : data.slice(start, end))) {\n return Promise.resolve()\n }\n else {\n return new Promise((resolve, reject) => {\n out.on(\"error\", reject)\n out.once(\"drain\", () => {\n out.removeListener(\"error\", reject)\n resolve()\n })\n })\n }\n }\n}"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"DataSplitter.js","sourceRoot":"","sources":["../../src/differentialDownloader/DataSplitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { newError } from \"builder-util-runtime\"\nimport { createReadStream } from \"fs\"\nimport { Writable } from \"stream\"\nimport { Operation, OperationKind } from \"./downloadPlanBuilder\"\n\nconst DOUBLE_CRLF = Buffer.from(\"\\r\\n\\r\\n\")\n\nenum ReadState {\n INIT,\n HEADER,\n BODY,\n}\n\nexport interface PartListDataTask {\n readonly oldFileFd: number\n readonly tasks: Array<Operation>\n readonly start: number\n readonly end: number\n}\n\nexport function copyData(task: Operation, out: Writable, oldFileFd: number, reject: (error: Error) => void, resolve: () => void): void {\n const readStream = createReadStream(\"\", {\n fd: oldFileFd,\n autoClose: false,\n start: task.start,\n // end is inclusive\n end: task.end - 1,\n })\n readStream.on(\"error\", reject)\n readStream.once(\"end\", resolve)\n readStream.pipe(out, {\n end: false,\n })\n}\n\nexport class DataSplitter extends Writable {\n partIndex = -1\n\n private headerListBuffer: Buffer | null = null\n private readState = ReadState.INIT\n private ignoreByteCount = 0\n private remainingPartDataCount = 0\n\n private readonly boundaryLength: number\n\n constructor(\n private readonly out: Writable,\n private readonly options: PartListDataTask,\n private readonly partIndexToTaskIndex: Map<number, number>,\n boundary: string,\n private readonly partIndexToLength: Array<number>,\n private readonly finishHandler: () => any\n ) {\n super()\n\n this.boundaryLength = boundary.length + 4 /* size of \\r\\n-- */\n // first chunk doesn't start with \\r\\n\n this.ignoreByteCount = this.boundaryLength - 2\n }\n\n get isFinished(): boolean {\n return this.partIndex === this.partIndexToLength.length\n }\n\n // noinspection JSUnusedGlobalSymbols\n _write(data: Buffer, encoding: string, callback: (error?: Error) => void): void {\n if (this.isFinished) {\n console.error(`Trailing ignored data: ${data.length} bytes`)\n return\n }\n\n this.handleData(data).then(callback).catch(callback)\n }\n\n private async handleData(chunk: Buffer): Promise<undefined> {\n let start = 0\n\n if (this.ignoreByteCount !== 0 && this.remainingPartDataCount !== 0) {\n throw newError(\"Internal error\", \"ERR_DATA_SPLITTER_BYTE_COUNT_MISMATCH\")\n }\n\n if (this.ignoreByteCount > 0) {\n const toIgnore = Math.min(this.ignoreByteCount, chunk.length)\n this.ignoreByteCount -= toIgnore\n start = toIgnore\n } else if (this.remainingPartDataCount > 0) {\n const toRead = Math.min(this.remainingPartDataCount, chunk.length)\n this.remainingPartDataCount -= toRead\n await this.processPartData(chunk, 0, toRead)\n start = toRead\n }\n\n if (start === chunk.length) {\n return\n }\n\n if (this.readState === ReadState.HEADER) {\n const headerListEnd = this.searchHeaderListEnd(chunk, start)\n if (headerListEnd === -1) {\n return\n }\n\n start = headerListEnd\n this.readState = ReadState.BODY\n // header list is ignored, we don't need it\n this.headerListBuffer = null\n }\n\n while (true) {\n if (this.readState === ReadState.BODY) {\n this.readState = ReadState.INIT\n } else {\n this.partIndex++\n\n let taskIndex = this.partIndexToTaskIndex.get(this.partIndex)\n if (taskIndex == null) {\n if (this.isFinished) {\n taskIndex = this.options.end\n } else {\n throw newError(\"taskIndex is null\", \"ERR_DATA_SPLITTER_TASK_INDEX_IS_NULL\")\n }\n }\n\n const prevTaskIndex = this.partIndex === 0 ? this.options.start : this.partIndexToTaskIndex.get(this.partIndex - 1)! + 1 /* prev part is download, next maybe copy */\n if (prevTaskIndex < taskIndex) {\n await this.copyExistingData(prevTaskIndex, taskIndex)\n } else if (prevTaskIndex > taskIndex) {\n throw newError(\"prevTaskIndex must be < taskIndex\", \"ERR_DATA_SPLITTER_TASK_INDEX_ASSERT_FAILED\")\n }\n\n if (this.isFinished) {\n this.onPartEnd()\n this.finishHandler()\n return\n }\n\n start = this.searchHeaderListEnd(chunk, start)\n\n if (start === -1) {\n this.readState = ReadState.HEADER\n return\n }\n }\n\n const partLength = this.partIndexToLength[this.partIndex]\n const end = start + partLength\n const effectiveEnd = Math.min(end, chunk.length)\n await this.processPartStarted(chunk, start, effectiveEnd)\n this.remainingPartDataCount = partLength - (effectiveEnd - start)\n if (this.remainingPartDataCount > 0) {\n return\n }\n\n start = end + this.boundaryLength\n if (start >= chunk.length) {\n this.ignoreByteCount = this.boundaryLength - (chunk.length - end)\n return\n }\n }\n }\n\n private copyExistingData(index: number, end: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const w = (): void => {\n if (index === end) {\n resolve()\n return\n }\n\n const task = this.options.tasks[index]\n if (task.kind !== OperationKind.COPY) {\n reject(new Error(\"Task kind must be COPY\"))\n return\n }\n\n copyData(task, this.out, this.options.oldFileFd, reject, () => {\n index++\n w()\n })\n }\n w()\n })\n }\n\n private searchHeaderListEnd(chunk: Buffer, readOffset: number): number {\n const headerListEnd = chunk.indexOf(DOUBLE_CRLF, readOffset)\n if (headerListEnd !== -1) {\n return headerListEnd + DOUBLE_CRLF.length\n }\n\n // not all headers data were received, save to buffer\n const partialChunk = readOffset === 0 ? chunk : chunk.slice(readOffset)\n if (this.headerListBuffer == null) {\n this.headerListBuffer = partialChunk\n } else {\n this.headerListBuffer = Buffer.concat([this.headerListBuffer, partialChunk])\n }\n return -1\n }\n\n private actualPartLength = 0\n\n private onPartEnd(): void {\n const expectedLength = this.partIndexToLength[this.partIndex - 1]\n if (this.actualPartLength !== expectedLength) {\n throw newError(`Expected length: ${expectedLength} differs from actual: ${this.actualPartLength}`, \"ERR_DATA_SPLITTER_LENGTH_MISMATCH\")\n }\n this.actualPartLength = 0\n }\n\n private processPartStarted(data: Buffer, start: number, end: number): Promise<void> {\n if (this.partIndex !== 0) {\n this.onPartEnd()\n }\n return this.processPartData(data, start, end)\n }\n\n private processPartData(data: Buffer, start: number, end: number): Promise<void> {\n this.actualPartLength += end - start\n const out = this.out\n if (out.write(start === 0 && data.length === end ? data : data.slice(start, end))) {\n return Promise.resolve()\n } else {\n return new Promise((resolve, reject) => {\n out.on(\"error\", reject)\n out.once(\"drain\", () => {\n out.removeListener(\"error\", reject)\n resolve()\n })\n })\n }\n }\n}\n"]}
|
|
@@ -13,7 +13,7 @@ export interface DifferentialDownloaderOptions {
|
|
|
13
13
|
readonly requestHeaders: OutgoingHttpHeaders | null;
|
|
14
14
|
readonly isUseMultipleRangeRequest?: boolean;
|
|
15
15
|
readonly cancellationToken: CancellationToken;
|
|
16
|
-
onProgress
|
|
16
|
+
onProgress?: (progress: ProgressInfo) => void;
|
|
17
17
|
}
|
|
18
18
|
export declare abstract class DifferentialDownloader {
|
|
19
19
|
protected readonly blockAwareFileInfo: BlockMapDataHolder;
|