@optimystic/db-p2p 0.14.0 → 0.16.2

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 (275) hide show
  1. package/README.md +616 -609
  2. package/dist/src/cluster/block-transfer-service.d.ts.map +1 -1
  3. package/dist/src/cluster/block-transfer-service.js +4 -3
  4. package/dist/src/cluster/block-transfer-service.js.map +1 -1
  5. package/dist/src/cluster/block-transfer.d.ts +52 -3
  6. package/dist/src/cluster/block-transfer.d.ts.map +1 -1
  7. package/dist/src/cluster/block-transfer.js +129 -6
  8. package/dist/src/cluster/block-transfer.js.map +1 -1
  9. package/dist/src/cluster/client.d.ts.map +1 -1
  10. package/dist/src/cluster/client.js +3 -1
  11. package/dist/src/cluster/client.js.map +1 -1
  12. package/dist/src/cluster/cluster-repo.d.ts +182 -11
  13. package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
  14. package/dist/src/cluster/cluster-repo.js +429 -69
  15. package/dist/src/cluster/cluster-repo.js.map +1 -1
  16. package/dist/src/cluster/peer-key-binding.d.ts +25 -0
  17. package/dist/src/cluster/peer-key-binding.d.ts.map +1 -0
  18. package/dist/src/cluster/peer-key-binding.js +39 -0
  19. package/dist/src/cluster/peer-key-binding.js.map +1 -0
  20. package/dist/src/cluster/quorum-restore.d.ts +72 -0
  21. package/dist/src/cluster/quorum-restore.d.ts.map +1 -0
  22. package/dist/src/cluster/quorum-restore.js +0 -0
  23. package/dist/src/cluster/quorum-restore.js.map +1 -0
  24. package/dist/src/cluster/rebalance-monitor.d.ts +23 -1
  25. package/dist/src/cluster/rebalance-monitor.d.ts.map +1 -1
  26. package/dist/src/cluster/rebalance-monitor.js +17 -2
  27. package/dist/src/cluster/rebalance-monitor.js.map +1 -1
  28. package/dist/src/cluster/service.d.ts.map +1 -1
  29. package/dist/src/cluster/service.js +7 -1
  30. package/dist/src/cluster/service.js.map +1 -1
  31. package/dist/src/cluster/spread-on-churn.d.ts +7 -0
  32. package/dist/src/cluster/spread-on-churn.d.ts.map +1 -1
  33. package/dist/src/cluster/spread-on-churn.js +4 -1
  34. package/dist/src/cluster/spread-on-churn.js.map +1 -1
  35. package/dist/src/cluster/supermajority-coupling.d.ts +22 -0
  36. package/dist/src/cluster/supermajority-coupling.d.ts.map +1 -0
  37. package/dist/src/cluster/supermajority-coupling.js +27 -0
  38. package/dist/src/cluster/supermajority-coupling.js.map +1 -0
  39. package/dist/src/cohort-topic/cohort-gossip-driver.d.ts +46 -4
  40. package/dist/src/cohort-topic/cohort-gossip-driver.d.ts.map +1 -1
  41. package/dist/src/cohort-topic/cohort-gossip-driver.js +62 -7
  42. package/dist/src/cohort-topic/cohort-gossip-driver.js.map +1 -1
  43. package/dist/src/cohort-topic/cohort-gossip-transport.d.ts +7 -0
  44. package/dist/src/cohort-topic/cohort-gossip-transport.d.ts.map +1 -1
  45. package/dist/src/cohort-topic/cohort-gossip-transport.js +9 -0
  46. package/dist/src/cohort-topic/cohort-gossip-transport.js.map +1 -1
  47. package/dist/src/cohort-topic/host.d.ts +197 -27
  48. package/dist/src/cohort-topic/host.d.ts.map +1 -1
  49. package/dist/src/cohort-topic/host.js +643 -87
  50. package/dist/src/cohort-topic/host.js.map +1 -1
  51. package/dist/src/dispute/arbitrator-selection.d.ts +68 -7
  52. package/dist/src/dispute/arbitrator-selection.d.ts.map +1 -1
  53. package/dist/src/dispute/arbitrator-selection.js +105 -16
  54. package/dist/src/dispute/arbitrator-selection.js.map +1 -1
  55. package/dist/src/dispute/cascade.d.ts +7 -0
  56. package/dist/src/dispute/cascade.d.ts.map +1 -1
  57. package/dist/src/dispute/cascade.js +1 -1
  58. package/dist/src/dispute/cascade.js.map +1 -1
  59. package/dist/src/dispute/client.d.ts.map +1 -1
  60. package/dist/src/dispute/client.js +3 -2
  61. package/dist/src/dispute/client.js.map +1 -1
  62. package/dist/src/dispute/dispute-service.d.ts +32 -3
  63. package/dist/src/dispute/dispute-service.d.ts.map +1 -1
  64. package/dist/src/dispute/dispute-service.js +82 -9
  65. package/dist/src/dispute/dispute-service.js.map +1 -1
  66. package/dist/src/dispute/index.d.ts +1 -1
  67. package/dist/src/dispute/index.d.ts.map +1 -1
  68. package/dist/src/dispute/index.js +1 -1
  69. package/dist/src/dispute/index.js.map +1 -1
  70. package/dist/src/dispute/invalidation.d.ts +25 -0
  71. package/dist/src/dispute/invalidation.d.ts.map +1 -1
  72. package/dist/src/dispute/invalidation.js +14 -2
  73. package/dist/src/dispute/invalidation.js.map +1 -1
  74. package/dist/src/dispute/service.d.ts.map +1 -1
  75. package/dist/src/dispute/service.js +7 -1
  76. package/dist/src/dispute/service.js.map +1 -1
  77. package/dist/src/index.d.ts +4 -1
  78. package/dist/src/index.d.ts.map +1 -1
  79. package/dist/src/index.js +4 -1
  80. package/dist/src/index.js.map +1 -1
  81. package/dist/src/it-utility.d.ts +1 -1
  82. package/dist/src/it-utility.d.ts.map +1 -1
  83. package/dist/src/it-utility.js +4 -13
  84. package/dist/src/it-utility.js.map +1 -1
  85. package/dist/src/libp2p-key-network.d.ts +98 -1
  86. package/dist/src/libp2p-key-network.d.ts.map +1 -1
  87. package/dist/src/libp2p-key-network.js +272 -17
  88. package/dist/src/libp2p-key-network.js.map +1 -1
  89. package/dist/src/libp2p-node-base.d.ts +12 -0
  90. package/dist/src/libp2p-node-base.d.ts.map +1 -1
  91. package/dist/src/libp2p-node-base.js +415 -87
  92. package/dist/src/libp2p-node-base.js.map +1 -1
  93. package/dist/src/matchmaking/query-transport.d.ts +2 -0
  94. package/dist/src/matchmaking/query-transport.d.ts.map +1 -1
  95. package/dist/src/matchmaking/query-transport.js +6 -0
  96. package/dist/src/matchmaking/query-transport.js.map +1 -1
  97. package/dist/src/matchmaking/traffic-validation.js +1 -0
  98. package/dist/src/matchmaking/traffic-validation.js.map +1 -1
  99. package/dist/src/network/network-manager-service.d.ts +2 -2
  100. package/dist/src/network/network-manager-service.d.ts.map +1 -1
  101. package/dist/src/network/network-manager-service.js +8 -4
  102. package/dist/src/network/network-manager-service.js.map +1 -1
  103. package/dist/src/owned-block-seed.d.ts +27 -0
  104. package/dist/src/owned-block-seed.d.ts.map +1 -0
  105. package/dist/src/owned-block-seed.js +37 -0
  106. package/dist/src/owned-block-seed.js.map +1 -0
  107. package/dist/src/protocol-client.d.ts +1 -0
  108. package/dist/src/protocol-client.d.ts.map +1 -1
  109. package/dist/src/protocol-client.js +9 -2
  110. package/dist/src/protocol-client.js.map +1 -1
  111. package/dist/src/protocol-limits.d.ts +32 -0
  112. package/dist/src/protocol-limits.d.ts.map +1 -0
  113. package/dist/src/protocol-limits.js +32 -0
  114. package/dist/src/protocol-limits.js.map +1 -0
  115. package/dist/src/repo/client.d.ts.map +1 -1
  116. package/dist/src/repo/client.js +3 -0
  117. package/dist/src/repo/client.js.map +1 -1
  118. package/dist/src/repo/cluster-coordinator.d.ts +41 -4
  119. package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
  120. package/dist/src/repo/cluster-coordinator.js +128 -80
  121. package/dist/src/repo/cluster-coordinator.js.map +1 -1
  122. package/dist/src/repo/coordinator-repo.d.ts +38 -1
  123. package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
  124. package/dist/src/repo/coordinator-repo.js +92 -13
  125. package/dist/src/repo/coordinator-repo.js.map +1 -1
  126. package/dist/src/repo/service.d.ts.map +1 -1
  127. package/dist/src/repo/service.js +7 -1
  128. package/dist/src/repo/service.js.map +1 -1
  129. package/dist/src/reputation/peer-reputation.js +1 -1
  130. package/dist/src/reputation/peer-reputation.js.map +1 -1
  131. package/dist/src/reputation/types.d.ts +3 -1
  132. package/dist/src/reputation/types.d.ts.map +1 -1
  133. package/dist/src/reputation/types.js +3 -0
  134. package/dist/src/reputation/types.js.map +1 -1
  135. package/dist/src/rn.d.ts +5 -1
  136. package/dist/src/rn.d.ts.map +1 -1
  137. package/dist/src/rn.js +7 -1
  138. package/dist/src/rn.js.map +1 -1
  139. package/dist/src/storage/arachnode-fret-adapter.d.ts +30 -1
  140. package/dist/src/storage/arachnode-fret-adapter.d.ts.map +1 -1
  141. package/dist/src/storage/arachnode-fret-adapter.js +15 -2
  142. package/dist/src/storage/arachnode-fret-adapter.js.map +1 -1
  143. package/dist/src/storage/arachnode-partition.d.ts +49 -0
  144. package/dist/src/storage/arachnode-partition.d.ts.map +1 -0
  145. package/dist/src/storage/arachnode-partition.js +61 -0
  146. package/dist/src/storage/arachnode-partition.js.map +1 -0
  147. package/dist/src/storage/block-storage.d.ts +40 -1
  148. package/dist/src/storage/block-storage.d.ts.map +1 -1
  149. package/dist/src/storage/block-storage.js +150 -57
  150. package/dist/src/storage/block-storage.js.map +1 -1
  151. package/dist/src/storage/i-block-storage.d.ts +8 -0
  152. package/dist/src/storage/i-block-storage.d.ts.map +1 -1
  153. package/dist/src/storage/i-raw-storage.d.ts +13 -0
  154. package/dist/src/storage/i-raw-storage.d.ts.map +1 -1
  155. package/dist/src/storage/kv-raw-storage.d.ts +45 -0
  156. package/dist/src/storage/kv-raw-storage.d.ts.map +1 -0
  157. package/dist/src/storage/kv-raw-storage.js +113 -0
  158. package/dist/src/storage/kv-raw-storage.js.map +1 -0
  159. package/dist/src/storage/memory-storage.d.ts +20 -58
  160. package/dist/src/storage/memory-storage.d.ts.map +1 -1
  161. package/dist/src/storage/memory-storage.js +22 -148
  162. package/dist/src/storage/memory-storage.js.map +1 -1
  163. package/dist/src/storage/memory-store-driver.d.ts +39 -0
  164. package/dist/src/storage/memory-store-driver.d.ts.map +1 -0
  165. package/dist/src/storage/memory-store-driver.js +129 -0
  166. package/dist/src/storage/memory-store-driver.js.map +1 -0
  167. package/dist/src/storage/raw-store-codec.d.ts +10 -0
  168. package/dist/src/storage/raw-store-codec.d.ts.map +1 -0
  169. package/dist/src/storage/raw-store-codec.js +36 -0
  170. package/dist/src/storage/raw-store-codec.js.map +1 -0
  171. package/dist/src/storage/raw-store-driver.d.ts +69 -0
  172. package/dist/src/storage/raw-store-driver.d.ts.map +1 -0
  173. package/dist/src/storage/raw-store-driver.js +2 -0
  174. package/dist/src/storage/raw-store-driver.js.map +1 -0
  175. package/dist/src/storage/restoration-coordinator-v2.d.ts.map +1 -1
  176. package/dist/src/storage/restoration-coordinator-v2.js +1 -1
  177. package/dist/src/storage/restoration-coordinator-v2.js.map +1 -1
  178. package/dist/src/storage/restoration-coordinator.d.ts +73 -0
  179. package/dist/src/storage/restoration-coordinator.d.ts.map +1 -0
  180. package/dist/src/storage/restoration-coordinator.js +181 -0
  181. package/dist/src/storage/restoration-coordinator.js.map +1 -0
  182. package/dist/src/storage/ring-selector.d.ts +92 -5
  183. package/dist/src/storage/ring-selector.d.ts.map +1 -1
  184. package/dist/src/storage/ring-selector.js +153 -51
  185. package/dist/src/storage/ring-selector.js.map +1 -1
  186. package/dist/src/storage/ring-shift-coordinator.d.ts +128 -0
  187. package/dist/src/storage/ring-shift-coordinator.d.ts.map +1 -0
  188. package/dist/src/storage/ring-shift-coordinator.js +196 -0
  189. package/dist/src/storage/ring-shift-coordinator.js.map +1 -0
  190. package/dist/src/storage/storage-monitor.d.ts +28 -0
  191. package/dist/src/storage/storage-monitor.d.ts.map +1 -1
  192. package/dist/src/storage/storage-monitor.js +42 -2
  193. package/dist/src/storage/storage-monitor.js.map +1 -1
  194. package/dist/src/storage/storage-repo.d.ts +19 -0
  195. package/dist/src/storage/storage-repo.d.ts.map +1 -1
  196. package/dist/src/storage/storage-repo.js +172 -22
  197. package/dist/src/storage/storage-repo.js.map +1 -1
  198. package/dist/src/sync/client.d.ts.map +1 -1
  199. package/dist/src/sync/client.js +5 -1
  200. package/dist/src/sync/client.js.map +1 -1
  201. package/dist/src/sync/service.d.ts.map +1 -1
  202. package/dist/src/sync/service.js +2 -1
  203. package/dist/src/sync/service.js.map +1 -1
  204. package/dist/src/testing/cohort-topic-mesh-harness.d.ts +28 -4
  205. package/dist/src/testing/cohort-topic-mesh-harness.d.ts.map +1 -1
  206. package/dist/src/testing/cohort-topic-mesh-harness.js +51 -10
  207. package/dist/src/testing/cohort-topic-mesh-harness.js.map +1 -1
  208. package/dist/src/testing/index.d.ts +1 -0
  209. package/dist/src/testing/index.d.ts.map +1 -1
  210. package/dist/src/testing/index.js +1 -0
  211. package/dist/src/testing/index.js.map +1 -1
  212. package/dist/src/testing/mesh-harness.d.ts.map +1 -1
  213. package/dist/src/testing/mesh-harness.js +15 -7
  214. package/dist/src/testing/mesh-harness.js.map +1 -1
  215. package/dist/src/testing/raw-storage-conformance.d.ts +24 -0
  216. package/dist/src/testing/raw-storage-conformance.d.ts.map +1 -0
  217. package/dist/src/testing/raw-storage-conformance.js +313 -0
  218. package/dist/src/testing/raw-storage-conformance.js.map +1 -0
  219. package/package.json +4 -4
  220. package/src/cluster/block-transfer-service.ts +4 -3
  221. package/src/cluster/block-transfer.ts +424 -265
  222. package/src/cluster/client.ts +3 -1
  223. package/src/cluster/cluster-repo.ts +481 -71
  224. package/src/cluster/peer-key-binding.ts +37 -0
  225. package/src/cluster/quorum-restore.ts +0 -0
  226. package/src/cluster/rebalance-monitor.ts +34 -3
  227. package/src/cluster/service.ts +7 -1
  228. package/src/cluster/spread-on-churn.ts +11 -1
  229. package/src/cluster/supermajority-coupling.ts +37 -0
  230. package/src/cohort-topic/cohort-gossip-driver.ts +96 -9
  231. package/src/cohort-topic/cohort-gossip-transport.ts +10 -0
  232. package/src/cohort-topic/host.ts +831 -105
  233. package/src/dispute/arbitrator-selection.ts +138 -28
  234. package/src/dispute/cascade.ts +8 -1
  235. package/src/dispute/client.ts +3 -2
  236. package/src/dispute/dispute-service.ts +94 -9
  237. package/src/dispute/index.ts +7 -1
  238. package/src/dispute/invalidation.ts +40 -2
  239. package/src/dispute/service.ts +7 -1
  240. package/src/index.ts +46 -43
  241. package/src/it-utility.ts +5 -13
  242. package/src/libp2p-key-network.ts +281 -18
  243. package/src/libp2p-node-base.ts +485 -79
  244. package/src/matchmaking/query-transport.ts +9 -0
  245. package/src/network/network-manager-service.ts +8 -2
  246. package/src/owned-block-seed.ts +40 -0
  247. package/src/protocol-client.ts +10 -3
  248. package/src/protocol-limits.ts +33 -0
  249. package/src/repo/client.ts +3 -0
  250. package/src/repo/cluster-coordinator.ts +145 -82
  251. package/src/repo/coordinator-repo.ts +96 -16
  252. package/src/repo/service.ts +7 -1
  253. package/src/reputation/types.ts +3 -0
  254. package/src/rn.ts +7 -1
  255. package/src/storage/arachnode-fret-adapter.ts +33 -2
  256. package/src/storage/arachnode-partition.ts +74 -0
  257. package/src/storage/block-storage.ts +169 -61
  258. package/src/storage/i-block-storage.ts +9 -0
  259. package/src/storage/i-raw-storage.ts +14 -0
  260. package/src/storage/kv-raw-storage.ts +135 -0
  261. package/src/storage/memory-storage.ts +25 -173
  262. package/src/storage/memory-store-driver.ts +157 -0
  263. package/src/storage/raw-store-codec.ts +42 -0
  264. package/src/storage/raw-store-driver.ts +80 -0
  265. package/src/storage/{restoration-coordinator-v2.ts → restoration-coordinator.ts} +43 -37
  266. package/src/storage/ring-selector.ts +317 -176
  267. package/src/storage/ring-shift-coordinator.ts +271 -0
  268. package/src/storage/storage-monitor.ts +70 -3
  269. package/src/storage/storage-repo.ts +710 -558
  270. package/src/sync/client.ts +5 -1
  271. package/src/sync/service.ts +2 -1
  272. package/src/testing/cohort-topic-mesh-harness.ts +61 -11
  273. package/src/testing/index.ts +1 -0
  274. package/src/testing/mesh-harness.ts +14 -6
  275. package/src/testing/raw-storage-conformance.ts +397 -0
@@ -0,0 +1,313 @@
1
+ import { expect } from 'chai';
2
+ import { StorageRepo } from '../storage/storage-repo.js';
3
+ import { BlockStorage } from '../storage/block-storage.js';
4
+ const makeHeader = (id) => ({
5
+ id: id,
6
+ type: 'test',
7
+ collectionId: 'collection-1'
8
+ });
9
+ const makeBlock = (id, data) => ({
10
+ header: makeHeader(id),
11
+ ...data
12
+ });
13
+ const makeInsertTransforms = (blockId, block) => ({
14
+ inserts: { [blockId]: block },
15
+ updates: {},
16
+ deletes: []
17
+ });
18
+ async function collect(iter) {
19
+ const out = [];
20
+ for await (const item of iter)
21
+ out.push(item);
22
+ return out;
23
+ }
24
+ /**
25
+ * Registers a `describe(name, ...)` block asserting that a raw-storage backend
26
+ * behaves identically to every other backend. This is the ONE maintained parity
27
+ * target that replaces the four copied `test/*-storage.spec.ts` specs — each
28
+ * driver package calls it from its own `test/` with a factory for its backend.
29
+ *
30
+ * It covers the union of what the existing per-backend specs assert PLUS the
31
+ * behaviors the shared kernel makes parity-critical: clone-on-store/read (now
32
+ * structural via the byte boundary), promote atomicity + the exact missing-pend
33
+ * error, drain-before-yield iteration, and a `BlockStorage`-level slice that
34
+ * guards the `meta.ranges` open-ended seeding invariant and tombstone read-back.
35
+ */
36
+ export function runRawStorageConformance(name, makeStorage) {
37
+ describe(name, () => {
38
+ let harness;
39
+ let storage;
40
+ beforeEach(async () => {
41
+ harness = await makeStorage();
42
+ storage = harness.storage;
43
+ });
44
+ afterEach(async () => {
45
+ await harness.cleanup();
46
+ });
47
+ // --- Metadata ---
48
+ it('getMetadata returns undefined on a miss', async () => {
49
+ expect(await storage.getMetadata('absent')).to.equal(undefined);
50
+ });
51
+ it('metadata round-trips, including a one-element open-ended range', async () => {
52
+ const blockId = 'meta-block';
53
+ // [1, 3] is a bounded range; [5] is OPEN-ENDED (undefined upper bound). The byte
54
+ // codec must preserve the open-ended encoding exactly — no range normalization.
55
+ const meta = { ranges: [[1, 3], [5]], latest: { rev: 5, actionId: 'tx:a5' } };
56
+ await storage.saveMetadata(blockId, meta);
57
+ const got = await storage.getMetadata(blockId);
58
+ expect(got).to.deep.equal({ ranges: [[1, 3], [5]], latest: { rev: 5, actionId: 'tx:a5' } });
59
+ });
60
+ // --- Revisions ---
61
+ it('getRevision returns undefined on a miss', async () => {
62
+ expect(await storage.getRevision('block', 1)).to.equal(undefined);
63
+ });
64
+ it('revision round-trips', async () => {
65
+ const blockId = 'rev-block';
66
+ await storage.saveRevision(blockId, 7, 'tx:a7');
67
+ expect(await storage.getRevision(blockId, 7)).to.equal('tx:a7');
68
+ });
69
+ it('listRevisions is ascending, inclusive on both bounds, and skips sparse gaps', async () => {
70
+ const blockId = 'list-asc';
71
+ await storage.saveRevision(blockId, 1, 'a1');
72
+ await storage.saveRevision(blockId, 2, 'a2');
73
+ await storage.saveRevision(blockId, 4, 'a4'); // rev 3 absent
74
+ const revs = await collect(storage.listRevisions(blockId, 1, 4));
75
+ expect(revs).to.deep.equal([
76
+ { rev: 1, actionId: 'a1' },
77
+ { rev: 2, actionId: 'a2' },
78
+ { rev: 4, actionId: 'a4' }
79
+ ]);
80
+ });
81
+ it('listRevisions descends when startRev > endRev (bounds still inclusive)', async () => {
82
+ const blockId = 'list-desc';
83
+ await storage.saveRevision(blockId, 1, 'a1');
84
+ await storage.saveRevision(blockId, 2, 'a2');
85
+ await storage.saveRevision(blockId, 4, 'a4');
86
+ const revs = await collect(storage.listRevisions(blockId, 4, 1));
87
+ expect(revs).to.deep.equal([
88
+ { rev: 4, actionId: 'a4' },
89
+ { rev: 2, actionId: 'a2' },
90
+ { rev: 1, actionId: 'a1' }
91
+ ]);
92
+ });
93
+ it('listRevisions with a single inclusive bound yields that one rev', async () => {
94
+ const blockId = 'list-single';
95
+ await storage.saveRevision(blockId, 3, 'a3');
96
+ expect(await collect(storage.listRevisions(blockId, 3, 3))).to.deep.equal([{ rev: 3, actionId: 'a3' }]);
97
+ });
98
+ it('listRevisions is scoped to one blockId (a second block does not leak in)', async () => {
99
+ const a = 'scope-a';
100
+ const b = 'scope-b';
101
+ await storage.saveRevision(a, 1, 'a1');
102
+ await storage.saveRevision(b, 1, 'b1');
103
+ await storage.saveRevision(b, 2, 'b2');
104
+ expect(await collect(storage.listRevisions(a, 1, 5))).to.deep.equal([{ rev: 1, actionId: 'a1' }]);
105
+ });
106
+ it('listRevisions over an empty range yields nothing', async () => {
107
+ expect(await collect(storage.listRevisions('empty', 1, 10))).to.deep.equal([]);
108
+ });
109
+ it('listRevisions tolerates awaits interleaved between yields (drain-before-yield)', async () => {
110
+ const blockId = 'drain-revs';
111
+ await storage.saveRevision(blockId, 1, 'a1');
112
+ await storage.saveRevision(blockId, 2, 'a2');
113
+ await storage.saveRevision(blockId, 3, 'a3');
114
+ const seen = [];
115
+ for await (const { rev, actionId } of storage.listRevisions(blockId, 1, 3)) {
116
+ // An unrelated storage read between yields would auto-commit / invalidate a
117
+ // native cursor that straddled the await, if the driver failed to drain first.
118
+ await storage.getMetadata('other');
119
+ seen.push([rev, actionId]);
120
+ }
121
+ expect(seen).to.deep.equal([[1, 'a1'], [2, 'a2'], [3, 'a3']]);
122
+ });
123
+ // --- Pending transactions ---
124
+ it('getPendingTransaction returns undefined on a miss', async () => {
125
+ expect(await storage.getPendingTransaction('block', 'a')).to.equal(undefined);
126
+ });
127
+ it('pending transaction round-trips', async () => {
128
+ const blockId = 'pend-block';
129
+ const transform = { insert: makeBlock('pend-block', { items: ['x'] }) };
130
+ await storage.savePendingTransaction(blockId, 'a1', transform);
131
+ expect(await storage.getPendingTransaction(blockId, 'a1')).to.deep.equal(transform);
132
+ });
133
+ it('listPendingTransactions is scoped to one block', async () => {
134
+ const a = 'pend-a';
135
+ const b = 'pend-b';
136
+ await storage.savePendingTransaction(a, 'a1', { delete: true });
137
+ await storage.savePendingTransaction(a, 'a2', { delete: true });
138
+ await storage.savePendingTransaction(b, 'b1', { delete: true });
139
+ const ids = new Set(await collect(storage.listPendingTransactions(a)));
140
+ expect(ids).to.deep.equal(new Set(['a1', 'a2']));
141
+ });
142
+ it('deletePendingTransaction removes the pending entry', async () => {
143
+ const blockId = 'pend-del';
144
+ await storage.savePendingTransaction(blockId, 'a1', { delete: true });
145
+ await storage.deletePendingTransaction(blockId, 'a1');
146
+ expect(await storage.getPendingTransaction(blockId, 'a1')).to.equal(undefined);
147
+ expect(await collect(storage.listPendingTransactions(blockId))).to.deep.equal([]);
148
+ });
149
+ it('listPendingTransactions tolerates awaits interleaved between yields (drain-before-yield)', async () => {
150
+ const blockId = 'drain-pend';
151
+ await storage.savePendingTransaction(blockId, 'a1', { delete: true });
152
+ await storage.savePendingTransaction(blockId, 'a2', { delete: true });
153
+ const seen = [];
154
+ for await (const id of storage.listPendingTransactions(blockId)) {
155
+ await storage.getMetadata('other');
156
+ seen.push(id);
157
+ }
158
+ expect(new Set(seen)).to.deep.equal(new Set(['a1', 'a2']));
159
+ });
160
+ // --- Committed transactions ---
161
+ it('getTransaction returns undefined on a miss', async () => {
162
+ expect(await storage.getTransaction('block', 'a')).to.equal(undefined);
163
+ });
164
+ it('committed transaction round-trips', async () => {
165
+ const blockId = 'tx-block';
166
+ const transform = { updates: [['items', 0, 0, ['y']]] };
167
+ await storage.saveTransaction(blockId, 'a1', transform);
168
+ expect(await storage.getTransaction(blockId, 'a1')).to.deep.equal(transform);
169
+ });
170
+ // --- Materialized blocks ---
171
+ it('getMaterializedBlock returns undefined on a miss', async () => {
172
+ expect(await storage.getMaterializedBlock('block', 'a')).to.equal(undefined);
173
+ });
174
+ it('materialized block round-trips', async () => {
175
+ const blockId = 'mat-block';
176
+ const block = makeBlock('mat-block', { items: ['z'] });
177
+ await storage.saveMaterializedBlock(blockId, 'a1', block);
178
+ expect(await storage.getMaterializedBlock(blockId, 'a1')).to.deep.equal(block);
179
+ });
180
+ it('saveMaterializedBlock(undefined) deletes; a subsequent get returns undefined', async () => {
181
+ const blockId = 'mat-del';
182
+ await storage.saveMaterializedBlock(blockId, 'a1', makeBlock('mat-del'));
183
+ await storage.saveMaterializedBlock(blockId, 'a1', undefined);
184
+ expect(await storage.getMaterializedBlock(blockId, 'a1')).to.equal(undefined);
185
+ });
186
+ // --- Promote (the only cross-key atomic op) ---
187
+ it('promotePendingTransaction moves pending → committed atomically', async () => {
188
+ const blockId = 'promote-block';
189
+ const transform = { insert: makeBlock('promote-block') };
190
+ await storage.savePendingTransaction(blockId, 'a1', transform);
191
+ await storage.promotePendingTransaction(blockId, 'a1');
192
+ expect(await storage.getTransaction(blockId, 'a1'), 'committed after promote').to.deep.equal(transform);
193
+ expect(await storage.getPendingTransaction(blockId, 'a1'), 'pending removed after promote').to.equal(undefined);
194
+ });
195
+ it('promotePendingTransaction throws the exact message when no pending entry exists', async () => {
196
+ const blockId = 'promote-missing';
197
+ let error;
198
+ try {
199
+ await storage.promotePendingTransaction(blockId, 'nope');
200
+ }
201
+ catch (err) {
202
+ error = err;
203
+ }
204
+ expect(error, 'promote of a missing pending throws').to.not.equal(undefined);
205
+ expect(error.message).to.equal(`Pending action nope not found for block ${blockId}`);
206
+ });
207
+ // --- Clone-on-store / clone-on-read (now structural via the byte boundary) ---
208
+ it('saveMetadata snapshots — a later caller mutation does not corrupt stored state', async () => {
209
+ const blockId = 'clone-meta';
210
+ const meta = { ranges: [[1, 2]], latest: { rev: 1, actionId: 'a1' } };
211
+ await storage.saveMetadata(blockId, meta);
212
+ // Mutate the caller's object AFTER saving — must not reach stored state.
213
+ meta.ranges.push([9, 10]);
214
+ meta.latest.rev = 99;
215
+ const stored = await storage.getMetadata(blockId);
216
+ expect(stored).to.deep.equal({ ranges: [[1, 2]], latest: { rev: 1, actionId: 'a1' } });
217
+ });
218
+ it('savePendingTransaction / saveTransaction snapshot — a later caller mutation does not corrupt stored state', async () => {
219
+ const blockId = 'clone-tx';
220
+ const pend = { insert: makeBlock('clone-tx', { items: ['p-original'] }) };
221
+ const committed = { insert: makeBlock('clone-tx', { items: ['c-original'] }) };
222
+ await storage.savePendingTransaction(blockId, 'p1', pend);
223
+ await storage.saveTransaction(blockId, 'c1', committed);
224
+ // Mutate both caller references AFTER saving — neither must reach stored state.
225
+ pend.insert.items.push('mutated');
226
+ pend.delete = true;
227
+ committed.insert.items.push('mutated');
228
+ const storedPend = await storage.getPendingTransaction(blockId, 'p1');
229
+ expect(storedPend.insert.items).to.deep.equal(['p-original']);
230
+ expect(storedPend.delete).to.equal(undefined);
231
+ const storedCommitted = await storage.getTransaction(blockId, 'c1');
232
+ expect(storedCommitted.insert.items).to.deep.equal(['c-original']);
233
+ });
234
+ it('getMetadata returns an independent copy each read (mutating one does not affect another)', async () => {
235
+ const blockId = 'clone-meta-read';
236
+ await storage.saveMetadata(blockId, { ranges: [[1, 2]], latest: { rev: 1, actionId: 'a1' } });
237
+ const first = await storage.getMetadata(blockId);
238
+ first.ranges.push([9, 10]);
239
+ const second = await storage.getMetadata(blockId);
240
+ expect(second.ranges).to.deep.equal([[1, 2]]);
241
+ });
242
+ it('saveMaterializedBlock snapshots and getMaterializedBlock returns a fresh object', async () => {
243
+ const blockId = 'clone-mat';
244
+ const block = makeBlock('clone-mat', { items: ['original'] });
245
+ await storage.saveMaterializedBlock(blockId, 'a1', block);
246
+ // Mutate the caller's block after saving.
247
+ block.items.push('mutated');
248
+ const stored = await storage.getMaterializedBlock(blockId, 'a1');
249
+ expect(stored.items, 'stored copy unaffected by post-save mutation').to.deep.equal(['original']);
250
+ // Mutate a returned copy; a fresh get is unaffected.
251
+ stored.items.push('mutated-again');
252
+ const reread = await storage.getMaterializedBlock(blockId, 'a1');
253
+ expect(reread.items, 'fresh read unaffected by mutation of a prior read').to.deep.equal(['original']);
254
+ });
255
+ // --- listBlockIds (optional; only when the driver implements it) ---
256
+ it('listBlockIds yields exactly the blocks with metadata', async function () {
257
+ const listBlockIds = storage.listBlockIds;
258
+ if (typeof listBlockIds !== 'function') {
259
+ this.skip();
260
+ }
261
+ else {
262
+ await storage.saveMetadata('b1', { ranges: [], latest: undefined });
263
+ await storage.saveMetadata('b2', { ranges: [], latest: undefined });
264
+ // Pended but never committed → no metadata → must not be enumerated.
265
+ await storage.savePendingTransaction('pending-only', 'x', { delete: true });
266
+ const ids = new Set(await collect(listBlockIds.call(storage)));
267
+ expect(ids).to.deep.equal(new Set(['b1', 'b2']));
268
+ }
269
+ });
270
+ it('listBlockIds yields nothing for an empty store', async function () {
271
+ const listBlockIds = storage.listBlockIds;
272
+ if (typeof listBlockIds !== 'function') {
273
+ this.skip();
274
+ }
275
+ else {
276
+ expect(await collect(listBlockIds.call(storage))).to.deep.equal([]);
277
+ }
278
+ });
279
+ // --- BlockStorage-level parity slice (over the same driver) ---
280
+ it('BlockStorage pend → commit seeds open-ended ranges [[E]] (never [[0]]) and getBlock serves it', async () => {
281
+ const blockId = 'parity-commit';
282
+ const repo = new StorageRepo((id) => new BlockStorage(id, storage));
283
+ await repo.pend({
284
+ actionId: 'a1',
285
+ transforms: makeInsertTransforms(blockId, makeBlock('parity-commit', { items: [] })),
286
+ policy: 'c'
287
+ });
288
+ const commit = await repo.commit({ actionId: 'a1', blockIds: [blockId], tailId: blockId, rev: 1 });
289
+ expect(commit.success, 'commit succeeded').to.equal(true);
290
+ const meta = await storage.getMetadata(blockId);
291
+ expect(meta.latest?.rev).to.equal(1);
292
+ // Open-ended from the earliest committed rev E=1 — NOT the over-claim [[0]].
293
+ expect(meta.ranges, 'coverage open-ended from E=1').to.deep.equal([[1]]);
294
+ const got = await new BlockStorage(blockId, storage).getBlock();
295
+ expect(got?.block.header.id, 'committed block served').to.equal('parity-commit');
296
+ });
297
+ it('BlockStorage saveReplica → saveDeletion reads the tombstoned rev back as undefined', async () => {
298
+ const blockId = 'parity-tombstone';
299
+ const bs = new BlockStorage(blockId, storage);
300
+ await bs.saveReplica(makeBlock('parity-tombstone', { items: ['live'] }), { rev: 1, actionId: 'r1' });
301
+ const meta = await storage.getMetadata(blockId);
302
+ // saveReplica seeds open-ended coverage anchored at the replica rev, never [[0]].
303
+ expect(meta.ranges, 'replica seeds open-ended [[1]]').to.deep.equal([[1]]);
304
+ const latest = await bs.saveDeletion({ rev: 2, actionId: 'd2' });
305
+ expect(latest.rev).to.equal(2);
306
+ // getBlock at the tombstone rev reverse-applies { delete: true } → absent block.
307
+ expect(await bs.getBlock(), 'tombstoned rev reads back undefined').to.equal(undefined);
308
+ // The prior revision still materializes.
309
+ expect((await bs.getBlock(1))?.block.header.id, 'rev 1 still serves the live block').to.equal('parity-tombstone');
310
+ });
311
+ });
312
+ }
313
+ //# sourceMappingURL=raw-storage-conformance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-storage-conformance.js","sourceRoot":"","sources":["../../../src/testing/raw-storage-conformance.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optimystic/db-p2p",
3
- "version": "0.14.0",
3
+ "version": "0.16.2",
4
4
  "type": "module",
5
5
  "description": "P2P database functionality for Optimystic",
6
6
  "main": "dist/src/index.js",
@@ -81,7 +81,7 @@
81
81
  "@libp2p/tcp": "^11.0.10",
82
82
  "@libp2p/websockets": "^10.1.3",
83
83
  "@multiformats/multiaddr": "^13.0.1",
84
- "@optimystic/db-core": "^0.14.0",
84
+ "@optimystic/db-core": "^0.16.2",
85
85
  "async-mutex": "^0.5.0",
86
86
  "debug": "^4.4.3",
87
87
  "it-all": "^3.0.9",
@@ -90,9 +90,9 @@
90
90
  "it-pushable": "^3.2.3",
91
91
  "libp2p": "^3.1.3",
92
92
  "multiformats": "^13.4.2",
93
- "p2p-fret": "^0.5.0",
93
+ "p2p-fret": "^0.6.0",
94
94
  "protons-runtime": "^6.0.0",
95
95
  "uint8arraylist": "^2.4.8",
96
- "uint8arrays": "^5.1.0"
96
+ "uint8arrays": "^6.1.1"
97
97
  }
98
98
  }
@@ -5,6 +5,7 @@ import * as lp from 'it-length-prefixed';
5
5
  import { fromString as u8FromString } from 'uint8arrays/from-string';
6
6
  import { toString as u8ToString } from 'uint8arrays/to-string';
7
7
  import { ProtocolClient } from '../protocol-client.js';
8
+ import { MAX_BLOCK_MESSAGE_BYTES } from '../protocol-limits.js';
8
9
  import { createLogger } from '../logger.js';
9
10
 
10
11
  const log = createLogger('block-transfer-service');
@@ -125,7 +126,7 @@ export class BlockTransferService implements Startable {
125
126
  // keeps both sides live.
126
127
  const responses = pipe(
127
128
  stream,
128
- (source) => lp.decode(source),
129
+ (source) => lp.decode(source, { maxDataLength: MAX_BLOCK_MESSAGE_BYTES }),
129
130
  async function* (source) {
130
131
  for await (const msg of source) {
131
132
  const request = JSON.parse(u8ToString(msg.subarray(), 'utf8')) as BlockTransferRequest;
@@ -263,7 +264,7 @@ export class BlockTransferClient extends ProtocolClient {
263
264
  options?: { signal?: AbortSignal; dialTimeoutMs?: number; responseTimeoutMs?: number }
264
265
  ): Promise<BlockTransferResponse> {
265
266
  const request: BlockTransferRequest = { type: 'pull', blockIds, reason };
266
- return await this.processMessage<BlockTransferResponse>(request, this.protocol, options);
267
+ return await this.processMessage<BlockTransferResponse>(request, this.protocol, { ...options, maxDataLength: MAX_BLOCK_MESSAGE_BYTES });
267
268
  }
268
269
 
269
270
  /**
@@ -291,6 +292,6 @@ export class BlockTransferClient extends ProtocolClient {
291
292
  blockData[blockIds[i]!] = Buffer.from(blockDataBuffers[i]!).toString('base64');
292
293
  }
293
294
  const request: BlockTransferRequest = { type: 'push', blockIds, reason, blockData, ...(blockMeta ? { blockMeta } : {}) };
294
- return await this.processMessage<BlockTransferResponse>(request, this.protocol, options);
295
+ return await this.processMessage<BlockTransferResponse>(request, this.protocol, { ...options, maxDataLength: MAX_BLOCK_MESSAGE_BYTES });
295
296
  }
296
297
  }