MCPcopy
hub / github.com/Effect-TS/effect / spawn

Function spawn

packages/platform/src/internal/worker.ts:54–220  ·  view source on GitHub ↗
({
      encode,
      initialMessage
    }: Worker.Worker.Options<I>)

Source from the content-addressed store, hash-verified

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

Callers 1

runFunction · 0.85

Calls 14

completeMethod · 0.80
onErrorMethod · 0.80
failCauseMethod · 0.80
syncMethod · 0.80
clearMethod · 0.80
encodeFunction · 0.70
handleMessageFunction · 0.70
makeMethod · 0.65
pipeMethod · 0.65
addFinalizerMethod · 0.65
runMethod · 0.45
valuesMethod · 0.45

Tested by

no test coverage detected