@onekeyfe/hd-transport 1.2.8-alpha.13 → 1.2.8-alpha.131
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/__tests__/protocol-v2-file-write-pipeline.test.js +478 -0
- package/__tests__/transport-log.test.js +142 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/index.d.ts +119 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +244 -72
- package/dist/protocols/v2/session.d.ts +7 -1
- package/dist/protocols/v2/session.d.ts.map +1 -1
- package/dist/types/messages.d.ts +47 -0
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/transport.d.ts +6 -0
- package/dist/types/transport.d.ts.map +1 -1
- package/dist/utils/transportLog.d.ts.map +1 -1
- package/messages-protocol-v2.json +138 -1
- package/package.json +2 -2
- package/src/constants.ts +10 -1
- package/src/index.ts +1 -0
- package/src/protocols/v2/session.ts +326 -96
- package/src/types/messages.ts +63 -0
- package/src/types/transport.ts +25 -0
- package/src/utils/transportLog.ts +16 -2
package/dist/index.js
CHANGED
|
@@ -276,6 +276,7 @@ const PROTOCOL_V2_BLE_FILE_CHUNK_SIZE = 1800;
|
|
|
276
276
|
const PROTOCOL_V2_BLE_FIRMWARE_FILE_CHUNK_SIZE = 1960;
|
|
277
277
|
const PROTOCOL_V2_BLE_FILE_READ_CHUNK_SIZE = 900;
|
|
278
278
|
const PROTOCOL_V2_BLE_FRAME_MAX_BYTES = 2048;
|
|
279
|
+
const PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW = 2;
|
|
279
280
|
const PROTOCOL_V2_FILE_CHUNK_SIZE = PROTOCOL_V2_WEBUSB_FILE_CHUNK_SIZE;
|
|
280
281
|
const PROTOCOL_V2_CHANNEL_USB = 0;
|
|
281
282
|
const PROTOCOL_V2_CHANNEL_BLE_UART = 1;
|
|
@@ -1107,6 +1108,24 @@ function withProtocolTimeout(promise, timeoutMs, createTimeoutError, onTimeout,
|
|
|
1107
1108
|
}
|
|
1108
1109
|
});
|
|
1109
1110
|
}
|
|
1111
|
+
const resolveProtocolV2CallTimeoutMs = (timeoutMs) => timeoutMs && timeoutMs > 0 ? timeoutMs : PROTOCOL_V2_DEFAULT_RESPONSE_TIMEOUT_MS;
|
|
1112
|
+
function parseFileWriteChunk(request) {
|
|
1113
|
+
var _a;
|
|
1114
|
+
const file = request.file;
|
|
1115
|
+
const offset = Number(file === null || file === void 0 ? void 0 : file.offset);
|
|
1116
|
+
const totalSize = Number(file === null || file === void 0 ? void 0 : file.total_size);
|
|
1117
|
+
const length = Number((_a = file === null || file === void 0 ? void 0 : file.data) === null || _a === void 0 ? void 0 : _a.byteLength);
|
|
1118
|
+
if (typeof (file === null || file === void 0 ? void 0 : file.path) !== 'string' ||
|
|
1119
|
+
!Number.isSafeInteger(offset) ||
|
|
1120
|
+
offset < 0 ||
|
|
1121
|
+
!Number.isSafeInteger(totalSize) ||
|
|
1122
|
+
!Number.isSafeInteger(length) ||
|
|
1123
|
+
length <= 0 ||
|
|
1124
|
+
offset + length > totalSize) {
|
|
1125
|
+
throw new Error('Protocol V2 file write pipeline chunk is invalid');
|
|
1126
|
+
}
|
|
1127
|
+
return { path: file.path, offset, end: offset + length, totalSize };
|
|
1128
|
+
}
|
|
1110
1129
|
class ProtocolV2Session {
|
|
1111
1130
|
constructor(options) {
|
|
1112
1131
|
var _a;
|
|
@@ -1149,43 +1168,47 @@ class ProtocolV2Session {
|
|
|
1149
1168
|
this.pendingWrite = result.catch(() => undefined);
|
|
1150
1169
|
return result;
|
|
1151
1170
|
}
|
|
1171
|
+
reportWriteCompleted(callOptions, writeStartedAt, frameBytes) {
|
|
1172
|
+
var _a, _b;
|
|
1173
|
+
try {
|
|
1174
|
+
(_a = callOptions.onWriteCompleted) === null || _a === void 0 ? void 0 : _a.call(callOptions, {
|
|
1175
|
+
elapsedMs: Math.max(Date.now() - writeStartedAt, 0),
|
|
1176
|
+
frameBytes,
|
|
1177
|
+
});
|
|
1178
|
+
}
|
|
1179
|
+
catch (error) {
|
|
1180
|
+
const { logger, logPrefix = 'ProtocolV2' } = this.options;
|
|
1181
|
+
(_b = logger === null || logger === void 0 ? void 0 : logger.error) === null || _b === void 0 ? void 0 : _b.call(logger, `${logPrefix} write metrics callback failed: ${String(error)}`);
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
createCallTimeoutError(name, timeoutMs) {
|
|
1185
|
+
const { createTimeoutError } = this.options;
|
|
1186
|
+
return createTimeoutError
|
|
1187
|
+
? createTimeoutError(name, timeoutMs)
|
|
1188
|
+
: new Error(`Protocol V2 response timeout after ${timeoutMs}ms for ${name}`);
|
|
1189
|
+
}
|
|
1152
1190
|
executeCall(name, data, callOptions) {
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1191
|
+
if (callOptions.fileWritePipeline) {
|
|
1192
|
+
return this.executeFileWritePipeline(name, data, callOptions, callOptions.fileWritePipeline);
|
|
1193
|
+
}
|
|
1194
|
+
const { prepareCall, writeFrame, readFrame, logger, logPrefix = 'ProtocolV2', generation = 0, } = this.options;
|
|
1195
|
+
const timeoutMs = resolveProtocolV2CallTimeoutMs(callOptions.timeoutMs);
|
|
1157
1196
|
const abortController = new AbortController();
|
|
1158
1197
|
const shouldReduceDebug = shouldReduceProtocolV2Debug(name);
|
|
1159
1198
|
const baseCallContext = Object.assign(Object.assign({ messageName: name, timeoutMs, highThroughput: isProtocolV2HighThroughputCall(name) }, (callOptions.writeWithResponse === undefined
|
|
1160
1199
|
? {}
|
|
1161
1200
|
: { writeWithResponse: callOptions.writeWithResponse })), { generation, signal: abortController.signal });
|
|
1162
1201
|
const runCall = () => __awaiter(this, void 0, void 0, function* () {
|
|
1163
|
-
var _a, _b, _c, _d, _e, _f, _g
|
|
1202
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
1164
1203
|
if (!this.pendingResponseAfterWrite) {
|
|
1165
1204
|
yield (prepareCall === null || prepareCall === void 0 ? void 0 : prepareCall(baseCallContext));
|
|
1166
1205
|
}
|
|
1167
|
-
const protoSeq = this.
|
|
1168
|
-
const frame = ProtocolV2.encodeFrame(schemas, name, data, {
|
|
1169
|
-
packetSrc,
|
|
1170
|
-
router,
|
|
1171
|
-
seq: protoSeq,
|
|
1172
|
-
});
|
|
1173
|
-
if (maxFrameBytes !== undefined && frame.length > maxFrameBytes) {
|
|
1174
|
-
throw new Error(`Protocol V2 frame too large for transport: ${frame.length} > ${maxFrameBytes}`);
|
|
1175
|
-
}
|
|
1206
|
+
const { seq: protoSeq, frame } = this.encodeRequestFrame(name, data);
|
|
1176
1207
|
const writeStartedAt = Date.now();
|
|
1177
1208
|
yield this.serializeWrite(() => writeFrame(frame, baseCallContext));
|
|
1178
|
-
|
|
1179
|
-
(_a = callOptions.onWriteCompleted) === null || _a === void 0 ? void 0 : _a.call(callOptions, {
|
|
1180
|
-
elapsedMs: Math.max(Date.now() - writeStartedAt, 0),
|
|
1181
|
-
frameBytes: frame.byteLength,
|
|
1182
|
-
});
|
|
1183
|
-
}
|
|
1184
|
-
catch (error) {
|
|
1185
|
-
(_b = logger === null || logger === void 0 ? void 0 : logger.error) === null || _b === void 0 ? void 0 : _b.call(logger, `${logPrefix} write metrics callback failed: ${String(error)}`);
|
|
1186
|
-
}
|
|
1209
|
+
this.reportWriteCompleted(callOptions, writeStartedAt, frame.byteLength);
|
|
1187
1210
|
if (callOptions.returnAfterWrite) {
|
|
1188
|
-
if ((
|
|
1211
|
+
if ((_a = callOptions.expectedTypes) === null || _a === void 0 ? void 0 : _a.length) {
|
|
1189
1212
|
this.pendingResponseAfterWrite = {
|
|
1190
1213
|
expectedTypes: new Set(callOptions.expectedTypes),
|
|
1191
1214
|
onResponse: callOptions.onResponseAfterWrite,
|
|
@@ -1197,44 +1220,8 @@ class ProtocolV2Session {
|
|
|
1197
1220
|
const rxFrame = yield readFrame(baseCallContext);
|
|
1198
1221
|
if (abortController.signal.aborted)
|
|
1199
1222
|
break;
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
header = ProtocolV2.inspectFrameHeader(rxFrame);
|
|
1203
|
-
}
|
|
1204
|
-
catch (cause) {
|
|
1205
|
-
throw new ProtocolV2LinkError('frame', `Protocol V2 frame validation failed: ${getErrorMessage(cause)}`, cause);
|
|
1206
|
-
}
|
|
1207
|
-
if (header.router !== router) {
|
|
1208
|
-
throw new ProtocolV2LinkError('router', `Protocol V2 router mismatch: expected ${router}, got ${header.router}`);
|
|
1209
|
-
}
|
|
1210
|
-
if (header.packetSrc !== packetSrc) {
|
|
1211
|
-
throw new ProtocolV2LinkError('packet-source', `Protocol V2 packet source mismatch: expected ${packetSrc}, got ${header.packetSrc}`);
|
|
1212
|
-
}
|
|
1213
|
-
let isAck;
|
|
1214
|
-
try {
|
|
1215
|
-
isAck = ProtocolV2.isAckFrame(rxFrame);
|
|
1216
|
-
}
|
|
1217
|
-
catch (cause) {
|
|
1218
|
-
throw new ProtocolV2LinkError('frame', `Protocol V2 ACK validation failed: ${getErrorMessage(cause)}`, cause);
|
|
1219
|
-
}
|
|
1220
|
-
if (isAck) {
|
|
1221
|
-
if (header.seq !== protoSeq) {
|
|
1222
|
-
throw new ProtocolV2LinkError('ack-sequence', `Protocol V2 ACK sequence mismatch: expected ${protoSeq}, got ${header.seq}`);
|
|
1223
|
-
}
|
|
1224
|
-
}
|
|
1225
|
-
else {
|
|
1226
|
-
let decoded;
|
|
1227
|
-
try {
|
|
1228
|
-
decoded = ProtocolV2.decodeFrame(schemas, rxFrame);
|
|
1229
|
-
}
|
|
1230
|
-
catch (cause) {
|
|
1231
|
-
throw new ProtocolV2LinkError('frame', `Protocol V2 frame decode failed: ${getErrorMessage(cause)}`, cause);
|
|
1232
|
-
}
|
|
1233
|
-
if (this.lastResponseSequence === decoded.seq) {
|
|
1234
|
-
throw new ProtocolV2LinkError('response-sequence', `Protocol V2 duplicate response sequence: ${decoded.seq}`);
|
|
1235
|
-
}
|
|
1236
|
-
this.lastResponseSequence = decoded.seq;
|
|
1237
|
-
const response = call(decoded);
|
|
1223
|
+
const response = this.parseResponseFrame(rxFrame, [protoSeq]);
|
|
1224
|
+
if (response) {
|
|
1238
1225
|
const { pendingResponseAfterWrite } = this;
|
|
1239
1226
|
let belongsToWriteOnlyCall = false;
|
|
1240
1227
|
if (pendingResponseAfterWrite) {
|
|
@@ -1243,34 +1230,194 @@ class ProtocolV2Session {
|
|
|
1243
1230
|
this.pendingResponseAfterWrite = undefined;
|
|
1244
1231
|
if (belongsToWriteOnlyCall) {
|
|
1245
1232
|
try {
|
|
1246
|
-
(
|
|
1233
|
+
(_b = pendingResponseAfterWrite.onResponse) === null || _b === void 0 ? void 0 : _b.call(pendingResponseAfterWrite, response);
|
|
1247
1234
|
}
|
|
1248
1235
|
catch (error) {
|
|
1249
|
-
(
|
|
1236
|
+
(_c = logger === null || logger === void 0 ? void 0 : logger.error) === null || _c === void 0 ? void 0 : _c.call(logger, `${logPrefix} delayed response callback failed: ${String(error)}`);
|
|
1250
1237
|
}
|
|
1251
1238
|
}
|
|
1252
1239
|
}
|
|
1253
1240
|
}
|
|
1254
1241
|
if (belongsToWriteOnlyCall) ;
|
|
1255
|
-
else if ((
|
|
1256
|
-
(
|
|
1242
|
+
else if ((_d = callOptions.intermediateTypes) === null || _d === void 0 ? void 0 : _d.includes(response.type)) {
|
|
1243
|
+
(_e = callOptions.onIntermediateResponse) === null || _e === void 0 ? void 0 : _e.call(callOptions, response);
|
|
1257
1244
|
}
|
|
1258
1245
|
else if (isExpectedTerminalResponse(response, callOptions.expectedTypes)) {
|
|
1259
1246
|
return response;
|
|
1260
1247
|
}
|
|
1261
1248
|
else if (!shouldReduceDebug) {
|
|
1262
|
-
(
|
|
1249
|
+
(_f = logger === null || logger === void 0 ? void 0 : logger.debug) === null || _f === void 0 ? void 0 : _f.call(logger, `[${logPrefix}] skip unexpected response for ${name}: expected=${(_g = callOptions.expectedTypes) === null || _g === void 0 ? void 0 : _g.join('|')} got=${response.type}`);
|
|
1263
1250
|
}
|
|
1264
1251
|
}
|
|
1265
1252
|
}
|
|
1266
1253
|
throw new Error(`Protocol V2 read loop cancelled after timeout for ${name}`);
|
|
1267
1254
|
});
|
|
1268
|
-
return withProtocolTimeout(runCall(), timeoutMs, () =>
|
|
1269
|
-
? createTimeoutError(name, timeoutMs)
|
|
1270
|
-
: new Error(`Protocol V2 response timeout after ${timeoutMs}ms for ${name}`), () => {
|
|
1255
|
+
return withProtocolTimeout(runCall(), timeoutMs, () => this.createCallTimeoutError(name, timeoutMs), () => {
|
|
1271
1256
|
abortController.abort();
|
|
1272
1257
|
});
|
|
1273
1258
|
}
|
|
1259
|
+
encodeRequestFrame(name, data) {
|
|
1260
|
+
const { schemas, router, packetSrc = PROTOCOL_V2_PACKET_SRC_COMMAND, maxFrameBytes, } = this.options;
|
|
1261
|
+
const seq = this.sequenceCursor.next();
|
|
1262
|
+
const frame = ProtocolV2.encodeFrame(schemas, name, data, { packetSrc, router, seq });
|
|
1263
|
+
if (maxFrameBytes !== undefined && frame.length > maxFrameBytes) {
|
|
1264
|
+
throw new Error(`Protocol V2 frame too large for transport: ${frame.length} > ${maxFrameBytes}`);
|
|
1265
|
+
}
|
|
1266
|
+
return { seq, frame };
|
|
1267
|
+
}
|
|
1268
|
+
parseResponseFrame(rxFrame, ackSequences) {
|
|
1269
|
+
const { schemas, router, packetSrc = PROTOCOL_V2_PACKET_SRC_COMMAND } = this.options;
|
|
1270
|
+
let header;
|
|
1271
|
+
try {
|
|
1272
|
+
header = ProtocolV2.inspectFrameHeader(rxFrame);
|
|
1273
|
+
}
|
|
1274
|
+
catch (cause) {
|
|
1275
|
+
throw new ProtocolV2LinkError('frame', `Protocol V2 frame validation failed: ${getErrorMessage(cause)}`, cause);
|
|
1276
|
+
}
|
|
1277
|
+
if (header.router !== router) {
|
|
1278
|
+
throw new ProtocolV2LinkError('router', `Protocol V2 router mismatch: expected ${router}, got ${header.router}`);
|
|
1279
|
+
}
|
|
1280
|
+
if (header.packetSrc !== packetSrc) {
|
|
1281
|
+
throw new ProtocolV2LinkError('packet-source', `Protocol V2 packet source mismatch: expected ${packetSrc}, got ${header.packetSrc}`);
|
|
1282
|
+
}
|
|
1283
|
+
let isAck;
|
|
1284
|
+
try {
|
|
1285
|
+
isAck = ProtocolV2.isAckFrame(rxFrame);
|
|
1286
|
+
}
|
|
1287
|
+
catch (cause) {
|
|
1288
|
+
throw new ProtocolV2LinkError('frame', `Protocol V2 ACK validation failed: ${getErrorMessage(cause)}`, cause);
|
|
1289
|
+
}
|
|
1290
|
+
if (isAck) {
|
|
1291
|
+
if (!ackSequences.includes(header.seq)) {
|
|
1292
|
+
throw new ProtocolV2LinkError('ack-sequence', `Protocol V2 ACK sequence mismatch: expected ${ackSequences.join('|')}, got ${header.seq}`);
|
|
1293
|
+
}
|
|
1294
|
+
return undefined;
|
|
1295
|
+
}
|
|
1296
|
+
let decoded;
|
|
1297
|
+
try {
|
|
1298
|
+
decoded = ProtocolV2.decodeFrame(schemas, rxFrame);
|
|
1299
|
+
}
|
|
1300
|
+
catch (cause) {
|
|
1301
|
+
throw new ProtocolV2LinkError('frame', `Protocol V2 frame decode failed: ${getErrorMessage(cause)}`, cause);
|
|
1302
|
+
}
|
|
1303
|
+
if (this.lastResponseSequence === decoded.seq) {
|
|
1304
|
+
throw new ProtocolV2LinkError('response-sequence', `Protocol V2 duplicate response sequence: ${decoded.seq}`);
|
|
1305
|
+
}
|
|
1306
|
+
this.lastResponseSequence = decoded.seq;
|
|
1307
|
+
return call(decoded);
|
|
1308
|
+
}
|
|
1309
|
+
executeFileWritePipeline(name, data, callOptions, pipeline) {
|
|
1310
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1311
|
+
if (name !== 'FilesystemFileWrite') {
|
|
1312
|
+
throw new Error(`Protocol V2 file write pipeline does not support ${name}`);
|
|
1313
|
+
}
|
|
1314
|
+
if (this.pendingResponseAfterWrite) {
|
|
1315
|
+
throw new Error('Protocol V2 file write pipeline cannot start while a response is pending');
|
|
1316
|
+
}
|
|
1317
|
+
const { prepareCall, writeFrame, readFrame, generation = 0 } = this.options;
|
|
1318
|
+
const timeoutMs = resolveProtocolV2CallTimeoutMs(callOptions.timeoutMs);
|
|
1319
|
+
const abortController = new AbortController();
|
|
1320
|
+
const context = Object.assign(Object.assign({ messageName: name, timeoutMs, highThroughput: true }, (callOptions.writeWithResponse === undefined
|
|
1321
|
+
? {}
|
|
1322
|
+
: { writeWithResponse: callOptions.writeWithResponse })), { generation, signal: abortController.signal });
|
|
1323
|
+
let transportFailure;
|
|
1324
|
+
const withStepTimeout = (promise, stepTimeoutMs = timeoutMs) => withProtocolTimeout(promise, stepTimeoutMs, () => this.createCallTimeoutError(name, timeoutMs), () => {
|
|
1325
|
+
abortController.abort();
|
|
1326
|
+
}).catch((error) => {
|
|
1327
|
+
transportFailure = error;
|
|
1328
|
+
throw error;
|
|
1329
|
+
});
|
|
1330
|
+
let progressDeadline = 0;
|
|
1331
|
+
const markProgress = () => {
|
|
1332
|
+
progressDeadline = Date.now() + timeoutMs;
|
|
1333
|
+
};
|
|
1334
|
+
const inFlight = [];
|
|
1335
|
+
let path;
|
|
1336
|
+
let totalSize;
|
|
1337
|
+
let nextOffset;
|
|
1338
|
+
let sourceDone = false;
|
|
1339
|
+
let failure;
|
|
1340
|
+
let lastConfirmed;
|
|
1341
|
+
const sendChunk = (request) => __awaiter(this, void 0, void 0, function* () {
|
|
1342
|
+
const chunk = parseFileWriteChunk(request);
|
|
1343
|
+
if (path !== undefined && (chunk.path !== path || chunk.totalSize !== totalSize)) {
|
|
1344
|
+
throw new Error('Protocol V2 file write pipeline chunk belongs to a different file');
|
|
1345
|
+
}
|
|
1346
|
+
if (nextOffset !== undefined && chunk.offset !== nextOffset) {
|
|
1347
|
+
throw new Error(`Protocol V2 file write pipeline chunk out of order: expected offset ${nextOffset}, got ${chunk.offset}`);
|
|
1348
|
+
}
|
|
1349
|
+
path = chunk.path;
|
|
1350
|
+
totalSize = chunk.totalSize;
|
|
1351
|
+
nextOffset = chunk.end;
|
|
1352
|
+
const { seq, frame } = this.encodeRequestFrame(name, request);
|
|
1353
|
+
const writeStartedAt = Date.now();
|
|
1354
|
+
yield withStepTimeout(this.serializeWrite(() => writeFrame(frame, context)));
|
|
1355
|
+
inFlight.push({ seq, offset: chunk.offset, end: chunk.end });
|
|
1356
|
+
markProgress();
|
|
1357
|
+
this.reportWriteCompleted(callOptions, writeStartedAt, frame.byteLength);
|
|
1358
|
+
});
|
|
1359
|
+
const sendNextChunk = () => __awaiter(this, void 0, void 0, function* () {
|
|
1360
|
+
const request = yield pipeline.next();
|
|
1361
|
+
if (!request) {
|
|
1362
|
+
sourceDone = true;
|
|
1363
|
+
return;
|
|
1364
|
+
}
|
|
1365
|
+
yield sendChunk(request);
|
|
1366
|
+
});
|
|
1367
|
+
yield withStepTimeout(Promise.resolve().then(() => prepareCall === null || prepareCall === void 0 ? void 0 : prepareCall(context)));
|
|
1368
|
+
try {
|
|
1369
|
+
yield sendChunk(data);
|
|
1370
|
+
while (!sourceDone && inFlight.length < PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW) {
|
|
1371
|
+
yield sendNextChunk();
|
|
1372
|
+
}
|
|
1373
|
+
while (inFlight.length > 0) {
|
|
1374
|
+
const rxFrame = yield withStepTimeout(readFrame(context), Math.max(progressDeadline - Date.now(), 1));
|
|
1375
|
+
const response = this.parseResponseFrame(rxFrame, inFlight.map(item => item.seq));
|
|
1376
|
+
if (!response) {
|
|
1377
|
+
}
|
|
1378
|
+
else if (response.type === 'FilesystemFile') {
|
|
1379
|
+
const [expected] = inFlight;
|
|
1380
|
+
const { message } = response;
|
|
1381
|
+
if (Number(message.processed_byte) !== expected.end ||
|
|
1382
|
+
message.path !== path ||
|
|
1383
|
+
Number(message.offset) !== expected.offset ||
|
|
1384
|
+
Number(message.total_size) !== totalSize) {
|
|
1385
|
+
throw new ProtocolV2LinkError('frame', `Protocol V2 file write response does not match chunk ${expected.offset}-${expected.end}: got offset ${String(message.offset)} processed_byte ${String(message.processed_byte)}`);
|
|
1386
|
+
}
|
|
1387
|
+
inFlight.shift();
|
|
1388
|
+
markProgress();
|
|
1389
|
+
if (!failure) {
|
|
1390
|
+
lastConfirmed = response;
|
|
1391
|
+
pipeline.onResponse(response);
|
|
1392
|
+
if (!sourceDone) {
|
|
1393
|
+
yield sendNextChunk();
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
else if (response.type === 'Failure') {
|
|
1398
|
+
inFlight.shift();
|
|
1399
|
+
markProgress();
|
|
1400
|
+
failure = failure !== null && failure !== void 0 ? failure : response;
|
|
1401
|
+
sourceDone = true;
|
|
1402
|
+
}
|
|
1403
|
+
else if (COMMON_TERMINAL_RESPONSE_TYPES.has(response.type)) {
|
|
1404
|
+
throw new ProtocolV2LinkError('frame', `Protocol V2 file write pipeline received unexpected ${response.type}`);
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
}
|
|
1408
|
+
catch (error) {
|
|
1409
|
+
if (inFlight.length === 0 || error === transportFailure || isProtocolV2LinkError(error)) {
|
|
1410
|
+
throw error;
|
|
1411
|
+
}
|
|
1412
|
+
throw new ProtocolV2LinkError('frame', `Protocol V2 file write pipeline aborted with chunks in flight: ${getErrorMessage(error)}`, error);
|
|
1413
|
+
}
|
|
1414
|
+
const terminal = failure !== null && failure !== void 0 ? failure : lastConfirmed;
|
|
1415
|
+
if (!terminal) {
|
|
1416
|
+
throw new ProtocolV2LinkError('frame', 'Protocol V2 file write pipeline ended unconfirmed');
|
|
1417
|
+
}
|
|
1418
|
+
return terminal;
|
|
1419
|
+
});
|
|
1420
|
+
}
|
|
1274
1421
|
}
|
|
1275
1422
|
function probeProtocolV2({ call, timeoutMs, logger, logPrefix = 'ProtocolV2', onBeforeProbe, onProbeFailed, shouldRethrow, }) {
|
|
1276
1423
|
var _a, _b, _c;
|
|
@@ -2304,6 +2451,17 @@ exports.ViewSignLayout = void 0;
|
|
|
2304
2451
|
ViewSignLayout[ViewSignLayout["LayoutFlat"] = 4] = "LayoutFlat";
|
|
2305
2452
|
ViewSignLayout[ViewSignLayout["LayoutEthApprove"] = 5] = "LayoutEthApprove";
|
|
2306
2453
|
})(exports.ViewSignLayout || (exports.ViewSignLayout = {}));
|
|
2454
|
+
exports.ZcashAddressType = void 0;
|
|
2455
|
+
(function (ZcashAddressType) {
|
|
2456
|
+
ZcashAddressType[ZcashAddressType["UNIFIED_ORCHARD_P2PKH"] = 0] = "UNIFIED_ORCHARD_P2PKH";
|
|
2457
|
+
ZcashAddressType[ZcashAddressType["TRANSPARENT_P2PKH"] = 1] = "TRANSPARENT_P2PKH";
|
|
2458
|
+
ZcashAddressType[ZcashAddressType["UNIFIED_ORCHARD"] = 2] = "UNIFIED_ORCHARD";
|
|
2459
|
+
})(exports.ZcashAddressType || (exports.ZcashAddressType = {}));
|
|
2460
|
+
exports.ZcashAddressScope = void 0;
|
|
2461
|
+
(function (ZcashAddressScope) {
|
|
2462
|
+
ZcashAddressScope[ZcashAddressScope["EXTERNAL"] = 0] = "EXTERNAL";
|
|
2463
|
+
ZcashAddressScope[ZcashAddressScope["INTERNAL"] = 1] = "INTERNAL";
|
|
2464
|
+
})(exports.ZcashAddressScope || (exports.ZcashAddressScope = {}));
|
|
2307
2465
|
exports.ProtocolV2FailureType = void 0;
|
|
2308
2466
|
(function (ProtocolV2FailureType) {
|
|
2309
2467
|
ProtocolV2FailureType[ProtocolV2FailureType["Failure_InvalidMessage"] = 1] = "Failure_InvalidMessage";
|
|
@@ -2425,6 +2583,8 @@ var messages = /*#__PURE__*/Object.freeze({
|
|
|
2425
2583
|
get OnboardingSetupMethod () { return exports.OnboardingSetupMethod; },
|
|
2426
2584
|
get ViewTipType () { return exports.ViewTipType; },
|
|
2427
2585
|
get ViewSignLayout () { return exports.ViewSignLayout; },
|
|
2586
|
+
get ZcashAddressType () { return exports.ZcashAddressType; },
|
|
2587
|
+
get ZcashAddressScope () { return exports.ZcashAddressScope; },
|
|
2428
2588
|
get ProtocolV2FailureType () { return exports.ProtocolV2FailureType; },
|
|
2429
2589
|
get Enum_ProtocolV2Capability () { return exports.Enum_ProtocolV2Capability; }
|
|
2430
2590
|
});
|
|
@@ -2432,29 +2592,39 @@ var messages = /*#__PURE__*/Object.freeze({
|
|
|
2432
2592
|
const REDACTED = '[REDACTED]';
|
|
2433
2593
|
const SENSITIVE_LOG_KEYS = new Set([
|
|
2434
2594
|
'accesstoken',
|
|
2595
|
+
'additionaltxpubkeys',
|
|
2435
2596
|
'address',
|
|
2436
2597
|
'apikey',
|
|
2437
2598
|
'connectid',
|
|
2599
|
+
'datachunk',
|
|
2438
2600
|
'devicestate',
|
|
2439
2601
|
'deviceid',
|
|
2602
|
+
'enckey',
|
|
2440
2603
|
'entropy',
|
|
2441
2604
|
'expectedpassphrasestate',
|
|
2442
2605
|
'mnemonic',
|
|
2606
|
+
'outkey',
|
|
2443
2607
|
'passphrase',
|
|
2444
2608
|
'passphrasestate',
|
|
2445
2609
|
'password',
|
|
2610
|
+
'pczt',
|
|
2446
2611
|
'pin',
|
|
2447
2612
|
'privatekey',
|
|
2448
2613
|
'publickey',
|
|
2449
2614
|
'seed',
|
|
2450
2615
|
'secret',
|
|
2616
|
+
'seedfingerprint',
|
|
2451
2617
|
'serialnumber',
|
|
2452
2618
|
'session',
|
|
2453
2619
|
'sessionid',
|
|
2454
2620
|
'signature',
|
|
2621
|
+
'signedpczt',
|
|
2455
2622
|
'token',
|
|
2623
|
+
'txpubkey',
|
|
2624
|
+
'ufvk',
|
|
2456
2625
|
'uuid',
|
|
2457
2626
|
'walletsessionid',
|
|
2627
|
+
'watchkey',
|
|
2458
2628
|
'xprv',
|
|
2459
2629
|
'xpub',
|
|
2460
2630
|
]);
|
|
@@ -2467,7 +2637,8 @@ const isSensitiveLogKey = (key) => {
|
|
|
2467
2637
|
normalizedKey.endsWith('publickey') ||
|
|
2468
2638
|
normalizedKey.endsWith('signature'));
|
|
2469
2639
|
};
|
|
2470
|
-
const isSigningMessage = (messageName) => Boolean(messageName && /(?:sign|txack|transaction)/i.test(messageName));
|
|
2640
|
+
const isSigningMessage = (messageName) => Boolean(messageName && /(?:sign|txack|transaction|pczt)/i.test(messageName));
|
|
2641
|
+
const isMoneroSecretMessage = (messageName) => Boolean(messageName && /^Monero(?:KeyImage|GetTxKey|LiveRefresh)/.test(messageName));
|
|
2471
2642
|
const redactLogValue = (value, seen) => {
|
|
2472
2643
|
if (ArrayBuffer.isView(value)) {
|
|
2473
2644
|
return `[BINARY:${value.byteLength}]`;
|
|
@@ -2495,7 +2666,7 @@ const redactLogValue = (value, seen) => {
|
|
|
2495
2666
|
return redacted;
|
|
2496
2667
|
};
|
|
2497
2668
|
function getSafeTransportLogPayload(value, messageName) {
|
|
2498
|
-
if (isSigningMessage(messageName)) {
|
|
2669
|
+
if (isSigningMessage(messageName) || isMoneroSecretMessage(messageName)) {
|
|
2499
2670
|
return REDACTED;
|
|
2500
2671
|
}
|
|
2501
2672
|
return redactLogValue(value, new WeakSet());
|
|
@@ -2555,6 +2726,7 @@ exports.PROTOCOL_V2_CHANNEL_SOCKET = PROTOCOL_V2_CHANNEL_SOCKET;
|
|
|
2555
2726
|
exports.PROTOCOL_V2_CHANNEL_USB = PROTOCOL_V2_CHANNEL_USB;
|
|
2556
2727
|
exports.PROTOCOL_V2_DEFAULT_RESPONSE_TIMEOUT_MS = PROTOCOL_V2_DEFAULT_RESPONSE_TIMEOUT_MS;
|
|
2557
2728
|
exports.PROTOCOL_V2_FILE_CHUNK_SIZE = PROTOCOL_V2_FILE_CHUNK_SIZE;
|
|
2729
|
+
exports.PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW = PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW;
|
|
2558
2730
|
exports.PROTOCOL_V2_FRAME_MAX_BYTES = PROTOCOL_V2_FRAME_MAX_BYTES;
|
|
2559
2731
|
exports.PROTOCOL_V2_PACKET_SRC_COMMAND = PROTOCOL_V2_PACKET_SRC_COMMAND;
|
|
2560
2732
|
exports.PROTOCOL_V2_SYS_MESSAGE_THRESHOLD = PROTOCOL_V2_SYS_MESSAGE_THRESHOLD;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ProtocolV2FrameAssembler, concatUint8Arrays } from './frame-assembler';
|
|
2
2
|
import { ProtocolV2SequenceCursor } from './sequence-cursor';
|
|
3
3
|
import type { Root } from 'protobufjs/light';
|
|
4
|
-
import type { MessageFromOneKey, TransportWriteMetrics } from '../../types';
|
|
4
|
+
import type { MessageFromOneKey, ProtocolV2FileWritePipeline, TransportWriteMetrics } from '../../types';
|
|
5
5
|
export * from './errors';
|
|
6
6
|
export type ProtocolV2Schemas = {
|
|
7
7
|
protocolV1: Root;
|
|
@@ -42,6 +42,7 @@ export type ProtocolV2CallOptions = {
|
|
|
42
42
|
returnAfterWrite?: boolean;
|
|
43
43
|
onResponseAfterWrite?: (response: MessageFromOneKey) => void;
|
|
44
44
|
writeWithResponse?: boolean;
|
|
45
|
+
fileWritePipeline?: ProtocolV2FileWritePipeline;
|
|
45
46
|
};
|
|
46
47
|
export { concatUint8Arrays, ProtocolV2FrameAssembler };
|
|
47
48
|
export { ProtocolV2SequenceCursor };
|
|
@@ -66,7 +67,12 @@ export declare class ProtocolV2Session {
|
|
|
66
67
|
call(name: string, data: Record<string, unknown>, callOptions?: ProtocolV2CallOptions): Promise<MessageFromOneKey>;
|
|
67
68
|
sendFlowControl(name: string, data: Record<string, unknown>): Promise<MessageFromOneKey>;
|
|
68
69
|
private serializeWrite;
|
|
70
|
+
private reportWriteCompleted;
|
|
71
|
+
private createCallTimeoutError;
|
|
69
72
|
private executeCall;
|
|
73
|
+
private encodeRequestFrame;
|
|
74
|
+
private parseResponseFrame;
|
|
75
|
+
private executeFileWritePipeline;
|
|
70
76
|
}
|
|
71
77
|
export declare function probeProtocolV2({ call, timeoutMs, logger, logPrefix, onBeforeProbe, onProbeFailed, shouldRethrow, }: {
|
|
72
78
|
call: (name: string, data: Record<string, unknown>, options?: ProtocolV2CallOptions) => Promise<MessageFromOneKey>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/protocols/v2/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/protocols/v2/session.ts"],"names":[],"mappings":"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"}
|
package/dist/types/messages.d.ts
CHANGED
|
@@ -3508,6 +3508,23 @@ export type UiAnimationRequest = {
|
|
|
3508
3508
|
command: UiAnimationCommand;
|
|
3509
3509
|
type?: UiAnimationType;
|
|
3510
3510
|
};
|
|
3511
|
+
export type ZcashSignPczt = {
|
|
3512
|
+
pczt_length: number;
|
|
3513
|
+
pczt_initial_chunk: string;
|
|
3514
|
+
};
|
|
3515
|
+
export type ZcashPcztChunkRequest = {
|
|
3516
|
+
chunk_length: number;
|
|
3517
|
+
};
|
|
3518
|
+
export type ZcashPcztChunkAck = {
|
|
3519
|
+
data_chunk: string;
|
|
3520
|
+
};
|
|
3521
|
+
export type ZcashSignedPczt = {
|
|
3522
|
+
pczt_length: number;
|
|
3523
|
+
pczt_initial_chunk: string;
|
|
3524
|
+
};
|
|
3525
|
+
export type ZcashSignedPcztChunkRequest = {
|
|
3526
|
+
chunk_length: number;
|
|
3527
|
+
};
|
|
3511
3528
|
export type experimental_message = {};
|
|
3512
3529
|
export type experimental_field = {};
|
|
3513
3530
|
export type ProtocolInfoRequest = {
|
|
@@ -4027,6 +4044,29 @@ export type ViewVerifyPage = {
|
|
|
4027
4044
|
chain_id?: number;
|
|
4028
4045
|
content?: ViewContentPreview;
|
|
4029
4046
|
};
|
|
4047
|
+
export declare enum ZcashAddressType {
|
|
4048
|
+
UNIFIED_ORCHARD_P2PKH = 0,
|
|
4049
|
+
TRANSPARENT_P2PKH = 1,
|
|
4050
|
+
UNIFIED_ORCHARD = 2
|
|
4051
|
+
}
|
|
4052
|
+
export declare enum ZcashAddressScope {
|
|
4053
|
+
EXTERNAL = 0,
|
|
4054
|
+
INTERNAL = 1
|
|
4055
|
+
}
|
|
4056
|
+
export type ZcashGetAddress = {
|
|
4057
|
+
address_n: number[];
|
|
4058
|
+
show_display?: boolean;
|
|
4059
|
+
include_seed_fingerprint?: boolean;
|
|
4060
|
+
include_ufvk?: boolean;
|
|
4061
|
+
diversifier_index?: number;
|
|
4062
|
+
address_type?: ZcashAddressType;
|
|
4063
|
+
scope?: ZcashAddressScope;
|
|
4064
|
+
};
|
|
4065
|
+
export type ZcashAddress = {
|
|
4066
|
+
address: string;
|
|
4067
|
+
ufvk?: string;
|
|
4068
|
+
seed_fingerprint?: string;
|
|
4069
|
+
};
|
|
4030
4070
|
export declare enum ProtocolV2FailureType {
|
|
4031
4071
|
Failure_InvalidMessage = 1,
|
|
4032
4072
|
Failure_UndefinedError = 2,
|
|
@@ -4638,6 +4678,11 @@ export type MessageType = {
|
|
|
4638
4678
|
UnlockPath: UnlockPath;
|
|
4639
4679
|
UnlockedPathRequest: UnlockedPathRequest;
|
|
4640
4680
|
UiAnimationRequest: UiAnimationRequest;
|
|
4681
|
+
ZcashSignPczt: ZcashSignPczt;
|
|
4682
|
+
ZcashPcztChunkRequest: ZcashPcztChunkRequest;
|
|
4683
|
+
ZcashPcztChunkAck: ZcashPcztChunkAck;
|
|
4684
|
+
ZcashSignedPczt: ZcashSignedPczt;
|
|
4685
|
+
ZcashSignedPcztChunkRequest: ZcashSignedPcztChunkRequest;
|
|
4641
4686
|
experimental_message: experimental_message;
|
|
4642
4687
|
experimental_field: experimental_field;
|
|
4643
4688
|
ProtocolInfoRequest: ProtocolInfoRequest;
|
|
@@ -4714,6 +4759,8 @@ export type MessageType = {
|
|
|
4714
4759
|
ViewSignPage: ViewSignPage;
|
|
4715
4760
|
ViewWarningPage: ViewWarningPage;
|
|
4716
4761
|
ViewVerifyPage: ViewVerifyPage;
|
|
4762
|
+
ZcashGetAddress: ZcashGetAddress;
|
|
4763
|
+
ZcashAddress: ZcashAddress;
|
|
4717
4764
|
};
|
|
4718
4765
|
export type MessageKey = keyof MessageType;
|
|
4719
4766
|
export type MessageResponse<T extends MessageKey> = {
|