@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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/authority-contract.d.ts +1 -3
- package/dist_ts/authority-contract.js +1 -1
- package/dist_ts/authority-import-contract.d.ts +207 -0
- package/dist_ts/authority-import-contract.js +18 -0
- package/dist_ts/classes.authoritybroker.js +1 -5
- package/dist_ts/classes.authoritycli.d.ts +4 -0
- package/dist_ts/classes.authoritycli.js +149 -12
- package/dist_ts/classes.authorityclient.d.ts +7 -0
- package/dist_ts/classes.authorityclient.js +13 -1
- package/dist_ts/classes.authoritydaemon.d.ts +4 -0
- package/dist_ts/classes.authoritydaemon.js +75 -9
- package/dist_ts/classes.authoritydatabase.d.ts +10 -26
- package/dist_ts/classes.authoritydatabase.js +68 -133
- package/dist_ts/classes.authorityimport.d.ts +161 -0
- package/dist_ts/classes.authorityimport.js +638 -0
- package/dist_ts/classes.authoritymodels.d.ts +39 -43
- package/dist_ts/classes.authoritymodels.js +209 -243
- package/dist_ts/classes.authoritypreuse.js +1 -2
- package/dist_ts/classes.authorityregistry.d.ts +2 -17
- package/dist_ts/classes.authorityregistry.js +18 -74
- package/dist_ts/classes.authoritysecrets.d.ts +1 -1
- package/dist_ts/classes.authoritysecrets.js +2 -2
- package/dist_ts/classes.authorityusage.d.ts +3 -3
- package/dist_ts/classes.claudeauthority.js +3 -7
- package/dist_ts/classes.claudenative.d.ts +1 -8
- package/dist_ts/classes.claudenative.js +2 -25
- package/dist_ts/classes.codexmanaged.d.ts +1 -1
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +6 -3
- package/dist_ts/plugins.d.ts +7 -7
- package/dist_ts/plugins.js +8 -8
- package/dist_ts/ts_migration/0001_authority_meta.d.ts +13 -3
- package/dist_ts/ts_migration/0001_authority_meta.js +29 -17
- package/dist_ts/ts_migration/0002_remove_backup_records.d.ts +17 -0
- package/dist_ts/ts_migration/0002_remove_backup_records.js +48 -0
- package/dist_ts/ts_migration/index.d.ts +6 -3
- package/dist_ts/ts_migration/index.js +10 -4
- package/dist_ts/ts_migration/legacysources/authswitchstores.d.ts +2 -0
- package/dist_ts/ts_migration/legacysources/authswitchstores.js +244 -0
- package/dist_ts/ts_migration/legacysources/index.d.ts +18 -0
- package/dist_ts/ts_migration/legacysources/index.js +24 -0
- package/dist_ts/ts_migration/legacysources/material.d.ts +37 -0
- package/dist_ts/ts_migration/legacysources/material.js +120 -0
- package/dist_ts/ts_migration/legacysources/nativestores.d.ts +2 -0
- package/dist_ts/ts_migration/legacysources/nativestores.js +207 -0
- package/dist_ts/ts_migration/legacysources/shared.d.ts +124 -0
- package/dist_ts/ts_migration/legacysources/shared.js +142 -0
- package/package.json +6 -5
- package/readme.md +68 -26
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/authority-contract.ts +1 -3
- package/ts/authority-import-contract.ts +216 -0
- package/ts/classes.authoritybroker.ts +0 -4
- package/ts/classes.authoritycli.ts +165 -11
- package/ts/classes.authorityclient.ts +22 -0
- package/ts/classes.authoritydaemon.ts +75 -8
- package/ts/classes.authoritydatabase.ts +70 -145
- package/ts/classes.authorityimport.ts +718 -0
- package/ts/classes.authoritymodels.ts +253 -269
- package/ts/classes.authoritypreuse.ts +0 -1
- package/ts/classes.authorityregistry.ts +20 -91
- package/ts/classes.authoritysecrets.ts +1 -1
- package/ts/classes.authorityusage.ts +3 -3
- package/ts/classes.claudeauthority.ts +2 -6
- package/ts/classes.claudenative.ts +1 -32
- package/ts/classes.codexmanaged.ts +1 -1
- package/ts/index.ts +5 -2
- package/ts/plugins.ts +7 -7
- package/ts/ts_migration/0001_authority_meta.ts +29 -17
- package/ts/ts_migration/0002_remove_backup_records.ts +49 -0
- package/ts/ts_migration/index.ts +10 -5
- package/ts/ts_migration/legacysources/authswitchstores.ts +211 -0
- package/ts/ts_migration/legacysources/index.ts +35 -0
- package/ts/ts_migration/legacysources/material.ts +134 -0
- package/ts/ts_migration/legacysources/nativestores.ts +204 -0
- package/ts/ts_migration/legacysources/shared.ts +220 -0
- package/dist_ts/authorityrehearsal.child.d.ts +0 -1
- package/dist_ts/authorityrehearsal.child.js +0 -395
- package/dist_ts/classes.authoritybackup.d.ts +0 -134
- package/dist_ts/classes.authoritybackup.js +0 -769
- package/dist_ts/classes.authorityrehearsal.d.ts +0 -127
- package/dist_ts/classes.authorityrehearsal.js +0 -632
- package/ts/authorityrehearsal.child.ts +0 -330
- package/ts/classes.authoritybackup.ts +0 -780
- 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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
|