@typeberry/lib 0.10.0 → 0.11.0-411c828

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 (161) hide show
  1. package/package.json +3 -5
  2. package/packages/configs/index.d.ts +9 -0
  3. package/packages/configs/index.d.ts.map +1 -1
  4. package/packages/configs/typeberry-default.json +4 -1
  5. package/packages/configs/typeberry-dev-full.json +3 -0
  6. package/packages/configs/typeberry-dev-tiny.json +3 -0
  7. package/packages/jam/config-node/index.d.ts +1 -0
  8. package/packages/jam/config-node/index.d.ts.map +1 -1
  9. package/packages/jam/config-node/index.js +1 -0
  10. package/packages/jam/config-node/node-config.d.ts +5 -11
  11. package/packages/jam/config-node/node-config.d.ts.map +1 -1
  12. package/packages/jam/config-node/node-config.js +9 -25
  13. package/packages/jam/config-node/node-config.test.js +11 -6
  14. package/packages/jam/config-node/rpc.d.ts +11 -0
  15. package/packages/jam/config-node/rpc.d.ts.map +1 -0
  16. package/packages/jam/config-node/rpc.js +16 -0
  17. package/packages/jam/database/states.d.ts +1 -8
  18. package/packages/jam/database/states.d.ts.map +1 -1
  19. package/packages/jam/database/value-refs.d.ts +4 -5
  20. package/packages/jam/database/value-refs.d.ts.map +1 -1
  21. package/packages/jam/database-fjall/blocks.d.ts +1 -0
  22. package/packages/jam/database-fjall/blocks.d.ts.map +1 -1
  23. package/packages/jam/database-fjall/blocks.js +8 -3
  24. package/packages/jam/database-fjall/hybrid-states.d.ts +10 -4
  25. package/packages/jam/database-fjall/hybrid-states.d.ts.map +1 -1
  26. package/packages/jam/database-fjall/hybrid-states.js +22 -6
  27. package/packages/jam/database-fjall/root.d.ts +2 -0
  28. package/packages/jam/database-fjall/root.d.ts.map +1 -1
  29. package/packages/jam/database-fjall/root.js +8 -1
  30. package/packages/jam/database-fjall/root.test.d.ts +2 -0
  31. package/packages/jam/database-fjall/root.test.d.ts.map +1 -0
  32. package/packages/jam/database-fjall/root.test.js +23 -0
  33. package/packages/jam/database-fjall/states.d.ts +1 -0
  34. package/packages/jam/database-fjall/states.d.ts.map +1 -1
  35. package/packages/jam/database-fjall/states.js +6 -3
  36. package/packages/jam/node/export.d.ts.map +1 -1
  37. package/packages/jam/node/export.js +8 -17
  38. package/packages/jam/node/jam-config.d.ts +5 -1
  39. package/packages/jam/node/jam-config.d.ts.map +1 -1
  40. package/packages/jam/node/jam-config.js +6 -2
  41. package/packages/jam/node/main-fuzz.d.ts.map +1 -1
  42. package/packages/jam/node/main-fuzz.js +59 -39
  43. package/packages/jam/node/main-importer.d.ts +6 -11
  44. package/packages/jam/node/main-importer.d.ts.map +1 -1
  45. package/packages/jam/node/main-importer.js +15 -29
  46. package/packages/jam/node/main.d.ts.map +1 -1
  47. package/packages/jam/node/main.js +6 -16
  48. package/packages/jam/rpc/index.d.ts +3 -0
  49. package/packages/jam/rpc/index.d.ts.map +1 -0
  50. package/packages/jam/rpc/index.js +2 -0
  51. package/packages/jam/rpc/src/handlers/best-block.d.ts +6 -0
  52. package/packages/jam/rpc/src/handlers/best-block.d.ts.map +1 -0
  53. package/packages/jam/rpc/src/handlers/best-block.js +15 -0
  54. package/packages/jam/rpc/src/handlers/finalized-block.d.ts +6 -0
  55. package/packages/jam/rpc/src/handlers/finalized-block.d.ts.map +1 -0
  56. package/packages/jam/rpc/src/handlers/finalized-block.js +7 -0
  57. package/packages/jam/rpc/src/handlers/list-services.d.ts +6 -0
  58. package/packages/jam/rpc/src/handlers/list-services.d.ts.map +1 -0
  59. package/packages/jam/rpc/src/handlers/list-services.js +15 -0
  60. package/packages/jam/rpc/src/handlers/not-implemented.d.ts +4 -0
  61. package/packages/jam/rpc/src/handlers/not-implemented.d.ts.map +1 -0
  62. package/packages/jam/rpc/src/handlers/not-implemented.js +4 -0
  63. package/packages/jam/rpc/src/handlers/parameters.d.ts +7 -0
  64. package/packages/jam/rpc/src/handlers/parameters.d.ts.map +1 -0
  65. package/packages/jam/rpc/src/handlers/parameters.js +53 -0
  66. package/packages/jam/rpc/src/handlers/parent.d.ts +6 -0
  67. package/packages/jam/rpc/src/handlers/parent.d.ts.map +1 -0
  68. package/packages/jam/rpc/src/handlers/parent.js +25 -0
  69. package/packages/jam/rpc/src/handlers/service-data.d.ts +6 -0
  70. package/packages/jam/rpc/src/handlers/service-data.d.ts.map +1 -0
  71. package/packages/jam/rpc/src/handlers/service-data.js +21 -0
  72. package/packages/jam/rpc/src/handlers/service-preimage.d.ts +6 -0
  73. package/packages/jam/rpc/src/handlers/service-preimage.d.ts.map +1 -0
  74. package/packages/jam/rpc/src/handlers/service-preimage.js +23 -0
  75. package/packages/jam/rpc/src/handlers/service-request.d.ts +6 -0
  76. package/packages/jam/rpc/src/handlers/service-request.d.ts.map +1 -0
  77. package/packages/jam/rpc/src/handlers/service-request.js +23 -0
  78. package/packages/jam/rpc/src/handlers/service-value.d.ts +6 -0
  79. package/packages/jam/rpc/src/handlers/service-value.d.ts.map +1 -0
  80. package/packages/jam/rpc/src/handlers/service-value.js +23 -0
  81. package/packages/jam/rpc/src/handlers/state-root.d.ts +6 -0
  82. package/packages/jam/rpc/src/handlers/state-root.d.ts.map +1 -0
  83. package/packages/jam/rpc/src/handlers/state-root.js +14 -0
  84. package/packages/jam/rpc/src/handlers/statistics.d.ts +6 -0
  85. package/packages/jam/rpc/src/handlers/statistics.d.ts.map +1 -0
  86. package/packages/jam/rpc/src/handlers/statistics.js +16 -0
  87. package/packages/jam/rpc/src/handlers/subscribe-best-block.d.ts +6 -0
  88. package/packages/jam/rpc/src/handlers/subscribe-best-block.d.ts.map +1 -0
  89. package/packages/jam/rpc/src/handlers/subscribe-best-block.js +8 -0
  90. package/packages/jam/rpc/src/handlers/subscribe-finalized-block.d.ts +6 -0
  91. package/packages/jam/rpc/src/handlers/subscribe-finalized-block.d.ts.map +1 -0
  92. package/packages/jam/rpc/src/handlers/subscribe-finalized-block.js +8 -0
  93. package/packages/jam/rpc/src/handlers/subscribe-service-data.d.ts +6 -0
  94. package/packages/jam/rpc/src/handlers/subscribe-service-data.d.ts.map +1 -0
  95. package/packages/jam/rpc/src/handlers/subscribe-service-data.js +13 -0
  96. package/packages/jam/rpc/src/handlers/subscribe-service-preimage.d.ts +6 -0
  97. package/packages/jam/rpc/src/handlers/subscribe-service-preimage.d.ts.map +1 -0
  98. package/packages/jam/rpc/src/handlers/subscribe-service-preimage.js +13 -0
  99. package/packages/jam/rpc/src/handlers/subscribe-service-request.d.ts +6 -0
  100. package/packages/jam/rpc/src/handlers/subscribe-service-request.d.ts.map +1 -0
  101. package/packages/jam/rpc/src/handlers/subscribe-service-request.js +13 -0
  102. package/packages/jam/rpc/src/handlers/subscribe-service-value.d.ts +6 -0
  103. package/packages/jam/rpc/src/handlers/subscribe-service-value.d.ts.map +1 -0
  104. package/packages/jam/rpc/src/handlers/subscribe-service-value.js +13 -0
  105. package/packages/jam/rpc/src/handlers/subscribe-statistics.d.ts +6 -0
  106. package/packages/jam/rpc/src/handlers/subscribe-statistics.d.ts.map +1 -0
  107. package/packages/jam/rpc/src/handlers/subscribe-statistics.js +13 -0
  108. package/packages/jam/rpc/src/handlers/typeberry/refine-work-package.d.ts +8 -0
  109. package/packages/jam/rpc/src/handlers/typeberry/refine-work-package.d.ts.map +1 -0
  110. package/packages/jam/rpc/src/handlers/typeberry/refine-work-package.js +68 -0
  111. package/packages/jam/rpc/src/handlers/unsubscribe.d.ts +4 -0
  112. package/packages/jam/rpc/src/handlers/unsubscribe.d.ts.map +1 -0
  113. package/packages/jam/rpc/src/handlers/unsubscribe.js +3 -0
  114. package/packages/jam/rpc/src/handlers.d.ts +3 -0
  115. package/packages/jam/rpc/src/handlers.d.ts.map +1 -0
  116. package/packages/jam/rpc/src/handlers.js +60 -0
  117. package/packages/jam/rpc/src/server.d.ts +31 -0
  118. package/packages/jam/rpc/src/server.d.ts.map +1 -0
  119. package/packages/jam/rpc/src/server.js +179 -0
  120. package/packages/jam/rpc/src/subscription-manager.d.ts +20 -0
  121. package/packages/jam/rpc/src/subscription-manager.d.ts.map +1 -0
  122. package/packages/jam/rpc/src/subscription-manager.js +74 -0
  123. package/packages/jam/rpc/test/e2e-server.d.ts +3 -0
  124. package/packages/jam/rpc/test/e2e-server.d.ts.map +1 -0
  125. package/packages/jam/rpc/test/e2e-server.js +30 -0
  126. package/packages/jam/rpc/test/e2e-setup.d.ts +2 -0
  127. package/packages/jam/rpc/test/e2e-setup.d.ts.map +1 -0
  128. package/packages/jam/rpc/test/e2e-setup.js +126 -0
  129. package/packages/jam/rpc/test/e2e.d.ts +2 -0
  130. package/packages/jam/rpc/test/e2e.d.ts.map +1 -0
  131. package/packages/jam/rpc/test/e2e.js +326 -0
  132. package/packages/jam/state-merkleization/index.d.ts +1 -1
  133. package/packages/jam/state-merkleization/index.js +1 -1
  134. package/packages/workers/api-node/config.d.ts +14 -46
  135. package/packages/workers/api-node/config.d.ts.map +1 -1
  136. package/packages/workers/api-node/config.js +31 -96
  137. package/packages/workers/api-node/config.test.js +82 -63
  138. package/packages/workers/importer/main.d.ts +2 -0
  139. package/packages/workers/importer/main.d.ts.map +1 -1
  140. package/packages/workers/importer/main.js +1 -1
  141. package/packages/jam/database-lmdb/blocks.d.ts +0 -24
  142. package/packages/jam/database-lmdb/blocks.d.ts.map +0 -1
  143. package/packages/jam/database-lmdb/blocks.js +0 -82
  144. package/packages/jam/database-lmdb/hybrid-states.d.ts +0 -56
  145. package/packages/jam/database-lmdb/hybrid-states.d.ts.map +0 -1
  146. package/packages/jam/database-lmdb/hybrid-states.js +0 -149
  147. package/packages/jam/database-lmdb/hybrid-states.test.d.ts +0 -2
  148. package/packages/jam/database-lmdb/hybrid-states.test.d.ts.map +0 -1
  149. package/packages/jam/database-lmdb/hybrid-states.test.js +0 -180
  150. package/packages/jam/database-lmdb/index.d.ts +0 -5
  151. package/packages/jam/database-lmdb/index.d.ts.map +0 -1
  152. package/packages/jam/database-lmdb/index.js +0 -4
  153. package/packages/jam/database-lmdb/root.d.ts +0 -26
  154. package/packages/jam/database-lmdb/root.d.ts.map +0 -1
  155. package/packages/jam/database-lmdb/root.js +0 -53
  156. package/packages/jam/database-lmdb/states.d.ts +0 -76
  157. package/packages/jam/database-lmdb/states.d.ts.map +0 -1
  158. package/packages/jam/database-lmdb/states.js +0 -145
  159. package/packages/jam/database-lmdb/states.test.d.ts +0 -2
  160. package/packages/jam/database-lmdb/states.test.d.ts.map +0 -1
  161. package/packages/jam/database-lmdb/states.test.js +0 -202
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typeberry/lib",
3
- "version": "0.10.0",
3
+ "version": "0.11.0-411c828",
4
4
  "description": "Typeberry Library",
5
5
  "main": "./bin/lib/index.js",
6
6
  "types": "./bin/lib/index.d.ts",
@@ -152,8 +152,6 @@
152
152
  "#@typeberry/lib/*": "./bin/lib/*",
153
153
  "#@typeberry/pvm": "./bin/pvm/index.js",
154
154
  "#@typeberry/pvm/*": "./bin/pvm/*",
155
- "#@typeberry/rpc": "./bin/rpc/index.js",
156
- "#@typeberry/rpc/*": "./bin/rpc/*",
157
155
  "#@typeberry/test-runner": "./bin/test-runner/index.js",
158
156
  "#@typeberry/test-runner/*": "./bin/test-runner/*",
159
157
  "#@typeberry/configs": "./packages/configs/index.js",
@@ -216,8 +214,6 @@
216
214
  "#@typeberry/database/*": "./packages/jam/database/*",
217
215
  "#@typeberry/database-fjall": "./packages/jam/database-fjall/index.js",
218
216
  "#@typeberry/database-fjall/*": "./packages/jam/database-fjall/*",
219
- "#@typeberry/database-lmdb": "./packages/jam/database-lmdb/index.js",
220
- "#@typeberry/database-lmdb/*": "./packages/jam/database-lmdb/*",
221
217
  "#@typeberry/executor": "./packages/jam/executor/index.js",
222
218
  "#@typeberry/executor/*": "./packages/jam/executor/*",
223
219
  "#@typeberry/fuzz-proto": "./packages/jam/fuzz-proto/index.js",
@@ -230,6 +226,8 @@
230
226
  "#@typeberry/jamnp-s/*": "./packages/jam/jamnp-s/*",
231
227
  "#@typeberry/node": "./packages/jam/node/index.js",
232
228
  "#@typeberry/node/*": "./packages/jam/node/*",
229
+ "#@typeberry/rpc": "./packages/jam/rpc/index.js",
230
+ "#@typeberry/rpc/*": "./packages/jam/rpc/*",
233
231
  "#@typeberry/rpc-client": "./packages/jam/rpc-client/index.js",
234
232
  "#@typeberry/rpc-client/*": "./packages/jam/rpc-client/*",
235
233
  "#@typeberry/rpc-validation": "./packages/jam/rpc-validation/index.js",
@@ -33,6 +33,9 @@ export declare const configs: {
33
33
  };
34
34
  };
35
35
  database_base_path: string;
36
+ rpc: {
37
+ port: number;
38
+ };
36
39
  };
37
40
  devTiny: {
38
41
  $schema: string;
@@ -67,6 +70,9 @@ export declare const configs: {
67
70
  ff000000000000000000000000000000000000000000000000000000000000: string;
68
71
  };
69
72
  };
73
+ rpc: {
74
+ port: number;
75
+ };
70
76
  };
71
77
  devFull: {
72
78
  $schema: string;
@@ -96,6 +102,9 @@ export declare const configs: {
96
102
  "10000000000000000000000000000000000000000000000000000000000000": string;
97
103
  };
98
104
  };
105
+ rpc: {
106
+ port: number;
107
+ };
99
108
  };
100
109
  };
101
110
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/configs/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAInB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/configs/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAInB,CAAC"}
@@ -34,5 +34,8 @@
34
34
  "ff000000000000000000000000000000000000000000000000000000000000": "00d1b097b4410b3a63446d7c57d093972a9744fcd2d74f4a5e2ec163610e6d6327ffffffffffffffff0a000000000000000a000000000000003418020000000000ffffffffffffffff04000000000000000000000000000000"
35
35
  }
36
36
  },
37
- "database_base_path": "./database"
37
+ "database_base_path": "./database",
38
+ "rpc": {
39
+ "port": 19800
40
+ }
38
41
  }
@@ -25,5 +25,8 @@
25
25
  "0f000000000000000000000000000000000000000000000000000000000000": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
26
26
  "10000000000000000000000000000000000000000000000000000000000000": "00"
27
27
  }
28
+ },
29
+ "rpc": {
30
+ "port": 19800
28
31
  }
29
32
  }
@@ -30,5 +30,8 @@
30
30
  "10000000000000000000000000000000000000000000000000000000000000": "00",
31
31
  "ff000000000000000000000000000000000000000000000000000000000000": "00d1b097b4410b3a63446d7c57d093972a9744fcd2d74f4a5e2ec163610e6d6327ffffffffffffffff0a000000000000000a000000000000003418020000000000ffffffffffffffff04000000000000000000000000000000"
32
32
  }
33
+ },
34
+ "rpc": {
35
+ "port": 19800
33
36
  }
34
37
  }
@@ -1,3 +1,4 @@
1
1
  export * from "./jip-chain-spec.js";
2
2
  export * from "./node-config.js";
3
+ export * from "./rpc.js";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from "./jip-chain-spec.js";
2
2
  export * from "./node-config.js";
3
+ export * from "./rpc.js";
@@ -2,6 +2,7 @@ import { PvmBackend } from "#@typeberry/config";
2
2
  import { type FromJson } from "#@typeberry/json-parser";
3
3
  import { AuthorshipOptions } from "./authorship.js";
4
4
  import { JipChainSpec } from "./jip-chain-spec.js";
5
+ import { RpcOptions } from "./rpc.js";
5
6
  /** Development config. Will accept unsealed blocks for now. */
6
7
  export declare const DEV_TINY_CONFIG = "dev";
7
8
  export declare const DEV_FULL_CONFIG = "dev-full";
@@ -19,22 +20,15 @@ export declare enum KnownChainSpec {
19
20
  /** Full chain spec. */
20
21
  Full = "full"
21
22
  }
22
- /** Persistent regular-node database backend. */
23
- export declare enum RegularStateBackend {
24
- /** @deprecated lmdb remains available as an explicit fallback, but fjall is the default backend. */
25
- Lmdb = "lmdb",
26
- Fjall = "fjall"
27
- }
28
23
  export declare const knownChainSpecFromJson: FromJson<KnownChainSpec>;
29
- export declare const regularStateBackendFromJson: FromJson<RegularStateBackend>;
30
24
  type NodeConfigurationJson = {
31
25
  $schema: string;
32
26
  version: number;
33
27
  flavor: KnownChainSpec;
34
28
  chain_spec: JipChainSpec;
35
29
  database_base_path?: string;
36
- state_backend?: RegularStateBackend;
37
30
  authorship: AuthorshipOptions;
31
+ rpc?: RpcOptions;
38
32
  };
39
33
  export declare class NodeConfiguration {
40
34
  readonly $schema: string;
@@ -43,11 +37,11 @@ export declare class NodeConfiguration {
43
37
  readonly chainSpec: JipChainSpec;
44
38
  /** If database path is not provided, we load an in-memory db. */
45
39
  readonly databaseBasePath: string | undefined;
46
- /** Persistent database backend used when `databaseBasePath` is set. */
47
- readonly stateBackend: RegularStateBackend;
48
40
  readonly authorship: AuthorshipOptions;
41
+ /** Optional RPC server configuration. When present, an in-process RPC server is started. */
42
+ readonly rpc: RpcOptions | undefined;
49
43
  static fromJson: import("@typeberry/json-parser").FromJsonWithParser<unknown, NodeConfiguration>;
50
- static new({ $schema, version, flavor, chain_spec, database_base_path, state_backend, authorship, }: NodeConfigurationJson): NodeConfiguration;
44
+ static new({ $schema, version, flavor, chain_spec, database_base_path, authorship, rpc }: NodeConfigurationJson): NodeConfiguration;
51
45
  private constructor();
52
46
  }
53
47
  export declare function loadConfig(config: string[], withRelPath: (p: string) => string): NodeConfiguration;
@@ -1 +1 @@
1
- {"version":3,"file":"node-config.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/node-config.ts"],"names":[],"mappings":"AAEA,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,gDAAgD;AAChD,oBAAY,mBAAmB;IAC7B,oGAAoG;IACpG,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,eAAO,MAAM,sBAAsB,EAS7B,QAAQ,CAAC,cAAc,CAAC,CAAC;AAE/B,eAAO,MAAM,2BAA2B,EASlC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AAEpC,KAAK,qBAAqB,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,UAAU,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF,qBAAa,iBAAiB;aAsCV,OAAO,EAAE,MAAM;aACf,OAAO,EAAE,MAAM;aACf,MAAM,EAAE,cAAc;aACtB,SAAS,EAAE,YAAY;IACvC,iEAAiE;aACjD,gBAAgB,EAAE,MAAM,GAAG,SAAS;IACpD,uEAAuE;aACvD,YAAY,EAAE,mBAAmB;aACjC,UAAU,EAAE,iBAAiB;IA7C/C,MAAM,CAAC,QAAQ,kFAWb;IAEF,MAAM,CAAC,GAAG,CAAC,EACT,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,UAAU,GACX,EAAE,qBAAqB;IAexB,OAAO;CAWR;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,iBAAiB,CAuDlG"}
1
+ {"version":3,"file":"node-config.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/node-config.ts"],"names":[],"mappings":"AAEA,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;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,+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,KAAK,qBAAqB,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB,CAAC;AAEF,qBAAa,iBAAiB;aA8BV,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;IAC7C,4FAA4F;aAC5E,GAAG,EAAE,UAAU,GAAG,SAAS;IArC7C,MAAM,CAAC,QAAQ,kFAWb;IAEF,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,qBAAqB;IAe/G,OAAO;CAWR;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,iBAAiB,CAuDlG"}
@@ -7,6 +7,7 @@ import { Logger } from "#@typeberry/logger";
7
7
  import { isBrowser } from "#@typeberry/utils";
8
8
  import { AuthorshipOptions } from "./authorship.js";
9
9
  import { JipChainSpec } from "./jip-chain-spec.js";
10
+ import { RpcOptions } from "./rpc.js";
10
11
  const logger = Logger.new(import.meta.filename, "config");
11
12
  /** Development config. Will accept unsealed blocks for now. */
12
13
  export const DEV_TINY_CONFIG = "dev";
@@ -26,13 +27,6 @@ export var KnownChainSpec;
26
27
  /** Full chain spec. */
27
28
  KnownChainSpec["Full"] = "full";
28
29
  })(KnownChainSpec || (KnownChainSpec = {}));
29
- /** Persistent regular-node database backend. */
30
- export var RegularStateBackend;
31
- (function (RegularStateBackend) {
32
- /** @deprecated lmdb remains available as an explicit fallback, but fjall is the default backend. */
33
- RegularStateBackend["Lmdb"] = "lmdb";
34
- RegularStateBackend["Fjall"] = "fjall";
35
- })(RegularStateBackend || (RegularStateBackend = {}));
36
30
  export const knownChainSpecFromJson = json.fromString((input, ctx) => {
37
31
  switch (input) {
38
32
  case KnownChainSpec.Tiny:
@@ -43,51 +37,41 @@ export const knownChainSpecFromJson = json.fromString((input, ctx) => {
43
37
  throw Error(`unknown network flavor: ${input} at ${ctx}`);
44
38
  }
45
39
  });
46
- export const regularStateBackendFromJson = json.fromString((input, ctx) => {
47
- switch (input) {
48
- case RegularStateBackend.Lmdb:
49
- return RegularStateBackend.Lmdb;
50
- case RegularStateBackend.Fjall:
51
- return RegularStateBackend.Fjall;
52
- default:
53
- throw Error(`unknown state backend: ${input} at ${ctx}`);
54
- }
55
- });
56
40
  export class NodeConfiguration {
57
41
  $schema;
58
42
  version;
59
43
  flavor;
60
44
  chainSpec;
61
45
  databaseBasePath;
62
- stateBackend;
63
46
  authorship;
47
+ rpc;
64
48
  static fromJson = json.object({
65
49
  $schema: "string",
66
50
  version: "number",
67
51
  flavor: knownChainSpecFromJson,
68
52
  chain_spec: JipChainSpec.fromJson,
69
53
  database_base_path: json.optional("string"),
70
- state_backend: json.optional(regularStateBackendFromJson),
71
54
  authorship: AuthorshipOptions.fromJson,
55
+ rpc: json.optional(RpcOptions.fromJson),
72
56
  }, NodeConfiguration.new);
73
- static new({ $schema, version, flavor, chain_spec, database_base_path, state_backend, authorship, }) {
57
+ static new({ $schema, version, flavor, chain_spec, database_base_path, authorship, rpc }) {
74
58
  if (version !== 1) {
75
59
  throw new Error("Only version=1 config is supported.");
76
60
  }
77
- return new NodeConfiguration($schema, version, flavor, chain_spec, database_base_path ?? undefined, state_backend ?? RegularStateBackend.Fjall, authorship);
61
+ return new NodeConfiguration($schema, version, flavor, chain_spec, database_base_path ?? undefined, authorship, rpc ?? undefined);
78
62
  }
79
63
  constructor($schema, version, flavor, chainSpec,
80
64
  /** If database path is not provided, we load an in-memory db. */
81
- databaseBasePath,
82
- /** Persistent database backend used when `databaseBasePath` is set. */
83
- stateBackend, authorship) {
65
+ databaseBasePath, authorship,
66
+ /** Optional RPC server configuration. When present, an in-process RPC server is started. */
67
+ rpc) {
84
68
  this.$schema = $schema;
85
69
  this.version = version;
86
70
  this.flavor = flavor;
87
71
  this.chainSpec = chainSpec;
88
72
  this.databaseBasePath = databaseBasePath;
89
- this.stateBackend = stateBackend;
90
73
  this.authorship = authorship;
74
+ this.rpc = rpc;
91
75
  }
92
76
  }
93
77
  export function loadConfig(config, withRelPath) {
@@ -5,7 +5,8 @@ import { configs } from "#@typeberry/configs";
5
5
  import polkajamConfig from "#@typeberry/configs/typeberry-polkajam-dev.json" with { type: "json" };
6
6
  import { parseFromJson } from "#@typeberry/json-parser";
7
7
  import { workspacePathFix } from "#@typeberry/utils";
8
- import { KnownChainSpec, loadConfig, NodeConfiguration, RegularStateBackend } from "./node-config.js";
8
+ import { KnownChainSpec, loadConfig, NodeConfiguration } from "./node-config.js";
9
+ import { RpcOptions } from "./rpc.js";
9
10
  const withRelPath = workspacePathFix(`${import.meta.dirname}/../..`);
10
11
  const NODE_CONFIG_TEST = {
11
12
  $schema: "https://typeberry.dev/schemas/config-v1.schema.json",
@@ -40,12 +41,15 @@ describe("Importing Node Configuration", () => {
40
41
  it("should read the database base path", () => {
41
42
  assert.deepStrictEqual(config.databaseBasePath, "/tmp/jam-node-db");
42
43
  });
43
- it("defaults to the fjall state backend", () => {
44
- assert.deepStrictEqual(config.stateBackend, RegularStateBackend.Fjall);
44
+ it("defaults to no rpc config", () => {
45
+ assert.deepStrictEqual(config.rpc, undefined);
45
46
  });
46
- it("should read the state backend", () => {
47
- const lmdbConfig = parseFromJson({ ...NODE_CONFIG_TEST, state_backend: "lmdb" }, NodeConfiguration.fromJson);
48
- assert.deepStrictEqual(lmdbConfig.stateBackend, RegularStateBackend.Lmdb);
47
+ it("should read rpc config when present", () => {
48
+ const withRpc = parseFromJson({ ...NODE_CONFIG_TEST, rpc: { port: 9999 } }, NodeConfiguration.fromJson);
49
+ assert.deepStrictEqual(withRpc.rpc, RpcOptions.new({ port: 9999 }));
50
+ });
51
+ it("should reject unknown config keys", () => {
52
+ assert.throws(() => parseFromJson({ ...NODE_CONFIG_TEST, state_backend: "fjall" }, NodeConfiguration.fromJson));
49
53
  });
50
54
  it("should read the chain spec", () => {
51
55
  assert.deepStrictEqual(config.chainSpec.id, "testnet");
@@ -74,6 +78,7 @@ describe("loadConfig", () => {
74
78
  it("should load default config", () => {
75
79
  const config = loadConfig(["default"], withRelPath);
76
80
  assert.deepStrictEqual(config, parseFromJson(configs.default, NodeConfiguration.fromJson));
81
+ assert.deepStrictEqual(config.rpc, RpcOptions.new({ port: 19800 }));
77
82
  });
78
83
  it("should load dev config", () => {
79
84
  const config = loadConfig(["dev"], withRelPath);
@@ -0,0 +1,11 @@
1
+ /** RPC server options. */
2
+ export declare class RpcOptions {
3
+ /** Port for the JSON-RPC WebSocket server. */
4
+ readonly port: number;
5
+ static fromJson: import("@typeberry/json-parser").FromJsonWithParser<unknown, RpcOptions>;
6
+ static new({ port }: {
7
+ port: number;
8
+ }): RpcOptions;
9
+ private constructor();
10
+ }
11
+ //# sourceMappingURL=rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/config-node/rpc.ts"],"names":[],"mappings":"AAGA,0BAA0B;AAC1B,qBAAa,UAAU;IAanB,8CAA8C;aAC9B,IAAI,EAAE,MAAM;IAb9B,MAAM,CAAC,QAAQ,2EAKb;IAEF,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IAIrC,OAAO;CAIR"}
@@ -0,0 +1,16 @@
1
+ import { json } from "#@typeberry/json-parser";
2
+ /** RPC server options. */
3
+ export class RpcOptions {
4
+ port;
5
+ static fromJson = json.object({
6
+ port: "number",
7
+ }, RpcOptions.new);
8
+ static new({ port }) {
9
+ return new RpcOptions(port);
10
+ }
11
+ constructor(
12
+ /** Port for the JSON-RPC WebSocket server. */
13
+ port) {
14
+ this.port = port;
15
+ }
16
+ }
@@ -14,14 +14,7 @@ export interface InitStatesDb<T = State> {
14
14
  /** Insert a pre-defined initial state directly into the database. */
15
15
  insertInitialState(headerHash: HeaderHash, initialState: T): Promise<Result<OK, StateUpdateError>>;
16
16
  }
17
- /**
18
- * Interface for accessing states stored in the database.
19
- *
20
- * NOTE that the design of this interface is heavily influenced
21
- * by the LMDB implementation, so that we can implement it efficiently.
22
- *
23
- * See the documentation there for more detailed reasoning.
24
- */
17
+ /** Interface for accessing states stored in the database. */
25
18
  export interface StatesDb<T extends State = State> {
26
19
  /** Compute a state root for given state. */
27
20
  getStateRoot(state: T): Promise<StateRootHash>;
@@ -1 +1 @@
1
- {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,KAAK,EAAe,MAAM,kBAAkB,CAAC;AAE/F,OAAO,EAAe,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,0DAA0D;AAC1D,oBAAY,gBAAgB;IAC1B,oDAAoD;IACpD,QAAQ,IAAI;IACZ,iDAAiD;IACjD,MAAM,IAAI;CACX;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,KAAK;IACrC,qEAAqE;IACrE,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACpG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC/C,4CAA4C;IAC5C,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE/C;;;;OAIG;IACH,iBAAiB,CACf,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;IAEvC;;;;;;;;OAQG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE7C,4EAA4E;IAC5E,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAErC;;;;;OAKG;IACH,eAAe,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElC,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,QAAQ,CAAC,aAAa,CAAC;IAQxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPzC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmE;IACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS;IAI1B,OAAO;IAID,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAgBlC,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAKhE,6CAA6C;IACvC,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAM7G,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAStD,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI;IAI7C,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI9B,KAAK;CACZ"}
1
+ {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,KAAK,EAAe,MAAM,kBAAkB,CAAC;AAE/F,OAAO,EAAe,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,0DAA0D;AAC1D,oBAAY,gBAAgB;IAC1B,oDAAoD;IACpD,QAAQ,IAAI;IACZ,iDAAiD;IACjD,MAAM,IAAI;CACX;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,KAAK;IACrC,qEAAqE;IACrE,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACpG;AAED,6DAA6D;AAC7D,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC/C,4CAA4C;IAC5C,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE/C;;;;OAIG;IACH,iBAAiB,CACf,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;IAEvC;;;;;;;;OAQG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE7C,4EAA4E;IAC5E,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAErC;;;;;OAKG;IACH,eAAe,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElC,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,QAAQ,CAAC,aAAa,CAAC;IAQxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPzC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmE;IACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS;IAI1B,OAAO;IAID,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAgBlC,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAKhE,6CAA6C;IACvC,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAM7G,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAStD,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI;IAI7C,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI9B,KAAK;CACZ"}
@@ -10,10 +10,9 @@ export interface ValueDelta {
10
10
  /**
11
11
  * Synchronous, read-only view of the persisted refcounting state.
12
12
  *
13
- * Both LMDB and fjall offer synchronous reads, so reads can go straight
14
- * to the backing store. All writes go through `ValueRefsUpdate` batches
15
- * instead, since persistent backends can only write asynchronously
16
- * (LMDB transactions, fjall inserts + persist).
13
+ * fjall offers synchronous reads, so reads can go straight to the backing
14
+ * store. All writes go through `ValueRefsUpdate` batches instead, since
15
+ * persistent backends can only write asynchronously (fjall inserts + persist).
17
16
  */
18
17
  export interface ValueRefsReader {
19
18
  /** How many leaves of the finalized-tip state reference the value. Missing keys read as `0`. */
@@ -28,7 +27,7 @@ export interface ValueRefsReader {
28
27
  *
29
28
  * The backend is responsible for applying the batch using its own write
30
29
  * primitive - ideally atomically with the state write that triggered it
31
- * (one LMDB transaction, one fjall persist).
30
+ * (one fjall persist).
32
31
  *
33
32
  * Counts are absolute values rather than increments, so applying the same
34
33
  * update more than once (e.g. on crash-replay) is harmless.
@@ -1 +1 @@
1
- {"version":3,"file":"value-refs.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/value-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,sEAAsE;IACtE,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,gGAAgG;IAChG,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3C,iGAAiG;IACjG,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACtD;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,gFAAgF;IAChF,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;IACrC,oDAAoD;IACpD,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;IACtC,uDAAuD;IACvD,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,kFAAkF;IAClF,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAQ9D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAEpD,yEAAyE;IACzE,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,eAAe;IAQjD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe;IAYhE;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,eAAe;IAoBvD;;;;;;;OAOG;IACH,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe;CAYxD;AA0ED;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2D;IACrF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2D;IACnF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgE;IAEvF,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAI1C,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIxC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS;IAIpD,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAUrC"}
1
+ {"version":3,"file":"value-refs.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/value-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,sEAAsE;IACtE,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,gGAAgG;IAChG,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3C,iGAAiG;IACjG,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACtD;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,gFAAgF;IAChF,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;IACrC,oDAAoD;IACpD,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;IACtC,uDAAuD;IACvD,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,kFAAkF;IAClF,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAQ9D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAEpD,yEAAyE;IACzE,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,eAAe;IAQjD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe;IAYhE;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,eAAe;IAoBvD;;;;;;;OAOG;IACH,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe;CAYxD;AA0ED;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2D;IACrF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2D;IACnF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgE;IAEvF,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAI1C,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIxC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS;IAIpD,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAUrC"}
@@ -12,6 +12,7 @@ export declare class FjallBlocks implements BlocksDb {
12
12
  private readonly postStateRoots;
13
13
  static open(chainSpec: ChainSpec, root: FjallRoot): Promise<FjallBlocks>;
14
14
  private constructor();
15
+ private pendingPrune;
15
16
  setPostStateRoot(hash: HeaderHash, postStateRoot: StateRootHash): Promise<void>;
16
17
  getPostStateRoot(hash: HeaderHash): StateRootHash | null;
17
18
  insertBlock(block: WithHash<HeaderHash, BlockView>): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,aAAa,EAElB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAuB,KAAK,SAAS,EAAgC,MAAM,WAAW,CAAC;AAK9F,kCAAkC;AAClC,qBAAa,WAAY,YAAW,QAAQ;IAWxC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;WAdpB,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAS9E,OAAO;IAQD,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrF,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAQlD,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,iBAAiB,IAAI,UAAU;IAQ/B,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAQ9C,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAQpD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAQ5B,KAAK;CACZ"}
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,aAAa,EAElB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAuB,KAAK,SAAS,EAAgC,MAAM,WAAW,CAAC;AAK9F,kCAAkC;AAClC,qBAAa,WAAY,YAAW,QAAQ;IAWxC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;WAdpB,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAS9E,OAAO;IAQP,OAAO,CAAC,YAAY,CAAuC;IAErD,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrF,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAQlD,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,iBAAiB,IAAI,UAAU;IAQ/B,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAQ9C,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAQpD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAY5B,KAAK;CAGZ"}
@@ -28,6 +28,7 @@ export class FjallBlocks {
28
28
  this.extrinsics = extrinsics;
29
29
  this.postStateRoots = postStateRoots;
30
30
  }
31
+ pendingPrune = Promise.resolve();
31
32
  async setPostStateRoot(hash, postStateRoot) {
32
33
  await writable(this.postStateRoots, this.root).insert(hash.raw, postStateRoot.raw);
33
34
  }
@@ -70,13 +71,17 @@ export class FjallBlocks {
70
71
  return Decoder.decodeObject(Extrinsic.Codec.View, data, this.chainSpec);
71
72
  }
72
73
  markUnused(hash) {
73
- void Promise.all([
74
+ this.pendingPrune = this.pendingPrune
75
+ .then(() => Promise.all([
74
76
  writable(this.headers, this.root).remove(hash.raw),
75
77
  writable(this.extrinsics, this.root).remove(hash.raw),
76
78
  writable(this.postStateRoots, this.root).remove(hash.raw),
77
- ]).catch((e) => logger.warn `Failed to prune block ${hash}: ${e}`);
79
+ ]))
80
+ .catch((e) => logger.warn `Failed to prune block ${hash}: ${e}`);
81
+ }
82
+ async close() {
83
+ await this.pendingPrune;
78
84
  }
79
- async close() { }
80
85
  }
81
86
  function writable(partition, root) {
82
87
  if (root.readOnly) {
@@ -5,13 +5,13 @@ import type { Blake2b } from "#@typeberry/hash";
5
5
  import type { ServicesUpdate, State } from "#@typeberry/state";
6
6
  import { SerializedState, type StateEntries } from "#@typeberry/state-merkleization";
7
7
  import { OK, Result } from "#@typeberry/utils";
8
- import { type FjallRootOptions, type Partition } from "./root.js";
8
+ import { FjallRoot, type FjallRootOptions, type Partition } from "./root.js";
9
9
  /**
10
10
  * One open fjall keyspace together with its content-addressed `values`
11
11
  * partition.
12
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`).
13
+ * Opening the keyspace is the slow part, so the fuzz target can open one root
14
+ * per run and reuse it for every reset (see `HybridSerializedStates.fromRoot`).
15
15
  * The values partition is immutable - the key is the hash of the value - so it
16
16
  * is fine that values pile up across resets, the unreferenced ones just sit
17
17
  * there unused.
@@ -20,9 +20,13 @@ export declare class FjallValuesSession {
20
20
  private readonly root;
21
21
  /** Shared content-addressed values partition, reused across resets. */
22
22
  readonly values: Partition;
23
+ /** Whether close() should release the underlying keyspace. */
24
+ private readonly ownsRoot;
23
25
  private constructor();
24
26
  /** Open (or create) the keyspace at `dbPath` and its `values` partition. */
25
27
  static open(dbPath: string, options?: FjallRootOptions): Promise<FjallValuesSession>;
28
+ /** Wrap an already-open keyspace and open its `values` partition. */
29
+ static fromRoot(root: FjallRoot): Promise<FjallValuesSession>;
26
30
  /** Flush the journal to disk (a no-op for ephemeral keyspaces). */
27
31
  persist(): Promise<void>;
28
32
  /** Size of the keyspace directory on disk, in bytes. */
@@ -44,7 +48,7 @@ export declare class FjallValuesSession {
44
48
  * decided by in-memory refcounting (`ValueRefs`) driven by the importer's
45
49
  * finality signal. Counts are not persisted: this db cannot resume from disk
46
50
  * anyway (the leaf sets live in memory), so values left over by a previous run
47
- * are never collected. An instance backed by a shared session (fuzz reset
51
+ * are never collected. An instance backed by a shared keyspace (fuzz reset
48
52
  * reuse) only ever prunes values it inserted itself, since its refcounts start
49
53
  * empty - values left behind by earlier resets stay untouched.
50
54
  */
@@ -61,6 +65,8 @@ export declare class HybridSerializedStates implements StatesDb<SerializedState<
61
65
  ephemeral?: boolean;
62
66
  cacheSizeBytes?: number;
63
67
  }): Promise<HybridSerializedStates>;
68
+ /** Create a db over an already-open keyspace owned by the caller. */
69
+ static fromRoot(spec: ChainSpec, blake2b: Blake2b, root: FjallRoot): Promise<HybridSerializedStates>;
64
70
  /**
65
71
  * Wrap an already-open `FjallValuesSession` and reuse its keyspace.
66
72
  *
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid-states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/hybrid-states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,KAAK,YAAY,EAEjB,MAAM,EACN,KAAK,QAAQ,EACb,gBAAgB,EAKjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EAGlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAa,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAgB,MAAM,WAAW,CAAC;AAI3F;;;;;;;;;GASG;AACH,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,SAAS;IAH5B,OAAO;IAMP,4EAA4E;WAC/D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAc9F,mEAAmE;IAC7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,wDAAwD;IACxD,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,6EAA6E;IACvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,sBAAuB,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IA0CxG,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW;WA7CjB,GAAG,CAAC,EACf,IAAI,EACJ,OAAO,EACP,MAAM,EACN,SAAS,EACT,cAAc,GACf,EAAE;QACD,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAMnC;;;;;;;OAOG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,GAAG,sBAAsB;IAI1G,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyE;IAErG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IAEtD,OAAO,CAAC,cAAc,CAAuC;IAE7D,OAAO;IAWD,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAexG,iBAAiB,CACrB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAmBlC,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1E,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;IAS5D,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAI5C,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAOpC,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,mFAAmF;IACnF,OAAO,CAAC,SAAS;IAcX,KAAK;IAWX,qEAAqE;YACvD,WAAW;IAoBzB,+BAA+B;IAC/B,OAAO,CAAC,SAAS;CAOlB"}
1
+ {"version":3,"file":"hybrid-states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/hybrid-states.ts"],"names":[],"mappings":"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"}
@@ -10,8 +10,8 @@ const logger = Logger.new(import.meta.filename, "db");
10
10
  * One open fjall keyspace together with its content-addressed `values`
11
11
  * partition.
12
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`).
13
+ * Opening the keyspace is the slow part, so the fuzz target can open one root
14
+ * per run and reuse it for every reset (see `HybridSerializedStates.fromRoot`).
15
15
  * The values partition is immutable - the key is the hash of the value - so it
16
16
  * is fine that values pile up across resets, the unreferenced ones just sit
17
17
  * there unused.
@@ -19,11 +19,15 @@ const logger = Logger.new(import.meta.filename, "db");
19
19
  export class FjallValuesSession {
20
20
  root;
21
21
  values;
22
+ ownsRoot;
22
23
  constructor(root,
23
24
  /** Shared content-addressed values partition, reused across resets. */
24
- values) {
25
+ values,
26
+ /** Whether close() should release the underlying keyspace. */
27
+ ownsRoot) {
25
28
  this.root = root;
26
29
  this.values = values;
30
+ this.ownsRoot = ownsRoot;
27
31
  }
28
32
  /** Open (or create) the keyspace at `dbPath` and its `values` partition. */
29
33
  static async open(dbPath, options = {}) {
@@ -33,13 +37,18 @@ export class FjallValuesSession {
33
37
  const root = await FjallRoot.open(dbPath, options);
34
38
  try {
35
39
  const values = await root.writablePartition("values");
36
- return new FjallValuesSession(root, values);
40
+ return new FjallValuesSession(root, values, true);
37
41
  }
38
42
  catch (e) {
39
43
  await root.close();
40
44
  throw e;
41
45
  }
42
46
  }
47
+ /** Wrap an already-open keyspace and open its `values` partition. */
48
+ static async fromRoot(root) {
49
+ const values = await root.writablePartition("values");
50
+ return new FjallValuesSession(root, values, false);
51
+ }
43
52
  /** Flush the journal to disk (a no-op for ephemeral keyspaces). */
44
53
  async persist() {
45
54
  await this.root.persist();
@@ -50,7 +59,9 @@ export class FjallValuesSession {
50
59
  }
51
60
  /** Release the keyspace handle (skips the sync-all fsync when ephemeral). */
52
61
  async close() {
53
- await this.root.close();
62
+ if (this.ownsRoot) {
63
+ await this.root.close();
64
+ }
54
65
  }
55
66
  }
56
67
  /**
@@ -67,7 +78,7 @@ export class FjallValuesSession {
67
78
  * decided by in-memory refcounting (`ValueRefs`) driven by the importer's
68
79
  * finality signal. Counts are not persisted: this db cannot resume from disk
69
80
  * anyway (the leaf sets live in memory), so values left over by a previous run
70
- * are never collected. An instance backed by a shared session (fuzz reset
81
+ * are never collected. An instance backed by a shared keyspace (fuzz reset
71
82
  * reuse) only ever prunes values it inserted itself, since its refcounts start
72
83
  * empty - values left behind by earlier resets stay untouched.
73
84
  */
@@ -81,6 +92,11 @@ export class HybridSerializedStates {
81
92
  // This instance owns the session it just opened, so its `close()` closes it.
82
93
  return new HybridSerializedStates(spec, blake2b, session, true);
83
94
  }
95
+ /** Create a db over an already-open keyspace owned by the caller. */
96
+ static async fromRoot(spec, blake2b, root) {
97
+ const session = await FjallValuesSession.fromRoot(root);
98
+ return new HybridSerializedStates(spec, blake2b, session, true);
99
+ }
84
100
  /**
85
101
  * Wrap an already-open `FjallValuesSession` and reuse its keyspace.
86
102
  *
@@ -43,6 +43,8 @@ export declare class FjallRoot {
43
43
  partition(name: string): Promise<FjallPartition>;
44
44
  /** Open a writable partition, failing early when this root is read-only. */
45
45
  writablePartition(name: string): Promise<Partition>;
46
+ /** Delete a writable partition and all of its data. */
47
+ deletePartition(name: string): Promise<void>;
46
48
  /**
47
49
  * Flush the journal to disk so prior writes survive a crash.
48
50
  *
@@ -1 +1 @@
1
- {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/root.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;AAC7C,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAKpE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO;IAOP,2DAA2D;WAC9C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC;IAWrF,sEAAsE;IACtE,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,wDAAwD;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAItD,4EAA4E;IACtE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAOzD;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;;;;;OAMG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;IAQ5B,oFAAoF;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-fjall/root.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;AAC7C,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAKpE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO;IAOP,2DAA2D;WAC9C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC;IAWrF,sEAAsE;IACtE,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,wDAAwD;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAItD,4EAA4E;IACtE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAOzD,uDAAuD;IACjD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlD;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;;;;;OAMG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;IAQ5B,oFAAoF;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -31,7 +31,7 @@ export class FjallRoot {
31
31
  }
32
32
  /** Open (or create) a fjall keyspace at the given path. */
33
33
  static async open(dbPath, options = {}) {
34
- // fjall-js 0.3 shares one engine per path. Readers must use the read-only
34
+ // fjall-js shares one engine per path. Readers must use the read-only
35
35
  // wrapper surface; durability is driven explicitly through persist().
36
36
  const config = {
37
37
  path: dbPath,
@@ -55,6 +55,13 @@ export class FjallRoot {
55
55
  }
56
56
  return (await this.keyspace.partition(name));
57
57
  }
58
+ /** Delete a writable partition and all of its data. */
59
+ async deletePartition(name) {
60
+ if (this.readOnly) {
61
+ throw new Error(`Cannot delete fjall partition '${name}' from a read-only keyspace.`);
62
+ }
63
+ await this.keyspace.deletePartition(name);
64
+ }
58
65
  /**
59
66
  * Flush the journal to disk so prior writes survive a crash.
60
67
  *