@optimystic/db-p2p 0.22.0 → 0.24.0

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 (177) hide show
  1. package/dist/src/cluster/client.d.ts +10 -0
  2. package/dist/src/cluster/client.d.ts.map +1 -1
  3. package/dist/src/cluster/client.js +30 -1
  4. package/dist/src/cluster/client.js.map +1 -1
  5. package/dist/src/cluster/cluster-repo.d.ts +39 -14
  6. package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
  7. package/dist/src/cluster/cluster-repo.js +226 -119
  8. package/dist/src/cluster/cluster-repo.js.map +1 -1
  9. package/dist/src/cluster/service.d.ts +32 -1
  10. package/dist/src/cluster/service.d.ts.map +1 -1
  11. package/dist/src/cluster/service.js +43 -2
  12. package/dist/src/cluster/service.js.map +1 -1
  13. package/dist/src/cohort-topic/stream-util.d.ts +22 -6
  14. package/dist/src/cohort-topic/stream-util.d.ts.map +1 -1
  15. package/dist/src/cohort-topic/stream-util.js +56 -10
  16. package/dist/src/cohort-topic/stream-util.js.map +1 -1
  17. package/dist/src/dispute/dispute-service.d.ts.map +1 -1
  18. package/dist/src/dispute/dispute-service.js +9 -3
  19. package/dist/src/dispute/dispute-service.js.map +1 -1
  20. package/dist/src/index.d.ts +3 -0
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +3 -0
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/libp2p-key-network.d.ts +88 -2
  25. package/dist/src/libp2p-key-network.d.ts.map +1 -1
  26. package/dist/src/libp2p-key-network.js +134 -28
  27. package/dist/src/libp2p-key-network.js.map +1 -1
  28. package/dist/src/libp2p-node-base.d.ts.map +1 -1
  29. package/dist/src/libp2p-node-base.js +25 -1
  30. package/dist/src/libp2p-node-base.js.map +1 -1
  31. package/dist/src/logger.d.ts +17 -1
  32. package/dist/src/logger.d.ts.map +1 -1
  33. package/dist/src/logger.js +19 -2
  34. package/dist/src/logger.js.map +1 -1
  35. package/dist/src/owned-block-seed.d.ts +6 -3
  36. package/dist/src/owned-block-seed.d.ts.map +1 -1
  37. package/dist/src/owned-block-seed.js +16 -3
  38. package/dist/src/owned-block-seed.js.map +1 -1
  39. package/dist/src/peer-address-book.d.ts +72 -0
  40. package/dist/src/peer-address-book.d.ts.map +1 -0
  41. package/dist/src/peer-address-book.js +123 -0
  42. package/dist/src/peer-address-book.js.map +1 -0
  43. package/dist/src/repo/client.d.ts.map +1 -1
  44. package/dist/src/repo/client.js +11 -2
  45. package/dist/src/repo/client.js.map +1 -1
  46. package/dist/src/repo/cluster-coordinator.d.ts +30 -0
  47. package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
  48. package/dist/src/repo/cluster-coordinator.js +95 -3
  49. package/dist/src/repo/cluster-coordinator.js.map +1 -1
  50. package/dist/src/repo/coordinator-repo.d.ts +62 -9
  51. package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
  52. package/dist/src/repo/coordinator-repo.js +242 -73
  53. package/dist/src/repo/coordinator-repo.js.map +1 -1
  54. package/dist/src/rn.d.ts +3 -0
  55. package/dist/src/rn.d.ts.map +1 -1
  56. package/dist/src/rn.js +3 -0
  57. package/dist/src/rn.js.map +1 -1
  58. package/dist/src/storage/cached-raw-storage.d.ts +83 -0
  59. package/dist/src/storage/cached-raw-storage.d.ts.map +1 -0
  60. package/dist/src/storage/cached-raw-storage.js +152 -0
  61. package/dist/src/storage/cached-raw-storage.js.map +1 -0
  62. package/dist/src/storage/cached-store-driver.d.ts +186 -0
  63. package/dist/src/storage/cached-store-driver.d.ts.map +1 -0
  64. package/dist/src/storage/cached-store-driver.js +775 -0
  65. package/dist/src/storage/cached-store-driver.js.map +1 -0
  66. package/dist/src/storage/i-raw-storage.d.ts +12 -5
  67. package/dist/src/storage/i-raw-storage.d.ts.map +1 -1
  68. package/dist/src/storage/shared-cache-pool.d.ts +234 -0
  69. package/dist/src/storage/shared-cache-pool.d.ts.map +1 -0
  70. package/dist/src/storage/shared-cache-pool.js +354 -0
  71. package/dist/src/storage/shared-cache-pool.js.map +1 -0
  72. package/dist/src/testing/raw-storage-conformance.d.ts +2 -1
  73. package/dist/src/testing/raw-storage-conformance.d.ts.map +1 -1
  74. package/dist/src/testing/raw-storage-conformance.js +35 -2
  75. package/dist/src/testing/raw-storage-conformance.js.map +1 -1
  76. package/package.json +3 -3
  77. package/readme.md +668 -668
  78. package/src/cluster/block-transfer.ts +424 -424
  79. package/src/cluster/client.ts +119 -88
  80. package/src/cluster/cluster-error.ts +64 -64
  81. package/src/cluster/cluster-policy.ts +203 -203
  82. package/src/cluster/cluster-repo.ts +242 -122
  83. package/src/cluster/cluster-size-coupling.ts +45 -45
  84. package/src/cluster/commit-cert.ts +139 -139
  85. package/src/cluster/i-transaction-state-store.ts +43 -43
  86. package/src/cluster/memory-transaction-state-store.ts +56 -56
  87. package/src/cluster/peer-key-binding.ts +37 -37
  88. package/src/cluster/persistent-transaction-state-store.ts +92 -92
  89. package/src/cluster/quorum-restore.ts +223 -223
  90. package/src/cluster/reconcile-block.ts +203 -203
  91. package/src/cluster/service.ts +293 -241
  92. package/src/cluster/supermajority-coupling.ts +37 -37
  93. package/src/cohort-topic/bootstrap-evidence-builder.ts +122 -122
  94. package/src/cohort-topic/bootstrap-evidence-verifiers.ts +132 -132
  95. package/src/cohort-topic/bootstrap-parent-reference.ts +159 -159
  96. package/src/cohort-topic/change-bridge.ts +109 -109
  97. package/src/cohort-topic/cohort-gossip-driver.ts +231 -231
  98. package/src/cohort-topic/cohort-gossip-transport.ts +84 -84
  99. package/src/cohort-topic/fret-trust-anchor.ts +153 -153
  100. package/src/cohort-topic/host.ts +2901 -2901
  101. package/src/cohort-topic/index.ts +13 -13
  102. package/src/cohort-topic/membership-publish-sink.ts +20 -20
  103. package/src/cohort-topic/membership-source.ts +68 -68
  104. package/src/cohort-topic/peer-codec.ts +31 -31
  105. package/src/cohort-topic/peer-sig.ts +86 -86
  106. package/src/cohort-topic/protocols.ts +71 -71
  107. package/src/cohort-topic/reactivity-membership-gate.ts +77 -77
  108. package/src/cohort-topic/size-estimator.ts +16 -16
  109. package/src/cohort-topic/stream-util.ts +135 -87
  110. package/src/cohort-topic/threshold-crypto.ts +239 -239
  111. package/src/cohort-topic/topic-router.ts +77 -77
  112. package/src/dispute/arbitrator-selection.ts +138 -138
  113. package/src/dispute/cascade.ts +524 -524
  114. package/src/dispute/dispute-service.ts +11 -5
  115. package/src/dispute/invalidation.ts +625 -625
  116. package/src/inbound-authorization.ts +190 -190
  117. package/src/index.ts +52 -49
  118. package/src/libp2p-key-network.ts +1120 -990
  119. package/src/libp2p-node-base.ts +1675 -1651
  120. package/src/libp2p-node-rn.ts +30 -30
  121. package/src/libp2p-node.ts +36 -36
  122. package/src/logger.ts +19 -2
  123. package/src/matchmaking/aggregate-counts.ts +104 -104
  124. package/src/matchmaking/index.ts +20 -20
  125. package/src/matchmaking/module.ts +363 -363
  126. package/src/matchmaking/protocols.ts +51 -51
  127. package/src/matchmaking/provider-manager.ts +95 -95
  128. package/src/matchmaking/query-handler.ts +88 -88
  129. package/src/matchmaking/query-transport.ts +492 -492
  130. package/src/matchmaking/seeker-manager.ts +64 -64
  131. package/src/matchmaking/seeker-walk-client.ts +293 -293
  132. package/src/matchmaking/traffic-validation.ts +195 -195
  133. package/src/optimystic-node.ts +36 -36
  134. package/src/owned-block-seed.ts +53 -40
  135. package/src/peer-address-book.ts +149 -0
  136. package/src/protocol-limits.ts +33 -33
  137. package/src/reactivity/forwarder-host.ts +438 -438
  138. package/src/reactivity/index.ts +19 -19
  139. package/src/reactivity/notify-transport.ts +144 -144
  140. package/src/reactivity/origination-manager.ts +192 -192
  141. package/src/reactivity/protocols.ts +61 -61
  142. package/src/reactivity/push-state-gossip.ts +291 -291
  143. package/src/reactivity/recover-transport.ts +408 -408
  144. package/src/reactivity/rotation-rereg-scheduler.ts +256 -256
  145. package/src/reactivity/subscriber-registry.ts +96 -96
  146. package/src/reactivity/subscription-manager.ts +450 -450
  147. package/src/reactivity/topic-bytes.ts +37 -37
  148. package/src/repo/client.ts +12 -2
  149. package/src/repo/cluster-coordinator.ts +99 -3
  150. package/src/repo/coordinator-repo.ts +281 -74
  151. package/src/repo/types.ts +7 -7
  152. package/src/rn.ts +39 -36
  153. package/src/rpc-deadline.ts +45 -45
  154. package/src/storage/arachnode-partition.ts +74 -74
  155. package/src/storage/cached-raw-storage.ts +180 -0
  156. package/src/storage/cached-store-driver.ts +859 -0
  157. package/src/storage/i-kv-store.ts +8 -8
  158. package/src/storage/i-raw-storage.ts +12 -5
  159. package/src/storage/kv-raw-storage.ts +135 -135
  160. package/src/storage/memory-kv-store.ts +28 -28
  161. package/src/storage/memory-storage.ts +25 -25
  162. package/src/storage/memory-store-driver.ts +157 -157
  163. package/src/storage/raw-store-codec.ts +42 -42
  164. package/src/storage/raw-store-driver.ts +80 -80
  165. package/src/storage/ring-selector.ts +317 -317
  166. package/src/storage/ring-shift-coordinator.ts +271 -271
  167. package/src/storage/shared-cache-pool.ts +452 -0
  168. package/src/storage/storage-repo.ts +1014 -1014
  169. package/src/testing/cohort-topic-mesh-harness.ts +663 -663
  170. package/src/testing/index.ts +8 -8
  171. package/src/testing/matchmaking-mesh-harness.ts +475 -475
  172. package/src/testing/raw-storage-conformance.ts +453 -417
  173. package/src/testing/reactivity-mesh-harness.ts +922 -922
  174. package/dist/src/storage/restoration-coordinator-v2.d.ts +0 -67
  175. package/dist/src/storage/restoration-coordinator-v2.d.ts.map +0 -1
  176. package/dist/src/storage/restoration-coordinator-v2.js +0 -172
  177. package/dist/src/storage/restoration-coordinator-v2.js.map +0 -1
@@ -1,96 +1,96 @@
1
- /**
2
- * Reactivity — node-level subscriber registry (the socket-delivery → subscription-manager seam).
3
- *
4
- * A {@link import("./subscription-manager.js").ReactivitySubscriptionManager} owns the verify/dedupe/deliver
5
- * path for one subscription but is transport-agnostic: it exposes `onNotification(n)` and never touches a
6
- * socket. This registry is the routing table that connects a socket-delivered {@link NotificationV1} to the
7
- * right manager(s): the forwarder host's `deliverLocal(topicId, n)` looks topic up here and invokes every
8
- * manager registered for it, and a constructed manager registers its `onNotification` keyed by the reactivity
9
- * `topicId` it subscribed under.
10
- *
11
- * Keyed by topicId-base64url. A manager subscribes under `topicId = reactivityTopicId(reactivityTailBytes(
12
- * tailId))` (the same anchor origination derives), so a notification's topic — derived by the forwarder host
13
- * from the notification's tail anchor — routes to exactly the managers watching that tail's collection.
14
- *
15
- * **Scope.** This delivers socket-routed notifications into a manager that was *already constructed* and
16
- * registered. Constructing the manager from a Quereus `Database.watch` (the application bridge) stays the
17
- * backlog item `optimystic-network-reactive-watch-integration-test`; this registry is the plug it will use.
18
- */
19
-
20
- import { bytesToB64url, type NotificationV1 } from "@optimystic/db-core";
21
- import { createLogger } from "../logger.js";
22
-
23
- const log = createLogger("reactivity-subscribers");
24
-
25
- /** A subscriber's inbound seam — a manager's `onNotification` (which returns a delivery outcome promise). */
26
- export type ReactivityNotificationHandler = (n: NotificationV1) => void | Promise<unknown>;
27
-
28
- /**
29
- * The node's `topicId → subscriber handlers` table. Exposed on the node as `reactivitySubscribers` so a
30
- * subscribe factory can register a {@link import("./subscription-manager.js").ReactivitySubscriptionManager}
31
- * and have socket-delivered notifications routed to it.
32
- */
33
- export class ReactivitySubscriberRegistry {
34
- private readonly byTopic = new Map<string, Set<ReactivityNotificationHandler>>();
35
-
36
- /**
37
- * Register `onNotification` to receive every notification the node delivers for `topicId`. Multiple
38
- * managers may register for one topic (each gets every notification). Returns an idempotent unregister.
39
- */
40
- register(topicId: Uint8Array, onNotification: ReactivityNotificationHandler): () => void {
41
- const key = bytesToB64url(topicId);
42
- let handlers = this.byTopic.get(key);
43
- if (handlers === undefined) {
44
- handlers = new Set();
45
- this.byTopic.set(key, handlers);
46
- }
47
- handlers.add(onNotification);
48
- return (): void => this.unregister(topicId, onNotification);
49
- }
50
-
51
- /** Drop a previously-registered handler; idempotent (a no-op if it was never registered / already gone). */
52
- unregister(topicId: Uint8Array, onNotification: ReactivityNotificationHandler): void {
53
- const key = bytesToB64url(topicId);
54
- const handlers = this.byTopic.get(key);
55
- if (handlers === undefined) {
56
- return;
57
- }
58
- handlers.delete(onNotification);
59
- if (handlers.size === 0) {
60
- this.byTopic.delete(key);
61
- }
62
- }
63
-
64
- /**
65
- * Deliver `n` to every handler registered for `topicId` (the forwarder host's `deliverLocal` seam). Each
66
- * handler is isolated: a synchronous throw or a rejected delivery promise is logged, never propagated —
67
- * one faulty subscriber must not break delivery to the rest or the fan-out loop that called this.
68
- */
69
- deliver(topicId: Uint8Array, n: NotificationV1): void {
70
- const handlers = this.byTopic.get(bytesToB64url(topicId));
71
- if (handlers === undefined) {
72
- return;
73
- }
74
- // Snapshot: a handler that unregisters itself on delivery would otherwise mutate the live set.
75
- for (const handler of [...handlers]) {
76
- try {
77
- const result = handler(n);
78
- if (result instanceof Promise) {
79
- result.catch((err: unknown) => log("subscriber delivery rejected (isolated) for rev=%d: %o", n.revision, err));
80
- }
81
- } catch (err) {
82
- log("subscriber handler threw (isolated) for rev=%d: %o", n.revision, err);
83
- }
84
- }
85
- }
86
-
87
- /** Number of topics with at least one registered subscriber (diagnostic / test). */
88
- get topicCount(): number {
89
- return this.byTopic.size;
90
- }
91
-
92
- /** Whether any subscriber is registered for `topicId` (diagnostic / test). */
93
- has(topicId: Uint8Array): boolean {
94
- return this.byTopic.has(bytesToB64url(topicId));
95
- }
96
- }
1
+ /**
2
+ * Reactivity — node-level subscriber registry (the socket-delivery → subscription-manager seam).
3
+ *
4
+ * A {@link import("./subscription-manager.js").ReactivitySubscriptionManager} owns the verify/dedupe/deliver
5
+ * path for one subscription but is transport-agnostic: it exposes `onNotification(n)` and never touches a
6
+ * socket. This registry is the routing table that connects a socket-delivered {@link NotificationV1} to the
7
+ * right manager(s): the forwarder host's `deliverLocal(topicId, n)` looks topic up here and invokes every
8
+ * manager registered for it, and a constructed manager registers its `onNotification` keyed by the reactivity
9
+ * `topicId` it subscribed under.
10
+ *
11
+ * Keyed by topicId-base64url. A manager subscribes under `topicId = reactivityTopicId(reactivityTailBytes(
12
+ * tailId))` (the same anchor origination derives), so a notification's topic — derived by the forwarder host
13
+ * from the notification's tail anchor — routes to exactly the managers watching that tail's collection.
14
+ *
15
+ * **Scope.** This delivers socket-routed notifications into a manager that was *already constructed* and
16
+ * registered. Constructing the manager from a Quereus `Database.watch` (the application bridge) stays the
17
+ * backlog item `optimystic-network-reactive-watch-integration-test`; this registry is the plug it will use.
18
+ */
19
+
20
+ import { bytesToB64url, type NotificationV1 } from "@optimystic/db-core";
21
+ import { createLogger } from "../logger.js";
22
+
23
+ const log = createLogger("reactivity-subscribers");
24
+
25
+ /** A subscriber's inbound seam — a manager's `onNotification` (which returns a delivery outcome promise). */
26
+ export type ReactivityNotificationHandler = (n: NotificationV1) => void | Promise<unknown>;
27
+
28
+ /**
29
+ * The node's `topicId → subscriber handlers` table. Exposed on the node as `reactivitySubscribers` so a
30
+ * subscribe factory can register a {@link import("./subscription-manager.js").ReactivitySubscriptionManager}
31
+ * and have socket-delivered notifications routed to it.
32
+ */
33
+ export class ReactivitySubscriberRegistry {
34
+ private readonly byTopic = new Map<string, Set<ReactivityNotificationHandler>>();
35
+
36
+ /**
37
+ * Register `onNotification` to receive every notification the node delivers for `topicId`. Multiple
38
+ * managers may register for one topic (each gets every notification). Returns an idempotent unregister.
39
+ */
40
+ register(topicId: Uint8Array, onNotification: ReactivityNotificationHandler): () => void {
41
+ const key = bytesToB64url(topicId);
42
+ let handlers = this.byTopic.get(key);
43
+ if (handlers === undefined) {
44
+ handlers = new Set();
45
+ this.byTopic.set(key, handlers);
46
+ }
47
+ handlers.add(onNotification);
48
+ return (): void => this.unregister(topicId, onNotification);
49
+ }
50
+
51
+ /** Drop a previously-registered handler; idempotent (a no-op if it was never registered / already gone). */
52
+ unregister(topicId: Uint8Array, onNotification: ReactivityNotificationHandler): void {
53
+ const key = bytesToB64url(topicId);
54
+ const handlers = this.byTopic.get(key);
55
+ if (handlers === undefined) {
56
+ return;
57
+ }
58
+ handlers.delete(onNotification);
59
+ if (handlers.size === 0) {
60
+ this.byTopic.delete(key);
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Deliver `n` to every handler registered for `topicId` (the forwarder host's `deliverLocal` seam). Each
66
+ * handler is isolated: a synchronous throw or a rejected delivery promise is logged, never propagated —
67
+ * one faulty subscriber must not break delivery to the rest or the fan-out loop that called this.
68
+ */
69
+ deliver(topicId: Uint8Array, n: NotificationV1): void {
70
+ const handlers = this.byTopic.get(bytesToB64url(topicId));
71
+ if (handlers === undefined) {
72
+ return;
73
+ }
74
+ // Snapshot: a handler that unregisters itself on delivery would otherwise mutate the live set.
75
+ for (const handler of [...handlers]) {
76
+ try {
77
+ const result = handler(n);
78
+ if (result instanceof Promise) {
79
+ result.catch((err: unknown) => log("subscriber delivery rejected (isolated) for rev=%d: %o", n.revision, err));
80
+ }
81
+ } catch (err) {
82
+ log("subscriber handler threw (isolated) for rev=%d: %o", n.revision, err);
83
+ }
84
+ }
85
+ }
86
+
87
+ /** Number of topics with at least one registered subscriber (diagnostic / test). */
88
+ get topicCount(): number {
89
+ return this.byTopic.size;
90
+ }
91
+
92
+ /** Whether any subscriber is registered for `topicId` (diagnostic / test). */
93
+ has(topicId: Uint8Array): boolean {
94
+ return this.byTopic.has(bytesToB64url(topicId));
95
+ }
96
+ }