This commit is contained in:
Rizky 2024-02-09 15:29:53 +07:00
parent 4396c3cd6e
commit eb3ab69d18
6 changed files with 101 additions and 46 deletions

View File

@ -1,7 +1,5 @@
import { existsAsync } from "fs-jetpack";
import { glb } from "./global"; 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.npm = { page: {}, site: {} };
glb.server_hook = async (arg) => { glb.server_hook = async (arg) => {
@ -10,22 +8,7 @@ glb.server_hook = async (arg) => {
const arr = url.pathname.split("/"); const arr = url.pathname.split("/");
const site_id = arr[2]; const site_id = arr[2];
if (typeof server[site_id] === "undefined") { return await server.serve(site_id, arg);
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) {}
}
} }
if (arg.handle) return await arg.handle(arg.req); if (arg.handle) return await arg.handle(arg.req);

View File

@ -5,7 +5,8 @@ import { dirAsync, existsAsync, removeAsync, writeAsync } from "fs-jetpack";
import { DCode } from "../../../../../web/src/utils/types/root"; import { DCode } from "../../../../../web/src/utils/types/root";
import { readDirectoryRecursively } from "../../../../api/site-export"; import { readDirectoryRecursively } from "../../../../api/site-export";
import { docs } from "../../entity/docs"; 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) => { export const codeBuild = async (id_site: any) => {
const src_path = code.path(id_site, "site", "src"); 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"); const build_path = code.path(id_site, "server", "build");
await removeAsync(build_path); await removeAsync(build_path);
await dirAsync(build_path); await dirAsync(build_path);
const build_file = `${build_path}/index.js`; const build_file = `${build_path}/index.js`;
await writeAsync(build_file, ""); await writeAsync(build_file, "");
@ -60,6 +62,21 @@ export const server: {
format: "cjs", format: "cjs",
logLevel: "silent", logLevel: "silent",
sourcemap: true, 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: [ plugins: [
style(), style(),
globalExternals({ globalExternals({
@ -75,20 +92,14 @@ export const server: {
{ {
name: "prasi", name: "prasi",
setup(setup) { setup(setup) {
setup.onEnd(async (res) => { setup.onEnd((res) => {
const server_src_path = code.path(id_site, "server", "build", "index.js"); server.init(id_site);
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;
}
}
}); });
}, },
}, },
], ],
}); });
const esbuild = code.esbuild[id_site].server; const esbuild = code.esbuild[id_site].server;
esbuild?.watch(); esbuild?.watch();
} }
@ -147,8 +158,10 @@ export const server: {
const esbuild = code.esbuild[id_site].site; const esbuild = code.esbuild[id_site].site;
esbuild?.watch(); esbuild?.watch();
} }
for (const mode of ["site", "server"]) { for (const _mode of ["site", "server"]) {
const esbuild = code.esbuild[id_site][mode as "site" | "server"]; const mode = _mode as "site" | "server";
const esbuild = code.esbuild[id_site][mode];
if (esbuild) { if (esbuild) {
try { try {
await esbuild.rebuild(); 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 out = Bun.file(build_file);
const src = (await out.text()).replace( const src = (await out.text()).replace(
"//# sourceMappingURL=index.js.map", "//# sourceMappingURL=index.js.map",

View File

@ -33,7 +33,9 @@ export const prepCodeSnapshot = async (id_site: string, mode: CodeMode) => {
if (dcode) { if (dcode) {
if (!dcode.build[mode]) { if (!dcode.build[mode]) {
const build_dir = code.path(id_site, mode, "build"); const build_dir = code.path(id_site, mode, "build");
await codeBuild(id_site); await codeBuild(id_site);
dcode.build[mode] = codeLoad(id_site, build_dir); dcode.build[mode] = codeLoad(id_site, build_dir);
const doc = dcode.build[mode] as Doc; const doc = dcode.build[mode] as Doc;
if (doc) { if (doc) {
@ -49,6 +51,7 @@ export const prepCodeSnapshot = async (id_site: string, mode: CodeMode) => {
}); });
} }
const sv_local = await gzipAsync(bin); const sv_local = await gzipAsync(bin);
user.active.findAll({ site_id: id_site }).map((e) => { user.active.findAll({ site_id: id_site }).map((e) => {
const ws = conns.get(e.client_id)?.ws; const ws = conns.get(e.client_id)?.ws;
if (ws) { if (ws) {

View File

@ -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<undefined | Response>;
}) => Promise<Response>;
};
const _server = {
handler: {} as Record<string, PrasiServer>,
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<Exclude<(typeof g)["server_hook"], undefined>>[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;

View File

@ -6,17 +6,6 @@ import { dirname } from "path";
export type CodeMode = "site" | "server"; export type CodeMode = "site" | "server";
type PrasiServer = {
ws?: WebSocketHandler<{ url: string }>;
http: (arg: {
url: URL;
req: Request;
server: Server;
handle: (req: Request) => Promise<undefined | Response>;
}) => Promise<Response>;
};
export const server = {} as Record<string, null | PrasiServer>;
export const code = { export const code = {
path(id_site: string, mode: CodeMode, type: "src" | "build", path?: string) { path(id_site: string, mode: CodeMode, type: "src" | "build", path?: string) {
let file_path = ""; let file_path = "";
@ -25,9 +14,6 @@ export const code = {
} }
return dir.data(`/code/${id_site}/${mode}/${type}${file_path}`); return dir.data(`/code/${id_site}/${mode}/${type}${file_path}`);
}, },
package_deps: (path: string) => {
const file = Bun.file(path);
},
server: {} as Record<string, {}>, server: {} as Record<string, {}>,
esbuild: {} as Record<string, Record<CodeMode, null | BuildContext>>, esbuild: {} as Record<string, Record<CodeMode, null | BuildContext>>,
prep(id_site: string, mode: CodeMode) { prep(id_site: string, mode: CodeMode) {

View File

@ -15,6 +15,7 @@ type SingleRoute = {
export const g = global as unknown as { export const g = global as unknown as {
status: "init" | "ready"; status: "init" | "ready";
_server: any;
server_hook?: (arg: { server_hook?: (arg: {
url: URL; url: URL;
req: Request; req: Request;