websocket.ts 929 B

1234567891011121314151617181920212223242526
  1. import { Effect } from "effect"
  2. export function availableEndpoint() {
  3. const server = Bun.serve({ hostname: "127.0.0.1", port: 0, fetch: () => new Response() })
  4. const endpoint = `ws://127.0.0.1:${server.port}`
  5. server.stop(true)
  6. return endpoint
  7. }
  8. export function connect(endpoint: string) {
  9. return Effect.acquireRelease(
  10. Effect.callback<WebSocket, Error>((resume) => {
  11. const socket = new WebSocket(endpoint)
  12. const open = () => resume(Effect.succeed(socket))
  13. const error = () => resume(Effect.fail(new Error(`Failed to connect to ${endpoint}`)))
  14. socket.addEventListener("open", open, { once: true })
  15. socket.addEventListener("error", error, { once: true })
  16. return Effect.sync(() => {
  17. socket.removeEventListener("open", open)
  18. socket.removeEventListener("error", error)
  19. socket.close()
  20. })
  21. }),
  22. (socket) => Effect.sync(() => socket.close()),
  23. )
  24. }