11import { assertEquals , assertMatch , parseMediaType } from './deps.ts'
22import type {
33 FetchFunction ,
4- Handler ,
54 HandlerOrListener ,
65 MakeFetchResponse ,
76} from './types.ts'
87
9- // credit - 'https://deno.land/x/free_port@v1.2.0/mod.ts'
10- function random ( min : number , max : number ) : number {
11- return Math . round ( Math . random ( ) * ( max - min ) ) + min
12- }
13-
14- // credit - 'https://deno.land/x/free_port@v1.2.0/mod.ts'
15- const getFreeListener = (
16- port : number ,
17- ) : { listener : Deno . Listener ; port : number } => {
18- try {
19- const listener = Deno . listen ( { port : port } )
20- return { listener, port }
21- } catch ( error ) {
22- if ( error instanceof Deno . errors . AddrInUse ) {
23- const newPort = random ( 1024 , 49151 )
24- return getFreeListener ( newPort )
25- }
26- }
27- throw new Error ( 'Unable to get free port' )
28- }
29-
308const fetchEndpoint = async (
319 port : number ,
3210 url : string | URL ,
@@ -44,52 +22,31 @@ const fetchEndpoint = async (
4422 return { res, data }
4523}
4624const makeFetchPromise = ( handlerOrListener : HandlerOrListener ) => {
47- if ( 'rid' in handlerOrListener && 'adr ' in handlerOrListener ) {
25+ if ( 'addr ' in handlerOrListener ) {
4826 // this might never get invoked because of Deno's blocking issue
4927
50- const port = ( handlerOrListener . addr as Deno . NetAddr ) . port
28+ const port = handlerOrListener . addr . port
5129 if ( ! port ) {
5230 throw new Error ( 'Port cannot be found' )
5331 }
54- const resp = async ( url : URL | string = '' , params ?: RequestInit ) => {
55- const p = new Promise < { res : Response ; data ?: unknown } > ( ( resolve ) => {
32+ const resp = ( url : URL | string = '' , params ?: RequestInit ) => {
33+ return new Promise < { res : Response ; data ?: unknown } > ( ( resolve ) => {
5634 setTimeout ( async ( ) => {
5735 const { res, data } = await fetchEndpoint ( port , url , params )
5836 resolve ( { res, data } )
59- Deno . close ( conn . rid + 1 )
60- handlerOrListener . close ( )
37+ return handlerOrListener . shutdown ( )
6138 } )
6239 } )
63- const conn = await handlerOrListener . accept ( )
64- return p
6540 }
6641 return { resp, port }
6742 } else {
68- const { listener, port } = getFreeListener ( random ( 1024 , 49151 ) )
69- const serve = async ( conn : Deno . Conn ) => {
70- const requests = Deno . serveHttp ( conn )
71- const { request, respondWith } = ( await requests . nextRequest ( ) ) !
72-
73- const response = await ( handlerOrListener as Handler ) ( request , conn )
74- if ( response ) {
75- respondWith ( response )
76- }
77- }
78-
43+ const server = Deno . serve ( { port : 0 } , handlerOrListener )
7944 const resp = async ( url : URL | string = '' , params ?: RequestInit ) => {
80- const connector = async ( ) => {
81- const conn = await listener . accept ( )
82- await serve ( conn )
83- return conn
84- }
85- const connection = connector ( )
86- const res = await fetchEndpoint ( port , url , params )
87- await connection
88- . then ( ( con ) => Deno . close ( con . rid + 1 ) )
89- . finally ( ( ) => listener . close ( ) )
45+ const res = await fetchEndpoint ( server . addr . port , url , params )
46+ await server . shutdown ( )
9047 return res
9148 }
92- return { resp, port }
49+ return { resp, port : server . addr . port }
9350 }
9451}
9552
0 commit comments