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,32 @@
|
|
|
1
|
+
import { type IControllerStatus, type IReq_ControllerUpgradeLaunch, type IReq_ControllerUpgradePrepareBegin, type IReq_ControllerUpgradeFinalize } from '../dist_ts_interfaces/index.js';
|
|
2
|
+
export interface IControllerStatusExpectation {
|
|
3
|
+
packageName: string;
|
|
4
|
+
packageVersion: string;
|
|
5
|
+
protocolVersion?: number;
|
|
6
|
+
upgradeManagementVersion: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const controllerUpgradePrepareBeginRequestTimeoutMs = 30000;
|
|
9
|
+
export declare const assertControllerStatus: (statusArg: unknown, expectationArg: IControllerStatusExpectation) => IControllerStatus;
|
|
10
|
+
export declare const requestControllerUpgradePrepareBegin: (portArg: number, tokenArg: string, targetVersionArg: string, gracePeriodMsArg: number) => Promise<IReq_ControllerUpgradePrepareBegin["response"]>;
|
|
11
|
+
export declare const requestControllerUpgradeFinalize: (portArg: number, tokenArg: string, modeArg: IReq_ControllerUpgradeFinalize["request"]["mode"], timeoutMsArg?: number) => Promise<IReq_ControllerUpgradeFinalize["response"]>;
|
|
12
|
+
export declare const queryControllerStatus: (portArg: number, expectationArg: IControllerStatusExpectation, timeoutMsArg?: number) => Promise<IControllerStatus>;
|
|
13
|
+
export declare const tryQueryControllerStatus: (portArg: number, expectationArg: IControllerStatusExpectation) => Promise<IControllerStatus | undefined>;
|
|
14
|
+
export declare const isLoopbackPortListening: (portArg: number, timeoutMsArg?: number) => Promise<boolean>;
|
|
15
|
+
export declare const requestControllerUpgradeLaunch: (portArg: number, tokenArg: string, timeoutMsArg?: number) => Promise<IReq_ControllerUpgradeLaunch["response"]>;
|
|
16
|
+
export declare const waitUntilControllerExited: (optionsArg: {
|
|
17
|
+
pid: number;
|
|
18
|
+
cliPath: string;
|
|
19
|
+
port: number;
|
|
20
|
+
expectedProcessGroupId: number;
|
|
21
|
+
expectedFingerprint: string;
|
|
22
|
+
command: "__serve" | "foreground";
|
|
23
|
+
}, timeoutMsArg: number) => Promise<boolean>;
|
|
24
|
+
export declare const resolveControllerStopSignal: (statusArg: IControllerStatus, phaseArg: "cooperative" | "hard") => {
|
|
25
|
+
signal: NodeJS.Signals;
|
|
26
|
+
signalProcessGroup: boolean;
|
|
27
|
+
};
|
|
28
|
+
export declare const stopVerifiedController: (optionsArg: {
|
|
29
|
+
status: IControllerStatus;
|
|
30
|
+
cliPath: string;
|
|
31
|
+
port: number;
|
|
32
|
+
}) => Promise<void>;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { controllerPackageName, } from '../dist_ts_interfaces/index.js';
|
|
3
|
+
import { inspectControllerProcess, signalVerifiedControllerProcess, } from './classes.processinspection.js';
|
|
4
|
+
const currentCliName = String(controllerPackageName) === 'agl' ? 'agl' : 'hcon';
|
|
5
|
+
const currentRuntimeName = currentCliName === 'agl' ? 'AGL' : currentCliName;
|
|
6
|
+
const harnessStates = ['starting', 'ready', 'stopping', 'stopped', 'failed'];
|
|
7
|
+
export const controllerUpgradePrepareBeginRequestTimeoutMs = 30_000;
|
|
8
|
+
const isControllerHarnessStatus = (statusArg) => {
|
|
9
|
+
if (typeof statusArg !== 'object' || statusArg === null)
|
|
10
|
+
return false;
|
|
11
|
+
const status = statusArg;
|
|
12
|
+
return ((status.harnessId === 'opencode' || status.harnessId === 'flex')
|
|
13
|
+
&& harnessStates.some((stateArg) => status.state === stateArg)
|
|
14
|
+
&& typeof status.healthy === 'boolean'
|
|
15
|
+
&& (status.pid === undefined || Number.isSafeInteger(status.pid))
|
|
16
|
+
&& (status.version === undefined || typeof status.version === 'string'));
|
|
17
|
+
};
|
|
18
|
+
const isControllerUpgradeStatus = (statusArg) => {
|
|
19
|
+
if (!statusArg || typeof statusArg !== 'object' || Array.isArray(statusArg))
|
|
20
|
+
return false;
|
|
21
|
+
const status = statusArg;
|
|
22
|
+
return Object.keys(status).length === 3
|
|
23
|
+
&& typeof status.fromVersion === 'string'
|
|
24
|
+
&& status.fromVersion.length > 0
|
|
25
|
+
&& Buffer.byteLength(status.fromVersion, 'utf8') <= 128
|
|
26
|
+
&& typeof status.toVersion === 'string'
|
|
27
|
+
&& status.toVersion.length > 0
|
|
28
|
+
&& Buffer.byteLength(status.toVersion, 'utf8') <= 128
|
|
29
|
+
&& typeof status.phase === 'string'
|
|
30
|
+
&& ['preparing', 'pausing', 'installing', 'restarting', 'continuing', 'completed', 'failed']
|
|
31
|
+
.includes(status.phase);
|
|
32
|
+
};
|
|
33
|
+
export const assertControllerStatus = (statusArg, expectationArg) => {
|
|
34
|
+
if (typeof statusArg !== 'object' || statusArg === null) {
|
|
35
|
+
throw new Error(`The service on the management port is not an ${currentRuntimeName} endpoint.`);
|
|
36
|
+
}
|
|
37
|
+
const status = statusArg;
|
|
38
|
+
const harnesses = Array.isArray(status.harnesses) ? status.harnesses : [];
|
|
39
|
+
const openCode = harnesses.find((entryArg) => entryArg?.harnessId === 'opencode');
|
|
40
|
+
const flex = harnesses.find((entryArg) => entryArg?.harnessId === 'flex');
|
|
41
|
+
if (status.packageName !== expectationArg.packageName
|
|
42
|
+
|| status.packageVersion !== expectationArg.packageVersion
|
|
43
|
+
|| (expectationArg.protocolVersion !== undefined
|
|
44
|
+
&& status.protocolVersion !== expectationArg.protocolVersion)
|
|
45
|
+
|| status.upgradeManagementVersion !== expectationArg.upgradeManagementVersion
|
|
46
|
+
|| !Number.isSafeInteger(status.controllerPid)
|
|
47
|
+
|| !Number.isSafeInteger(status.processGroupId)
|
|
48
|
+
|| typeof status.processFingerprint !== 'string'
|
|
49
|
+
|| status.processFingerprint.length < 8
|
|
50
|
+
|| status.processFingerprint.length > 256
|
|
51
|
+
|| (status.processMode !== 'detached' && status.processMode !== 'foreground')
|
|
52
|
+
|| (status.lifecycleState !== 'starting'
|
|
53
|
+
&& status.lifecycleState !== 'ready'
|
|
54
|
+
&& status.lifecycleState !== 'stopping'
|
|
55
|
+
&& status.lifecycleState !== 'stopped')
|
|
56
|
+
|| typeof status.startedAt !== 'number'
|
|
57
|
+
|| typeof status.setupRequired !== 'boolean'
|
|
58
|
+
|| (status.upgrade !== undefined && !isControllerUpgradeStatus(status.upgrade))
|
|
59
|
+
|| harnesses.length !== 2
|
|
60
|
+
|| !openCode
|
|
61
|
+
|| !flex
|
|
62
|
+
|| !harnesses.every((entryArg) => isControllerHarnessStatus(entryArg))) {
|
|
63
|
+
throw new Error('The service on the management port has an incompatible controller identity.');
|
|
64
|
+
}
|
|
65
|
+
return status;
|
|
66
|
+
};
|
|
67
|
+
export const requestControllerUpgradePrepareBegin = async (portArg, tokenArg, targetVersionArg, gracePeriodMsArg) => {
|
|
68
|
+
const abortController = new AbortController();
|
|
69
|
+
const timeout = setTimeout(() => abortController.abort(), controllerUpgradePrepareBeginRequestTimeoutMs);
|
|
70
|
+
let socket;
|
|
71
|
+
try {
|
|
72
|
+
socket = await plugins.typedsocket.TypedSocket.createClient(new plugins.typedrequest.TypedRouter(), `http://127.0.0.1:${portArg}`, {
|
|
73
|
+
autoReconnect: false,
|
|
74
|
+
maxRetries: 0,
|
|
75
|
+
abortSignal: abortController.signal,
|
|
76
|
+
});
|
|
77
|
+
const response = await socket.createTypedRequest('controller.upgrade.prepare.begin', undefined, {
|
|
78
|
+
timeoutMs: controllerUpgradePrepareBeginRequestTimeoutMs,
|
|
79
|
+
abortSignal: abortController.signal,
|
|
80
|
+
}).fire({ token: tokenArg, targetVersion: targetVersionArg, gracePeriodMs: gracePeriodMsArg });
|
|
81
|
+
if (!response
|
|
82
|
+
|| typeof response !== 'object'
|
|
83
|
+
|| Array.isArray(response)
|
|
84
|
+
|| Object.keys(response).length !== 1
|
|
85
|
+
|| response.accepted !== true)
|
|
86
|
+
throw new Error('The controller returned an invalid upgrade preparation response.');
|
|
87
|
+
return response;
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
clearTimeout(timeout);
|
|
91
|
+
await socket?.stop();
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
export const requestControllerUpgradeFinalize = async (portArg, tokenArg, modeArg, timeoutMsArg = 60_000) => {
|
|
95
|
+
const socket = await plugins.typedsocket.TypedSocket.createClient(new plugins.typedrequest.TypedRouter(), `http://127.0.0.1:${portArg}`, { autoReconnect: false, maxRetries: 0 });
|
|
96
|
+
try {
|
|
97
|
+
return await socket.createTypedRequest('controller.upgrade.finalize', undefined, { timeoutMs: timeoutMsArg }).fire({ token: tokenArg, mode: modeArg });
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
await socket.stop();
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
export const queryControllerStatus = async (portArg, expectationArg, timeoutMsArg = 2_500) => {
|
|
104
|
+
const abortController = new AbortController();
|
|
105
|
+
const timeout = setTimeout(() => abortController.abort(), timeoutMsArg);
|
|
106
|
+
let socket;
|
|
107
|
+
try {
|
|
108
|
+
const router = new plugins.typedrequest.TypedRouter();
|
|
109
|
+
socket = await plugins.typedsocket.TypedSocket.createClient(router, `http://127.0.0.1:${portArg}`, {
|
|
110
|
+
autoReconnect: false,
|
|
111
|
+
maxRetries: 0,
|
|
112
|
+
abortSignal: abortController.signal,
|
|
113
|
+
});
|
|
114
|
+
const request = socket.createTypedRequest('controller.status', undefined, { timeoutMs: timeoutMsArg, abortSignal: abortController.signal });
|
|
115
|
+
return assertControllerStatus(await request.fire({}), expectationArg);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
clearTimeout(timeout);
|
|
119
|
+
await socket?.stop();
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
export const tryQueryControllerStatus = async (portArg, expectationArg) => {
|
|
123
|
+
try {
|
|
124
|
+
return await queryControllerStatus(portArg, expectationArg);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
export const isLoopbackPortListening = async (portArg, timeoutMsArg = 500) => {
|
|
131
|
+
return await new Promise((resolve) => {
|
|
132
|
+
const socket = plugins.net.createConnection({ host: '127.0.0.1', port: portArg });
|
|
133
|
+
let settled = false;
|
|
134
|
+
const finish = (resultArg) => {
|
|
135
|
+
if (settled)
|
|
136
|
+
return;
|
|
137
|
+
settled = true;
|
|
138
|
+
clearTimeout(timeout);
|
|
139
|
+
socket.destroy();
|
|
140
|
+
resolve(resultArg);
|
|
141
|
+
};
|
|
142
|
+
const timeout = setTimeout(() => finish(false), timeoutMsArg);
|
|
143
|
+
socket.once('connect', () => finish(true));
|
|
144
|
+
socket.once('error', () => finish(false));
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
export const requestControllerUpgradeLaunch = async (portArg, tokenArg, timeoutMsArg = 15_000) => {
|
|
148
|
+
const abortController = new AbortController();
|
|
149
|
+
const timeout = setTimeout(() => abortController.abort(), timeoutMsArg);
|
|
150
|
+
let socket;
|
|
151
|
+
try {
|
|
152
|
+
const router = new plugins.typedrequest.TypedRouter();
|
|
153
|
+
socket = await plugins.typedsocket.TypedSocket.createClient(router, `http://127.0.0.1:${portArg}`, {
|
|
154
|
+
autoReconnect: false,
|
|
155
|
+
maxRetries: 0,
|
|
156
|
+
abortSignal: abortController.signal,
|
|
157
|
+
});
|
|
158
|
+
const response = await socket.createTypedRequest('controller.upgrade.launch', undefined, { timeoutMs: timeoutMsArg, abortSignal: abortController.signal }).fire({ token: tokenArg });
|
|
159
|
+
if (!response
|
|
160
|
+
|| typeof response !== 'object'
|
|
161
|
+
|| response.accepted !== true
|
|
162
|
+
|| !Number.isSafeInteger(response.workerPid)
|
|
163
|
+
|| response.workerPid < 2
|
|
164
|
+
|| typeof response.logFilePath !== 'string'
|
|
165
|
+
|| !plugins.path.isAbsolute(response.logFilePath)) {
|
|
166
|
+
throw new Error(`The controller returned an invalid ${currentCliName} upgrade launch response.`);
|
|
167
|
+
}
|
|
168
|
+
return response;
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
clearTimeout(timeout);
|
|
172
|
+
await socket?.stop();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
export const waitUntilControllerExited = async (optionsArg, timeoutMsArg) => {
|
|
176
|
+
const deadline = Date.now() + timeoutMsArg;
|
|
177
|
+
while (Date.now() < deadline) {
|
|
178
|
+
if (!await inspectControllerProcess(optionsArg))
|
|
179
|
+
return true;
|
|
180
|
+
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
181
|
+
}
|
|
182
|
+
return !await inspectControllerProcess(optionsArg);
|
|
183
|
+
};
|
|
184
|
+
export const resolveControllerStopSignal = (statusArg, phaseArg) => {
|
|
185
|
+
if (phaseArg === 'cooperative') {
|
|
186
|
+
return { signal: 'SIGTERM', signalProcessGroup: false };
|
|
187
|
+
}
|
|
188
|
+
const signalProcessGroup = statusArg.processMode === 'detached';
|
|
189
|
+
if (signalProcessGroup && statusArg.processGroupId !== statusArg.controllerPid) {
|
|
190
|
+
throw new Error('The detached controller is not the verified leader of its process group.');
|
|
191
|
+
}
|
|
192
|
+
return { signal: 'SIGKILL', signalProcessGroup };
|
|
193
|
+
};
|
|
194
|
+
export const stopVerifiedController = async (optionsArg) => {
|
|
195
|
+
const command = optionsArg.status.processMode === 'detached'
|
|
196
|
+
? '__serve'
|
|
197
|
+
: 'foreground';
|
|
198
|
+
const processIdentity = {
|
|
199
|
+
pid: optionsArg.status.controllerPid,
|
|
200
|
+
cliPath: optionsArg.cliPath,
|
|
201
|
+
port: optionsArg.port,
|
|
202
|
+
expectedProcessGroupId: optionsArg.status.processGroupId,
|
|
203
|
+
expectedFingerprint: optionsArg.status.processFingerprint,
|
|
204
|
+
command,
|
|
205
|
+
};
|
|
206
|
+
const cooperativeSignal = resolveControllerStopSignal(optionsArg.status, 'cooperative');
|
|
207
|
+
await signalVerifiedControllerProcess({
|
|
208
|
+
...processIdentity,
|
|
209
|
+
...cooperativeSignal,
|
|
210
|
+
});
|
|
211
|
+
if (await waitUntilControllerExited(processIdentity, 30_000))
|
|
212
|
+
return;
|
|
213
|
+
const hardSignal = resolveControllerStopSignal(optionsArg.status, 'hard');
|
|
214
|
+
await signalVerifiedControllerProcess({
|
|
215
|
+
...processIdentity,
|
|
216
|
+
...hardSignal,
|
|
217
|
+
});
|
|
218
|
+
if (!await waitUntilControllerExited(processIdentity, 15_000)) {
|
|
219
|
+
throw new Error('The exact controller process survived verified hard-stop escalation.');
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb250cm9sbGVybWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuY29udHJvbGxlcm1hbmFnZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLHFCQUFxQixHQU10QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsK0JBQStCLEdBQ2hDLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoRixNQUFNLGtCQUFrQixHQUFHLGNBQWMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO0FBUzdFLE1BQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBQ3RGLE1BQU0sQ0FBQyxNQUFNLDZDQUE2QyxHQUFHLE1BQU0sQ0FBQztBQUVwRSxNQUFNLHlCQUF5QixHQUFHLENBQUMsU0FBa0IsRUFBVyxFQUFFO0lBQ2hFLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLFNBQVMsS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsU0FBb0MsQ0FBQztJQUNwRCxPQUFPLENBQ0wsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQztXQUM3RCxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQztXQUMzRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUztXQUNuQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1dBQzlELENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUN4RSxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFNBQWtCLEVBQVcsRUFBRTtJQUNoRSxJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFGLE1BQU0sTUFBTSxHQUFHLFNBQW9DLENBQUM7SUFDcEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1dBQ2xDLE9BQU8sTUFBTSxDQUFDLFdBQVcsS0FBSyxRQUFRO1dBQ3RDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7V0FDN0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUc7V0FDcEQsT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVE7V0FDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztXQUMzQixNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRztXQUNsRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUTtXQUNoQyxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQzthQUN6RixRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQ3BDLFNBQWtCLEVBQ2xCLGNBQTRDLEVBQ3pCLEVBQUU7SUFDckIsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3hELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELGtCQUFrQixZQUFZLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsU0FBdUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUM7SUFDbEYsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUMxRSxJQUNFLE1BQU0sQ0FBQyxXQUFXLEtBQUssY0FBYyxDQUFDLFdBQVc7V0FDOUMsTUFBTSxDQUFDLGNBQWMsS0FBSyxjQUFjLENBQUMsY0FBYztXQUN2RCxDQUFDLGNBQWMsQ0FBQyxlQUFlLEtBQUssU0FBUztlQUMzQyxNQUFNLENBQUMsZUFBZSxLQUFLLGNBQWMsQ0FBQyxlQUFlLENBQUM7V0FDNUQsTUFBTSxDQUFDLHdCQUF3QixLQUFLLGNBQWMsQ0FBQyx3QkFBd0I7V0FDM0UsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7V0FDM0MsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7V0FDNUMsT0FBTyxNQUFNLENBQUMsa0JBQWtCLEtBQUssUUFBUTtXQUM3QyxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUM7V0FDcEMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxHQUFHO1dBQ3RDLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxVQUFVLElBQUksTUFBTSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUM7V0FDMUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxLQUFLLFVBQVU7ZUFDbkMsTUFBTSxDQUFDLGNBQWMsS0FBSyxPQUFPO2VBQ2pDLE1BQU0sQ0FBQyxjQUFjLEtBQUssVUFBVTtlQUNwQyxNQUFNLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQztXQUN0QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUTtXQUNwQyxPQUFPLE1BQU0sQ0FBQyxhQUFhLEtBQUssU0FBUztXQUN6QyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1dBQzVFLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztXQUN0QixDQUFDLFFBQVE7V0FDVCxDQUFDLElBQUk7V0FDTCxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQ3RFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUNELE9BQU8sTUFBMkIsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyxLQUFLLEVBQ3ZELE9BQWUsRUFDZixRQUFnQixFQUNoQixnQkFBd0IsRUFDeEIsZ0JBQXdCLEVBQ2lDLEVBQUU7SUFDM0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUM5QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQ3hCLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFDN0IsNkNBQTZDLENBQzlDLENBQUM7SUFDRixJQUFJLE1BQW1ELENBQUM7SUFDeEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUN6RCxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQ3RDLG9CQUFvQixPQUFPLEVBQUUsRUFDN0I7WUFDRSxhQUFhLEVBQUUsS0FBSztZQUNwQixVQUFVLEVBQUUsQ0FBQztZQUNiLFdBQVcsRUFBRSxlQUFlLENBQUMsTUFBTTtTQUNwQyxDQUNGLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDOUMsa0NBQWtDLEVBQ2xDLFNBQVMsRUFDVDtZQUNFLFNBQVMsRUFBRSw2Q0FBNkM7WUFDeEQsV0FBVyxFQUFFLGVBQWUsQ0FBQyxNQUFNO1NBQ3BDLENBQ0YsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLElBQ0UsQ0FBQyxRQUFRO2VBQ04sT0FBTyxRQUFRLEtBQUssUUFBUTtlQUM1QixLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztlQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO2VBQ2xDLFFBQVEsQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDdEYsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztZQUFTLENBQUM7UUFDVCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsTUFBTSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLEtBQUssRUFDbkQsT0FBZSxFQUNmLFFBQWdCLEVBQ2hCLE9BQTBELEVBQzFELFlBQVksR0FBRyxNQUFNLEVBQ2dDLEVBQUU7SUFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQy9ELElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFDdEMsb0JBQW9CLE9BQU8sRUFBRSxFQUM3QixFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUN4QyxDQUFDO0lBQ0YsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDcEMsNkJBQTZCLEVBQzdCLFNBQVMsRUFDVCxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FDNUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssRUFDeEMsT0FBZSxFQUNmLGNBQTRDLEVBQzVDLFlBQVksR0FBRyxLQUFLLEVBQ1EsRUFBRTtJQUM5QixNQUFNLGVBQWUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQzlDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDeEUsSUFBSSxNQUFtRCxDQUFDO0lBQ3hELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQ3pELE1BQU0sRUFDTixvQkFBb0IsT0FBTyxFQUFFLEVBQzdCO1lBQ0UsYUFBYSxFQUFFLEtBQUs7WUFDcEIsVUFBVSxFQUFFLENBQUM7WUFDYixXQUFXLEVBQUUsZUFBZSxDQUFDLE1BQU07U0FDcEMsQ0FDRixDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUN2QyxtQkFBbUIsRUFDbkIsU0FBUyxFQUNULEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUNqRSxDQUFDO1FBQ0YsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEUsQ0FBQztZQUFTLENBQUM7UUFDVCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsTUFBTSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEtBQUssRUFDM0MsT0FBZSxFQUNmLGNBQTRDLEVBQ0osRUFBRTtJQUMxQyxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxFQUMxQyxPQUFlLEVBQ2YsWUFBWSxHQUFHLEdBQUcsRUFDQSxFQUFFO0lBQ3BCLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzVDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQWtCLEVBQUUsRUFBRTtZQUNwQyxJQUFJLE9BQU87Z0JBQUUsT0FBTztZQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLEtBQUssRUFDakQsT0FBZSxFQUNmLFFBQWdCLEVBQ2hCLFlBQVksR0FBRyxNQUFNLEVBQzhCLEVBQUU7SUFDckQsTUFBTSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUM5QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3hFLElBQUksTUFBbUQsQ0FBQztJQUN4RCxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEQsTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUN6RCxNQUFNLEVBQ04sb0JBQW9CLE9BQU8sRUFBRSxFQUM3QjtZQUNFLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsV0FBVyxFQUFFLGVBQWUsQ0FBQyxNQUFNO1NBQ3BDLENBQ0YsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUM5QywyQkFBMkIsRUFDM0IsU0FBUyxFQUNULEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUNqRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLElBQ0UsQ0FBQyxRQUFRO2VBQ04sT0FBTyxRQUFRLEtBQUssUUFBUTtlQUM1QixRQUFRLENBQUMsUUFBUSxLQUFLLElBQUk7ZUFDMUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7ZUFDekMsUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDO2VBQ3RCLE9BQU8sUUFBUSxDQUFDLFdBQVcsS0FBSyxRQUFRO2VBQ3hDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUNqRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsY0FBYywyQkFBMkIsQ0FBQyxDQUFDO1FBQ25HLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO1lBQVMsQ0FBQztRQUNULFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QixNQUFNLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxFQUM1QyxVQU9DLEVBQ0QsWUFBb0IsRUFDRixFQUFFO0lBQ3BCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7SUFDM0MsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sd0JBQXdCLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0QsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxPQUFPLENBQUMsTUFBTSx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxTQUE0QixFQUM1QixRQUFnQyxFQUN5QixFQUFFO0lBQzNELElBQUksUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzFELENBQUM7SUFDRCxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxXQUFXLEtBQUssVUFBVSxDQUFDO0lBQ2hFLElBQUksa0JBQWtCLElBQUksU0FBUyxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDL0UsTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0FBQ25ELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssRUFBRSxVQUk1QyxFQUFpQixFQUFFO0lBQ2xCLE1BQU0sT0FBTyxHQUE2QixVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxVQUFVO1FBQ3BGLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNqQixNQUFNLGVBQWUsR0FBRztRQUN0QixHQUFHLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxhQUFhO1FBQ3BDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztRQUMzQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsc0JBQXNCLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjO1FBQ3hELG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCO1FBQ3pELE9BQU87S0FDUixDQUFDO0lBQ0YsTUFBTSxpQkFBaUIsR0FBRywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sK0JBQStCLENBQUM7UUFDcEMsR0FBRyxlQUFlO1FBQ2xCLEdBQUcsaUJBQWlCO0tBQ3JCLENBQUMsQ0FBQztJQUNILElBQUksTUFBTSx5QkFBeUIsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDO1FBQUUsT0FBTztJQUNyRSxNQUFNLFVBQVUsR0FBRywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFFLE1BQU0sK0JBQStCLENBQUM7UUFDcEMsR0FBRyxlQUFlO1FBQ2xCLEdBQUcsVUFBVTtLQUNkLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxNQUFNLHlCQUF5QixDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxLQUFLLENBQ2Isc0VBQXNFLENBQ3ZFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type IControllerDraftAttachment, type IControllerSessionDraft, type IControllerSessionDraftUpdate } from '../dist_ts_interfaces/interfaces.js';
|
|
2
|
+
export declare class ControllerDraftConflictError extends Error {
|
|
3
|
+
readonly draft: IControllerSessionDraft;
|
|
4
|
+
constructor(draft: IControllerSessionDraft);
|
|
5
|
+
}
|
|
6
|
+
export declare class ControllerDraftLimitError extends Error {
|
|
7
|
+
constructor(messageArg: string);
|
|
8
|
+
}
|
|
9
|
+
export interface IControllerDraftMutationResult {
|
|
10
|
+
draft: IControllerSessionDraft;
|
|
11
|
+
update?: IControllerSessionDraftUpdate;
|
|
12
|
+
}
|
|
13
|
+
export declare class ControllerDraftManager {
|
|
14
|
+
private readonly drafts;
|
|
15
|
+
private nonEmptyDrafts;
|
|
16
|
+
private aggregateAttachmentBytes;
|
|
17
|
+
get(keyArg: string): IControllerSessionDraft;
|
|
18
|
+
update(keyArg: string, expectedRevisionArg: number, patchArg: {
|
|
19
|
+
text?: string;
|
|
20
|
+
attachments?: readonly IControllerDraftAttachment[];
|
|
21
|
+
}): IControllerDraftMutationResult;
|
|
22
|
+
snapshot(keyArg: string, revisionArg: number): IControllerSessionDraft;
|
|
23
|
+
clearExact(keyArg: string, revisionArg: number): IControllerDraftMutationResult;
|
|
24
|
+
purge(keyArg: string): void;
|
|
25
|
+
purgePrefix(prefixArg: string): void;
|
|
26
|
+
clear(): void;
|
|
27
|
+
private assertDraftFields;
|
|
28
|
+
private assertAdmission;
|
|
29
|
+
private store;
|
|
30
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { controllerMaxDraftAttachmentBytes, controllerMaxDraftAttachmentTotalBytes, controllerMaxDraftAttachments, controllerMaxDraftTextBytes, } from '../dist_ts_interfaces/interfaces.js';
|
|
2
|
+
const maximumDraftIdentities = 4_096;
|
|
3
|
+
const maximumNonEmptyDrafts = 512;
|
|
4
|
+
const maximumAggregateAttachmentBytes = 64 * 1024 * 1024;
|
|
5
|
+
export class ControllerDraftConflictError extends Error {
|
|
6
|
+
draft;
|
|
7
|
+
constructor(draft) {
|
|
8
|
+
super('The composer draft changed concurrently.');
|
|
9
|
+
this.draft = draft;
|
|
10
|
+
this.name = 'ControllerDraftConflictError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ControllerDraftLimitError extends Error {
|
|
14
|
+
constructor(messageArg) {
|
|
15
|
+
super(messageArg);
|
|
16
|
+
this.name = 'ControllerDraftLimitError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const cloneAttachment = (attachmentArg) => ({ ...attachmentArg });
|
|
20
|
+
const cloneDraft = (draftArg) => ({
|
|
21
|
+
text: draftArg.text,
|
|
22
|
+
attachments: draftArg.attachments.map(cloneAttachment),
|
|
23
|
+
revision: draftArg.revision,
|
|
24
|
+
});
|
|
25
|
+
const emptyDraft = () => ({ text: '', attachments: [], revision: 0 });
|
|
26
|
+
const attachmentBytes = (draftArg) => (draftArg.attachments.reduce((sum, attachment) => sum + attachment.size, 0));
|
|
27
|
+
const isNonEmpty = (draftArg) => (draftArg.text.length > 0 || draftArg.attachments.length > 0);
|
|
28
|
+
const attachmentsEqual = (leftArg, rightArg) => leftArg.length === rightArg.length && leftArg.every((left, index) => {
|
|
29
|
+
const right = rightArg[index];
|
|
30
|
+
return right !== undefined
|
|
31
|
+
&& left.id === right.id
|
|
32
|
+
&& left.name === right.name
|
|
33
|
+
&& left.mediaType === right.mediaType
|
|
34
|
+
&& left.size === right.size
|
|
35
|
+
&& left.kind === right.kind
|
|
36
|
+
&& left.dataBase64 === right.dataBase64;
|
|
37
|
+
});
|
|
38
|
+
export class ControllerDraftManager {
|
|
39
|
+
drafts = new Map();
|
|
40
|
+
nonEmptyDrafts = 0;
|
|
41
|
+
aggregateAttachmentBytes = 0;
|
|
42
|
+
get(keyArg) {
|
|
43
|
+
return cloneDraft(this.drafts.get(keyArg) ?? emptyDraft());
|
|
44
|
+
}
|
|
45
|
+
update(keyArg, expectedRevisionArg, patchArg) {
|
|
46
|
+
const current = this.drafts.get(keyArg) ?? emptyDraft();
|
|
47
|
+
if (current.revision !== expectedRevisionArg) {
|
|
48
|
+
throw new ControllerDraftConflictError(cloneDraft(current));
|
|
49
|
+
}
|
|
50
|
+
if (patchArg.text === undefined && patchArg.attachments === undefined) {
|
|
51
|
+
throw new Error('A draft update must replace text, attachments, or both.');
|
|
52
|
+
}
|
|
53
|
+
const nextText = patchArg.text ?? current.text;
|
|
54
|
+
const nextAttachments = patchArg.attachments === undefined
|
|
55
|
+
? current.attachments
|
|
56
|
+
: patchArg.attachments.map(cloneAttachment);
|
|
57
|
+
this.assertDraftFields(nextText, nextAttachments);
|
|
58
|
+
const textChanged = nextText !== current.text;
|
|
59
|
+
const attachmentsChanged = !attachmentsEqual(nextAttachments, current.attachments);
|
|
60
|
+
if (!textChanged && !attachmentsChanged)
|
|
61
|
+
return { draft: cloneDraft(current) };
|
|
62
|
+
if (current.revision >= Number.MAX_SAFE_INTEGER) {
|
|
63
|
+
throw new ControllerDraftLimitError('The draft revision limit was reached.');
|
|
64
|
+
}
|
|
65
|
+
const next = {
|
|
66
|
+
text: nextText,
|
|
67
|
+
attachments: nextAttachments,
|
|
68
|
+
revision: current.revision + 1,
|
|
69
|
+
};
|
|
70
|
+
this.assertAdmission(keyArg, current, next);
|
|
71
|
+
this.store(keyArg, current, next);
|
|
72
|
+
return {
|
|
73
|
+
draft: cloneDraft(next),
|
|
74
|
+
update: {
|
|
75
|
+
revision: next.revision,
|
|
76
|
+
...(textChanged ? { text: next.text } : {}),
|
|
77
|
+
...(attachmentsChanged
|
|
78
|
+
? { attachments: next.attachments.map(cloneAttachment) }
|
|
79
|
+
: {}),
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
snapshot(keyArg, revisionArg) {
|
|
84
|
+
const current = this.drafts.get(keyArg) ?? emptyDraft();
|
|
85
|
+
if (current.revision !== revisionArg) {
|
|
86
|
+
throw new ControllerDraftConflictError(cloneDraft(current));
|
|
87
|
+
}
|
|
88
|
+
if (current.revision >= Number.MAX_SAFE_INTEGER) {
|
|
89
|
+
throw new ControllerDraftLimitError('The draft revision limit was reached.');
|
|
90
|
+
}
|
|
91
|
+
if (!current.text.trim())
|
|
92
|
+
throw new Error('The composer draft text must not be blank.');
|
|
93
|
+
return cloneDraft(current);
|
|
94
|
+
}
|
|
95
|
+
clearExact(keyArg, revisionArg) {
|
|
96
|
+
const current = this.drafts.get(keyArg);
|
|
97
|
+
if (!current || current.revision !== revisionArg) {
|
|
98
|
+
return { draft: cloneDraft(current ?? emptyDraft()) };
|
|
99
|
+
}
|
|
100
|
+
if (current.revision >= Number.MAX_SAFE_INTEGER) {
|
|
101
|
+
throw new ControllerDraftLimitError('The draft revision limit was reached.');
|
|
102
|
+
}
|
|
103
|
+
const next = {
|
|
104
|
+
text: '',
|
|
105
|
+
attachments: [],
|
|
106
|
+
revision: current.revision + 1,
|
|
107
|
+
};
|
|
108
|
+
this.store(keyArg, current, next);
|
|
109
|
+
return {
|
|
110
|
+
draft: cloneDraft(next),
|
|
111
|
+
update: { revision: next.revision, text: '', attachments: [] },
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
purge(keyArg) {
|
|
115
|
+
const current = this.drafts.get(keyArg);
|
|
116
|
+
if (!current)
|
|
117
|
+
return;
|
|
118
|
+
this.drafts.delete(keyArg);
|
|
119
|
+
if (isNonEmpty(current))
|
|
120
|
+
this.nonEmptyDrafts -= 1;
|
|
121
|
+
this.aggregateAttachmentBytes -= attachmentBytes(current);
|
|
122
|
+
}
|
|
123
|
+
purgePrefix(prefixArg) {
|
|
124
|
+
for (const key of this.drafts.keys()) {
|
|
125
|
+
if (key.startsWith(prefixArg))
|
|
126
|
+
this.purge(key);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
clear() {
|
|
130
|
+
this.drafts.clear();
|
|
131
|
+
this.nonEmptyDrafts = 0;
|
|
132
|
+
this.aggregateAttachmentBytes = 0;
|
|
133
|
+
}
|
|
134
|
+
assertDraftFields(textArg, attachmentsArg) {
|
|
135
|
+
if (Buffer.byteLength(textArg, 'utf8') > controllerMaxDraftTextBytes) {
|
|
136
|
+
throw new ControllerDraftLimitError('The draft text exceeds the controller byte limit.');
|
|
137
|
+
}
|
|
138
|
+
if (attachmentsArg.length > controllerMaxDraftAttachments) {
|
|
139
|
+
throw new ControllerDraftLimitError('The draft attachment count exceeds the controller limit.');
|
|
140
|
+
}
|
|
141
|
+
const ids = new Set();
|
|
142
|
+
let bytes = 0;
|
|
143
|
+
for (const attachment of attachmentsArg) {
|
|
144
|
+
if (ids.has(attachment.id))
|
|
145
|
+
throw new Error('Draft attachment IDs must be unique.');
|
|
146
|
+
ids.add(attachment.id);
|
|
147
|
+
if (attachment.size > controllerMaxDraftAttachmentBytes) {
|
|
148
|
+
throw new ControllerDraftLimitError('A draft attachment exceeds the controller byte limit.');
|
|
149
|
+
}
|
|
150
|
+
bytes += attachment.size;
|
|
151
|
+
}
|
|
152
|
+
if (bytes > controllerMaxDraftAttachmentTotalBytes) {
|
|
153
|
+
throw new ControllerDraftLimitError('The draft attachments exceed the controller total byte limit.');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
assertAdmission(keyArg, currentArg, nextArg) {
|
|
157
|
+
if (!this.drafts.has(keyArg) && this.drafts.size >= maximumDraftIdentities) {
|
|
158
|
+
throw new ControllerDraftLimitError('The controller draft identity limit is exhausted.');
|
|
159
|
+
}
|
|
160
|
+
const nextNonEmptyCount = this.nonEmptyDrafts
|
|
161
|
+
- (isNonEmpty(currentArg) ? 1 : 0)
|
|
162
|
+
+ (isNonEmpty(nextArg) ? 1 : 0);
|
|
163
|
+
if (nextNonEmptyCount > maximumNonEmptyDrafts) {
|
|
164
|
+
throw new ControllerDraftLimitError('The controller non-empty draft limit is exhausted.');
|
|
165
|
+
}
|
|
166
|
+
const nextAttachmentBytes = this.aggregateAttachmentBytes
|
|
167
|
+
- attachmentBytes(currentArg)
|
|
168
|
+
+ attachmentBytes(nextArg);
|
|
169
|
+
if (nextAttachmentBytes > maximumAggregateAttachmentBytes) {
|
|
170
|
+
throw new ControllerDraftLimitError('The controller draft attachment memory limit is exhausted.');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
store(keyArg, currentArg, nextArg) {
|
|
174
|
+
this.nonEmptyDrafts += (isNonEmpty(nextArg) ? 1 : 0) - (isNonEmpty(currentArg) ? 1 : 0);
|
|
175
|
+
this.aggregateAttachmentBytes += attachmentBytes(nextArg) - attachmentBytes(currentArg);
|
|
176
|
+
this.drafts.set(keyArg, nextArg);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kcmFmdG1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmRyYWZ0bWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsaUNBQWlDLEVBQ2pDLHNDQUFzQyxFQUN0Qyw2QkFBNkIsRUFDN0IsMkJBQTJCLEdBSTVCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7QUFDckMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDbEMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUV6RCxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsS0FBSztJQUN6QjtJQUE1QixZQUE0QixLQUE4QjtRQUN4RCxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUR4QixVQUFLLEdBQUwsS0FBSyxDQUF5QjtRQUV4RCxJQUFJLENBQUMsSUFBSSxHQUFHLDhCQUE4QixDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBQ2xELFlBQVksVUFBa0I7UUFDNUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBT0QsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsYUFBeUMsRUFDYixFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUMsQ0FBQztBQUV4RCxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQWlDLEVBQTJCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtJQUNuQixXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0lBQ3RELFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtDQUM1QixD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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export { embeddedDatabaseSocketPath } from './functions.embeddeddb.js';
|
|
2
|
+
export interface IEmbeddedControllerDatabaseOptions {
|
|
3
|
+
/** directory holding the smartdb storage files and its unix socket */
|
|
4
|
+
dataDirectory: string;
|
|
5
|
+
/** previous installed default, logically migrated only while its engine is stopped */
|
|
6
|
+
legacyDataDirectory?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The controller's embedded database engine: a @push.rocks/smartdb
|
|
10
|
+
* LocalSmartDb over a unix socket inside the data directory. The socket
|
|
11
|
+
* path is deterministic so a second controller process (e.g. the
|
|
12
|
+
* temp-password CLI) attaches to the running daemon's engine instead of
|
|
13
|
+
* opening the storage files a second time; only the process that booted
|
|
14
|
+
* the engine stops it.
|
|
15
|
+
*/
|
|
16
|
+
export declare class EmbeddedControllerDatabase {
|
|
17
|
+
private readonly options;
|
|
18
|
+
private localDb?;
|
|
19
|
+
private connectionUri?;
|
|
20
|
+
private startPromise?;
|
|
21
|
+
private migrationRunner?;
|
|
22
|
+
constructor(options: IEmbeddedControllerDatabaseOptions);
|
|
23
|
+
get socketPath(): string;
|
|
24
|
+
get ownsEngine(): boolean;
|
|
25
|
+
/** Starts (or attaches to) the engine and returns the smartdata-ready URI. */
|
|
26
|
+
start(): Promise<string>;
|
|
27
|
+
private startOnce;
|
|
28
|
+
stop(): Promise<void>;
|
|
29
|
+
private isSocketListening;
|
|
30
|
+
}
|