@typeberry/lib 0.5.6 → 0.5.7-d496f70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/bin/lib/scripts/build-lib.js +1 -1
  2. package/package.json +7 -3
  3. package/packages/core/networking/metrics.js +2 -2
  4. package/packages/core/telemetry/index.d.ts.map +1 -1
  5. package/packages/core/telemetry/index.js +2 -3
  6. package/packages/core/utils/index.d.ts +1 -0
  7. package/packages/core/utils/index.d.ts.map +1 -1
  8. package/packages/core/utils/index.js +1 -0
  9. package/packages/core/utils/package.d.ts +3 -0
  10. package/packages/core/utils/package.d.ts.map +1 -0
  11. package/packages/core/utils/package.js +4 -0
  12. package/packages/jam/jamnp-s/network.d.ts +2 -0
  13. package/packages/jam/jamnp-s/network.d.ts.map +1 -1
  14. package/packages/jam/jamnp-s/network.js +4 -0
  15. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts +4 -0
  16. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts.map +1 -1
  17. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.js +4 -0
  18. package/packages/jam/jamnp-s/tasks/ticket-distribution.d.ts +33 -0
  19. package/packages/jam/jamnp-s/tasks/ticket-distribution.d.ts.map +1 -0
  20. package/packages/jam/jamnp-s/tasks/ticket-distribution.js +115 -0
  21. package/packages/jam/jamnp-s/tasks/ticket-distribution.test.d.ts +2 -0
  22. package/packages/jam/jamnp-s/tasks/ticket-distribution.test.d.ts.map +1 -0
  23. package/packages/jam/jamnp-s/tasks/ticket-distribution.test.js +219 -0
  24. package/packages/jam/node/main-fuzz.d.ts.map +1 -1
  25. package/packages/jam/node/main-fuzz.js +2 -3
  26. package/packages/jam/node/main-fuzz.test.js +2 -4
  27. package/packages/jam/node/main-importer.d.ts.map +1 -1
  28. package/packages/jam/node/main-importer.js +2 -3
  29. package/packages/jam/node/main.d.ts.map +1 -1
  30. package/packages/jam/node/main.js +58 -29
  31. package/packages/jam/node/metrics.js +2 -2
  32. package/packages/jam/node/workers.d.ts +10 -3
  33. package/packages/jam/node/workers.d.ts.map +1 -1
  34. package/packages/jam/node/workers.js +16 -7
  35. package/packages/workers/api-node/config.d.ts +5 -1
  36. package/packages/workers/api-node/config.d.ts.map +1 -1
  37. package/packages/workers/api-node/config.js +9 -3
  38. package/packages/workers/api-node/port.d.ts +8 -0
  39. package/packages/workers/api-node/port.d.ts.map +1 -1
  40. package/packages/workers/api-node/port.js +10 -0
  41. package/packages/workers/block-authorship/bootstrap-main.js +10 -3
  42. package/packages/workers/block-authorship/main.d.ts +2 -1
  43. package/packages/workers/block-authorship/main.d.ts.map +1 -1
  44. package/packages/workers/block-authorship/main.js +4 -3
  45. package/packages/workers/block-authorship/metrics.js +2 -2
  46. package/packages/workers/comms-authorship-network/index.d.ts +3 -0
  47. package/packages/workers/comms-authorship-network/index.d.ts.map +1 -0
  48. package/packages/workers/comms-authorship-network/index.js +2 -0
  49. package/packages/workers/comms-authorship-network/protocol.d.ts +27 -0
  50. package/packages/workers/comms-authorship-network/protocol.d.ts.map +1 -0
  51. package/packages/workers/comms-authorship-network/protocol.js +24 -0
  52. package/packages/workers/comms-authorship-network/tickets-message.d.ts +18 -0
  53. package/packages/workers/comms-authorship-network/tickets-message.d.ts.map +1 -0
  54. package/packages/workers/comms-authorship-network/tickets-message.js +19 -0
  55. package/packages/workers/importer/metrics.js +2 -2
  56. package/packages/workers/jam-network/bootstrap-main.js +10 -3
  57. package/packages/workers/jam-network/main.d.ts +2 -1
  58. package/packages/workers/jam-network/main.d.ts.map +1 -1
  59. package/packages/workers/jam-network/main.js +8 -1
  60. package/packages/core/networking/package.json +0 -26
  61. package/packages/core/telemetry/package.json +0 -19
  62. package/packages/jam/node/package.json +0 -39
  63. package/packages/workers/block-authorship/package.json +0 -33
  64. package/packages/workers/importer/package.json +0 -33
@@ -3,15 +3,14 @@ import { PvmBackend } from "#@typeberry/config";
3
3
  import { bandersnatch, initWasm } from "#@typeberry/crypto";
4
4
  import { Blake2b, HASH_SIZE } from "#@typeberry/hash";
5
5
  import { createImporter } from "#@typeberry/importer";
6
- import { CURRENT_SUITE, CURRENT_VERSION, Result, resultToString } from "#@typeberry/utils";
6
+ import { CURRENT_SUITE, CURRENT_VERSION, Result, resultToString, version } from "#@typeberry/utils";
7
7
  import { InMemWorkerConfig, LmdbWorkerConfig } from "#@typeberry/workers-api-node";
8
8
  import { getChainSpec, getDatabasePath, initializeDatabase, logger } from "./common.js";
9
- import packageJson from "./package.json" with { type: "json" };
10
9
  const zeroHash = Bytes.zero(HASH_SIZE).asOpaque();
11
10
  export async function mainImporter(config, withRelPath, options = {}) {
12
11
  await initWasm();
13
12
  const bandesnatchNative = bandersnatch.checkNativeBindings();
14
- logger.info `🫐 Typeberry ${packageJson.version}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
13
+ logger.info `🫐 Typeberry ${version}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
15
14
  logger.info `🎸 Starting importer: ${config.nodeName}.`;
16
15
  logger.info `🖥️ PVM Backend: ${PvmBackend[config.pvmBackend]}.`;
17
16
  logger.info `🐇 Bandersnatch ${bandesnatchNative.isOk ? "native 🚀" : `using wasm: ${bandesnatchNative.error}`}`;
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAc,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAe/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAkC,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAK1E,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAYhE,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAChE,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,oBAAoB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,wBAAsB,IAAI,CACxB,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAClC,SAAS,EAAE,SAAS,GAAG,IAAI,GAC1B,OAAO,CAAC,OAAO,CAAC,CAuJlB"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAc,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAe/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAkC,MAAM,EAAW,MAAM,kBAAkB,CAAC;AAKnF,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAWhE,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAChE,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,oBAAoB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,wBAAsB,IAAI,CACxB,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAClC,SAAS,EAAE,SAAS,GAAG,IAAI,GAC1B,OAAO,CAAC,OAAO,CAAC,CAuKlB"}
@@ -1,4 +1,5 @@
1
1
  import { isMainThread } from "node:worker_threads";
2
+ import { AUTHORSHIP_NETWORK_PORT } from "#@typeberry/comms-authorship-network";
2
3
  import { PvmBackend } from "#@typeberry/config";
3
4
  import { initWasm } from "#@typeberry/crypto";
4
5
  import { deriveBandersnatchSecretKey, deriveEd25519SecretKey, trivialSeed, } from "#@typeberry/crypto/key-derivation.js";
@@ -7,13 +8,12 @@ import { ImporterConfig } from "#@typeberry/importer";
7
8
  import { NetworkingConfig } from "#@typeberry/jam-network";
8
9
  import { Listener } from "#@typeberry/listener";
9
10
  import { tryAsU16, tryAsU32 } from "#@typeberry/numbers";
10
- import { CURRENT_SUITE, CURRENT_VERSION, Result } from "#@typeberry/utils";
11
- import { DirectWorkerConfig } from "#@typeberry/workers-api";
12
- import { InMemWorkerConfig, LmdbWorkerConfig } from "#@typeberry/workers-api-node";
11
+ import { CURRENT_SUITE, CURRENT_VERSION, Result, version } from "#@typeberry/utils";
12
+ import { DirectPort, DirectWorkerConfig } from "#@typeberry/workers-api";
13
+ import { InMemWorkerConfig, LmdbWorkerConfig, ThreadPort } from "#@typeberry/workers-api-node";
13
14
  import { getChainSpec, getDatabasePath, initializeDatabase, logger } from "./common.js";
14
15
  import { initializeExtensions } from "./extensions.js";
15
16
  import * as metrics from "./metrics.js";
16
- import packageJson from "./package.json" with { type: "json" };
17
17
  import { spawnBlockGeneratorWorker, spawnImporterWorker, spawnNetworkWorker, startBlockGenerator, startImporterDirect, startNetwork, } from "./workers.js";
18
18
  export async function main(config, withRelPath, telemetry) {
19
19
  if (!isMainThread) {
@@ -21,7 +21,7 @@ export async function main(config, withRelPath, telemetry) {
21
21
  }
22
22
  await initWasm();
23
23
  const nodeMetrics = metrics.createMetrics();
24
- logger.info `🫐 Typeberry ${packageJson.version}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
24
+ logger.info `🫐 Typeberry ${version}. GP: ${CURRENT_VERSION} (${CURRENT_SUITE})`;
25
25
  logger.info `🎸 Starting node: ${config.nodeName}.`;
26
26
  logger.info `🖥️ PVM Backend: ${PvmBackend[config.pvmBackend]}.`;
27
27
  const chainSpec = getChainSpec(config.node.flavor);
@@ -37,8 +37,8 @@ export async function main(config, withRelPath, telemetry) {
37
37
  }),
38
38
  };
39
39
  const importerConfig = isInMemory
40
- ? { type: "inmem", config: InMemWorkerConfig.new(importerParams) }
41
- : { type: "lmdb", config: LmdbWorkerConfig.new(importerParams) };
40
+ ? { isInMemory, config: InMemWorkerConfig.new(importerParams) }
41
+ : { isInMemory, config: LmdbWorkerConfig.new(importerParams) };
42
42
  // Initialize the database with genesis state and block if there isn't one.
43
43
  logger.info `🛢️ Opening database at ${dbPath}`;
44
44
  const rootDb = importerConfig.config.openDatabase({ readonly: false });
@@ -51,7 +51,7 @@ export async function main(config, withRelPath, telemetry) {
51
51
  // Start block importer
52
52
  let importer;
53
53
  let closeImporter;
54
- if (importerConfig.type === "inmem") {
54
+ if (importerConfig.isInMemory) {
55
55
  ({ importer, finish: closeImporter } = await startImporterDirect(DirectWorkerConfig.new({
56
56
  ...importerConfig.config,
57
57
  blocksDb: rootDb.getBlocksDb(),
@@ -92,9 +92,24 @@ export async function main(config, withRelPath, telemetry) {
92
92
  },
93
93
  ],
94
94
  };
95
- const closeAuthorship = await initAuthorship(importer, config.isAuthoring, config.isFastForward, rootDb, baseConfig, authorshipKeys, isInMemory);
96
- // Networking initialization
97
- const closeNetwork = await initNetwork(importer, rootDb, baseConfig, genesisHeaderHash, config.network, bestHeader, isInMemory);
95
+ const { networkingParams, authorshipParams } = isInMemory
96
+ ? (() => {
97
+ const [tx, rx] = DirectPort.pair();
98
+ return {
99
+ networkingParams: { isInMemory, rootDb, authorshipPort: tx },
100
+ authorshipParams: { isInMemory, rootDb, networkingPort: rx },
101
+ };
102
+ })()
103
+ : (() => {
104
+ const [tx, rx] = ThreadPort.pair(chainSpec);
105
+ return {
106
+ networkingParams: { isInMemory, rootDb, authorshipPort: tx },
107
+ authorshipParams: { isInMemory, rootDb, networkingPort: rx },
108
+ };
109
+ })();
110
+ // Networking initialization (before authorship so we can relay tickets)
111
+ const { closeNetwork } = await initNetwork(importer, networkingParams, baseConfig, genesisHeaderHash, config.network, bestHeader);
112
+ const { closeAuthorship } = await initAuthorship(importer, config.isAuthoring, config.isFastForward, authorshipParams, baseConfig, authorshipKeys);
98
113
  const api = {
99
114
  chainSpec,
100
115
  async importBlock(block) {
@@ -111,14 +126,14 @@ export async function main(config, withRelPath, telemetry) {
111
126
  return importer.sendGetBestStateRootHash();
112
127
  },
113
128
  async close() {
114
- logger.log `[main] ☠️ Closing the importer`;
115
- await closeImporter();
116
- logger.log `[main] ☠️ Closing the extensions`;
117
- closeExtensions();
118
129
  logger.log `[main] ☠️ Closing the authorship module`;
119
130
  await closeAuthorship();
120
131
  logger.log `[main] ☠️ Closing the networking module`;
121
132
  await closeNetwork();
133
+ logger.log `[main] ☠️ Closing the importer`;
134
+ await closeImporter();
135
+ logger.log `[main] ☠️ Closing the extensions`;
136
+ closeExtensions();
122
137
  logger.log `[main] 🛢️ Closing the database`;
123
138
  await rootDb.close();
124
139
  logger.log `[main] 📳 Closing telemetry`;
@@ -128,35 +143,48 @@ export async function main(config, withRelPath, telemetry) {
128
143
  };
129
144
  return api;
130
145
  }
131
- const initAuthorship = async (importer, isAuthoring, isFastForward, rootDb, baseConfig, authorshipKeys, isInMemory) => {
146
+ const initAuthorship = async (importer, isAuthoring, isFastForward, params, baseConfig, authorshipKeys) => {
132
147
  if (!isAuthoring) {
133
148
  logger.log `✍️ Authorship off: disabled`;
134
- return () => Promise.resolve();
149
+ return {
150
+ closeAuthorship: () => {
151
+ params.networkingPort.close();
152
+ return Promise.resolve();
153
+ },
154
+ authorshipWorker: null,
155
+ };
135
156
  }
136
157
  logger.info `✍️ Starting block generator.`;
137
158
  const workerParams = { ...authorshipKeys, isFastForward };
138
- const { generator, finish } = isInMemory
159
+ const { generator, worker, finish } = params.isInMemory
139
160
  ? await startBlockGenerator(DirectWorkerConfig.new({
140
161
  ...baseConfig,
141
- blocksDb: rootDb.getBlocksDb(),
142
- statesDb: rootDb.getStatesDb(),
162
+ blocksDb: params.rootDb.getBlocksDb(),
163
+ statesDb: params.rootDb.getStatesDb(),
143
164
  workerParams,
144
- }))
165
+ }), params.networkingPort)
145
166
  : await spawnBlockGeneratorWorker(LmdbWorkerConfig.new({
146
167
  ...baseConfig,
147
168
  workerParams,
169
+ ports: new Map([[AUTHORSHIP_NETWORK_PORT, params.networkingPort]]),
148
170
  }));
149
171
  // relay blocks from generator to importer
150
172
  generator.setOnBlock(async (block) => {
151
173
  logger.log `✍️ Produced block at ${block.header.view().timeSlotIndex.materialize()}`;
152
174
  await importer.sendImportBlock(block);
153
175
  });
154
- return finish;
176
+ return { closeAuthorship: finish, authorshipWorker: worker };
155
177
  };
156
- const initNetwork = async (importer, rootDb, baseConfig, genesisHeaderHash, networkConfig, bestHeader, isInMemory) => {
178
+ const initNetwork = async (importer, params, baseConfig, genesisHeaderHash, networkConfig, bestHeader) => {
157
179
  if (networkConfig === null) {
158
180
  logger.log `🛜 Networking off: no config`;
159
- return () => Promise.resolve();
181
+ return {
182
+ closeNetwork: async () => {
183
+ params.authorshipPort.close();
184
+ },
185
+ networkApi: null,
186
+ networkWorker: null,
187
+ };
160
188
  }
161
189
  const { key, host, port, bootnodes } = networkConfig;
162
190
  const networkingConfig = NetworkingConfig.create({
@@ -166,16 +194,17 @@ const initNetwork = async (importer, rootDb, baseConfig, genesisHeaderHash, netw
166
194
  port: tryAsU16(port),
167
195
  bootnodes: bootnodes.map((node) => node.toString()),
168
196
  });
169
- const { network, finish } = isInMemory
197
+ const { network, worker, finish } = params.isInMemory
170
198
  ? await startNetwork(DirectWorkerConfig.new({
171
199
  ...baseConfig,
172
- blocksDb: rootDb.getBlocksDb(),
173
- statesDb: rootDb.getStatesDb(),
200
+ blocksDb: params.rootDb.getBlocksDb(),
201
+ statesDb: params.rootDb.getStatesDb(),
174
202
  workerParams: networkingConfig,
175
- }))
203
+ }), params.authorshipPort)
176
204
  : await spawnNetworkWorker(LmdbWorkerConfig.new({
177
205
  ...baseConfig,
178
206
  workerParams: networkingConfig,
207
+ ports: new Map([[AUTHORSHIP_NETWORK_PORT, params.authorshipPort]]),
179
208
  }));
180
209
  // relay blocks from networking to importer
181
210
  network.setOnBlocks(async (newBlocks) => {
@@ -187,5 +216,5 @@ const initNetwork = async (importer, rootDb, baseConfig, genesisHeaderHash, netw
187
216
  bestHeader.on((header) => {
188
217
  network.sendNewHeader(header);
189
218
  });
190
- return finish;
219
+ return { closeNetwork: finish, networkApi: network, networkWorker: worker };
191
220
  };
@@ -1,12 +1,12 @@
1
1
  import { metrics } from "@opentelemetry/api";
2
- import packageJson from "./package.json" with { type: "json" };
2
+ import { version } from "#@typeberry/utils";
3
3
  /**
4
4
  * Node-level metrics for JAM implementation.
5
5
  *
6
6
  * https://github.com/polkadot-fellows/JIPs/blob/main/JIP-3.md#status-events
7
7
  */
8
8
  export function createMetrics() {
9
- const meter = metrics.getMeter(packageJson.name, packageJson.version);
9
+ const meter = metrics.getMeter("@typeberry/node", version);
10
10
  // JIP-3
11
11
  // 11
12
12
  const bestBlockChangedCounter = meter.createCounter("jam.jip3.best_block_changed", {
@@ -1,9 +1,10 @@
1
+ import type { Worker } from "node:worker_threads";
1
2
  import * as blockAuthorship from "#@typeberry/block-authorship";
2
3
  import type { BlocksDb, LeafDb, StatesDb } from "#@typeberry/database";
3
4
  import * as importer from "#@typeberry/importer";
4
5
  import * as jamNetwork from "#@typeberry/jam-network";
5
6
  import type { SerializedState } from "#@typeberry/state-merkleization";
6
- import { type DirectWorkerConfig } from "#@typeberry/workers-api";
7
+ import { type DirectPort, type DirectWorkerConfig } from "#@typeberry/workers-api";
7
8
  import { type LmdbWorkerConfig } from "#@typeberry/workers-api-node";
8
9
  export declare function spawnImporterWorker(config: LmdbWorkerConfig<importer.ImporterConfig>): Promise<{
9
10
  importer: import("@typeberry/workers-api").Tx<{
@@ -858,9 +859,12 @@ export declare function spawnNetworkWorker(config: LmdbWorkerConfig<jamNetwork.N
858
859
  response: import("@typeberry/codec").Descriptor<void, void>;
859
860
  };
860
861
  }>;
862
+ worker: Worker;
861
863
  finish: () => Promise<void>;
862
864
  }>;
863
- export declare function startNetwork(config: DirectWorkerConfig<jamNetwork.NetworkingConfig>): ReturnType<typeof spawnNetworkWorker>;
865
+ export declare function startNetwork(config: DirectWorkerConfig<jamNetwork.NetworkingConfig>, authorshipPort: DirectPort): Promise<Omit<Awaited<ReturnType<typeof spawnNetworkWorker>>, "worker"> & {
866
+ worker: Worker | null;
867
+ }>;
864
868
  export declare function spawnBlockGeneratorWorker(config: LmdbWorkerConfig<blockAuthorship.BlockAuthorshipConfig>): Promise<{
865
869
  generator: import("@typeberry/workers-api").Tx<{
866
870
  finish: {
@@ -1121,7 +1125,10 @@ export declare function spawnBlockGeneratorWorker(config: LmdbWorkerConfig<block
1121
1125
  response: import("@typeberry/codec").Descriptor<void, void>;
1122
1126
  };
1123
1127
  }>;
1128
+ worker: Worker;
1124
1129
  finish: () => Promise<void>;
1125
1130
  }>;
1126
- export declare function startBlockGenerator(config: DirectWorkerConfig<blockAuthorship.BlockAuthorshipConfig>): ReturnType<typeof spawnBlockGeneratorWorker>;
1131
+ export declare function startBlockGenerator(config: DirectWorkerConfig<blockAuthorship.BlockAuthorshipConfig>, networkingPort: DirectPort): Promise<Omit<Awaited<ReturnType<typeof spawnBlockGeneratorWorker>>, "worker"> & {
1132
+ worker: Worker | null;
1133
+ }>;
1127
1134
  //# sourceMappingURL=workers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/workers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,KAAK,kBAAkB,EAAmB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,6BAA6B,CAAC;AAEjF,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgB1F;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,GAC/F,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAaxC;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,CAAC,UAAU,CAAC,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgB7F;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,gBAAgB,CAAC,GACtD,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAavC;AAED,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,CAAC,eAAe,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgB9G;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,CAAC,eAAe,CAAC,qBAAqB,CAAC,GAChE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAY9C"}
1
+ {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/workers.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import * as blockAuthorship from "#@typeberry/block-authorship";
2
+ import { protocol } from "#@typeberry/comms-authorship-network";
2
3
  import * as importer from "#@typeberry/importer";
3
4
  import * as jamNetwork from "#@typeberry/jam-network";
4
- import { startSameThread } from "#@typeberry/workers-api";
5
+ import { Channel, startSameThread } from "#@typeberry/workers-api";
5
6
  import { spawnWorker } from "#@typeberry/workers-api-node";
6
7
  export async function spawnImporterWorker(config) {
7
8
  const { api, workerFinished } = spawnWorker(importer.protocol, importer.WORKER, config, importer.ImporterConfig.Codec);
@@ -27,9 +28,10 @@ export async function startImporterDirect(config) {
27
28
  };
28
29
  }
29
30
  export async function spawnNetworkWorker(config) {
30
- const { api, workerFinished } = spawnWorker(jamNetwork.protocol, jamNetwork.WORKER, config, jamNetwork.NetworkingConfig.Codec);
31
+ const { api, worker, workerFinished } = spawnWorker(jamNetwork.protocol, jamNetwork.WORKER, config, jamNetwork.NetworkingConfig.Codec);
31
32
  return {
32
33
  network: api,
34
+ worker,
33
35
  finish: async () => {
34
36
  await api.sendFinish();
35
37
  api.destroy();
@@ -37,22 +39,26 @@ export async function spawnNetworkWorker(config) {
37
39
  },
38
40
  };
39
41
  }
40
- export async function startNetwork(config) {
42
+ export async function startNetwork(config, authorshipPort) {
41
43
  const { api, internal } = startSameThread(jamNetwork.protocol);
42
- const networkFinish = jamNetwork.main(config, internal);
44
+ const authorshipComms = Channel.rx(protocol, authorshipPort);
45
+ const networkFinish = jamNetwork.main(config, internal, authorshipComms);
43
46
  return {
44
47
  network: api,
48
+ worker: null,
45
49
  finish: async () => {
46
50
  await api.sendFinish();
47
51
  api.destroy();
48
52
  await networkFinish;
53
+ authorshipComms.destroy();
49
54
  },
50
55
  };
51
56
  }
52
57
  export async function spawnBlockGeneratorWorker(config) {
53
- const { api, workerFinished } = spawnWorker(blockAuthorship.protocol, blockAuthorship.WORKER, config, blockAuthorship.BlockAuthorshipConfig.Codec);
58
+ const { api, worker, workerFinished } = spawnWorker(blockAuthorship.protocol, blockAuthorship.WORKER, config, blockAuthorship.BlockAuthorshipConfig.Codec);
54
59
  return {
55
60
  generator: api,
61
+ worker,
56
62
  finish: async () => {
57
63
  await api.sendFinish();
58
64
  api.destroy();
@@ -60,15 +66,18 @@ export async function spawnBlockGeneratorWorker(config) {
60
66
  },
61
67
  };
62
68
  }
63
- export async function startBlockGenerator(config) {
69
+ export async function startBlockGenerator(config, networkingPort) {
64
70
  const { api, internal } = startSameThread(blockAuthorship.protocol);
65
- const finish = blockAuthorship.main(config, internal);
71
+ const networkingComms = Channel.tx(protocol, networkingPort);
72
+ const finish = blockAuthorship.main(config, internal, networkingComms);
66
73
  return {
67
74
  generator: api,
75
+ worker: null,
68
76
  finish: async () => {
69
77
  await api.sendFinish();
70
78
  api.destroy();
71
79
  await finish;
80
+ networkingComms.destroy();
72
81
  },
73
82
  };
74
83
  }
@@ -3,6 +3,7 @@ import { ChainSpec } from "#@typeberry/config";
3
3
  import { type BlocksDb, type RootDb, type SerializedStatesDb } from "#@typeberry/database";
4
4
  import { Blake2b } from "#@typeberry/hash";
5
5
  import type { WorkerConfig } from "#@typeberry/workers-api";
6
+ import { ThreadPort, type TransferablePort } from "./port.js";
6
7
  /** A worker config that's usable in node.js and uses LMDB database backend. */
7
8
  export declare class LmdbWorkerConfig<T = void> implements WorkerConfig<T, BlocksDb, SerializedStatesDb> {
8
9
  readonly nodeName: string;
@@ -10,12 +11,14 @@ export declare class LmdbWorkerConfig<T = void> implements WorkerConfig<T, Block
10
11
  readonly workerParams: T;
11
12
  readonly dbPath: string;
12
13
  readonly blake2b: Blake2b;
13
- static new<T>({ nodeName, chainSpec, workerParams, dbPath, blake2b, }: {
14
+ readonly ports: Map<string, ThreadPort>;
15
+ static new<T>({ nodeName, chainSpec, workerParams, dbPath, blake2b, ports, }: {
14
16
  nodeName: string;
15
17
  chainSpec: ChainSpec;
16
18
  workerParams: T;
17
19
  dbPath: string;
18
20
  blake2b: Blake2b;
21
+ ports?: Map<string, ThreadPort>;
19
22
  }): LmdbWorkerConfig<T>;
20
23
  /** Restore node config from a transferable config object. */
21
24
  static fromTransferable<T>(decodeParams: Decode<T>, config: TransferableConfig): Promise<LmdbWorkerConfig<T>>;
@@ -32,6 +35,7 @@ export type TransferableConfig = {
32
35
  chainSpec: ChainSpec;
33
36
  workerParams: Uint8Array;
34
37
  dbPath: string;
38
+ workerPorts: [string, TransferablePort][];
35
39
  };
36
40
  /**
37
41
  * In-memory (direct) worker using serialized state database.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/api-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAW,KAAK,MAAM,EAAW,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,KAAK,QAAQ,EAGb,KAAK,MAAM,EACX,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,+EAA+E;AAC/E,qBAAa,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAE,YAAW,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC;aAiC5E,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,SAAS;aACpB,YAAY,EAAE,CAAC;aACf,MAAM,EAAE,MAAM;aACd,OAAO,EAAE,OAAO;IApClC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,EACN,OAAO,GACR,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,YAAY,EAAE,CAAC,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB;IAID,6DAA6D;WAChD,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB;IAcpF,OAAO;IAQP,YAAY,CAAC,OAAO,GAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAuB,GAAG,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAUvG,6DAA6D;IAC7D,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,kBAAkB;CAQ7D;AAED,6DAA6D;AAC7D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,UAAU,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iBAAiB,CAAC,CAAC,GAAG,SAAS,CAAE,YAAW,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC;aAmBlF,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,SAAS;aACpB,YAAY,EAAE,CAAC;aACf,OAAO,EAAE,OAAO;IArBlC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAO,GACR,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,YAAY,EAAE,CAAC,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB;IAID,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAElD,OAAO;IAUP,YAAY,CAAC,QAAQ,GAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAuB,GAAG,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC;CAQzG"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/api-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAW,KAAK,MAAM,EAAW,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,KAAK,QAAQ,EAGb,KAAK,MAAM,EACX,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE9D,+EAA+E;AAC/E,qBAAa,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAE,YAAW,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC;aAuC5E,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,SAAS;aACpB,YAAY,EAAE,CAAC;aACf,MAAM,EAAE,MAAM;aACd,OAAO,EAAE,OAAO;aAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IA3ChD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,EACN,OAAO,EACP,KAAiB,GAClB,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,YAAY,EAAE,CAAC,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KACjC;IAID,6DAA6D;WAChD,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB;IAkBpF,OAAO;IASP,YAAY,CAAC,OAAO,GAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAuB,GAAG,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAUvG,6DAA6D;IAC7D,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,kBAAkB;CAS7D;AAED,6DAA6D;AAC7D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,UAAU,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;CAC3C,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iBAAiB,CAAC,CAAC,GAAG,SAAS,CAAE,YAAW,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC;aAmBlF,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,SAAS;aACpB,YAAY,EAAE,CAAC;aACf,OAAO,EAAE,OAAO;IArBlC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAO,GACR,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,YAAY,EAAE,CAAC,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB;IAID,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAElD,OAAO;IAUP,YAAY,CAAC,QAAQ,GAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAuB,GAAG,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC;CAQzG"}
@@ -3,6 +3,7 @@ import { ChainSpec } from "#@typeberry/config";
3
3
  import { InMemoryBlocks, InMemorySerializedStates, } from "#@typeberry/database";
4
4
  import { LmdbBlocks, LmdbRoot, LmdbStates } from "#@typeberry/database-lmdb";
5
5
  import { Blake2b } from "#@typeberry/hash";
6
+ import { ThreadPort } from "./port.js";
6
7
  /** A worker config that's usable in node.js and uses LMDB database backend. */
7
8
  export class LmdbWorkerConfig {
8
9
  nodeName;
@@ -10,28 +11,32 @@ export class LmdbWorkerConfig {
10
11
  workerParams;
11
12
  dbPath;
12
13
  blake2b;
13
- static new({ nodeName, chainSpec, workerParams, dbPath, blake2b, }) {
14
- return new LmdbWorkerConfig(nodeName, chainSpec, workerParams, dbPath, blake2b);
14
+ ports;
15
+ static new({ nodeName, chainSpec, workerParams, dbPath, blake2b, ports = new Map(), }) {
16
+ return new LmdbWorkerConfig(nodeName, chainSpec, workerParams, dbPath, blake2b, ports);
15
17
  }
16
18
  /** Restore node config from a transferable config object. */
17
19
  static async fromTransferable(decodeParams, config) {
18
20
  const blake2b = await Blake2b.createHasher();
19
21
  const chainSpec = new ChainSpec(config.chainSpec);
20
22
  const workerParams = Decoder.decodeObject(decodeParams, config.workerParams, chainSpec);
23
+ const ports = new Map(config.workerPorts.map(([name, port]) => [name, ThreadPort.fromTransferable(chainSpec, port)]));
21
24
  return LmdbWorkerConfig.new({
22
25
  nodeName: config.nodeName,
23
26
  chainSpec,
24
27
  workerParams,
25
28
  dbPath: config.dbPath,
26
29
  blake2b,
30
+ ports,
27
31
  });
28
32
  }
29
- constructor(nodeName, chainSpec, workerParams, dbPath, blake2b) {
33
+ constructor(nodeName, chainSpec, workerParams, dbPath, blake2b, ports) {
30
34
  this.nodeName = nodeName;
31
35
  this.chainSpec = chainSpec;
32
36
  this.workerParams = workerParams;
33
37
  this.dbPath = dbPath;
34
38
  this.blake2b = blake2b;
39
+ this.ports = ports;
35
40
  }
36
41
  openDatabase(options = { readonly: true }) {
37
42
  const lmdb = new LmdbRoot(this.dbPath, options.readonly);
@@ -48,6 +53,7 @@ export class LmdbWorkerConfig {
48
53
  chainSpec: this.chainSpec,
49
54
  workerParams: Encoder.encodeObject(paramsCodec, this.workerParams, this.chainSpec).raw,
50
55
  dbPath: this.dbPath,
56
+ workerPorts: Array.from(this.ports.entries()).map(([name, port]) => [name, port.intoTransferable()]),
51
57
  };
52
58
  }
53
59
  }
@@ -7,12 +7,20 @@ export type Message = {
7
7
  responseId: string;
8
8
  data: Uint8Array;
9
9
  };
10
+ /** Transferable representation of a `ThreadPort`. */
11
+ export type TransferablePort = {
12
+ threadId: number;
13
+ port: MessagePort;
14
+ };
10
15
  export declare class ThreadPort implements Port {
11
16
  private readonly spec;
12
17
  private readonly port;
18
+ static pair(spec: ChainSpec): [ThreadPort, ThreadPort];
13
19
  readonly threadId: number;
14
20
  private readonly events;
15
21
  constructor(spec: ChainSpec, port: MessagePort);
22
+ static fromTransferable(spec: ChainSpec, { port }: TransferablePort): ThreadPort;
23
+ intoTransferable(): TransferablePort;
16
24
  close(): void;
17
25
  private createListener;
18
26
  onClose(callback: (e: Error) => void): void;
@@ -1 +1 @@
1
- {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/api-node/port.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAA+B,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,KAAK,KAAK,EAAoB,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CAClB,CAAC;AAKF,qBAAa,UAAW,YAAW,IAAI;IAKnC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,SAAgB,QAAQ,SAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAG1B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,WAAW;IAcpC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAI3C,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IASvF,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IASzF,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;CAWvE"}
1
+ {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/api-node/port.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAA+B,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,KAAK,KAAK,EAAoB,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CAClB,CAAC;AAIF,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AACF,qBAAa,UAAW,YAAW,IAAI;IAWnC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXvB,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC;IAMtD,SAAgB,QAAQ,SAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAG1B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,WAAW;IAcpC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,gBAAgB;IAInE,gBAAgB,IAAI,gBAAgB;IAIpC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAI3C,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IASvF,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IASzF,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;CAWvE"}
@@ -8,6 +8,10 @@ const logger = Logger.new(import.meta.filename, "workers/api");
8
8
  export class ThreadPort {
9
9
  spec;
10
10
  port;
11
+ static pair(spec) {
12
+ const { port1, port2 } = new MessageChannel();
13
+ return [new ThreadPort(spec, port1), new ThreadPort(spec, port2)];
14
+ }
11
15
  threadId = threadId;
12
16
  events = new EventEmitter();
13
17
  constructor(spec, port) {
@@ -23,6 +27,12 @@ export class ThreadPort {
23
27
  this.events.emit(eventName, responseId, data);
24
28
  });
25
29
  }
30
+ static fromTransferable(spec, { port }) {
31
+ return new ThreadPort(spec, port);
32
+ }
33
+ intoTransferable() {
34
+ return { threadId: this.threadId, port: this.port };
35
+ }
26
36
  close() {
27
37
  this.port.close();
28
38
  }
@@ -1,12 +1,19 @@
1
+ import { AUTHORSHIP_NETWORK_PORT, protocol as networkProtocol } from "#@typeberry/comms-authorship-network";
1
2
  import { Telemetry } from "#@typeberry/telemetry";
3
+ import { Channel } from "#@typeberry/workers-api";
2
4
  import { initWorker } from "#@typeberry/workers-api-node";
3
5
  import { main } from "./main.js";
4
- import { BlockAuthorshipConfig, protocol } from "./protocol.js";
5
- const { config, comms } = await initWorker(protocol, BlockAuthorshipConfig.Codec);
6
+ import { BlockAuthorshipConfig, protocol as mainProtocol } from "./protocol.js";
7
+ const { config, comms } = await initWorker(mainProtocol, BlockAuthorshipConfig.Codec);
6
8
  // Initialize OpenTelemetry for this worker
7
9
  const tele = Telemetry.initialize({
8
10
  worker: "generator",
9
11
  nodeName: config.nodeName,
10
12
  });
11
- await main(config, comms);
13
+ const port = config.ports.get(AUTHORSHIP_NETWORK_PORT);
14
+ if (port === undefined) {
15
+ throw new Error("Network port not found in config");
16
+ }
17
+ const networkingComms = Channel.tx(networkProtocol, port);
18
+ await main(config, comms, networkingComms);
12
19
  await tele?.close();
@@ -1,6 +1,7 @@
1
+ import type { NetworkingComms } from "#@typeberry/comms-authorship-network";
1
2
  import type { WorkerConfig } from "#@typeberry/workers-api";
2
3
  import type { BlockAuthorshipConfig, GeneratorInternal } from "./protocol.js";
3
4
  type Config = WorkerConfig<BlockAuthorshipConfig>;
4
- export declare function main(config: Config, comms: GeneratorInternal): Promise<void>;
5
+ export declare function main(config: Config, comms: GeneratorInternal, networkingComms: NetworkingComms): Promise<void>;
5
6
  export {};
6
7
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/main.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK9E,KAAK,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAkBlD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,iBAyMlE"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/block-authorship/main.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAgB3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK9E,KAAK,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAkBlD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,iBA2MpG"}
@@ -15,7 +15,7 @@ import { asOpaqueType, assertNever, Result } from "#@typeberry/utils";
15
15
  import { Generator } from "./generator.js";
16
16
  import { generateTickets } from "./ticket-generator.js";
17
17
  const logger = Logger.new(import.meta.filename, "author");
18
- export async function main(config, comms) {
18
+ export async function main(config, comms, networkingComms) {
19
19
  await initWasm();
20
20
  logger.info `🎁 Block Authorship running`;
21
21
  const chainSpec = config.chainSpec;
@@ -134,8 +134,9 @@ export async function main(config, comms) {
134
134
  logger.warn `Failed to generate tickets for epoch ${epoch}: ${ticketsResult.error}`;
135
135
  }
136
136
  else {
137
- logger.log `Generated ${ticketsResult.ok.length} tickets for epoch ${epoch}.`;
138
- // TODO [MaSi]: Sending out tickets
137
+ logger.log `Generated ${ticketsResult.ok.length} tickets for epoch ${epoch}. Distributing...`;
138
+ // Send directly to network worker (bypasses main thread)
139
+ await networkingComms.sendTickets({ epochIndex: epoch, tickets: ticketsResult.ok });
139
140
  }
140
141
  }
141
142
  ticketsGeneratedForEpoch = epoch;
@@ -1,12 +1,12 @@
1
1
  import { metrics } from "@opentelemetry/api";
2
- import packageJson from "./package.json" with { type: "json" };
2
+ import { version } from "#@typeberry/utils";
3
3
  /**
4
4
  * Block authoring metrics for JAM implementation.
5
5
  *
6
6
  * https://github.com/polkadot-fellows/JIPs/blob/main/JIP-3.md#block-authoringimporting-events
7
7
  */
8
8
  export function createMetrics() {
9
- const meter = metrics.getMeter(packageJson.name, packageJson.version);
9
+ const meter = metrics.getMeter("@typeberry/block-authorship", version);
10
10
  const blockAuthoringDuration = meter.createHistogram("jam.blockAuthoringTime", {
11
11
  description: "Duration of block authoring process",
12
12
  unit: "ms",
@@ -0,0 +1,3 @@
1
+ export * from "./protocol.js";
2
+ export * from "./tickets-message.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/comms-authorship-network/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./protocol.js";
2
+ export * from "./tickets-message.js";
@@ -0,0 +1,27 @@
1
+ import { type Api, type Internal } from "#@typeberry/workers-api";
2
+ import { TicketsMessage } from "./tickets-message.js";
3
+ /**
4
+ * Port name for authorship-network direct communication.
5
+ * Used when spawning jam-network worker to pass the port for receiving tickets.
6
+ */
7
+ export declare const AUTHORSHIP_NETWORK_PORT = "authorship-network";
8
+ /**
9
+ * Protocol for direct communication between block-authorship and jam-network workers.
10
+ *
11
+ * This bypasses the main thread for ticket distribution, reducing latency.
12
+ */
13
+ export declare const protocol: import("@typeberry/workers-api").LousyProtocol<{
14
+ tickets: {
15
+ request: import("@typeberry/codec").Descriptor<TicketsMessage, import("@typeberry/codec").ViewOf<TicketsMessage, {
16
+ epochIndex: import("@typeberry/codec").Descriptor<number & import("@typeberry/numbers").WithBytesRepresentation<4> & import("@typeberry/utils").WithOpaque<"Epoch">, import("@typeberry/bytes").Bytes<4>>;
17
+ tickets: import("@typeberry/codec").Descriptor<import("@typeberry/block").SignedTicket[], import("@typeberry/codec").SequenceView<import("@typeberry/block").SignedTicket, import("@typeberry/codec").ViewOf<import("@typeberry/block").SignedTicket, {
18
+ attempt: import("@typeberry/codec").Descriptor<number & import("@typeberry/numbers").WithBytesRepresentation<1> & import("@typeberry/utils").WithOpaque<"TicketAttempt[0|1|2]">, import("@typeberry/numbers").U8>;
19
+ signature: import("@typeberry/codec").Descriptor<import("@typeberry/bytes").Bytes<784> & import("@typeberry/utils").WithOpaque<"BandersnatchRingSignature">, import("@typeberry/bytes").Bytes<784>>;
20
+ }>>>;
21
+ }>>;
22
+ response: import("@typeberry/codec").Descriptor<void, void>;
23
+ };
24
+ }, {}>;
25
+ export type NetworkingComms = Api<typeof protocol>;
26
+ export type AuthorshipComms = Internal<typeof protocol>;
27
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/comms-authorship-network/protocol.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,GAAG,EAAkB,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;MAUnB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC;AACnD,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,QAAQ,CAAC,CAAC"}