diff --git a/app/web/src/index.tsx b/app/web/src/index.tsx
index d06e95fc..1263c66b 100644
--- a/app/web/src/index.tsx
+++ b/app/web/src/index.tsx
@@ -4,6 +4,23 @@ import { Root } from "./base/root";
import "./index.css";
import { createAPI, createDB, reloadDBAPI } from "./utils/script/init-api";
+const start = async () => {
+ registerServiceWorker();
+ defineReact();
+ await defineWindow(false);
+ const w = window as any;
+ const base = `${location.protocol}//${location.host}`;
+
+ await reloadDBAPI(base);
+ w.api = createAPI(base);
+ w.db = createDB(base);
+
+ const el = document.getElementById("root");
+ if (el) {
+ createRoot(el).render();
+ }
+};
+
const registerServiceWorker = async () => {
if ("serviceWorker" in navigator) {
try {
@@ -20,21 +37,4 @@ const registerServiceWorker = async () => {
}
};
-registerServiceWorker();
-
-const el = document.getElementById("root");
-
-if (el) {
- (async () => {
- defineReact();
- await defineWindow(false);
- const w = window as any;
- const base = `${location.protocol}//${location.host}`;
-
- await reloadDBAPI(base);
- w.api = createAPI(base);
- w.db = createDB(base);
-
- createRoot(el).render();
- })();
-}
+start();
diff --git a/pkgs/core/index.ts b/pkgs/core/index.ts
index 86db4bdb..e33a621c 100644
--- a/pkgs/core/index.ts
+++ b/pkgs/core/index.ts
@@ -8,6 +8,9 @@ import { config } from "./utils/config";
import { g } from "./utils/global";
import { createLogger } from "./utils/logger";
import { parcelBuild } from "utils/parcel";
+import { prepareApiRoutes } from "./server/api-scan";
+
+g.status = "init";
await createLogger();
g.port = parseInt(process.env.PORT || "4550");
@@ -30,4 +33,6 @@ if (g.db) {
await createServer();
await parcelBuild();
await generateAPIFrm();
+await prepareApiRoutes();
await prepareAPITypes();
+g.status = "ready";
diff --git a/pkgs/core/server/api-scan.ts b/pkgs/core/server/api-scan.ts
index 74772ad5..7a9833af 100644
--- a/pkgs/core/server/api-scan.ts
+++ b/pkgs/core/server/api-scan.ts
@@ -5,8 +5,7 @@ import { dir } from "../utils/dir";
import { g } from "../utils/global";
import { parseArgs } from "./parse-args";
-export const scanApi = async () => {
- g.api = {};
+export const prepareApiRoutes = async () => {
const scan = async (path: string, root?: string) => {
const apis = await listAsync(path);
if (apis) {
diff --git a/pkgs/core/server/create.ts b/pkgs/core/server/create.ts
index 4eb35904..243b0755 100644
--- a/pkgs/core/server/create.ts
+++ b/pkgs/core/server/create.ts
@@ -1,21 +1,24 @@
import { createRouter } from "radix3";
import { dir } from "../utils/dir";
import { g } from "../utils/global";
-import { scanApi } from "./api-scan";
import { serveAPI } from "./serve-api";
export const createServer = async () => {
+ g.api = {};
g.router = createRouter({ strictTrailingSlash: true });
- await scanApi();
-
g.server = Bun.serve({
port: g.port,
async fetch(req) {
+ if (g.status === "init") return new Response("initializing...");
const url = new URL(req.url);
- const api = await serveAPI(url, req);
- if (api) {
- return api;
+ try {
+ const api = await serveAPI(url, req);
+ if (api) {
+ return api;
+ }
+ } catch (e) {
+ g.log.error(e);
}
try {
@@ -23,8 +26,15 @@ export const createServer = async () => {
if (file.type !== "application/octet-stream") {
return new Response(file as any);
}
- } catch (e) {}
- return new Response(Bun.file(dir(`app/static/index.html`)) as any);
+ } catch (e) {
+ g.log.error(e);
+ }
+ try {
+ return new Response(Bun.file(dir(`app/static/index.html`)) as any);
+ } catch (e) {
+ g.log.error(e);
+ return new Response("Loading...");
+ }
},
});
diff --git a/pkgs/core/server/prep-api-ts.ts b/pkgs/core/server/prep-api-ts.ts
index f41bf389..63f68e89 100644
--- a/pkgs/core/server/prep-api-ts.ts
+++ b/pkgs/core/server/prep-api-ts.ts
@@ -1,4 +1,4 @@
-import { spawnSync } from "bun";
+import { spawn, spawnSync } from "bun";
import { readAsync } from "fs-jetpack";
import { dir } from "../utils/dir";
import { g } from "../utils/global";
@@ -19,7 +19,7 @@ export const ${name} = {
await Bun.write(dir(`app/srv/exports.ts`), out.join(`\n`));
const targetFile = dir("app/srv/exports.d.ts");
- spawnSync(
+ const tsc = spawn(
[
dir("node_modules/.bin/tsc"),
dir("app/srv/exports.ts"),
@@ -33,6 +33,8 @@ export const ${name} = {
}
);
+ await tsc.exited;
+
let res = await readAsync(targetFile);
if (res) {
res = res.replace('export * from "@prisma/client";', "");
diff --git a/pkgs/core/utils/global.ts b/pkgs/core/utils/global.ts
index 77948f11..c3f73f39 100644
--- a/pkgs/core/utils/global.ts
+++ b/pkgs/core/utils/global.ts
@@ -11,6 +11,7 @@ type SingleRoute = {
};
export const g = global as unknown as {
+ status: "init" | "ready";
db: PrismaClient;
dburl: string;
mode: "dev" | "prod";