forked from hqjs/hq
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.mjs
51 lines (43 loc) · 1.4 KB
/
server.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import { getServer, getSrc } from './utils.mjs';
import Koa from 'koa';
import Table from './res/table.mjs';
import WebSocket from 'ws';
import fs from 'fs-extra';
import hq from './hq.mjs';
import info from './package.json';
import path from 'path';
const HQ_ROOT = path.dirname(import.meta.url.slice('file://'.length));
const { version } = info;
console.log(`(c) hqjs @ ${version}`);
export default async (ROOT, PORT) => {
const src = await getSrc(ROOT);
const babelRCPath = path.join(ROOT, '.babelrc');
const useBabelRC = await fs.pathExists(babelRCPath);
const app = new Koa;
const server = await getServer({ app, host: '0.0.0.0', port: PORT });
const { port } = server.address();
const wss = new WebSocket.Server({ server });
let doReload = true;
const reload = () => {
if (doReload) {
if (app.debug) console.log('Reloaded');
doReload = false;
process.nextTick(() => {
for (const client of wss.clients) {
if (client.readyState === WebSocket.OPEN) client.send('reload');
}
doReload = true;
});
}
};
app.hqroot = HQ_ROOT;
app.port = port;
app.root = ROOT;
app.src = src;
app.babelrc = useBabelRC ? babelRCPath : undefined;
app.debug = process.env.NODE_ENV === 'debug';
app.table = new Table(reload).watch([src, './node_modules']);
app.startTime = Date.now();
app.use(hq());
return { server, app, wss, version };
};