ftown-bridge 0.19.53 → 0.19.55

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.
Files changed (53) hide show
  1. package/dist/bridge-auth.d.ts +3 -0
  2. package/dist/bridge-auth.js.map +1 -1
  3. package/dist/command-rpc.js +21 -12
  4. package/dist/command-rpc.js.map +1 -1
  5. package/dist/index.js +124 -7
  6. package/dist/index.js.map +1 -1
  7. package/dist/pairing-client.d.ts +24 -12
  8. package/dist/pairing-client.js +383 -13
  9. package/dist/pairing-client.js.map +1 -1
  10. package/dist/security/account-crypto.d.ts +33 -0
  11. package/dist/security/account-crypto.js +649 -0
  12. package/dist/security/account-crypto.js.map +1 -0
  13. package/dist/security/account-protocol.d.ts +228 -0
  14. package/dist/security/account-protocol.js +2 -0
  15. package/dist/security/account-protocol.js.map +1 -0
  16. package/dist/security/bridge/account-client.d.ts +7 -0
  17. package/dist/security/bridge/account-client.js +87 -0
  18. package/dist/security/bridge/account-client.js.map +1 -0
  19. package/dist/security/bridge/account-state.d.ts +471 -0
  20. package/dist/security/bridge/account-state.js +78 -0
  21. package/dist/security/bridge/account-state.js.map +1 -0
  22. package/dist/security/bridge/execute.js +2 -1
  23. package/dist/security/bridge/execute.js.map +1 -1
  24. package/dist/security/bridge/identity.d.ts +436 -0
  25. package/dist/security/bridge/identity.js +27 -5
  26. package/dist/security/bridge/identity.js.map +1 -1
  27. package/dist/security/bridge/pending-approval.d.ts +21 -0
  28. package/dist/security/bridge/pending-approval.js +79 -0
  29. package/dist/security/bridge/pending-approval.js.map +1 -0
  30. package/dist/security/bridge/pending-enrollment.d.ts +33 -0
  31. package/dist/security/bridge/pending-enrollment.js +177 -0
  32. package/dist/security/bridge/pending-enrollment.js.map +1 -0
  33. package/dist/security/bridge/permissions.js +2 -2
  34. package/dist/security/bridge/permissions.js.map +1 -1
  35. package/dist/security/bridge/policy.d.ts +20 -0
  36. package/dist/security/bridge/policy.js +159 -7
  37. package/dist/security/bridge/policy.js.map +1 -1
  38. package/dist/security/bridge/security.d.ts +11 -0
  39. package/dist/security/bridge/security.js +93 -3
  40. package/dist/security/bridge/security.js.map +1 -1
  41. package/dist/security/bridge/snapshot.d.ts +1 -1
  42. package/dist/security/bridge/snapshot.js.map +1 -1
  43. package/dist/security/pending-approval-crypto.d.ts +29 -0
  44. package/dist/security/pending-approval-crypto.js +716 -0
  45. package/dist/security/pending-approval-crypto.js.map +1 -0
  46. package/dist/security/pending-approval-protocol.d.ts +329 -0
  47. package/dist/security/pending-approval-protocol.js +2 -0
  48. package/dist/security/pending-approval-protocol.js.map +1 -0
  49. package/dist/security/protocol.d.ts +12 -1
  50. package/dist/security-cli.js +15 -0
  51. package/dist/security-cli.js.map +1 -1
  52. package/dist/types.d.ts +1 -1
  53. package/package.json +2 -2
@@ -10,28 +10,54 @@
10
10
  * returned token/refreshToken stay out of the `log` sink; only the low-value,
11
11
  * single-use `userCode` and the verification URL are printed.
12
12
  */
13
+ import { encodeAccountEnrollmentLink, parseAccountEnrollmentLink } from './security/account-crypto.js';
14
+ import { accountReadUrl } from './security/bridge/account-client.js';
15
+ import { readAccountHistory } from './security/bridge/account-client.js';
16
+ import { AccountTrustError } from './security/account-crypto.js';
17
+ import { createPendingConfirmation, createPendingHello, normalizePendingAccountHint, openPendingResult, parsePendingOffer, parsePendingState, pendingComparisonCode, pendingHelloHash, pendingOfferHash, PENDING_APPROVAL_LIMITS } from './security/pending-approval-crypto.js';
18
+ import { isDeepStrictEqual } from 'node:util';
19
+ import { matchesPendingBridgeDecision } from './security/bridge/pending-approval.js';
13
20
  const realSleep = (ms) => new Promise((r) => setTimeout(r, ms));
14
- /**
15
- * Drive the pairing flow to completion.
16
- *
17
- * Resolves with the token bundle on approval; rejects (with a clear, secret-free
18
- * message) on denial, expiry/consumption/unknown, or overall timeout.
19
- */
20
21
  export async function runPairing(opts) {
22
+ if (opts.pending)
23
+ return runPendingPairing(opts, opts.pending);
21
24
  const { apiUrl, bridgeId, hostname, platform, localPort, localNonce, fetchImpl = fetch, sleepImpl = realSleep, log = (msg) => console.log(msg), } = opts;
25
+ const enrollment = opts.enrollment ? await parseAccountEnrollmentLink(opts.enrollment) : undefined;
26
+ if (enrollment && (enrollment.request.kind !== 'bridge' || enrollment.request.bridgeId !== bridgeId))
27
+ throw new Error('Invalid encrypted bridge enrollment');
22
28
  const start = await postJson(fetchImpl, `${apiUrl}/api/auth/bridge/pair/start`, {
23
29
  bridgeId,
24
30
  hostname,
25
31
  platform,
32
+ ...(enrollment ? { enrollment: enrollment.request } : {}),
26
33
  });
27
34
  // P8: userCode + URL are printed; deviceCode is NEVER logged.
28
- log('Approve this machine to connect it to ftown:\n' +
29
- ` ${start.verificationUri}\n` +
30
- ` code: ${start.userCode}\n` +
31
- 'Waiting for approval…');
35
+ if (enrollment) {
36
+ accountReadUrl(apiUrl);
37
+ if (typeof start.userCode !== 'string' || !/^[A-Za-z0-9-]{1,100}$/.test(start.userCode)
38
+ || typeof start.deviceCode !== 'string' || start.deviceCode.length < 1 || start.deviceCode.length > 200
39
+ || !Number.isInteger(start.intervalMs) || start.intervalMs < 100 || start.intervalMs > 60000
40
+ || !Number.isInteger(start.expiresInMs) || start.expiresInMs < 1 || start.expiresInMs > 300000)
41
+ throw new Error('Invalid encrypted bridge approval response');
42
+ await opts.onPairingCode?.(start.userCode);
43
+ const url = new URL('/pair', apiUrl);
44
+ url.searchParams.set('code', start.userCode);
45
+ url.hash = `account=${encodeAccountEnrollmentLink(enrollment)}`;
46
+ // An interactive CLI may display this directly; redirected logs only receive instructions.
47
+ if (opts.displayEnrollmentUrl)
48
+ opts.displayEnrollmentUrl(url.href);
49
+ else if (process.stderr.isTTY)
50
+ process.stderr.write(`Approve this computer: ${url.href}\n`);
51
+ log('Waiting for encrypted computer approval. Run ftown security pair-link to display the current private approval link.');
52
+ }
53
+ else
54
+ log('Approve this machine to connect it to ftown:\n' +
55
+ ` ${start.verificationUri}\n` +
56
+ ` code: ${start.userCode}\n` +
57
+ 'Waiting for approval…');
32
58
  const deviceCode = start.deviceCode;
33
59
  const intervalMs = start.intervalMs;
34
- const deadline = Date.now() + start.expiresInMs;
60
+ const deadline = Math.min(Date.now() + start.expiresInMs, enrollment ? Date.parse(enrollment.request.expiresAt) : Infinity);
35
61
  // Wait one interval before the first poll (the user needs time to approve).
36
62
  await sleepImpl(intervalMs);
37
63
  for (;;) {
@@ -47,12 +73,15 @@ export async function runPairing(opts) {
47
73
  if (!poll.ownerId || !poll.token || !poll.refreshToken || !poll.centrifugoUrl || !poll.userId) {
48
74
  throw new Error('Pairing approved but token bundle was incomplete');
49
75
  }
76
+ if (enrollment && (!poll.accountApproval || !poll.accountHistory))
77
+ throw new Error('Encrypted bridge approval is required; no legacy fallback');
50
78
  return {
51
79
  ownerId: poll.ownerId,
52
80
  token: poll.token,
53
81
  refreshToken: poll.refreshToken,
54
82
  centrifugoUrl: poll.centrifugoUrl,
55
83
  userId: poll.userId,
84
+ ...(enrollment ? { accountApproval: poll.accountApproval, accountHistory: poll.accountHistory } : {}),
56
85
  };
57
86
  }
58
87
  case 'pending':
@@ -75,6 +104,348 @@ export async function runPairing(opts) {
75
104
  }
76
105
  }
77
106
  }
107
+ class PendingNetworkError extends Error {
108
+ constructor() { super('Computer approval service is temporarily unavailable.'); }
109
+ }
110
+ function record(value) {
111
+ if (!value || typeof value !== 'object' || Array.isArray(value))
112
+ throw new AccountTrustError('account_enrollment_invalid');
113
+ return value;
114
+ }
115
+ function text(value, limit = 16384) {
116
+ if (typeof value !== 'string' || value.length < 1 || value.length > limit)
117
+ throw new AccountTrustError('account_enrollment_invalid');
118
+ return value;
119
+ }
120
+ async function abortable(promise, signal) {
121
+ signal.throwIfAborted();
122
+ let listener;
123
+ try {
124
+ return await Promise.race([promise, new Promise((_resolve, reject) => {
125
+ listener = () => reject(signal.reason);
126
+ signal.addEventListener('abort', listener, { once: true });
127
+ if (signal.aborted)
128
+ listener();
129
+ })]);
130
+ }
131
+ finally {
132
+ if (listener)
133
+ signal.removeEventListener('abort', listener);
134
+ }
135
+ }
136
+ /** Bound the entire fetch AND body read, and never send a credential through a redirect. */
137
+ async function pendingJson(opts, path, body, lifetime) {
138
+ const base = accountReadUrl(opts.apiUrl);
139
+ const url = new URL(path, base.origin);
140
+ if (url.origin !== base.origin || !path.startsWith('/api/'))
141
+ throw new AccountTrustError('account_enrollment_invalid');
142
+ const encoded = JSON.stringify(body);
143
+ if (Buffer.byteLength(encoded) > PENDING_APPROVAL_LIMITS.maxWireBytes)
144
+ throw new AccountTrustError('account_capacity_exceeded');
145
+ const timeout = new AbortController();
146
+ const timer = setTimeout(() => timeout.abort(new PendingNetworkError()), PENDING_APPROVAL_LIMITS.requestTimeoutMs);
147
+ const signal = AbortSignal.any([lifetime, timeout.signal]);
148
+ try {
149
+ const result = await abortable((async () => {
150
+ let response;
151
+ try {
152
+ response = await (opts.fetchImpl ?? fetch)(url, { method: 'POST', headers: { 'Content-Type': 'application/json' },
153
+ body: encoded, redirect: 'manual', cache: 'no-store', signal });
154
+ }
155
+ catch {
156
+ if (lifetime.aborted)
157
+ lifetime.throwIfAborted();
158
+ throw new PendingNetworkError();
159
+ }
160
+ if (response.status >= 300 && response.status < 400)
161
+ throw new AccountTrustError('account_enrollment_invalid');
162
+ if (response.status === 429 || response.status >= 500)
163
+ throw new PendingNetworkError();
164
+ if (!response.ok)
165
+ throw new AccountTrustError(response.status === 409 ? 'account_trust_conflict'
166
+ : response.status === 410 ? 'account_enrollment_expired' : 'account_enrollment_invalid');
167
+ const declared = response.headers.get('content-length');
168
+ if (declared !== null && (!/^\d+$/.test(declared) || Number(declared) > PENDING_APPROVAL_LIMITS.maxWireBytes))
169
+ throw new AccountTrustError('account_capacity_exceeded');
170
+ const reader = response.body?.getReader();
171
+ if (!reader)
172
+ throw new AccountTrustError('account_enrollment_invalid');
173
+ const cancel = () => { void reader.cancel().catch(() => undefined); };
174
+ signal.addEventListener('abort', cancel, { once: true });
175
+ if (signal.aborted)
176
+ cancel();
177
+ const chunks = [];
178
+ let size = 0;
179
+ try {
180
+ for (;;) {
181
+ let next;
182
+ try {
183
+ next = await reader.read();
184
+ }
185
+ catch {
186
+ signal.throwIfAborted();
187
+ throw new PendingNetworkError();
188
+ }
189
+ const { done, value } = next;
190
+ if (done)
191
+ break;
192
+ size += value.byteLength;
193
+ if (size > PENDING_APPROVAL_LIMITS.maxWireBytes)
194
+ throw new AccountTrustError('account_capacity_exceeded');
195
+ chunks.push(value);
196
+ }
197
+ const bytes = Buffer.concat(chunks);
198
+ try {
199
+ return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
200
+ }
201
+ catch {
202
+ throw new AccountTrustError('account_enrollment_invalid');
203
+ }
204
+ }
205
+ finally {
206
+ signal.removeEventListener('abort', cancel);
207
+ if (signal.aborted || size > PENDING_APPROVAL_LIMITS.maxWireBytes)
208
+ cancel();
209
+ reader.releaseLock();
210
+ }
211
+ })(), signal);
212
+ lifetime.throwIfAborted();
213
+ return result;
214
+ }
215
+ finally {
216
+ clearTimeout(timer);
217
+ }
218
+ }
219
+ async function runPendingPairing(opts, ctx) {
220
+ if (opts.enrollment || ctx.request.kind !== 'bridge' || ctx.request.bridgeId !== opts.bridgeId
221
+ || !isDeepStrictEqual(ctx.request.candidate, ctx.identity.endpoint) || !/^[A-Za-z0-9_-]{43}$/.test(ctx.candidateToken))
222
+ throw new AccountTrustError('account_enrollment_invalid');
223
+ const hint = normalizePendingAccountHint(opts.accountHint);
224
+ const expires = Date.parse(ctx.request.expiresAt);
225
+ const expiry = new AbortController();
226
+ const timer = setTimeout(() => expiry.abort(new AccountTrustError('account_enrollment_expired')), Math.max(0, expires - Date.now()));
227
+ const signal = AbortSignal.any([ctx.signal, expiry.signal]);
228
+ const processNonce = Buffer.from(crypto.getRandomValues(new Uint8Array(32))).toString('base64url');
229
+ let offer;
230
+ let packet;
231
+ let confirmedOfferHash;
232
+ let credentials;
233
+ let localStatus = { version: 1, requestId: ctx.request.requestId, processNonce,
234
+ expiresAt: ctx.request.expiresAt, phase: 'waiting', offerHash: null, comparisonCode: null };
235
+ let decision;
236
+ let decisionController = new AbortController();
237
+ let statusKey = '';
238
+ const assertLive = () => { signal.throwIfAborted(); if (Date.now() >= expires)
239
+ throw new AccountTrustError('account_enrollment_expired'); };
240
+ const updateStatus = async (next) => {
241
+ const key = JSON.stringify(next);
242
+ if (key === statusKey)
243
+ return;
244
+ assertLive();
245
+ await ctx.onLocalStatus(next);
246
+ assertLive();
247
+ statusKey = key;
248
+ localStatus = next;
249
+ decision = undefined;
250
+ decisionController.abort();
251
+ decisionController = new AbortController();
252
+ if (next.phase === 'waiting' || next.phase === 'comparing' || next.phase === 'confirming') {
253
+ const current = decisionController;
254
+ void ctx.waitForLocalDecision(next, AbortSignal.any([signal, current.signal])).then(value => {
255
+ if (!current.signal.aborted && !signal.aborted && matchesPendingBridgeDecision(next, value))
256
+ decision = value;
257
+ }).catch(error => { if (!current.signal.aborted && !signal.aborted)
258
+ expiry.abort(error); });
259
+ }
260
+ };
261
+ const wait = () => abortable((opts.sleepImpl ?? realSleep)(PENDING_APPROVAL_LIMITS.pollIntervalMs), signal);
262
+ const rpc = (action) => pendingJson(opts, `/api/security/approvals/${ctx.request.requestId}/candidate`, { candidateToken: ctx.candidateToken, action }, signal);
263
+ let deviceCode;
264
+ let latest;
265
+ const checkRejection = async () => {
266
+ if (decision?.decision !== 'reject' || !matchesPendingBridgeDecision(localStatus, decision))
267
+ return;
268
+ await updateStatus({ ...localStatus, phase: 'cancelled', comparisonCode: null });
269
+ await rpc({ type: 'cancel', expectedRevision: latest?.revision ?? 0 }).catch(() => undefined);
270
+ throw new Error('Computer approval cancelled locally.');
271
+ };
272
+ try {
273
+ await updateStatus(localStatus);
274
+ (opts.log ?? console.log)('Waiting for approval in your trusted browser. Run ftown security pair-status to compare, then pair-confirm CODE or pair-reject.');
275
+ // Retry EXACT create payload: token and request were durable before this first HTTP call.
276
+ const startBody = { bridgeId: opts.bridgeId, hostname: opts.hostname, platform: opts.platform,
277
+ approvalMethod: 'pending-v1', accountHint: hint, candidateToken: ctx.candidateToken, enrollment: ctx.request };
278
+ for (;;) {
279
+ assertLive();
280
+ await checkRejection();
281
+ try {
282
+ const start = record(await pendingJson(opts, '/api/auth/bridge/pair/start', startBody, signal));
283
+ deviceCode = text(start.deviceCode, 200);
284
+ text(start.userCode, 100);
285
+ text(start.verificationUri, 4096);
286
+ if (!Number.isInteger(start.intervalMs) || Number(start.intervalMs) < 100 || Number(start.intervalMs) > 60000
287
+ || !Number.isInteger(start.expiresInMs) || Number(start.expiresInMs) < 1 || Number(start.expiresInMs) > PENDING_APPROVAL_LIMITS.lifetimeMs)
288
+ throw new AccountTrustError('account_enrollment_invalid');
289
+ break;
290
+ }
291
+ catch (error) {
292
+ if (!(error instanceof PendingNetworkError))
293
+ throw error;
294
+ await wait();
295
+ }
296
+ }
297
+ for (;;) {
298
+ assertLive();
299
+ await checkRejection();
300
+ try {
301
+ const state = await parsePendingState(await rpc({ type: 'read' }));
302
+ if (!isDeepStrictEqual(state.request, ctx.request))
303
+ throw new AccountTrustError('account_enrollment_invalid');
304
+ if (latest && state.revision < latest.revision)
305
+ throw new AccountTrustError('account_trust_conflict');
306
+ if (latest && state.revision === latest.revision && !isDeepStrictEqual(state, latest))
307
+ throw new AccountTrustError('account_trust_conflict');
308
+ latest = state;
309
+ if (['rejected', 'cancelled', 'expired', 'conflict'].includes(state.status)) {
310
+ await updateStatus({ ...localStatus, phase: state.status, comparisonCode: null });
311
+ throw new Error(`Computer approval ${state.status}. Start a new explicit request.`);
312
+ }
313
+ const selectedDecision = decision;
314
+ if (selectedDecision?.decision === 'reject')
315
+ await checkRejection();
316
+ if (state.status === 'pending') {
317
+ await wait();
318
+ continue;
319
+ }
320
+ if (!('offer' in state))
321
+ throw new AccountTrustError('account_enrollment_invalid');
322
+ const receivedOffer = await parsePendingOffer(state.offer, ctx.request);
323
+ if (!offer) {
324
+ await ctx.pinOffer(receivedOffer);
325
+ assertLive();
326
+ offer = receivedOffer;
327
+ await updateStatus({ ...localStatus, phase: 'waiting', offerHash: await pendingOfferHash(offer), comparisonCode: null });
328
+ packet = await createPendingHello(ctx.identity, offer);
329
+ assertLive();
330
+ await ctx.pinHello(packet.hello);
331
+ assertLive();
332
+ }
333
+ else if (await pendingOfferHash(receivedOffer) !== await pendingOfferHash(offer))
334
+ throw new AccountTrustError('account_trust_conflict');
335
+ if (!packet)
336
+ throw new AccountTrustError('account_enrollment_invalid');
337
+ if (state.status === 'offered') {
338
+ await rpc({ type: 'hello', expectedRevision: state.revision, hello: packet.hello });
339
+ continue;
340
+ }
341
+ if (!('hello' in state) || await pendingHelloHash(state.hello) !== await pendingHelloHash(packet.hello))
342
+ throw new AccountTrustError('account_trust_conflict');
343
+ if (state.status === 'submitted') {
344
+ await wait();
345
+ continue;
346
+ }
347
+ if (!('reveal' in state))
348
+ throw new AccountTrustError('account_enrollment_invalid');
349
+ const comparisonCode = await pendingComparisonCode(offer, packet.secret, state.reveal);
350
+ const offerHash = await pendingOfferHash(offer);
351
+ if (!confirmedOfferHash) {
352
+ if (selectedDecision?.decision !== 'confirm' || !matchesPendingBridgeDecision(localStatus, selectedDecision)) {
353
+ await updateStatus({ ...localStatus, phase: 'comparing', offerHash, comparisonCode });
354
+ await wait();
355
+ continue;
356
+ }
357
+ await updateStatus({ ...localStatus, phase: 'confirming', offerHash, comparisonCode });
358
+ confirmedOfferHash = offerHash;
359
+ }
360
+ const proof = await createPendingConfirmation(offer, packet.secret, state.reveal, confirmedOfferHash);
361
+ assertLive();
362
+ await checkRejection();
363
+ if (state.status === 'comparing') {
364
+ await rpc({ type: 'confirm', expectedRevision: state.revision, confirmation: proof });
365
+ continue;
366
+ }
367
+ if (!('confirmation' in state) || !isDeepStrictEqual(state.confirmation, proof))
368
+ throw new AccountTrustError('account_enrollment_invalid');
369
+ if (state.status === 'confirmed') {
370
+ await wait();
371
+ continue;
372
+ }
373
+ if (state.status !== 'approved')
374
+ throw new AccountTrustError('account_enrollment_invalid');
375
+ if (!credentials) {
376
+ const polled = record(await pendingJson(opts, '/api/auth/bridge/pair/poll', { deviceCode, localPort: opts.localPort }, signal));
377
+ if (polled.status === 'pending' || polled.status === 'slow_down') {
378
+ await wait();
379
+ continue;
380
+ }
381
+ if (polled.status !== 'approved' || !polled.pendingApproval)
382
+ throw new AccountTrustError('account_enrollment_invalid');
383
+ credentials = { status: 'approved', ownerId: text(polled.ownerId, 100), token: text(polled.token), refreshToken: text(polled.refreshToken),
384
+ centrifugoUrl: text(polled.centrifugoUrl, 4096), userId: text(polled.userId, 254), pendingApproval: state.result };
385
+ }
386
+ // The candidate RPC result may be renewed after credentials/pair bundle were consumed.
387
+ const readTimeout = new AbortController();
388
+ const readTimer = setTimeout(() => readTimeout.abort(new PendingNetworkError()), PENDING_APPROVAL_LIMITS.requestTimeoutMs);
389
+ let history;
390
+ try {
391
+ const readSignal = AbortSignal.any([signal, readTimeout.signal]);
392
+ history = await abortable(readAccountHistory(opts.apiUrl, credentials.token, readSignal, opts.fetchImpl ?? fetch), readSignal);
393
+ }
394
+ finally {
395
+ clearTimeout(readTimer);
396
+ }
397
+ if (!history)
398
+ throw new AccountTrustError('account_approval_required');
399
+ const readAt = Date.now();
400
+ assertLive();
401
+ await checkRejection();
402
+ const opened = await openPendingResult(ctx.identity, offer, packet.secret, state.reveal, confirmedOfferHash, state.result, history);
403
+ assertLive();
404
+ await checkRejection();
405
+ if (opened.status === 'awaiting-delivery-renewal') {
406
+ await wait();
407
+ continue;
408
+ }
409
+ if (opened.trust.checkpoint.ownerId !== credentials.ownerId)
410
+ throw new AccountTrustError('account_enrollment_invalid');
411
+ await updateStatus({ ...localStatus, phase: 'approved', offerHash, comparisonCode: null });
412
+ return { ...credentials, pendingApproval: state.result, approvalMethod: 'pending-v1', verifiedAccountTrust: opened.trust, lastServerReadAt: readAt };
413
+ }
414
+ catch (error) {
415
+ // Availability only: malformed proof/history or conflicts never turn into retries.
416
+ if (!(error instanceof PendingNetworkError) && !(error instanceof Error && error.name === 'AccountReadUnavailable'))
417
+ throw error;
418
+ await wait();
419
+ }
420
+ }
421
+ }
422
+ catch (error) {
423
+ if (!['approved', 'rejected', 'cancelled', 'expired', 'conflict'].includes(localStatus.phase)) {
424
+ const phase = error instanceof AccountTrustError && error.code === 'account_enrollment_expired' ? 'expired'
425
+ : error instanceof AccountTrustError && error.code === 'account_trust_conflict' ? 'conflict' : 'cancelled';
426
+ await ctx.onLocalStatus({ ...localStatus, phase, comparisonCode: null }).catch(() => undefined);
427
+ }
428
+ throw error;
429
+ }
430
+ finally {
431
+ clearTimeout(timer);
432
+ decisionController.abort();
433
+ expiry.abort();
434
+ packet = undefined;
435
+ }
436
+ }
437
+ /** Best effort only; the new process always uses a different request and keeps its own key. */
438
+ export async function cancelPreviousPendingPairing(apiUrl, previous, signal) {
439
+ const options = { apiUrl };
440
+ try {
441
+ const path = `/api/security/approvals/${previous.requestId}/candidate`;
442
+ const state = await parsePendingState(await pendingJson(options, path, { candidateToken: previous.candidateToken, action: { type: 'read' } }, signal));
443
+ if (['approved', 'rejected', 'cancelled', 'expired', 'conflict'].includes(state.status))
444
+ return;
445
+ await pendingJson(options, path, { candidateToken: previous.candidateToken, action: { type: 'cancel', expectedRevision: state.revision } }, signal);
446
+ }
447
+ catch { /* Cancellation cannot grant trust and never causes an automatic fallback. */ }
448
+ }
78
449
  async function postJson(fetchImpl, url, body) {
79
450
  const res = await fetchImpl(url, {
80
451
  method: 'POST',
@@ -82,8 +453,7 @@ async function postJson(fetchImpl, url, body) {
82
453
  body: JSON.stringify(body),
83
454
  });
84
455
  if (!res.ok) {
85
- const text = await res.text();
86
- throw new Error(`Pairing request to ${url} failed (${res.status}): ${text}`);
456
+ throw new Error(`Pairing request failed (${res.status})`);
87
457
  }
88
458
  return res.json();
89
459
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pairing-client.js","sourceRoot":"","sources":["../src/pairing-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pairing-client.js","sourceRoot":"","sources":["../src/pairing-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { EndpointIdentity, EndpointPublic } from './protocol.js';
2
+ import type { AccountCheckpoint, AccountEnrollmentBundle, AccountEnrollmentLink, AccountEnrollmentRequest, AccountErrorCode, AccountHistory, AccountOperation, AccountSigningIdentity, AccountTrustFailure, SignedAccountGenesis, SignedAccountTransition, VerifiedAccountTrust } from './account-protocol.js';
3
+ export declare const ACCOUNT_TRUST_LIMITS: Readonly<{
4
+ maxHistoryBytes: 2097152;
5
+ maxTransitions: 1024;
6
+ maxDevices: 128;
7
+ maxBridges: 128;
8
+ enrollmentLifetimeMs: 300000;
9
+ refreshIntervalMs: 30000;
10
+ offlineGraceMs: 86400000;
11
+ maxFutureSkewMs: 30000;
12
+ maxLabelLength: 200;
13
+ }>;
14
+ /** No untrusted text, key material or underlying crypto error enters this error. */
15
+ export declare class AccountTrustError extends Error implements AccountTrustFailure {
16
+ readonly code: AccountErrorCode;
17
+ readonly retryable: boolean;
18
+ constructor(code: AccountErrorCode);
19
+ }
20
+ export declare function parseAccountHistory(value: unknown): AccountHistory;
21
+ export declare function generateAccountSigningIdentity(extractable?: boolean): Promise<AccountSigningIdentity>;
22
+ export declare function generateAccountBridgeCandidate(bridgeId: string, extractable?: boolean): Promise<EndpointIdentity>;
23
+ export declare function importAccountBridgeCandidate(value: EndpointPublic, privateKey: JsonWebKey, extractable?: boolean): Promise<EndpointIdentity>;
24
+ export declare function createAccountGenesis(ownerId: string, value: EndpointPublic, signing: AccountSigningIdentity, name: string, now?: number): Promise<SignedAccountGenesis>;
25
+ export declare function signAccountTransition(value: AccountCheckpoint, signerId: string, signing: AccountSigningIdentity, op: AccountOperation, now?: number): Promise<SignedAccountTransition>;
26
+ export declare function verifyAccountHistory(history: AccountHistory, pinned: AccountCheckpoint | null, now?: number): Promise<AccountCheckpoint>;
27
+ export declare function parseAccountEnrollmentRequest(value: unknown, now?: number): Promise<AccountEnrollmentRequest>;
28
+ export declare function createAccountEnrollment(identity: EndpointIdentity, name: string, signing: AccountSigningIdentity | null, bridgeId: string | null, now?: number): Promise<AccountEnrollmentLink>;
29
+ export declare function encodeAccountEnrollmentLink(link: AccountEnrollmentLink): string;
30
+ export declare function parseAccountEnrollmentLink(value: unknown, now?: number): Promise<AccountEnrollmentLink>;
31
+ export declare function accountComparisonCode(link: AccountEnrollmentLink): Promise<string>;
32
+ export declare function sealAccountApproval(approver: EndpointIdentity, link: AccountEnrollmentLink, history: AccountHistory, now?: number): Promise<AccountEnrollmentBundle>;
33
+ export declare function openAccountApproval(candidate: EndpointIdentity, link: AccountEnrollmentLink, bundle: AccountEnrollmentBundle, history: AccountHistory, now?: number): Promise<VerifiedAccountTrust>;