| 110 | ) |
| 111 | |
| 112 | const handleMessage = (response: Worker.Worker.Response<E, O>) => |
| 113 | Effect.suspend(() => { |
| 114 | const mailbox = requestMap.get(response[0]) |
| 115 | if (!mailbox) return Effect.void |
| 116 | |
| 117 | switch (response[1]) { |
| 118 | // data |
| 119 | case 0: { |
| 120 | return Deferred.DeferredTypeId in mailbox |
| 121 | ? Deferred.succeed(mailbox, response[2][0]) |
| 122 | : mailbox.offerAll(response[2]) |
| 123 | } |
| 124 | // end |
| 125 | case 1: { |
| 126 | if (response.length === 2) { |
| 127 | return Deferred.DeferredTypeId in mailbox |
| 128 | ? Deferred.interrupt(mailbox) |
| 129 | : mailbox.end |
| 130 | } |
| 131 | return Deferred.DeferredTypeId in mailbox |
| 132 | ? Deferred.succeed(mailbox, response[2][0]) |
| 133 | : Effect.zipRight(mailbox.offerAll(response[2]), mailbox.end) |
| 134 | } |
| 135 | // error / defect |
| 136 | case 2: |
| 137 | case 3: { |
| 138 | if (response[1] === 2) { |
| 139 | return Deferred.DeferredTypeId in mailbox |
| 140 | ? Deferred.fail(mailbox, response[2]) |
| 141 | : mailbox.fail(response[2]) |
| 142 | } |
| 143 | const cause = WorkerError.decodeCause(response[2]) |
| 144 | return Deferred.DeferredTypeId in mailbox |
| 145 | ? Deferred.failCause(mailbox, cause) |
| 146 | : mailbox.failCause(cause) |
| 147 | } |
| 148 | } |
| 149 | }) |
| 150 | |
| 151 | const executeAcquire = < |
| 152 | Q extends Mailbox.Mailbox<O, E | WorkerError> | Deferred.Deferred<O, E | WorkerError> |