@modelprofile.com/authswitch 6.5.0 → 7.0.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/authority-contract.d.ts +302 -6
- package/dist_ts/authority-contract.js +1 -1
- package/dist_ts/authority-runtime-contract.d.ts +13 -0
- package/dist_ts/authorityrehearsal.child.d.ts +1 -0
- package/dist_ts/authorityrehearsal.child.js +395 -0
- package/dist_ts/classes.accountlist.js +4 -3
- package/dist_ts/classes.authoritybackup.d.ts +134 -0
- package/dist_ts/classes.authoritybackup.js +769 -0
- package/dist_ts/classes.authoritybroker.d.ts +25 -5
- package/dist_ts/classes.authoritybroker.js +392 -123
- package/dist_ts/classes.authoritycli.d.ts +24 -0
- package/dist_ts/classes.authoritycli.js +675 -0
- package/dist_ts/classes.authorityclient.d.ts +19 -7
- package/dist_ts/classes.authorityclient.js +51 -14
- package/dist_ts/classes.authoritydaemon.d.ts +28 -1
- package/dist_ts/classes.authoritydaemon.js +482 -36
- package/dist_ts/classes.authoritydatabase.d.ts +175 -10
- package/dist_ts/classes.authoritydatabase.js +1100 -52
- package/dist_ts/classes.authoritymodels.d.ts +223 -1
- package/dist_ts/classes.authoritymodels.js +798 -9
- package/dist_ts/classes.authoritypreuse.d.ts +47 -0
- package/dist_ts/classes.authoritypreuse.js +278 -0
- package/dist_ts/classes.authorityregistry.d.ts +24 -0
- package/dist_ts/classes.authorityregistry.js +88 -0
- package/dist_ts/classes.authorityrehearsal.d.ts +127 -0
- package/dist_ts/classes.authorityrehearsal.js +632 -0
- package/dist_ts/classes.authorityusage.d.ts +160 -0
- package/dist_ts/classes.authorityusage.js +429 -0
- package/dist_ts/classes.claudeauthority.d.ts +66 -0
- package/dist_ts/classes.claudeauthority.js +532 -0
- package/dist_ts/classes.claudecodeharness.js +3 -2
- package/dist_ts/classes.claudecodelocks.d.ts +13 -0
- package/dist_ts/classes.claudecodelocks.js +75 -3
- package/dist_ts/classes.claudenative.d.ts +137 -0
- package/dist_ts/classes.claudenative.js +731 -0
- package/dist_ts/classes.claudestatus.d.ts +9 -0
- package/dist_ts/classes.claudestatus.js +26 -9
- package/dist_ts/classes.claudetokenrefresh.d.ts +15 -1
- package/dist_ts/classes.claudetokenrefresh.js +74 -21
- package/dist_ts/classes.codexharness.js +4 -2
- package/dist_ts/classes.codexmanaged.d.ts +11 -0
- package/dist_ts/classes.codexmanaged.js +75 -14
- package/dist_ts/classes.codexpreuse.d.ts +8 -0
- package/dist_ts/classes.codexpreuse.js +24 -6
- package/dist_ts/classes.fileharness.d.ts +2 -0
- package/dist_ts/classes.fileharness.js +6 -4
- package/dist_ts/classes.limits.js +12 -7
- package/dist_ts/classes.opencodeharness.js +2 -2
- package/dist_ts/claudehttp.d.ts +10 -0
- package/dist_ts/claudehttp.js +29 -3
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +7 -1
- package/dist_ts/interfaces.harness.d.ts +6 -0
- package/dist_ts/interfaces.list.d.ts +9 -3
- package/dist_ts/plugins.d.ts +5 -2
- package/dist_ts/plugins.js +7 -3
- package/dist_ts/ts_migration/0001_authority_meta.d.ts +3 -0
- package/dist_ts/ts_migration/0001_authority_meta.js +32 -0
- package/dist_ts/ts_migration/index.d.ts +3 -0
- package/dist_ts/ts_migration/index.js +6 -0
- package/package.json +4 -1
- package/readme.md +181 -14
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/authority-contract.ts +264 -9
- package/ts/authority-runtime-contract.ts +14 -0
- package/ts/authorityrehearsal.child.ts +330 -0
- package/ts/classes.accountlist.ts +3 -2
- package/ts/classes.authoritybackup.ts +780 -0
- package/ts/classes.authoritybroker.ts +389 -121
- package/ts/classes.authoritycli.ts +719 -0
- package/ts/classes.authorityclient.ts +75 -18
- package/ts/classes.authoritydaemon.ts +449 -36
- package/ts/classes.authoritydatabase.ts +1147 -55
- package/ts/classes.authoritymodels.ts +541 -6
- package/ts/classes.authoritypreuse.ts +297 -0
- package/ts/classes.authorityregistry.ts +118 -0
- package/ts/classes.authorityrehearsal.ts +625 -0
- package/ts/classes.authorityusage.ts +527 -0
- package/ts/classes.claudeauthority.ts +541 -0
- package/ts/classes.claudecodeharness.ts +2 -1
- package/ts/classes.claudecodelocks.ts +70 -1
- package/ts/classes.claudenative.ts +816 -0
- package/ts/classes.claudestatus.ts +38 -9
- package/ts/classes.claudetokenrefresh.ts +82 -19
- package/ts/classes.codexharness.ts +3 -1
- package/ts/classes.codexmanaged.ts +75 -12
- package/ts/classes.codexpreuse.ts +33 -5
- package/ts/classes.fileharness.ts +7 -3
- package/ts/classes.limits.ts +11 -6
- package/ts/classes.opencodeharness.ts +1 -1
- package/ts/claudehttp.ts +31 -2
- package/ts/index.ts +6 -0
- package/ts/interfaces.harness.ts +6 -0
- package/ts/interfaces.list.ts +9 -3
- package/ts/plugins.ts +7 -2
- package/ts/ts_migration/0001_authority_meta.ts +33 -0
- package/ts/ts_migration/index.ts +7 -0
|
@@ -0,0 +1,632 @@
|
|
|
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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
|