pid1 0.0.0-dev.0 → 0.0.0-dev.3

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 (42) hide show
  1. package/README.md +45 -0
  2. package/dist/cli.mjs +1147 -100
  3. package/dist/cli.mjs.map +1 -1
  4. package/dist/client.d.mts +169 -2
  5. package/dist/client.d.mts.map +1 -0
  6. package/dist/client.mjs +6 -3
  7. package/dist/client.mjs.map +1 -1
  8. package/dist/index.d.mts +226 -32
  9. package/dist/index.d.mts.map +1 -1
  10. package/dist/index.mjs +9 -4
  11. package/dist/index.mjs.map +1 -0
  12. package/dist/logger-BN9KoHBY.mjs +926 -0
  13. package/dist/logger-BN9KoHBY.mjs.map +1 -0
  14. package/dist/task-list-zO8UZG5r.d.mts +231 -0
  15. package/dist/task-list-zO8UZG5r.d.mts.map +1 -0
  16. package/package.json +18 -19
  17. package/src/api/client.ts +7 -14
  18. package/src/api/contract.ts +117 -0
  19. package/src/api/server.ts +171 -57
  20. package/src/cli.ts +444 -150
  21. package/src/cron-process.ts +255 -0
  22. package/src/env-manager.ts +237 -0
  23. package/src/index.ts +12 -14
  24. package/src/lazy-process.ts +198 -0
  25. package/src/logger.ts +90 -137
  26. package/src/manager.ts +859 -0
  27. package/src/restarting-process.ts +397 -0
  28. package/src/task-list.ts +236 -0
  29. package/dist/client-Bdt88RU-.d.mts +0 -217
  30. package/dist/client-Bdt88RU-.d.mts.map +0 -1
  31. package/dist/config-BgRb4pSG.mjs +0 -186
  32. package/dist/config-BgRb4pSG.mjs.map +0 -1
  33. package/dist/config.d.mts +0 -84
  34. package/dist/config.d.mts.map +0 -1
  35. package/dist/config.mjs +0 -3
  36. package/dist/process-manager-gO56266Q.mjs +0 -643
  37. package/dist/process-manager-gO56266Q.mjs.map +0 -1
  38. package/src/api/router.ts +0 -150
  39. package/src/config.ts +0 -89
  40. package/src/env.ts +0 -74
  41. package/src/exec.ts +0 -85
  42. package/src/process-manager.ts +0 -632
package/src/api/server.ts CHANGED
@@ -1,66 +1,180 @@
1
- import { Hono } from "hono";
2
- import { serve } from "@hono/node-server";
3
- import { RPCHandler } from "@orpc/server/fetch";
4
- import { onError } from "@orpc/server";
5
- import { router } from "./router.ts";
6
- import type { ProcessManager } from "../process-manager.ts";
7
- import { globalLogger } from "../logger.ts";
8
- import { logger as honoLogger } from "hono/logger";
9
-
10
- export type ServerOptions = {
11
- port?: number;
12
- host?: string;
13
- };
14
-
15
- export function createServer(pm: ProcessManager, options: ServerOptions = {}) {
16
- const { port = 3000, host = "127.0.0.1" } = options;
17
- const logger = globalLogger.child("server");
18
-
19
- const app = new Hono();
20
-
21
- const handler = new RPCHandler(router, {
22
- interceptors: [
23
- onError((error: unknown) => {
24
- const message = error instanceof Error ? error.message : String(error);
25
- logger.error(`RPC Error: ${message}`);
26
- }),
27
- ],
28
- });
1
+ import { implement } from "@orpc/server";
2
+ import {
3
+ api,
4
+ type RestartingProcessInfo,
5
+ type CronProcessInfo,
6
+ type TaskEntryInfo,
7
+ type ManagerStatus,
8
+ } from "./contract.ts";
9
+ import type { Manager } from "../manager.ts";
10
+ import type { RestartingProcess } from "../restarting-process.ts";
11
+ import type { CronProcess } from "../cron-process.ts";
12
+
13
+ const os = implement(api).$context<{ manager: Manager }>();
14
+
15
+ // Helper to serialize a RestartingProcess to API response
16
+ function serializeProcess(proc: RestartingProcess): RestartingProcessInfo {
17
+ return {
18
+ name: proc.name,
19
+ state: proc.state,
20
+ restarts: proc.restarts,
21
+ };
22
+ }
23
+
24
+ // Helper to serialize a CronProcess to API response
25
+ function serializeCron(cron: CronProcess): CronProcessInfo {
26
+ return {
27
+ name: cron.name,
28
+ state: cron.state,
29
+ runCount: cron.runCount,
30
+ failCount: cron.failCount,
31
+ nextRun: cron.nextRun?.toISOString() ?? null,
32
+ };
33
+ }
34
+
35
+ // Manager handlers
36
+ const managerStatus = os.manager.status.handler(async ({ context }): Promise<ManagerStatus> => {
37
+ const manager = context.manager;
38
+ const taskList = manager.getTaskList();
39
+ return {
40
+ state: manager.state,
41
+ processCount: manager.getRestartingProcesses().size,
42
+ cronCount: manager.getCronProcesses().size,
43
+ taskCount: taskList?.tasks.length ?? 0,
44
+ };
45
+ });
29
46
 
30
- app.use(
31
- honoLogger((msg, ...args) => logger.debug(`${msg} ${args.join(" ")}`)),
32
- );
47
+ // Processes handlers
48
+ const getProcess = os.processes.get.handler(async ({ input, context }) => {
49
+ const proc = context.manager.getProcessByTarget(input.target);
50
+ if (!proc) {
51
+ throw new Error(`Process not found: ${input.target}`);
52
+ }
53
+ return serializeProcess(proc);
54
+ });
33
55
 
34
- app.get("/health", (c) => c.json({ status: "ok" }));
56
+ const listProcesses = os.processes.list.handler(async ({ context }) => {
57
+ const processes = Array.from(context.manager.getRestartingProcesses().values());
58
+ return processes.map(serializeProcess);
59
+ });
35
60
 
36
- app.use("/rpc/*", async (c, next) => {
37
- const { matched, response } = await handler.handle(c.req.raw, {
38
- prefix: "/rpc",
39
- context: { pm },
40
- });
61
+ const addProcess = os.processes.add.handler(async ({ input, context }) => {
62
+ const proc = context.manager.addProcess(input.name, input.definition);
63
+ return serializeProcess(proc);
64
+ });
41
65
 
42
- if (matched) {
43
- return c.newResponse(response.body, response);
44
- }
66
+ const startProcess = os.processes.start.handler(async ({ input, context }) => {
67
+ const proc = context.manager.startProcessByTarget(input.target);
68
+ return serializeProcess(proc);
69
+ });
45
70
 
46
- await next();
71
+ const stopProcess = os.processes.stop.handler(async ({ input, context }) => {
72
+ const proc = await context.manager.stopProcessByTarget(input.target);
73
+ return serializeProcess(proc);
74
+ });
75
+
76
+ const restartProcess = os.processes.restart.handler(async ({ input, context }) => {
77
+ const proc = await context.manager.restartProcessByTarget(input.target, input.force);
78
+ return serializeProcess(proc);
79
+ });
80
+
81
+ const reloadProcess = os.processes.reload.handler(async ({ input, context }) => {
82
+ const proc = await context.manager.reloadProcessByTarget(input.target, input.definition, {
83
+ restartImmediately: input.restartImmediately,
47
84
  });
85
+ return serializeProcess(proc);
86
+ });
48
87
 
49
- app.notFound((c) => c.json({ error: "Not found" }, 404));
88
+ const removeProcess = os.processes.remove.handler(async ({ input, context }) => {
89
+ await context.manager.removeProcessByTarget(input.target);
90
+ return { success: true };
91
+ });
50
92
 
51
- return {
52
- app,
53
- start: () => {
54
- const server = serve({
55
- fetch: app.fetch,
56
- port,
57
- hostname: host,
58
- });
59
-
60
- logger.info(`HTTP server listening on http://${host}:${port}`);
61
- return server;
62
- },
63
- };
64
- }
93
+ // Crons handlers
94
+ const getCron = os.crons.get.handler(async ({ input, context }) => {
95
+ const cron = context.manager.getCronByTarget(input.target);
96
+ if (!cron) {
97
+ throw new Error(`Cron not found: ${input.target}`);
98
+ }
99
+ return serializeCron(cron);
100
+ });
101
+
102
+ const listCrons = os.crons.list.handler(async ({ context }) => {
103
+ const crons = Array.from(context.manager.getCronProcesses().values());
104
+ return crons.map(serializeCron);
105
+ });
106
+
107
+ const triggerCron = os.crons.trigger.handler(async ({ input, context }) => {
108
+ const cron = await context.manager.triggerCronByTarget(input.target);
109
+ return serializeCron(cron);
110
+ });
111
+
112
+ const startCron = os.crons.start.handler(async ({ input, context }) => {
113
+ const cron = context.manager.startCronByTarget(input.target);
114
+ return serializeCron(cron);
115
+ });
116
+
117
+ const stopCron = os.crons.stop.handler(async ({ input, context }) => {
118
+ const cron = await context.manager.stopCronByTarget(input.target);
119
+ return serializeCron(cron);
120
+ });
121
+
122
+ // Tasks handlers
123
+ const getTask = os.tasks.get.handler(async ({ input, context }) => {
124
+ const task = context.manager.getTaskByTarget(input.target);
125
+ if (!task) {
126
+ throw new Error(`Task not found: ${input.target}`);
127
+ }
128
+ return task as TaskEntryInfo;
129
+ });
130
+
131
+ const listTasks = os.tasks.list.handler(async ({ context }) => {
132
+ const taskList = context.manager.getTaskList();
133
+ if (!taskList) {
134
+ return [];
135
+ }
136
+ return taskList.tasks.map((t) => ({
137
+ id: t.id,
138
+ state: t.state,
139
+ processNames: t.processes.map((p) => p.name),
140
+ })) as TaskEntryInfo[];
141
+ });
142
+
143
+ const addTask = os.tasks.add.handler(async ({ input, context }) => {
144
+ const task = context.manager.addTask(input.name, input.definition);
145
+ return task as TaskEntryInfo;
146
+ });
147
+
148
+ const removeTask = os.tasks.remove.handler(async ({ input, context }) => {
149
+ const task = context.manager.removeTaskByTarget(input.target);
150
+ return task as TaskEntryInfo;
151
+ });
65
152
 
66
- export type { Router } from "./router.ts";
153
+ export const router = os.router({
154
+ manager: {
155
+ status: managerStatus,
156
+ },
157
+ processes: {
158
+ add: addProcess,
159
+ get: getProcess,
160
+ list: listProcesses,
161
+ start: startProcess,
162
+ stop: stopProcess,
163
+ restart: restartProcess,
164
+ reload: reloadProcess,
165
+ remove: removeProcess,
166
+ },
167
+ crons: {
168
+ get: getCron,
169
+ list: listCrons,
170
+ trigger: triggerCron,
171
+ start: startCron,
172
+ stop: stopCron,
173
+ },
174
+ tasks: {
175
+ get: getTask,
176
+ list: listTasks,
177
+ add: addTask,
178
+ remove: removeTask,
179
+ },
180
+ });