.*.deps
+.*.html
.*.jst
.*.less
.*.min
+.*.svg
+/_analytics
/node_modules
+/pnpm-lock.yaml
-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
+)
-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
+)
-----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-----
-D29D1C6A226490AC
+D29D1C6A226490AD
-----BEGIN CERTIFICATE-----
-MIIDgDCCAmigAwIBAgIJANKdHGoiZJCsMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+MIIDgDCCAmigAwIBAgIJANKdHGoiZJCtMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTgxMTE2MTAyNjU1WhcNMTgxMjE2MTAyNjU1WjBf
+aWRnaXRzIFB0eSBMdGQwHhcNMjAwMzE1MDcyODE4WhcNMjAwNDE0MDcyODE4WjBf
MQswCQYDVQQGEwJQVDEPMA0GA1UECAwGTGlzYm9hMQ8wDQYDVQQHDAZMaXNib2Ex
GjAYBgNVBAoMEU9hdHMgSW4gVGhlIFdhdGVyMRIwEAYDVQQDDAlsb2NhbGhvc3Qw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDJLav5I1Dxx9Lzv7DyHig
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-----
-MIIDgDCCAmigAwIBAgIJANKdHGoiZJCsMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+MIIDgDCCAmigAwIBAgIJANKdHGoiZJCtMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTgxMTE2MTAyNjU1WhcNMTgxMjE2MTAyNjU1WjBf
+aWRnaXRzIFB0eSBMdGQwHhcNMjAwMzE1MDcyODE4WhcNMjAwNDE0MDcyODE4WjBf
MQswCQYDVQQGEwJQVDEPMA0GA1UECAwGTGlzYm9hMQ8wDQYDVQQHDAZMaXNib2Ex
GjAYBgNVBAoMEU9hdHMgSW4gVGhlIFdhdGVyMRIwEAYDVQQDDAlsb2NhbGhvc3Qw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDJLav5I1Dxx9Lzv7DyHig
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-----
await page(
env,
+ // head
async _out => {
// Blockly stuff
script(src="js/blockly_compressed.js") {}
block(type="logic_boolean") {}
}
},
+ // body
async _out => {
div.container-fluid {
div.row(style="margin-top: 10px; margin-bottom: 0px;") {
"inputsInline": true,
"previousStatement": null,
"nextStatement": null,
- "colour": "%{BKY_LOGIC_HUE}"
+ "colour": "%{BKY_LOGIC_HUE}"
},
{
"type": "gripper",
"inputsInline": true,
"previousStatement": null,
"nextStatement": null,
- "colour": "%{BKY_LOGIC_HUE}"
+ "colour": "%{BKY_LOGIC_HUE}"
},
{
"type": "delay",
"inputsInline": true,
"previousStatement": null,
"nextStatement": null,
- "colour": "%{BKY_LOGIC_HUE}"
+ "colour": "%{BKY_LOGIC_HUE}"
}
-
-
+
+
]);
Blockly.JavaScript['move_to'] = function(block) {
deviceE = 90;
deviceF = 90;
setToolboxTimeout();
-
+
A.value = 90
B.value = 105
C.value = 70
setToolboxTimeout();
}
}
-
+
document.addEventListener('DOMContentLoaded', async () => {
let devices = await navigator.usb.getDevices();
devices.forEach(deviceIn => {
deviceConnect();
}
});
-
+
navigator.usb.addEventListener('disconnect', event => {
console.log('Remove |event.device| from the UI.');
if (!deviceBusy) {
} catch (err) {
console.log('No device was selected.');
}
-
+
if (deviceIn !== undefined) {
console.log('Add |device| to the UI.');
if (device === null) {
deviceE = 90;
deviceF = 90;
setToolboxTimeout();
-
+
A.value = 90
B.value = 105
C.value = 70
}
}
);
-
+
document.getElementById('run').addEventListener(
'click',
async () => {
}
);
}
- }
+ },
+ // scripts
+ async _out => {}
)
}
{
- "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": {},
-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>')
)
}
- //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)
// 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')
}