omnius 1.0.621 → 1.0.622
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +45 -17
- package/dist/update-worker.js +29 -19
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -734,24 +734,31 @@ async function runVerifiedUpdateTransaction(initial, dependencies, paths = resol
|
|
|
734
734
|
executable_version: evidence.executableVersion
|
|
735
735
|
}, paths);
|
|
736
736
|
state2 = transition(state2, { phase: "daemon_restarting" }, paths);
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
);
|
|
737
|
+
let daemon = null;
|
|
738
|
+
let restartAcknowledged = false;
|
|
739
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
740
|
+
restartAcknowledged = await dependencies.restartDaemon(target, evidence.executablePath) || restartAcknowledged;
|
|
741
|
+
daemon = await dependencies.observeDaemon();
|
|
742
|
+
if (daemon?.bootVersion === target && daemon.bootPackageHash === evidence.packageHash) {
|
|
743
|
+
break;
|
|
744
|
+
}
|
|
745
|
+
if (attempt < 3) await new Promise((resolve88) => setTimeout(resolve88, 1e3));
|
|
741
746
|
}
|
|
742
|
-
daemonQuiesced = false;
|
|
743
|
-
const daemon = await dependencies.observeDaemon();
|
|
744
747
|
if (!daemon || daemon.bootVersion !== target) {
|
|
745
|
-
|
|
748
|
+
const observed = daemon?.bootVersion ?? "unreachable";
|
|
749
|
+
throw new Error(
|
|
750
|
+
restartAcknowledged ? `Daemon verification failed after 3 recovery attempts: expected ${target}, observed ${observed}` : `The daemon at ${state2.daemon_endpoint ?? "the configured endpoint"} could not be restarted from the verified Omnius v${target} executable after 3 attempts`
|
|
751
|
+
);
|
|
746
752
|
}
|
|
747
753
|
if (!daemon.bootPackageHash) {
|
|
748
|
-
throw new Error("Daemon package verification failed: the restarted runtime did not report a boot package hash");
|
|
754
|
+
throw new Error("Daemon package verification failed after 3 recovery attempts: the restarted runtime did not report a boot package hash");
|
|
749
755
|
}
|
|
750
756
|
if (daemon.bootPackageHash !== evidence.packageHash) {
|
|
751
757
|
throw new Error(
|
|
752
|
-
`Daemon package verification failed: boot hash ${daemon.bootPackageHash} does not match installed hash ${evidence.packageHash}`
|
|
758
|
+
`Daemon package verification failed after 3 recovery attempts: boot hash ${daemon.bootPackageHash} does not match installed hash ${evidence.packageHash}`
|
|
753
759
|
);
|
|
754
760
|
}
|
|
761
|
+
daemonQuiesced = false;
|
|
755
762
|
state2 = transition(state2, {
|
|
756
763
|
phase: "runtime_verified",
|
|
757
764
|
daemon_version: daemon.bootVersion,
|
|
@@ -832,6 +839,23 @@ function launchWorkerInTransientUserService(input) {
|
|
|
832
839
|
});
|
|
833
840
|
return launched.status === 0;
|
|
834
841
|
}
|
|
842
|
+
function waitForUpdateWorkerAdoption(operationId, paths, timeoutMs = 1e4) {
|
|
843
|
+
const deadline = Date.now() + timeoutMs;
|
|
844
|
+
const sleeper = new Int32Array(new SharedArrayBuffer(4));
|
|
845
|
+
while (Date.now() < deadline) {
|
|
846
|
+
const observed = readUpdateState(paths);
|
|
847
|
+
if (observed?.operation_id === operationId) {
|
|
848
|
+
if (observed.status === "failed") {
|
|
849
|
+
throw new Error(observed.error || "The detached update worker failed before package installation");
|
|
850
|
+
}
|
|
851
|
+
if (observed.status === "completed" || isPidAlive(observed.pid) && observed.pid !== process.pid) {
|
|
852
|
+
return observed;
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
Atomics.wait(sleeper, 0, 0, 100);
|
|
856
|
+
}
|
|
857
|
+
throw new Error("The detached update worker did not adopt the transaction within 10 seconds; the package was not modified");
|
|
858
|
+
}
|
|
835
859
|
function startDetachedGlobalUpdate(input, paths = resolveUpdatePaths()) {
|
|
836
860
|
const targetVersion = assertExactUpdateTarget(input.targetVersion, input.fromVersion);
|
|
837
861
|
const operationId = randomUUID();
|
|
@@ -904,6 +928,7 @@ function startDetachedGlobalUpdate(input, paths = resolveUpdatePaths()) {
|
|
|
904
928
|
if (!child.pid) throw new Error("Detached update worker did not return a PID");
|
|
905
929
|
child.unref();
|
|
906
930
|
}
|
|
931
|
+
state2 = waitForUpdateWorkerAdoption(operationId, paths);
|
|
907
932
|
return { state: state2, pollUrl: "/v1/update" };
|
|
908
933
|
} catch (error) {
|
|
909
934
|
state2 = {
|
|
@@ -679524,9 +679549,9 @@ async function resolveActiveDaemonRuntime(preferredEndpoint, dependencies = DEFA
|
|
|
679524
679549
|
function systemdQuote(value2) {
|
|
679525
679550
|
return /[\s"\\]/.test(value2) ? `"${value2.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"` : value2;
|
|
679526
679551
|
}
|
|
679527
|
-
async function repairManagedDaemonUnit(port) {
|
|
679552
|
+
async function repairManagedDaemonUnit(port, preferredEntrypoint) {
|
|
679528
679553
|
if (process.platform !== "linux") return false;
|
|
679529
|
-
const command = await resolveDaemonCommand(process.execPath);
|
|
679554
|
+
const command = await resolveDaemonCommand(process.execPath, preferredEntrypoint);
|
|
679530
679555
|
if (!command) return false;
|
|
679531
679556
|
try {
|
|
679532
679557
|
const configHome2 = process.env["XDG_CONFIG_HOME"] || join130(homedir39(), ".config");
|
|
@@ -679728,7 +679753,7 @@ async function reclaimOwnedDaemonListener(port = getDaemonPort(), dependencies =
|
|
|
679728
679753
|
}
|
|
679729
679754
|
return { ok: true, action: "cleared", port, clearedPids, blockedPids: [] };
|
|
679730
679755
|
}
|
|
679731
|
-
async function restartDaemon(port, expectedVersion) {
|
|
679756
|
+
async function restartDaemon(port, expectedVersion, preferredEntrypoint) {
|
|
679732
679757
|
const p2 = port ?? getDaemonPort();
|
|
679733
679758
|
const managed = await managedDaemonServiceMatchesPort(p2);
|
|
679734
679759
|
if (managed) {
|
|
@@ -679737,12 +679762,14 @@ async function restartDaemon(port, expectedVersion) {
|
|
|
679737
679762
|
if (!reclaimed.ok) return false;
|
|
679738
679763
|
await reclaimStaleDaemonEndpointClaim(p2);
|
|
679739
679764
|
}
|
|
679765
|
+
await runUserSystemctl(["reset-failed", "omnius-daemon.service"]);
|
|
679740
679766
|
const restarted = await runUserSystemctl(["restart", "omnius-daemon.service"]);
|
|
679741
679767
|
if (restarted.ok && (await waitForDaemonReady(p2, expectedVersion)).ok) return true;
|
|
679742
|
-
const repaired = await repairManagedDaemonUnit(p2);
|
|
679768
|
+
const repaired = await repairManagedDaemonUnit(p2, preferredEntrypoint);
|
|
679743
679769
|
if (repaired) {
|
|
679744
679770
|
await runUserSystemctl(["stop", "omnius-daemon.service"]);
|
|
679745
679771
|
await waitForDaemonStopped(p2);
|
|
679772
|
+
await runUserSystemctl(["reset-failed", "omnius-daemon.service"]);
|
|
679746
679773
|
const started = await runUserSystemctl(["start", "omnius-daemon.service"]);
|
|
679747
679774
|
if (started.ok && (await waitForDaemonReady(p2, expectedVersion)).ok) return true;
|
|
679748
679775
|
}
|
|
@@ -679757,7 +679784,7 @@ async function restartDaemon(port, expectedVersion) {
|
|
|
679757
679784
|
if (!reclaimed.ok) return false;
|
|
679758
679785
|
}
|
|
679759
679786
|
if (!await reclaimStaleDaemonEndpointClaim(p2)) return false;
|
|
679760
|
-
const pid = await startDaemon(p2);
|
|
679787
|
+
const pid = await startDaemon(p2, preferredEntrypoint);
|
|
679761
679788
|
if (!pid) return false;
|
|
679762
679789
|
return (await waitForDaemonReady(p2, expectedVersion)).ok;
|
|
679763
679790
|
}
|
|
@@ -679792,8 +679819,9 @@ function commandForEntrypoint(path16, nodeExe) {
|
|
|
679792
679819
|
}
|
|
679793
679820
|
return { command: path16, args };
|
|
679794
679821
|
}
|
|
679795
|
-
async function resolveDaemonCommand(nodeExe) {
|
|
679822
|
+
async function resolveDaemonCommand(nodeExe, preferredEntrypoint) {
|
|
679796
679823
|
const candidates = [];
|
|
679824
|
+
if (preferredEntrypoint) candidates.push(preferredEntrypoint);
|
|
679797
679825
|
const thisDir = dirname44(fileURLToPath18(import.meta.url));
|
|
679798
679826
|
candidates.push(join130(thisDir, "index.js"));
|
|
679799
679827
|
if (process.argv[1]) candidates.push(process.argv[1]);
|
|
@@ -679816,13 +679844,13 @@ async function resolveDaemonCommand(nodeExe) {
|
|
|
679816
679844
|
}
|
|
679817
679845
|
return null;
|
|
679818
679846
|
}
|
|
679819
|
-
async function startDaemon(port = getDaemonPort()) {
|
|
679847
|
+
async function startDaemon(port = getDaemonPort(), preferredEntrypoint) {
|
|
679820
679848
|
mkdirSync70(OMNIUS_DIR, { recursive: true });
|
|
679821
679849
|
const daemonPort = port;
|
|
679822
679850
|
const endpointClaim = claimDaemonEndpoint(daemonPort);
|
|
679823
679851
|
if (!endpointClaim) return null;
|
|
679824
679852
|
const nodeExe = process.execPath;
|
|
679825
|
-
const daemonCommand = await resolveDaemonCommand(nodeExe);
|
|
679853
|
+
const daemonCommand = await resolveDaemonCommand(nodeExe, preferredEntrypoint);
|
|
679826
679854
|
if (!daemonCommand) {
|
|
679827
679855
|
releaseDaemonEndpointClaim(endpointClaim);
|
|
679828
679856
|
return null;
|
package/dist/update-worker.js
CHANGED
|
@@ -293776,9 +293776,9 @@ async function managedDaemonServiceOwnsPort(port, dependencies = {
|
|
|
293776
293776
|
function systemdQuote(value) {
|
|
293777
293777
|
return /[\s"\\]/.test(value) ? `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"` : value;
|
|
293778
293778
|
}
|
|
293779
|
-
async function repairManagedDaemonUnit(port) {
|
|
293779
|
+
async function repairManagedDaemonUnit(port, preferredEntrypoint) {
|
|
293780
293780
|
if (process.platform !== "linux") return false;
|
|
293781
|
-
const command = await resolveDaemonCommand(process.execPath);
|
|
293781
|
+
const command = await resolveDaemonCommand(process.execPath, preferredEntrypoint);
|
|
293782
293782
|
if (!command) return false;
|
|
293783
293783
|
try {
|
|
293784
293784
|
const configHome = process.env["XDG_CONFIG_HOME"] || join14(homedir14(), ".config");
|
|
@@ -293990,7 +293990,7 @@ async function reclaimOwnedDaemonListener(port = getDaemonPort(), dependencies =
|
|
|
293990
293990
|
}
|
|
293991
293991
|
return { ok: true, action: "cleared", port, clearedPids, blockedPids: [] };
|
|
293992
293992
|
}
|
|
293993
|
-
async function restartDaemon(port, expectedVersion) {
|
|
293993
|
+
async function restartDaemon(port, expectedVersion, preferredEntrypoint) {
|
|
293994
293994
|
const p = port ?? getDaemonPort();
|
|
293995
293995
|
const managed = await managedDaemonServiceMatchesPort(p);
|
|
293996
293996
|
if (managed) {
|
|
@@ -293999,12 +293999,14 @@ async function restartDaemon(port, expectedVersion) {
|
|
|
293999
293999
|
if (!reclaimed.ok) return false;
|
|
294000
294000
|
await reclaimStaleDaemonEndpointClaim(p);
|
|
294001
294001
|
}
|
|
294002
|
+
await runUserSystemctl(["reset-failed", "omnius-daemon.service"]);
|
|
294002
294003
|
const restarted = await runUserSystemctl(["restart", "omnius-daemon.service"]);
|
|
294003
294004
|
if (restarted.ok && (await waitForDaemonReady(p, expectedVersion)).ok) return true;
|
|
294004
|
-
const repaired = await repairManagedDaemonUnit(p);
|
|
294005
|
+
const repaired = await repairManagedDaemonUnit(p, preferredEntrypoint);
|
|
294005
294006
|
if (repaired) {
|
|
294006
294007
|
await runUserSystemctl(["stop", "omnius-daemon.service"]);
|
|
294007
294008
|
await waitForDaemonStopped(p);
|
|
294009
|
+
await runUserSystemctl(["reset-failed", "omnius-daemon.service"]);
|
|
294008
294010
|
const started = await runUserSystemctl(["start", "omnius-daemon.service"]);
|
|
294009
294011
|
if (started.ok && (await waitForDaemonReady(p, expectedVersion)).ok) return true;
|
|
294010
294012
|
}
|
|
@@ -294019,7 +294021,7 @@ async function restartDaemon(port, expectedVersion) {
|
|
|
294019
294021
|
if (!reclaimed.ok) return false;
|
|
294020
294022
|
}
|
|
294021
294023
|
if (!await reclaimStaleDaemonEndpointClaim(p)) return false;
|
|
294022
|
-
const pid = await startDaemon(p);
|
|
294024
|
+
const pid = await startDaemon(p, preferredEntrypoint);
|
|
294023
294025
|
if (!pid) return false;
|
|
294024
294026
|
return (await waitForDaemonReady(p, expectedVersion)).ok;
|
|
294025
294027
|
}
|
|
@@ -294039,8 +294041,9 @@ function commandForEntrypoint(path, nodeExe) {
|
|
|
294039
294041
|
}
|
|
294040
294042
|
return { command: path, args };
|
|
294041
294043
|
}
|
|
294042
|
-
async function resolveDaemonCommand(nodeExe) {
|
|
294044
|
+
async function resolveDaemonCommand(nodeExe, preferredEntrypoint) {
|
|
294043
294045
|
const candidates = [];
|
|
294046
|
+
if (preferredEntrypoint) candidates.push(preferredEntrypoint);
|
|
294044
294047
|
const thisDir = dirname8(fileURLToPath2(import.meta.url));
|
|
294045
294048
|
candidates.push(join14(thisDir, "index.js"));
|
|
294046
294049
|
if (process.argv[1]) candidates.push(process.argv[1]);
|
|
@@ -294063,13 +294066,13 @@ async function resolveDaemonCommand(nodeExe) {
|
|
|
294063
294066
|
}
|
|
294064
294067
|
return null;
|
|
294065
294068
|
}
|
|
294066
|
-
async function startDaemon(port = getDaemonPort()) {
|
|
294069
|
+
async function startDaemon(port = getDaemonPort(), preferredEntrypoint) {
|
|
294067
294070
|
mkdirSync3(OMNIUS_DIR, { recursive: true });
|
|
294068
294071
|
const daemonPort = port;
|
|
294069
294072
|
const endpointClaim = claimDaemonEndpoint(daemonPort);
|
|
294070
294073
|
if (!endpointClaim) return null;
|
|
294071
294074
|
const nodeExe = process.execPath;
|
|
294072
|
-
const daemonCommand = await resolveDaemonCommand(nodeExe);
|
|
294075
|
+
const daemonCommand = await resolveDaemonCommand(nodeExe, preferredEntrypoint);
|
|
294073
294076
|
if (!daemonCommand) {
|
|
294074
294077
|
releaseDaemonEndpointClaim(endpointClaim);
|
|
294075
294078
|
return null;
|
|
@@ -294496,24 +294499,31 @@ async function runVerifiedUpdateTransaction(initial, dependencies, paths = resol
|
|
|
294496
294499
|
executable_version: evidence.executableVersion
|
|
294497
294500
|
}, paths);
|
|
294498
294501
|
state = transition(state, { phase: "daemon_restarting" }, paths);
|
|
294499
|
-
|
|
294500
|
-
|
|
294501
|
-
|
|
294502
|
-
);
|
|
294502
|
+
let daemon = null;
|
|
294503
|
+
let restartAcknowledged = false;
|
|
294504
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
294505
|
+
restartAcknowledged = await dependencies.restartDaemon(target, evidence.executablePath) || restartAcknowledged;
|
|
294506
|
+
daemon = await dependencies.observeDaemon();
|
|
294507
|
+
if (daemon?.bootVersion === target && daemon.bootPackageHash === evidence.packageHash) {
|
|
294508
|
+
break;
|
|
294509
|
+
}
|
|
294510
|
+
if (attempt < 3) await new Promise((resolve12) => setTimeout(resolve12, 1e3));
|
|
294503
294511
|
}
|
|
294504
|
-
daemonQuiesced = false;
|
|
294505
|
-
const daemon = await dependencies.observeDaemon();
|
|
294506
294512
|
if (!daemon || daemon.bootVersion !== target) {
|
|
294507
|
-
|
|
294513
|
+
const observed = daemon?.bootVersion ?? "unreachable";
|
|
294514
|
+
throw new Error(
|
|
294515
|
+
restartAcknowledged ? `Daemon verification failed after 3 recovery attempts: expected ${target}, observed ${observed}` : `The daemon at ${state.daemon_endpoint ?? "the configured endpoint"} could not be restarted from the verified Omnius v${target} executable after 3 attempts`
|
|
294516
|
+
);
|
|
294508
294517
|
}
|
|
294509
294518
|
if (!daemon.bootPackageHash) {
|
|
294510
|
-
throw new Error("Daemon package verification failed: the restarted runtime did not report a boot package hash");
|
|
294519
|
+
throw new Error("Daemon package verification failed after 3 recovery attempts: the restarted runtime did not report a boot package hash");
|
|
294511
294520
|
}
|
|
294512
294521
|
if (daemon.bootPackageHash !== evidence.packageHash) {
|
|
294513
294522
|
throw new Error(
|
|
294514
|
-
`Daemon package verification failed: boot hash ${daemon.bootPackageHash} does not match installed hash ${evidence.packageHash}`
|
|
294523
|
+
`Daemon package verification failed after 3 recovery attempts: boot hash ${daemon.bootPackageHash} does not match installed hash ${evidence.packageHash}`
|
|
294515
294524
|
);
|
|
294516
294525
|
}
|
|
294526
|
+
daemonQuiesced = false;
|
|
294517
294527
|
state = transition(state, {
|
|
294518
294528
|
phase: "runtime_verified",
|
|
294519
294529
|
daemon_version: daemon.bootVersion,
|
|
@@ -294865,8 +294875,8 @@ async function main() {
|
|
|
294865
294875
|
state,
|
|
294866
294876
|
{
|
|
294867
294877
|
quiesceDaemon: () => quiesceDaemonForUpdate(port),
|
|
294868
|
-
restartDaemon: (expected) => restartDaemon(port, expected),
|
|
294869
|
-
recoverDaemon: () => restartDaemon(port),
|
|
294878
|
+
restartDaemon: (expected, executable) => restartDaemon(port, expected, executable),
|
|
294879
|
+
recoverDaemon: () => restartDaemon(port, target),
|
|
294870
294880
|
observeDaemon: async () => {
|
|
294871
294881
|
const identity = await getDaemonReportedIdentity(port);
|
|
294872
294882
|
return identity ? { bootVersion: identity.bootVersion, bootPackageHash: identity.bootPackageHash } : null;
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omnius",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.622",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "omnius",
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.622",
|
|
10
10
|
"bundleDependencies": [
|
|
11
11
|
"image-to-ascii"
|
|
12
12
|
],
|
package/package.json
CHANGED