@optimystic/db-p2p 0.14.1 → 0.16.3
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 +616 -609
- package/dist/src/cluster/block-transfer-service.d.ts.map +1 -1
- package/dist/src/cluster/block-transfer-service.js +4 -3
- package/dist/src/cluster/block-transfer-service.js.map +1 -1
- package/dist/src/cluster/block-transfer.d.ts +52 -3
- package/dist/src/cluster/block-transfer.d.ts.map +1 -1
- package/dist/src/cluster/block-transfer.js +129 -6
- package/dist/src/cluster/block-transfer.js.map +1 -1
- package/dist/src/cluster/client.d.ts.map +1 -1
- package/dist/src/cluster/client.js +3 -1
- package/dist/src/cluster/client.js.map +1 -1
- package/dist/src/cluster/cluster-repo.d.ts +182 -11
- package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
- package/dist/src/cluster/cluster-repo.js +429 -69
- package/dist/src/cluster/cluster-repo.js.map +1 -1
- package/dist/src/cluster/peer-key-binding.d.ts +25 -0
- package/dist/src/cluster/peer-key-binding.d.ts.map +1 -0
- package/dist/src/cluster/peer-key-binding.js +39 -0
- package/dist/src/cluster/peer-key-binding.js.map +1 -0
- package/dist/src/cluster/quorum-restore.d.ts +72 -0
- package/dist/src/cluster/quorum-restore.d.ts.map +1 -0
- package/dist/src/cluster/quorum-restore.js +0 -0
- package/dist/src/cluster/quorum-restore.js.map +1 -0
- package/dist/src/cluster/rebalance-monitor.d.ts +23 -1
- package/dist/src/cluster/rebalance-monitor.d.ts.map +1 -1
- package/dist/src/cluster/rebalance-monitor.js +17 -2
- package/dist/src/cluster/rebalance-monitor.js.map +1 -1
- package/dist/src/cluster/service.d.ts.map +1 -1
- package/dist/src/cluster/service.js +7 -1
- package/dist/src/cluster/service.js.map +1 -1
- package/dist/src/cluster/spread-on-churn.d.ts +7 -0
- package/dist/src/cluster/spread-on-churn.d.ts.map +1 -1
- package/dist/src/cluster/spread-on-churn.js +4 -1
- package/dist/src/cluster/spread-on-churn.js.map +1 -1
- package/dist/src/cluster/supermajority-coupling.d.ts +22 -0
- package/dist/src/cluster/supermajority-coupling.d.ts.map +1 -0
- package/dist/src/cluster/supermajority-coupling.js +27 -0
- package/dist/src/cluster/supermajority-coupling.js.map +1 -0
- package/dist/src/cohort-topic/cohort-gossip-driver.d.ts +46 -4
- package/dist/src/cohort-topic/cohort-gossip-driver.d.ts.map +1 -1
- package/dist/src/cohort-topic/cohort-gossip-driver.js +62 -7
- package/dist/src/cohort-topic/cohort-gossip-driver.js.map +1 -1
- package/dist/src/cohort-topic/cohort-gossip-transport.d.ts +7 -0
- package/dist/src/cohort-topic/cohort-gossip-transport.d.ts.map +1 -1
- package/dist/src/cohort-topic/cohort-gossip-transport.js +9 -0
- package/dist/src/cohort-topic/cohort-gossip-transport.js.map +1 -1
- package/dist/src/cohort-topic/host.d.ts +197 -27
- package/dist/src/cohort-topic/host.d.ts.map +1 -1
- package/dist/src/cohort-topic/host.js +643 -87
- package/dist/src/cohort-topic/host.js.map +1 -1
- package/dist/src/dispute/arbitrator-selection.d.ts +68 -7
- package/dist/src/dispute/arbitrator-selection.d.ts.map +1 -1
- package/dist/src/dispute/arbitrator-selection.js +105 -16
- package/dist/src/dispute/arbitrator-selection.js.map +1 -1
- package/dist/src/dispute/cascade.d.ts +7 -0
- package/dist/src/dispute/cascade.d.ts.map +1 -1
- package/dist/src/dispute/cascade.js +1 -1
- package/dist/src/dispute/cascade.js.map +1 -1
- package/dist/src/dispute/client.d.ts.map +1 -1
- package/dist/src/dispute/client.js +3 -2
- package/dist/src/dispute/client.js.map +1 -1
- package/dist/src/dispute/dispute-service.d.ts +32 -3
- package/dist/src/dispute/dispute-service.d.ts.map +1 -1
- package/dist/src/dispute/dispute-service.js +82 -9
- package/dist/src/dispute/dispute-service.js.map +1 -1
- package/dist/src/dispute/index.d.ts +1 -1
- package/dist/src/dispute/index.d.ts.map +1 -1
- package/dist/src/dispute/index.js +1 -1
- package/dist/src/dispute/index.js.map +1 -1
- package/dist/src/dispute/invalidation.d.ts +25 -0
- package/dist/src/dispute/invalidation.d.ts.map +1 -1
- package/dist/src/dispute/invalidation.js +14 -2
- package/dist/src/dispute/invalidation.js.map +1 -1
- package/dist/src/dispute/service.d.ts.map +1 -1
- package/dist/src/dispute/service.js +7 -1
- package/dist/src/dispute/service.js.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/it-utility.d.ts +1 -1
- package/dist/src/it-utility.d.ts.map +1 -1
- package/dist/src/it-utility.js +4 -13
- package/dist/src/it-utility.js.map +1 -1
- package/dist/src/libp2p-key-network.d.ts +98 -1
- package/dist/src/libp2p-key-network.d.ts.map +1 -1
- package/dist/src/libp2p-key-network.js +272 -17
- package/dist/src/libp2p-key-network.js.map +1 -1
- package/dist/src/libp2p-node-base.d.ts +12 -0
- package/dist/src/libp2p-node-base.d.ts.map +1 -1
- package/dist/src/libp2p-node-base.js +441 -89
- package/dist/src/libp2p-node-base.js.map +1 -1
- package/dist/src/matchmaking/query-transport.d.ts +2 -0
- package/dist/src/matchmaking/query-transport.d.ts.map +1 -1
- package/dist/src/matchmaking/query-transport.js +6 -0
- package/dist/src/matchmaking/query-transport.js.map +1 -1
- package/dist/src/matchmaking/traffic-validation.js +1 -0
- package/dist/src/matchmaking/traffic-validation.js.map +1 -1
- package/dist/src/network/network-manager-service.d.ts +2 -2
- package/dist/src/network/network-manager-service.d.ts.map +1 -1
- package/dist/src/network/network-manager-service.js +8 -4
- package/dist/src/network/network-manager-service.js.map +1 -1
- package/dist/src/owned-block-seed.d.ts +27 -0
- package/dist/src/owned-block-seed.d.ts.map +1 -0
- package/dist/src/owned-block-seed.js +37 -0
- package/dist/src/owned-block-seed.js.map +1 -0
- package/dist/src/protocol-client.d.ts +1 -0
- package/dist/src/protocol-client.d.ts.map +1 -1
- package/dist/src/protocol-client.js +9 -2
- package/dist/src/protocol-client.js.map +1 -1
- package/dist/src/protocol-limits.d.ts +32 -0
- package/dist/src/protocol-limits.d.ts.map +1 -0
- package/dist/src/protocol-limits.js +32 -0
- package/dist/src/protocol-limits.js.map +1 -0
- package/dist/src/repo/client.d.ts.map +1 -1
- package/dist/src/repo/client.js +3 -0
- package/dist/src/repo/client.js.map +1 -1
- package/dist/src/repo/cluster-coordinator.d.ts +41 -4
- package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
- package/dist/src/repo/cluster-coordinator.js +128 -80
- package/dist/src/repo/cluster-coordinator.js.map +1 -1
- package/dist/src/repo/coordinator-repo.d.ts +38 -1
- package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
- package/dist/src/repo/coordinator-repo.js +92 -13
- package/dist/src/repo/coordinator-repo.js.map +1 -1
- package/dist/src/repo/service.d.ts.map +1 -1
- package/dist/src/repo/service.js +7 -1
- package/dist/src/repo/service.js.map +1 -1
- package/dist/src/reputation/peer-reputation.js +1 -1
- package/dist/src/reputation/peer-reputation.js.map +1 -1
- package/dist/src/reputation/types.d.ts +3 -1
- package/dist/src/reputation/types.d.ts.map +1 -1
- package/dist/src/reputation/types.js +3 -0
- package/dist/src/reputation/types.js.map +1 -1
- package/dist/src/rn.d.ts +5 -1
- package/dist/src/rn.d.ts.map +1 -1
- package/dist/src/rn.js +7 -1
- package/dist/src/rn.js.map +1 -1
- package/dist/src/storage/arachnode-fret-adapter.d.ts +30 -1
- package/dist/src/storage/arachnode-fret-adapter.d.ts.map +1 -1
- package/dist/src/storage/arachnode-fret-adapter.js +15 -2
- package/dist/src/storage/arachnode-fret-adapter.js.map +1 -1
- package/dist/src/storage/arachnode-partition.d.ts +49 -0
- package/dist/src/storage/arachnode-partition.d.ts.map +1 -0
- package/dist/src/storage/arachnode-partition.js +61 -0
- package/dist/src/storage/arachnode-partition.js.map +1 -0
- package/dist/src/storage/block-storage.d.ts +40 -1
- package/dist/src/storage/block-storage.d.ts.map +1 -1
- package/dist/src/storage/block-storage.js +150 -57
- package/dist/src/storage/block-storage.js.map +1 -1
- package/dist/src/storage/i-block-storage.d.ts +8 -0
- package/dist/src/storage/i-block-storage.d.ts.map +1 -1
- package/dist/src/storage/i-raw-storage.d.ts +13 -0
- package/dist/src/storage/i-raw-storage.d.ts.map +1 -1
- package/dist/src/storage/kv-raw-storage.d.ts +45 -0
- package/dist/src/storage/kv-raw-storage.d.ts.map +1 -0
- package/dist/src/storage/kv-raw-storage.js +113 -0
- package/dist/src/storage/kv-raw-storage.js.map +1 -0
- package/dist/src/storage/memory-storage.d.ts +20 -58
- package/dist/src/storage/memory-storage.d.ts.map +1 -1
- package/dist/src/storage/memory-storage.js +22 -148
- package/dist/src/storage/memory-storage.js.map +1 -1
- package/dist/src/storage/memory-store-driver.d.ts +39 -0
- package/dist/src/storage/memory-store-driver.d.ts.map +1 -0
- package/dist/src/storage/memory-store-driver.js +129 -0
- package/dist/src/storage/memory-store-driver.js.map +1 -0
- package/dist/src/storage/raw-store-codec.d.ts +10 -0
- package/dist/src/storage/raw-store-codec.d.ts.map +1 -0
- package/dist/src/storage/raw-store-codec.js +36 -0
- package/dist/src/storage/raw-store-codec.js.map +1 -0
- package/dist/src/storage/raw-store-driver.d.ts +69 -0
- package/dist/src/storage/raw-store-driver.d.ts.map +1 -0
- package/dist/src/storage/raw-store-driver.js +2 -0
- package/dist/src/storage/raw-store-driver.js.map +1 -0
- package/dist/src/storage/restoration-coordinator-v2.d.ts.map +1 -1
- package/dist/src/storage/restoration-coordinator-v2.js +1 -1
- package/dist/src/storage/restoration-coordinator-v2.js.map +1 -1
- package/dist/src/storage/restoration-coordinator.d.ts +73 -0
- package/dist/src/storage/restoration-coordinator.d.ts.map +1 -0
- package/dist/src/storage/restoration-coordinator.js +181 -0
- package/dist/src/storage/restoration-coordinator.js.map +1 -0
- package/dist/src/storage/ring-selector.d.ts +92 -5
- package/dist/src/storage/ring-selector.d.ts.map +1 -1
- package/dist/src/storage/ring-selector.js +153 -51
- package/dist/src/storage/ring-selector.js.map +1 -1
- package/dist/src/storage/ring-shift-coordinator.d.ts +128 -0
- package/dist/src/storage/ring-shift-coordinator.d.ts.map +1 -0
- package/dist/src/storage/ring-shift-coordinator.js +196 -0
- package/dist/src/storage/ring-shift-coordinator.js.map +1 -0
- package/dist/src/storage/storage-monitor.d.ts +28 -0
- package/dist/src/storage/storage-monitor.d.ts.map +1 -1
- package/dist/src/storage/storage-monitor.js +42 -2
- package/dist/src/storage/storage-monitor.js.map +1 -1
- package/dist/src/storage/storage-repo.d.ts +19 -0
- package/dist/src/storage/storage-repo.d.ts.map +1 -1
- package/dist/src/storage/storage-repo.js +172 -22
- package/dist/src/storage/storage-repo.js.map +1 -1
- package/dist/src/sync/client.d.ts.map +1 -1
- package/dist/src/sync/client.js +5 -1
- package/dist/src/sync/client.js.map +1 -1
- package/dist/src/sync/service.d.ts.map +1 -1
- package/dist/src/sync/service.js +2 -1
- package/dist/src/sync/service.js.map +1 -1
- package/dist/src/testing/cohort-topic-mesh-harness.d.ts +28 -4
- package/dist/src/testing/cohort-topic-mesh-harness.d.ts.map +1 -1
- package/dist/src/testing/cohort-topic-mesh-harness.js +51 -10
- package/dist/src/testing/cohort-topic-mesh-harness.js.map +1 -1
- package/dist/src/testing/index.d.ts +1 -0
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +1 -0
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/testing/mesh-harness.d.ts.map +1 -1
- package/dist/src/testing/mesh-harness.js +15 -7
- package/dist/src/testing/mesh-harness.js.map +1 -1
- package/dist/src/testing/raw-storage-conformance.d.ts +24 -0
- package/dist/src/testing/raw-storage-conformance.d.ts.map +1 -0
- package/dist/src/testing/raw-storage-conformance.js +313 -0
- package/dist/src/testing/raw-storage-conformance.js.map +1 -0
- package/package.json +4 -4
- package/src/cluster/block-transfer-service.ts +4 -3
- package/src/cluster/block-transfer.ts +424 -265
- package/src/cluster/client.ts +3 -1
- package/src/cluster/cluster-repo.ts +481 -71
- package/src/cluster/peer-key-binding.ts +37 -0
- package/src/cluster/quorum-restore.ts +0 -0
- package/src/cluster/rebalance-monitor.ts +34 -3
- package/src/cluster/service.ts +7 -1
- package/src/cluster/spread-on-churn.ts +11 -1
- package/src/cluster/supermajority-coupling.ts +37 -0
- package/src/cohort-topic/cohort-gossip-driver.ts +96 -9
- package/src/cohort-topic/cohort-gossip-transport.ts +10 -0
- package/src/cohort-topic/host.ts +831 -105
- package/src/dispute/arbitrator-selection.ts +138 -28
- package/src/dispute/cascade.ts +8 -1
- package/src/dispute/client.ts +3 -2
- package/src/dispute/dispute-service.ts +94 -9
- package/src/dispute/index.ts +7 -1
- package/src/dispute/invalidation.ts +40 -2
- package/src/dispute/service.ts +7 -1
- package/src/index.ts +46 -43
- package/src/it-utility.ts +5 -13
- package/src/libp2p-key-network.ts +281 -18
- package/src/libp2p-node-base.ts +511 -81
- package/src/matchmaking/query-transport.ts +9 -0
- package/src/network/network-manager-service.ts +8 -2
- package/src/owned-block-seed.ts +40 -0
- package/src/protocol-client.ts +10 -3
- package/src/protocol-limits.ts +33 -0
- package/src/repo/client.ts +3 -0
- package/src/repo/cluster-coordinator.ts +145 -82
- package/src/repo/coordinator-repo.ts +96 -16
- package/src/repo/service.ts +7 -1
- package/src/reputation/types.ts +3 -0
- package/src/rn.ts +7 -1
- package/src/storage/arachnode-fret-adapter.ts +33 -2
- package/src/storage/arachnode-partition.ts +74 -0
- package/src/storage/block-storage.ts +169 -61
- package/src/storage/i-block-storage.ts +9 -0
- package/src/storage/i-raw-storage.ts +14 -0
- package/src/storage/kv-raw-storage.ts +135 -0
- package/src/storage/memory-storage.ts +25 -173
- package/src/storage/memory-store-driver.ts +157 -0
- package/src/storage/raw-store-codec.ts +42 -0
- package/src/storage/raw-store-driver.ts +80 -0
- package/src/storage/{restoration-coordinator-v2.ts → restoration-coordinator.ts} +43 -37
- package/src/storage/ring-selector.ts +317 -176
- package/src/storage/ring-shift-coordinator.ts +271 -0
- package/src/storage/storage-monitor.ts +70 -3
- package/src/storage/storage-repo.ts +710 -558
- package/src/sync/client.ts +5 -1
- package/src/sync/service.ts +2 -1
- package/src/testing/cohort-topic-mesh-harness.ts +61 -11
- package/src/testing/index.ts +1 -0
- package/src/testing/mesh-harness.ts +14 -6
- package/src/testing/raw-storage-conformance.ts +397 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoration-coordinator-v2.js","sourceRoot":"","sources":["../../../src/storage/restoration-coordinator-v2.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"restoration-coordinator-v2.js","sourceRoot":"","sources":["../../../src/storage/restoration-coordinator-v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { BlockId } from '@optimystic/db-core';
|
|
2
|
+
import type { BlockArchive, RestoreCallback } from './struct.js';
|
|
3
|
+
import type { IPeerNetwork } from '@optimystic/db-core';
|
|
4
|
+
import type { ArachnodeFretAdapter } from './arachnode-fret-adapter.js';
|
|
5
|
+
/**
|
|
6
|
+
* Coordinates block restoration across discovered Arachnode storage rings.
|
|
7
|
+
*
|
|
8
|
+
* Queries rings in order of broader coverage (inner rings first):
|
|
9
|
+
* 1. Transaction ring peers (my ring)
|
|
10
|
+
* 2. Inner storage rings (Ring N-1, N-2, ..., Ring 0)
|
|
11
|
+
*
|
|
12
|
+
* Each ring is discovered dynamically via FRET neighbor snapshots.
|
|
13
|
+
*/
|
|
14
|
+
export declare class RestorationCoordinator {
|
|
15
|
+
private readonly fretAdapter;
|
|
16
|
+
private readonly peerNetwork;
|
|
17
|
+
private readonly protocolPrefix;
|
|
18
|
+
/** Optional self peer id — used to skip dialing self on solo/bootstrap nodes. */
|
|
19
|
+
private readonly selfPeerId?;
|
|
20
|
+
private readonly metrics;
|
|
21
|
+
constructor(fretAdapter: ArachnodeFretAdapter, peerNetwork: IPeerNetwork, protocolPrefix: string,
|
|
22
|
+
/** Optional self peer id — used to skip dialing self on solo/bootstrap nodes. */
|
|
23
|
+
selfPeerId?: string | undefined);
|
|
24
|
+
private readonly log;
|
|
25
|
+
/**
|
|
26
|
+
* Restore a block by querying discovered storage rings.
|
|
27
|
+
*/
|
|
28
|
+
restore(blockId: BlockId, rev?: number): Promise<BlockArchive | undefined>;
|
|
29
|
+
/**
|
|
30
|
+
* Create a RestoreCallback function that uses this coordinator.
|
|
31
|
+
*/
|
|
32
|
+
createRestoreCallback(): RestoreCallback;
|
|
33
|
+
/**
|
|
34
|
+
* Get peers in my transaction ring for a given block.
|
|
35
|
+
* @param blockCoord the block id already hashed into the shared coordinate space.
|
|
36
|
+
*/
|
|
37
|
+
private getMyRingPeers;
|
|
38
|
+
/**
|
|
39
|
+
* Get my own ring depth from Arachnode info.
|
|
40
|
+
*/
|
|
41
|
+
private getMyRingDepth;
|
|
42
|
+
/**
|
|
43
|
+
* Filter peers by partition responsibility.
|
|
44
|
+
* @param blockCoord the block id hashed into the shared coordinate space (same space
|
|
45
|
+
* RingSelector.calculatePartition uses for peer partitions).
|
|
46
|
+
*/
|
|
47
|
+
private filterByPartition;
|
|
48
|
+
/**
|
|
49
|
+
* Query a specific peer for a block.
|
|
50
|
+
*/
|
|
51
|
+
private queryPeer;
|
|
52
|
+
/**
|
|
53
|
+
* Record successful restoration from a ring.
|
|
54
|
+
*/
|
|
55
|
+
private recordSuccess;
|
|
56
|
+
/**
|
|
57
|
+
* Record that a ring was queried during a restore but did not yield the block.
|
|
58
|
+
* Counterpart to {@link recordSuccess}: the ring — not the individual peer query — is the
|
|
59
|
+
* failure unit, so this increments once per exhausted ring at the points where the peer
|
|
60
|
+
* loops in {@link restore} complete without returning an archive.
|
|
61
|
+
*/
|
|
62
|
+
private recordFailure;
|
|
63
|
+
/**
|
|
64
|
+
* Get restoration metrics for monitoring.
|
|
65
|
+
*/
|
|
66
|
+
getMetrics(): {
|
|
67
|
+
totalRequests: number;
|
|
68
|
+
successByRing: Map<number, number>;
|
|
69
|
+
failureByRing: Map<number, number>;
|
|
70
|
+
averageDurationMs: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=restoration-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restoration-coordinator.d.ts","sourceRoot":"","sources":["../../../src/storage/restoration-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAIxE;;;;;;;;GAQG;AACH,qBAAa,sBAAsB;IASjC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAZ7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAKtB;gBAGgB,WAAW,EAAE,oBAAoB,EACjC,WAAW,EAAE,YAAY,EACzB,cAAc,EAAE,MAAM;IACvC,iFAAiF;IAChE,UAAU,CAAC,EAAE,MAAM,YAAA;IAGrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsC;IAE1D;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA4DhF;;OAEG;IACH,qBAAqB,IAAI,eAAe;IAMxC;;;OAGG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;YACW,SAAS;IAiBvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,UAAU,IAAI;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,iBAAiB,EAAE,MAAM,CAAC;KAC1B;CAWD"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { hashKey } from 'p2p-fret';
|
|
2
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
3
|
+
import { SyncClient } from '../sync/client.js';
|
|
4
|
+
import { partitionCovers } from './arachnode-partition.js';
|
|
5
|
+
import { createLogger } from '../logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Coordinates block restoration across discovered Arachnode storage rings.
|
|
8
|
+
*
|
|
9
|
+
* Queries rings in order of broader coverage (inner rings first):
|
|
10
|
+
* 1. Transaction ring peers (my ring)
|
|
11
|
+
* 2. Inner storage rings (Ring N-1, N-2, ..., Ring 0)
|
|
12
|
+
*
|
|
13
|
+
* Each ring is discovered dynamically via FRET neighbor snapshots.
|
|
14
|
+
*/
|
|
15
|
+
export class RestorationCoordinator {
|
|
16
|
+
fretAdapter;
|
|
17
|
+
peerNetwork;
|
|
18
|
+
protocolPrefix;
|
|
19
|
+
selfPeerId;
|
|
20
|
+
metrics = {
|
|
21
|
+
totalRequests: 0,
|
|
22
|
+
successByRing: new Map(),
|
|
23
|
+
failureByRing: new Map(),
|
|
24
|
+
averageDurationMs: 0
|
|
25
|
+
};
|
|
26
|
+
constructor(fretAdapter, peerNetwork, protocolPrefix,
|
|
27
|
+
/** Optional self peer id — used to skip dialing self on solo/bootstrap nodes. */
|
|
28
|
+
selfPeerId) {
|
|
29
|
+
this.fretAdapter = fretAdapter;
|
|
30
|
+
this.peerNetwork = peerNetwork;
|
|
31
|
+
this.protocolPrefix = protocolPrefix;
|
|
32
|
+
this.selfPeerId = selfPeerId;
|
|
33
|
+
}
|
|
34
|
+
log = createLogger('storage:restoration');
|
|
35
|
+
/**
|
|
36
|
+
* Restore a block by querying discovered storage rings.
|
|
37
|
+
*/
|
|
38
|
+
async restore(blockId, rev) {
|
|
39
|
+
const startTime = Date.now();
|
|
40
|
+
this.metrics.totalRequests++;
|
|
41
|
+
// Hash the block id once into the shared coordinate space. Peer responsibility
|
|
42
|
+
// (RingSelector.calculatePartition) and cohort assembly both operate on hashed
|
|
43
|
+
// coords, so restoration must filter in the same space — see getMyRingPeers and
|
|
44
|
+
// filterByPartition below, which reuse this value.
|
|
45
|
+
const blockCoord = await hashKey(new TextEncoder().encode(blockId));
|
|
46
|
+
// 1. Try my transaction ring peers first
|
|
47
|
+
const myPeers = this.getMyRingPeers(blockCoord);
|
|
48
|
+
const myRingDepth = this.getMyRingDepth();
|
|
49
|
+
// Avoid dialing self: on a solo/bootstrap node with no listenAddrs, dialing self
|
|
50
|
+
// either hangs or fails noisily. Filter self out of the ring-peer list so the loop
|
|
51
|
+
// below can no-op cleanly when self is the only candidate.
|
|
52
|
+
const nonSelfMyPeers = this.selfPeerId
|
|
53
|
+
? myPeers.filter(p => p !== this.selfPeerId)
|
|
54
|
+
: myPeers;
|
|
55
|
+
if (nonSelfMyPeers.length === 0 && myRingDepth <= 0) {
|
|
56
|
+
this.log('restore:solo-node-skip blockId=%s', blockId);
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
for (const peerId of nonSelfMyPeers) {
|
|
60
|
+
const archive = await this.queryPeer(peerId, blockId, rev);
|
|
61
|
+
if (archive) {
|
|
62
|
+
this.recordSuccess(myRingDepth, blockId, Date.now() - startTime);
|
|
63
|
+
return archive;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// My transaction ring was queried and yielded nothing — count it as one ring failure.
|
|
67
|
+
this.recordFailure(myRingDepth);
|
|
68
|
+
// 2. Try inner storage rings (broader coverage)
|
|
69
|
+
for (let ringDepth = myRingDepth - 1; ringDepth >= 0; ringDepth--) {
|
|
70
|
+
const storagePeers = this.fretAdapter.findPeersAtRing(ringDepth);
|
|
71
|
+
// Filter to peers responsible for this block's partition (skip self — cannot dial self).
|
|
72
|
+
const responsiblePeers = this.filterByPartition(storagePeers, blockCoord, ringDepth)
|
|
73
|
+
.filter(p => !this.selfPeerId || p !== this.selfPeerId);
|
|
74
|
+
for (const peerIdStr of responsiblePeers) {
|
|
75
|
+
const archive = await this.queryPeer(peerIdStr, blockId, rev);
|
|
76
|
+
if (archive) {
|
|
77
|
+
this.recordSuccess(ringDepth, blockId, Date.now() - startTime);
|
|
78
|
+
return archive;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// This inner ring was queried and yielded nothing — count it as one ring failure.
|
|
82
|
+
this.recordFailure(ringDepth);
|
|
83
|
+
}
|
|
84
|
+
// No ring had the data
|
|
85
|
+
const duration = Date.now() - startTime;
|
|
86
|
+
this.log('restore failed for block %s after %dms', blockId, duration);
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a RestoreCallback function that uses this coordinator.
|
|
91
|
+
*/
|
|
92
|
+
createRestoreCallback() {
|
|
93
|
+
return async (blockId, rev) => {
|
|
94
|
+
return await this.restore(blockId, rev);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get peers in my transaction ring for a given block.
|
|
99
|
+
* @param blockCoord the block id already hashed into the shared coordinate space.
|
|
100
|
+
*/
|
|
101
|
+
getMyRingPeers(blockCoord) {
|
|
102
|
+
return this.fretAdapter.getFret().assembleCohort(blockCoord, 10);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get my own ring depth from Arachnode info.
|
|
106
|
+
*/
|
|
107
|
+
getMyRingDepth() {
|
|
108
|
+
const myInfo = this.fretAdapter.getMyArachnodeInfo();
|
|
109
|
+
return myInfo?.ringDepth ?? 8; // Default to Ring 8
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Filter peers by partition responsibility.
|
|
113
|
+
* @param blockCoord the block id hashed into the shared coordinate space (same space
|
|
114
|
+
* RingSelector.calculatePartition uses for peer partitions).
|
|
115
|
+
*/
|
|
116
|
+
filterByPartition(peers, blockCoord, ringDepth) {
|
|
117
|
+
if (ringDepth === 0) {
|
|
118
|
+
return peers; // Ring 0 covers all blocks
|
|
119
|
+
}
|
|
120
|
+
return peers.filter(peerId => {
|
|
121
|
+
const info = this.fretAdapter.getArachnodeInfo(peerId);
|
|
122
|
+
if (!info || !info.partition)
|
|
123
|
+
return false;
|
|
124
|
+
// Compare block prefix vs peer partition via the shared responsibility derivation.
|
|
125
|
+
return partitionCovers(info.partition, blockCoord);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Query a specific peer for a block.
|
|
130
|
+
*/
|
|
131
|
+
async queryPeer(peerIdStr, blockId, rev) {
|
|
132
|
+
try {
|
|
133
|
+
const peerId = peerIdFromString(peerIdStr);
|
|
134
|
+
const client = new SyncClient(peerId, this.peerNetwork, this.protocolPrefix);
|
|
135
|
+
const response = await client.requestBlock({ blockId, rev });
|
|
136
|
+
return response.success ? response.archive : undefined;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
this.log('queryPeer failed for %s - %o', peerIdStr, error);
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Record successful restoration from a ring.
|
|
145
|
+
*/
|
|
146
|
+
recordSuccess(ringDepth, blockId, durationMs) {
|
|
147
|
+
const count = this.metrics.successByRing.get(ringDepth) ?? 0;
|
|
148
|
+
this.metrics.successByRing.set(ringDepth, count + 1);
|
|
149
|
+
// Update rolling average duration
|
|
150
|
+
const totalSuccesses = Array.from(this.metrics.successByRing.values())
|
|
151
|
+
.reduce((sum, c) => sum + c, 0);
|
|
152
|
+
const prevTotal = this.metrics.averageDurationMs * (totalSuccesses - 1);
|
|
153
|
+
this.metrics.averageDurationMs = (prevTotal + durationMs) / totalSuccesses;
|
|
154
|
+
this.log('[Ring %d] Successfully restored block %s in %dms', ringDepth, blockId, durationMs);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Record that a ring was queried during a restore but did not yield the block.
|
|
158
|
+
* Counterpart to {@link recordSuccess}: the ring — not the individual peer query — is the
|
|
159
|
+
* failure unit, so this increments once per exhausted ring at the points where the peer
|
|
160
|
+
* loops in {@link restore} complete without returning an archive.
|
|
161
|
+
*/
|
|
162
|
+
recordFailure(ringDepth) {
|
|
163
|
+
const count = this.metrics.failureByRing.get(ringDepth) ?? 0;
|
|
164
|
+
this.metrics.failureByRing.set(ringDepth, count + 1);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get restoration metrics for monitoring.
|
|
168
|
+
*/
|
|
169
|
+
getMetrics() {
|
|
170
|
+
// Copy the Maps: a bare `{ ...this.metrics }` spreads only the top level, handing the
|
|
171
|
+
// caller the SAME Map instances this coordinator keeps mutating — the snapshot would
|
|
172
|
+
// then change under the caller's feet, and a caller mutation would corrupt internal state.
|
|
173
|
+
return {
|
|
174
|
+
totalRequests: this.metrics.totalRequests,
|
|
175
|
+
successByRing: new Map(this.metrics.successByRing),
|
|
176
|
+
failureByRing: new Map(this.metrics.failureByRing),
|
|
177
|
+
averageDurationMs: this.metrics.averageDurationMs
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=restoration-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restoration-coordinator.js","sourceRoot":"","sources":["../../../src/storage/restoration-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,29 @@ export interface RingSelectorConfig {
|
|
|
10
10
|
/** Move to inner ring when used < this % */
|
|
11
11
|
moveIn: number;
|
|
12
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* EWMA weight (0..1) applied to the demand inputs (available capacity and estimated network
|
|
15
|
+
* data) each sample tick. A single noisy sample only moves the smoothed depth by this fraction.
|
|
16
|
+
* Default {@link DEFAULT_SMOOTHING_ALPHA} (0.2).
|
|
17
|
+
*/
|
|
18
|
+
smoothingAlpha?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Hysteresis dead-band half-width `h`, in rings. A move only fires when the smoothed depth is
|
|
21
|
+
* past the ring boundary by `h`, so the region of width `2h` around each integer produces no
|
|
22
|
+
* move. Default {@link DEFAULT_DEADBAND} (0.5) — a full ring between the move-out and move-in
|
|
23
|
+
* triggers, so a node can never satisfy both at once.
|
|
24
|
+
*/
|
|
25
|
+
deadband?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Minimum dwell in ms: no new move may be triggered within this window of the last one. Bounds
|
|
28
|
+
* shift frequency independent of signal noise. Default {@link DEFAULT_MIN_DWELL_MS} (10 min).
|
|
29
|
+
*/
|
|
30
|
+
minDwellMs?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Injectable clock (Unix ms), used only for the dwell timer. Defaults to `Date.now`; tests
|
|
33
|
+
* inject a fake clock so dwell can be exercised without sleeping on wall time.
|
|
34
|
+
*/
|
|
35
|
+
now?: () => number;
|
|
13
36
|
}
|
|
14
37
|
/**
|
|
15
38
|
* Determines appropriate ring depth based on storage capacity and network demand.
|
|
@@ -19,16 +42,57 @@ export interface RingSelectorConfig {
|
|
|
19
42
|
* - Ring N: 2^N partitions
|
|
20
43
|
*
|
|
21
44
|
* A node selects its ring based on: available_capacity / estimated_neighborhood_demand
|
|
45
|
+
*
|
|
46
|
+
* The transition decision ({@link shouldTransition}) is damped so it does not thrash near a ring
|
|
47
|
+
* boundary: the demand signal is smoothed with an EWMA, a dead-band keeps a hovering ratio from
|
|
48
|
+
* moving, and a minimum-dwell timer + single-step rule bound how often and how far it moves. See
|
|
49
|
+
* `docs/arachnode-ring-handoff.md` § Part 1.
|
|
22
50
|
*/
|
|
23
51
|
export declare class RingSelector {
|
|
24
52
|
private readonly fretAdapter;
|
|
25
53
|
private readonly storageMonitor;
|
|
26
54
|
private readonly config;
|
|
55
|
+
/** EWMA of available capacity (bytes). Undefined until the first sample seeds it. */
|
|
56
|
+
private smoothedAvailable;
|
|
57
|
+
/** EWMA of estimated total network data (bytes). Undefined until the first sample seeds it. */
|
|
58
|
+
private smoothedTotalData;
|
|
59
|
+
/** Clock time (ms) a move was last triggered; undefined = no move yet, so dwell does not block. */
|
|
60
|
+
private lastMoveAt;
|
|
61
|
+
private readonly now;
|
|
27
62
|
constructor(fretAdapter: ArachnodeFretAdapter, storageMonitor: StorageMonitor, config: RingSelectorConfig);
|
|
28
63
|
/**
|
|
29
|
-
* Determine appropriate ring depth
|
|
64
|
+
* Determine appropriate ring depth from an instantaneous capacity + demand snapshot.
|
|
65
|
+
*
|
|
66
|
+
* This is the *undamped* reading used for the deterministic first-boot ring and anywhere a
|
|
67
|
+
* one-shot estimate is wanted. The damped transition logic lives in {@link shouldTransition};
|
|
68
|
+
* this method intentionally does not touch the EWMA state so its result is a pure function of
|
|
69
|
+
* the current snapshot.
|
|
30
70
|
*/
|
|
31
71
|
determineRing(): Promise<number>;
|
|
72
|
+
/**
|
|
73
|
+
* Estimate total network spare capacity (bytes) by aggregating observed per-ring stats.
|
|
74
|
+
*
|
|
75
|
+
* See docs/arachnode.md §"Capacity Management and Ring Adjustment": ring selection should
|
|
76
|
+
* reflect observed network demand, not a hard-coded constant. We treat Σ (peerCount ×
|
|
77
|
+
* avgCapacity) over known rings as a proxy for total network spare capacity, so `coverage`
|
|
78
|
+
* becomes our share of it. More peers (or richer peers) → smaller share → higher ring depth
|
|
79
|
+
* (more specialization). On bootstrap, when no ring stats are observed yet, we fall back to a
|
|
80
|
+
* conservative fixed estimate so first-boot behavior is deterministic.
|
|
81
|
+
*
|
|
82
|
+
* @param availableForFallback local available bytes, used only for the pathological
|
|
83
|
+
* zero-aggregate case (e.g. all peers report 0 available) so coverage collapses to 1.0 (ring 0).
|
|
84
|
+
*/
|
|
85
|
+
private estimateNetworkData;
|
|
86
|
+
/**
|
|
87
|
+
* Fold one sample into the EWMA of each demand input. Seeds from the first real sample rather
|
|
88
|
+
* than from 0 — a 0 seed would drag the smoothed depth for many ticks.
|
|
89
|
+
*/
|
|
90
|
+
private updateSmoothing;
|
|
91
|
+
/**
|
|
92
|
+
* Continuous smoothed ring depth `d = clamp(-log2(smoothedCoverage), 0, 16)` from the current
|
|
93
|
+
* EWMA state. Returns 0 (ring 0) if no sample has been folded in yet.
|
|
94
|
+
*/
|
|
95
|
+
private smoothedDepth;
|
|
32
96
|
/**
|
|
33
97
|
* Calculate partition for a given ring depth and peer ID.
|
|
34
98
|
*/
|
|
@@ -38,10 +102,28 @@ export declare class RingSelector {
|
|
|
38
102
|
} | undefined>;
|
|
39
103
|
/**
|
|
40
104
|
* Create Arachnode info for this node.
|
|
105
|
+
*
|
|
106
|
+
* @param ringDepthOverride when supplied (e.g. the single-step target from
|
|
107
|
+
* {@link shouldTransition}), the node advertises exactly this ring instead of a freshly
|
|
108
|
+
* recomputed {@link determineRing}. The transition site passes it so the advertised ring can
|
|
109
|
+
* never disagree with the ring the transition decision just chose.
|
|
41
110
|
*/
|
|
42
|
-
createArachnodeInfo(peerId: string): Promise<ArachnodeInfo>;
|
|
111
|
+
createArachnodeInfo(peerId: string, ringDepthOverride?: number): Promise<ArachnodeInfo>;
|
|
43
112
|
/**
|
|
44
|
-
*
|
|
113
|
+
* Decide whether a damped ring transition should start.
|
|
114
|
+
*
|
|
115
|
+
* Damping (see `docs/arachnode-ring-handoff.md` § Part 1):
|
|
116
|
+
* - **Smoothing** — every call folds the current sample into an EWMA of the demand inputs and
|
|
117
|
+
* works off the smoothed continuous depth `d`, so a single noisy sample cannot trigger a move.
|
|
118
|
+
* - **Hysteresis** — anchored on the node's *currently-advertised* ring `R` (not a freshly
|
|
119
|
+
* recomputed one). A move only fires when `d` is past the boundary by the dead-band `h`, so a
|
|
120
|
+
* ratio hovering around an integer produces no move.
|
|
121
|
+
* - **Dwell + single-step** — no new move within `minDwellMs` of the last, no move while a shift
|
|
122
|
+
* is already in flight (`status === 'moving'`), and each move steps by exactly ±1 ring even
|
|
123
|
+
* when `d` implies a larger jump.
|
|
124
|
+
*
|
|
125
|
+
* Return shape (`{ shouldMove, direction, newRingDepth }`) is the *trigger* the handoff protocol
|
|
126
|
+
* consumes; it is kept stable so that consumer is unaffected.
|
|
45
127
|
*/
|
|
46
128
|
shouldTransition(): Promise<{
|
|
47
129
|
shouldMove: boolean;
|
|
@@ -49,8 +131,13 @@ export declare class RingSelector {
|
|
|
49
131
|
newRingDepth?: number;
|
|
50
132
|
}>;
|
|
51
133
|
/**
|
|
52
|
-
*
|
|
134
|
+
* Re-stamp the dwell timer at the moment a ring shift *settles* — the driver
|
|
135
|
+
* (`RingShiftCoordinator` via `libp2p-node-base`) calls this once `executeShift` resolves, for a
|
|
136
|
+
* completed OR a rolled-back move. So the minimum dwell is measured from the settled shift rather
|
|
137
|
+
* than only from the trigger (`shouldTransition`): a completed shift dwells `minDwellMs` before the
|
|
138
|
+
* next move (spec §1.3, "after a *completed* shift"), and a shift that keeps failing is rate-limited
|
|
139
|
+
* rather than retried every tick. No-op-safe to call when no shift ran.
|
|
53
140
|
*/
|
|
54
|
-
|
|
141
|
+
recordShiftSettled(): void;
|
|
55
142
|
}
|
|
56
143
|
//# sourceMappingURL=ring-selector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ring-selector.d.ts","sourceRoot":"","sources":["../../../src/storage/ring-selector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ring-selector.d.ts","sourceRoot":"","sources":["../../../src/storage/ring-selector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAYvF,MAAM,WAAW,kBAAkB;IAClC,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,UAAU,EAAE;QACX,4CAA4C;QAC5C,OAAO,EAAE,MAAM,CAAC;QAChB,4CAA4C;QAC5C,MAAM,EAAE,MAAM,CAAC;KACf,CAAC;IAEF;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IAUvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXxB,qFAAqF;IACrF,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,+FAA+F;IAC/F,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,mGAAmG;IACnG,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAGjB,WAAW,EAAE,oBAAoB,EACjC,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,kBAAkB;IAK5C;;;;;;;OAOG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAwBtC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAUvB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACG,kBAAkB,CACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAkBnE;;;;;;;OAOG;IACG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAmB7F;;;;;;;;;;;;;;;OAeG;IACG,gBAAgB,IAAI,OAAO,CAAC;QACjC,UAAU,EAAE,OAAO,CAAC;QACpB,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAA;KACrB,CAAC;IAwDF;;;;;;;OAOG;IACH,kBAAkB,IAAI,IAAI;CAG1B"}
|