@bjorntech/key-ferry 0.1.13 → 0.1.14
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/README.md +20 -0
- package/dist/broker-registry.d.ts +26 -0
- package/dist/broker-registry.d.ts.map +1 -1
- package/dist/broker-registry.js +253 -54
- package/dist/broker-registry.js.map +1 -1
- package/dist/contracts.d.ts +7 -3
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +1 -0
- package/dist/contracts.js.map +1 -1
- package/dist/options.d.ts +1 -0
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +17 -0
- package/dist/options.js.map +1 -1
- package/dist/rpc.d.ts +22 -12
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +27 -27
- package/dist/rpc.js.map +1 -1
- package/dist/scoped-controller.d.ts.map +1 -1
- package/dist/scoped-controller.js +4 -2
- package/dist/scoped-controller.js.map +1 -1
- package/dist/scopes/controller-helpers.d.ts.map +1 -1
- package/dist/scopes/controller-helpers.js +5 -0
- package/dist/scopes/controller-helpers.js.map +1 -1
- package/dist/services/process.d.ts +2 -0
- package/dist/services/process.d.ts.map +1 -1
- package/dist/services/process.js +13 -2
- package/dist/services/process.js.map +1 -1
- package/dist/varlock/manager.d.ts.map +1 -1
- package/dist/varlock/manager.js +258 -72
- package/dist/varlock/manager.js.map +1 -1
- package/dist/varlock/ownership.d.ts +60 -0
- package/dist/varlock/ownership.d.ts.map +1 -0
- package/dist/varlock/ownership.js +372 -0
- package/dist/varlock/ownership.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { mkdir, readFile, readdir, rm, lstat, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
export declare const OWNERSHIP_RECORD_VERSION = 2;
|
|
3
|
+
export interface BrokerOwnershipRecord {
|
|
4
|
+
readonly version?: 2;
|
|
5
|
+
readonly brokerKeyHash: string;
|
|
6
|
+
readonly sessionUuid: string;
|
|
7
|
+
readonly starterPid: number;
|
|
8
|
+
readonly starterStartTime?: string;
|
|
9
|
+
readonly cwd: string;
|
|
10
|
+
readonly created: string;
|
|
11
|
+
/** @deprecated accepted only while reading old records, never written */
|
|
12
|
+
readonly sessionId?: string;
|
|
13
|
+
readonly pid?: number;
|
|
14
|
+
readonly pidStartTime?: string;
|
|
15
|
+
readonly command?: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
export interface OwnershipFileOps {
|
|
18
|
+
readonly mkdir: typeof mkdir;
|
|
19
|
+
readonly readFile: typeof readFile;
|
|
20
|
+
readonly readdir: typeof readdir;
|
|
21
|
+
readonly rm: typeof rm;
|
|
22
|
+
readonly lstat?: typeof lstat;
|
|
23
|
+
readonly rename?: typeof rename;
|
|
24
|
+
readonly writeFile: typeof writeFile;
|
|
25
|
+
/** Test seam; production uses the per-user temporary directory. */
|
|
26
|
+
readonly directory?: string;
|
|
27
|
+
}
|
|
28
|
+
type ReaperEvent = {
|
|
29
|
+
readonly event: "stale-reaped" | "stale-skipped";
|
|
30
|
+
readonly keyHash: string;
|
|
31
|
+
readonly directory?: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function setOwnershipLifecycleLogger(logger: ((event: ReaperEvent) => void) | undefined): () => void;
|
|
34
|
+
export declare function ownershipDirectory(root?: string): string;
|
|
35
|
+
export declare function ownershipFileOps(directory: string): OwnershipFileOps;
|
|
36
|
+
export declare function writeOwnershipRecord(record: BrokerOwnershipRecord, ops?: OwnershipFileOps): Promise<void>;
|
|
37
|
+
export declare function removeOwnershipRecord(hash: string, ops?: OwnershipFileOps): Promise<void>;
|
|
38
|
+
export declare function readOwnershipRecords(ops?: OwnershipFileOps, onError?: (error: unknown) => void): Promise<BrokerOwnershipRecord[]>;
|
|
39
|
+
export interface OwnershipVerifier {
|
|
40
|
+
readonly isAlive?: (pid: number) => Promise<boolean>;
|
|
41
|
+
readonly startTime?: (pid: number) => Promise<string | undefined>;
|
|
42
|
+
readonly command?: (pid: number) => Promise<readonly string[] | undefined>;
|
|
43
|
+
/** The configured executable/prefix used to launch proxy start. */
|
|
44
|
+
readonly expectedCommand?: readonly string[];
|
|
45
|
+
readonly status?: () => Promise<readonly {
|
|
46
|
+
readonly uuid: string;
|
|
47
|
+
readonly endedAt?: string;
|
|
48
|
+
}[]>;
|
|
49
|
+
readonly stop: (record: BrokerOwnershipRecord) => Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
export declare function reapOwnershipRecords(verifier: OwnershipVerifier, ops?: OwnershipFileOps): Promise<{
|
|
52
|
+
reaped: number;
|
|
53
|
+
skipped: number;
|
|
54
|
+
}>;
|
|
55
|
+
export declare function reapStaleOwnershipRecords(command?: string | readonly string[], ops?: OwnershipFileOps): Promise<void>;
|
|
56
|
+
export declare function starterStillOwned(record: BrokerOwnershipRecord, verifier: OwnershipVerifier): Promise<boolean>;
|
|
57
|
+
export declare function hasStarterVerifier(record: BrokerOwnershipRecord, verifier: OwnershipVerifier): boolean;
|
|
58
|
+
export declare function sameStarterIdentity(alive: boolean, start: string | undefined, command: readonly string[] | undefined, expectedStart: string | undefined, expectedCommand?: readonly string[]): boolean;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../../src/varlock/ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { mkdir, readFile, readdir, rm, lstat, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, basename } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
export const OWNERSHIP_RECORD_VERSION = 2;
|
|
7
|
+
const files = {
|
|
8
|
+
mkdir,
|
|
9
|
+
readFile,
|
|
10
|
+
readdir,
|
|
11
|
+
rm,
|
|
12
|
+
lstat,
|
|
13
|
+
rename,
|
|
14
|
+
writeFile,
|
|
15
|
+
};
|
|
16
|
+
const exec = promisify(execFile);
|
|
17
|
+
const inFlightByOps = new WeakMap();
|
|
18
|
+
const lifecycleLoggers = new Set();
|
|
19
|
+
export function setOwnershipLifecycleLogger(logger) {
|
|
20
|
+
if (!logger)
|
|
21
|
+
return () => undefined;
|
|
22
|
+
lifecycleLoggers.add(logger);
|
|
23
|
+
let active = true;
|
|
24
|
+
return () => {
|
|
25
|
+
if (active)
|
|
26
|
+
lifecycleLoggers.delete(logger);
|
|
27
|
+
active = false;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function ownershipDirectory(root = tmpdir()) {
|
|
31
|
+
const uid = typeof process.getuid === "function" ? String(process.getuid()) : "unknown";
|
|
32
|
+
return join(root, `key-ferry-${uid}`);
|
|
33
|
+
}
|
|
34
|
+
export function ownershipFileOps(directory) {
|
|
35
|
+
return { ...files, directory };
|
|
36
|
+
}
|
|
37
|
+
function safeName(hash) {
|
|
38
|
+
if (!/^[a-f0-9]{8,128}$/.test(hash))
|
|
39
|
+
throw new TypeError("invalid broker key hash");
|
|
40
|
+
return `${hash}.json`;
|
|
41
|
+
}
|
|
42
|
+
async function secureDirectory(ops) {
|
|
43
|
+
const directory = ops.directory ?? ownershipDirectory();
|
|
44
|
+
// Minimal injected stores may model only record files; the real implementation
|
|
45
|
+
// always provides lstat and therefore always takes the security checks below.
|
|
46
|
+
if (!ops.lstat)
|
|
47
|
+
return directory;
|
|
48
|
+
try {
|
|
49
|
+
const info = await directoryInfo(ops, directory);
|
|
50
|
+
assertSecureDirectory(info);
|
|
51
|
+
return directory;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
for (const logger of lifecycleLoggers)
|
|
55
|
+
logger({ event: "stale-skipped", keyHash: "0".repeat(12), directory });
|
|
56
|
+
throw new Error("ownership directory unavailable");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function directoryInfo(ops, directory) {
|
|
60
|
+
try {
|
|
61
|
+
return await (ops.lstat ?? lstat)(directory);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error?.code !== "ENOENT")
|
|
65
|
+
throw error;
|
|
66
|
+
await createDirectory(ops, directory);
|
|
67
|
+
return (ops.lstat ?? lstat)(directory);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function createDirectory(ops, directory) {
|
|
71
|
+
try {
|
|
72
|
+
await ops.mkdir(directory, { recursive: false, mode: 0o700 });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error?.code !== "EEXIST")
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function assertSecureDirectory(info) {
|
|
80
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
|
|
81
|
+
const insecure = [
|
|
82
|
+
info.isSymbolicLink(),
|
|
83
|
+
!info.isDirectory(),
|
|
84
|
+
uid !== undefined && info.uid !== uid,
|
|
85
|
+
(Number(info.mode) & 0o077) !== 0,
|
|
86
|
+
].some(Boolean);
|
|
87
|
+
if (insecure)
|
|
88
|
+
throw new Error("insecure ownership directory");
|
|
89
|
+
}
|
|
90
|
+
export async function writeOwnershipRecord(record, ops = files) {
|
|
91
|
+
const directory = await secureDirectory(ops);
|
|
92
|
+
const target = join(directory, safeName(record.brokerKeyHash));
|
|
93
|
+
const temporary = join(directory, `.${basename(target)}.${process.pid}.${Math.random().toString(16).slice(2)}.tmp`);
|
|
94
|
+
// wx prevents an attacker from replacing a file we are about to publish.
|
|
95
|
+
const published = publishedRecord(record, directory);
|
|
96
|
+
await ops.writeFile(temporary, `${JSON.stringify(published)}\n`, {
|
|
97
|
+
encoding: "utf8",
|
|
98
|
+
mode: 0o600,
|
|
99
|
+
flag: "wx",
|
|
100
|
+
});
|
|
101
|
+
try {
|
|
102
|
+
await (ops.rename ?? rename)(temporary, target);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
await ops.rm(temporary, { force: true }).catch(() => undefined);
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function publishedRecord(record, directory) {
|
|
110
|
+
const sessionUuid = record.sessionUuid ?? record.sessionId;
|
|
111
|
+
const starterPid = record.starterPid ?? record.pid;
|
|
112
|
+
const starterStartTime = record.starterStartTime ?? record.pidStartTime;
|
|
113
|
+
return {
|
|
114
|
+
version: 2,
|
|
115
|
+
brokerKeyHash: record.brokerKeyHash,
|
|
116
|
+
sessionUuid,
|
|
117
|
+
starterPid,
|
|
118
|
+
...optionalStartTime(starterStartTime),
|
|
119
|
+
cwd: record.cwd ?? directory,
|
|
120
|
+
created: record.created,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function optionalStartTime(value) {
|
|
124
|
+
return value ? { starterStartTime: value } : {};
|
|
125
|
+
}
|
|
126
|
+
export async function removeOwnershipRecord(hash, ops = files) {
|
|
127
|
+
const dir = await secureDirectory(ops);
|
|
128
|
+
await ops.rm(join(dir, safeName(hash)), { force: true });
|
|
129
|
+
}
|
|
130
|
+
function normalize(value) {
|
|
131
|
+
return isNormalizedRecord(value) ? value : undefined;
|
|
132
|
+
}
|
|
133
|
+
function isNormalizedRecord(value) {
|
|
134
|
+
return (value?.version === 2 &&
|
|
135
|
+
typeof value.sessionUuid === "string" &&
|
|
136
|
+
Number.isSafeInteger(value.starterPid) &&
|
|
137
|
+
typeof value.cwd === "string" &&
|
|
138
|
+
typeof value.created === "string");
|
|
139
|
+
}
|
|
140
|
+
export async function readOwnershipRecords(ops = files, onError) {
|
|
141
|
+
let directory;
|
|
142
|
+
try {
|
|
143
|
+
directory = await secureDirectory(ops);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
onError?.(new Error("ownership directory unavailable"));
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
let names;
|
|
150
|
+
try {
|
|
151
|
+
names = await ops.readdir(directory);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
onError?.(new Error("ownership directory unavailable"));
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
const records = [];
|
|
158
|
+
for (const name of names.filter((item) => /^[a-f0-9]{8,128}\.json$/.test(item))) {
|
|
159
|
+
const record = await readRecord(ops, join(directory, name));
|
|
160
|
+
if (record)
|
|
161
|
+
records.push(record);
|
|
162
|
+
}
|
|
163
|
+
return records;
|
|
164
|
+
}
|
|
165
|
+
async function readRecord(ops, path) {
|
|
166
|
+
try {
|
|
167
|
+
const info = ops.lstat ? await ops.lstat(path) : undefined;
|
|
168
|
+
if (info && !regularRecordFile(info))
|
|
169
|
+
return undefined;
|
|
170
|
+
const record = normalize(JSON.parse(await ops.readFile(path, "utf8")));
|
|
171
|
+
await removeInvalidRecord(record, ops, path);
|
|
172
|
+
return record;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
await ops.rm(path, { force: true }).catch(() => undefined);
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function removeInvalidRecord(record, ops, path) {
|
|
180
|
+
if (!record)
|
|
181
|
+
await ops.rm(path, { force: true });
|
|
182
|
+
}
|
|
183
|
+
function regularRecordFile(info) {
|
|
184
|
+
return !info.isSymbolicLink() && info.isFile();
|
|
185
|
+
}
|
|
186
|
+
export async function reapOwnershipRecords(verifier, ops = files) {
|
|
187
|
+
const key = ops.directory ?? ownershipDirectory();
|
|
188
|
+
const byDirectory = inFlightByOps.get(ops) ?? new Map();
|
|
189
|
+
inFlightByOps.set(ops, byDirectory);
|
|
190
|
+
const existing = byDirectory.get(key);
|
|
191
|
+
if (existing)
|
|
192
|
+
return existing;
|
|
193
|
+
const operation = reapOwnershipRecordsOnce(verifier, ops);
|
|
194
|
+
byDirectory.set(key, operation);
|
|
195
|
+
return operation;
|
|
196
|
+
}
|
|
197
|
+
async function reapOwnershipRecordsOnce(verifier, ops) {
|
|
198
|
+
const records = await readOwnershipRecords(ops, () => lifecycleLoggers.forEach((l) => l({
|
|
199
|
+
event: "stale-skipped",
|
|
200
|
+
keyHash: "0".repeat(12),
|
|
201
|
+
directory: ownershipDirectory(),
|
|
202
|
+
})));
|
|
203
|
+
// The optional verifier seam preserves compatibility with small injected test
|
|
204
|
+
// verifiers. The production reaper always supplies status and therefore never
|
|
205
|
+
// relies on starter liveness to decide whether a daemon is owned.
|
|
206
|
+
if (!verifier.status)
|
|
207
|
+
return reapLegacyRecords(records, verifier, ops);
|
|
208
|
+
let sessions;
|
|
209
|
+
try {
|
|
210
|
+
sessions = await verifier.status();
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
for (const r of records)
|
|
214
|
+
lifecycleLoggers.forEach((l) => l({
|
|
215
|
+
event: "stale-skipped",
|
|
216
|
+
keyHash: r.brokerKeyHash.slice(0, 12),
|
|
217
|
+
directory: r.cwd,
|
|
218
|
+
}));
|
|
219
|
+
return { reaped: 0, skipped: records.length };
|
|
220
|
+
}
|
|
221
|
+
return reapActiveRecords(records, sessions, verifier, ops);
|
|
222
|
+
}
|
|
223
|
+
async function reapLegacyRecords(records, verifier, ops) {
|
|
224
|
+
let reaped = 0, skipped = 0;
|
|
225
|
+
for (const record of records) {
|
|
226
|
+
if (await legacyRecordIsStale(record, verifier)) {
|
|
227
|
+
skipped++;
|
|
228
|
+
await removeOwnershipRecord(record.brokerKeyHash, ops);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
await verifier.stop(record);
|
|
232
|
+
await removeOwnershipRecord(record.brokerKeyHash, ops);
|
|
233
|
+
reaped++;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return { reaped, skipped };
|
|
237
|
+
}
|
|
238
|
+
async function legacyRecordIsStale(record, verifier) {
|
|
239
|
+
const alive = (await verifier.isAlive?.(record.starterPid)) ?? false;
|
|
240
|
+
const start = await verifier.startTime?.(record.starterPid);
|
|
241
|
+
const command = await verifier.command?.(record.starterPid);
|
|
242
|
+
return !alive || start !== record.starterStartTime || command === undefined;
|
|
243
|
+
}
|
|
244
|
+
async function reapActiveRecords(records, sessions, verifier, ops) {
|
|
245
|
+
let reaped = 0, skipped = 0;
|
|
246
|
+
for (const record of records) {
|
|
247
|
+
if (!sessions.some((s) => s.uuid === record.sessionUuid && !s.endedAt)) {
|
|
248
|
+
await removeOwnershipRecord(record.brokerKeyHash, ops);
|
|
249
|
+
lifecycleLoggers.forEach((l) => l({
|
|
250
|
+
event: "stale-reaped",
|
|
251
|
+
keyHash: record.brokerKeyHash.slice(0, 12),
|
|
252
|
+
directory: record.cwd,
|
|
253
|
+
}));
|
|
254
|
+
reaped++;
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
await verifier.stop(record);
|
|
259
|
+
await removeOwnershipRecord(record.brokerKeyHash, ops);
|
|
260
|
+
lifecycleLoggers.forEach((l) => l({
|
|
261
|
+
event: "stale-reaped",
|
|
262
|
+
keyHash: record.brokerKeyHash.slice(0, 12),
|
|
263
|
+
directory: record.cwd,
|
|
264
|
+
}));
|
|
265
|
+
reaped++;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
skipped++;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return { reaped, skipped };
|
|
272
|
+
}
|
|
273
|
+
export function reapStaleOwnershipRecords(command = "varlock", ops = files) {
|
|
274
|
+
const directory = ops.directory ?? ownershipDirectory();
|
|
275
|
+
const configuredCommand = typeof command === "string" ? [command] : [...command];
|
|
276
|
+
const executable = configuredCommand[0] ?? "varlock";
|
|
277
|
+
const verifier = {
|
|
278
|
+
expectedCommand: configuredCommand,
|
|
279
|
+
status: async () => {
|
|
280
|
+
const result = await exec(executable, ["proxy", "status", "--format", "json"], {
|
|
281
|
+
timeout: 2_000,
|
|
282
|
+
});
|
|
283
|
+
const parsed = JSON.parse(result.stdout);
|
|
284
|
+
return Array.isArray(parsed) ? parsed : (parsed.sessions ?? []);
|
|
285
|
+
},
|
|
286
|
+
stop: async (record) => {
|
|
287
|
+
await exec(executable, ["proxy", "stop", "--session", record.sessionUuid], {
|
|
288
|
+
timeout: 2_000,
|
|
289
|
+
});
|
|
290
|
+
if (await starterStillOwned(record, verifier))
|
|
291
|
+
terminateStarter(record.starterPid);
|
|
292
|
+
},
|
|
293
|
+
isAlive: async (pid) => {
|
|
294
|
+
try {
|
|
295
|
+
process.kill(pid, 0);
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
startTime: async (pid) => {
|
|
303
|
+
try {
|
|
304
|
+
const result = await exec("ps", ["-o", "lstart=", "-p", String(pid)], {
|
|
305
|
+
timeout: 2_000,
|
|
306
|
+
});
|
|
307
|
+
return result.stdout.trim();
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return undefined;
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
command: async (pid) => {
|
|
314
|
+
try {
|
|
315
|
+
const result = await exec("ps", ["-o", "command=", "-p", String(pid)], {
|
|
316
|
+
timeout: 2_000,
|
|
317
|
+
});
|
|
318
|
+
return result.stdout.trim().split(/\s+/);
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return undefined;
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
const byDirectory = inFlightByOps.get(ops) ?? new Map();
|
|
326
|
+
inFlightByOps.set(ops, byDirectory);
|
|
327
|
+
const existing = byDirectory.get(directory);
|
|
328
|
+
if (existing)
|
|
329
|
+
return existing.then(() => undefined).catch(() => undefined);
|
|
330
|
+
const pass = reapOwnershipRecords(verifier, ops)
|
|
331
|
+
.then(() => undefined)
|
|
332
|
+
.catch(() => undefined);
|
|
333
|
+
byDirectory.set(directory, pass.then(() => ({ reaped: 0, skipped: 0 })));
|
|
334
|
+
return pass;
|
|
335
|
+
}
|
|
336
|
+
export async function starterStillOwned(record, verifier) {
|
|
337
|
+
if (!hasStarterVerifier(record, verifier))
|
|
338
|
+
return false;
|
|
339
|
+
const isAlive = verifier.isAlive;
|
|
340
|
+
const getStartTime = verifier.startTime;
|
|
341
|
+
const getCommand = verifier.command;
|
|
342
|
+
if (!isAlive || !getStartTime || !getCommand)
|
|
343
|
+
return false;
|
|
344
|
+
const alive = await isAlive(record.starterPid);
|
|
345
|
+
const start = await getStartTime(record.starterPid);
|
|
346
|
+
const command = await getCommand(record.starterPid);
|
|
347
|
+
return sameStarterIdentity(alive, start, command, record.starterStartTime, verifier.expectedCommand);
|
|
348
|
+
}
|
|
349
|
+
export function hasStarterVerifier(record, verifier) {
|
|
350
|
+
return [record.starterStartTime, verifier.isAlive, verifier.startTime, verifier.command].every(Boolean);
|
|
351
|
+
}
|
|
352
|
+
export function sameStarterIdentity(alive, start, command, expectedStart, expectedCommand = ["varlock"]) {
|
|
353
|
+
const configured = expectedCommand.length > 0 ? expectedCommand : ["varlock"];
|
|
354
|
+
const executableMatches = command !== undefined &&
|
|
355
|
+
basename(command[0] ?? "") === basename(configured[0] ?? "") &&
|
|
356
|
+
configured.slice(1).every((part, index) => command[index + 1] === part);
|
|
357
|
+
const startPrefix = command?.slice(configured.length, configured.length + 2);
|
|
358
|
+
return [
|
|
359
|
+
alive,
|
|
360
|
+
start === expectedStart,
|
|
361
|
+
command,
|
|
362
|
+
executableMatches,
|
|
363
|
+
JSON.stringify(startPrefix) === JSON.stringify(["proxy", "start"]),
|
|
364
|
+
].every(Boolean);
|
|
365
|
+
}
|
|
366
|
+
function terminateStarter(pid) {
|
|
367
|
+
try {
|
|
368
|
+
process.kill(pid, "SIGTERM");
|
|
369
|
+
}
|
|
370
|
+
catch { }
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../src/varlock/ownership.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@bjorntech/key-ferry",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.14",
|
|
5
5
|
"description": "Project-scoped Key Ferry integration for OpenCode V2",
|
|
6
6
|
"keywords": [],
|
|
7
7
|
"homepage": "https://github.com/bjorntech/key-ferry#readme",
|