wip fix
This commit is contained in:
parent
4396c3cd6e
commit
eb3ab69d18
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue