@onlyne/lib 3.0.0 → 3.2.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.
- package/README.md +6 -3
- package/dist/awaited.d.ts +43 -0
- package/dist/awaited.d.ts.map +1 -0
- package/dist/awaited.js +82 -0
- package/dist/awaited.js.map +1 -0
- package/dist/client.d.ts +140 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1772 -0
- package/dist/client.js.map +1 -0
- package/dist/core.d.ts +36 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +122 -0
- package/dist/core.js.map +1 -0
- package/dist/delivery.d.ts +120 -0
- package/dist/delivery.d.ts.map +1 -0
- package/dist/delivery.js +117 -0
- package/dist/delivery.js.map +1 -0
- package/dist/discovery.d.ts +35 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +306 -0
- package/dist/discovery.js.map +1 -0
- package/dist/domains.d.ts +29 -0
- package/dist/domains.d.ts.map +1 -0
- package/dist/domains.js +267 -0
- package/dist/domains.js.map +1 -0
- package/dist/history.d.ts +13 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +143 -0
- package/dist/history.js.map +1 -0
- package/dist/http.d.ts +20 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +88 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/keys.d.ts +97 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +679 -0
- package/dist/keys.js.map +1 -0
- package/dist/memory.d.ts +9 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +35 -0
- package/dist/memory.js.map +1 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +480 -0
- package/dist/messages.js.map +1 -0
- package/dist/node.d.ts +26 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +59 -0
- package/dist/node.js.map +1 -0
- package/dist/resolve.d.ts +18 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +37 -0
- package/dist/resolve.js.map +1 -0
- package/dist/resources.d.ts +25 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +782 -0
- package/dist/resources.js.map +1 -0
- package/dist/routes/domains.d.ts +4 -0
- package/dist/routes/domains.d.ts.map +1 -0
- package/dist/routes/domains.js +42 -0
- package/dist/routes/domains.js.map +1 -0
- package/dist/routes/grants.d.ts +8 -0
- package/dist/routes/grants.d.ts.map +1 -0
- package/dist/routes/grants.js +32 -0
- package/dist/routes/grants.js.map +1 -0
- package/dist/routes/public.d.ts +4 -0
- package/dist/routes/public.d.ts.map +1 -0
- package/dist/routes/public.js +62 -0
- package/dist/routes/public.js.map +1 -0
- package/dist/routes/resources.d.ts +8 -0
- package/dist/routes/resources.d.ts.map +1 -0
- package/dist/routes/resources.js +87 -0
- package/dist/routes/resources.js.map +1 -0
- package/dist/routes/shared.d.ts +77 -0
- package/dist/routes/shared.d.ts.map +1 -0
- package/dist/routes/shared.js +349 -0
- package/dist/routes/shared.js.map +1 -0
- package/dist/routes/threads.d.ts +8 -0
- package/dist/routes/threads.d.ts.map +1 -0
- package/dist/routes/threads.js +113 -0
- package/dist/routes/threads.js.map +1 -0
- package/dist/routes/trust.d.ts +4 -0
- package/dist/routes/trust.d.ts.map +1 -0
- package/dist/routes/trust.js +36 -0
- package/dist/routes/trust.js.map +1 -0
- package/dist/stream.d.ts +20 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +141 -0
- package/dist/stream.js.map +1 -0
- package/dist/threads.d.ts +79 -0
- package/dist/threads.d.ts.map +1 -0
- package/dist/threads.js +480 -0
- package/dist/threads.js.map +1 -0
- package/dist/transport.d.ts +45 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +175 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +809 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +16 -8
- package/src/client.ts +0 -1549
- package/src/core.ts +0 -114
- package/src/discovery.ts +0 -267
- package/src/domains.ts +0 -210
- package/src/history.ts +0 -129
- package/src/http.ts +0 -841
- package/src/index.ts +0 -18
- package/src/keys.ts +0 -632
- package/src/memory.ts +0 -34
- package/src/messages.ts +0 -398
- package/src/node.ts +0 -56
- package/src/resources.ts +0 -745
- package/src/threads.ts +0 -350
- package/src/transport.ts +0 -204
- package/src/types.ts +0 -383
package/dist/threads.js
ADDED
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { admissionView, decimal, fail, key, page, requireValue, utc } from "./core.js";
|
|
2
|
+
/** One reserved default-thread id per owner: omitted targets land here, and the id is never reused. */
|
|
3
|
+
export const DEFAULT_THREAD = 'thr-default';
|
|
4
|
+
const DEFAULT_ACCESS = ['post', 'read'];
|
|
5
|
+
function requireThreadRef(ref) {
|
|
6
|
+
if (ref == null || typeof ref !== 'object' || typeof ref.owner !== 'string' || typeof ref.id !== 'string' || ref.id.length === 0) {
|
|
7
|
+
fail('invalid_request', 'Expected a ThreadRef with an owner and a non-empty id.');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
async function loadThread(tx, ctx, ref) {
|
|
11
|
+
requireThreadRef(ref);
|
|
12
|
+
ctx.owner(ref.owner);
|
|
13
|
+
return requireValue(await tx.get(key('thread', ref.owner, ref.id)));
|
|
14
|
+
}
|
|
15
|
+
function requireAccess(access) {
|
|
16
|
+
if (!Array.isArray(access) || access.length === 0)
|
|
17
|
+
fail('invalid_request', 'access must list at least one of post and read.');
|
|
18
|
+
for (const item of access)
|
|
19
|
+
if (item !== 'post' && item !== 'read')
|
|
20
|
+
fail('invalid_request', 'Unknown access member; expected post or read.');
|
|
21
|
+
return [...new Set(access)];
|
|
22
|
+
}
|
|
23
|
+
function requireScope(scope) {
|
|
24
|
+
if (scope == null || typeof scope !== 'object' || Array.isArray(scope))
|
|
25
|
+
fail('invalid_request', 'read_scope must be an object.');
|
|
26
|
+
for (const name of Object.keys(scope)) {
|
|
27
|
+
if (name !== 'peers' && name !== 'since_seq' && name !== 'related_to')
|
|
28
|
+
fail('invalid_request', `Unknown read_scope key ${name}.`);
|
|
29
|
+
}
|
|
30
|
+
const { peers, since_seq, related_to } = scope;
|
|
31
|
+
if (peers !== undefined && (!Array.isArray(peers) || peers.length === 0 || peers.some(peer => typeof peer !== 'string' || peer.length === 0))) {
|
|
32
|
+
fail('invalid_request', 'read_scope.peers must be a non-empty array of node ids.');
|
|
33
|
+
}
|
|
34
|
+
if (since_seq !== undefined && (typeof since_seq !== 'string' || !/^(0|[1-9][0-9]*)$/.test(since_seq))) {
|
|
35
|
+
fail('invalid_request', 'read_scope.since_seq must be a decimal sequence string.');
|
|
36
|
+
}
|
|
37
|
+
if (related_to !== undefined && (typeof related_to?.sender !== 'string' || !related_to.sender || typeof related_to.id !== 'string' || !related_to.id)) {
|
|
38
|
+
fail('invalid_request', 'read_scope.related_to must be a complete MessageRef.');
|
|
39
|
+
}
|
|
40
|
+
return { ...(peers === undefined ? {} : { peers: [...new Set(peers)] }), ...(since_seq === undefined ? {} : { since_seq }), ...(related_to === undefined ? {} : { related_to: { sender: related_to.sender, id: related_to.id } }) };
|
|
41
|
+
}
|
|
42
|
+
function inScope(entry, scope) {
|
|
43
|
+
if (scope.peers !== undefined && !scope.peers.includes(entry.authenticated_author))
|
|
44
|
+
return false;
|
|
45
|
+
if (scope.since_seq !== undefined && BigInt(entry.seq) < BigInt(scope.since_seq))
|
|
46
|
+
return false;
|
|
47
|
+
if (scope.related_to !== undefined) {
|
|
48
|
+
const related = entry.message.meta?.in_reply_to;
|
|
49
|
+
if (!related || related.sender !== scope.related_to.sender || related.id !== scope.related_to.id)
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
function freshThread(ref, title, at) {
|
|
55
|
+
return { thread_ref: ref, title, state: 'open', next_seq: '1', event_seq: '0', created_at: at, closed_at: null };
|
|
56
|
+
}
|
|
57
|
+
async function recordEvent(tx, thread, type, data) {
|
|
58
|
+
const seq = (BigInt(thread.event_seq) + 1n).toString();
|
|
59
|
+
const next = { ...thread, event_seq: seq };
|
|
60
|
+
await tx.put(key('thread', thread.thread_ref.owner, thread.thread_ref.id), next);
|
|
61
|
+
const event = { id: seq, type, thread_ref: thread.thread_ref, data };
|
|
62
|
+
await tx.put(key('event', thread.thread_ref.owner, thread.thread_ref.id, seq), event);
|
|
63
|
+
return next;
|
|
64
|
+
}
|
|
65
|
+
/** Ascending by a unique string position, which is what core.page resumes on. */
|
|
66
|
+
function sortedBy(items, position) {
|
|
67
|
+
return items.sort((left, right) => {
|
|
68
|
+
const a = position(left);
|
|
69
|
+
const b = position(right);
|
|
70
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/** Reads a thread record under the caller's authority over its owner. */
|
|
74
|
+
export async function getThread(tx, ctx, ref) {
|
|
75
|
+
return loadThread(tx, ctx, ref);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Read authority for a thread: the owner reads everything; any other actor reads
|
|
79
|
+
* only as an active member holding read whose current read_scope admits the entry.
|
|
80
|
+
* The scope is evaluated at read time, never stored on the entry.
|
|
81
|
+
*/
|
|
82
|
+
export async function canRead(tx, actor, ref, entry) {
|
|
83
|
+
const thread = await tx.get(key('thread', ref.owner, ref.id));
|
|
84
|
+
if (actor === thread?.thread_ref.owner)
|
|
85
|
+
return true;
|
|
86
|
+
if (entry !== undefined && (entry.thread_ref.owner !== ref.owner || entry.thread_ref.id !== ref.id))
|
|
87
|
+
return false;
|
|
88
|
+
const member = await tx.get(key('member', ref.owner, ref.id, actor));
|
|
89
|
+
if (member?.state !== 'active' || !member.access.includes('read'))
|
|
90
|
+
return false;
|
|
91
|
+
return entry === undefined || inScope(entry, member.read_scope);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Issues the persistent grant notice an owner keeps until the recipient confirms it.
|
|
95
|
+
* The notice id is the member revision, so one revision maps to one notice and a
|
|
96
|
+
* retried membership change cannot queue a second delivery.
|
|
97
|
+
*/
|
|
98
|
+
async function issueGrant(tx, ref, peer, revision) {
|
|
99
|
+
const grant = { id: revision, recipient: peer, thread_ref: ref, revision, acked: false };
|
|
100
|
+
await tx.put(key('notice', grant.id), grant);
|
|
101
|
+
return grant;
|
|
102
|
+
}
|
|
103
|
+
export class ThreadService {
|
|
104
|
+
#ctx;
|
|
105
|
+
/** The client's loop, woken immediately when a grant notice is accepted or queued; set by the node. */
|
|
106
|
+
#waker;
|
|
107
|
+
constructor(ctx) {
|
|
108
|
+
this.#ctx = ctx;
|
|
109
|
+
}
|
|
110
|
+
/** @internal Called by OnlyneNode so grant notices wake the maintenance loop immediately. */
|
|
111
|
+
bindLoop(waker) { this.#waker = waker; }
|
|
112
|
+
async create(auth, mutation) {
|
|
113
|
+
if (!auth.actor)
|
|
114
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
115
|
+
const owner = auth.actor;
|
|
116
|
+
this.#ctx.owner(owner);
|
|
117
|
+
if (typeof mutation.title !== 'string' || mutation.title.length === 0)
|
|
118
|
+
fail('invalid_request', 'A thread needs a title.');
|
|
119
|
+
if (mutation.id !== undefined && (typeof mutation.id !== 'string' || mutation.id.length === 0))
|
|
120
|
+
fail('invalid_request', 'Thread id must be a non-empty string.');
|
|
121
|
+
const wantsDefault = mutation.default === true || mutation.id === DEFAULT_THREAD;
|
|
122
|
+
const body = { title: mutation.title, id: mutation.id ?? null, default: wantsDefault };
|
|
123
|
+
return this.#ctx.mutate(auth, 'thread.create', mutation, body, async (tx) => {
|
|
124
|
+
const at = new Date(this.#ctx.now()).toISOString();
|
|
125
|
+
const existingDefault = await tx.get(key('thread', owner, DEFAULT_THREAD));
|
|
126
|
+
if (wantsDefault) {
|
|
127
|
+
if (existingDefault) {
|
|
128
|
+
if (existingDefault.title === mutation.title || mutation.id === undefined)
|
|
129
|
+
return existingDefault;
|
|
130
|
+
const retitled = { ...existingDefault, title: mutation.title };
|
|
131
|
+
await tx.put(key('thread', owner, DEFAULT_THREAD), retitled);
|
|
132
|
+
return retitled;
|
|
133
|
+
}
|
|
134
|
+
const thread = freshThread({ owner, id: DEFAULT_THREAD }, mutation.title, at);
|
|
135
|
+
await tx.put(key('thread', owner, DEFAULT_THREAD), thread);
|
|
136
|
+
await tx.put(key('default', owner), thread.thread_ref);
|
|
137
|
+
return thread;
|
|
138
|
+
}
|
|
139
|
+
let ref;
|
|
140
|
+
if (mutation.id === undefined) {
|
|
141
|
+
ref = { owner, id: crypto.randomUUID() };
|
|
142
|
+
while (await tx.get(key('thread', owner, ref.id)))
|
|
143
|
+
ref = { owner, id: crypto.randomUUID() };
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
ref = { owner, id: mutation.id };
|
|
147
|
+
if (await tx.get(key('thread', owner, ref.id)) || ref.id === DEFAULT_THREAD)
|
|
148
|
+
fail('id_conflict', 'This thread id is already allocated for the owner.');
|
|
149
|
+
}
|
|
150
|
+
const thread = freshThread(ref, mutation.title, at);
|
|
151
|
+
await tx.put(key('thread', owner, ref.id), thread);
|
|
152
|
+
// An ordinary thread does not plant the landing slot: a default exists only when the
|
|
153
|
+
// owner asks for one, so opening a conversation never turns later first contacts into
|
|
154
|
+
// `not_a_member` refusals against a thread nobody joined.
|
|
155
|
+
return thread;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
async close(auth, ref, mutation) {
|
|
159
|
+
if (!auth.actor)
|
|
160
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
161
|
+
requireThreadRef(ref);
|
|
162
|
+
this.#ctx.owner(ref.owner);
|
|
163
|
+
if (auth.actor !== ref.owner)
|
|
164
|
+
fail('forbidden', 'Only the owner may close a thread.');
|
|
165
|
+
const body = { ref };
|
|
166
|
+
return this.#ctx.mutate(auth, `thread.close/${ref.owner}/${ref.id}`, mutation, body, async (tx) => {
|
|
167
|
+
const thread = await loadThread(tx, this.#ctx, ref);
|
|
168
|
+
if (thread.state === 'closed')
|
|
169
|
+
fail('thread_closed', 'The thread is already closed.');
|
|
170
|
+
return recordEvent(tx, { ...thread, state: 'closed', closed_at: new Date(this.#ctx.now()).toISOString() }, 'thread_closed', {});
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async list(auth, options = {}) {
|
|
174
|
+
if (!auth.actor)
|
|
175
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
176
|
+
this.#ctx.owner(auth.actor);
|
|
177
|
+
return this.#ctx.storage.transaction(async (tx) => {
|
|
178
|
+
const threads = sortedBy((await tx.scan(key('thread', auth.actor) + '/')).map(row => row.value), thread => thread.thread_ref.id);
|
|
179
|
+
return page(threads, options, { kind: 'threads', owner: auth.actor }, thread => thread.thread_ref.id);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Participant view: the threads this node was invited into and does not own, derived only
|
|
184
|
+
* from the records it already holds — the known-owner rows and grant notices `acceptGrant`
|
|
185
|
+
* wrote, the attention and inbox rows that name a thread, and the receipts of messages it
|
|
186
|
+
* sent there. The title, the state and the member table belong to the owner, so they are
|
|
187
|
+
* absent here; a caller that can reach the owner fills them in. This listing never invents
|
|
188
|
+
* a member it could not read.
|
|
189
|
+
*/
|
|
190
|
+
async joined(auth, options = {}) {
|
|
191
|
+
if (!auth.actor)
|
|
192
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
193
|
+
if (auth.actor !== this.#ctx.node)
|
|
194
|
+
fail('forbidden', 'The joined-thread view belongs to this node.');
|
|
195
|
+
return this.#ctx.storage.transaction(async (tx) => {
|
|
196
|
+
const rows = new Map();
|
|
197
|
+
const hold = (ref, seq, message) => {
|
|
198
|
+
// A thread this node owns is already in `list()`; this view is the other side of it.
|
|
199
|
+
if (ref.owner === this.#ctx.node)
|
|
200
|
+
return;
|
|
201
|
+
const slot = key(ref.owner, ref.id);
|
|
202
|
+
const held = rows.get(slot) ?? { ref: { owner: ref.owner, id: ref.id }, seq: '0', messages: new Set() };
|
|
203
|
+
rows.set(slot, held);
|
|
204
|
+
if (seq !== undefined && decimal(seq) > decimal(held.seq))
|
|
205
|
+
held.seq = seq;
|
|
206
|
+
if (message !== undefined)
|
|
207
|
+
held.messages.add(key(message.sender, message.id));
|
|
208
|
+
};
|
|
209
|
+
for (const row of await tx.scan(key('known') + '/'))
|
|
210
|
+
hold(row.value.thread_ref);
|
|
211
|
+
for (const row of await tx.scan(key('grant') + '/'))
|
|
212
|
+
hold(row.value.thread_ref);
|
|
213
|
+
for (const row of await tx.scan(key('attention') + '/'))
|
|
214
|
+
hold(row.value.thread_ref, row.value.seq, row.value.message_ref);
|
|
215
|
+
for (const row of await tx.scan(key('inbox') + '/'))
|
|
216
|
+
hold(row.value.attention.thread_ref, row.value.attention.seq, row.value.attention.message_ref);
|
|
217
|
+
for (const row of await tx.scan(key('outbound') + '/')) {
|
|
218
|
+
const receipt = row.value.receipt;
|
|
219
|
+
if (receipt !== undefined)
|
|
220
|
+
hold(receipt.thread_ref, receipt.seq, receipt.message_ref);
|
|
221
|
+
}
|
|
222
|
+
const items = sortedBy([...rows.values()], row => key(row.ref.owner, row.ref.id))
|
|
223
|
+
.map((row) => ({
|
|
224
|
+
thread_ref: row.ref, last_seq: row.seq, message_count: row.messages.size, read_only: true,
|
|
225
|
+
}));
|
|
226
|
+
return page(items, options, { kind: 'joined', owner: auth.actor }, item => key(item.thread_ref.owner, item.thread_ref.id));
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
async describe(auth, ref) {
|
|
230
|
+
if (!auth.actor)
|
|
231
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
232
|
+
return this.#ctx.storage.transaction(async (tx) => {
|
|
233
|
+
const thread = await loadThread(tx, this.#ctx, ref);
|
|
234
|
+
if (!await canRead(tx, auth.actor, ref))
|
|
235
|
+
fail('forbidden', 'The caller does not hold read access to this thread.');
|
|
236
|
+
const members = (await tx.scan(key('member', ref.owner, ref.id) + '/')).map(row => row.value);
|
|
237
|
+
return { thread, members };
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
async member(auth, ref, peer, patch, mutation) {
|
|
241
|
+
if (!auth.actor)
|
|
242
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
243
|
+
requireThreadRef(ref);
|
|
244
|
+
if (typeof peer !== 'string' || peer.length === 0)
|
|
245
|
+
fail('invalid_request', 'A membership names its peer.');
|
|
246
|
+
const isOwner = auth.actor === ref.owner;
|
|
247
|
+
if (!isOwner && auth.actor !== peer)
|
|
248
|
+
fail('forbidden', 'Only the owner manages other peers.');
|
|
249
|
+
if (patch.revision !== undefined)
|
|
250
|
+
fail('invalid_request', 'The revision is issued by the owner.');
|
|
251
|
+
if (!isOwner && (patch.access !== undefined || patch.read_scope !== undefined || (patch.state !== undefined && patch.state !== 'revoked' && patch.state !== 'active'))) {
|
|
252
|
+
fail('forbidden', 'A peer may only join or withdraw itself.');
|
|
253
|
+
}
|
|
254
|
+
const body = { ref, peer, patch };
|
|
255
|
+
return this.#ctx.mutate(auth, `thread.member/${ref.owner}/${ref.id}/${peer}`, mutation, body, async (tx) => {
|
|
256
|
+
const thread = await loadThread(tx, this.#ctx, ref);
|
|
257
|
+
const current = await tx.get(key('member', ref.owner, ref.id, peer));
|
|
258
|
+
let next;
|
|
259
|
+
if (!isOwner) {
|
|
260
|
+
if (current === undefined) {
|
|
261
|
+
if (patch.state === 'revoked')
|
|
262
|
+
fail('not_found', 'No membership record to withdraw.');
|
|
263
|
+
if (thread.state === 'closed')
|
|
264
|
+
fail('thread_closed', 'A closed thread does not accept joins.');
|
|
265
|
+
const admitted = (await this.#ctx.options.plugins.mayAdmit?.(auth.actor, ref, admissionView(tx))) === true;
|
|
266
|
+
next = { peer, state: admitted ? 'active' : 'requested', access: [...DEFAULT_ACCESS], read_scope: {}, revision: this.#ctx.id() };
|
|
267
|
+
}
|
|
268
|
+
else if (patch.state === 'revoked') {
|
|
269
|
+
if (current.state !== 'active' && current.state !== 'requested')
|
|
270
|
+
fail('conflict', 'This membership is already stopped.');
|
|
271
|
+
next = { ...current, state: 'revoked', access: [], revision: this.#ctx.id() };
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
fail('conflict', 'This peer already holds a membership record; only the owner changes it.');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const state = patch.state ?? 'active';
|
|
279
|
+
if (state !== 'requested' && state !== 'active' && state !== 'revoked' && state !== 'denied')
|
|
280
|
+
fail('invalid_request', 'Unknown member state.');
|
|
281
|
+
const stopping = state === 'revoked' || state === 'denied';
|
|
282
|
+
const access = stopping ? [] : patch.access === undefined ? (current?.state === 'active' ? current.access : [...DEFAULT_ACCESS]) : requireAccess(patch.access);
|
|
283
|
+
next = { peer, state, access: [...access], read_scope: patch.read_scope === undefined ? (current?.read_scope ?? {}) : requireScope(patch.read_scope), revision: this.#ctx.id() };
|
|
284
|
+
}
|
|
285
|
+
await tx.put(key('member', ref.owner, ref.id, peer), next);
|
|
286
|
+
if (next.state === 'active' && current?.state !== 'active' && peer !== ref.owner)
|
|
287
|
+
await issueGrant(tx, ref, peer, next.revision);
|
|
288
|
+
await recordEvent(tx, thread, 'membership', JSON.parse(JSON.stringify(next)));
|
|
289
|
+
return next;
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
async members(auth, ref, options = {}) {
|
|
293
|
+
if (!auth.actor)
|
|
294
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
295
|
+
return this.#ctx.storage.transaction(async (tx) => {
|
|
296
|
+
await loadThread(tx, this.#ctx, ref);
|
|
297
|
+
if (!await canRead(tx, auth.actor, ref))
|
|
298
|
+
fail('forbidden', 'The caller does not hold read access to this thread.');
|
|
299
|
+
const members = sortedBy((await tx.scan(key('member', ref.owner, ref.id) + '/')).map(row => row.value), member => member.peer);
|
|
300
|
+
return page(members, options, { kind: 'members', ref }, member => member.peer);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
async defaultThread(auth) {
|
|
304
|
+
if (!auth.actor)
|
|
305
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
306
|
+
this.#ctx.owner(auth.actor);
|
|
307
|
+
return this.#ctx.storage.transaction(async (tx) => requireValue(await tx.get(key('default', auth.actor))));
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Owner-side notice outbox: every grant notice this node issued that has no ack yet.
|
|
311
|
+
* Only the owner calling as ctx.node may read this list; each item carries recipient
|
|
312
|
+
* so the client knows where to POST the full notice.
|
|
313
|
+
*/
|
|
314
|
+
async notices(auth, options = {}) {
|
|
315
|
+
if (!auth.actor)
|
|
316
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
317
|
+
this.#ctx.owner(auth.actor);
|
|
318
|
+
return this.#ctx.storage.transaction(async (tx) => {
|
|
319
|
+
const held = sortedBy((await tx.scan(key('notice') + '/')).map(row => row.value).filter(grant => !grant.acked), grant => grant.id);
|
|
320
|
+
return page(held, options, { kind: 'notices', owner: auth.actor }, grant => grant.id);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Recipient view: the grants this node accepted from owners, until it confirms each one.
|
|
325
|
+
* A missed push is fetched over HTTP and processed with acceptGrant; this list is what
|
|
326
|
+
* the confirmation pass walks to close the owner's notice.
|
|
327
|
+
*/
|
|
328
|
+
async grants(auth, options = {}) {
|
|
329
|
+
if (!auth.actor)
|
|
330
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
331
|
+
return this.#ctx.storage.transaction(async (tx) => {
|
|
332
|
+
const held = sortedBy((await tx.scan(key('grant') + '/')).map(row => row.value).filter(grant => !grant.acked), grant => grant.id);
|
|
333
|
+
return page(held, options, { kind: 'grants', recipient: auth.actor }, grant => grant.id);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Owner-side evidence for a recipient repairing its own lost grant and known rows: every
|
|
338
|
+
* membership of this node that is still active for the caller, with its notice. An acked
|
|
339
|
+
* notice is included, because the caller's rebuilding store cannot distinguish it from a
|
|
340
|
+
* notice that was never sent; a revoked membership and a superseded revision are not,
|
|
341
|
+
* because their notice id is the member revision they replaced.
|
|
342
|
+
*/
|
|
343
|
+
async issued(auth, options = {}) {
|
|
344
|
+
if (!auth.actor)
|
|
345
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
346
|
+
// The caller is the participant repairing its own store, not this node's owner: the scan is
|
|
347
|
+
// already restricted to memberships of this node, and every returned notice must name the
|
|
348
|
+
// caller as recipient, so no owner check applies here.
|
|
349
|
+
return this.#ctx.storage.transaction(async (tx) => {
|
|
350
|
+
const current = (await tx.scan(key('member', this.#ctx.node) + '/'))
|
|
351
|
+
.map(row => row.value)
|
|
352
|
+
.filter(member => member.peer === auth.actor && member.state === 'active');
|
|
353
|
+
const held = [];
|
|
354
|
+
for (const member of current) {
|
|
355
|
+
const notice = await tx.get(key('notice', member.revision));
|
|
356
|
+
if (notice !== undefined && notice.recipient === auth.actor && notice.thread_ref.owner === this.#ctx.node) {
|
|
357
|
+
held.push(notice);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return page(sortedBy(held, grant => grant.id), options, { kind: 'issued', recipient: auth.actor }, grant => grant.id);
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
/** Recipient side: records that the owner confirmed this grant, so it is not confirmed twice. */
|
|
364
|
+
async ackGrantLocally(auth, ref, id) {
|
|
365
|
+
if (!auth.actor)
|
|
366
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
367
|
+
await this.#ctx.storage.transaction(async (tx) => {
|
|
368
|
+
const slot = key('grant', ref.owner, id);
|
|
369
|
+
const stored = await tx.get(slot);
|
|
370
|
+
if (stored !== undefined && !stored.acked)
|
|
371
|
+
await tx.put(slot, { ...stored, acked: true });
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Recipient side of grant acceptance: an owner pushes us a notice we received during
|
|
376
|
+
* a prior join. We store both the notice and the known-owner record keyed owner+threadid.
|
|
377
|
+
* Caller is the owner the notice names, notice is addressed to our node, thread stays on owner.
|
|
378
|
+
*
|
|
379
|
+
* A notice that names `previous_thread_ref` is a re-issue after its owner changed identity:
|
|
380
|
+
* the ref it names is the one this node learned before, so that known row is dropped. Two
|
|
381
|
+
* rows for one thread would make every reconciliation pass pull the dead owner.
|
|
382
|
+
*/
|
|
383
|
+
async acceptGrant(auth, grant) {
|
|
384
|
+
if (!auth.actor)
|
|
385
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
386
|
+
if (grant == null || typeof grant !== 'object' || typeof grant.id !== 'string' || grant.id.length === 0 || typeof grant.revision !== 'string' || grant.revision.length === 0) {
|
|
387
|
+
fail('invalid_request', 'Expected a grant notice with an id and a revision.');
|
|
388
|
+
}
|
|
389
|
+
requireThreadRef(grant.thread_ref);
|
|
390
|
+
if (grant.thread_ref.owner !== auth.actor)
|
|
391
|
+
fail('forbidden', 'A grant notice must come from the thread owner it names.');
|
|
392
|
+
if (grant.recipient !== this.#ctx.node)
|
|
393
|
+
fail('forbidden', 'The grant notice is addressed to another node.');
|
|
394
|
+
const previous = grant.previous_thread_ref;
|
|
395
|
+
if (previous !== undefined)
|
|
396
|
+
requireThreadRef(previous);
|
|
397
|
+
const ref = { owner: grant.thread_ref.owner, id: grant.thread_ref.id };
|
|
398
|
+
return this.#ctx.storage.transaction(async (tx) => {
|
|
399
|
+
const slot = key('grant', ref.owner, grant.id);
|
|
400
|
+
const stored = await tx.get(slot);
|
|
401
|
+
if (stored !== undefined && (stored.recipient !== this.#ctx.node || stored.revision !== grant.revision || stored.thread_ref.id !== ref.id)) {
|
|
402
|
+
fail('id_conflict', 'The grant id is bound to another notice.');
|
|
403
|
+
}
|
|
404
|
+
const known = { owner: ref.owner, thread_ref: ref, revision: grant.revision };
|
|
405
|
+
await tx.put(key('known', ref.owner, ref.id), known);
|
|
406
|
+
if (previous !== undefined && (previous.owner !== ref.owner || previous.id !== ref.id)) {
|
|
407
|
+
await tx.delete(key('known', previous.owner, previous.id));
|
|
408
|
+
// The copied grant rows under the old owner are what the confirmation pass walks: left
|
|
409
|
+
// in place they keep confirming a notice the dead owner issued and keep the dead thread
|
|
410
|
+
// in this node's joined list. A re-issue replaces them, so drop every row that names it.
|
|
411
|
+
for (const row of await tx.scan(key('grant') + '/')) {
|
|
412
|
+
if (row.value.thread_ref.owner === previous.owner && row.value.thread_ref.id === previous.id) {
|
|
413
|
+
await tx.delete(row.key);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (stored !== undefined)
|
|
418
|
+
return stored;
|
|
419
|
+
// A replayed notice may already have been acknowledged; carrying that fact with the
|
|
420
|
+
// repair avoids an empty confirmation round trip to an owner that already learned it.
|
|
421
|
+
const next = { id: grant.id, recipient: this.#ctx.node, thread_ref: ref, revision: grant.revision, acked: grant.acked === true };
|
|
422
|
+
await tx.put(slot, next);
|
|
423
|
+
return next;
|
|
424
|
+
}).then(result => {
|
|
425
|
+
try {
|
|
426
|
+
this.#waker?.wakeImmediate();
|
|
427
|
+
}
|
|
428
|
+
catch { /* a loop fault never blocks grant acceptance */ }
|
|
429
|
+
return result;
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Acknowledge a notice on the owner node: owner receives our confirmation, updates
|
|
434
|
+
* the owner-issued notice to acked:true, stops retries. Caller must be recipient of the notice.
|
|
435
|
+
*/
|
|
436
|
+
async ackGrant(auth, id, mutation) {
|
|
437
|
+
if (!auth.actor)
|
|
438
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
439
|
+
if (typeof id !== 'string' || id.length === 0)
|
|
440
|
+
fail('invalid_request', 'A grant id is required.');
|
|
441
|
+
const body = { id };
|
|
442
|
+
return this.#ctx.mutate(auth, `thread.grant.ack/${id}`, mutation, body, async (tx) => {
|
|
443
|
+
const grant = requireValue(await tx.get(key('notice', id)));
|
|
444
|
+
if (grant.recipient !== auth.actor)
|
|
445
|
+
fail('forbidden', 'The grant notice is addressed to another recipient.');
|
|
446
|
+
if (grant.acked)
|
|
447
|
+
return grant;
|
|
448
|
+
const acked = { ...grant, acked: true };
|
|
449
|
+
await tx.put(key('notice', id), acked);
|
|
450
|
+
return acked;
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
async permits(auth, permit, mutation) {
|
|
454
|
+
if (!auth.actor)
|
|
455
|
+
fail('unauthenticated', 'Authentication is required.');
|
|
456
|
+
const original = permit?.message_ref;
|
|
457
|
+
if (typeof original?.sender !== 'string' || !original.sender || typeof original.id !== 'string' || !original.id)
|
|
458
|
+
fail('invalid_request', 'A permit binds a complete MessageRef.');
|
|
459
|
+
if (original.sender !== auth.actor)
|
|
460
|
+
fail('forbidden', 'Only the original message sender may issue a reply permit.');
|
|
461
|
+
if (typeof permit.grantee !== 'string' || !permit.grantee || permit.grantee === auth.actor)
|
|
462
|
+
fail('invalid_request', 'A permit names one grantee other than its issuer.');
|
|
463
|
+
requireThreadRef(permit.landing);
|
|
464
|
+
this.#ctx.owner(permit.landing.owner);
|
|
465
|
+
if (!Number.isInteger(permit.remaining) || permit.remaining < 1)
|
|
466
|
+
fail('invalid_request', 'A permit needs a bounded positive reply count.');
|
|
467
|
+
if (utc(permit.expires_at) <= this.#ctx.now())
|
|
468
|
+
fail('invalid_request', 'A permit needs a future expiry.');
|
|
469
|
+
const body = { message_ref: { sender: original.sender, id: original.id }, grantee: permit.grantee, landing: permit.landing, expires_at: permit.expires_at, remaining: permit.remaining, followup: permit.followup === true };
|
|
470
|
+
return this.#ctx.mutate(auth, `thread.permit/${original.sender}/${original.id}/${permit.grantee}`, mutation, body, async (tx) => {
|
|
471
|
+
const thread = await loadThread(tx, this.#ctx, permit.landing);
|
|
472
|
+
if (thread.state === 'closed')
|
|
473
|
+
fail('thread_closed', 'A permit cannot land on a closed thread.');
|
|
474
|
+
const stored = { ...body, revoked: permit.revoked === true };
|
|
475
|
+
await tx.put(key('permit', original.sender, original.id, permit.grantee), stored);
|
|
476
|
+
return stored;
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../src/threads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { NodeId, Target, Transport } from './types.ts';
|
|
2
|
+
import type { TrustService } from './keys.ts';
|
|
3
|
+
/** The trust reads and signing steps a transport performs; a host that builds its own node wraps the real service. */
|
|
4
|
+
export type SigningTrust = Pick<TrustService, 'entry' | 'signRequest' | 'verifyResponse'>;
|
|
5
|
+
/**
|
|
6
|
+
* RFC 0017 §3: the pairing act a missing-trust failure names, before any host surface is
|
|
7
|
+
* known. `responsible_node` is the holder who still owes the act — this node when it never
|
|
8
|
+
* asked or must approve, the peer when it owes the answer — and `required_action` is what
|
|
9
|
+
* that holder does. A transport that cannot name its own node leaves `self` and the local
|
|
10
|
+
* cases' `responsible_node` null rather than guessing an identity.
|
|
11
|
+
*/
|
|
12
|
+
export interface TrustFailure {
|
|
13
|
+
self: NodeId | null;
|
|
14
|
+
peer: NodeId;
|
|
15
|
+
reason: 'no_record' | 'pending' | 'revoked';
|
|
16
|
+
responsible_node: NodeId | null;
|
|
17
|
+
required_action: 'request_exchange' | 'confirm_exchange' | 'restore_trust';
|
|
18
|
+
}
|
|
19
|
+
/** RFC 0017 request signing: transcripts, response verification, trust-state gating. */
|
|
20
|
+
export interface SigningTransportOptions {
|
|
21
|
+
trust: SigningTrust;
|
|
22
|
+
/**
|
|
23
|
+
* Where this host's holder reaches the act a missing-trust failure names. The library knows
|
|
24
|
+
* which node owes the act and what it is; only the host knows its own menu, so the failure
|
|
25
|
+
* carries the host's path instead of one this file would have to invent. The path describes
|
|
26
|
+
* the responsible node's surface: the peer's own menu when that holder owes the answer.
|
|
27
|
+
*/
|
|
28
|
+
guidance?(details: TrustFailure): {
|
|
29
|
+
entry: string[];
|
|
30
|
+
} | undefined;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The base URL a service request may use: HTTPS anywhere, plain HTTP on loopback only.
|
|
34
|
+
* Public reads (a candidate's service description) use the same rule, so one host cannot
|
|
35
|
+
* downgrade the other.
|
|
36
|
+
*/
|
|
37
|
+
export declare function serviceBase(value: string): URL;
|
|
38
|
+
export declare class FetchTransport implements Transport {
|
|
39
|
+
private readonly resolve;
|
|
40
|
+
private readonly fetcher;
|
|
41
|
+
private readonly signing;
|
|
42
|
+
constructor(resolve: (node: NodeId) => Promise<Target>, fetcher?: typeof fetch, signing?: SigningTransportOptions);
|
|
43
|
+
request<T>(target: NodeId, method: string, path: string, body?: unknown, signal?: AbortSignal): Promise<T>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAc,MAAM,YAAY,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,sHAAsH;AACtH,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,aAAa,GAAG,gBAAgB,CAAC,CAAC;AAE1F;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,kBAAkB,GAAG,kBAAkB,GAAG,eAAe,CAAC;CAC5E;AAED,wFAAwF;AACxF,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,YAAY,CAAC;IACpB;;;;;OAKG;IACH,QAAQ,CAAC,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CAAC;CACnE;AAOD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAO9C;AA0DD,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAElD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,GAAE,OAAO,KAAa,EAAE,OAAO,CAAC,EAAE,uBAAuB;IAMlH,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;CA0FjH"}
|