status.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { BusEvent } from "@/bus/bus-event"
  2. import { Bus } from "@/bus"
  3. import { Instance } from "@/project/instance"
  4. import z from "zod"
  5. export namespace SessionStatus {
  6. export const Info = z
  7. .union([
  8. z.object({
  9. type: z.literal("idle"),
  10. }),
  11. z.object({
  12. type: z.literal("retry"),
  13. attempt: z.number(),
  14. message: z.string(),
  15. next: z.number(),
  16. }),
  17. z.object({
  18. type: z.literal("busy"),
  19. }),
  20. ])
  21. .meta({
  22. ref: "SessionStatus",
  23. })
  24. export type Info = z.infer<typeof Info>
  25. export const Event = {
  26. Status: BusEvent.define(
  27. "session.status",
  28. z.object({
  29. sessionID: z.string(),
  30. status: Info,
  31. }),
  32. ),
  33. // deprecated
  34. Idle: BusEvent.define(
  35. "session.idle",
  36. z.object({
  37. sessionID: z.string(),
  38. }),
  39. ),
  40. }
  41. const state = Instance.state(() => {
  42. const data: Record<string, Info> = {}
  43. return data
  44. })
  45. export function get(sessionID: string) {
  46. return (
  47. state()[sessionID] ?? {
  48. type: "idle",
  49. }
  50. )
  51. }
  52. export function list() {
  53. return state()
  54. }
  55. export function set(sessionID: string, status: Info) {
  56. Bus.publish(Event.Status, {
  57. sessionID,
  58. status,
  59. })
  60. if (status.type === "idle") {
  61. // deprecated
  62. Bus.publish(Event.Idle, {
  63. sessionID,
  64. })
  65. delete state()[sessionID]
  66. return
  67. }
  68. state()[sessionID] = status
  69. }
  70. }