@claw-network/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/crypto/aes.d.ts +8 -0
  2. package/dist/crypto/aes.d.ts.map +1 -0
  3. package/dist/crypto/aes.js +29 -0
  4. package/dist/crypto/aes.js.map +1 -0
  5. package/dist/crypto/ed25519.d.ts +11 -0
  6. package/dist/crypto/ed25519.d.ts.map +1 -0
  7. package/dist/crypto/ed25519.js +25 -0
  8. package/dist/crypto/ed25519.js.map +1 -0
  9. package/dist/crypto/hash.d.ts +5 -0
  10. package/dist/crypto/hash.d.ts.map +1 -0
  11. package/dist/crypto/hash.js +16 -0
  12. package/dist/crypto/hash.js.map +1 -0
  13. package/dist/crypto/hkdf.d.ts +2 -0
  14. package/dist/crypto/hkdf.d.ts.map +1 -0
  15. package/dist/crypto/hkdf.js +6 -0
  16. package/dist/crypto/hkdf.js.map +1 -0
  17. package/dist/crypto/index.d.ts +10 -0
  18. package/dist/crypto/index.d.ts.map +1 -0
  19. package/dist/crypto/index.js +10 -0
  20. package/dist/crypto/index.js.map +1 -0
  21. package/dist/crypto/jcs.d.ts +3 -0
  22. package/dist/crypto/jcs.d.ts.map +1 -0
  23. package/dist/crypto/jcs.js +14 -0
  24. package/dist/crypto/jcs.js.map +1 -0
  25. package/dist/crypto/mnemonic.d.ts +9 -0
  26. package/dist/crypto/mnemonic.d.ts.map +1 -0
  27. package/dist/crypto/mnemonic.js +22 -0
  28. package/dist/crypto/mnemonic.js.map +1 -0
  29. package/dist/crypto/rotation.d.ts +20 -0
  30. package/dist/crypto/rotation.d.ts.map +1 -0
  31. package/dist/crypto/rotation.js +37 -0
  32. package/dist/crypto/rotation.js.map +1 -0
  33. package/dist/crypto/shamir.d.ts +3 -0
  34. package/dist/crypto/shamir.d.ts.map +1 -0
  35. package/dist/crypto/shamir.js +125 -0
  36. package/dist/crypto/shamir.js.map +1 -0
  37. package/dist/crypto/x25519.d.ts +8 -0
  38. package/dist/crypto/x25519.d.ts.map +1 -0
  39. package/dist/crypto/x25519.js +13 -0
  40. package/dist/crypto/x25519.js.map +1 -0
  41. package/dist/encoding/base58.d.ts +5 -0
  42. package/dist/encoding/base58.d.ts.map +1 -0
  43. package/dist/encoding/base58.js +63 -0
  44. package/dist/encoding/base58.js.map +1 -0
  45. package/dist/encoding/index.d.ts +2 -0
  46. package/dist/encoding/index.d.ts.map +1 -0
  47. package/dist/encoding/index.js +2 -0
  48. package/dist/encoding/index.js.map +1 -0
  49. package/dist/identity/did.d.ts +6 -0
  50. package/dist/identity/did.d.ts.map +1 -0
  51. package/dist/identity/did.js +48 -0
  52. package/dist/identity/did.js.map +1 -0
  53. package/dist/identity/index.d.ts +2 -0
  54. package/dist/identity/index.d.ts.map +1 -0
  55. package/dist/identity/index.js +2 -0
  56. package/dist/identity/index.js.map +1 -0
  57. package/dist/index.d.ts +8 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +8 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/p2p/config.d.ts +26 -0
  62. package/dist/p2p/config.d.ts.map +1 -0
  63. package/dist/p2p/config.js +14 -0
  64. package/dist/p2p/config.js.map +1 -0
  65. package/dist/p2p/index.d.ts +4 -0
  66. package/dist/p2p/index.d.ts.map +1 -0
  67. package/dist/p2p/index.js +4 -0
  68. package/dist/p2p/index.js.map +1 -0
  69. package/dist/p2p/node.d.ts +44 -0
  70. package/dist/p2p/node.d.ts.map +1 -0
  71. package/dist/p2p/node.js +299 -0
  72. package/dist/p2p/node.js.map +1 -0
  73. package/dist/p2p/topics.d.ts +6 -0
  74. package/dist/p2p/topics.d.ts.map +1 -0
  75. package/dist/p2p/topics.js +6 -0
  76. package/dist/p2p/topics.js.map +1 -0
  77. package/dist/protocol/constants.d.ts +3 -0
  78. package/dist/protocol/constants.d.ts.map +1 -0
  79. package/dist/protocol/constants.js +3 -0
  80. package/dist/protocol/constants.js.map +1 -0
  81. package/dist/protocol/credentials.d.ts +30 -0
  82. package/dist/protocol/credentials.d.ts.map +1 -0
  83. package/dist/protocol/credentials.js +61 -0
  84. package/dist/protocol/credentials.js.map +1 -0
  85. package/dist/protocol/event-hash.d.ts +10 -0
  86. package/dist/protocol/event-hash.d.ts.map +1 -0
  87. package/dist/protocol/event-hash.js +32 -0
  88. package/dist/protocol/event-hash.js.map +1 -0
  89. package/dist/protocol/index.d.ts +5 -0
  90. package/dist/protocol/index.d.ts.map +1 -0
  91. package/dist/protocol/index.js +5 -0
  92. package/dist/protocol/index.js.map +1 -0
  93. package/dist/protocol/key-rotation.d.ts +23 -0
  94. package/dist/protocol/key-rotation.d.ts.map +1 -0
  95. package/dist/protocol/key-rotation.js +34 -0
  96. package/dist/protocol/key-rotation.js.map +1 -0
  97. package/dist/storage/config.d.ts +22 -0
  98. package/dist/storage/config.d.ts.map +1 -0
  99. package/dist/storage/config.js +63 -0
  100. package/dist/storage/config.js.map +1 -0
  101. package/dist/storage/event-store.d.ts +49 -0
  102. package/dist/storage/event-store.d.ts.map +1 -0
  103. package/dist/storage/event-store.js +329 -0
  104. package/dist/storage/event-store.js.map +1 -0
  105. package/dist/storage/health.d.ts +9 -0
  106. package/dist/storage/health.d.ts.map +1 -0
  107. package/dist/storage/health.js +25 -0
  108. package/dist/storage/health.js.map +1 -0
  109. package/dist/storage/index.d.ts +13 -0
  110. package/dist/storage/index.d.ts.map +1 -0
  111. package/dist/storage/index.js +13 -0
  112. package/dist/storage/index.js.map +1 -0
  113. package/dist/storage/keystore.d.ts +36 -0
  114. package/dist/storage/keystore.d.ts.map +1 -0
  115. package/dist/storage/keystore.js +129 -0
  116. package/dist/storage/keystore.js.map +1 -0
  117. package/dist/storage/kv.d.ts +11 -0
  118. package/dist/storage/kv.d.ts.map +1 -0
  119. package/dist/storage/kv.js +2 -0
  120. package/dist/storage/kv.js.map +1 -0
  121. package/dist/storage/level.d.ts +17 -0
  122. package/dist/storage/level.d.ts.map +1 -0
  123. package/dist/storage/level.js +57 -0
  124. package/dist/storage/level.js.map +1 -0
  125. package/dist/storage/memory.d.ts +12 -0
  126. package/dist/storage/memory.d.ts.map +1 -0
  127. package/dist/storage/memory.js +20 -0
  128. package/dist/storage/memory.js.map +1 -0
  129. package/dist/storage/migrations.d.ts +11 -0
  130. package/dist/storage/migrations.d.ts.map +1 -0
  131. package/dist/storage/migrations.js +47 -0
  132. package/dist/storage/migrations.js.map +1 -0
  133. package/dist/storage/paths.d.ts +14 -0
  134. package/dist/storage/paths.d.ts.map +1 -0
  135. package/dist/storage/paths.js +30 -0
  136. package/dist/storage/paths.js.map +1 -0
  137. package/dist/storage/snapshot-scheduler.d.ts +16 -0
  138. package/dist/storage/snapshot-scheduler.d.ts.map +1 -0
  139. package/dist/storage/snapshot-scheduler.js +43 -0
  140. package/dist/storage/snapshot-scheduler.js.map +1 -0
  141. package/dist/storage/snapshots.d.ts +53 -0
  142. package/dist/storage/snapshots.d.ts.map +1 -0
  143. package/dist/storage/snapshots.js +192 -0
  144. package/dist/storage/snapshots.js.map +1 -0
  145. package/dist/storage/state-store.d.ts +14 -0
  146. package/dist/storage/state-store.d.ts.map +1 -0
  147. package/dist/storage/state-store.js +38 -0
  148. package/dist/storage/state-store.js.map +1 -0
  149. package/dist/utils/PromiseWithResolvers.d.ts +2 -0
  150. package/dist/utils/PromiseWithResolvers.d.ts.map +1 -0
  151. package/dist/utils/PromiseWithResolvers.js +18 -0
  152. package/dist/utils/PromiseWithResolvers.js.map +1 -0
  153. package/dist/utils/bytes.d.ts +8 -0
  154. package/dist/utils/bytes.d.ts.map +1 -0
  155. package/dist/utils/bytes.js +40 -0
  156. package/dist/utils/bytes.js.map +1 -0
  157. package/dist/utils/index.d.ts +2 -0
  158. package/dist/utils/index.d.ts.map +1 -0
  159. package/dist/utils/index.js +2 -0
  160. package/dist/utils/index.js.map +1 -0
  161. package/package.json +81 -0
@@ -0,0 +1,48 @@
1
+ import { base58btcDecode, base58btcEncode, multibaseDecode, multibaseEncode } from '../encoding/base58.js';
2
+ import { sha256Bytes } from '../crypto/hash.js';
3
+ import { bytesToHex } from '../utils/bytes.js';
4
+ const DID_PREFIX = 'did:claw:';
5
+ const ADDRESS_PREFIX = 'claw';
6
+ const ADDRESS_VERSION = 0x00;
7
+ export function didFromPublicKey(publicKey) {
8
+ return `${DID_PREFIX}${multibaseEncode(publicKey)}`;
9
+ }
10
+ export function publicKeyFromDid(did) {
11
+ if (!did.startsWith(DID_PREFIX)) {
12
+ throw new Error('Invalid did:claw prefix');
13
+ }
14
+ return multibaseDecode(did.slice(DID_PREFIX.length));
15
+ }
16
+ export function addressFromPublicKey(publicKey) {
17
+ const checksum = sha256Bytes(publicKey).slice(0, 4);
18
+ const body = new Uint8Array(1 + publicKey.length + checksum.length);
19
+ body[0] = ADDRESS_VERSION;
20
+ body.set(publicKey, 1);
21
+ body.set(checksum, 1 + publicKey.length);
22
+ return `${ADDRESS_PREFIX}${base58btcEncode(body)}`;
23
+ }
24
+ export function publicKeyFromAddress(address) {
25
+ if (!address.startsWith(ADDRESS_PREFIX)) {
26
+ throw new Error('Invalid claw address prefix');
27
+ }
28
+ const decoded = base58btcDecode(address.slice(ADDRESS_PREFIX.length));
29
+ if (decoded.length < 1 + 32 + 4) {
30
+ throw new Error('Invalid address length');
31
+ }
32
+ if (decoded[0] !== ADDRESS_VERSION) {
33
+ throw new Error('Unsupported address version');
34
+ }
35
+ const publicKey = decoded.slice(1, decoded.length - 4);
36
+ const checksum = decoded.slice(decoded.length - 4);
37
+ const expected = sha256Bytes(publicKey).slice(0, 4);
38
+ for (let i = 0; i < 4; i++) {
39
+ if (checksum[i] !== expected[i]) {
40
+ throw new Error(`Invalid address checksum (expected ${bytesToHex(expected)}, got ${bytesToHex(checksum)})`);
41
+ }
42
+ }
43
+ return publicKey;
44
+ }
45
+ export function addressFromDid(did) {
46
+ return addressFromPublicKey(publicKeyFromDid(did));
47
+ }
48
+ //# sourceMappingURL=did.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"did.js","sourceRoot":"","sources":["../../src/identity/did.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './did.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './did.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './crypto/index.js';
2
+ export * from './encoding/index.js';
3
+ export * from './identity/index.js';
4
+ export * from './protocol/index.js';
5
+ export * from './storage/index.js';
6
+ export * from './p2p/index.js';
7
+ export * from './utils/index.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from './crypto/index.js';
2
+ export * from './encoding/index.js';
3
+ export * from './identity/index.js';
4
+ export * from './protocol/index.js';
5
+ export * from './storage/index.js';
6
+ export * from './p2p/index.js';
7
+ export * from './utils/index.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface P2PConfig {
2
+ listen: string[];
3
+ bootstrap: string[];
4
+ enableDHT: boolean;
5
+ allowPublishToZeroPeers: boolean;
6
+ enableAutoNAT: boolean;
7
+ enableDcutr: boolean;
8
+ /** Flood-publish to ALL connected peers instead of only mesh peers. Default: true */
9
+ floodPublish?: boolean;
10
+ /** GossipSub mesh degree target (D). Default: 3 (suitable for small networks) */
11
+ meshD?: number;
12
+ /** GossipSub minimum mesh peers (Dlo). Default: 1 */
13
+ meshDlo?: number;
14
+ /** GossipSub maximum mesh peers (Dhi). Default: 5 */
15
+ meshDhi?: number;
16
+ /** GossipSub heartbeat interval in ms. Default: 700 */
17
+ heartbeatInterval?: number;
18
+ connectionManager?: {
19
+ minConnections?: number;
20
+ maxConnections?: number;
21
+ dialTimeout?: number;
22
+ };
23
+ pubsubTopics?: string[];
24
+ }
25
+ export declare const DEFAULT_P2P_CONFIG: P2PConfig;
26
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +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,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,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,kBAAkB,EAAE,SAYhC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export const DEFAULT_P2P_CONFIG = {
2
+ listen: ['/ip4/0.0.0.0/tcp/9527'],
3
+ bootstrap: [],
4
+ enableDHT: true,
5
+ allowPublishToZeroPeers: true,
6
+ enableAutoNAT: true,
7
+ enableDcutr: true,
8
+ floodPublish: true,
9
+ meshD: 3,
10
+ meshDlo: 1,
11
+ meshDhi: 5,
12
+ heartbeatInterval: 700,
13
+ };
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/p2p/config.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,MAAM,EAAE,CAAC,uBAAuB,CAAC;IACjC,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,IAAI;IACf,uBAAuB,EAAE,IAAI;IAC7B,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,iBAAiB,EAAE,GAAG;CACvB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './config.js';
2
+ export * from './node.js';
3
+ export * from './topics.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ export * from './config.js';
2
+ export * from './node.js';
3
+ export * from './topics.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,44 @@
1
+ import '../utils/PromiseWithResolvers.js';
2
+ import { P2PConfig } from './config.js';
3
+ export interface PubsubMessage {
4
+ topic: string;
5
+ data: Uint8Array;
6
+ from?: string;
7
+ }
8
+ export type MessageHandler = (message: PubsubMessage) => void | Promise<void>;
9
+ type PeerIdLike = {
10
+ toString: () => string;
11
+ };
12
+ type PrivateKeyLike = {
13
+ raw: Uint8Array;
14
+ type: string;
15
+ publicKey: unknown;
16
+ };
17
+ export declare class P2PNode {
18
+ private node;
19
+ private readonly config;
20
+ private readonly privateKeyOverride?;
21
+ private readonly peerIdOverride?;
22
+ constructor(config?: Partial<P2PConfig>, privateKey?: PrivateKeyLike, peerId?: PeerIdLike);
23
+ start(): Promise<void>;
24
+ stop(): Promise<void>;
25
+ getPeerId(): string | null;
26
+ getMultiaddrs(): string[];
27
+ publish(topic: string, data: Uint8Array): Promise<string[]>;
28
+ connect(address: string): Promise<void>;
29
+ subscribe(topic: string, handler: MessageHandler): Promise<() => void>;
30
+ getPeers(): string[];
31
+ getConnections(): string[];
32
+ getSubscribers(topic: string): string[];
33
+ /**
34
+ * Actively discover peers via KadDHT random walk and dial them.
35
+ * This breaks out of a star topology by querying the bootstrap node's
36
+ * DHT routing table for other peers, then connecting directly.
37
+ * Returns the number of newly dialled peers.
38
+ */
39
+ amplifyMesh(): Promise<number>;
40
+ getPeerPublicKey(peerId: string): Promise<Uint8Array | null>;
41
+ private getPubsub;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/p2p/node.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC;AAgB1C,OAAO,EAAE,SAAS,EAAsB,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9E,KAAK,UAAU,GAAG;IAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;CAAE,CAAC;AAE7C,KAAK,cAAc,GAAG;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AA6D5E,qBAAa,OAAO;IAClB,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAiB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAa;gBAEjC,MAAM,GAAE,OAAO,CAAC,SAAS,CAAM,EAAE,UAAU,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,UAAU;IAMvF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmGtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,SAAS,IAAI,MAAM,GAAG,IAAI;IAO1B,aAAa,IAAI,MAAM,EAAE;IAOnB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS3D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAuB5E,QAAQ,IAAI,MAAM,EAAE;IAKpB,cAAc,IAAI,MAAM,EAAE;IAS1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAQvC;;;;;OAKG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAqE9B,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA4BlE,OAAO,CAAC,SAAS;CAOlB"}
@@ -0,0 +1,299 @@
1
+ import '../utils/PromiseWithResolvers.js';
2
+ import { createLibp2p } from 'libp2p';
3
+ import { tcp } from '@libp2p/tcp';
4
+ import { noise } from '@chainsafe/libp2p-noise';
5
+ import { yamux } from '@chainsafe/libp2p-yamux';
6
+ import { gossipsub } from '@chainsafe/libp2p-gossipsub';
7
+ import { kadDHT } from '@libp2p/kad-dht';
8
+ import { bootstrap } from '@libp2p/bootstrap';
9
+ import { mdns } from '@libp2p/mdns';
10
+ import { identify } from '@libp2p/identify';
11
+ import { autoNAT } from '@libp2p/autonat';
12
+ import { dcutr } from '@libp2p/dcutr';
13
+ import { ping } from '@libp2p/ping';
14
+ import { multiaddr } from '@multiformats/multiaddr';
15
+ import { sha256Bytes } from '../crypto/hash.js';
16
+ import { DEFAULT_P2P_CONFIG } from './config.js';
17
+ export class P2PNode {
18
+ node = null;
19
+ config;
20
+ privateKeyOverride;
21
+ peerIdOverride;
22
+ constructor(config = {}, privateKey, peerId) {
23
+ this.config = { ...DEFAULT_P2P_CONFIG, ...config };
24
+ this.privateKeyOverride = privateKey;
25
+ this.peerIdOverride = peerId;
26
+ }
27
+ async start() {
28
+ if (this.node) {
29
+ return;
30
+ }
31
+ if (this.config.enableDHT === false) {
32
+ throw new Error('DHT is required by spec and cannot be disabled');
33
+ }
34
+ const pubsub = gossipsub({
35
+ allowPublishToZeroTopicPeers: this.config.allowPublishToZeroPeers,
36
+ msgIdFn: (message) => sha256Bytes(message.data),
37
+ // ── Mesh tuning for small networks ──────────────────────────────────
38
+ // floodPublish bypasses mesh and sends to ALL connected peers, which
39
+ // guarantees delivery in networks with sparse GossipSub mesh coverage.
40
+ floodPublish: this.config.floodPublish ?? true,
41
+ D: this.config.meshD ?? 3, // mesh degree target (default 6 too high for ≤10 nodes)
42
+ Dlo: this.config.meshDlo ?? 1, // min mesh peers before grafting
43
+ Dhi: this.config.meshDhi ?? 5, // max mesh peers before pruning
44
+ heartbeatInterval: this.config.heartbeatInterval ?? 700,
45
+ });
46
+ const services = {
47
+ identify: identify(),
48
+ pubsub,
49
+ };
50
+ if (this.config.enableDHT) {
51
+ services.dht = kadDHT({
52
+ clientMode: false,
53
+ });
54
+ services.ping = ping();
55
+ }
56
+ if (this.config.enableAutoNAT) {
57
+ services.autoNAT = autoNAT();
58
+ }
59
+ if (this.config.enableDcutr) {
60
+ services.dcutr = dcutr();
61
+ }
62
+ const options = {
63
+ addresses: {
64
+ listen: this.config.listen,
65
+ },
66
+ connectionManager: {
67
+ minConnections: this.config.connectionManager?.minConnections ?? 1,
68
+ maxConnections: this.config.connectionManager?.maxConnections ?? 100,
69
+ // Auto-dial peers discovered via KadDHT every 5 s (default 60 s is too
70
+ // slow for mesh formation in small networks).
71
+ autoDialInterval: 5_000,
72
+ },
73
+ transports: [tcp()],
74
+ streamMuxers: [yamux()],
75
+ connectionEncrypters: [noise()],
76
+ peerDiscovery: [
77
+ // mDNS: discovers all peers on the same LAN / Docker bridge network
78
+ // within seconds via multicast DNS.
79
+ mdns({ interval: 5_000 }),
80
+ // Bootstrap: connects to known seed nodes by multiaddr.
81
+ ...(this.config.bootstrap.length
82
+ ? [
83
+ bootstrap({
84
+ list: this.config.bootstrap,
85
+ timeout: 1000,
86
+ }),
87
+ ]
88
+ : []),
89
+ ],
90
+ services,
91
+ };
92
+ // libp2p v3: pass privateKey (not peerId) for identity
93
+ if (this.privateKeyOverride) {
94
+ options.privateKey = this.privateKeyOverride;
95
+ }
96
+ else if (this.peerIdOverride) {
97
+ // Fallback for older code paths
98
+ options.peerId = this.peerIdOverride;
99
+ }
100
+ const node = await createLibp2p(options);
101
+ this.node = node;
102
+ // Log connection events for debugging
103
+ this.node.addEventListener?.('peer:connect', (event) => {
104
+ const detail = event?.detail;
105
+ console.log(`[p2p] peer:connect ${detail?.toString?.() ?? 'unknown'}`);
106
+ });
107
+ this.node.addEventListener?.('peer:disconnect', (event) => {
108
+ const detail = event?.detail;
109
+ console.log(`[p2p] peer:disconnect ${detail?.toString?.() ?? 'unknown'}`);
110
+ });
111
+ this.node.addEventListener?.('peer:discovery', (event) => {
112
+ const detail = event?.detail;
113
+ console.log(`[p2p] peer:discovery ${detail?.id?.toString?.() ?? 'unknown'}`);
114
+ });
115
+ }
116
+ async stop() {
117
+ if (!this.node) {
118
+ return;
119
+ }
120
+ await this.node.stop();
121
+ this.node = null;
122
+ }
123
+ getPeerId() {
124
+ if (!this.node?.peerId) {
125
+ return null;
126
+ }
127
+ return this.node.peerId.toString();
128
+ }
129
+ getMultiaddrs() {
130
+ if (!this.node?.getMultiaddrs) {
131
+ return [];
132
+ }
133
+ return this.node.getMultiaddrs().map((addr) => addr.toString());
134
+ }
135
+ async publish(topic, data) {
136
+ const pubsub = this.getPubsub();
137
+ const result = await pubsub.publish(topic, data);
138
+ if (result?.recipients) {
139
+ return result.recipients.map((peer) => peer.toString());
140
+ }
141
+ return [];
142
+ }
143
+ async connect(address) {
144
+ if (!this.node?.dial) {
145
+ throw new Error('node not started');
146
+ }
147
+ await this.node.dial(multiaddr(address));
148
+ }
149
+ async subscribe(topic, handler) {
150
+ const pubsub = this.getPubsub();
151
+ const listener = (event) => {
152
+ const message = event.detail;
153
+ if (!message || message.topic !== topic) {
154
+ return;
155
+ }
156
+ void handler({
157
+ topic: message.topic,
158
+ data: message.data,
159
+ from: message.from?.toString?.(),
160
+ });
161
+ };
162
+ pubsub.addEventListener('message', listener);
163
+ pubsub.subscribe(topic);
164
+ return () => {
165
+ pubsub.removeEventListener('message', listener);
166
+ pubsub.unsubscribe(topic);
167
+ };
168
+ }
169
+ getPeers() {
170
+ const pubsub = this.getPubsub();
171
+ return pubsub.getPeers?.().map((peer) => peer.toString()) ?? [];
172
+ }
173
+ getConnections() {
174
+ if (!this.node?.getConnections) {
175
+ return [];
176
+ }
177
+ return this.node.getConnections()
178
+ .map((c) => c.remotePeer?.toString() ?? '')
179
+ .filter(Boolean);
180
+ }
181
+ getSubscribers(topic) {
182
+ const pubsub = this.getPubsub();
183
+ return (pubsub.getSubscribers?.(topic)?.map((peer) => peer.toString()) ??
184
+ []);
185
+ }
186
+ /**
187
+ * Actively discover peers via KadDHT random walk and dial them.
188
+ * This breaks out of a star topology by querying the bootstrap node's
189
+ * DHT routing table for other peers, then connecting directly.
190
+ * Returns the number of newly dialled peers.
191
+ */
192
+ async amplifyMesh() {
193
+ if (!this.node)
194
+ return 0;
195
+ const currentPeers = new Set(this.getConnections());
196
+ const myPeerId = this.getPeerId() ?? '';
197
+ let newPeers = 0;
198
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
199
+ const nodeAny = this.node;
200
+ // ── Approach 1: Enumerate peerStore and dial unknown peers ──────────
201
+ // mDNS / KadDHT populate the peerStore with peers on the local network.
202
+ // Explicitly dialling them ensures a full-mesh topology.
203
+ try {
204
+ const peerStore = nodeAny.peerStore;
205
+ if (peerStore?.all) {
206
+ const allPeers = await peerStore.all();
207
+ for (const peer of allPeers) {
208
+ const pid = peer?.id?.toString?.() ?? '';
209
+ if (!pid || pid === myPeerId || currentPeers.has(pid))
210
+ continue;
211
+ try {
212
+ await this.node.dial?.(peer.id);
213
+ newPeers++;
214
+ currentPeers.add(pid);
215
+ }
216
+ catch {
217
+ // peer may not be reachable yet
218
+ }
219
+ }
220
+ }
221
+ }
222
+ catch {
223
+ // peerStore enumeration not available in this libp2p version
224
+ }
225
+ // ── Approach 2: KadDHT random walk (fallback) ──────────────────────
226
+ if (newPeers === 0) {
227
+ try {
228
+ const routing = nodeAny.peerRouting ?? nodeAny.services?.dht;
229
+ if (routing?.getClosestPeers) {
230
+ const randomKey = new Uint8Array(32);
231
+ globalThis.crypto.getRandomValues(randomKey);
232
+ const controller = new AbortController();
233
+ const timeout = setTimeout(() => controller.abort(), 3_000);
234
+ try {
235
+ for await (const peer of routing.getClosestPeers(randomKey, {
236
+ signal: controller.signal,
237
+ })) {
238
+ const id = peer?.id;
239
+ const pid = id?.toString?.() ?? '';
240
+ if (!pid || pid === myPeerId || currentPeers.has(pid))
241
+ continue;
242
+ try {
243
+ await this.node.dial?.(id);
244
+ newPeers++;
245
+ currentPeers.add(pid);
246
+ }
247
+ catch {
248
+ // dial failure expected for unreachable peers
249
+ }
250
+ }
251
+ }
252
+ finally {
253
+ clearTimeout(timeout);
254
+ }
255
+ }
256
+ }
257
+ catch {
258
+ // DHT walk can fail / timeout when node is still bootstrapping
259
+ }
260
+ }
261
+ return newPeers;
262
+ }
263
+ async getPeerPublicKey(peerId) {
264
+ if (!this.node?.peerStore?.get) {
265
+ return null;
266
+ }
267
+ try {
268
+ const record = await this.node.peerStore.get(peerId);
269
+ const publicKey = record?.id?.publicKey ?? record?.publicKey;
270
+ if (!publicKey) {
271
+ return null;
272
+ }
273
+ if (publicKey.bytes) {
274
+ return publicKey.bytes;
275
+ }
276
+ if (publicKey.raw) {
277
+ return publicKey.raw;
278
+ }
279
+ if (publicKey.marshal) {
280
+ return publicKey.marshal();
281
+ }
282
+ if (publicKey.toBytes) {
283
+ return publicKey.toBytes();
284
+ }
285
+ return null;
286
+ }
287
+ catch {
288
+ return null;
289
+ }
290
+ }
291
+ getPubsub() {
292
+ const pubsub = this.node?.services?.pubsub;
293
+ if (!pubsub) {
294
+ throw new Error('pubsub service not initialized');
295
+ }
296
+ return pubsub;
297
+ }
298
+ }
299
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/p2p/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const TOPIC_EVENTS = "/clawnet/1.0.0/events";
2
+ export declare const TOPIC_MARKETS = "/clawnet/1.0.0/markets";
3
+ export declare const TOPIC_REQUESTS = "/clawnet/1.0.0/requests";
4
+ export declare const TOPIC_RESPONSES = "/clawnet/1.0.0/responses";
5
+ export declare const ALL_TOPICS: string[];
6
+ //# sourceMappingURL=topics.d.ts.map
@@ -0,0 +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,eAAO,MAAM,UAAU,UAAiE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const TOPIC_EVENTS = '/clawnet/1.0.0/events';
2
+ export const TOPIC_MARKETS = '/clawnet/1.0.0/markets';
3
+ export const TOPIC_REQUESTS = '/clawnet/1.0.0/requests';
4
+ export const TOPIC_RESPONSES = '/clawnet/1.0.0/responses';
5
+ export const ALL_TOPICS = [TOPIC_EVENTS, TOPIC_MARKETS, TOPIC_REQUESTS, TOPIC_RESPONSES];
6
+ //# sourceMappingURL=topics.js.map
@@ -0,0 +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,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const MAX_CLOCK_SKEW_MS: number;
2
+ export declare const NONCE_WINDOW = 5;
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/protocol/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAChD,eAAO,MAAM,YAAY,IAAI,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const MAX_CLOCK_SKEW_MS = 10 * 60 * 1000;
2
+ export const NONCE_WINDOW = 5;
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/protocol/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ export declare const VC_DOMAIN_PREFIX = "clawnet:vc:v1:";
2
+ export interface VerifiableCredentialProof {
3
+ type: 'Ed25519Signature2020';
4
+ created: string;
5
+ verificationMethod: string;
6
+ proofPurpose: 'assertionMethod';
7
+ proofValue: string;
8
+ }
9
+ export interface VerifiableCredential<TSubject = Record<string, unknown>> {
10
+ '@context': string[];
11
+ type: string[];
12
+ issuer: string;
13
+ issuanceDate: string;
14
+ credentialSubject: TSubject;
15
+ proof: VerifiableCredentialProof;
16
+ }
17
+ export interface CapabilityCredentialSubject {
18
+ id: string;
19
+ name: string;
20
+ pricing: Record<string, unknown>;
21
+ description?: string;
22
+ }
23
+ export type CapabilityCredential = VerifiableCredential<CapabilityCredentialSubject>;
24
+ export declare function stripCredentialProof<TSubject>(credential: VerifiableCredential<TSubject>): Omit<VerifiableCredential<TSubject>, 'proof'>;
25
+ export declare function canonicalCredentialBytes<TSubject>(credential: VerifiableCredential<TSubject>): Uint8Array;
26
+ export declare function credentialSigningBytes<TSubject>(credential: VerifiableCredential<TSubject>): Uint8Array;
27
+ export declare function signCredentialProof<TSubject>(credential: VerifiableCredential<TSubject>, privateKey: Uint8Array): Promise<string>;
28
+ export declare function verifyCredentialProof<TSubject>(credential: VerifiableCredential<TSubject>): Promise<boolean>;
29
+ export declare function verifyCapabilityCredential(credential: CapabilityCredential): Promise<boolean>;
30
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/protocol/credentials.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,iBAAiB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACtE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,QAAQ,CAAC;IAC5B,KAAK,EAAE,yBAAyB,CAAC;CAClC;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,2BAA2B,CAAC,CAAC;AAErF,wBAAgB,oBAAoB,CAAC,QAAQ,EAC3C,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACzC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAI/C;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAC/C,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACzC,UAAU,CAEZ;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAC7C,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACzC,UAAU,CAGZ;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAChD,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAC1C,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAClD,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACzC,OAAO,CAAC,OAAO,CAAC,CA+BlB;AAED,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAWlB"}