Remove dedicated analytics.js and do it via resources.js and JSON cache, make analyti...
authorNick Downing <downing.nick@gmail.com>
Tue, 9 Oct 2018 01:40:08 +0000 (12:40 +1100)
committerNick Downing <downing.nick@gmail.com>
Tue, 9 Oct 2018 01:40:08 +0000 (12:40 +1100)
analytics.js [deleted file]
resources.js
site.js

diff --git a/analytics.js b/analytics.js
deleted file mode 100644 (file)
index 09bc95a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-let fs = require('fs')
-let JSONCache = require('json_cache')
-
-try {
-  fs.mkdirSync('analytics')
-}
-catch (err) {
-  if (err.code !== 'EEXIST') // should check error type
-    throw err
-}
-
-let json_cache = new JSONCache()
-json_cache.diag = true
-
-let sessions
-let pageviews
-let refresh = async () => {
-  sessions = await json_cache.get('analytics/sessions.json', {})
-  pageviews = await json_cache.get('analytics/pageviews.json', {})
-
-  // a bit awkward... changing the exports on the fly
-  exports.sessions = sessions
-  exports.pageviews = pageviews
-}
-let sessions_dirty = () => json_cache.set('analytics/sessions.json')
-let pageviews_dirty = () => json_cache.set('analytics/pageviews.json')
-
-exports.json_cache = json_cache
-exports.sessions = sessions
-exports.pageviews = pageviews
-exports.refresh = refresh
-exports.sessions_dirty = sessions_dirty
-exports.pageviews_dirty = pageviews_dirty
index 80c8b94..d716599 100644 (file)
@@ -1,5 +1,6 @@
 let BuildCache = require('build_cache')
 let fs = require('fs')
+let JSONCache = require('json_cache')
 let jstemplate = require('jstemplate')
 let less = require('less/lib/less-node')
 var stream_buffers = require('stream-buffers')
@@ -7,6 +8,7 @@ let util = require('util')
 let yauzl = require('yauzl')
 let zetjs = require('zetjs')
 
+let fs_mkdir = util.promisify(fs.mkdir)
 let fs_readFile = util.promisify(fs.readFile)
 let yauzl_open = util.promisify(yauzl.open)
 
@@ -19,6 +21,8 @@ let get_js = path => build_cache_js.get(
   }
 )
 
+// this is for read-only JSON files
+// they will be reloaded from disk if modified
 let build_cache_json = new BuildCache()
 let get_json = path => build_cache_json.get(
   path,
@@ -132,9 +136,25 @@ let get_zet = path => build_cache_zet.get(
   }
 )
 
+// this is for read/write JSON files
+// they will not be reloaded from disk if modified
+let try_mkdir = async path => {
+  try {
+    await fs_mkdir(path)
+  }
+  catch (err) {
+    if (err.code !== 'EEXIST') // should check error type
+      throw err
+  }
+}
+let json_cache = new JSONCache()
+json_cache.diag = true
+
 exports.get_js = get_js
 exports.get_json = get_json
 exports.get_less = get_less
 exports.get_text = get_text
 exports.get_zip = get_zip
 exports.get_zet = get_zet
+exports.try_mkdir = try_mkdir
+exports.json_cache = json_cache
diff --git a/site.js b/site.js
index f7b77d3..bffd6a0 100644 (file)
--- a/site.js
+++ b/site.js
@@ -1,4 +1,3 @@
-let analytics = require('./analytics')
 let assert = require('assert')
 let cookie = require('cookie')
 let crypto = require('crypto')
@@ -83,23 +82,24 @@ let app = async (site, site_root, req, res, protocol) => {
     config.mime_type_default
 
   if (file_type == 'html') {
-    await analytics.refresh()
+    let path_analytics = site_root + '/analytics'
+    let path_sessions = path_analytics + '/sessions.json'
+    let path_pageviews = path_analytics + '/pageviews.json'
+
+    await resources.try_mkdir(path_analytics)
+    let sessions = await resources.json_cache.get(path_sessions, {})
+    let pageviews = await resources.json_cache.get(path_pageviews, {})
 
-    if (!analytics.sessions.hasOwnProperty(site)) {
-      console.log('new site_sessions', site)
-      analytics.sessions[site] = {}
-    }
-    let site_sessions = analytics.sessions[site]
     let cookies = cookie.parse(req.headers.cookie || ''), session_key
     if (
       !cookies.hasOwnProperty('session_key') ||
-      !site_sessions.hasOwnProperty(session_key = cookies.session_key)
+      !sessions.hasOwnProperty(session_key = cookies.session_key)
     ) {
       session_key = crypto.randomBytes(16).toString('hex')
       console.log('new session', session_key)
-      site_sessions[session_key] = {}
+      sessions[session_key] = {pageviews: {}}
     }
-    let session = site_sessions[session_key]
+    let session = sessions[session_key]
   
     let expires = new XDate()
     expires.addMonths(1)
@@ -110,20 +110,15 @@ let app = async (site, site_root, req, res, protocol) => {
     )
     session.expires = expires
 
-    if (!analytics.pageviews.hasOwnProperty(site)) {
-      console.log('new site_pageviews', site)
-      analytics.pageviews[site] = {}
-    }
-    let site_pageviews = analytics.pageviews[site]
-    if (!site_pageviews.hasOwnProperty(page)) {
+    if (!pageviews.hasOwnProperty(page)) {
       console.log('new pageview', page)
-      site_pageviews[page] = {visits: 0, unique_visits: 0}
+      pageviews[page] = {}
     }
-    let pageview = site_pageviews[page]
+    let pageview = pageviews[page]
     ++pageview.visits;
 
-    if (!session.hasOwnProperty('pageviews'))
-      session.pageviews = {}
+    //if (!session.hasOwnProperty('pageviews'))
+    //  session.pageviews = {}
     let session_pageviews = session.pageviews
     if (!session_pageviews.hasOwnProperty(page)) {
       console.log('new session_pageview', page)
@@ -132,8 +127,8 @@ let app = async (site, site_root, req, res, protocol) => {
     }
     ++session_pageviews[page]
 
-    await analytics.sessions_dirty()
-    await analytics.pageviews_dirty()
+    await resources.json_cache.set(path_sessions)
+    await resources.json_cache.set(path_pageviews)
   }
 
   if (dir_name_is_pub) {