1 | const path = require('path')
|
2 | const http = require('http')
|
3 | const { document } = require('@rola/util')
|
4 |
|
5 | const cwd = process.cwd()
|
6 |
|
7 | function req (file) {
|
8 | let mod = null
|
9 |
|
10 | try {
|
11 | mod = require(file)
|
12 | mod = mod.default || mod
|
13 | } catch (e) {}
|
14 |
|
15 | return mod
|
16 | }
|
17 |
|
18 | module.exports = function createServer ({ file, port }) {
|
19 | let active = false
|
20 |
|
21 | const serverProps = require(path.join(cwd, '.rola', 'props.js'))
|
22 |
|
23 | return {
|
24 | server: null,
|
25 | app: null,
|
26 | get active () {
|
27 | return active
|
28 | },
|
29 | update () {
|
30 | try {
|
31 | delete require.cache[file]
|
32 | } catch (e) {}
|
33 | this.app = req(file)
|
34 | this.socket && this.socket.emit('update')
|
35 | },
|
36 | init () {
|
37 | this.app = req(file)
|
38 |
|
39 | this.server = http.createServer(
|
40 | require('connect')()
|
41 | .use(require('compression')())
|
42 | .use(require('serve-static')(path.join(cwd, 'build/assets')))
|
43 | .use((req, res, next) => {
|
44 | if (!this.app) return next()
|
45 |
|
46 | res.serverProps = serverProps
|
47 |
|
48 | this.app(req, res, next)
|
49 | })
|
50 | .use((req, res) => {
|
51 | const { name, version } = serverProps.context
|
52 |
|
53 | res.writeHead(404, { 'Content-Type': 'text/html' })
|
54 |
|
55 | res.write(document({
|
56 | head: [ `<link rel='stylesheet' href='https://unpkg.com/svbstrate@4.1.0/dist/svbstrate.css' />` ],
|
57 | view: `<div class='f aic jcc x h4' style='height: 100vh'>404 | ${name}@${version}</div>`,
|
58 | context: {
|
59 | state: {
|
60 | meta: {
|
61 | title: '404 | rola'
|
62 | }
|
63 | }
|
64 | }
|
65 | }))
|
66 |
|
67 | res.end()
|
68 | })
|
69 | )
|
70 |
|
71 | this.socket = require('pocket.io')(this.server, {
|
72 | serveClient: false
|
73 | })
|
74 |
|
75 | this.server.listen(port, e => {
|
76 | if (e) return console.log(e)
|
77 | active = true
|
78 | })
|
79 | },
|
80 | close () {
|
81 | this.server && this.server.close()
|
82 | }
|
83 | }
|
84 | }
|