fix: error "undefined setting key" at start

Massimo Melina committed Jun 29, 2024 at 19:07 UTC 31c2a6acd1e5a01de94cf2010327f568929c6c68
3 files changed +7 -6
package.json
+1 -1
@@ -71,7 +71,7 @@
71 "dependencies": {
72 "@koa/router": "^12.0.1",
73 "@node-rs/crc32": "^1.6.0",
74 - "@rejetto/kvstorage": "^0.11.1",
74 + "@rejetto/kvstorage": "^0.12.1",
75 "acme-client": "^5.3.1",
76 "buffer-crc32": "^0.2.13",
77 "fast-glob": "^3.2.7",
src/index.ts
+1 -3
@@ -26,7 +26,6 @@ import { geoFilter } from './geo'
26 import { rootsMiddleware } from './roots'
27 import events from './events'
28 import { trackIpsMw } from './ips'
29 -import { storedMap } from './persistence'
29
30 ok(_.intersection(Object.keys(frontEndApis), Object.keys(adminApis)).length === 0) // they share same endpoints, don't clash
31
@@ -51,8 +50,7 @@ app.use(sessionMiddleware)
50 .use(mount(API_URI, apiMiddleware({ ...frontEndApis, ...adminApis })))
51 .use(serveGuiAndSharedFiles)
52 .on('error', errorHandler)
54 -storedMap.once('open', () =>
55 - events.emit('app', app))
53 +events.emit('app', app)
54
55 function errorHandler(err:Error & { code:string, path:string }) {
56 const { code } = err
src/listen.ts
+5 -2
@@ -28,6 +28,7 @@ import { X509Certificate } from 'crypto'
28 import events from './events'
29 import { isIPv6 } from 'net'
30 import { defaultBaseUrl } from './nat'
31 +import { storedMap } from './persistence'
32
33 interface ServerExtra { name: string, error?: string, busy?: Promise<string> }
34 let httpSrv: undefined | http.Server & ServerExtra
@@ -49,8 +50,10 @@ export function getHttpsWorkingPort() {
50 const commonServerOptions: http.ServerOptions = { requestTimeout: 0 }
51 const commonServerAssign = { headersTimeout: 30_000, timeout: MINUTE } // 'headersTimeout' is not recognized by type lib, and 'timeout' is not effective when passed in parameters
52
53 +const readyToListen = Promise.all([ storedMap.isOpening(), events.once('app') ])
54 +
55 const considerHttp = debounceAsync(async () => {
53 - await waitFor(() => app)
56 + await readyToListen
57 void stopServer(httpSrv)
58 httpSrv = Object.assign(http.createServer(commonServerOptions, app.callback()), { name: 'http' }, commonServerAssign)
59 const port = await startServer(httpSrv, { port: portCfg.get(), host: listenInterface.get() })
@@ -92,12 +95,12 @@ export function getCertObject() {
95 }
96
97 const considerHttps = debounceAsync(async () => {
98 + await readyToListen
99 void stopServer(httpsSrv)
100 defaultBaseUrl.proto = 'http'
101 defaultBaseUrl.port = getCurrentPort(httpSrv) ?? 0
102 let port = httpsPortCfg.get()
103 try {
100 - await waitFor(() => app)
104 httpsSrv = Object.assign(
105 https.createServer(port === PORT_DISABLED ? {} : { ...commonServerOptions, key: httpsOptions.private_key, cert: httpsOptions.cert }, app.callback()),
106 { name: 'https' },