From e9246d17f71890c5e5d9c8048a61ff9419821b27 Mon Sep 17 00:00:00 2001 From: Kid <44045911+kidonng@users.noreply.github.com> Date: Tue, 22 Feb 2022 02:50:46 +0800 Subject: [PATCH 1/4] Update Deno std used by dev server --- src/runtime/dev-server.ts | 54 ++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/runtime/dev-server.ts b/src/runtime/dev-server.ts index 146a577..c10c56a 100644 --- a/src/runtime/dev-server.ts +++ b/src/runtime/dev-server.ts @@ -1,7 +1,8 @@ -import { Response, serve } from 'https://deno.land/std@0.106.0/http/server.ts'; +import { serve } from 'https://deno.land/std@0.126.0/http/server.ts'; +import { writeAllSync } from 'https://deno.land/std@0.126.0/streams/conversion.ts'; -function isNetAddr(v: any): v is Deno.NetAddr { - return v && typeof v.port === 'number'; +function random(min: number, max: number): number { + return Math.round(Math.random() * (max - min)) + min; } // Load the entrypoint handler function @@ -15,34 +16,35 @@ if (typeof handler !== 'function') { } // Spawn HTTP server on ephemeral port -const s = serve({ hostname: '127.0.0.1', port: 0 }); - -if (isNetAddr(s.listener.addr)) { - const { port } = s.listener.addr; - const portBytes = new TextEncoder().encode(String(port)); +let port: number; +while (true) { + port = random(10000, 65535); + try { - // Write the port number to FD 3 - const portFd = Deno.openSync('/dev/fd/3', { read: false, write: true }); - Deno.writeAllSync(portFd, portBytes); - Deno.close(portFd.rid); + serve(handler, { hostname: '127.0.0.1', port }); + break } catch (err) { - // This fallback is necessary for Windows - // See: https://github.com/denoland/deno/issues/6305 - const portFile = Deno.env.get('VERCEL_DEV_PORT_FILE'); - if (portFile) { - await Deno.writeFile(portFile, portBytes); + if (!(err instanceof Deno.errors.AddrInUse)) { + throw err; } - } finally { - Deno.env.delete('VERCEL_DEV_PORT_FILE'); } } -// Serve HTTP requests to handler function -for await (const req of s) { - Promise.resolve(handler(req)).then((res: Response | void) => { - if (res) { - return req.respond(res); - } - }); +const portBytes = new TextEncoder().encode(String(port)); + +try { + // Write the port number to FD 3 + const portFd = Deno.openSync('/dev/fd/3', { read: false, write: true }); + writeAllSync(portFd, portBytes); + Deno.close(portFd.rid); +} catch (err) { + // This fallback is necessary for Windows + // See: https://github.com/denoland/deno/issues/6305 + const portFile = Deno.env.get('VERCEL_DEV_PORT_FILE'); + if (portFile) { + await Deno.writeFile(portFile, portBytes); + } +} finally { + Deno.env.delete('VERCEL_DEV_PORT_FILE'); } From 908ae6fc4787275ea02a4f47ca1b5e4c5dd75711 Mon Sep 17 00:00:00 2001 From: Kid <44045911+kidonng@users.noreply.github.com> Date: Mon, 7 Mar 2022 06:11:01 +0800 Subject: [PATCH 2/4] Not right --- src/runtime/dev-server.ts | 53 +++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/runtime/dev-server.ts b/src/runtime/dev-server.ts index c10c56a..a852d54 100644 --- a/src/runtime/dev-server.ts +++ b/src/runtime/dev-server.ts @@ -1,8 +1,7 @@ -import { serve } from 'https://deno.land/std@0.126.0/http/server.ts'; import { writeAllSync } from 'https://deno.land/std@0.126.0/streams/conversion.ts'; -function random(min: number, max: number): number { - return Math.round(Math.random() * (max - min)) + min; +function isNetAddr(v: any): v is Deno.NetAddr { + return v && typeof v.port === 'number'; } // Load the entrypoint handler function @@ -16,35 +15,35 @@ if (typeof handler !== 'function') { } // Spawn HTTP server on ephemeral port -let port: number; +const conn = await Deno.listen({ port: 0 }); +const s = Deno.serveHttp(await conn.accept()); + +if (isNetAddr(conn.addr)) { + const { port } = conn.addr; + const portBytes = new TextEncoder().encode(String(port)); -while (true) { - port = random(10000, 65535); - try { - serve(handler, { hostname: '127.0.0.1', port }); - break + // Write the port number to FD 3 + const portFd = Deno.openSync('/dev/fd/3', { read: false, write: true }); + writeAllSync(portFd, portBytes); + Deno.close(portFd.rid); } catch (err) { - if (!(err instanceof Deno.errors.AddrInUse)) { - throw err; + // This fallback is necessary for Windows + // See: https://github.com/denoland/deno/issues/6305 + const portFile = Deno.env.get('VERCEL_DEV_PORT_FILE'); + if (portFile) { + await Deno.writeFile(portFile, portBytes); } + } finally { + Deno.env.delete('VERCEL_DEV_PORT_FILE'); } } -const portBytes = new TextEncoder().encode(String(port)); - -try { - // Write the port number to FD 3 - const portFd = Deno.openSync('/dev/fd/3', { read: false, write: true }); - writeAllSync(portFd, portBytes); - Deno.close(portFd.rid); -} catch (err) { - // This fallback is necessary for Windows - // See: https://github.com/denoland/deno/issues/6305 - const portFile = Deno.env.get('VERCEL_DEV_PORT_FILE'); - if (portFile) { - await Deno.writeFile(portFile, portBytes); - } -} finally { - Deno.env.delete('VERCEL_DEV_PORT_FILE'); +// Serve HTTP requests to handler function +for await (const req of s) { + Promise.resolve(handler(req)).then((res: Response | void) => { + if (res) { + return req.respondWith(res); + } + }); } From cccbf5ee7a6e7727cbc0bca1d10d4fd8a283985f Mon Sep 17 00:00:00 2001 From: Kid <44045911+kidonng@users.noreply.github.com> Date: Mon, 7 Mar 2022 06:21:01 +0800 Subject: [PATCH 3/4] Forward port first --- src/runtime/dev-server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/dev-server.ts b/src/runtime/dev-server.ts index a852d54..62b8a3c 100644 --- a/src/runtime/dev-server.ts +++ b/src/runtime/dev-server.ts @@ -16,7 +16,6 @@ if (typeof handler !== 'function') { // Spawn HTTP server on ephemeral port const conn = await Deno.listen({ port: 0 }); -const s = Deno.serveHttp(await conn.accept()); if (isNetAddr(conn.addr)) { const { port } = conn.addr; @@ -39,6 +38,7 @@ if (isNetAddr(conn.addr)) { } } +const s = Deno.serveHttp(await conn.accept()); // Serve HTTP requests to handler function for await (const req of s) { Promise.resolve(handler(req)).then((res: Response | void) => { From 6dac87f69a08b560e48d8fa023044bafaa41f5d9 Mon Sep 17 00:00:00 2001 From: Kid <44045911+kidonng@users.noreply.github.com> Date: Sat, 19 Mar 2022 20:49:39 +0800 Subject: [PATCH 4/4] Bump std --- src/runtime/dev-server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/dev-server.ts b/src/runtime/dev-server.ts index 62b8a3c..5a20121 100644 --- a/src/runtime/dev-server.ts +++ b/src/runtime/dev-server.ts @@ -1,4 +1,4 @@ -import { writeAllSync } from 'https://deno.land/std@0.126.0/streams/conversion.ts'; +import { writeAllSync } from 'https://deno.land/std@0.130.0/streams/conversion.ts'; function isNetAddr(v: any): v is Deno.NetAddr { return v && typeof v.port === 'number';