@typeberry/lib 0.8.4 → 0.9.0-59ce083

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 (144) hide show
  1. package/package.json +6 -4
  2. package/packages/configs/index.d.ts +30 -1
  3. package/packages/configs/index.d.ts.map +1 -1
  4. package/packages/configs/index.js +4 -2
  5. package/packages/configs/typeberry-dev-full.json +29 -0
  6. package/packages/core/bytes/bytes.d.ts +1 -0
  7. package/packages/core/bytes/bytes.d.ts.map +1 -1
  8. package/packages/core/bytes/bytes.js +8 -0
  9. package/packages/core/utils/debug.d.ts +4 -2
  10. package/packages/core/utils/debug.d.ts.map +1 -1
  11. package/packages/core/utils/debug.js +18 -13
  12. package/packages/core/utils/debug.test.js +12 -6
  13. package/packages/core/utils/index.d.ts +1 -0
  14. package/packages/core/utils/index.d.ts.map +1 -1
  15. package/packages/core/utils/index.js +1 -0
  16. package/packages/core/utils/shutdown.d.ts +18 -0
  17. package/packages/core/utils/shutdown.d.ts.map +1 -0
  18. package/packages/core/utils/shutdown.js +3 -0
  19. package/packages/core/utils/shutdown.node.d.ts +5 -0
  20. package/packages/core/utils/shutdown.node.d.ts.map +1 -0
  21. package/packages/core/utils/shutdown.node.js +76 -0
  22. package/packages/core/utils/shutdown.test.d.ts +2 -0
  23. package/packages/core/utils/shutdown.test.d.ts.map +1 -0
  24. package/packages/core/utils/shutdown.test.js +164 -0
  25. package/packages/extensions/ipc/server.d.ts.map +1 -1
  26. package/packages/extensions/ipc/server.js +7 -0
  27. package/packages/jam/config-node/node-config.d.ts +2 -1
  28. package/packages/jam/config-node/node-config.d.ts.map +1 -1
  29. package/packages/jam/config-node/node-config.js +8 -3
  30. package/packages/jam/config-node/node-config.test.js +3 -3
  31. package/packages/jam/database-fjall/hybrid-states.d.ts +82 -0
  32. package/packages/jam/database-fjall/hybrid-states.d.ts.map +1 -0
  33. package/packages/jam/database-fjall/hybrid-states.js +169 -0
  34. package/packages/jam/database-fjall/hybrid-states.test.d.ts +2 -0
  35. package/packages/jam/database-fjall/hybrid-states.test.d.ts.map +1 -0
  36. package/packages/jam/database-fjall/hybrid-states.test.js +113 -0
  37. package/packages/jam/database-fjall/index.d.ts +3 -0
  38. package/packages/jam/database-fjall/index.d.ts.map +1 -0
  39. package/packages/jam/database-fjall/index.js +2 -0
  40. package/packages/jam/database-fjall/root.d.ts +58 -0
  41. package/packages/jam/database-fjall/root.d.ts.map +1 -0
  42. package/packages/jam/database-fjall/root.js +89 -0
  43. package/packages/jam/jamnp-s/tasks/ticket-distribution.d.ts +18 -10
  44. package/packages/jam/jamnp-s/tasks/ticket-distribution.d.ts.map +1 -1
  45. package/packages/jam/jamnp-s/tasks/ticket-distribution.js +44 -68
  46. package/packages/jam/jamnp-s/tasks/ticket-distribution.test.js +30 -8
  47. package/packages/jam/node/main-fuzz.d.ts +4 -1
  48. package/packages/jam/node/main-fuzz.d.ts.map +1 -1
  49. package/packages/jam/node/main-fuzz.js +142 -55
  50. package/packages/jam/node/main-importer.d.ts +13 -3
  51. package/packages/jam/node/main-importer.d.ts.map +1 -1
  52. package/packages/jam/node/main-importer.js +5 -3
  53. package/packages/jam/safrole/bandersnatch-vrf.d.ts +24 -4
  54. package/packages/jam/safrole/bandersnatch-vrf.d.ts.map +1 -1
  55. package/packages/jam/safrole/bandersnatch-vrf.js +63 -26
  56. package/packages/jam/safrole/bandersnatch-vrf.test.js +12 -9
  57. package/packages/jam/safrole/bandersnatch-wasm.d.ts +10 -0
  58. package/packages/jam/safrole/bandersnatch-wasm.d.ts.map +1 -1
  59. package/packages/jam/safrole/bandersnatch-wasm.js +12 -0
  60. package/packages/jam/safrole/safrole.js +5 -5
  61. package/packages/jam/safrole/safrole.test.js +13 -13
  62. package/packages/jam/ticket-pool/index.d.ts +4 -0
  63. package/packages/jam/ticket-pool/index.d.ts.map +1 -0
  64. package/packages/jam/ticket-pool/index.js +3 -0
  65. package/packages/jam/ticket-pool/pending-ticket-pool.d.ts +30 -0
  66. package/packages/jam/ticket-pool/pending-ticket-pool.d.ts.map +1 -0
  67. package/packages/jam/ticket-pool/pending-ticket-pool.js +56 -0
  68. package/packages/jam/ticket-pool/pending-ticket-pool.test.d.ts +2 -0
  69. package/packages/jam/ticket-pool/pending-ticket-pool.test.d.ts.map +1 -0
  70. package/packages/jam/ticket-pool/pending-ticket-pool.test.js +67 -0
  71. package/packages/jam/ticket-pool/ticket-validator.d.ts +47 -0
  72. package/packages/jam/ticket-pool/ticket-validator.d.ts.map +1 -0
  73. package/packages/jam/ticket-pool/ticket-validator.js +34 -0
  74. package/packages/jam/ticket-pool/ticket-validator.test.d.ts +2 -0
  75. package/packages/jam/ticket-pool/ticket-validator.test.d.ts.map +1 -0
  76. package/packages/jam/ticket-pool/ticket-validator.test.js +35 -0
  77. package/packages/jam/ticket-pool/verified-ticket-pool.d.ts +26 -0
  78. package/packages/jam/ticket-pool/verified-ticket-pool.d.ts.map +1 -0
  79. package/packages/jam/ticket-pool/verified-ticket-pool.js +41 -0
  80. package/packages/jam/ticket-pool/verified-ticket-pool.test.d.ts +2 -0
  81. package/packages/jam/ticket-pool/verified-ticket-pool.test.d.ts.map +1 -0
  82. package/packages/jam/ticket-pool/verified-ticket-pool.test.js +54 -0
  83. package/packages/workers/api-node/config.d.ts +21 -6
  84. package/packages/workers/api-node/config.d.ts.map +1 -1
  85. package/packages/workers/api-node/config.js +26 -19
  86. package/packages/workers/api-node/config.test.js +38 -1
  87. package/packages/workers/block-authorship/{generator.d.ts → block-generator.d.ts} +5 -5
  88. package/packages/workers/block-authorship/block-generator.d.ts.map +1 -0
  89. package/packages/workers/block-authorship/{generator.js → block-generator.js} +3 -3
  90. package/packages/workers/block-authorship/block-generator.test.d.ts +2 -0
  91. package/packages/workers/block-authorship/block-generator.test.d.ts.map +1 -0
  92. package/packages/workers/block-authorship/{generator.test.js → block-generator.test.js} +8 -8
  93. package/packages/workers/block-authorship/epoch-authoring-slots.d.ts +35 -0
  94. package/packages/workers/block-authorship/epoch-authoring-slots.d.ts.map +1 -0
  95. package/packages/workers/block-authorship/epoch-authoring-slots.js +86 -0
  96. package/packages/workers/block-authorship/epoch-tracker.d.ts +29 -0
  97. package/packages/workers/block-authorship/epoch-tracker.d.ts.map +1 -0
  98. package/packages/workers/block-authorship/epoch-tracker.js +80 -0
  99. package/packages/workers/block-authorship/index.d.ts.map +1 -1
  100. package/packages/workers/block-authorship/index.js +1 -1
  101. package/packages/workers/block-authorship/main.d.ts +3 -0
  102. package/packages/workers/block-authorship/main.d.ts.map +1 -1
  103. package/packages/workers/block-authorship/main.js +197 -315
  104. package/packages/workers/block-authorship/ticket-generator/bootstrap-main.d.ts +2 -0
  105. package/packages/workers/block-authorship/ticket-generator/bootstrap-main.d.ts.map +1 -0
  106. package/packages/workers/block-authorship/ticket-generator/bootstrap-main.js +23 -0
  107. package/packages/workers/block-authorship/ticket-generator/index.d.ts +16 -0
  108. package/packages/workers/block-authorship/ticket-generator/index.d.ts.map +1 -0
  109. package/packages/workers/block-authorship/ticket-generator/index.js +62 -0
  110. package/packages/workers/block-authorship/ticket-generator/protocol.d.ts +50 -0
  111. package/packages/workers/block-authorship/ticket-generator/protocol.d.ts.map +1 -0
  112. package/packages/workers/block-authorship/ticket-generator/protocol.js +54 -0
  113. package/packages/workers/block-authorship/{ticket-generator.d.ts → ticket-generator/ticket-generator.d.ts} +4 -0
  114. package/packages/workers/block-authorship/ticket-generator/ticket-generator.d.ts.map +1 -0
  115. package/packages/workers/block-authorship/{ticket-generator.js → ticket-generator/ticket-generator.js} +19 -9
  116. package/packages/workers/block-authorship/ticket-generator/ticket-generator.test.d.ts.map +1 -0
  117. package/packages/workers/block-authorship/{ticket-generator.test.js → ticket-generator/ticket-generator.test.js} +13 -9
  118. package/packages/workers/block-authorship/ticket-generator/worker-pool.d.ts +36 -0
  119. package/packages/workers/block-authorship/ticket-generator/worker-pool.d.ts.map +1 -0
  120. package/packages/workers/block-authorship/ticket-generator/worker-pool.js +111 -0
  121. package/packages/workers/block-authorship/ticket-validator.d.ts +31 -0
  122. package/packages/workers/block-authorship/ticket-validator.d.ts.map +1 -0
  123. package/packages/workers/block-authorship/ticket-validator.js +59 -0
  124. package/packages/workers/comms-authorship-network/protocol.d.ts +14 -4
  125. package/packages/workers/comms-authorship-network/protocol.d.ts.map +1 -1
  126. package/packages/workers/comms-authorship-network/protocol.js +12 -6
  127. package/packages/workers/comms-authorship-network/tickets-message.d.ts +0 -14
  128. package/packages/workers/comms-authorship-network/tickets-message.d.ts.map +1 -1
  129. package/packages/workers/comms-authorship-network/tickets-message.js +0 -17
  130. package/packages/workers/importer/importer.d.ts +2 -2
  131. package/packages/workers/importer/importer.d.ts.map +1 -1
  132. package/packages/workers/importer/importer.js +5 -5
  133. package/packages/workers/importer/stats.d.ts +1 -3
  134. package/packages/workers/importer/stats.d.ts.map +1 -1
  135. package/packages/workers/importer/stats.js +12 -12
  136. package/packages/workers/jam-network/main.d.ts.map +1 -1
  137. package/packages/workers/jam-network/main.js +25 -4
  138. package/packages/workers/block-authorship/generator.d.ts.map +0 -1
  139. package/packages/workers/block-authorship/generator.test.d.ts +0 -2
  140. package/packages/workers/block-authorship/generator.test.d.ts.map +0 -1
  141. package/packages/workers/block-authorship/ticket-generator.d.ts.map +0 -1
  142. package/packages/workers/block-authorship/ticket-generator.test.d.ts.map +0 -1
  143. /package/packages/configs/{typeberry-dev.json → typeberry-dev-tiny.json} +0 -0
  144. /package/packages/workers/block-authorship/{ticket-generator.test.d.ts → ticket-generator/ticket-generator.test.d.ts} +0 -0
@@ -71,6 +71,7 @@ export declare class Bytes<T extends number> extends BytesBlob {
71
71
  isEqualTo(other: Bytes<T>): boolean;
72
72
  /** Converts current type into some opaque extension. */
73
73
  asOpaque<R>(): Opaque<Bytes<T>, TokenOf<R, Bytes<T>>>;
74
+ toStringTruncated(): string;
74
75
  }
75
76
  export declare const bytesBlobComparator: Comparator<BytesBlob>;
76
77
  //# sourceMappingURL=bytes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../../../../packages/core/bytes/bytes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../../../../packages/core/bytes/bytes.ts"],"names":[],"mappings":"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"}
@@ -197,6 +197,14 @@ export class Bytes extends BytesBlob {
197
197
  asOpaque() {
198
198
  return asOpaqueType(this);
199
199
  }
200
+ toStringTruncated() {
201
+ if (this.raw.length > 8) {
202
+ const start = bytesToHexString(this.raw.subarray(0, 2));
203
+ const end = bytesToHexString(this.raw.subarray(this.raw.length - 2));
204
+ return `${start}...${end.substring(2)}`;
205
+ }
206
+ return `${this.toString()}`;
207
+ }
200
208
  }
201
209
  function byteFromString(s) {
202
210
  check `${s.length === 2} Two-character string expected`;
@@ -59,9 +59,11 @@ export declare function measure(id: string): () => {
59
59
  * `arrayBuffers` should allow tracking WASM memory, since every instance backs its
60
60
  * memory with `ArrayBuffer`.
61
61
  */
62
- export declare function memoryUsage(): string;
62
+ export declare function memoryUsage(withDetails: boolean): string;
63
63
  /** Create a stateful memory usage reporter. */
64
- export declare function memoryTracker(): () => string;
64
+ export declare function memoryTracker(withDetails: boolean): {
65
+ toString(): string;
66
+ };
65
67
  /** A class that adds `toString` method that prints all properties of an object. */
66
68
  export declare abstract class WithDebug {
67
69
  toString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/debug.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,YAExB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG,cAA6F,CAAC;AAE9G;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,OAAO,EAClB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,SAAS,IAAI,IAAI,CAO3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,QAKpE;AAED,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAEzC;AAkED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM;;;;;EAgBjC;AAcD;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,MAAM,MAAM,CAc5C;AAED,mFAAmF;AACnF,8BAAsB,SAAS;IAC7B,QAAQ;CAGT;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;;EAMpC"}
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/debug.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,YAExB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG,cAA6F,CAAC;AAE9G;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,OAAO,EAClB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,SAAS,IAAI,IAAI,CAO3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,QAKpE;AAED,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAEzC;AAkED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM;;;;;EAgBjC;AAcD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,CAUxD;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,WAAW,EAAE,OAAO,GAAG;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,CAgB1E;AAED,mFAAmF;AACnF,8BAAsB,SAAS;IAC7B,QAAQ;CAGT;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;;EAMpC"}
@@ -148,26 +148,31 @@ function rawMemoryUsage() {
148
148
  * `arrayBuffers` should allow tracking WASM memory, since every instance backs its
149
149
  * memory with `ArrayBuffer`.
150
150
  */
151
- export function memoryUsage() {
151
+ export function memoryUsage(withDetails) {
152
152
  const m = rawMemoryUsage();
153
153
  if (m === null) {
154
154
  return "";
155
155
  }
156
- return `rss=${toMb(m.rss)}MB heap=${toMb(m.heapUsed)}/${toMb(m.heapTotal)}MB external=${toMb(m.external)}MB arrayBuffers=${toMb(m.arrayBuffers)}MB`;
156
+ if (withDetails) {
157
+ return `rss=${toMb(m.rss)}MB heap=${toMb(m.heapUsed)}/${toMb(m.heapTotal)}MB external=${toMb(m.external)}MB arrayBuffers=${toMb(m.arrayBuffers)}MB`;
158
+ }
159
+ return `rss=${toMb(m.rss)}MB heap=${toMb(m.heapUsed)}/${toMb(m.heapTotal)}MB`;
157
160
  }
158
161
  /** Create a stateful memory usage reporter. */
159
- export function memoryTracker() {
162
+ export function memoryTracker(withDetails) {
160
163
  let prev = null;
161
- return () => {
162
- const m = rawMemoryUsage();
163
- if (m === null) {
164
- return "";
165
- }
166
- const delta = prev === null
167
- ? ""
168
- : ` (Δrss=${signedMb(m.rss - prev.rss)}MB ΔarrayBuffers=${signedMb(m.arrayBuffers - prev.arrayBuffers)}MB)`;
169
- prev = m;
170
- return `${memoryUsage()}${delta}`;
164
+ return {
165
+ toString() {
166
+ const m = rawMemoryUsage();
167
+ if (m === null) {
168
+ return "";
169
+ }
170
+ const delta = prev === null || withDetails === false
171
+ ? ""
172
+ : ` (Δrss=${signedMb(m.rss - prev.rss)}MB ΔarrayBuffers=${signedMb(m.arrayBuffers - prev.arrayBuffers)}MB)`;
173
+ prev = m;
174
+ return `${memoryUsage(withDetails)}${delta}`;
175
+ },
171
176
  };
172
177
  }
173
178
  /** A class that adds `toString` method that prints all properties of an object. */
@@ -25,21 +25,27 @@ describe("utils::lazyInspect", () => {
25
25
  });
26
26
  describe("utils::memoryUsage", () => {
27
27
  it("should report all memory fields", () => {
28
- const usage = memoryUsage();
28
+ const usage = memoryUsage(true);
29
29
  for (const field of ["rss=", "heap=", "external=", "arrayBuffers="]) {
30
30
  assert.ok(usage.includes(field), `expected "${field}" in "${usage}"`);
31
31
  }
32
32
  });
33
+ it("should report all memory fields without details", () => {
34
+ const usage = memoryUsage(false);
35
+ for (const field of ["rss=", "heap="]) {
36
+ assert.ok(usage.includes(field), `expected "${field}" in "${usage}"`);
37
+ }
38
+ });
33
39
  });
34
40
  describe("utils::memoryTracker", () => {
35
41
  it("should not include a delta on the first call", () => {
36
- const tracker = memoryTracker();
37
- assert.ok(!tracker().includes("Δrss"));
42
+ const tracker = memoryTracker(true);
43
+ assert.ok(!tracker.toString().includes("Δrss"));
38
44
  });
39
45
  it("should include a delta on subsequent calls", () => {
40
- const tracker = memoryTracker();
41
- tracker();
42
- const second = tracker();
46
+ const tracker = memoryTracker(true);
47
+ tracker.toString();
48
+ const second = tracker.toString();
43
49
  assert.ok(second.includes("Δrss="), `expected delta in "${second}"`);
44
50
  assert.ok(second.includes("ΔarrayBuffers="), `expected delta in "${second}"`);
45
51
  });
@@ -18,5 +18,6 @@ export * from "./opaque.js";
18
18
  export { name, version } from "./package.js";
19
19
  export * from "./result.js";
20
20
  export * from "./safe-alloc-uint8array.js";
21
+ export * from "./shutdown.js";
21
22
  export * from "./test.js";
22
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
@@ -18,4 +18,5 @@ export * from "./opaque.js";
18
18
  export { name, version } from "./package.js";
19
19
  export * from "./result.js";
20
20
  export * from "./safe-alloc-uint8array.js";
21
+ export * from "./shutdown.js";
21
22
  export * from "./test.js";
@@ -0,0 +1,18 @@
1
+ export type Closer = () => Promise<void>;
2
+ export type ShutdownSignal = string;
3
+ export interface ShutdownLogger {
4
+ info: (msg: string) => void;
5
+ error: (msg: string) => void;
6
+ }
7
+ export interface ShutdownOptions {
8
+ /** Max ms allowed for `close` before forced exit(1). Default 10_000. */
9
+ timeoutMs?: number;
10
+ /** Signals to listen for. Default ["SIGTERM", "SIGINT"]. */
11
+ signals?: readonly ShutdownSignal[];
12
+ /** Logger; defaults to a no-op logger. */
13
+ log?: ShutdownLogger;
14
+ /** Test hook used instead of process.exit. */
15
+ exit?: (code: number) => never;
16
+ }
17
+ export declare function installShutdownHandlers(_close: Closer, _options?: ShutdownOptions): () => void;
18
+ //# sourceMappingURL=shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/shutdown.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzC,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CAChC;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,eAAoB,GAAG,MAAM,IAAI,CAElG"}
@@ -0,0 +1,3 @@
1
+ export function installShutdownHandlers(_close, _options = {}) {
2
+ return () => { };
3
+ }
@@ -0,0 +1,5 @@
1
+ import type { Closer, ShutdownOptions } from "./shutdown.js";
2
+ export type { Closer, ShutdownLogger, ShutdownOptions, ShutdownSignal } from "./shutdown.js";
3
+ /** Returns an uninstall function (used by tests). */
4
+ export declare function installShutdownHandlers(close: Closer, options?: ShutdownOptions): () => void;
5
+ //# sourceMappingURL=shutdown.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.node.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/shutdown.node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7D,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAK7F,qDAAqD;AACrD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,IAAI,CA+EhG"}
@@ -0,0 +1,76 @@
1
+ const DEFAULT_SIGNALS = ["SIGTERM", "SIGINT"];
2
+ const DEFAULT_TIMEOUT_MS = 10_000;
3
+ /** Returns an uninstall function (used by tests). */
4
+ export function installShutdownHandlers(close, options = {}) {
5
+ const signals = (options.signals ?? DEFAULT_SIGNALS);
6
+ const exit = (options.exit ?? process.exit);
7
+ const log = options.log;
8
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
9
+ let state = "idle";
10
+ const forceExit = (signal) => {
11
+ log?.error(`Received ${signal} during shutdown, forcing exit.`);
12
+ try {
13
+ exit(1);
14
+ }
15
+ catch {
16
+ // test-time exit throws; swallow.
17
+ }
18
+ };
19
+ const handler = (signal) => {
20
+ if (state === "closing" || state === "done") {
21
+ forceExit(signal);
22
+ return;
23
+ }
24
+ state = "closing";
25
+ log?.info(`Received ${signal}, draining...`);
26
+ void (async () => {
27
+ const TIMED_OUT = Symbol("timed-out");
28
+ let timeoutHandle;
29
+ const timeoutPromise = new Promise((resolve) => {
30
+ timeoutHandle = setTimeout(() => resolve(TIMED_OUT), timeoutMs);
31
+ });
32
+ timeoutHandle?.unref?.();
33
+ let code = 0;
34
+ try {
35
+ const outcome = await Promise.race([
36
+ Promise.resolve()
37
+ .then(close)
38
+ .then(() => "ok", (e) => ({ err: e })),
39
+ timeoutPromise,
40
+ ]);
41
+ if (outcome === TIMED_OUT) {
42
+ code = 1;
43
+ log?.error(`Shutdown cleanup exceeded ${timeoutMs}ms timeout, forcing exit.`);
44
+ }
45
+ else if (typeof outcome === "object" && "err" in outcome) {
46
+ code = 1;
47
+ const e = outcome.err;
48
+ log?.error(`Shutdown close threw: ${e instanceof Error ? (e.stack ?? e.message) : String(e)}`);
49
+ }
50
+ else {
51
+ log?.info("Shutdown complete.");
52
+ }
53
+ }
54
+ finally {
55
+ clearTimeout(timeoutHandle);
56
+ state = "done";
57
+ }
58
+ try {
59
+ exit(code);
60
+ }
61
+ catch {
62
+ // test-time exit throws; swallow.
63
+ }
64
+ })();
65
+ };
66
+ // Node passes the signal name to the listener, so a single handler works
67
+ // for every signal.
68
+ for (const sig of signals) {
69
+ process.on(sig, handler);
70
+ }
71
+ return () => {
72
+ for (const sig of signals) {
73
+ process.off(sig, handler);
74
+ }
75
+ };
76
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shutdown.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.test.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/shutdown.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,164 @@
1
+ import assert from "node:assert";
2
+ import { afterEach, describe, it } from "node:test";
3
+ import { installShutdownHandlers as installGenericShutdownHandlers } from "./shutdown.js";
4
+ import { installShutdownHandlers } from "./shutdown.node.js";
5
+ function makeExitRecorder() {
6
+ let resolveExited;
7
+ const exited = new Promise((resolve) => {
8
+ resolveExited = resolve;
9
+ });
10
+ const recorder = {
11
+ exitCode: null,
12
+ exited,
13
+ exit: ((code) => {
14
+ recorder.exitCode = code;
15
+ resolveExited();
16
+ // Satisfy `never` and abort the calling promise chain.
17
+ throw new Error(`__test_exit_${code}`);
18
+ }),
19
+ };
20
+ return recorder;
21
+ }
22
+ const silentLog = { info: () => { }, error: () => { } };
23
+ describe("utils::installShutdownHandlers", () => {
24
+ const uninstallers = [];
25
+ afterEach(() => {
26
+ while (uninstallers.length > 0) {
27
+ uninstallers.pop()?.();
28
+ }
29
+ });
30
+ it("calls close and exits 0 on first SIGTERM", async () => {
31
+ const exitRec = makeExitRecorder();
32
+ let closeCalled = false;
33
+ uninstallers.push(installShutdownHandlers(async () => {
34
+ closeCalled = true;
35
+ }, { exit: exitRec.exit, log: silentLog }));
36
+ process.emit("SIGTERM", "SIGTERM");
37
+ await exitRec.exited;
38
+ assert.strictEqual(closeCalled, true);
39
+ assert.strictEqual(exitRec.exitCode, 0);
40
+ });
41
+ it("exits with code 1 when cleanup exceeds timeoutMs", async () => {
42
+ const exitRec = makeExitRecorder();
43
+ let closeStarted = false;
44
+ let errorLogged = null;
45
+ let releaseClose;
46
+ const closeReleased = new Promise((resolve) => {
47
+ releaseClose = resolve;
48
+ });
49
+ uninstallers.push(installShutdownHandlers(async () => {
50
+ closeStarted = true;
51
+ await closeReleased;
52
+ }, {
53
+ exit: exitRec.exit,
54
+ timeoutMs: 5,
55
+ log: {
56
+ info: () => { },
57
+ error: (msg) => {
58
+ errorLogged = msg;
59
+ },
60
+ },
61
+ }));
62
+ process.emit("SIGTERM", "SIGTERM");
63
+ await exitRec.exited;
64
+ assert.strictEqual(closeStarted, true, "close should have been invoked");
65
+ assert.strictEqual(exitRec.exitCode, 1);
66
+ assert.ok(errorLogged !== null, "expected timeout to be logged");
67
+ assert.match(errorLogged, /timeout|exceed/i);
68
+ // Allow the in-flight close promise to settle so the test doesn't leak.
69
+ releaseClose();
70
+ });
71
+ it("forces exit 1 when a second signal arrives during cleanup", async () => {
72
+ const exitRec = makeExitRecorder();
73
+ let releaseClose;
74
+ const closeReleased = new Promise((resolve) => {
75
+ releaseClose = resolve;
76
+ });
77
+ let errorLogged = null;
78
+ uninstallers.push(installShutdownHandlers(async () => {
79
+ await closeReleased;
80
+ }, {
81
+ // Large timeout so this test can't pass via the timeout path.
82
+ timeoutMs: 60_000,
83
+ exit: exitRec.exit,
84
+ log: {
85
+ info: () => { },
86
+ error: (msg) => {
87
+ errorLogged = msg;
88
+ },
89
+ },
90
+ }));
91
+ process.emit("SIGTERM", "SIGTERM");
92
+ await new Promise((resolve) => setImmediate(resolve));
93
+ process.emit("SIGINT", "SIGINT");
94
+ await exitRec.exited;
95
+ assert.strictEqual(exitRec.exitCode, 1);
96
+ assert.ok(errorLogged !== null, "expected force-exit message to be logged");
97
+ assert.match(errorLogged, /SIGINT/);
98
+ releaseClose();
99
+ });
100
+ it("does nothing after uninstall", async () => {
101
+ const exitRec = makeExitRecorder();
102
+ let closeCalled = false;
103
+ const uninstall = installShutdownHandlers(async () => {
104
+ closeCalled = true;
105
+ }, { exit: exitRec.exit, log: silentLog });
106
+ uninstall();
107
+ process.emit("SIGTERM", "SIGTERM");
108
+ // Give any (incorrectly registered) handler a tick to fire.
109
+ await new Promise((resolve) => setImmediate(resolve));
110
+ assert.strictEqual(closeCalled, false);
111
+ assert.strictEqual(exitRec.exitCode, null);
112
+ });
113
+ it("is a no-op from the generic shutdown module", async () => {
114
+ const exitRec = makeExitRecorder();
115
+ let closeCalled = false;
116
+ const uninstall = installGenericShutdownHandlers(async () => {
117
+ closeCalled = true;
118
+ }, { exit: exitRec.exit, log: silentLog });
119
+ uninstall();
120
+ assert.strictEqual(typeof uninstall, "function");
121
+ assert.strictEqual(closeCalled, false);
122
+ assert.strictEqual(exitRec.exitCode, null);
123
+ });
124
+ it("exits with code 1 when close rejects", async () => {
125
+ const exitRec = makeExitRecorder();
126
+ let errorLogged = null;
127
+ uninstallers.push(installShutdownHandlers(async () => {
128
+ throw new Error("boom");
129
+ }, {
130
+ exit: exitRec.exit,
131
+ log: {
132
+ info: () => { },
133
+ error: (msg) => {
134
+ errorLogged = msg;
135
+ },
136
+ },
137
+ }));
138
+ process.emit("SIGTERM", "SIGTERM");
139
+ await exitRec.exited;
140
+ assert.strictEqual(exitRec.exitCode, 1);
141
+ assert.ok(errorLogged !== null, "expected error to be logged");
142
+ assert.match(errorLogged, /boom/);
143
+ });
144
+ it("exits with code 1 when close throws synchronously", async () => {
145
+ const exitRec = makeExitRecorder();
146
+ let errorLogged = null;
147
+ uninstallers.push(installShutdownHandlers(() => {
148
+ throw new Error("sync boom");
149
+ }, {
150
+ exit: exitRec.exit,
151
+ log: {
152
+ info: () => { },
153
+ error: (msg) => {
154
+ errorLogged = msg;
155
+ },
156
+ },
157
+ }));
158
+ process.emit("SIGTERM", "SIGTERM");
159
+ await exitRec.exited;
160
+ assert.strictEqual(exitRec.exitCode, 1);
161
+ assert.ok(errorLogged !== null, "expected error to be logged");
162
+ assert.match(errorLogged, /sync boom/);
163
+ });
164
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../../packages/extensions/ipc/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAIrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,4CAA4C;AAC5C,qBAAa,SAAS;IAKA,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJ3C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM;IAIzB,OAAO;IAEP,+CAA+C;IAC/C,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAI3B,wBAAwB;IACxB,KAAK,IAAI,IAAI;CAGd;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,UAAU,cAiFhG"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../../packages/extensions/ipc/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAIrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,4CAA4C;AAC5C,qBAAa,SAAS;IAKA,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJ3C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM;IAIzB,OAAO;IAEP,+CAA+C;IAC/C,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAI3B,wBAAwB;IACxB,KAAK,IAAI,IAAI;CAGd;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,UAAU,cAuFhG"}
@@ -87,6 +87,13 @@ export function startIpcServer(name, newMessageHandler) {
87
87
  controller.abort();
88
88
  // unrefing
89
89
  server.unref();
90
+ // Windows named pipes are cleaned up by the OS; Unix sockets are not.
91
+ if (!isWindows) {
92
+ try {
93
+ fs.unlinkSync(socketPath);
94
+ }
95
+ catch { }
96
+ }
90
97
  };
91
98
  }
92
99
  /**
@@ -4,7 +4,8 @@ import { type FromJson } from "#@typeberry/json-parser";
4
4
  import { AuthorshipOptions } from "./authorship.js";
5
5
  import { JipChainSpec } from "./jip-chain-spec.js";
6
6
  /** Development config. Will accept unsealed blocks for now. */
7
- export declare const DEV_CONFIG = "dev";
7
+ export declare const DEV_TINY_CONFIG = "dev";
8
+ export declare const DEV_FULL_CONFIG = "dev-full";
8
9
  /** Default config file. */
9
10
  export declare const DEFAULT_CONFIG = "default";
10
11
  export declare const NODE_DEFAULTS: {
@@ -1 +1 @@
1
- {"version":3,"file":"node-config.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/node-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,KAAK,QAAQ,EAAuB,MAAM,wBAAwB,CAAC;AAG5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD,+DAA+D;AAC/D,eAAO,MAAM,UAAU,QAAQ,CAAC;AAChC,2BAA2B;AAC3B,eAAO,MAAM,cAAc,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa;;;;CAIzB,CAAC;AAEF,0BAA0B;AAC1B,oBAAY,cAAc;IACxB,uBAAuB;IACvB,IAAI,SAAS;IACb,uBAAuB;IACvB,IAAI,SAAS;CACd;AAED,eAAO,MAAM,sBAAsB,EAS7B,QAAQ,CAAC,cAAc,CAAC,CAAC;AAE/B,qBAAa,iBAAiB;aAqBV,OAAO,EAAE,MAAM;aACf,OAAO,EAAE,MAAM;aACf,MAAM,EAAE,cAAc;aACtB,SAAS,EAAE,YAAY;IACvC,iEAAiE;aACjD,gBAAgB,EAAE,MAAM,GAAG,SAAS;aACpC,UAAU,EAAE,iBAAiB;IA1B/C,MAAM,CAAC,QAAQ,kFAUb;IAEF,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC;IAOlH,OAAO;CASR;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,iBAAiB,CAkDlG"}
1
+ {"version":3,"file":"node-config.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/node-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,KAAK,QAAQ,EAAuB,MAAM,wBAAwB,CAAC;AAG5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD,+DAA+D;AAC/D,eAAO,MAAM,eAAe,QAAQ,CAAC;AACrC,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,2BAA2B;AAC3B,eAAO,MAAM,cAAc,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa;;;;CAIzB,CAAC;AAEF,0BAA0B;AAC1B,oBAAY,cAAc;IACxB,uBAAuB;IACvB,IAAI,SAAS;IACb,uBAAuB;IACvB,IAAI,SAAS;CACd;AAED,eAAO,MAAM,sBAAsB,EAS7B,QAAQ,CAAC,cAAc,CAAC,CAAC;AAE/B,qBAAa,iBAAiB;aAqBV,OAAO,EAAE,MAAM;aACf,OAAO,EAAE,MAAM;aACf,MAAM,EAAE,cAAc;aACtB,SAAS,EAAE,YAAY;IACvC,iEAAiE;aACjD,gBAAgB,EAAE,MAAM,GAAG,SAAS;aACpC,UAAU,EAAE,iBAAiB;IA1B/C,MAAM,CAAC,QAAQ,kFAUb;IAEF,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC;IAOlH,OAAO;CASR;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,iBAAiB,CAuDlG"}
@@ -9,7 +9,8 @@ import { AuthorshipOptions } from "./authorship.js";
9
9
  import { JipChainSpec } from "./jip-chain-spec.js";
10
10
  const logger = Logger.new(import.meta.filename, "config");
11
11
  /** Development config. Will accept unsealed blocks for now. */
12
- export const DEV_CONFIG = "dev";
12
+ export const DEV_TINY_CONFIG = "dev";
13
+ export const DEV_FULL_CONFIG = "dev-full";
13
14
  /** Default config file. */
14
15
  export const DEFAULT_CONFIG = "default";
15
16
  export const NODE_DEFAULTS = {
@@ -72,8 +73,12 @@ export function loadConfig(config, withRelPath) {
72
73
  let mergedJson = {};
73
74
  for (const entry of config) {
74
75
  logger.log `🔧 Applying '${entry}'`;
75
- if (entry === DEV_CONFIG) {
76
- mergedJson = structuredClone(configs.dev); // clone to avoid mutating the original config. not doing a merge since dev and default should theoretically replace all properties.
76
+ if (entry === DEV_TINY_CONFIG) {
77
+ mergedJson = structuredClone(configs.devTiny); // clone to avoid mutating the original config. not doing a merge since dev and default should theoretically replace all properties.
78
+ continue;
79
+ }
80
+ if (entry === DEV_FULL_CONFIG) {
81
+ mergedJson = structuredClone(configs.devFull); // clone to avoid mutating the original config. not doing a merge since dev and default should theoretically replace all properties.
77
82
  continue;
78
83
  }
79
84
  if (entry === DEFAULT_CONFIG) {
@@ -70,7 +70,7 @@ describe("loadConfig", () => {
70
70
  });
71
71
  it("should load dev config", () => {
72
72
  const config = loadConfig(["dev"], withRelPath);
73
- assert.deepStrictEqual(config, parseFromJson(configs.dev, NodeConfiguration.fromJson));
73
+ assert.deepStrictEqual(config, parseFromJson(configs.devTiny, NodeConfiguration.fromJson));
74
74
  });
75
75
  it("should parse inline json config and deep merge onto previous entries", () => {
76
76
  const config = loadConfig(["default", JSON.stringify({ database_base_path: "/test/path", chain_spec: { bootnodes: [] } })], withRelPath);
@@ -138,9 +138,9 @@ describe("loadConfig", () => {
138
138
  `.database_base_path="/test/path-1"`,
139
139
  ], withRelPath);
140
140
  assert.deepStrictEqual(config, parseFromJson({
141
- ...configs.dev,
141
+ ...configs.devTiny,
142
142
  database_base_path: "/test/path-1",
143
- chain_spec: { ...configs.dev.chain_spec, bootnodes: [] },
143
+ chain_spec: { ...configs.devTiny.chain_spec, bootnodes: [] },
144
144
  }, NodeConfiguration.fromJson));
145
145
  });
146
146
  it("should throw an error if an invalid json file is provided", () => {
@@ -0,0 +1,82 @@
1
+ import type { HeaderHash, StateRootHash } from "#@typeberry/block";
2
+ import type { ChainSpec } from "#@typeberry/config";
3
+ import { type InitStatesDb, LeafDb, type StatesDb, StateUpdateError } from "#@typeberry/database";
4
+ import type { Blake2b } from "#@typeberry/hash";
5
+ import type { ServicesUpdate, State } from "#@typeberry/state";
6
+ import { SerializedState, type StateEntries } from "#@typeberry/state-merkleization";
7
+ import { OK, Result } from "#@typeberry/utils";
8
+ import { type FjallRootOptions, type Partition } from "./root.js";
9
+ /**
10
+ * One open fjall keyspace together with its content-addressed `values`
11
+ * partition.
12
+ *
13
+ * Opening the keyspace is the slow part, so the fuzz target opens one session
14
+ * per run and reuses it for every reset (see `HybridSerializedStates.fromSession`).
15
+ * The values partition is immutable - the key is the hash of the value - so it
16
+ * is fine that values pile up across resets, the unreferenced ones just sit
17
+ * there unused.
18
+ */
19
+ export declare class FjallValuesSession {
20
+ private readonly root;
21
+ /** Shared content-addressed values partition, reused across resets. */
22
+ readonly values: Partition;
23
+ private constructor();
24
+ /** Open (or create) the keyspace at `dbPath` and its `values` partition. */
25
+ static open(dbPath: string, options?: FjallRootOptions): Promise<FjallValuesSession>;
26
+ /** Flush the journal to disk (a no-op for ephemeral keyspaces). */
27
+ persist(): Promise<void>;
28
+ /** Size of the keyspace directory on disk, in bytes. */
29
+ sizeInBytes(): number | null;
30
+ /** Release the keyspace handle (skips the sync-all fsync when ephemeral). */
31
+ close(): Promise<void>;
32
+ }
33
+ /**
34
+ * Hybrid serialized-states db (fjall variant).
35
+ *
36
+ * States (leafs) are kept in memory, only the large values go to fjall on disk.
37
+ * Reads hit fjall directly, which keeps its own bounded block cache. Meant for
38
+ * long fuzzing, used together with pruning so the heap stays bounded.
39
+ *
40
+ * Construction is async, and value writes are flushed explicitly, because fjall
41
+ * has no transaction primitive.
42
+ */
43
+ export declare class HybridSerializedStates implements StatesDb<SerializedState<LeafDb>>, InitStatesDb<StateEntries> {
44
+ private readonly spec;
45
+ private readonly blake2b;
46
+ private readonly session;
47
+ /** Whether `close()` should close the underlying session. */
48
+ private readonly ownsSession;
49
+ static new({ spec, blake2b, dbPath, ephemeral, cacheSizeBytes, }: {
50
+ spec: ChainSpec;
51
+ blake2b: Blake2b;
52
+ dbPath: string;
53
+ ephemeral?: boolean;
54
+ cacheSizeBytes?: number;
55
+ }): Promise<HybridSerializedStates>;
56
+ /**
57
+ * Wrap an already-open `FjallValuesSession` and reuse its keyspace.
58
+ *
59
+ * The new instance starts with its own empty in-memory leaf sets but shares
60
+ * the values partition on disk. Its `close()` does not close the session, the
61
+ * session owner closes it once. The fuzz target uses this to keep one keyspace
62
+ * across resets and only rebuild the in-memory state for each vector.
63
+ */
64
+ static fromSession(spec: ChainSpec, blake2b: Blake2b, session: FjallValuesSession): HybridSerializedStates;
65
+ private readonly inMemStates;
66
+ private readonly valuesDb;
67
+ /** Shared content-addressed values partition (owned by `session`). */
68
+ private readonly values;
69
+ private constructor();
70
+ insertInitialState(headerHash: HeaderHash, entries: StateEntries): Promise<Result<OK, StateUpdateError>>;
71
+ updateAndSetState(header: HeaderHash, state: SerializedState<LeafDb>, update: Partial<State & ServicesUpdate>): Promise<Result<OK, StateUpdateError>>;
72
+ getStateRoot(state: SerializedState<LeafDb>): Promise<StateRootHash>;
73
+ getState(header: HeaderHash): SerializedState<LeafDb> | null;
74
+ markUnused(header: HeaderHash): void;
75
+ diskSizeInBytes(): number | null;
76
+ close(): Promise<void>;
77
+ /** Write new large values to fjall in a single batch, then flush. */
78
+ private writeValues;
79
+ /** Read a value from fjall. */
80
+ private readValue;
81
+ }
82
+ //# sourceMappingURL=hybrid-states.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/hybrid-states.ts"],"names":[],"mappings":"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"}