global-lifecycle.ts 925 B

12345678910111213141516171819202122232425262728
  1. import { GlobalBus } from "@/bus/global"
  2. import { InstanceStore } from "@/project/instance-store"
  3. import { Effect } from "effect"
  4. import { Event } from "./event"
  5. export const emitGlobalDisposed = Effect.sync(() =>
  6. GlobalBus.emit("event", {
  7. directory: "global",
  8. payload: {
  9. type: Event.Disposed.type,
  10. properties: {},
  11. },
  12. }),
  13. )
  14. export const disposeAllInstancesAndEmitGlobalDisposed = Effect.fn("Server.disposeAllInstancesAndEmitGlobalDisposed")(
  15. function* (options?: { swallowErrors?: boolean }) {
  16. const store = yield* InstanceStore.Service
  17. yield* Effect.gen(function* () {
  18. yield* options?.swallowErrors
  19. ? store.disposeAll().pipe(Effect.catchCause((cause) => Effect.logWarning("global disposal failed", { cause })))
  20. : store.disposeAll()
  21. yield* emitGlobalDisposed
  22. }).pipe(Effect.uninterruptible)
  23. },
  24. )
  25. export * as GlobalLifecycle from "./global-lifecycle"