A fork of https://github.com/ueokande/vim-vixen
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.4 KiB
64 lines
1.4 KiB
import * as http from 'http'; |
|
import * as net from 'net' |
|
import express from 'express'; |
|
|
|
type HandlerFunc = (req: express.Request, res: express.Response) => void; |
|
|
|
export default class TestServer { |
|
private http?: http.Server; |
|
|
|
private app: express.Application; |
|
|
|
constructor( |
|
private port = 0, |
|
private address = '127.0.0.1', |
|
){ |
|
this.app = express(); |
|
} |
|
|
|
handle(path: string, f: HandlerFunc): TestServer { |
|
this.app.get(path, f); |
|
return this; |
|
} |
|
|
|
receiveContent(path: string, content: string): TestServer { |
|
this.app.get(path, (_req: express.Request, res: express.Response) => { |
|
res.status(200).send(content) |
|
}); |
|
return this; |
|
} |
|
|
|
url(path: string = '/'): string { |
|
if (!this.http) { |
|
throw new Error('http server not started'); |
|
} |
|
|
|
let addr = this.http.address() as net.AddressInfo; |
|
return `http://${addr.address}:${addr.port}${path}` |
|
} |
|
|
|
start(): Promise<void> { |
|
if (this.http) { |
|
throw new Error('http server already started'); |
|
} |
|
|
|
this.http = http.createServer(this.app) |
|
return new Promise((resolve) => { |
|
this.http!!.listen(this.port, this.address, () => { |
|
resolve(); |
|
}) |
|
}); |
|
} |
|
|
|
stop(): Promise<void> { |
|
if (!this.http) { |
|
return Promise.resolve(); |
|
} |
|
return new Promise((resolve) => { |
|
this.http!!.close(() => { |
|
this.http = undefined; |
|
resolve(); |
|
}); |
|
}) |
|
} |
|
}
|
|
|