@sword-code-practice/sword-plugin-server
Version:
sword框架内置在运行server上的插件
62 lines (59 loc) • 1.44 kB
JavaScript
import { createServer } from 'http';
import net from 'net';
import { log } from '@sword-code-practice/sword-plugin-log';
const defaultServerConfig = {
port: 3e3
};
const startServer = async (app, serverConfig = defaultServerConfig) => {
let key;
for (key in serverConfig) {
if (!serverConfig[key]) {
serverConfig[key] = defaultServerConfig[key];
}
}
const start = () => {
log.info(`HTTP\u670D\u52A1\u542F\u52A8\u4E2D...`);
const server = createServer(app);
try {
server.listen(serverConfig.port);
log.success(`\u7A0B\u5E8F\u8FD0\u884C\u5728${serverConfig.port}\u7AEF\u53E3\u4E0A`);
} catch (error) {
log.err(JSON.stringify(error));
}
};
const tryUsePort = async () => {
const used = await portUsed(serverConfig.port);
if (used === false) {
serverConfig.port && serverConfig.port++;
return await tryUsePort();
} else {
return true;
}
};
if (await tryUsePort()) {
start();
}
};
const portUsed = (port) => {
return new Promise((resolve) => {
const server = net.createServer().listen(port);
server.on("listening", () => {
server.close();
resolve(port);
});
server.on("error", (err) => {
if (err.code == "EADDRINUSE") {
resolve(false);
}
});
});
};
const useServer = () => {
return {
name: "server",
server: {
start: startServer
}
};
};
export { useServer };