@optimystic/db-p2p 0.22.0 → 0.24.1

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 (194) 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/host.js +34 -11
  14. package/dist/src/cohort-topic/host.js.map +1 -1
  15. package/dist/src/cohort-topic/stream-util.d.ts +37 -7
  16. package/dist/src/cohort-topic/stream-util.d.ts.map +1 -1
  17. package/dist/src/cohort-topic/stream-util.js +77 -19
  18. package/dist/src/cohort-topic/stream-util.js.map +1 -1
  19. package/dist/src/dispute/dispute-service.d.ts.map +1 -1
  20. package/dist/src/dispute/dispute-service.js +9 -3
  21. package/dist/src/dispute/dispute-service.js.map +1 -1
  22. package/dist/src/index.d.ts +3 -0
  23. package/dist/src/index.d.ts.map +1 -1
  24. package/dist/src/index.js +3 -0
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/libp2p-key-network.d.ts +88 -2
  27. package/dist/src/libp2p-key-network.d.ts.map +1 -1
  28. package/dist/src/libp2p-key-network.js +134 -28
  29. package/dist/src/libp2p-key-network.js.map +1 -1
  30. package/dist/src/libp2p-node-base.d.ts.map +1 -1
  31. package/dist/src/libp2p-node-base.js +25 -1
  32. package/dist/src/libp2p-node-base.js.map +1 -1
  33. package/dist/src/logger.d.ts +17 -1
  34. package/dist/src/logger.d.ts.map +1 -1
  35. package/dist/src/logger.js +19 -2
  36. package/dist/src/logger.js.map +1 -1
  37. package/dist/src/matchmaking/query-transport.js +3 -3
  38. package/dist/src/matchmaking/query-transport.js.map +1 -1
  39. package/dist/src/owned-block-seed.d.ts +6 -3
  40. package/dist/src/owned-block-seed.d.ts.map +1 -1
  41. package/dist/src/owned-block-seed.js +16 -3
  42. package/dist/src/owned-block-seed.js.map +1 -1
  43. package/dist/src/peer-address-book.d.ts +72 -0
  44. package/dist/src/peer-address-book.d.ts.map +1 -0
  45. package/dist/src/peer-address-book.js +123 -0
  46. package/dist/src/peer-address-book.js.map +1 -0
  47. package/dist/src/reactivity/notify-transport.d.ts +4 -4
  48. package/dist/src/reactivity/notify-transport.js +6 -6
  49. package/dist/src/reactivity/notify-transport.js.map +1 -1
  50. package/dist/src/reactivity/push-state-gossip.js +2 -2
  51. package/dist/src/reactivity/push-state-gossip.js.map +1 -1
  52. package/dist/src/reactivity/recover-transport.d.ts +6 -2
  53. package/dist/src/reactivity/recover-transport.d.ts.map +1 -1
  54. package/dist/src/reactivity/recover-transport.js +7 -3
  55. package/dist/src/reactivity/recover-transport.js.map +1 -1
  56. package/dist/src/repo/client.d.ts.map +1 -1
  57. package/dist/src/repo/client.js +11 -2
  58. package/dist/src/repo/client.js.map +1 -1
  59. package/dist/src/repo/cluster-coordinator.d.ts +30 -0
  60. package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
  61. package/dist/src/repo/cluster-coordinator.js +95 -3
  62. package/dist/src/repo/cluster-coordinator.js.map +1 -1
  63. package/dist/src/repo/coordinator-repo.d.ts +62 -9
  64. package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
  65. package/dist/src/repo/coordinator-repo.js +242 -73
  66. package/dist/src/repo/coordinator-repo.js.map +1 -1
  67. package/dist/src/rn.d.ts +3 -0
  68. package/dist/src/rn.d.ts.map +1 -1
  69. package/dist/src/rn.js +3 -0
  70. package/dist/src/rn.js.map +1 -1
  71. package/dist/src/storage/cached-raw-storage.d.ts +83 -0
  72. package/dist/src/storage/cached-raw-storage.d.ts.map +1 -0
  73. package/dist/src/storage/cached-raw-storage.js +152 -0
  74. package/dist/src/storage/cached-raw-storage.js.map +1 -0
  75. package/dist/src/storage/cached-store-driver.d.ts +186 -0
  76. package/dist/src/storage/cached-store-driver.d.ts.map +1 -0
  77. package/dist/src/storage/cached-store-driver.js +775 -0
  78. package/dist/src/storage/cached-store-driver.js.map +1 -0
  79. package/dist/src/storage/i-raw-storage.d.ts +12 -5
  80. package/dist/src/storage/i-raw-storage.d.ts.map +1 -1
  81. package/dist/src/storage/shared-cache-pool.d.ts +234 -0
  82. package/dist/src/storage/shared-cache-pool.d.ts.map +1 -0
  83. package/dist/src/storage/shared-cache-pool.js +354 -0
  84. package/dist/src/storage/shared-cache-pool.js.map +1 -0
  85. package/dist/src/testing/cohort-topic-mesh-harness.d.ts +13 -6
  86. package/dist/src/testing/cohort-topic-mesh-harness.d.ts.map +1 -1
  87. package/dist/src/testing/cohort-topic-mesh-harness.js +15 -6
  88. package/dist/src/testing/cohort-topic-mesh-harness.js.map +1 -1
  89. package/dist/src/testing/raw-storage-conformance.d.ts +2 -1
  90. package/dist/src/testing/raw-storage-conformance.d.ts.map +1 -1
  91. package/dist/src/testing/raw-storage-conformance.js +35 -2
  92. package/dist/src/testing/raw-storage-conformance.js.map +1 -1
  93. package/package.json +3 -3
  94. package/readme.md +668 -668
  95. package/src/cluster/block-transfer.ts +424 -424
  96. package/src/cluster/client.ts +119 -88
  97. package/src/cluster/cluster-error.ts +64 -64
  98. package/src/cluster/cluster-policy.ts +203 -203
  99. package/src/cluster/cluster-repo.ts +242 -122
  100. package/src/cluster/cluster-size-coupling.ts +45 -45
  101. package/src/cluster/commit-cert.ts +139 -139
  102. package/src/cluster/i-transaction-state-store.ts +43 -43
  103. package/src/cluster/memory-transaction-state-store.ts +56 -56
  104. package/src/cluster/peer-key-binding.ts +37 -37
  105. package/src/cluster/persistent-transaction-state-store.ts +92 -92
  106. package/src/cluster/quorum-restore.ts +223 -223
  107. package/src/cluster/reconcile-block.ts +203 -203
  108. package/src/cluster/service.ts +293 -241
  109. package/src/cluster/supermajority-coupling.ts +37 -37
  110. package/src/cohort-topic/bootstrap-evidence-builder.ts +122 -122
  111. package/src/cohort-topic/bootstrap-evidence-verifiers.ts +132 -132
  112. package/src/cohort-topic/bootstrap-parent-reference.ts +159 -159
  113. package/src/cohort-topic/change-bridge.ts +109 -109
  114. package/src/cohort-topic/cohort-gossip-driver.ts +231 -231
  115. package/src/cohort-topic/cohort-gossip-transport.ts +84 -84
  116. package/src/cohort-topic/fret-trust-anchor.ts +153 -153
  117. package/src/cohort-topic/host.ts +42 -11
  118. package/src/cohort-topic/index.ts +13 -13
  119. package/src/cohort-topic/membership-publish-sink.ts +20 -20
  120. package/src/cohort-topic/membership-source.ts +68 -68
  121. package/src/cohort-topic/peer-codec.ts +31 -31
  122. package/src/cohort-topic/peer-sig.ts +86 -86
  123. package/src/cohort-topic/protocols.ts +71 -71
  124. package/src/cohort-topic/reactivity-membership-gate.ts +77 -77
  125. package/src/cohort-topic/size-estimator.ts +16 -16
  126. package/src/cohort-topic/stream-util.ts +79 -19
  127. package/src/cohort-topic/threshold-crypto.ts +239 -239
  128. package/src/cohort-topic/topic-router.ts +77 -77
  129. package/src/dispute/arbitrator-selection.ts +138 -138
  130. package/src/dispute/cascade.ts +524 -524
  131. package/src/dispute/dispute-service.ts +11 -5
  132. package/src/dispute/invalidation.ts +625 -625
  133. package/src/inbound-authorization.ts +190 -190
  134. package/src/index.ts +52 -49
  135. package/src/libp2p-key-network.ts +1120 -990
  136. package/src/libp2p-node-base.ts +1675 -1651
  137. package/src/libp2p-node-rn.ts +30 -30
  138. package/src/libp2p-node.ts +36 -36
  139. package/src/logger.ts +19 -2
  140. package/src/matchmaking/aggregate-counts.ts +104 -104
  141. package/src/matchmaking/index.ts +20 -20
  142. package/src/matchmaking/module.ts +363 -363
  143. package/src/matchmaking/protocols.ts +51 -51
  144. package/src/matchmaking/provider-manager.ts +95 -95
  145. package/src/matchmaking/query-handler.ts +88 -88
  146. package/src/matchmaking/query-transport.ts +3 -3
  147. package/src/matchmaking/seeker-manager.ts +64 -64
  148. package/src/matchmaking/seeker-walk-client.ts +293 -293
  149. package/src/matchmaking/traffic-validation.ts +195 -195
  150. package/src/optimystic-node.ts +36 -36
  151. package/src/owned-block-seed.ts +53 -40
  152. package/src/peer-address-book.ts +149 -0
  153. package/src/protocol-limits.ts +33 -33
  154. package/src/reactivity/forwarder-host.ts +438 -438
  155. package/src/reactivity/index.ts +19 -19
  156. package/src/reactivity/notify-transport.ts +144 -144
  157. package/src/reactivity/origination-manager.ts +192 -192
  158. package/src/reactivity/protocols.ts +61 -61
  159. package/src/reactivity/push-state-gossip.ts +291 -291
  160. package/src/reactivity/recover-transport.ts +7 -3
  161. package/src/reactivity/rotation-rereg-scheduler.ts +256 -256
  162. package/src/reactivity/subscriber-registry.ts +96 -96
  163. package/src/reactivity/subscription-manager.ts +450 -450
  164. package/src/reactivity/topic-bytes.ts +37 -37
  165. package/src/repo/client.ts +12 -2
  166. package/src/repo/cluster-coordinator.ts +99 -3
  167. package/src/repo/coordinator-repo.ts +281 -74
  168. package/src/repo/types.ts +7 -7
  169. package/src/rn.ts +39 -36
  170. package/src/rpc-deadline.ts +45 -45
  171. package/src/storage/arachnode-partition.ts +74 -74
  172. package/src/storage/cached-raw-storage.ts +180 -0
  173. package/src/storage/cached-store-driver.ts +859 -0
  174. package/src/storage/i-kv-store.ts +8 -8
  175. package/src/storage/i-raw-storage.ts +12 -5
  176. package/src/storage/kv-raw-storage.ts +135 -135
  177. package/src/storage/memory-kv-store.ts +28 -28
  178. package/src/storage/memory-storage.ts +25 -25
  179. package/src/storage/memory-store-driver.ts +157 -157
  180. package/src/storage/raw-store-codec.ts +42 -42
  181. package/src/storage/raw-store-driver.ts +80 -80
  182. package/src/storage/ring-selector.ts +317 -317
  183. package/src/storage/ring-shift-coordinator.ts +271 -271
  184. package/src/storage/shared-cache-pool.ts +452 -0
  185. package/src/storage/storage-repo.ts +1014 -1014
  186. package/src/testing/cohort-topic-mesh-harness.ts +673 -663
  187. package/src/testing/index.ts +8 -8
  188. package/src/testing/matchmaking-mesh-harness.ts +475 -475
  189. package/src/testing/raw-storage-conformance.ts +453 -417
  190. package/src/testing/reactivity-mesh-harness.ts +922 -922
  191. package/dist/src/storage/restoration-coordinator-v2.d.ts +0 -67
  192. package/dist/src/storage/restoration-coordinator-v2.d.ts.map +0 -1
  193. package/dist/src/storage/restoration-coordinator-v2.js +0 -172
  194. 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
+ }