@cello-protocol/daemon 0.0.167 → 0.0.169
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/daemon.d.ts.map +1 -1
- package/dist/daemon.js +115 -254
- package/dist/daemon.js.map +1 -1
- package/dist/document-amendment-store.d.ts +94 -46
- package/dist/document-amendment-store.d.ts.map +1 -1
- package/dist/document-amendment-store.js +217 -102
- package/dist/document-amendment-store.js.map +1 -1
- package/dist/document-delivery-transport.d.ts +41 -52
- package/dist/document-delivery-transport.d.ts.map +1 -1
- package/dist/document-delivery-transport.js +6 -156
- package/dist/document-delivery-transport.js.map +1 -1
- package/dist/document-frame-router.d.ts +13 -17
- package/dist/document-frame-router.d.ts.map +1 -1
- package/dist/document-frame-router.js +21 -93
- package/dist/document-frame-router.js.map +1 -1
- package/dist/document-handlers.d.ts +1 -1
- package/dist/document-handlers.d.ts.map +1 -1
- package/dist/document-handlers.js +471 -466
- package/dist/document-handlers.js.map +1 -1
- package/dist/document-handshake.d.ts +4 -1
- package/dist/document-handshake.d.ts.map +1 -1
- package/dist/document-handshake.js +3 -1
- package/dist/document-handshake.js.map +1 -1
- package/dist/document-inbound.d.ts +18 -5
- package/dist/document-inbound.d.ts.map +1 -1
- package/dist/document-inbound.js +94 -110
- package/dist/document-inbound.js.map +1 -1
- package/dist/document-layer.d.ts +28 -67
- package/dist/document-layer.d.ts.map +1 -1
- package/dist/document-layer.js +670 -565
- package/dist/document-layer.js.map +1 -1
- package/dist/document-lifecycle.d.ts +11 -157
- package/dist/document-lifecycle.d.ts.map +1 -1
- package/dist/document-lifecycle.js +26 -561
- package/dist/document-lifecycle.js.map +1 -1
- package/dist/document-publish.d.ts +13 -0
- package/dist/document-publish.d.ts.map +1 -1
- package/dist/document-publish.js +19 -11
- package/dist/document-publish.js.map +1 -1
- package/dist/document-reconcile-engine.d.ts +66 -0
- package/dist/document-reconcile-engine.d.ts.map +1 -0
- package/dist/document-reconcile-engine.js +225 -0
- package/dist/document-reconcile-engine.js.map +1 -0
- package/dist/document-reconcile-scheduler.d.ts +91 -0
- package/dist/document-reconcile-scheduler.d.ts.map +1 -0
- package/dist/document-reconcile-scheduler.js +153 -0
- package/dist/document-reconcile-scheduler.js.map +1 -0
- package/dist/document-rejection.d.ts +2 -0
- package/dist/document-rejection.d.ts.map +1 -1
- package/dist/document-rejection.js +5 -1
- package/dist/document-rejection.js.map +1 -1
- package/dist/document-store.d.ts +18 -220
- package/dist/document-store.d.ts.map +1 -1
- package/dist/document-store.js +95 -717
- package/dist/document-store.js.map +1 -1
- package/dist/initiate-session-handler.d.ts +5 -0
- package/dist/initiate-session-handler.d.ts.map +1 -1
- package/dist/initiate-session-handler.js +1 -0
- package/dist/initiate-session-handler.js.map +1 -1
- package/package.json +5 -5
- package/dist/delivery-sweep-bound.d.ts +0 -79
- package/dist/delivery-sweep-bound.d.ts.map +0 -1
- package/dist/delivery-sweep-bound.js +0 -109
- package/dist/delivery-sweep-bound.js.map +0 -1
- package/dist/document-ack-inbound.d.ts +0 -71
- package/dist/document-ack-inbound.d.ts.map +0 -1
- package/dist/document-ack-inbound.js +0 -210
- package/dist/document-ack-inbound.js.map +0 -1
- package/dist/document-control-notifier.d.ts +0 -107
- package/dist/document-control-notifier.d.ts.map +0 -1
- package/dist/document-control-notifier.js +0 -137
- package/dist/document-control-notifier.js.map +0 -1
- package/dist/document-delivery.d.ts +0 -229
- package/dist/document-delivery.d.ts.map +0 -1
- package/dist/document-delivery.js +0 -449
- package/dist/document-delivery.js.map +0 -1
- package/dist/document-join-store.d.ts +0 -80
- package/dist/document-join-store.d.ts.map +0 -1
- package/dist/document-join-store.js +0 -197
- package/dist/document-join-store.js.map +0 -1
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DOD-MP-JOIN-1 (daemon half) — the join-offer store: pending consent, both roles, settle-once.
|
|
3
|
-
*
|
|
4
|
-
* One table for both sides of a join (the `document_proposals` precedent): the INVITEE holds the
|
|
5
|
-
* offer they received — as RECEIVED BYTES, validated before recording — and the INVITER holds the
|
|
6
|
-
* offer they authored plus the invitee's signed answer when it arrives. Keyed on
|
|
7
|
-
* `(owner, amendment_hash)`: the admitting amendment is the fact being consented to, and a
|
|
8
|
-
* re-invitation after a refusal is a new amendment with a new hash — a new row, never a
|
|
9
|
-
* reopened one.
|
|
10
|
-
*
|
|
11
|
-
* A refused-at-arrival offer (bad chain, wrong invitee, version mismatch) is RECORDED refused
|
|
12
|
-
* with its reason rather than dropped — a dropped offer is indistinguishable from an inviter who
|
|
13
|
-
* never sent one.
|
|
14
|
-
*/
|
|
15
|
-
import { decodeDocumentJoinOffer, decodeDocumentJoinAnswer, buildDocumentJoinAnswerTbs, } from "@cello-protocol/protocol-types";
|
|
16
|
-
const CREATE_SQL = `
|
|
17
|
-
CREATE TABLE IF NOT EXISTS document_join_offers (
|
|
18
|
-
owner_agent_id TEXT NOT NULL,
|
|
19
|
-
document_id TEXT NOT NULL,
|
|
20
|
-
amendment_hash TEXT NOT NULL,
|
|
21
|
-
role TEXT NOT NULL,
|
|
22
|
-
inviter_agent_id TEXT NOT NULL,
|
|
23
|
-
invitee_agent_id TEXT NOT NULL,
|
|
24
|
-
received_bytes BLOB NOT NULL,
|
|
25
|
-
state TEXT NOT NULL,
|
|
26
|
-
reason TEXT,
|
|
27
|
-
answer_bytes BLOB,
|
|
28
|
-
created_at INTEGER NOT NULL,
|
|
29
|
-
decided_at INTEGER,
|
|
30
|
-
PRIMARY KEY (owner_agent_id, amendment_hash)
|
|
31
|
-
);
|
|
32
|
-
`;
|
|
33
|
-
export class DocumentJoinStore {
|
|
34
|
-
#db;
|
|
35
|
-
#logger;
|
|
36
|
-
constructor(db, logger) {
|
|
37
|
-
this.#db = db;
|
|
38
|
-
this.#logger = logger;
|
|
39
|
-
this.#db.exec(CREATE_SQL);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Record an ARRIVING offer under the invitee's key — already validated by the caller; a
|
|
43
|
-
* validation refusal is recorded as `refused` with its reason, never dropped. First arrival's
|
|
44
|
-
* bytes are the permanent record; a redelivery changes nothing.
|
|
45
|
-
*/
|
|
46
|
-
recordIncoming(ownerAgentId, wire, amendmentHash, verdict, nowMs) {
|
|
47
|
-
const offer = decodeDocumentJoinOffer(wire);
|
|
48
|
-
this.#db
|
|
49
|
-
.prepare(`INSERT INTO document_join_offers
|
|
50
|
-
(owner_agent_id, document_id, amendment_hash, role, inviter_agent_id, invitee_agent_id,
|
|
51
|
-
received_bytes, state, reason, created_at, decided_at)
|
|
52
|
-
VALUES (?, ?, ?, 'invitee', ?, ?, ?, ?, ?, ?, ?)
|
|
53
|
-
ON CONFLICT (owner_agent_id, amendment_hash) DO NOTHING`)
|
|
54
|
-
.run(ownerAgentId, offer.document_id, amendmentHash, offer.inviter_agent_id, offer.invitee_agent_id, Buffer.from(wire), verdict.state, verdict.state === "refused" ? verdict.reason : null, nowMs, verdict.state === "refused" ? nowMs : null);
|
|
55
|
-
// Read back — on a redelivery the INSERT did nothing and the operator's earlier decision
|
|
56
|
-
// stands; reporting our intended state would announce a decided offer as pending.
|
|
57
|
-
const stored = this.get(ownerAgentId, amendmentHash);
|
|
58
|
-
const state = stored?.state ?? verdict.state;
|
|
59
|
-
const reason = stored?.reason ?? (verdict.state === "refused" ? verdict.reason : undefined);
|
|
60
|
-
this.#logger.info("document.join.offer_recorded", {
|
|
61
|
-
documentId: offer.document_id,
|
|
62
|
-
amendmentHash,
|
|
63
|
-
state,
|
|
64
|
-
});
|
|
65
|
-
return { state, ...(reason ? { reason } : {}) };
|
|
66
|
-
}
|
|
67
|
-
/** Record an offer WE authored, pending the invitee's answer. */
|
|
68
|
-
recordOutgoing(ownerAgentId, wire, amendmentHash, nowMs) {
|
|
69
|
-
const offer = decodeDocumentJoinOffer(wire);
|
|
70
|
-
this.#db
|
|
71
|
-
.prepare(`INSERT INTO document_join_offers
|
|
72
|
-
(owner_agent_id, document_id, amendment_hash, role, inviter_agent_id, invitee_agent_id,
|
|
73
|
-
received_bytes, state, reason, created_at, decided_at)
|
|
74
|
-
VALUES (?, ?, ?, 'inviter', ?, ?, ?, 'pending', NULL, ?, NULL)
|
|
75
|
-
ON CONFLICT (owner_agent_id, amendment_hash) DO NOTHING`)
|
|
76
|
-
.run(ownerAgentId, offer.document_id, amendmentHash, offer.inviter_agent_id, offer.invitee_agent_id, Buffer.from(wire), nowMs);
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* The INVITEE's local decision. Settle-once: only a pending row decides, and the caller learns
|
|
80
|
-
* whether THIS call decided it — an already-decided offer is a fact to report, not an error.
|
|
81
|
-
*/
|
|
82
|
-
decide(ownerAgentId, amendmentHash, accepted, reason, nowMs) {
|
|
83
|
-
const r = this.#db
|
|
84
|
-
.prepare(`UPDATE document_join_offers
|
|
85
|
-
SET state = ?, reason = ?, decided_at = ?
|
|
86
|
-
WHERE owner_agent_id = ? AND amendment_hash = ? AND role = 'invitee' AND state = 'pending'`)
|
|
87
|
-
.run(accepted ? "accepted" : "refused", reason, nowMs, ownerAgentId, amendmentHash);
|
|
88
|
-
const stored = this.get(ownerAgentId, amendmentHash);
|
|
89
|
-
return { decided: (r.changes ?? 0) > 0, state: stored?.state ?? "pending" };
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Record the invitee's signed ANSWER on the inviter's side. The caller verifies the signature
|
|
93
|
-
* against the invitee named in the STORED offer first. Settle-once: a contradicting second
|
|
94
|
-
* answer is refused with both records retained (the stored answer stands).
|
|
95
|
-
*/
|
|
96
|
-
recordAnswer(ownerAgentId, wire, verify, nowMs) {
|
|
97
|
-
const answer = decodeDocumentJoinAnswer(wire);
|
|
98
|
-
const stored = this.get(ownerAgentId, answer.amendment_hash);
|
|
99
|
-
if (!stored || stored.role !== "inviter") {
|
|
100
|
-
return {
|
|
101
|
-
ok: false,
|
|
102
|
-
reason: `join_answer_unknown_offer: no offer of ours is settled by amendment ` +
|
|
103
|
-
`${answer.amendment_hash.slice(0, 16)}…`,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
if (answer.invitee_agent_id !== stored.inviteeAgentId) {
|
|
107
|
-
return {
|
|
108
|
-
ok: false,
|
|
109
|
-
reason: `join_answer_wrong_invitee: the answer names ${answer.invitee_agent_id} and the ` +
|
|
110
|
-
`offer invited ${stored.inviteeAgentId}`,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
if (!verify(stored.inviteeAgentId, buildDocumentJoinAnswerTbs(answer), answer.signature)) {
|
|
114
|
-
return {
|
|
115
|
-
ok: false,
|
|
116
|
-
reason: `join_answer_signature_invalid: the answer does not verify against the invitee ` +
|
|
117
|
-
`${stored.inviteeAgentId}`,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
if (stored.state !== "pending") {
|
|
121
|
-
const contradicts = (stored.state === "accepted") !== answer.accepted;
|
|
122
|
-
if (contradicts) {
|
|
123
|
-
this.#logger.error("document.join.answer_contradiction", {
|
|
124
|
-
documentId: stored.documentId,
|
|
125
|
-
amendmentHash: answer.amendment_hash,
|
|
126
|
-
stored: stored.state,
|
|
127
|
-
arriving: answer.accepted ? "accepted" : "refused",
|
|
128
|
-
});
|
|
129
|
-
return {
|
|
130
|
-
ok: false,
|
|
131
|
-
reason: "join_answer_contradiction: this offer was already settled with the opposite answer — " +
|
|
132
|
-
"settle once; both signed answers are retained in the log",
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
return { ok: true, answer, settled: false };
|
|
136
|
-
}
|
|
137
|
-
this.#db
|
|
138
|
-
.prepare(`UPDATE document_join_offers
|
|
139
|
-
SET state = ?, reason = ?, answer_bytes = ?, decided_at = ?
|
|
140
|
-
WHERE owner_agent_id = ? AND amendment_hash = ? AND state = 'pending'`)
|
|
141
|
-
.run(answer.accepted ? "accepted" : "refused", answer.refusal_reason, Buffer.from(wire), nowMs, ownerAgentId, answer.amendment_hash);
|
|
142
|
-
this.#logger.info("document.join.answer_recorded", {
|
|
143
|
-
documentId: stored.documentId,
|
|
144
|
-
amendmentHash: answer.amendment_hash,
|
|
145
|
-
accepted: answer.accepted,
|
|
146
|
-
});
|
|
147
|
-
return { ok: true, answer, settled: true };
|
|
148
|
-
}
|
|
149
|
-
get(ownerAgentId, amendmentHash) {
|
|
150
|
-
const r = this.#db
|
|
151
|
-
.prepare(`SELECT * FROM document_join_offers WHERE owner_agent_id = ? AND amendment_hash = ?`)
|
|
152
|
-
.get(ownerAgentId, amendmentHash);
|
|
153
|
-
return r ? rowToRecord(r) : null;
|
|
154
|
-
}
|
|
155
|
-
/** Auto-refused arrivals — surfaced so the refusal sentence reaches an operator. */
|
|
156
|
-
refusedFor(ownerAgentId) {
|
|
157
|
-
const rows = this.#db
|
|
158
|
-
.prepare(`SELECT * FROM document_join_offers
|
|
159
|
-
WHERE owner_agent_id = ? AND role = 'invitee' AND state = 'refused'
|
|
160
|
-
ORDER BY created_at ASC`)
|
|
161
|
-
.all(ownerAgentId);
|
|
162
|
-
return rows.map(rowToRecord);
|
|
163
|
-
}
|
|
164
|
-
/** Offers THIS owner authored — the inviter's view of who has answered what. */
|
|
165
|
-
outgoingFor(ownerAgentId) {
|
|
166
|
-
const rows = this.#db
|
|
167
|
-
.prepare(`SELECT * FROM document_join_offers
|
|
168
|
-
WHERE owner_agent_id = ? AND role = 'inviter'
|
|
169
|
-
ORDER BY created_at ASC`)
|
|
170
|
-
.all(ownerAgentId);
|
|
171
|
-
return rows.map(rowToRecord);
|
|
172
|
-
}
|
|
173
|
-
/** Offers awaiting THIS owner's consent — the inbox surface. */
|
|
174
|
-
pendingFor(ownerAgentId) {
|
|
175
|
-
const rows = this.#db
|
|
176
|
-
.prepare(`SELECT * FROM document_join_offers
|
|
177
|
-
WHERE owner_agent_id = ? AND role = 'invitee' AND state = 'pending'
|
|
178
|
-
ORDER BY created_at ASC`)
|
|
179
|
-
.all(ownerAgentId);
|
|
180
|
-
return rows.map(rowToRecord);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
function rowToRecord(r) {
|
|
184
|
-
return {
|
|
185
|
-
documentId: r["document_id"],
|
|
186
|
-
amendmentHash: r["amendment_hash"],
|
|
187
|
-
role: r["role"],
|
|
188
|
-
inviterAgentId: r["inviter_agent_id"],
|
|
189
|
-
inviteeAgentId: r["invitee_agent_id"],
|
|
190
|
-
offer: decodeDocumentJoinOffer(new Uint8Array(r["received_bytes"])),
|
|
191
|
-
state: r["state"],
|
|
192
|
-
reason: r["reason"] ?? null,
|
|
193
|
-
createdAtMs: r["created_at"],
|
|
194
|
-
decidedAtMs: r["decided_at"] ?? null,
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
//# sourceMappingURL=document-join-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"document-join-store.js","sourceRoot":"","sources":["../src/document-join-store.ts"],"names":[],"mappings":"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"}
|