@fiyuu/runtime 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/bundler.d.ts +10 -0
  2. package/dist/bundler.d.ts.map +1 -0
  3. package/dist/bundler.js +125 -0
  4. package/dist/bundler.js.map +1 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +26 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/client-runtime.d.ts +16 -0
  10. package/dist/client-runtime.d.ts.map +1 -0
  11. package/dist/client-runtime.js +528 -0
  12. package/dist/client-runtime.js.map +1 -0
  13. package/dist/index.d.ts +5 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +5 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/inspector.d.ts +39 -0
  18. package/dist/inspector.d.ts.map +1 -0
  19. package/dist/inspector.js +262 -0
  20. package/dist/inspector.js.map +1 -0
  21. package/dist/server-devtools.d.ts +14 -0
  22. package/dist/server-devtools.d.ts.map +1 -0
  23. package/dist/server-devtools.js +123 -0
  24. package/dist/server-devtools.js.map +1 -0
  25. package/dist/server-loader.d.ts +40 -0
  26. package/dist/server-loader.d.ts.map +1 -0
  27. package/dist/server-loader.js +255 -0
  28. package/dist/server-loader.js.map +1 -0
  29. package/dist/server-middleware.d.ts +8 -0
  30. package/dist/server-middleware.d.ts.map +1 -0
  31. package/dist/server-middleware.js +50 -0
  32. package/dist/server-middleware.js.map +1 -0
  33. package/dist/server-private.d.ts +81 -0
  34. package/dist/server-private.d.ts.map +1 -0
  35. package/dist/server-private.js +225 -0
  36. package/dist/server-private.js.map +1 -0
  37. package/dist/server-renderer.d.ts +42 -0
  38. package/dist/server-renderer.d.ts.map +1 -0
  39. package/dist/server-renderer.js +255 -0
  40. package/dist/server-renderer.js.map +1 -0
  41. package/dist/server-router.d.ts +15 -0
  42. package/dist/server-router.d.ts.map +1 -0
  43. package/dist/server-router.js +68 -0
  44. package/dist/server-router.js.map +1 -0
  45. package/dist/server-types.d.ts +172 -0
  46. package/dist/server-types.d.ts.map +1 -0
  47. package/dist/server-types.js +6 -0
  48. package/dist/server-types.js.map +1 -0
  49. package/dist/server-utils.d.ts +17 -0
  50. package/dist/server-utils.d.ts.map +1 -0
  51. package/dist/server-utils.js +103 -0
  52. package/dist/server-utils.js.map +1 -0
  53. package/dist/server-websocket.d.ts +8 -0
  54. package/dist/server-websocket.d.ts.map +1 -0
  55. package/dist/server-websocket.js +56 -0
  56. package/dist/server-websocket.js.map +1 -0
  57. package/dist/server.d.ts +69 -0
  58. package/dist/server.d.ts.map +1 -0
  59. package/dist/server.js +859 -0
  60. package/dist/server.js.map +1 -0
  61. package/dist/service.d.ts +29 -0
  62. package/dist/service.d.ts.map +1 -0
  63. package/dist/service.js +74 -0
  64. package/dist/service.js.map +1 -0
  65. package/package.json +1 -1
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Pure utility functions for the Fiyuu runtime server.
3
+ * No dependencies on other server modules — safe to import anywhere.
4
+ */
5
+ import { createHash } from "node:crypto";
6
+ // ── HTML escaping ─────────────────────────────────────────────────────────────
7
+ export function escapeHtml(value) {
8
+ const text = value == null ? "" : String(value);
9
+ return text
10
+ .replaceAll("&", "&")
11
+ .replaceAll("<", "&lt;")
12
+ .replaceAll(">", "&gt;")
13
+ .replaceAll('"', "&quot;")
14
+ .replaceAll("'", "&#39;");
15
+ }
16
+ // ── Serialisation ─────────────────────────────────────────────────────────────
17
+ export function serialize(value) {
18
+ return JSON.stringify(value ?? null).replaceAll("<", "\\u003c");
19
+ }
20
+ // ── Request ID ────────────────────────────────────────────────────────────────
21
+ export function createRequestId() {
22
+ return `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
23
+ }
24
+ // ── Content negotiation ───────────────────────────────────────────────────────
25
+ export function prefersHtmlResponse(request) {
26
+ if ((request.url ?? "").startsWith("/api")) {
27
+ return false;
28
+ }
29
+ const accept = request.headers.accept ?? "";
30
+ if (accept.includes("application/json") && !accept.includes("text/html")) {
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ // ── Response helpers ──────────────────────────────────────────────────────────
36
+ export function sendJson(response, statusCode, value) {
37
+ response.statusCode = statusCode;
38
+ response.setHeader("content-type", "application/json; charset=utf-8");
39
+ response.end(`${JSON.stringify(value, null, 2)}\n`);
40
+ }
41
+ export function sendText(response, statusCode, message) {
42
+ response.statusCode = statusCode;
43
+ response.setHeader("content-type", "text/plain; charset=utf-8");
44
+ response.end(message);
45
+ }
46
+ export function sendXml(response, statusCode, xml) {
47
+ response.statusCode = statusCode;
48
+ response.setHeader("content-type", "application/xml; charset=utf-8");
49
+ response.end(xml);
50
+ }
51
+ export function createWeakEtag(value) {
52
+ const digest = createHash("sha1").update(value).digest("base64url");
53
+ return `W/\"${digest}\"`;
54
+ }
55
+ const MAX_BODY_BYTES = 1_048_576; // 1 MB
56
+ export async function parseRequestBody(request) {
57
+ const chunks = [];
58
+ let totalBytes = 0;
59
+ for await (const chunk of request) {
60
+ const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
61
+ totalBytes += buffer.byteLength;
62
+ if (totalBytes > MAX_BODY_BYTES) {
63
+ throw Object.assign(new Error("Request body too large (limit: 1 MB)."), { statusCode: 413 });
64
+ }
65
+ chunks.push(buffer);
66
+ }
67
+ const rawBody = Buffer.concat(chunks).toString("utf8").trim();
68
+ if (!rawBody) {
69
+ return {};
70
+ }
71
+ const contentType = request.headers["content-type"] ?? "";
72
+ if (contentType.includes("application/json")) {
73
+ const parsed = JSON.parse(rawBody);
74
+ // Reject prototype pollution attempts.
75
+ if (parsed !== null && typeof parsed === "object") {
76
+ const hasOwn = Object.prototype.hasOwnProperty;
77
+ if (hasOwn.call(parsed, "__proto__") ||
78
+ hasOwn.call(parsed, "constructor") ||
79
+ hasOwn.call(parsed, "prototype")) {
80
+ throw Object.assign(new Error("Request body contains forbidden keys."), { statusCode: 400 });
81
+ }
82
+ }
83
+ return parsed;
84
+ }
85
+ if (contentType.includes("application/x-www-form-urlencoded")) {
86
+ const entries = [...new URLSearchParams(rawBody).entries()].filter(([key]) => key !== "__proto__" && key !== "constructor" && key !== "prototype");
87
+ return Object.fromEntries(entries);
88
+ }
89
+ return { raw: rawBody };
90
+ }
91
+ // ── Server event log ──────────────────────────────────────────────────────────
92
+ export function pushServerEvent(state, level, event, details) {
93
+ state.serverEvents.unshift({
94
+ at: new Date().toISOString(),
95
+ level,
96
+ event,
97
+ details,
98
+ });
99
+ if (state.serverEvents.length > 120) {
100
+ state.serverEvents.length = 120;
101
+ }
102
+ }
103
+ //# sourceMappingURL=server-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-utils.js","sourceRoot":"","sources":["../src/server-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * WebSocket server attachment for the Fiyuu runtime.
3
+ * Wires up a ws.WebSocketServer on the HTTP server's upgrade event.
4
+ */
5
+ import { createServer } from "node:http";
6
+ import type { StartServerOptions } from "./server-types.js";
7
+ export declare function attachWebsocketServer(server: ReturnType<typeof createServer>, options: StartServerOptions, websocketPath: string, serverDirectory?: string): Promise<string | undefined>;
8
+ //# sourceMappingURL=server-websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-websocket.d.ts","sourceRoot":"","sources":["../src/server-websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EACvC,OAAO,EAAE,kBAAkB,EAC3B,aAAa,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqD7B"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * WebSocket server attachment for the Fiyuu runtime.
3
+ * Wires up a ws.WebSocketServer on the HTTP server's upgrade event.
4
+ */
5
+ import { existsSync } from "node:fs";
6
+ import path from "node:path";
7
+ import { WebSocketServer } from "ws";
8
+ import { importModule } from "./server-loader.js";
9
+ export async function attachWebsocketServer(server, options, websocketPath, serverDirectory) {
10
+ if (!options.config?.websocket?.enabled) {
11
+ return undefined;
12
+ }
13
+ const socketModulePath = path.join(options.rootDirectory, "server", "socket.ts");
14
+ const socketModule = existsSync(socketModulePath)
15
+ ? (await importModule(socketModulePath, options.mode, serverDirectory))
16
+ : null;
17
+ const registration = socketModule?.registerSocketServer?.() ?? {};
18
+ const wss = new WebSocketServer({
19
+ noServer: true,
20
+ maxPayload: options.config?.websocket?.maxPayloadBytes ?? 64 * 1024,
21
+ });
22
+ wss.on("connection", (socket) => {
23
+ socket.send(JSON.stringify({
24
+ type: "fiyuu:ready",
25
+ namespace: registration.namespace ?? "app",
26
+ events: registration.events ?? [],
27
+ }));
28
+ registration.onConnect?.(socket);
29
+ socket.on("message", (message) => {
30
+ registration.onMessage?.(socket, message.toString());
31
+ });
32
+ });
33
+ const handledSockets = new WeakSet();
34
+ server.on("upgrade", (request, socket, head) => {
35
+ if (handledSockets.has(socket))
36
+ return;
37
+ handledSockets.add(socket);
38
+ if (!request.url) {
39
+ socket.destroy();
40
+ return;
41
+ }
42
+ const url = new URL(request.url, "http://localhost");
43
+ if (url.pathname !== websocketPath)
44
+ return;
45
+ try {
46
+ wss.handleUpgrade(request, socket, head, (client) => {
47
+ wss.emit("connection", client, request);
48
+ });
49
+ }
50
+ catch {
51
+ // Another WebSocket handler already processed this socket
52
+ }
53
+ });
54
+ return `ws://localhost:${options.port ?? 4050}${websocketPath}`;
55
+ }
56
+ //# sourceMappingURL=server-websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-websocket.js","sourceRoot":"","sources":["../src/server-websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAuC,EACvC,OAA2B,EAC3B,aAAqB,EACrB,eAAwB;IAExB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,UAAU,CAAC,gBAAgB,CAAC;QAC/C,CAAC,CAAE,CAAC,MAAM,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAkB;QACzF,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,YAAY,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC;IAElE,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC;QAC9B,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,IAAI,EAAE,GAAG,IAAI;KACpE,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;QAC9B,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,KAAK;YAC1C,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;SAClC,CAAC,CACH,CAAC;QACF,YAAY,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YAC/B,YAAY,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,OAAO,EAAU,CAAC;IAE7C,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAc,EAAE,IAAI,EAAE,EAAE;QACrD,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QACvC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACrD,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa;YAAE,OAAO;QAE3C,IAAI,CAAC;YACH,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;gBAClD,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,kBAAkB,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,aAAa,EAAE,CAAC;AAClE,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Fiyuu runtime server — main orchestrator.
3
+ *
4
+ * This file wires together the modular pieces:
5
+ * server-types → shared interfaces
6
+ * server-utils → serialise, escapeHtml, sendJson/Text, parseBody, …
7
+ * server-router → buildRouteIndex, matchRoute
8
+ * server-loader → importModule, layout/meta loading, query cache, renderGeaComponent
9
+ * server-renderer → renderDocument, renderStatusPage, serveClientAsset, …
10
+ * server-devtools → renderUnifiedToolsScript (dev only)
11
+ * server-middleware→ runMiddleware
12
+ * server-websocket → attachWebsocketServer
13
+ */
14
+ import { type RenderMode } from "@fiyuu/core";
15
+ export type { StartServerOptions, StartedServer } from "./server-types.js";
16
+ import type { StartedServer, StartServerOptions } from "./server-types.js";
17
+ declare global {
18
+ interface Window {
19
+ __FIYUU_DATA__?: unknown;
20
+ __FIYUU_ROUTE__?: string;
21
+ __FIYUU_INTENT__?: string;
22
+ __FIYUU_RENDER__?: RenderMode;
23
+ __FIYUU_WS_PATH__?: string;
24
+ __FIYUU_DEVTOOLS__?: unknown;
25
+ fiyuu?: {
26
+ theme: {
27
+ get(): "light" | "dark";
28
+ set(value: "light" | "dark"): void;
29
+ toggle(): void;
30
+ bindToggle(elementId: string): void;
31
+ onChange(fn: (theme: "light" | "dark") => void): void;
32
+ };
33
+ bind(elementId: string, value?: unknown, asHtml?: boolean): void;
34
+ partial(elementId: string, url: string, options?: {
35
+ loading?: string;
36
+ }): Promise<void>;
37
+ onError(callback: (event: {
38
+ message: string;
39
+ error: Error | null;
40
+ source: string | null;
41
+ line: number | null;
42
+ }) => void): void;
43
+ state<T>(key: string, initialValue: T): {
44
+ get(): T;
45
+ set(value: T): void;
46
+ bind(elementId: string): object;
47
+ onChange(fn: (value: T) => void): object;
48
+ };
49
+ router: {
50
+ navigate(url: string): Promise<void>;
51
+ on(event: "navigate" | "before", fn: (detail: {
52
+ route: string;
53
+ render?: string;
54
+ title?: string;
55
+ }) => void | false): object;
56
+ };
57
+ ws(overridePath?: string): {
58
+ on(type: string, handler: (data: unknown) => void): object;
59
+ onOpen(handler: () => void): object;
60
+ onClose(handler: () => void): object;
61
+ onError(handler: () => void): object;
62
+ send(data: unknown): object;
63
+ status(): "connecting" | "connected" | "closed" | "unavailable";
64
+ };
65
+ };
66
+ }
67
+ }
68
+ export declare function startServer(options: StartServerOptions): Promise<StartedServer>;
69
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}