@layervai/qurl 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/README.md +187 -7
- package/dist/cjs/client.d.ts +17 -10
- package/dist/cjs/client.js +649 -96
- package/dist/cjs/errors.d.ts +11 -11
- package/dist/cjs/errors.js +25 -20
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/internal.d.ts +4 -0
- package/dist/cjs/internal.js +16 -0
- package/dist/cjs/node/deployment.d.ts +44 -0
- package/dist/cjs/node/deployment.js +167 -0
- package/dist/cjs/node/native-udp.d.ts +37 -0
- package/dist/cjs/node/native-udp.js +294 -0
- package/dist/cjs/node/nhp-wire.d.ts +35 -0
- package/dist/cjs/node/nhp-wire.js +261 -0
- package/dist/cjs/node/portal-opener.d.ts +83 -0
- package/dist/cjs/node/portal-opener.js +767 -0
- package/dist/cjs/node/qv2.d.ts +38 -0
- package/dist/cjs/node/qv2.js +292 -0
- package/dist/cjs/node/strict-json.d.ts +12 -0
- package/dist/cjs/node/strict-json.js +174 -0
- package/dist/cjs/node.d.ts +3 -0
- package/dist/cjs/node.js +11 -0
- package/dist/cjs/types.d.ts +7 -18
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client.d.ts +17 -10
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +647 -94
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/errors.d.ts +11 -11
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +25 -20
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/internal.d.ts +5 -0
- package/dist/esm/internal.d.ts.map +1 -0
- package/dist/esm/internal.js +14 -0
- package/dist/esm/internal.js.map +1 -0
- package/dist/esm/node/deployment.d.ts +45 -0
- package/dist/esm/node/deployment.d.ts.map +1 -0
- package/dist/esm/node/deployment.js +163 -0
- package/dist/esm/node/deployment.js.map +1 -0
- package/dist/esm/node/native-udp.d.ts +38 -0
- package/dist/esm/node/native-udp.d.ts.map +1 -0
- package/dist/esm/node/native-udp.js +291 -0
- package/dist/esm/node/native-udp.js.map +1 -0
- package/dist/esm/node/nhp-wire.d.ts +36 -0
- package/dist/esm/node/nhp-wire.d.ts.map +1 -0
- package/dist/esm/node/nhp-wire.js +257 -0
- package/dist/esm/node/nhp-wire.js.map +1 -0
- package/dist/esm/node/portal-opener.d.ts +84 -0
- package/dist/esm/node/portal-opener.d.ts.map +1 -0
- package/dist/esm/node/portal-opener.js +757 -0
- package/dist/esm/node/portal-opener.js.map +1 -0
- package/dist/esm/node/qv2.d.ts +39 -0
- package/dist/esm/node/qv2.d.ts.map +1 -0
- package/dist/esm/node/qv2.js +286 -0
- package/dist/esm/node/qv2.js.map +1 -0
- package/dist/esm/node/strict-json.d.ts +13 -0
- package/dist/esm/node/strict-json.d.ts.map +1 -0
- package/dist/esm/node/strict-json.js +171 -0
- package/dist/esm/node/strict-json.js.map +1 -0
- package/dist/esm/node.d.ts +4 -0
- package/dist/esm/node.d.ts.map +1 -0
- package/dist/esm/node.js +2 -0
- package/dist/esm/node.js.map +1 -0
- package/dist/esm/types.d.ts +7 -18
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +25 -6
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, createHash, createHmac, createPrivateKey, createPublicKey, diffieHellman, randomBytes, timingSafeEqual, } from "node:crypto";
|
|
2
|
+
import { inflateSync } from "node:zlib";
|
|
3
|
+
export const NHP_TYPE_KNOCK = 1;
|
|
4
|
+
export const NHP_TYPE_ACK = 2;
|
|
5
|
+
export const NHP_TYPE_COOKIE = 7;
|
|
6
|
+
export const NHP_HEADER_SIZE = 240;
|
|
7
|
+
export const NHP_PACKET_SIZE = 4_096;
|
|
8
|
+
export const NHP_MAX_BODY_SIZE = NHP_PACKET_SIZE - NHP_HEADER_SIZE - 16;
|
|
9
|
+
const HEADER_COMMON_SIZE = 24;
|
|
10
|
+
const OFFSET_EPHEMERAL = 24;
|
|
11
|
+
const OFFSET_STATIC = 136;
|
|
12
|
+
const OFFSET_TIMESTAMP = 184;
|
|
13
|
+
const OFFSET_DIGEST = 208;
|
|
14
|
+
const FLAG_COMPRESS = 1 << 1;
|
|
15
|
+
const INITIAL_HASH = Buffer.from("NHP hashgen v.20230421@deepcloudsdp.com", "utf8");
|
|
16
|
+
const INITIAL_CHAIN_KEY = Buffer.from("NHP keygen v.20230421@clouddeep.cn", "utf8");
|
|
17
|
+
const X25519_PKCS8_PREFIX = Buffer.from("302e020100300506032b656e04220420", "hex");
|
|
18
|
+
const X25519_SPKI_PREFIX = Buffer.from("302a300506032b656e032100", "hex");
|
|
19
|
+
export function buildNHPMessage(input) {
|
|
20
|
+
validateKey(input.devicePrivateKey, "device private key");
|
|
21
|
+
validateKey(input.serverPublicKey, "server public key");
|
|
22
|
+
if (input.body.byteLength > NHP_MAX_BODY_SIZE)
|
|
23
|
+
throw new Error("NHP application body is too large");
|
|
24
|
+
if (input.type !== NHP_TYPE_KNOCK)
|
|
25
|
+
throw new Error("unsupported NHP initiator message type");
|
|
26
|
+
const ephemeralPrivateKey = input.ephemeralPrivateKey
|
|
27
|
+
? Buffer.from(input.ephemeralPrivateKey)
|
|
28
|
+
: randomBytes(32);
|
|
29
|
+
const secrets = [ephemeralPrivateKey];
|
|
30
|
+
try {
|
|
31
|
+
validateKey(ephemeralPrivateKey, "ephemeral private key");
|
|
32
|
+
const random = input.counter === undefined || input.preamble === undefined ? randomBytes(12) : undefined;
|
|
33
|
+
const counter = input.counter ?? random.readBigUInt64BE(0);
|
|
34
|
+
const preamble = input.preamble ?? random.readUInt32BE(8);
|
|
35
|
+
const timestampNanos = input.timestampNanos ?? BigInt(Date.now()) * 1000000n;
|
|
36
|
+
const devicePublicKey = rawPublicFromPrivate(input.devicePrivateKey);
|
|
37
|
+
const ephemeralPublicKey = rawPublicFromPrivate(ephemeralPrivateKey);
|
|
38
|
+
const nonce = nonceForCounter(counter);
|
|
39
|
+
const header = Buffer.alloc(NHP_HEADER_SIZE);
|
|
40
|
+
ephemeralPublicKey.copy(header, OFFSET_EPHEMERAL);
|
|
41
|
+
let chainHashParts = [INITIAL_HASH];
|
|
42
|
+
let chainKey = trackSecret(secrets, mixKey(hashParts(chainHashParts), INITIAL_CHAIN_KEY));
|
|
43
|
+
chainHashParts = [...chainHashParts, Buffer.from(input.serverPublicKey), ephemeralPublicKey];
|
|
44
|
+
chainKey = trackSecret(secrets, mixKey(chainKey, ephemeralPublicKey));
|
|
45
|
+
const ephemeralShared = trackSecret(secrets, sharedSecret(ephemeralPrivateKey, input.serverPublicKey));
|
|
46
|
+
let derived = keyGen2(chainKey, ephemeralShared);
|
|
47
|
+
secrets.push(...derived);
|
|
48
|
+
chainKey = derived[0];
|
|
49
|
+
const sealedStatic = seal(derived[1], nonce, devicePublicKey, hashParts(chainHashParts));
|
|
50
|
+
sealedStatic.copy(header, OFFSET_STATIC);
|
|
51
|
+
chainHashParts = [...chainHashParts, sealedStatic];
|
|
52
|
+
const staticShared = trackSecret(secrets, sharedSecret(input.devicePrivateKey, input.serverPublicKey));
|
|
53
|
+
derived = keyGen2(chainKey, staticShared);
|
|
54
|
+
secrets.push(...derived);
|
|
55
|
+
chainKey = derived[0];
|
|
56
|
+
const timestamp = Buffer.alloc(8);
|
|
57
|
+
timestamp.writeBigUInt64BE(timestampNanos);
|
|
58
|
+
const sealedTimestamp = seal(derived[1], nonce, timestamp, hashParts(chainHashParts));
|
|
59
|
+
sealedTimestamp.copy(header, OFFSET_TIMESTAMP);
|
|
60
|
+
chainHashParts = [...chainHashParts, sealedTimestamp];
|
|
61
|
+
derived = keyGen2(chainKey, sealedTimestamp);
|
|
62
|
+
secrets.push(...derived);
|
|
63
|
+
const bodyKey = derived[1];
|
|
64
|
+
header.writeUInt8(1, 8);
|
|
65
|
+
header.writeUInt8(1, 9);
|
|
66
|
+
header.writeUInt16BE(0, 10);
|
|
67
|
+
header.writeBigUInt64BE(counter, 16);
|
|
68
|
+
const payloadSize = input.body.byteLength === 0 ? 0 : input.body.byteLength + 16;
|
|
69
|
+
header.writeUInt32BE(preamble >>> 0, 0);
|
|
70
|
+
header.writeUInt32BE((preamble ^ ((input.type << 16) | payloadSize)) >>> 0, 4);
|
|
71
|
+
const bodyAad = hashParts([...chainHashParts, header.subarray(0, HEADER_COMMON_SIZE)]);
|
|
72
|
+
const sealedBody = input.body.byteLength === 0 ? Buffer.alloc(0) : seal(bodyKey, nonce, input.body, bodyAad);
|
|
73
|
+
headerDigest(input.serverPublicKey, header).copy(header, OFFSET_DIGEST);
|
|
74
|
+
return { packet: Buffer.concat([header, sealedBody]), counter };
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
wipeBuffers(secrets);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function decryptNHPReply(devicePrivateKey, expectedServerPublicKey, packetValue) {
|
|
81
|
+
validateKey(devicePrivateKey, "device private key");
|
|
82
|
+
validateKey(expectedServerPublicKey, "server public key");
|
|
83
|
+
const packet = Buffer.from(packetValue);
|
|
84
|
+
if (packet.byteLength < NHP_HEADER_SIZE || packet.byteLength > NHP_PACKET_SIZE) {
|
|
85
|
+
throw new Error("NHP reply size is outside the protocol bounds");
|
|
86
|
+
}
|
|
87
|
+
if (packet[8] !== 1 || packet[9] < 1)
|
|
88
|
+
throw new Error("unsupported NHP protocol version");
|
|
89
|
+
const header = packet.subarray(0, NHP_HEADER_SIZE);
|
|
90
|
+
const sealedBody = packet.subarray(NHP_HEADER_SIZE);
|
|
91
|
+
const secrets = [];
|
|
92
|
+
let body;
|
|
93
|
+
try {
|
|
94
|
+
const devicePublicKey = rawPublicFromPrivate(devicePrivateKey);
|
|
95
|
+
const expectedDigest = headerDigest(devicePublicKey, header);
|
|
96
|
+
if (!timingSafeEqual(expectedDigest, header.subarray(OFFSET_DIGEST))) {
|
|
97
|
+
throw new Error("NHP reply header authentication failed");
|
|
98
|
+
}
|
|
99
|
+
const counter = header.readBigUInt64BE(16);
|
|
100
|
+
const nonce = nonceForCounter(counter);
|
|
101
|
+
const serverEphemeral = header.subarray(OFFSET_EPHEMERAL, OFFSET_EPHEMERAL + 32);
|
|
102
|
+
const sealedStatic = header.subarray(OFFSET_STATIC, OFFSET_STATIC + 48);
|
|
103
|
+
const sealedTimestamp = header.subarray(OFFSET_TIMESTAMP, OFFSET_TIMESTAMP + 24);
|
|
104
|
+
let chainHashParts = [INITIAL_HASH];
|
|
105
|
+
let chainKey = trackSecret(secrets, mixKey(hashParts(chainHashParts), INITIAL_CHAIN_KEY));
|
|
106
|
+
chainHashParts = [...chainHashParts, devicePublicKey, serverEphemeral];
|
|
107
|
+
chainKey = trackSecret(secrets, mixKey(chainKey, serverEphemeral));
|
|
108
|
+
const ephemeralShared = trackSecret(secrets, sharedSecret(devicePrivateKey, serverEphemeral));
|
|
109
|
+
let derived = keyGen2(chainKey, ephemeralShared);
|
|
110
|
+
secrets.push(...derived);
|
|
111
|
+
chainKey = derived[0];
|
|
112
|
+
const serverStatic = open(derived[1], nonce, sealedStatic, hashParts(chainHashParts));
|
|
113
|
+
if (!timingSafeEqual(serverStatic, Buffer.from(expectedServerPublicKey))) {
|
|
114
|
+
throw new Error("NHP reply came from an unexpected server key");
|
|
115
|
+
}
|
|
116
|
+
chainHashParts = [...chainHashParts, sealedStatic];
|
|
117
|
+
const staticShared = trackSecret(secrets, sharedSecret(devicePrivateKey, serverStatic));
|
|
118
|
+
derived = keyGen2(chainKey, staticShared);
|
|
119
|
+
secrets.push(...derived);
|
|
120
|
+
chainKey = derived[0];
|
|
121
|
+
const timestamp = open(derived[1], nonce, sealedTimestamp, hashParts(chainHashParts));
|
|
122
|
+
chainHashParts = [...chainHashParts, sealedTimestamp];
|
|
123
|
+
derived = keyGen2(chainKey, sealedTimestamp);
|
|
124
|
+
secrets.push(...derived);
|
|
125
|
+
const bodyKey = derived[1];
|
|
126
|
+
const bodyAad = hashParts([...chainHashParts, header.subarray(0, HEADER_COMMON_SIZE)]);
|
|
127
|
+
body =
|
|
128
|
+
sealedBody.byteLength === 0 ? Buffer.alloc(0) : open(bodyKey, nonce, sealedBody, bodyAad);
|
|
129
|
+
const preamble = header.readUInt32BE(0);
|
|
130
|
+
const encodedTypeSize = (preamble ^ header.readUInt32BE(4)) >>> 0;
|
|
131
|
+
const type = (encodedTypeSize >>> 16) & 0xffff;
|
|
132
|
+
const flags = header.readUInt16BE(10);
|
|
133
|
+
validateReplyProfile(type, flags);
|
|
134
|
+
body = inflateReplyBody(body, flags);
|
|
135
|
+
if (body.byteLength > NHP_PACKET_SIZE) {
|
|
136
|
+
throw new Error("NHP reply body exceeds the post-inflate limit");
|
|
137
|
+
}
|
|
138
|
+
const returnedBody = body;
|
|
139
|
+
body = undefined;
|
|
140
|
+
return {
|
|
141
|
+
type,
|
|
142
|
+
flags,
|
|
143
|
+
counter,
|
|
144
|
+
timestampNanos: timestamp.readBigUInt64BE(0),
|
|
145
|
+
body: returnedBody,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
body?.fill(0);
|
|
150
|
+
wipeBuffers(secrets);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function validateReplyProfile(type, flags) {
|
|
154
|
+
if (![NHP_TYPE_ACK, NHP_TYPE_COOKIE].includes(type) || (flags !== 0 && flags !== FLAG_COMPRESS)) {
|
|
155
|
+
throw new Error("NHP reply type or flags are outside the reply profile");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function inflateReplyBody(body, flags) {
|
|
159
|
+
if (body.byteLength === 0 || (flags & FLAG_COMPRESS) === 0)
|
|
160
|
+
return body;
|
|
161
|
+
try {
|
|
162
|
+
return inflateSync(body, { maxOutputLength: NHP_PACKET_SIZE });
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
body.fill(0);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function validateKey(key, name) {
|
|
169
|
+
if (key.byteLength !== 32)
|
|
170
|
+
throw new Error(`${name} must be 32 bytes`);
|
|
171
|
+
}
|
|
172
|
+
function rawPrivateKey(raw) {
|
|
173
|
+
const der = Buffer.alloc(X25519_PKCS8_PREFIX.byteLength + raw.byteLength);
|
|
174
|
+
X25519_PKCS8_PREFIX.copy(der);
|
|
175
|
+
der.set(raw, X25519_PKCS8_PREFIX.byteLength);
|
|
176
|
+
try {
|
|
177
|
+
return createPrivateKey({ key: der, format: "der", type: "pkcs8" });
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
der.fill(0);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function rawPublicKey(raw) {
|
|
184
|
+
return createPublicKey({
|
|
185
|
+
key: Buffer.concat([X25519_SPKI_PREFIX, Buffer.from(raw)]),
|
|
186
|
+
format: "der",
|
|
187
|
+
type: "spki",
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
function rawPublicFromPrivate(raw) {
|
|
191
|
+
const spki = createPublicKey(rawPrivateKey(raw)).export({ format: "der", type: "spki" });
|
|
192
|
+
return spki.subarray(spki.byteLength - 32);
|
|
193
|
+
}
|
|
194
|
+
function sharedSecret(privateValue, publicValue) {
|
|
195
|
+
return diffieHellman({
|
|
196
|
+
privateKey: rawPrivateKey(privateValue),
|
|
197
|
+
publicKey: rawPublicKey(publicValue),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
function hashParts(parts) {
|
|
201
|
+
const hash = createHash("blake2s256");
|
|
202
|
+
for (const part of parts)
|
|
203
|
+
hash.update(part);
|
|
204
|
+
return hash.digest();
|
|
205
|
+
}
|
|
206
|
+
function hmac(key, ...parts) {
|
|
207
|
+
const mac = createHmac("blake2s256", key);
|
|
208
|
+
for (const part of parts)
|
|
209
|
+
mac.update(part);
|
|
210
|
+
return mac.digest();
|
|
211
|
+
}
|
|
212
|
+
function mixKey(key, input) {
|
|
213
|
+
const prk = hmac(key, input);
|
|
214
|
+
const mixed = hmac(prk, Uint8Array.of(1));
|
|
215
|
+
prk.fill(0);
|
|
216
|
+
return mixed;
|
|
217
|
+
}
|
|
218
|
+
function keyGen2(key, input) {
|
|
219
|
+
const prk = hmac(key, input);
|
|
220
|
+
const first = hmac(prk, Uint8Array.of(1));
|
|
221
|
+
const second = hmac(prk, first, Uint8Array.of(2));
|
|
222
|
+
prk.fill(0);
|
|
223
|
+
return [first, second];
|
|
224
|
+
}
|
|
225
|
+
function nonceForCounter(counter) {
|
|
226
|
+
const nonce = Buffer.alloc(12);
|
|
227
|
+
nonce.writeBigUInt64BE(counter, 4);
|
|
228
|
+
return nonce;
|
|
229
|
+
}
|
|
230
|
+
function seal(key, nonce, plaintext, aad) {
|
|
231
|
+
const cipher = createCipheriv("aes-256-gcm", key, nonce);
|
|
232
|
+
cipher.setAAD(aad);
|
|
233
|
+
return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]);
|
|
234
|
+
}
|
|
235
|
+
function open(key, nonce, sealed, aad) {
|
|
236
|
+
if (sealed.byteLength < 16)
|
|
237
|
+
throw new Error("NHP sealed field is shorter than its tag");
|
|
238
|
+
const ciphertext = sealed.subarray(0, sealed.byteLength - 16);
|
|
239
|
+
const tag = sealed.subarray(sealed.byteLength - 16);
|
|
240
|
+
const decipher = createDecipheriv("aes-256-gcm", key, nonce);
|
|
241
|
+
decipher.setAAD(aad);
|
|
242
|
+
decipher.setAuthTag(tag);
|
|
243
|
+
return Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
244
|
+
}
|
|
245
|
+
function headerDigest(peerStaticPublicKey, header) {
|
|
246
|
+
return hashParts([INITIAL_HASH, peerStaticPublicKey, header.subarray(0, OFFSET_DIGEST)]);
|
|
247
|
+
}
|
|
248
|
+
function trackSecret(secrets, value) {
|
|
249
|
+
secrets.push(value);
|
|
250
|
+
return value;
|
|
251
|
+
}
|
|
252
|
+
function wipeBuffers(values) {
|
|
253
|
+
for (const value of values)
|
|
254
|
+
value.fill(0);
|
|
255
|
+
}
|
|
256
|
+
export const nhpWireTesting = { validateReplyProfile, inflateReplyBody };
|
|
257
|
+
//# sourceMappingURL=nhp-wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nhp-wire.js","sourceRoot":"","sources":["../../../src/node/nhp-wire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { NHPMessage } from "./nhp-wire.js";
|
|
2
|
+
import { type PortalDeployment, type ValidatedCell, type ValidatedDeployment } from "./deployment.js";
|
|
3
|
+
import { type NativeExchangeOptions } from "./native-udp.js";
|
|
4
|
+
import { type VerifiedQv2Link } from "./qv2.js";
|
|
5
|
+
export interface CreatePortalOpenerOptions {
|
|
6
|
+
/** Full qv2t1 qURL. The opener verifies and then drops this immutable string. */
|
|
7
|
+
readonly qurl: string;
|
|
8
|
+
/** Native-only is deliberate. There is no relay or HTTP-resolve fallback. */
|
|
9
|
+
readonly transport: "native-only";
|
|
10
|
+
/** Public deployment trust. Omit to load QURL_DEPLOYMENT once at construction. */
|
|
11
|
+
readonly deployment?: PortalDeployment;
|
|
12
|
+
/** Per-address UDP attempt timeout. Use start({ signal }) for one overall deadline. */
|
|
13
|
+
readonly timeoutMs?: number;
|
|
14
|
+
/** Maximum serial address attempts for one native exchange. */
|
|
15
|
+
readonly maxAddresses?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface PortalStartOptions {
|
|
18
|
+
readonly signal?: AbortSignal;
|
|
19
|
+
}
|
|
20
|
+
export type PortalRequestBuilder = (authenticatedTarget: URL) => RequestInit;
|
|
21
|
+
export interface PortalFetchOptions {
|
|
22
|
+
/** Use `error` for signed requests whose method, target, timestamp, and nonce must not be replayed. */
|
|
23
|
+
readonly redirects?: "follow" | "error";
|
|
24
|
+
}
|
|
25
|
+
export type PortalRenewalFailure = {
|
|
26
|
+
readonly kind: "transport" | "busy" | "denied" | "invalid_reply" | "local_state";
|
|
27
|
+
};
|
|
28
|
+
export type PortalSessionHealth = {
|
|
29
|
+
readonly state: "idle" | "starting" | "closed";
|
|
30
|
+
} | {
|
|
31
|
+
readonly state: "healthy" | "renewing" | "degraded" | "expired";
|
|
32
|
+
readonly expiresInMs: number;
|
|
33
|
+
readonly backgroundAttempts: number;
|
|
34
|
+
readonly renewalFailure?: PortalRenewalFailure;
|
|
35
|
+
};
|
|
36
|
+
export interface PortalOpener {
|
|
37
|
+
/** Open now and schedule renewal before the admission expires. */
|
|
38
|
+
start(options?: PortalStartOptions): Promise<void>;
|
|
39
|
+
/** Start a fetch at the exact ACK URL. Same-origin redirects follow only when allowed. */
|
|
40
|
+
fetch(init?: RequestInit | PortalRequestBuilder, options?: PortalFetchOptions): Promise<Response>;
|
|
41
|
+
/** Read local session state. This method does no I/O and exposes no capability. */
|
|
42
|
+
health(): PortalSessionHealth;
|
|
43
|
+
/** Stop renewal and wipe mutable private-key, visitor-secret, and token buffers. */
|
|
44
|
+
close(): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export declare class PortalConfigurationError extends Error {
|
|
47
|
+
constructor(message: string, options?: ErrorOptions);
|
|
48
|
+
}
|
|
49
|
+
export declare class PortalVerificationError extends Error {
|
|
50
|
+
constructor(message: string, options?: ErrorOptions);
|
|
51
|
+
}
|
|
52
|
+
export declare class PortalDenyError extends Error {
|
|
53
|
+
readonly errCode: string;
|
|
54
|
+
constructor(errCode: string);
|
|
55
|
+
}
|
|
56
|
+
export declare class PortalStateError extends Error {
|
|
57
|
+
constructor(message: string, options?: ErrorOptions);
|
|
58
|
+
}
|
|
59
|
+
export declare class PortalBusyError extends PortalStateError {
|
|
60
|
+
constructor();
|
|
61
|
+
}
|
|
62
|
+
export declare class PortalInvalidReplyError extends PortalStateError {
|
|
63
|
+
constructor(message: string, options?: ErrorOptions);
|
|
64
|
+
}
|
|
65
|
+
interface PortalRuntime {
|
|
66
|
+
readonly knock: (cell: ValidatedCell, key: Uint8Array, body: Uint8Array, options: NativeExchangeOptions) => Promise<NHPMessage>;
|
|
67
|
+
readonly fetch: typeof globalThis.fetch;
|
|
68
|
+
readonly nowNanos: () => bigint;
|
|
69
|
+
readonly randomFraction: () => number;
|
|
70
|
+
readonly setTimer: (callback: () => void, delayMs: number) => NodeJS.Timeout;
|
|
71
|
+
readonly clearTimer: (timer: NodeJS.Timeout) => void;
|
|
72
|
+
readonly setDeadlineTimer: (callback: () => void, delayMs: number) => NodeJS.Timeout;
|
|
73
|
+
readonly clearDeadlineTimer: (timer: NodeJS.Timeout) => void;
|
|
74
|
+
}
|
|
75
|
+
export declare function createPortalOpener(options: CreatePortalOpenerOptions): PortalOpener;
|
|
76
|
+
export declare function createPortalOpenerWithRuntime(options: CreatePortalOpenerOptions, runtime: PortalRuntime): PortalOpener;
|
|
77
|
+
declare function constructVerifiedPortalOpener(options: CreatePortalOpenerOptions, link: VerifiedQv2Link, deployment: ValidatedDeployment, runtime: PortalRuntime): PortalOpener;
|
|
78
|
+
declare function validateSessionToken(value: string, decode?: (part: string) => Buffer): void;
|
|
79
|
+
export declare const portalOpenerTesting: {
|
|
80
|
+
constructVerifiedPortalOpener: typeof constructVerifiedPortalOpener;
|
|
81
|
+
validateSessionToken: typeof validateSessionToken;
|
|
82
|
+
};
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=portal-opener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal-opener.d.ts","sourceRoot":"","sources":["../../../src/node/portal-opener.ts"],"names":[],"mappings":"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"}
|