From eb3ab69d18db4efd29218f791c7a4a96f8969920 Mon Sep 17 00:00:00 2001 From: Rizky Date: Fri, 9 Feb 2024 15:29:53 +0700 Subject: [PATCH] wip fix --- app/srv/init.ts | 21 +------ app/srv/ws/sync/editor/code/build-code.ts | 39 ++++++++---- app/srv/ws/sync/editor/code/prep-code.ts | 3 + app/srv/ws/sync/editor/code/server-main.ts | 69 ++++++++++++++++++++++ app/srv/ws/sync/editor/code/util-code.ts | 14 ----- pkgs/core/utils/global.ts | 1 + 6 files changed, 101 insertions(+), 46 deletions(-) create mode 100644 app/srv/ws/sync/editor/code/server-main.ts diff --git a/app/srv/init.ts b/app/srv/init.ts index b0fcaefa..ce891aed 100644 --- a/app/srv/init.ts +++ b/app/srv/init.ts @@ -1,7 +1,5 @@ -import { existsAsync } from "fs-jetpack"; import { glb } from "./global"; -import { code, server } from "./ws/sync/editor/code/util-code"; - +import { server } from "./ws/sync/editor/code/server-main"; glb.npm = { page: {}, site: {} }; glb.server_hook = async (arg) => { @@ -10,22 +8,7 @@ glb.server_hook = async (arg) => { const arr = url.pathname.split("/"); const site_id = arr[2]; - if (typeof server[site_id] === "undefined") { - const server_src_path = code.path(site_id, "server", "build", "index.js"); - server[site_id] = null; - if (await existsAsync(server_src_path)) { - const svr = require(server_src_path); - if (svr && svr.server) { - server[site_id] = svr.server; - } - } - } - - if (server[site_id]) { - try { - return await server[site_id]?.http(arg); - } catch (e) {} - } + return await server.serve(site_id, arg); } if (arg.handle) return await arg.handle(arg.req); diff --git a/app/srv/ws/sync/editor/code/build-code.ts b/app/srv/ws/sync/editor/code/build-code.ts index 41c70f47..eb786119 100644 --- a/app/srv/ws/sync/editor/code/build-code.ts +++ b/app/srv/ws/sync/editor/code/build-code.ts @@ -5,7 +5,8 @@ import { dirAsync, existsAsync, removeAsync, writeAsync } from "fs-jetpack"; import { DCode } from "../../../../../web/src/utils/types/root"; import { readDirectoryRecursively } from "../../../../api/site-export"; import { docs } from "../../entity/docs"; -import { code, server } from "./util-code"; +import { code } from "./util-code"; +import { server } from "./server-main"; export const codeBuild = async (id_site: any) => { const src_path = code.path(id_site, "site", "src"); @@ -47,6 +48,7 @@ export const server: { const build_path = code.path(id_site, "server", "build"); await removeAsync(build_path); await dirAsync(build_path); + const build_file = `${build_path}/index.js`; await writeAsync(build_file, ""); @@ -60,6 +62,21 @@ export const server: { format: "cjs", logLevel: "silent", sourcemap: true, + banner: { + js: `\ +const _fs = require('node:fs/promises'); +const console = +typeof global.server_hook === "function" + ? { ...global.console } + : global.console; +if (typeof global.server_hook === "function") { + const log = global.console.log; + console.log = function (...arg) { + const out = "${code.path(id_site, "site", "src", "server.log")}"; + _fs.appendFile(out, arg.join(" ") + "\\n"); + }.bind(console); +}`, + }, plugins: [ style(), globalExternals({ @@ -75,20 +92,14 @@ export const server: { { name: "prasi", setup(setup) { - setup.onEnd(async (res) => { - const server_src_path = code.path(id_site, "server", "build", "index.js"); - server[id_site] = null; - if (await existsAsync(server_src_path)) { - const svr = require(server_src_path); - if (svr && svr.server) { - server[id_site] = svr.server; - } - } + setup.onEnd((res) => { + server.init(id_site); }); }, }, ], }); + const esbuild = code.esbuild[id_site].server; esbuild?.watch(); } @@ -147,8 +158,10 @@ export const server: { const esbuild = code.esbuild[id_site].site; esbuild?.watch(); } - for (const mode of ["site", "server"]) { - const esbuild = code.esbuild[id_site][mode as "site" | "server"]; + for (const _mode of ["site", "server"]) { + const mode = _mode as "site" | "server"; + + const esbuild = code.esbuild[id_site][mode]; if (esbuild) { try { await esbuild.rebuild(); @@ -157,7 +170,7 @@ export const server: { } } - const build_file = code.path(id_site, "site", "build", "index.js"); + const build_file = code.path(id_site, mode, "build", "index.js"); const out = Bun.file(build_file); const src = (await out.text()).replace( "//# sourceMappingURL=index.js.map", diff --git a/app/srv/ws/sync/editor/code/prep-code.ts b/app/srv/ws/sync/editor/code/prep-code.ts index 49d50495..a127bbdb 100644 --- a/app/srv/ws/sync/editor/code/prep-code.ts +++ b/app/srv/ws/sync/editor/code/prep-code.ts @@ -33,7 +33,9 @@ export const prepCodeSnapshot = async (id_site: string, mode: CodeMode) => { if (dcode) { if (!dcode.build[mode]) { const build_dir = code.path(id_site, mode, "build"); + await codeBuild(id_site); + dcode.build[mode] = codeLoad(id_site, build_dir); const doc = dcode.build[mode] as Doc; if (doc) { @@ -49,6 +51,7 @@ export const prepCodeSnapshot = async (id_site: string, mode: CodeMode) => { }); } const sv_local = await gzipAsync(bin); + user.active.findAll({ site_id: id_site }).map((e) => { const ws = conns.get(e.client_id)?.ws; if (ws) { diff --git a/app/srv/ws/sync/editor/code/server-main.ts b/app/srv/ws/sync/editor/code/server-main.ts new file mode 100644 index 00000000..88c3ff88 --- /dev/null +++ b/app/srv/ws/sync/editor/code/server-main.ts @@ -0,0 +1,69 @@ +import { existsAsync } from "fs-jetpack"; +import { g } from "utils/global"; +import { code } from "./util-code"; +import type { Server, WebSocketHandler } from "bun"; +import _fs from "node:fs/promises"; + +type PrasiServer = { + ws?: WebSocketHandler<{ url: string }>; + http: (arg: { + url: URL; + req: Request; + server: Server; + handle: (req: Request) => Promise; + }) => Promise; +}; + +const _server = { + handler: {} as Record, + init_timeout: null as any, + init(site_id: string) { + clearTimeout(this.init_timeout); + this.init_timeout = setTimeout(() => { + console.log("server init", site_id); + try { + const server_src_path = code.path( + site_id, + "server", + "build", + "index.js" + ); + delete require.cache[server_src_path]; + const svr = require(server_src_path); + if (svr && svr.server) { + this.handler[site_id] = svr.server; + } + + Bun.write( + Bun.file(code.path(site_id, "site", "src", "server.log")), + "" + ); + } catch (e) { + console.log(`Failed to init server ${site_id}`); + } + }, 300); + }, + async serve( + site_id: string, + arg: Parameters>[0] + ) { + const handler = this.handler[site_id]; + console.log(this.handler); + + if (handler) { + try { + return await handler.http(arg); + } catch (e: any) { + _fs.appendFile( + code.path(site_id, "site", "src", "server.log"), + e.message + "\n" + ); + } + } + }, +}; + +if (!g._server) { + g._server = _server; +} +export const server = g._server; diff --git a/app/srv/ws/sync/editor/code/util-code.ts b/app/srv/ws/sync/editor/code/util-code.ts index 25029f91..42ba4756 100644 --- a/app/srv/ws/sync/editor/code/util-code.ts +++ b/app/srv/ws/sync/editor/code/util-code.ts @@ -6,17 +6,6 @@ import { dirname } from "path"; export type CodeMode = "site" | "server"; -type PrasiServer = { - ws?: WebSocketHandler<{ url: string }>; - http: (arg: { - url: URL; - req: Request; - server: Server; - handle: (req: Request) => Promise; - }) => Promise; -}; -export const server = {} as Record; - export const code = { path(id_site: string, mode: CodeMode, type: "src" | "build", path?: string) { let file_path = ""; @@ -25,9 +14,6 @@ export const code = { } return dir.data(`/code/${id_site}/${mode}/${type}${file_path}`); }, - package_deps: (path: string) => { - const file = Bun.file(path); - }, server: {} as Record, esbuild: {} as Record>, prep(id_site: string, mode: CodeMode) { diff --git a/pkgs/core/utils/global.ts b/pkgs/core/utils/global.ts index 82081953..f57d4a27 100644 --- a/pkgs/core/utils/global.ts +++ b/pkgs/core/utils/global.ts @@ -15,6 +15,7 @@ type SingleRoute = { export const g = global as unknown as { status: "init" | "ready"; + _server: any; server_hook?: (arg: { url: URL; req: Request;