const postMessages = (worker: Worker | MessagePort) =>
pipe(
semaphore.take(1),
Effect.zipRight(outbound.take),
Effect.tap(([request, deferred]) =>
Effect.sync(() => {
const id = idCounter++
requestMap.set(id, deferred)
return worker.postMessage(
[id, payload(request)],
transferables(request),
)
}),
),
Effect.tap(([, deferred]) =>
pipe(
Effect.ignore(Deferred.await(deferred)),
Effect.zipRight(semaphore.release(1)),
Effect.fork,
),
),
Effect.catchAllCause(() => semaphore.release(1)),
Effect.forever,
)
const postMessages = (worker: Worker | MessagePort) =>
pipe(
semaphore.take(1),
Effect.zipRight(outbound.take),
Effect.tap(([request, deferred]) =>
Effect.sync(() => {
const id = idCounter++
requestMap.set(id, deferred)
return worker.postMessage(
[id, payload(request)],
transferables(request),
)
}),
),
Effect.tap(([, deferred]) =>
pipe(
Effect.ignore(Deferred.await(deferred)),
Effect.zipRight(semaphore.release(1)),
Effect.fork,
),
),
Effect.catchAllCause(() => semaphore.release(1)),
Effect.forever,
)