Modularize req() and cache system to req_XXX() that can also be used internally
authorNick Downing <downing.nick@gmail.com>
Sun, 7 Oct 2018 09:50:48 +0000 (20:50 +1100)
committerNick Downing <downing.nick@gmail.com>
Sun, 7 Oct 2018 09:50:48 +0000 (20:50 +1100)
ndserver.js

index da129a0..ca21d4a 100755 (executable)
@@ -16,6 +16,94 @@ let zetjs = require('zetjs')
 let readFileAsync = util.promisify(fs.readFile)
 let statAsync = util.promisify(fs.stat)
 
+let build_cache_js = new BuildCache()
+let req_js = async path => {
+  let result = await build_cache_js.get(path)
+  if (result === undefined) {
+    console.log('compiling', path)
+    result = await jstemplate(path)
+    build_cache_js.set(path, result)
+  }
+  return result
+}
+
+let build_cache_json = new BuildCache()
+let req_json = async path => {
+  let result = await build_cache_json.get(path)
+  if (result === undefined) {
+    console.log('parsing', path)
+    result = JSON.parse(await readFileAsync(path))
+    build_cache_json.set(path, result)
+  }
+  return result
+}
+
+let build_cache_less = new BuildCache()
+let req_less = async (path, site_root, dir_name) => {
+  let result = await build_cache_less.get(path)
+  if (result === undefined) {
+    console.log('compiling', path)
+    let render = await less.render(
+      await readFileAsync(path, {encoding: 'utf-8'}),
+      {
+        //color: true,
+        //compress: false,
+        //depends: false,
+        filename: path,
+        //globalVars: null,
+        //ieCompat: false,
+        //insecure: false,
+        //javascriptEnabled: false,
+        //lint: false,
+        //math: 0,
+        //modifyVars: null,
+        paths: [site_root + dir_name],
+        //plugins: [],
+        //reUsePluginManager: true,
+        //rewriteUrls: false,
+        rootpath: site_root//,
+        //strictImports: false,
+        //strictUnits: false,
+        //urlArgs: ''
+      }
+    )
+    result = new Buffer(render.css, 'utf-8')
+    build_cache_less.set(path, result, render.imports)
+  }
+  return result
+}
+
+let build_cache_text = new BuildCache()
+let req_text = async path => {
+  let result = await build_cache_text.get(path)
+  if (result === undefined) {
+    console.log('reading', path)
+    result = await readFileAsync(path, {encoding: 'utf-8'})
+    build_cache_text.set(path, result)
+  }
+  return result
+}
+
+let build_cache_zet = new BuildCache()
+let req_zet = async path => {
+  let result = await build_cache_zet.get(path)
+  if (result === undefined) {
+    console.log('opening', path)
+    result = new zetjs.Index(path)
+    build_cache_zet.set(
+      path,
+      result,
+      [
+        path + '.map.0',
+        path + '.param.0',
+        path + '.v.0',
+        path + '.vocab.0'
+      ]
+    )
+  }
+  return result
+}
+
 commander.version('1.0.0').option(
   '-c, --enable-caching',
   'Enable caching'
@@ -42,11 +130,6 @@ let mime_types = JSON.parse(fs.readFileSync('config/mime_types.json'))
 let mime_type_default = 'application/octet-stream'
 let mime_type_css = mime_types['css'] || mime_type_default
 let mime_type_html = mime_types['html'] || mime_type_default
-let build_cache_js = new BuildCache()
-let build_cache_json = new BuildCache()
-let build_cache_less = new BuildCache()
-let build_cache_text = new BuildCache()
-let build_cache_zet = new BuildCache()
 
 let serve = (res, status, mime_type, data) => {
   res.statusCode = status
@@ -156,14 +239,14 @@ let app = async (req, res, protocol) => {
   let page = dir_name + '/' + file_name, data
   if (dir_name_is_pub) {
     try {
-      data = await readFileAsync(site_root + page)
+      let data = await readFileAsync(site_root + page)
       console.log(
         site,
         'serving',
         page,
         'length',
         data.length,
-        'from filesystem'
+        'from pub'
       )
       serve(res, 200, mime_type, data)
       return
@@ -176,14 +259,14 @@ let app = async (req, res, protocol) => {
   else {
     temp = page + '.pub'
     try {
-      data = await readFileAsync(site_root + temp)
+      let data = await readFileAsync(site_root + temp)
       console.log(
         site,
         'serving',
         temp,
         'length',
         data.length,
-        'from filesystem'
+        'from pub'
       )
       serve(res, 200, mime_type, data)
       return
@@ -207,54 +290,26 @@ let app = async (req, res, protocol) => {
         }
         let out = str => {buffers.push(Buffer.from(str))}
         let req = async (str, type) => {
-          let key = (
+          let path = (
             str.length > 0 && str.charAt(0) === '/' ?
             site_root :
             site_root + dir_name + '/'
           ) + str, result
           switch (type) {
           case undefined:
+            result = await (await req_js(path))(env, out, req)
+            break
           case 'js':
-            let render_func = await build_cache_js.get(key)
-            if (render_func === undefined) {
-              console.log(site, 'compiling', key)
-              render_func = await jstemplate(key)
-              build_cache_js.set(key, render_func)
-            }
-            result = await render_func(env, out, req)
+            result = await req_js(path)
             break
           case 'json':
-            result = await build_cache_json.get(key)
-            if (result === undefined) {
-              console.log(site, 'parsing', key)
-              result = JSON.parse(await readFileAsync(key))
-              build_cache_json.set(key, result)
-            }
+            result = await req_json(path)
             break
           case 'text':
-            result = await build_cache_text.get(key)
-            if (result === undefined) {
-              console.log(site, 'reading', key)
-              result = await readFileAsync(key, {encoding: 'utf-8'})
-              build_cache_text.set(key, result)
-            }
+            result = await req_text(path)
             break
           case 'zet':
-            result = await build_cache_zet.get(key)
-            if (result === undefined) {
-              console.log(site, 'opening', key)
-              result = new zetjs.Index(key)
-              build_cache_zet.set(
-                key,
-                result,
-                [
-                  key + '.map.0',
-                  key + '.param.0',
-                  key + '.v.0',
-                  key + '.vocab.0'
-                ]
-              )
-            }
+            result = await req_zet(path)
             break
           default:
             assert(false) 
@@ -262,14 +317,14 @@ let app = async (req, res, protocol) => {
           return result
         }
         await req(temp)
-        data = Buffer.concat(buffers)
+        let data = Buffer.concat(buffers)
         console.log(
           site,
           'serving',
           temp,
           'length',
           data.length,
-          'from js render'
+          'from js'
         )
         serve(res, 200, mime_type, data)
         return
@@ -283,44 +338,14 @@ let app = async (req, res, protocol) => {
     case 'css':
       temp = page + '.less'
       try {
-        let key = site_root + temp
-        let data = await build_cache_less.get(key)
-        if (data === undefined) {
-          console.log(site, 'compiling', key)
-          let result = await less.render(
-            await readFileAsync(site_root + temp, {encoding: 'utf-8'}),
-            {
-              //color: true,
-              //compress: false,
-              //depends: false,
-              filename: temp,
-              //globalVars: null,
-              //ieCompat: false,
-              //insecure: false,
-              //javascriptEnabled: false,
-              //lint: false,
-              //math: 0,
-              //modifyVars: null,
-              paths: [site_root + dir_name],
-              //plugins: [],
-              //reUsePluginManager: true,
-              //rewriteUrls: false,
-              rootpath: site_root//,
-              //strictImports: false,
-              //strictUnits: false,
-              //urlArgs: ''
-            }
-          )
-          data = new Buffer(result.css, 'utf-8')
-          build_cache_less.set(key, data, result.imports)
-        }
+        let data = await req_less(site_root + temp, site_root, dir_name)
         console.log(
           site,
           'serving',
           temp,
           'length',
           data.length,
-          'from less render'
+          'from less'
         )
         serve(res, 200, mime_type, data)
         return