Effect.async + Logger.replace hangs

Test case:

import { WebSocket } from 'ws'
jest.mock('ws')

const testProgram = Effect.scoped(
  Effect.gen(function* () {
    const v = yield* Effect.async<string>((resume) => {
      const ws = new WebSocket('hi')

      ws.on('open', () => {
        resume(Effect.succeed('hi'))
      })
    })

    return v
  }).pipe(
    Effect.provide(
      Logger.replace(
        Logger.defaultLogger,
        Logger.make(({ message }) => console.log(message)),
      ),
    ),
  ),
)

it('establishes', async () => {
  const s = Effect.runPromise(testProgram)

  listenerFor('open')?.()

  expect(await s).toEqual('hi')
})

const listenerFor = (event: string) => {
  const call = jest
    .mocked(WebSocket.prototype.on)
    .mock.calls.find((c) => c[0] === event) as
    | [string, (...args: unknown[]) => void]
    | undefined
  if (!call) return undefined
  const [, listener] = call
  return listener
}


This times out for me. If I comment out the .pipe(Effect.provide(...)), it passes. What could be going on here?
Was this page helpful?