feat: watch config file for external edits

This commit is contained in:
Aarnav Tale
2024-03-30 02:53:51 -04:00
parent 02e5e3e92a
commit cc1427882f
4 changed files with 23 additions and 4 deletions
+17 -3
View File
@@ -1,6 +1,7 @@
import { access, constants, readFile, stat, writeFile } from 'node:fs/promises'
import { access, constants, readFile, writeFile } from 'node:fs/promises'
import { resolve } from 'node:path'
import { type FSWatcher, watch } from 'chokidar'
import { type Document, parseDocument } from 'yaml'
type Duration = `${string}s` | `${string}h` | `${string}m` | `${string}d` | `${string}y`
@@ -120,8 +121,8 @@ type Config = {
let config: Document
export async function getConfig() {
if (!config) {
export async function getConfig(force = false) {
if (!config || force) {
const path = resolve(process.env.CONFIG_FILE ?? '/etc/headscale/config.yaml')
const data = await readFile(path, 'utf8')
config = parseDocument(data)
@@ -140,6 +141,19 @@ export async function patchConfig(partial: Record<string, unknown>) {
await writeFile(path, config.toString(), 'utf8')
}
let watcher: FSWatcher
export function registerConfigWatcher() {
if (watcher) {
return
}
const path = resolve(process.env.CONFIG_FILE ?? '/etc/headscale/config.yaml')
watcher = watch(path).on('change', async () => {
await getConfig(true)
})
}
type Context = {
hasDockerSock: boolean;
hasConfig: boolean;