@typeberry/jam 0.1.1-b537c8b → 0.1.1-e48de40
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/block-generator/index.js +132 -94
- package/block-generator/index.js.map +1 -1
- package/importer/index.js +214 -176
- package/importer/index.js.map +1 -1
- package/index.js +374 -340
- package/index.js.map +1 -1
- package/jam-network/index.js +198 -162
- package/jam-network/index.js.map +1 -1
- package/package.json +4 -2
package/jam-network/index.js
CHANGED
|
@@ -25425,6 +25425,34 @@ class WithDebug {
|
|
|
25425
25425
|
}
|
|
25426
25426
|
}
|
|
25427
25427
|
|
|
25428
|
+
;// CONCATENATED MODULE: ./packages/core/utils/dev.ts
|
|
25429
|
+
const dev_env = typeof process === "undefined" ? {} : process.env;
|
|
25430
|
+
/**
|
|
25431
|
+
* The function will produce relative path resolver that is adjusted
|
|
25432
|
+
* for package location within the workspace.
|
|
25433
|
+
*
|
|
25434
|
+
* Example:
|
|
25435
|
+
* $ npm start -w @typeberry/jam
|
|
25436
|
+
*
|
|
25437
|
+
* The above command will run `./bin/jam/index.js`, however we would
|
|
25438
|
+
* still want relative paths to be resolved according to top-level workspace
|
|
25439
|
+
* directory.
|
|
25440
|
+
*
|
|
25441
|
+
* So the caller, passes the absolute workspace path as argument and get's
|
|
25442
|
+
* a function that can properly resolve relative paths.
|
|
25443
|
+
*
|
|
25444
|
+
* NOTE: the translation happens only for development build! When
|
|
25445
|
+
* we build a single library from our project, we no longer mangle the paths.
|
|
25446
|
+
*/
|
|
25447
|
+
const workspacePathFix = dev_env.NODE_ENV === "development"
|
|
25448
|
+
? (workspacePath) => (p) => {
|
|
25449
|
+
if (p.startsWith("/")) {
|
|
25450
|
+
return p;
|
|
25451
|
+
}
|
|
25452
|
+
return `${workspacePath}/${p}`;
|
|
25453
|
+
}
|
|
25454
|
+
: () => (p) => p;
|
|
25455
|
+
|
|
25428
25456
|
;// CONCATENATED MODULE: ./packages/core/utils/opaque.ts
|
|
25429
25457
|
/**
|
|
25430
25458
|
* @fileoverview `Opaque<Type, Token>` constructs a unique type which is a subset of Type with a
|
|
@@ -25768,6 +25796,7 @@ function isResult(x) {
|
|
|
25768
25796
|
|
|
25769
25797
|
|
|
25770
25798
|
|
|
25799
|
+
|
|
25771
25800
|
;// CONCATENATED MODULE: ./packages/core/bytes/bitvec.ts
|
|
25772
25801
|
|
|
25773
25802
|
/**
|
|
@@ -32136,6 +32165,23 @@ function parseLevel(lvl) {
|
|
|
32136
32165
|
;// CONCATENATED MODULE: ./packages/core/logger/console.ts
|
|
32137
32166
|
// biome-ignore-all lint/suspicious/noConsole: logger
|
|
32138
32167
|
|
|
32168
|
+
function print(level, levelAndName, strings, data) {
|
|
32169
|
+
if (level < levelAndName[0]) {
|
|
32170
|
+
return;
|
|
32171
|
+
}
|
|
32172
|
+
const lvlText = Level[level].padEnd(5);
|
|
32173
|
+
const val = strings.map((v, idx) => `${v}${data[idx]}`);
|
|
32174
|
+
const msg = `${lvlText} [${levelAndName[1]}] ${val}`;
|
|
32175
|
+
if (level === Level.WARN) {
|
|
32176
|
+
console.warn(msg);
|
|
32177
|
+
}
|
|
32178
|
+
else if (level === Level.ERROR) {
|
|
32179
|
+
console.error(msg);
|
|
32180
|
+
}
|
|
32181
|
+
else {
|
|
32182
|
+
console.info(msg);
|
|
32183
|
+
}
|
|
32184
|
+
}
|
|
32139
32185
|
/** An optimized logger that ignores `TRACE`, `DEBUG` and `LOG` messages.
|
|
32140
32186
|
*
|
|
32141
32187
|
* Use the `create` method to instantiate the right instance of a more specialized logger.
|
|
@@ -32166,109 +32212,91 @@ class ConsoleTransport {
|
|
|
32166
32212
|
constructor(options) {
|
|
32167
32213
|
this.options = options;
|
|
32168
32214
|
}
|
|
32169
|
-
insane(
|
|
32215
|
+
insane(_levelAndName, _strings, _data) {
|
|
32170
32216
|
/* no-op */
|
|
32171
32217
|
}
|
|
32172
|
-
trace(
|
|
32218
|
+
trace(_levelAndName, _strings, _data) {
|
|
32173
32219
|
/* no-op */
|
|
32174
32220
|
}
|
|
32175
|
-
log(
|
|
32221
|
+
log(_levelAndName, _strings, _data) {
|
|
32176
32222
|
/* no-op */
|
|
32177
32223
|
}
|
|
32178
|
-
info(
|
|
32224
|
+
info(_levelAndName, _strings, _data) {
|
|
32179
32225
|
/* no-op */
|
|
32180
32226
|
}
|
|
32181
|
-
warn(
|
|
32182
|
-
|
|
32227
|
+
warn(levelAndName, strings, data) {
|
|
32228
|
+
print(Level.WARN, levelAndName, strings, data);
|
|
32183
32229
|
}
|
|
32184
|
-
error(
|
|
32185
|
-
|
|
32186
|
-
}
|
|
32187
|
-
push(level, moduleName, val) {
|
|
32188
|
-
const shortModule = moduleName.replace(this.options.workingDir, "");
|
|
32189
|
-
const configuredLevel = findLevel(this.options, moduleName);
|
|
32190
|
-
const lvlText = Level[level].padEnd(5);
|
|
32191
|
-
if (level < configuredLevel) {
|
|
32192
|
-
return;
|
|
32193
|
-
}
|
|
32194
|
-
const msg = `${lvlText} [${shortModule}] ${val}`;
|
|
32195
|
-
if (level === Level.WARN) {
|
|
32196
|
-
console.warn(msg);
|
|
32197
|
-
}
|
|
32198
|
-
else if (level === Level.ERROR) {
|
|
32199
|
-
console.error(msg);
|
|
32200
|
-
}
|
|
32201
|
-
else {
|
|
32202
|
-
console.info(msg);
|
|
32203
|
-
}
|
|
32230
|
+
error(levelAndName, strings, data) {
|
|
32231
|
+
print(Level.ERROR, levelAndName, strings, data);
|
|
32204
32232
|
}
|
|
32205
32233
|
}
|
|
32206
32234
|
/**
|
|
32207
32235
|
* Insane version of console logger - supports insane level.
|
|
32208
32236
|
*/
|
|
32209
32237
|
class InsaneConsoleLogger extends ConsoleTransport {
|
|
32210
|
-
insane(
|
|
32211
|
-
|
|
32238
|
+
insane(levelAndName, strings, data) {
|
|
32239
|
+
print(Level.INSANE, levelAndName, strings, data);
|
|
32212
32240
|
}
|
|
32213
|
-
trace(
|
|
32214
|
-
|
|
32241
|
+
trace(levelAndName, strings, data) {
|
|
32242
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
32215
32243
|
}
|
|
32216
|
-
log(
|
|
32217
|
-
|
|
32244
|
+
log(levelAndName, strings, data) {
|
|
32245
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
32218
32246
|
}
|
|
32219
|
-
info(
|
|
32220
|
-
|
|
32247
|
+
info(levelAndName, strings, data) {
|
|
32248
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
32221
32249
|
}
|
|
32222
32250
|
}
|
|
32223
32251
|
/**
|
|
32224
32252
|
* A basic version of console logger - printing everything.
|
|
32225
32253
|
*/
|
|
32226
32254
|
class TraceConsoleTransport extends ConsoleTransport {
|
|
32227
|
-
insane(
|
|
32255
|
+
insane(_levelAndName, _strings, _data) {
|
|
32228
32256
|
/* no-op */
|
|
32229
32257
|
}
|
|
32230
|
-
trace(
|
|
32231
|
-
|
|
32258
|
+
trace(levelAndName, strings, data) {
|
|
32259
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
32232
32260
|
}
|
|
32233
|
-
log(
|
|
32234
|
-
|
|
32261
|
+
log(levelAndName, strings, data) {
|
|
32262
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
32235
32263
|
}
|
|
32236
|
-
info(
|
|
32237
|
-
|
|
32264
|
+
info(levelAndName, strings, data) {
|
|
32265
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
32238
32266
|
}
|
|
32239
32267
|
}
|
|
32240
32268
|
/**
|
|
32241
32269
|
* An optimized version of the logger - completely ignores `TRACE` level calls.
|
|
32242
32270
|
*/
|
|
32243
32271
|
class LogConsoleTransport extends ConsoleTransport {
|
|
32244
|
-
insane(
|
|
32272
|
+
insane(_levelAndName, _strings, _data) {
|
|
32245
32273
|
/* no-op */
|
|
32246
32274
|
}
|
|
32247
|
-
trace(
|
|
32275
|
+
trace(_levelAndName, _strings, _data) {
|
|
32248
32276
|
/* no-op */
|
|
32249
32277
|
}
|
|
32250
|
-
log(
|
|
32251
|
-
|
|
32278
|
+
log(levelAndName, strings, data) {
|
|
32279
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
32252
32280
|
}
|
|
32253
|
-
info(
|
|
32254
|
-
|
|
32281
|
+
info(levelAndName, strings, data) {
|
|
32282
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
32255
32283
|
}
|
|
32256
32284
|
}
|
|
32257
32285
|
/**
|
|
32258
32286
|
* An optimized version of the logger - completely ignores `TRACE` & `DEBUG` level calls.
|
|
32259
32287
|
*/
|
|
32260
32288
|
class InfoConsoleTransport extends ConsoleTransport {
|
|
32261
|
-
insane(
|
|
32289
|
+
insane(_levelAndName, _strings, _data) {
|
|
32262
32290
|
/* no-op */
|
|
32263
32291
|
}
|
|
32264
|
-
trace(
|
|
32292
|
+
trace(_levelAndName, _strings, _data) {
|
|
32265
32293
|
/* no-op */
|
|
32266
32294
|
}
|
|
32267
|
-
log(
|
|
32295
|
+
log(_levelAndName, _strings, _data) {
|
|
32268
32296
|
/* no-op */
|
|
32269
32297
|
}
|
|
32270
|
-
info(
|
|
32271
|
-
|
|
32298
|
+
info(levelAndName, strings, data) {
|
|
32299
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
32272
32300
|
}
|
|
32273
32301
|
}
|
|
32274
32302
|
|
|
@@ -32305,11 +32333,6 @@ class Logger {
|
|
|
32305
32333
|
const module = moduleName ?? fName;
|
|
32306
32334
|
return new Logger(module.padStart(8, " "), GLOBAL_CONFIG);
|
|
32307
32335
|
}
|
|
32308
|
-
/**
|
|
32309
|
-
* Return currently configured level for given module. */
|
|
32310
|
-
static getLevel(moduleName) {
|
|
32311
|
-
return findLevel(GLOBAL_CONFIG.options, moduleName);
|
|
32312
|
-
}
|
|
32313
32336
|
/**
|
|
32314
32337
|
* Global configuration of all loggers.
|
|
32315
32338
|
*
|
|
@@ -32340,33 +32363,46 @@ class Logger {
|
|
|
32340
32363
|
const options = parseLoggerOptions(input, defaultLevel, workingDir);
|
|
32341
32364
|
Logger.configureAllFromOptions(options);
|
|
32342
32365
|
}
|
|
32366
|
+
cachedLevelAndName;
|
|
32343
32367
|
constructor(moduleName, config) {
|
|
32344
32368
|
this.moduleName = moduleName;
|
|
32345
32369
|
this.config = config;
|
|
32346
32370
|
}
|
|
32371
|
+
/** Return currently configured level for given module. */
|
|
32372
|
+
getLevel() {
|
|
32373
|
+
return this.getLevelAndName()[0];
|
|
32374
|
+
}
|
|
32375
|
+
getLevelAndName() {
|
|
32376
|
+
if (this.cachedLevelAndName === undefined) {
|
|
32377
|
+
const level = findLevel(this.config.options, this.moduleName);
|
|
32378
|
+
const shortName = this.moduleName.replace(this.config.options.workingDir, "");
|
|
32379
|
+
this.cachedLevelAndName = [level, shortName];
|
|
32380
|
+
}
|
|
32381
|
+
return this.cachedLevelAndName;
|
|
32382
|
+
}
|
|
32347
32383
|
/** Log a message with `INSANE` level. */
|
|
32348
|
-
insane(
|
|
32349
|
-
this.config.transport.insane(this.
|
|
32384
|
+
insane(strings, ...data) {
|
|
32385
|
+
this.config.transport.insane(this.getLevelAndName(), strings, data);
|
|
32350
32386
|
}
|
|
32351
32387
|
/** Log a message with `TRACE` level. */
|
|
32352
|
-
trace(
|
|
32353
|
-
this.config.transport.trace(this.
|
|
32388
|
+
trace(strings, ...data) {
|
|
32389
|
+
this.config.transport.trace(this.getLevelAndName(), strings, data);
|
|
32354
32390
|
}
|
|
32355
32391
|
/** Log a message with `DEBUG`/`LOG` level. */
|
|
32356
|
-
log(
|
|
32357
|
-
this.config.transport.log(this.
|
|
32392
|
+
log(strings, ...data) {
|
|
32393
|
+
this.config.transport.log(this.getLevelAndName(), strings, data);
|
|
32358
32394
|
}
|
|
32359
32395
|
/** Log a message with `INFO` level. */
|
|
32360
|
-
info(
|
|
32361
|
-
this.config.transport.info(this.
|
|
32396
|
+
info(strings, ...data) {
|
|
32397
|
+
this.config.transport.info(this.getLevelAndName(), strings, data);
|
|
32362
32398
|
}
|
|
32363
32399
|
/** Log a message with `WARN` level. */
|
|
32364
|
-
warn(
|
|
32365
|
-
this.config.transport.warn(this.
|
|
32400
|
+
warn(strings, ...data) {
|
|
32401
|
+
this.config.transport.warn(this.getLevelAndName(), strings, data);
|
|
32366
32402
|
}
|
|
32367
32403
|
/** Log a message with `ERROR` level. */
|
|
32368
|
-
error(
|
|
32369
|
-
this.config.transport.error(this.
|
|
32404
|
+
error(strings, ...data) {
|
|
32405
|
+
this.config.transport.error(this.getLevelAndName(), strings, data);
|
|
32370
32406
|
}
|
|
32371
32407
|
}
|
|
32372
32408
|
|
|
@@ -32456,15 +32492,15 @@ class NodeConfiguration {
|
|
|
32456
32492
|
}
|
|
32457
32493
|
function loadConfig(configPath) {
|
|
32458
32494
|
if (configPath === DEFAULT_CONFIG) {
|
|
32459
|
-
logger.log
|
|
32495
|
+
logger.log `🔧 Loading DEFAULT config`;
|
|
32460
32496
|
return parseFromJson(configs.default, NodeConfiguration.fromJson);
|
|
32461
32497
|
}
|
|
32462
32498
|
if (configPath === DEV_CONFIG) {
|
|
32463
|
-
logger.log
|
|
32499
|
+
logger.log `🔧 Loading DEV config`;
|
|
32464
32500
|
return parseFromJson(configs.dev, NodeConfiguration.fromJson);
|
|
32465
32501
|
}
|
|
32466
32502
|
try {
|
|
32467
|
-
logger.log
|
|
32503
|
+
logger.log `🔧 Loading config from ${configPath}`;
|
|
32468
32504
|
const configFile = fs.readFileSync(configPath, "utf8");
|
|
32469
32505
|
const parsed = JSON.parse(configFile);
|
|
32470
32506
|
return parseFromJson(parsed, NodeConfiguration.fromJson);
|
|
@@ -36170,7 +36206,7 @@ class LmdbStates {
|
|
|
36170
36206
|
await Promise.all([valuesWrite, statesWrite]);
|
|
36171
36207
|
}
|
|
36172
36208
|
catch (e) {
|
|
36173
|
-
states_logger.error
|
|
36209
|
+
states_logger.error `${e}`;
|
|
36174
36210
|
return Result.error(StateUpdateError.Commit);
|
|
36175
36211
|
}
|
|
36176
36212
|
return Result.ok(OK);
|
|
@@ -36279,7 +36315,7 @@ class TypedPort {
|
|
|
36279
36315
|
this.dispatchPortMessage(msg);
|
|
36280
36316
|
}
|
|
36281
36317
|
catch (e) {
|
|
36282
|
-
port_logger.error
|
|
36318
|
+
port_logger.error `[${this.constructor.name}] Failed to dispatch a message: ${e}: ${msg}`;
|
|
36283
36319
|
throw e;
|
|
36284
36320
|
}
|
|
36285
36321
|
});
|
|
@@ -36353,7 +36389,7 @@ class TypedPort {
|
|
|
36353
36389
|
this.port.postMessage(msg, transferList);
|
|
36354
36390
|
}
|
|
36355
36391
|
catch (e) {
|
|
36356
|
-
port_logger.error
|
|
36392
|
+
port_logger.error `[${this.constructor.name}] Failed to post a message: ${e}: ${msg}`;
|
|
36357
36393
|
throw e;
|
|
36358
36394
|
}
|
|
36359
36395
|
}
|
|
@@ -36384,7 +36420,7 @@ class TypedPort {
|
|
|
36384
36420
|
cleanup(reason) {
|
|
36385
36421
|
// resolve all pending requests with an error.
|
|
36386
36422
|
const responseListeners = this.responseListeners.eventNames();
|
|
36387
|
-
for (const ev
|
|
36423
|
+
for (const ev of responseListeners) {
|
|
36388
36424
|
this.responseListeners.emit(ev, new Error(`port is ${reason}`));
|
|
36389
36425
|
}
|
|
36390
36426
|
}
|
|
@@ -36433,7 +36469,7 @@ class MessageChannelStateMachine {
|
|
|
36433
36469
|
this.dispatchSignal(name, data);
|
|
36434
36470
|
}
|
|
36435
36471
|
catch (e) {
|
|
36436
|
-
channel_logger.error
|
|
36472
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch signal (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
36437
36473
|
throw e;
|
|
36438
36474
|
}
|
|
36439
36475
|
});
|
|
@@ -36442,7 +36478,7 @@ class MessageChannelStateMachine {
|
|
|
36442
36478
|
await this.dispatchRequest(name, data, msg);
|
|
36443
36479
|
}
|
|
36444
36480
|
catch (e) {
|
|
36445
|
-
channel_logger.error
|
|
36481
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch request (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
36446
36482
|
throw e;
|
|
36447
36483
|
}
|
|
36448
36484
|
});
|
|
@@ -36528,7 +36564,7 @@ class MessageChannelStateMachine {
|
|
|
36528
36564
|
this.machine.transition(res.transitionTo.state, res.transitionTo.data);
|
|
36529
36565
|
}
|
|
36530
36566
|
if (didStateChangeInMeantime) {
|
|
36531
|
-
channel_logger.warn
|
|
36567
|
+
channel_logger.warn `Ignoring obsolete response for an old request: "${name}"`;
|
|
36532
36568
|
return;
|
|
36533
36569
|
}
|
|
36534
36570
|
return this.port.respond(prevState.stateName, msg, res.response);
|
|
@@ -36544,7 +36580,7 @@ class MessageChannelStateMachine {
|
|
|
36544
36580
|
}
|
|
36545
36581
|
}
|
|
36546
36582
|
transitionTo() {
|
|
36547
|
-
channel_logger.trace
|
|
36583
|
+
channel_logger.trace `[${this.machine.name}] transitioned to ${this.currentState()}`;
|
|
36548
36584
|
return this;
|
|
36549
36585
|
}
|
|
36550
36586
|
/**
|
|
@@ -36564,7 +36600,7 @@ class MessageChannelStateMachine {
|
|
|
36564
36600
|
await promise;
|
|
36565
36601
|
}
|
|
36566
36602
|
catch (e) {
|
|
36567
|
-
channel_logger.error
|
|
36603
|
+
channel_logger.error `${e}`;
|
|
36568
36604
|
}
|
|
36569
36605
|
return new MessageChannelStateMachine(machine, port);
|
|
36570
36606
|
}
|
|
@@ -36767,7 +36803,7 @@ class State {
|
|
|
36767
36803
|
* actions.
|
|
36768
36804
|
*/
|
|
36769
36805
|
onActivation(data) {
|
|
36770
|
-
state_logger.trace
|
|
36806
|
+
state_logger.trace `[${this.constructor.name}] Changing state to: ${this}`;
|
|
36771
36807
|
this.data = data;
|
|
36772
36808
|
}
|
|
36773
36809
|
/**
|
|
@@ -36865,7 +36901,7 @@ async function spawnWorkerGeneric(bootstrapPath, logger, mainReadyName, mainRead
|
|
|
36865
36901
|
const worker = new external_node_worker_threads_namespaceObject.Worker(bootstrapPath);
|
|
36866
36902
|
const machine = stateMachineMain(`main->${mainReadyName}`, mainReadyName, mainReadyState);
|
|
36867
36903
|
const channel = await MessageChannelStateMachine.createAndTransferChannel(machine, worker);
|
|
36868
|
-
logger.trace
|
|
36904
|
+
logger.trace `[${machine.name}] Worker spawned ${channel.currentState()}`;
|
|
36869
36905
|
return channel;
|
|
36870
36906
|
}
|
|
36871
36907
|
|
|
@@ -36962,11 +36998,11 @@ class PeersManagement {
|
|
|
36962
36998
|
_onPeerDisconnected = [];
|
|
36963
36999
|
peers = new Map();
|
|
36964
37000
|
peerConnected(peer) {
|
|
36965
|
-
peers_logger.info
|
|
37001
|
+
peers_logger.info `💡 Peer ${displayId(peer)} connected.`;
|
|
36966
37002
|
const oldPeerData = this.peers.get(peer.id);
|
|
36967
37003
|
if (oldPeerData !== undefined) {
|
|
36968
37004
|
// TODO [ToDr] replacing old connection?
|
|
36969
|
-
peers_logger.warn
|
|
37005
|
+
peers_logger.warn `Replacing older connection.`;
|
|
36970
37006
|
}
|
|
36971
37007
|
this.peers.set(peer.id, peer);
|
|
36972
37008
|
for (const callback of this._onPeerConnected) {
|
|
@@ -36974,7 +37010,7 @@ class PeersManagement {
|
|
|
36974
37010
|
}
|
|
36975
37011
|
}
|
|
36976
37012
|
peerDisconnected(peer) {
|
|
36977
|
-
peers_logger.info
|
|
37013
|
+
peers_logger.info `⚡︎Peer ${displayId(peer)} disconnected.`;
|
|
36978
37014
|
this.peers.delete(peer.id);
|
|
36979
37015
|
for (const callback of this._onPeerDisconnected) {
|
|
36980
37016
|
callback(peer);
|
|
@@ -45766,23 +45802,23 @@ var VerifyCertError;
|
|
|
45766
45802
|
VerifyCertError[VerifyCertError["IncorrectSignature"] = 4] = "IncorrectSignature";
|
|
45767
45803
|
})(VerifyCertError || (VerifyCertError = {}));
|
|
45768
45804
|
async function verifyCertificate(certs) {
|
|
45769
|
-
certificate_logger.log
|
|
45805
|
+
certificate_logger.log `Incoming peer. Verifying certificate`;
|
|
45770
45806
|
// Must present exactly one cert
|
|
45771
45807
|
if (certs.length !== 1) {
|
|
45772
|
-
certificate_logger.log
|
|
45808
|
+
certificate_logger.log `Rejecting peer: expected exactly one certificate, got: ${certs.length}`;
|
|
45773
45809
|
return result_Result.error(VerifyCertError.NoCertificate);
|
|
45774
45810
|
}
|
|
45775
45811
|
// Parse with Node's X509Certificate (accepts PEM or DER)
|
|
45776
45812
|
const xc = new (external_node_crypto_default()).X509Certificate(certs[0]);
|
|
45777
45813
|
// Must be Ed25519 key
|
|
45778
45814
|
if (xc.publicKey.asymmetricKeyType !== CURVE_NAME.toLowerCase()) {
|
|
45779
|
-
certificate_logger.log
|
|
45815
|
+
certificate_logger.log `Rejecting peer using non-ed25519 certificate: ${xc.publicKey.asymmetricKeyType}`;
|
|
45780
45816
|
return result_Result.error(VerifyCertError.NotEd25519);
|
|
45781
45817
|
}
|
|
45782
45818
|
// Extract raw public key via JWK export
|
|
45783
45819
|
const jwk = xc.publicKey.export({ format: "jwk" });
|
|
45784
45820
|
if (jwk.kty !== KEY_TYPE || jwk.crv !== CURVE_NAME) {
|
|
45785
|
-
certificate_logger.log
|
|
45821
|
+
certificate_logger.log `Public key type mismatch: ${jwk.kty}, ${jwk.crv}`;
|
|
45786
45822
|
return result_Result.error(VerifyCertError.PublicKeyTypeMismatch);
|
|
45787
45823
|
}
|
|
45788
45824
|
// SAN must be exactly 'e'+base32(rawPub)
|
|
@@ -45790,7 +45826,7 @@ async function verifyCertificate(certs) {
|
|
|
45790
45826
|
const sanField = xc.subjectAltName ?? "";
|
|
45791
45827
|
const m = sanField.match(/DNS:([^,]+)/);
|
|
45792
45828
|
if (m === null || m[1] !== expectedSan) {
|
|
45793
|
-
certificate_logger.log
|
|
45829
|
+
certificate_logger.log `AltName mismatch. Expected: '${expectedSan}', got: '${m?.[1]}'`;
|
|
45794
45830
|
return result_Result.error(VerifyCertError.AltNameMismatch);
|
|
45795
45831
|
}
|
|
45796
45832
|
const key = Buffer.from(jwk.x ?? "", "base64url");
|
|
@@ -46057,19 +46093,19 @@ class QuicNetwork {
|
|
|
46057
46093
|
}
|
|
46058
46094
|
this.started = true;
|
|
46059
46095
|
await this.socket.start({ host: this.listen.host, port: this.listen.port });
|
|
46060
|
-
quic_network_logger.info
|
|
46096
|
+
quic_network_logger.info `🛜 QUIC socket on ${this.socket.host}:${this.socket.port}`;
|
|
46061
46097
|
await this.server.start();
|
|
46062
|
-
quic_network_logger.log
|
|
46098
|
+
quic_network_logger.log `🛜 QUIC server listening`;
|
|
46063
46099
|
}
|
|
46064
46100
|
async stop() {
|
|
46065
46101
|
if (!this.started) {
|
|
46066
46102
|
throw new Error("Network not started yet!");
|
|
46067
46103
|
}
|
|
46068
|
-
quic_network_logger.info
|
|
46104
|
+
quic_network_logger.info `Stopping the networking.`;
|
|
46069
46105
|
await this.server.stop();
|
|
46070
46106
|
await this.socket.stop();
|
|
46071
46107
|
this.started = false;
|
|
46072
|
-
quic_network_logger.info
|
|
46108
|
+
quic_network_logger.info `Networking stopped.`;
|
|
46073
46109
|
}
|
|
46074
46110
|
get peers() {
|
|
46075
46111
|
return this._peers;
|
|
@@ -46090,7 +46126,7 @@ clazz, callback) {
|
|
|
46090
46126
|
await callback(ev);
|
|
46091
46127
|
}
|
|
46092
46128
|
catch (e) {
|
|
46093
|
-
quic_utils_logger.error
|
|
46129
|
+
quic_utils_logger.error `Unhandled exception in ${clazz.name} event handler: ${e}`;
|
|
46094
46130
|
}
|
|
46095
46131
|
});
|
|
46096
46132
|
}
|
|
@@ -46149,7 +46185,7 @@ class QuicPeer {
|
|
|
46149
46185
|
streamEvents = new (external_node_events_default())();
|
|
46150
46186
|
constructor(conn, peerInfo) {
|
|
46151
46187
|
this.conn = conn;
|
|
46152
|
-
quic_peer_logger.log
|
|
46188
|
+
quic_peer_logger.log `👥 [${peerInfo.id}] peer connected ${conn.remoteHost}:${conn.remotePort}`;
|
|
46153
46189
|
this.connectionId = conn.connectionIdShared.toString();
|
|
46154
46190
|
this.address = {
|
|
46155
46191
|
host: conn.remoteHost,
|
|
@@ -46159,11 +46195,11 @@ class QuicPeer {
|
|
|
46159
46195
|
this.key = peerInfo.key;
|
|
46160
46196
|
addEventListener(conn, EventQUICConnectionStream, (ev) => {
|
|
46161
46197
|
const stream = ev.detail;
|
|
46162
|
-
quic_peer_logger.log
|
|
46198
|
+
quic_peer_logger.log `🚰 [${this.id}] new stream: [${stream.streamId}]`;
|
|
46163
46199
|
this.streamEvents.emit("stream", new QuicStream(stream));
|
|
46164
46200
|
});
|
|
46165
46201
|
addEventListener(conn, EventQUICConnectionError, (err) => {
|
|
46166
|
-
quic_peer_logger.error
|
|
46202
|
+
quic_peer_logger.error `❌ [${this.id}] connection failed: ${err.detail}`;
|
|
46167
46203
|
});
|
|
46168
46204
|
}
|
|
46169
46205
|
addOnIncomingStream(streamCallback) {
|
|
@@ -46171,11 +46207,11 @@ class QuicPeer {
|
|
|
46171
46207
|
}
|
|
46172
46208
|
openStream() {
|
|
46173
46209
|
const stream = this.conn.newStream("bidi");
|
|
46174
|
-
quic_peer_logger.log
|
|
46210
|
+
quic_peer_logger.log `🚰 [${this.id}] opening stream: [${stream.streamId}]`;
|
|
46175
46211
|
return new QuicStream(stream);
|
|
46176
46212
|
}
|
|
46177
46213
|
async disconnect() {
|
|
46178
|
-
quic_peer_logger.log
|
|
46214
|
+
quic_peer_logger.log `👋 [${this.id}] disconnecting`;
|
|
46179
46215
|
await this.conn.stop({ isApp: true });
|
|
46180
46216
|
}
|
|
46181
46217
|
}
|
|
@@ -46196,7 +46232,7 @@ const setup_logger = Logger.new(import.meta.filename, "net");
|
|
|
46196
46232
|
class Quic {
|
|
46197
46233
|
/** Setup QUIC socket and start listening for connections. */
|
|
46198
46234
|
static async setup({ host, port, protocols, key }) {
|
|
46199
|
-
const quicLoggerLvl =
|
|
46235
|
+
const quicLoggerLvl = setup_logger.getLevel() > Level.TRACE ? LogLevel.WARN : LogLevel.DEBUG;
|
|
46200
46236
|
const quicLogger = new dist_Logger("quic", quicLoggerLvl, [
|
|
46201
46237
|
new handlers_StreamHandler(format `${level}:${keys}:${msg}`),
|
|
46202
46238
|
]);
|
|
@@ -46219,7 +46255,7 @@ class Quic {
|
|
|
46219
46255
|
verifyPeer: true,
|
|
46220
46256
|
verifyCallback: lastConnectedPeer.verifyCallback,
|
|
46221
46257
|
};
|
|
46222
|
-
setup_logger.info
|
|
46258
|
+
setup_logger.info `🆔 Peer id: ** ${altNameRaw(key.pubKey)}@${host}:${port} ** (pubkey: ${key.pubKey})`;
|
|
46223
46259
|
// Shared injected UDP socket
|
|
46224
46260
|
const socket = new dist_QUICSocket({
|
|
46225
46261
|
logger: quicLogger.getChild("socket"),
|
|
@@ -46234,8 +46270,8 @@ class Quic {
|
|
|
46234
46270
|
// peer management
|
|
46235
46271
|
const peers = new PeersManagement();
|
|
46236
46272
|
// basic error handling
|
|
46237
|
-
addEventListener(server, EventQUICServerError, (error) => setup_logger.error
|
|
46238
|
-
addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error
|
|
46273
|
+
addEventListener(server, EventQUICServerError, (error) => setup_logger.error `🛜 Server error: ${error}`);
|
|
46274
|
+
addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error `🛜 Server stopped: ${ev}`);
|
|
46239
46275
|
// handling incoming session
|
|
46240
46276
|
addEventListener(server, EventQUICServerConnection, async (ev) => {
|
|
46241
46277
|
const conn = ev.detail;
|
|
@@ -46244,16 +46280,16 @@ class Quic {
|
|
|
46244
46280
|
return;
|
|
46245
46281
|
}
|
|
46246
46282
|
if (lastConnectedPeer.info.key.isEqualTo(key.pubKey)) {
|
|
46247
|
-
setup_logger.log
|
|
46283
|
+
setup_logger.log `🛜 Rejecting connection from ourself from ${conn.remoteHost}:${conn.remotePort}`;
|
|
46248
46284
|
await conn.stop();
|
|
46249
46285
|
return;
|
|
46250
46286
|
}
|
|
46251
46287
|
if (peers.isConnected(lastConnectedPeer.info.id)) {
|
|
46252
|
-
setup_logger.log
|
|
46288
|
+
setup_logger.log `🛜 Rejecting duplicate connection with peer ${lastConnectedPeer.info.id} from ${conn.remoteHost}:${conn.remotePort}`;
|
|
46253
46289
|
await conn.stop();
|
|
46254
46290
|
return;
|
|
46255
46291
|
}
|
|
46256
|
-
setup_logger.log
|
|
46292
|
+
setup_logger.log `🛜 Server handshake with ${conn.remoteHost}:${conn.remotePort}`;
|
|
46257
46293
|
newPeer(conn, lastConnectedPeer.info);
|
|
46258
46294
|
lastConnectedPeer.info = null;
|
|
46259
46295
|
await conn.start();
|
|
@@ -46276,10 +46312,10 @@ class Quic {
|
|
|
46276
46312
|
});
|
|
46277
46313
|
const client = await clientLater;
|
|
46278
46314
|
addEventListener(client, EventQUICClientClose, () => {
|
|
46279
|
-
setup_logger.log
|
|
46315
|
+
setup_logger.log `⚰️ Client connection closed.`;
|
|
46280
46316
|
});
|
|
46281
46317
|
addEventListener(client, EventQUICClientError, (error) => {
|
|
46282
|
-
setup_logger.error
|
|
46318
|
+
setup_logger.error `🔴 Client error: ${error.detail}`;
|
|
46283
46319
|
});
|
|
46284
46320
|
if (peerDetails.info === null) {
|
|
46285
46321
|
throw new Error("Client connected, but there is no peer details!");
|
|
@@ -46287,7 +46323,7 @@ class Quic {
|
|
|
46287
46323
|
if (options.verifyName !== undefined && options.verifyName !== peerDetails.info.id) {
|
|
46288
46324
|
throw new Error(`Client connected, but the id didn't match. Expected: ${options.verifyName}, got: ${peerDetails.info.id}`);
|
|
46289
46325
|
}
|
|
46290
|
-
setup_logger.log
|
|
46326
|
+
setup_logger.log `🤝 Client handshake with: ${peer.host}:${peer.port}`;
|
|
46291
46327
|
return newPeer(client.connection, peerDetails.info);
|
|
46292
46328
|
}
|
|
46293
46329
|
function newPeer(conn, peerInfo) {
|
|
@@ -46407,10 +46443,10 @@ class Connections {
|
|
|
46407
46443
|
for (;;) {
|
|
46408
46444
|
// increase the reconnection counter
|
|
46409
46445
|
meta.currentRetry += 1;
|
|
46410
|
-
if (meta.currentRetry
|
|
46446
|
+
if (meta.currentRetry > meta.maxRetries) {
|
|
46411
46447
|
// reached max retries for a peer, remove it from tracking.
|
|
46412
46448
|
this.peerInfo.delete(id);
|
|
46413
|
-
jamnp_s_peers_logger.log
|
|
46449
|
+
jamnp_s_peers_logger.log `[${id}] max retries reached. Removing peer.`;
|
|
46414
46450
|
return;
|
|
46415
46451
|
}
|
|
46416
46452
|
// else attempt to connect to a node a bit later.
|
|
@@ -46429,7 +46465,7 @@ class Connections {
|
|
|
46429
46465
|
}
|
|
46430
46466
|
// attempt to connect to the peer
|
|
46431
46467
|
try {
|
|
46432
|
-
jamnp_s_peers_logger.trace
|
|
46468
|
+
jamnp_s_peers_logger.trace `[${id}] Attempting to connect to peer at ${meta.address.host}:${meta.address.port}.`;
|
|
46433
46469
|
await this.network.dial(meta.address, { signal, verifyName: meta.peerId });
|
|
46434
46470
|
return;
|
|
46435
46471
|
}
|
|
@@ -46438,7 +46474,7 @@ class Connections {
|
|
|
46438
46474
|
return;
|
|
46439
46475
|
}
|
|
46440
46476
|
// failing to connect, will retry.
|
|
46441
|
-
jamnp_s_peers_logger.trace
|
|
46477
|
+
jamnp_s_peers_logger.trace `[${id}] attempt failed. Will retry (${meta.currentRetry}/${meta.maxRetries})`;
|
|
46442
46478
|
}
|
|
46443
46479
|
}
|
|
46444
46480
|
}
|
|
@@ -46551,7 +46587,7 @@ class StreamManager {
|
|
|
46551
46587
|
// We expect a one-byte identifier first.
|
|
46552
46588
|
const data = await reader.read();
|
|
46553
46589
|
bytes = bytes_BytesBlob.blobFrom(data.value !== undefined ? data.value : new Uint8Array());
|
|
46554
|
-
stream_manager_logger.trace
|
|
46590
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${streamId}] Initial data: ${bytes}`;
|
|
46555
46591
|
}
|
|
46556
46592
|
finally {
|
|
46557
46593
|
reader.releaseLock();
|
|
@@ -46565,7 +46601,7 @@ class StreamManager {
|
|
|
46565
46601
|
if (handler === undefined) {
|
|
46566
46602
|
throw new Error(`Unsupported stream kind: ${kind}`);
|
|
46567
46603
|
}
|
|
46568
|
-
stream_manager_logger.log
|
|
46604
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${stream.streamId}] Stream identified as: ${kind}`;
|
|
46569
46605
|
this.registerStream(peer, handler, stream, bytes_BytesBlob.blobFrom(bytes.raw.subarray(1)));
|
|
46570
46606
|
}
|
|
46571
46607
|
registerStream(peer, handler, stream, initialData) {
|
|
@@ -46575,7 +46611,7 @@ class StreamManager {
|
|
|
46575
46611
|
this.streams.delete(streamId);
|
|
46576
46612
|
this.backgroundTasks.delete(streamId);
|
|
46577
46613
|
if (kind === StreamErrorKind.Exception) {
|
|
46578
|
-
stream_manager_logger.error
|
|
46614
|
+
stream_manager_logger.error `🚰 --- [${peer.id}:${streamId}] Stream error: ${e}. Disconnecting peer.`;
|
|
46579
46615
|
}
|
|
46580
46616
|
if (kind !== StreamErrorKind.LocalClose) {
|
|
46581
46617
|
// whenever we have an error, we are going to inform the handler
|
|
@@ -46609,10 +46645,10 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
46609
46645
|
let isDone = false;
|
|
46610
46646
|
const callback = handleMessageFragmentation((data) => {
|
|
46611
46647
|
const bytes = bytes_BytesBlob.blobFrom(new Uint8Array(data));
|
|
46612
|
-
stream_manager_logger.trace
|
|
46648
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${quicStream.streamId}] ${bytes}`;
|
|
46613
46649
|
handler.onStreamMessage(quicStream, bytes);
|
|
46614
46650
|
}, () => {
|
|
46615
|
-
stream_manager_logger.error
|
|
46651
|
+
stream_manager_logger.error `🚰 --> [${peer.id}:${quicStream.streamId}] got too much data. Disconnecting.`;
|
|
46616
46652
|
peer.disconnect();
|
|
46617
46653
|
});
|
|
46618
46654
|
for (;;) {
|
|
@@ -46621,7 +46657,7 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
46621
46657
|
// be a promise, so that we can make back pressure here.
|
|
46622
46658
|
callback(bytes.raw);
|
|
46623
46659
|
if (isDone) {
|
|
46624
|
-
stream_manager_logger.log
|
|
46660
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${quicStream.streamId}] remote finished.`;
|
|
46625
46661
|
return;
|
|
46626
46662
|
}
|
|
46627
46663
|
// await for more data
|
|
@@ -46664,7 +46700,7 @@ class QuicStreamSender {
|
|
|
46664
46700
|
return;
|
|
46665
46701
|
}
|
|
46666
46702
|
const { data, addPrefix } = chunk;
|
|
46667
|
-
stream_manager_logger.trace
|
|
46703
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] write: ${data}`;
|
|
46668
46704
|
if (addPrefix) {
|
|
46669
46705
|
await writer.write(encodeMessageLength(data.raw));
|
|
46670
46706
|
}
|
|
@@ -46681,7 +46717,7 @@ class QuicStreamSender {
|
|
|
46681
46717
|
}
|
|
46682
46718
|
close() {
|
|
46683
46719
|
handleAsyncErrors(async () => {
|
|
46684
|
-
stream_manager_logger.trace
|
|
46720
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] closing`;
|
|
46685
46721
|
if (this.currentWriterPromise !== null) {
|
|
46686
46722
|
await this.currentWriterPromise;
|
|
46687
46723
|
}
|
|
@@ -46767,7 +46803,7 @@ class ServerHandler {
|
|
|
46767
46803
|
}
|
|
46768
46804
|
onStreamMessage(sender, message) {
|
|
46769
46805
|
const request = decoder_Decoder.decodeObject(BlockRequest.Codec, message);
|
|
46770
|
-
ce_128_block_request_logger.log
|
|
46806
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Client has requested: ${request}`;
|
|
46771
46807
|
const blocks = this.getBlockSequence(sender.streamId, request.headerHash, request.direction, request.maxBlocks);
|
|
46772
46808
|
sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceFixLen(block_Block.Codec.View, blocks.length), blocks, this.chainSpec));
|
|
46773
46809
|
sender.close();
|
|
@@ -46787,7 +46823,7 @@ class ClientHandler {
|
|
|
46787
46823
|
throw new Error("Received an unexpected message from the server.");
|
|
46788
46824
|
}
|
|
46789
46825
|
const blocks = decoder_Decoder.decodeSequence(block_Block.Codec.View, message, this.chainSpec);
|
|
46790
|
-
ce_128_block_request_logger.log
|
|
46826
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Server returned ${blocks.length} blocks in ${message.length} bytes of data.`;
|
|
46791
46827
|
this.promiseResolvers.get(sender.streamId)?.(blocks);
|
|
46792
46828
|
this.promiseResolvers.delete(sender.streamId);
|
|
46793
46829
|
}
|
|
@@ -46958,13 +46994,13 @@ class ce_129_state_request_Handler {
|
|
|
46958
46994
|
}
|
|
46959
46995
|
onStreamMessage(sender, message) {
|
|
46960
46996
|
if (this.isServer) {
|
|
46961
|
-
ce_129_state_request_logger.info
|
|
46997
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: Received request.`;
|
|
46962
46998
|
if (this.getBoundaryNodes === undefined || this.getKeyValuePairs === undefined)
|
|
46963
46999
|
return;
|
|
46964
47000
|
const request = Decoder.decodeObject(StateRequest.Codec, message);
|
|
46965
47001
|
const boundaryNodes = this.getBoundaryNodes(request.headerHash, request.startKey, request.endKey);
|
|
46966
47002
|
const keyValuePairs = this.getKeyValuePairs(request.headerHash, request.startKey, request.endKey);
|
|
46967
|
-
ce_129_state_request_logger.info
|
|
47003
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: <-- responding with boundary nodes and key value pairs.`;
|
|
46968
47004
|
sender.bufferAndSend(Encoder.encodeObject(codec.sequenceVarLen(trieNodeCodec), boundaryNodes));
|
|
46969
47005
|
sender.bufferAndSend(Encoder.encodeObject(StateResponse.Codec, StateResponse.create({ keyValuePairs })));
|
|
46970
47006
|
sender.close();
|
|
@@ -46972,11 +47008,11 @@ class ce_129_state_request_Handler {
|
|
|
46972
47008
|
}
|
|
46973
47009
|
if (!this.boundaryNodes.has(sender.streamId)) {
|
|
46974
47010
|
this.boundaryNodes.set(sender.streamId, Decoder.decodeObject(codec.sequenceVarLen(trieNodeCodec), message));
|
|
46975
|
-
ce_129_state_request_logger.info
|
|
47011
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received boundary nodes.`;
|
|
46976
47012
|
return;
|
|
46977
47013
|
}
|
|
46978
47014
|
this.onResponse.get(sender.streamId)?.(Decoder.decodeObject(StateResponse.Codec, message));
|
|
46979
|
-
ce_129_state_request_logger.info
|
|
47015
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received state values.`;
|
|
46980
47016
|
}
|
|
46981
47017
|
onClose(streamId) {
|
|
46982
47018
|
this.boundaryNodes.delete(streamId);
|
|
@@ -47033,7 +47069,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ServerHandler {
|
|
|
47033
47069
|
}
|
|
47034
47070
|
onStreamMessage(sender, message) {
|
|
47035
47071
|
const ticketDistribution = Decoder.decodeObject(TicketDistributionRequest.Codec, message);
|
|
47036
|
-
ce_131_ce_132_safrole_ticket_distribution_logger.log
|
|
47072
|
+
ce_131_ce_132_safrole_ticket_distribution_logger.log `[${sender.streamId}][ce-${this.kind}] Received ticket for epoch ${ticketDistribution.epochIndex}`;
|
|
47037
47073
|
this.onTicketReceived(ticketDistribution.epochIndex, ticketDistribution.ticket);
|
|
47038
47074
|
sender.close();
|
|
47039
47075
|
}
|
|
@@ -47045,7 +47081,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ClientHandler {
|
|
|
47045
47081
|
this.kind = kind;
|
|
47046
47082
|
}
|
|
47047
47083
|
onStreamMessage(sender) {
|
|
47048
|
-
ce_131_ce_132_safrole_ticket_distribution_logger.warn
|
|
47084
|
+
ce_131_ce_132_safrole_ticket_distribution_logger.warn `[${sender.streamId}][ce-${this.kind}] Unexpected message received. Closing.`;
|
|
47049
47085
|
sender.close();
|
|
47050
47086
|
}
|
|
47051
47087
|
onClose() { }
|
|
@@ -47118,15 +47154,15 @@ class ce_133_work_package_submission_ServerHandler {
|
|
|
47118
47154
|
class ce_133_work_package_submission_ClientHandler {
|
|
47119
47155
|
kind = ce_133_work_package_submission_STREAM_KIND;
|
|
47120
47156
|
onStreamMessage(sender) {
|
|
47121
|
-
ce_133_work_package_submission_logger.warn
|
|
47157
|
+
ce_133_work_package_submission_logger.warn `[${sender.streamId}] Got unexpected message on CE-133 stream. Closing.`;
|
|
47122
47158
|
sender.close();
|
|
47123
47159
|
}
|
|
47124
47160
|
onClose() { }
|
|
47125
47161
|
sendWorkPackage(sender, coreIndex, workPackage, extrinsic) {
|
|
47126
47162
|
const corePack = CoreWorkPackage.create({ coreIndex, workPackage });
|
|
47127
|
-
ce_133_work_package_submission_logger.trace
|
|
47163
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending work package: ${corePack}`;
|
|
47128
47164
|
sender.bufferAndSend(Encoder.encodeObject(CoreWorkPackage.Codec, corePack));
|
|
47129
|
-
ce_133_work_package_submission_logger.trace
|
|
47165
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending extrinsics: ${workPackage.items}`;
|
|
47130
47166
|
sender.bufferAndSend(Encoder.encodeObject(workItemExtrinsicsCodec(workPackage.items), extrinsic));
|
|
47131
47167
|
// now close the connection
|
|
47132
47168
|
sender.close();
|
|
@@ -47202,7 +47238,7 @@ class ce_134_work_package_sharing_ServerHandler {
|
|
|
47202
47238
|
ce_134_work_package_sharing_ServerHandler.sendWorkReport(sender, workReportHash, signature);
|
|
47203
47239
|
})
|
|
47204
47240
|
.catch((error) => {
|
|
47205
|
-
ce_134_work_package_sharing_logger.error
|
|
47241
|
+
ce_134_work_package_sharing_logger.error `[${streamId}] Error processing work package: ${error}`;
|
|
47206
47242
|
this.onClose(streamId);
|
|
47207
47243
|
});
|
|
47208
47244
|
}
|
|
@@ -47219,7 +47255,7 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
47219
47255
|
throw new Error("Unexpected message received.");
|
|
47220
47256
|
}
|
|
47221
47257
|
const response = Decoder.decodeObject(WorkPackageSharingResponse.Codec, message);
|
|
47222
|
-
ce_134_work_package_sharing_logger.info
|
|
47258
|
+
ce_134_work_package_sharing_logger.info `[${sender.streamId}] Received work report hash and signature.`;
|
|
47223
47259
|
pendingRequest.resolve({ workReportHash: response.workReportHash, signature: response.signature });
|
|
47224
47260
|
sender.close();
|
|
47225
47261
|
}
|
|
@@ -47232,9 +47268,9 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
47232
47268
|
}
|
|
47233
47269
|
async sendWorkPackage(sender, coreIndex, segmentsRootMappings, workPackageBundle) {
|
|
47234
47270
|
const request = WorkPackageSharingRequest.create({ coreIndex, segmentsRootMappings });
|
|
47235
|
-
ce_134_work_package_sharing_logger.trace
|
|
47271
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending core index and segments-root mappings.`;
|
|
47236
47272
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageSharingRequest.Codec, request));
|
|
47237
|
-
ce_134_work_package_sharing_logger.trace
|
|
47273
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending work package bundle.`;
|
|
47238
47274
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageBundleCodec, workPackageBundle));
|
|
47239
47275
|
return new Promise((resolve, reject) => {
|
|
47240
47276
|
this.pendingRequests.set(sender.streamId, { resolve, reject });
|
|
@@ -47294,7 +47330,7 @@ class ce_135_work_report_distribution_ServerHandler {
|
|
|
47294
47330
|
}
|
|
47295
47331
|
onStreamMessage(sender, message) {
|
|
47296
47332
|
const guaranteedWorkReport = Decoder.decodeObject(GuaranteedWorkReport.Codec, message, this.chainSpec);
|
|
47297
|
-
ce_135_work_report_distribution_logger.log
|
|
47333
|
+
ce_135_work_report_distribution_logger.log `[${sender.streamId}] Received guaranteed work report.`;
|
|
47298
47334
|
this.onWorkReport(guaranteedWorkReport);
|
|
47299
47335
|
sender.close();
|
|
47300
47336
|
}
|
|
@@ -47307,12 +47343,12 @@ class ce_135_work_report_distribution_ClientHandler {
|
|
|
47307
47343
|
this.chainSpec = chainSpec;
|
|
47308
47344
|
}
|
|
47309
47345
|
onStreamMessage(sender) {
|
|
47310
|
-
ce_135_work_report_distribution_logger.warn
|
|
47346
|
+
ce_135_work_report_distribution_logger.warn `[${sender.streamId}] Got unexpected message on CE-135 stream. Closing.`;
|
|
47311
47347
|
sender.close();
|
|
47312
47348
|
}
|
|
47313
47349
|
onClose() { }
|
|
47314
47350
|
sendWorkReport(sender, workReport) {
|
|
47315
|
-
ce_135_work_report_distribution_logger.trace
|
|
47351
|
+
ce_135_work_report_distribution_logger.trace `[${sender.streamId}] Sending guaranteed work report.`;
|
|
47316
47352
|
sender.bufferAndSend(Encoder.encodeObject(GuaranteedWorkReport.Codec, workReport, this.chainSpec));
|
|
47317
47353
|
sender.close();
|
|
47318
47354
|
}
|
|
@@ -47418,7 +47454,7 @@ class up_0_block_announcement_Handler {
|
|
|
47418
47454
|
this.handshakes.set(streamId, handshake);
|
|
47419
47455
|
// we didn't initiate this handshake, so let's respond
|
|
47420
47456
|
if (!this.pendingHandshakes.delete(streamId)) {
|
|
47421
|
-
up_0_block_announcement_logger.log
|
|
47457
|
+
up_0_block_announcement_logger.log `[${streamId}] <-- responding with a handshake.`;
|
|
47422
47458
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, this.getHandshake()));
|
|
47423
47459
|
}
|
|
47424
47460
|
this.onHandshake(streamId, handshake);
|
|
@@ -47426,7 +47462,7 @@ class up_0_block_announcement_Handler {
|
|
|
47426
47462
|
}
|
|
47427
47463
|
// it's just an announcement
|
|
47428
47464
|
const annoucement = decoder_Decoder.decodeObject(Announcement.Codec, message, this.spec);
|
|
47429
|
-
up_0_block_announcement_logger.log
|
|
47465
|
+
up_0_block_announcement_logger.log `[${streamId}] --> got blocks announcement: ${annoucement.final}`;
|
|
47430
47466
|
this.onAnnouncement(streamId, annoucement);
|
|
47431
47467
|
}
|
|
47432
47468
|
onClose(streamId) {
|
|
@@ -47439,7 +47475,7 @@ class up_0_block_announcement_Handler {
|
|
|
47439
47475
|
return;
|
|
47440
47476
|
}
|
|
47441
47477
|
const handshake = this.getHandshake();
|
|
47442
|
-
up_0_block_announcement_logger.trace
|
|
47478
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending handshake`;
|
|
47443
47479
|
this.pendingHandshakes.set(sender.streamId, true);
|
|
47444
47480
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, handshake));
|
|
47445
47481
|
}
|
|
@@ -47447,11 +47483,11 @@ class up_0_block_announcement_Handler {
|
|
|
47447
47483
|
const { streamId } = sender;
|
|
47448
47484
|
// only send announcement if we've handshaken
|
|
47449
47485
|
if (this.handshakes.has(streamId)) {
|
|
47450
|
-
up_0_block_announcement_logger.trace
|
|
47486
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending block announcement: ${annoucement.final}`;
|
|
47451
47487
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Announcement.Codec, annoucement, this.spec));
|
|
47452
47488
|
}
|
|
47453
47489
|
else {
|
|
47454
|
-
up_0_block_announcement_logger.warn
|
|
47490
|
+
up_0_block_announcement_logger.warn `[${streamId}] <-- no handshake yet, skipping announcement.`;
|
|
47455
47491
|
}
|
|
47456
47492
|
}
|
|
47457
47493
|
}
|
|
@@ -47568,7 +47604,7 @@ class SyncTask {
|
|
|
47568
47604
|
onUp0Annoucement(peer, announcement) {
|
|
47569
47605
|
const { hash, slot } = announcement.final;
|
|
47570
47606
|
const bestHeader = hashHeader(announcement.header, this.spec);
|
|
47571
|
-
sync_logger.info
|
|
47607
|
+
sync_logger.info `[${peer.id}] --> Received new header #${announcement.header.timeSlotIndex}: ${bestHeader.hash}`;
|
|
47572
47608
|
// NOTE [ToDr] Instead of having `Connections` store aux data perhaps
|
|
47573
47609
|
// we should maintain that directly? However that would require
|
|
47574
47610
|
// listening to peers connected/disconnected to perfrom some cleanups
|
|
@@ -47643,7 +47679,7 @@ class SyncTask {
|
|
|
47643
47679
|
const peers = this.connections.getConnectedPeers();
|
|
47644
47680
|
for (const peerInfo of peers) {
|
|
47645
47681
|
this.streamManager.withStreamOfKind(peerInfo.peerId, up_0_block_announcement_STREAM_KIND, (handler, sender) => {
|
|
47646
|
-
sync_logger.log
|
|
47682
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Broadcasting new header #${slot}: ${header.hash}`;
|
|
47647
47683
|
handler.sendAnnouncement(sender, annoucement);
|
|
47648
47684
|
return result_OK;
|
|
47649
47685
|
});
|
|
@@ -47657,13 +47693,13 @@ class SyncTask {
|
|
|
47657
47693
|
}
|
|
47658
47694
|
if (res.error === BlockSequenceError.BlockOnFork) {
|
|
47659
47695
|
// seems that peer is requesting syncing a fork from us, let's bail.
|
|
47660
|
-
sync_logger.warn
|
|
47696
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} is on a fork.`;
|
|
47661
47697
|
return [];
|
|
47662
47698
|
}
|
|
47663
47699
|
if (res.error === BlockSequenceError.NoStartBlock) {
|
|
47664
47700
|
// we don't know about that block at all, so let's just bail.
|
|
47665
47701
|
// we should probably penalize the peer for sending BS?
|
|
47666
|
-
sync_logger.warn
|
|
47702
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} missing header or extrinsic.`;
|
|
47667
47703
|
return [];
|
|
47668
47704
|
}
|
|
47669
47705
|
debug_assertNever(res.error);
|
|
@@ -47683,10 +47719,10 @@ class SyncTask {
|
|
|
47683
47719
|
// figure out where others are at
|
|
47684
47720
|
const othersBest = this.othersBest;
|
|
47685
47721
|
const blocksToSync = othersBest.slot - ourBestSlot;
|
|
47686
|
-
sync_logger.trace
|
|
47722
|
+
sync_logger.trace `Our best. ${ourBestSlot}. Best seen: ${othersBest.slot}`;
|
|
47687
47723
|
if (blocksToSync < 1) {
|
|
47688
47724
|
this.connections.getPeerCount();
|
|
47689
|
-
sync_logger.trace
|
|
47725
|
+
sync_logger.trace `No new blocks. ${peerCount} peers.`;
|
|
47690
47726
|
return {
|
|
47691
47727
|
kind: SyncResult.NoNewBlocks,
|
|
47692
47728
|
ours: ourBestSlot,
|
|
@@ -47694,7 +47730,7 @@ class SyncTask {
|
|
|
47694
47730
|
};
|
|
47695
47731
|
}
|
|
47696
47732
|
const requested = [];
|
|
47697
|
-
sync_logger.log
|
|
47733
|
+
sync_logger.log `Sync ${blocksToSync} blocks from ${peerCount} peers.`;
|
|
47698
47734
|
// NOTE [ToDr] We might be requesting the same blocks from many peers
|
|
47699
47735
|
// which isn't very optimal, but for now: 🤷
|
|
47700
47736
|
//
|
|
@@ -47720,12 +47756,12 @@ class SyncTask {
|
|
|
47720
47756
|
// request as much blocks from that peer as possible.
|
|
47721
47757
|
this.streamManager.withNewStream(peerInfo.peerRef, STREAM_KIND, (handler, sender) => {
|
|
47722
47758
|
handleAsyncErrors(async () => {
|
|
47723
|
-
sync_logger.log
|
|
47759
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Fetching ${bestSlot - ourBestSlot} blocks (${bestHash})`;
|
|
47724
47760
|
const blocks = await handler.requestBlockSequence(sender, bestHash, Direction.DescIncl, numbers_tryAsU32(bestSlot - ourBestSlot));
|
|
47725
47761
|
blocks.reverse();
|
|
47726
47762
|
this.onNewBlocks(blocks, peerInfo.peerId);
|
|
47727
47763
|
}, (e) => {
|
|
47728
|
-
sync_logger.warn
|
|
47764
|
+
sync_logger.warn `[${peerInfo.peerId}] <-- requesting blocks to import: ${e}`;
|
|
47729
47765
|
});
|
|
47730
47766
|
return result_OK;
|
|
47731
47767
|
});
|
|
@@ -47799,7 +47835,7 @@ function setupPeerListeners(syncTask, network, streamManager) {
|
|
|
47799
47835
|
// whenever the peer wants to open a stream with us, let's handle that.
|
|
47800
47836
|
peer.addOnIncomingStream((stream) => {
|
|
47801
47837
|
handleAsyncErrors(() => streamManager.onIncomingStream(peer, stream), (e) => {
|
|
47802
|
-
network_logger.error
|
|
47838
|
+
network_logger.error `[${peer.id}:${stream.streamId}]🚰 Stream error: ${e}. Disconnecting peer.`;
|
|
47803
47839
|
peer.disconnect();
|
|
47804
47840
|
});
|
|
47805
47841
|
return result_OK;
|
|
@@ -47890,7 +47926,7 @@ class MainReady extends State {
|
|
|
47890
47926
|
this.onNewBlocks.emit(blocks);
|
|
47891
47927
|
}
|
|
47892
47928
|
else {
|
|
47893
|
-
state_machine_logger.error
|
|
47929
|
+
state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
47894
47930
|
}
|
|
47895
47931
|
}
|
|
47896
47932
|
announceHeader(port, header) {
|
|
@@ -47928,7 +47964,7 @@ class NetworkReady extends State {
|
|
|
47928
47964
|
this.onNewHeader.emit(decoded);
|
|
47929
47965
|
}
|
|
47930
47966
|
else {
|
|
47931
|
-
state_machine_logger.error
|
|
47967
|
+
state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(header)}.`;
|
|
47932
47968
|
}
|
|
47933
47969
|
}
|
|
47934
47970
|
sendBlocks(port, blocks) {
|
|
@@ -47967,7 +48003,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
47967
48003
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
47968
48004
|
const machine = networkStateMachine();
|
|
47969
48005
|
const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
|
|
47970
|
-
channel.then((channel) => main(channel)).catch((e) => jam_network_logger.error
|
|
48006
|
+
channel.then((channel) => main(channel)).catch((e) => jam_network_logger.error `${e}`);
|
|
47971
48007
|
}
|
|
47972
48008
|
/**
|
|
47973
48009
|
* JAM networking worker.
|
|
@@ -47978,7 +48014,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
47978
48014
|
*/
|
|
47979
48015
|
async function main(channel) {
|
|
47980
48016
|
await initAll();
|
|
47981
|
-
jam_network_logger.trace
|
|
48017
|
+
jam_network_logger.trace `🛜 Network starting ${channel.currentState()}`;
|
|
47982
48018
|
// Await the configuration object
|
|
47983
48019
|
// TODO [ToDr] The whole state machine needs to die.
|
|
47984
48020
|
const ready = channel.currentState().stateName !== "ready(network)"
|
|
@@ -47989,7 +48025,7 @@ async function main(channel) {
|
|
|
47989
48025
|
const key = await ed25519_privateKey(config.key);
|
|
47990
48026
|
const lmdb = new LmdbRoot(config.genericConfig.dbPath);
|
|
47991
48027
|
const blocks = new LmdbBlocks(config.genericConfig.chainSpec, lmdb);
|
|
47992
|
-
jam_network_logger.info
|
|
48028
|
+
jam_network_logger.info `🛜 Listening at ${config.host}:${config.port}`;
|
|
47993
48029
|
const network = await setup({
|
|
47994
48030
|
host: config.host,
|
|
47995
48031
|
port: config.port,
|
|
@@ -48002,7 +48038,7 @@ async function main(channel) {
|
|
|
48002
48038
|
ready.waitForState("finished").then(() => network.network.stop());
|
|
48003
48039
|
await network.network.start();
|
|
48004
48040
|
});
|
|
48005
|
-
jam_network_logger.info
|
|
48041
|
+
jam_network_logger.info `🛜 Network worker finished. Closing channel.`;
|
|
48006
48042
|
// Close the comms to gracefuly close the app.
|
|
48007
48043
|
finished.currentState().close(channel);
|
|
48008
48044
|
}
|