UNPKG

1.97 kBJavaScriptView Raw
1const path = require('path')
2const http = require('http')
3const { document } = require('@rola/util')
4
5const cwd = process.cwd()
6
7function 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
18module.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}