@@ -3,19 +3,16 @@ import type { Application } from 'express'
33import type { Server } from 'http'
44import portscanner from 'portscanner'
55import cors from 'cors'
6+ import { logger } from './logger'
67
78import ( 'dotenvrc' )
89
910export class MockServer {
1011 private _server : Server | undefined = undefined
1112
12- private port = Number ( process . env . MOCK_PINNING_SERVER_PORT ?? 3000 )
13+ private port : string = '3001'
1314 private _service : Application | undefined = undefined
1415
15- /**
16- * This set helps us support parallel tests by not attempting to start up multiple MockServer's on the same port
17- */
18-
1916 public basePath : string = ''
2017
2118 constructor ( private readonly config : Parameters < typeof import ( 'mock-ipfs-pinning-service' ) [ 'setup' ] > [ 0 ] = { token : process . env . MOCK_PINNING_SERVER_SECRET } ) {
@@ -27,7 +24,7 @@ export class MockServer {
2724 try {
2825 server = await this . server ( port )
2926 } catch ( err ) {
30- MockServer . error ( 'start error' , err )
27+ logger . error ( 'start error' , err )
3128 }
3229
3330 if ( server == null ) {
@@ -53,26 +50,39 @@ export class MockServer {
5350 await this . cleanup ( )
5451 }
5552
56- private setBasePath ( ) : void {
57- this . basePath = `http://127.0.0.1:${ this . port } `
53+ private async server ( port = this . port ) : Promise < Server > {
54+ if ( this . _server !== undefined ) {
55+ return this . _server
56+ }
57+ if ( port != null && port !== this . port ) {
58+ this . port = port
59+ this . setBasePath ( )
60+ } else {
61+ port = await this . getAvailablePort ( )
62+ }
63+ const service = await this . service ( )
64+
65+ service . on ( 'error' , ( err ) => {
66+ logger . error ( 'service error' , err )
67+ } )
68+ this . _server = service . listen ( port , ( ) => {
69+ logger . debug ( `${ Date . now ( ) } : MockServer running on port ${ port } ` )
70+ } )
71+
72+ return this . _server
5873 }
5974
6075 /**
6176 * Ensure the port set for this instance is not already in use by another MockServer
6277 */
63- private async getAvailablePort ( ) : Promise < number > {
64- // this.port = 3000
65-
66- // this.setBasePath()
67-
68- // return this.port
78+ private async getAvailablePort ( ) : Promise < string > {
6979 return await new Promise ( ( resolve , reject ) => portscanner . findAPortNotInUse ( 3000 , 3099 , '127.0.0.1' , ( error , port ) => {
7080 if ( error != null ) {
7181 return reject ( error )
7282 }
73- this . port = port
83+ this . port = port . toString ( )
7484 this . setBasePath ( )
75- resolve ( port )
85+ resolve ( this . port )
7686 } ) )
7787 }
7888
@@ -81,38 +91,22 @@ export class MockServer {
8191 return this . _service
8292 }
8393 this . _service = await setup ( this . config )
84- // this._service = await setup({
85- // token: process.env.MOCK_PINNING_SERVER_SECRET,
86- // loglevel: 'debug'
87- // })
94+
8895 this . _service . use ( cors ( ) )
8996
90- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
91- return this . _service as Application
97+ return this . _service
9298 }
9399
94- private async server ( port = this . port ) : Promise < Server > {
95- if ( this . _server !== undefined ) {
96- return this . _server
97- }
98- if ( port !== this . port ) {
99- this . port = port
100+ private setBasePath ( ) : void {
101+ if ( this . port == null ) {
102+ throw new Error ( 'Attempted to set basePath before setting this.port.' )
100103 }
101- const service = await this . service ( )
102-
103- service . on ( 'error' , ( err ) => {
104- MockServer . error ( 'service error' , err )
105- } )
106- this . _server = service . listen ( await this . getAvailablePort ( ) , ( ) => {
107- MockServer . debug ( `${ Date . now ( ) } : MockServer running on port ${ this . port } ` )
108- } )
109-
110- return this . _server
104+ this . basePath = `http://127.0.0.1:${ this . port } `
111105 }
112106
113107 private cleanupSync ( ) : void {
114108 void this . cleanup ( ) . then ( ( ) => {
115- MockServer . debug ( 'cleaned up' )
109+ logger . debug ( 'cleaned up' )
116110 } )
117111 }
118112
@@ -123,43 +117,24 @@ export class MockServer {
123117 server . close ( ( err ) => {
124118 if ( ( err == null ) || ( err as Error & { code : string } ) ?. code === 'ERR_SERVER_NOT_RUNNING' ) {
125119 // MockServer.portsInUse.remove(this.port)
126- MockServer . debug ( `${ Date . now ( ) } : MockServer stopped listening on port ${ port } ` )
120+ logger . debug ( `${ Date . now ( ) } : MockServer stopped listening on port ${ port } ` )
127121 delete this . _server
128122 } else if ( err != null ) {
129- MockServer . error ( err . name )
130- MockServer . error ( err . message )
131- MockServer . error ( err . stack )
123+ throw err
132124 }
133125 } )
134126 }
135127
136128 private static onEADDRINUSE ( err : Error & { code : string } ) {
137129 if ( err . code === 'EADDRINUSE' ) {
138- this . error ( 'Unexpected conflict with port usage' )
130+ logger . error ( 'Unexpected conflict with port usage' )
139131 } else {
140- this . error ( 'CAUGHT UNKNOWN ERROR' )
141- this . error ( err . name )
142- this . error ( err . code )
143- this . error ( err . message )
144- this . error ( err . stack )
145- }
146- process . exit ( 233 )
147- }
148-
149- private static debug ( ...logObjects : unknown [ ] ) {
150- if ( process . env . DEBUG != null && Number ( process . env . DEBUG ) !== 0 ) {
151- MockServer . log ( 'debug' , ...logObjects )
132+ logger . error ( 'CAUGHT UNKNOWN ERROR' )
133+ logger . error ( err . name )
134+ logger . error ( err . code )
135+ logger . error ( err . message )
136+ logger . error ( err . stack )
152137 }
153- }
154-
155- private static error ( ...logObjects : unknown [ ] ) {
156- if ( process . env . DEBUG != null ) {
157- MockServer . log ( 'error' , ...logObjects )
158- }
159- }
160-
161- private static log ( type : keyof typeof console & 'log' | 'debug' | 'error' | 'warn' | 'info' | 'trace' , ...logObjects : unknown [ ] ) {
162- // eslint-disable-next-line no-console
163- console [ type ] ( ...logObjects )
138+ process . exit ( 1 )
164139 }
165140}
0 commit comments