Update SSL certificate, adjust to latest jst_server
authorNick Downing <nick.downing@lifx.co>
Sun, 15 Mar 2020 09:42:59 +0000 (20:42 +1100)
committerNick Downing <nick.downing@lifx.co>
Sun, 15 Mar 2020 09:42:59 +0000 (20:42 +1100)
.gitignore
_config/server.jst
_config/site.jst
_ssl/ca_cert.pem
_ssl/ca_cert.srl
_ssl/localhost_cert.pem
_ssl/localhost_cert_bundle.pem
index.html.jst
package.json
page.jst

index dbbe89f..9ad57a9 100644 (file)
@@ -1,5 +1,9 @@
 .*.deps
+.*.html
 .*.jst
 .*.less
 .*.min
+.*.svg
+/_analytics
 /node_modules
+/pnpm-lock.yaml
index 1439059..e6ebffc 100644 (file)
@@ -1,25 +1,16 @@
-let jst_server = require('@ndcode/jst_server')
-
-return {
-  "enable_caching": false,
-  "listen": [
-    {"port": 8080},
-    {"port": 8443, "protocol": "https:"}
-  ],
-  "mime_types": {
-    ".css": "text/css; charset=utf-8",
-    ".html": "text/html; charset=utf-8",
-    ".ico": "image/x-icon",
-    ".jpg": "image/jpeg",
-    ".jpeg": "image/jpeg",
-    ".js": "application/javascript; charset=utf-8",
-    ".json": "application/json; charset=utf-8",
-    ".png": "image/png",
-    ".svg": "image/svg+xml",
-    ".xml": "text/xml; charset=utf-8"
+return async (resources, prev_server) => new _jst_server.Server(
+  resources,
+  {
+    hosts: {
+      'localhost': {
+        type: 'site',
+        root: '.'
+      },
+      'localhost.localdomain': {
+        type: 'redirect',
+        host: 'localhost'
+      }
+    }
   },
-  sites: {
-    'localhost': new jst_server.SiteDefault(_server, '.'),
-    'localhost.localdomain': new jst_server.SiteRedirect(_server, 'localhost')
-  }
-}
+  prev_server
+)
index 7a250a5..37bcece 100644 (file)
@@ -1,23 +1,77 @@
-let jst_server = require('@ndcode/jst_server')
+//let EmailJSCache = require('@ndcode/emailjs_cache')
+//let ZettairCache = require('@ndcode/zettair_cache')
+let assert = require('assert')
 
-let CustomSite = function(server, root) {
+let CustomSite = function(resources, root, options, prev_site) {
   if (!this instanceof CustomSite)
     throw Error('CustomSite is a constructor')
-  jst_server.SiteRoot.call(this, server, root)
+  _jst_server.Site.call(this, resources, root, options, prev_site)
+
+  //this.emailjs_cache = undefined
+  //this.zettair_cache = undefined
+}
+
+CustomSite.prototype = Object.create(_jst_server.Site.prototype)
+
+CustomSite.prototype.start = async function() {
+  await _jst_server.Site.prototype.start.call(this)
+
+  //assert(this.emailjs_cache === undefined)
+  //this.emailjs_cache = await this.resources.ref(
+  //  'emailjs_cache',
+  //  async () => new EmailJSCache(true)
+  //)
+
+  //assert(this.zettair_cache === undefined)
+  //this.zettair_cache = await this.resources.ref(
+  //  'zettair_cache',
+  //  async () => new ZettairCache(true)
+  //)
 }
 
-CustomSite.prototype = Object.create(jst_server.SiteRoot.prototype)
+CustomSite.prototype.stop = async function() {
+  await _jst_server.Site.prototype.stop.call(this)
+
+  //assert(this.emailjs_cache !== undefined)
+  //await this.resources.unref('emailjs_cache')
+
+  //assert(this.zettair_cache !== undefined)
+  //await this.resources.unref('zettair_cache')
+}
+
+CustomSite.prototype.kick = async function() {
+  await _jst_server.Site.prototype.kick.call(this)
+
+  //assert(this.emailjs_cache !== undefined)
+  //this.emailjs_cache.kick()
+
+  //assert(this.zettair_cache !== undefined)
+  //this.zettair_cache.kick()
+}
+
+//CustomSite.prototype.get_emailjs = function(pathname) {
+//  return /*await*/ this.emailjs_cache.get(this.root + pathname)
+//}
+
+//CustomSite.prototype.get_zettair = function(pathname) {
+//  return /*await*/ this.zettair_cache.get(this.root + pathname)
+//}
 
 CustomSite.prototype.respond = async function(env) {
   if (
-    env.pathname === '/node_modules' ||
-    env.pathname.slice(0, 14) === '/node_modules/' ||
-    env.pathname === '/package.json'
+    env.parsed_url.pathname === '/node_modules' ||
+    env.parsed_url.pathname.slice(0, 14) === '/node_modules/' ||
+    env.parsed_url.pathname === '/package.json'
   ) {
-    this.die(env, `banned file ${env.pathname}`)
+    this.die(env, `banned file ${env.parsed_url.pathname}`)
     return
   }
-  return /*await*/ jst_server.SiteRoot.prototype.respond.call(this, env)
+  return /*await*/ _jst_server.Site.prototype.respond.call(this, env)
 }
 
-return new CustomSite(_server, _root)
+return async (resources, root, prev_site) => new CustomSite(
+  resources,
+  root,
+  {},
+  prev_site
+)
index a77b130..0cef170 100644 (file)
@@ -1,21 +1,21 @@
 -----BEGIN CERTIFICATE-----
-MIIDYDCCAkigAwIBAgIJANSi4mXBF9a+MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
-BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTgxMTE2MTAyNjU1WhcNMTgxMjE2MTAyNjU1WjBF
-MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
-ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAy2PngRdvbUTVsDW+Lg3VlALPu4w8m3qLPeBPLYDyjiRHNn5QcKJZGvRl
-N+e8fSeb9igpzrgpCgK4S9rZpJrOX9heBHs2/5fQ568lHXJKgjCNm8AM/2v0/txy
-46iOJeZmsBNtSVzYIKgHHIsUVGP4Ct/lezPsznacEXOL+wmtEbAcMH73vFrPMaiq
-8lRb8yTNEF4gI2b8TKS8oHW55owiilQmNNDH4dtCqh2ATCDB2jNEYXUa74vP9qD3
-0XDAco2XY5/AUPslMEF28z9jAvoqvO5S7sVMRGBmkFOJ8yDB9exmtObes4ReNY6g
-5624yoG4MTxjTcb2rv666Qp6/vjUPwIDAQABo1MwUTAdBgNVHQ4EFgQUQbZw0emw
-0IwXLQAg13thU7AEgRMwHwYDVR0jBBgwFoAUQbZw0emw0IwXLQAg13thU7AEgRMw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAv9RHAheIwsVqdvbF
-USorz0z7PjDM8dmI1yanPNBUjNIMceZ0h+CcFOztMH8dvMM0r5pCQkIJJyFCyXtK
-y61AOrNbOAgnDm3z1YrVB8NEnji9Qicctpbse8UymD2kOdBXjU1Egrd/uUAgJZmP
-ASYeEYf/n7/bMwTNAJ+qc0o793ILIwJ20Ois43oh3RB57xDzHlHWEbN+lZFZWjmT
-yuVPvwULYmgLP8huh3EOwnsh0eCYkhgImhJICawjWQLT+EHbD3xt+QRYElDgv/Av
-kqRliJCa3yF8NLUdsQp7jD5QdpWUfcnl0Kfrc1I3KlM3SpneGcv6FT/U4hjW++AZ
-ezss0w==
+MIIDazCCAlOgAwIBAgIUGxKLBQ5MirJ3X8n4Qle7x7m7MZkwDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDAzMTUwNzI4MThaFw0yMDA0
+MTQwNzI4MThaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
+HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDLY+eBF29tRNWwNb4uDdWUAs+7jDybeos94E8tgPKO
+JEc2flBwolka9GU357x9J5v2KCnOuCkKArhL2tmkms5f2F4Eezb/l9DnryUdckqC
+MI2bwAz/a/T+3HLjqI4l5mawE21JXNggqAccixRUY/gK3+V7M+zOdpwRc4v7Ca0R
+sBwwfve8Ws8xqKryVFvzJM0QXiAjZvxMpLygdbnmjCKKVCY00Mfh20KqHYBMIMHa
+M0RhdRrvi8/2oPfRcMByjZdjn8BQ+yUwQXbzP2MC+iq87lLuxUxEYGaQU4nzIMH1
+7Ga05t6zhF41jqDnrbjKgbgxPGNNxvau/rrpCnr++NQ/AgMBAAGjUzBRMB0GA1Ud
+DgQWBBRBtnDR6bDQjBctACDXe2FTsASBEzAfBgNVHSMEGDAWgBRBtnDR6bDQjBct
+ACDXe2FTsASBEzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAB
+vX7DgjELLzp4L8nX43BIs4ncvJzLSDk4msbOLFn5y1rlDhVKKv63cdOkmvB9dKuQ
+OrjxdiRCxQMeMBg9GXup2oTN2t5NuF6G4VWp3401jSSX3jl5x12JykutCb02stqK
+DcRBwWO+rC361NiGO3W8LPojO8pir0crjolQCVS5ILSl8SNLzl7bet3kkKssJTxy
+Mwvi+sjFXpWOvflsVlR+mEOGg9S8yO9f8WsHWvLYLz73Uc5MB6Hf3CurhsG1nMOb
+Y9r2b6jRwYZrV2vQW4bqyKHX3D8/ZC9foo/5Fgkpk3ScTTFKsA/db4t8nUNs8EHY
+5O/wMaf9XL1ppZ5neUhq
 -----END CERTIFICATE-----
index 401cc51..b882cea 100644 (file)
@@ -1 +1 @@
-D29D1C6A226490AC
+D29D1C6A226490AD
index 8820da7..19d9f3d 100644 (file)
@@ -1,7 +1,7 @@
 -----BEGIN CERTIFICATE-----
-MIIDgDCCAmigAwIBAgIJANKdHGoiZJCsMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+MIIDgDCCAmigAwIBAgIJANKdHGoiZJCtMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
 BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTgxMTE2MTAyNjU1WhcNMTgxMjE2MTAyNjU1WjBf
+aWRnaXRzIFB0eSBMdGQwHhcNMjAwMzE1MDcyODE4WhcNMjAwNDE0MDcyODE4WjBf
 MQswCQYDVQQGEwJQVDEPMA0GA1UECAwGTGlzYm9hMQ8wDQYDVQQHDAZMaXNib2Ex
 GjAYBgNVBAoMEU9hdHMgSW4gVGhlIFdhdGVyMRIwEAYDVQQDDAlsb2NhbGhvc3Qw
 ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDJLav5I1Dxx9Lzv7DyHig
@@ -12,10 +12,10 @@ JSGaX4tmmpxNrDDgpVnaXEO8I5KR/jvniAn2DoTKlY5XSIUXlbZQPHdlLdLUU7in
 sWmvjGgbbaYgtwBmCFQNSFiJhyzgg6sdUot7wVXDkXBTJPQRQO82CJyw6YoDnTCL
 AgMBAAGjWTBXMAkGA1UdEwQCMAAwKwYDVR0RBCQwIoIJbG9jYWxob3N0ghVsb2Nh
 bGhvc3QubG9jYWxkb21haW4wHQYDVR0OBBYEFPKfGhTkosDI90l245Si/Ce/CLr/
-MA0GCSqGSIb3DQEBCwUAA4IBAQBYjiwzD88QKfJvnmU6TTRTKOOWKpKdEIlZGPBu
-4opyLgB0N/cuiNKYN2WW2Z57TPZLwwKMTlMODco1MTnyVBU0kft+yPxcc9yao7wV
-Fxrb8WWylY5bFWKXwxB0SW01tgaDCAlKtCrTZVoXi/3578cru2/gf4pqoXhuIuG6
-pp5Z9baVOwVTbkNX+vSU8vxkWgpFoAcSaFkULbKCqnilqjn49myydJuorgvxvdOB
-hMHUpGWjhdkb121BvJjZfDxC6jGWmQ2ZGhJkLKU5OmOhl8GocEyDsYglx5PSJTvA
-zGvABNuodcksOPLyzPiKcTPVks5Ls1WxDgOYoRNeEYHszYDW
+MA0GCSqGSIb3DQEBCwUAA4IBAQAm1wzAwSRPYxexcEkJ8dHioxUzV0fcXNxKmV+r
+mJ0I7ebxOcvdsmxXSCUouYLGZtYlLw/58Wyo+yk5rfKdcnWQ182qSsIPuU3rdcBx
+3+5ATPmWVPVh1sc9NAtkVFAZsfM6l9l2OOBVxf6qWPOKtp77Z5Gk2O8+Bxt1xqU1
+Z3X1Yue1aNRBICAoFl84dSpoq3a1GzU9K4lNzj1ebraIiBAeGn7kFmNYYhwCIANz
+tLB12EZpN0qeNQr9ifMhCJWOpVVFoivLI2OrL8r6tLPSN1QRha3dHl2OgL6/Zsr7
+VqPRFjWaimg5Db8U1+dIq3ZGus9bqweO/YIwnVgVwyS9FDtL
 -----END CERTIFICATE-----
index 48fa2d7..976190a 100644 (file)
@@ -1,7 +1,7 @@
 -----BEGIN CERTIFICATE-----
-MIIDgDCCAmigAwIBAgIJANKdHGoiZJCsMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+MIIDgDCCAmigAwIBAgIJANKdHGoiZJCtMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
 BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTgxMTE2MTAyNjU1WhcNMTgxMjE2MTAyNjU1WjBf
+aWRnaXRzIFB0eSBMdGQwHhcNMjAwMzE1MDcyODE4WhcNMjAwNDE0MDcyODE4WjBf
 MQswCQYDVQQGEwJQVDEPMA0GA1UECAwGTGlzYm9hMQ8wDQYDVQQHDAZMaXNib2Ex
 GjAYBgNVBAoMEU9hdHMgSW4gVGhlIFdhdGVyMRIwEAYDVQQDDAlsb2NhbGhvc3Qw
 ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDJLav5I1Dxx9Lzv7DyHig
@@ -12,31 +12,31 @@ JSGaX4tmmpxNrDDgpVnaXEO8I5KR/jvniAn2DoTKlY5XSIUXlbZQPHdlLdLUU7in
 sWmvjGgbbaYgtwBmCFQNSFiJhyzgg6sdUot7wVXDkXBTJPQRQO82CJyw6YoDnTCL
 AgMBAAGjWTBXMAkGA1UdEwQCMAAwKwYDVR0RBCQwIoIJbG9jYWxob3N0ghVsb2Nh
 bGhvc3QubG9jYWxkb21haW4wHQYDVR0OBBYEFPKfGhTkosDI90l245Si/Ce/CLr/
-MA0GCSqGSIb3DQEBCwUAA4IBAQBYjiwzD88QKfJvnmU6TTRTKOOWKpKdEIlZGPBu
-4opyLgB0N/cuiNKYN2WW2Z57TPZLwwKMTlMODco1MTnyVBU0kft+yPxcc9yao7wV
-Fxrb8WWylY5bFWKXwxB0SW01tgaDCAlKtCrTZVoXi/3578cru2/gf4pqoXhuIuG6
-pp5Z9baVOwVTbkNX+vSU8vxkWgpFoAcSaFkULbKCqnilqjn49myydJuorgvxvdOB
-hMHUpGWjhdkb121BvJjZfDxC6jGWmQ2ZGhJkLKU5OmOhl8GocEyDsYglx5PSJTvA
-zGvABNuodcksOPLyzPiKcTPVks5Ls1WxDgOYoRNeEYHszYDW
+MA0GCSqGSIb3DQEBCwUAA4IBAQAm1wzAwSRPYxexcEkJ8dHioxUzV0fcXNxKmV+r
+mJ0I7ebxOcvdsmxXSCUouYLGZtYlLw/58Wyo+yk5rfKdcnWQ182qSsIPuU3rdcBx
+3+5ATPmWVPVh1sc9NAtkVFAZsfM6l9l2OOBVxf6qWPOKtp77Z5Gk2O8+Bxt1xqU1
+Z3X1Yue1aNRBICAoFl84dSpoq3a1GzU9K4lNzj1ebraIiBAeGn7kFmNYYhwCIANz
+tLB12EZpN0qeNQr9ifMhCJWOpVVFoivLI2OrL8r6tLPSN1QRha3dHl2OgL6/Zsr7
+VqPRFjWaimg5Db8U1+dIq3ZGus9bqweO/YIwnVgVwyS9FDtL
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
-MIIDYDCCAkigAwIBAgIJANSi4mXBF9a+MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
-BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTgxMTE2MTAyNjU1WhcNMTgxMjE2MTAyNjU1WjBF
-MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
-ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAy2PngRdvbUTVsDW+Lg3VlALPu4w8m3qLPeBPLYDyjiRHNn5QcKJZGvRl
-N+e8fSeb9igpzrgpCgK4S9rZpJrOX9heBHs2/5fQ568lHXJKgjCNm8AM/2v0/txy
-46iOJeZmsBNtSVzYIKgHHIsUVGP4Ct/lezPsznacEXOL+wmtEbAcMH73vFrPMaiq
-8lRb8yTNEF4gI2b8TKS8oHW55owiilQmNNDH4dtCqh2ATCDB2jNEYXUa74vP9qD3
-0XDAco2XY5/AUPslMEF28z9jAvoqvO5S7sVMRGBmkFOJ8yDB9exmtObes4ReNY6g
-5624yoG4MTxjTcb2rv666Qp6/vjUPwIDAQABo1MwUTAdBgNVHQ4EFgQUQbZw0emw
-0IwXLQAg13thU7AEgRMwHwYDVR0jBBgwFoAUQbZw0emw0IwXLQAg13thU7AEgRMw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAv9RHAheIwsVqdvbF
-USorz0z7PjDM8dmI1yanPNBUjNIMceZ0h+CcFOztMH8dvMM0r5pCQkIJJyFCyXtK
-y61AOrNbOAgnDm3z1YrVB8NEnji9Qicctpbse8UymD2kOdBXjU1Egrd/uUAgJZmP
-ASYeEYf/n7/bMwTNAJ+qc0o793ILIwJ20Ois43oh3RB57xDzHlHWEbN+lZFZWjmT
-yuVPvwULYmgLP8huh3EOwnsh0eCYkhgImhJICawjWQLT+EHbD3xt+QRYElDgv/Av
-kqRliJCa3yF8NLUdsQp7jD5QdpWUfcnl0Kfrc1I3KlM3SpneGcv6FT/U4hjW++AZ
-ezss0w==
+MIIDazCCAlOgAwIBAgIUGxKLBQ5MirJ3X8n4Qle7x7m7MZkwDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDAzMTUwNzI4MThaFw0yMDA0
+MTQwNzI4MThaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
+HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDLY+eBF29tRNWwNb4uDdWUAs+7jDybeos94E8tgPKO
+JEc2flBwolka9GU357x9J5v2KCnOuCkKArhL2tmkms5f2F4Eezb/l9DnryUdckqC
+MI2bwAz/a/T+3HLjqI4l5mawE21JXNggqAccixRUY/gK3+V7M+zOdpwRc4v7Ca0R
+sBwwfve8Ws8xqKryVFvzJM0QXiAjZvxMpLygdbnmjCKKVCY00Mfh20KqHYBMIMHa
+M0RhdRrvi8/2oPfRcMByjZdjn8BQ+yUwQXbzP2MC+iq87lLuxUxEYGaQU4nzIMH1
+7Ga05t6zhF41jqDnrbjKgbgxPGNNxvau/rrpCnr++NQ/AgMBAAGjUzBRMB0GA1Ud
+DgQWBBRBtnDR6bDQjBctACDXe2FTsASBEzAfBgNVHSMEGDAWgBRBtnDR6bDQjBct
+ACDXe2FTsASBEzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAB
+vX7DgjELLzp4L8nX43BIs4ncvJzLSDk4msbOLFn5y1rlDhVKKv63cdOkmvB9dKuQ
+OrjxdiRCxQMeMBg9GXup2oTN2t5NuF6G4VWp3401jSSX3jl5x12JykutCb02stqK
+DcRBwWO+rC361NiGO3W8LPojO8pir0crjolQCVS5ILSl8SNLzl7bet3kkKssJTxy
+Mwvi+sjFXpWOvflsVlR+mEOGg9S8yO9f8WsHWvLYLz73Uc5MB6Hf3CurhsG1nMOb
+Y9r2b6jRwYZrV2vQW4bqyKHX3D8/ZC9foo/5Fgkpk3ScTTFKsA/db4t8nUNs8EHY
+5O/wMaf9XL1ppZ5neUhq
 -----END CERTIFICATE-----
index d01b8fa..009b24f 100644 (file)
@@ -3,6 +3,7 @@ return async env => {
 
   await page(
     env,
+    // head
     async _out => {
       // Blockly stuff
       script(src="js/blockly_compressed.js") {}
@@ -107,6 +108,7 @@ return async env => {
         block(type="logic_boolean") {}
       }
     },
+    // body
     async _out => {
       div.container-fluid {
         div.row(style="margin-top: 10px; margin-bottom: 0px;") {
@@ -211,7 +213,7 @@ return async env => {
             "inputsInline": true,
             "previousStatement": null,
             "nextStatement": null,
-            "colour": "%{BKY_LOGIC_HUE}" 
+            "colour": "%{BKY_LOGIC_HUE}"
           },
           {
             "type": "gripper",
@@ -222,7 +224,7 @@ return async env => {
             "inputsInline": true,
             "previousStatement": null,
             "nextStatement": null,
-            "colour": "%{BKY_LOGIC_HUE}" 
+            "colour": "%{BKY_LOGIC_HUE}"
           },
           {
             "type": "delay",
@@ -233,10 +235,10 @@ return async env => {
             "inputsInline": true,
             "previousStatement": null,
             "nextStatement": null,
-            "colour": "%{BKY_LOGIC_HUE}" 
+            "colour": "%{BKY_LOGIC_HUE}"
           }
-   
+
+
         ]);
 
         Blockly.JavaScript['move_to'] = function(block) {
@@ -378,7 +380,7 @@ return async env => {
             deviceE = 90;
             deviceF = 90;
             setToolboxTimeout();
+
             A.value = 90
             B.value = 105
             C.value = 70
@@ -434,7 +436,7 @@ return async env => {
             setToolboxTimeout();
           }
         }
-   
+
         document.addEventListener('DOMContentLoaded', async () => {
           let devices = await navigator.usb.getDevices();
           devices.forEach(deviceIn => {
@@ -453,7 +455,7 @@ return async env => {
             deviceConnect();
           }
         });
-        
+
         navigator.usb.addEventListener('disconnect', event => {
           console.log('Remove |event.device| from the UI.');
           if (!deviceBusy) {
@@ -474,7 +476,7 @@ return async env => {
             } catch (err) {
               console.log('No device was selected.');
             }
-          
+
             if (deviceIn !== undefined) {
               console.log('Add |device| to the UI.');
               if (device === null) {
@@ -577,7 +579,7 @@ return async env => {
               deviceE = 90;
               deviceF = 90;
               setToolboxTimeout();
-   
+
               A.value = 90
               B.value = 105
               C.value = 70
@@ -592,7 +594,7 @@ return async env => {
             }
           }
         );
+
         document.getElementById('run').addEventListener(
           'click',
           async () => {
@@ -614,6 +616,8 @@ return async env => {
           }
         );
       }
-    }
+    },
+    // scripts
+    async _out => {}
   )
 }
index 8798ee7..3b1688f 100644 (file)
@@ -1,10 +1,13 @@
 {
-  "name": "@ndcode/mirobot",
+  "name": "@ndcode/mirobot_site",
   "version": "0.1.0",
   "description": "Test website for MiRobot",
   "directories": {},
   "dependencies": {
-    "@ndcode/jst_server": "^0.1.0"
+    "cookie": "^0.3.1",
+    "querystring": "^0.2.0",
+    "stream-buffers": "^3.0.2",
+    "xdate": "^0.8.2"
   },
   "devDependencies": {},
   "scripts": {},
index de6c1f6..528bf26 100644 (file)
--- a/page.jst
+++ b/page.jst
@@ -1,6 +1,71 @@
-return async (env, head, body) => {
-  let favicons = await _site.get_min_html('/_favicon/favicons.html')
-  let globals = await _site.get_json('/_config/globals.json')
+let XDate = require('xdate')
+let cookie = require('cookie')
+let crypto = require('crypto')
+
+return async (env, head, body, scripts) => {
+  let favicons = await env.site.get_min_html('/_favicon/favicons.html')
+  let globals = await env.site.get_json('/_config/globals.json')
+
+  await env.site.ensure_dir('/_analytics')
+  let sessions = await env.site.read_json('/_analytics/sessions.json', {})
+  let pageviews = await env.site.read_json('/_analytics/pageviews.json', {})
+
+  let cookies = cookie.parse(env.request.headers.cookie || '')
+  let session_key
+  if (
+    !Object.prototype.hasOwnProperty.call(cookies, 'session_key') ||
+    !Object.prototype.hasOwnProperty.call(
+      sessions,
+      session_key = cookies.session_key
+    )
+  ) {
+    session_key = crypto.randomBytes(16).toString('hex')
+    console.log('new session', session_key)
+    sessions[session_key] = {pageviews: {}}
+  }
+  let session = sessions[session_key]
+    
+  let expires = new XDate()
+  expires.addMonths(1)
+  session.expires = expires.toUTCString()
+  env.response.setHeader(
+    'Set-Cookie',
+    'session_key=' +
+    session_key +
+    '; expires=' +
+    session.expires +
+    '; path=/;'
+  )
+
+  if (
+    !Object.prototype.hasOwnProperty.call(
+      pageviews,
+      env.parsed_url.pathname
+    )
+  ) {
+    console.log('new pageview', env.parsed_url.pathname)
+    pageviews[env.parsed_url.pathname] = {visits: 0, unique_visits: 0}
+  }
+  let pageview = pageviews[env.parsed_url.pathname]
+  ++pageview.visits;
+
+  //if (!Object.prototype.hasOwnProperty.call(session, 'pageviews'))
+  //  session.pageviews = {}
+  let session_pageviews = session.pageviews
+  if (
+    !Object.prototype.hasOwnProperty.call(
+      session_pageviews,
+      env.parsed_url.pathname
+    )
+  ) {
+    console.log('new session_pageview', env.parsed_url.pathname)
+    session_pageviews[env.parsed_url.pathname] = 0
+    ++pageview.unique_visits
+  }
+  ++session_pageviews[env.parsed_url.pathname]
+
+  env.site.write_json('/_analytics/sessions.json', sessions)
+  env.site.write_json('/_analytics/pageviews.json', pageviews)
 
   let _out = []
   _out.push('<!DOCTYPE html>')
@@ -19,11 +84,9 @@ return async (env, head, body) => {
         )
       }
   
-      //link(rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous") {}
       link(rel="stylesheet" href="css/bootstrap.css") {}
-      //link(rel="stylesheet" href="css/calendar.css") {}
-      link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Nunito+Sans:regular,regularitalic,semibold,semibolditalic,bold,bolditalic") {}
-      //link(rel="stylesheet" href="http://fonts.googleapis.com/css?family=Nunito+Sans:regular,regularitalic,semibold,semibolditalic,bold,bolditalic") {}
+      link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Frank+Ruhl+Libre:regular,regularitalic,semibold,semibolditalic,bold,bolditalic,black,blackitalic") {}
+      link(rel="stylesheet" href="//fonts.googleapis.com/css?family=Nunito+Sans:regular,regularitalic,semibold,semibolditalic,bold,bolditalic,black,blackitalic") {}
   
       await head(_out)
 
@@ -45,7 +108,9 @@ return async (env, head, body) => {
       // Include all compiled plugins (below), or include individual files as needed
       //script(src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous") {}
       script(src="js/bootstrap.js") {}
+
+      await scripts(_out)
     }
   }
-  _site.serve(env, 200, Buffer.from(_out.join('')), 'page.jst')
+  env.site.serve(env, 200, Buffer.from(_out.join('')), 'page.jst')
 }