reflow build/serve of alt, update app-server dep for proper fallthrough handling

This commit is contained in:
Stewart Allen 2025-11-13 11:32:15 -05:00
commit fc63f395a4
3 changed files with 54 additions and 86 deletions

104
app.js
View file

@ -37,7 +37,6 @@ let util;
let dir; let dir;
let log; let log;
let pre; let pre;
let alt;
const EventEmitter = require('events'); const EventEmitter = require('events');
class AppEmitter extends EventEmitter {} class AppEmitter extends EventEmitter {}
@ -65,7 +64,6 @@ function init(mod) {
startTime = time(); startTime = time();
lastmod = mod.util.lastmod; lastmod = mod.util.lastmod;
logger = mod.log; logger = mod.log;
alt = ENV.alt;
pre = ENV.pre || mod.meta.pre; pre = ENV.pre || mod.meta.pre;
debug = ENV.debug || mod.meta.debug; debug = ENV.debug || mod.meta.debug;
oversion = ENV.over || mod.meta.over; oversion = ENV.over || mod.meta.over;
@ -80,10 +78,6 @@ function init(mod) {
dversion = debug ? `_${version}` : version; dversion = debug ? `_${version}` : version;
forceUseCache = ENV.cache ? true : false; forceUseCache = ENV.cache ? true : false;
if (!ENV.electron) {
generateDevices();
}
if (pre) { if (pre) {
for (let [k,v] of Object.entries(productionMap)) { for (let [k,v] of Object.entries(productionMap)) {
productionMap[`${pre}${k}`] = `${pre}${v}`; productionMap[`${pre}${k}`] = `${pre}${v}`;
@ -142,7 +136,8 @@ function init(mod) {
return "reload"; return "reload";
}); });
} }
mod.add(rewriteHtmlVersion); mod.add(addAppHeaders);
mod.static("/lib/", "alt");
mod.static("/lib/", "src"); mod.static("/lib/", "src");
mod.static("/obj/", "web/obj"); mod.static("/obj/", "web/obj");
mod.static("/font/", "web/font"); mod.static("/font/", "web/font");
@ -194,28 +189,26 @@ function init(mod) {
} }
} }
if (alt) { // create alt artifacts with module extensions
for (let [ key, val ] of Object.entries(append)) { logger.log('create alt artifacts');
let src = `src/main/${key}.js`; for (let [ key, val ] of Object.entries(append)) {
if (!fs.existsSync(src)) { let src = `src/main/${key}.js`;
logger.log('missing:', src); if (!fs.existsSync(src)) {
continue; 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);
}
} }
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) { function minify(code) {
let mini = uglify.minify(code.toString(), { let mini = uglify.minify(code.toString(), {
compress: { compress: {
@ -585,7 +556,7 @@ function cookieValue(cookie,key) {
} }
} }
function rewriteHtmlVersion(req, res, next) { function addAppHeaders(req, res, next) {
if ([ if ([
"/kiri/", "/kiri/",
"/mesh/", "/mesh/",
@ -599,37 +570,6 @@ function rewriteHtmlVersion(req, res, next) {
].indexOf(req.app.path) >= 0) { ].indexOf(req.app.path) >= 0) {
addCorsHeaders(req, res); 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(); next();
} }

View file

@ -1,5 +1,6 @@
import { build, transform } from 'esbuild'; import { build, transform } from 'esbuild';
import fs from 'fs/promises'; import fs from 'fs/promises';
import path from 'path';
import glob from 'fast-glob'; import glob from 'fast-glob';
// Get build mode from command line argument // 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}`); 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 = { const logOverride = {
'duplicate-class-member': 'silent', 'duplicate-class-member': 'silent',
'duplicate-object-key': 'silent', 'duplicate-object-key': 'silent',
@ -72,6 +97,9 @@ const rec = {
async function buildApp() { async function buildApp() {
try { try {
// Concatenate kiri devices
generateDevices();
// Bundle mesh main app // Bundle mesh main app
await build(Object.assign({}, rec, { await build(Object.assign({}, rec, {
entryPoints: [ 'src/main/mesh.js' ], entryPoints: [ 'src/main/mesh.js' ],

View file

@ -36,7 +36,7 @@
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^6.1.1", "@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/basic-ftp": "github:gridspace/basic-ftp#v5.0.5-gridspace",
"@gridspace/net-level-client": "^0.2.3", "@gridspace/net-level-client": "^0.2.3",
"@gridspace/raster-path": "^1.0.6", "@gridspace/raster-path": "^1.0.6",
@ -57,7 +57,7 @@
"npm": "^11.4.2", "npm": "^11.4.2",
"prettier": "^3.5.3", "prettier": "^3.5.3",
"react-responsive-carousel": "^3.2.23", "react-responsive-carousel": "^3.2.23",
"serve-static": "^1.14.1", "serve-static": "^2.2.0",
"three": "^0.178.0", "three": "^0.178.0",
"three-mesh-bvh": "^0.7.6", "three-mesh-bvh": "^0.7.6",
"uglify-js": "3.14.5", "uglify-js": "3.14.5",
@ -103,8 +103,8 @@
"dryrun": "gs-app-server --debug --single --alt --dryrun", "dryrun": "gs-app-server --debug --single --alt --dryrun",
"mac-verify": "spctl --assess -vv --type install dist/*/*.app", "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", "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-dev": "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-prod": "npm run webpack-src prod && npm run dryrun && npm run bundle",
"postbuild": "node bin/electron-post.js", "postbuild": "node bin/electron-post.js",
"prebuild": "npm run setup && npm run pack-dev prod && node bin/electron-pre.js", "prebuild": "npm run setup && npm run pack-dev prod && node bin/electron-pre.js",
"preinstall": "node bin/install-pre.js", "preinstall": "node bin/install-pre.js",