76 lines · 1.4 KB · TypeScript
RawDownload
import { BusEvent } from "@/bus/bus-event"import { Bus } from "@/bus"import { Instance } from "@/project/instance"import z from "zod" export namespace SessionStatus {  export const Info = z    .union([      z.object({        type: z.literal("idle"),      }),      z.object({        type: z.literal("retry"),        attempt: z.number(),        message: z.string(),        next: z.number(),      }),      z.object({        type: z.literal("busy"),      }),    ])    .meta({      ref: "SessionStatus",    })  export type Info = z.infer<typeof Info>   export const Event = {    Status: BusEvent.define(      "session.status",      z.object({        sessionID: z.string(),        status: Info,      }),    ),    // deprecated    Idle: BusEvent.define(      "session.idle",      z.object({        sessionID: z.string(),      }),    ),  }   const state = Instance.state(() => {    const data: Record<string, Info> = {}    return data  })   export function get(sessionID: string) {    return (      state()[sessionID] ?? {        type: "idle",      }    )  }   export function list() {    return state()  }   export function set(sessionID: string, status: Info) {    Bus.publish(Event.Status, {      sessionID,      status,    })    if (status.type === "idle") {      // deprecated      Bus.publish(Event.Idle, {        sessionID,      })      delete state()[sessionID]      return    }    state()[sessionID] = status  }}