@typeberry/jam 0.1.1 → 0.1.2-3178190
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/README.md +1 -0
- package/block-generator/index.js +164 -107
- package/block-generator/index.js.map +1 -1
- package/importer/index.js +273 -199
- package/importer/index.js.map +1 -1
- package/index.js +435 -365
- package/index.js.map +1 -1
- package/jam-network/index.js +214 -171
- package/jam-network/index.js.map +1 -1
- package/package.json +4 -2
package/jam-network/index.js
CHANGED
|
@@ -25234,6 +25234,7 @@ var compatibility_GpVersion;
|
|
|
25234
25234
|
GpVersion["V0_6_7"] = "0.6.7";
|
|
25235
25235
|
GpVersion["V0_7_0"] = "0.7.0";
|
|
25236
25236
|
GpVersion["V0_7_1"] = "0.7.1-preview";
|
|
25237
|
+
GpVersion["V0_7_2"] = "0.7.2-preview";
|
|
25237
25238
|
})(compatibility_GpVersion || (compatibility_GpVersion = {}));
|
|
25238
25239
|
var TestSuite;
|
|
25239
25240
|
(function (TestSuite) {
|
|
@@ -25241,7 +25242,7 @@ var TestSuite;
|
|
|
25241
25242
|
TestSuite["JAMDUNA"] = "jamduna";
|
|
25242
25243
|
})(TestSuite || (TestSuite = {}));
|
|
25243
25244
|
const DEFAULT_SUITE = TestSuite.W3F_DAVXY;
|
|
25244
|
-
const ALL_VERSIONS_IN_ORDER = [compatibility_GpVersion.V0_6_7, compatibility_GpVersion.V0_7_0, compatibility_GpVersion.V0_7_1];
|
|
25245
|
+
const ALL_VERSIONS_IN_ORDER = [compatibility_GpVersion.V0_6_7, compatibility_GpVersion.V0_7_0, compatibility_GpVersion.V0_7_1, compatibility_GpVersion.V0_7_2];
|
|
25245
25246
|
const env = typeof process === "undefined" ? {} : process.env;
|
|
25246
25247
|
const DEFAULT_VERSION = compatibility_GpVersion.V0_7_0;
|
|
25247
25248
|
let CURRENT_VERSION = parseCurrentVersion(env.GP_VERSION) ?? DEFAULT_VERSION;
|
|
@@ -25250,20 +25251,26 @@ function parseCurrentVersion(env) {
|
|
|
25250
25251
|
if (env === undefined) {
|
|
25251
25252
|
return undefined;
|
|
25252
25253
|
}
|
|
25253
|
-
|
|
25254
|
-
|
|
25255
|
-
|
|
25254
|
+
switch (env) {
|
|
25255
|
+
case compatibility_GpVersion.V0_6_7:
|
|
25256
|
+
case compatibility_GpVersion.V0_7_0:
|
|
25257
|
+
case compatibility_GpVersion.V0_7_1:
|
|
25258
|
+
case compatibility_GpVersion.V0_7_2:
|
|
25259
|
+
return env;
|
|
25260
|
+
default:
|
|
25261
|
+
throw new Error(`Configured environment variable GP_VERSION is unknown: '${env}'. Use one of: ${ALL_VERSIONS_IN_ORDER}`);
|
|
25256
25262
|
}
|
|
25257
|
-
return version;
|
|
25258
25263
|
}
|
|
25259
25264
|
function parseCurrentSuite(env) {
|
|
25260
25265
|
if (env === undefined)
|
|
25261
25266
|
return undefined;
|
|
25262
|
-
|
|
25263
|
-
|
|
25264
|
-
|
|
25267
|
+
switch (env) {
|
|
25268
|
+
case TestSuite.W3F_DAVXY:
|
|
25269
|
+
case TestSuite.JAMDUNA:
|
|
25270
|
+
return env;
|
|
25271
|
+
default:
|
|
25272
|
+
throw new Error(`Configured environment variable TEST_SUITE is unknown: '${env}'. Use one of: ${Object.values(TestSuite)}`);
|
|
25265
25273
|
}
|
|
25266
|
-
return val;
|
|
25267
25274
|
}
|
|
25268
25275
|
class compatibility_Compatibility {
|
|
25269
25276
|
static override(version) {
|
|
@@ -25425,6 +25432,34 @@ class WithDebug {
|
|
|
25425
25432
|
}
|
|
25426
25433
|
}
|
|
25427
25434
|
|
|
25435
|
+
;// CONCATENATED MODULE: ./packages/core/utils/dev.ts
|
|
25436
|
+
const dev_env = typeof process === "undefined" ? {} : process.env;
|
|
25437
|
+
/**
|
|
25438
|
+
* The function will produce relative path resolver that is adjusted
|
|
25439
|
+
* for package location within the workspace.
|
|
25440
|
+
*
|
|
25441
|
+
* Example:
|
|
25442
|
+
* $ npm start -w @typeberry/jam
|
|
25443
|
+
*
|
|
25444
|
+
* The above command will run `./bin/jam/index.js`, however we would
|
|
25445
|
+
* still want relative paths to be resolved according to top-level workspace
|
|
25446
|
+
* directory.
|
|
25447
|
+
*
|
|
25448
|
+
* So the caller, passes the absolute workspace path as argument and get's
|
|
25449
|
+
* a function that can properly resolve relative paths.
|
|
25450
|
+
*
|
|
25451
|
+
* NOTE: the translation happens only for development build! When
|
|
25452
|
+
* we build a single library from our project, we no longer mangle the paths.
|
|
25453
|
+
*/
|
|
25454
|
+
const workspacePathFix = dev_env.NODE_ENV === "development"
|
|
25455
|
+
? (workspacePath) => (p) => {
|
|
25456
|
+
if (p.startsWith("/")) {
|
|
25457
|
+
return p;
|
|
25458
|
+
}
|
|
25459
|
+
return `${workspacePath}/${p}`;
|
|
25460
|
+
}
|
|
25461
|
+
: () => (p) => p;
|
|
25462
|
+
|
|
25428
25463
|
;// CONCATENATED MODULE: ./packages/core/utils/opaque.ts
|
|
25429
25464
|
/**
|
|
25430
25465
|
* @fileoverview `Opaque<Type, Token>` constructs a unique type which is a subset of Type with a
|
|
@@ -25768,6 +25803,7 @@ function isResult(x) {
|
|
|
25768
25803
|
|
|
25769
25804
|
|
|
25770
25805
|
|
|
25806
|
+
|
|
25771
25807
|
;// CONCATENATED MODULE: ./packages/core/bytes/bitvec.ts
|
|
25772
25808
|
|
|
25773
25809
|
/**
|
|
@@ -32136,6 +32172,23 @@ function parseLevel(lvl) {
|
|
|
32136
32172
|
;// CONCATENATED MODULE: ./packages/core/logger/console.ts
|
|
32137
32173
|
// biome-ignore-all lint/suspicious/noConsole: logger
|
|
32138
32174
|
|
|
32175
|
+
function print(level, levelAndName, strings, data) {
|
|
32176
|
+
if (level < levelAndName[0]) {
|
|
32177
|
+
return;
|
|
32178
|
+
}
|
|
32179
|
+
const lvlText = Level[level].padEnd(5);
|
|
32180
|
+
const val = strings.map((v, idx) => `${v}${idx < data.length ? data[idx] : ""}`);
|
|
32181
|
+
const msg = `${lvlText} [${levelAndName[1]}] ${val.join("")}`;
|
|
32182
|
+
if (level === Level.WARN) {
|
|
32183
|
+
console.warn(msg);
|
|
32184
|
+
}
|
|
32185
|
+
else if (level === Level.ERROR) {
|
|
32186
|
+
console.error(msg);
|
|
32187
|
+
}
|
|
32188
|
+
else {
|
|
32189
|
+
console.info(msg);
|
|
32190
|
+
}
|
|
32191
|
+
}
|
|
32139
32192
|
/** An optimized logger that ignores `TRACE`, `DEBUG` and `LOG` messages.
|
|
32140
32193
|
*
|
|
32141
32194
|
* Use the `create` method to instantiate the right instance of a more specialized logger.
|
|
@@ -32166,109 +32219,91 @@ class ConsoleTransport {
|
|
|
32166
32219
|
constructor(options) {
|
|
32167
32220
|
this.options = options;
|
|
32168
32221
|
}
|
|
32169
|
-
insane(
|
|
32222
|
+
insane(_levelAndName, _strings, _data) {
|
|
32170
32223
|
/* no-op */
|
|
32171
32224
|
}
|
|
32172
|
-
trace(
|
|
32225
|
+
trace(_levelAndName, _strings, _data) {
|
|
32173
32226
|
/* no-op */
|
|
32174
32227
|
}
|
|
32175
|
-
log(
|
|
32228
|
+
log(_levelAndName, _strings, _data) {
|
|
32176
32229
|
/* no-op */
|
|
32177
32230
|
}
|
|
32178
|
-
info(
|
|
32231
|
+
info(_levelAndName, _strings, _data) {
|
|
32179
32232
|
/* no-op */
|
|
32180
32233
|
}
|
|
32181
|
-
warn(
|
|
32182
|
-
|
|
32234
|
+
warn(levelAndName, strings, data) {
|
|
32235
|
+
print(Level.WARN, levelAndName, strings, data);
|
|
32183
32236
|
}
|
|
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
|
-
}
|
|
32237
|
+
error(levelAndName, strings, data) {
|
|
32238
|
+
print(Level.ERROR, levelAndName, strings, data);
|
|
32204
32239
|
}
|
|
32205
32240
|
}
|
|
32206
32241
|
/**
|
|
32207
32242
|
* Insane version of console logger - supports insane level.
|
|
32208
32243
|
*/
|
|
32209
32244
|
class InsaneConsoleLogger extends ConsoleTransport {
|
|
32210
|
-
insane(
|
|
32211
|
-
|
|
32245
|
+
insane(levelAndName, strings, data) {
|
|
32246
|
+
print(Level.INSANE, levelAndName, strings, data);
|
|
32212
32247
|
}
|
|
32213
|
-
trace(
|
|
32214
|
-
|
|
32248
|
+
trace(levelAndName, strings, data) {
|
|
32249
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
32215
32250
|
}
|
|
32216
|
-
log(
|
|
32217
|
-
|
|
32251
|
+
log(levelAndName, strings, data) {
|
|
32252
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
32218
32253
|
}
|
|
32219
|
-
info(
|
|
32220
|
-
|
|
32254
|
+
info(levelAndName, strings, data) {
|
|
32255
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
32221
32256
|
}
|
|
32222
32257
|
}
|
|
32223
32258
|
/**
|
|
32224
32259
|
* A basic version of console logger - printing everything.
|
|
32225
32260
|
*/
|
|
32226
32261
|
class TraceConsoleTransport extends ConsoleTransport {
|
|
32227
|
-
insane(
|
|
32262
|
+
insane(_levelAndName, _strings, _data) {
|
|
32228
32263
|
/* no-op */
|
|
32229
32264
|
}
|
|
32230
|
-
trace(
|
|
32231
|
-
|
|
32265
|
+
trace(levelAndName, strings, data) {
|
|
32266
|
+
print(Level.TRACE, levelAndName, strings, data);
|
|
32232
32267
|
}
|
|
32233
|
-
log(
|
|
32234
|
-
|
|
32268
|
+
log(levelAndName, strings, data) {
|
|
32269
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
32235
32270
|
}
|
|
32236
|
-
info(
|
|
32237
|
-
|
|
32271
|
+
info(levelAndName, strings, data) {
|
|
32272
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
32238
32273
|
}
|
|
32239
32274
|
}
|
|
32240
32275
|
/**
|
|
32241
32276
|
* An optimized version of the logger - completely ignores `TRACE` level calls.
|
|
32242
32277
|
*/
|
|
32243
32278
|
class LogConsoleTransport extends ConsoleTransport {
|
|
32244
|
-
insane(
|
|
32279
|
+
insane(_levelAndName, _strings, _data) {
|
|
32245
32280
|
/* no-op */
|
|
32246
32281
|
}
|
|
32247
|
-
trace(
|
|
32282
|
+
trace(_levelAndName, _strings, _data) {
|
|
32248
32283
|
/* no-op */
|
|
32249
32284
|
}
|
|
32250
|
-
log(
|
|
32251
|
-
|
|
32285
|
+
log(levelAndName, strings, data) {
|
|
32286
|
+
print(Level.LOG, levelAndName, strings, data);
|
|
32252
32287
|
}
|
|
32253
|
-
info(
|
|
32254
|
-
|
|
32288
|
+
info(levelAndName, strings, data) {
|
|
32289
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
32255
32290
|
}
|
|
32256
32291
|
}
|
|
32257
32292
|
/**
|
|
32258
32293
|
* An optimized version of the logger - completely ignores `TRACE` & `DEBUG` level calls.
|
|
32259
32294
|
*/
|
|
32260
32295
|
class InfoConsoleTransport extends ConsoleTransport {
|
|
32261
|
-
insane(
|
|
32296
|
+
insane(_levelAndName, _strings, _data) {
|
|
32262
32297
|
/* no-op */
|
|
32263
32298
|
}
|
|
32264
|
-
trace(
|
|
32299
|
+
trace(_levelAndName, _strings, _data) {
|
|
32265
32300
|
/* no-op */
|
|
32266
32301
|
}
|
|
32267
|
-
log(
|
|
32302
|
+
log(_levelAndName, _strings, _data) {
|
|
32268
32303
|
/* no-op */
|
|
32269
32304
|
}
|
|
32270
|
-
info(
|
|
32271
|
-
|
|
32305
|
+
info(levelAndName, strings, data) {
|
|
32306
|
+
print(Level.INFO, levelAndName, strings, data);
|
|
32272
32307
|
}
|
|
32273
32308
|
}
|
|
32274
32309
|
|
|
@@ -32305,11 +32340,6 @@ class Logger {
|
|
|
32305
32340
|
const module = moduleName ?? fName;
|
|
32306
32341
|
return new Logger(module.padStart(8, " "), GLOBAL_CONFIG);
|
|
32307
32342
|
}
|
|
32308
|
-
/**
|
|
32309
|
-
* Return currently configured level for given module. */
|
|
32310
|
-
static getLevel(moduleName) {
|
|
32311
|
-
return findLevel(GLOBAL_CONFIG.options, moduleName);
|
|
32312
|
-
}
|
|
32313
32343
|
/**
|
|
32314
32344
|
* Global configuration of all loggers.
|
|
32315
32345
|
*
|
|
@@ -32340,33 +32370,46 @@ class Logger {
|
|
|
32340
32370
|
const options = parseLoggerOptions(input, defaultLevel, workingDir);
|
|
32341
32371
|
Logger.configureAllFromOptions(options);
|
|
32342
32372
|
}
|
|
32373
|
+
cachedLevelAndName;
|
|
32343
32374
|
constructor(moduleName, config) {
|
|
32344
32375
|
this.moduleName = moduleName;
|
|
32345
32376
|
this.config = config;
|
|
32346
32377
|
}
|
|
32378
|
+
/** Return currently configured level for given module. */
|
|
32379
|
+
getLevel() {
|
|
32380
|
+
return this.getLevelAndName()[0];
|
|
32381
|
+
}
|
|
32382
|
+
getLevelAndName() {
|
|
32383
|
+
if (this.cachedLevelAndName === undefined) {
|
|
32384
|
+
const level = findLevel(this.config.options, this.moduleName);
|
|
32385
|
+
const shortName = this.moduleName.replace(this.config.options.workingDir, "");
|
|
32386
|
+
this.cachedLevelAndName = [level, shortName];
|
|
32387
|
+
}
|
|
32388
|
+
return this.cachedLevelAndName;
|
|
32389
|
+
}
|
|
32347
32390
|
/** Log a message with `INSANE` level. */
|
|
32348
|
-
insane(
|
|
32349
|
-
this.config.transport.insane(this.
|
|
32391
|
+
insane(strings, ...data) {
|
|
32392
|
+
this.config.transport.insane(this.getLevelAndName(), strings, data);
|
|
32350
32393
|
}
|
|
32351
32394
|
/** Log a message with `TRACE` level. */
|
|
32352
|
-
trace(
|
|
32353
|
-
this.config.transport.trace(this.
|
|
32395
|
+
trace(strings, ...data) {
|
|
32396
|
+
this.config.transport.trace(this.getLevelAndName(), strings, data);
|
|
32354
32397
|
}
|
|
32355
32398
|
/** Log a message with `DEBUG`/`LOG` level. */
|
|
32356
|
-
log(
|
|
32357
|
-
this.config.transport.log(this.
|
|
32399
|
+
log(strings, ...data) {
|
|
32400
|
+
this.config.transport.log(this.getLevelAndName(), strings, data);
|
|
32358
32401
|
}
|
|
32359
32402
|
/** Log a message with `INFO` level. */
|
|
32360
|
-
info(
|
|
32361
|
-
this.config.transport.info(this.
|
|
32403
|
+
info(strings, ...data) {
|
|
32404
|
+
this.config.transport.info(this.getLevelAndName(), strings, data);
|
|
32362
32405
|
}
|
|
32363
32406
|
/** Log a message with `WARN` level. */
|
|
32364
|
-
warn(
|
|
32365
|
-
this.config.transport.warn(this.
|
|
32407
|
+
warn(strings, ...data) {
|
|
32408
|
+
this.config.transport.warn(this.getLevelAndName(), strings, data);
|
|
32366
32409
|
}
|
|
32367
32410
|
/** Log a message with `ERROR` level. */
|
|
32368
|
-
error(
|
|
32369
|
-
this.config.transport.error(this.
|
|
32411
|
+
error(strings, ...data) {
|
|
32412
|
+
this.config.transport.error(this.getLevelAndName(), strings, data);
|
|
32370
32413
|
}
|
|
32371
32414
|
}
|
|
32372
32415
|
|
|
@@ -32456,15 +32499,15 @@ class NodeConfiguration {
|
|
|
32456
32499
|
}
|
|
32457
32500
|
function loadConfig(configPath) {
|
|
32458
32501
|
if (configPath === DEFAULT_CONFIG) {
|
|
32459
|
-
logger.log
|
|
32502
|
+
logger.log `🔧 Loading DEFAULT config`;
|
|
32460
32503
|
return parseFromJson(configs.default, NodeConfiguration.fromJson);
|
|
32461
32504
|
}
|
|
32462
32505
|
if (configPath === DEV_CONFIG) {
|
|
32463
|
-
logger.log
|
|
32506
|
+
logger.log `🔧 Loading DEV config`;
|
|
32464
32507
|
return parseFromJson(configs.dev, NodeConfiguration.fromJson);
|
|
32465
32508
|
}
|
|
32466
32509
|
try {
|
|
32467
|
-
logger.log
|
|
32510
|
+
logger.log `🔧 Loading config from ${configPath}`;
|
|
32468
32511
|
const configFile = fs.readFileSync(configPath, "utf8");
|
|
32469
32512
|
const parsed = JSON.parse(configFile);
|
|
32470
32513
|
return parseFromJson(parsed, NodeConfiguration.fromJson);
|
|
@@ -36170,7 +36213,7 @@ class LmdbStates {
|
|
|
36170
36213
|
await Promise.all([valuesWrite, statesWrite]);
|
|
36171
36214
|
}
|
|
36172
36215
|
catch (e) {
|
|
36173
|
-
states_logger.error
|
|
36216
|
+
states_logger.error `${e}`;
|
|
36174
36217
|
return Result.error(StateUpdateError.Commit);
|
|
36175
36218
|
}
|
|
36176
36219
|
return Result.ok(OK);
|
|
@@ -36279,7 +36322,7 @@ class TypedPort {
|
|
|
36279
36322
|
this.dispatchPortMessage(msg);
|
|
36280
36323
|
}
|
|
36281
36324
|
catch (e) {
|
|
36282
|
-
port_logger.error
|
|
36325
|
+
port_logger.error `[${this.constructor.name}] Failed to dispatch a message: ${e}: ${msg}`;
|
|
36283
36326
|
throw e;
|
|
36284
36327
|
}
|
|
36285
36328
|
});
|
|
@@ -36353,7 +36396,7 @@ class TypedPort {
|
|
|
36353
36396
|
this.port.postMessage(msg, transferList);
|
|
36354
36397
|
}
|
|
36355
36398
|
catch (e) {
|
|
36356
|
-
port_logger.error
|
|
36399
|
+
port_logger.error `[${this.constructor.name}] Failed to post a message: ${e}: ${msg}`;
|
|
36357
36400
|
throw e;
|
|
36358
36401
|
}
|
|
36359
36402
|
}
|
|
@@ -36384,7 +36427,7 @@ class TypedPort {
|
|
|
36384
36427
|
cleanup(reason) {
|
|
36385
36428
|
// resolve all pending requests with an error.
|
|
36386
36429
|
const responseListeners = this.responseListeners.eventNames();
|
|
36387
|
-
for (const ev
|
|
36430
|
+
for (const ev of responseListeners) {
|
|
36388
36431
|
this.responseListeners.emit(ev, new Error(`port is ${reason}`));
|
|
36389
36432
|
}
|
|
36390
36433
|
}
|
|
@@ -36433,7 +36476,7 @@ class MessageChannelStateMachine {
|
|
|
36433
36476
|
this.dispatchSignal(name, data);
|
|
36434
36477
|
}
|
|
36435
36478
|
catch (e) {
|
|
36436
|
-
channel_logger.error
|
|
36479
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch signal (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
36437
36480
|
throw e;
|
|
36438
36481
|
}
|
|
36439
36482
|
});
|
|
@@ -36442,7 +36485,7 @@ class MessageChannelStateMachine {
|
|
|
36442
36485
|
await this.dispatchRequest(name, data, msg);
|
|
36443
36486
|
}
|
|
36444
36487
|
catch (e) {
|
|
36445
|
-
channel_logger.error
|
|
36488
|
+
channel_logger.error `[${this.constructor.name}] Unable to dispatch request (${name}): ${e}. ${this.stateInfo(remoteState)}`;
|
|
36446
36489
|
throw e;
|
|
36447
36490
|
}
|
|
36448
36491
|
});
|
|
@@ -36528,7 +36571,7 @@ class MessageChannelStateMachine {
|
|
|
36528
36571
|
this.machine.transition(res.transitionTo.state, res.transitionTo.data);
|
|
36529
36572
|
}
|
|
36530
36573
|
if (didStateChangeInMeantime) {
|
|
36531
|
-
channel_logger.warn
|
|
36574
|
+
channel_logger.warn `Ignoring obsolete response for an old request: "${name}"`;
|
|
36532
36575
|
return;
|
|
36533
36576
|
}
|
|
36534
36577
|
return this.port.respond(prevState.stateName, msg, res.response);
|
|
@@ -36544,7 +36587,7 @@ class MessageChannelStateMachine {
|
|
|
36544
36587
|
}
|
|
36545
36588
|
}
|
|
36546
36589
|
transitionTo() {
|
|
36547
|
-
channel_logger.trace
|
|
36590
|
+
channel_logger.trace `[${this.machine.name}] transitioned to ${this.currentState()}`;
|
|
36548
36591
|
return this;
|
|
36549
36592
|
}
|
|
36550
36593
|
/**
|
|
@@ -36564,7 +36607,7 @@ class MessageChannelStateMachine {
|
|
|
36564
36607
|
await promise;
|
|
36565
36608
|
}
|
|
36566
36609
|
catch (e) {
|
|
36567
|
-
channel_logger.error
|
|
36610
|
+
channel_logger.error `${e}`;
|
|
36568
36611
|
}
|
|
36569
36612
|
return new MessageChannelStateMachine(machine, port);
|
|
36570
36613
|
}
|
|
@@ -36767,7 +36810,7 @@ class State {
|
|
|
36767
36810
|
* actions.
|
|
36768
36811
|
*/
|
|
36769
36812
|
onActivation(data) {
|
|
36770
|
-
state_logger.trace
|
|
36813
|
+
state_logger.trace `[${this.constructor.name}] Changing state to: ${this}`;
|
|
36771
36814
|
this.data = data;
|
|
36772
36815
|
}
|
|
36773
36816
|
/**
|
|
@@ -36865,7 +36908,7 @@ async function spawnWorkerGeneric(bootstrapPath, logger, mainReadyName, mainRead
|
|
|
36865
36908
|
const worker = new external_node_worker_threads_namespaceObject.Worker(bootstrapPath);
|
|
36866
36909
|
const machine = stateMachineMain(`main->${mainReadyName}`, mainReadyName, mainReadyState);
|
|
36867
36910
|
const channel = await MessageChannelStateMachine.createAndTransferChannel(machine, worker);
|
|
36868
|
-
logger.trace
|
|
36911
|
+
logger.trace `[${machine.name}] Worker spawned ${channel.currentState()}`;
|
|
36869
36912
|
return channel;
|
|
36870
36913
|
}
|
|
36871
36914
|
|
|
@@ -36962,11 +37005,11 @@ class PeersManagement {
|
|
|
36962
37005
|
_onPeerDisconnected = [];
|
|
36963
37006
|
peers = new Map();
|
|
36964
37007
|
peerConnected(peer) {
|
|
36965
|
-
peers_logger.info
|
|
37008
|
+
peers_logger.info `💡 Peer ${displayId(peer)} connected.`;
|
|
36966
37009
|
const oldPeerData = this.peers.get(peer.id);
|
|
36967
37010
|
if (oldPeerData !== undefined) {
|
|
36968
37011
|
// TODO [ToDr] replacing old connection?
|
|
36969
|
-
peers_logger.warn
|
|
37012
|
+
peers_logger.warn `Replacing older connection.`;
|
|
36970
37013
|
}
|
|
36971
37014
|
this.peers.set(peer.id, peer);
|
|
36972
37015
|
for (const callback of this._onPeerConnected) {
|
|
@@ -36974,7 +37017,7 @@ class PeersManagement {
|
|
|
36974
37017
|
}
|
|
36975
37018
|
}
|
|
36976
37019
|
peerDisconnected(peer) {
|
|
36977
|
-
peers_logger.info
|
|
37020
|
+
peers_logger.info `⚡︎Peer ${displayId(peer)} disconnected.`;
|
|
36978
37021
|
this.peers.delete(peer.id);
|
|
36979
37022
|
for (const callback of this._onPeerDisconnected) {
|
|
36980
37023
|
callback(peer);
|
|
@@ -45766,23 +45809,23 @@ var VerifyCertError;
|
|
|
45766
45809
|
VerifyCertError[VerifyCertError["IncorrectSignature"] = 4] = "IncorrectSignature";
|
|
45767
45810
|
})(VerifyCertError || (VerifyCertError = {}));
|
|
45768
45811
|
async function verifyCertificate(certs) {
|
|
45769
|
-
certificate_logger.log
|
|
45812
|
+
certificate_logger.log `Incoming peer. Verifying certificate`;
|
|
45770
45813
|
// Must present exactly one cert
|
|
45771
45814
|
if (certs.length !== 1) {
|
|
45772
|
-
certificate_logger.log
|
|
45815
|
+
certificate_logger.log `Rejecting peer: expected exactly one certificate, got: ${certs.length}`;
|
|
45773
45816
|
return result_Result.error(VerifyCertError.NoCertificate);
|
|
45774
45817
|
}
|
|
45775
45818
|
// Parse with Node's X509Certificate (accepts PEM or DER)
|
|
45776
45819
|
const xc = new (external_node_crypto_default()).X509Certificate(certs[0]);
|
|
45777
45820
|
// Must be Ed25519 key
|
|
45778
45821
|
if (xc.publicKey.asymmetricKeyType !== CURVE_NAME.toLowerCase()) {
|
|
45779
|
-
certificate_logger.log
|
|
45822
|
+
certificate_logger.log `Rejecting peer using non-ed25519 certificate: ${xc.publicKey.asymmetricKeyType}`;
|
|
45780
45823
|
return result_Result.error(VerifyCertError.NotEd25519);
|
|
45781
45824
|
}
|
|
45782
45825
|
// Extract raw public key via JWK export
|
|
45783
45826
|
const jwk = xc.publicKey.export({ format: "jwk" });
|
|
45784
45827
|
if (jwk.kty !== KEY_TYPE || jwk.crv !== CURVE_NAME) {
|
|
45785
|
-
certificate_logger.log
|
|
45828
|
+
certificate_logger.log `Public key type mismatch: ${jwk.kty}, ${jwk.crv}`;
|
|
45786
45829
|
return result_Result.error(VerifyCertError.PublicKeyTypeMismatch);
|
|
45787
45830
|
}
|
|
45788
45831
|
// SAN must be exactly 'e'+base32(rawPub)
|
|
@@ -45790,7 +45833,7 @@ async function verifyCertificate(certs) {
|
|
|
45790
45833
|
const sanField = xc.subjectAltName ?? "";
|
|
45791
45834
|
const m = sanField.match(/DNS:([^,]+)/);
|
|
45792
45835
|
if (m === null || m[1] !== expectedSan) {
|
|
45793
|
-
certificate_logger.log
|
|
45836
|
+
certificate_logger.log `AltName mismatch. Expected: '${expectedSan}', got: '${m?.[1]}'`;
|
|
45794
45837
|
return result_Result.error(VerifyCertError.AltNameMismatch);
|
|
45795
45838
|
}
|
|
45796
45839
|
const key = Buffer.from(jwk.x ?? "", "base64url");
|
|
@@ -46057,19 +46100,19 @@ class QuicNetwork {
|
|
|
46057
46100
|
}
|
|
46058
46101
|
this.started = true;
|
|
46059
46102
|
await this.socket.start({ host: this.listen.host, port: this.listen.port });
|
|
46060
|
-
quic_network_logger.info
|
|
46103
|
+
quic_network_logger.info `🛜 QUIC socket on ${this.socket.host}:${this.socket.port}`;
|
|
46061
46104
|
await this.server.start();
|
|
46062
|
-
quic_network_logger.log
|
|
46105
|
+
quic_network_logger.log `🛜 QUIC server listening`;
|
|
46063
46106
|
}
|
|
46064
46107
|
async stop() {
|
|
46065
46108
|
if (!this.started) {
|
|
46066
46109
|
throw new Error("Network not started yet!");
|
|
46067
46110
|
}
|
|
46068
|
-
quic_network_logger.info
|
|
46111
|
+
quic_network_logger.info `Stopping the networking.`;
|
|
46069
46112
|
await this.server.stop();
|
|
46070
46113
|
await this.socket.stop();
|
|
46071
46114
|
this.started = false;
|
|
46072
|
-
quic_network_logger.info
|
|
46115
|
+
quic_network_logger.info `Networking stopped.`;
|
|
46073
46116
|
}
|
|
46074
46117
|
get peers() {
|
|
46075
46118
|
return this._peers;
|
|
@@ -46090,7 +46133,7 @@ clazz, callback) {
|
|
|
46090
46133
|
await callback(ev);
|
|
46091
46134
|
}
|
|
46092
46135
|
catch (e) {
|
|
46093
|
-
quic_utils_logger.error
|
|
46136
|
+
quic_utils_logger.error `Unhandled exception in ${clazz.name} event handler: ${e}`;
|
|
46094
46137
|
}
|
|
46095
46138
|
});
|
|
46096
46139
|
}
|
|
@@ -46149,7 +46192,7 @@ class QuicPeer {
|
|
|
46149
46192
|
streamEvents = new (external_node_events_default())();
|
|
46150
46193
|
constructor(conn, peerInfo) {
|
|
46151
46194
|
this.conn = conn;
|
|
46152
|
-
quic_peer_logger.log
|
|
46195
|
+
quic_peer_logger.log `👥 [${peerInfo.id}] peer connected ${conn.remoteHost}:${conn.remotePort}`;
|
|
46153
46196
|
this.connectionId = conn.connectionIdShared.toString();
|
|
46154
46197
|
this.address = {
|
|
46155
46198
|
host: conn.remoteHost,
|
|
@@ -46159,11 +46202,11 @@ class QuicPeer {
|
|
|
46159
46202
|
this.key = peerInfo.key;
|
|
46160
46203
|
addEventListener(conn, EventQUICConnectionStream, (ev) => {
|
|
46161
46204
|
const stream = ev.detail;
|
|
46162
|
-
quic_peer_logger.log
|
|
46205
|
+
quic_peer_logger.log `🚰 [${this.id}] new stream: [${stream.streamId}]`;
|
|
46163
46206
|
this.streamEvents.emit("stream", new QuicStream(stream));
|
|
46164
46207
|
});
|
|
46165
46208
|
addEventListener(conn, EventQUICConnectionError, (err) => {
|
|
46166
|
-
quic_peer_logger.error
|
|
46209
|
+
quic_peer_logger.error `❌ [${this.id}] connection failed: ${err.detail}`;
|
|
46167
46210
|
});
|
|
46168
46211
|
}
|
|
46169
46212
|
addOnIncomingStream(streamCallback) {
|
|
@@ -46171,11 +46214,11 @@ class QuicPeer {
|
|
|
46171
46214
|
}
|
|
46172
46215
|
openStream() {
|
|
46173
46216
|
const stream = this.conn.newStream("bidi");
|
|
46174
|
-
quic_peer_logger.log
|
|
46217
|
+
quic_peer_logger.log `🚰 [${this.id}] opening stream: [${stream.streamId}]`;
|
|
46175
46218
|
return new QuicStream(stream);
|
|
46176
46219
|
}
|
|
46177
46220
|
async disconnect() {
|
|
46178
|
-
quic_peer_logger.log
|
|
46221
|
+
quic_peer_logger.log `👋 [${this.id}] disconnecting`;
|
|
46179
46222
|
await this.conn.stop({ isApp: true });
|
|
46180
46223
|
}
|
|
46181
46224
|
}
|
|
@@ -46196,7 +46239,7 @@ const setup_logger = Logger.new(import.meta.filename, "net");
|
|
|
46196
46239
|
class Quic {
|
|
46197
46240
|
/** Setup QUIC socket and start listening for connections. */
|
|
46198
46241
|
static async setup({ host, port, protocols, key }) {
|
|
46199
|
-
const quicLoggerLvl =
|
|
46242
|
+
const quicLoggerLvl = setup_logger.getLevel() > Level.TRACE ? LogLevel.WARN : LogLevel.DEBUG;
|
|
46200
46243
|
const quicLogger = new dist_Logger("quic", quicLoggerLvl, [
|
|
46201
46244
|
new handlers_StreamHandler(format `${level}:${keys}:${msg}`),
|
|
46202
46245
|
]);
|
|
@@ -46219,7 +46262,7 @@ class Quic {
|
|
|
46219
46262
|
verifyPeer: true,
|
|
46220
46263
|
verifyCallback: lastConnectedPeer.verifyCallback,
|
|
46221
46264
|
};
|
|
46222
|
-
setup_logger.info
|
|
46265
|
+
setup_logger.info `🆔 Peer id: ** ${altNameRaw(key.pubKey)}@${host}:${port} ** (pubkey: ${key.pubKey})`;
|
|
46223
46266
|
// Shared injected UDP socket
|
|
46224
46267
|
const socket = new dist_QUICSocket({
|
|
46225
46268
|
logger: quicLogger.getChild("socket"),
|
|
@@ -46234,8 +46277,8 @@ class Quic {
|
|
|
46234
46277
|
// peer management
|
|
46235
46278
|
const peers = new PeersManagement();
|
|
46236
46279
|
// basic error handling
|
|
46237
|
-
addEventListener(server, EventQUICServerError, (error) => setup_logger.error
|
|
46238
|
-
addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error
|
|
46280
|
+
addEventListener(server, EventQUICServerError, (error) => setup_logger.error `🛜 Server error: ${error}`);
|
|
46281
|
+
addEventListener(server, EventQUICServerClose, (ev) => setup_logger.error `🛜 Server stopped: ${ev}`);
|
|
46239
46282
|
// handling incoming session
|
|
46240
46283
|
addEventListener(server, EventQUICServerConnection, async (ev) => {
|
|
46241
46284
|
const conn = ev.detail;
|
|
@@ -46244,16 +46287,16 @@ class Quic {
|
|
|
46244
46287
|
return;
|
|
46245
46288
|
}
|
|
46246
46289
|
if (lastConnectedPeer.info.key.isEqualTo(key.pubKey)) {
|
|
46247
|
-
setup_logger.log
|
|
46290
|
+
setup_logger.log `🛜 Rejecting connection from ourself from ${conn.remoteHost}:${conn.remotePort}`;
|
|
46248
46291
|
await conn.stop();
|
|
46249
46292
|
return;
|
|
46250
46293
|
}
|
|
46251
46294
|
if (peers.isConnected(lastConnectedPeer.info.id)) {
|
|
46252
|
-
setup_logger.log
|
|
46295
|
+
setup_logger.log `🛜 Rejecting duplicate connection with peer ${lastConnectedPeer.info.id} from ${conn.remoteHost}:${conn.remotePort}`;
|
|
46253
46296
|
await conn.stop();
|
|
46254
46297
|
return;
|
|
46255
46298
|
}
|
|
46256
|
-
setup_logger.log
|
|
46299
|
+
setup_logger.log `🛜 Server handshake with ${conn.remoteHost}:${conn.remotePort}`;
|
|
46257
46300
|
newPeer(conn, lastConnectedPeer.info);
|
|
46258
46301
|
lastConnectedPeer.info = null;
|
|
46259
46302
|
await conn.start();
|
|
@@ -46276,10 +46319,10 @@ class Quic {
|
|
|
46276
46319
|
});
|
|
46277
46320
|
const client = await clientLater;
|
|
46278
46321
|
addEventListener(client, EventQUICClientClose, () => {
|
|
46279
|
-
setup_logger.log
|
|
46322
|
+
setup_logger.log `⚰️ Client connection closed.`;
|
|
46280
46323
|
});
|
|
46281
46324
|
addEventListener(client, EventQUICClientError, (error) => {
|
|
46282
|
-
setup_logger.error
|
|
46325
|
+
setup_logger.error `🔴 Client error: ${error.detail}`;
|
|
46283
46326
|
});
|
|
46284
46327
|
if (peerDetails.info === null) {
|
|
46285
46328
|
throw new Error("Client connected, but there is no peer details!");
|
|
@@ -46287,7 +46330,7 @@ class Quic {
|
|
|
46287
46330
|
if (options.verifyName !== undefined && options.verifyName !== peerDetails.info.id) {
|
|
46288
46331
|
throw new Error(`Client connected, but the id didn't match. Expected: ${options.verifyName}, got: ${peerDetails.info.id}`);
|
|
46289
46332
|
}
|
|
46290
|
-
setup_logger.log
|
|
46333
|
+
setup_logger.log `🤝 Client handshake with: ${peer.host}:${peer.port}`;
|
|
46291
46334
|
return newPeer(client.connection, peerDetails.info);
|
|
46292
46335
|
}
|
|
46293
46336
|
function newPeer(conn, peerInfo) {
|
|
@@ -46407,10 +46450,10 @@ class Connections {
|
|
|
46407
46450
|
for (;;) {
|
|
46408
46451
|
// increase the reconnection counter
|
|
46409
46452
|
meta.currentRetry += 1;
|
|
46410
|
-
if (meta.currentRetry
|
|
46453
|
+
if (meta.currentRetry > meta.maxRetries) {
|
|
46411
46454
|
// reached max retries for a peer, remove it from tracking.
|
|
46412
46455
|
this.peerInfo.delete(id);
|
|
46413
|
-
jamnp_s_peers_logger.log
|
|
46456
|
+
jamnp_s_peers_logger.log `[${id}] max retries reached. Removing peer.`;
|
|
46414
46457
|
return;
|
|
46415
46458
|
}
|
|
46416
46459
|
// else attempt to connect to a node a bit later.
|
|
@@ -46429,7 +46472,7 @@ class Connections {
|
|
|
46429
46472
|
}
|
|
46430
46473
|
// attempt to connect to the peer
|
|
46431
46474
|
try {
|
|
46432
|
-
jamnp_s_peers_logger.trace
|
|
46475
|
+
jamnp_s_peers_logger.trace `[${id}] Attempting to connect to peer at ${meta.address.host}:${meta.address.port}.`;
|
|
46433
46476
|
await this.network.dial(meta.address, { signal, verifyName: meta.peerId });
|
|
46434
46477
|
return;
|
|
46435
46478
|
}
|
|
@@ -46438,7 +46481,7 @@ class Connections {
|
|
|
46438
46481
|
return;
|
|
46439
46482
|
}
|
|
46440
46483
|
// failing to connect, will retry.
|
|
46441
|
-
jamnp_s_peers_logger.trace
|
|
46484
|
+
jamnp_s_peers_logger.trace `[${id}] attempt failed. Will retry (${meta.currentRetry}/${meta.maxRetries})`;
|
|
46442
46485
|
}
|
|
46443
46486
|
}
|
|
46444
46487
|
}
|
|
@@ -46551,7 +46594,7 @@ class StreamManager {
|
|
|
46551
46594
|
// We expect a one-byte identifier first.
|
|
46552
46595
|
const data = await reader.read();
|
|
46553
46596
|
bytes = bytes_BytesBlob.blobFrom(data.value !== undefined ? data.value : new Uint8Array());
|
|
46554
|
-
stream_manager_logger.trace
|
|
46597
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${streamId}] Initial data: ${bytes}`;
|
|
46555
46598
|
}
|
|
46556
46599
|
finally {
|
|
46557
46600
|
reader.releaseLock();
|
|
@@ -46565,7 +46608,7 @@ class StreamManager {
|
|
|
46565
46608
|
if (handler === undefined) {
|
|
46566
46609
|
throw new Error(`Unsupported stream kind: ${kind}`);
|
|
46567
46610
|
}
|
|
46568
|
-
stream_manager_logger.log
|
|
46611
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${stream.streamId}] Stream identified as: ${kind}`;
|
|
46569
46612
|
this.registerStream(peer, handler, stream, bytes_BytesBlob.blobFrom(bytes.raw.subarray(1)));
|
|
46570
46613
|
}
|
|
46571
46614
|
registerStream(peer, handler, stream, initialData) {
|
|
@@ -46575,7 +46618,7 @@ class StreamManager {
|
|
|
46575
46618
|
this.streams.delete(streamId);
|
|
46576
46619
|
this.backgroundTasks.delete(streamId);
|
|
46577
46620
|
if (kind === StreamErrorKind.Exception) {
|
|
46578
|
-
stream_manager_logger.error
|
|
46621
|
+
stream_manager_logger.error `🚰 --- [${peer.id}:${streamId}] Stream error: ${e}. Disconnecting peer.`;
|
|
46579
46622
|
}
|
|
46580
46623
|
if (kind !== StreamErrorKind.LocalClose) {
|
|
46581
46624
|
// whenever we have an error, we are going to inform the handler
|
|
@@ -46609,10 +46652,10 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
46609
46652
|
let isDone = false;
|
|
46610
46653
|
const callback = handleMessageFragmentation((data) => {
|
|
46611
46654
|
const bytes = bytes_BytesBlob.blobFrom(new Uint8Array(data));
|
|
46612
|
-
stream_manager_logger.trace
|
|
46655
|
+
stream_manager_logger.trace `🚰 --> [${peer.id}:${quicStream.streamId}] ${bytes}`;
|
|
46613
46656
|
handler.onStreamMessage(quicStream, bytes);
|
|
46614
46657
|
}, () => {
|
|
46615
|
-
stream_manager_logger.error
|
|
46658
|
+
stream_manager_logger.error `🚰 --> [${peer.id}:${quicStream.streamId}] got too much data. Disconnecting.`;
|
|
46616
46659
|
peer.disconnect();
|
|
46617
46660
|
});
|
|
46618
46661
|
for (;;) {
|
|
@@ -46621,7 +46664,7 @@ async function readStreamForever(peer, handler, quicStream, initialData, reader)
|
|
|
46621
46664
|
// be a promise, so that we can make back pressure here.
|
|
46622
46665
|
callback(bytes.raw);
|
|
46623
46666
|
if (isDone) {
|
|
46624
|
-
stream_manager_logger.log
|
|
46667
|
+
stream_manager_logger.log `🚰 --> [${peer.id}:${quicStream.streamId}] remote finished.`;
|
|
46625
46668
|
return;
|
|
46626
46669
|
}
|
|
46627
46670
|
// await for more data
|
|
@@ -46664,7 +46707,7 @@ class QuicStreamSender {
|
|
|
46664
46707
|
return;
|
|
46665
46708
|
}
|
|
46666
46709
|
const { data, addPrefix } = chunk;
|
|
46667
|
-
stream_manager_logger.trace
|
|
46710
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] write: ${data}`;
|
|
46668
46711
|
if (addPrefix) {
|
|
46669
46712
|
await writer.write(encodeMessageLength(data.raw));
|
|
46670
46713
|
}
|
|
@@ -46681,7 +46724,7 @@ class QuicStreamSender {
|
|
|
46681
46724
|
}
|
|
46682
46725
|
close() {
|
|
46683
46726
|
handleAsyncErrors(async () => {
|
|
46684
|
-
stream_manager_logger.trace
|
|
46727
|
+
stream_manager_logger.trace `🚰 <-- [${this.streamId}] closing`;
|
|
46685
46728
|
if (this.currentWriterPromise !== null) {
|
|
46686
46729
|
await this.currentWriterPromise;
|
|
46687
46730
|
}
|
|
@@ -46767,7 +46810,7 @@ class ServerHandler {
|
|
|
46767
46810
|
}
|
|
46768
46811
|
onStreamMessage(sender, message) {
|
|
46769
46812
|
const request = decoder_Decoder.decodeObject(BlockRequest.Codec, message);
|
|
46770
|
-
ce_128_block_request_logger.log
|
|
46813
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Client has requested: ${request}`;
|
|
46771
46814
|
const blocks = this.getBlockSequence(sender.streamId, request.headerHash, request.direction, request.maxBlocks);
|
|
46772
46815
|
sender.bufferAndSend(encoder_Encoder.encodeObject(descriptors_codec.sequenceFixLen(block_Block.Codec.View, blocks.length), blocks, this.chainSpec));
|
|
46773
46816
|
sender.close();
|
|
@@ -46787,7 +46830,7 @@ class ClientHandler {
|
|
|
46787
46830
|
throw new Error("Received an unexpected message from the server.");
|
|
46788
46831
|
}
|
|
46789
46832
|
const blocks = decoder_Decoder.decodeSequence(block_Block.Codec.View, message, this.chainSpec);
|
|
46790
|
-
ce_128_block_request_logger.log
|
|
46833
|
+
ce_128_block_request_logger.log `[${sender.streamId}] Server returned ${blocks.length} blocks in ${message.length} bytes of data.`;
|
|
46791
46834
|
this.promiseResolvers.get(sender.streamId)?.(blocks);
|
|
46792
46835
|
this.promiseResolvers.delete(sender.streamId);
|
|
46793
46836
|
}
|
|
@@ -46958,13 +47001,13 @@ class ce_129_state_request_Handler {
|
|
|
46958
47001
|
}
|
|
46959
47002
|
onStreamMessage(sender, message) {
|
|
46960
47003
|
if (this.isServer) {
|
|
46961
|
-
ce_129_state_request_logger.info
|
|
47004
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: Received request.`;
|
|
46962
47005
|
if (this.getBoundaryNodes === undefined || this.getKeyValuePairs === undefined)
|
|
46963
47006
|
return;
|
|
46964
47007
|
const request = Decoder.decodeObject(StateRequest.Codec, message);
|
|
46965
47008
|
const boundaryNodes = this.getBoundaryNodes(request.headerHash, request.startKey, request.endKey);
|
|
46966
47009
|
const keyValuePairs = this.getKeyValuePairs(request.headerHash, request.startKey, request.endKey);
|
|
46967
|
-
ce_129_state_request_logger.info
|
|
47010
|
+
ce_129_state_request_logger.info `[${sender.streamId}][server]: <-- responding with boundary nodes and key value pairs.`;
|
|
46968
47011
|
sender.bufferAndSend(Encoder.encodeObject(codec.sequenceVarLen(trieNodeCodec), boundaryNodes));
|
|
46969
47012
|
sender.bufferAndSend(Encoder.encodeObject(StateResponse.Codec, StateResponse.create({ keyValuePairs })));
|
|
46970
47013
|
sender.close();
|
|
@@ -46972,11 +47015,11 @@ class ce_129_state_request_Handler {
|
|
|
46972
47015
|
}
|
|
46973
47016
|
if (!this.boundaryNodes.has(sender.streamId)) {
|
|
46974
47017
|
this.boundaryNodes.set(sender.streamId, Decoder.decodeObject(codec.sequenceVarLen(trieNodeCodec), message));
|
|
46975
|
-
ce_129_state_request_logger.info
|
|
47018
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received boundary nodes.`;
|
|
46976
47019
|
return;
|
|
46977
47020
|
}
|
|
46978
47021
|
this.onResponse.get(sender.streamId)?.(Decoder.decodeObject(StateResponse.Codec, message));
|
|
46979
|
-
ce_129_state_request_logger.info
|
|
47022
|
+
ce_129_state_request_logger.info `[${sender.streamId}][client]: Received state values.`;
|
|
46980
47023
|
}
|
|
46981
47024
|
onClose(streamId) {
|
|
46982
47025
|
this.boundaryNodes.delete(streamId);
|
|
@@ -47033,7 +47076,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ServerHandler {
|
|
|
47033
47076
|
}
|
|
47034
47077
|
onStreamMessage(sender, message) {
|
|
47035
47078
|
const ticketDistribution = Decoder.decodeObject(TicketDistributionRequest.Codec, message);
|
|
47036
|
-
ce_131_ce_132_safrole_ticket_distribution_logger.log
|
|
47079
|
+
ce_131_ce_132_safrole_ticket_distribution_logger.log `[${sender.streamId}][ce-${this.kind}] Received ticket for epoch ${ticketDistribution.epochIndex}`;
|
|
47037
47080
|
this.onTicketReceived(ticketDistribution.epochIndex, ticketDistribution.ticket);
|
|
47038
47081
|
sender.close();
|
|
47039
47082
|
}
|
|
@@ -47045,7 +47088,7 @@ class ce_131_ce_132_safrole_ticket_distribution_ClientHandler {
|
|
|
47045
47088
|
this.kind = kind;
|
|
47046
47089
|
}
|
|
47047
47090
|
onStreamMessage(sender) {
|
|
47048
|
-
ce_131_ce_132_safrole_ticket_distribution_logger.warn
|
|
47091
|
+
ce_131_ce_132_safrole_ticket_distribution_logger.warn `[${sender.streamId}][ce-${this.kind}] Unexpected message received. Closing.`;
|
|
47049
47092
|
sender.close();
|
|
47050
47093
|
}
|
|
47051
47094
|
onClose() { }
|
|
@@ -47118,15 +47161,15 @@ class ce_133_work_package_submission_ServerHandler {
|
|
|
47118
47161
|
class ce_133_work_package_submission_ClientHandler {
|
|
47119
47162
|
kind = ce_133_work_package_submission_STREAM_KIND;
|
|
47120
47163
|
onStreamMessage(sender) {
|
|
47121
|
-
ce_133_work_package_submission_logger.warn
|
|
47164
|
+
ce_133_work_package_submission_logger.warn `[${sender.streamId}] Got unexpected message on CE-133 stream. Closing.`;
|
|
47122
47165
|
sender.close();
|
|
47123
47166
|
}
|
|
47124
47167
|
onClose() { }
|
|
47125
47168
|
sendWorkPackage(sender, coreIndex, workPackage, extrinsic) {
|
|
47126
47169
|
const corePack = CoreWorkPackage.create({ coreIndex, workPackage });
|
|
47127
|
-
ce_133_work_package_submission_logger.trace
|
|
47170
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending work package: ${corePack}`;
|
|
47128
47171
|
sender.bufferAndSend(Encoder.encodeObject(CoreWorkPackage.Codec, corePack));
|
|
47129
|
-
ce_133_work_package_submission_logger.trace
|
|
47172
|
+
ce_133_work_package_submission_logger.trace `[${sender.streamId}] Sending extrinsics: ${workPackage.items}`;
|
|
47130
47173
|
sender.bufferAndSend(Encoder.encodeObject(workItemExtrinsicsCodec(workPackage.items), extrinsic));
|
|
47131
47174
|
// now close the connection
|
|
47132
47175
|
sender.close();
|
|
@@ -47202,7 +47245,7 @@ class ce_134_work_package_sharing_ServerHandler {
|
|
|
47202
47245
|
ce_134_work_package_sharing_ServerHandler.sendWorkReport(sender, workReportHash, signature);
|
|
47203
47246
|
})
|
|
47204
47247
|
.catch((error) => {
|
|
47205
|
-
ce_134_work_package_sharing_logger.error
|
|
47248
|
+
ce_134_work_package_sharing_logger.error `[${streamId}] Error processing work package: ${error}`;
|
|
47206
47249
|
this.onClose(streamId);
|
|
47207
47250
|
});
|
|
47208
47251
|
}
|
|
@@ -47219,7 +47262,7 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
47219
47262
|
throw new Error("Unexpected message received.");
|
|
47220
47263
|
}
|
|
47221
47264
|
const response = Decoder.decodeObject(WorkPackageSharingResponse.Codec, message);
|
|
47222
|
-
ce_134_work_package_sharing_logger.info
|
|
47265
|
+
ce_134_work_package_sharing_logger.info `[${sender.streamId}] Received work report hash and signature.`;
|
|
47223
47266
|
pendingRequest.resolve({ workReportHash: response.workReportHash, signature: response.signature });
|
|
47224
47267
|
sender.close();
|
|
47225
47268
|
}
|
|
@@ -47232,9 +47275,9 @@ class ce_134_work_package_sharing_ClientHandler {
|
|
|
47232
47275
|
}
|
|
47233
47276
|
async sendWorkPackage(sender, coreIndex, segmentsRootMappings, workPackageBundle) {
|
|
47234
47277
|
const request = WorkPackageSharingRequest.create({ coreIndex, segmentsRootMappings });
|
|
47235
|
-
ce_134_work_package_sharing_logger.trace
|
|
47278
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending core index and segments-root mappings.`;
|
|
47236
47279
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageSharingRequest.Codec, request));
|
|
47237
|
-
ce_134_work_package_sharing_logger.trace
|
|
47280
|
+
ce_134_work_package_sharing_logger.trace `[${sender.streamId}] Sending work package bundle.`;
|
|
47238
47281
|
sender.bufferAndSend(Encoder.encodeObject(WorkPackageBundleCodec, workPackageBundle));
|
|
47239
47282
|
return new Promise((resolve, reject) => {
|
|
47240
47283
|
this.pendingRequests.set(sender.streamId, { resolve, reject });
|
|
@@ -47294,7 +47337,7 @@ class ce_135_work_report_distribution_ServerHandler {
|
|
|
47294
47337
|
}
|
|
47295
47338
|
onStreamMessage(sender, message) {
|
|
47296
47339
|
const guaranteedWorkReport = Decoder.decodeObject(GuaranteedWorkReport.Codec, message, this.chainSpec);
|
|
47297
|
-
ce_135_work_report_distribution_logger.log
|
|
47340
|
+
ce_135_work_report_distribution_logger.log `[${sender.streamId}] Received guaranteed work report.`;
|
|
47298
47341
|
this.onWorkReport(guaranteedWorkReport);
|
|
47299
47342
|
sender.close();
|
|
47300
47343
|
}
|
|
@@ -47307,12 +47350,12 @@ class ce_135_work_report_distribution_ClientHandler {
|
|
|
47307
47350
|
this.chainSpec = chainSpec;
|
|
47308
47351
|
}
|
|
47309
47352
|
onStreamMessage(sender) {
|
|
47310
|
-
ce_135_work_report_distribution_logger.warn
|
|
47353
|
+
ce_135_work_report_distribution_logger.warn `[${sender.streamId}] Got unexpected message on CE-135 stream. Closing.`;
|
|
47311
47354
|
sender.close();
|
|
47312
47355
|
}
|
|
47313
47356
|
onClose() { }
|
|
47314
47357
|
sendWorkReport(sender, workReport) {
|
|
47315
|
-
ce_135_work_report_distribution_logger.trace
|
|
47358
|
+
ce_135_work_report_distribution_logger.trace `[${sender.streamId}] Sending guaranteed work report.`;
|
|
47316
47359
|
sender.bufferAndSend(Encoder.encodeObject(GuaranteedWorkReport.Codec, workReport, this.chainSpec));
|
|
47317
47360
|
sender.close();
|
|
47318
47361
|
}
|
|
@@ -47418,7 +47461,7 @@ class up_0_block_announcement_Handler {
|
|
|
47418
47461
|
this.handshakes.set(streamId, handshake);
|
|
47419
47462
|
// we didn't initiate this handshake, so let's respond
|
|
47420
47463
|
if (!this.pendingHandshakes.delete(streamId)) {
|
|
47421
|
-
up_0_block_announcement_logger.log
|
|
47464
|
+
up_0_block_announcement_logger.log `[${streamId}] <-- responding with a handshake.`;
|
|
47422
47465
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, this.getHandshake()));
|
|
47423
47466
|
}
|
|
47424
47467
|
this.onHandshake(streamId, handshake);
|
|
@@ -47426,7 +47469,7 @@ class up_0_block_announcement_Handler {
|
|
|
47426
47469
|
}
|
|
47427
47470
|
// it's just an announcement
|
|
47428
47471
|
const annoucement = decoder_Decoder.decodeObject(Announcement.Codec, message, this.spec);
|
|
47429
|
-
up_0_block_announcement_logger.log
|
|
47472
|
+
up_0_block_announcement_logger.log `[${streamId}] --> got blocks announcement: ${annoucement.final}`;
|
|
47430
47473
|
this.onAnnouncement(streamId, annoucement);
|
|
47431
47474
|
}
|
|
47432
47475
|
onClose(streamId) {
|
|
@@ -47439,7 +47482,7 @@ class up_0_block_announcement_Handler {
|
|
|
47439
47482
|
return;
|
|
47440
47483
|
}
|
|
47441
47484
|
const handshake = this.getHandshake();
|
|
47442
|
-
up_0_block_announcement_logger.trace
|
|
47485
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending handshake`;
|
|
47443
47486
|
this.pendingHandshakes.set(sender.streamId, true);
|
|
47444
47487
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Handshake.Codec, handshake));
|
|
47445
47488
|
}
|
|
@@ -47447,11 +47490,11 @@ class up_0_block_announcement_Handler {
|
|
|
47447
47490
|
const { streamId } = sender;
|
|
47448
47491
|
// only send announcement if we've handshaken
|
|
47449
47492
|
if (this.handshakes.has(streamId)) {
|
|
47450
|
-
up_0_block_announcement_logger.trace
|
|
47493
|
+
up_0_block_announcement_logger.trace `[${streamId}] <-- sending block announcement: ${annoucement.final}`;
|
|
47451
47494
|
sender.bufferAndSend(encoder_Encoder.encodeObject(Announcement.Codec, annoucement, this.spec));
|
|
47452
47495
|
}
|
|
47453
47496
|
else {
|
|
47454
|
-
up_0_block_announcement_logger.warn
|
|
47497
|
+
up_0_block_announcement_logger.warn `[${streamId}] <-- no handshake yet, skipping announcement.`;
|
|
47455
47498
|
}
|
|
47456
47499
|
}
|
|
47457
47500
|
}
|
|
@@ -47568,7 +47611,7 @@ class SyncTask {
|
|
|
47568
47611
|
onUp0Annoucement(peer, announcement) {
|
|
47569
47612
|
const { hash, slot } = announcement.final;
|
|
47570
47613
|
const bestHeader = hashHeader(announcement.header, this.spec);
|
|
47571
|
-
sync_logger.info
|
|
47614
|
+
sync_logger.info `[${peer.id}] --> Received new header #${announcement.header.timeSlotIndex}: ${bestHeader.hash}`;
|
|
47572
47615
|
// NOTE [ToDr] Instead of having `Connections` store aux data perhaps
|
|
47573
47616
|
// we should maintain that directly? However that would require
|
|
47574
47617
|
// listening to peers connected/disconnected to perfrom some cleanups
|
|
@@ -47643,7 +47686,7 @@ class SyncTask {
|
|
|
47643
47686
|
const peers = this.connections.getConnectedPeers();
|
|
47644
47687
|
for (const peerInfo of peers) {
|
|
47645
47688
|
this.streamManager.withStreamOfKind(peerInfo.peerId, up_0_block_announcement_STREAM_KIND, (handler, sender) => {
|
|
47646
|
-
sync_logger.log
|
|
47689
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Broadcasting new header #${slot}: ${header.hash}`;
|
|
47647
47690
|
handler.sendAnnouncement(sender, annoucement);
|
|
47648
47691
|
return result_OK;
|
|
47649
47692
|
});
|
|
@@ -47657,13 +47700,13 @@ class SyncTask {
|
|
|
47657
47700
|
}
|
|
47658
47701
|
if (res.error === BlockSequenceError.BlockOnFork) {
|
|
47659
47702
|
// seems that peer is requesting syncing a fork from us, let's bail.
|
|
47660
|
-
sync_logger.warn
|
|
47703
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} is on a fork.`;
|
|
47661
47704
|
return [];
|
|
47662
47705
|
}
|
|
47663
47706
|
if (res.error === BlockSequenceError.NoStartBlock) {
|
|
47664
47707
|
// we don't know about that block at all, so let's just bail.
|
|
47665
47708
|
// we should probably penalize the peer for sending BS?
|
|
47666
|
-
sync_logger.warn
|
|
47709
|
+
sync_logger.warn `[${peer.id}] --> Invalid block sequence request: ${startHash} missing header or extrinsic.`;
|
|
47667
47710
|
return [];
|
|
47668
47711
|
}
|
|
47669
47712
|
debug_assertNever(res.error);
|
|
@@ -47683,10 +47726,10 @@ class SyncTask {
|
|
|
47683
47726
|
// figure out where others are at
|
|
47684
47727
|
const othersBest = this.othersBest;
|
|
47685
47728
|
const blocksToSync = othersBest.slot - ourBestSlot;
|
|
47686
|
-
sync_logger.trace
|
|
47729
|
+
sync_logger.trace `Our best. ${ourBestSlot}. Best seen: ${othersBest.slot}`;
|
|
47687
47730
|
if (blocksToSync < 1) {
|
|
47688
47731
|
this.connections.getPeerCount();
|
|
47689
|
-
sync_logger.trace
|
|
47732
|
+
sync_logger.trace `No new blocks. ${peerCount} peers.`;
|
|
47690
47733
|
return {
|
|
47691
47734
|
kind: SyncResult.NoNewBlocks,
|
|
47692
47735
|
ours: ourBestSlot,
|
|
@@ -47694,7 +47737,7 @@ class SyncTask {
|
|
|
47694
47737
|
};
|
|
47695
47738
|
}
|
|
47696
47739
|
const requested = [];
|
|
47697
|
-
sync_logger.log
|
|
47740
|
+
sync_logger.log `Sync ${blocksToSync} blocks from ${peerCount} peers.`;
|
|
47698
47741
|
// NOTE [ToDr] We might be requesting the same blocks from many peers
|
|
47699
47742
|
// which isn't very optimal, but for now: 🤷
|
|
47700
47743
|
//
|
|
@@ -47720,12 +47763,12 @@ class SyncTask {
|
|
|
47720
47763
|
// request as much blocks from that peer as possible.
|
|
47721
47764
|
this.streamManager.withNewStream(peerInfo.peerRef, STREAM_KIND, (handler, sender) => {
|
|
47722
47765
|
handleAsyncErrors(async () => {
|
|
47723
|
-
sync_logger.log
|
|
47766
|
+
sync_logger.log `[${peerInfo.peerId}] <-- Fetching ${bestSlot - ourBestSlot} blocks (${bestHash})`;
|
|
47724
47767
|
const blocks = await handler.requestBlockSequence(sender, bestHash, Direction.DescIncl, numbers_tryAsU32(bestSlot - ourBestSlot));
|
|
47725
47768
|
blocks.reverse();
|
|
47726
47769
|
this.onNewBlocks(blocks, peerInfo.peerId);
|
|
47727
47770
|
}, (e) => {
|
|
47728
|
-
sync_logger.warn
|
|
47771
|
+
sync_logger.warn `[${peerInfo.peerId}] <-- requesting blocks to import: ${e}`;
|
|
47729
47772
|
});
|
|
47730
47773
|
return result_OK;
|
|
47731
47774
|
});
|
|
@@ -47799,7 +47842,7 @@ function setupPeerListeners(syncTask, network, streamManager) {
|
|
|
47799
47842
|
// whenever the peer wants to open a stream with us, let's handle that.
|
|
47800
47843
|
peer.addOnIncomingStream((stream) => {
|
|
47801
47844
|
handleAsyncErrors(() => streamManager.onIncomingStream(peer, stream), (e) => {
|
|
47802
|
-
network_logger.error
|
|
47845
|
+
network_logger.error `[${peer.id}:${stream.streamId}]🚰 Stream error: ${e}. Disconnecting peer.`;
|
|
47803
47846
|
peer.disconnect();
|
|
47804
47847
|
});
|
|
47805
47848
|
return result_OK;
|
|
@@ -47890,7 +47933,7 @@ class MainReady extends State {
|
|
|
47890
47933
|
this.onNewBlocks.emit(blocks);
|
|
47891
47934
|
}
|
|
47892
47935
|
else {
|
|
47893
|
-
state_machine_logger.error
|
|
47936
|
+
state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(block)}.`;
|
|
47894
47937
|
}
|
|
47895
47938
|
}
|
|
47896
47939
|
announceHeader(port, header) {
|
|
@@ -47928,7 +47971,7 @@ class NetworkReady extends State {
|
|
|
47928
47971
|
this.onNewHeader.emit(decoded);
|
|
47929
47972
|
}
|
|
47930
47973
|
else {
|
|
47931
|
-
state_machine_logger.error
|
|
47974
|
+
state_machine_logger.error `${this.constructor.name} got invalid signal type: ${JSON.stringify(header)}.`;
|
|
47932
47975
|
}
|
|
47933
47976
|
}
|
|
47934
47977
|
sendBlocks(port, blocks) {
|
|
@@ -47967,7 +48010,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
47967
48010
|
Logger.configureAll(process.env.JAM_LOG ?? "", Level.LOG);
|
|
47968
48011
|
const machine = networkStateMachine();
|
|
47969
48012
|
const channel = MessageChannelStateMachine.receiveChannel(machine, external_node_worker_threads_namespaceObject.parentPort);
|
|
47970
|
-
channel.then((channel) => main(channel)).catch((e) => jam_network_logger.error
|
|
48013
|
+
channel.then((channel) => main(channel)).catch((e) => jam_network_logger.error `${e}`);
|
|
47971
48014
|
}
|
|
47972
48015
|
/**
|
|
47973
48016
|
* JAM networking worker.
|
|
@@ -47978,7 +48021,7 @@ if (!external_node_worker_threads_namespaceObject.isMainThread) {
|
|
|
47978
48021
|
*/
|
|
47979
48022
|
async function main(channel) {
|
|
47980
48023
|
await initAll();
|
|
47981
|
-
jam_network_logger.trace
|
|
48024
|
+
jam_network_logger.trace `🛜 Network starting ${channel.currentState()}`;
|
|
47982
48025
|
// Await the configuration object
|
|
47983
48026
|
// TODO [ToDr] The whole state machine needs to die.
|
|
47984
48027
|
const ready = channel.currentState().stateName !== "ready(network)"
|
|
@@ -47989,7 +48032,7 @@ async function main(channel) {
|
|
|
47989
48032
|
const key = await ed25519_privateKey(config.key);
|
|
47990
48033
|
const lmdb = new LmdbRoot(config.genericConfig.dbPath);
|
|
47991
48034
|
const blocks = new LmdbBlocks(config.genericConfig.chainSpec, lmdb);
|
|
47992
|
-
jam_network_logger.info
|
|
48035
|
+
jam_network_logger.info `🛜 Listening at ${config.host}:${config.port}`;
|
|
47993
48036
|
const network = await setup({
|
|
47994
48037
|
host: config.host,
|
|
47995
48038
|
port: config.port,
|
|
@@ -48002,7 +48045,7 @@ async function main(channel) {
|
|
|
48002
48045
|
ready.waitForState("finished").then(() => network.network.stop());
|
|
48003
48046
|
await network.network.start();
|
|
48004
48047
|
});
|
|
48005
|
-
jam_network_logger.info
|
|
48048
|
+
jam_network_logger.info `🛜 Network worker finished. Closing channel.`;
|
|
48006
48049
|
// Close the comms to gracefuly close the app.
|
|
48007
48050
|
finished.currentState().close(channel);
|
|
48008
48051
|
}
|