@optimystic/db-p2p 0.13.4 → 0.14.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.
- package/README.md +6 -6
- package/dist/src/cluster/block-transfer-service.d.ts +67 -8
- package/dist/src/cluster/block-transfer-service.d.ts.map +1 -1
- package/dist/src/cluster/block-transfer-service.js +101 -62
- package/dist/src/cluster/block-transfer-service.js.map +1 -1
- package/dist/src/cluster/client.d.ts +18 -1
- package/dist/src/cluster/client.d.ts.map +1 -1
- package/dist/src/cluster/client.js +55 -39
- package/dist/src/cluster/client.js.map +1 -1
- package/dist/src/cluster/cluster-error.d.ts +38 -0
- package/dist/src/cluster/cluster-error.d.ts.map +1 -0
- package/dist/src/cluster/cluster-error.js +51 -0
- package/dist/src/cluster/cluster-error.js.map +1 -0
- package/dist/src/cluster/cluster-repo.d.ts +135 -3
- package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
- package/dist/src/cluster/cluster-repo.js +333 -58
- package/dist/src/cluster/cluster-repo.js.map +1 -1
- package/dist/src/cluster/commit-cert.d.ts +63 -0
- package/dist/src/cluster/commit-cert.d.ts.map +1 -0
- package/dist/src/cluster/commit-cert.js +108 -0
- package/dist/src/cluster/commit-cert.js.map +1 -0
- package/dist/src/cluster/service.d.ts +46 -11
- package/dist/src/cluster/service.d.ts.map +1 -1
- package/dist/src/cluster/service.js +97 -33
- package/dist/src/cluster/service.js.map +1 -1
- package/dist/src/cluster/spread-on-churn.d.ts +13 -0
- package/dist/src/cluster/spread-on-churn.d.ts.map +1 -1
- package/dist/src/cluster/spread-on-churn.js +34 -4
- package/dist/src/cluster/spread-on-churn.js.map +1 -1
- package/dist/src/cohort-topic/bootstrap-evidence-builder.d.ts +59 -0
- package/dist/src/cohort-topic/bootstrap-evidence-builder.d.ts.map +1 -0
- package/dist/src/cohort-topic/bootstrap-evidence-builder.js +79 -0
- package/dist/src/cohort-topic/bootstrap-evidence-builder.js.map +1 -0
- package/dist/src/cohort-topic/bootstrap-evidence-verifiers.d.ts +81 -0
- package/dist/src/cohort-topic/bootstrap-evidence-verifiers.d.ts.map +1 -0
- package/dist/src/cohort-topic/bootstrap-evidence-verifiers.js +93 -0
- package/dist/src/cohort-topic/bootstrap-evidence-verifiers.js.map +1 -0
- package/dist/src/cohort-topic/bootstrap-parent-reference.d.ts +108 -0
- package/dist/src/cohort-topic/bootstrap-parent-reference.d.ts.map +1 -0
- package/dist/src/cohort-topic/bootstrap-parent-reference.js +108 -0
- package/dist/src/cohort-topic/bootstrap-parent-reference.js.map +1 -0
- package/dist/src/cohort-topic/change-bridge.d.ts +65 -0
- package/dist/src/cohort-topic/change-bridge.d.ts.map +1 -0
- package/dist/src/cohort-topic/change-bridge.js +76 -0
- package/dist/src/cohort-topic/change-bridge.js.map +1 -0
- package/dist/src/cohort-topic/cohort-gossip-driver.d.ts +74 -0
- package/dist/src/cohort-topic/cohort-gossip-driver.d.ts.map +1 -0
- package/dist/src/cohort-topic/cohort-gossip-driver.js +87 -0
- package/dist/src/cohort-topic/cohort-gossip-driver.js.map +1 -0
- package/dist/src/cohort-topic/cohort-gossip-transport.d.ts +42 -0
- package/dist/src/cohort-topic/cohort-gossip-transport.d.ts.map +1 -0
- package/dist/src/cohort-topic/cohort-gossip-transport.js +57 -0
- package/dist/src/cohort-topic/cohort-gossip-transport.js.map +1 -0
- package/dist/src/cohort-topic/fret-trust-anchor.d.ts +100 -0
- package/dist/src/cohort-topic/fret-trust-anchor.d.ts.map +1 -0
- package/dist/src/cohort-topic/fret-trust-anchor.js +115 -0
- package/dist/src/cohort-topic/fret-trust-anchor.js.map +1 -0
- package/dist/src/cohort-topic/host.d.ts +573 -0
- package/dist/src/cohort-topic/host.d.ts.map +1 -0
- package/dist/src/cohort-topic/host.js +1460 -0
- package/dist/src/cohort-topic/host.js.map +1 -0
- package/dist/src/cohort-topic/index.d.ts +14 -0
- package/dist/src/cohort-topic/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/index.js +14 -0
- package/dist/src/cohort-topic/index.js.map +1 -0
- package/dist/src/cohort-topic/membership-publish-sink.d.ts +14 -0
- package/dist/src/cohort-topic/membership-publish-sink.d.ts.map +1 -0
- package/dist/src/cohort-topic/membership-publish-sink.js +17 -0
- package/dist/src/cohort-topic/membership-publish-sink.js.map +1 -0
- package/dist/src/cohort-topic/membership-source.d.ts +36 -0
- package/dist/src/cohort-topic/membership-source.d.ts.map +1 -0
- package/dist/src/cohort-topic/membership-source.js +58 -0
- package/dist/src/cohort-topic/membership-source.js.map +1 -0
- package/dist/src/cohort-topic/peer-codec.d.ts +18 -0
- package/dist/src/cohort-topic/peer-codec.d.ts.map +1 -0
- package/dist/src/cohort-topic/peer-codec.js +26 -0
- package/dist/src/cohort-topic/peer-codec.js.map +1 -0
- package/dist/src/cohort-topic/peer-sig.d.ts +52 -0
- package/dist/src/cohort-topic/peer-sig.d.ts.map +1 -0
- package/dist/src/cohort-topic/peer-sig.js +83 -0
- package/dist/src/cohort-topic/peer-sig.js.map +1 -0
- package/dist/src/cohort-topic/protocols.d.ts +49 -0
- package/dist/src/cohort-topic/protocols.d.ts.map +1 -0
- package/dist/src/cohort-topic/protocols.js +58 -0
- package/dist/src/cohort-topic/protocols.js.map +1 -0
- package/dist/src/cohort-topic/reactivity-membership-gate.d.ts +49 -0
- package/dist/src/cohort-topic/reactivity-membership-gate.d.ts.map +1 -0
- package/dist/src/cohort-topic/reactivity-membership-gate.js +42 -0
- package/dist/src/cohort-topic/reactivity-membership-gate.js.map +1 -0
- package/dist/src/cohort-topic/size-estimator.d.ts +16 -0
- package/dist/src/cohort-topic/size-estimator.d.ts.map +1 -0
- package/dist/src/cohort-topic/size-estimator.js +16 -0
- package/dist/src/cohort-topic/size-estimator.js.map +1 -0
- package/dist/src/cohort-topic/stream-util.d.ts +19 -0
- package/dist/src/cohort-topic/stream-util.d.ts.map +1 -0
- package/dist/src/cohort-topic/stream-util.js +76 -0
- package/dist/src/cohort-topic/stream-util.js.map +1 -0
- package/dist/src/cohort-topic/threshold-crypto.d.ts +94 -0
- package/dist/src/cohort-topic/threshold-crypto.d.ts.map +1 -0
- package/dist/src/cohort-topic/threshold-crypto.js +178 -0
- package/dist/src/cohort-topic/threshold-crypto.js.map +1 -0
- package/dist/src/cohort-topic/topic-router.d.ts +41 -0
- package/dist/src/cohort-topic/topic-router.d.ts.map +1 -0
- package/dist/src/cohort-topic/topic-router.js +63 -0
- package/dist/src/cohort-topic/topic-router.js.map +1 -0
- package/dist/src/dispute/cascade.d.ts +179 -0
- package/dist/src/dispute/cascade.d.ts.map +1 -0
- package/dist/src/dispute/cascade.js +315 -0
- package/dist/src/dispute/cascade.js.map +1 -0
- package/dist/src/dispute/client.d.ts +2 -1
- package/dist/src/dispute/client.d.ts.map +1 -1
- package/dist/src/dispute/client.js +12 -3
- package/dist/src/dispute/client.js.map +1 -1
- package/dist/src/dispute/dispute-service.d.ts +41 -1
- package/dist/src/dispute/dispute-service.d.ts.map +1 -1
- package/dist/src/dispute/dispute-service.js +147 -21
- package/dist/src/dispute/dispute-service.js.map +1 -1
- package/dist/src/dispute/index.d.ts +2 -0
- package/dist/src/dispute/index.d.ts.map +1 -1
- package/dist/src/dispute/index.js +2 -0
- package/dist/src/dispute/index.js.map +1 -1
- package/dist/src/dispute/invalidation.d.ts +266 -0
- package/dist/src/dispute/invalidation.d.ts.map +1 -0
- package/dist/src/dispute/invalidation.js +405 -0
- package/dist/src/dispute/invalidation.js.map +1 -0
- package/dist/src/dispute/types.d.ts +14 -0
- package/dist/src/dispute/types.d.ts.map +1 -1
- package/dist/src/dispute/types.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/libp2p-key-network.d.ts +8 -1
- package/dist/src/libp2p-key-network.d.ts.map +1 -1
- package/dist/src/libp2p-key-network.js +67 -8
- package/dist/src/libp2p-key-network.js.map +1 -1
- package/dist/src/libp2p-node-base.d.ts +57 -3
- package/dist/src/libp2p-node-base.d.ts.map +1 -1
- package/dist/src/libp2p-node-base.js +523 -6
- package/dist/src/libp2p-node-base.js.map +1 -1
- package/dist/src/matchmaking/aggregate-counts.d.ts +67 -0
- package/dist/src/matchmaking/aggregate-counts.d.ts.map +1 -0
- package/dist/src/matchmaking/aggregate-counts.js +60 -0
- package/dist/src/matchmaking/aggregate-counts.js.map +1 -0
- package/dist/src/matchmaking/index.d.ts +20 -0
- package/dist/src/matchmaking/index.d.ts.map +1 -0
- package/dist/src/matchmaking/index.js +20 -0
- package/dist/src/matchmaking/index.js.map +1 -0
- package/dist/src/matchmaking/module.d.ts +181 -0
- package/dist/src/matchmaking/module.d.ts.map +1 -0
- package/dist/src/matchmaking/module.js +221 -0
- package/dist/src/matchmaking/module.js.map +1 -0
- package/dist/src/matchmaking/protocols.d.ts +37 -0
- package/dist/src/matchmaking/protocols.d.ts.map +1 -0
- package/dist/src/matchmaking/protocols.js +42 -0
- package/dist/src/matchmaking/protocols.js.map +1 -0
- package/dist/src/matchmaking/provider-manager.d.ts +52 -0
- package/dist/src/matchmaking/provider-manager.d.ts.map +1 -0
- package/dist/src/matchmaking/provider-manager.js +74 -0
- package/dist/src/matchmaking/provider-manager.js.map +1 -0
- package/dist/src/matchmaking/query-handler.d.ts +34 -0
- package/dist/src/matchmaking/query-handler.d.ts.map +1 -0
- package/dist/src/matchmaking/query-handler.js +62 -0
- package/dist/src/matchmaking/query-handler.js.map +1 -0
- package/dist/src/matchmaking/query-transport.d.ts +180 -0
- package/dist/src/matchmaking/query-transport.d.ts.map +1 -0
- package/dist/src/matchmaking/query-transport.js +315 -0
- package/dist/src/matchmaking/query-transport.js.map +1 -0
- package/dist/src/matchmaking/seeker-manager.d.ts +39 -0
- package/dist/src/matchmaking/seeker-manager.d.ts.map +1 -0
- package/dist/src/matchmaking/seeker-manager.js +49 -0
- package/dist/src/matchmaking/seeker-manager.js.map +1 -0
- package/dist/src/matchmaking/seeker-walk-client.d.ts +127 -0
- package/dist/src/matchmaking/seeker-walk-client.d.ts.map +1 -0
- package/dist/src/matchmaking/seeker-walk-client.js +189 -0
- package/dist/src/matchmaking/seeker-walk-client.js.map +1 -0
- package/dist/src/matchmaking/traffic-validation.d.ts +128 -0
- package/dist/src/matchmaking/traffic-validation.d.ts.map +1 -0
- package/dist/src/matchmaking/traffic-validation.js +105 -0
- package/dist/src/matchmaking/traffic-validation.js.map +1 -0
- package/dist/src/network/network-manager-service.d.ts +4 -2
- package/dist/src/network/network-manager-service.d.ts.map +1 -1
- package/dist/src/network/network-manager-service.js +9 -3
- package/dist/src/network/network-manager-service.js.map +1 -1
- package/dist/src/protocol-client.d.ts +25 -0
- package/dist/src/protocol-client.d.ts.map +1 -1
- package/dist/src/protocol-client.js +126 -4
- package/dist/src/protocol-client.js.map +1 -1
- package/dist/src/reactivity/forwarder-host.d.ts +198 -0
- package/dist/src/reactivity/forwarder-host.d.ts.map +1 -0
- package/dist/src/reactivity/forwarder-host.js +355 -0
- package/dist/src/reactivity/forwarder-host.js.map +1 -0
- package/dist/src/reactivity/index.d.ts +19 -0
- package/dist/src/reactivity/index.d.ts.map +1 -0
- package/dist/src/reactivity/index.js +19 -0
- package/dist/src/reactivity/index.js.map +1 -0
- package/dist/src/reactivity/notify-transport.d.ts +70 -0
- package/dist/src/reactivity/notify-transport.d.ts.map +1 -0
- package/dist/src/reactivity/notify-transport.js +111 -0
- package/dist/src/reactivity/notify-transport.js.map +1 -0
- package/dist/src/reactivity/origination-manager.d.ts +110 -0
- package/dist/src/reactivity/origination-manager.d.ts.map +1 -0
- package/dist/src/reactivity/origination-manager.js +129 -0
- package/dist/src/reactivity/origination-manager.js.map +1 -0
- package/dist/src/reactivity/protocols.d.ts +43 -0
- package/dist/src/reactivity/protocols.d.ts.map +1 -0
- package/dist/src/reactivity/protocols.js +50 -0
- package/dist/src/reactivity/protocols.js.map +1 -0
- package/dist/src/reactivity/push-state-gossip.d.ts +132 -0
- package/dist/src/reactivity/push-state-gossip.d.ts.map +1 -0
- package/dist/src/reactivity/push-state-gossip.js +231 -0
- package/dist/src/reactivity/push-state-gossip.js.map +1 -0
- package/dist/src/reactivity/recover-transport.d.ts +167 -0
- package/dist/src/reactivity/recover-transport.d.ts.map +1 -0
- package/dist/src/reactivity/recover-transport.js +308 -0
- package/dist/src/reactivity/recover-transport.js.map +1 -0
- package/dist/src/reactivity/rotation-rereg-scheduler.d.ts +142 -0
- package/dist/src/reactivity/rotation-rereg-scheduler.d.ts.map +1 -0
- package/dist/src/reactivity/rotation-rereg-scheduler.js +223 -0
- package/dist/src/reactivity/rotation-rereg-scheduler.js.map +1 -0
- package/dist/src/reactivity/subscriber-registry.d.ts +47 -0
- package/dist/src/reactivity/subscriber-registry.d.ts.map +1 -0
- package/dist/src/reactivity/subscriber-registry.js +87 -0
- package/dist/src/reactivity/subscriber-registry.js.map +1 -0
- package/dist/src/reactivity/subscription-manager.d.ts +221 -0
- package/dist/src/reactivity/subscription-manager.d.ts.map +1 -0
- package/dist/src/reactivity/subscription-manager.js +302 -0
- package/dist/src/reactivity/subscription-manager.js.map +1 -0
- package/dist/src/reactivity/topic-bytes.d.ts +32 -0
- package/dist/src/reactivity/topic-bytes.d.ts.map +1 -0
- package/dist/src/reactivity/topic-bytes.js +34 -0
- package/dist/src/reactivity/topic-bytes.js.map +1 -0
- package/dist/src/repo/client.d.ts.map +1 -1
- package/dist/src/repo/client.js +51 -19
- package/dist/src/repo/client.js.map +1 -1
- package/dist/src/repo/cluster-coordinator.d.ts +9 -0
- package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
- package/dist/src/repo/cluster-coordinator.js +65 -22
- package/dist/src/repo/cluster-coordinator.js.map +1 -1
- package/dist/src/repo/coordinator-repo.d.ts +20 -0
- package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
- package/dist/src/repo/coordinator-repo.js +101 -16
- package/dist/src/repo/coordinator-repo.js.map +1 -1
- package/dist/src/repo/service.d.ts +46 -1
- package/dist/src/repo/service.d.ts.map +1 -1
- package/dist/src/repo/service.js +79 -45
- package/dist/src/repo/service.js.map +1 -1
- package/dist/src/rpc-deadline.d.ts +37 -0
- package/dist/src/rpc-deadline.d.ts.map +1 -0
- package/dist/src/rpc-deadline.js +31 -0
- package/dist/src/rpc-deadline.js.map +1 -0
- package/dist/src/storage/block-storage.d.ts +2 -0
- package/dist/src/storage/block-storage.d.ts.map +1 -1
- package/dist/src/storage/block-storage.js +95 -2
- package/dist/src/storage/block-storage.js.map +1 -1
- package/dist/src/storage/i-block-storage.d.ts +25 -0
- package/dist/src/storage/i-block-storage.d.ts.map +1 -1
- package/dist/src/storage/storage-repo.d.ts +53 -2
- package/dist/src/storage/storage-repo.d.ts.map +1 -1
- package/dist/src/storage/storage-repo.js +193 -9
- package/dist/src/storage/storage-repo.js.map +1 -1
- package/dist/src/sync/client.d.ts +4 -1
- package/dist/src/sync/client.d.ts.map +1 -1
- package/dist/src/sync/client.js +5 -2
- package/dist/src/sync/client.js.map +1 -1
- package/dist/src/testing/cohort-topic-mesh-harness.d.ts +219 -0
- package/dist/src/testing/cohort-topic-mesh-harness.d.ts.map +1 -0
- package/dist/src/testing/cohort-topic-mesh-harness.js +467 -0
- package/dist/src/testing/cohort-topic-mesh-harness.js.map +1 -0
- package/dist/src/testing/matchmaking-mesh-harness.d.ts +187 -0
- package/dist/src/testing/matchmaking-mesh-harness.d.ts.map +1 -0
- package/dist/src/testing/matchmaking-mesh-harness.js +358 -0
- package/dist/src/testing/matchmaking-mesh-harness.js.map +1 -0
- package/dist/src/testing/mesh-harness.d.ts.map +1 -1
- package/dist/src/testing/mesh-harness.js +23 -1
- package/dist/src/testing/mesh-harness.js.map +1 -1
- package/dist/src/testing/reactivity-mesh-harness.d.ts +298 -0
- package/dist/src/testing/reactivity-mesh-harness.d.ts.map +1 -0
- package/dist/src/testing/reactivity-mesh-harness.js +663 -0
- package/dist/src/testing/reactivity-mesh-harness.js.map +1 -0
- package/package.json +7 -4
- package/src/cluster/block-transfer-service.ts +133 -68
- package/src/cluster/client.ts +64 -45
- package/src/cluster/cluster-error.ts +64 -0
- package/src/cluster/cluster-repo.ts +405 -55
- package/src/cluster/commit-cert.ts +139 -0
- package/src/cluster/service.ts +116 -44
- package/src/cluster/spread-on-churn.ts +328 -285
- package/src/cohort-topic/bootstrap-evidence-builder.ts +122 -0
- package/src/cohort-topic/bootstrap-evidence-verifiers.ts +132 -0
- package/src/cohort-topic/bootstrap-parent-reference.ts +159 -0
- package/src/cohort-topic/change-bridge.ts +109 -0
- package/src/cohort-topic/cohort-gossip-driver.ts +144 -0
- package/src/cohort-topic/cohort-gossip-transport.ts +74 -0
- package/src/cohort-topic/fret-trust-anchor.ts +153 -0
- package/src/cohort-topic/host.ts +2175 -0
- package/src/cohort-topic/index.ts +13 -0
- package/src/cohort-topic/membership-publish-sink.ts +20 -0
- package/src/cohort-topic/membership-source.ts +68 -0
- package/src/cohort-topic/peer-codec.ts +31 -0
- package/src/cohort-topic/peer-sig.ts +86 -0
- package/src/cohort-topic/protocols.ts +71 -0
- package/src/cohort-topic/reactivity-membership-gate.ts +77 -0
- package/src/cohort-topic/size-estimator.ts +16 -0
- package/src/cohort-topic/stream-util.ts +87 -0
- package/src/cohort-topic/threshold-crypto.ts +239 -0
- package/src/cohort-topic/topic-router.ts +77 -0
- package/src/dispute/cascade.ts +517 -0
- package/src/dispute/client.ts +12 -2
- package/src/dispute/dispute-service.ts +171 -24
- package/src/dispute/index.ts +42 -0
- package/src/dispute/invalidation.ts +587 -0
- package/src/dispute/types.ts +14 -0
- package/src/index.ts +4 -0
- package/src/libp2p-key-network.ts +67 -9
- package/src/libp2p-node-base.ts +633 -14
- package/src/matchmaking/aggregate-counts.ts +104 -0
- package/src/matchmaking/index.ts +20 -0
- package/src/matchmaking/module.ts +363 -0
- package/src/matchmaking/protocols.ts +51 -0
- package/src/matchmaking/provider-manager.ts +95 -0
- package/src/matchmaking/query-handler.ts +88 -0
- package/src/matchmaking/query-transport.ts +483 -0
- package/src/matchmaking/seeker-manager.ts +64 -0
- package/src/matchmaking/seeker-walk-client.ts +293 -0
- package/src/matchmaking/traffic-validation.ts +195 -0
- package/src/network/network-manager-service.ts +9 -2
- package/src/protocol-client.ts +119 -5
- package/src/reactivity/forwarder-host.ts +438 -0
- package/src/reactivity/index.ts +19 -0
- package/src/reactivity/notify-transport.ts +144 -0
- package/src/reactivity/origination-manager.ts +192 -0
- package/src/reactivity/protocols.ts +61 -0
- package/src/reactivity/push-state-gossip.ts +291 -0
- package/src/reactivity/recover-transport.ts +408 -0
- package/src/reactivity/rotation-rereg-scheduler.ts +256 -0
- package/src/reactivity/subscriber-registry.ts +96 -0
- package/src/reactivity/subscription-manager.ts +450 -0
- package/src/reactivity/topic-bytes.ts +37 -0
- package/src/repo/client.ts +54 -19
- package/src/repo/cluster-coordinator.ts +66 -26
- package/src/repo/coordinator-repo.ts +99 -15
- package/src/repo/service.ts +90 -42
- package/src/rpc-deadline.ts +45 -0
- package/src/storage/block-storage.ts +106 -3
- package/src/storage/i-block-storage.ts +27 -0
- package/src/storage/storage-repo.ts +209 -13
- package/src/sync/client.ts +5 -2
- package/src/testing/cohort-topic-mesh-harness.ts +613 -0
- package/src/testing/matchmaking-mesh-harness.ts +475 -0
- package/src/testing/mesh-harness.ts +22 -2
- package/src/testing/reactivity-mesh-harness.ts +922 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity-mesh-harness.js","sourceRoot":"","sources":["../../../src/testing/reactivity-mesh-harness.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.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "P2P database functionality for Optimystic",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -68,9 +68,11 @@
|
|
|
68
68
|
"@chainsafe/libp2p-gossipsub": "^14.1.2",
|
|
69
69
|
"@chainsafe/libp2p-noise": "^17.0.0",
|
|
70
70
|
"@chainsafe/libp2p-yamux": "^8.0.1",
|
|
71
|
+
"@libp2p/autonat": "^3.0.21",
|
|
71
72
|
"@libp2p/bootstrap": "^12.0.11",
|
|
72
73
|
"@libp2p/circuit-relay-v2": "^4.1.3",
|
|
73
|
-
"@libp2p/crypto": "^5.1.
|
|
74
|
+
"@libp2p/crypto": "^5.1.19",
|
|
75
|
+
"@libp2p/dcutr": "^3.0.21",
|
|
74
76
|
"@libp2p/identify": "^4.0.10",
|
|
75
77
|
"@libp2p/interface": "^3.1.0",
|
|
76
78
|
"@libp2p/kad-dht": "^16.1.3",
|
|
@@ -79,7 +81,7 @@
|
|
|
79
81
|
"@libp2p/tcp": "^11.0.10",
|
|
80
82
|
"@libp2p/websockets": "^10.1.3",
|
|
81
83
|
"@multiformats/multiaddr": "^13.0.1",
|
|
82
|
-
"@optimystic/db-core": "^0.
|
|
84
|
+
"@optimystic/db-core": "^0.14.0",
|
|
83
85
|
"async-mutex": "^0.5.0",
|
|
84
86
|
"debug": "^4.4.3",
|
|
85
87
|
"it-all": "^3.0.9",
|
|
@@ -88,7 +90,8 @@
|
|
|
88
90
|
"it-pushable": "^3.2.3",
|
|
89
91
|
"libp2p": "^3.1.3",
|
|
90
92
|
"multiformats": "^13.4.2",
|
|
91
|
-
"p2p-fret": "^0.
|
|
93
|
+
"p2p-fret": "^0.5.0",
|
|
94
|
+
"protons-runtime": "^6.0.0",
|
|
92
95
|
"uint8arraylist": "^2.4.8",
|
|
93
96
|
"uint8arrays": "^5.1.0"
|
|
94
97
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Startable, Stream } from '@libp2p/interface';
|
|
2
|
-
import type { IRepo, PeerId, IPeerNetwork } from '@optimystic/db-core';
|
|
2
|
+
import type { IRepo, PeerId, IPeerNetwork, ActionId, ActionRev, IBlock, BlockId } from '@optimystic/db-core';
|
|
3
3
|
import { pipe } from 'it-pipe';
|
|
4
4
|
import * as lp from 'it-length-prefixed';
|
|
5
5
|
import { fromString as u8FromString } from 'uint8arrays/from-string';
|
|
@@ -25,6 +25,13 @@ export interface BlockTransferRequest {
|
|
|
25
25
|
reason: 'rebalance' | 'replication' | 'recovery';
|
|
26
26
|
/** For push: base64-encoded block data per block ID */
|
|
27
27
|
blockData?: Record<string, string>;
|
|
28
|
+
/**
|
|
29
|
+
* For push: the source's revision metadata per block ID. Carries the sender's
|
|
30
|
+
* `state.latest` so the replica's `latest` matches the source instead of being
|
|
31
|
+
* fabricated. Optional: an older sender omits it and the receiver falls back to a
|
|
32
|
+
* deterministic rev-1 replica (see {@link IBlockStorage.saveReplica}).
|
|
33
|
+
*/
|
|
34
|
+
blockMeta?: Record<string, { rev: number; actionId: ActionId }>;
|
|
28
35
|
}
|
|
29
36
|
|
|
30
37
|
/** Response with block data */
|
|
@@ -37,13 +44,29 @@ export interface BlockTransferResponse {
|
|
|
37
44
|
|
|
38
45
|
// --- Service (server-side handler) ---
|
|
39
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Repo capability the service needs: read access for `handlePull` plus a local
|
|
49
|
+
* "save replica" path for `handlePush`. The replica path must land in the node's
|
|
50
|
+
* *local* storage (not the cluster-coordinated repo), so it is a distinct method
|
|
51
|
+
* from the `IRepo` commit funnel. `StorageRepo` implements this.
|
|
52
|
+
*/
|
|
53
|
+
export interface IBlockReplicaStore extends IRepo {
|
|
54
|
+
/**
|
|
55
|
+
* Persist a replica of a block received out-of-band (churn re-replication).
|
|
56
|
+
* Seeds metadata if absent, advances `latest` monotonically, and makes the block
|
|
57
|
+
* durably servable via `get`. Idempotent for a fixed `(rev, actionId)`; a no-op
|
|
58
|
+
* (still durable) when an equal-or-newer revision is already present.
|
|
59
|
+
*/
|
|
60
|
+
saveReplicatedBlock(blockId: BlockId, block: IBlock, source?: ActionRev): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
|
|
40
63
|
export interface BlockTransferServiceInit {
|
|
41
64
|
protocolPrefix?: string;
|
|
42
65
|
}
|
|
43
66
|
|
|
44
67
|
export interface BlockTransferServiceComponents {
|
|
45
68
|
registrar: { handle: (...args: any[]) => Promise<void>; unhandle: (...args: any[]) => Promise<void> };
|
|
46
|
-
repo:
|
|
69
|
+
repo: IBlockReplicaStore;
|
|
47
70
|
}
|
|
48
71
|
|
|
49
72
|
/**
|
|
@@ -55,7 +78,7 @@ export interface BlockTransferServiceComponents {
|
|
|
55
78
|
export class BlockTransferService implements Startable {
|
|
56
79
|
private running = false;
|
|
57
80
|
private readonly protocol: string;
|
|
58
|
-
private readonly repo:
|
|
81
|
+
private readonly repo: IBlockReplicaStore;
|
|
59
82
|
private readonly registrar: BlockTransferServiceComponents['registrar'];
|
|
60
83
|
|
|
61
84
|
constructor(
|
|
@@ -70,7 +93,14 @@ export class BlockTransferService implements Startable {
|
|
|
70
93
|
async start(): Promise<void> {
|
|
71
94
|
if (this.running) return;
|
|
72
95
|
await this.registrar.handle(this.protocol, async (data: any) => {
|
|
73
|
-
|
|
96
|
+
// libp2p invokes the stream handler with the Stream as the FIRST positional argument
|
|
97
|
+
// (see cluster/repo/dispute services, which all use `(stream, connection)`). The block-
|
|
98
|
+
// transfer handler previously read `data.stream`, which is `undefined` for the positional
|
|
99
|
+
// shape — so `readRequest` ran `pipe(undefined, ...)` → "Empty pipeline", the receiver
|
|
100
|
+
// never replied, and every push/pull dialled this service hung with no response. Unwrap
|
|
101
|
+
// defensively (older shape passed `{ stream }`), mirroring sync/service.ts.
|
|
102
|
+
const stream = data?.stream ?? data;
|
|
103
|
+
await this.handleRequest(stream);
|
|
74
104
|
});
|
|
75
105
|
this.running = true;
|
|
76
106
|
log('started on %s', this.protocol);
|
|
@@ -84,28 +114,45 @@ export class BlockTransferService implements Startable {
|
|
|
84
114
|
}
|
|
85
115
|
|
|
86
116
|
private async handleRequest(stream: Stream): Promise<void> {
|
|
117
|
+
const self = this;
|
|
87
118
|
try {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
119
|
+
// Read the request, process it, and write the response on ONE continuous duplex
|
|
120
|
+
// pipe (mirrors cluster/repo/dispute services). The earlier read-to-end-then-write
|
|
121
|
+
// design deadlocked over a real stream: the client sends one length-prefixed request
|
|
122
|
+
// and holds its write side open awaiting the reply, so a receiver that drained the
|
|
123
|
+
// source until end-of-stream blocked forever — and the reply, written only after
|
|
124
|
+
// teardown, hit a closed stream. Yielding the response as soon as the request is read
|
|
125
|
+
// keeps both sides live.
|
|
126
|
+
const responses = pipe(
|
|
127
|
+
stream,
|
|
128
|
+
(source) => lp.decode(source),
|
|
129
|
+
async function* (source) {
|
|
130
|
+
for await (const msg of source) {
|
|
131
|
+
const request = JSON.parse(u8ToString(msg.subarray(), 'utf8')) as BlockTransferRequest;
|
|
132
|
+
log('request type=%s blocks=%d reason=%s', request.type, request.blockIds.length, request.reason);
|
|
133
|
+
let response: BlockTransferResponse;
|
|
134
|
+
try {
|
|
135
|
+
response = request.type === 'pull'
|
|
136
|
+
? await self.handlePull(request)
|
|
137
|
+
: await self.handlePush(request);
|
|
138
|
+
} catch (error) {
|
|
139
|
+
log('error: %s', (error as Error).message);
|
|
140
|
+
response = { blocks: {}, missing: [] };
|
|
141
|
+
}
|
|
142
|
+
log('response blocks=%d missing=%d', Object.keys(response.blocks).length, response.missing.length);
|
|
143
|
+
yield u8FromString(JSON.stringify(response), 'utf8');
|
|
144
|
+
return; // one request → one response per stream
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
(source) => lp.encode(source)
|
|
148
|
+
);
|
|
149
|
+
for await (const chunk of responses) {
|
|
150
|
+
stream.send(chunk);
|
|
96
151
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
log('
|
|
100
|
-
|
|
101
|
-
log('error: %s', (error as Error).message);
|
|
102
|
-
try {
|
|
103
|
-
await this.sendResponse(stream, { blocks: {}, missing: [] });
|
|
104
|
-
} catch {
|
|
105
|
-
// ignore send errors
|
|
106
|
-
}
|
|
107
|
-
} finally {
|
|
108
|
-
try { await stream.close(); } catch { /* ignore */ }
|
|
152
|
+
await stream.close();
|
|
153
|
+
} catch (err) {
|
|
154
|
+
log('error: %s', (err as Error).message);
|
|
155
|
+
try { stream.abort(err instanceof Error ? err : new Error(String(err))); } catch { /* ignore */ }
|
|
109
156
|
}
|
|
110
157
|
}
|
|
111
158
|
|
|
@@ -127,9 +174,12 @@ export class BlockTransferService implements Startable {
|
|
|
127
174
|
return { blocks, missing };
|
|
128
175
|
}
|
|
129
176
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Persist pushed blocks into local storage so the new owner holds a durable
|
|
179
|
+
* replica after churn. A block is reported `accepted` only if it was both
|
|
180
|
+
* received (parseable) AND successfully persisted; a parse or persist failure
|
|
181
|
+
* surfaces it as `missing` so the sender does not falsely treat it as replicated.
|
|
182
|
+
*/
|
|
133
183
|
private async handlePush(request: BlockTransferRequest): Promise<BlockTransferResponse> {
|
|
134
184
|
const blocks: Record<string, string> = {};
|
|
135
185
|
const missing: string[] = [];
|
|
@@ -138,50 +188,43 @@ export class BlockTransferService implements Startable {
|
|
|
138
188
|
return { blocks: {}, missing: request.blockIds };
|
|
139
189
|
}
|
|
140
190
|
|
|
141
|
-
// Accept pushed blocks — for each block, validate we received parseable data
|
|
142
191
|
for (const blockId of request.blockIds) {
|
|
143
192
|
const data = request.blockData[blockId];
|
|
144
|
-
if (data) {
|
|
145
|
-
// Verify we received valid data
|
|
146
|
-
try {
|
|
147
|
-
JSON.parse(Buffer.from(data, 'base64').toString('utf8'));
|
|
148
|
-
blocks[blockId] = data;
|
|
149
|
-
} catch {
|
|
150
|
-
missing.push(blockId);
|
|
151
|
-
}
|
|
152
|
-
} else {
|
|
193
|
+
if (!data) {
|
|
153
194
|
missing.push(blockId);
|
|
195
|
+
continue;
|
|
154
196
|
}
|
|
155
|
-
}
|
|
156
197
|
|
|
157
|
-
|
|
158
|
-
|
|
198
|
+
// Decode + parse the wire payload into an IBlock.
|
|
199
|
+
let block: IBlock;
|
|
200
|
+
try {
|
|
201
|
+
block = JSON.parse(Buffer.from(data, 'base64').toString('utf8')) as IBlock;
|
|
202
|
+
} catch {
|
|
203
|
+
missing.push(blockId);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
159
206
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
messages.push(msg.subarray());
|
|
168
|
-
}
|
|
207
|
+
// `JSON.parse` accepts `null`/primitives as valid JSON. Persisting a falsy or
|
|
208
|
+
// header-less "block" would seed metadata with no materialization, making every
|
|
209
|
+
// later `get` throw. Reject such payloads as missing rather than poison storage.
|
|
210
|
+
if (block === null || typeof block !== 'object' || (block as IBlock).header === undefined) {
|
|
211
|
+
log('push:invalid block=%s (not a structurally valid block)', blockId);
|
|
212
|
+
missing.push(blockId);
|
|
213
|
+
continue;
|
|
169
214
|
}
|
|
170
|
-
);
|
|
171
215
|
|
|
172
|
-
|
|
173
|
-
|
|
216
|
+
// Persist locally. Only a received-AND-persisted block is reported accepted.
|
|
217
|
+
try {
|
|
218
|
+
const source = request.blockMeta?.[blockId];
|
|
219
|
+
await this.repo.saveReplicatedBlock(blockId, block, source);
|
|
220
|
+
blocks[blockId] = data;
|
|
221
|
+
} catch (error) {
|
|
222
|
+
log('persist:fail block=%s err=%s', blockId, (error as Error).message);
|
|
223
|
+
missing.push(blockId);
|
|
224
|
+
}
|
|
174
225
|
}
|
|
175
226
|
|
|
176
|
-
return
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
private async sendResponse(stream: Stream, response: BlockTransferResponse): Promise<void> {
|
|
180
|
-
const bytes = u8FromString(JSON.stringify(response), 'utf8');
|
|
181
|
-
const encoded = pipe([bytes], lp.encode);
|
|
182
|
-
for await (const chunk of encoded) {
|
|
183
|
-
stream.send(chunk);
|
|
184
|
-
}
|
|
227
|
+
return { blocks, missing };
|
|
185
228
|
}
|
|
186
229
|
}
|
|
187
230
|
|
|
@@ -206,26 +249,48 @@ export class BlockTransferClient extends ProtocolClient {
|
|
|
206
249
|
this.protocol = buildBlockTransferProtocol(protocolPrefix);
|
|
207
250
|
}
|
|
208
251
|
|
|
209
|
-
/**
|
|
252
|
+
/**
|
|
253
|
+
* Pull blocks from the remote peer.
|
|
254
|
+
*
|
|
255
|
+
* @param options Optional per-call deadlines/cancellation forwarded to the
|
|
256
|
+
* underlying request. `dialTimeoutMs` bounds connecting; `responseTimeoutMs`
|
|
257
|
+
* bounds waiting for the reply once connected; `signal` cancels the whole
|
|
258
|
+
* request. Omitting all of them preserves the previous uncapped behavior.
|
|
259
|
+
*/
|
|
210
260
|
async pullBlocks(
|
|
211
261
|
blockIds: string[],
|
|
212
|
-
reason: BlockTransferRequest['reason'] = 'rebalance'
|
|
262
|
+
reason: BlockTransferRequest['reason'] = 'rebalance',
|
|
263
|
+
options?: { signal?: AbortSignal; dialTimeoutMs?: number; responseTimeoutMs?: number }
|
|
213
264
|
): Promise<BlockTransferResponse> {
|
|
214
265
|
const request: BlockTransferRequest = { type: 'pull', blockIds, reason };
|
|
215
|
-
return await this.processMessage<BlockTransferResponse>(request, this.protocol);
|
|
266
|
+
return await this.processMessage<BlockTransferResponse>(request, this.protocol, options);
|
|
216
267
|
}
|
|
217
268
|
|
|
218
|
-
/**
|
|
269
|
+
/**
|
|
270
|
+
* Push blocks to the remote peer.
|
|
271
|
+
*
|
|
272
|
+
* @param blockMeta Optional per-block source revision metadata (the sender's
|
|
273
|
+
* `state.latest`). When provided, the receiver replicates at the source's
|
|
274
|
+
* `(rev, actionId)`; when omitted, it falls back to a deterministic rev-1 replica.
|
|
275
|
+
* @param options Optional per-call deadlines/cancellation forwarded to the
|
|
276
|
+
* underlying request. `dialTimeoutMs` bounds connecting; `responseTimeoutMs`
|
|
277
|
+
* bounds waiting for the reply once connected (so a peer that connects but goes
|
|
278
|
+
* silent throws {@link ResponseTimeoutError} instead of hanging); `signal`
|
|
279
|
+
* cancels the whole request. Omitting all of them preserves the previous
|
|
280
|
+
* uncapped behavior.
|
|
281
|
+
*/
|
|
219
282
|
async pushBlocks(
|
|
220
283
|
blockIds: string[],
|
|
221
284
|
blockDataBuffers: Uint8Array[],
|
|
222
|
-
reason: BlockTransferRequest['reason'] = 'rebalance'
|
|
285
|
+
reason: BlockTransferRequest['reason'] = 'rebalance',
|
|
286
|
+
blockMeta?: Record<string, { rev: number; actionId: ActionId }>,
|
|
287
|
+
options?: { signal?: AbortSignal; dialTimeoutMs?: number; responseTimeoutMs?: number }
|
|
223
288
|
): Promise<BlockTransferResponse> {
|
|
224
289
|
const blockData: Record<string, string> = {};
|
|
225
290
|
for (let i = 0; i < blockIds.length; i++) {
|
|
226
291
|
blockData[blockIds[i]!] = Buffer.from(blockDataBuffers[i]!).toString('base64');
|
|
227
292
|
}
|
|
228
|
-
const request: BlockTransferRequest = { type: 'push', blockIds, reason, blockData };
|
|
229
|
-
return await this.processMessage<BlockTransferResponse>(request, this.protocol);
|
|
293
|
+
const request: BlockTransferRequest = { type: 'push', blockIds, reason, blockData, ...(blockMeta ? { blockMeta } : {}) };
|
|
294
|
+
return await this.processMessage<BlockTransferResponse>(request, this.protocol, options);
|
|
230
295
|
}
|
|
231
296
|
}
|
package/src/cluster/client.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { PeerId, IPeerNetwork, ICluster, ClusterRecord } from '@optimystic/db-core';
|
|
2
|
+
import { blockIdToBytes, blockIdsForTransforms } from '@optimystic/db-core';
|
|
2
3
|
import { ProtocolClient } from '../protocol-client.js';
|
|
3
4
|
import { peerIdFromString } from '@libp2p/peer-id';
|
|
5
|
+
import { isClusterErrorEnvelope, clusterErrorFromEnvelope } from './cluster-error.js';
|
|
6
|
+
import { withRpcDeadlineDefaults, type RpcDeadlineOptions } from '../rpc-deadline.js';
|
|
4
7
|
|
|
5
8
|
export class ClusterClient extends ProtocolClient implements ICluster {
|
|
6
9
|
private constructor(peerId: PeerId, peerNetwork: IPeerNetwork, readonly protocolPrefix?: string) {
|
|
@@ -12,56 +15,72 @@ export class ClusterClient extends ProtocolClient implements ICluster {
|
|
|
12
15
|
return new ClusterClient(peerId, peerNetwork, protocolPrefix);
|
|
13
16
|
}
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
async update(record: ClusterRecord, hop: number = 0, options?: RpcDeadlineOptions): Promise<ClusterRecord> {
|
|
16
19
|
const message = {
|
|
17
20
|
operation: 'update',
|
|
18
21
|
record
|
|
19
22
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
23
|
+
// Every node registers the cluster service under its network-prefixed
|
|
24
|
+
// protocol id (`/optimystic/<network>/cluster/1.0.0`); the bare
|
|
25
|
+
// `/db-p2p/cluster/1.0.0` is never registered, so there is no legacy
|
|
26
|
+
// fallback to attempt — a single dial whose error propagates directly.
|
|
27
|
+
const protocol = (this.protocolPrefix ?? '/db-p2p') + '/cluster/1.0.0';
|
|
28
|
+
// Apply the client-level dial/response deadline so a silent cluster peer
|
|
29
|
+
// can't hang the coordinator forever; an explicit caller override wins.
|
|
30
|
+
const response = await this.processMessage<unknown>(message, protocol, withRpcDeadlineDefaults(options));
|
|
31
|
+
|
|
32
|
+
// A member that threw inside `update` replies with a structured error
|
|
33
|
+
// envelope rather than aborting the stream; rethrow the server's real
|
|
34
|
+
// error (preserving name/code) so the coordinator sees the true cause.
|
|
35
|
+
if (isClusterErrorEnvelope(response)) {
|
|
36
|
+
throw clusterErrorFromEnvelope(response);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const redirectResponse = response as { redirect?: { peers?: Array<{ id: string }> } };
|
|
40
|
+
if (redirectResponse?.redirect?.peers?.length) {
|
|
41
|
+
if (hop >= 2) {
|
|
42
|
+
throw new Error('Redirect loop detected in ClusterClient (max hops reached)')
|
|
43
|
+
}
|
|
44
|
+
const currentIdStr = this.peerId.toString()
|
|
45
|
+
const next = redirectResponse.redirect.peers.find((p) => p.id !== currentIdStr) ?? redirectResponse.redirect.peers[0]!
|
|
46
|
+
const nextId = peerIdFromString(next.id)
|
|
47
|
+
if (next.id === currentIdStr) {
|
|
48
|
+
throw new Error('Redirect loop detected in ClusterClient (same peer)')
|
|
49
|
+
}
|
|
50
|
+
await this.recordCoordinatorForRecordIfSupported(record, nextId)
|
|
51
|
+
const nextClient = ClusterClient.create(nextId, this.peerNetwork, this.protocolPrefix)
|
|
52
|
+
// Thread the caller's *original* options through the redirect hop (the
|
|
53
|
+
// recursive call re-applies its own defaults) so the deadline survives a redirect.
|
|
54
|
+
return await nextClient.update(record, hop + 1, options)
|
|
55
|
+
}
|
|
56
|
+
return response as ClusterRecord;
|
|
51
57
|
}
|
|
52
58
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Record a coordinator-affinity hint for the block this record's op is
|
|
61
|
+
* coordinated on, so a follow-up op can dial `peerId` directly.
|
|
62
|
+
*
|
|
63
|
+
* The op lives at `record.message.operations[0]` — `record.message` is a
|
|
64
|
+
* RepoMessage `{ operations: [...] }`, NOT a bare `{ commit }`/`{ pend }`.
|
|
65
|
+
* Reading `record.message.commit`/`.pend` (the old code) always saw
|
|
66
|
+
* `undefined`, so this hint was dead code and never recorded anything.
|
|
67
|
+
*
|
|
68
|
+
* The key is `blockIdToBytes(<the coordinated block id>)` — the sha256 digest
|
|
69
|
+
* findCoordinator/recordCoordinator key the cache on — NOT raw utf8 of the id
|
|
70
|
+
* (which would never be retrieved). Commit anchors on blockIds[0] (where
|
|
71
|
+
* CoordinatorRepo runs consensus + verifyResponsibility), not tailId. Pend
|
|
72
|
+
* anchors on a real block id (blockIdsForTransforms), not a structural
|
|
73
|
+
* transforms field name. ClusterClient only ever carries commit/pend.
|
|
74
|
+
*/
|
|
75
|
+
private async recordCoordinatorForRecordIfSupported(record: ClusterRecord, peerId: PeerId): Promise<void> {
|
|
76
|
+
const op = record.message.operations[0]
|
|
77
|
+
if (!op) return
|
|
78
|
+
let id: string | undefined
|
|
79
|
+
if ('commit' in op) id = op.commit.blockIds[0]
|
|
80
|
+
else if ('pend' in op) id = blockIdsForTransforms(op.pend.transforms)[0]
|
|
81
|
+
if (id == null) return
|
|
82
|
+
const kbytes = await blockIdToBytes(id)
|
|
83
|
+
const pn: any = this.peerNetwork as any
|
|
84
|
+
if (typeof pn?.recordCoordinator === 'function') pn.recordCoordinator(kbytes, peerId)
|
|
66
85
|
}
|
|
67
86
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error envelope for the cluster protocol.
|
|
3
|
+
*
|
|
4
|
+
* When a cluster member throws while processing an `update` (validation,
|
|
5
|
+
* signature, merge, or consensus failure), the service serializes the error as
|
|
6
|
+
* this envelope and closes the stream normally instead of aborting it. The
|
|
7
|
+
* coordinator's {@link ClusterClient} detects the envelope and rethrows a real
|
|
8
|
+
* `Error` carrying the server's message/name/code — so the genuine cause is
|
|
9
|
+
* visible on the coordinator side (which already enables `optimystic:*` debug)
|
|
10
|
+
* rather than collapsing into an opaque `StreamResetError`.
|
|
11
|
+
*
|
|
12
|
+
* The marker key `__clusterError` cannot collide with a successful response: a
|
|
13
|
+
* {@link ClusterRecord} never carries a top-level field by this name, and the
|
|
14
|
+
* redirect payload is keyed under `redirect`.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Top-level key that marks a response as a structured cluster error. */
|
|
18
|
+
export const CLUSTER_ERROR_KEY = '__clusterError';
|
|
19
|
+
|
|
20
|
+
/** Serializable error detail carried in a {@link ClusterErrorEnvelope}. */
|
|
21
|
+
export interface ClusterErrorDetail {
|
|
22
|
+
message: string;
|
|
23
|
+
name: string;
|
|
24
|
+
/** Stable error code (e.g. libp2p `ERR_*`) when the source error carries one. */
|
|
25
|
+
code?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Wire shape of a structured cluster error response. */
|
|
29
|
+
export interface ClusterErrorEnvelope {
|
|
30
|
+
__clusterError: ClusterErrorDetail;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Build a {@link ClusterErrorEnvelope} from any thrown value. */
|
|
34
|
+
export function toClusterErrorEnvelope(err: unknown): ClusterErrorEnvelope {
|
|
35
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
36
|
+
const rawCode = (error as { code?: unknown }).code;
|
|
37
|
+
const detail: ClusterErrorDetail = {
|
|
38
|
+
message: error.message,
|
|
39
|
+
name: error.name
|
|
40
|
+
};
|
|
41
|
+
if (typeof rawCode === 'string' && rawCode.length > 0) {
|
|
42
|
+
detail.code = rawCode;
|
|
43
|
+
}
|
|
44
|
+
return { __clusterError: detail };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Type guard: is `value` a structured cluster error envelope (not a record/redirect)? */
|
|
48
|
+
export function isClusterErrorEnvelope(value: unknown): value is ClusterErrorEnvelope {
|
|
49
|
+
if (typeof value !== 'object' || value === null) return false;
|
|
50
|
+
const detail = (value as { [CLUSTER_ERROR_KEY]?: unknown })[CLUSTER_ERROR_KEY];
|
|
51
|
+
return typeof detail === 'object' && detail !== null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Reconstruct a real `Error` from a cluster error envelope, preserving `name`
|
|
56
|
+
* and `code` so the coordinator's reputation/penalty classification still works.
|
|
57
|
+
*/
|
|
58
|
+
export function clusterErrorFromEnvelope(envelope: ClusterErrorEnvelope): Error {
|
|
59
|
+
const detail = envelope[CLUSTER_ERROR_KEY];
|
|
60
|
+
const error = new Error(detail.message || 'cluster update failed');
|
|
61
|
+
if (detail.name) error.name = detail.name;
|
|
62
|
+
if (detail.code) (error as { code?: string }).code = detail.code;
|
|
63
|
+
return error;
|
|
64
|
+
}
|