({
encode,
initialMessage
}: Worker.Worker.Options<I>)
| 52 | return WorkerManager.of({ |
| 53 | [WorkerManagerTypeId]: WorkerManagerTypeId, |
| 54 | spawn<I, O, E>({ |
| 55 | encode, |
| 56 | initialMessage |
| 57 | }: Worker.Worker.Options<I>) { |
| 58 | return Effect.gen(function*() { |
| 59 | const id = idCounter++ |
| 60 | let requestIdCounter = 0 |
| 61 | const requestMap = new Map< |
| 62 | number, |
| 63 | Mailbox.Mailbox<O, E | WorkerError> | Deferred.Deferred<O, E | WorkerError> |
| 64 | >() |
| 65 | |
| 66 | const collector = Transferable.unsafeMakeCollector() |
| 67 | const wrappedEncode = encode ? |
| 68 | ((message: I) => |
| 69 | Effect.zipRight( |
| 70 | collector.clear, |
| 71 | Effect.provideService(encode(message), Transferable.Collector, collector) |
| 72 | )) : |
| 73 | Effect.succeed |
| 74 | |
| 75 | const readyLatch = yield* Deferred.make<void>() |
| 76 | const backing = yield* platform.spawn<Worker.Worker.Request, Worker.Worker.Response<E, O>>(id) |
| 77 | |
| 78 | yield* backing.run((message) => { |
| 79 | if (message[0] === 0) { |
| 80 | return Deferred.complete(readyLatch, Effect.void) |
| 81 | } |
| 82 | return handleMessage(message[1]) |
| 83 | }).pipe( |
| 84 | Effect.onError((cause) => |
| 85 | Effect.forEach(requestMap.values(), (mailbox) => |
| 86 | Deferred.DeferredTypeId in mailbox |
| 87 | ? Deferred.failCause(mailbox, cause) |
| 88 | : mailbox.failCause(cause)) |
| 89 | ), |
| 90 | Effect.tapErrorCause(Effect.logWarning), |
| 91 | Effect.retry(Schedule.spaced(1000)), |
| 92 | Effect.annotateLogs({ |
| 93 | package: "@effect/platform", |
| 94 | module: "Worker" |
| 95 | }), |
| 96 | Effect.interruptible, |
| 97 | Effect.forkScoped |
| 98 | ) |
| 99 | |
| 100 | yield* Effect.addFinalizer(() => |
| 101 | Effect.zipRight( |
| 102 | Effect.forEach(requestMap.values(), (mailbox) => |
| 103 | Deferred.DeferredTypeId in mailbox |
| 104 | ? Deferred.interrupt(mailbox) |
| 105 | : mailbox.end, { |
| 106 | discard: true |
| 107 | }), |
| 108 | Effect.sync(() => requestMap.clear()) |
| 109 | ) |
| 110 | ) |
| 111 |
no test coverage detected