gcb-host 0.1.0 → 0.3.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 (43) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/lib/broker.d.ts +9 -2
  3. package/lib/broker.d.ts.map +1 -1
  4. package/lib/broker.js +29 -5
  5. package/lib/broker.js.map +1 -1
  6. package/lib/commands/compose.d.ts.map +1 -1
  7. package/lib/commands/compose.js +42 -15
  8. package/lib/commands/compose.js.map +1 -1
  9. package/lib/commands/doctor.d.ts +17 -0
  10. package/lib/commands/doctor.d.ts.map +1 -0
  11. package/lib/commands/doctor.js +238 -0
  12. package/lib/commands/doctor.js.map +1 -0
  13. package/lib/commands/host.d.ts +33 -0
  14. package/lib/commands/host.d.ts.map +1 -0
  15. package/lib/commands/{host-opener.js → host.js} +111 -37
  16. package/lib/commands/host.js.map +1 -0
  17. package/lib/config.d.ts +5 -1
  18. package/lib/config.d.ts.map +1 -1
  19. package/lib/config.js +14 -8
  20. package/lib/config.js.map +1 -1
  21. package/lib/daemon.d.ts +0 -9
  22. package/lib/daemon.d.ts.map +1 -1
  23. package/lib/daemon.js +57 -7
  24. package/lib/daemon.js.map +1 -1
  25. package/lib/device-flow.d.ts +1 -0
  26. package/lib/device-flow.d.ts.map +1 -1
  27. package/lib/device-flow.js +1 -0
  28. package/lib/device-flow.js.map +1 -1
  29. package/lib/index.d.ts +1 -1
  30. package/lib/index.d.ts.map +1 -1
  31. package/lib/index.js +5 -4
  32. package/lib/index.js.map +1 -1
  33. package/lib/providers/github-app.d.ts.map +1 -1
  34. package/lib/providers/github-app.js +148 -126
  35. package/lib/providers/github-app.js.map +1 -1
  36. package/lib/reload.d.ts +45 -0
  37. package/lib/reload.d.ts.map +1 -0
  38. package/lib/reload.js +149 -0
  39. package/lib/reload.js.map +1 -0
  40. package/package.json +2 -2
  41. package/lib/commands/host-opener.d.ts +0 -33
  42. package/lib/commands/host-opener.d.ts.map +0 -1
  43. package/lib/commands/host-opener.js.map +0 -1
package/lib/reload.js ADDED
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Watch the configuration file for a change, with a poll as the safety net.
3
+ *
4
+ * `fs.watch` is the low-latency trigger. Events can be missed (network filesystems and bind mounts
5
+ * have been observed dropping them), so a 5-second digest poll runs alongside it; a digest that has
6
+ * not changed costs one read and no reload.
7
+ */
8
+ import { createHash } from 'node:crypto';
9
+ import fs from 'node:fs';
10
+ import path from 'node:path';
11
+ /**
12
+ * Read the file and hash it.
13
+ *
14
+ * @param file - the configuration path.
15
+ * @returns the digest, or undefined when the file is momentarily absent (an atomic rename).
16
+ */
17
+ export function fingerprintConfig(file) {
18
+ let text;
19
+ try {
20
+ text = fs.readFileSync(file, 'utf8');
21
+ }
22
+ catch (error) {
23
+ if (error.code === 'ENOENT')
24
+ return undefined;
25
+ throw error;
26
+ }
27
+ return { digest: createHash('sha256').update(text).digest('hex') };
28
+ }
29
+ /** Poll and watch one configuration file. */
30
+ export class ConfigWatcher {
31
+ #file;
32
+ #intervalMs;
33
+ #debounceMs;
34
+ #reload;
35
+ #onError;
36
+ #last;
37
+ /** A SIGHUP arrived while the file was absent; honour it when the file returns. */
38
+ #forcePending = false;
39
+ /** The (digest, reason) already reported, so a deterministic failure is not logged every tick. */
40
+ #failedReport;
41
+ /** The read error already reported, so a permanently unreadable file is not logged every tick. */
42
+ #readError;
43
+ #timer;
44
+ #watch;
45
+ #debounce;
46
+ #stopped = false;
47
+ constructor(options) {
48
+ this.#file = options.file;
49
+ this.#intervalMs = options.intervalMs ?? 5_000;
50
+ this.#debounceMs = options.debounceMs ?? 300;
51
+ this.#reload = options.reload;
52
+ this.#onError = options.onError ?? (() => { });
53
+ try {
54
+ this.#last = options.initialDigest ?? fingerprintConfig(this.#file)?.digest;
55
+ }
56
+ catch {
57
+ // An unreadable file at start-up is reported by the first check, not thrown from the constructor.
58
+ this.#last = options.initialDigest;
59
+ }
60
+ }
61
+ /**
62
+ * Start watching. A failure to establish the fast path is not fatal: polling still runs.
63
+ *
64
+ * @returns this watcher, for chaining.
65
+ */
66
+ start() {
67
+ this.#startPolling();
68
+ try {
69
+ this.#watch = fs.watch(path.dirname(this.#file), { persistent: false }, (_event, name) => {
70
+ if (name !== null && name !== path.basename(this.#file))
71
+ return;
72
+ if (this.#debounce !== undefined)
73
+ clearTimeout(this.#debounce);
74
+ this.#debounce = setTimeout(() => this.check(false), this.#debounceMs);
75
+ this.#debounce.unref();
76
+ });
77
+ this.#watch.on('error', () => {
78
+ this.#watch?.close();
79
+ this.#watch = undefined;
80
+ });
81
+ }
82
+ catch {
83
+ // The safety poll is already running; an unavailable watch must not stop the daemon.
84
+ }
85
+ return this;
86
+ }
87
+ /** Start the safety poll once; the watch is the primary, low-latency trigger. */
88
+ #startPolling() {
89
+ if (this.#stopped || this.#timer !== undefined)
90
+ return;
91
+ this.#timer = setInterval(() => this.check(false), this.#intervalMs);
92
+ this.#timer.unref();
93
+ }
94
+ /**
95
+ * Compare the file with the last accepted digest and reload when it changed.
96
+ *
97
+ * @param force - reload even when the digest is unchanged (SIGHUP).
98
+ */
99
+ check(force) {
100
+ if (this.#stopped)
101
+ return;
102
+ if (force)
103
+ this.#forcePending = true;
104
+ let next;
105
+ try {
106
+ next = fingerprintConfig(this.#file);
107
+ }
108
+ catch (error) {
109
+ const message = error.message;
110
+ if (message !== this.#readError) {
111
+ this.#readError = message;
112
+ this.#onError(error);
113
+ }
114
+ return;
115
+ }
116
+ this.#readError = undefined;
117
+ if (next === undefined)
118
+ return;
119
+ if (!this.#forcePending && next.digest === this.#last)
120
+ return;
121
+ try {
122
+ this.#last = this.#reload();
123
+ this.#failedReport = undefined;
124
+ this.#forcePending = false;
125
+ }
126
+ catch (error) {
127
+ // Keep the last good snapshot. Clearing the digest retries the same bytes on the next tick, for
128
+ // a transient cause; report only once per distinct bad content so a typo does not flood the
129
+ // audit log and the container log every five seconds.
130
+ this.#last = undefined;
131
+ this.#forcePending = false;
132
+ const report = `${next.digest}\0${error.message}`;
133
+ if (report !== this.#failedReport) {
134
+ this.#failedReport = report;
135
+ this.#onError(error);
136
+ }
137
+ }
138
+ }
139
+ /** Stop both triggers. */
140
+ stop() {
141
+ this.#stopped = true;
142
+ if (this.#timer !== undefined)
143
+ clearInterval(this.#timer);
144
+ if (this.#debounce !== undefined)
145
+ clearTimeout(this.#debounce);
146
+ this.#watch?.close();
147
+ }
148
+ }
149
+ //# sourceMappingURL=reload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.js","sourceRoot":"","sources":["../src/reload.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gcb-host",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Host-side gcb broker, configuration, providers and administration commands.",
5
5
  "license": "MIT",
6
6
  "author": "JounQin <admin@1stg.me>",
@@ -27,7 +27,7 @@
27
27
  }
28
28
  },
29
29
  "dependencies": {
30
- "gcb-core": "0.1.0",
30
+ "gcb-core": "0.3.0",
31
31
  "node-fetch-native": "^1.6.7",
32
32
  "x-fetch": "^0.3.0",
33
33
  "yaml": "^2.9.1"
@@ -1,33 +0,0 @@
1
- /** Usage text for `host-opener`. */
2
- export declare const HOST_OPENER_USAGE = "Usage: gcb host-opener [options]\n\nRun on the host, once, beside the trees the container also sees. It finds the checkouts under the\nroots it is given \u2014 ones created later included \u2014 and fulfils their requests to create a pull request, issue\nor fork with the gh account each request names, so the result is authored by a person rather than by\nthe app's bot. It does nothing else: it cannot push, merge or close anything.\n\n --root <dir> A tree to serve, repeatable (default: $HOME)\n --depth <n> How far below a root to look for checkouts (default: 4)\n --repo <path> Serve this one checkout instead of discovering any\n --config <path> Broker config whose allowlist fork requests are checked against\n (default: $GIT_BROKER_CONFIG, else ./broker.config.yml)\n --command <path> The program that creates a pull request, issue or fork\n (default: $GIT_BROKER_PR_COMMAND, else gh)\n --arg <token> An extra argument for that program, before the subcommand (repeatable)\n --interval <seconds> How often to look for requests (default: 5)\n --once Fulfil what is waiting, then exit\n -h, --help Show this help\n\nThe container asks for this by passing --as-user to `pr`. Requests are files under\n<git dir>/gcb/pr-requests, which is shared with the container and untracked by git\n\u2014 so the paths on the two sides never have to match: each writes and reads its own view of the same\ndirectory, and only the roots this process scans are host-side paths.\n";
3
- /**
4
- * Read a pull request's number and URL out of a program's output.
5
- *
6
- * `gh pr create` prints the URL, and so does anything that behaves like it. Nothing else is trusted:
7
- * without a URL in the output the opener reports a failure rather than guessing.
8
- *
9
- * @param output - the program's standard output.
10
- * @returns the number and URL, or `undefined`.
11
- */
12
- export declare function pullRequestUrl(output: string): {
13
- number: number;
14
- url: string;
15
- } | undefined;
16
- /**
17
- * Pull the issue number and URL out of the program's output.
18
- *
19
- * @param output - the program's standard output.
20
- * @returns the number and URL, or `undefined`.
21
- */
22
- export declare function issueUrl(output: string): {
23
- number: number;
24
- url: string;
25
- } | undefined;
26
- /**
27
- * Run the `host-opener` command.
28
- *
29
- * @param argv - arguments after the command name.
30
- * @returns the process exit code.
31
- */
32
- export declare function runHostOpener(argv: readonly string[]): Promise<number>;
33
- //# sourceMappingURL=host-opener.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"host-opener.d.ts","sourceRoot":"","sources":["../../src/commands/host-opener.ts"],"names":[],"mappings":"AA6CA,oCAAoC;AACpC,eAAO,MAAM,iBAAiB,+jDAuB7B,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAK1F;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAKpF;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8F5E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"host-opener.js","sourceRoot":"","sources":["../../src/commands/host-opener.ts"],"names":[],"mappings":"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"}