@modelprofile.com/authswitch 7.0.0 → 8.1.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.
Files changed (86) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/authority-contract.d.ts +1 -3
  3. package/dist_ts/authority-contract.js +1 -1
  4. package/dist_ts/authority-import-contract.d.ts +207 -0
  5. package/dist_ts/authority-import-contract.js +18 -0
  6. package/dist_ts/classes.authoritybroker.js +1 -5
  7. package/dist_ts/classes.authoritycli.d.ts +4 -0
  8. package/dist_ts/classes.authoritycli.js +149 -12
  9. package/dist_ts/classes.authorityclient.d.ts +7 -0
  10. package/dist_ts/classes.authorityclient.js +13 -1
  11. package/dist_ts/classes.authoritydaemon.d.ts +4 -0
  12. package/dist_ts/classes.authoritydaemon.js +75 -9
  13. package/dist_ts/classes.authoritydatabase.d.ts +10 -26
  14. package/dist_ts/classes.authoritydatabase.js +68 -133
  15. package/dist_ts/classes.authorityimport.d.ts +161 -0
  16. package/dist_ts/classes.authorityimport.js +638 -0
  17. package/dist_ts/classes.authoritymodels.d.ts +39 -43
  18. package/dist_ts/classes.authoritymodels.js +209 -243
  19. package/dist_ts/classes.authoritypreuse.js +1 -2
  20. package/dist_ts/classes.authorityregistry.d.ts +2 -17
  21. package/dist_ts/classes.authorityregistry.js +18 -74
  22. package/dist_ts/classes.authoritysecrets.d.ts +1 -1
  23. package/dist_ts/classes.authoritysecrets.js +2 -2
  24. package/dist_ts/classes.authorityusage.d.ts +3 -3
  25. package/dist_ts/classes.claudeauthority.js +3 -7
  26. package/dist_ts/classes.claudenative.d.ts +1 -8
  27. package/dist_ts/classes.claudenative.js +2 -25
  28. package/dist_ts/classes.codexmanaged.d.ts +1 -1
  29. package/dist_ts/index.d.ts +1 -0
  30. package/dist_ts/index.js +6 -3
  31. package/dist_ts/plugins.d.ts +7 -7
  32. package/dist_ts/plugins.js +8 -8
  33. package/dist_ts/ts_migration/0001_authority_meta.d.ts +13 -3
  34. package/dist_ts/ts_migration/0001_authority_meta.js +29 -17
  35. package/dist_ts/ts_migration/0002_remove_backup_records.d.ts +17 -0
  36. package/dist_ts/ts_migration/0002_remove_backup_records.js +48 -0
  37. package/dist_ts/ts_migration/index.d.ts +6 -3
  38. package/dist_ts/ts_migration/index.js +10 -4
  39. package/dist_ts/ts_migration/legacysources/authswitchstores.d.ts +2 -0
  40. package/dist_ts/ts_migration/legacysources/authswitchstores.js +244 -0
  41. package/dist_ts/ts_migration/legacysources/index.d.ts +18 -0
  42. package/dist_ts/ts_migration/legacysources/index.js +24 -0
  43. package/dist_ts/ts_migration/legacysources/material.d.ts +37 -0
  44. package/dist_ts/ts_migration/legacysources/material.js +120 -0
  45. package/dist_ts/ts_migration/legacysources/nativestores.d.ts +2 -0
  46. package/dist_ts/ts_migration/legacysources/nativestores.js +207 -0
  47. package/dist_ts/ts_migration/legacysources/shared.d.ts +124 -0
  48. package/dist_ts/ts_migration/legacysources/shared.js +142 -0
  49. package/package.json +6 -5
  50. package/readme.md +68 -26
  51. package/ts/00_commitinfo_data.ts +1 -1
  52. package/ts/authority-contract.ts +1 -3
  53. package/ts/authority-import-contract.ts +216 -0
  54. package/ts/classes.authoritybroker.ts +0 -4
  55. package/ts/classes.authoritycli.ts +165 -11
  56. package/ts/classes.authorityclient.ts +22 -0
  57. package/ts/classes.authoritydaemon.ts +75 -8
  58. package/ts/classes.authoritydatabase.ts +70 -145
  59. package/ts/classes.authorityimport.ts +718 -0
  60. package/ts/classes.authoritymodels.ts +253 -269
  61. package/ts/classes.authoritypreuse.ts +0 -1
  62. package/ts/classes.authorityregistry.ts +20 -91
  63. package/ts/classes.authoritysecrets.ts +1 -1
  64. package/ts/classes.authorityusage.ts +3 -3
  65. package/ts/classes.claudeauthority.ts +2 -6
  66. package/ts/classes.claudenative.ts +1 -32
  67. package/ts/classes.codexmanaged.ts +1 -1
  68. package/ts/index.ts +5 -2
  69. package/ts/plugins.ts +7 -7
  70. package/ts/ts_migration/0001_authority_meta.ts +29 -17
  71. package/ts/ts_migration/0002_remove_backup_records.ts +49 -0
  72. package/ts/ts_migration/index.ts +10 -5
  73. package/ts/ts_migration/legacysources/authswitchstores.ts +211 -0
  74. package/ts/ts_migration/legacysources/index.ts +35 -0
  75. package/ts/ts_migration/legacysources/material.ts +134 -0
  76. package/ts/ts_migration/legacysources/nativestores.ts +204 -0
  77. package/ts/ts_migration/legacysources/shared.ts +220 -0
  78. package/dist_ts/authorityrehearsal.child.d.ts +0 -1
  79. package/dist_ts/authorityrehearsal.child.js +0 -395
  80. package/dist_ts/classes.authoritybackup.d.ts +0 -134
  81. package/dist_ts/classes.authoritybackup.js +0 -769
  82. package/dist_ts/classes.authorityrehearsal.d.ts +0 -127
  83. package/dist_ts/classes.authorityrehearsal.js +0 -632
  84. package/ts/authorityrehearsal.child.ts +0 -330
  85. package/ts/classes.authoritybackup.ts +0 -780
  86. package/ts/classes.authorityrehearsal.ts +0 -625
@@ -1,632 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- import { commitinfo } from './00_commitinfo_data.js';
3
- import { assertAuthorityStoredRecord } from './classes.authorityregistry.js';
4
- export const authorityRehearsalProtocolVersion = 1;
5
- export const authorityRehearsalMaximumFrameBytes = 8 * 1024 * 1024;
6
- export const authorityRehearsalMaximumRecordBytes = 1024 * 1024;
7
- export const authorityRehearsalMaximumSourceBytes = 4 * 1024 * 1024;
8
- const defaultRequestTimeoutMs = 120_000;
9
- const terminationGraceMs = 2_000;
10
- const object = (value) => value !== null
11
- && typeof value === 'object' && !Array.isArray(value)
12
- && [Object.prototype, null].includes(Object.getPrototypeOf(value));
13
- const exactKeys = (value, keys) => Object.keys(value).length === keys.length && keys.every(key => Object.hasOwn(value, key));
14
- const name = (value) => typeof value === 'string'
15
- && /^[a-zA-Z0-9_.:-]{1,256}$/.test(value);
16
- const hash = (value) => typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);
17
- const sequence = (value) => Number.isSafeInteger(value) && Number(value) >= 0;
18
- const digestField = (value) => value === 'sourceDigest' || value === 'before.credentialDigest' || value === 'before.configDigest';
19
- const sourceDigest = (bytes) => plugins.crypto.createHash('sha256').update(bytes).digest('hex');
20
- const assertWireSource = value => {
21
- if (!object(value) || !exactKeys(value, ['kind', 'sourceKind', 'sourceId', 'sourceDigest',
22
- 'linkedModel', 'linkedId', 'linkedDigestField', 'bytesBase64url'])
23
- || value.kind !== 'source' || !name(value.sourceKind) || !name(value.sourceId)
24
- || !hash(value.sourceDigest) || !name(value.linkedModel) || !name(value.linkedId)
25
- || !digestField(value.linkedDigestField) || typeof value.bytesBase64url !== 'string'
26
- || value.bytesBase64url.length === 0
27
- || value.bytesBase64url.length > Math.ceil(authorityRehearsalMaximumSourceBytes * 4 / 3)
28
- || !/^[A-Za-z0-9_-]+$/.test(value.bytesBase64url)) {
29
- throw new Error('Invalid rehearsal source frame.');
30
- }
31
- const bytes = Buffer.from(value.bytesBase64url, 'base64url');
32
- try {
33
- if (bytes.byteLength === 0 || bytes.byteLength > authorityRehearsalMaximumSourceBytes
34
- || bytes.toString('base64url') !== value.bytesBase64url
35
- || sourceDigest(bytes) !== value.sourceDigest)
36
- throw new Error('Invalid rehearsal source bytes.');
37
- }
38
- finally {
39
- bytes.fill(0);
40
- }
41
- };
42
- const assertWireRecord = value => {
43
- if (!object(value) || !exactKeys(value, ['model', 'id', 'value'])
44
- || !name(value.model) || !name(value.id))
45
- throw new Error('Invalid rehearsal record frame.');
46
- const encoded = Buffer.from(JSON.stringify(value.value), 'utf8');
47
- try {
48
- if (encoded.byteLength > authorityRehearsalMaximumRecordBytes) {
49
- throw new Error('Rehearsal record exceeds its size bound.');
50
- }
51
- }
52
- finally {
53
- encoded.fill(0);
54
- }
55
- assertAuthorityStoredRecord(value);
56
- };
57
- export const parseAuthorityRehearsalWireEntry = (value) => {
58
- if (object(value) && value.kind === 'source') {
59
- assertWireSource(value);
60
- return value;
61
- }
62
- assertWireRecord(value);
63
- return value;
64
- };
65
- export const restoredEntryToWire = (entry) => {
66
- if ('kind' in entry) {
67
- if (!(entry.bytes instanceof Uint8Array) || entry.bytes.byteLength === 0
68
- || entry.bytes.byteLength > authorityRehearsalMaximumSourceBytes
69
- || sourceDigest(entry.bytes) !== entry.sourceDigest)
70
- throw new Error('Invalid rehearsal source entry.');
71
- const wire = {
72
- kind: 'source', sourceKind: entry.sourceKind, sourceId: entry.sourceId,
73
- sourceDigest: entry.sourceDigest, linkedModel: entry.linkedModel, linkedId: entry.linkedId,
74
- linkedDigestField: entry.linkedDigestField,
75
- bytesBase64url: Buffer.from(entry.bytes).toString('base64url'),
76
- };
77
- assertWireSource(wire);
78
- return wire;
79
- }
80
- assertWireRecord(entry);
81
- return entry;
82
- };
83
- export const wireSourceToRestored = (source) => {
84
- assertWireSource(source);
85
- return {
86
- kind: 'source', sourceKind: source.sourceKind, sourceId: source.sourceId,
87
- sourceDigest: source.sourceDigest, linkedModel: source.linkedModel, linkedId: source.linkedId,
88
- linkedDigestField: source.linkedDigestField, bytes: Buffer.from(source.bytesBase64url, 'base64url'),
89
- };
90
- };
91
- export const parseAuthorityRehearsalParentMessage = (value) => {
92
- if (!object(value) || value.version !== authorityRehearsalProtocolVersion || typeof value.type !== 'string') {
93
- throw new Error('Invalid rehearsal parent frame.');
94
- }
95
- if (value.type === 'stage') {
96
- if (!exactKeys(value, ['version', 'type', 'sequence', 'entry']) || !sequence(value.sequence)) {
97
- throw new Error('Invalid rehearsal stage frame.');
98
- }
99
- return { version: 1, type: 'stage', sequence: value.sequence, entry: parseAuthorityRehearsalWireEntry(value.entry) };
100
- }
101
- if (value.type === 'finish') {
102
- if (!exactKeys(value, ['version', 'type', 'sequence']) || !sequence(value.sequence)) {
103
- throw new Error('Invalid rehearsal finish frame.');
104
- }
105
- return value;
106
- }
107
- if (!['restore.next', 'record.next', 'source.next', 'close'].includes(value.type)
108
- || !exactKeys(value, ['version', 'type']))
109
- throw new Error('Invalid rehearsal control frame.');
110
- return value;
111
- };
112
- export const parseAuthorityRehearsalChildMessage = (value) => {
113
- if (!object(value) || value.version !== authorityRehearsalProtocolVersion || typeof value.type !== 'string') {
114
- throw new Error('Invalid rehearsal child frame.');
115
- }
116
- if (['ready', 'input.complete', 'closed'].includes(value.type)) {
117
- if (!exactKeys(value, ['version', 'type']))
118
- throw new Error('Invalid rehearsal lifecycle frame.');
119
- return value;
120
- }
121
- if (value.type === 'staged') {
122
- if (!exactKeys(value, ['version', 'type', 'sequence']) || !sequence(value.sequence)) {
123
- throw new Error('Invalid rehearsal staged frame.');
124
- }
125
- return value;
126
- }
127
- if (value.type === 'restore.progress') {
128
- if (!exactKeys(value, ['version', 'type', 'done']) || typeof value.done !== 'boolean') {
129
- throw new Error('Invalid rehearsal restore frame.');
130
- }
131
- return value;
132
- }
133
- if (value.type === 'record') {
134
- if (!exactKeys(value, ['version', 'type', 'record']))
135
- throw new Error('Invalid rehearsal record response.');
136
- if (value.record !== null)
137
- assertWireRecord(value.record);
138
- return value;
139
- }
140
- if (value.type === 'source') {
141
- if (!exactKeys(value, ['version', 'type', 'source']))
142
- throw new Error('Invalid rehearsal source response.');
143
- if (value.source !== null)
144
- assertWireSource(value.source);
145
- return value;
146
- }
147
- if (value.type === 'failed') {
148
- if (!exactKeys(value, ['version', 'type', 'phase'])
149
- || !['protocol', 'staging', 'restore', 'readback', 'cleanup'].includes(String(value.phase))) {
150
- throw new Error('Invalid rehearsal failure frame.');
151
- }
152
- return value;
153
- }
154
- throw new Error('Unknown rehearsal child frame.');
155
- };
156
- /** Single-reader/single-writer bounded transport for the isolated rehearsal child. */
157
- export class AuthorityRehearsalFramedTransport {
158
- options;
159
- header = Buffer.allocUnsafe(4);
160
- headerOffset = 0;
161
- body;
162
- bodyOffset = 0;
163
- queued;
164
- waiting;
165
- failure;
166
- closed = false;
167
- sending = false;
168
- constructor(options) {
169
- this.options = options;
170
- options.readable.on('data', this.onData);
171
- options.readable.once('error', this.onReadError);
172
- options.readable.once('end', this.onReadableClose);
173
- options.readable.once('close', this.onReadableClose);
174
- options.writable.once('error', this.onWriteError);
175
- }
176
- async send(message, timeoutMs, signal) {
177
- if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1)
178
- throw new Error('Invalid rehearsal write deadline.');
179
- signal?.throwIfAborted();
180
- if (this.closed || this.failure || this.sending || this.options.writable.destroyed
181
- || this.options.writable.writableEnded)
182
- throw new Error('Rehearsal transport is unavailable.');
183
- this.options.validateOutgoing(message);
184
- const serialized = Buffer.from(JSON.stringify(message), 'utf8');
185
- if (serialized.byteLength > authorityRehearsalMaximumFrameBytes) {
186
- serialized.fill(0);
187
- throw new Error('Rehearsal IPC frame exceeds its size bound.');
188
- }
189
- const frame = Buffer.allocUnsafe(4 + serialized.byteLength);
190
- frame.writeUInt32BE(serialized.byteLength, 0);
191
- serialized.copy(frame, 4);
192
- serialized.fill(0);
193
- this.sending = true;
194
- try {
195
- await new Promise((resolve, reject) => {
196
- let settled = false;
197
- let timer;
198
- const cleanup = () => {
199
- if (timer)
200
- clearTimeout(timer);
201
- signal?.removeEventListener('abort', abort);
202
- this.options.writable.removeListener('close', closed);
203
- };
204
- const finish = (error) => {
205
- if (settled)
206
- return;
207
- settled = true;
208
- cleanup();
209
- if (error)
210
- reject(error);
211
- else
212
- resolve();
213
- };
214
- const interrupt = (messageArg) => {
215
- const error = new Error(messageArg);
216
- this.fail(error);
217
- // Writable.destroy() releases pending chunks before its close event. Do not settle or wipe here.
218
- };
219
- const abort = () => interrupt('Rehearsal write was cancelled.');
220
- const closed = () => finish(this.failure ?? new Error('Rehearsal transport closed during its write.'));
221
- timer = setTimeout(() => interrupt('Rehearsal child exceeded its write deadline.'), timeoutMs);
222
- timer.unref?.();
223
- this.options.writable.once('close', closed);
224
- signal?.addEventListener('abort', abort, { once: true });
225
- if (signal?.aborted)
226
- abort();
227
- if (!this.failure) {
228
- try {
229
- this.options.writable.write(frame, (error) => finish(error ?? this.failure));
230
- }
231
- catch (error) {
232
- finish(error instanceof Error ? error : new Error('Rehearsal IPC write failed.'));
233
- }
234
- }
235
- });
236
- }
237
- finally {
238
- this.sending = false;
239
- frame.fill(0);
240
- }
241
- }
242
- receive(timeoutMs, signal) {
243
- if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1)
244
- throw new Error('Invalid rehearsal request deadline.');
245
- signal?.throwIfAborted();
246
- if (this.queued !== undefined) {
247
- const value = this.queued;
248
- this.queued = undefined;
249
- return Promise.resolve(value);
250
- }
251
- if (this.failure)
252
- return Promise.reject(this.failure);
253
- if (this.closed)
254
- return Promise.reject(new Error('Rehearsal transport closed before its response.'));
255
- if (this.waiting)
256
- return Promise.reject(new Error('Rehearsal transport already has a waiting reader.'));
257
- return new Promise((resolve, reject) => {
258
- let timer;
259
- const abort = () => this.fail(new Error('Rehearsal request was cancelled.'));
260
- const finish = (error, value) => {
261
- if (this.waiting?.resolve !== waiting.resolve)
262
- return;
263
- this.waiting = undefined;
264
- if (timer)
265
- clearTimeout(timer);
266
- signal?.removeEventListener('abort', abort);
267
- if (error)
268
- reject(error);
269
- else
270
- resolve(value);
271
- };
272
- const waiting = { resolve: (value) => finish(undefined, value), reject: (error) => finish(error) };
273
- this.waiting = waiting;
274
- timer = setTimeout(() => this.fail(new Error('Rehearsal child exceeded its response deadline.')), timeoutMs);
275
- timer.unref?.();
276
- signal?.addEventListener('abort', abort, { once: true });
277
- });
278
- }
279
- async finishWritable() {
280
- if (this.options.writable.destroyed || this.options.writable.writableEnded)
281
- return;
282
- await new Promise((resolve, reject) => {
283
- this.options.writable.end((error) => error ? reject(error) : resolve());
284
- });
285
- }
286
- destroy() {
287
- this.closed = true;
288
- this.detach();
289
- this.body?.fill(0);
290
- this.body = undefined;
291
- this.options.readable.destroy();
292
- this.options.writable.destroy();
293
- this.waiting?.reject(new Error('Rehearsal transport was destroyed.'));
294
- }
295
- onData = (chunkValue) => {
296
- if (this.closed || this.failure)
297
- return;
298
- const chunk = chunkValue instanceof Uint8Array
299
- ? Buffer.from(chunkValue.buffer, chunkValue.byteOffset, chunkValue.byteLength) : undefined;
300
- if (!chunk)
301
- return this.fail(new Error('Rehearsal IPC received a non-byte chunk.'));
302
- let offset = 0;
303
- try {
304
- while (offset < chunk.byteLength) {
305
- if (!this.body) {
306
- const count = Math.min(4 - this.headerOffset, chunk.byteLength - offset);
307
- chunk.copy(this.header, this.headerOffset, offset, offset + count);
308
- this.headerOffset += count;
309
- offset += count;
310
- if (this.headerOffset < 4)
311
- continue;
312
- const length = this.header.readUInt32BE(0);
313
- if (length < 1 || length > authorityRehearsalMaximumFrameBytes) {
314
- throw new Error('Rehearsal IPC frame exceeds its size bound.');
315
- }
316
- this.body = Buffer.allocUnsafe(length);
317
- this.bodyOffset = 0;
318
- continue;
319
- }
320
- const count = Math.min(this.body.byteLength - this.bodyOffset, chunk.byteLength - offset);
321
- chunk.copy(this.body, this.bodyOffset, offset, offset + count);
322
- this.bodyOffset += count;
323
- offset += count;
324
- if (this.bodyOffset === this.body.byteLength)
325
- this.finishBody();
326
- }
327
- }
328
- catch (error) {
329
- this.fail(error instanceof Error ? error : new Error('Rehearsal IPC framing failed.'));
330
- }
331
- };
332
- finishBody() {
333
- const body = this.body;
334
- this.body = undefined;
335
- this.bodyOffset = 0;
336
- this.headerOffset = 0;
337
- if (!body)
338
- throw new Error('Rehearsal IPC lost its frame body.');
339
- let value;
340
- try {
341
- value = JSON.parse(body.toString('utf8'));
342
- }
343
- catch {
344
- throw new Error('Rehearsal IPC frame contains invalid JSON.');
345
- }
346
- finally {
347
- body.fill(0);
348
- }
349
- const message = this.options.parseIncoming(value);
350
- if (this.waiting)
351
- this.waiting.resolve(message);
352
- else if (this.queued === undefined)
353
- this.queued = message;
354
- else
355
- throw new Error('Rehearsal peer violated serialized request flow.');
356
- }
357
- onReadError = (error) => this.fail(error);
358
- onWriteError = (error) => this.fail(error);
359
- onReadableClose = () => {
360
- if (this.failure)
361
- return;
362
- if (this.headerOffset || this.body)
363
- return this.fail(new Error('Rehearsal IPC ended within a frame.'));
364
- this.fail(new Error('Rehearsal IPC closed before its response.'));
365
- };
366
- fail(error) {
367
- if (this.failure)
368
- return;
369
- this.failure = error;
370
- this.closed = true;
371
- this.detach();
372
- this.body?.fill(0);
373
- this.body = undefined;
374
- this.waiting?.reject(error);
375
- this.options.readable.destroy();
376
- this.options.writable.destroy();
377
- }
378
- detach() {
379
- this.options.readable.removeListener('data', this.onData);
380
- this.options.readable.removeListener('error', this.onReadError);
381
- this.options.readable.removeListener('end', this.onReadableClose);
382
- this.options.readable.removeListener('close', this.onReadableClose);
383
- this.options.writable.removeListener('error', this.onWriteError);
384
- }
385
- }
386
- const sanitizedEnvironment = () => {
387
- const result = {};
388
- for (const key of ['PATH', 'PATHEXT', 'SYSTEMROOT', 'WINDIR', 'COMSPEC', 'TEMP', 'TMP', 'TMPDIR',
389
- 'LANG', 'LC_ALL', 'TZ']) {
390
- if (process.env[key] !== undefined)
391
- result[key] = process.env[key];
392
- }
393
- return result;
394
- };
395
- export const resolveAuthorityRehearsalChildEntryPath = () => {
396
- const sourceDirectory = plugins.path.dirname(plugins.fileURLToPath(import.meta.url));
397
- const packageDirectory = plugins.fs.realpathSync.native(plugins.path.dirname(sourceDirectory));
398
- const manifestPath = plugins.fs.realpathSync.native(plugins.path.join(packageDirectory, 'package.json'));
399
- const manifest = JSON.parse(plugins.fs.readFileSync(manifestPath, 'utf8'));
400
- if (!object(manifest) || manifest.name !== commitinfo.name) {
401
- throw new Error('The rehearsal child package identity is invalid.');
402
- }
403
- const entryPath = plugins.fs.realpathSync.native(plugins.path.join(packageDirectory, 'dist_ts', 'authorityrehearsal.child.js'));
404
- if (plugins.path.relative(packageDirectory, entryPath)
405
- !== plugins.path.join('dist_ts', 'authorityrehearsal.child.js')
406
- || !plugins.fs.statSync(entryPath).isFile()) {
407
- throw new Error('The rehearsal child entry escaped its package.');
408
- }
409
- return entryPath;
410
- };
411
- const observeClose = (child) => new Promise(resolve => {
412
- let error;
413
- child.once('error', value => { error = value; });
414
- child.once('close', (code, signal) => resolve({ code, signal, error }));
415
- });
416
- const within = async (promise, timeoutMs, message) => {
417
- let timer;
418
- try {
419
- return await Promise.race([promise, new Promise((_, reject) => {
420
- timer = setTimeout(() => reject(new Error(message)), timeoutMs);
421
- timer.unref?.();
422
- })]);
423
- }
424
- finally {
425
- if (timer)
426
- clearTimeout(timer);
427
- }
428
- };
429
- export class AuthSwitchAuthorityRehearsal {
430
- options;
431
- requestTimeoutMs;
432
- constructor(options = {}) {
433
- this.options = options;
434
- this.requestTimeoutMs = options.requestTimeoutMs ?? defaultRequestTimeoutMs;
435
- if (!Number.isSafeInteger(this.requestTimeoutMs) || this.requestTimeoutMs < 1) {
436
- throw new Error('Invalid rehearsal child deadline.');
437
- }
438
- }
439
- async restoreClosed(entries) {
440
- this.options.signal?.throwIfAborted();
441
- const root = await plugins.fs.promises.mkdtemp(plugins.path.join(plugins.os.tmpdir(), 'authswitch-rehearsal-'));
442
- await plugins.fs.promises.chmod(root, 0o700);
443
- let child;
444
- let transport;
445
- let lifecycle;
446
- let handedOff = false;
447
- try {
448
- const sourceEntry = plugins.fileURLToPath(new URL('./authorityrehearsal.child.ts', import.meta.url));
449
- const entryPath = this.options.childFactory ? sourceEntry : resolveAuthorityRehearsalChildEntryPath();
450
- const packageDirectory = plugins.path.dirname(plugins.path.dirname(entryPath));
451
- const launch = { entryPath, args: [root], options: {
452
- cwd: packageDirectory, env: sanitizedEnvironment(), shell: false, windowsHide: true,
453
- stdio: ['ignore', 'ignore', 'ignore', 'pipe', 'pipe'],
454
- } };
455
- child = (this.options.childFactory ?? (input => plugins.childProcess.spawn(process.execPath, [input.entryPath, ...input.args], input.options)))(launch);
456
- lifecycle = observeClose(child);
457
- if (!child.pid)
458
- throw new Error('The rehearsal child did not start.');
459
- const writer = child.stdio[3];
460
- const reader = child.stdio[4];
461
- if (!(writer instanceof plugins.stream.Writable) || !(reader instanceof plugins.stream.Readable)) {
462
- throw new Error('The rehearsal child control pipes were not created.');
463
- }
464
- transport = new AuthorityRehearsalFramedTransport({ readable: reader, writable: writer,
465
- parseIncoming: parseAuthorityRehearsalChildMessage,
466
- validateOutgoing: parseAuthorityRehearsalParentMessage });
467
- const first = await transport.receive(this.requestTimeoutMs, this.options.signal);
468
- this.expect(first, 'ready');
469
- let itemSequence = 0;
470
- for await (const entry of entries) {
471
- this.options.signal?.throwIfAborted();
472
- const response = await this.exchange(transport, { version: 1, type: 'stage', sequence: itemSequence, entry: restoredEntryToWire(entry) }, this.options.signal);
473
- if (response.type !== 'staged' || response.sequence !== itemSequence) {
474
- throw new Error('The rehearsal child did not acknowledge the staged entry.');
475
- }
476
- itemSequence++;
477
- }
478
- this.expect(await this.exchange(transport, { version: 1, type: 'finish', sequence: itemSequence }, this.options.signal), 'input.complete');
479
- while (true) {
480
- const response = await this.exchange(transport, { version: 1, type: 'restore.next' }, this.options.signal);
481
- if (response.type !== 'restore.progress')
482
- throw new Error('The rehearsal child returned an invalid restore response.');
483
- if (response.done)
484
- break;
485
- }
486
- let recordsStarted = false;
487
- let recordsDone = false;
488
- let sourcesStarted = false;
489
- let sourcesDone = false;
490
- let closePromise;
491
- const close = () => {
492
- if (closePromise)
493
- return closePromise;
494
- closePromise = this.closeReadback({ child: child, lifecycle: lifecycle, transport: transport, root,
495
- complete: recordsDone && sourcesDone });
496
- return closePromise;
497
- };
498
- const self = this;
499
- const records = async function* () {
500
- if (recordsStarted)
501
- throw new Error('Rehearsal records may only be read once.');
502
- recordsStarted = true;
503
- while (true) {
504
- const response = await self.exchange(transport, { version: 1, type: 'record.next' }, self.options.signal);
505
- if (response.type !== 'record')
506
- throw new Error('The rehearsal child returned an invalid record response.');
507
- if (response.record === null) {
508
- recordsDone = true;
509
- return;
510
- }
511
- yield response.record;
512
- }
513
- };
514
- const sources = async function* () {
515
- if (!recordsDone)
516
- throw new Error('Rehearsal sources require complete record readback first.');
517
- if (sourcesStarted)
518
- throw new Error('Rehearsal sources may only be read once.');
519
- sourcesStarted = true;
520
- while (true) {
521
- const response = await self.exchange(transport, { version: 1, type: 'source.next' }, self.options.signal);
522
- if (response.type !== 'source')
523
- throw new Error('The rehearsal child returned an invalid source response.');
524
- if (response.source === null) {
525
- sourcesDone = true;
526
- return;
527
- }
528
- yield wireSourceToRestored(response.source);
529
- }
530
- };
531
- handedOff = true;
532
- return { records: records(), sources: sources(), close };
533
- }
534
- catch (error) {
535
- if (child && lifecycle) {
536
- try {
537
- await this.abortChild(child, lifecycle, transport, !this.options.signal?.aborted);
538
- }
539
- catch (cleanupError) {
540
- throw new AggregateError([error, cleanupError], 'Rehearsal restore and cleanup failed.');
541
- }
542
- }
543
- throw error;
544
- }
545
- finally {
546
- if (!handedOff)
547
- await plugins.fs.promises.rm(root, { recursive: true, force: true });
548
- }
549
- }
550
- async exchange(transport, message, signal) {
551
- const deadline = Date.now() + this.requestTimeoutMs;
552
- await transport.send(message, this.requestTimeoutMs, signal);
553
- const remaining = deadline - Date.now();
554
- if (remaining < 1) {
555
- transport.destroy();
556
- throw new Error('The rehearsal child exceeded its request deadline.');
557
- }
558
- const response = await transport.receive(remaining, signal);
559
- if (response.type === 'failed')
560
- throw new Error(`The rehearsal child failed during ${response.phase}.`);
561
- return response;
562
- }
563
- expect(message, type) {
564
- if (message.type === 'failed')
565
- throw new Error(`The rehearsal child failed during ${message.phase}.`);
566
- if (message.type !== type)
567
- throw new Error(`The rehearsal child did not return ${type}.`);
568
- }
569
- async closeReadback(input) {
570
- let failure;
571
- try {
572
- if (!input.complete)
573
- throw new Error('The rehearsal readback was not consumed completely.');
574
- this.expect(await this.exchange(input.transport, { version: 1, type: 'close' }), 'closed');
575
- await input.transport.finishWritable();
576
- const outcome = await within(input.lifecycle, this.requestTimeoutMs, 'The rehearsal child did not close after cleanup.');
577
- if (outcome.error || outcome.signal !== null || outcome.code !== 0) {
578
- throw new Error('The rehearsal child did not close cleanly.');
579
- }
580
- }
581
- catch (error) {
582
- failure = error;
583
- try {
584
- await this.abortChild(input.child, input.lifecycle, input.transport, !this.options.signal?.aborted);
585
- }
586
- catch (cleanupError) {
587
- failure = new AggregateError([error, cleanupError], 'Rehearsal close cleanup failed.');
588
- }
589
- }
590
- finally {
591
- input.transport.destroy();
592
- try {
593
- await plugins.fs.promises.rm(input.root, { recursive: true, force: false });
594
- }
595
- catch (error) {
596
- failure = failure
597
- ? new AggregateError([failure, error], 'Rehearsal artifact cleanup failed.') : error;
598
- }
599
- }
600
- if (failure)
601
- throw failure;
602
- }
603
- async abortChild(child, lifecycle, transport, graceful = true) {
604
- if (transport && graceful) {
605
- try {
606
- const response = await within(this.exchange(transport, { version: 1, type: 'close' }), terminationGraceMs, 'Rehearsal child close request timed out.');
607
- if (response.type === 'closed')
608
- await transport.finishWritable();
609
- }
610
- catch { /* The child may already be failed or gone. */ }
611
- }
612
- if (!graceful)
613
- transport?.destroy();
614
- try {
615
- await within(lifecycle, terminationGraceMs, 'Rehearsal child did not close voluntarily.');
616
- }
617
- catch {
618
- child.kill('SIGTERM');
619
- try {
620
- await within(lifecycle, terminationGraceMs, 'Rehearsal child ignored SIGTERM.');
621
- }
622
- catch {
623
- child.kill('SIGKILL');
624
- await within(lifecycle, this.requestTimeoutMs, 'Rehearsal child exit could not be confirmed.');
625
- }
626
- }
627
- finally {
628
- transport?.destroy();
629
- }
630
- }
631
- }
632
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHlyZWhlYXJzYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmF1dGhvcml0eXJlaGVhcnNhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFTN0UsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcsQ0FBVSxDQUFDO0FBQzVELE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDaEUsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDcEUsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUM7QUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFFakMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFjLEVBQW9DLEVBQUUsQ0FBQyxLQUFLLEtBQUssSUFBSTtPQUM5RSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztPQUNsRCxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNyRSxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQThCLEVBQUUsSUFBdUIsRUFBVyxFQUFFLENBQ3JGLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUks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