Add socket.io support, create installable package
authorNick Downing <downing.nick@gmail.com>
Sun, 21 Oct 2018 03:26:06 +0000 (14:26 +1100)
committerNick Downing <downing.nick@gmail.com>
Sun, 21 Oct 2018 04:19:14 +0000 (15:19 +1100)
.gitignore
Server.js
Site.js
index.js [new file with mode: 0644]
jst_server.js
package.json

index 5add944..77978dd 100644 (file)
@@ -1,2 +1,3 @@
+/jst_server-*.tgz
 /node_modules
 /yarn.lock
index e306d03..7750dc2 100644 (file)
--- a/Server.js
+++ b/Server.js
@@ -9,10 +9,11 @@ let util = require('util')
 
 let fs_readFile = util.promisify(fs.readFile)
 
-let Server = function(caching) {
+let Server = function(socket_io, caching) {
   if (!this instanceof Server)
     throw Error('Server is a constructor')
 
+  this.socket_io = socket_io
   this.caching = caching || false
   this.site_cache = {}
 
@@ -30,6 +31,16 @@ let Server = function(caching) {
   this.mime_type_default = 'application/octet-stream'
 }
 
+Server.prototype.attach = function(server, protocol) {
+  server.on(
+    'request',
+    (request, response) =>
+      this.respond(request, response, protocol) // ignore returned promise
+  )
+  if (this.socket_io !== undefined)
+    this.socket_io.attach(server)
+}
+
 Server.prototype.refresh_config = async function() {
   this.sites = await this.build_cache_json.get(
     'config/sites.json',
@@ -111,15 +122,24 @@ Server.prototype.respond = async function(request, response, protocol) {
           throw err
         site_factory = site_factory_default
       }
-      let site
+      let site = undefined
       if (
         !Object.prototype.hasOwnProperty.call(this.site_cache, temp.root) ||
         (site = this.site_cache[temp.root]).factory !== site_factory
       ) {
+        if (site !== undefined)
+          for (let i of site.object.socket_io_connect_listeners) {
+            assert(this.socket_io !== undefined)
+            this.socket_io.removeListener('connect', i)
+          }
         site = {
           factory: site_factory,
           object: await site_factory(this, temp.root)
         }
+        for (let i of site.object.socket_io_connect_listeners) {
+          assert(this.socket_io !== undefined)
+          this.socket_io.on('connect', i)
+        }
         this.site_cache[temp.root] = site
       }
       await site.object.respond(
diff --git a/Site.js b/Site.js
index 9970e73..12f182d 100644 (file)
--- a/Site.js
+++ b/Site.js
@@ -22,6 +22,7 @@ let Site = function(server, root) {
     throw Error('Site is a constructor')
   this.server = server
   this.root = root
+  this.socket_io_connect_listeners = []
 }
 
 Site.prototype.get_email = function(path) {
diff --git a/index.js b/index.js
new file mode 100644 (file)
index 0000000..8842391
--- /dev/null
+++ b/index.js
@@ -0,0 +1,2 @@
+exports.Server = require('./Server')
+exports.Site = require('./Site')
index c9c79e1..24f74b6 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/env node
 
 let Server = require('./Server')
+let SocketIO = require('socket.io')
 let commander = require('commander')
 let fs = require('fs')
 let http = require('http')
@@ -27,12 +28,10 @@ commander.version('1.0.0').option(
   8443
 ).parse(process.argv)
 
-let server = new Server(commander.enableCaching)
+let server = new Server(new SocketIO(), commander.enableCaching)
 if (commander.httpPort !== -1) {
-  let http_server = http.createServer(
-    (request, response) =>
-      server.respond(request, response, 'http:') // ignore returned promise
-  )
+  let http_server = http.createServer()
+  server.attach(http_server, 'http:')
   http_server.listen(commander.httpPort)
   console.log('HTTP server listening on port', commander.httpPort)
 }
@@ -41,10 +40,9 @@ if (commander.httpsPort !== -1) {
     {
       'cert': fs.readFileSync(commander.sslCert),
       'key': fs.readFileSync(commander.sslKey)
-    },
-    (request, response) =>
-      server.respond(request, response, 'https:') // ignore returned promise
+    }
   )
+  server.attach(https_server, 'https:')
   https_server.listen(commander.httpsPort)
   console.log('HTTPS server listening on port', commander.httpsPort)
 }
index f444a71..c6be85d 100644 (file)
@@ -2,11 +2,11 @@
   "name": "jst_server",
   "version": "1.0.0",
   "description": "Web server using JavaScript template system",
-  "main": "jst_server.js",
+  "main": "index.js",
   "directories": {},
   "dependencies": {
-    "BuildCache": "../build_cache.git/BuildCache-v1.0.0.tgz",
-    "JSONCache": "../json_cache.git/JSONCache-v1.0.0.tgz",
+    "BuildCache": "/home/nick/src/build_cache.git/BuildCache-v1.0.0.tgz",
+    "JSONCache": "/home/nick/src/json_cache.git/JSONCache-v1.0.0.tgz",
     "babel-cli": "^6.26.0",
     "commander": "^2.18.0",
     "cookie": "^0.3.1",
     "fs": "^0.0.1-security",
     "http": "^0.0.0",
     "https": "^1.0.0",
-    "js_template": "../js_template.git/acorn/js_template-v6.0.2.tgz",
+    "js_template": "/home/nick/src/js_template.git/acorn/js_template-v6.0.2.tgz",
     "less": "^3.8.1",
     "querystring": "^0.2.0",
+    "socket.io": "^2.1.1",
     "stream-buffers": "^3.0.2",
     "url": "^0.11.0",
     "xdate": "^0.8.2",
     "yauzl": "^2.10.0",
-    "zetjs": "../zettair.git/src/zetjs/zetjs-v1.0.0.tgz"
+    "zetjs": "/home/nick/src/zettair.git/src/zetjs/zetjs-v1.0.0.tgz"
   },
   "devDependencies": {},
   "scripts": {},
   "author": "Nick Downing",
-  "license": "GPL-3.0"
+  "license": "GPL-3.0",
+  "bin": {
+    "jst_server": "jst_server.js"
+  }
 }