agl 1.0.17 → 21.0.2
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/.smartconfig.json +55 -0
- package/changelog.md +1026 -0
- package/cli.js +14 -0
- package/dist_serve/bundle.js +44778 -0
- package/dist_serve/index.html +13 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.authmodels.d.ts +126 -0
- package/dist_ts/classes.authmodels.js +1422 -0
- package/dist_ts/classes.authstore.d.ts +160 -0
- package/dist_ts/classes.authstore.js +2483 -0
- package/dist_ts/classes.browserresourcehost.d.ts +85 -0
- package/dist_ts/classes.browserresourcehost.js +912 -0
- package/dist_ts/classes.cli.d.ts +21 -0
- package/dist_ts/classes.cli.js +1082 -0
- package/dist_ts/classes.config.d.ts +23 -0
- package/dist_ts/classes.config.js +267 -0
- package/dist_ts/classes.controller.d.ts +523 -0
- package/dist_ts/classes.controller.js +10611 -0
- package/dist_ts/classes.controllermanagement.d.ts +32 -0
- package/dist_ts/classes.controllermanagement.js +222 -0
- package/dist_ts/classes.draftmanager.d.ts +30 -0
- package/dist_ts/classes.draftmanager.js +179 -0
- package/dist_ts/classes.embeddeddb.d.ts +30 -0
- package/dist_ts/classes.embeddeddb.js +159 -0
- package/dist_ts/classes.flexframedtransport.d.ts +56 -0
- package/dist_ts/classes.flexframedtransport.js +275 -0
- package/dist_ts/classes.flexmodels.private.d.ts +231 -0
- package/dist_ts/classes.flexmodels.private.js +985 -0
- package/dist_ts/classes.flexmodels.public.d.ts +207 -0
- package/dist_ts/classes.flexmodels.public.js +885 -0
- package/dist_ts/classes.flexprojectionreader.d.ts +89 -0
- package/dist_ts/classes.flexprojectionreader.js +580 -0
- package/dist_ts/classes.flexservice.d.ts +196 -0
- package/dist_ts/classes.flexservice.js +3704 -0
- package/dist_ts/classes.flexstore.d.ts +174 -0
- package/dist_ts/classes.flexstore.js +3400 -0
- package/dist_ts/classes.flexsupervisor.d.ts +105 -0
- package/dist_ts/classes.flexsupervisor.js +1191 -0
- package/dist_ts/classes.gitreversion.d.ts +431 -0
- package/dist_ts/classes.gitreversion.js +10592 -0
- package/dist_ts/classes.harnessoperationmanager.d.ts +113 -0
- package/dist_ts/classes.harnessoperationmanager.js +602 -0
- package/dist_ts/classes.opencodeclient.d.ts +146 -0
- package/dist_ts/classes.opencodeclient.js +3003 -0
- package/dist_ts/classes.opencodesupervisor.d.ts +60 -0
- package/dist_ts/classes.opencodesupervisor.js +1003 -0
- package/dist_ts/classes.passkeymanager.d.ts +34 -0
- package/dist_ts/classes.passkeymanager.js +456 -0
- package/dist_ts/classes.processinspection.d.ts +50 -0
- package/dist_ts/classes.processinspection.js +484 -0
- package/dist_ts/classes.resourcecoordinator.d.ts +64 -0
- package/dist_ts/classes.resourcecoordinator.js +294 -0
- package/dist_ts/classes.sessionintelligencereader.d.ts +13 -0
- package/dist_ts/classes.sessionintelligencereader.js +40 -0
- package/dist_ts/classes.systemmetricssampler.d.ts +53 -0
- package/dist_ts/classes.systemmetricssampler.js +168 -0
- package/dist_ts/classes.terminalmanager.d.ts +95 -0
- package/dist_ts/classes.terminalmanager.js +981 -0
- package/dist_ts/classes.terminalresourcehost.d.ts +20 -0
- package/dist_ts/classes.terminalresourcehost.js +84 -0
- package/dist_ts/classes.upgradecoordinator.d.ts +244 -0
- package/dist_ts/classes.upgradecoordinator.js +2155 -0
- package/dist_ts/classes.upgradetransaction.d.ts +92 -0
- package/dist_ts/classes.upgradetransaction.js +2125 -0
- package/dist_ts/classes.uploadmanager.d.ts +24 -0
- package/dist_ts/classes.uploadmanager.js +210 -0
- package/dist_ts/classes.validation.d.ts +91 -0
- package/dist_ts/classes.validation.js +1087 -0
- package/dist_ts/flexharness.child.d.ts +1 -0
- package/dist_ts/flexharness.child.js +28 -0
- package/dist_ts/functions.canonicaldirectory.d.ts +21 -0
- package/dist_ts/functions.canonicaldirectory.js +144 -0
- package/dist_ts/functions.controllerdataroot.d.ts +15 -0
- package/dist_ts/functions.controllerdataroot.js +76 -0
- package/dist_ts/functions.embeddeddb.d.ts +2 -0
- package/dist_ts/functions.embeddeddb.js +21 -0
- package/dist_ts/functions.flexcredentialstore.d.ts +16 -0
- package/dist_ts/functions.flexcredentialstore.js +93 -0
- package/dist_ts/functions.opencodeauth.d.ts +3 -0
- package/dist_ts/functions.opencodeauth.js +31 -0
- package/dist_ts/functions.runtimeenvironment.d.ts +2 -0
- package/dist_ts/functions.runtimeenvironment.js +79 -0
- package/dist_ts/functions.upgradefollower.d.ts +3 -0
- package/dist_ts/functions.upgradefollower.js +95 -0
- package/dist_ts/index.d.ts +24 -0
- package/dist_ts/index.js +25 -0
- package/dist_ts/interfaces.auth.d.ts +181 -0
- package/dist_ts/interfaces.auth.js +82 -0
- package/dist_ts/interfaces.config.d.ts +34 -0
- package/dist_ts/interfaces.config.js +2 -0
- package/dist_ts/interfaces.flexipc.d.ts +939 -0
- package/dist_ts/interfaces.flexipc.js +1492 -0
- package/dist_ts/interfaces.gitreversion.d.ts +246 -0
- package/dist_ts/interfaces.gitreversion.js +2 -0
- package/dist_ts/interfaces.lifecycle.d.ts +37 -0
- package/dist_ts/interfaces.lifecycle.js +2 -0
- package/dist_ts/interfaces.opencode.d.ts +101 -0
- package/dist_ts/interfaces.opencode.js +3 -0
- package/dist_ts/interfaces.projects.d.ts +156 -0
- package/dist_ts/interfaces.projects.js +5 -0
- package/dist_ts/plugins.d.ts +36 -0
- package/dist_ts/plugins.js +40 -0
- package/dist_ts_interfaces/index.d.ts +2 -0
- package/dist_ts_interfaces/index.js +3 -0
- package/dist_ts_interfaces/interfaces.d.ts +747 -0
- package/dist_ts_interfaces/interfaces.js +47 -0
- package/dist_ts_interfaces/plugins.d.ts +4 -0
- package/dist_ts_interfaces/plugins.js +3 -0
- package/dist_ts_interfaces/requests.d.ts +806 -0
- package/dist_ts_interfaces/requests.js +2 -0
- package/dist_ts_migration/classes.documentmigrationrunner.d.ts +8 -0
- package/dist_ts_migration/classes.documentmigrationrunner.js +24 -0
- package/dist_ts_migration/classes.flexmigrationrunner.d.ts +11 -0
- package/dist_ts_migration/classes.flexmigrationrunner.js +25 -0
- package/dist_ts_migration/classes.flexpostharnessmigrationrunner.d.ts +10 -0
- package/dist_ts_migration/classes.flexpostharnessmigrationrunner.js +15 -0
- package/dist_ts_migration/classes.migrationrunner.d.ts +8 -0
- package/dist_ts_migration/classes.migrationrunner.js +34 -0
- package/dist_ts_migration/index.d.ts +12 -0
- package/dist_ts_migration/index.js +13 -0
- package/dist_ts_migration/v10_flexharnessv3migration.d.ts +11 -0
- package/dist_ts_migration/v10_flexharnessv3migration.js +23 -0
- package/dist_ts_migration/v13_flexprojectionorder.d.ts +11 -0
- package/dist_ts_migration/v13_flexprojectionorder.js +23 -0
- package/dist_ts_migration/v16_flexprovidercredentials.d.ts +22 -0
- package/dist_ts_migration/v16_flexprovidercredentials.js +149 -0
- package/dist_ts_migration/v18_resourcelayout.d.ts +22 -0
- package/dist_ts_migration/v18_resourcelayout.js +23 -0
- package/dist_ts_migration/v18_resourcelayoutmigration.d.ts +6 -0
- package/dist_ts_migration/v18_resourcelayoutmigration.js +61 -0
- package/dist_ts_migration/v19_flexprojectmanagement.d.ts +11 -0
- package/dist_ts_migration/v19_flexprojectmanagement.js +21 -0
- package/dist_ts_migration/v1_embeddeddatabaselocation.d.ts +28 -0
- package/dist_ts_migration/v1_embeddeddatabaselocation.js +415 -0
- package/dist_ts_migration/v22_projectfilesystemidentitymigration.d.ts +7 -0
- package/dist_ts_migration/v22_projectfilesystemidentitymigration.js +105 -0
- package/dist_ts_migration/v2_controllerdataroot.d.ts +130 -0
- package/dist_ts_migration/v2_controllerdataroot.js +1887 -0
- package/dist_ts_migration/v6_protocoldocumentmigration.d.ts +7 -0
- package/dist_ts_migration/v6_protocoldocumentmigration.js +100 -0
- package/dist_ts_migration/v6_protocoldocuments.d.ts +7 -0
- package/dist_ts_migration/v6_protocoldocuments.js +138 -0
- package/html/index.html +13 -0
- package/{LICENSE → license.md} +2 -2
- package/package.json +86 -48
- package/readme.md +480 -0
- package/readme.plan.md +188 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.authmodels.ts +1245 -0
- package/ts/classes.authstore.ts +3274 -0
- package/ts/classes.browserresourcehost.ts +1205 -0
- package/ts/classes.cli.ts +1254 -0
- package/ts/classes.config.ts +351 -0
- package/ts/classes.controller.ts +14426 -0
- package/ts/classes.controllermanagement.ts +330 -0
- package/ts/classes.draftmanager.ts +232 -0
- package/ts/classes.embeddeddb.ts +166 -0
- package/ts/classes.flexframedtransport.ts +283 -0
- package/ts/classes.flexmodels.private.ts +823 -0
- package/ts/classes.flexmodels.public.ts +732 -0
- package/ts/classes.flexprojectionreader.ts +816 -0
- package/ts/classes.flexservice.ts +4302 -0
- package/ts/classes.flexstore.ts +4565 -0
- package/ts/classes.flexsupervisor.ts +1453 -0
- package/ts/classes.gitreversion.ts +13353 -0
- package/ts/classes.harnessoperationmanager.ts +870 -0
- package/ts/classes.opencodeclient.ts +4110 -0
- package/ts/classes.opencodesupervisor.ts +1280 -0
- package/ts/classes.passkeymanager.ts +570 -0
- package/ts/classes.processinspection.ts +623 -0
- package/ts/classes.resourcecoordinator.ts +436 -0
- package/ts/classes.sessionintelligencereader.ts +52 -0
- package/ts/classes.systemmetricssampler.ts +215 -0
- package/ts/classes.terminalmanager.ts +1207 -0
- package/ts/classes.terminalresourcehost.ts +122 -0
- package/ts/classes.upgradecoordinator.ts +2675 -0
- package/ts/classes.upgradetransaction.ts +2900 -0
- package/ts/classes.uploadmanager.ts +240 -0
- package/ts/classes.validation.ts +1409 -0
- package/ts/flexharness.child.ts +35 -0
- package/ts/functions.canonicaldirectory.ts +213 -0
- package/ts/functions.controllerdataroot.ts +107 -0
- package/ts/functions.embeddeddb.ts +22 -0
- package/ts/functions.flexcredentialstore.ts +128 -0
- package/ts/functions.opencodeauth.ts +34 -0
- package/ts/functions.runtimeenvironment.ts +90 -0
- package/ts/functions.upgradefollower.ts +115 -0
- package/ts/index.ts +36 -6
- package/ts/interfaces.auth.ts +316 -0
- package/ts/interfaces.config.ts +37 -0
- package/ts/interfaces.flexipc.ts +2586 -0
- package/ts/interfaces.gitreversion.ts +336 -0
- package/ts/interfaces.lifecycle.ts +46 -0
- package/ts/interfaces.opencode.ts +153 -0
- package/ts/interfaces.projects.ts +182 -0
- package/ts/plugins.ts +64 -0
- package/ts_interfaces/index.ts +2 -0
- package/ts_interfaces/interfaces.ts +827 -0
- package/ts_interfaces/plugins.ts +15 -0
- package/ts_interfaces/requests.ts +1186 -0
- package/ts_migration/classes.documentmigrationrunner.ts +32 -0
- package/ts_migration/classes.flexmigrationrunner.ts +33 -0
- package/ts_migration/classes.flexpostharnessmigrationrunner.ts +22 -0
- package/ts_migration/classes.migrationrunner.ts +40 -0
- package/ts_migration/index.ts +12 -0
- package/ts_migration/v10_flexharnessv3migration.ts +35 -0
- package/ts_migration/v13_flexprojectionorder.ts +33 -0
- package/ts_migration/v16_flexprovidercredentials.ts +196 -0
- package/ts_migration/v18_resourcelayout.ts +55 -0
- package/ts_migration/v18_resourcelayoutmigration.ts +68 -0
- package/ts_migration/v19_flexprojectmanagement.ts +28 -0
- package/ts_migration/v1_embeddeddatabaselocation.ts +560 -0
- package/ts_migration/v22_projectfilesystemidentitymigration.ts +121 -0
- package/ts_migration/v2_controllerdataroot.ts +2349 -0
- package/ts_migration/v6_protocoldocumentmigration.ts +144 -0
- package/ts_migration/v6_protocoldocuments.ts +198 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/classes.controllersocketclient.ts +517 -0
- package/ts_web/classes.sessiondraftsync.ts +390 -0
- package/ts_web/elements.harnesscontrollerapp.ts +11494 -0
- package/ts_web/index.ts +2 -0
- package/ts_web/plugins.ts +31 -0
- package/.gitlab-ci.yml +0 -71
- package/.npmignore +0 -5
- package/README.md +0 -40
- package/dist/cli.js +0 -2
- package/dist/index.d.ts +0 -0
- package/dist/index.js +0 -9
- package/dist/mod_bundle/index.d.ts +0 -1
- package/dist/mod_bundle/index.js +0 -18
- package/dist/mod_bundle/mod.plugins.d.ts +0 -4
- package/dist/mod_bundle/mod.plugins.js +0 -11
- package/dist/mod_install/index.d.ts +0 -4
- package/dist/mod_install/index.js +0 -21
- package/dist/mod_install/mod.plugins.d.ts +0 -1
- package/dist/mod_install/mod.plugins.js +0 -7
- package/dist/mod_standard/index.d.ts +0 -4
- package/dist/mod_standard/index.js +0 -21
- package/dist/mod_standard/mod.browser.d.ts +0 -6
- package/dist/mod_standard/mod.browser.js +0 -14
- package/dist/mod_standard/mod.clean.d.ts +0 -4
- package/dist/mod_standard/mod.clean.js +0 -12
- package/dist/mod_standard/mod.compile.d.ts +0 -4
- package/dist/mod_standard/mod.compile.js +0 -21
- package/dist/mod_standard/mod.plugins.d.ts +0 -8
- package/dist/mod_standard/mod.plugins.js +0 -19
- package/dist/mod_standard/mod.test.d.ts +0 -4
- package/dist/mod_standard/mod.test.js +0 -12
- package/dist/plr.cli.d.ts +0 -3
- package/dist/plr.cli.js +0 -57
- package/dist/plr.config.d.ts +0 -11
- package/dist/plr.config.js +0 -26
- package/dist/plr.mods.d.ts +0 -17
- package/dist/plr.mods.js +0 -17
- package/dist/plr.paths.d.ts +0 -19
- package/dist/plr.paths.js +0 -26
- package/dist/plr.plugins.d.ts +0 -8
- package/dist/plr.plugins.js +0 -16
- package/npmextra.json +0 -10
- package/ts/mod_bundle/index.ts +0 -20
- package/ts/mod_bundle/mod.plugins.ts +0 -9
- package/ts/mod_install/index.ts +0 -20
- package/ts/mod_install/mod.plugins.ts +0 -1
- package/ts/mod_standard/index.ts +0 -23
- package/ts/mod_standard/mod.browser.ts +0 -17
- package/ts/mod_standard/mod.clean.ts +0 -13
- package/ts/mod_standard/mod.compile.ts +0 -23
- package/ts/mod_standard/mod.plugins.ts +0 -17
- package/ts/mod_standard/mod.test.ts +0 -13
- package/ts/plr.cli.ts +0 -60
- package/ts/plr.config.ts +0 -36
- package/ts/plr.mods.ts +0 -25
- package/ts/plr.paths.ts +0 -29
- package/ts/plr.plugins.ts +0 -17
- package/tslint.json +0 -3
- package/yarn.lock +0 -3464
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type IAuthenticationBeginOptions, type IAuthenticationBeginResult, type IAuthenticationFinishOptions, type IAuthenticationResult, type IPasskeyManagerOptions, type ISetupBeginOptions, type ISetupBeginResult, type ISetupFinishOptions } from './interfaces.auth.js';
|
|
2
|
+
export declare class PasskeyManager {
|
|
3
|
+
private readonly store;
|
|
4
|
+
private readonly relyingPartyName;
|
|
5
|
+
private readonly webAuthn;
|
|
6
|
+
private readonly now;
|
|
7
|
+
private readonly setupAttemptLimit;
|
|
8
|
+
private readonly setupAttemptWindowMs;
|
|
9
|
+
private readonly authenticationAttemptLimitPerPeer;
|
|
10
|
+
private readonly authenticationAttemptWindowMs;
|
|
11
|
+
private readonly maxActiveSetupCeremonies;
|
|
12
|
+
private readonly maxActiveAuthenticationCeremonies;
|
|
13
|
+
private readonly setupAttemptTimestamps;
|
|
14
|
+
private readonly authenticationVerificationAttemptTimestamps;
|
|
15
|
+
private readonly authenticationAttemptTimestampsByPeer;
|
|
16
|
+
private ceremonyCreationTail;
|
|
17
|
+
constructor(optionsArg: IPasskeyManagerOptions);
|
|
18
|
+
getAuthState(): Promise<{
|
|
19
|
+
state: 'setupRequired' | 'ready';
|
|
20
|
+
setupCodeExpired: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
beginSetup(optionsArg: ISetupBeginOptions): Promise<ISetupBeginResult>;
|
|
23
|
+
finishSetup(optionsArg: ISetupFinishOptions): Promise<IAuthenticationResult>;
|
|
24
|
+
preflightSetupFinish(optionsArg: ISetupFinishOptions): Promise<void>;
|
|
25
|
+
beginAuthentication(optionsArg: IAuthenticationBeginOptions): Promise<IAuthenticationBeginResult>;
|
|
26
|
+
finishAuthentication(optionsArg: IAuthenticationFinishOptions): Promise<IAuthenticationResult>;
|
|
27
|
+
preflightAuthenticationFinish(optionsArg: IAuthenticationFinishOptions): Promise<void>;
|
|
28
|
+
private currentTime;
|
|
29
|
+
private recordSetupAttempt;
|
|
30
|
+
private recordAuthenticationAttempt;
|
|
31
|
+
private assertCeremonyCapacity;
|
|
32
|
+
private assertConfiguredOrigin;
|
|
33
|
+
private withCeremonyCreationLock;
|
|
34
|
+
}
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { AuthError, } from './interfaces.auth.js';
|
|
3
|
+
const setupCeremonyLifetimeMs = 5 * 60 * 1000;
|
|
4
|
+
const authenticationCeremonyLifetimeMs = 2 * 60 * 1000;
|
|
5
|
+
const maxAuthenticationVerificationAttemptsPerWindow = 128;
|
|
6
|
+
const base64Url32BytePattern = /^[A-Za-z0-9_-]{43}$/;
|
|
7
|
+
const defaultWebAuthn = {
|
|
8
|
+
generateRegistrationOptions: plugins.simplewebauthnServer.generateRegistrationOptions,
|
|
9
|
+
verifyRegistrationResponse: plugins.simplewebauthnServer.verifyRegistrationResponse,
|
|
10
|
+
generateAuthenticationOptions: plugins.simplewebauthnServer.generateAuthenticationOptions,
|
|
11
|
+
verifyAuthenticationResponse: plugins.simplewebauthnServer.verifyAuthenticationResponse,
|
|
12
|
+
};
|
|
13
|
+
const requirePositiveLimit = (valueArg, labelArg, maximumArg = 10_000) => {
|
|
14
|
+
if (!Number.isSafeInteger(valueArg) || valueArg < 1 || valueArg > maximumArg) {
|
|
15
|
+
throw new Error(`${labelArg} must be a positive safe integer no greater than ${maximumArg}.`);
|
|
16
|
+
}
|
|
17
|
+
return valueArg;
|
|
18
|
+
};
|
|
19
|
+
const requirePeerId = (peerIdArg) => {
|
|
20
|
+
if (typeof peerIdArg !== 'string'
|
|
21
|
+
|| peerIdArg.length === 0
|
|
22
|
+
|| peerIdArg.length > 512
|
|
23
|
+
|| peerIdArg.trim() !== peerIdArg) {
|
|
24
|
+
throw new AuthError('peer_mismatch', 'The connection identity is malformed.');
|
|
25
|
+
}
|
|
26
|
+
return peerIdArg;
|
|
27
|
+
};
|
|
28
|
+
const requireOrigin = (originArg) => {
|
|
29
|
+
if (typeof originArg !== 'string' || originArg.length === 0 || originArg.length > 2048) {
|
|
30
|
+
throw new AuthError('origin_mismatch', 'The request origin is malformed.');
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const origin = new URL(originArg);
|
|
34
|
+
if (origin.origin !== originArg
|
|
35
|
+
|| (origin.protocol !== 'http:' && origin.protocol !== 'https:')
|
|
36
|
+
|| origin.username.length > 0
|
|
37
|
+
|| origin.password.length > 0
|
|
38
|
+
|| origin.pathname !== '/'
|
|
39
|
+
|| origin.search.length > 0
|
|
40
|
+
|| origin.hash.length > 0) {
|
|
41
|
+
throw new Error('not an origin');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new AuthError('origin_mismatch', 'The request origin is malformed.');
|
|
46
|
+
}
|
|
47
|
+
return originArg;
|
|
48
|
+
};
|
|
49
|
+
const requireCeremonyId = (ceremonyIdArg) => {
|
|
50
|
+
if (typeof ceremonyIdArg !== 'string' || !base64Url32BytePattern.test(ceremonyIdArg)) {
|
|
51
|
+
throw new AuthError('ceremony_invalid', 'The WebAuthn ceremony identifier is malformed.');
|
|
52
|
+
}
|
|
53
|
+
return ceremonyIdArg;
|
|
54
|
+
};
|
|
55
|
+
const randomBase64Url = () => plugins.crypto.randomBytes(32).toString('base64url');
|
|
56
|
+
const base64UrlValuesEqual = (leftArg, rightArg) => {
|
|
57
|
+
if (!base64Url32BytePattern.test(leftArg) || !base64Url32BytePattern.test(rightArg)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const left = Buffer.from(leftArg, 'base64url');
|
|
61
|
+
const right = Buffer.from(rightArg, 'base64url');
|
|
62
|
+
return left.byteLength === right.byteLength && plugins.crypto.timingSafeEqual(left, right);
|
|
63
|
+
};
|
|
64
|
+
export class PasskeyManager {
|
|
65
|
+
store;
|
|
66
|
+
relyingPartyName;
|
|
67
|
+
webAuthn;
|
|
68
|
+
now;
|
|
69
|
+
setupAttemptLimit;
|
|
70
|
+
setupAttemptWindowMs;
|
|
71
|
+
authenticationAttemptLimitPerPeer;
|
|
72
|
+
authenticationAttemptWindowMs;
|
|
73
|
+
maxActiveSetupCeremonies;
|
|
74
|
+
maxActiveAuthenticationCeremonies;
|
|
75
|
+
setupAttemptTimestamps = [];
|
|
76
|
+
authenticationVerificationAttemptTimestamps = [];
|
|
77
|
+
authenticationAttemptTimestampsByPeer = new Map();
|
|
78
|
+
ceremonyCreationTail = Promise.resolve();
|
|
79
|
+
constructor(optionsArg) {
|
|
80
|
+
this.store = optionsArg.store;
|
|
81
|
+
this.relyingPartyName = optionsArg.relyingPartyName ?? 'Agent Gateway Layer';
|
|
82
|
+
if (this.relyingPartyName.trim().length === 0 || this.relyingPartyName.length > 128) {
|
|
83
|
+
throw new Error('relyingPartyName must contain 1-128 characters.');
|
|
84
|
+
}
|
|
85
|
+
this.webAuthn = optionsArg.webAuthn ?? defaultWebAuthn;
|
|
86
|
+
this.now = optionsArg.now ?? (() => new Date());
|
|
87
|
+
this.setupAttemptLimit = requirePositiveLimit(optionsArg.setupAttemptLimit ?? 10, 'setupAttemptLimit');
|
|
88
|
+
this.setupAttemptWindowMs = requirePositiveLimit(optionsArg.setupAttemptWindowMs ?? 60_000, 'setupAttemptWindowMs', 24 * 60 * 60 * 1000);
|
|
89
|
+
this.authenticationAttemptLimitPerPeer = requirePositiveLimit(optionsArg.authenticationAttemptLimitPerPeer ?? 6, 'authenticationAttemptLimitPerPeer');
|
|
90
|
+
this.authenticationAttemptWindowMs = requirePositiveLimit(optionsArg.authenticationAttemptWindowMs ?? 60_000, 'authenticationAttemptWindowMs', 24 * 60 * 60 * 1000);
|
|
91
|
+
this.maxActiveSetupCeremonies = requirePositiveLimit(optionsArg.maxActiveSetupCeremonies ?? 16, 'maxActiveSetupCeremonies');
|
|
92
|
+
this.maxActiveAuthenticationCeremonies = requirePositiveLimit(optionsArg.maxActiveAuthenticationCeremonies ?? 64, 'maxActiveAuthenticationCeremonies');
|
|
93
|
+
}
|
|
94
|
+
async getAuthState() {
|
|
95
|
+
const state = await this.store.getState();
|
|
96
|
+
return {
|
|
97
|
+
state: state.authState,
|
|
98
|
+
setupCodeExpired: state.setup !== null
|
|
99
|
+
&& state.setup.expiresAt.getTime() <= this.currentTime().getTime(),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
async beginSetup(optionsArg) {
|
|
103
|
+
const peerId = requirePeerId(optionsArg.peerId);
|
|
104
|
+
const origin = requireOrigin(optionsArg.origin);
|
|
105
|
+
return this.withCeremonyCreationLock(async () => {
|
|
106
|
+
const now = this.currentTime();
|
|
107
|
+
await this.assertCeremonyCapacity('setup', now);
|
|
108
|
+
const state = await this.store.getState();
|
|
109
|
+
this.assertConfiguredOrigin(origin, state.config.publicOrigin);
|
|
110
|
+
// the attempt budget must burn BEFORE the code is checked — a limiter
|
|
111
|
+
// that only counts correct codes throttles the legitimate operator and
|
|
112
|
+
// leaves guessing unmetered
|
|
113
|
+
this.recordSetupAttempt(now);
|
|
114
|
+
await this.store.assertSetupAuthority(optionsArg.setupCode, undefined, now);
|
|
115
|
+
if (!state.setup) {
|
|
116
|
+
throw new AuthError('setup_unavailable', 'Passkey setup is no longer available.');
|
|
117
|
+
}
|
|
118
|
+
const registrationOptions = await this.webAuthn.generateRegistrationOptions({
|
|
119
|
+
rpName: this.relyingPartyName,
|
|
120
|
+
rpID: state.config.rpId,
|
|
121
|
+
userName: 'agl',
|
|
122
|
+
userDisplayName: 'agl',
|
|
123
|
+
userID: Buffer.from(state.webauthnUserId, 'base64url'),
|
|
124
|
+
timeout: setupCeremonyLifetimeMs,
|
|
125
|
+
attestationType: 'none',
|
|
126
|
+
excludeCredentials: [],
|
|
127
|
+
authenticatorSelection: {
|
|
128
|
+
residentKey: 'required',
|
|
129
|
+
requireResidentKey: true,
|
|
130
|
+
userVerification: 'required',
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
const ceremonyId = randomBase64Url();
|
|
134
|
+
const expiresAt = new Date(Math.min(now.getTime() + setupCeremonyLifetimeMs, state.setup.expiresAt.getTime()));
|
|
135
|
+
const ceremony = {
|
|
136
|
+
id: ceremonyId,
|
|
137
|
+
kind: 'setup',
|
|
138
|
+
state: 'pending',
|
|
139
|
+
peerId,
|
|
140
|
+
challenge: registrationOptions.challenge,
|
|
141
|
+
origin,
|
|
142
|
+
rpId: state.config.rpId,
|
|
143
|
+
userId: state.webauthnUserId,
|
|
144
|
+
setupGeneration: state.setup.generation,
|
|
145
|
+
setupHash: state.setup.hash,
|
|
146
|
+
createdAt: now,
|
|
147
|
+
expiresAt,
|
|
148
|
+
};
|
|
149
|
+
await this.store.createCeremony(ceremony);
|
|
150
|
+
return { ceremonyId, options: registrationOptions };
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async finishSetup(optionsArg) {
|
|
154
|
+
const peerId = requirePeerId(optionsArg.peerId);
|
|
155
|
+
const origin = requireOrigin(optionsArg.origin);
|
|
156
|
+
const ceremonyId = requireCeremonyId(optionsArg.ceremonyId);
|
|
157
|
+
const now = this.currentTime();
|
|
158
|
+
const stateBefore = await this.store.getState();
|
|
159
|
+
this.assertConfiguredOrigin(origin, stateBefore.config.publicOrigin);
|
|
160
|
+
// burn the attempt budget BEFORE consuming the ceremony: an exhausted
|
|
161
|
+
// budget must reject without destroying a still-valid ceremony, otherwise
|
|
162
|
+
// the user's authenticator keeps a credential the store never accepted
|
|
163
|
+
this.recordSetupAttempt(now);
|
|
164
|
+
const ceremony = await this.store.consumeCeremony({
|
|
165
|
+
ceremonyId,
|
|
166
|
+
kind: 'setup',
|
|
167
|
+
peerId,
|
|
168
|
+
origin,
|
|
169
|
+
rpId: stateBefore.config.rpId,
|
|
170
|
+
userId: stateBefore.webauthnUserId,
|
|
171
|
+
now,
|
|
172
|
+
});
|
|
173
|
+
if (ceremony.kind !== 'setup'
|
|
174
|
+
|| typeof ceremony.setupGeneration !== 'string'
|
|
175
|
+
|| typeof ceremony.setupHash !== 'string') {
|
|
176
|
+
throw new AuthError('ceremony_invalid', 'The WebAuthn ceremony has the wrong kind.');
|
|
177
|
+
}
|
|
178
|
+
const setupCeremony = {
|
|
179
|
+
...ceremony,
|
|
180
|
+
kind: 'setup',
|
|
181
|
+
setupGeneration: ceremony.setupGeneration,
|
|
182
|
+
setupHash: ceremony.setupHash,
|
|
183
|
+
};
|
|
184
|
+
await this.store.assertSetupAuthority(optionsArg.setupCode, setupCeremony, now);
|
|
185
|
+
let verification;
|
|
186
|
+
try {
|
|
187
|
+
verification = await this.webAuthn.verifyRegistrationResponse({
|
|
188
|
+
response: optionsArg.response,
|
|
189
|
+
expectedChallenge: ceremony.challenge,
|
|
190
|
+
expectedOrigin: ceremony.origin,
|
|
191
|
+
expectedRPID: ceremony.rpId,
|
|
192
|
+
requireUserPresence: true,
|
|
193
|
+
requireUserVerification: true,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (errorArg) {
|
|
197
|
+
throw new AuthError('verification_failed', 'Passkey registration verification failed.', {
|
|
198
|
+
cause: errorArg,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
if (!verification.verified
|
|
202
|
+
|| !verification.registrationInfo.userVerified
|
|
203
|
+
|| verification.registrationInfo.credential.id !== optionsArg.response.id) {
|
|
204
|
+
throw new AuthError('verification_failed', 'Passkey registration verification failed.');
|
|
205
|
+
}
|
|
206
|
+
const verifiedCredential = verification.registrationInfo.credential;
|
|
207
|
+
const storedCredential = {
|
|
208
|
+
id: verifiedCredential.id,
|
|
209
|
+
publicKey: Buffer.from(verifiedCredential.publicKey).toString('base64url'),
|
|
210
|
+
counter: verifiedCredential.counter,
|
|
211
|
+
transports: [...(verifiedCredential.transports ?? optionsArg.response.response.transports ?? [])],
|
|
212
|
+
deviceType: verification.registrationInfo.credentialDeviceType,
|
|
213
|
+
backedUp: verification.registrationInfo.credentialBackedUp,
|
|
214
|
+
createdAt: now,
|
|
215
|
+
counterUpdateId: randomBase64Url(),
|
|
216
|
+
};
|
|
217
|
+
await this.store.commitFirstCredential(setupCeremony, storedCredential);
|
|
218
|
+
return { authenticated: true, credentialId: storedCredential.id };
|
|
219
|
+
}
|
|
220
|
+
async preflightSetupFinish(optionsArg) {
|
|
221
|
+
const peerId = requirePeerId(optionsArg.peerId);
|
|
222
|
+
const origin = requireOrigin(optionsArg.origin);
|
|
223
|
+
const ceremonyId = requireCeremonyId(optionsArg.ceremonyId);
|
|
224
|
+
const now = this.currentTime();
|
|
225
|
+
const state = await this.store.getState();
|
|
226
|
+
this.assertConfiguredOrigin(origin, state.config.publicOrigin);
|
|
227
|
+
const ceremony = await this.store.assertPendingCeremony({
|
|
228
|
+
ceremonyId,
|
|
229
|
+
kind: 'setup',
|
|
230
|
+
peerId,
|
|
231
|
+
origin,
|
|
232
|
+
rpId: state.config.rpId,
|
|
233
|
+
userId: state.webauthnUserId,
|
|
234
|
+
now,
|
|
235
|
+
});
|
|
236
|
+
if (ceremony.kind !== 'setup'
|
|
237
|
+
|| typeof ceremony.setupGeneration !== 'string'
|
|
238
|
+
|| typeof ceremony.setupHash !== 'string') {
|
|
239
|
+
throw new AuthError('ceremony_invalid', 'The WebAuthn ceremony has the wrong kind.');
|
|
240
|
+
}
|
|
241
|
+
// preflight is the first place a wrong code arrives in the controller
|
|
242
|
+
// flow, so it must burn the attempt budget too
|
|
243
|
+
this.recordSetupAttempt(now);
|
|
244
|
+
await this.store.assertSetupAuthority(optionsArg.setupCode, {
|
|
245
|
+
...ceremony,
|
|
246
|
+
kind: 'setup',
|
|
247
|
+
setupGeneration: ceremony.setupGeneration,
|
|
248
|
+
setupHash: ceremony.setupHash,
|
|
249
|
+
}, now);
|
|
250
|
+
}
|
|
251
|
+
async beginAuthentication(optionsArg) {
|
|
252
|
+
const peerId = requirePeerId(optionsArg.peerId);
|
|
253
|
+
const origin = requireOrigin(optionsArg.origin);
|
|
254
|
+
return this.withCeremonyCreationLock(async () => {
|
|
255
|
+
const now = this.currentTime();
|
|
256
|
+
await this.assertCeremonyCapacity('authentication', now);
|
|
257
|
+
const state = await this.store.getState();
|
|
258
|
+
this.assertConfiguredOrigin(origin, state.config.publicOrigin);
|
|
259
|
+
if (state.authState !== 'ready' || state.credentials.length === 0) {
|
|
260
|
+
throw new AuthError('setup_unavailable', 'Passkey authentication is not configured.');
|
|
261
|
+
}
|
|
262
|
+
this.recordAuthenticationAttempt(now, peerId, false);
|
|
263
|
+
const authenticationOptions = await this.webAuthn.generateAuthenticationOptions({
|
|
264
|
+
rpID: state.config.rpId,
|
|
265
|
+
timeout: authenticationCeremonyLifetimeMs,
|
|
266
|
+
userVerification: 'required',
|
|
267
|
+
});
|
|
268
|
+
const ceremonyId = randomBase64Url();
|
|
269
|
+
const ceremony = {
|
|
270
|
+
id: ceremonyId,
|
|
271
|
+
kind: 'authentication',
|
|
272
|
+
state: 'pending',
|
|
273
|
+
peerId,
|
|
274
|
+
challenge: authenticationOptions.challenge,
|
|
275
|
+
origin,
|
|
276
|
+
rpId: state.config.rpId,
|
|
277
|
+
userId: state.webauthnUserId,
|
|
278
|
+
createdAt: now,
|
|
279
|
+
expiresAt: new Date(now.getTime() + authenticationCeremonyLifetimeMs),
|
|
280
|
+
};
|
|
281
|
+
await this.store.createCeremony(ceremony);
|
|
282
|
+
return { ceremonyId, options: authenticationOptions };
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
async finishAuthentication(optionsArg) {
|
|
286
|
+
const peerId = requirePeerId(optionsArg.peerId);
|
|
287
|
+
const origin = requireOrigin(optionsArg.origin);
|
|
288
|
+
const ceremonyId = requireCeremonyId(optionsArg.ceremonyId);
|
|
289
|
+
const now = this.currentTime();
|
|
290
|
+
const state = await this.store.getState();
|
|
291
|
+
this.assertConfiguredOrigin(origin, state.config.publicOrigin);
|
|
292
|
+
const ceremony = await this.store.consumeCeremony({
|
|
293
|
+
ceremonyId,
|
|
294
|
+
kind: 'authentication',
|
|
295
|
+
peerId,
|
|
296
|
+
origin,
|
|
297
|
+
rpId: state.config.rpId,
|
|
298
|
+
userId: state.webauthnUserId,
|
|
299
|
+
now,
|
|
300
|
+
});
|
|
301
|
+
if (state.authState !== 'ready' || state.credentials.length === 0) {
|
|
302
|
+
throw new AuthError('setup_unavailable', 'Passkey authentication is not configured.');
|
|
303
|
+
}
|
|
304
|
+
const userHandle = optionsArg.response.response.userHandle;
|
|
305
|
+
if (typeof userHandle !== 'string'
|
|
306
|
+
|| !base64UrlValuesEqual(userHandle, state.webauthnUserId)) {
|
|
307
|
+
throw new AuthError('verification_failed', 'The passkey user handle is invalid.');
|
|
308
|
+
}
|
|
309
|
+
const credential = state.credentials.find((entry) => entry.id === optionsArg.response.id);
|
|
310
|
+
if (!credential) {
|
|
311
|
+
throw new AuthError('credential_not_found', 'The passkey credential is unknown.');
|
|
312
|
+
}
|
|
313
|
+
this.recordAuthenticationAttempt(now, peerId, true);
|
|
314
|
+
let verification;
|
|
315
|
+
try {
|
|
316
|
+
verification = await this.webAuthn.verifyAuthenticationResponse({
|
|
317
|
+
response: optionsArg.response,
|
|
318
|
+
expectedChallenge: ceremony.challenge,
|
|
319
|
+
expectedOrigin: ceremony.origin,
|
|
320
|
+
expectedRPID: ceremony.rpId,
|
|
321
|
+
credential: {
|
|
322
|
+
id: credential.id,
|
|
323
|
+
publicKey: Buffer.from(credential.publicKey, 'base64url'),
|
|
324
|
+
counter: credential.counter,
|
|
325
|
+
transports: [...credential.transports],
|
|
326
|
+
},
|
|
327
|
+
requireUserVerification: true,
|
|
328
|
+
advancedFIDOConfig: {
|
|
329
|
+
userVerification: 'required',
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
catch (errorArg) {
|
|
334
|
+
throw new AuthError('verification_failed', 'Passkey authentication verification failed.', {
|
|
335
|
+
cause: errorArg,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
if (!verification.verified
|
|
339
|
+
|| !verification.authenticationInfo.userVerified
|
|
340
|
+
|| verification.authenticationInfo.credentialID !== credential.id
|
|
341
|
+
|| verification.authenticationInfo.origin !== ceremony.origin
|
|
342
|
+
|| verification.authenticationInfo.rpID !== ceremony.rpId) {
|
|
343
|
+
throw new AuthError('verification_failed', 'Passkey authentication verification failed.');
|
|
344
|
+
}
|
|
345
|
+
await this.store.updateCounter(credential.id, credential.counter, verification.authenticationInfo.newCounter);
|
|
346
|
+
return { authenticated: true, credentialId: credential.id };
|
|
347
|
+
}
|
|
348
|
+
async preflightAuthenticationFinish(optionsArg) {
|
|
349
|
+
const peerId = requirePeerId(optionsArg.peerId);
|
|
350
|
+
const origin = requireOrigin(optionsArg.origin);
|
|
351
|
+
const ceremonyId = requireCeremonyId(optionsArg.ceremonyId);
|
|
352
|
+
const now = this.currentTime();
|
|
353
|
+
const state = await this.store.getState();
|
|
354
|
+
this.assertConfiguredOrigin(origin, state.config.publicOrigin);
|
|
355
|
+
if (state.authState !== 'ready' || state.credentials.length === 0) {
|
|
356
|
+
throw new AuthError('setup_unavailable', 'Passkey authentication is not configured.');
|
|
357
|
+
}
|
|
358
|
+
const userHandle = optionsArg.response.response.userHandle;
|
|
359
|
+
if (typeof userHandle !== 'string'
|
|
360
|
+
|| !base64UrlValuesEqual(userHandle, state.webauthnUserId)) {
|
|
361
|
+
throw new AuthError('verification_failed', 'The passkey user handle is invalid.');
|
|
362
|
+
}
|
|
363
|
+
if (!state.credentials.some((entry) => entry.id === optionsArg.response.id)) {
|
|
364
|
+
throw new AuthError('credential_not_found', 'The passkey credential is unknown.');
|
|
365
|
+
}
|
|
366
|
+
await this.store.assertPendingCeremony({
|
|
367
|
+
ceremonyId,
|
|
368
|
+
kind: 'authentication',
|
|
369
|
+
peerId,
|
|
370
|
+
origin,
|
|
371
|
+
rpId: state.config.rpId,
|
|
372
|
+
userId: state.webauthnUserId,
|
|
373
|
+
now,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
currentTime() {
|
|
377
|
+
const now = this.now();
|
|
378
|
+
if (!(now instanceof Date) || !Number.isFinite(now.getTime())) {
|
|
379
|
+
throw new Error('The PasskeyManager clock returned an invalid Date.');
|
|
380
|
+
}
|
|
381
|
+
return new Date(now);
|
|
382
|
+
}
|
|
383
|
+
recordSetupAttempt(nowArg) {
|
|
384
|
+
const cutoff = nowArg.getTime() - this.setupAttemptWindowMs;
|
|
385
|
+
while (this.setupAttemptTimestamps.length > 0
|
|
386
|
+
&& this.setupAttemptTimestamps[0] <= cutoff) {
|
|
387
|
+
this.setupAttemptTimestamps.shift();
|
|
388
|
+
}
|
|
389
|
+
if (this.setupAttemptTimestamps.length >= this.setupAttemptLimit) {
|
|
390
|
+
throw new AuthError('rate_limited', 'Too many setup attempts. Try again later.');
|
|
391
|
+
}
|
|
392
|
+
this.setupAttemptTimestamps.push(nowArg.getTime());
|
|
393
|
+
}
|
|
394
|
+
recordAuthenticationAttempt(nowArg, peerIdArg, includeGlobalVerificationLimitArg) {
|
|
395
|
+
const now = nowArg.getTime();
|
|
396
|
+
const cutoff = now - this.authenticationAttemptWindowMs;
|
|
397
|
+
while (this.authenticationVerificationAttemptTimestamps.length > 0
|
|
398
|
+
&& this.authenticationVerificationAttemptTimestamps[0] <= cutoff) {
|
|
399
|
+
this.authenticationVerificationAttemptTimestamps.shift();
|
|
400
|
+
}
|
|
401
|
+
for (const [peerId, timestamps] of this.authenticationAttemptTimestampsByPeer) {
|
|
402
|
+
while (timestamps.length > 0 && timestamps[0] <= cutoff)
|
|
403
|
+
timestamps.shift();
|
|
404
|
+
if (timestamps.length === 0)
|
|
405
|
+
this.authenticationAttemptTimestampsByPeer.delete(peerId);
|
|
406
|
+
}
|
|
407
|
+
const peerTimestamps = this.authenticationAttemptTimestampsByPeer.get(peerIdArg) ?? [];
|
|
408
|
+
if (peerTimestamps.length >= this.authenticationAttemptLimitPerPeer) {
|
|
409
|
+
throw new AuthError('rate_limited', 'Too many authentication attempts. Try again later.');
|
|
410
|
+
}
|
|
411
|
+
if (includeGlobalVerificationLimitArg
|
|
412
|
+
&& this.authenticationVerificationAttemptTimestamps.length
|
|
413
|
+
>= maxAuthenticationVerificationAttemptsPerWindow) {
|
|
414
|
+
throw new AuthError('rate_limited', 'Too many passkey verification attempts. Try again later.');
|
|
415
|
+
}
|
|
416
|
+
if (peerTimestamps.length === 0
|
|
417
|
+
&& this.authenticationAttemptTimestampsByPeer.size
|
|
418
|
+
>= this.maxActiveAuthenticationCeremonies * 2) {
|
|
419
|
+
throw new AuthError('rate_limited', 'Too many authentication peers. Try again later.');
|
|
420
|
+
}
|
|
421
|
+
if (includeGlobalVerificationLimitArg) {
|
|
422
|
+
this.authenticationVerificationAttemptTimestamps.push(now);
|
|
423
|
+
}
|
|
424
|
+
peerTimestamps.push(now);
|
|
425
|
+
this.authenticationAttemptTimestampsByPeer.set(peerIdArg, peerTimestamps);
|
|
426
|
+
}
|
|
427
|
+
async assertCeremonyCapacity(kindArg, nowArg) {
|
|
428
|
+
const maximum = kindArg === 'setup'
|
|
429
|
+
? this.maxActiveSetupCeremonies
|
|
430
|
+
: this.maxActiveAuthenticationCeremonies;
|
|
431
|
+
const active = await this.store.countActiveCeremonies(kindArg, nowArg);
|
|
432
|
+
if (active >= maximum) {
|
|
433
|
+
throw new AuthError('ceremony_limit', `Too many active ${kindArg} ceremonies.`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
assertConfiguredOrigin(actualArg, expectedArg) {
|
|
437
|
+
if (actualArg !== expectedArg) {
|
|
438
|
+
throw new AuthError('origin_mismatch', 'The request origin is not trusted.');
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
async withCeremonyCreationLock(functionArg) {
|
|
442
|
+
const previous = this.ceremonyCreationTail;
|
|
443
|
+
let release;
|
|
444
|
+
this.ceremonyCreationTail = new Promise((resolve) => {
|
|
445
|
+
release = resolve;
|
|
446
|
+
});
|
|
447
|
+
await previous;
|
|
448
|
+
try {
|
|
449
|
+
return await functionArg();
|
|
450
|
+
}
|
|
451
|
+
finally {
|
|
452
|
+
release();
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wYXNza2V5bWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMucGFzc2tleW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLFNBQVMsR0FhVixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSxnQ0FBZ0MsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN2RCxNQUFNLDhDQUE4QyxHQUFHLEdBQUcsQ0FBQztBQUMzRCxNQUFNLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sZUFBZSxHQUFrQztJQUNyRCwyQkFBMkIsRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsMkJBQTJCO0lBQ3JGLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEI7SUFDbkYsNkJBQTZCLEVBQUUsT0FBTyxDQUFDLG9CQUFvQixDQUFDLDZCQUE2QjtJQUN6Riw0QkFBNEIsRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsNEJBQTRCO0NBQ3hGLENBQUM7QUFFRixNQUFNLG9CQUFvQixHQUFHLENBQzNCLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLFVBQVUsR0FBRyxNQUFNLEVBQ1gsRUFBRTtJQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksUUFBUSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxRQUFRLG9EQUFvRCxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFN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
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface IControllerProcessIdentity {
|
|
2
|
+
pid: number;
|
|
3
|
+
processGroupId: number;
|
|
4
|
+
processGroupLeader: boolean;
|
|
5
|
+
arguments: string[];
|
|
6
|
+
argumentsTruncated?: boolean;
|
|
7
|
+
fingerprint: string;
|
|
8
|
+
}
|
|
9
|
+
export interface IControllerProcessCandidate {
|
|
10
|
+
identity: IControllerProcessIdentity;
|
|
11
|
+
command: '__serve' | 'foreground';
|
|
12
|
+
port: number;
|
|
13
|
+
}
|
|
14
|
+
export interface IControllerDataWriterProcessCandidate {
|
|
15
|
+
kind: 'controller' | 'temp-password' | 'flex-child';
|
|
16
|
+
identity: IControllerProcessIdentity;
|
|
17
|
+
}
|
|
18
|
+
export declare const readControllerProcessIdentity: (pidArg: number) => Promise<IControllerProcessIdentity | null>;
|
|
19
|
+
export declare const readProcessGroupMemberPids: (processGroupIdArg: number) => Promise<number[]>;
|
|
20
|
+
export declare const processIdentityHasFileArgument: (identityArg: IControllerProcessIdentity, filePathArg: string, optionsArg?: {
|
|
21
|
+
allowMissingAbsolutePath?: boolean;
|
|
22
|
+
}) => Promise<boolean>;
|
|
23
|
+
export declare const processIdentityHasCliCommand: (identityArg: IControllerProcessIdentity, cliPathArg: string, commandArg: "__serve" | "__upgrade-worker" | "upgrade" | "start" | "foreground" | "temp-password", optionsArg?: {
|
|
24
|
+
allowMissingAbsolutePath?: boolean;
|
|
25
|
+
}) => Promise<boolean>;
|
|
26
|
+
export declare const listControllerProcessesForCli: (cliPathArg: string) => Promise<IControllerProcessCandidate[]>;
|
|
27
|
+
export declare const listControllerDataWriterProcessesForCli: (cliPathArg: string, optionsArg?: {
|
|
28
|
+
includeInstalledPackagePaths?: boolean;
|
|
29
|
+
}) => Promise<IControllerDataWriterProcessCandidate[]>;
|
|
30
|
+
export declare const listControllerDataWriterProcessesForCliPaths: (cliPathsArg: readonly string[], optionsArg?: {
|
|
31
|
+
includeInstalledPackagePaths?: boolean;
|
|
32
|
+
}) => Promise<IControllerDataWriterProcessCandidate[]>;
|
|
33
|
+
export declare const inspectControllerProcess: (optionsArg: {
|
|
34
|
+
pid: number;
|
|
35
|
+
cliPath: string;
|
|
36
|
+
port: number;
|
|
37
|
+
expectedProcessGroupId?: number;
|
|
38
|
+
expectedFingerprint?: string;
|
|
39
|
+
command: "__serve" | "foreground";
|
|
40
|
+
}) => Promise<IControllerProcessIdentity | null>;
|
|
41
|
+
export declare const signalVerifiedControllerProcess: (optionsArg: {
|
|
42
|
+
pid: number;
|
|
43
|
+
cliPath: string;
|
|
44
|
+
port: number;
|
|
45
|
+
expectedProcessGroupId: number;
|
|
46
|
+
expectedFingerprint: string;
|
|
47
|
+
signal: NodeJS.Signals;
|
|
48
|
+
signalProcessGroup: boolean;
|
|
49
|
+
command: "__serve" | "foreground";
|
|
50
|
+
}) => Promise<void>;
|