@plane31/blind-relay 0.0.0-stage → 0.1.2
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/LICENSE +202 -0
- package/README.md +26 -2
- package/dist/adapters/index.d.ts +18 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +22 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/audience.d.ts +77 -0
- package/dist/audience.d.ts.map +1 -0
- package/dist/audience.js +76 -0
- package/dist/audience.js.map +1 -0
- package/dist/bytes.d.ts +54 -0
- package/dist/bytes.d.ts.map +1 -0
- package/dist/bytes.js +200 -0
- package/dist/bytes.js.map +1 -0
- package/dist/circle.d.ts +59 -0
- package/dist/circle.d.ts.map +1 -0
- package/dist/circle.js +105 -0
- package/dist/circle.js.map +1 -0
- package/dist/client.d.ts +234 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1365 -0
- package/dist/client.js.map +1 -0
- package/dist/codec.d.ts +189 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +512 -0
- package/dist/codec.js.map +1 -0
- package/dist/crypto/backend.d.ts +39 -0
- package/dist/crypto/backend.d.ts.map +1 -0
- package/dist/crypto/backend.js +8 -0
- package/dist/crypto/backend.js.map +1 -0
- package/dist/crypto/noble.d.ts +3 -0
- package/dist/crypto/noble.d.ts.map +1 -0
- package/dist/crypto/noble.js +107 -0
- package/dist/crypto/noble.js.map +1 -0
- package/dist/crypto/sodium.d.ts +9 -0
- package/dist/crypto/sodium.d.ts.map +1 -0
- package/dist/crypto/sodium.js +51 -0
- package/dist/crypto/sodium.js.map +1 -0
- package/dist/crypto.d.ts +66 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +225 -0
- package/dist/crypto.js.map +1 -0
- package/dist/epoch.d.ts +93 -0
- package/dist/epoch.d.ts.map +1 -0
- package/dist/epoch.js +121 -0
- package/dist/epoch.js.map +1 -0
- package/dist/errors.d.ts +17 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/historyIndex.d.ts +15 -0
- package/dist/historyIndex.d.ts.map +1 -0
- package/dist/historyIndex.js +57 -0
- package/dist/historyIndex.js.map +1 -0
- package/dist/identity.d.ts +62 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +99 -0
- package/dist/identity.js.map +1 -0
- package/dist/inbox.d.ts +153 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +472 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/outbox.d.ts +96 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +339 -0
- package/dist/outbox.js.map +1 -0
- package/dist/policy.d.ts +33 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +71 -0
- package/dist/policy.js.map +1 -0
- package/dist/record.d.ts +49 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +46 -0
- package/dist/record.js.map +1 -0
- package/dist/reset.d.ts +74 -0
- package/dist/reset.d.ts.map +1 -0
- package/dist/reset.js +127 -0
- package/dist/reset.js.map +1 -0
- package/dist/rows.d.ts +16 -0
- package/dist/rows.d.ts.map +1 -0
- package/dist/rows.js +103 -0
- package/dist/rows.js.map +1 -0
- package/dist/slots.d.ts +22 -0
- package/dist/slots.d.ts.map +1 -0
- package/dist/slots.js +38 -0
- package/dist/slots.js.map +1 -0
- package/dist/store.d.ts +357 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +192 -0
- package/dist/store.js.map +1 -0
- package/dist/testing/clock.d.ts +14 -0
- package/dist/testing/clock.d.ts.map +1 -0
- package/dist/testing/clock.js +27 -0
- package/dist/testing/clock.js.map +1 -0
- package/dist/testing/fakeHost.d.ts +118 -0
- package/dist/testing/fakeHost.d.ts.map +1 -0
- package/dist/testing/fakeHost.js +462 -0
- package/dist/testing/fakeHost.js.map +1 -0
- package/dist/testing/faults.d.ts +97 -0
- package/dist/testing/faults.d.ts.map +1 -0
- package/dist/testing/faults.js +264 -0
- package/dist/testing/faults.js.map +1 -0
- package/dist/testing/fixtures.d.ts +15 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +22 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/testing/index.d.ts +7 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/providers.d.ts +16 -0
- package/dist/testing/providers.d.ts.map +1 -0
- package/dist/testing/providers.js +36 -0
- package/dist/testing/providers.js.map +1 -0
- package/dist/testing/sweep.d.ts +46 -0
- package/dist/testing/sweep.d.ts.map +1 -0
- package/dist/testing/sweep.js +366 -0
- package/dist/testing/sweep.js.map +1 -0
- package/dist/transactions.d.ts +75 -0
- package/dist/transactions.d.ts.map +1 -0
- package/dist/transactions.js +212 -0
- package/dist/transactions.js.map +1 -0
- package/dist/transport.d.ts +125 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +6 -0
- package/dist/transport.js.map +1 -0
- package/dist/vault.d.ts +59 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +69 -0
- package/dist/vault.js.map +1 -0
- package/package.json +67 -3
- package/src/adapters/index.ts +102 -0
- package/src/audience.ts +123 -0
- package/src/bytes.ts +209 -0
- package/src/circle.ts +127 -0
- package/src/client.ts +1442 -0
- package/src/codec.ts +642 -0
- package/src/crypto/backend.ts +48 -0
- package/src/crypto/noble.ts +104 -0
- package/src/crypto/node-module.d.ts +11 -0
- package/src/crypto/sodium.ts +53 -0
- package/src/crypto.ts +266 -0
- package/src/epoch.ts +201 -0
- package/src/errors.ts +78 -0
- package/src/historyIndex.ts +61 -0
- package/src/identity.ts +158 -0
- package/src/inbox.ts +560 -0
- package/src/index.ts +59 -0
- package/src/outbox.ts +385 -0
- package/src/policy.ts +88 -0
- package/src/record.ts +106 -0
- package/src/reset.ts +176 -0
- package/src/rows.ts +116 -0
- package/src/slots.ts +55 -0
- package/src/store.ts +557 -0
- package/src/testing/clock.ts +29 -0
- package/src/testing/fakeHost.ts +482 -0
- package/src/testing/faults.ts +321 -0
- package/src/testing/fixtures.ts +35 -0
- package/src/testing/index.ts +6 -0
- package/src/testing/providers.ts +39 -0
- package/src/testing/sweep.ts +407 -0
- package/src/transactions.ts +231 -0
- package/src/transport.ts +106 -0
- package/src/vault.ts +126 -0
package/dist/bytes.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed-width big-endian encoding, protocol section 3.
|
|
3
|
+
* u64 values are BigInt end to end; nothing is ever rounded through a double.
|
|
4
|
+
*/
|
|
5
|
+
import { KavachError } from "./errors.js";
|
|
6
|
+
export const MAX_DOCUMENT_BYTES = 16_384;
|
|
7
|
+
export const MAX_PAYLOAD_BYTES = 4_096;
|
|
8
|
+
const U32_MAX = 0xffff_ffff;
|
|
9
|
+
const U64_MAX = (1n << 64n) - 1n;
|
|
10
|
+
const NAME_RULE = /^[A-Za-z0-9_-]{1,64}$/;
|
|
11
|
+
export function concat(...parts) {
|
|
12
|
+
let length = 0;
|
|
13
|
+
for (const part of parts)
|
|
14
|
+
length += part.length;
|
|
15
|
+
const out = new Uint8Array(length);
|
|
16
|
+
let offset = 0;
|
|
17
|
+
for (const part of parts) {
|
|
18
|
+
out.set(part, offset);
|
|
19
|
+
offset += part.length;
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
export function u8(value) {
|
|
24
|
+
if (!Number.isInteger(value) || value < 0 || value > 0xff)
|
|
25
|
+
throw new RangeError("u8 out of range");
|
|
26
|
+
return Uint8Array.of(value);
|
|
27
|
+
}
|
|
28
|
+
export function u16(value) {
|
|
29
|
+
if (!Number.isInteger(value) || value < 0 || value > 0xffff)
|
|
30
|
+
throw new RangeError("u16 out of range");
|
|
31
|
+
return Uint8Array.of(value >>> 8, value & 0xff);
|
|
32
|
+
}
|
|
33
|
+
export function u32(value) {
|
|
34
|
+
if (!Number.isInteger(value) || value < 0 || value > U32_MAX)
|
|
35
|
+
throw new RangeError("u32 out of range");
|
|
36
|
+
const out = new Uint8Array(4);
|
|
37
|
+
new DataView(out.buffer).setUint32(0, value, false);
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
export function u64(value) {
|
|
41
|
+
if (typeof value !== "bigint" || value < 0n || value > U64_MAX)
|
|
42
|
+
throw new RangeError("u64 out of range");
|
|
43
|
+
const out = new Uint8Array(8);
|
|
44
|
+
new DataView(out.buffer).setBigUint64(0, value, false);
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
export function i32(value) {
|
|
48
|
+
if (!Number.isInteger(value) || value < -0x8000_0000 || value > 0x7fff_ffff)
|
|
49
|
+
throw new RangeError("i32 out of range");
|
|
50
|
+
const out = new Uint8Array(4);
|
|
51
|
+
new DataView(out.buffer).setInt32(0, value, false);
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
/** The `accountName` rule: 1 to 64 ASCII letters, digits, underscore or hyphen, case-sensitive. */
|
|
55
|
+
export function isValidName(name) {
|
|
56
|
+
return NAME_RULE.test(name);
|
|
57
|
+
}
|
|
58
|
+
/** `B(name)`: u8 byte length followed by the ASCII bytes. */
|
|
59
|
+
export function encodeName(name) {
|
|
60
|
+
if (!isValidName(name))
|
|
61
|
+
throw new KavachError("MALFORMED", "encodeName", "account name violates the name rule");
|
|
62
|
+
const bytes = new Uint8Array(name.length);
|
|
63
|
+
for (let i = 0; i < name.length; i++)
|
|
64
|
+
bytes[i] = name.charCodeAt(i);
|
|
65
|
+
return concat(u8(bytes.length), bytes);
|
|
66
|
+
}
|
|
67
|
+
export function equalBytes(a, b) {
|
|
68
|
+
if (a.length !== b.length)
|
|
69
|
+
return false;
|
|
70
|
+
let diff = 0;
|
|
71
|
+
for (let i = 0; i < a.length; i++)
|
|
72
|
+
diff |= (a[i] ?? 0) ^ (b[i] ?? 0);
|
|
73
|
+
return diff === 0;
|
|
74
|
+
}
|
|
75
|
+
export function isAllZero(bytes) {
|
|
76
|
+
let acc = 0;
|
|
77
|
+
for (const b of bytes)
|
|
78
|
+
acc |= b;
|
|
79
|
+
return acc === 0;
|
|
80
|
+
}
|
|
81
|
+
const HEX = /^[0-9a-f]*$/i;
|
|
82
|
+
export function toHex(bytes) {
|
|
83
|
+
let s = "";
|
|
84
|
+
for (const b of bytes)
|
|
85
|
+
s += b.toString(16).padStart(2, "0");
|
|
86
|
+
return s;
|
|
87
|
+
}
|
|
88
|
+
export function fromHex(hex) {
|
|
89
|
+
if (hex.length % 2 !== 0 || !HEX.test(hex))
|
|
90
|
+
throw new RangeError("bad hex");
|
|
91
|
+
const out = new Uint8Array(hex.length / 2);
|
|
92
|
+
for (let i = 0; i < out.length; i++)
|
|
93
|
+
out[i] = Number.parseInt(hex.slice(2 * i, 2 * i + 2), 16);
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/** Compare two byte strings lexicographically, as the strict sort orders in section 3 require. */
|
|
97
|
+
export function compareBytes(a, b) {
|
|
98
|
+
const n = Math.min(a.length, b.length);
|
|
99
|
+
for (let i = 0; i < n; i++) {
|
|
100
|
+
const d = (a[i] ?? 0) - (b[i] ?? 0);
|
|
101
|
+
if (d !== 0)
|
|
102
|
+
return d;
|
|
103
|
+
}
|
|
104
|
+
return a.length - b.length;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* A bounded reader. Every take is checked against the end; `end()` refuses trailing bytes.
|
|
108
|
+
* All failures are `MALFORMED`, which is what the codec reports before any cryptography.
|
|
109
|
+
*/
|
|
110
|
+
export class Reader {
|
|
111
|
+
data;
|
|
112
|
+
stage;
|
|
113
|
+
offset = 0;
|
|
114
|
+
constructor(data, stage = "parse") {
|
|
115
|
+
this.data = data;
|
|
116
|
+
this.stage = stage;
|
|
117
|
+
}
|
|
118
|
+
get position() {
|
|
119
|
+
return this.offset;
|
|
120
|
+
}
|
|
121
|
+
get remaining() {
|
|
122
|
+
return this.data.length - this.offset;
|
|
123
|
+
}
|
|
124
|
+
take(n) {
|
|
125
|
+
if (!Number.isInteger(n) || n < 0 || this.offset + n > this.data.length) {
|
|
126
|
+
throw new KavachError("MALFORMED", this.stage, "truncated");
|
|
127
|
+
}
|
|
128
|
+
const out = this.data.slice(this.offset, this.offset + n);
|
|
129
|
+
this.offset += n;
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
u8() {
|
|
133
|
+
return this.take(1)[0] ?? 0;
|
|
134
|
+
}
|
|
135
|
+
u16() {
|
|
136
|
+
const b = this.take(2);
|
|
137
|
+
return ((b[0] ?? 0) << 8) | (b[1] ?? 0);
|
|
138
|
+
}
|
|
139
|
+
u32() {
|
|
140
|
+
const b = this.take(4);
|
|
141
|
+
return new DataView(b.buffer, b.byteOffset, 4).getUint32(0, false);
|
|
142
|
+
}
|
|
143
|
+
u64() {
|
|
144
|
+
const b = this.take(8);
|
|
145
|
+
return new DataView(b.buffer, b.byteOffset, 8).getBigUint64(0, false);
|
|
146
|
+
}
|
|
147
|
+
i32() {
|
|
148
|
+
const b = this.take(4);
|
|
149
|
+
return new DataView(b.buffer, b.byteOffset, 4).getInt32(0, false);
|
|
150
|
+
}
|
|
151
|
+
/** `B(name)`, enforcing the name rule. */
|
|
152
|
+
name() {
|
|
153
|
+
const n = this.u8();
|
|
154
|
+
const bytes = this.take(n);
|
|
155
|
+
let text = "";
|
|
156
|
+
for (const b of bytes)
|
|
157
|
+
text += String.fromCharCode(b);
|
|
158
|
+
if (!isValidName(text))
|
|
159
|
+
throw new KavachError("MALFORMED", this.stage, "bad account name");
|
|
160
|
+
return text;
|
|
161
|
+
}
|
|
162
|
+
/** The bytes consumed so far, for AAD and body hashing. */
|
|
163
|
+
consumed() {
|
|
164
|
+
return this.data.slice(0, this.offset);
|
|
165
|
+
}
|
|
166
|
+
end() {
|
|
167
|
+
if (this.offset !== this.data.length)
|
|
168
|
+
throw new KavachError("MALFORMED", this.stage, "trailing bytes");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** An append-only writer for building bodies. */
|
|
172
|
+
export class Writer {
|
|
173
|
+
parts = [];
|
|
174
|
+
bytes(value) {
|
|
175
|
+
this.parts.push(value);
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
178
|
+
u8(value) {
|
|
179
|
+
return this.bytes(u8(value));
|
|
180
|
+
}
|
|
181
|
+
u16(value) {
|
|
182
|
+
return this.bytes(u16(value));
|
|
183
|
+
}
|
|
184
|
+
u32(value) {
|
|
185
|
+
return this.bytes(u32(value));
|
|
186
|
+
}
|
|
187
|
+
u64(value) {
|
|
188
|
+
return this.bytes(u64(value));
|
|
189
|
+
}
|
|
190
|
+
i32(value) {
|
|
191
|
+
return this.bytes(i32(value));
|
|
192
|
+
}
|
|
193
|
+
name(value) {
|
|
194
|
+
return this.bytes(encodeName(value));
|
|
195
|
+
}
|
|
196
|
+
finish() {
|
|
197
|
+
return concat(...this.parts);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../src/bytes.ts"],"names":[],"mappings":"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"}
|
package/dist/circle.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type CircleSnapshot, type Parsed } from "./codec.js";
|
|
2
|
+
export type CircleStatus = "requested" | "member" | "left" | "quarantined" | "closed";
|
|
3
|
+
/** What the SDK persists per circle it has pinned. */
|
|
4
|
+
export interface CircleState {
|
|
5
|
+
readonly circleId: Uint8Array;
|
|
6
|
+
readonly ownerIdentityId: Uint8Array;
|
|
7
|
+
/** 0n until the first verified snapshot. */
|
|
8
|
+
readonly revision: bigint;
|
|
9
|
+
readonly bodyHash: Uint8Array | undefined;
|
|
10
|
+
readonly snapshot: Uint8Array | undefined;
|
|
11
|
+
readonly members: readonly Uint8Array[];
|
|
12
|
+
readonly enabled: boolean;
|
|
13
|
+
readonly status: CircleStatus;
|
|
14
|
+
/** When the current snapshot was verified, for showing its age. */
|
|
15
|
+
readonly verifiedAt: bigint;
|
|
16
|
+
}
|
|
17
|
+
export type SnapshotOutcome = {
|
|
18
|
+
readonly outcome: "ACCEPTED";
|
|
19
|
+
readonly state: CircleState;
|
|
20
|
+
readonly snapshot: Parsed<CircleSnapshot>;
|
|
21
|
+
} | {
|
|
22
|
+
readonly outcome: "DUPLICATE";
|
|
23
|
+
readonly state: CircleState;
|
|
24
|
+
};
|
|
25
|
+
export declare function newCircleId(): Uint8Array;
|
|
26
|
+
export declare function pinCircle(circleId: Uint8Array, ownerIdentityId: Uint8Array, enabled: boolean, status?: CircleStatus): CircleState;
|
|
27
|
+
/**
|
|
28
|
+
* Accept a snapshot for a pinned circle under the pinned owner's account key.
|
|
29
|
+
* A lower revision is `ROLLBACK`; the same revision with the same body is a duplicate and with a
|
|
30
|
+
* different valid body is `EQUIVOCATION`, which quarantines the circle. Membership status comes
|
|
31
|
+
* from the snapshot: the account is a member when it is listed and waiting when it is not.
|
|
32
|
+
*/
|
|
33
|
+
export declare function acceptSnapshot(state: CircleState, wire: Uint8Array, ownerAccountKey: Uint8Array, selfIdentityId: Uint8Array, now: bigint): SnapshotOutcome;
|
|
34
|
+
/** Two different account keys for one account name among resolved members is a forgery attempt. */
|
|
35
|
+
export declare function checkMemberResolution(resolved: ReadonlyMap<string, {
|
|
36
|
+
accountName: string;
|
|
37
|
+
accountKey: Uint8Array;
|
|
38
|
+
}>): void;
|
|
39
|
+
export interface OwnerKeys {
|
|
40
|
+
readonly identityId: Uint8Array;
|
|
41
|
+
readonly accountSecretKey: Uint8Array;
|
|
42
|
+
}
|
|
43
|
+
/** Revision 1 with the owner as sole member. */
|
|
44
|
+
export declare function createCircleSnapshot(owner: OwnerKeys, circleId: Uint8Array): Uint8Array;
|
|
45
|
+
export type MembershipChange = {
|
|
46
|
+
readonly admit: Uint8Array;
|
|
47
|
+
} | {
|
|
48
|
+
readonly remove: Uint8Array;
|
|
49
|
+
} | {
|
|
50
|
+
readonly close: true;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* The successor snapshot from trusted local state plus one change. Returns `undefined` when the
|
|
54
|
+
* change is already reflected (approval of an admitted account is idempotent).
|
|
55
|
+
*/
|
|
56
|
+
export declare function successorSnapshot(state: CircleState, change: MembershipChange, owner: OwnerKeys): Uint8Array | undefined;
|
|
57
|
+
/** The owner's restored device signs revision plus one over the current snapshot; the revision never resets. */
|
|
58
|
+
export declare function isOwner(state: CircleState, selfIdentityId: Uint8Array): boolean;
|
|
59
|
+
//# sourceMappingURL=circle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circle.d.ts","sourceRoot":"","sources":["../src/circle.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAI7H,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEtF,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;IACrC,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;CAAE,GACxG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAEnE,wBAAgB,WAAW,IAAI,UAAU,CAExC;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,YAA0B,GAAG,WAAW,CAE9I;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAwB1J;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC,GAAG,IAAI,CAU1H;AAID,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,UAAU,CAAC;CACvC;AAED,gDAAgD;AAChD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,CAEvF;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;AAE3H;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAkBxH;AAED,gHAAgH;AAChH,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,GAAG,OAAO,CAE/E"}
|
package/dist/circle.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circle membership and owner approval (protocol section 6).
|
|
3
|
+
*
|
|
4
|
+
* Membership is one owner-signed snapshot. Join and leave requests are host state with no
|
|
5
|
+
* signature; the owner builds every successor from trusted local state plus one change.
|
|
6
|
+
*/
|
|
7
|
+
import { compareBytes, equalBytes, toHex } from "./bytes.js";
|
|
8
|
+
import { DocumentType, buildCircleSnapshot, expectType, verifyDocument } from "./codec.js";
|
|
9
|
+
import { randomBytes } from "./crypto.js";
|
|
10
|
+
import { KavachError } from "./errors.js";
|
|
11
|
+
export function newCircleId() {
|
|
12
|
+
return randomBytes(16);
|
|
13
|
+
}
|
|
14
|
+
export function pinCircle(circleId, ownerIdentityId, enabled, status = "requested") {
|
|
15
|
+
return { circleId, ownerIdentityId, revision: 0n, bodyHash: undefined, snapshot: undefined, members: [], enabled, status, verifiedAt: 0n };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Accept a snapshot for a pinned circle under the pinned owner's account key.
|
|
19
|
+
* A lower revision is `ROLLBACK`; the same revision with the same body is a duplicate and with a
|
|
20
|
+
* different valid body is `EQUIVOCATION`, which quarantines the circle. Membership status comes
|
|
21
|
+
* from the snapshot: the account is a member when it is listed and waiting when it is not.
|
|
22
|
+
*/
|
|
23
|
+
export function acceptSnapshot(state, wire, ownerAccountKey, selfIdentityId, now) {
|
|
24
|
+
const stage = "acceptSnapshot";
|
|
25
|
+
const doc = expectType(verifyDocument(wire, ownerAccountKey), DocumentType.CircleSnapshot, stage);
|
|
26
|
+
if (!equalBytes(doc.circleId, state.circleId) || !equalBytes(doc.ownerIdentityId, state.ownerIdentityId)) {
|
|
27
|
+
throw new KavachError("MALFORMED", stage, "snapshot is for another circle or owner");
|
|
28
|
+
}
|
|
29
|
+
if (doc.revision < state.revision)
|
|
30
|
+
throw new KavachError("ROLLBACK", stage);
|
|
31
|
+
if (doc.revision === state.revision) {
|
|
32
|
+
if (state.bodyHash && equalBytes(doc.bodyHash, state.bodyHash))
|
|
33
|
+
return { outcome: "DUPLICATE", state };
|
|
34
|
+
throw new KavachError("EQUIVOCATION", stage, "two snapshots at one revision");
|
|
35
|
+
}
|
|
36
|
+
// A member that is no longer listed has been removed, whether by a removal or a closure; the
|
|
37
|
+
// two are indistinguishable to a member and mean the same thing locally. Only the owner's own
|
|
38
|
+
// explicit close sets "closed".
|
|
39
|
+
const listed = doc.members.some((m) => equalBytes(m, selfIdentityId));
|
|
40
|
+
let status = state.status;
|
|
41
|
+
if (state.status === "quarantined")
|
|
42
|
+
status = "quarantined";
|
|
43
|
+
else if (listed)
|
|
44
|
+
status = "member";
|
|
45
|
+
else if (state.status === "member")
|
|
46
|
+
status = "left";
|
|
47
|
+
return {
|
|
48
|
+
outcome: "ACCEPTED",
|
|
49
|
+
snapshot: doc,
|
|
50
|
+
state: { ...state, revision: doc.revision, bodyHash: doc.bodyHash, snapshot: wire, members: doc.members, status, verifiedAt: now }
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Two different account keys for one account name among resolved members is a forgery attempt. */
|
|
54
|
+
export function checkMemberResolution(resolved) {
|
|
55
|
+
const byName = new Map();
|
|
56
|
+
for (const [iid, r] of resolved) {
|
|
57
|
+
const seen = byName.get(r.accountName);
|
|
58
|
+
if (seen !== undefined && seen !== toHex(r.accountKey)) {
|
|
59
|
+
throw new KavachError("EQUIVOCATION", "resolveMembers", `two keys for ${r.accountName}`);
|
|
60
|
+
}
|
|
61
|
+
byName.set(r.accountName, toHex(r.accountKey));
|
|
62
|
+
void iid;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Revision 1 with the owner as sole member. */
|
|
66
|
+
export function createCircleSnapshot(owner, circleId) {
|
|
67
|
+
return buildCircleSnapshot({ circleId, ownerIdentityId: owner.identityId, revision: 1n, members: [owner.identityId] }, owner.accountSecretKey);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The successor snapshot from trusted local state plus one change. Returns `undefined` when the
|
|
71
|
+
* change is already reflected (approval of an admitted account is idempotent).
|
|
72
|
+
*/
|
|
73
|
+
export function successorSnapshot(state, change, owner) {
|
|
74
|
+
if (!equalBytes(state.ownerIdentityId, owner.identityId))
|
|
75
|
+
throw new KavachError("NOT_AUTHORIZED", "successorSnapshot", "not the owner");
|
|
76
|
+
if (state.status === "closed")
|
|
77
|
+
throw new KavachError("NOT_AUTHORIZED", "successorSnapshot", "circle closed");
|
|
78
|
+
let members;
|
|
79
|
+
if ("admit" in change) {
|
|
80
|
+
if (state.members.some((m) => equalBytes(m, change.admit)))
|
|
81
|
+
return undefined;
|
|
82
|
+
members = [...state.members, change.admit];
|
|
83
|
+
if (members.length > 100)
|
|
84
|
+
throw new KavachError("RECIPIENT_LIMIT", "successorSnapshot");
|
|
85
|
+
}
|
|
86
|
+
else if ("remove" in change) {
|
|
87
|
+
if (equalBytes(change.remove, owner.identityId))
|
|
88
|
+
throw new KavachError("NOT_AUTHORIZED", "successorSnapshot", "the owner cannot leave without closing");
|
|
89
|
+
if (!state.members.some((m) => equalBytes(m, change.remove)))
|
|
90
|
+
return undefined;
|
|
91
|
+
members = state.members.filter((m) => !equalBytes(m, change.remove));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
members = [owner.identityId];
|
|
95
|
+
if (state.members.length === 1)
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
members.sort(compareBytes);
|
|
99
|
+
return buildCircleSnapshot({ circleId: state.circleId, ownerIdentityId: owner.identityId, revision: state.revision + 1n, members }, owner.accountSecretKey);
|
|
100
|
+
}
|
|
101
|
+
/** The owner's restored device signs revision plus one over the current snapshot; the revision never resets. */
|
|
102
|
+
export function isOwner(state, selfIdentityId) {
|
|
103
|
+
return equalBytes(state.ownerIdentityId, selfIdentityId);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=circle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circle.js","sourceRoot":"","sources":["../src/circle.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { type CircleState } from "./circle.js";
|
|
2
|
+
import { type RecordKind } from "./codec.js";
|
|
3
|
+
import { type ErrorCode } from "./errors.js";
|
|
4
|
+
import { type HistoryEntry, type HistoryPage, type HistoryQuery, type Newest, type ReceiveResult } from "./inbox.js";
|
|
5
|
+
import { type EnqueueOptions, type OutboxCounts } from "./outbox.js";
|
|
6
|
+
export type { EnqueueOptions } from "./outbox.js";
|
|
7
|
+
/** The durable record a hand-over produced; `duplicate` when an idempotency key matched an earlier one. */
|
|
8
|
+
export interface EnqueueResult {
|
|
9
|
+
readonly recordId: Uint8Array;
|
|
10
|
+
readonly duplicate: boolean;
|
|
11
|
+
}
|
|
12
|
+
import { type ResetTrustConfig } from "./reset.js";
|
|
13
|
+
import type { SecretStore, Store } from "./store.js";
|
|
14
|
+
import type { Transport } from "./transport.js";
|
|
15
|
+
import { type ProviderStatusResult, type RecoveryProvider } from "./vault.js";
|
|
16
|
+
/** The types of the client's queries and of `receive`, defined with the inbox. */
|
|
17
|
+
export type { HistoryEntry, HistoryPage, HistoryQuery, Newest, ReceiveResult } from "./inbox.js";
|
|
18
|
+
export type ClientStatus = "fresh" | "ready" | "locked" | "accountRecoveryRequired" | "activationPending" | "retired" | "paused" | "quarantined";
|
|
19
|
+
export type PauseReason = "sync" | "rotation" | "metadata" | "limit";
|
|
20
|
+
export interface ClientState {
|
|
21
|
+
readonly status: ClientStatus;
|
|
22
|
+
readonly paused: PauseReason | undefined;
|
|
23
|
+
readonly identityId: Uint8Array | undefined;
|
|
24
|
+
readonly certificateHash: Uint8Array | undefined;
|
|
25
|
+
readonly generation: bigint | undefined;
|
|
26
|
+
readonly outbox: number;
|
|
27
|
+
/** Authors whose current epoch has not yet reached this device. */
|
|
28
|
+
readonly waitingFor: readonly Uint8Array[];
|
|
29
|
+
readonly circles: readonly CircleSummary[];
|
|
30
|
+
}
|
|
31
|
+
/** Diagnostics: where the protocol stands on this device. Never a secret or a plaintext. */
|
|
32
|
+
export interface Inspection {
|
|
33
|
+
readonly identityId: Uint8Array | undefined;
|
|
34
|
+
readonly certificateHash: Uint8Array | undefined;
|
|
35
|
+
readonly generation: bigint | undefined;
|
|
36
|
+
readonly desiredRevision: bigint;
|
|
37
|
+
readonly paused: PauseReason | undefined;
|
|
38
|
+
readonly activeEpoch: number | undefined;
|
|
39
|
+
/** An epoch prepared or committed that is not active yet. */
|
|
40
|
+
readonly pendingEpoch: number | undefined;
|
|
41
|
+
readonly outbox: OutboxCounts;
|
|
42
|
+
readonly vault: {
|
|
43
|
+
readonly revision: bigint;
|
|
44
|
+
readonly pending: boolean;
|
|
45
|
+
readonly dirty: boolean;
|
|
46
|
+
} | undefined;
|
|
47
|
+
}
|
|
48
|
+
export interface CircleSummary {
|
|
49
|
+
readonly circleId: Uint8Array;
|
|
50
|
+
readonly ownerIdentityId: Uint8Array;
|
|
51
|
+
readonly revision: bigint;
|
|
52
|
+
readonly members: readonly Uint8Array[];
|
|
53
|
+
readonly enabled: boolean;
|
|
54
|
+
readonly status: CircleState["status"];
|
|
55
|
+
readonly snapshotAgeMs: bigint;
|
|
56
|
+
readonly owned: boolean;
|
|
57
|
+
}
|
|
58
|
+
export type ClientEvent = {
|
|
59
|
+
kind: "deviceChanged";
|
|
60
|
+
identityId: Uint8Array;
|
|
61
|
+
generation: bigint;
|
|
62
|
+
}
|
|
63
|
+
/** After a rotation, or when a sent record's acceptance is in doubt: the app may resend its current state of each kind with a slot. */
|
|
64
|
+
| {
|
|
65
|
+
kind: "refresh";
|
|
66
|
+
reason: string;
|
|
67
|
+
} | {
|
|
68
|
+
kind: "cancelled";
|
|
69
|
+
recordId: Uint8Array;
|
|
70
|
+
reason: string;
|
|
71
|
+
} | {
|
|
72
|
+
kind: "queued";
|
|
73
|
+
recordId: Uint8Array;
|
|
74
|
+
recordKind: RecordKind;
|
|
75
|
+
} | {
|
|
76
|
+
kind: "accepted";
|
|
77
|
+
recordId: Uint8Array;
|
|
78
|
+
}
|
|
79
|
+
/** A record was stored, received or the device's own; `tookSlot` when it became the author's newest of its kind. */
|
|
80
|
+
| {
|
|
81
|
+
kind: "recordStored";
|
|
82
|
+
recordKind: RecordKind;
|
|
83
|
+
authorIdentityId: Uint8Array;
|
|
84
|
+
recordId: Uint8Array;
|
|
85
|
+
tookSlot: boolean;
|
|
86
|
+
} | {
|
|
87
|
+
kind: "waiting";
|
|
88
|
+
identityId: Uint8Array;
|
|
89
|
+
} | {
|
|
90
|
+
kind: "joinRequests";
|
|
91
|
+
circleId: Uint8Array;
|
|
92
|
+
accountNames: readonly string[];
|
|
93
|
+
} | {
|
|
94
|
+
kind: "circleChanged";
|
|
95
|
+
circleId: Uint8Array;
|
|
96
|
+
revision: bigint;
|
|
97
|
+
status: CircleState["status"];
|
|
98
|
+
} | {
|
|
99
|
+
kind: "accountKeyChanged";
|
|
100
|
+
accountName: string;
|
|
101
|
+
quarantined: boolean;
|
|
102
|
+
} | {
|
|
103
|
+
kind: "securityError";
|
|
104
|
+
code: string;
|
|
105
|
+
detail: string;
|
|
106
|
+
} | {
|
|
107
|
+
kind: "stateChanged";
|
|
108
|
+
state: ClientState;
|
|
109
|
+
};
|
|
110
|
+
export interface OpenOptions {
|
|
111
|
+
readonly accountName: string;
|
|
112
|
+
readonly retentionPolicy: unknown;
|
|
113
|
+
readonly recoveryProvider: RecoveryProvider;
|
|
114
|
+
readonly resetTrust: ResetTrustConfig;
|
|
115
|
+
readonly secretStore: SecretStore;
|
|
116
|
+
readonly store: Store;
|
|
117
|
+
readonly transport: Transport;
|
|
118
|
+
readonly now?: () => bigint;
|
|
119
|
+
/** Called when a subscriber throws. Listeners are isolated from the protocol and from each other either way. */
|
|
120
|
+
readonly onListenerError?: (error: unknown, event: ClientEvent) => void;
|
|
121
|
+
}
|
|
122
|
+
export interface Client {
|
|
123
|
+
readonly accountName: string;
|
|
124
|
+
getState(): Promise<ClientState>;
|
|
125
|
+
subscribe(listener: (event: ClientEvent) => void): () => void;
|
|
126
|
+
initializeAccount(): Promise<{
|
|
127
|
+
identityId: Uint8Array;
|
|
128
|
+
}>;
|
|
129
|
+
recoveryStatus(): Promise<ProviderStatusResult>;
|
|
130
|
+
recoveryCode(): Promise<string>;
|
|
131
|
+
restoreAccount(recoveryCode?: string): Promise<{
|
|
132
|
+
identityId: Uint8Array;
|
|
133
|
+
generation: bigint;
|
|
134
|
+
}>;
|
|
135
|
+
/** A durable outbound record of a declared kind; the payload is the product's bytes, never read by the SDK. */
|
|
136
|
+
enqueue(kind: RecordKind, payload: Uint8Array, options?: EnqueueOptions): Promise<EnqueueResult>;
|
|
137
|
+
/** One synchronisation; `options.catchUp` bounds how much of a backlog this call reads (`SyncReport.inbox.hasMore` says when to call again). */
|
|
138
|
+
sync(options?: SyncOptions): Promise<SyncReport>;
|
|
139
|
+
receive(wire: Uint8Array): Promise<ReceiveResult>;
|
|
140
|
+
/** The first page of `historyPage`, as a list. */
|
|
141
|
+
history(query?: HistoryQuery): Promise<HistoryEntry[]>;
|
|
142
|
+
/** One page of history in time order with a cursor for the next; served from the index. */
|
|
143
|
+
historyPage(query?: HistoryQuery): Promise<HistoryPage>;
|
|
144
|
+
/** The newest history entry for an author or kind, own records and superseded ones included. */
|
|
145
|
+
newestEntry(query?: Pick<HistoryQuery, "authorIdentityId" | "kind">): Promise<HistoryEntry | undefined>;
|
|
146
|
+
/** The newest record of a kind from an author's current device, self included; `undefined` when none or expired. */
|
|
147
|
+
newest(identityId: Uint8Array, kind: RecordKind): Promise<Newest | undefined>;
|
|
148
|
+
inspect(): Promise<Inspection>;
|
|
149
|
+
readonly circles: {
|
|
150
|
+
create(): Promise<{
|
|
151
|
+
circleId: Uint8Array;
|
|
152
|
+
}>;
|
|
153
|
+
requestJoin(circleId: Uint8Array, ownerIdentityId: Uint8Array, options?: {
|
|
154
|
+
shareOnApproval?: boolean;
|
|
155
|
+
}): Promise<void>;
|
|
156
|
+
approve(circleId: Uint8Array, accountName: string): Promise<{
|
|
157
|
+
revision: bigint;
|
|
158
|
+
}>;
|
|
159
|
+
remove(circleId: Uint8Array, memberIdentityId: Uint8Array): Promise<{
|
|
160
|
+
revision: bigint;
|
|
161
|
+
}>;
|
|
162
|
+
leave(circleId: Uint8Array): Promise<void>;
|
|
163
|
+
setEnabled(circleId: Uint8Array, enabled: boolean): Promise<void>;
|
|
164
|
+
closeCircle(circleId: Uint8Array): Promise<void>;
|
|
165
|
+
list(): Promise<readonly CircleSummary[]>;
|
|
166
|
+
};
|
|
167
|
+
resetAccount(options: {
|
|
168
|
+
confirmed: true;
|
|
169
|
+
reauthProof?: Uint8Array;
|
|
170
|
+
}): Promise<{
|
|
171
|
+
identityId: Uint8Array;
|
|
172
|
+
}>;
|
|
173
|
+
close(): Promise<void>;
|
|
174
|
+
}
|
|
175
|
+
export interface SyncOptions {
|
|
176
|
+
/**
|
|
177
|
+
* The inbox budget of this sync, shared by every stream: at most this many records
|
|
178
|
+
* (default 500) and this many milliseconds of reading (default 5,000) before the sync stops
|
|
179
|
+
* and reports `inbox.hasMore`, so a long backlog never holds a wake-up open. Each stream reads
|
|
180
|
+
* at least one page.
|
|
181
|
+
*/
|
|
182
|
+
readonly catchUp?: {
|
|
183
|
+
readonly maxRecords?: number;
|
|
184
|
+
readonly maxMs?: number;
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
export declare const DEFAULT_CATCH_UP: {
|
|
188
|
+
readonly maxRecords: 500;
|
|
189
|
+
readonly maxMs: 5000;
|
|
190
|
+
};
|
|
191
|
+
export interface SyncReport {
|
|
192
|
+
metadata: {
|
|
193
|
+
certificates: number;
|
|
194
|
+
snapshots: number;
|
|
195
|
+
rotations: number;
|
|
196
|
+
quarantined: number;
|
|
197
|
+
resets: number;
|
|
198
|
+
};
|
|
199
|
+
epoch: "unchanged" | "prepared" | "paused" | "pending";
|
|
200
|
+
outbox: {
|
|
201
|
+
sent: number;
|
|
202
|
+
accepted: number;
|
|
203
|
+
cancelled: number;
|
|
204
|
+
unknown: number;
|
|
205
|
+
retry: number;
|
|
206
|
+
};
|
|
207
|
+
/** `hasMore`: a stream still has records on the relay that this sync's budget did not reach; sync again soon. */
|
|
208
|
+
inbox: {
|
|
209
|
+
streams: number;
|
|
210
|
+
stored: number;
|
|
211
|
+
keyPending: number;
|
|
212
|
+
invalid: number;
|
|
213
|
+
acked: number;
|
|
214
|
+
hasMore: boolean;
|
|
215
|
+
};
|
|
216
|
+
purged: number;
|
|
217
|
+
errors: SyncError[];
|
|
218
|
+
}
|
|
219
|
+
/** One failure a sync worked around: which step, the protocol code and stage, and whether the same step may succeed later unchanged. */
|
|
220
|
+
export interface SyncError {
|
|
221
|
+
readonly operation: string;
|
|
222
|
+
readonly code: ErrorCode | "ACTIVATION_PENDING" | "UNEXPECTED";
|
|
223
|
+
readonly stage: string;
|
|
224
|
+
readonly retryable: boolean;
|
|
225
|
+
/**
|
|
226
|
+
* On an `inbox` entry: the stream whose download or processing failed and its author, so the
|
|
227
|
+
* host can tell which sender is affected. Identifying metadata (protocol section 14): keep it
|
|
228
|
+
* local or pseudonymise it before logging.
|
|
229
|
+
*/
|
|
230
|
+
readonly streamId?: Uint8Array;
|
|
231
|
+
readonly authorIdentityId?: Uint8Array;
|
|
232
|
+
}
|
|
233
|
+
export declare function open(options: OpenOptions): Promise<Client>;
|
|
234
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|