looply-cli 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/.src-hash +1 -1
  2. package/dist/bin.d.ts.map +1 -1
  3. package/dist/bin.js +25 -11
  4. package/dist/bin.js.map +1 -1
  5. package/dist/connect-node.d.ts +8 -0
  6. package/dist/connect-node.d.ts.map +1 -0
  7. package/dist/connect-node.js +110 -0
  8. package/dist/connect-node.js.map +1 -0
  9. package/dist/connect.d.ts +135 -0
  10. package/dist/connect.d.ts.map +1 -0
  11. package/dist/connect.js +329 -0
  12. package/dist/connect.js.map +1 -0
  13. package/dist/daemon-cmd.d.ts +11 -2
  14. package/dist/daemon-cmd.d.ts.map +1 -1
  15. package/dist/daemon-cmd.js +20 -6
  16. package/dist/daemon-cmd.js.map +1 -1
  17. package/dist/repo-init.d.ts +36 -0
  18. package/dist/repo-init.d.ts.map +1 -0
  19. package/dist/repo-init.js +61 -0
  20. package/dist/repo-init.js.map +1 -0
  21. package/dist/repo-origin.d.ts +15 -0
  22. package/dist/repo-origin.d.ts.map +1 -0
  23. package/dist/repo-origin.js +28 -0
  24. package/dist/repo-origin.js.map +1 -0
  25. package/dist/repo-requests.d.ts +79 -0
  26. package/dist/repo-requests.d.ts.map +1 -0
  27. package/dist/repo-requests.js +180 -0
  28. package/dist/repo-requests.js.map +1 -0
  29. package/dist/repo-scan.d.ts +47 -0
  30. package/dist/repo-scan.d.ts.map +1 -0
  31. package/dist/repo-scan.js +84 -0
  32. package/dist/repo-scan.js.map +1 -0
  33. package/dist/serve-cmd.d.ts +132 -0
  34. package/dist/serve-cmd.d.ts.map +1 -0
  35. package/dist/serve-cmd.js +532 -0
  36. package/dist/serve-cmd.js.map +1 -0
  37. package/dist/serve-tasks.d.ts +17 -0
  38. package/dist/serve-tasks.d.ts.map +1 -0
  39. package/dist/serve-tasks.js +124 -0
  40. package/dist/serve-tasks.js.map +1 -0
  41. package/dist/serve.d.ts +202 -0
  42. package/dist/serve.d.ts.map +1 -0
  43. package/dist/serve.js +413 -0
  44. package/dist/serve.js.map +1 -0
  45. package/dist/server-client.d.ts +37 -0
  46. package/dist/server-client.d.ts.map +1 -1
  47. package/dist/server-client.js +21 -0
  48. package/dist/server-client.js.map +1 -1
  49. package/dist/sync.d.ts.map +1 -1
  50. package/dist/sync.js +3 -1
  51. package/dist/sync.js.map +1 -1
  52. package/package.json +54 -54
@@ -0,0 +1,532 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Supervisor = exports.STOP_GRACE_MS = exports.EXIT_USAGE = exports.EXIT_HELD = exports.EXIT_REFUSED = exports.EXIT_OK = exports.SERVE_USAGE = void 0;
4
+ exports.serveCommand = serveCommand;
5
+ exports.selfBin = selfBin;
6
+ exports.nodeServeDeps = nodeServeDeps;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_os_1 = require("node:os");
10
+ const node_path_1 = require("node:path");
11
+ const run_lease_1 = require("./run-lease");
12
+ const serve_tasks_1 = require("./serve-tasks");
13
+ const serve_1 = require("./serve");
14
+ /**
15
+ * `looply serve` and its verbs — the composition around `serve.ts`.
16
+ *
17
+ * looply serve add [path] list a repository to be served (default: here)
18
+ * looply serve remove <path> stop serving one
19
+ * looply serve list what is listed, and whether each is still set up
20
+ * looply serve run the supervisor: one daemon per listed repository
21
+ * looply serve install start the supervisor at login (Windows); a template elsewhere
22
+ * looply serve uninstall undo `install`
23
+ *
24
+ * ⚠️ ADDING A REPOSITORY IS THE CONSENT. Each child runs `looply daemon --yes`,
25
+ * which registers the repository with the server without asking — there is no
26
+ * terminal to ask on. The question a person would have been asked at the
27
+ * daemon's prompt is the one they answered by typing `serve add`.
28
+ */
29
+ exports.SERVE_USAGE = [
30
+ 'looply serve add [path] serve this repository (or <path>) from the one machine-wide supervisor',
31
+ 'looply serve remove <path> stop serving a repository',
32
+ 'looply serve list the served repositories, and whether each still has .looply/config.yaml',
33
+ 'looply serve run the supervisor: one daemon per served repository, restarted if it falls over',
34
+ 'looply serve install | uninstall start the supervisor at login (Windows); prints a service template elsewhere',
35
+ ].join('\n');
36
+ exports.EXIT_OK = 0;
37
+ exports.EXIT_REFUSED = 1;
38
+ /** Somebody else is here — the same answer every other lock in this CLI gives. */
39
+ exports.EXIT_HELD = 2;
40
+ exports.EXIT_USAGE = 64;
41
+ /** How long children get to finish after being asked to stop, before they are killed outright. */
42
+ exports.STOP_GRACE_MS = 10_000;
43
+ /**
44
+ * The supervisor: keeps one child per listed repository alive.
45
+ *
46
+ * ⚠️ A CHILD THAT FAILS IS THE CHILD'S PROBLEM. A repository already served by
47
+ * a daemon a person started by hand makes its child exit on the per-repo lock;
48
+ * that line is logged, the child waits out its backoff and tries again, and
49
+ * every other repository carries on. Nothing a child does can stop the
50
+ * supervisor.
51
+ */
52
+ class Supervisor {
53
+ deps;
54
+ entries = new Map();
55
+ taskTimers = new Map();
56
+ pollTimer = null;
57
+ stopping = false;
58
+ readError = null;
59
+ drained = null;
60
+ /** One promise for every caller of `stop`, so the impatient second call resolves the first. */
61
+ drain = null;
62
+ constructor(deps) {
63
+ this.deps = deps;
64
+ }
65
+ /** The keys of the repositories that have an entry (running, waiting or skipped). */
66
+ keys() {
67
+ return [...this.entries.keys()];
68
+ }
69
+ running() {
70
+ return [...this.entries].filter(([, e]) => e.child !== null).map(([k]) => k);
71
+ }
72
+ start() {
73
+ this.poll();
74
+ for (const task of this.deps.tasks ?? [])
75
+ void this.runTask(task);
76
+ }
77
+ async runTask(task) {
78
+ this.taskTimers.delete(task.name);
79
+ if (this.stopping)
80
+ return;
81
+ try {
82
+ await task.run();
83
+ }
84
+ catch (e) {
85
+ this.deps.log(`[serve] ${task.name} failed — ${e?.message ?? String(e)}; trying again later`);
86
+ }
87
+ if (this.stopping)
88
+ return;
89
+ this.taskTimers.set(task.name, this.deps.setTimer(() => void this.runTask(task), task.everyMs));
90
+ }
91
+ /** Re-read the list and make the running set match it. */
92
+ poll() {
93
+ if (this.stopping)
94
+ return;
95
+ let wanted = null;
96
+ try {
97
+ wanted = this.deps.repos();
98
+ this.readError = null;
99
+ }
100
+ catch (e) {
101
+ // Keep what is running. A list that cannot be read this minute is not a
102
+ // list that says "serve nothing".
103
+ const msg = e.message;
104
+ if (msg !== this.readError)
105
+ this.deps.log(`serve: cannot read the list — ${msg}; keeping what is running`);
106
+ this.readError = msg;
107
+ }
108
+ if (wanted !== null) {
109
+ const live = [...this.entries].filter(([, e]) => !e.removed).map(([k]) => k);
110
+ const plan = (0, serve_1.reconcile)(live, wanted, this.deps.platform);
111
+ for (const key of plan.stop)
112
+ this.retire(key);
113
+ for (const repo of plan.start)
114
+ this.admit(repo);
115
+ }
116
+ this.pollTimer = this.deps.setTimer(() => this.poll(), serve_1.REGISTRY_POLL_MS);
117
+ }
118
+ /**
119
+ * Stop every child and resolve when all are gone. A second call is the
120
+ * impatient one: whatever is left is killed outright.
121
+ */
122
+ stop() {
123
+ const force = this.stopping;
124
+ this.stopping = true;
125
+ if (this.pollTimer !== null)
126
+ this.deps.clearTimer(this.pollTimer);
127
+ this.pollTimer = null;
128
+ for (const t of this.taskTimers.values())
129
+ this.deps.clearTimer(t);
130
+ this.taskTimers.clear();
131
+ for (const [key, e] of this.entries) {
132
+ if (e.timer !== null)
133
+ this.deps.clearTimer(e.timer);
134
+ e.timer = null;
135
+ if (e.child === null)
136
+ this.entries.delete(key);
137
+ else
138
+ e.child.kill(force);
139
+ }
140
+ // A child that ignores the polite ask is killed after the grace period.
141
+ if (!force && this.entries.size > 0)
142
+ this.deps.setTimer(() => void this.stop(), exports.STOP_GRACE_MS);
143
+ if (this.drain === null) {
144
+ this.drain = new Promise((resolve) => {
145
+ this.drained = resolve;
146
+ });
147
+ }
148
+ if (this.entries.size === 0)
149
+ this.drained?.();
150
+ return this.drain;
151
+ }
152
+ admit(repo) {
153
+ const key = (0, serve_1.repoKey)(repo.path, this.deps.platform);
154
+ const prior = this.entries.get(key);
155
+ // Removed and re-added before its old child finished: let the old one go,
156
+ // and start fresh when it has.
157
+ if (prior) {
158
+ prior.removed = false;
159
+ return;
160
+ }
161
+ const entry = {
162
+ repo,
163
+ label: (0, serve_1.repoLabel)(repo.path, this.deps.platform),
164
+ backoff: new serve_1.Backoff(),
165
+ child: null,
166
+ timer: null,
167
+ removed: false,
168
+ skipped: false,
169
+ };
170
+ this.entries.set(key, entry);
171
+ this.launch(key, entry);
172
+ }
173
+ retire(key) {
174
+ const e = this.entries.get(key);
175
+ if (!e)
176
+ return;
177
+ e.removed = true;
178
+ if (e.timer !== null)
179
+ this.deps.clearTimer(e.timer);
180
+ e.timer = null;
181
+ this.say(e, 'no longer listed; stopping');
182
+ if (e.child === null)
183
+ this.entries.delete(key);
184
+ else
185
+ e.child.kill(false);
186
+ }
187
+ launch(key, e) {
188
+ e.timer = null;
189
+ if (this.stopping || e.removed)
190
+ return;
191
+ if (!this.deps.configExists(e.repo.path)) {
192
+ if (!e.skipped) {
193
+ this.say(e, `skipped: ${(0, serve_1.configPathOf)(e.repo.path, this.deps.platform)} is missing — run \`looply init\` there, ` +
194
+ `or \`looply serve remove ${e.repo.path}\`. Checking again later.`);
195
+ }
196
+ e.skipped = true;
197
+ this.later(key, e, e.backoff.exited(this.deps.now()));
198
+ return;
199
+ }
200
+ if (e.skipped)
201
+ this.say(e, 'config is back');
202
+ e.skipped = false;
203
+ this.say(e, `starting daemon in ${e.repo.path}`);
204
+ e.backoff.started(this.deps.now());
205
+ let done = false;
206
+ e.child = this.deps.spawnDaemon(e.repo.path, {
207
+ line: (text) => this.say(e, text),
208
+ exit: (code, signal, error) => {
209
+ if (done)
210
+ return;
211
+ done = true;
212
+ this.exited(key, e, code, signal, error);
213
+ },
214
+ });
215
+ }
216
+ exited(key, e, code, signal, error) {
217
+ e.child = null;
218
+ const how = error
219
+ ? `could not start (${error.message})`
220
+ : signal
221
+ ? `stopped by ${signal}`
222
+ : `exited with code ${code}`;
223
+ if (this.stopping || e.removed) {
224
+ this.say(e, `daemon ${how}`);
225
+ this.entries.delete(key);
226
+ if (this.stopping && this.entries.size === 0 && this.drained)
227
+ this.drained();
228
+ return;
229
+ }
230
+ const delay = e.backoff.exited(this.deps.now());
231
+ this.say(e, `daemon ${how}; restarting in ${Math.round(delay / 1000)}s`);
232
+ this.later(key, e, delay);
233
+ }
234
+ later(key, e, ms) {
235
+ e.timer = this.deps.setTimer(() => this.launch(key, e), ms);
236
+ }
237
+ say(e, text) {
238
+ this.deps.log(`[${e.label}] ${text}`);
239
+ }
240
+ }
241
+ exports.Supervisor = Supervisor;
242
+ async function serveCommand(argv, deps) {
243
+ const args = argv.filter((a) => a !== '--yes' && a !== '-y');
244
+ const [verb, ...rest] = args;
245
+ switch (verb) {
246
+ case undefined:
247
+ return supervise(deps);
248
+ case 'add':
249
+ return add(rest, deps);
250
+ case 'remove':
251
+ case 'rm':
252
+ return remove(rest, deps);
253
+ case 'list':
254
+ case 'ls':
255
+ return list(deps);
256
+ case 'install':
257
+ return install(deps);
258
+ case 'uninstall':
259
+ return uninstall(deps);
260
+ default:
261
+ deps.err(`looply serve: ${JSON.stringify(verb)} — no idea what that means.\n\n${exports.SERVE_USAGE}`);
262
+ return exports.EXIT_USAGE;
263
+ }
264
+ }
265
+ function load(deps) {
266
+ try {
267
+ return (0, serve_1.readRegistry)(deps.fs, (0, serve_1.servedFilePath)(deps.home));
268
+ }
269
+ catch (e) {
270
+ deps.err(`looply serve: ${e.message}`);
271
+ return null;
272
+ }
273
+ }
274
+ function add(rest, deps) {
275
+ if (rest.length > 1) {
276
+ deps.err(`looply serve add: one path at a time.\n\n${exports.SERVE_USAGE}`);
277
+ return exports.EXIT_USAGE;
278
+ }
279
+ const path = (0, serve_1.normaliseRepoPath)(rest[0] ?? '.', deps.cwd, deps.platform);
280
+ if (!deps.fs.isDir(path)) {
281
+ deps.err(`looply serve add: ${path} is not a folder`);
282
+ return exports.EXIT_REFUSED;
283
+ }
284
+ const cfg = (0, serve_1.configPathOf)(path, deps.platform);
285
+ if (!deps.fs.exists(cfg)) {
286
+ deps.err(`looply serve add: ${path} has no .looply/config.yaml. Run \`looply init\` in that folder first, then add it again.`);
287
+ return exports.EXIT_REFUSED;
288
+ }
289
+ const registry = load(deps);
290
+ if (registry === null)
291
+ return exports.EXIT_REFUSED;
292
+ const out = (0, serve_1.addRepo)(registry, path, deps.now().toISOString(), deps.platform);
293
+ if (!out.added) {
294
+ deps.out(`serve: ${path} is already served — nothing to do.`);
295
+ return exports.EXIT_OK;
296
+ }
297
+ (0, serve_1.writeRegistry)(deps.fs, (0, serve_1.servedFilePath)(deps.home), out.registry);
298
+ deps.out(`serve: added ${path}`);
299
+ deps.out(' a running `looply serve` picks it up within 30 seconds; otherwise start one with `looply serve`, ' +
300
+ 'or `looply serve install` to have it start at login.');
301
+ return exports.EXIT_OK;
302
+ }
303
+ function remove(rest, deps) {
304
+ if (rest.length !== 1) {
305
+ deps.err(`looply serve remove: which repository?\n\n${exports.SERVE_USAGE}`);
306
+ return exports.EXIT_USAGE;
307
+ }
308
+ const path = (0, serve_1.normaliseRepoPath)(rest[0], deps.cwd, deps.platform);
309
+ const registry = load(deps);
310
+ if (registry === null)
311
+ return exports.EXIT_REFUSED;
312
+ const out = (0, serve_1.removeRepo)(registry, path, deps.platform);
313
+ if (!out.removed) {
314
+ deps.out(`serve: ${path} is not served — nothing to do.`);
315
+ return exports.EXIT_OK;
316
+ }
317
+ (0, serve_1.writeRegistry)(deps.fs, (0, serve_1.servedFilePath)(deps.home), out.registry);
318
+ deps.out(`serve: removed ${path}; a running \`looply serve\` stops its daemon within 30 seconds.`);
319
+ return exports.EXIT_OK;
320
+ }
321
+ function list(deps) {
322
+ const registry = load(deps);
323
+ if (registry === null)
324
+ return exports.EXIT_REFUSED;
325
+ for (const r of registry.roots ?? [])
326
+ deps.out(`serve: watching ${r.path} for new repositories`);
327
+ if (registry.repos.length === 0) {
328
+ deps.out('serve: no repositories are served yet. `looply serve add` in a repository to add it.');
329
+ return exports.EXIT_OK;
330
+ }
331
+ deps.out(`serve: ${registry.repos.length} served ${registry.repos.length === 1 ? 'repository' : 'repositories'}`);
332
+ for (const r of registry.repos) {
333
+ const ok = deps.fs.exists((0, serve_1.configPathOf)(r.path, deps.platform));
334
+ deps.out(` ${ok ? 'ok ' : 'MISSING'} ${r.path}${ok ? '' : ' (no .looply/config.yaml — skipped until it is back)'}`);
335
+ }
336
+ return exports.EXIT_OK;
337
+ }
338
+ function launchPaths(deps, verb) {
339
+ if (deps.launch.bin === null) {
340
+ deps.err(`looply serve${verb}: cannot find this CLI's built bin.js — build it first (npm run build)`);
341
+ return null;
342
+ }
343
+ return { node: deps.launch.node, bin: deps.launch.bin, log: (0, serve_1.serveLogPath)(deps.home) };
344
+ }
345
+ function install(deps) {
346
+ const paths = launchPaths(deps, ' install');
347
+ if (paths === null)
348
+ return exports.EXIT_REFUSED;
349
+ if (deps.platform !== 'win32') {
350
+ deps.out((0, serve_1.unixServiceHint)(paths, deps.platform));
351
+ return exports.EXIT_OK;
352
+ }
353
+ const folder = (0, serve_1.windowsStartupFolder)(deps.env);
354
+ if (folder === null) {
355
+ deps.err('looply serve install: %APPDATA% is not set, so the Startup folder cannot be found');
356
+ return exports.EXIT_REFUSED;
357
+ }
358
+ deps.fs.mkdirp((0, node_path_1.dirname)(paths.log));
359
+ deps.fs.mkdirp(folder);
360
+ const file = (0, node_path_1.join)(folder, serve_1.STARTUP_FILE);
361
+ deps.fs.write(file, (0, serve_1.windowsStartupScript)(paths));
362
+ deps.out(`serve: installed ${file}`);
363
+ deps.out(` the supervisor starts minimised at your next login, and writes to ${paths.log}`);
364
+ deps.out(' to start it now, run `looply serve`. `looply serve uninstall` removes the startup entry.');
365
+ return exports.EXIT_OK;
366
+ }
367
+ function uninstall(deps) {
368
+ if (deps.platform !== 'win32') {
369
+ deps.out('serve: nothing was installed on this platform; remove the launchd/systemd entry you created, if any.');
370
+ return exports.EXIT_OK;
371
+ }
372
+ const folder = (0, serve_1.windowsStartupFolder)(deps.env);
373
+ const file = folder === null ? null : (0, node_path_1.join)(folder, serve_1.STARTUP_FILE);
374
+ if (file === null || !deps.fs.exists(file)) {
375
+ deps.out('serve: not installed — nothing to remove.');
376
+ return exports.EXIT_OK;
377
+ }
378
+ deps.fs.remove(file);
379
+ deps.out(`serve: removed ${file}. A supervisor already running keeps running until you stop it.`);
380
+ return exports.EXIT_OK;
381
+ }
382
+ async function supervise(deps) {
383
+ const registry = load(deps);
384
+ if (registry === null)
385
+ return exports.EXIT_REFUSED;
386
+ // Recorded roots are something to do even with nothing listed yet: the
387
+ // rescan finds what appears there, and clone requests land there.
388
+ if (registry.repos.length === 0 && (registry.roots ?? []).length === 0) {
389
+ deps.out('serve: no repositories are served yet.');
390
+ deps.out(' `looply connect` sets up and serves every repository under your code folder;');
391
+ deps.out(' or, in each repository you want served: `looply serve add` (it needs `looply init` first).');
392
+ deps.out(' then run `looply serve` again, or `looply serve install` to start it at login.');
393
+ return exports.EXIT_OK;
394
+ }
395
+ const lock = (0, serve_1.takeServeLock)(deps.fs, (0, serve_1.serveLockPath)(deps.home), { pid: deps.pid, at: deps.now().toISOString() }, deps.probe);
396
+ if (lock.kind === 'held') {
397
+ deps.err(`looply serve: another supervisor is already running (pid ${lock.pid}). Nothing started.`);
398
+ return exports.EXIT_HELD;
399
+ }
400
+ if (lock.tookOverFrom !== undefined)
401
+ deps.out(`serve: took over a stale lock left by pid ${lock.tookOverFrom}`);
402
+ if (!deps.supervisor || !deps.onSignal) {
403
+ lock.release();
404
+ deps.err('looply serve: no process wiring to supervise with');
405
+ return exports.EXIT_REFUSED;
406
+ }
407
+ const sup = new Supervisor({
408
+ ...deps.supervisor(),
409
+ platform: deps.platform,
410
+ repos: () => (0, serve_1.readRegistry)(deps.fs, (0, serve_1.servedFilePath)(deps.home)).repos,
411
+ configExists: (repo) => deps.fs.exists((0, serve_1.configPathOf)(repo, deps.platform)),
412
+ log: (line) => deps.out(line),
413
+ });
414
+ deps.out(`serve: supervising ${registry.repos.length} listed ${registry.repos.length === 1 ? 'repository' : 'repositories'} (pid ${deps.pid}). Ctrl-C stops them all.`);
415
+ try {
416
+ await new Promise((resolve) => {
417
+ let asked = 0;
418
+ const off = deps.onSignal(() => {
419
+ asked += 1;
420
+ deps.out(asked === 1 ? 'serve: stopping every daemon — Ctrl-C again to kill them now' : 'serve: killing what is left');
421
+ sup.stop().then(() => {
422
+ off();
423
+ resolve();
424
+ });
425
+ });
426
+ sup.start();
427
+ });
428
+ }
429
+ finally {
430
+ lock.release();
431
+ }
432
+ deps.out('serve: stopped');
433
+ return exports.EXIT_OK;
434
+ }
435
+ /**
436
+ * This CLI's own entry file, for spawning children and writing startup files.
437
+ *
438
+ * `serve-cmd.js` is built next to `bin.js`, so that is where it is looked for
439
+ * first — true both in this repository's dist and in an installed package,
440
+ * where npm's shim and `npx` both end at the same file. `require.main` is the
441
+ * fallback for a bundling that moved things.
442
+ */
443
+ /* istanbul ignore next — real fs and process; the logic lives above */
444
+ function selfBin(fileExists) {
445
+ const candidates = [(0, node_path_1.join)(__dirname, 'bin.js'), require.main?.filename ?? ''];
446
+ for (const c of candidates) {
447
+ if (c.endsWith('.js') && fileExists(c)) {
448
+ try {
449
+ return (0, node_fs_1.realpathSync)(c);
450
+ }
451
+ catch {
452
+ return c;
453
+ }
454
+ }
455
+ }
456
+ return null;
457
+ }
458
+ /* istanbul ignore next — process wiring, exercised by running the binary */
459
+ function nodeServeDeps() {
460
+ const node = process.execPath;
461
+ const bin = selfBin((p) => serve_1.nodeServeFs.exists(p));
462
+ return {
463
+ home: (0, node_os_1.homedir)(),
464
+ cwd: process.cwd(),
465
+ platform: process.platform,
466
+ env: process.env,
467
+ fs: serve_1.nodeServeFs,
468
+ pid: process.pid,
469
+ probe: run_lease_1.nodeProbe,
470
+ launch: { node, bin },
471
+ now: () => new Date(),
472
+ out: (line) => process.stdout.write(`${line}\n`),
473
+ err: (line) => process.stderr.write(`${line}\n`),
474
+ supervisor: () => {
475
+ // A supervisor whose terminal or log pipe went away keeps supervising;
476
+ // an unhandled EPIPE on its own stdout must not take every daemon down.
477
+ for (const s of [process.stdout, process.stderr])
478
+ s.on('error', () => undefined);
479
+ return {
480
+ tasks: (0, serve_tasks_1.nodeSupervisorTasks)((0, node_os_1.homedir)(), process.platform, (line) => process.stdout.write(`${line}\n`)),
481
+ now: () => Date.now(),
482
+ setTimer: (fn, ms) => setTimeout(fn, ms),
483
+ clearTimer: (h) => clearTimeout(h),
484
+ spawnDaemon: (repo, on) => {
485
+ if (bin === null) {
486
+ on.exit(null, null, new Error("this CLI's bin.js was not found"));
487
+ return { kill: () => undefined };
488
+ }
489
+ // `--no-color` because the output goes to a log; `--yes` because adding
490
+ // the repository was the consent (see the header).
491
+ const child = (0, node_child_process_1.spawn)(node, [bin, 'daemon', '--yes', '--no-color'], {
492
+ cwd: repo,
493
+ stdio: ['ignore', 'pipe', 'pipe'],
494
+ windowsHide: true,
495
+ });
496
+ for (const stream of [child.stdout, child.stderr]) {
497
+ const split = new serve_1.LineSplitter();
498
+ stream.setEncoding('utf8');
499
+ stream.on('data', (chunk) => split.push(chunk).forEach((l) => on.line(l)));
500
+ stream.on('end', () => split.flush().forEach((l) => on.line(l)));
501
+ }
502
+ child.on('error', (e) => on.exit(null, null, e));
503
+ child.on('close', (code, signal) => on.exit(code, signal));
504
+ return {
505
+ kill: (force) => {
506
+ try {
507
+ child.kill(force ? 'SIGKILL' : 'SIGTERM');
508
+ }
509
+ catch {
510
+ // Already gone; its `close` says so.
511
+ }
512
+ },
513
+ };
514
+ },
515
+ };
516
+ },
517
+ onSignal: (cb) => {
518
+ const signals = [
519
+ 'SIGINT',
520
+ 'SIGTERM',
521
+ ...(process.platform === 'win32' ? ['SIGBREAK'] : []),
522
+ ];
523
+ for (const s of signals)
524
+ process.on(s, cb);
525
+ return () => {
526
+ for (const s of signals)
527
+ process.off(s, cb);
528
+ };
529
+ },
530
+ };
531
+ }
532
+ //# sourceMappingURL=serve-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-cmd.js","sourceRoot":"","sources":["../src/serve-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type Platform } from './serve';
2
+ import type { SupervisorTask } from './serve-cmd';
3
+ /**
4
+ * The supervisor's two periodic jobs, wired to the real machine.
5
+ *
6
+ * rescan every five minutes, the recorded code roots are walked and
7
+ * any new repository is set up and served (`connect.ts`);
8
+ * clone requests every minute, the server is asked what this machine
9
+ * should clone (`repo-requests.ts`).
10
+ *
11
+ * The decisions live in those two files; this one only hands them a
12
+ * filesystem, git and the server.
13
+ */
14
+ /** A clone that has not finished in this long is killed and reported as failed. */
15
+ export declare const CLONE_TIMEOUT_MS: number;
16
+ export declare function nodeSupervisorTasks(home: string, platform: Platform, log: (line: string) => void): SupervisorTask[];
17
+ //# sourceMappingURL=serve-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-tasks.d.ts","sourceRoot":"","sources":["../src/serve-tasks.ts"],"names":[],"mappings":"AASA,OAAO,EAA0D,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD;;;;;;;;;;GAUG;AAEH,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,QAAc,CAAC;AAG5C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,cAAc,EAAE,CA4CnH"}