let fs = require('fs')
-let util = require('util')
-
-let fs_writeFile = util.promisify(fs.writeFile)
+let JSONCache = require('json_cache')
try {
fs.mkdirSync('analytics')
throw err
}
-let sessions
-{
- let text
- try {
- text = fs.readFileSync('analytics/sessions.json', {encoding: 'utf-8'})
- }
- catch (err) {
- if (err.code !== 'ENOENT') // should check error type
- throw err
- text = '{}'
- }
- sessions = JSON.parse(text)
-}
-let sessions_is_dirty = false
-let sessions_dirty = () => {
- if (!sessions_is_dirty) {
- sessions_is_dirty = true
- setTimeout(sessions_write, 5000)
- }
-}
-let sessions_write = async () => {
- try {
- sessions_is_dirty = false;
- console.log('writing analytics/sessions.json')
- await fs_writeFile(
- 'analytics/sessions.json',
- JSON.stringify(sessions),
- {encoding: 'utf-8'}
- )
- }
- catch (err) {
- console.error(err.stack || err.message)
- }
-}
+let json_cache = new JSONCache()
+json_cache.diag = true
+let sessions
let pageviews
-{
- let text
- try {
- text = fs.readFileSync('analytics/pageviews.json', {encoding: 'utf-8'})
- }
- catch (err) {
- if (err.code !== 'ENOENT') // should check error type
- throw err
- text = '{}'
- }
- pageviews = JSON.parse(text)
-}
-let pageviews_is_dirty = false
-let pageviews_dirty = () => {
- if (!pageviews_is_dirty) {
- pageviews_is_dirty = true
- setTimeout(pageviews_write, 5000)
- }
-}
-let pageviews_write = async () => {
- try {
- pageviews_is_dirty = false;
- console.log('writing analytics/pageviews.json')
- await fs_writeFile(
- 'analytics/pageviews.json',
- JSON.stringify(pageviews),
- {encoding: 'utf-8'}
- )
- }
- catch (err) {
- console.error(err.stack || err.message)
- }
+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.sessions_dirty = sessions_dirty
-exports.sessions_write = sessions_write
exports.pageviews = pageviews
+exports.refresh = refresh
+exports.sessions_dirty = sessions_dirty
exports.pageviews_dirty = pageviews_dirty
-exports.pageviews_write = pageviews_write
"fs": "^0.0.1-security",
"http": "^0.0.0",
"https": "^1.0.0",
+ "json_cache": "file:../json_cache.git/json_cache-1.0.0.tgz",
"jstemplate": "file:../jstemplate.git/jstemplate-3.4.9.tgz",
"less": "^3.8.1",
"querystring": "^0.2.0",
let yauzl_open = util.promisify(yauzl.open)
let build_cache_js = new BuildCache()
-let get_js = async path => await build_cache_js.get(
+let get_js = path => build_cache_js.get(
path,
async result => {
console.log('compiling', path)
)
let build_cache_json = new BuildCache()
-let get_json = async path => await build_cache_json.get(
+let get_json = path => build_cache_json.get(
path,
async result => {
console.log('parsing', path)
)
let build_cache_less = new BuildCache()
-let get_less = async (path, site_root, dir_name) => await build_cache_less.get(
+let get_less = (path, site_root, dir_name) => build_cache_less.get(
path,
async result => {
console.log('compiling', path)
)
let build_cache_text = new BuildCache()
-let get_text = async path => await build_cache_text.get(
+let get_text = path => build_cache_text.get(
path,
async result => {
console.log('reading', path)
)
let build_cache_zip = new BuildCache()
-let get_zip = async path => await build_cache_zip.get(
+let get_zip = path => build_cache_zip.get(
path,
async result => {
console.log('decompressing', path)
)
let build_cache_zet = new BuildCache()
-let get_zet = async path => await build_cache_zet.get(
+let get_zet = path => build_cache_zet.get(
path,
async result => {
console.log('opening', path)
if (err.code !== 'ENOENT')
throw err
if (!dir_name_is_pub) {
- temp = dir_name + '.pub'
+ let temp = dir_name + '.pub'
try {
stats = await fs_stat(site_root + temp)
dir_name = temp
}
let page = path.slice(1).join('/')
- temp = file_name.lastIndexOf('.')
+ let temp = file_name.lastIndexOf('.')
let file_type = temp === -1 ? '' : file_name.substring(temp + 1)
let mime_type =
config.mime_types.hasOwnProperty(file_type) ?
config.mime_type_default
if (file_type == 'html') {
- if (!analytics.sessions.hasOwnProperty(site))
+ await analytics.refresh()
+
+ 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 (
!site_sessions.hasOwnProperty(session_key = cookies.session_key)
) {
session_key = crypto.randomBytes(16).toString('hex')
+ console.log('new session', session_key)
site_sessions[session_key] = {}
}
let session = site_sessions[session_key]
)
session.expires = expires
- if (!analytics.pageviews.hasOwnProperty(site))
+ 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 (!site_pageviews.hasOwnProperty(page)) {
+ console.log('new pageview', page)
site_pageviews[page] = {visits: 0, unique_visits: 0}
+ }
let pageview = site_pageviews[page]
++pageview.visits;
-
- if (!session.hasOwnProperty('analytics.pageviews'))
+ if (!session.hasOwnProperty('pageviews'))
session.pageviews = {}
let session_pageviews = session.pageviews
if (!session_pageviews.hasOwnProperty(page)) {
+ console.log('new session_pageview', page)
session_pageviews[page] = 0
++pageview.unique_visits
}
++session_pageviews[page]
- analytics.sessions_dirty()
- analytics.pageviews_dirty()
+ await analytics.sessions_dirty()
+ await analytics.pageviews_dirty()
}
/*let*/ page = dir_name + '/' + file_name; let data
) + str, result
switch (type) {
case undefined:
- result = await (await resources.get_js(path))(env, out, req)
+ result = /*await*/ (await resources.get_js(path))(env, out, req)
break
case 'js':
- result = await resources.get_js(path)
+ result = /*await*/ resources.get_js(path)
break
case 'json':
- result = await resources.get_json(path)
+ result = /*await*/ resources.get_json(path)
break
case 'text':
- result = await resources.get_text(path)
+ result = /*await*/ resources.get_text(path)
break
case 'zet':
- result = await resources.get_zet(path)
+ result = /*await*/ resources.get_zet(path)
break
default:
assert(false)