@cello-protocol/client 0.0.21 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-send-helpers.d.ts +25 -0
- package/dist/client-send-helpers.d.ts.map +1 -0
- package/dist/client-send-helpers.js +118 -0
- package/dist/client-send-helpers.js.map +1 -0
- package/dist/client-startup.d.ts +74 -0
- package/dist/client-startup.d.ts.map +1 -0
- package/dist/client-startup.js +338 -0
- package/dist/client-startup.js.map +1 -0
- package/dist/client-wiring.d.ts +120 -0
- package/dist/client-wiring.d.ts.map +1 -0
- package/dist/client-wiring.js +289 -0
- package/dist/client-wiring.js.map +1 -0
- package/dist/client.d.ts +29 -169
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +222 -5396
- package/dist/client.js.map +1 -1
- package/dist/connection-inbound-handler.d.ts +47 -0
- package/dist/connection-inbound-handler.d.ts.map +1 -0
- package/dist/connection-inbound-handler.js +325 -0
- package/dist/connection-inbound-handler.js.map +1 -0
- package/dist/connection-manager.d.ts +191 -0
- package/dist/connection-manager.d.ts.map +1 -0
- package/dist/connection-manager.js +692 -0
- package/dist/connection-manager.js.map +1 -0
- package/dist/frame-dispatch.d.ts +28 -0
- package/dist/frame-dispatch.d.ts.map +1 -0
- package/dist/frame-dispatch.js +118 -0
- package/dist/frame-dispatch.js.map +1 -0
- package/dist/network-directory-node.d.ts +2 -0
- package/dist/network-directory-node.d.ts.map +1 -1
- package/dist/network-directory-node.js +24 -16
- package/dist/network-directory-node.js.map +1 -1
- package/dist/registration-manager.d.ts +54 -0
- package/dist/registration-manager.d.ts.map +1 -0
- package/dist/registration-manager.js +249 -0
- package/dist/registration-manager.js.map +1 -0
- package/dist/relay-stream-manager.d.ts +136 -0
- package/dist/relay-stream-manager.d.ts.map +1 -0
- package/dist/relay-stream-manager.js +834 -0
- package/dist/relay-stream-manager.js.map +1 -0
- package/dist/seal-manager.d.ts +133 -0
- package/dist/seal-manager.d.ts.map +1 -0
- package/dist/seal-manager.js +803 -0
- package/dist/seal-manager.js.map +1 -0
- package/dist/session-assignment-parser.d.ts +33 -0
- package/dist/session-assignment-parser.d.ts.map +1 -0
- package/dist/session-assignment-parser.js +149 -0
- package/dist/session-assignment-parser.js.map +1 -0
- package/dist/session-manager.d.ts +132 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +611 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/signaling-manager.d.ts +85 -0
- package/dist/signaling-manager.d.ts.map +1 -0
- package/dist/signaling-manager.js +605 -0
- package/dist/signaling-manager.js.map +1 -0
- package/package.json +2 -2
package/dist/client.d.ts
CHANGED
|
@@ -1,110 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CELLO Client —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* SESSION-002 additions: receiveSessionAssignment, listSessions.
|
|
7
|
-
*
|
|
8
|
-
* PSEUDOCODE (Phase P):
|
|
9
|
-
*
|
|
10
|
-
* send(peerPubkeyHex, content):
|
|
11
|
-
* 1. Look up peerPubkeyHex → peer_not_connected if absent
|
|
12
|
-
* 2. buildEnvelope(content, keyProvider, Date.now()) → content_too_large if rejected
|
|
13
|
-
* 3. serializeEnvelope → bytes
|
|
14
|
-
* 4. node.newStream(peerId, CELLO_PROTOCOL_ID):
|
|
15
|
-
* - structured error → peer_unreachable or connection_lost
|
|
16
|
-
* 5. stream.send(lp.encode.single(bytes))
|
|
17
|
-
* 6. stream.close() — half-close write side
|
|
18
|
-
* 7. Drain read side (for await lp.decode(stream)):
|
|
19
|
-
* - clean EOF → delivered:true
|
|
20
|
-
* - stream.status === 'reset' → remote_rejected
|
|
21
|
-
* - transport error → connection_lost
|
|
22
|
-
*
|
|
23
|
-
* inbound handler (stream):
|
|
24
|
-
* 1. AbortController with 5s timeout
|
|
25
|
-
* 2. Read one LP frame via lp.decode(stream) — abort if timeout fires
|
|
26
|
-
* 3. deserializeEnvelope(payload) → malformed_envelope + stream.abort on error
|
|
27
|
-
* 4. validateEnvelope(envelope) → stream.abort on error
|
|
28
|
-
* 5. enqueue to receiveQueue keyed by sender_pubkey hex
|
|
29
|
-
* 6. stream.close() — clean close signals delivered:true to sender
|
|
30
|
-
*
|
|
31
|
-
* sendRaw(peerPubkeyHex, bytes) [internal, exposed for tests]:
|
|
32
|
-
* Open stream, write raw bytes as single LP frame, await close type.
|
|
33
|
-
* Used by tests to inject tampered envelopes.
|
|
34
|
-
*
|
|
35
|
-
* receiveSessionAssignment(assignment, myPubkey):
|
|
36
|
-
* SESSION-002 AC-002, AC-003, AC-004, AC-005, SI-003
|
|
37
|
-
* SESSION-004 changes: replace M1 Ed25519 verify with FROST verify path.
|
|
38
|
-
*
|
|
39
|
-
* SESSION-004 pseudocode (Phase P rev2):
|
|
40
|
-
* RFC 9591 (FROST), RFC 8032 (Ed25519), FIPS 180-4 (SHA-256)
|
|
41
|
-
*
|
|
42
|
-
* 1. Check signature_type (SESSION-004 SI-003, AC-003):
|
|
43
|
-
* if assignment.signature_type === 'single':
|
|
44
|
-
* return { ok:false, reason:"unsupported_signature_type" }
|
|
45
|
-
* // Hard cut — even if the single-key sig itself verifies (SI-003 is absolute)
|
|
46
|
-
* // No session record is created (SI-003). No I/O is attempted.
|
|
47
|
-
*
|
|
48
|
-
* 2. Determine role and verification key (SESSION-004 AC-007):
|
|
49
|
-
* isInitiator = (Buffer.from(myPubkey).equals(Buffer.from(pubA)))
|
|
50
|
-
* if isInitiator:
|
|
51
|
-
* // CRITICAL-1 FIX: initiator MUST have a thresholdSigner injected.
|
|
52
|
-
* // There is NO fallback to assignment.signer_pubkey — that is frame-provided
|
|
53
|
-
* // and attacker-controlled. Absence of a signer is a hard error.
|
|
54
|
-
* if this.#thresholdSigner is null:
|
|
55
|
-
* return { ok:false, reason:"frost_signer_not_configured" }
|
|
56
|
-
* verifyKey = this.#thresholdSigner.getPrimaryPubkey() // HIGH-4: on IThresholdSigner
|
|
57
|
-
* else:
|
|
58
|
-
* // Counterparty: use signer_pubkey embedded in the frame (A's primary_pubkey)
|
|
59
|
-
* // TypeScript discriminated union guarantees signer_pubkey is present for 'frost' frames
|
|
60
|
-
* verifyKey = assignment.signer_pubkey // guaranteed non-undefined by type system
|
|
61
|
-
*
|
|
62
|
-
* 3. Compute genesis_prev_root (same as M1):
|
|
63
|
-
* genesis_prev_root = computeGenesisPrevRoot(pubA, pubB, session_id, session_timestamp)
|
|
64
|
-
*
|
|
65
|
-
* 4. Build session establishment TBS (HIGH-5: uses buildSessionEstablishmentTbs from protocol-types):
|
|
66
|
-
* tbs = buildSessionEstablishmentTbs(session_id, pubA, pubB, genesis_prev_root, session_timestamp)
|
|
67
|
-
*
|
|
68
|
-
* 5. Verify FROST signature (SESSION-004 AC-002, SI-001):
|
|
69
|
-
* // Use FrostThresholdSigner.verifySignature() which handles framing internally:
|
|
70
|
-
* // framedMsg = <context>\0<tbs> (domain separation per CONTEXT.md)
|
|
71
|
-
* // OR use ed25519_FROST.verify(sig, frameMessage(context, tbs), verifyKey) directly
|
|
72
|
-
* // The client imports ed25519_FROST from @noble/curves/ed25519 (not from @cello-protocol/crypto)
|
|
73
|
-
* // to keep the verify path independent from any signer state.
|
|
74
|
-
* framedMsg = frameMessage(CONTEXT_SESSION_ESTABLISHMENT, tbs) // context\0tbs
|
|
75
|
-
* isValid = ed25519_FROST.verify(assignment.directory_signature, framedMsg, verifyKey)
|
|
76
|
-
* if !isValid:
|
|
77
|
-
* return { ok:false, reason:"frost_signature_invalid" }
|
|
78
|
-
* // Never accept a tampered signature (SI-001 absolute)
|
|
79
|
-
*
|
|
80
|
-
* 6-9. (same as M1: content handler, relay auth, counterparty dial, store session)
|
|
81
|
-
*
|
|
82
|
-
* IMPORTANT NOTE on CelloClientImpl constructor and createClient factory changes:
|
|
83
|
-
* - Add optional #thresholdSigner: IThresholdSigner | null field
|
|
84
|
-
* - createClient accepts optional thresholdSigner in opts
|
|
85
|
-
* - No @cello-protocol/directory import — IThresholdSigner comes from @cello-protocol/crypto
|
|
86
|
-
*
|
|
87
|
-
* IMPORTANT NOTE on ReceiveAssignmentResult (IMPORTANT-9):
|
|
88
|
-
* Add 'frost_signature_invalid' | 'unsupported_signature_type' | 'frost_signer_not_configured'
|
|
89
|
-
* to the reason union in types.ts
|
|
90
|
-
*
|
|
91
|
-
* 1. Build TBS = CBOR([session_id, participant_a.pubkey, participant_b.pubkey, session_timestamp])
|
|
92
|
-
* 2. Verify Ed25519(TBS, assignment.directory_pubkey, assignment.directory_signature) [M1, REMOVED in M2]
|
|
93
|
-
* → { ok:false, reason:"directory_signature_invalid" } if fails
|
|
94
|
-
* 3. Determine counterparty: if myPubkey == participant_a.pubkey then counterparty = B, else A
|
|
95
|
-
* 4. Compute genesis_prev_root = computeGenesisPrevRoot(pubA, pubB, session_id, session_timestamp)
|
|
96
|
-
* per FIPS 180-4 / SESSION-002
|
|
97
|
-
* 5. Register /cello/content/1.0.0 handler on node (if not yet registered)
|
|
98
|
-
* 6. Dial relay on /cello/relay/1.0.0, complete challenge-response auth:
|
|
99
|
-
* a. Read relay_auth_challenge frame
|
|
100
|
-
* b. Compute authMsg = SHA-256("CELLO-RELAY-AUTH-v1" || nonce || myPubkey) [RFC 8032, FIPS 180-4]
|
|
101
|
-
* c. Sign authMsg with keyProvider → signature
|
|
102
|
-
* d. Send relay_auth_response{pubkey, signature}
|
|
103
|
-
* → { ok:false, reason:"relay_auth_failed" } or "relay_auth_error" on failure
|
|
104
|
-
* 7. Dial counterparty on /cello/content/1.0.0
|
|
105
|
-
* → { ok:false, reason:"dial_counterparty_failed" } if unreachable
|
|
106
|
-
* 8. Store SessionRecord with status:"active", last_seen_seq:0
|
|
107
|
-
* 9. Return { ok:true, sessionId }
|
|
2
|
+
* CELLO Client — CelloClientImpl facade.
|
|
3
|
+
* Domain logic delegated to RegistrationManager, ConnectionManager, SignalingManager,
|
|
4
|
+
* RelayStreamManager, SealManager, SessionManager.
|
|
5
|
+
* Wiring: client-wiring.ts | Helpers: client-send-helpers.ts, client-startup.ts.
|
|
108
6
|
*/
|
|
109
7
|
import type { IThresholdSigner } from "@cello-protocol/crypto";
|
|
110
8
|
import type { KeyProvider } from "@cello-protocol/crypto";
|
|
@@ -113,64 +11,20 @@ import type { Stream } from "@libp2p/interface";
|
|
|
113
11
|
import type { CelloClient, SendResult, SessionRecord } from "./types.js";
|
|
114
12
|
import type { Logger } from "@cello-protocol/interfaces";
|
|
115
13
|
import type { ClientStatePersistence } from "./client-state-persistence.js";
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
* The frame must have type === "session_request_error".
|
|
120
|
-
*/
|
|
121
|
-
export declare function mapSessionRequestErrorFrame(frame: Record<string, unknown>): import("./types.js").InitiateSessionResult;
|
|
122
|
-
export declare function createClient(node: CelloNode, keyProvider: KeyProvider, opts?: {
|
|
123
|
-
onMessageQueued?: (senderPubkeyHex: string) => void;
|
|
124
|
-
contentGraceMs?: number;
|
|
125
|
-
/** SESSION-006: ms to attempt relay reconnect before giving up. Default: 60000. */
|
|
126
|
-
reconnectTimeoutMs?: number;
|
|
127
|
-
/** SESSION-004/SESSION-005: optional FROST threshold signer for initiator role and seal ceremony coordination. */
|
|
128
|
-
thresholdSigner?: IThresholdSigner;
|
|
129
|
-
/** SESSION-005: ms to wait for FROST seal after bilateral exchange. Default: 15000. */
|
|
130
|
-
sealFrostTimeoutMs?: number;
|
|
131
|
-
/** ADAPTER-003: directory endpoint for initiateSession. */
|
|
132
|
-
directoryEndpoint?: {
|
|
133
|
-
peer_id: string;
|
|
134
|
-
multiaddrs: string[];
|
|
135
|
-
};
|
|
136
|
-
/** REG-001: path for persisting ML-DSA-44 keypair. If set, FileMlDsaKeyProvider.load() is used. */
|
|
137
|
-
mlDsaKeyFile?: string;
|
|
138
|
-
/** CONNREQ-002: connection policy for evaluating inbound connection_request_inbound frames. */
|
|
139
|
-
connectionPolicy?: import("./connection-policy.js").SignalRequirementPolicy;
|
|
140
|
-
/** CONNREQ-002: overall connection timeout in ms. Default: 300000. */
|
|
141
|
-
connectionTimeoutMs?: number;
|
|
142
|
-
/** CONNREQ-002: Round 2 silence timeout in ms. Default: 120000. */
|
|
143
|
-
round2TimeoutMs?: number;
|
|
144
|
-
/** CONNREQ-002: if true, expose _evaluateCallCount on the instance for test assertions. */
|
|
145
|
-
trackEvaluateCount?: boolean;
|
|
146
|
-
/** CONNREQ-002: sender pubkeys that bypass evaluateConnectionPackage. */
|
|
147
|
-
whitelist?: string[];
|
|
148
|
-
/** CONNREQ-002: callback fired when an inbound connection_request_inbound is queued for agent review. */
|
|
149
|
-
onConnectionPendingReview?: (event: import("@cello-protocol/protocol-types").ConnectionRequestInbound) => void;
|
|
150
|
-
/** DB-003: attempt cross-check of sender's ml_dsa_pubkey on inbound requests. */
|
|
151
|
-
crossCheckDirectoryOnInbound?: boolean;
|
|
152
|
-
/** PERSIST-014: injected logger for observability events. */
|
|
153
|
-
logger?: Logger;
|
|
154
|
-
/** PERSIST-024: optional persistence layer for structured SQLCipher state. */
|
|
155
|
-
persistence?: ClientStatePersistence;
|
|
156
|
-
}): CelloClient & {
|
|
14
|
+
import { mapSessionRequestErrorFrame } from "./session-assignment-parser.js";
|
|
15
|
+
/** Full public surface exposed by createClient — CelloClient + test/escape-hatch methods. */
|
|
16
|
+
export type ClientExtended = CelloClient & {
|
|
157
17
|
sendRaw(peerPubkeyHex: string, bytes: Uint8Array): Promise<SendResult>;
|
|
158
18
|
openRawStream(peerPubkeyHex: string): Promise<Stream>;
|
|
159
19
|
openContentStreamByPeerId(peerId: string): Promise<Stream>;
|
|
160
|
-
/** SESSION-005: register the client's FROST primary_pubkey for seal verification. */
|
|
161
20
|
setPrimaryPubkey(primaryPubkey: Uint8Array): void;
|
|
162
21
|
injectDirectoryFrame(sessionIdHex: string, frame: Record<string, unknown>): void;
|
|
163
22
|
injectLeafDeliver(sessionIdHex: string, frame: Record<string, unknown>): void;
|
|
164
23
|
injectRelayDisconnect(sessionIdHex: string): void;
|
|
165
|
-
/** TEST-ONLY: register a minimal session record without a real relay connection. */
|
|
166
24
|
injectTestSession(sessionIdHex: string, sessionId: Uint8Array, myPubkeyHex: string, directoryPubkey: Uint8Array, status?: SessionRecord["status"], opts?: {
|
|
167
25
|
isInitiator?: boolean;
|
|
168
26
|
}): void;
|
|
169
|
-
/** CONNREQ-002: list active connection records. */
|
|
170
27
|
listConnections(): import("@cello-protocol/protocol-types").ClientConnectionRecord[];
|
|
171
|
-
/** CONNREQ-002 / AC-008 (DX-001): send connection_request to target B and await final outcome.
|
|
172
|
-
* Per-stage timeouts: dialTimeoutMs (stage 'dial'), sendTimeoutMs (stage 'send'),
|
|
173
|
-
* waitTimeoutMs (stage 'wait'). Timeout result includes the stage that fired. */
|
|
174
28
|
cello_request_connection(opts: {
|
|
175
29
|
target_pubkey: string;
|
|
176
30
|
package_cbor: Uint8Array;
|
|
@@ -197,7 +51,6 @@ export declare function createClient(node: CelloNode, keyProvider: KeyProvider,
|
|
|
197
51
|
result: "error";
|
|
198
52
|
reason: string;
|
|
199
53
|
}>;
|
|
200
|
-
/** CONNREQ-002: respond to disclosure_request (Round 2 sender side). */
|
|
201
54
|
cello_respond_to_disclosure_request(opts: {
|
|
202
55
|
connection_request_id: string;
|
|
203
56
|
package_cbor: Uint8Array;
|
|
@@ -216,7 +69,6 @@ export declare function createClient(node: CelloNode, keyProvider: KeyProvider,
|
|
|
216
69
|
result: "error";
|
|
217
70
|
reason: string;
|
|
218
71
|
}>;
|
|
219
|
-
/** CONNREQ-002: request more disclosure from sender (Round 2, target side). */
|
|
220
72
|
cello_request_more_disclosure(opts: {
|
|
221
73
|
connection_request_id: string;
|
|
222
74
|
requested_items: unknown[];
|
|
@@ -225,13 +77,9 @@ export declare function createClient(node: CelloNode, keyProvider: KeyProvider,
|
|
|
225
77
|
} | {
|
|
226
78
|
ok: true;
|
|
227
79
|
}>;
|
|
228
|
-
/** CONNREQ-002: register connection_established event handler. */
|
|
229
80
|
onConnectionEstablished(handler: (event: import("@cello-protocol/protocol-types").ConnectionEstablished) => void): void;
|
|
230
|
-
/** CONNREQ-002: register disclosure_request_inbound event handler (sender side). */
|
|
231
81
|
onDisclosureRequested(handler: (event: import("@cello-protocol/protocol-types").DisclosureRequestInbound) => void): void;
|
|
232
|
-
/** CONNREQ-002: reconnect the persistent directory signaling stream. */
|
|
233
82
|
reconnectDirectory(): Promise<boolean>;
|
|
234
|
-
/** PERSIST-015: send seal_unilateral to directory after delivery_grace_seconds. */
|
|
235
83
|
initiateUnilateralSeal(sessionIdHex: string): Promise<{
|
|
236
84
|
ok: true;
|
|
237
85
|
sealed_root: Uint8Array;
|
|
@@ -244,31 +92,43 @@ export declare function createClient(node: CelloNode, keyProvider: KeyProvider,
|
|
|
244
92
|
ok: false;
|
|
245
93
|
reason: string;
|
|
246
94
|
}>;
|
|
247
|
-
/** TEST-ONLY: inject a pending inbound connection request into state. */
|
|
248
95
|
_injectPendingConnectionRequest(opts: {
|
|
249
96
|
connection_request_id: string;
|
|
250
97
|
from_pubkey: string;
|
|
251
98
|
package_cbor: Uint8Array;
|
|
252
99
|
round: number;
|
|
253
100
|
}): void;
|
|
254
|
-
/**
|
|
255
|
-
* CONNREQ-003 TEST-ONLY: route a synthetic connection outcome frame through the
|
|
256
|
-
* resolver Map — used by SI-001 adversarial test to verify cross-target isolation.
|
|
257
|
-
*/
|
|
258
101
|
_injectConnectionFrame(frame: Record<string, unknown>): void;
|
|
259
|
-
/** CONNREQ-003 TEST-ONLY: current size of the pending resolver Map. */
|
|
260
102
|
_pendingConnectionRequestResolverCount: number;
|
|
261
|
-
/** TEST-ONLY: evaluate call counter (only incremented when trackEvaluateCount=true). */
|
|
262
103
|
_evaluateCallCount: number;
|
|
263
|
-
/** PERSIST-024: load all durable state from the SQLCipher DB and populate in-memory state. */
|
|
264
104
|
loadPersistedState(): Promise<void>;
|
|
265
|
-
/** PERSIST-024: return hashes pending relay resubmission after loadPersistedState(). */
|
|
266
105
|
getLoadedPendingHashes(): Array<{
|
|
267
106
|
sessionId: string;
|
|
268
107
|
hashHex: string;
|
|
269
108
|
enqueuedAt: number;
|
|
270
109
|
}>;
|
|
271
|
-
/** Open the persistent signaling stream to the directory if not already open. Call after setDirectoryEndpoint(). */
|
|
272
110
|
announceToDirectory(): Promise<void>;
|
|
273
111
|
};
|
|
112
|
+
export { mapSessionRequestErrorFrame };
|
|
113
|
+
export declare function createClient(node: CelloNode, keyProvider: KeyProvider, opts?: {
|
|
114
|
+
onMessageQueued?: (senderPubkeyHex: string) => void;
|
|
115
|
+
contentGraceMs?: number;
|
|
116
|
+
reconnectTimeoutMs?: number;
|
|
117
|
+
thresholdSigner?: IThresholdSigner;
|
|
118
|
+
sealFrostTimeoutMs?: number;
|
|
119
|
+
directoryEndpoint?: {
|
|
120
|
+
peer_id: string;
|
|
121
|
+
multiaddrs: string[];
|
|
122
|
+
};
|
|
123
|
+
mlDsaKeyFile?: string;
|
|
124
|
+
connectionPolicy?: import("./connection-policy.js").SignalRequirementPolicy;
|
|
125
|
+
connectionTimeoutMs?: number;
|
|
126
|
+
round2TimeoutMs?: number;
|
|
127
|
+
trackEvaluateCount?: boolean;
|
|
128
|
+
whitelist?: string[];
|
|
129
|
+
onConnectionPendingReview?: (event: import("@cello-protocol/protocol-types").ConnectionRequestInbound) => void;
|
|
130
|
+
crossCheckDirectoryOnInbound?: boolean;
|
|
131
|
+
logger?: Logger;
|
|
132
|
+
persistence?: ClientStatePersistence;
|
|
133
|
+
}): ClientExtended;
|
|
274
134
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|