@fiyuu/runtime 0.1.0
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.
- package/LICENSE +674 -0
- package/README.md +194 -0
- package/package.json +23 -0
- package/src/bundler.d.ts +9 -0
- package/src/bundler.js +124 -0
- package/src/cli.d.ts +2 -0
- package/src/cli.js +25 -0
- package/src/client-runtime.d.ts +15 -0
- package/src/client-runtime.js +527 -0
- package/src/index.d.ts +4 -0
- package/src/index.js +4 -0
- package/src/inspector.d.ts +38 -0
- package/src/inspector.js +261 -0
- package/src/server-devtools.d.ts +13 -0
- package/src/server-devtools.js +122 -0
- package/src/server-loader.d.ts +26 -0
- package/src/server-loader.js +158 -0
- package/src/server-middleware.d.ts +7 -0
- package/src/server-middleware.js +49 -0
- package/src/server-renderer.d.ts +34 -0
- package/src/server-renderer.js +213 -0
- package/src/server-router.d.ts +14 -0
- package/src/server-router.js +67 -0
- package/src/server-types.d.ts +167 -0
- package/src/server-types.js +5 -0
- package/src/server-utils.d.ts +15 -0
- package/src/server-utils.js +97 -0
- package/src/server-websocket.d.ts +7 -0
- package/src/server-websocket.js +55 -0
- package/src/server.d.ts +68 -0
- package/src/server.js +779 -0
- package/src/service.d.ts +28 -0
- package/src/service.js +71 -0
package/src/service.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { FiyuuDB } from "@fiyuu/db";
|
|
2
|
+
import type { FiyuuRealtime } from "@fiyuu/realtime";
|
|
3
|
+
import type { FiyuuConfig } from "@fiyuu/core";
|
|
4
|
+
export interface ServiceContext {
|
|
5
|
+
db: FiyuuDB;
|
|
6
|
+
realtime: FiyuuRealtime;
|
|
7
|
+
config: FiyuuConfig;
|
|
8
|
+
log: (level: "info" | "warn" | "error", msg: string, data?: unknown) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface FiyuuService {
|
|
11
|
+
name: string;
|
|
12
|
+
start(ctx: ServiceContext): Promise<void> | void;
|
|
13
|
+
stop?(ctx: ServiceContext): Promise<void> | void;
|
|
14
|
+
}
|
|
15
|
+
export declare function defineService(service: FiyuuService): FiyuuService;
|
|
16
|
+
export declare class ServiceManager {
|
|
17
|
+
private services;
|
|
18
|
+
private context;
|
|
19
|
+
private started;
|
|
20
|
+
setContext(ctx: ServiceContext): void;
|
|
21
|
+
register(service: FiyuuService): void;
|
|
22
|
+
startAll(): Promise<void>;
|
|
23
|
+
stopAll(): Promise<void>;
|
|
24
|
+
list(): string[];
|
|
25
|
+
get count(): number;
|
|
26
|
+
get isRunning(): boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function createServiceManager(): ServiceManager;
|
package/src/service.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export function defineService(service) {
|
|
2
|
+
if (!service.name || service.name.trim().length === 0) {
|
|
3
|
+
throw new Error("Service must have a non-empty name.");
|
|
4
|
+
}
|
|
5
|
+
if (typeof service.start !== "function") {
|
|
6
|
+
throw new Error(`Service "${service.name}" must have a start() function.`);
|
|
7
|
+
}
|
|
8
|
+
return service;
|
|
9
|
+
}
|
|
10
|
+
export class ServiceManager {
|
|
11
|
+
services = [];
|
|
12
|
+
context = null;
|
|
13
|
+
started = false;
|
|
14
|
+
setContext(ctx) {
|
|
15
|
+
this.context = ctx;
|
|
16
|
+
}
|
|
17
|
+
register(service) {
|
|
18
|
+
if (this.services.some((s) => s.name === service.name)) {
|
|
19
|
+
throw new Error(`Service "${service.name}" is already registered.`);
|
|
20
|
+
}
|
|
21
|
+
this.services.push(service);
|
|
22
|
+
}
|
|
23
|
+
async startAll() {
|
|
24
|
+
if (!this.context)
|
|
25
|
+
throw new Error("ServiceManager context not set. Call setContext() first.");
|
|
26
|
+
this.started = true;
|
|
27
|
+
for (const service of this.services) {
|
|
28
|
+
try {
|
|
29
|
+
this.context.log("info", `service.start`, { name: service.name });
|
|
30
|
+
await service.start(this.context);
|
|
31
|
+
this.context.log("info", `service.started`, { name: service.name });
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
35
|
+
this.context.log("error", `service.start.error`, { name: service.name, error: msg });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async stopAll() {
|
|
40
|
+
if (!this.context || !this.started)
|
|
41
|
+
return;
|
|
42
|
+
// Stop in reverse order
|
|
43
|
+
for (let i = this.services.length - 1; i >= 0; i--) {
|
|
44
|
+
const service = this.services[i];
|
|
45
|
+
if (service.stop) {
|
|
46
|
+
try {
|
|
47
|
+
this.context.log("info", `service.stop`, { name: service.name });
|
|
48
|
+
await service.stop(this.context);
|
|
49
|
+
this.context.log("info", `service.stopped`, { name: service.name });
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
53
|
+
this.context.log("error", `service.stop.error`, { name: service.name, error: msg });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
this.started = false;
|
|
58
|
+
}
|
|
59
|
+
list() {
|
|
60
|
+
return this.services.map((s) => s.name);
|
|
61
|
+
}
|
|
62
|
+
get count() {
|
|
63
|
+
return this.services.length;
|
|
64
|
+
}
|
|
65
|
+
get isRunning() {
|
|
66
|
+
return this.started;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function createServiceManager() {
|
|
70
|
+
return new ServiceManager();
|
|
71
|
+
}
|