From 0fd7e9e1daa577a57aa1e335a30cd2d8f62f5c6d Mon Sep 17 00:00:00 2001 From: James McNamara Date: Wed, 21 Feb 2024 12:10:24 -0800 Subject: [PATCH] REALLY ready really means REALLY ready (#60652) * Added a ping before displaying banner * added comment about NODE_TLS * updated typing imports --- client/web/dev/esbuild/server.ts | 37 +++++++++++++++++++++++++++++++- sg.config.yaml | 5 ++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/client/web/dev/esbuild/server.ts b/client/web/dev/esbuild/server.ts index 644e23aace2..71153a2a716 100644 --- a/client/web/dev/esbuild/server.ts +++ b/client/web/dev/esbuild/server.ts @@ -66,7 +66,8 @@ export const esbuildDevelopmentServer = async ( const proxyServer = proxyApp.listen(listenAddress) // eslint-disable-next-line @typescript-eslint/return-await return await new Promise((_resolve, reject) => { - proxyServer.once('listening', () => { + proxyServer.once('listening', async () => { + await pingUntilReady({ url: HTTPS_WEB_SERVER_URL }) signale.success(`esbuild server is ready after ${Math.round(performance.now() - start)}ms`) printSuccessBanner(['✱ Sourcegraph is really ready now!', `Click here: ${HTTPS_WEB_SERVER_URL}/search`]) }) @@ -74,6 +75,40 @@ export const esbuildDevelopmentServer = async ( }) } +interface PingOptions { + url: string + backoffMillis?: number + factor?: number + maxBackoffMillis?: number +} + +function pingUntilReady({ + url, + backoffMillis = 500, + factor = 1.5, + maxBackoffMillis = 10000, +}: PingOptions): Promise { + const ping = (backoff: number) => (resolve: () => void) => { + fetch(url) + .then(response => { + if (response.ok) { + resolve() + } else { + throw new Error(`${url} produced ${response.status} ${response.statusText}`) + } + }) + .catch(console.error) + .then(sleep(backoff)) + .then(() => ping(Math.min(backoff * factor, maxBackoffMillis))(resolve)) + } + + return new Promise(ping(backoffMillis)) +} + +function sleep(ms: number): () => Promise { + return () => new Promise(resolve => setTimeout(resolve, ms)) +} + if (require.main === module) { async function main(args: string[]): Promise { if (args.length !== 0) { diff --git a/sg.config.yaml b/sg.config.yaml index 573e9b2bd05..b6e0330b363 100644 --- a/sg.config.yaml +++ b/sg.config.yaml @@ -408,6 +408,8 @@ commands: pnpm run generate env: ENABLE_OPEN_TELEMETRY: true + # Needed so that node can ping the caddy server + NODE_TLS_REJECT_UNAUTHORIZED: 0 web-standalone-http: description: Standalone web frontend (dev) with API proxy to a configurable URL @@ -598,8 +600,6 @@ commands: env: SYNTACTIC_CODE_INTEL_WORKER_ADDR: 127.0.0.1:6076 - - executor-template: &executor_template # TMPDIR is set here so it's not set in the `install` process, which would trip up `go build`. cmd: | @@ -1231,7 +1231,6 @@ commandsets: - syntactic-code-intel-worker-0 - syntactic-code-intel-worker-1 - codeintel: requiresDevPrivate: true checks: