let assert = require('assert')
let BuildCache = require('build_cache')
let commander = require('commander')
+let cookie = require('cookie')
+let crypto = require('crypto')
let fs = require('fs')
let http = require('http')
let https = require('https')
let yauzl = require('yauzl')
let util = require('util')
let url = require('url')
+let XDate = require('xdate')
let zetjs = require('zetjs')
+//let _setTimeout = util.promisify(setTimeout)
let fs_readFile = util.promisify(fs.readFile)
let fs_stat = util.promisify(fs.stat)
+let fs_writeFile = util.promisify(fs.writeFile)
let yauzl_open = util.promisify(yauzl.open)
+try {
+ fs.mkdirSync('analytics')
+}
+catch (err) {
+ if (err.code !== 'EEXIST') // should check error type
+ 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_dirty = false;
+let sessions_write = async () => {
+ try {
+ sessions_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 build_cache_js = new BuildCache()
let req_js = async path => {
let result = await build_cache_js.get(path)
// html files will be direct recipient of links/bookmarks so can't have
// a long lifetime, other files like css or images are often large files
// and won't change frequently (but we'll need cache busting eventually)
- if (commander.enableCaching && mime_type !== mime_types['html'])
+ if (
+ commander.enableCaching &&
+ (!mime_types.hasOwnProperty('html') || mime_type !== mime_types['html'])
+ )
res.setHeader('Cache-Control', 'max-age=3600')
res.setHeader('Content-Type', mime_type)
res.setHeader('Content-Length', data.length)
return
}
+ let cookies = cookie.parse(req.headers.cookie || ''), session
+ if (
+ !cookies.hasOwnProperty('session') ||
+ !sessions.hasOwnProperty(site) ||
+ !sessions[site].hasOwnProperty(session = cookies.session)
+ )
+ session = crypto.randomBytes(16).toString('hex')
+ let expires = new XDate()
+ expires.addMonths(1)
+ expires = expires.toUTCString()
+ res.setHeader(
+ 'Set-Cookie',
+ 'session=' + session + '; expires=' + expires + '; path=/;'
+ )
+ if (!sessions.hasOwnProperty(site))
+ sessions[site] = {}
+ if (!sessions[site].hasOwnProperty(session))
+ sessions[site][session] = {}
+ sessions[site][session].expires = expires
+ if (!sessions_dirty) {
+ sessions_dirty = true
+ setTimeout(sessions_write, 5000)
+ }
+
temp = file_name.lastIndexOf('.')
let file_type = temp === -1 ? '' : file_name.substring(temp + 1)
- let mime_type = mime_types[file_type] || mime_type_default
+ let mime_type =
+ mime_types.hasOwnProperty(file_type) ?
+ mime_types[file_type] :
+ mime_type_default
let page = dir_name + '/' + file_name, data
if (dir_name_is_pub) {
return
}
catch (err) {
- if (err.code !== 'ENOENT') // note: err.code might be undefined
+ if (err.code !== 'ENOENT') // should check error type
throw err
}
break
let tryApp = (req, res, protocol) => {
app(req, res, protocol).catch(
err => {
- console.log(err.stack || err.message)
+ console.error(err.stack || err.message)
let body =
'<html><body><pre>' +
(err.stack || err.message) +