@weaveprotocol/core 0.1.1 → 0.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 +264 -42
- package/dist/identity/contact-key.d.ts +42 -0
- package/dist/identity/contact-key.d.ts.map +1 -0
- package/dist/identity/contact-key.js +133 -0
- package/dist/identity/contact-key.js.map +1 -0
- package/dist/index.d.ts +16 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/network/mesh.d.ts +6 -0
- package/dist/network/mesh.d.ts.map +1 -1
- package/dist/network/mesh.js +11 -1
- package/dist/network/mesh.js.map +1 -1
- package/dist/network/multi-signaling.d.ts +12 -2
- package/dist/network/multi-signaling.d.ts.map +1 -1
- package/dist/network/multi-signaling.js +86 -14
- package/dist/network/multi-signaling.js.map +1 -1
- package/dist/network/peer-auth.d.ts +50 -16
- package/dist/network/peer-auth.d.ts.map +1 -1
- package/dist/network/peer-auth.js +52 -15
- package/dist/network/peer-auth.js.map +1 -1
- package/dist/node/carrier.d.ts +87 -0
- package/dist/node/carrier.d.ts.map +1 -1
- package/dist/node/carrier.js +180 -59
- package/dist/node/carrier.js.map +1 -1
- package/dist/node/copy.d.ts.map +1 -1
- package/dist/node/copy.js +6 -3
- package/dist/node/copy.js.map +1 -1
- package/dist/node/host.d.ts +117 -0
- package/dist/node/host.d.ts.map +1 -0
- package/dist/node/host.js +192 -0
- package/dist/node/host.js.map +1 -0
- package/dist/node/index.d.ts +6 -2
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +1 -0
- package/dist/node/index.js.map +1 -1
- package/dist/node/node.d.ts.map +1 -1
- package/dist/node/node.js +640 -25
- package/dist/node/node.js.map +1 -1
- package/dist/node/space-runtime.d.ts +42 -25
- package/dist/node/space-runtime.d.ts.map +1 -1
- package/dist/node/space-runtime.js +734 -35
- package/dist/node/space-runtime.js.map +1 -1
- package/dist/node/types.d.ts +269 -3
- package/dist/node/types.d.ts.map +1 -1
- package/dist/privacy/space-encryption.d.ts +16 -0
- package/dist/privacy/space-encryption.d.ts.map +1 -1
- package/dist/privacy/space-encryption.js +40 -0
- package/dist/privacy/space-encryption.js.map +1 -1
- package/dist/query/engine.js +1 -1
- package/dist/query/engine.js.map +1 -1
- package/dist/query/types.d.ts +7 -0
- package/dist/query/types.d.ts.map +1 -1
- package/dist/query/types.js.map +1 -1
- package/dist/react/use-query.d.ts +1 -1
- package/dist/react/use-query.d.ts.map +1 -1
- package/dist/records/topics.d.ts +21 -0
- package/dist/records/topics.d.ts.map +1 -0
- package/dist/records/topics.js +86 -0
- package/dist/records/topics.js.map +1 -0
- package/dist/schema/collection-def.d.ts +7 -0
- package/dist/schema/collection-def.d.ts.map +1 -1
- package/dist/schema/collection-def.js +4 -0
- package/dist/schema/collection-def.js.map +1 -1
- package/dist/schema/expression.d.ts +2 -0
- package/dist/schema/expression.d.ts.map +1 -1
- package/dist/schema/expression.js +1 -0
- package/dist/schema/expression.js.map +1 -1
- package/dist/schemas/contacts.d.ts +77 -0
- package/dist/schemas/contacts.d.ts.map +1 -0
- package/dist/schemas/contacts.js +35 -0
- package/dist/schemas/contacts.js.map +1 -0
- package/dist/schemas/index.d.ts +2 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +1 -0
- package/dist/schemas/index.js.map +1 -1
- package/dist/session/auth.d.ts.map +1 -1
- package/dist/session/auth.js +14 -3
- package/dist/session/auth.js.map +1 -1
- package/dist/session/connect.d.ts +25 -1
- package/dist/session/connect.d.ts.map +1 -1
- package/dist/session/connect.js +9 -2
- package/dist/session/connect.js.map +1 -1
- package/dist/session/hosting.d.ts +155 -0
- package/dist/session/hosting.d.ts.map +1 -0
- package/dist/session/hosting.js +160 -0
- package/dist/session/hosting.js.map +1 -0
- package/dist/space/account-registry.d.ts +6 -0
- package/dist/space/account-registry.d.ts.map +1 -1
- package/dist/space/account-registry.js +16 -4
- package/dist/space/account-registry.js.map +1 -1
- package/dist/space/notify.d.ts +88 -0
- package/dist/space/notify.d.ts.map +1 -0
- package/dist/space/notify.js +127 -0
- package/dist/space/notify.js.map +1 -0
- package/dist/space/pass.d.ts +6 -0
- package/dist/space/pass.d.ts.map +1 -1
- package/dist/space/pass.js +5 -2
- package/dist/space/pass.js.map +1 -1
- package/dist/space/roles.d.ts +71 -0
- package/dist/space/roles.d.ts.map +1 -1
- package/dist/space/roles.js +114 -0
- package/dist/space/roles.js.map +1 -1
- package/dist/space/space-access.d.ts +24 -0
- package/dist/space/space-access.d.ts.map +1 -1
- package/dist/space/space-access.js +24 -0
- package/dist/space/space-access.js.map +1 -1
- package/dist/space/space-manager.d.ts +35 -1
- package/dist/space/space-manager.d.ts.map +1 -1
- package/dist/space/space-manager.js +72 -25
- package/dist/space/space-manager.js.map +1 -1
- package/dist/storage/blob/memory.d.ts +9 -0
- package/dist/storage/blob/memory.d.ts.map +1 -0
- package/dist/storage/blob/memory.js +20 -0
- package/dist/storage/blob/memory.js.map +1 -0
- package/dist/storage/blob/s3.d.ts +16 -0
- package/dist/storage/blob/s3.d.ts.map +1 -0
- package/dist/storage/blob/s3.js +86 -0
- package/dist/storage/blob/s3.js.map +1 -0
- package/dist/storage/blob-store.d.ts +26 -0
- package/dist/storage/blob-store.d.ts.map +1 -0
- package/dist/storage/blob-store.js +2 -0
- package/dist/storage/blob-store.js.map +1 -0
- package/dist/storage/encrypted-adapter.d.ts +3 -3
- package/dist/storage/encrypted-adapter.js +3 -3
- package/dist/storage/folder-adapter.d.ts +8 -8
- package/dist/storage/folder-adapter.d.ts.map +1 -1
- package/dist/storage/folder-adapter.js +7 -7
- package/dist/storage/folder-reconcile.d.ts +12 -14
- package/dist/storage/folder-reconcile.d.ts.map +1 -1
- package/dist/storage/folder-reconcile.js +20 -14
- package/dist/storage/folder-reconcile.js.map +1 -1
- package/dist/storage/index.d.ts +0 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +0 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/indexeddb-adapter.d.ts.map +1 -1
- package/dist/storage/indexeddb-adapter.js +8 -9
- package/dist/storage/indexeddb-adapter.js.map +1 -1
- package/dist/storage/mirror.d.ts +68 -0
- package/dist/storage/mirror.d.ts.map +1 -0
- package/dist/storage/mirror.js +174 -0
- package/dist/storage/mirror.js.map +1 -0
- package/dist/storage/segment.d.ts +20 -0
- package/dist/storage/segment.d.ts.map +1 -0
- package/dist/storage/segment.js +27 -0
- package/dist/storage/segment.js.map +1 -0
- package/dist/storage/storage-provider.d.ts +36 -40
- package/dist/storage/storage-provider.d.ts.map +1 -1
- package/dist/storage/storage-provider.js +208 -117
- package/dist/storage/storage-provider.js.map +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/negentropy.d.ts +68 -0
- package/dist/sync/negentropy.d.ts.map +1 -0
- package/dist/sync/negentropy.js +379 -0
- package/dist/sync/negentropy.js.map +1 -0
- package/dist/sync/sync-engine.d.ts +45 -13
- package/dist/sync/sync-engine.d.ts.map +1 -1
- package/dist/sync/sync-engine.js +290 -207
- package/dist/sync/sync-engine.js.map +1 -1
- package/dist/sync/sync-messages.d.ts +42 -32
- package/dist/sync/sync-messages.d.ts.map +1 -1
- package/dist/sync/sync-messages.js +1 -1
- package/dist/sync/sync-messages.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/hash.d.ts +9 -0
- package/dist/utils/hash.d.ts.map +1 -1
- package/dist/utils/hash.js +33 -0
- package/dist/utils/hash.js.map +1 -1
- package/package.json +9 -3
- package/dist/storage/mst.d.ts +0 -121
- package/dist/storage/mst.d.ts.map +0 -1
- package/dist/storage/mst.js +0 -402
- package/dist/storage/mst.js.map +0 -1
- package/dist/sync/anti-entropy.d.ts +0 -49
- package/dist/sync/anti-entropy.d.ts.map +0 -1
- package/dist/sync/anti-entropy.js +0 -62
- package/dist/sync/anti-entropy.js.map +0 -1
|
@@ -16,13 +16,18 @@
|
|
|
16
16
|
*
|
|
17
17
|
* Peers are announced once per room however many relays mention them, because a
|
|
18
18
|
* duplicate announcement would have both sides opening a second connection.
|
|
19
|
+
*
|
|
20
|
+
* A room can name relays of its own: a space says where its members meet
|
|
21
|
+
* (`sys.relays`), so two people whose apps use different relays still find
|
|
22
|
+
* each other there. Those are joined for that room only, and dropped once no
|
|
23
|
+
* room names them.
|
|
19
24
|
*/
|
|
20
25
|
import { createEmitter } from '../utils/events.js';
|
|
21
26
|
import { createSignalingClient } from './signaling.js';
|
|
22
27
|
/**
|
|
23
28
|
* Creates a signaling client spanning several relays.
|
|
24
29
|
*
|
|
25
|
-
* @param urls The relays to use. One is fine; none is a programming error.
|
|
30
|
+
* @param urls The relays to use for every room. One is fine; none is a programming error.
|
|
26
31
|
* @param did This peer's identifier
|
|
27
32
|
* @returns A client with the same contract as a single-relay one
|
|
28
33
|
*/
|
|
@@ -30,7 +35,14 @@ export function createMultiSignalingClient(urls, did) {
|
|
|
30
35
|
if (urls.length === 0) {
|
|
31
36
|
throw new Error('At least one relay is needed to introduce peers.');
|
|
32
37
|
}
|
|
33
|
-
const
|
|
38
|
+
const defaults = new Set(urls);
|
|
39
|
+
const byUrl = new Map();
|
|
40
|
+
const clientList = () => [...byUrl.values()];
|
|
41
|
+
/** Which rooms each relay of a room's own was joined for */
|
|
42
|
+
const roomsOn = new Map();
|
|
43
|
+
/** Each room's own relays */
|
|
44
|
+
const extraOf = new Map();
|
|
45
|
+
let connecting = false;
|
|
34
46
|
const { on, off, emit } = createEmitter();
|
|
35
47
|
/** Which relays a peer has been seen on, so replies go back the same way. */
|
|
36
48
|
const routes = new Map();
|
|
@@ -38,7 +50,7 @@ export function createMultiSignalingClient(urls, did) {
|
|
|
38
50
|
const presence = new Map();
|
|
39
51
|
/** TURN servers each relay offered, and when their passwords stop working */
|
|
40
52
|
const turn = new Map();
|
|
41
|
-
const connectedCount = () =>
|
|
53
|
+
const connectedCount = () => clientList().filter((client) => client.isConnected()).length;
|
|
42
54
|
/** Remembers that a peer is reachable through this relay. */
|
|
43
55
|
const remember = (peer, client) => {
|
|
44
56
|
(routes.get(peer) ?? routes.set(peer, new Set()).get(peer)).add(client);
|
|
@@ -48,9 +60,46 @@ export function createMultiSignalingClient(urls, did) {
|
|
|
48
60
|
const known = [...(routes.get(peer) ?? [])].filter((client) => client.isConnected());
|
|
49
61
|
// Nothing known yet — an answer to an offer that arrived before this client
|
|
50
62
|
// saw the peer join. Shout on every relay rather than dropping it.
|
|
51
|
-
return known.length > 0 ? known :
|
|
63
|
+
return known.length > 0 ? known : clientList().filter((client) => client.isConnected());
|
|
64
|
+
};
|
|
65
|
+
/** A relay's client, made and wired the first time it is needed */
|
|
66
|
+
const clientFor = (url) => {
|
|
67
|
+
const held = byUrl.get(url);
|
|
68
|
+
if (held)
|
|
69
|
+
return held;
|
|
70
|
+
const client = createSignalingClient(url, did);
|
|
71
|
+
byUrl.set(url, client);
|
|
72
|
+
wire(client);
|
|
73
|
+
// One of a room's own, added while running: connected now, like the rest.
|
|
74
|
+
if (connecting)
|
|
75
|
+
void client.connect().catch(() => { });
|
|
76
|
+
return client;
|
|
77
|
+
};
|
|
78
|
+
/** Lets go of a room's own relay once no room names it */
|
|
79
|
+
const release = (url, room) => {
|
|
80
|
+
const client = byUrl.get(url);
|
|
81
|
+
if (!client)
|
|
82
|
+
return;
|
|
83
|
+
client.leave(room);
|
|
84
|
+
const rooms = roomsOn.get(url);
|
|
85
|
+
rooms?.delete(room);
|
|
86
|
+
if (defaults.has(url) || (rooms && rooms.size > 0))
|
|
87
|
+
return;
|
|
88
|
+
roomsOn.delete(url);
|
|
89
|
+
byUrl.delete(url);
|
|
90
|
+
turn.delete(client);
|
|
91
|
+
for (const seenBy of routes.values())
|
|
92
|
+
seenBy.delete(client);
|
|
93
|
+
for (const [where, seenBy] of presence) {
|
|
94
|
+
if (!seenBy.delete(client) || seenBy.size > 0)
|
|
95
|
+
continue;
|
|
96
|
+
presence.delete(where);
|
|
97
|
+
const space = where.indexOf(' ');
|
|
98
|
+
emit('peer-left', where.slice(space + 1), where.slice(0, space));
|
|
99
|
+
}
|
|
100
|
+
client.disconnect();
|
|
52
101
|
};
|
|
53
|
-
|
|
102
|
+
function wire(client) {
|
|
54
103
|
client.on('peer-joined', (peer, room) => {
|
|
55
104
|
remember(peer, client);
|
|
56
105
|
if (peer === did)
|
|
@@ -91,32 +140,55 @@ export function createMultiSignalingClient(urls, did) {
|
|
|
91
140
|
// worth surfacing on its own. Total failure shows up through `connect`.
|
|
92
141
|
client.on('error', () => { });
|
|
93
142
|
}
|
|
143
|
+
for (const url of defaults)
|
|
144
|
+
clientFor(url);
|
|
94
145
|
/**
|
|
95
146
|
* Connects to every relay, succeeding if any of them answers.
|
|
96
147
|
* @returns Once at least one relay is usable
|
|
97
148
|
*/
|
|
98
149
|
const connect = async () => {
|
|
99
|
-
|
|
150
|
+
connecting = true;
|
|
151
|
+
const all = [...byUrl.keys()];
|
|
152
|
+
const results = await Promise.allSettled(clientList().map((client) => client.connect()));
|
|
100
153
|
if (results.some((result) => result.status === 'fulfilled'))
|
|
101
154
|
return;
|
|
102
|
-
throw new Error(`None of the ${
|
|
155
|
+
throw new Error(`None of the ${all.length} relays could be reached: ${all.join(', ')}`);
|
|
103
156
|
};
|
|
104
157
|
return Object.freeze({
|
|
105
158
|
connect,
|
|
106
159
|
disconnect: () => {
|
|
107
|
-
|
|
160
|
+
connecting = false;
|
|
161
|
+
for (const client of clientList())
|
|
108
162
|
client.disconnect();
|
|
163
|
+
// A room's own relays are made again when a room names them.
|
|
164
|
+
for (const url of [...byUrl.keys()])
|
|
165
|
+
if (!defaults.has(url))
|
|
166
|
+
byUrl.delete(url);
|
|
167
|
+
roomsOn.clear();
|
|
168
|
+
extraOf.clear();
|
|
109
169
|
routes.clear();
|
|
110
170
|
presence.clear();
|
|
111
171
|
turn.clear();
|
|
112
172
|
},
|
|
113
|
-
join: (room) => {
|
|
114
|
-
|
|
115
|
-
|
|
173
|
+
join: (room, relays = []) => {
|
|
174
|
+
const own = new Set(relays.filter((url) => !defaults.has(url)));
|
|
175
|
+
for (const url of extraOf.get(room) ?? [])
|
|
176
|
+
if (!own.has(url))
|
|
177
|
+
release(url, room);
|
|
178
|
+
extraOf.set(room, own);
|
|
179
|
+
for (const url of defaults)
|
|
180
|
+
clientFor(url).join(room);
|
|
181
|
+
for (const url of own) {
|
|
182
|
+
(roomsOn.get(url) ?? roomsOn.set(url, new Set()).get(url)).add(room);
|
|
183
|
+
clientFor(url).join(room);
|
|
184
|
+
}
|
|
116
185
|
},
|
|
117
186
|
leave: (room) => {
|
|
118
|
-
for (const
|
|
119
|
-
|
|
187
|
+
for (const url of defaults)
|
|
188
|
+
byUrl.get(url)?.leave(room);
|
|
189
|
+
for (const url of extraOf.get(room) ?? [])
|
|
190
|
+
release(url, room);
|
|
191
|
+
extraOf.delete(room);
|
|
120
192
|
for (const where of presence.keys())
|
|
121
193
|
if (where.startsWith(`${room} `))
|
|
122
194
|
presence.delete(where);
|
|
@@ -126,7 +198,7 @@ export function createMultiSignalingClient(urls, did) {
|
|
|
126
198
|
client.signal(kind, target, payload);
|
|
127
199
|
},
|
|
128
200
|
requestIce: () => {
|
|
129
|
-
for (const client of
|
|
201
|
+
for (const client of clientList())
|
|
130
202
|
if (client.isConnected())
|
|
131
203
|
client.requestIce();
|
|
132
204
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-signaling.js","sourceRoot":"","sources":["../../src/network/multi-signaling.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"multi-signaling.js","sourceRoot":"","sources":["../../src/network/multi-signaling.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,16 @@
|
|
|
24
24
|
* it, and a host that cannot read the space checks readers exactly as a
|
|
25
25
|
* member's own node does.
|
|
26
26
|
*
|
|
27
|
+
* **A private space's key changes** when someone is removed (`sys.key`), and
|
|
28
|
+
* with it the read key. A reader proves the one the space names now. One
|
|
29
|
+
* that was offline when it changed still holds only an older one: it proves
|
|
30
|
+
* that, and sends its note — the delegation from its account — sealed with
|
|
31
|
+
* the older space key, so only those who could read the space then can open
|
|
32
|
+
* it. A peer holding that key opens the note and lets it in if its account is
|
|
33
|
+
* still a member. Someone removed holds the older key too, but is no member.
|
|
34
|
+
* A peer without any key of the space's (a host) takes the current read key
|
|
35
|
+
* only.
|
|
36
|
+
*
|
|
27
37
|
* The node signs with **its own key**, the one its DID names. That proves the
|
|
28
38
|
* welcome comes from the node that sent the challenge; which node to trust is
|
|
29
39
|
* the client's choice of URL. Naming the node in the client's signature keeps
|
|
@@ -34,7 +44,39 @@ import type { CryptoProvider } from '../types.js';
|
|
|
34
44
|
export interface HelloProof {
|
|
35
45
|
readonly sig: string;
|
|
36
46
|
readonly read?: string;
|
|
47
|
+
/** The read key that signed `read`, when it is not the one the space names now */
|
|
48
|
+
readonly readKey?: string;
|
|
49
|
+
/** Its note, sealed with the space key behind `readKey` — for a reader that may be behind */
|
|
50
|
+
readonly member?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Who may read a private space, as one side of a connection knows it — asked
|
|
54
|
+
* at every handshake, since the space's key can change while it is open.
|
|
55
|
+
*/
|
|
56
|
+
export interface ReadAccess {
|
|
57
|
+
/** The read key this side proves with, or null when it holds none */
|
|
58
|
+
key(): Promise<{
|
|
59
|
+
readonly did: string;
|
|
60
|
+
readonly privateKey: CryptoKey;
|
|
61
|
+
} | null>;
|
|
62
|
+
/** The read key every reader must prove, as the space names it now */
|
|
63
|
+
current(): string;
|
|
64
|
+
/**
|
|
65
|
+
* This side's note, sealed with the space key behind the read key it
|
|
66
|
+
* proves with — sent along when that may not be the current one.
|
|
67
|
+
*/
|
|
68
|
+
membership?(): Promise<string | null>;
|
|
69
|
+
/** Whether a peer proving an older read key, with this sealed note, is still a member */
|
|
70
|
+
admits?(peerDid: string, readKey: string, membership: unknown): Promise<boolean>;
|
|
37
71
|
}
|
|
72
|
+
/** What a caller may pass for a space's read access: the full thing, or a fixed key pair and the public half it must match */
|
|
73
|
+
export type ReadAccessInput = ReadAccess | {
|
|
74
|
+
readonly key: {
|
|
75
|
+
readonly privateKey: CryptoKey;
|
|
76
|
+
readonly did?: string;
|
|
77
|
+
} | null;
|
|
78
|
+
readonly publicDid: string;
|
|
79
|
+
};
|
|
38
80
|
/** The connecting side: proves who it is and that it may read, and checks the node's welcome. */
|
|
39
81
|
export interface ClientAuth {
|
|
40
82
|
hello(clientDid: string, nodeDid: string, nodeNonce: string): Promise<HelloProof>;
|
|
@@ -51,30 +93,27 @@ export declare function peerNonce(): string;
|
|
|
51
93
|
* The client side.
|
|
52
94
|
* @param spaceId The space — bound into every signature, so a proof for one space is useless in another
|
|
53
95
|
* @param session This side's DID and the key it names
|
|
54
|
-
* @param
|
|
96
|
+
* @param read In a private space, how this side proves it may read — or just the read key (`deriveReadKey`); null in a public one
|
|
55
97
|
*/
|
|
56
98
|
export declare function createClientAuth(spaceId: string, session: {
|
|
57
99
|
readonly did: string;
|
|
58
100
|
readonly key: CryptoKey;
|
|
59
|
-
},
|
|
101
|
+
}, read: ReadAccess | {
|
|
60
102
|
readonly privateKey: CryptoKey;
|
|
61
103
|
} | null, provider: CryptoProvider): ClientAuth;
|
|
62
104
|
/**
|
|
63
|
-
* The node side.
|
|
64
|
-
* @param
|
|
105
|
+
* The node side. Needs no secret of the space's.
|
|
106
|
+
* @param read In a private space, who may read it — or just its public read key; null in a public one
|
|
65
107
|
* @param nodeKey The private key of the DID the node introduces itself as
|
|
66
108
|
*/
|
|
67
|
-
export declare function createServerAuth(spaceId: string,
|
|
109
|
+
export declare function createServerAuth(spaceId: string, read: ReadAccess | string | null, nodeKey: CryptoKey, provider: CryptoProvider): ServerAuth;
|
|
68
110
|
/** The fingerprints of one connection's two ends, as this side sees them */
|
|
69
111
|
export interface ChannelBinding {
|
|
70
112
|
readonly local: string;
|
|
71
113
|
readonly remote: string;
|
|
72
114
|
}
|
|
73
|
-
/** What one side sends to prove itself */
|
|
74
|
-
export
|
|
75
|
-
readonly sig: string;
|
|
76
|
-
readonly read?: string;
|
|
77
|
-
}
|
|
115
|
+
/** What one side sends to prove itself — as a client's hello */
|
|
116
|
+
export type MeshProof = HelloProof;
|
|
78
117
|
/** Proving who you are to a peer — and, in a private space, that you may read it. */
|
|
79
118
|
export interface MeshAuth {
|
|
80
119
|
prove(peerDid: string, peerNonce: string, binding: ChannelBinding | null): Promise<MeshProof>;
|
|
@@ -89,10 +128,5 @@ export interface MeshAuth {
|
|
|
89
128
|
export declare function createMeshAuth(spaceId: string, session: {
|
|
90
129
|
readonly did: string;
|
|
91
130
|
readonly key: CryptoKey;
|
|
92
|
-
}, read:
|
|
93
|
-
readonly key: {
|
|
94
|
-
readonly privateKey: CryptoKey;
|
|
95
|
-
} | null;
|
|
96
|
-
readonly publicDid: string;
|
|
97
|
-
} | null, provider: CryptoProvider): MeshAuth;
|
|
131
|
+
}, read: ReadAccessInput | null, provider: CryptoProvider): MeshAuth;
|
|
98
132
|
//# sourceMappingURL=peer-auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer-auth.d.ts","sourceRoot":"","sources":["../../src/network/peer-auth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"peer-auth.d.ts","sourceRoot":"","sources":["../../src/network/peer-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
import { base64UrlDecode, base64UrlEncode, utf8Encode } from '../utils/encoding.js';
|
|
2
2
|
import { didToPublicKey } from '../identity/did.js';
|
|
3
|
+
function readAccessOf(read) {
|
|
4
|
+
if (!read)
|
|
5
|
+
return null;
|
|
6
|
+
if ('current' in read)
|
|
7
|
+
return read;
|
|
8
|
+
const { key, publicDid } = read;
|
|
9
|
+
return { key: async () => (key ? { did: key.did ?? publicDid, privateKey: key.privateKey } : null), current: () => publicDid };
|
|
10
|
+
}
|
|
11
|
+
/** Signs `label` as a reader: with the read key, saying which one when it is not the current one, and the sealed note then */
|
|
12
|
+
async function proveRead(access, label, provider) {
|
|
13
|
+
const key = await access.key();
|
|
14
|
+
if (!key)
|
|
15
|
+
return null;
|
|
16
|
+
const read = base64UrlEncode(await provider.sign(key.privateKey, label));
|
|
17
|
+
if (key.did === access.current())
|
|
18
|
+
return { read };
|
|
19
|
+
const member = (await access.membership?.()) ?? null;
|
|
20
|
+
return { read, readKey: key.did, ...(member ? { member } : {}) };
|
|
21
|
+
}
|
|
22
|
+
/** Whether a proof shows a reader: the current read key, or an older one with a note from someone still a member */
|
|
23
|
+
async function checkRead(access, peerDid, label, proof, provider) {
|
|
24
|
+
const current = access.current();
|
|
25
|
+
const claimed = typeof proof.readKey === 'string' ? proof.readKey : current;
|
|
26
|
+
if (!claimed.startsWith('did:key:') || !(await verifyBy(provider, claimed, proof.read, label)))
|
|
27
|
+
return false;
|
|
28
|
+
if (claimed === current)
|
|
29
|
+
return true;
|
|
30
|
+
return access.admits ? access.admits(peerDid, claimed, proof.member) : false;
|
|
31
|
+
}
|
|
3
32
|
/** A fresh random nonce, as a string. */
|
|
4
33
|
export function peerNonce() {
|
|
5
34
|
return base64UrlEncode(globalThis.crypto.getRandomValues(new Uint8Array(16)));
|
|
@@ -21,14 +50,19 @@ async function verifyBy(provider, did, sig, data) {
|
|
|
21
50
|
* The client side.
|
|
22
51
|
* @param spaceId The space — bound into every signature, so a proof for one space is useless in another
|
|
23
52
|
* @param session This side's DID and the key it names
|
|
24
|
-
* @param
|
|
53
|
+
* @param read In a private space, how this side proves it may read — or just the read key (`deriveReadKey`); null in a public one
|
|
25
54
|
*/
|
|
26
|
-
export function createClientAuth(spaceId, session,
|
|
55
|
+
export function createClientAuth(spaceId, session, read, provider) {
|
|
56
|
+
// A bare key pair proves itself as whatever the node names now.
|
|
57
|
+
const access = !read ? null : 'current' in read ? read : { key: async () => ({ did: '', privateKey: read.privateKey }), current: () => '' };
|
|
27
58
|
return Object.freeze({
|
|
28
59
|
async hello(clientDid, nodeDid, nodeNonce) {
|
|
29
60
|
const label = helloLabel(spaceId, clientDid, nodeDid, nodeNonce);
|
|
30
61
|
const sig = base64UrlEncode(await provider.sign(session.key, label));
|
|
31
|
-
|
|
62
|
+
if (!access)
|
|
63
|
+
return { sig };
|
|
64
|
+
const proof = await proveRead(access, label, provider);
|
|
65
|
+
return proof ? { sig, ...proof } : { sig };
|
|
32
66
|
},
|
|
33
67
|
checkWelcome(nodeDid, clientNonce, sig) {
|
|
34
68
|
return verifyBy(provider, nodeDid, sig, welcomeLabel(spaceId, nodeDid, clientNonce));
|
|
@@ -36,18 +70,19 @@ export function createClientAuth(spaceId, session, readKey, provider) {
|
|
|
36
70
|
});
|
|
37
71
|
}
|
|
38
72
|
/**
|
|
39
|
-
* The node side.
|
|
40
|
-
* @param
|
|
73
|
+
* The node side. Needs no secret of the space's.
|
|
74
|
+
* @param read In a private space, who may read it — or just its public read key; null in a public one
|
|
41
75
|
* @param nodeKey The private key of the DID the node introduces itself as
|
|
42
76
|
*/
|
|
43
|
-
export function createServerAuth(spaceId,
|
|
77
|
+
export function createServerAuth(spaceId, read, nodeKey, provider) {
|
|
78
|
+
const access = read === null ? null : typeof read === 'string' ? { key: async () => null, current: () => read } : read;
|
|
44
79
|
return Object.freeze({
|
|
45
80
|
async checkHello(clientDid, nodeDid, nodeNonce, proof) {
|
|
46
|
-
const
|
|
81
|
+
const given = (proof ?? {});
|
|
47
82
|
const label = helloLabel(spaceId, clientDid, nodeDid, nodeNonce);
|
|
48
|
-
if (!clientDid.startsWith('did:key:') || !(await verifyBy(provider, clientDid, sig, label)))
|
|
83
|
+
if (!clientDid.startsWith('did:key:') || !(await verifyBy(provider, clientDid, given.sig, label)))
|
|
49
84
|
return false;
|
|
50
|
-
return
|
|
85
|
+
return access ? checkRead(access, clientDid, label, given, provider) : true;
|
|
51
86
|
},
|
|
52
87
|
async welcome(nodeDid, clientNonce) {
|
|
53
88
|
return base64UrlEncode(await provider.sign(nodeKey, welcomeLabel(spaceId, nodeDid, clientNonce)));
|
|
@@ -62,24 +97,26 @@ const meshLabel = (spaceId, prover, verifier, nonce, proverCert, verifierCert) =
|
|
|
62
97
|
* @param read In a private space: the read key to prove with, and the public half the space names to check others against
|
|
63
98
|
*/
|
|
64
99
|
export function createMeshAuth(spaceId, session, read, provider) {
|
|
100
|
+
const access = readAccessOf(read);
|
|
65
101
|
return Object.freeze({
|
|
66
102
|
async prove(peerDid, peerNonce, binding) {
|
|
67
103
|
const label = meshLabel(spaceId, session.did, peerDid, peerNonce, binding?.local ?? '', binding?.remote ?? '');
|
|
68
104
|
const sig = base64UrlEncode(await provider.sign(session.key, label));
|
|
69
|
-
if (!
|
|
105
|
+
if (!access)
|
|
70
106
|
return { sig };
|
|
107
|
+
const proof = await proveRead(access, label, provider);
|
|
71
108
|
// A node without the space's key cannot prove it may read — and should not be served.
|
|
72
|
-
if (!
|
|
109
|
+
if (!proof)
|
|
73
110
|
throw new Error('This node cannot read the space, so it cannot join its peers');
|
|
74
|
-
return { sig,
|
|
111
|
+
return { sig, ...proof };
|
|
75
112
|
},
|
|
76
113
|
async check(peerDid, ourNonce, binding, proof) {
|
|
77
|
-
const
|
|
114
|
+
const given = (proof ?? {});
|
|
78
115
|
// What they signed, seen from this end: their certificate is our remote one.
|
|
79
116
|
const label = meshLabel(spaceId, peerDid, session.did, ourNonce, binding?.remote ?? '', binding?.local ?? '');
|
|
80
|
-
if (!peerDid.startsWith('did:key:') || !(await verifyBy(provider, peerDid, sig, label)))
|
|
117
|
+
if (!peerDid.startsWith('did:key:') || !(await verifyBy(provider, peerDid, given.sig, label)))
|
|
81
118
|
return false;
|
|
82
|
-
return
|
|
119
|
+
return access ? checkRead(access, peerDid, label, given, provider) : true;
|
|
83
120
|
},
|
|
84
121
|
});
|
|
85
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer-auth.js","sourceRoot":"","sources":["../../src/network/peer-auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"peer-auth.js","sourceRoot":"","sources":["../../src/network/peer-auth.ts"],"names":[],"mappings":"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"}
|
package/dist/node/carrier.d.ts
CHANGED
|
@@ -22,7 +22,12 @@
|
|
|
22
22
|
* registry are never opened.
|
|
23
23
|
*/
|
|
24
24
|
import type { CryptoProvider } from '../types.js';
|
|
25
|
+
import { type SpaceRecord } from '../space/space-manager.js';
|
|
26
|
+
import { type CarriedSubscription } from '../space/notify.js';
|
|
27
|
+
import { type LocalHub } from '../network/local-transport.js';
|
|
28
|
+
import { type SpaceRuntime } from './space-runtime.js';
|
|
25
29
|
import type { StoreFactory } from './stores.js';
|
|
30
|
+
import type { BlobStore } from '../storage/blob-store.js';
|
|
26
31
|
import type { ConnectionState, NodeNetworkConfig } from './types.js';
|
|
27
32
|
export interface CarrierConfig {
|
|
28
33
|
/** Its own key — who it is to peers. Never the account's. */
|
|
@@ -63,7 +68,34 @@ export type CarrierEvent =
|
|
|
63
68
|
/** The account stopped using this carrier: forget everything */
|
|
64
69
|
| {
|
|
65
70
|
readonly type: 'closed';
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A record arrived that one of the account's subscriptions asks about. Only
|
|
74
|
+
* what the carrier can see: which subscription, which space, which record.
|
|
75
|
+
*/
|
|
76
|
+
| {
|
|
77
|
+
readonly type: 'notify';
|
|
78
|
+
readonly subscription: CarriedSubscriptionView;
|
|
79
|
+
readonly space: {
|
|
80
|
+
readonly id: string;
|
|
81
|
+
readonly name: string;
|
|
82
|
+
};
|
|
83
|
+
readonly record: {
|
|
84
|
+
readonly key: string;
|
|
85
|
+
readonly collection: string;
|
|
86
|
+
readonly createdAt: string;
|
|
87
|
+
};
|
|
66
88
|
};
|
|
89
|
+
/** A subscription as the carrier holds it: the person's label, what it looks at, where a click goes */
|
|
90
|
+
export interface CarriedSubscriptionView {
|
|
91
|
+
readonly id: string;
|
|
92
|
+
readonly label: string;
|
|
93
|
+
readonly collection: string;
|
|
94
|
+
/** The spaces it looks at, by name; empty for every space */
|
|
95
|
+
readonly spaces: ReadonlyArray<string>;
|
|
96
|
+
readonly open?: string;
|
|
97
|
+
readonly paused: boolean;
|
|
98
|
+
}
|
|
67
99
|
export interface CarrierNode {
|
|
68
100
|
readonly did: string;
|
|
69
101
|
/** The carry space's id */
|
|
@@ -74,12 +106,67 @@ export interface CarrierNode {
|
|
|
74
106
|
* data path in it. Null stops writing there; the carrier's own copy goes on.
|
|
75
107
|
*/
|
|
76
108
|
usePod(stores: StoreFactory | null): Promise<void>;
|
|
109
|
+
/** The account's subscriptions, as this carrier holds them */
|
|
110
|
+
subscriptions(): Promise<ReadonlyArray<CarriedSubscriptionView>>;
|
|
77
111
|
subscribe(listener: (event: CarrierEvent) => void): () => void;
|
|
78
112
|
close(): Promise<void>;
|
|
79
113
|
}
|
|
114
|
+
interface Carried {
|
|
115
|
+
readonly record: SpaceRecord;
|
|
116
|
+
readonly hub: LocalHub;
|
|
117
|
+
readonly runtime: SpaceRuntime;
|
|
118
|
+
pod: Promise<SpaceRuntime> | null;
|
|
119
|
+
}
|
|
120
|
+
/** An account's carry space, as a carrying node holds it */
|
|
121
|
+
interface Carry {
|
|
122
|
+
readonly account: string;
|
|
123
|
+
/** The spaces its passes named last time they were read */
|
|
124
|
+
wants: ReadonlySet<string>;
|
|
125
|
+
/** Its subscriptions, by key, as last read */
|
|
126
|
+
subscriptions: ReadonlyMap<string, CarriedSubscription>;
|
|
127
|
+
}
|
|
128
|
+
export interface CarryCoreConfig {
|
|
129
|
+
readonly key: CryptoKeyPair;
|
|
130
|
+
readonly stores: StoreFactory;
|
|
131
|
+
readonly network?: NodeNetworkConfig;
|
|
132
|
+
readonly provider?: CryptoProvider;
|
|
133
|
+
readonly watchIntervalMs?: number;
|
|
134
|
+
readonly emit: (event: CarrierEvent) => void;
|
|
135
|
+
/** An account wrote `carry:closed` into its carry space: it stopped using this node */
|
|
136
|
+
readonly onClosed: (carrySpace: string) => void;
|
|
137
|
+
/** A file store every carried space is also kept in — a host's bucket */
|
|
138
|
+
readonly mirror?: BlobStore;
|
|
139
|
+
/** A space nobody asks for any more was let go — not one opened again after a key change */
|
|
140
|
+
readonly onRelease?: (spaceId: string) => Promise<void>;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* What a carrier and a host share: carry spaces — one per account it carries
|
|
144
|
+
* for — and every space their passes name, each held once however many
|
|
145
|
+
* accounts ask for it.
|
|
146
|
+
*/
|
|
147
|
+
export declare function createCarryCore(config: CarryCoreConfig): Promise<{
|
|
148
|
+
did: string;
|
|
149
|
+
podDid: string;
|
|
150
|
+
carried: ReadonlyMap<string, Carried>;
|
|
151
|
+
carries: ReadonlyMap<string, Carry>;
|
|
152
|
+
/**
|
|
153
|
+
* Starts carrying for an account: joins its carry space and every space
|
|
154
|
+
* its passes name.
|
|
155
|
+
* @returns The carry space's id
|
|
156
|
+
* @throws When the invite is not a readable invite to a private space
|
|
157
|
+
*/
|
|
158
|
+
addCarry(account: string, invite: string): Promise<string>;
|
|
159
|
+
/** Stops carrying for an account: its carry space, and every space nobody else still asks for */
|
|
160
|
+
removeCarry(carrySpace: string): Promise<void>;
|
|
161
|
+
setPod(stores: StoreFactory | null): Promise<void>;
|
|
162
|
+
subscriptions(): Promise<ReadonlyArray<CarriedSubscriptionView>>;
|
|
163
|
+
spaces(): Promise<ReadonlyArray<CarriedSpace>>;
|
|
164
|
+
close(): Promise<void>;
|
|
165
|
+
}>;
|
|
80
166
|
/**
|
|
81
167
|
* Starts a carrier.
|
|
82
168
|
* @throws When the carry invite is not a readable invite to a private space
|
|
83
169
|
*/
|
|
84
170
|
export declare function createCarrierNode(config: CarrierConfig): Promise<CarrierNode>;
|
|
171
|
+
export {};
|
|
85
172
|
//# sourceMappingURL=carrier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carrier.d.ts","sourceRoot":"","sources":["../../src/node/carrier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"carrier.d.ts","sourceRoot":"","sources":["../../src/node/carrier.ts"],"names":[],"mappings":"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"}
|