@real-life/trust-protocol 0.3.1 → 0.4.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/CHANGELOG.md +32 -0
- package/README.md +187 -78
- package/dist/ack.d.ts +84 -0
- package/dist/ack.d.ts.map +1 -0
- package/dist/ack.js +114 -0
- package/dist/ack.js.map +1 -0
- package/dist/adapters/vti-mediator.d.ts +154 -0
- package/dist/adapters/vti-mediator.d.ts.map +1 -0
- package/dist/adapters/vti-mediator.js +621 -0
- package/dist/adapters/vti-mediator.js.map +1 -0
- package/dist/anchor.d.ts +226 -0
- package/dist/anchor.d.ts.map +1 -0
- package/dist/anchor.js +347 -0
- package/dist/anchor.js.map +1 -0
- package/dist/{holder.d.ts → carrier-holder.d.ts} +1 -1
- package/dist/carrier-holder.d.ts.map +1 -0
- package/dist/{holder.js → carrier-holder.js} +5 -4
- package/dist/carrier-holder.js.map +1 -0
- package/dist/carrier-identity.js +4 -4
- package/dist/carrier-identity.js.map +1 -1
- package/dist/carrier.d.ts.map +1 -1
- package/dist/carrier.js +4 -3
- package/dist/carrier.js.map +1 -1
- package/dist/ceremony.d.ts +3 -2
- package/dist/ceremony.d.ts.map +1 -1
- package/dist/ceremony.js +16 -26
- package/dist/ceremony.js.map +1 -1
- package/dist/codec.d.ts +46 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +410 -0
- package/dist/codec.js.map +1 -0
- package/dist/continuity.d.ts +67 -0
- package/dist/continuity.d.ts.map +1 -0
- package/dist/continuity.js +110 -0
- package/dist/continuity.js.map +1 -0
- package/dist/core.d.ts +4 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js.map +1 -1
- package/dist/crypto.d.ts +23 -7
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +54 -20
- package/dist/crypto.js.map +1 -1
- package/dist/delivery.d.ts +31 -3
- package/dist/delivery.d.ts.map +1 -1
- package/dist/delivery.js +75 -28
- package/dist/delivery.js.map +1 -1
- package/dist/encounter/ceremony.d.ts +37 -0
- package/dist/encounter/ceremony.d.ts.map +1 -0
- package/dist/encounter/ceremony.js +662 -0
- package/dist/encounter/ceremony.js.map +1 -0
- package/dist/encounter.d.ts +91 -1
- package/dist/encounter.d.ts.map +1 -1
- package/dist/encounter.js +191 -12
- package/dist/encounter.js.map +1 -1
- package/dist/engine.d.ts +291 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +1395 -0
- package/dist/engine.js.map +1 -0
- package/dist/entropy.d.ts +28 -0
- package/dist/entropy.d.ts.map +1 -0
- package/dist/entropy.js +96 -0
- package/dist/entropy.js.map +1 -0
- package/dist/events.d.ts +177 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/fixtures.d.ts +30 -0
- package/dist/fixtures.d.ts.map +1 -0
- package/dist/fixtures.js +155 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/forge.d.ts +47 -0
- package/dist/forge.d.ts.map +1 -0
- package/dist/forge.js +20 -0
- package/dist/forge.js.map +1 -0
- package/dist/group-star.d.ts +251 -0
- package/dist/group-star.d.ts.map +1 -0
- package/dist/group-star.js +348 -0
- package/dist/group-star.js.map +1 -0
- package/dist/holder-api.d.ts +137 -0
- package/dist/holder-api.d.ts.map +1 -0
- package/dist/holder-api.js +132 -0
- package/dist/holder-api.js.map +1 -0
- package/dist/holder-state-v1.d.ts +801 -0
- package/dist/holder-state-v1.d.ts.map +1 -0
- package/dist/holder-state-v1.js +2 -0
- package/dist/holder-state-v1.js.map +1 -0
- package/dist/identity-state.d.ts +43 -0
- package/dist/identity-state.d.ts.map +1 -0
- package/dist/identity-state.js +345 -0
- package/dist/identity-state.js.map +1 -0
- package/dist/identity.d.ts +24 -2
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +70 -11
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +77 -29
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +36 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +22 -0
- package/dist/internal.js.map +1 -0
- package/dist/introduction/holder.d.ts +18 -0
- package/dist/introduction/holder.d.ts.map +1 -0
- package/dist/introduction/holder.js +757 -0
- package/dist/introduction/holder.js.map +1 -0
- package/dist/introduction.d.ts +101 -0
- package/dist/introduction.d.ts.map +1 -0
- package/dist/introduction.js +132 -0
- package/dist/introduction.js.map +1 -0
- package/dist/invariants.d.ts +43 -0
- package/dist/invariants.d.ts.map +1 -0
- package/dist/invariants.js +883 -0
- package/dist/invariants.js.map +1 -0
- package/dist/keys-seed.d.ts +7 -0
- package/dist/keys-seed.d.ts.map +1 -0
- package/dist/keys-seed.js +133 -0
- package/dist/keys-seed.js.map +1 -0
- package/dist/log-memory.d.ts +12 -0
- package/dist/log-memory.d.ts.map +1 -0
- package/dist/log-memory.js +101 -0
- package/dist/log-memory.js.map +1 -0
- package/dist/membership/holder.d.ts +35 -0
- package/dist/membership/holder.d.ts.map +1 -0
- package/dist/membership/holder.js +852 -0
- package/dist/membership/holder.js.map +1 -0
- package/dist/membership.d.ts +92 -0
- package/dist/membership.d.ts.map +1 -0
- package/dist/membership.js +157 -0
- package/dist/membership.js.map +1 -0
- package/dist/ports.d.ts +237 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +2 -0
- package/dist/ports.js.map +1 -0
- package/dist/profile.d.ts +56 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +193 -0
- package/dist/profile.js.map +1 -0
- package/dist/prompts.d.ts +14 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +69 -0
- package/dist/prompts.js.map +1 -0
- package/dist/receive.d.ts +133 -0
- package/dist/receive.d.ts.map +1 -0
- package/dist/receive.js +298 -0
- package/dist/receive.js.map +1 -0
- package/dist/results.d.ts +158 -0
- package/dist/results.d.ts.map +1 -0
- package/dist/results.js +21 -0
- package/dist/results.js.map +1 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +42 -38
- package/dist/schemas.js.map +1 -1
- package/dist/sha256.d.ts +3 -0
- package/dist/sha256.d.ts.map +1 -0
- package/dist/sha256.js +69 -0
- package/dist/sha256.js.map +1 -0
- package/dist/star.d.ts +31 -0
- package/dist/star.d.ts.map +1 -0
- package/dist/star.js +56 -0
- package/dist/star.js.map +1 -0
- package/dist/state-builder.d.ts +42 -0
- package/dist/state-builder.d.ts.map +1 -0
- package/dist/state-builder.js +100 -0
- package/dist/state-builder.js.map +1 -0
- package/dist/state.d.ts +853 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +36 -0
- package/dist/state.js.map +1 -0
- package/dist/store-contract.d.ts +11 -0
- package/dist/store-contract.d.ts.map +1 -0
- package/dist/store-contract.js +189 -0
- package/dist/store-contract.js.map +1 -0
- package/dist/store-memory.d.ts +8 -0
- package/dist/store-memory.d.ts.map +1 -0
- package/dist/store-memory.js +17 -0
- package/dist/store-memory.js.map +1 -0
- package/dist/testing.d.ts +22 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +21 -0
- package/dist/testing.js.map +1 -0
- package/dist/trust/continuity.d.ts +71 -0
- package/dist/trust/continuity.d.ts.map +1 -0
- package/dist/trust/continuity.js +1216 -0
- package/dist/trust/continuity.js.map +1 -0
- package/dist/trust/duties.d.ts +67 -0
- package/dist/trust/duties.d.ts.map +1 -0
- package/dist/trust/duties.js +179 -0
- package/dist/trust/duties.js.map +1 -0
- package/dist/trust/entries.d.ts +139 -0
- package/dist/trust/entries.d.ts.map +1 -0
- package/dist/trust/entries.js +694 -0
- package/dist/trust/entries.js.map +1 -0
- package/dist/trust/group-star.d.ts +43 -0
- package/dist/trust/group-star.d.ts.map +1 -0
- package/dist/trust/group-star.js +188 -0
- package/dist/trust/group-star.js.map +1 -0
- package/dist/trust/mapping.d.ts +56 -0
- package/dist/trust/mapping.d.ts.map +1 -0
- package/dist/trust/mapping.js +584 -0
- package/dist/trust/mapping.js.map +1 -0
- package/dist/trust/profile.d.ts +25 -0
- package/dist/trust/profile.d.ts.map +1 -0
- package/dist/trust/profile.js +249 -0
- package/dist/trust/profile.js.map +1 -0
- package/dist/trust/star.d.ts +208 -0
- package/dist/trust/star.d.ts.map +1 -0
- package/dist/trust/star.js +588 -0
- package/dist/trust/star.js.map +1 -0
- package/dist/trust/state.d.ts +83 -0
- package/dist/trust/state.d.ts.map +1 -0
- package/dist/trust/state.js +154 -0
- package/dist/trust/state.js.map +1 -0
- package/dist/util-freeze.d.ts +3 -0
- package/dist/util-freeze.d.ts.map +1 -0
- package/dist/util-freeze.js +11 -0
- package/dist/util-freeze.js.map +1 -0
- package/dist/views.d.ts +147 -0
- package/dist/views.d.ts.map +1 -0
- package/dist/views.js +268 -0
- package/dist/views.js.map +1 -0
- package/dist/visibility.d.ts +5 -5
- package/dist/visibility.d.ts.map +1 -1
- package/dist/visibility.js +22 -28
- package/dist/visibility.js.map +1 -1
- package/dist/wire.d.ts +178 -84
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js.map +1 -1
- package/package.json +58 -11
- package/schemas/holder-state-v1.schema.json +3880 -0
- package/dist/holder.d.ts.map +0 -1
- package/dist/holder.js.map +0 -1
- package/dist/probe/acks.d.ts +0 -27
- package/dist/probe/acks.d.ts.map +0 -1
- package/dist/probe/acks.js +0 -152
- package/dist/probe/acks.js.map +0 -1
- package/dist/probe/continuity.d.ts +0 -20
- package/dist/probe/continuity.d.ts.map +0 -1
- package/dist/probe/continuity.js +0 -805
- package/dist/probe/continuity.js.map +0 -1
- package/dist/probe/deps.d.ts +0 -61
- package/dist/probe/deps.d.ts.map +0 -1
- package/dist/probe/deps.js +0 -54
- package/dist/probe/deps.js.map +0 -1
- package/dist/probe/encounter.d.ts +0 -26
- package/dist/probe/encounter.d.ts.map +0 -1
- package/dist/probe/encounter.js +0 -938
- package/dist/probe/encounter.js.map +0 -1
- package/dist/probe/introduce.d.ts +0 -70
- package/dist/probe/introduce.d.ts.map +0 -1
- package/dist/probe/introduce.js +0 -295
- package/dist/probe/introduce.js.map +0 -1
- package/dist/probe/membership.d.ts +0 -90
- package/dist/probe/membership.d.ts.map +0 -1
- package/dist/probe/membership.js +0 -450
- package/dist/probe/membership.js.map +0 -1
- package/dist/probe/trust.d.ts +0 -156
- package/dist/probe/trust.d.ts.map +0 -1
- package/dist/probe/trust.js +0 -1233
- package/dist/probe/trust.js.map +0 -1
- package/dist/probe.d.ts +0 -7
- package/dist/probe.d.ts.map +0 -1
- package/dist/probe.js +0 -42
- package/dist/probe.js.map +0 -1
package/dist/codec.js
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
// codec — the HolderState storage format (lib Stage 2, note §2.2).
|
|
2
|
+
//
|
|
3
|
+
// decodeState is the one way in: JSON purity, then the codec version, then
|
|
4
|
+
// the pure migration chain vN → vN+1, each step running between two states
|
|
5
|
+
// validated by their codec's own validator (hand-written; no schema engine
|
|
6
|
+
// in the published library). The validators check shape and a few local
|
|
7
|
+
// consistency rules; referential and domain invariants (active heads,
|
|
8
|
+
// register monotony, matching revisions) are the engine's (invariants.ts).
|
|
9
|
+
// An unknown or higher codec is refused, never read best-effort. Store
|
|
10
|
+
// adapters keep bytes or JSON and never migrate themselves. Wire
|
|
11
|
+
// versions and the codec are independent; a migration never re-issues
|
|
12
|
+
// stored documents, outbound or acks.
|
|
13
|
+
//
|
|
14
|
+
// Codec 1 is the format of 0.4.0: its golden fixtures are
|
|
15
|
+
// lib/test/fixtures/*.json (deterministic runs, test/fixtures/gen-state-v1.mjs),
|
|
16
|
+
// decoded and re-encoded byte-identically by test/codec-fixture.test.mjs.
|
|
17
|
+
// The rule: codec 1 is read; a newer codec is codec-newer; a codec without
|
|
18
|
+
// a validator is codec-unknown. Every later codec adds its validator, a
|
|
19
|
+
// migration from the one before, and its own fixture with a migration test.
|
|
20
|
+
import { jcs } from './core.js';
|
|
21
|
+
/** The codec this library writes. */
|
|
22
|
+
export const CODEC = 1;
|
|
23
|
+
/**
|
|
24
|
+
* Migrations keyed by the codec they read: MIGRATIONS[n] maps a valid
|
|
25
|
+
* codec-n state to a codec-(n+1) state. Pure, never async, never keys.
|
|
26
|
+
*/
|
|
27
|
+
export const MIGRATIONS = Object.freeze({});
|
|
28
|
+
/** A stored state the library will not load (or a state it will not write). */
|
|
29
|
+
export class StateCodecError extends Error {
|
|
30
|
+
code;
|
|
31
|
+
/** JSON path of the offending value, for 'shape' */
|
|
32
|
+
path;
|
|
33
|
+
constructor(code, message, path) {
|
|
34
|
+
super(path === undefined ? `${code}: ${message}` : `${code} at ${path}: ${message}`);
|
|
35
|
+
this.name = 'StateCodecError';
|
|
36
|
+
this.code = code;
|
|
37
|
+
if (path !== undefined)
|
|
38
|
+
this.path = path;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const fail = (path, msg) => { throw new StateCodecError('shape', msg, path); };
|
|
42
|
+
const isObj = (x) => x !== null && typeof x === 'object' && !Array.isArray(x);
|
|
43
|
+
const str = (x, p) => { if (typeof x !== 'string')
|
|
44
|
+
fail(p, 'string expected'); };
|
|
45
|
+
const bool = (x, p) => { if (typeof x !== 'boolean')
|
|
46
|
+
fail(p, 'boolean expected'); };
|
|
47
|
+
const json = () => { }; // JSON purity is checked once, up front
|
|
48
|
+
const dec = (x, p) => { if (typeof x !== 'string' || !/^(0|[1-9][0-9]{0,17})$/.test(x))
|
|
49
|
+
fail(p, 'canonical decimal string expected'); };
|
|
50
|
+
const millis = (x, p) => { if (!Number.isSafeInteger(x) || x < 0)
|
|
51
|
+
fail(p, 'non-negative integer milliseconds expected'); };
|
|
52
|
+
const natural = (x, p) => { if (!Number.isSafeInteger(x) || x < 0)
|
|
53
|
+
fail(p, 'non-negative integer expected'); };
|
|
54
|
+
const positive = (x, p) => { if (!Number.isSafeInteger(x) || x < 1)
|
|
55
|
+
fail(p, 'positive integer expected'); };
|
|
56
|
+
const lit = (...vals) => (x, p) => { if (!vals.includes(x))
|
|
57
|
+
fail(p, 'one of ' + vals.map((v) => JSON.stringify(v)).join(', ') + ' expected'); };
|
|
58
|
+
const nullable = (v) => (x, p) => { if (x !== null)
|
|
59
|
+
v(x, p); };
|
|
60
|
+
const arr = (v) => (x, p) => {
|
|
61
|
+
if (!Array.isArray(x))
|
|
62
|
+
fail(p, 'array expected');
|
|
63
|
+
x.forEach((e, i) => v(e, `${p}[${i}]`));
|
|
64
|
+
};
|
|
65
|
+
/** an array used as a set: no duplicates */
|
|
66
|
+
const set = (v) => (x, p) => {
|
|
67
|
+
arr(v)(x, p);
|
|
68
|
+
if (new Set(x.map((e) => jcs(e))).size !== x.length)
|
|
69
|
+
fail(p, 'duplicate set element');
|
|
70
|
+
};
|
|
71
|
+
const rec = (v) => (x, p) => {
|
|
72
|
+
if (!isObj(x))
|
|
73
|
+
fail(p, 'object expected');
|
|
74
|
+
for (const [k, e] of Object.entries(x))
|
|
75
|
+
v(e, `${p}.${k}`);
|
|
76
|
+
};
|
|
77
|
+
/** a closed object: required fields, optional fields, nothing else */
|
|
78
|
+
const obj = (req, opt = {}) => (x, p) => {
|
|
79
|
+
if (!isObj(x))
|
|
80
|
+
fail(p, 'object expected');
|
|
81
|
+
const o = x;
|
|
82
|
+
for (const k of Object.keys(req)) {
|
|
83
|
+
if (!Object.hasOwn(o, k))
|
|
84
|
+
fail(`${p}.${k}`, 'missing');
|
|
85
|
+
req[k](o[k], `${p}.${k}`);
|
|
86
|
+
}
|
|
87
|
+
for (const k of Object.keys(o)) {
|
|
88
|
+
if (Object.hasOwn(req, k))
|
|
89
|
+
continue;
|
|
90
|
+
if (!Object.hasOwn(opt, k))
|
|
91
|
+
fail(`${p}.${k}`, 'unknown field');
|
|
92
|
+
opt[k](o[k], `${p}.${k}`);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
/** a record whose values carry their own key in `idField` */
|
|
96
|
+
/** a JSON object, contents open */
|
|
97
|
+
const anyObj = (x, p) => { if (!isObj(x))
|
|
98
|
+
fail(p, 'object expected'); };
|
|
99
|
+
const keyed = (v, idField) => (x, p) => {
|
|
100
|
+
rec(v)(x, p);
|
|
101
|
+
for (const [k, e] of Object.entries(x))
|
|
102
|
+
if (e[idField] !== k)
|
|
103
|
+
fail(`${p}.${k}.${idField}`, 'must equal its key');
|
|
104
|
+
};
|
|
105
|
+
// ── the HolderState shape (state.ts) ───────────────────────────────────
|
|
106
|
+
const setting = lit('default', 'on', 'off');
|
|
107
|
+
const trustClass = lit('star', 'groupStar', 'anchorMapping', 'sealedGroupStar', 'profile');
|
|
108
|
+
const recipient = obj({ contactId: str, rkid: str, keyAgreement: str }, { anchor: str, via: str });
|
|
109
|
+
const envelope = obj({ rkid: str, epk: str, nonce: str, ciphertext: str });
|
|
110
|
+
const assembly = obj({ salt: dec, chunks: rec(json) });
|
|
111
|
+
const seqOutShape = (item) => obj({
|
|
112
|
+
lastSalt: dec, exhausted: bool, hwm: dec, snapshot: nullable(arr(item)), snapshotDigest: nullable(str),
|
|
113
|
+
inflight: rec(obj({ view: arr(item), viewDigest: str, digests: arr(str), acked: arr(str) })),
|
|
114
|
+
});
|
|
115
|
+
/** the snapshot and its digest are present together */
|
|
116
|
+
const seqOut = (item) => {
|
|
117
|
+
const shape = seqOutShape(item);
|
|
118
|
+
return (x, p) => {
|
|
119
|
+
shape(x, p);
|
|
120
|
+
const o = x;
|
|
121
|
+
if ((o.snapshot === null) !== (o.snapshotDigest === null))
|
|
122
|
+
fail(`${p}.snapshotDigest`, 'null exactly when snapshot is');
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
const seqIn = (accepted) => obj({ hwm: dec, lowerBound: dec, assembly: nullable(assembly), accepted: nullable(accepted) });
|
|
126
|
+
const starPair = obj({ member: str, head: str });
|
|
127
|
+
const groupStarItem = (x, p) => {
|
|
128
|
+
if (isObj(x) && x.mode === 'sealed')
|
|
129
|
+
return obj({ group: str, mode: str, member: str, memberOp: str })(x, p);
|
|
130
|
+
obj({ group: str, mode: lit('digest') })(x, p);
|
|
131
|
+
};
|
|
132
|
+
const starOut = seqOut(starPair);
|
|
133
|
+
const starIn = seqIn(obj({ salt: dec, blinded: arr(str), matches: arr(str) }));
|
|
134
|
+
const groupStarOut = seqOut(groupStarItem);
|
|
135
|
+
const groupStarIn = seqIn(obj({ salt: dec, entries: arr(obj({ d: str, c: str })), groups: arr(str) }));
|
|
136
|
+
const continuityDue = (x, p) => {
|
|
137
|
+
if (isObj(x) && x.kind === 'choice')
|
|
138
|
+
return obj({ kind: str, prior: str, alts: arr(str) })(x, p);
|
|
139
|
+
obj({ kind: lit('report', 'align'), prior: str })(x, p);
|
|
140
|
+
};
|
|
141
|
+
const logHead = (x, p) => {
|
|
142
|
+
if (isObj(x) && Object.hasOwn(x, 'empty'))
|
|
143
|
+
return obj({ genesis: str, empty: lit(true) })(x, p);
|
|
144
|
+
obj({ genesis: str, entryId: str, gen: positive, next: str, commit: str })(x, p);
|
|
145
|
+
};
|
|
146
|
+
const tuple = obj({
|
|
147
|
+
ownPairLabel: str, counterpartAnchor: str, counterpartKeyAgreement: str, rkid: str, entryId: str,
|
|
148
|
+
priorCandidates: arr(obj({ ownPairLabel: str, counterpartAnchor: str }, { replaces: arr(str) })),
|
|
149
|
+
starOut, starIn, groupStarOut, groupStarIn,
|
|
150
|
+
probeOut: obj({ seq: dec, inflight: rec(obj({ digests: arr(str), acked: arr(str) })), done: bool }),
|
|
151
|
+
probeIn: obj({ hwm: dec, lowerBound: dec, assembly: nullable(assembly) }),
|
|
152
|
+
continuityOut: obj({ rev: dec, body: json, proof: json, sent: arr(str), align: bool, chosen: nullable(str), reported: nullable(str), aligned: bool, due: nullable(continuityDue) }),
|
|
153
|
+
continuityIn: obj({ rev: dec, body: json, recordPrior: nullable(str) }),
|
|
154
|
+
mappingOut: obj({ rev: dec, body: json, underAnchor: nullable(str) }),
|
|
155
|
+
mappingIn: obj({ rev: dec, body: json, self: nullable(str), card: json }),
|
|
156
|
+
profileOut: obj({ rev: dec }),
|
|
157
|
+
profileIn: obj({ rev: dec, body: json, verifiedSeq: dec }),
|
|
158
|
+
deactivated: bool,
|
|
159
|
+
});
|
|
160
|
+
const relationship = obj({
|
|
161
|
+
id: str, contactId: str, tuples: arr(tuple), activeHead: str, earliestAnchor: nullable(str),
|
|
162
|
+
links: arr(obj({ prev: str, next: str })), bindings: rec(set(str)), heldCounterpartHead: nullable(str),
|
|
163
|
+
memory: rec(json), provenance: obj({ kind: lit('ceremony', 'introduced'), at: millis }, { via: str, viaPin: str }),
|
|
164
|
+
chainedInto: nullable(str), firstVerified: nullable(dec),
|
|
165
|
+
});
|
|
166
|
+
const contact = obj({
|
|
167
|
+
id: str, pos: nullable(dec), status: lit('none', 'admitted', 'pending'), aliases: set(str), relIds: set(str),
|
|
168
|
+
anchorHead: nullable(str),
|
|
169
|
+
settings: obj({ star: setting, groupStar: setting, anchorMapping: setting, sealedGroupStar: setting, profile: setting }),
|
|
170
|
+
groupSettings: rec(setting),
|
|
171
|
+
});
|
|
172
|
+
const outboxStep = (x, p) => {
|
|
173
|
+
if (!isObj(x))
|
|
174
|
+
fail(p, 'object expected');
|
|
175
|
+
const s = x;
|
|
176
|
+
switch (s.status) {
|
|
177
|
+
case 'submitted': return obj({ status: str, at: millis, attempt: positive })(x, p);
|
|
178
|
+
case 'awaiting-transport': return obj({ status: str, at: millis, reason: lit('offline', 'transport-unreachable', 'carrier-refused-retriable') })(x, p);
|
|
179
|
+
case 'accepted': return obj({ status: str, at: millis })(x, p);
|
|
180
|
+
case 'delivered': return obj({ status: str, at: millis, late: bool })(x, p);
|
|
181
|
+
case 'failed': return s.reason === 'rejected-by-receiver'
|
|
182
|
+
? obj({ status: str, at: millis, reason: str, code: lit('malformedRequest', 'unsupportedType', 'proofRequired', 'proofInvalid', 'wrongRecipient', 'identityMismatch') })(x, p)
|
|
183
|
+
: obj({ status: str, at: millis, reason: lit('unroutable', 'oversize', 'expired-by-adapter-policy') })(x, p);
|
|
184
|
+
default: fail(`${p}.status`, 'unknown outbox status');
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const outboxShape = obj({
|
|
188
|
+
type: str, threadId: str, recipient, envelope, attempt: positive, history: arr(outboxStep),
|
|
189
|
+
}, { nextAttemptAt: millis });
|
|
190
|
+
/** the envelope is sealed to the counterpart key, never to the own rkid */
|
|
191
|
+
const outboxItem = (x, p) => {
|
|
192
|
+
outboxShape(x, p);
|
|
193
|
+
const o = x;
|
|
194
|
+
if (o.envelope.rkid !== o.recipient.keyAgreement)
|
|
195
|
+
fail(`${p}.envelope.rkid`, 'must equal recipient.keyAgreement');
|
|
196
|
+
};
|
|
197
|
+
const DUE = { dueAt: millis };
|
|
198
|
+
/** a retained ack: sealed to the counterpart key, like an outbox item */
|
|
199
|
+
const storedAck = (x, p) => {
|
|
200
|
+
obj({ digest: str, envelope, threadId: str, recipient, at: millis, attempt: positive, sent: bool }, { nextAttemptAt: millis, sentBy: lit('report', 'horizon') })(x, p);
|
|
201
|
+
const a = x;
|
|
202
|
+
if (a.envelope.rkid !== a.recipient.keyAgreement)
|
|
203
|
+
fail(`${p}.envelope.rkid`, 'must equal recipient.keyAgreement');
|
|
204
|
+
};
|
|
205
|
+
const KNOWN_DUTIES = {
|
|
206
|
+
'reissue-mapping': { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, awaitHead: nullable(str) }, DUE) },
|
|
207
|
+
'class-on': { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, cls: trustClass }, DUE) },
|
|
208
|
+
profile: { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, rev: dec }, DUE) },
|
|
209
|
+
continuity: { v: 1, shape: obj({ kind: str, v: positive, id: str, relId: str, tuple: str, step: lit('probe', 'mapping') }, { ...DUE, attempt: natural, lastAt: millis }) },
|
|
210
|
+
merge: { v: 1, shape: obj({ kind: str, v: positive, id: str, entryIds: set(str), relId: str, witness: obj({ heads: rec(str), superseded: rec(set(str)) }) }, DUE) },
|
|
211
|
+
rotation: { v: 1, shape: obj({ kind: str, v: positive, id: str, rotationId: str }, { ...DUE, attempt: natural, lastAt: millis }) },
|
|
212
|
+
'intro-ack': { v: 1, shape: obj({ kind: str, v: positive, id: str, act: str }, DUE) },
|
|
213
|
+
};
|
|
214
|
+
/** Is this a duty kind and version this library handles? Unknown ones are kept as they are. */
|
|
215
|
+
export const isKnownDuty = (d) => Object.hasOwn(KNOWN_DUTIES, d.kind) && KNOWN_DUTIES[d.kind].v === d.v;
|
|
216
|
+
const duty = (x, p) => {
|
|
217
|
+
if (!isObj(x))
|
|
218
|
+
fail(p, 'object expected');
|
|
219
|
+
const d = x;
|
|
220
|
+
str(d.kind, `${p}.kind`);
|
|
221
|
+
natural(d.v, `${p}.v`);
|
|
222
|
+
str(d.id, `${p}.id`);
|
|
223
|
+
if (isKnownDuty(d))
|
|
224
|
+
KNOWN_DUTIES[d.kind].shape(x, p);
|
|
225
|
+
};
|
|
226
|
+
const EVENT_FIELDS = {
|
|
227
|
+
'contact.added': [{ contactId: str }],
|
|
228
|
+
'contact.verified': [{ contactId: str, relationshipId: str }],
|
|
229
|
+
'contact.chained': [{ contactId: str, from: str, into: str }],
|
|
230
|
+
'contact.merged': [{ contactId: str, merged: arr(str) }],
|
|
231
|
+
'contact.split': [{ contactId: str, leaver: str, relationshipId: str }],
|
|
232
|
+
'contact.departed': [{ contactId: str, relationshipIds: arr(str), removed: bool }],
|
|
233
|
+
'trust.given': [{ contactId: str }],
|
|
234
|
+
'trust.received': [{ contactId: str }],
|
|
235
|
+
'trust.paused': [{ contactId: str, paused: bool }],
|
|
236
|
+
'group.joined': [{ groupId: str }],
|
|
237
|
+
'prompt.opened': [{ promptId: str, kind: lit('encounter-confirm', 'group-invite', 'introduction') }],
|
|
238
|
+
'prompt.decided': [{ promptId: str, kind: lit('encounter-confirm', 'group-invite', 'introduction'), choice: lit('accept', 'decline') }],
|
|
239
|
+
'delivery.status': [{ digest: str, threadId: str, status: lit('submitted', 'accepted', 'delivered', 'failed') }, { late: bool }],
|
|
240
|
+
'profile.updated': [{ contactId: nullable(str) }],
|
|
241
|
+
'anchor.rotated': [{ generation: dec }],
|
|
242
|
+
'device.added': [{ name: str }],
|
|
243
|
+
'device.revoked': [{ name: str }],
|
|
244
|
+
'duty.unsupported': [{ dutyId: str, kind: str, v: natural }],
|
|
245
|
+
'star.accepted': [{ contactId: str, relationshipId: str, salt: dec }],
|
|
246
|
+
'groupStar.accepted': [{ contactId: str, relationshipId: str, salt: dec }],
|
|
247
|
+
'encounter.shown': [{ challenge: str, card: anyObj }],
|
|
248
|
+
'encounter.scanned': [{ contactId: str, card: anyObj }],
|
|
249
|
+
'encounter.recorded': [{ contactId: str, relationshipId: str, role: lit('scanner', 'displayer') }],
|
|
250
|
+
'encounter.accepted': [{ contactId: str, relationshipId: str, mutual: bool }],
|
|
251
|
+
'group.founded': [{ groupId: str }],
|
|
252
|
+
'group.admitted': [{ groupId: str, member: str }],
|
|
253
|
+
'group.vouched': [{ groupId: str, member: str }],
|
|
254
|
+
};
|
|
255
|
+
const event = (x, p) => {
|
|
256
|
+
if (!isObj(x))
|
|
257
|
+
fail(p, 'object expected');
|
|
258
|
+
const t = x.type;
|
|
259
|
+
if (typeof t !== 'string' || !Object.hasOwn(EVENT_FIELDS, t))
|
|
260
|
+
fail(`${p}.type`, 'unknown event type');
|
|
261
|
+
const [req, opt = {}] = EVENT_FIELDS[t];
|
|
262
|
+
obj({ type: str, eventId: str, commitSeq: dec, ...req }, { actId: str, ...opt })(x, p);
|
|
263
|
+
};
|
|
264
|
+
const rosterEntry = obj({ anchor: str, op: str, keyAgreement: str, addedAt: millis }, { name: str, contactId: str, rkid: str });
|
|
265
|
+
const openInvitation = obj({ invitee: str, keyAgreement: str, contactId: str, rkid: str, threadId: str, credDigest: str, invite: anyObj, validUntil: millis });
|
|
266
|
+
const evidence = obj({ invite: anyObj, accept: anyObj, vouches: arr(anyObj), at: millis });
|
|
267
|
+
const groupShape = obj({
|
|
268
|
+
id: str, name: str, memberLabel: str, rules: obj({ vouchThreshold: dec }), listed: bool,
|
|
269
|
+
roster: keyed(rosterEntry, 'anchor'), invitations: keyed(openInvitation, 'threadId'), evidence: rec(evidence),
|
|
270
|
+
preludes: rec(obj({ contactId: str, rkid: str, at: millis })),
|
|
271
|
+
}, { did: str, genesis: anyObj, memberAnchor: str, memberOp: str, acceptDigest: str });
|
|
272
|
+
/** a listed group carries its member anchor and memberOp: the group star
|
|
273
|
+
* seals them (Trust 5400, 5430), and their absence is no filler condition */
|
|
274
|
+
const group = (x, p) => {
|
|
275
|
+
groupShape(x, p);
|
|
276
|
+
const g = x;
|
|
277
|
+
if (g.listed && g.memberAnchor === undefined)
|
|
278
|
+
fail(`${p}.memberAnchor`, 'missing on a listed group');
|
|
279
|
+
if (g.listed && g.memberOp === undefined)
|
|
280
|
+
fail(`${p}.memberOp`, 'missing on a listed group');
|
|
281
|
+
};
|
|
282
|
+
const heldCredential = obj({ digest: str, credential: anyObj });
|
|
283
|
+
const enactmentRecord = obj({
|
|
284
|
+
ceremony: str, own: str, tCh: millis, peer: str, counterpart: str, card: anyObj, bind: str, at: millis, label: str, relId: str,
|
|
285
|
+
role: lit('scanner', 'displayer'), out: nullable(heldCredential), in: nullable(heldCredential),
|
|
286
|
+
thread: nullable(str), bundleDigest: nullable(str), threads: rec(str), sentCard: nullable(anyObj), counterPending: bool,
|
|
287
|
+
});
|
|
288
|
+
const introAct = obj({
|
|
289
|
+
key: str, act: str, role: lit('requester', 'mediator', 'target'),
|
|
290
|
+
status: lit('sent', 'acked', 'completed', 'failed', 'received', 'forwarded', 'consented', 'refused'),
|
|
291
|
+
issuedAt: millis, request: anyObj, requestCard: anyObj, reply: nullable(anyObj), replyCard: nullable(anyObj),
|
|
292
|
+
pins: obj({}, { requester: str, target: str, mediator: str }), threads: obj({ request: str }, { forward: str }),
|
|
293
|
+
at: millis, ackDelayMs: natural, ownLabel: nullable(str), ack: nullable(anyObj), replyForwarded: bool, vouchersSent: bool,
|
|
294
|
+
pendingVoucher: nullable(anyObj), voucher: nullable(anyObj), vouched: bool, promptId: nullable(str),
|
|
295
|
+
}, { peerName: str });
|
|
296
|
+
const codec1 = obj({
|
|
297
|
+
codec: lit(1),
|
|
298
|
+
commitSeq: dec,
|
|
299
|
+
lastWhen: millis,
|
|
300
|
+
register: obj({
|
|
301
|
+
labels: set(str), pairNonces: rec(str),
|
|
302
|
+
carriers: rec(arr(obj({ nonce: str, generation: dec }))),
|
|
303
|
+
devices: obj({ names: set(str), revoked: set(str) }),
|
|
304
|
+
community: nullable(obj({ genesis: str, head: dec })),
|
|
305
|
+
lineage: arr(anyObj),
|
|
306
|
+
}),
|
|
307
|
+
addresses: obj({ keys: rec(obj({ label: str, lastShown: millis }, { retiredAt: millis })), tombstones: set(str) }),
|
|
308
|
+
contacts: keyed(contact, 'id'),
|
|
309
|
+
relationships: keyed(relationship, 'id'),
|
|
310
|
+
entryOrder: obj({ nextPos: dec, heads: set(str) }),
|
|
311
|
+
groups: keyed(group, 'id'),
|
|
312
|
+
profile: obj({ body: json, revision: dec }),
|
|
313
|
+
effects: rec(obj({ ack: nullable(storedAck), expiresAt: millis })),
|
|
314
|
+
outbox: rec(outboxItem),
|
|
315
|
+
duties: keyed(duty, 'id'),
|
|
316
|
+
rotations: keyed(obj({
|
|
317
|
+
id: str, from: dec, to: dec, step: lit('register', 'log', 'duties'), startedAt: millis,
|
|
318
|
+
entry: json, overHead: logHead, awaitHead: rec(nullable(str)),
|
|
319
|
+
}), 'id'),
|
|
320
|
+
prompts: keyed(obj({ id: str, kind: lit('encounter-confirm', 'group-invite', 'introduction'), openedAt: millis }, { contactId: str, groupId: str, expiresAt: millis }), 'id'),
|
|
321
|
+
acts: keyed(obj({ actId: str, inputHash: str, commitSeq: dec, outboundDigests: arr(str), events: arr(event), at: millis }), 'actId'),
|
|
322
|
+
encounter: obj({
|
|
323
|
+
challenges: keyed(obj({ value: str, tCh: millis, label: str, card: anyObj }), 'value'),
|
|
324
|
+
records: keyed(enactmentRecord, 'own'),
|
|
325
|
+
introductions: keyed(introAct, 'key'),
|
|
326
|
+
offers: keyed(obj({ id: str, mediatorContactId: str, pin: str, target: str, at: millis }, { label: str }), 'id'),
|
|
327
|
+
designators: rec(str),
|
|
328
|
+
declarations: rec(obj({ issuer: str, role: str, revision: dec, constants: rec(str), at: millis })),
|
|
329
|
+
}),
|
|
330
|
+
joining: obj({
|
|
331
|
+
preludes: rec(obj({ group: str, inviter: str, contactId: str, rkid: str, memberLabel: str, at: millis })),
|
|
332
|
+
invites: keyed(obj({
|
|
333
|
+
credDigest: str, group: str, name: str, contactId: str, rkid: str, memberLabel: str, invite: anyObj, promptId: str, validUntil: millis,
|
|
334
|
+
status: lit('open', 'accepted', 'declined', 'joined'), at: millis,
|
|
335
|
+
}, { acceptDigest: str }), 'credDigest'),
|
|
336
|
+
}),
|
|
337
|
+
});
|
|
338
|
+
/** Structural validators per codec version; every readable codec has one. */
|
|
339
|
+
export const VALIDATORS = Object.freeze({
|
|
340
|
+
1: (raw) => codec1(raw, '$'),
|
|
341
|
+
});
|
|
342
|
+
// ── the codec ──────────────────────────────────────────────────────────
|
|
343
|
+
/** Canonical JSON text of a JSON-pure value, or not-json. */
|
|
344
|
+
const canonical = (x) => {
|
|
345
|
+
try {
|
|
346
|
+
return jcs(x);
|
|
347
|
+
}
|
|
348
|
+
catch (e) {
|
|
349
|
+
throw new StateCodecError('not-json', e.message);
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
const validatorOf = (chain, c) => {
|
|
353
|
+
const v = chain.validators[c];
|
|
354
|
+
if (!v)
|
|
355
|
+
throw new StateCodecError('codec-unknown', `no validator for codec ${c}`);
|
|
356
|
+
return v;
|
|
357
|
+
};
|
|
358
|
+
/**
|
|
359
|
+
* Decode under an explicit chain: JSON purity, codec gate, then
|
|
360
|
+
* validate(c) → migrate(c) → validate(c+1) … up to chain.codec. Returns
|
|
361
|
+
* an independent copy. decodeState is this function over the library's
|
|
362
|
+
* own chain; tests drive it with fake chains.
|
|
363
|
+
*/
|
|
364
|
+
export function decodeChain(raw, chain) {
|
|
365
|
+
let x = raw;
|
|
366
|
+
if (typeof raw === 'string') {
|
|
367
|
+
try {
|
|
368
|
+
x = JSON.parse(raw);
|
|
369
|
+
}
|
|
370
|
+
catch (e) {
|
|
371
|
+
throw new StateCodecError('not-json', e.message);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
let s = JSON.parse(canonical(x));
|
|
375
|
+
if (!isObj(s))
|
|
376
|
+
fail('$', 'object expected');
|
|
377
|
+
const at = s.codec;
|
|
378
|
+
if (!Number.isSafeInteger(at) || at < 0)
|
|
379
|
+
throw new StateCodecError('codec-unknown', 'codec must be a non-negative integer');
|
|
380
|
+
if (at > chain.codec)
|
|
381
|
+
throw new StateCodecError('codec-newer', `codec ${at} is newer than ${chain.codec}`);
|
|
382
|
+
validatorOf(chain, at)(s);
|
|
383
|
+
for (let c = at; c < chain.codec; c++) {
|
|
384
|
+
const up = chain.migrations[c];
|
|
385
|
+
if (!up)
|
|
386
|
+
throw new StateCodecError('codec-unknown', `no migration from codec ${c}`);
|
|
387
|
+
s = JSON.parse(canonical(up(JSON.parse(canonical(s)))));
|
|
388
|
+
if (!isObj(s) || s.codec !== c + 1)
|
|
389
|
+
fail('$.codec', `migration ${c} must produce codec ${c + 1}`);
|
|
390
|
+
validatorOf(chain, c + 1)(s);
|
|
391
|
+
}
|
|
392
|
+
return s;
|
|
393
|
+
}
|
|
394
|
+
const LIBRARY_CHAIN = { codec: CODEC, migrations: MIGRATIONS, validators: VALIDATORS };
|
|
395
|
+
/**
|
|
396
|
+
* Load a stored state: a JSON string or an already parsed value. Returns
|
|
397
|
+
* an independent copy at the current codec, or throws StateCodecError.
|
|
398
|
+
*/
|
|
399
|
+
export function decodeState(raw) {
|
|
400
|
+
return decodeChain(raw, LIBRARY_CHAIN);
|
|
401
|
+
}
|
|
402
|
+
/** Serialize a state for storage: canonical JSON, validated first. */
|
|
403
|
+
export function encodeState(state) {
|
|
404
|
+
const text = canonical(state);
|
|
405
|
+
validatorOf(LIBRARY_CHAIN, CODEC)(JSON.parse(text));
|
|
406
|
+
return text;
|
|
407
|
+
}
|
|
408
|
+
/** Deterministic equality of two states (their JCS forms). */
|
|
409
|
+
export const sameState = (a, b) => jcs(a) === jcs(b);
|
|
410
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"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","sourcesContent":["// codec — the HolderState storage format (lib Stage 2, note §2.2).\n//\n// decodeState is the one way in: JSON purity, then the codec version, then\n// the pure migration chain vN → vN+1, each step running between two states\n// validated by their codec's own validator (hand-written; no schema engine\n// in the published library). The validators check shape and a few local\n// consistency rules; referential and domain invariants (active heads,\n// register monotony, matching revisions) are the engine's (invariants.ts).\n// An unknown or higher codec is refused, never read best-effort. Store\n// adapters keep bytes or JSON and never migrate themselves. Wire\n// versions and the codec are independent; a migration never re-issues\n// stored documents, outbound or acks.\n//\n// Codec 1 is the format of 0.4.0: its golden fixtures are\n// lib/test/fixtures/*.json (deterministic runs, test/fixtures/gen-state-v1.mjs),\n// decoded and re-encoded byte-identically by test/codec-fixture.test.mjs.\n// The rule: codec 1 is read; a newer codec is codec-newer; a codec without\n// a validator is codec-unknown. Every later codec adds its validator, a\n// migration from the one before, and its own fixture with a migration test.\nimport { jcs } from './core.js'\nimport type { Duty, HolderState, KnownDuty } from './state.js'\nimport type { HolderEventType } from './events.js'\n\n/** The codec this library writes. */\nexport const CODEC = 1\n\n/**\n * Migrations keyed by the codec they read: MIGRATIONS[n] maps a valid\n * codec-n state to a codec-(n+1) state. Pure, never async, never keys.\n */\nexport const MIGRATIONS: Readonly<Record<number, (state: any) => any>> = Object.freeze({})\n\n/** A codec's structural validator: throws StateCodecError('shape') or returns. */\nexport type StateValidator = (raw: unknown) => void\n\n/** One codec chain: the target codec, its migrations and a validator for\n * every codec from the oldest readable one up to the target. */\nexport interface CodecChain {\n codec: number\n migrations: Readonly<Record<number, (state: any) => any>>\n validators: Readonly<Record<number, StateValidator>>\n}\n\nexport type StateCodecErrorCode = 'not-json' | 'codec-unknown' | 'codec-newer' | 'shape'\n\n/** A stored state the library will not load (or a state it will not write). */\nexport class StateCodecError extends Error {\n readonly code: StateCodecErrorCode\n /** JSON path of the offending value, for 'shape' */\n readonly path?: string\n constructor (code: StateCodecErrorCode, message: string, path?: string) {\n super(path === undefined ? `${code}: ${message}` : `${code} at ${path}: ${message}`)\n this.name = 'StateCodecError'\n this.code = code\n if (path !== undefined) this.path = path\n }\n}\n\n// ── the validator kit ──────────────────────────────────────────────────\ntype V = (x: unknown, path: string) => void\n\nconst fail = (path: string, msg: string): never => { throw new StateCodecError('shape', msg, path) }\nconst isObj = (x: unknown): x is Record<string, unknown> => x !== null && typeof x === 'object' && !Array.isArray(x)\n\nconst str: V = (x, p) => { if (typeof x !== 'string') fail(p, 'string expected') }\nconst bool: V = (x, p) => { if (typeof x !== 'boolean') fail(p, 'boolean expected') }\nconst json: V = () => {} // JSON purity is checked once, up front\nconst dec: V = (x, p) => { if (typeof x !== 'string' || !/^(0|[1-9][0-9]{0,17})$/.test(x)) fail(p, 'canonical decimal string expected') }\nconst millis: V = (x, p) => { if (!Number.isSafeInteger(x) || (x as number) < 0) fail(p, 'non-negative integer milliseconds expected') }\nconst natural: V = (x, p) => { if (!Number.isSafeInteger(x) || (x as number) < 0) fail(p, 'non-negative integer expected') }\nconst positive: V = (x, p) => { if (!Number.isSafeInteger(x) || (x as number) < 1) fail(p, 'positive integer expected') }\nconst lit = (...vals: unknown[]): V => (x, p) => { if (!vals.includes(x)) fail(p, 'one of ' + vals.map((v) => JSON.stringify(v)).join(', ') + ' expected') }\nconst nullable = (v: V): V => (x, p) => { if (x !== null) v(x, p) }\nconst arr = (v: V): V => (x, p) => {\n if (!Array.isArray(x)) fail(p, 'array expected')\n ;(x as unknown[]).forEach((e, i) => v(e, `${p}[${i}]`))\n}\n/** an array used as a set: no duplicates */\nconst set = (v: V): V => (x, p) => {\n arr(v)(x, p)\n if (new Set((x as unknown[]).map((e) => jcs(e))).size !== (x as unknown[]).length) fail(p, 'duplicate set element')\n}\nconst rec = (v: V): V => (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n for (const [k, e] of Object.entries(x as Record<string, unknown>)) v(e, `${p}.${k}`)\n}\n/** a closed object: required fields, optional fields, nothing else */\nconst obj = (req: Record<string, V>, opt: Record<string, V> = {}): V => (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n const o = x as Record<string, unknown>\n for (const k of Object.keys(req)) {\n if (!Object.hasOwn(o, k)) fail(`${p}.${k}`, 'missing')\n req[k](o[k], `${p}.${k}`)\n }\n for (const k of Object.keys(o)) {\n if (Object.hasOwn(req, k)) continue\n if (!Object.hasOwn(opt, k)) fail(`${p}.${k}`, 'unknown field')\n opt[k](o[k], `${p}.${k}`)\n }\n}\n/** a record whose values carry their own key in `idField` */\n/** a JSON object, contents open */\nconst anyObj: V = (x, p) => { if (!isObj(x)) fail(p, 'object expected') }\nconst keyed = (v: V, idField: string): V => (x, p) => {\n rec(v)(x, p)\n for (const [k, e] of Object.entries(x as Record<string, Record<string, unknown>>)) if (e[idField] !== k) fail(`${p}.${k}.${idField}`, 'must equal its key')\n}\n\n// ── the HolderState shape (state.ts) ───────────────────────────────────\nconst setting = lit('default', 'on', 'off')\nconst trustClass = lit('star', 'groupStar', 'anchorMapping', 'sealedGroupStar', 'profile')\nconst recipient = obj({ contactId: str, rkid: str, keyAgreement: str }, { anchor: str, via: str })\nconst envelope = obj({ rkid: str, epk: str, nonce: str, ciphertext: str })\nconst assembly = obj({ salt: dec, chunks: rec(json) })\nconst seqOutShape = (item: V): V => obj({\n lastSalt: dec, exhausted: bool, hwm: dec, snapshot: nullable(arr(item)), snapshotDigest: nullable(str),\n inflight: rec(obj({ view: arr(item), viewDigest: str, digests: arr(str), acked: arr(str) })),\n})\n/** the snapshot and its digest are present together */\nconst seqOut = (item: V): V => {\n const shape = seqOutShape(item)\n return (x, p) => {\n shape(x, p)\n const o = x as { snapshot: unknown, snapshotDigest: unknown }\n if ((o.snapshot === null) !== (o.snapshotDigest === null)) fail(`${p}.snapshotDigest`, 'null exactly when snapshot is')\n }\n}\nconst seqIn = (accepted: V): V => obj({ hwm: dec, lowerBound: dec, assembly: nullable(assembly), accepted: nullable(accepted) })\nconst starPair = obj({ member: str, head: str })\nconst groupStarItem: V = (x, p) => {\n if (isObj(x) && x.mode === 'sealed') return obj({ group: str, mode: str, member: str, memberOp: str })(x, p)\n obj({ group: str, mode: lit('digest') })(x, p)\n}\nconst starOut = seqOut(starPair)\nconst starIn = seqIn(obj({ salt: dec, blinded: arr(str), matches: arr(str) }))\nconst groupStarOut = seqOut(groupStarItem)\nconst groupStarIn = seqIn(obj({ salt: dec, entries: arr(obj({ d: str, c: str })), groups: arr(str) }))\nconst continuityDue: V = (x, p) => {\n if (isObj(x) && x.kind === 'choice') return obj({ kind: str, prior: str, alts: arr(str) })(x, p)\n obj({ kind: lit('report', 'align'), prior: str })(x, p)\n}\nconst logHead: V = (x, p) => {\n if (isObj(x) && Object.hasOwn(x, 'empty')) return obj({ genesis: str, empty: lit(true) })(x, p)\n obj({ genesis: str, entryId: str, gen: positive, next: str, commit: str })(x, p)\n}\n\nconst tuple = obj({\n ownPairLabel: str, counterpartAnchor: str, counterpartKeyAgreement: str, rkid: str, entryId: str,\n priorCandidates: arr(obj({ ownPairLabel: str, counterpartAnchor: str }, { replaces: arr(str) })),\n starOut, starIn, groupStarOut, groupStarIn,\n probeOut: obj({ seq: dec, inflight: rec(obj({ digests: arr(str), acked: arr(str) })), done: bool }),\n probeIn: obj({ hwm: dec, lowerBound: dec, assembly: nullable(assembly) }),\n continuityOut: obj({ rev: dec, body: json, proof: json, sent: arr(str), align: bool, chosen: nullable(str), reported: nullable(str), aligned: bool, due: nullable(continuityDue) }),\n continuityIn: obj({ rev: dec, body: json, recordPrior: nullable(str) }),\n mappingOut: obj({ rev: dec, body: json, underAnchor: nullable(str) }),\n mappingIn: obj({ rev: dec, body: json, self: nullable(str), card: json }),\n profileOut: obj({ rev: dec }),\n profileIn: obj({ rev: dec, body: json, verifiedSeq: dec }),\n deactivated: bool,\n})\n\nconst relationship = obj({\n id: str, contactId: str, tuples: arr(tuple), activeHead: str, earliestAnchor: nullable(str),\n links: arr(obj({ prev: str, next: str })), bindings: rec(set(str)), heldCounterpartHead: nullable(str),\n memory: rec(json), provenance: obj({ kind: lit('ceremony', 'introduced'), at: millis }, { via: str, viaPin: str }),\n chainedInto: nullable(str), firstVerified: nullable(dec),\n})\n\nconst contact = obj({\n id: str, pos: nullable(dec), status: lit('none', 'admitted', 'pending'), aliases: set(str), relIds: set(str),\n anchorHead: nullable(str),\n settings: obj({ star: setting, groupStar: setting, anchorMapping: setting, sealedGroupStar: setting, profile: setting }),\n groupSettings: rec(setting),\n})\n\nconst outboxStep: V = (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n const s = x as Record<string, unknown>\n switch (s.status) {\n case 'submitted': return obj({ status: str, at: millis, attempt: positive })(x, p)\n case 'awaiting-transport': return obj({ status: str, at: millis, reason: lit('offline', 'transport-unreachable', 'carrier-refused-retriable') })(x, p)\n case 'accepted': return obj({ status: str, at: millis })(x, p)\n case 'delivered': return obj({ status: str, at: millis, late: bool })(x, p)\n case 'failed': return s.reason === 'rejected-by-receiver'\n ? obj({ status: str, at: millis, reason: str, code: lit('malformedRequest', 'unsupportedType', 'proofRequired', 'proofInvalid', 'wrongRecipient', 'identityMismatch') })(x, p)\n : obj({ status: str, at: millis, reason: lit('unroutable', 'oversize', 'expired-by-adapter-policy') })(x, p)\n default: fail(`${p}.status`, 'unknown outbox status')\n }\n}\n\nconst outboxShape = obj({\n type: str, threadId: str, recipient, envelope, attempt: positive, history: arr(outboxStep),\n}, { nextAttemptAt: millis })\n/** the envelope is sealed to the counterpart key, never to the own rkid */\nconst outboxItem: V = (x, p) => {\n outboxShape(x, p)\n const o = x as { recipient: { keyAgreement: string }, envelope: { rkid: string } }\n if (o.envelope.rkid !== o.recipient.keyAgreement) fail(`${p}.envelope.rkid`, 'must equal recipient.keyAgreement')\n}\n\nconst DUE = { dueAt: millis }\n/** a retained ack: sealed to the counterpart key, like an outbox item */\nconst storedAck: V = (x, p) => {\n obj({ digest: str, envelope, threadId: str, recipient, at: millis, attempt: positive, sent: bool }, { nextAttemptAt: millis, sentBy: lit('report', 'horizon') })(x, p)\n const a = x as { recipient: { keyAgreement: string }, envelope: { rkid: string } }\n if (a.envelope.rkid !== a.recipient.keyAgreement) fail(`${p}.envelope.rkid`, 'must equal recipient.keyAgreement')\n}\n\nconst KNOWN_DUTIES: Record<KnownDuty['kind'], { v: number, shape: V }> = {\n 'reissue-mapping': { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, awaitHead: nullable(str) }, DUE) },\n 'class-on': { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, cls: trustClass }, DUE) },\n profile: { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, rev: dec }, DUE) },\n continuity: { v: 1, shape: obj({ kind: str, v: positive, id: str, relId: str, tuple: str, step: lit('probe', 'mapping') }, { ...DUE, attempt: natural, lastAt: millis }) },\n merge: { v: 1, shape: obj({ kind: str, v: positive, id: str, entryIds: set(str), relId: str, witness: obj({ heads: rec(str), superseded: rec(set(str)) }) }, DUE) },\n rotation: { v: 1, shape: obj({ kind: str, v: positive, id: str, rotationId: str }, { ...DUE, attempt: natural, lastAt: millis }) },\n 'intro-ack': { v: 1, shape: obj({ kind: str, v: positive, id: str, act: str }, DUE) },\n}\n\n/** Is this a duty kind and version this library handles? Unknown ones are kept as they are. */\nexport const isKnownDuty = (d: Duty): d is KnownDuty =>\n Object.hasOwn(KNOWN_DUTIES, d.kind) && KNOWN_DUTIES[d.kind as KnownDuty['kind']].v === d.v\n\nconst duty: V = (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n const d = x as Record<string, unknown>\n str(d.kind, `${p}.kind`); natural(d.v, `${p}.v`); str(d.id, `${p}.id`)\n if (isKnownDuty(d as unknown as Duty)) KNOWN_DUTIES[d.kind as KnownDuty['kind']].shape(x, p)\n}\n\nconst EVENT_FIELDS: Record<HolderEventType, [Record<string, V>, Record<string, V>?]> = {\n 'contact.added': [{ contactId: str }],\n 'contact.verified': [{ contactId: str, relationshipId: str }],\n 'contact.chained': [{ contactId: str, from: str, into: str }],\n 'contact.merged': [{ contactId: str, merged: arr(str) }],\n 'contact.split': [{ contactId: str, leaver: str, relationshipId: str }],\n 'contact.departed': [{ contactId: str, relationshipIds: arr(str), removed: bool }],\n 'trust.given': [{ contactId: str }],\n 'trust.received': [{ contactId: str }],\n 'trust.paused': [{ contactId: str, paused: bool }],\n 'group.joined': [{ groupId: str }],\n 'prompt.opened': [{ promptId: str, kind: lit('encounter-confirm', 'group-invite', 'introduction') }],\n 'prompt.decided': [{ promptId: str, kind: lit('encounter-confirm', 'group-invite', 'introduction'), choice: lit('accept', 'decline') }],\n 'delivery.status': [{ digest: str, threadId: str, status: lit('submitted', 'accepted', 'delivered', 'failed') }, { late: bool }],\n 'profile.updated': [{ contactId: nullable(str) }],\n 'anchor.rotated': [{ generation: dec }],\n 'device.added': [{ name: str }],\n 'device.revoked': [{ name: str }],\n 'duty.unsupported': [{ dutyId: str, kind: str, v: natural }],\n 'star.accepted': [{ contactId: str, relationshipId: str, salt: dec }],\n 'groupStar.accepted': [{ contactId: str, relationshipId: str, salt: dec }],\n 'encounter.shown': [{ challenge: str, card: anyObj }],\n 'encounter.scanned': [{ contactId: str, card: anyObj }],\n 'encounter.recorded': [{ contactId: str, relationshipId: str, role: lit('scanner', 'displayer') }],\n 'encounter.accepted': [{ contactId: str, relationshipId: str, mutual: bool }],\n 'group.founded': [{ groupId: str }],\n 'group.admitted': [{ groupId: str, member: str }],\n 'group.vouched': [{ groupId: str, member: str }],\n}\nconst event: V = (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n const t = (x as Record<string, unknown>).type\n if (typeof t !== 'string' || !Object.hasOwn(EVENT_FIELDS, t)) fail(`${p}.type`, 'unknown event type')\n const [req, opt = {}] = EVENT_FIELDS[t as HolderEventType]\n obj({ type: str, eventId: str, commitSeq: dec, ...req }, { actId: str, ...opt })(x, p)\n}\n\nconst rosterEntry = obj({ anchor: str, op: str, keyAgreement: str, addedAt: millis }, { name: str, contactId: str, rkid: str })\nconst openInvitation = obj({ invitee: str, keyAgreement: str, contactId: str, rkid: str, threadId: str, credDigest: str, invite: anyObj, validUntil: millis })\nconst evidence = obj({ invite: anyObj, accept: anyObj, vouches: arr(anyObj), at: millis })\nconst groupShape = obj({\n id: str, name: str, memberLabel: str, rules: obj({ vouchThreshold: dec }), listed: bool,\n roster: keyed(rosterEntry, 'anchor'), invitations: keyed(openInvitation, 'threadId'), evidence: rec(evidence),\n preludes: rec(obj({ contactId: str, rkid: str, at: millis })),\n}, { did: str, genesis: anyObj, memberAnchor: str, memberOp: str, acceptDigest: str })\n/** a listed group carries its member anchor and memberOp: the group star\n * seals them (Trust 5400, 5430), and their absence is no filler condition */\nconst group: V = (x, p) => {\n groupShape(x, p)\n const g = x as { listed: boolean, memberAnchor?: unknown, memberOp?: unknown }\n if (g.listed && g.memberAnchor === undefined) fail(`${p}.memberAnchor`, 'missing on a listed group')\n if (g.listed && g.memberOp === undefined) fail(`${p}.memberOp`, 'missing on a listed group')\n}\n\nconst heldCredential = obj({ digest: str, credential: anyObj })\nconst enactmentRecord = obj({\n ceremony: str, own: str, tCh: millis, peer: str, counterpart: str, card: anyObj, bind: str, at: millis, label: str, relId: str,\n role: lit('scanner', 'displayer'), out: nullable(heldCredential), in: nullable(heldCredential),\n thread: nullable(str), bundleDigest: nullable(str), threads: rec(str), sentCard: nullable(anyObj), counterPending: bool,\n})\n\nconst introAct = obj({\n key: str, act: str, role: lit('requester', 'mediator', 'target'),\n status: lit('sent', 'acked', 'completed', 'failed', 'received', 'forwarded', 'consented', 'refused'),\n issuedAt: millis, request: anyObj, requestCard: anyObj, reply: nullable(anyObj), replyCard: nullable(anyObj),\n pins: obj({}, { requester: str, target: str, mediator: str }), threads: obj({ request: str }, { forward: str }),\n at: millis, ackDelayMs: natural, ownLabel: nullable(str), ack: nullable(anyObj), replyForwarded: bool, vouchersSent: bool,\n pendingVoucher: nullable(anyObj), voucher: nullable(anyObj), vouched: bool, promptId: nullable(str),\n}, { peerName: str })\n\nconst codec1 = obj({\n codec: lit(1),\n commitSeq: dec,\n lastWhen: millis,\n register: obj({\n labels: set(str), pairNonces: rec(str),\n carriers: rec(arr(obj({ nonce: str, generation: dec }))),\n devices: obj({ names: set(str), revoked: set(str) }),\n community: nullable(obj({ genesis: str, head: dec })),\n lineage: arr(anyObj),\n }),\n addresses: obj({ keys: rec(obj({ label: str, lastShown: millis }, { retiredAt: millis })), tombstones: set(str) }),\n contacts: keyed(contact, 'id'),\n relationships: keyed(relationship, 'id'),\n entryOrder: obj({ nextPos: dec, heads: set(str) }),\n groups: keyed(group, 'id'),\n profile: obj({ body: json, revision: dec }),\n effects: rec(obj({ ack: nullable(storedAck), expiresAt: millis })),\n outbox: rec(outboxItem),\n duties: keyed(duty, 'id'),\n rotations: keyed(obj({\n id: str, from: dec, to: dec, step: lit('register', 'log', 'duties'), startedAt: millis,\n entry: json, overHead: logHead, awaitHead: rec(nullable(str)),\n }), 'id'),\n prompts: keyed(obj({ id: str, kind: lit('encounter-confirm', 'group-invite', 'introduction'), openedAt: millis }, { contactId: str, groupId: str, expiresAt: millis }), 'id'),\n acts: keyed(obj({ actId: str, inputHash: str, commitSeq: dec, outboundDigests: arr(str), events: arr(event), at: millis }), 'actId'),\n encounter: obj({\n challenges: keyed(obj({ value: str, tCh: millis, label: str, card: anyObj }), 'value'),\n records: keyed(enactmentRecord, 'own'),\n introductions: keyed(introAct, 'key'),\n offers: keyed(obj({ id: str, mediatorContactId: str, pin: str, target: str, at: millis }, { label: str }), 'id'),\n designators: rec(str),\n declarations: rec(obj({ issuer: str, role: str, revision: dec, constants: rec(str), at: millis })),\n }),\n joining: obj({\n preludes: rec(obj({ group: str, inviter: str, contactId: str, rkid: str, memberLabel: str, at: millis })),\n invites: keyed(obj({\n credDigest: str, group: str, name: str, contactId: str, rkid: str, memberLabel: str, invite: anyObj, promptId: str, validUntil: millis,\n status: lit('open', 'accepted', 'declined', 'joined'), at: millis,\n }, { acceptDigest: str }), 'credDigest'),\n }),\n})\n\n/** Structural validators per codec version; every readable codec has one. */\nexport const VALIDATORS: Readonly<Record<number, StateValidator>> = Object.freeze({\n 1: (raw: unknown) => codec1(raw, '$'),\n})\n\n// ── the codec ──────────────────────────────────────────────────────────\n\n/** Canonical JSON text of a JSON-pure value, or not-json. */\nconst canonical = (x: unknown): string => {\n try { return jcs(x) } catch (e) { throw new StateCodecError('not-json', (e as Error).message) }\n}\n\nconst validatorOf = (chain: CodecChain, c: number): StateValidator => {\n const v = chain.validators[c]\n if (!v) throw new StateCodecError('codec-unknown', `no validator for codec ${c}`)\n return v\n}\n\n/**\n * Decode under an explicit chain: JSON purity, codec gate, then\n * validate(c) → migrate(c) → validate(c+1) … up to chain.codec. Returns\n * an independent copy. decodeState is this function over the library's\n * own chain; tests drive it with fake chains.\n */\nexport function decodeChain (raw: unknown, chain: CodecChain): unknown {\n let x = raw\n if (typeof raw === 'string') {\n try { x = JSON.parse(raw) } catch (e) { throw new StateCodecError('not-json', (e as Error).message) }\n }\n let s = JSON.parse(canonical(x)) as unknown\n if (!isObj(s)) fail('$', 'object expected')\n const at = (s as { codec?: unknown }).codec\n if (!Number.isSafeInteger(at) || (at as number) < 0) throw new StateCodecError('codec-unknown', 'codec must be a non-negative integer')\n if ((at as number) > chain.codec) throw new StateCodecError('codec-newer', `codec ${at} is newer than ${chain.codec}`)\n validatorOf(chain, at as number)(s)\n for (let c = at as number; c < chain.codec; c++) {\n const up = chain.migrations[c]\n if (!up) throw new StateCodecError('codec-unknown', `no migration from codec ${c}`)\n s = JSON.parse(canonical(up(JSON.parse(canonical(s)))))\n if (!isObj(s) || s.codec !== c + 1) fail('$.codec', `migration ${c} must produce codec ${c + 1}`)\n validatorOf(chain, c + 1)(s)\n }\n return s\n}\n\nconst LIBRARY_CHAIN: CodecChain = { codec: CODEC, migrations: MIGRATIONS, validators: VALIDATORS }\n\n/**\n * Load a stored state: a JSON string or an already parsed value. Returns\n * an independent copy at the current codec, or throws StateCodecError.\n */\nexport function decodeState (raw: unknown): HolderState {\n return decodeChain(raw, LIBRARY_CHAIN) as HolderState\n}\n\n/** Serialize a state for storage: canonical JSON, validated first. */\nexport function encodeState (state: HolderState): string {\n const text = canonical(state)\n validatorOf(LIBRARY_CHAIN, CODEC)(JSON.parse(text))\n return text\n}\n\n/** Deterministic equality of two states (their JCS forms). */\nexport const sameState = (a: HolderState, b: HolderState): boolean => jcs(a) === jcs(b)\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** Exactly this many entries per probe chunk (6670, 6760). */
|
|
2
|
+
export declare const PROBE_CHUNK = 256;
|
|
3
|
+
export type ProbeChunk = {
|
|
4
|
+
body: {
|
|
5
|
+
type: 'continuity-probe@1';
|
|
6
|
+
probe: string;
|
|
7
|
+
seq: string;
|
|
8
|
+
last: boolean;
|
|
9
|
+
blinded: string[];
|
|
10
|
+
};
|
|
11
|
+
proof: {
|
|
12
|
+
mac: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export type ContinuityMappingBody = {
|
|
16
|
+
type: 'continuity-mapping@1';
|
|
17
|
+
prior: string;
|
|
18
|
+
next: string;
|
|
19
|
+
to: string;
|
|
20
|
+
revision: string;
|
|
21
|
+
issuedAt: string;
|
|
22
|
+
};
|
|
23
|
+
export type ContinuityMapping = {
|
|
24
|
+
body: ContinuityMappingBody;
|
|
25
|
+
proof: {
|
|
26
|
+
mac1: string;
|
|
27
|
+
mac2: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
/** k_p of one direction from the new pair secret (6720). */
|
|
31
|
+
export declare function probeKeyOf(shared: Uint8Array, sender: string, recipient: string, subtle?: SubtleCrypto): Promise<Uint8Array>;
|
|
32
|
+
/** One probe entry: HMAC(k_p, anchor) in its u form (6730, 6800). */
|
|
33
|
+
export declare const blindPrior: (k: Uint8Array, anchor: string, subtle?: SubtleCrypto) => Promise<string>;
|
|
34
|
+
/** A padding value: 32 random bytes in the MAC encoding (6760). */
|
|
35
|
+
export declare const padValue: (bytes: Uint8Array) => string;
|
|
36
|
+
/**
|
|
37
|
+
* The chunks of one probe: the own prior pair anchors blinded under k_p,
|
|
38
|
+
* padded to the next multiple of 256 by values from `pad` (each called
|
|
39
|
+
* again where its value collides), sorted once, sliced by 256 (6730,
|
|
40
|
+
* 6760–6780). `probe` is the probe sequence in its wire form (6680).
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildProbeChunks(k: Uint8Array, probe: string, priors: Iterable<string>, pad: () => Uint8Array, subtle?: SubtleCrypto): Promise<ProbeChunk[]>;
|
|
43
|
+
/** Is this a schema-valid continuity-probe@1 chunk (exactly 256 unique entries)? */
|
|
44
|
+
export declare const probeChunkOk: (chunk: unknown) => boolean;
|
|
45
|
+
/** Does the chunk's MAC verify under k_p? */
|
|
46
|
+
export declare function probeChunkMacOk(k: Uint8Array, chunk: ProbeChunk, subtle?: SubtleCrypto): Promise<boolean>;
|
|
47
|
+
/** The two MAC keys of a continuity mapping (6880): mac1 under the prior
|
|
48
|
+
* relationship secret, mac2 under the new one. */
|
|
49
|
+
export declare function continuityMacKeys(sharedPrior: Uint8Array, sharedNew: Uint8Array, subtle?: SubtleCrypto): Promise<{
|
|
50
|
+
k1: Uint8Array;
|
|
51
|
+
k2: Uint8Array;
|
|
52
|
+
}>;
|
|
53
|
+
/** continuity-mapping@1 over its body (6880): the sender's prior and new
|
|
54
|
+
* pair secrets toward the addressee. */
|
|
55
|
+
export declare function assembleContinuityMapping(body: ContinuityMappingBody, sharedPrior: Uint8Array, sharedNew: Uint8Array, subtle?: SubtleCrypto): Promise<ContinuityMapping>;
|
|
56
|
+
/** Do both MACs verify (6970 step 5), under the receiver's prior and new
|
|
57
|
+
* pair secrets toward the sender? */
|
|
58
|
+
export declare function continuityMacsOk(m: ContinuityMapping, sharedPrior: Uint8Array, sharedNew: Uint8Array, subtle?: SubtleCrypto): Promise<boolean>;
|
|
59
|
+
/** Step 1 of 6940: the schema and a calendar-valid issuedAt. */
|
|
60
|
+
export declare const continuityMappingOk: (m: unknown) => boolean;
|
|
61
|
+
/** 2290: the record side of a fresh tuple is the party whose new pair
|
|
62
|
+
* anchor is the smaller by byte order (did:key strings are ASCII). Either
|
|
63
|
+
* party can grind its anchor to take either side, so being the record
|
|
64
|
+
* side grants nothing: neither side chains without the counterpart's
|
|
65
|
+
* mapping verified under the prior key (trust/continuity.ts, follow-up 14). */
|
|
66
|
+
export declare const isRecordSide: (ownNew: string, counterpartNew: string) => boolean;
|
|
67
|
+
//# sourceMappingURL=continuity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continuity.d.ts","sourceRoot":"","sources":["../src/continuity.ts"],"names":[],"mappings":"AA8BA,8DAA8D;AAC9D,eAAO,MAAM,WAAW,MAAM,CAAA;AAE9B,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE;QAAE,IAAI,EAAE,oBAAoB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AACvJ,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AACjJ,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAMtG,4DAA4D;AAC5D,wBAAsB,UAAU,CAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,YAA+B,GAAG,OAAO,CAAC,UAAU,CAAC,CAGrJ;AAED,qEAAqE;AACrE,eAAO,MAAM,UAAU,GAAI,GAAG,UAAU,EAAE,QAAQ,MAAM,EAAE,SAAS,YAAY,KAAG,OAAO,CAAC,MAAM,CAA4B,CAAA;AAE5H,mEAAmE;AACnE,eAAO,MAAM,QAAQ,GAAI,OAAO,UAAU,KAAG,MAG5C,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,UAAU,EAAE,MAAM,GAAE,YAA+B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAkBrL;AAED,oFAAoF;AACpF,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,OAAqE,CAAA;AAEnH,6CAA6C;AAC7C,wBAAsB,eAAe,CAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhH;AAED;mDACmD;AACnD,wBAAsB,iBAAiB,CAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAAC,CAG3J;AAED;yCACyC;AACzC,wBAAsB,yBAAyB,CAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAI/K;AAED;sCACsC;AACtC,wBAAsB,gBAAgB,CAAE,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAIrJ;AAED,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,GAAI,GAAG,OAAO,KAAG,OAC0D,CAAA;AAE3G;;;;gFAIgF;AAChF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,gBAAgB,MAAM,KAAG,OAAkC,CAAA"}
|