diff --git a/app.js b/app.js index b997d49e..ada97f20 100644 --- a/app.js +++ b/app.js @@ -37,7 +37,6 @@ let util; let dir; let log; let pre; -let alt; const EventEmitter = require('events'); class AppEmitter extends EventEmitter {} @@ -65,7 +64,6 @@ function init(mod) { startTime = time(); lastmod = mod.util.lastmod; logger = mod.log; - alt = ENV.alt; pre = ENV.pre || mod.meta.pre; debug = ENV.debug || mod.meta.debug; oversion = ENV.over || mod.meta.over; @@ -80,10 +78,6 @@ function init(mod) { dversion = debug ? `_${version}` : version; forceUseCache = ENV.cache ? true : false; - if (!ENV.electron) { - generateDevices(); - } - if (pre) { for (let [k,v] of Object.entries(productionMap)) { productionMap[`${pre}${k}`] = `${pre}${v}`; @@ -142,7 +136,8 @@ function init(mod) { return "reload"; }); } - mod.add(rewriteHtmlVersion); + mod.add(addAppHeaders); + mod.static("/lib/", "alt"); mod.static("/lib/", "src"); mod.static("/obj/", "web/obj"); mod.static("/font/", "web/font"); @@ -194,28 +189,26 @@ function init(mod) { } } - if (alt) { - for (let [ key, val ] of Object.entries(append)) { - let src = `src/main/${key}.js`; - if (!fs.existsSync(src)) { - logger.log('missing:', src); - continue; - } - fs.mkdirSync(`alt/main`, { recursive: true }); - let body = fs.readFileSync(src); - fs.writeFileSync(`alt/main/${key}.js`, body + val); - if (true) { - // packed - src= `src/pack/${key}-main.js`; - if (!fs.existsSync(src)) { - logger.log('missing:', src); - continue; - } - fs.mkdirSync(`alt/pack`, { recursive: true }); - body = fs.readFileSync(src); - fs.writeFileSync(`alt/pack/${key}-main.js`, body + val); - } + // create alt artifacts with module extensions + logger.log('create alt artifacts'); + for (let [ key, val ] of Object.entries(append)) { + let src = `src/main/${key}.js`; + if (!fs.existsSync(src)) { + logger.log('missing:', src); + continue; } + fs.mkdirSync(`alt/main`, { recursive: true }); + let body = fs.readFileSync(src); + fs.writeFileSync(`alt/main/${key}.js`, body + val); + + src= `src/pack/${key}-main.js`; + if (!fs.existsSync(src)) { + logger.log('missing:', src); + continue; + } + fs.mkdirSync(`alt/pack`, { recursive: true }); + body = fs.readFileSync(src); + fs.writeFileSync(`alt/pack/${key}-main.js`, body + val); } }; @@ -440,28 +433,6 @@ function serveWasm(req, res, next) { } } -// pack/concat device script strings to inject into /code/ scripts -function generateDevices() { - let root = PATH.join(dir,"src","kiri","dev"); - let devs = {}; - fs.readdirSync(root).forEach(type => { - let map = devs[type] = devs[type] || {}; - fs.readdirSync(PATH.join(root,type)).forEach(device => { - let deviceName = device.endsWith('.json') - ? device.substring(0,device.length-5) - : device; - map[deviceName] = JSON.parse(fs.readFileSync(PATH.join(root,type,device))); - }); - }); - let dstr = JSON.stringify(devs); - util.mkdir(PATH.join(dir,"src","pack")); - fs.writeFileSync(PATH.join(dir,"src","pack","kiri-devs.js"), `export const devices = ${dstr};`); - if (alt) { - fs.mkdirSync('alt/pack', { recursive: true }); - fs.writeFileSync(PATH.join(dir,"alt","pack","kiri-devs.js"), `export const devices = ${dstr};`); - } -} - function minify(code) { let mini = uglify.minify(code.toString(), { compress: { @@ -585,7 +556,7 @@ function cookieValue(cookie,key) { } } -function rewriteHtmlVersion(req, res, next) { +function addAppHeaders(req, res, next) { if ([ "/kiri/", "/mesh/", @@ -599,37 +570,6 @@ function rewriteHtmlVersion(req, res, next) { ].indexOf(req.app.path) >= 0) { addCorsHeaders(req, res); } - if ([ - "/lib/main/kiri.js", - "/lib/main/mesh.js" - ].indexOf(req.app.path) >= 0) { - addCorsHeaders(req, res); - // const data = append[req.app.path.split('/')[3].split('.')[0]]; - const data = append[req.app.path.split('.')[0].split('/').pop()]; - - if (!data) return next(); - if (debug) logger.log({ append: req.app.path, data: data.length }); - - const real_write = res.write; - const real_end = res.end; - let body = ''; - - res.write = function (chunk, encoding) { - body += chunk.toString(encoding); - }; - - res.end = function (chunk, encoding) { - if (chunk) { - body += chunk.toString(encoding); - } - body += data; - res.setHeader('Content-Length', Buffer.byteLength(body)); - res.setHeader('Content-Type', "application/javascript; charset=utf-8"); - real_write.call(res, body); - real_end.call(res); - }; - } - next(); } diff --git a/bin/esbuild.config.mjs b/bin/esbuild.config.mjs index 26a4315a..1a55e3e8 100644 --- a/bin/esbuild.config.mjs +++ b/bin/esbuild.config.mjs @@ -1,5 +1,6 @@ import { build, transform } from 'esbuild'; import fs from 'fs/promises'; +import path from 'path'; import glob from 'fast-glob'; // Get build mode from command line argument @@ -38,6 +39,30 @@ async function appendExtraModules(extras, outfile, minify = false) { console.log(`Appended ${files.length} module(s) to ${outfile}`); } +async function generateDevices(dir = '') { + let root = path.join(dir, "src", "kiri", "dev"); + let devs = {}; + let files = await fs.readdir(root); + for (let type of files) { + let map = devs[type] = devs[type] || {}; + let devices = await fs.readdir(path.join(root, type)); + for (let device of devices) { + let deviceName = device.endsWith('.json') + ? device.substring(0, device.length - 5) + : device; + map[deviceName] = JSON.parse(await fs.readFile(path.join(root, type, device))); + } + } + let dstr = JSON.stringify(devs); + fs.mkdir(path.join(dir, "src", "pack"), { recursive: true }); + await fs.writeFile(path.join(dir, "src", "pack", "kiri-devs.js"), `export const devices = ${dstr};`); + if (true) { + // create alt artifacts + await fs.mkdir('alt/pack', { recursive: true }); + await fs.writeFile(path.join(dir, "alt", "pack", "kiri-devs.js"), `export const devices = ${dstr};`); + } +} + const logOverride = { 'duplicate-class-member': 'silent', 'duplicate-object-key': 'silent', @@ -72,6 +97,9 @@ const rec = { async function buildApp() { try { + // Concatenate kiri devices + generateDevices(); + // Bundle mesh main app await build(Object.assign({}, rec, { entryPoints: [ 'src/main/mesh.js' ], diff --git a/package.json b/package.json index bedc9966..23ee11a5 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "@fortawesome/fontawesome-free": "^6.1.1", - "@gridspace/app-server": "github:gridspace/app-server#v0.0.19", + "@gridspace/app-server": "github:gridspace/app-server#v0.0.20", "@gridspace/basic-ftp": "github:gridspace/basic-ftp#v5.0.5-gridspace", "@gridspace/net-level-client": "^0.2.3", "@gridspace/raster-path": "^1.0.6", @@ -57,7 +57,7 @@ "npm": "^11.4.2", "prettier": "^3.5.3", "react-responsive-carousel": "^3.2.23", - "serve-static": "^1.14.1", + "serve-static": "^2.2.0", "three": "^0.178.0", "three-mesh-bvh": "^0.7.6", "uglify-js": "3.14.5", @@ -103,8 +103,8 @@ "dryrun": "gs-app-server --debug --single --alt --dryrun", "mac-verify": "spctl --assess -vv --type install dist/*/*.app", "mk-links": "find src web -type l | xargs -I{} sh -c 'echo \"{},$(readlink {})\"' > conf/links.csv", - "pack-dev": "npm run dryrun && npm run webpack-src && npm run dryrun && npm run bundle:dev", - "pack-prod": "npm run dryrun && npm run webpack-src prod && npm run dryrun && npm run bundle", + "pack-dev": "npm run webpack-src && npm run dryrun && npm run bundle:dev", + "pack-prod": "npm run webpack-src prod && npm run dryrun && npm run bundle", "postbuild": "node bin/electron-post.js", "prebuild": "npm run setup && npm run pack-dev prod && node bin/electron-pre.js", "preinstall": "node bin/install-pre.js",