From a438dc293ccf3361bf9d7297d4508d4fa130ac17 Mon Sep 17 00:00:00 2001 From: Ben Allfree Date: Wed, 14 Jun 2023 12:00:18 +0000 Subject: [PATCH] chore: add preflight check to tryFetch --- gitbook/releases/0.7.1.md | 1 + .../daemon/src/services/PocketBaseService.ts | 6 ++- packages/daemon/src/util/tryFetch.ts | 41 +++++++++++-------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/gitbook/releases/0.7.1.md b/gitbook/releases/0.7.1.md index f8e0a3b0..4a75338e 100644 --- a/gitbook/releases/0.7.1.md +++ b/gitbook/releases/0.7.1.md @@ -34,3 +34,4 @@ This is a maintenance release. - Fix: Increased release page limit to 100 because some old PocketBase releases were getting dropped from the github API query - Chore: adjust logfile destination on live server - Chore: remove platform reference when launching instance +- Chore: add preflight check to tryFetch diff --git a/packages/daemon/src/services/PocketBaseService.ts b/packages/daemon/src/services/PocketBaseService.ts index 629b0116..515e6048 100644 --- a/packages/daemon/src/services/PocketBaseService.ts +++ b/packages/daemon/src/services/PocketBaseService.ts @@ -173,6 +173,9 @@ export const createPocketbaseService = async ( args.push(`--http`) args.push(mkInternalAddress(port)) } + + let isRunning = true + dbg(`Spawning ${slug}`, { bin, args, cli: [bin, ...args].join(' ') }) const ls = spawn(bin, args) cm.add(() => ls.kill()) @@ -192,6 +195,7 @@ export const createPocketbaseService = async ( const exited = new Promise((resolve) => { ls.on('exit', (code) => { dbg(`${slug} exited with code ${code}`) + isRunning = false if (code) onUnexpectedStop?.(code) resolve(code) }) @@ -203,7 +207,7 @@ export const createPocketbaseService = async ( const url = mkInternalUrl(port) if (command === 'serve') { - await tryFetch(url) + await tryFetch(url, async () => isRunning) } const api: PocketbaseProcess = { url, diff --git a/packages/daemon/src/util/tryFetch.ts b/packages/daemon/src/util/tryFetch.ts index 29c9bc44..4ebc0ded 100644 --- a/packages/daemon/src/util/tryFetch.ts +++ b/packages/daemon/src/util/tryFetch.ts @@ -1,20 +1,29 @@ import { logger, safeCatch } from '@pockethost/common' -export const tryFetch = safeCatch(`tryFetch`, (url: string) => { - const { dbg } = logger().create('tryFetch') - return new Promise((resolve, reject) => { - const tryFetch = () => { - dbg(`Trying to connect to instance ${url} `) - fetch(url) - .then(() => { - dbg(`Connection to ${url} successful`) +export const tryFetch = safeCatch( + `tryFetch`, + (url: string, preflight?: () => Promise) => { + const { dbg } = logger().create('tryFetch') + return new Promise((resolve, reject) => { + const tryFetch = async () => { + if (preflight) { + dbg(`Checking preflight`) + const shouldFetch = await preflight() + if (!shouldFetch) { + throw new Error(`tryFetch failed preflight, aborting`) + } + } + try { + dbg(`Trying to fetch ${url} `) + const res = await fetch(url) + dbg(`Fetch ${url} successful`) resolve() - }) - .catch((e) => { - dbg(`Could not connect to ${url}`) + } catch (e) { + dbg(`Could not fetch ${url}, trying again in 1s`) setTimeout(tryFetch, 1000) - }) - } - tryFetch() - }) -}) + } + } + tryFetch() + }) + } +)