@cello-protocol/daemon 0.0.230 → 0.0.231
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/channel-admin-lookup.d.ts +54 -0
- package/dist/channel-admin-lookup.d.ts.map +1 -0
- package/dist/channel-admin-lookup.js +122 -0
- package/dist/channel-admin-lookup.js.map +1 -0
- package/dist/channel-config-store.d.ts +3 -0
- package/dist/channel-config-store.d.ts.map +1 -1
- package/dist/channel-config-store.js +28 -5
- package/dist/channel-config-store.js.map +1 -1
- package/dist/channel-join-exchange.d.ts +87 -0
- package/dist/channel-join-exchange.d.ts.map +1 -0
- package/dist/channel-join-exchange.js +289 -0
- package/dist/channel-join-exchange.js.map +1 -0
- package/dist/channel-membership-store.d.ts +118 -0
- package/dist/channel-membership-store.d.ts.map +1 -0
- package/dist/channel-membership-store.js +226 -0
- package/dist/channel-membership-store.js.map +1 -0
- package/dist/channel-membership-wiring.d.ts +90 -0
- package/dist/channel-membership-wiring.d.ts.map +1 -0
- package/dist/channel-membership-wiring.js +387 -0
- package/dist/channel-membership-wiring.js.map +1 -0
- package/dist/channel-publish-wiring.d.ts +11 -0
- package/dist/channel-publish-wiring.d.ts.map +1 -1
- package/dist/channel-publish-wiring.js +21 -2
- package/dist/channel-publish-wiring.js.map +1 -1
- package/dist/channel-publisher.d.ts +34 -2
- package/dist/channel-publisher.d.ts.map +1 -1
- package/dist/channel-publisher.js +46 -10
- package/dist/channel-publisher.js.map +1 -1
- package/dist/channel-subscription-store.d.ts +71 -0
- package/dist/channel-subscription-store.d.ts.map +1 -1
- package/dist/channel-subscription-store.js +150 -9
- package/dist/channel-subscription-store.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +40 -0
- package/dist/daemon.js.map +1 -1
- package/dist/inbound-sessions.d.ts +6 -0
- package/dist/inbound-sessions.d.ts.map +1 -1
- package/dist/inbound-sessions.js +27 -1
- package/dist/inbound-sessions.js.map +1 -1
- package/dist/refusal-reasons.d.ts +7 -0
- package/dist/refusal-reasons.d.ts.map +1 -1
- package/dist/refusal-reasons.js +15 -0
- package/dist/refusal-reasons.js.map +1 -1
- package/dist/session-content-context.d.ts +8 -0
- package/dist/session-content-context.d.ts.map +1 -1
- package/dist/session-content-ingest.d.ts.map +1 -1
- package/dist/session-content-ingest.js +28 -0
- package/dist/session-content-ingest.js.map +1 -1
- package/dist/session-node-manager.d.ts +4 -0
- package/dist/session-node-manager.d.ts.map +1 -1
- package/dist/session-node-manager.js +11 -0
- package/dist/session-node-manager.js.map +1 -1
- package/package.json +5 -5
|
@@ -33,13 +33,22 @@ export class ChannelPublisher {
|
|
|
33
33
|
});
|
|
34
34
|
return { ok: false, reason: "blocked_by_screen", detail: verdict.reason ?? verdict.disposition };
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
/**
|
|
37
|
+
* 2. THE POSITION COMES FIRST, because the encryption binds it.
|
|
38
|
+
*
|
|
39
|
+
* ⚠️ The order's step list says encrypt then take the number, and that cannot be implemented:
|
|
40
|
+
* the body's associated data is (channel, seq, generation), so encrypting before the number
|
|
41
|
+
* exists means binding the wrong one — or not binding it, which is what lets a hostile relay
|
|
42
|
+
* serve post 7's body at position 3 with every signature still checking out. Taking the number
|
|
43
|
+
* first changes nothing else: the LOG is still written after signing and before any deposit,
|
|
44
|
+
* which is the part of that order that carries weight.
|
|
45
|
+
*/
|
|
41
46
|
log.ensureChannel(channelHex);
|
|
42
47
|
const { seq } = log.nextPosition(channelHex);
|
|
48
|
+
// 3. A public channel is readable by anyone, so encrypting it would be theatre — and would lock
|
|
49
|
+
// out the subscribers it exists for, who hold no key.
|
|
50
|
+
const plaintext = new TextEncoder().encode(body);
|
|
51
|
+
const wire = info.access === "public" ? plaintext : await this.#opts.encryptBody(plaintext, channelHex, seq);
|
|
43
52
|
let post;
|
|
44
53
|
try {
|
|
45
54
|
post = await signBroadcastArtifact(channelKey, agentKey, {
|
|
@@ -51,9 +60,33 @@ export class ChannelPublisher {
|
|
|
51
60
|
}
|
|
52
61
|
// 4. THE LOG, BEFORE THE NETWORK.
|
|
53
62
|
log.append(channelHex, post, correlationId);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
63
|
+
/**
|
|
64
|
+
* 5. Both relays, in parallel — a deposit is independent of the other, and making the second
|
|
65
|
+
* wait on the first would double the latency of the ordinary case for no gain.
|
|
66
|
+
*
|
|
67
|
+
* ⚠️ THE FETCH KEY RIDES ALONG. A public channel has none. For every other channel this is what
|
|
68
|
+
* makes an ejection bite AT THE RELAY rather than only at the ciphertext: until the relay holds
|
|
69
|
+
* the new generation's key, an ejected member can still pull the queue.
|
|
70
|
+
*/
|
|
71
|
+
const fetchKey = info.access === "public" ? undefined : await this.#opts.currentFetchKey?.(channelHex);
|
|
72
|
+
/**
|
|
73
|
+
* ⚠️ **A NON-PUBLIC CHANNEL WITH NO FETCH KEY REFUSES TO PUBLISH.** Depositing without one tells
|
|
74
|
+
* the relay nothing about who may read, so it serves the queue to ANY caller — an `access` of
|
|
75
|
+
* invite_only with a queue open to the world, which is worse than not publishing. The absent key
|
|
76
|
+
* means no group key has been minted (nobody has joined yet, or this daemon does not administer
|
|
77
|
+
* the channel), and both are states to name rather than paper over.
|
|
78
|
+
*/
|
|
79
|
+
if (info.access !== "public" && !fetchKey) {
|
|
80
|
+
logger.warn("channel.publish.refused", {
|
|
81
|
+
...(correlationId !== undefined ? { correlationId } : {}),
|
|
82
|
+
channel_pubkey: channelHex, reason: "no_fetch_key",
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
ok: false, reason: "key_unavailable", seq,
|
|
86
|
+
detail: "this channel has no group key yet, so the relays cannot be told who may read it; admit a member first",
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
let deposited = await Promise.all(info.relays.map((relay) => this.#depositOnce(relay, post, channelHex, correlationId, fetchKey)));
|
|
57
90
|
let ok = deposited.filter((d) => d.ok);
|
|
58
91
|
/**
|
|
59
92
|
* ⚠️ **THE CLOCK-SKEW CORRECTION IS ONE POST FOR ALL RELAYS, AND ONLY WHILE NONE HAS TAKEN IT.**
|
|
@@ -95,11 +128,14 @@ export class ChannelPublisher {
|
|
|
95
128
|
* are reported separately because folding them together turned a post that is safely on two relays
|
|
96
129
|
* into `no_relay_accepted`, and sent the operator to resend something already there.
|
|
97
130
|
*/
|
|
98
|
-
async #depositOnce(relay, post, channelHex, correlationId) {
|
|
131
|
+
async #depositOnce(relay, post, channelHex, correlationId, fetchKey) {
|
|
99
132
|
const { logger } = this.#opts;
|
|
100
133
|
let answer;
|
|
101
134
|
try {
|
|
102
|
-
answer = await this.#opts.deposit(relay, {
|
|
135
|
+
answer = await this.#opts.deposit(relay, {
|
|
136
|
+
post_cbor: encodeBroadcastArtifact(post),
|
|
137
|
+
...(fetchKey ? { fetch_key: fetchKey } : {}),
|
|
138
|
+
});
|
|
103
139
|
}
|
|
104
140
|
catch (err) {
|
|
105
141
|
logger.warn("channel.post.deposit_failed", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-publisher.js","sourceRoot":"","sources":["../src/channel-publisher.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"channel-publisher.js","sourceRoot":"","sources":["../src/channel-publisher.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GAGrB,MAAM,gCAAgC,CAAC;AAwCxC;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAiEzC,MAAM,OAAO,gBAAgB;IAClB,KAAK,CAA0B;IAC/B,IAAI,CAAe;IAE5B,YAAY,IAA6B;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,UAAkB,EAAE,KAAa,EAAE,IAAY,EAAE,aAAsB;QACtG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;QAEtG,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC;QAC5G,CAAC;QAED,wFAAwF;QACxF,0FAA0F;QAC1F,oDAAoD;QACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAC7C,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,IAAI,EAAE,CAAC,EAC7C,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACzE,CAAC;QACF,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS;aAClG,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACnG,CAAC;QAED;;;;;;;;;WASG;QACH,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAE7C,gGAAgG;QAChG,yDAAyD;QACzD,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC7G,IAAI,IAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,qBAAqB,CAAC,UAAU,EAAE,QAAQ,EAAE;gBACvD,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;aAC/E,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,CAAC;QAED,kCAAkC;QAClC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QAE5C;;;;;;;WAOG;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,CAAC;QACvG;;;;;;WAMG;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc;aACnD,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG;gBACzC,MAAM,EAAE,uGAAuG;aAChH,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnI,IAAI,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvC;;;;;;;;;WASG;QACH,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,EAAE,CAAC;YACxE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;YACnG,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,GAAG,SAAS,CAAC;gBACjB,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;gBACrH,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;YACpC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,cAAc,EAAE,UAAU;YAC1B,GAAG;YACH,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YACjC,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;SAClE,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,4FAA4F;YAC5F,sDAAsD;YACtD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAChB,KAAa,EAAE,IAAuB,EAAE,UAAkB,EAAE,aAAsB,EAClF,QAAyE;QAEzE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9B,IAAI,MAA6C,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE;gBACvC,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACzC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;aACvE,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,CAAC;QAED,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;YAC9F,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7F,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACzC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM;SACxE,CAAC,CAAC;QACH,OAAO;YACL,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM;YACvC,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,cAAc,CAClB,SAAiB,EAAE,UAAkB,EAAE,IAAuB,EAC9D,SAA2B,EAAE,aAAsB;QAEnD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACxD,8FAA8F;QAC9F,4FAA4F;QAC5F,gCAAgC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBACxC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB;aACrE,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QACnD,IAAI,QAA2B,CAAC;QAChC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,qBAAqB,CAAC,UAAU,EAAE,QAAQ,EAAE;gBAC3D,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACzD,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI;aACxD,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBACxC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;aAChE,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,oGAAoG;IACpG,aAAa,CAAC,UAAkB,EAAE,IAAuB,EAAE,WAAuB,EAAE,KAAa,EAAE,aAAsB;QACvH,MAAM,OAAO,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACpD,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB;aAC5E,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YACzE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,0FAA0F;YAC1F,yFAAyF;YACzF,uCAAuC;YACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;gBACrD,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;aACvE,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,UAAkB,EAAE,KAAa,EAAE,aAAsB;QAC9F,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,8FAA8F;QAC9F,iGAAiG;QACjG,2FAA2F;QAC3F,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QAE/E;;;;;;;;;;;;;;WAcG;QACH,IAAI,KAAK,GAA2C,IAAI,CAAC;QACzD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC/D,IAAI,QAAQ,CAAC,cAAc,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACnE,KAAK,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtE,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;oBAC7C,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;oBACvD,MAAM,EAAE,gEAAgE;iBACzE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,+FAA+F;QAC/F,0CAA0C;QAC1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5E,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI;gBAAE,SAAS;YAClF,0FAA0F;YAC1F,6FAA6F;YAC7F,4FAA4F;YAC5F,4CAA4C;YAC5C,IAAI,SAAS,GAAG,CAAC;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,sBAAsB,CAAC,CAAC;YACxF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YAChF,IAAI,OAAO,CAAC,EAAE;gBAAE,SAAS,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACtC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,8FAA8F;YAC9F,uFAAuF;YACvF,KAAK,EAAE,SAAS;YAChB,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS;SAC7C,CAAC,CAAC;QACH,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,UAAkB,EAAE,UAAkB,EAAE,aAAsB;QAGlG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9B,iGAAiG;QACjG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;QAElC;;;;WAIG;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,UAAU;YAC1B,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YACjG,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC5D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC5C,sFAAsF;gBACtF,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;YAC1G,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC5F,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;wBACzC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzD,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM;qBAClF,CAAC,CAAC;oBACH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;gBACrD,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;oBAC7C,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzD,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;iBACjF,CAAC,CAAC;gBACH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;QAEJ,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAChC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,KAAK,EAAE,SAAS;YAChB,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM;YAC3D,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/D,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;SACxE,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACtC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,UAAkB,EAAE,aAAsB;QAI7E,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC3D,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE;YAC/C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,MAAM,QAAQ,CAAC,YAAY,EAAE;YAC3C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;YACvB,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACjE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,MAAM,CAAC,EAAE;oBAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACzC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,cAAc,EAAE,UAAU;gBAC1B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC;aACpD,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpI,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;YACpC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;YAC/C,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YACnC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;SACjE,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IAED,mGAAmG;IACnG,SAAS,CAAC,UAAkB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,6FAA6F;IAC7F,MAAM,CAAC,EAAU;QACf,IAAI,EAAE,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;CACF;AAED,SAAS,OAAO,CAAC,GAAY;IAC3B,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,MAAM,CAAC,GAAI,GAAoC,EAAE,OAAO,CAAC;IACzD,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -26,12 +26,29 @@ import type { DaemonDatabase } from "./sqlcipher-db.js";
|
|
|
26
26
|
import type { Logger } from "./types.js";
|
|
27
27
|
import type { ChannelAccess } from "@cello-protocol/protocol-types";
|
|
28
28
|
export declare const CHANNEL_SUBSCRIPTION_CREATE_SQL = "\n CREATE TABLE IF NOT EXISTS channel_subscriptions (\n agent_id TEXT NOT NULL,\n channel_pubkey TEXT NOT NULL,\n admin_pubkey TEXT NOT NULL,\n access TEXT NOT NULL,\n guidance TEXT NOT NULL DEFAULT '',\n retention_seconds INTEGER NOT NULL DEFAULT 604800,\n -- JSON array of multiaddrs: the relays this channel publishes to, in the order the info record\n -- gave them. A column per relay would fix the count at two, and the count is the publisher's.\n relays TEXT NOT NULL DEFAULT '[]',\n moniker TEXT NOT NULL DEFAULT '',\n delivered_through INTEGER NOT NULL DEFAULT 0,\n processed_through INTEGER NOT NULL DEFAULT 0,\n joined_at INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'active',\n PRIMARY KEY (agent_id, channel_pubkey)\n );\n";
|
|
29
|
+
/**
|
|
30
|
+
* The group keys a subscriber holds, one row per generation.
|
|
31
|
+
*
|
|
32
|
+
* ⚠️ **A SEPARATE TABLE BECAUSE THERE ARE MANY PER SUBSCRIPTION, and every one is kept.** A re-key
|
|
33
|
+
* does not make old posts unreadable — they are still in the relay's queue under the old key — so a
|
|
34
|
+
* single `key` column on the subscription would make the channel's own history undecryptable to its
|
|
35
|
+
* own members the moment anyone was ejected.
|
|
36
|
+
*
|
|
37
|
+
* The key bytes live only here, inside the SQLCipher database, and are never logged.
|
|
38
|
+
*/
|
|
39
|
+
export declare const CHANNEL_SUBSCRIPTION_KEYS_CREATE_SQL = "\n CREATE TABLE IF NOT EXISTS channel_subscription_keys (\n agent_id TEXT NOT NULL,\n channel_pubkey TEXT NOT NULL,\n generation INTEGER NOT NULL,\n key BLOB NOT NULL,\n received_at INTEGER NOT NULL,\n PRIMARY KEY (agent_id, channel_pubkey, generation)\n );\n";
|
|
29
40
|
export interface ChannelSubscription {
|
|
30
41
|
agent_id: string;
|
|
31
42
|
channel_pubkey: string;
|
|
32
43
|
admin_pubkey: string;
|
|
33
44
|
access: ChannelAccess;
|
|
34
45
|
relays: string[];
|
|
46
|
+
/** A local display label. The pubkey is the identity; this is what an operator calls it. */
|
|
47
|
+
moniker: string;
|
|
48
|
+
/** What the channel is for, in the publisher's words — and how long its posts last. Both arrive
|
|
49
|
+
* on the acceptance and have no other source, so a subscriber that drops them cannot recover them. */
|
|
50
|
+
guidance: string;
|
|
51
|
+
retention_seconds: number;
|
|
35
52
|
delivered_through: number;
|
|
36
53
|
processed_through: number;
|
|
37
54
|
status: "active" | "left" | "ejected";
|
|
@@ -52,6 +69,8 @@ export declare class ChannelSubscriptionStore {
|
|
|
52
69
|
access: ChannelAccess;
|
|
53
70
|
relays: string[];
|
|
54
71
|
joined_at?: number;
|
|
72
|
+
guidance?: string;
|
|
73
|
+
retention_seconds?: number;
|
|
55
74
|
}): void;
|
|
56
75
|
get(agentId: string, channelPubkeyHex: string): ChannelSubscription | null;
|
|
57
76
|
/** Every channel this daemon should be collecting for. `left` and `ejected` are not collected. */
|
|
@@ -62,5 +81,57 @@ export declare class ChannelSubscriptionStore {
|
|
|
62
81
|
* and re-delivering posts its agent has already been shown.
|
|
63
82
|
*/
|
|
64
83
|
setDeliveredThrough(agentId: string, channelPubkeyHex: string, seq: number): void;
|
|
84
|
+
/**
|
|
85
|
+
* Move the AGENT's position — how far it has actually READ.
|
|
86
|
+
*
|
|
87
|
+
* ⚠️ **A LOWER VALUE THROWS RATHER THAN BEING IGNORED.** Silently refusing would leave a caller
|
|
88
|
+
* that computed a wrong position believing it had been applied, and this number is not
|
|
89
|
+
* recoverable from anywhere else: moving it back re-delivers messages the operator already saw,
|
|
90
|
+
* and moving it forward by mistake skips messages they never did. Equal is a no-op, not an error.
|
|
91
|
+
*/
|
|
92
|
+
advanceProcessed(agentId: string, channelPubkeyHex: string, seq: number): void;
|
|
93
|
+
/**
|
|
94
|
+
* Store a group key for one generation.
|
|
95
|
+
*
|
|
96
|
+
* ⚠️ **IDEMPOTENT, because a re-key can be delivered twice** — the admin retries an undelivered
|
|
97
|
+
* one, and a member that already has it must not end up with two rows or a replaced key.
|
|
98
|
+
*/
|
|
99
|
+
addKey(agentId: string, channelPubkeyHex: string, gk: {
|
|
100
|
+
generation: number;
|
|
101
|
+
key: Uint8Array;
|
|
102
|
+
}, receivedAt: number): void;
|
|
103
|
+
/**
|
|
104
|
+
* Every group key this subscriber holds, newest generation first.
|
|
105
|
+
*
|
|
106
|
+
* ⚠️ **OLD GENERATIONS ARE NEVER DELETED.** A re-key does not make yesterday's posts unreadable —
|
|
107
|
+
* they are still encrypted under the old key and still in the relay's queue — so dropping it
|
|
108
|
+
* would turn the channel's own history into `unknown_generation` for its own members.
|
|
109
|
+
*/
|
|
110
|
+
keysFor(agentId: string, channelPubkeyHex: string): Array<{
|
|
111
|
+
generation: number;
|
|
112
|
+
key: Uint8Array;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* The subscriber's OWN decision to stop following. Purely local: nothing is sent, nothing is asked
|
|
116
|
+
* of the publisher, and `active()` stops returning it so the collector stops fetching.
|
|
117
|
+
*/
|
|
118
|
+
markLeft(agentId: string, channelPubkeyHex: string): void;
|
|
119
|
+
/**
|
|
120
|
+
* The PUBLISHER's decision. Distinct from `left` on purpose: one the subscriber chose and can undo
|
|
121
|
+
* by rejoining, the other they cannot, and an operator asking why a channel went quiet needs to
|
|
122
|
+
* see which of the two happened.
|
|
123
|
+
*/
|
|
124
|
+
markEjected(agentId: string, channelPubkeyHex: string): void;
|
|
125
|
+
/** A local display label. The pubkey is the identity and naming it changes nothing. */
|
|
126
|
+
setMoniker(agentId: string, channelPubkeyHex: string, moniker: string): void;
|
|
127
|
+
/**
|
|
128
|
+
* Is this pubkey a channel this agent subscribes to?
|
|
129
|
+
*
|
|
130
|
+
* ⚠️ **TRUE FOR `left` AND `ejected` TOO, and that is deliberate.** The one caller is the
|
|
131
|
+
* inbound-session gate: a channel never opens a session, so one arriving from a pubkey we know to
|
|
132
|
+
* be a channel is worth refusing on. Unsubscribing does not stop it being a channel, and
|
|
133
|
+
* answering false here would reopen the hole the moment somebody left.
|
|
134
|
+
*/
|
|
135
|
+
isSubscribedChannel(agentId: string, pubkeyHex: string): boolean;
|
|
65
136
|
}
|
|
66
137
|
//# sourceMappingURL=channel-subscription-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-subscription-store.d.ts","sourceRoot":"","sources":["../src/channel-subscription-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,eAAO,MAAM,+BAA+B,i5BAkB3C,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,4BAA4B,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAE1F,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;gBAChC,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,MAAM;CAKhE;
|
|
1
|
+
{"version":3,"file":"channel-subscription-store.d.ts","sourceRoot":"","sources":["../src/channel-subscription-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,26 @@ export const CHANNEL_SUBSCRIPTION_CREATE_SQL = `
|
|
|
17
17
|
PRIMARY KEY (agent_id, channel_pubkey)
|
|
18
18
|
);
|
|
19
19
|
`;
|
|
20
|
+
/**
|
|
21
|
+
* The group keys a subscriber holds, one row per generation.
|
|
22
|
+
*
|
|
23
|
+
* ⚠️ **A SEPARATE TABLE BECAUSE THERE ARE MANY PER SUBSCRIPTION, and every one is kept.** A re-key
|
|
24
|
+
* does not make old posts unreadable — they are still in the relay's queue under the old key — so a
|
|
25
|
+
* single `key` column on the subscription would make the channel's own history undecryptable to its
|
|
26
|
+
* own members the moment anyone was ejected.
|
|
27
|
+
*
|
|
28
|
+
* The key bytes live only here, inside the SQLCipher database, and are never logged.
|
|
29
|
+
*/
|
|
30
|
+
export const CHANNEL_SUBSCRIPTION_KEYS_CREATE_SQL = `
|
|
31
|
+
CREATE TABLE IF NOT EXISTS channel_subscription_keys (
|
|
32
|
+
agent_id TEXT NOT NULL,
|
|
33
|
+
channel_pubkey TEXT NOT NULL,
|
|
34
|
+
generation INTEGER NOT NULL,
|
|
35
|
+
key BLOB NOT NULL,
|
|
36
|
+
received_at INTEGER NOT NULL,
|
|
37
|
+
PRIMARY KEY (agent_id, channel_pubkey, generation)
|
|
38
|
+
);
|
|
39
|
+
`;
|
|
20
40
|
export class ChannelSubscriptionError extends Error {
|
|
21
41
|
code;
|
|
22
42
|
constructor(code, message) {
|
|
@@ -32,22 +52,39 @@ export class ChannelSubscriptionStore {
|
|
|
32
52
|
this.#db = db;
|
|
33
53
|
this.#logger = logger;
|
|
34
54
|
this.#db.exec(CHANNEL_SUBSCRIPTION_CREATE_SQL);
|
|
55
|
+
this.#db.exec(CHANNEL_SUBSCRIPTION_KEYS_CREATE_SQL);
|
|
35
56
|
}
|
|
36
57
|
/** Record (or refresh) a subscription. 019's join calls this; 018's tests use it directly. */
|
|
37
58
|
upsert(sub) {
|
|
38
59
|
this.#db
|
|
39
|
-
.prepare(
|
|
40
|
-
|
|
41
|
-
|
|
60
|
+
.prepare(
|
|
61
|
+
/**
|
|
62
|
+
* ⚠️ TWO THINGS THIS USED TO GET WRONG, both silent.
|
|
63
|
+
*
|
|
64
|
+
* `guidance` and `retention_seconds` arrive on the acceptance frame, are validated, and were
|
|
65
|
+
* then DROPPED — the columns existed and nothing ever wrote them. The order says to store
|
|
66
|
+
* them; a subscriber that does not has no idea what the channel is for or how long its posts
|
|
67
|
+
* last.
|
|
68
|
+
*
|
|
69
|
+
* And `status` was not in the update list, so a subscriber who LEFT and later rejoined got a
|
|
70
|
+
* fresh key, an `ok`, and a row still marked `left`. `active()` excludes it, so the collector
|
|
71
|
+
* never fetched: a channel they had just rejoined that produced nothing, for ever.
|
|
72
|
+
*/
|
|
73
|
+
`INSERT INTO channel_subscriptions
|
|
74
|
+
(agent_id, channel_pubkey, admin_pubkey, access, relays, guidance, retention_seconds, joined_at, status)
|
|
75
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'active')
|
|
42
76
|
ON CONFLICT (agent_id, channel_pubkey) DO UPDATE SET
|
|
43
|
-
admin_pubkey
|
|
44
|
-
access
|
|
45
|
-
relays
|
|
46
|
-
|
|
77
|
+
admin_pubkey = excluded.admin_pubkey,
|
|
78
|
+
access = excluded.access,
|
|
79
|
+
relays = excluded.relays,
|
|
80
|
+
guidance = excluded.guidance,
|
|
81
|
+
retention_seconds = excluded.retention_seconds,
|
|
82
|
+
status = 'active'`)
|
|
83
|
+
.run(sub.agent_id, sub.channel_pubkey.toLowerCase(), sub.admin_pubkey.toLowerCase(), sub.access, JSON.stringify(sub.relays), sub.guidance ?? "", sub.retention_seconds ?? 7 * 24 * 60 * 60, sub.joined_at ?? Date.now());
|
|
47
84
|
}
|
|
48
85
|
get(agentId, channelPubkeyHex) {
|
|
49
86
|
const row = this.#db
|
|
50
|
-
.prepare(`SELECT agent_id, channel_pubkey, admin_pubkey, access, relays, delivered_through, processed_through, status
|
|
87
|
+
.prepare(`SELECT agent_id, channel_pubkey, admin_pubkey, access, relays, moniker, guidance, retention_seconds, delivered_through, processed_through, status
|
|
51
88
|
FROM channel_subscriptions WHERE agent_id = ? AND channel_pubkey = ?`)
|
|
52
89
|
.get(agentId, channelPubkeyHex.toLowerCase());
|
|
53
90
|
return row ? this.#toSubscription(row) : null;
|
|
@@ -55,7 +92,7 @@ export class ChannelSubscriptionStore {
|
|
|
55
92
|
/** Every channel this daemon should be collecting for. `left` and `ejected` are not collected. */
|
|
56
93
|
active() {
|
|
57
94
|
const rows = this.#db
|
|
58
|
-
.prepare(`SELECT agent_id, channel_pubkey, admin_pubkey, access, relays, delivered_through, processed_through, status
|
|
95
|
+
.prepare(`SELECT agent_id, channel_pubkey, admin_pubkey, access, relays, moniker, guidance, retention_seconds, delivered_through, processed_through, status
|
|
59
96
|
FROM channel_subscriptions WHERE status = 'active' ORDER BY channel_pubkey ASC, agent_id ASC`)
|
|
60
97
|
.all();
|
|
61
98
|
return rows.map((r) => this.#toSubscription(r));
|
|
@@ -82,6 +119,107 @@ export class ChannelSubscriptionStore {
|
|
|
82
119
|
agent_id: agentId, channel_pubkey: channelPubkeyHex, delivered_through: seq,
|
|
83
120
|
});
|
|
84
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Move the AGENT's position — how far it has actually READ.
|
|
124
|
+
*
|
|
125
|
+
* ⚠️ **A LOWER VALUE THROWS RATHER THAN BEING IGNORED.** Silently refusing would leave a caller
|
|
126
|
+
* that computed a wrong position believing it had been applied, and this number is not
|
|
127
|
+
* recoverable from anywhere else: moving it back re-delivers messages the operator already saw,
|
|
128
|
+
* and moving it forward by mistake skips messages they never did. Equal is a no-op, not an error.
|
|
129
|
+
*/
|
|
130
|
+
advanceProcessed(agentId, channelPubkeyHex, seq) {
|
|
131
|
+
const current = this.get(agentId, channelPubkeyHex);
|
|
132
|
+
if (!current) {
|
|
133
|
+
throw new ChannelSubscriptionError("subscription_unknown", `no subscription for ${channelPubkeyHex.slice(0, 16)}`);
|
|
134
|
+
}
|
|
135
|
+
if (seq < current.processed_through) {
|
|
136
|
+
throw new ChannelSubscriptionError("position_regression", `processed_through is ${String(current.processed_through)}; refusing to move it back to ${String(seq)}`);
|
|
137
|
+
}
|
|
138
|
+
if (seq === current.processed_through)
|
|
139
|
+
return;
|
|
140
|
+
// ⚠️ TOUCHES ONE COLUMN. A read must never move `delivered_through`, or the collector's next
|
|
141
|
+
// pass would start past posts it has not fetched and they would never arrive.
|
|
142
|
+
this.#db
|
|
143
|
+
.prepare(`UPDATE channel_subscriptions SET processed_through = ? WHERE agent_id = ? AND channel_pubkey = ?`)
|
|
144
|
+
.run(seq, agentId, channelPubkeyHex.toLowerCase());
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Store a group key for one generation.
|
|
148
|
+
*
|
|
149
|
+
* ⚠️ **IDEMPOTENT, because a re-key can be delivered twice** — the admin retries an undelivered
|
|
150
|
+
* one, and a member that already has it must not end up with two rows or a replaced key.
|
|
151
|
+
*/
|
|
152
|
+
addKey(agentId, channelPubkeyHex, gk, receivedAt) {
|
|
153
|
+
this.#db
|
|
154
|
+
.prepare(`INSERT INTO channel_subscription_keys (agent_id, channel_pubkey, generation, key, received_at)
|
|
155
|
+
VALUES (?, ?, ?, ?, ?)
|
|
156
|
+
ON CONFLICT (agent_id, channel_pubkey, generation) DO NOTHING`)
|
|
157
|
+
.run(agentId, channelPubkeyHex.toLowerCase(), gk.generation, Buffer.from(gk.key), receivedAt);
|
|
158
|
+
// The GENERATION may be logged; the key may not, ever.
|
|
159
|
+
this.#logger.info("channel.key.stored", {
|
|
160
|
+
agent_id: agentId, channel_pubkey: channelPubkeyHex, generation: gk.generation,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Every group key this subscriber holds, newest generation first.
|
|
165
|
+
*
|
|
166
|
+
* ⚠️ **OLD GENERATIONS ARE NEVER DELETED.** A re-key does not make yesterday's posts unreadable —
|
|
167
|
+
* they are still encrypted under the old key and still in the relay's queue — so dropping it
|
|
168
|
+
* would turn the channel's own history into `unknown_generation` for its own members.
|
|
169
|
+
*/
|
|
170
|
+
keysFor(agentId, channelPubkeyHex) {
|
|
171
|
+
const rows = this.#db
|
|
172
|
+
.prepare(`SELECT generation, key FROM channel_subscription_keys
|
|
173
|
+
WHERE agent_id = ? AND channel_pubkey = ? ORDER BY generation DESC`)
|
|
174
|
+
.all(agentId, channelPubkeyHex.toLowerCase());
|
|
175
|
+
return rows.map((r) => ({ generation: Number(r.generation), key: new Uint8Array(r.key) }));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The subscriber's OWN decision to stop following. Purely local: nothing is sent, nothing is asked
|
|
179
|
+
* of the publisher, and `active()` stops returning it so the collector stops fetching.
|
|
180
|
+
*/
|
|
181
|
+
markLeft(agentId, channelPubkeyHex) {
|
|
182
|
+
this.#setStatus(agentId, channelPubkeyHex, "left");
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* The PUBLISHER's decision. Distinct from `left` on purpose: one the subscriber chose and can undo
|
|
186
|
+
* by rejoining, the other they cannot, and an operator asking why a channel went quiet needs to
|
|
187
|
+
* see which of the two happened.
|
|
188
|
+
*/
|
|
189
|
+
markEjected(agentId, channelPubkeyHex) {
|
|
190
|
+
this.#setStatus(agentId, channelPubkeyHex, "ejected");
|
|
191
|
+
}
|
|
192
|
+
#setStatus(agentId, channelPubkeyHex, status) {
|
|
193
|
+
const changed = this.#db
|
|
194
|
+
.prepare(`UPDATE channel_subscriptions SET status = ? WHERE agent_id = ? AND channel_pubkey = ?`)
|
|
195
|
+
.run(status, agentId, channelPubkeyHex.toLowerCase());
|
|
196
|
+
if (Number(changed.changes) === 0) {
|
|
197
|
+
throw new ChannelSubscriptionError("subscription_unknown", `no subscription for ${channelPubkeyHex.slice(0, 16)}`);
|
|
198
|
+
}
|
|
199
|
+
this.#logger.info("channel.subscription.status_changed", {
|
|
200
|
+
agent_id: agentId, channel_pubkey: channelPubkeyHex, status,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/** A local display label. The pubkey is the identity and naming it changes nothing. */
|
|
204
|
+
setMoniker(agentId, channelPubkeyHex, moniker) {
|
|
205
|
+
this.#db
|
|
206
|
+
.prepare(`UPDATE channel_subscriptions SET moniker = ? WHERE agent_id = ? AND channel_pubkey = ?`)
|
|
207
|
+
.run(moniker, agentId, channelPubkeyHex.toLowerCase());
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Is this pubkey a channel this agent subscribes to?
|
|
211
|
+
*
|
|
212
|
+
* ⚠️ **TRUE FOR `left` AND `ejected` TOO, and that is deliberate.** The one caller is the
|
|
213
|
+
* inbound-session gate: a channel never opens a session, so one arriving from a pubkey we know to
|
|
214
|
+
* be a channel is worth refusing on. Unsubscribing does not stop it being a channel, and
|
|
215
|
+
* answering false here would reopen the hole the moment somebody left.
|
|
216
|
+
*/
|
|
217
|
+
isSubscribedChannel(agentId, pubkeyHex) {
|
|
218
|
+
const row = this.#db
|
|
219
|
+
.prepare(`SELECT 1 AS hit FROM channel_subscriptions WHERE agent_id = ? AND channel_pubkey = ?`)
|
|
220
|
+
.get(agentId, pubkeyHex.toLowerCase());
|
|
221
|
+
return row !== undefined;
|
|
222
|
+
}
|
|
85
223
|
#toSubscription(row) {
|
|
86
224
|
let relays = [];
|
|
87
225
|
try {
|
|
@@ -100,6 +238,9 @@ export class ChannelSubscriptionStore {
|
|
|
100
238
|
admin_pubkey: row.admin_pubkey,
|
|
101
239
|
access: row.access,
|
|
102
240
|
relays,
|
|
241
|
+
moniker: row.moniker,
|
|
242
|
+
guidance: row.guidance,
|
|
243
|
+
retention_seconds: Number(row.retention_seconds),
|
|
103
244
|
delivered_through: Number(row.delivered_through),
|
|
104
245
|
processed_through: Number(row.processed_through),
|
|
105
246
|
status: row.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-subscription-store.js","sourceRoot":"","sources":["../src/channel-subscription-store.ts"],"names":[],"mappings":"AA4BA,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;CAkB9C,CAAC;
|
|
1
|
+
{"version":3,"file":"channel-subscription-store.js","sourceRoot":"","sources":["../src/channel-subscription-store.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EACV,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EACV,YAAY,EACb,MAAM,YAAY,CAAC;AAkFpB,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAKzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAS7E"}
|
package/dist/daemon.js
CHANGED
|
@@ -43,6 +43,9 @@ import { registerTestHandlers } from "./test-handlers.js";
|
|
|
43
43
|
import { registerAgentAdminHandlers } from "./agent-admin-handlers.js";
|
|
44
44
|
// M16 018-PUBCOLLECT — the channel publishing half.
|
|
45
45
|
import { wireChannelPublishing } from "./channel-publish-wiring.js";
|
|
46
|
+
import { ChannelSubscriptionStore } from "./channel-subscription-store.js";
|
|
47
|
+
import { wireChannelMembership } from "./channel-membership-wiring.js";
|
|
48
|
+
import { LEAF_KIND_MSG } from "./session-relay-client.js";
|
|
46
49
|
import { registerStatusHandler } from "./status-handler.js";
|
|
47
50
|
import { registerBackupRestoreHandlers } from "./backup-restore-handlers.js";
|
|
48
51
|
import { wireDocumentGate } from "./document-gate-wiring.js";
|
|
@@ -400,6 +403,16 @@ async function startDaemonHoldingLock(config, singletonLock) {
|
|
|
400
403
|
dispatchSessionStateChangedWithTelegram,
|
|
401
404
|
sendTelegramDoorbell,
|
|
402
405
|
isDeliveryOpenToAgent, isChannelAgent: channelAgentLookup(sessionNodeManager, logger), // M16
|
|
406
|
+
// M16 019: the mirror — a session FROM a channel this agent subscribes to. Constructed per call
|
|
407
|
+
// rather than held, so a channel joined after boot is recognised without a restart.
|
|
408
|
+
/**
|
|
409
|
+
* ⚠️ **`resolveAgentId`, NOT THE NAME.** The store queries `agent_id`; the inbound path hands
|
|
410
|
+
* over `localAgent.name`. Passing the name matched no row, a missing row reads as "not a
|
|
411
|
+
* channel", and "not a channel" is ALLOW — so the refusal never fired and nothing said so. Test
|
|
412
|
+
* 21 could not see it because the harness replaced this lookup with a name-keyed stub.
|
|
413
|
+
*/
|
|
414
|
+
isSubscribedChannel: (agentName, counterpartyPubkeyHex) => new ChannelSubscriptionStore(sessionNodeManager.getDb(), logger)
|
|
415
|
+
.isSubscribedChannel(sessionNodeManager.resolveAgentId(agentName), counterpartyPubkeyHex),
|
|
403
416
|
});
|
|
404
417
|
if (!sharedSignaling) {
|
|
405
418
|
for (const agent of loadedAgents) {
|
|
@@ -508,6 +521,30 @@ async function startDaemonHoldingLock(config, singletonLock) {
|
|
|
508
521
|
});
|
|
509
522
|
// M16 018-PUBCOLLECT: the channel publishing verbs, their log, their relay client and the
|
|
510
523
|
// per-channel publisher → channel-publish-wiring.ts. What stays here is the wiring.
|
|
524
|
+
// M16 019-MEMBERSHIP: joining, the group key, the eject re-key and the operator's channel verbs
|
|
525
|
+
// → channel-membership-wiring.ts. What stays here is the wiring.
|
|
526
|
+
const channelMembership = wireChannelMembership({
|
|
527
|
+
handlers, logger,
|
|
528
|
+
getDb: () => sessionNodeManager.getDb(),
|
|
529
|
+
sendInSession: async (agentName, sessionId, content) => {
|
|
530
|
+
// The hash comes from the SESSION, because a salted session hashes differently — computing it
|
|
531
|
+
// here would produce a leaf the counterparty's chain cannot match. Leaf kind `msg`: a join
|
|
532
|
+
// frame is not conversation, but a leaf kind is what a VERIFIER renders a leaf by, and a
|
|
533
|
+
// third kind would make every existing verifier unable to read a transcript carrying a join.
|
|
534
|
+
const { hash, alg } = await sessionNodeManager.contentHashForSession(agentName, sessionId, content);
|
|
535
|
+
await sessionNodeManager.sendContent(agentName, sessionId, content, new Uint8Array(hash), undefined, LEAF_KIND_MSG, alg);
|
|
536
|
+
},
|
|
537
|
+
setOnChannelJoinFrame: (cb) => { sessionNodeManager.setOnChannelJoinFrame(cb); },
|
|
538
|
+
loadedAgents, keyProviders,
|
|
539
|
+
resolveAgentId: (agentName) => sessionNodeManager.resolveAgentId(agentName),
|
|
540
|
+
resolveCurrentAgent: (connectionId, explicitAgent) => resolveCurrentAgent(perConnectionState.get(connectionId), explicitAgent),
|
|
541
|
+
activeSessionsFor: (agentName) => sessionNodeManager.getSessionsForAgent(agentName)
|
|
542
|
+
.filter((s) => s.status === "active")
|
|
543
|
+
.map((s) => ({ sessionId: s.session_id, counterpartyPubkeyHex: s.counterparty_pubkey })),
|
|
544
|
+
// M16 020-CHANADMIN: the subscriber asks the directory who administers a channel, on its own
|
|
545
|
+
// authenticated stream. No stream means the join is refused, not accepted.
|
|
546
|
+
signalingFor: (agentName) => signalingFor(agentName) ?? null,
|
|
547
|
+
});
|
|
511
548
|
const channelWiring = wireChannelPublishing({
|
|
512
549
|
handlers, logger,
|
|
513
550
|
getDb: () => sessionNodeManager.getDb(),
|
|
@@ -516,6 +553,9 @@ async function startDaemonHoldingLock(config, singletonLock) {
|
|
|
516
553
|
loadedAgents, keyProviders,
|
|
517
554
|
resolveCurrentAgent: (connectionId, explicitAgent) => resolveCurrentAgent(perConnectionState.get(connectionId), explicitAgent),
|
|
518
555
|
isAgentOnline: (agentId) => onlineAgents.has(agentId) && !explicitlyOfflineAgents.has(agentId),
|
|
556
|
+
// From the membership half, which owns the group key. This is what carries a re-key to the
|
|
557
|
+
// relays on the next post, and so what makes an ejection lock a member out AT the relay.
|
|
558
|
+
currentFetchKey: channelMembership.currentFetchKey,
|
|
519
559
|
});
|
|
520
560
|
// ─── Trust-signal wallet (operator-facing, no agent scope required) ───
|
|
521
561
|
// 040-DAEMONROOT unit 1: the trust-signal, attestation and consent handlers moved to
|