@claw-network/core 0.5.2 → 0.6.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.
@@ -1,3 +1,26 @@
1
+ /** Fine-grained circuit-relay-v2 server configuration. */
2
+ export interface RelayConfig {
3
+ /** Enable circuit-relay-v2 server. Default: true */
4
+ enabled: boolean;
5
+ /** Maximum simultaneous relay circuits. Default: 64 */
6
+ maxCircuits: number;
7
+ /** Maximum relay bandwidth per circuit (bytes/sec). Default: 1048576 (1 MB/s) */
8
+ maxBandwidthBps: number;
9
+ /** Relay reservation TTL in seconds. Default: 3600 */
10
+ reservationTtlSec: number;
11
+ /** Maximum data per circuit (bytes). Default: 10485760 (10 MB) */
12
+ maxCircuitBytes: number;
13
+ /** Maximum simultaneous relay circuits per peer. Default: 4 */
14
+ maxCircuitsPerPeer: number;
15
+ /** Maximum new reservations per peer per minute. Default: 10 */
16
+ maxReservationsPerPeerPerMin: number;
17
+ /** Access control mode. Default: 'open' */
18
+ accessMode: 'open' | 'whitelist' | 'blacklist';
19
+ /** DID list for whitelist/blacklist mode. Default: [] */
20
+ accessList: string[];
21
+ }
22
+ export declare const DEFAULT_RELAY_CONFIG: RelayConfig;
23
+ export declare const BOOTSTRAP_RELAY_CONFIG: RelayConfig;
1
24
  export interface P2PConfig {
2
25
  listen: string[];
3
26
  bootstrap: string[];
@@ -7,6 +30,8 @@ export interface P2PConfig {
7
30
  enableDcutr: boolean;
8
31
  /** Enable circuit relay v2 for NAT traversal. Default: true */
9
32
  enableCircuitRelay: boolean;
33
+ /** Fine-grained relay server configuration. Overrides enableCircuitRelay when present. */
34
+ relay?: Partial<RelayConfig>;
10
35
  /** Flood-publish to ALL connected peers instead of only mesh peers. Default: true */
11
36
  floodPublish?: boolean;
12
37
  /** GossipSub mesh degree target (D). Default: 3 (suitable for small networks) */
@@ -26,6 +51,8 @@ export interface P2PConfig {
26
51
  yamuxMaxInboundStreams?: number;
27
52
  pubsubTopics?: string[];
28
53
  }
54
+ /** Resolve the effective RelayConfig from a P2PConfig. */
55
+ export declare function resolveRelayConfig(config: P2PConfig): RelayConfig;
29
56
  /**
30
57
  * Official devnet bootstrap node.
31
58
  * New nodes connect here first to discover the rest of the network via Kademlia DHT.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/p2p/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,uBAAuB,EAAE,OAAO,CAAC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qFAAqF;IACrF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,6DAA6D;IAC7D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,yFACwD,CAAC;AAEzF,eAAO,MAAM,kBAAkB,EAAE,SAchC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAkBlC,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/p2p/config.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,eAAe,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,eAAe,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,4BAA4B,EAAE,MAAM,CAAC;IACrC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;IAC/C,yDAAyD;IACzD,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,oBAAoB,EAAE,WAUlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,WAMpC,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,uBAAuB,EAAE,OAAO,CAAC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,kBAAkB,EAAE,OAAO,CAAC;IAC5B,0FAA0F;IAC1F,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,qFAAqF;IACrF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,6DAA6D;IAC7D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAIjE;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,yFACwD,CAAC;AAEzF,eAAO,MAAM,kBAAkB,EAAE,SAehC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAmBlC,CAAC"}
@@ -1,3 +1,27 @@
1
+ export const DEFAULT_RELAY_CONFIG = {
2
+ enabled: true,
3
+ maxCircuits: 64,
4
+ maxBandwidthBps: 1_048_576,
5
+ reservationTtlSec: 3600,
6
+ maxCircuitBytes: 10_485_760,
7
+ maxCircuitsPerPeer: 4,
8
+ maxReservationsPerPeerPerMin: 10,
9
+ accessMode: 'open',
10
+ accessList: [],
11
+ };
12
+ export const BOOTSTRAP_RELAY_CONFIG = {
13
+ ...DEFAULT_RELAY_CONFIG,
14
+ maxCircuits: 256,
15
+ maxBandwidthBps: 10_485_760,
16
+ maxCircuitsPerPeer: 8,
17
+ maxReservationsPerPeerPerMin: 20,
18
+ };
19
+ /** Resolve the effective RelayConfig from a P2PConfig. */
20
+ export function resolveRelayConfig(config) {
21
+ const base = config.relay ?? {};
22
+ const enabled = base.enabled ?? config.enableCircuitRelay;
23
+ return { ...DEFAULT_RELAY_CONFIG, ...base, enabled };
24
+ }
1
25
  /**
2
26
  * Official devnet bootstrap node.
3
27
  * New nodes connect here first to discover the rest of the network via Kademlia DHT.
@@ -12,6 +36,7 @@ export const DEFAULT_P2P_CONFIG = {
12
36
  enableAutoNAT: true,
13
37
  enableDcutr: true,
14
38
  enableCircuitRelay: true,
39
+ relay: { ...DEFAULT_RELAY_CONFIG },
15
40
  floodPublish: true,
16
41
  meshD: 3,
17
42
  meshDlo: 1,
@@ -35,6 +60,7 @@ export const BOOTSTRAP_P2P_CONFIG = {
35
60
  enableAutoNAT: true,
36
61
  enableDcutr: true,
37
62
  enableCircuitRelay: true,
63
+ relay: { ...BOOTSTRAP_RELAY_CONFIG },
38
64
  floodPublish: false, // CRITICAL: prevent O(N) flood amplification
39
65
  meshD: 6, // higher mesh degree for hub topology
40
66
  meshDlo: 3,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/p2p/config.ts"],"names":[],"mappings":"AA6BA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAC9B,sFAAsF,CAAC;AAEzF,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,MAAM,EAAE,CAAC,uBAAuB,CAAC;IACjC,SAAS,EAAE,CAAC,mBAAmB,CAAC;IAChC,SAAS,EAAE,IAAI;IACf,uBAAuB,EAAE,IAAI;IAC7B,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,IAAI;IACjB,kBAAkB,EAAE,IAAI;IACxB,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,iBAAiB,EAAE,GAAG;IACtB,sBAAsB,EAAE,GAAG;CAC5B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAc;IAC7C,MAAM,EAAE,CAAC,uBAAuB,CAAC;IACjC,SAAS,EAAE,EAAE,EAAI,wCAAwC;IACzD,SAAS,EAAE,IAAI;IACf,uBAAuB,EAAE,IAAI;IAC7B,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,IAAI;IACjB,kBAAkB,EAAE,IAAI;IACxB,YAAY,EAAE,KAAK,EAAe,6CAA6C;IAC/E,KAAK,EAAE,CAAC,EAA0B,sCAAsC;IACxE,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,EAAE;IACX,iBAAiB,EAAE,GAAG;IACtB,sBAAsB,EAAE,GAAG,EAAO,8CAA8C;IAChF,iBAAiB,EAAE;QACjB,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,GAAG,EAAa,mCAAmC;KACpE;CACF,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/p2p/config.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,EAAE;IACf,eAAe,EAAE,SAAS;IAC1B,iBAAiB,EAAE,IAAI;IACvB,eAAe,EAAE,UAAU;IAC3B,kBAAkB,EAAE,CAAC;IACrB,4BAA4B,EAAE,EAAE;IAChC,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAgB;IACjD,GAAG,oBAAoB;IACvB,WAAW,EAAE,GAAG;IAChB,eAAe,EAAE,UAAU;IAC3B,kBAAkB,EAAE,CAAC;IACrB,4BAA4B,EAAE,EAAE;CACjC,CAAC;AAiCF,0DAA0D;AAC1D,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,kBAAkB,CAAC;IAC1D,OAAO,EAAE,GAAG,oBAAoB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAC9B,sFAAsF,CAAC;AAEzF,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,MAAM,EAAE,CAAC,uBAAuB,CAAC;IACjC,SAAS,EAAE,CAAC,mBAAmB,CAAC;IAChC,SAAS,EAAE,IAAI;IACf,uBAAuB,EAAE,IAAI;IAC7B,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,IAAI;IACjB,kBAAkB,EAAE,IAAI;IACxB,KAAK,EAAE,EAAE,GAAG,oBAAoB,EAAE;IAClC,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,iBAAiB,EAAE,GAAG;IACtB,sBAAsB,EAAE,GAAG;CAC5B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAc;IAC7C,MAAM,EAAE,CAAC,uBAAuB,CAAC;IACjC,SAAS,EAAE,EAAE,EAAI,wCAAwC;IACzD,SAAS,EAAE,IAAI;IACf,uBAAuB,EAAE,IAAI;IAC7B,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,IAAI;IACjB,kBAAkB,EAAE,IAAI;IACxB,KAAK,EAAE,EAAE,GAAG,sBAAsB,EAAE;IACpC,YAAY,EAAE,KAAK,EAAe,6CAA6C;IAC/E,KAAK,EAAE,CAAC,EAA0B,sCAAsC;IACxE,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,EAAE;IACX,iBAAiB,EAAE,GAAG;IACtB,sBAAsB,EAAE,GAAG,EAAO,8CAA8C;IAChF,iBAAiB,EAAE;QACjB,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,GAAG,EAAa,mCAAmC;KACpE;CACF,CAAC"}
@@ -1,5 +1,7 @@
1
1
  export * from './config.js';
2
2
  export * from './node.js';
3
+ export * from './relay-scorer.js';
4
+ export * from './relay-reward.js';
3
5
  export * from './topics.js';
4
6
  export * from './delivery-auth.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/p2p/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/p2p/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
package/dist/p2p/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export * from './config.js';
2
2
  export * from './node.js';
3
+ export * from './relay-scorer.js';
4
+ export * from './relay-reward.js';
3
5
  export * from './topics.js';
4
6
  export * from './delivery-auth.js';
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/p2p/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/p2p/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
@@ -33,6 +33,46 @@ export type StreamHandler = (data: {
33
33
  }) => void;
34
34
  export type PeerDisconnectHandler = (peerId: string) => void;
35
35
  export type PeerConnectHandler = (peerId: string) => void;
36
+ export declare const RELAY_INFO_PROTOCOL = "/clawnet/1.0.0/relay-info";
37
+ export declare const RELAY_MIGRATION_PROTOCOL = "/clawnet/1.0.0/relay-migration";
38
+ export declare const RELAY_CONFIRM_PROTOCOL = "/clawnet/1.0.0/relay-confirm";
39
+ /** Information returned by a relay node in response to a relay-info probe. */
40
+ export interface RelayInfoResponse {
41
+ activeCircuits: number;
42
+ maxCircuits: number;
43
+ uptimeSeconds: number;
44
+ }
45
+ /** Notification sent by a relay node when it is about to go offline (F12). */
46
+ export interface RelayMigrationNotice {
47
+ reason: 'shutdown' | 'overload' | 'maintenance';
48
+ suggestedRelays: string[];
49
+ gracePeriodSec: number;
50
+ }
51
+ /** Callback invoked when a relay migration notice is received (F12). */
52
+ export type RelayMigrationHandler = (notice: RelayMigrationNotice, fromPeer: string) => void;
53
+ /** Request sent by relay node to ask a served peer to confirm traffic (F10). */
54
+ export interface RelayConfirmRequest {
55
+ relayDid: string;
56
+ periodId: number;
57
+ bytesRelayed: number;
58
+ circuitsServed: number;
59
+ }
60
+ /** Response from served peer confirming (or rejecting) the relay traffic (F10). */
61
+ export interface RelayConfirmResponse {
62
+ peerDid: string;
63
+ bytesConfirmed: number;
64
+ circuitsConfirmed: number;
65
+ /** base58-encoded Ed25519 signature over the canonical confirmation payload. */
66
+ signature: string;
67
+ /** true if the peer accepted the claim, false if the deviation was too large. */
68
+ accepted: boolean;
69
+ }
70
+ /**
71
+ * Callback invoked when a relay asks this node to confirm traffic (F10).
72
+ * Implementations should verify the claimed bytes against local records
73
+ * and return a signed confirmation or rejection.
74
+ */
75
+ export type RelayConfirmHandler = (request: RelayConfirmRequest, fromPeer: string) => Promise<RelayConfirmResponse>;
36
76
  export declare class P2PNode {
37
77
  private node;
38
78
  private readonly config;
@@ -44,6 +84,16 @@ export declare class P2PNode {
44
84
  private connectHandlers;
45
85
  /** Set of peer IDs that we have ever successfully connected to. */
46
86
  private knownPeers;
87
+ /** Timer for periodic relay advertisement (F2). */
88
+ private relayAdvertiseTimer?;
89
+ /** Cached relay provider CID (F2). */
90
+ private relayProviderCid?;
91
+ /** Whether this node is draining relay connections (F12). */
92
+ private relayDraining;
93
+ /** Externally-registered relay migration handler (F12). */
94
+ private migrationHandler?;
95
+ /** Externally-registered relay confirm handler (F10). */
96
+ private confirmHandler?;
47
97
  constructor(config?: Partial<P2PConfig>, privateKey?: PrivateKeyLike, peerId?: PeerIdLike);
48
98
  /** Register a callback that fires whenever a peer disconnects. */
49
99
  onPeerDisconnect(handler: PeerDisconnectHandler): void;
@@ -101,6 +151,80 @@ export declare class P2PNode {
101
151
  * Returns the number of successfully (re-)connected bootstrap peers.
102
152
  */
103
153
  reconnectBootstrap(): Promise<number>;
154
+ /** Get or lazily create the relay provider CID. */
155
+ private getRelayProviderCid;
156
+ /**
157
+ * Advertise this node as a relay provider in the DHT (F2).
158
+ * Should be called once after `start()` on public relay nodes.
159
+ * Automatically re-provides every 30 minutes.
160
+ */
161
+ advertiseAsRelay(): Promise<void>;
162
+ /** Stop periodic relay advertisement. */
163
+ stopRelayAdvertise(): void;
164
+ private provideRelayOnce;
165
+ /**
166
+ * Discover relay nodes via DHT content routing (F2).
167
+ * Returns up to `max` peer IDs of nodes that advertised as relays.
168
+ * Falls back to bootstrap nodes if DHT discovery yields nothing within timeout.
169
+ */
170
+ discoverRelayNodes(max?: number): Promise<string[]>;
171
+ /**
172
+ * Register the `/clawnet/1.0.0/relay-info` protocol handler (F5).
173
+ * Called on relay nodes to respond to health probes.
174
+ * @param infoProvider Callback that returns current relay load info.
175
+ */
176
+ registerRelayInfoProtocol(infoProvider: () => RelayInfoResponse): Promise<void>;
177
+ /** Unregister the relay-info protocol handler. */
178
+ unregisterRelayInfoProtocol(): Promise<void>;
179
+ /**
180
+ * Probe a remote relay node for its current load info (F5).
181
+ * Returns null if the probe fails or times out.
182
+ */
183
+ probeRelayInfo(peerId: string, timeoutMs?: number): Promise<RelayInfoResponse | null>;
184
+ /**
185
+ * Ping a remote peer and return RTT in milliseconds (F5).
186
+ * Returns -1 if the ping fails.
187
+ */
188
+ pingPeer(peerId: string): Promise<number>;
189
+ /** Whether this relay node is in draining mode (not accepting new circuits). */
190
+ isRelayDraining(): boolean;
191
+ /**
192
+ * Register a handler for incoming relay migration notices (F12).
193
+ * NAT-behind nodes use this to react when their relay is going offline.
194
+ */
195
+ onRelayMigration(handler: RelayMigrationHandler): void;
196
+ /**
197
+ * Register the `/clawnet/1.0.0/relay-migration` protocol handler.
198
+ * Called during node initialization to listen for migration notices.
199
+ */
200
+ registerRelayMigrationProtocol(): Promise<void>;
201
+ /**
202
+ * Notify a specific peer about relay migration (F12).
203
+ * Used by relay nodes during graceful shutdown.
204
+ */
205
+ notifyRelayMigration(peerId: string, notice: RelayMigrationNotice): Promise<boolean>;
206
+ /**
207
+ * Gracefully drain relay connections and notify peers (F12).
208
+ * @param connectedPeers List of peer IDs currently using this node as relay.
209
+ * @param gracePeriodMs Grace period before forcefully closing (default: 30s).
210
+ */
211
+ drainRelay(connectedPeers: string[], gracePeriodMs?: number): Promise<void>;
212
+ /**
213
+ * Register a handler for incoming relay-confirm requests (F10).
214
+ * NAT-behind nodes use this to respond when a relay asks them to confirm traffic.
215
+ */
216
+ onRelayConfirm(handler: RelayConfirmHandler): void;
217
+ /**
218
+ * Register the `/clawnet/1.0.0/relay-confirm` protocol handler.
219
+ * Called during node initialization to listen for co-sign requests.
220
+ */
221
+ registerRelayConfirmProtocol(): Promise<void>;
222
+ /**
223
+ * Request a served peer to confirm relay traffic (F10).
224
+ * Used by relay nodes during period proof collection.
225
+ * Returns null if the peer is unreachable or rejects.
226
+ */
227
+ requestRelayConfirmation(peerId: string, request: RelayConfirmRequest, timeoutMs?: number): Promise<RelayConfirmResponse | null>;
104
228
  private getPubsub;
105
229
  }
106
230
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/p2p/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/p2p/node.ts"],"names":[],"mappings":"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"}
package/dist/p2p/node.js CHANGED
@@ -13,8 +13,10 @@ import { dcutr } from '@libp2p/dcutr';
13
13
  import { ping } from '@libp2p/ping';
14
14
  import { circuitRelayTransport, circuitRelayServer } from '@libp2p/circuit-relay-v2';
15
15
  import { multiaddr } from '@multiformats/multiaddr';
16
+ import { CID } from 'multiformats/cid';
17
+ import { sha256 } from 'multiformats/hashes/sha2';
16
18
  import { sha256Bytes } from '../crypto/hash.js';
17
- import { DEFAULT_P2P_CONFIG } from './config.js';
19
+ import { DEFAULT_P2P_CONFIG, resolveRelayConfig } from './config.js';
18
20
  /**
19
21
  * Adapt a libp2p v3 stream (AbstractMessageStream) to the StreamDuplex
20
22
  * interface expected by MessagingService.
@@ -49,6 +51,15 @@ function adaptStream(raw) {
49
51
  close: () => raw.close(),
50
52
  };
51
53
  }
54
+ // ── F2: Relay discovery constants ──────────────────────────────
55
+ const RELAY_PROVIDER_KEY = '/clawnet/relay-providers/v1';
56
+ const RELAY_ADVERTISE_INTERVAL_MS = 30 * 60_000; // 30 minutes
57
+ const RELAY_DISCOVER_TIMEOUT_MS = 15_000;
58
+ const RELAY_DISCOVER_MAX = 10;
59
+ // ── F5 / F12 / F10: Protocol IDs ──────────────────────────────
60
+ export const RELAY_INFO_PROTOCOL = '/clawnet/1.0.0/relay-info';
61
+ export const RELAY_MIGRATION_PROTOCOL = '/clawnet/1.0.0/relay-migration';
62
+ export const RELAY_CONFIRM_PROTOCOL = '/clawnet/1.0.0/relay-confirm';
52
63
  export class P2PNode {
53
64
  node = null;
54
65
  config;
@@ -60,6 +71,16 @@ export class P2PNode {
60
71
  connectHandlers = [];
61
72
  /** Set of peer IDs that we have ever successfully connected to. */
62
73
  knownPeers = new Set();
74
+ /** Timer for periodic relay advertisement (F2). */
75
+ relayAdvertiseTimer;
76
+ /** Cached relay provider CID (F2). */
77
+ relayProviderCid;
78
+ /** Whether this node is draining relay connections (F12). */
79
+ relayDraining = false;
80
+ /** Externally-registered relay migration handler (F12). */
81
+ migrationHandler;
82
+ /** Externally-registered relay confirm handler (F10). */
83
+ confirmHandler;
63
84
  constructor(config = {}, privateKey, peerId) {
64
85
  this.config = { ...DEFAULT_P2P_CONFIG, ...config };
65
86
  this.privateKeyOverride = privateKey;
@@ -108,8 +129,15 @@ export class P2PNode {
108
129
  if (this.config.enableDcutr) {
109
130
  services.dcutr = dcutr();
110
131
  }
111
- if (this.config.enableCircuitRelay) {
112
- services.circuitRelay = circuitRelayServer();
132
+ const relayConfig = resolveRelayConfig(this.config);
133
+ if (relayConfig.enabled) {
134
+ services.circuitRelay = circuitRelayServer({
135
+ reservations: {
136
+ maxReservations: relayConfig.maxCircuits,
137
+ defaultDurationLimit: relayConfig.reservationTtlSec,
138
+ defaultDataLimit: BigInt(relayConfig.maxCircuitBytes),
139
+ },
140
+ });
113
141
  }
114
142
  const options = {
115
143
  addresses: {
@@ -124,7 +152,7 @@ export class P2PNode {
124
152
  },
125
153
  transports: [
126
154
  tcp(),
127
- ...(this.config.enableCircuitRelay ? [circuitRelayTransport()] : []),
155
+ ...(relayConfig.enabled ? [circuitRelayTransport()] : []),
128
156
  ],
129
157
  streamMuxers: [yamux({
130
158
  maxInboundStreams: this.config.yamuxMaxInboundStreams ?? 256,
@@ -193,6 +221,8 @@ export class P2PNode {
193
221
  if (!this.node) {
194
222
  return;
195
223
  }
224
+ this.stopRelayAdvertise();
225
+ this.relayDraining = false;
196
226
  await this.node.stop();
197
227
  this.node = null;
198
228
  }
@@ -460,6 +490,333 @@ export class P2PNode {
460
490
  }
461
491
  return connected;
462
492
  }
493
+ // ── F2: Relay DHT Discovery ─────────────────────────────────
494
+ /** Get or lazily create the relay provider CID. */
495
+ async getRelayProviderCid() {
496
+ if (!this.relayProviderCid) {
497
+ const hash = await sha256.digest(new TextEncoder().encode(RELAY_PROVIDER_KEY));
498
+ this.relayProviderCid = CID.create(1, 0x55 /* raw codec */, hash);
499
+ }
500
+ return this.relayProviderCid;
501
+ }
502
+ /**
503
+ * Advertise this node as a relay provider in the DHT (F2).
504
+ * Should be called once after `start()` on public relay nodes.
505
+ * Automatically re-provides every 30 minutes.
506
+ */
507
+ async advertiseAsRelay() {
508
+ await this.provideRelayOnce();
509
+ this.relayAdvertiseTimer = setInterval(() => void this.provideRelayOnce(), RELAY_ADVERTISE_INTERVAL_MS);
510
+ }
511
+ /** Stop periodic relay advertisement. */
512
+ stopRelayAdvertise() {
513
+ if (this.relayAdvertiseTimer) {
514
+ clearInterval(this.relayAdvertiseTimer);
515
+ this.relayAdvertiseTimer = undefined;
516
+ }
517
+ }
518
+ async provideRelayOnce() {
519
+ if (!this.node)
520
+ return;
521
+ try {
522
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
523
+ const nodeAny = this.node;
524
+ const routing = nodeAny.contentRouting ?? nodeAny.services?.dht;
525
+ if (!routing?.provide)
526
+ return;
527
+ const cid = await this.getRelayProviderCid();
528
+ await routing.provide(cid);
529
+ }
530
+ catch {
531
+ // DHT provide can fail during early bootstrap — non-fatal
532
+ }
533
+ }
534
+ /**
535
+ * Discover relay nodes via DHT content routing (F2).
536
+ * Returns up to `max` peer IDs of nodes that advertised as relays.
537
+ * Falls back to bootstrap nodes if DHT discovery yields nothing within timeout.
538
+ */
539
+ async discoverRelayNodes(max = RELAY_DISCOVER_MAX) {
540
+ const relayPeers = [];
541
+ try {
542
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
543
+ const nodeAny = this.node;
544
+ const routing = nodeAny.contentRouting ?? nodeAny.services?.dht;
545
+ if (routing?.findProviders) {
546
+ const cid = await this.getRelayProviderCid();
547
+ const controller = new AbortController();
548
+ const timeout = setTimeout(() => controller.abort(), RELAY_DISCOVER_TIMEOUT_MS);
549
+ try {
550
+ for await (const provider of routing.findProviders(cid, { signal: controller.signal })) {
551
+ const pid = provider?.id?.toString?.() ?? provider?.toString?.() ?? '';
552
+ if (pid && pid !== this.getPeerId()) {
553
+ relayPeers.push(pid);
554
+ if (relayPeers.length >= max)
555
+ break;
556
+ }
557
+ }
558
+ }
559
+ finally {
560
+ clearTimeout(timeout);
561
+ }
562
+ }
563
+ }
564
+ catch {
565
+ // DHT lookup timeout or failure — fall through to bootstrap fallback
566
+ }
567
+ // Fallback: extract peer IDs from bootstrap multiaddrs
568
+ if (relayPeers.length === 0) {
569
+ for (const addr of this.config.bootstrap) {
570
+ const match = addr.match(/\/p2p\/([^/]+)$/);
571
+ if (match?.[1]) {
572
+ relayPeers.push(match[1]);
573
+ if (relayPeers.length >= max)
574
+ break;
575
+ }
576
+ }
577
+ }
578
+ return relayPeers;
579
+ }
580
+ // ── F5: Relay Info Protocol ─────────────────────────────────
581
+ /**
582
+ * Register the `/clawnet/1.0.0/relay-info` protocol handler (F5).
583
+ * Called on relay nodes to respond to health probes.
584
+ * @param infoProvider Callback that returns current relay load info.
585
+ */
586
+ async registerRelayInfoProtocol(infoProvider) {
587
+ await this.handleProtocol(RELAY_INFO_PROTOCOL, ({ stream }) => {
588
+ const data = new TextEncoder().encode(JSON.stringify(infoProvider()));
589
+ void stream.sink((async function* () { yield data; })());
590
+ });
591
+ }
592
+ /** Unregister the relay-info protocol handler. */
593
+ async unregisterRelayInfoProtocol() {
594
+ try {
595
+ await this.unhandleProtocol(RELAY_INFO_PROTOCOL);
596
+ }
597
+ catch { /* may not be registered */ }
598
+ }
599
+ /**
600
+ * Probe a remote relay node for its current load info (F5).
601
+ * Returns null if the probe fails or times out.
602
+ */
603
+ async probeRelayInfo(peerId, timeoutMs = 5000) {
604
+ try {
605
+ const stream = await this.newStream(peerId, RELAY_INFO_PROTOCOL);
606
+ // Send empty request (protocol open is the trigger)
607
+ void stream.sink((async function* () { yield new Uint8Array(0); })());
608
+ const chunks = [];
609
+ const controller = new AbortController();
610
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
611
+ try {
612
+ for await (const chunk of stream.source) {
613
+ if (controller.signal.aborted)
614
+ break;
615
+ chunks.push(chunk instanceof Uint8Array ? chunk : chunk.subarray());
616
+ }
617
+ }
618
+ finally {
619
+ clearTimeout(timer);
620
+ }
621
+ if (chunks.length === 0)
622
+ return null;
623
+ const merged = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));
624
+ let offset = 0;
625
+ for (const c of chunks) {
626
+ merged.set(c, offset);
627
+ offset += c.length;
628
+ }
629
+ return JSON.parse(new TextDecoder().decode(merged));
630
+ }
631
+ catch {
632
+ return null;
633
+ }
634
+ }
635
+ /**
636
+ * Ping a remote peer and return RTT in milliseconds (F5).
637
+ * Returns -1 if the ping fails.
638
+ */
639
+ async pingPeer(peerId) {
640
+ if (!this.node)
641
+ return -1;
642
+ try {
643
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
644
+ const nodeAny = this.node;
645
+ const pingService = nodeAny.services?.ping;
646
+ if (pingService?.ping) {
647
+ const ma = multiaddr('/p2p/' + peerId);
648
+ const latency = await pingService.ping(ma);
649
+ return latency;
650
+ }
651
+ return -1;
652
+ }
653
+ catch {
654
+ return -1;
655
+ }
656
+ }
657
+ // ── F12: Graceful Relay Migration ───────────────────────────
658
+ /** Whether this relay node is in draining mode (not accepting new circuits). */
659
+ isRelayDraining() {
660
+ return this.relayDraining;
661
+ }
662
+ /**
663
+ * Register a handler for incoming relay migration notices (F12).
664
+ * NAT-behind nodes use this to react when their relay is going offline.
665
+ */
666
+ onRelayMigration(handler) {
667
+ this.migrationHandler = handler;
668
+ }
669
+ /**
670
+ * Register the `/clawnet/1.0.0/relay-migration` protocol handler.
671
+ * Called during node initialization to listen for migration notices.
672
+ */
673
+ async registerRelayMigrationProtocol() {
674
+ await this.handleProtocol(RELAY_MIGRATION_PROTOCOL, ({ stream, connection }) => {
675
+ const fromPeer = connection.remotePeer?.toString() ?? 'unknown';
676
+ const chunks = [];
677
+ void (async () => {
678
+ for await (const chunk of stream.source) {
679
+ chunks.push(chunk instanceof Uint8Array ? chunk : chunk.subarray());
680
+ }
681
+ if (chunks.length === 0)
682
+ return;
683
+ const merged = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));
684
+ let offset = 0;
685
+ for (const c of chunks) {
686
+ merged.set(c, offset);
687
+ offset += c.length;
688
+ }
689
+ try {
690
+ const notice = JSON.parse(new TextDecoder().decode(merged));
691
+ this.migrationHandler?.(notice, fromPeer);
692
+ }
693
+ catch { /* malformed notice — ignore */ }
694
+ })();
695
+ });
696
+ }
697
+ /**
698
+ * Notify a specific peer about relay migration (F12).
699
+ * Used by relay nodes during graceful shutdown.
700
+ */
701
+ async notifyRelayMigration(peerId, notice) {
702
+ try {
703
+ const stream = await this.newStream(peerId, RELAY_MIGRATION_PROTOCOL);
704
+ const data = new TextEncoder().encode(JSON.stringify(notice));
705
+ await stream.sink((async function* () { yield data; })());
706
+ return true;
707
+ }
708
+ catch {
709
+ return false;
710
+ }
711
+ }
712
+ /**
713
+ * Gracefully drain relay connections and notify peers (F12).
714
+ * @param connectedPeers List of peer IDs currently using this node as relay.
715
+ * @param gracePeriodMs Grace period before forcefully closing (default: 30s).
716
+ */
717
+ async drainRelay(connectedPeers, gracePeriodMs = 30_000) {
718
+ this.relayDraining = true;
719
+ // Discover alternative relays to suggest
720
+ const suggestedRelays = await this.discoverRelayNodes(5);
721
+ const notice = {
722
+ reason: 'shutdown',
723
+ suggestedRelays,
724
+ gracePeriodSec: Math.ceil(gracePeriodMs / 1000),
725
+ };
726
+ // Notify all connected relay users in parallel
727
+ await Promise.allSettled(connectedPeers.map((peerId) => this.notifyRelayMigration(peerId, notice)));
728
+ // Wait for grace period
729
+ await new Promise((resolve) => setTimeout(resolve, gracePeriodMs));
730
+ }
731
+ // ── F10: Relay Contribution Confirmation ─────────────────────
732
+ /**
733
+ * Register a handler for incoming relay-confirm requests (F10).
734
+ * NAT-behind nodes use this to respond when a relay asks them to confirm traffic.
735
+ */
736
+ onRelayConfirm(handler) {
737
+ this.confirmHandler = handler;
738
+ }
739
+ /**
740
+ * Register the `/clawnet/1.0.0/relay-confirm` protocol handler.
741
+ * Called during node initialization to listen for co-sign requests.
742
+ */
743
+ async registerRelayConfirmProtocol() {
744
+ await this.handleProtocol(RELAY_CONFIRM_PROTOCOL, ({ stream, connection }) => {
745
+ const fromPeer = connection.remotePeer?.toString() ?? 'unknown';
746
+ void (async () => {
747
+ const chunks = [];
748
+ for await (const chunk of stream.source) {
749
+ chunks.push(chunk instanceof Uint8Array ? chunk : chunk.subarray());
750
+ }
751
+ if (chunks.length === 0)
752
+ return;
753
+ const merged = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));
754
+ let offset = 0;
755
+ for (const c of chunks) {
756
+ merged.set(c, offset);
757
+ offset += c.length;
758
+ }
759
+ try {
760
+ const request = JSON.parse(new TextDecoder().decode(merged));
761
+ if (!this.confirmHandler) {
762
+ // No handler registered — send rejection
763
+ const resp = {
764
+ peerDid: '',
765
+ bytesConfirmed: 0,
766
+ circuitsConfirmed: 0,
767
+ signature: '',
768
+ accepted: false,
769
+ };
770
+ const data = new TextEncoder().encode(JSON.stringify(resp));
771
+ await stream.sink((async function* () { yield data; })());
772
+ return;
773
+ }
774
+ const response = await this.confirmHandler(request, fromPeer);
775
+ const data = new TextEncoder().encode(JSON.stringify(response));
776
+ await stream.sink((async function* () { yield data; })());
777
+ }
778
+ catch { /* malformed request — ignore */ }
779
+ })();
780
+ });
781
+ }
782
+ /**
783
+ * Request a served peer to confirm relay traffic (F10).
784
+ * Used by relay nodes during period proof collection.
785
+ * Returns null if the peer is unreachable or rejects.
786
+ */
787
+ async requestRelayConfirmation(peerId, request, timeoutMs = 10_000) {
788
+ try {
789
+ const stream = await this.newStream(peerId, RELAY_CONFIRM_PROTOCOL);
790
+ const data = new TextEncoder().encode(JSON.stringify(request));
791
+ await stream.sink((async function* () { yield data; })());
792
+ const chunks = [];
793
+ const controller = new AbortController();
794
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
795
+ try {
796
+ for await (const chunk of stream.source) {
797
+ if (controller.signal.aborted)
798
+ break;
799
+ chunks.push(chunk instanceof Uint8Array ? chunk : chunk.subarray());
800
+ }
801
+ }
802
+ finally {
803
+ clearTimeout(timer);
804
+ }
805
+ if (chunks.length === 0)
806
+ return null;
807
+ const merged = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));
808
+ let offset = 0;
809
+ for (const c of chunks) {
810
+ merged.set(c, offset);
811
+ offset += c.length;
812
+ }
813
+ const response = JSON.parse(new TextDecoder().decode(merged));
814
+ return response.accepted ? response : null;
815
+ }
816
+ catch {
817
+ return null;
818
+ }
819
+ }
463
820
  getPubsub() {
464
821
  const pubsub = this.node?.services?.pubsub;
465
822
  if (!pubsub) {
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/p2p/node.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAa,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA2E5D;;;;;;;;;;;GAWG;AACH,8DAA8D;AAC9D,SAAS,WAAW,CAAC,GAAQ;IAC3B,+EAA+E;IAC/E,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjD,OAAO,GAAmB,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;YAC/B,CAAC,CAAC,GAAG,CAA2B,sCAAsC;YACtE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,MAAK,CAAC,CAAC,EAAE,EAAK,2BAA2B;QAE7D,IAAI,EAAE,KAAK,EAAE,QAAmC,EAAE,EAAE;YAClD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,CAAC;YACD,+CAA+C;YAC/C,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACzC,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;KACzB,CAAC;AACJ,CAAC;AAmBD,MAAM,OAAO,OAAO;IACV,IAAI,GAAsB,IAAI,CAAC;IACtB,MAAM,CAAY;IAClB,kBAAkB,CAAkB;IACpC,cAAc,CAAc;IAC7C,kEAAkE;IAC1D,kBAAkB,GAA4B,EAAE,CAAC;IACzD,+DAA+D;IACvD,eAAe,GAAyB,EAAE,CAAC;IACnD,mEAAmE;IAC3D,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,YAAY,SAA6B,EAAE,EAAE,UAA2B,EAAE,MAAmB;QAC3F,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAAC;QACnD,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;IAC/B,CAAC;IAED,kEAAkE;IAClE,gBAAgB,CAAC,OAA8B;QAC7C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,+DAA+D;IAC/D,aAAa,CAAC,OAA2B;QACvC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC;YACvB,4BAA4B,EAAE,IAAI,CAAC,MAAM,CAAC,uBAAuB;YACjE,OAAO,EAAE,CAAC,OAA6B,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;YACrE,uEAAuE;YACvE,qEAAqE;YACrE,uEAAuE;YACvE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI;YAC9C,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAQ,wDAAwD;YACzF,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,EAAI,iCAAiC;YAClE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,EAAI,gCAAgC;YACjE,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,GAAG;SACxD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAA4B;YACxC,QAAQ,EAAE,QAAQ,EAAE;YACpB,MAAM;SACP,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1B,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC;gBACpB,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC9B,QAAQ,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,QAAQ,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACnC,QAAQ,CAAC,YAAY,GAAG,kBAAkB,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,OAAO,GAA4B;YACvC,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;aAC3B;YACD,iBAAiB,EAAE;gBACjB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,IAAI,CAAC;gBAClE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,IAAI,GAAG;gBACpE,uEAAuE;gBACvE,8CAA8C;gBAC9C,gBAAgB,EAAE,KAAK;aACxB;YACD,UAAU,EAAE;gBACV,GAAG,EAAE;gBACL,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE;YACD,YAAY,EAAE,CAAC,KAAK,CAAC;oBACnB,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,sBAAsB,IAAI,GAAG;iBAC7D,CAAC,CAAC;YACH,oBAAoB,EAAE,CAAC,KAAK,EAAE,CAAC;YAC/B,aAAa,EAAE;gBACb,oEAAoE;gBACpE,oCAAoC;gBACpC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;gBACzB,wDAAwD;gBACxD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM;oBAC9B,CAAC,CAAC;wBACE,SAAS,CAAC;4BACR,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;4BAC3B,OAAO,EAAE,IAAI;yBACd,CAAC;qBACH;oBACH,CAAC,CAAC,EAAE,CAAC;aACR;YACD,QAAQ;SACT,CAAC;QAEF,uDAAuD;QACvD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,gCAAgC;YAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;QACvC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAmC,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,GAAG,IAA6B,CAAC;QAE1C,sCAAsC;QACtC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,EAAE,CAAC,KAAc,EAAE,EAAE;YAC9D,MAAM,MAAM,GAAI,KAAkD,EAAE,MAAM,CAAC;YAC3E,MAAM,GAAG,GAAG,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,SAAS,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;YACzC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC3C,IAAI,CAAC;wBAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAc,EAAE,EAAE;YACjE,MAAM,MAAM,GAAI,KAAkD,EAAE,MAAM,CAAC;YAC3E,MAAM,GAAG,GAAG,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,SAAS,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;YAC5C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC9C,IAAI,CAAC;wBAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAc,EAAE,EAAE;YAChE,MAAM,MAAM,GAAI,KAA2D,EAAE,MAAM,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IACrC,CAAC;IAED,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,IAAgC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,IAAgB;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAgC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,OAAuB;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAmB,CAAC,KAAK,EAAE,EAAE;YACzC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,KAAK,OAAO,CAAC;gBACX,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;aACjC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAgC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;IAC9F,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aAC1C,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,uFAAuF;IACvF,aAAa;QACX,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI;YAAE,OAAO,KAAK,CAAC;QACnC,8DAA8D;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAW,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;oBACf,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,0EAA0E;YAC1E,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,CACL,MAAM,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,IAAgC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1F,EAAE,CACH,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC;QAEzB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QACxC,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,8DAA8D;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAW,CAAC;QAEjC,uEAAuE;QACvE,wEAAwE;QACxE,yDAAyD;QACzD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC;gBACvC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC5B,MAAM,GAAG,GAAG,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;oBACzC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAChE,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAChC,QAAQ,EAAE,CAAC;wBACX,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACxB,CAAC;oBAAC,MAAM,CAAC;wBACP,gCAAgC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;QAED,sEAAsE;QACtE,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;gBAC7D,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;oBACrC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;oBAC7C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;oBAC5D,IAAI,CAAC;wBACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE;4BAC1D,MAAM,EAAE,UAAU,CAAC,MAAM;yBAC1B,CAAC,EAAE,CAAC;4BACH,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;4BACpB,MAAM,GAAG,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;4BACnC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;gCAAE,SAAS;4BAChE,IAAI,CAAC;gCACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gCAC3B,QAAQ,EAAE,CAAC;gCACX,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACxB,CAAC;4BAAC,MAAM,CAAC;gCACP,8CAA8C;4BAChD,CAAC;wBACH,CAAC;oBACH,CAAC;4BAAS,CAAC;wBACT,YAAY,CAAC,OAAO,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,+DAA+D;YACjE,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,EAAE,SAAS,IAAI,MAAM,EAAE,SAAS,CAAC;YAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,OAAO,SAAS,CAAC,KAAK,CAAC;YACzB,CAAC;YACD,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;gBAClB,OAAO,SAAS,CAAC,GAAG,CAAC;YACvB,CAAC;YACD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;YAC7B,CAAC;YACD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;YAC7B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,QAAgB,EAChB,OAAsB,EACtB,OAAqE;QAErE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,uDAAuD;QACvD,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CACpB,QAAQ,EACR,CAAC,CAAC,SAAc,EAAE,UAAe,EAAE,EAAE;YACnC,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAQ,EACT,OAAO,CACR,CAAC;QACF,sDAAsD;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,QAAgB;QAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAC5C,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,EAC3B,QAAQ,CACT,CAAC;QACF,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI;YAAE,OAAO,CAAC,CAAC;QAC/B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACpD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,8EAA8E;gBAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC/C,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,SAAS,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7C,SAAS,EAAE,CAAC,CAAC,oBAAoB;oBACjC,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtC,SAAS,EAAE,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,SAAS;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/p2p/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Relay reward formula (F11) — computes relay incentive amounts.
3
+ *
4
+ * Formula:
5
+ * weightedBytes = messagingConfirmedBytes × 1.0
6
+ * + attachmentConfirmedBytes × 0.3
7
+ *
8
+ * rewardAmount = baseRate
9
+ * × log2(1 + weightedBytes / 1 GB)
10
+ * × min(confirmedUniquePeers / 10, 3.0)
11
+ * × uptimeBonus
12
+ * × confirmationRatio
13
+ *
14
+ * Parameters:
15
+ * - baseRate: DAO-adjustable base Token/period (from ParamRegistry)
16
+ * - attachmentWeight: weight for attachment bytes (default 0.3)
17
+ * - uptimeBonus: min(consecutivePeriods / 30, 1.5)
18
+ * - confirmationRatio: confirmedBytes / claimedBytes (0..1)
19
+ * - maxRewardPerPeriod: hard cap per node per period
20
+ */
21
+ export interface RewardInput {
22
+ /** Messaging bytes confirmed by co-signers. */
23
+ messagingConfirmedBytes: number;
24
+ /** Attachment bytes confirmed by co-signers. */
25
+ attachmentConfirmedBytes: number;
26
+ /** Total bytes claimed by the relay (before confirmation). */
27
+ claimedBytes: number;
28
+ /** Number of unique peers that provided co-sign confirmations. */
29
+ confirmedUniquePeers: number;
30
+ /** Number of consecutive periods this relay has been online. */
31
+ consecutivePeriods: number;
32
+ }
33
+ export interface RewardParams {
34
+ /** Base reward rate (Token per period). */
35
+ baseRate: number;
36
+ /** Weight for attachment bytes (0..1). Default: 0.3 */
37
+ attachmentWeight: number;
38
+ /** Maximum reward per node per period. */
39
+ maxRewardPerPeriod: number;
40
+ /** Minimum bytes threshold to qualify for reward. */
41
+ minBytesThreshold: number;
42
+ /** Minimum confirmed peers to qualify for reward. */
43
+ minPeersThreshold: number;
44
+ }
45
+ export interface RewardResult {
46
+ /** Computed reward amount (integer Token). */
47
+ rewardAmount: number;
48
+ /** Whether the relay met the minimum thresholds. */
49
+ eligible: boolean;
50
+ /** Breakdown of the reward computation. */
51
+ breakdown: {
52
+ weightedBytes: number;
53
+ byteFactor: number;
54
+ peerFactor: number;
55
+ uptimeBonus: number;
56
+ confirmationRatio: number;
57
+ rawReward: number;
58
+ capped: boolean;
59
+ };
60
+ }
61
+ export declare const DEFAULT_REWARD_PARAMS: RewardParams;
62
+ /**
63
+ * Compute the relay reward for a single period.
64
+ * Returns integer Token amount (floored) and eligibility.
65
+ */
66
+ export declare function computeRelayReward(input: RewardInput, params?: RewardParams): RewardResult;
67
+ //# sourceMappingURL=relay-reward.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-reward.d.ts","sourceRoot":"","sources":["../../src/p2p/relay-reward.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,uBAAuB,EAAE,MAAM,CAAC;IAChC,gDAAgD;IAChD,wBAAwB,EAAE,MAAM,CAAC;IACjC,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gEAAgE;IAChE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,SAAS,EAAE;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH;AAMD,eAAO,MAAM,qBAAqB,EAAE,YAMnC,CAAC;AAIF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,YAAoC,GAC3C,YAAY,CA8Dd"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Relay reward formula (F11) — computes relay incentive amounts.
3
+ *
4
+ * Formula:
5
+ * weightedBytes = messagingConfirmedBytes × 1.0
6
+ * + attachmentConfirmedBytes × 0.3
7
+ *
8
+ * rewardAmount = baseRate
9
+ * × log2(1 + weightedBytes / 1 GB)
10
+ * × min(confirmedUniquePeers / 10, 3.0)
11
+ * × uptimeBonus
12
+ * × confirmationRatio
13
+ *
14
+ * Parameters:
15
+ * - baseRate: DAO-adjustable base Token/period (from ParamRegistry)
16
+ * - attachmentWeight: weight for attachment bytes (default 0.3)
17
+ * - uptimeBonus: min(consecutivePeriods / 30, 1.5)
18
+ * - confirmationRatio: confirmedBytes / claimedBytes (0..1)
19
+ * - maxRewardPerPeriod: hard cap per node per period
20
+ */
21
+ // ── Constants ──────────────────────────────────────────────────
22
+ const ONE_GB = 1_073_741_824; // 1 GiB in bytes
23
+ export const DEFAULT_REWARD_PARAMS = {
24
+ baseRate: 100, // 100 Token per period
25
+ attachmentWeight: 0.3,
26
+ maxRewardPerPeriod: 1000, // 10× base rate
27
+ minBytesThreshold: 1_048_576, // 1 MB minimum
28
+ minPeersThreshold: 1,
29
+ };
30
+ // ── Core computation ───────────────────────────────────────────
31
+ /**
32
+ * Compute the relay reward for a single period.
33
+ * Returns integer Token amount (floored) and eligibility.
34
+ */
35
+ export function computeRelayReward(input, params = DEFAULT_REWARD_PARAMS) {
36
+ const totalConfirmed = input.messagingConfirmedBytes + input.attachmentConfirmedBytes;
37
+ // Eligibility check
38
+ if (totalConfirmed < params.minBytesThreshold ||
39
+ input.confirmedUniquePeers < params.minPeersThreshold) {
40
+ return {
41
+ rewardAmount: 0,
42
+ eligible: false,
43
+ breakdown: {
44
+ weightedBytes: 0,
45
+ byteFactor: 0,
46
+ peerFactor: 0,
47
+ uptimeBonus: 0,
48
+ confirmationRatio: 0,
49
+ rawReward: 0,
50
+ capped: false,
51
+ },
52
+ };
53
+ }
54
+ // Weighted bytes: messaging × 1.0 + attachment × attachmentWeight
55
+ const weightedBytes = input.messagingConfirmedBytes +
56
+ input.attachmentConfirmedBytes * params.attachmentWeight;
57
+ // Byte factor: log2(1 + weightedBytes / 1 GB)
58
+ const byteFactor = Math.log2(1 + weightedBytes / ONE_GB);
59
+ // Peer factor: min(confirmedUniquePeers / 10, 3.0)
60
+ const peerFactor = Math.min(input.confirmedUniquePeers / 10, 3.0);
61
+ // Uptime bonus: min(consecutivePeriods / 30, 1.5)
62
+ const uptimeBonus = Math.min(input.consecutivePeriods / 30, 1.5);
63
+ // Confirmation ratio: confirmedBytes / claimedBytes (0..1)
64
+ const confirmationRatio = input.claimedBytes > 0
65
+ ? Math.min(totalConfirmed / input.claimedBytes, 1.0)
66
+ : 0;
67
+ // Raw reward
68
+ const rawReward = params.baseRate * byteFactor * peerFactor * uptimeBonus * confirmationRatio;
69
+ // Cap and floor
70
+ const capped = rawReward > params.maxRewardPerPeriod;
71
+ const rewardAmount = Math.floor(Math.min(rawReward, params.maxRewardPerPeriod));
72
+ return {
73
+ rewardAmount,
74
+ eligible: true,
75
+ breakdown: {
76
+ weightedBytes,
77
+ byteFactor,
78
+ peerFactor,
79
+ uptimeBonus,
80
+ confirmationRatio,
81
+ rawReward,
82
+ capped,
83
+ },
84
+ };
85
+ }
86
+ //# sourceMappingURL=relay-reward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-reward.js","sourceRoot":"","sources":["../../src/p2p/relay-reward.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA+CH,kEAAkE;AAElE,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,iBAAiB;AAE/C,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,QAAQ,EAAE,GAAG,EAAa,uBAAuB;IACjD,gBAAgB,EAAE,GAAG;IACrB,kBAAkB,EAAE,IAAI,EAAE,gBAAgB;IAC1C,iBAAiB,EAAE,SAAS,EAAE,eAAe;IAC7C,iBAAiB,EAAE,CAAC;CACrB,CAAC;AAEF,kEAAkE;AAElE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAkB,EAClB,SAAuB,qBAAqB;IAE5C,MAAM,cAAc,GAAG,KAAK,CAAC,uBAAuB,GAAG,KAAK,CAAC,wBAAwB,CAAC;IAEtF,oBAAoB;IACpB,IACE,cAAc,GAAG,MAAM,CAAC,iBAAiB;QACzC,KAAK,CAAC,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,EACrD,CAAC;QACD,OAAO;YACL,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE;gBACT,aAAa,EAAE,CAAC;gBAChB,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,iBAAiB,EAAE,CAAC;gBACpB,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,KAAK;aACd;SACF,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,MAAM,aAAa,GACjB,KAAK,CAAC,uBAAuB;QAC7B,KAAK,CAAC,wBAAwB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAE3D,8CAA8C;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,GAAG,MAAM,CAAC,CAAC;IAEzD,mDAAmD;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IAElE,kDAAkD;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IAEjE,2DAA2D;IAC3D,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC;QACpD,CAAC,CAAC,CAAC,CAAC;IAEN,aAAa;IACb,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,iBAAiB,CAAC;IAE9F,gBAAgB;IAChB,MAAM,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEhF,OAAO;QACL,YAAY;QACZ,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE;YACT,aAAa;YACb,UAAU;YACV,UAAU;YACV,WAAW;YACX,iBAAiB;YACjB,SAAS;YACT,MAAM;SACP;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Relay quality scorer — probes candidate relay nodes and ranks them (F5).
3
+ *
4
+ * Uses:
5
+ * - libp2p ping for latency measurement
6
+ * - `/clawnet/1.0.0/relay-info` protocol for load information
7
+ * - Local success rate history
8
+ *
9
+ * Cached scores have a 5-minute TTL to avoid excessive probing.
10
+ */
11
+ import type { P2PNode } from './node.js';
12
+ export interface RelayScore {
13
+ peerId: string;
14
+ latencyMs: number;
15
+ availableCapacity: number;
16
+ maxCapacity: number;
17
+ successRate: number;
18
+ uptimeSeconds: number;
19
+ score: number;
20
+ }
21
+ export declare class RelayScorer {
22
+ private readonly node;
23
+ private cache;
24
+ private history;
25
+ constructor(node: P2PNode);
26
+ /**
27
+ * Score a list of candidate relay peers.
28
+ * Probes each one (or uses cached result) and returns sorted scores (best first).
29
+ */
30
+ scoreRelays(candidates: string[]): Promise<RelayScore[]>;
31
+ /**
32
+ * Select the best relay from a list of candidates.
33
+ * Returns null if no relay is reachable.
34
+ */
35
+ selectBestRelay(candidates: string[]): Promise<RelayScore | null>;
36
+ /** Record a connection attempt result for success rate tracking. */
37
+ recordAttempt(peerId: string, success: boolean): void;
38
+ /** Clear all cached scores. */
39
+ clearCache(): void;
40
+ private probePeer;
41
+ private getOrCreateHistory;
42
+ }
43
+ //# sourceMappingURL=relay-scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-scorer.d.ts","sourceRoot":"","sources":["../../src/p2p/relay-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAsBD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;IAC/B,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,OAAO,CAAkC;gBAErC,IAAI,EAAE,OAAO;IAIzB;;;OAGG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAyB9D;;;OAGG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAKvE,oEAAoE;IACpE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAQrD,+BAA+B;IAC/B,UAAU,IAAI,IAAI;YAIJ,SAAS;IAyCvB,OAAO,CAAC,kBAAkB;CAQ3B"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Relay quality scorer — probes candidate relay nodes and ranks them (F5).
3
+ *
4
+ * Uses:
5
+ * - libp2p ping for latency measurement
6
+ * - `/clawnet/1.0.0/relay-info` protocol for load information
7
+ * - Local success rate history
8
+ *
9
+ * Cached scores have a 5-minute TTL to avoid excessive probing.
10
+ */
11
+ // ── Constants ──────────────────────────────────────────────────
12
+ const SCORE_CACHE_TTL_MS = 5 * 60_000; // 5 minutes
13
+ const MAX_HISTORY_PER_PEER = 20;
14
+ const PROBE_TIMEOUT_MS = 5_000;
15
+ // ── Scorer Implementation ──────────────────────────────────────
16
+ export class RelayScorer {
17
+ node;
18
+ cache = new Map();
19
+ history = new Map();
20
+ constructor(node) {
21
+ this.node = node;
22
+ }
23
+ /**
24
+ * Score a list of candidate relay peers.
25
+ * Probes each one (or uses cached result) and returns sorted scores (best first).
26
+ */
27
+ async scoreRelays(candidates) {
28
+ const now = Date.now();
29
+ const results = [];
30
+ // Probe candidates in parallel
31
+ const probePromises = candidates.map(async (peerId) => {
32
+ const cached = this.cache.get(peerId);
33
+ if (cached && (now - cached.cachedAt) < SCORE_CACHE_TTL_MS) {
34
+ return cached.score;
35
+ }
36
+ return this.probePeer(peerId);
37
+ });
38
+ const scores = await Promise.allSettled(probePromises);
39
+ for (const result of scores) {
40
+ if (result.status === 'fulfilled' && result.value) {
41
+ results.push(result.value);
42
+ }
43
+ }
44
+ // Sort by score descending
45
+ results.sort((a, b) => b.score - a.score);
46
+ return results;
47
+ }
48
+ /**
49
+ * Select the best relay from a list of candidates.
50
+ * Returns null if no relay is reachable.
51
+ */
52
+ async selectBestRelay(candidates) {
53
+ const scores = await this.scoreRelays(candidates);
54
+ return scores.length > 0 ? scores[0] : null;
55
+ }
56
+ /** Record a connection attempt result for success rate tracking. */
57
+ recordAttempt(peerId, success) {
58
+ const h = this.getOrCreateHistory(peerId);
59
+ h.attempts = Math.min(h.attempts + 1, MAX_HISTORY_PER_PEER);
60
+ if (success) {
61
+ h.successes = Math.min(h.successes + 1, MAX_HISTORY_PER_PEER);
62
+ }
63
+ }
64
+ /** Clear all cached scores. */
65
+ clearCache() {
66
+ this.cache.clear();
67
+ }
68
+ async probePeer(peerId) {
69
+ const h = this.getOrCreateHistory(peerId);
70
+ h.attempts++;
71
+ // Probe latency and relay info in parallel
72
+ const [latencyMs, info] = await Promise.all([
73
+ this.node.pingPeer(peerId),
74
+ this.node.probeRelayInfo(peerId, PROBE_TIMEOUT_MS),
75
+ ]);
76
+ if (latencyMs < 0 && !info) {
77
+ // Completely unreachable
78
+ return null;
79
+ }
80
+ h.successes++;
81
+ const successRate = h.attempts > 0 ? h.successes / h.attempts : 0;
82
+ const effectiveLatency = latencyMs > 0 ? latencyMs : 500; // assume 500ms if ping failed
83
+ const maxCapacity = info?.maxCircuits ?? 64;
84
+ const activeCircuits = info?.activeCircuits ?? 0;
85
+ const availableCapacity = Math.max(0, maxCapacity - activeCircuits);
86
+ const uptimeSeconds = info?.uptimeSeconds ?? 0;
87
+ // Score formula: (1 / latencyMs) * 100 * successRate * capacity_factor
88
+ const capacityFactor = maxCapacity > 0 ? Math.min(availableCapacity / maxCapacity, 1.0) : 0;
89
+ const score = (1 / effectiveLatency) * 100 * successRate * capacityFactor;
90
+ const result = {
91
+ peerId,
92
+ latencyMs: latencyMs > 0 ? latencyMs : -1,
93
+ availableCapacity,
94
+ maxCapacity,
95
+ successRate,
96
+ uptimeSeconds,
97
+ score,
98
+ };
99
+ this.cache.set(peerId, { score: result, cachedAt: Date.now() });
100
+ return result;
101
+ }
102
+ getOrCreateHistory(peerId) {
103
+ let h = this.history.get(peerId);
104
+ if (!h) {
105
+ h = { attempts: 0, successes: 0 };
106
+ this.history.set(peerId, h);
107
+ }
108
+ return h;
109
+ }
110
+ }
111
+ //# sourceMappingURL=relay-scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-scorer.js","sourceRoot":"","sources":["../../src/p2p/relay-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgBH,kEAAkE;AAElE,MAAM,kBAAkB,GAAG,CAAC,GAAG,MAAM,CAAC,CAAG,YAAY;AACrD,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAc/B,kEAAkE;AAElE,MAAM,OAAO,WAAW;IACL,IAAI,CAAU;IACvB,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IACvC,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEjD,YAAY,IAAa;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,UAAoB;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,+BAA+B;QAC/B,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,MAAM,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,kBAAkB,EAAE,CAAC;gBAC3D,OAAO,MAAM,CAAC,KAAK,CAAC;YACtB,CAAC;YACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACvD,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,UAAoB;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED,oEAAoE;IACpE,aAAa,CAAC,MAAc,EAAE,OAAgB;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC5D,IAAI,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,MAAc;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEb,2CAA2C;QAC3C,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC;SACnD,CAAC,CAAC;QAEH,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,yBAAyB;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,CAAC,CAAC,SAAS,EAAE,CAAC;QACd,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,gBAAgB,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,8BAA8B;QACxF,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAG,IAAI,EAAE,cAAc,IAAI,CAAC,CAAC;QACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,CAAC,CAAC;QAE/C,uEAAuE;QACvE,MAAM,cAAc,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,GAAG,GAAG,WAAW,GAAG,cAAc,CAAC;QAE1E,MAAM,MAAM,GAAe;YACzB,MAAM;YACN,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,iBAAiB;YACjB,WAAW;YACX,WAAW;YACX,aAAa;YACb,KAAK;SACN,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF"}
@@ -4,5 +4,7 @@ export declare const TOPIC_REQUESTS = "/clawnet/1.0.0/requests";
4
4
  export declare const TOPIC_RESPONSES = "/clawnet/1.0.0/responses";
5
5
  /** Point-to-point stream protocol for credential delivery (not a gossip topic). */
6
6
  export declare const PROTOCOL_DELIVERY_AUTH = "/clawnet/1.0.0/delivery-auth";
7
+ /** Point-to-point stream protocol for binary attachment relay between nodes. */
8
+ export declare const PROTOCOL_ATTACHMENT = "/clawnet/1.0.0/attachment";
7
9
  export declare const ALL_TOPICS: string[];
8
10
  //# sourceMappingURL=topics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"topics.d.ts","sourceRoot":"","sources":["../../src/p2p/topics.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,0BAA0B,CAAC;AACpD,eAAO,MAAM,aAAa,2BAA2B,CAAC;AACtD,eAAO,MAAM,cAAc,4BAA4B,CAAC;AACxD,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D,mFAAmF;AACnF,eAAO,MAAM,sBAAsB,iCAAiC,CAAC;AAErE,eAAO,MAAM,UAAU,UAAiE,CAAC"}
1
+ {"version":3,"file":"topics.d.ts","sourceRoot":"","sources":["../../src/p2p/topics.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,0BAA0B,CAAC;AACpD,eAAO,MAAM,aAAa,2BAA2B,CAAC;AACtD,eAAO,MAAM,cAAc,4BAA4B,CAAC;AACxD,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D,mFAAmF;AACnF,eAAO,MAAM,sBAAsB,iCAAiC,CAAC;AAErE,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAE/D,eAAO,MAAM,UAAU,UAAiE,CAAC"}
@@ -4,5 +4,7 @@ export const TOPIC_REQUESTS = '/clawnet/1.0.0/requests';
4
4
  export const TOPIC_RESPONSES = '/clawnet/1.0.0/responses';
5
5
  /** Point-to-point stream protocol for credential delivery (not a gossip topic). */
6
6
  export const PROTOCOL_DELIVERY_AUTH = '/clawnet/1.0.0/delivery-auth';
7
+ /** Point-to-point stream protocol for binary attachment relay between nodes. */
8
+ export const PROTOCOL_ATTACHMENT = '/clawnet/1.0.0/attachment';
7
9
  export const ALL_TOPICS = [TOPIC_EVENTS, TOPIC_MARKETS, TOPIC_REQUESTS, TOPIC_RESPONSES];
8
10
  //# sourceMappingURL=topics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"topics.js","sourceRoot":"","sources":["../../src/p2p/topics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AACtD,MAAM,CAAC,MAAM,cAAc,GAAG,yBAAyB,CAAC;AACxD,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAE1D,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;AAErE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC"}
1
+ {"version":3,"file":"topics.js","sourceRoot":"","sources":["../../src/p2p/topics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AACtD,MAAM,CAAC,MAAM,cAAc,GAAG,yBAAyB,CAAC;AACxD,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAE1D,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;AAErE,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAE/D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claw-network/core",
3
- "version": "0.5.2",
3
+ "version": "0.6.0",
4
4
  "description": "Core cryptographic primitives and utilities for the ClawNet protocol",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -81,11 +81,12 @@
81
81
  "canonicalize": "^2.0.0",
82
82
  "level": "^9.0.0",
83
83
  "libp2p": "^3.1.3",
84
+ "multiformats": "^13.4.2",
84
85
  "yaml": "^2.5.0"
85
86
  },
86
87
  "scripts": {
87
88
  "build": "tsc -b tsconfig.json",
88
89
  "test": "vitest run",
89
- "lint": "eslint src --max-warnings=0"
90
+ "lint": "eslint src test --max-warnings=0"
90
91
  }
91
92
  }