@serfab/cadre-core 1.14.0 → 1.15.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 +293 -274
- package/dist/cadre-invite-protocol.d.ts +64 -29
- package/dist/cadre-invite-protocol.js +207 -38
- package/dist/cadre-invite-protocol.js.map +1 -1
- package/dist/cadre-join-request.d.ts +42 -0
- package/dist/cadre-join-request.js +144 -0
- package/dist/cadre-join-request.js.map +1 -0
- package/dist/cadre-node.d.ts +375 -79
- package/dist/cadre-node.js +758 -186
- package/dist/cadre-node.js.map +1 -1
- package/dist/control-database.d.ts +92 -12
- package/dist/control-database.js +323 -142
- package/dist/control-database.js.map +1 -1
- package/dist/control-schema.d.ts +1 -1
- package/dist/control-schema.js +19 -3
- package/dist/control-schema.js.map +1 -1
- package/dist/ed25519-key.d.ts +7 -9
- package/dist/ed25519-key.js +20 -10
- package/dist/ed25519-key.js.map +1 -1
- package/dist/fetch-impl.d.ts +12 -0
- package/dist/fetch-impl.js +23 -0
- package/dist/fetch-impl.js.map +1 -0
- package/dist/file-durable-slot.js +2 -1
- package/dist/file-durable-slot.js.map +1 -1
- package/dist/file-safe-name.d.ts +25 -0
- package/dist/file-safe-name.js +29 -0
- package/dist/file-safe-name.js.map +1 -0
- package/dist/formation-approval.js +5 -11
- package/dist/formation-approval.js.map +1 -1
- package/dist/fs-atomic.d.ts +0 -19
- package/dist/fs-atomic.js +3 -24
- package/dist/fs-atomic.js.map +1 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.js +31 -6
- package/dist/index.js.map +1 -1
- package/dist/invitation-bootstrap.d.ts +50 -12
- package/dist/invitation-bootstrap.js +76 -13
- package/dist/invitation-bootstrap.js.map +1 -1
- package/dist/joined-strand-store.d.ts +7 -0
- package/dist/joined-strand-store.js +9 -0
- package/dist/joined-strand-store.js.map +1 -1
- package/dist/key-store-file.js +2 -1
- package/dist/key-store-file.js.map +1 -1
- package/dist/link-budget.d.ts +9 -4
- package/dist/link-budget.js +9 -4
- package/dist/link-budget.js.map +1 -1
- package/dist/machine-removal.d.ts +78 -0
- package/dist/machine-removal.js +166 -0
- package/dist/machine-removal.js.map +1 -0
- package/dist/membership-connection-gater.d.ts +6 -5
- package/dist/membership-connection-gater.js +6 -5
- package/dist/membership-connection-gater.js.map +1 -1
- package/dist/node-claim-payload.d.ts +55 -0
- package/dist/node-claim-payload.js +108 -4
- package/dist/node-claim-payload.js.map +1 -1
- package/dist/node-default-transports.d.ts +27 -0
- package/dist/node-default-transports.js +35 -0
- package/dist/node-default-transports.js.map +1 -0
- package/dist/node-transports.d.ts +30 -0
- package/dist/node-transports.js +40 -0
- package/dist/node-transports.js.map +1 -0
- package/dist/peer-dial.d.ts +124 -27
- package/dist/peer-dial.js +254 -30
- package/dist/peer-dial.js.map +1 -1
- package/dist/peer-join-backfill.js +6 -0
- package/dist/peer-join-backfill.js.map +1 -1
- package/dist/peer-record.d.ts +6 -45
- package/dist/peer-record.js +8 -50
- package/dist/peer-record.js.map +1 -1
- package/dist/primary-lan-address.d.ts +8 -0
- package/dist/primary-lan-address.js +46 -0
- package/dist/primary-lan-address.js.map +1 -0
- package/dist/provider/client.d.ts +131 -0
- package/dist/provider/client.js +226 -0
- package/dist/provider/client.js.map +1 -0
- package/dist/provider/descriptor.d.ts +41 -0
- package/dist/provider/descriptor.js +103 -0
- package/dist/provider/descriptor.js.map +1 -0
- package/dist/provider/index.d.ts +9 -0
- package/dist/provider/index.js +10 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/oauth.d.ts +125 -0
- package/dist/provider/oauth.js +199 -0
- package/dist/provider/oauth.js.map +1 -0
- package/dist/provider/rent-node.d.ts +101 -0
- package/dist/provider/rent-node.js +220 -0
- package/dist/provider/rent-node.js.map +1 -0
- package/dist/relay-addrs.d.ts +9 -4
- package/dist/relay-addrs.js +9 -4
- package/dist/relay-addrs.js.map +1 -1
- package/dist/relay-reservation.d.ts +51 -16
- package/dist/relay-reservation.js +107 -24
- package/dist/relay-reservation.js.map +1 -1
- package/dist/seed-bootstrap.d.ts +22 -5
- package/dist/seed-bootstrap.js +48 -25
- package/dist/seed-bootstrap.js.map +1 -1
- package/dist/strand-commit-durability.d.ts +54 -0
- package/dist/strand-commit-durability.js +74 -0
- package/dist/strand-commit-durability.js.map +1 -0
- package/dist/strand-database.d.ts +23 -8
- package/dist/strand-database.js +41 -13
- package/dist/strand-database.js.map +1 -1
- package/dist/strand-first-sync-gate.d.ts +7 -1
- package/dist/strand-first-sync-gate.js +7 -1
- package/dist/strand-first-sync-gate.js.map +1 -1
- package/dist/strand-formation-protocol.js +4 -1
- package/dist/strand-formation-protocol.js.map +1 -1
- package/dist/strand-fret-addrs.d.ts +19 -1
- package/dist/strand-fret-addrs.js +27 -9
- package/dist/strand-fret-addrs.js.map +1 -1
- package/dist/strand-instance-manager.d.ts +81 -19
- package/dist/strand-instance-manager.js +216 -105
- package/dist/strand-instance-manager.js.map +1 -1
- package/dist/strand-move.d.ts +124 -0
- package/dist/strand-move.js +438 -0
- package/dist/strand-move.js.map +1 -0
- package/dist/strand-network-config.js +7 -6
- package/dist/strand-network-config.js.map +1 -1
- package/dist/strand-peer-redial.d.ts +113 -0
- package/dist/strand-peer-redial.js +236 -0
- package/dist/strand-peer-redial.js.map +1 -0
- package/dist/strand-wake-protocol.js +10 -7
- package/dist/strand-wake-protocol.js.map +1 -1
- package/dist/types.d.ts +212 -4
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/package.json +18 -10
- package/src/cadre-invite-protocol.ts +233 -45
- package/src/cadre-join-request.ts +167 -0
- package/src/cadre-node.ts +10003 -9381
- package/src/control-database.ts +4663 -4451
- package/src/control-schema.ts +19 -3
- package/src/ed25519-key.ts +20 -10
- package/src/fetch-impl.ts +23 -0
- package/src/file-durable-slot.ts +64 -63
- package/src/file-safe-name.ts +32 -0
- package/src/formation-approval.ts +604 -610
- package/src/fs-atomic.ts +92 -117
- package/src/index.ts +789 -722
- package/src/invitation-bootstrap.ts +91 -13
- package/src/joined-strand-store.ts +508 -498
- package/src/key-store-file.ts +142 -141
- package/src/link-budget.ts +9 -4
- package/src/machine-removal.ts +216 -0
- package/src/membership-connection-gater.ts +638 -637
- package/src/node-claim-payload.ts +138 -4
- package/src/node-default-transports.ts +38 -0
- package/src/node-transports.ts +49 -0
- package/src/peer-dial.ts +604 -336
- package/src/peer-join-backfill.ts +6 -0
- package/src/peer-record.ts +159 -202
- package/src/primary-lan-address.ts +47 -0
- package/src/provider/client.ts +326 -0
- package/src/provider/descriptor.ts +129 -0
- package/src/provider/index.ts +59 -0
- package/src/provider/oauth.ts +285 -0
- package/src/provider/rent-node.ts +275 -0
- package/src/relay-addrs.ts +9 -4
- package/src/relay-reservation.ts +1211 -1121
- package/src/seed-bootstrap.ts +1502 -1471
- package/src/strand-commit-durability.ts +116 -0
- package/src/strand-database.ts +46 -14
- package/src/strand-first-sync-gate.ts +7 -1
- package/src/strand-formation-protocol.ts +1039 -1036
- package/src/strand-fret-addrs.ts +179 -145
- package/src/strand-instance-manager.ts +2026 -1883
- package/src/strand-move.ts +585 -0
- package/src/strand-network-config.ts +7 -6
- package/src/strand-peer-redial.ts +307 -0
- package/src/strand-wake-protocol.ts +10 -7
- package/src/types.ts +220 -4
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Version 1 of the join request; the only one either side reads. */
|
|
2
|
+
export declare const CADRE_JOIN_REQUEST_PREFIX = "sereus-join-request:1.";
|
|
3
|
+
/**
|
|
4
|
+
* Version 1 of an encoded cadre invitation (`encodeCadreInvitation`). Declared here, beside
|
|
5
|
+
* the request's prefix, so each decoder can name the other kind of text when it is pasted in
|
|
6
|
+
* the wrong place without this codec importing the redemption protocol.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CADRE_INVITATION_PREFIX = "sereus-invite:1.";
|
|
9
|
+
/** Longest `appName` a request carries: one line in an approval prompt. */
|
|
10
|
+
export declare const CADRE_JOIN_REQUEST_MAX_APP_NAME = 64;
|
|
11
|
+
/** Where and how the owner app answers a request that arrived as a link. */
|
|
12
|
+
export interface CadreJoinReply {
|
|
13
|
+
/** The requesting app's own custom URL scheme; the owner app opens `<scheme>://cadre-join-response/<response>`. */
|
|
14
|
+
scheme: string;
|
|
15
|
+
/** Echoed in the response, so the requesting app takes only an answer to a request it has open. */
|
|
16
|
+
nonce: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CadreJoinRequest {
|
|
19
|
+
v: 1;
|
|
20
|
+
/** The requesting node's peer id: an Ed25519 peer id, since the invitation targets that key. */
|
|
21
|
+
peerId: string;
|
|
22
|
+
/** What the requester calls itself, for the owner's approval prompt. Unverified; at most 64 characters, trimmed, non-empty. */
|
|
23
|
+
appName: string;
|
|
24
|
+
/** Present only on a request opened as a link: where and how the owner app answers. */
|
|
25
|
+
reply?: CadreJoinReply;
|
|
26
|
+
}
|
|
27
|
+
/** Encode a request as the text the requesting app copies. Refuses what {@link decodeCadreJoinRequest} would. */
|
|
28
|
+
export declare function encodeCadreJoinRequest(request: CadreJoinRequest): string;
|
|
29
|
+
/**
|
|
30
|
+
* Decode the text the owner's app was given. Refuses, naming the problem: an invitation
|
|
31
|
+
* pasted here, any prefix but version 1's, a body that is not base64url JSON of the request's
|
|
32
|
+
* shape, a peer id that does not parse or is not Ed25519, an `appName` that is empty or
|
|
33
|
+
* longer than {@link CADRE_JOIN_REQUEST_MAX_APP_NAME} characters once trimmed, and a `reply`
|
|
34
|
+
* that {@link requireCadreJoinReply} refuses.
|
|
35
|
+
*/
|
|
36
|
+
export declare function decodeCadreJoinRequest(text: string): CadreJoinRequest;
|
|
37
|
+
/**
|
|
38
|
+
* Refuses, naming the problem, a reply whose scheme is not a lowercase URL scheme of at most 64
|
|
39
|
+
* characters or is a web or system scheme (`https`, `file`, `intent`, …), and a nonce that is
|
|
40
|
+
* not 16 to 64 base64url characters. The owner app checks it again before it opens a reply.
|
|
41
|
+
*/
|
|
42
|
+
export declare function requireCadreJoinReply(reply: CadreJoinReply): CadreJoinReply;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The join request: the text an app that wants to join a cadre copies (or shows as a QR code)
|
|
3
|
+
* so the app that manages the cadre can mint an invitation for it alone
|
|
4
|
+
* (`CadreNode.createCadreInvitation({ peerId: request.peerId, grantsOwner })`).
|
|
5
|
+
*
|
|
6
|
+
* `sereus-join-request:1.<base64url of canonical JSON>` where the JSON is
|
|
7
|
+
* `{ appName, peerId, reply?, v }`. Nothing in it is secret or signed: the peer id is public, and
|
|
8
|
+
* the name is only what the requester calls itself, shown in the owner's approval prompt. The
|
|
9
|
+
* safety is in the response: an invitation targeted at that peer id can be redeemed only by
|
|
10
|
+
* the key behind it.
|
|
11
|
+
*
|
|
12
|
+
* `reply` is present only on a request opened as a link from another app on the same phone
|
|
13
|
+
* (`@serfab/cadre-rn/app-link`): the owner app answers by opening `<reply.scheme>://…`, a link it
|
|
14
|
+
* builds itself, so the scheme is restricted to an app's own custom scheme and never a web or
|
|
15
|
+
* system one, which would send the invitation's machine addresses off the phone.
|
|
16
|
+
*
|
|
17
|
+
* Imports only `@libp2p/peer-id` and `uint8arrays`, so it loads on React Native and in the
|
|
18
|
+
* browser.
|
|
19
|
+
*/
|
|
20
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
21
|
+
import { fromString as uint8ArrayFromString, toString as uint8ArrayToString } from 'uint8arrays';
|
|
22
|
+
import { canonicalJson } from './canonical-json.js';
|
|
23
|
+
/** Version 1 of the join request; the only one either side reads. */
|
|
24
|
+
export const CADRE_JOIN_REQUEST_PREFIX = 'sereus-join-request:1.';
|
|
25
|
+
/**
|
|
26
|
+
* Version 1 of an encoded cadre invitation (`encodeCadreInvitation`). Declared here, beside
|
|
27
|
+
* the request's prefix, so each decoder can name the other kind of text when it is pasted in
|
|
28
|
+
* the wrong place without this codec importing the redemption protocol.
|
|
29
|
+
*/
|
|
30
|
+
export const CADRE_INVITATION_PREFIX = 'sereus-invite:1.';
|
|
31
|
+
/** Longest `appName` a request carries: one line in an approval prompt. */
|
|
32
|
+
export const CADRE_JOIN_REQUEST_MAX_APP_NAME = 64;
|
|
33
|
+
/**
|
|
34
|
+
* Schemes a reply may not name, though they match {@link CADRE_JOIN_REPLY_SCHEME}: each opens a
|
|
35
|
+
* web page, a file, a system action or another app's content rather than a Sereus app.
|
|
36
|
+
*/
|
|
37
|
+
const REFUSED_REPLY_SCHEMES = new Set([
|
|
38
|
+
'http', 'https', 'ws', 'wss', 'ftp', 'file', 'content', 'data', 'blob',
|
|
39
|
+
'javascript', 'about', 'intent', 'mailto', 'tel', 'sms',
|
|
40
|
+
]);
|
|
41
|
+
/**
|
|
42
|
+
* The form of a reply's scheme: lowercase, as an app's custom URL scheme is declared.
|
|
43
|
+
* NOTE: `@serfab/cadre-rn`'s CommonJS config plugin keeps a copy (`APP_SCHEME`) to check extra
|
|
44
|
+
* apps' schemes; change it with this one.
|
|
45
|
+
*/
|
|
46
|
+
const CADRE_JOIN_REPLY_SCHEME = /^[a-z][a-z0-9+.-]{0,63}$/;
|
|
47
|
+
/** The form of a reply's nonce: base64url, long enough that it cannot be guessed. */
|
|
48
|
+
const CADRE_JOIN_REPLY_NONCE = /^[A-Za-z0-9_-]{16,64}$/;
|
|
49
|
+
/** Encode a request as the text the requesting app copies. Refuses what {@link decodeCadreJoinRequest} would. */
|
|
50
|
+
export function encodeCadreJoinRequest(request) {
|
|
51
|
+
const checked = requireCadreJoinRequest(request);
|
|
52
|
+
// canonicalJson drops an undefined `reply`, so a request without one encodes as it always has.
|
|
53
|
+
const json = canonicalJson({ appName: checked.appName, peerId: checked.peerId, reply: checked.reply, v: checked.v });
|
|
54
|
+
return `${CADRE_JOIN_REQUEST_PREFIX}${uint8ArrayToString(new TextEncoder().encode(json), 'base64url')}`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Decode the text the owner's app was given. Refuses, naming the problem: an invitation
|
|
58
|
+
* pasted here, any prefix but version 1's, a body that is not base64url JSON of the request's
|
|
59
|
+
* shape, a peer id that does not parse or is not Ed25519, an `appName` that is empty or
|
|
60
|
+
* longer than {@link CADRE_JOIN_REQUEST_MAX_APP_NAME} characters once trimmed, and a `reply`
|
|
61
|
+
* that {@link requireCadreJoinReply} refuses.
|
|
62
|
+
*/
|
|
63
|
+
export function decodeCadreJoinRequest(text) {
|
|
64
|
+
const trimmed = text.trim();
|
|
65
|
+
if (trimmed.startsWith(CADRE_INVITATION_PREFIX)) {
|
|
66
|
+
throw new Error('This is a cadre invitation, not a join request; paste it where the app asks for an invitation');
|
|
67
|
+
}
|
|
68
|
+
if (!trimmed.startsWith(CADRE_JOIN_REQUEST_PREFIX)) {
|
|
69
|
+
throw new Error(`A join request must start with "${CADRE_JOIN_REQUEST_PREFIX}" (this one starts with "${trimmed.slice(0, CADRE_JOIN_REQUEST_PREFIX.length)}")`);
|
|
70
|
+
}
|
|
71
|
+
let parsed;
|
|
72
|
+
try {
|
|
73
|
+
parsed = JSON.parse(new TextDecoder().decode(uint8ArrayFromString(trimmed.slice(CADRE_JOIN_REQUEST_PREFIX.length), 'base64url')));
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new Error('A join request must carry base64url-encoded JSON after its prefix', { cause: error });
|
|
77
|
+
}
|
|
78
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
79
|
+
throw new Error('A join request must decode to a JSON object');
|
|
80
|
+
}
|
|
81
|
+
const { v, peerId, appName, reply } = parsed;
|
|
82
|
+
if (v !== 1)
|
|
83
|
+
throw new Error(`A join request must be version 1 (this one says ${JSON.stringify(v)})`);
|
|
84
|
+
if (typeof peerId !== 'string')
|
|
85
|
+
throw new Error('A join request must name the requesting node\'s peer id');
|
|
86
|
+
if (typeof appName !== 'string')
|
|
87
|
+
throw new Error('A join request must carry the requesting app\'s name');
|
|
88
|
+
return requireCadreJoinRequest({ v, peerId, appName, ...(reply === undefined ? {} : { reply: replyShape(reply) }) });
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Refuses, naming the problem, a reply whose scheme is not a lowercase URL scheme of at most 64
|
|
92
|
+
* characters or is a web or system scheme (`https`, `file`, `intent`, …), and a nonce that is
|
|
93
|
+
* not 16 to 64 base64url characters. The owner app checks it again before it opens a reply.
|
|
94
|
+
*/
|
|
95
|
+
export function requireCadreJoinReply(reply) {
|
|
96
|
+
const { scheme, nonce } = reply;
|
|
97
|
+
if (!CADRE_JOIN_REPLY_SCHEME.test(scheme)) {
|
|
98
|
+
throw new Error(`A join request's reply scheme must be a lowercase URL scheme of at most 64 characters (this one is ${JSON.stringify(scheme)})`);
|
|
99
|
+
}
|
|
100
|
+
if (REFUSED_REPLY_SCHEMES.has(scheme)) {
|
|
101
|
+
throw new Error(`A join request's reply scheme must be an app's own scheme, not "${scheme}"`);
|
|
102
|
+
}
|
|
103
|
+
if (!CADRE_JOIN_REPLY_NONCE.test(nonce)) {
|
|
104
|
+
throw new Error('A join request\'s reply nonce must be 16 to 64 base64url characters');
|
|
105
|
+
}
|
|
106
|
+
return { scheme, nonce };
|
|
107
|
+
}
|
|
108
|
+
/** The decoded `reply`'s types, before {@link requireCadreJoinReply} judges its values. */
|
|
109
|
+
function replyShape(reply) {
|
|
110
|
+
if (typeof reply !== 'object' || reply === null || Array.isArray(reply)) {
|
|
111
|
+
throw new Error('A join request\'s reply must be an object');
|
|
112
|
+
}
|
|
113
|
+
const { scheme, nonce } = reply;
|
|
114
|
+
if (typeof scheme !== 'string' || typeof nonce !== 'string') {
|
|
115
|
+
throw new Error('A join request\'s reply must carry a scheme and a nonce');
|
|
116
|
+
}
|
|
117
|
+
return { scheme, nonce };
|
|
118
|
+
}
|
|
119
|
+
/** The shape rules both directions apply. Returns the request with its fields trimmed. */
|
|
120
|
+
function requireCadreJoinRequest(request) {
|
|
121
|
+
const peerId = requireEd25519PeerId(request.peerId);
|
|
122
|
+
const appName = request.appName.trim();
|
|
123
|
+
if (appName.length === 0)
|
|
124
|
+
throw new Error('A join request must name the requesting app');
|
|
125
|
+
if (appName.length > CADRE_JOIN_REQUEST_MAX_APP_NAME) {
|
|
126
|
+
throw new Error(`A join request's app name must be at most ${CADRE_JOIN_REQUEST_MAX_APP_NAME} characters (this one has ${appName.length})`);
|
|
127
|
+
}
|
|
128
|
+
return { v: 1, peerId, appName, ...(request.reply ? { reply: requireCadreJoinReply(request.reply) } : {}) };
|
|
129
|
+
}
|
|
130
|
+
/** An invitation targeted at the peer id names its key, so only an Ed25519 id could ever redeem one. */
|
|
131
|
+
function requireEd25519PeerId(text) {
|
|
132
|
+
let parsed;
|
|
133
|
+
try {
|
|
134
|
+
parsed = peerIdFromString(text.trim());
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw new Error(`A join request's peer id does not parse ("${text}")`, { cause: error });
|
|
138
|
+
}
|
|
139
|
+
if (parsed.type !== 'Ed25519') {
|
|
140
|
+
throw new Error(`A join request's peer id must be an Ed25519 peer id (this one is ${parsed.type})`);
|
|
141
|
+
}
|
|
142
|
+
return parsed.toString();
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=cadre-join-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cadre-join-request.js","sourceRoot":"","sources":["../src/cadre-join-request.ts"],"names":[],"mappings":"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"}
|