feat: handler

This commit is contained in:
Cristina Poncela Cubeiro
2026-06-18 13:14:01 +02:00
parent 5f60fc01d7
commit 83e8c3d39b
3 changed files with 113 additions and 2 deletions
+96
View File
@@ -0,0 +1,96 @@
import { randomUUID } from "node:crypto";
import type {
ErrorResponse,
InstanceSummary,
ListRequest,
ListResponse,
OrchestratorRequest,
OrchestratorResponse,
SpawnRequest,
SpawnResponse,
StatusRequest,
StatusResponse,
StopRequest,
StopResponse,
} from "./ipc/protocol.ts";
import { getInstance, loadInstances, removeInstance, upsertInstance } from "./storage.ts";
import type { InstanceRecord } from "./types.ts";
function toInstanceSummary(instance: InstanceRecord): InstanceSummary {
return {
id: instance.id,
status: instance.status,
cwd: instance.cwd,
label: instance.label,
sessionId: instance.sessionId,
};
}
function unknownInstanceError(instanceId: string): ErrorResponse {
return {
type: "error",
ok: false,
error: `Unknown instance: ${instanceId}`,
};
}
// Overhead types
export async function handleIpcRequest(request: SpawnRequest): Promise<SpawnResponse | ErrorResponse>;
export async function handleIpcRequest(request: ListRequest): Promise<ListResponse | ErrorResponse>;
export async function handleIpcRequest(request: StopRequest): Promise<StopResponse | ErrorResponse>;
export async function handleIpcRequest(request: StatusRequest): Promise<StatusResponse | ErrorResponse>;
export async function handleIpcRequest(request: OrchestratorRequest): Promise<OrchestratorResponse> {
switch (request.type) {
case "spawn": {
const instance: InstanceRecord = {
id: randomUUID(),
status: "starting",
cwd: request.cwd,
createdAt: new Date().toISOString(),
lastSeenAt: new Date().toISOString(),
label: request.label,
};
upsertInstance(instance);
return {
type: "spawn_result",
ok: true,
instance: toInstanceSummary(instance),
};
}
case "list": {
return {
type: "list_result",
ok: true,
instances: loadInstances().map(toInstanceSummary),
};
}
case "status": {
const instance = getInstance(request.instanceId);
if (!instance) {
return unknownInstanceError(request.instanceId);
}
return {
type: "status_result",
ok: true,
instance: toInstanceSummary(instance),
};
}
case "stop": {
const instance = getInstance(request.instanceId);
if (!instance) {
return unknownInstanceError(request.instanceId);
}
removeInstance(request.instanceId);
return {
type: "stop_result",
ok: true,
instanceId: request.instanceId,
};
}
}
}