@serverless-dev/s
Version:
Serverless devs tool, serverless developer tool, supports Alibaba cloud, AWS, azure, baidu cloud, Huawei cloud, Google cloud and Tencent cloud.
65 lines (53 loc) • 1.36 kB
text/typescript
const express = require('express');
const { execSync } = require('child_process');
import logger from './logger';
interface Callback {
(app: any): void
}
interface StartServiceData {
port?: number,
openBrowser?: boolean,
callback: Callback
}
export default class StartService {
private app: any;
private server: any;
private port = 3000;
private counter = 0;
constructor(protected readonly context: StartServiceData) {
this.app = express();
}
private randomNum(): number {
return 3000 + Math.round(Math.random() * 2000);
}
start() {
const { callback, port = 3000 } = this.context;
this.port = port;
callback(this.app);
this.listen();
}
private async listen() {
this.counter += 1;
this.server = this.app.listen(this.port, () => {
const uri = `http://localhost:${this.port}`;
logger.log(uri);
if (this.context.openBrowser) {
const startInstruction = process.platform === 'win32' ? 'start' : 'open';
execSync(`${startInstruction} ${uri}`);
}
});
this.server.on('error', (e: any) => {
if (e.code === 'EADDRINUSE') {
if (this.counter < 5) {
this.port = this.randomNum();
this.listen();
} else {
logger.error(e);
}
}
});
}
async stop() {
this.server.close();
}
}