@effect/platform 0.21.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Http/App/dist/effect-platform-Http-App.cjs.dev.js +22 -1
- package/Http/App/dist/effect-platform-Http-App.cjs.mjs +1 -0
- package/Http/App/dist/effect-platform-Http-App.cjs.prod.js +22 -1
- package/Http/App/dist/effect-platform-Http-App.esm.js +21 -1
- package/Http/Client/dist/effect-platform-Http-Client.cjs.dev.js +12 -12
- package/Http/Client/dist/effect-platform-Http-Client.cjs.mjs +2 -2
- package/Http/Client/dist/effect-platform-Http-Client.cjs.prod.js +12 -12
- package/Http/Client/dist/effect-platform-Http-Client.esm.js +12 -12
- package/Http/ClientRequest/dist/effect-platform-Http-ClientRequest.esm.js +2 -2
- package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.dev.js +5 -13
- package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.mjs +0 -2
- package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.prod.js +5 -13
- package/Http/Middleware/dist/effect-platform-Http-Middleware.esm.js +7 -13
- package/Http/Router/dist/effect-platform-Http-Router.cjs.dev.js +1 -1
- package/Http/Router/dist/effect-platform-Http-Router.cjs.prod.js +1 -1
- package/Http/Router/dist/effect-platform-Http-Router.esm.js +3 -3
- package/Http/ServerError/dist/effect-platform-Http-ServerError.esm.js +1 -1
- package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.cjs.dev.js +1 -1
- package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.cjs.prod.js +1 -1
- package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.esm.js +2 -2
- package/Http/ServerResponse/dist/effect-platform-Http-ServerResponse.esm.js +1 -1
- package/HttpClient/dist/effect-platform-HttpClient.cjs.dev.js +5 -5
- package/HttpClient/dist/effect-platform-HttpClient.cjs.prod.js +5 -5
- package/HttpClient/dist/effect-platform-HttpClient.esm.js +6 -6
- package/HttpServer/dist/effect-platform-HttpServer.cjs.dev.js +12 -11
- package/HttpServer/dist/effect-platform-HttpServer.cjs.prod.js +12 -11
- package/HttpServer/dist/effect-platform-HttpServer.esm.js +14 -13
- package/Worker/dist/effect-platform-Worker.cjs.d.mts +2 -0
- package/Worker/dist/effect-platform-Worker.cjs.d.mts.map +1 -0
- package/Worker/dist/effect-platform-Worker.cjs.d.ts +2 -0
- package/Worker/dist/effect-platform-Worker.cjs.d.ts.map +1 -0
- package/Worker/dist/effect-platform-Worker.cjs.dev.js +291 -0
- package/Worker/dist/effect-platform-Worker.cjs.js +7 -0
- package/Worker/dist/effect-platform-Worker.cjs.mjs +10 -0
- package/Worker/dist/effect-platform-Worker.cjs.prod.js +291 -0
- package/Worker/dist/effect-platform-Worker.esm.js +252 -0
- package/Worker/package.json +4 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.d.mts +2 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.d.mts.map +1 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.d.ts +2 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.d.ts.map +1 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.dev.js +65 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.js +7 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.mjs +4 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.prod.js +65 -0
- package/WorkerError/dist/effect-platform-WorkerError.esm.js +40 -0
- package/WorkerError/package.json +4 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.mts +2 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.mts.map +1 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.ts +2 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.ts.map +1 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.dev.js +129 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.js +7 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.mjs +5 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.prod.js +129 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.esm.js +97 -0
- package/WorkerRunner/package.json +4 -0
- package/dist/{App-1ca51fa7.esm.js → App-2d206a13.esm.js} +9 -1
- package/dist/{App-d8b904fa.cjs.prod.js → App-7ef679dc.cjs.prod.js} +9 -0
- package/dist/{App-18152f12.cjs.dev.js → App-bad10dc1.cjs.dev.js} +9 -0
- package/dist/{Client-3938c9f5.cjs.dev.js → Client-0146412d.cjs.dev.js} +16 -19
- package/dist/{Client-e8ebeb3a.esm.js → Client-4f8f804b.esm.js} +18 -21
- package/dist/{Client-5497adf2.cjs.prod.js → Client-e9835f16.cjs.prod.js} +16 -19
- package/dist/{ClientRequest-490c76cd.esm.js → ClientRequest-27630c54.esm.js} +1 -1
- package/dist/Middleware-934a0c8f.esm.js +41 -0
- package/dist/Middleware-a2c50c35.cjs.dev.js +46 -0
- package/dist/Middleware-e53794a3.cjs.prod.js +46 -0
- package/dist/{Router-3112d780.esm.js → Router-2505b5dd.esm.js} +2 -2
- package/dist/{Router-2c0b718b.cjs.prod.js → Router-3645c2b3.cjs.prod.js} +3 -3
- package/dist/{Router-06c5cb9a.cjs.dev.js → Router-b9feed01.cjs.dev.js} +3 -3
- package/dist/{ServerError-04ad5b57.esm.js → ServerError-97730ed2.esm.js} +1 -1
- package/dist/{ServerRequest-41c7e979.esm.js → ServerRequest-078a4bb2.esm.js} +2 -2
- package/dist/ServerRequest-705b12bb.cjs.prod.js +2 -2
- package/dist/ServerRequest-8e9629a5.cjs.dev.js +2 -2
- package/dist/{ServerResponse-03c252ea.esm.js → ServerResponse-de572c21.esm.js} +1 -1
- package/dist/{clientRequest-6121a7f6.esm.js → clientRequest-fe7578cf.esm.js} +1 -1
- package/dist/declarations/src/Error.d.ts +1 -1
- package/dist/declarations/src/Error.d.ts.map +1 -1
- package/dist/declarations/src/Http/App.d.ts +5 -0
- package/dist/declarations/src/Http/App.d.ts.map +1 -1
- package/dist/declarations/src/Http/Client.d.ts +5 -6
- package/dist/declarations/src/Http/Client.d.ts.map +1 -1
- package/dist/declarations/src/Http/Middleware.d.ts +0 -10
- package/dist/declarations/src/Http/Middleware.d.ts.map +1 -1
- package/dist/declarations/src/Worker.d.ts +170 -0
- package/dist/declarations/src/Worker.d.ts.map +1 -0
- package/dist/declarations/src/WorkerError.d.ts +30 -0
- package/dist/declarations/src/WorkerError.d.ts.map +1 -0
- package/dist/declarations/src/WorkerRunner.d.ts +72 -0
- package/dist/declarations/src/WorkerRunner.d.ts.map +1 -0
- package/dist/declarations/src/index.d.ts +12 -0
- package/dist/declarations/src/index.d.ts.map +1 -1
- package/dist/effect-platform.cjs.dev.js +9 -0
- package/dist/effect-platform.cjs.mjs +4 -1
- package/dist/effect-platform.cjs.prod.js +9 -0
- package/dist/effect-platform.esm.js +6 -0
- package/dist/middleware-85768a1e.cjs.prod.js +66 -0
- package/dist/middleware-98794cc2.cjs.dev.js +66 -0
- package/dist/middleware-ea618e68.esm.js +41 -0
- package/package.json +24 -3
- package/src/Error.ts +1 -1
- package/src/Http/App.ts +9 -0
- package/src/Http/Client.ts +10 -8
- package/src/Http/Middleware.ts +0 -12
- package/src/Worker.ts +207 -0
- package/src/WorkerError.ts +34 -0
- package/src/WorkerRunner.ts +83 -0
- package/src/index.ts +15 -0
- package/src/internal/http/client.ts +33 -33
- package/src/internal/http/middleware.ts +4 -26
- package/src/internal/worker.ts +262 -0
- package/src/internal/workerError.ts +16 -0
- package/src/internal/workerRunner.ts +83 -0
- package/dist/Middleware-04ddadf1.esm.js +0 -100
- package/dist/Middleware-3e264366.cjs.dev.js +0 -127
- package/dist/Middleware-8b05423d.cjs.prod.js +0 -127
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import * as Context from "effect/Context"
|
|
2
|
+
import * as Deferred from "effect/Deferred"
|
|
3
|
+
import * as Effect from "effect/Effect"
|
|
4
|
+
import * as Exit from "effect/Exit"
|
|
5
|
+
import * as Fiber from "effect/Fiber"
|
|
6
|
+
import { pipe } from "effect/Function"
|
|
7
|
+
import * as Layer from "effect/Layer"
|
|
8
|
+
import * as Pool from "effect/Pool"
|
|
9
|
+
import * as Queue from "effect/Queue"
|
|
10
|
+
import * as Stream from "effect/Stream"
|
|
11
|
+
import type * as Worker from "../Worker"
|
|
12
|
+
import type { WorkerError } from "../WorkerError"
|
|
13
|
+
|
|
14
|
+
/** @internal */
|
|
15
|
+
export const defaultQueue = <I>() =>
|
|
16
|
+
Effect.map(
|
|
17
|
+
Queue.unbounded<readonly [id: number, item: I]>(),
|
|
18
|
+
(queue): Worker.WorkerQueue<I> => ({
|
|
19
|
+
offer: (id, item) => Queue.offer(queue, [id, item]),
|
|
20
|
+
take: Queue.take(queue),
|
|
21
|
+
shutdown: Queue.shutdown(queue)
|
|
22
|
+
})
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
/** @internal */
|
|
26
|
+
export const PlatformWorkerTypeId: Worker.PlatformWorkerTypeId = Symbol.for(
|
|
27
|
+
"@effect/platform/Worker/PlatformWorker"
|
|
28
|
+
) as Worker.PlatformWorkerTypeId
|
|
29
|
+
|
|
30
|
+
/** @internal */
|
|
31
|
+
export const PlatformWorker = Context.Tag<Worker.PlatformWorker>(
|
|
32
|
+
PlatformWorkerTypeId
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
/** @internal */
|
|
36
|
+
export const WorkerManagerTypeId: Worker.WorkerManagerTypeId = Symbol.for(
|
|
37
|
+
"@effect/platform/Worker/WorkerManager"
|
|
38
|
+
) as Worker.WorkerManagerTypeId
|
|
39
|
+
|
|
40
|
+
/** @internal */
|
|
41
|
+
export const WorkerManager = Context.Tag<Worker.WorkerManager>(
|
|
42
|
+
WorkerManagerTypeId
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
/** @internal */
|
|
46
|
+
export const makeManager = Effect.gen(function*(_) {
|
|
47
|
+
const platform = yield* _(PlatformWorker)
|
|
48
|
+
let idCounter = 0
|
|
49
|
+
return WorkerManager.of({
|
|
50
|
+
[WorkerManagerTypeId]: WorkerManagerTypeId,
|
|
51
|
+
spawn<I, E, O>({ permits = 1, queue, spawn, transfers = (_) => [] }: Worker.Worker.Options<I>) {
|
|
52
|
+
return Effect.gen(function*(_) {
|
|
53
|
+
const id = idCounter++
|
|
54
|
+
const fiberId = yield* _(Effect.fiberId)
|
|
55
|
+
let requestIdCounter = 0
|
|
56
|
+
const readyLatch = yield* _(Deferred.make<never, void>())
|
|
57
|
+
const semaphore = yield* _(Effect.makeSemaphore(permits))
|
|
58
|
+
const requestMap = new Map<number, readonly [Queue.Queue<Exit.Exit<E, O>>, Deferred.Deferred<never, void>]>()
|
|
59
|
+
|
|
60
|
+
const outbound = queue ?? (yield* _(defaultQueue<I>()))
|
|
61
|
+
yield* _(Effect.addFinalizer(() => outbound.shutdown))
|
|
62
|
+
|
|
63
|
+
const backing = yield* _(
|
|
64
|
+
platform.spawn<Worker.Worker.Request<I>, Worker.Worker.Response<E, O>>(spawn(id))
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
yield* _(Effect.addFinalizer(() =>
|
|
68
|
+
Effect.zipRight(
|
|
69
|
+
Effect.forEach(requestMap.values(), ([queue]) => Queue.shutdown(queue), { discard: true }),
|
|
70
|
+
Effect.sync(() => requestMap.clear())
|
|
71
|
+
)
|
|
72
|
+
))
|
|
73
|
+
|
|
74
|
+
const handleMessage = (msg: Worker.BackingWorker.Message<Worker.Worker.Response<E, O>>) =>
|
|
75
|
+
Effect.suspend(() => {
|
|
76
|
+
switch (msg[0]) {
|
|
77
|
+
case 0: {
|
|
78
|
+
return Deferred.complete(readyLatch, Effect.unit)
|
|
79
|
+
}
|
|
80
|
+
case 1: {
|
|
81
|
+
const response = msg[1]
|
|
82
|
+
const queue = requestMap.get(response[0])
|
|
83
|
+
if (!queue) return Effect.unit
|
|
84
|
+
|
|
85
|
+
switch (response[1]) {
|
|
86
|
+
// data
|
|
87
|
+
case 0: {
|
|
88
|
+
return Queue.offer(queue[0], Exit.succeed(response[2]))
|
|
89
|
+
}
|
|
90
|
+
// end
|
|
91
|
+
case 1: {
|
|
92
|
+
return response.length === 2 ?
|
|
93
|
+
Queue.shutdown(queue[0]) :
|
|
94
|
+
Effect.zipRight(
|
|
95
|
+
Queue.offer(queue[0], Exit.succeed(response[2])),
|
|
96
|
+
Queue.shutdown(queue[0])
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
// error / defect
|
|
100
|
+
case 2:
|
|
101
|
+
case 3: {
|
|
102
|
+
return Effect.zipRight(
|
|
103
|
+
Queue.offer(
|
|
104
|
+
queue[0],
|
|
105
|
+
response[1] === 2
|
|
106
|
+
? Exit.fail(response[2])
|
|
107
|
+
: Exit.die(response[2])
|
|
108
|
+
),
|
|
109
|
+
Queue.shutdown(queue[0])
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
const executeAcquire = (request: I) =>
|
|
118
|
+
Effect.tap(
|
|
119
|
+
Effect.all([
|
|
120
|
+
Effect.sync(() => requestIdCounter++),
|
|
121
|
+
Queue.unbounded<Exit.Exit<E, O>>(),
|
|
122
|
+
Deferred.make<never, void>()
|
|
123
|
+
]),
|
|
124
|
+
([id, queue, deferred]) =>
|
|
125
|
+
Effect.suspend(() => {
|
|
126
|
+
requestMap.set(id, [queue, deferred])
|
|
127
|
+
return outbound.offer(id, request)
|
|
128
|
+
})
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
const executeRelease = (
|
|
132
|
+
[id, , deferred]: [number, Queue.Queue<Exit.Exit<E, O>>, Deferred.Deferred<never, void>],
|
|
133
|
+
exit: Exit.Exit<unknown, unknown>
|
|
134
|
+
) => {
|
|
135
|
+
const release = Effect.zipRight(
|
|
136
|
+
Deferred.complete(deferred, Effect.unit),
|
|
137
|
+
Effect.sync(() => requestMap.delete(id))
|
|
138
|
+
)
|
|
139
|
+
return Exit.isInterrupted(exit) ?
|
|
140
|
+
Effect.zipRight(
|
|
141
|
+
backing.send([id, 1]),
|
|
142
|
+
release
|
|
143
|
+
) :
|
|
144
|
+
release
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const execute = (request: I) =>
|
|
148
|
+
Stream.flatMap(
|
|
149
|
+
Stream.acquireRelease(
|
|
150
|
+
executeAcquire(request),
|
|
151
|
+
executeRelease
|
|
152
|
+
),
|
|
153
|
+
([, queue]) => Stream.flatten(Stream.fromQueue(queue))
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
const executeEffect = (request: I) =>
|
|
157
|
+
Effect.acquireUseRelease(
|
|
158
|
+
executeAcquire(request),
|
|
159
|
+
([, queue]) => Effect.flatten(Queue.take(queue)),
|
|
160
|
+
executeRelease
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
const handleMessages = yield* _(
|
|
164
|
+
Queue.take(backing.queue),
|
|
165
|
+
Effect.flatMap(handleMessage),
|
|
166
|
+
Effect.forever,
|
|
167
|
+
Effect.forkDaemon
|
|
168
|
+
)
|
|
169
|
+
yield* _(Effect.addFinalizer(() => handleMessages.interruptAsFork(fiberId)))
|
|
170
|
+
|
|
171
|
+
const postMessages = yield* _(
|
|
172
|
+
semaphore.take(1),
|
|
173
|
+
Effect.zipRight(outbound.take),
|
|
174
|
+
Effect.flatMap(([id, request]) =>
|
|
175
|
+
pipe(
|
|
176
|
+
Effect.suspend(() => {
|
|
177
|
+
const result = requestMap.get(id)
|
|
178
|
+
if (!result) return Effect.unit
|
|
179
|
+
const transferables = transfers(request)
|
|
180
|
+
return Effect.zipRight(
|
|
181
|
+
backing.send([id, 0, request], transferables),
|
|
182
|
+
Deferred.await(result[1])
|
|
183
|
+
)
|
|
184
|
+
}),
|
|
185
|
+
Effect.ensuring(semaphore.release(1)),
|
|
186
|
+
Effect.fork
|
|
187
|
+
)
|
|
188
|
+
),
|
|
189
|
+
Effect.forever,
|
|
190
|
+
Effect.forkDaemon
|
|
191
|
+
)
|
|
192
|
+
yield* _(Effect.addFinalizer(() => postMessages.interruptAsFork(fiberId)))
|
|
193
|
+
|
|
194
|
+
const join = Effect.race(
|
|
195
|
+
Fiber.joinAll([
|
|
196
|
+
handleMessages,
|
|
197
|
+
postMessages
|
|
198
|
+
]),
|
|
199
|
+
backing.join
|
|
200
|
+
) as Effect.Effect<never, WorkerError, never>
|
|
201
|
+
|
|
202
|
+
return { id, join, execute, executeEffect }
|
|
203
|
+
})
|
|
204
|
+
}
|
|
205
|
+
})
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
/** @internal */
|
|
209
|
+
export const layerManager = Layer.effect(WorkerManager, makeManager)
|
|
210
|
+
|
|
211
|
+
/** @internal */
|
|
212
|
+
export const makePool = <W>() =>
|
|
213
|
+
<I, E, O>(
|
|
214
|
+
options: Worker.WorkerPool.Options<I, W>
|
|
215
|
+
) =>
|
|
216
|
+
Effect.gen(function*(_) {
|
|
217
|
+
const manager = yield* _(WorkerManager)
|
|
218
|
+
const backing = yield* _(
|
|
219
|
+
"timeToLive" in options ?
|
|
220
|
+
Pool.makeWithTTL({
|
|
221
|
+
acquire: manager.spawn<I, E, O>(options),
|
|
222
|
+
min: options.minSize,
|
|
223
|
+
max: options.maxSize,
|
|
224
|
+
timeToLive: options.timeToLive
|
|
225
|
+
}) :
|
|
226
|
+
Pool.make({
|
|
227
|
+
acquire: manager.spawn<I, E, O>(options),
|
|
228
|
+
size: options.size
|
|
229
|
+
})
|
|
230
|
+
)
|
|
231
|
+
const pool: Worker.WorkerPool<I, E, O> = {
|
|
232
|
+
backing,
|
|
233
|
+
execute: (message: I) =>
|
|
234
|
+
Stream.unwrap(
|
|
235
|
+
Effect.map(
|
|
236
|
+
Effect.scoped(backing.get()),
|
|
237
|
+
(worker) => worker.execute(message)
|
|
238
|
+
)
|
|
239
|
+
),
|
|
240
|
+
executeEffect: (message: I) =>
|
|
241
|
+
Effect.flatMap(
|
|
242
|
+
Effect.scoped(backing.get()),
|
|
243
|
+
(worker) => worker.executeEffect(message)
|
|
244
|
+
)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return pool
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
/** @internal */
|
|
251
|
+
export const makePoolLayer = <W>(managerLayer: Layer.Layer<never, never, Worker.WorkerManager>) =>
|
|
252
|
+
<Tag, I, E, O>(
|
|
253
|
+
tag: Context.Tag<Tag, Worker.WorkerPool<I, E, O>>,
|
|
254
|
+
options: Worker.WorkerPool.Options<I, W>
|
|
255
|
+
) =>
|
|
256
|
+
Layer.provide(
|
|
257
|
+
managerLayer,
|
|
258
|
+
Layer.scoped(
|
|
259
|
+
tag,
|
|
260
|
+
makePool<W>()(options)
|
|
261
|
+
)
|
|
262
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Data from "effect/Data"
|
|
2
|
+
import type * as WorkerError_ from "../WorkerError"
|
|
3
|
+
|
|
4
|
+
/** @internal */
|
|
5
|
+
export const WorkerErrorTypeId: WorkerError_.WorkerErrorTypeId = Symbol.for(
|
|
6
|
+
"@effect-ts/platform/Worker/WorkerError"
|
|
7
|
+
) as WorkerError_.WorkerErrorTypeId
|
|
8
|
+
|
|
9
|
+
/** @internal */
|
|
10
|
+
export const WorkerError = (reason: WorkerError_.WorkerError["reason"], error: unknown): WorkerError_.WorkerError =>
|
|
11
|
+
Data.struct({
|
|
12
|
+
[WorkerErrorTypeId]: WorkerErrorTypeId,
|
|
13
|
+
_tag: "WorkerError",
|
|
14
|
+
reason,
|
|
15
|
+
error
|
|
16
|
+
})
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import * as Cause from "effect/Cause"
|
|
2
|
+
import * as Context from "effect/Context"
|
|
3
|
+
import * as Effect from "effect/Effect"
|
|
4
|
+
import * as Either from "effect/Either"
|
|
5
|
+
import * as Fiber from "effect/Fiber"
|
|
6
|
+
import { pipe } from "effect/Function"
|
|
7
|
+
import * as Queue from "effect/Queue"
|
|
8
|
+
import * as Stream from "effect/Stream"
|
|
9
|
+
import type * as Worker from "../Worker"
|
|
10
|
+
import type * as WorkerRunner from "../WorkerRunner"
|
|
11
|
+
|
|
12
|
+
/** @internal */
|
|
13
|
+
export const PlatformRunnerTypeId: WorkerRunner.PlatformRunnerTypeId = Symbol.for(
|
|
14
|
+
"@effect/platform/Runner/PlatformRunner"
|
|
15
|
+
) as WorkerRunner.PlatformRunnerTypeId
|
|
16
|
+
|
|
17
|
+
/** @internal */
|
|
18
|
+
export const PlatformRunner = Context.Tag<WorkerRunner.PlatformRunner>(
|
|
19
|
+
PlatformRunnerTypeId
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
/** @internal */
|
|
23
|
+
export const make = <I, R, E, O>(
|
|
24
|
+
process: (request: I) => Stream.Stream<R, E, O> | Effect.Effect<R, E, O>,
|
|
25
|
+
options?: WorkerRunner.Runner.Options<O>
|
|
26
|
+
) =>
|
|
27
|
+
Effect.gen(function*(_) {
|
|
28
|
+
const platform = yield* _(PlatformRunner)
|
|
29
|
+
const backing = yield* _(platform.start<Worker.Worker.Request<I>, Worker.Worker.Response<E, O>>())
|
|
30
|
+
const fiberMap = new Map<number, Fiber.Fiber<never, void>>()
|
|
31
|
+
|
|
32
|
+
const handleRequests = pipe(
|
|
33
|
+
Queue.take(backing.queue),
|
|
34
|
+
Effect.tap((req) => {
|
|
35
|
+
const id = req[0]
|
|
36
|
+
if (req[1] === 1) {
|
|
37
|
+
const fiber = fiberMap.get(id)
|
|
38
|
+
if (!fiber) return Effect.unit
|
|
39
|
+
return Fiber.interrupt(fiber)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const stream = process(req[2])
|
|
43
|
+
|
|
44
|
+
const effect = Effect.isEffect(stream) ?
|
|
45
|
+
Effect.matchCauseEffect(stream, {
|
|
46
|
+
onFailure: (cause) =>
|
|
47
|
+
Either.match(Cause.failureOrCause(cause), {
|
|
48
|
+
onLeft: (error) => backing.send([id, 2, error]),
|
|
49
|
+
onRight: (cause) => backing.send([id, 3, Cause.squash(cause)])
|
|
50
|
+
}),
|
|
51
|
+
onSuccess: (data) => backing.send([id, 1, data])
|
|
52
|
+
}) :
|
|
53
|
+
pipe(
|
|
54
|
+
stream,
|
|
55
|
+
Stream.tap((item) => backing.send([id, 0, item], options?.transfers ? options.transfers(item) : undefined)),
|
|
56
|
+
Stream.runDrain,
|
|
57
|
+
Effect.matchCauseEffect({
|
|
58
|
+
onFailure: (cause) =>
|
|
59
|
+
Either.match(Cause.failureOrCause(cause), {
|
|
60
|
+
onLeft: (error) => backing.send([id, 2, error]),
|
|
61
|
+
onRight: (cause) => backing.send([id, 3, Cause.squash(cause)])
|
|
62
|
+
}),
|
|
63
|
+
onSuccess: () => backing.send([id, 1])
|
|
64
|
+
})
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return pipe(
|
|
68
|
+
effect,
|
|
69
|
+
Effect.ensuring(Effect.sync(() => fiberMap.delete(id))),
|
|
70
|
+
Effect.fork,
|
|
71
|
+
Effect.tap((fiber) => Effect.sync(() => fiberMap.set(id, fiber)))
|
|
72
|
+
)
|
|
73
|
+
}),
|
|
74
|
+
Effect.forever
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
return yield* _(
|
|
78
|
+
Effect.all([
|
|
79
|
+
handleRequests,
|
|
80
|
+
Fiber.join(backing.fiber)
|
|
81
|
+
], { concurrency: "unbounded", discard: true })
|
|
82
|
+
)
|
|
83
|
+
})
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import * as Effect from 'effect/Effect';
|
|
2
|
-
import { flow } from 'effect/Function';
|
|
3
|
-
import { a as appendPreResponseHandler } from './App-1ca51fa7.esm.js';
|
|
4
|
-
import { s as set } from './Headers-58b56a08.esm.js';
|
|
5
|
-
import { schemaExternalSpan } from '../Http/IncomingMessage/dist/effect-platform-Http-IncomingMessage.esm.js';
|
|
6
|
-
import { a as ServerRequest } from './ServerRequest-41c7e979.esm.js';
|
|
7
|
-
import { s as setHeader } from './ServerResponse-03c252ea.esm.js';
|
|
8
|
-
|
|
9
|
-
/** @internal */
|
|
10
|
-
const make$1 = middleware => middleware;
|
|
11
|
-
|
|
12
|
-
/** @internal */
|
|
13
|
-
const logger$1 = /*#__PURE__*/make$1(httpApp => {
|
|
14
|
-
let counter = 0;
|
|
15
|
-
return Effect.flatMap(ServerRequest, request => Effect.withLogSpan(Effect.onExit(httpApp, exit => exit._tag === "Failure" ? Effect.annotateLogs(Effect.log(exit.cause), {
|
|
16
|
-
"http.method": request.method,
|
|
17
|
-
"http.url": request.url,
|
|
18
|
-
"http.status": 500
|
|
19
|
-
}) : Effect.annotateLogs(Effect.log(""), {
|
|
20
|
-
"http.method": request.method,
|
|
21
|
-
"http.url": request.url,
|
|
22
|
-
"http.status": exit.value.status
|
|
23
|
-
})), `http.span.${++counter}`));
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
/** @internal */
|
|
27
|
-
const tracer$1 = /*#__PURE__*/make$1(httpApp => {
|
|
28
|
-
const appWithStatus = Effect.tap(Effect.zipRight(appendPreResponseHandler(b3Response), httpApp), response => Effect.annotateCurrentSpan("http.status", response.status));
|
|
29
|
-
return Effect.flatMap(ServerRequest, request => Effect.flatMap(Effect.orElseSucceed(schemaExternalSpan(request), () => undefined), parent => Effect.withSpan(appWithStatus, `http ${request.method}`, {
|
|
30
|
-
attributes: {
|
|
31
|
-
"http.method": request.method,
|
|
32
|
-
"http.url": request.url
|
|
33
|
-
},
|
|
34
|
-
parent
|
|
35
|
-
})));
|
|
36
|
-
});
|
|
37
|
-
const b3Response = (_request, response) => Effect.flatMap(Effect.currentSpan, span => span._tag === "Some" ? setHeader(response, "b3", `${span.value.traceId}-${span.value.spanId}-1${span.value.parent._tag === "Some" ? `-${span.value.parent.value.spanId}` : ""}`) : response);
|
|
38
|
-
|
|
39
|
-
/** @internal */
|
|
40
|
-
const xForwardedHeaders$1 = /*#__PURE__*/make$1(httpApp => Effect.updateService(httpApp, ServerRequest, request => request.headers["x-forwarded-host"] ? request.modify({
|
|
41
|
-
headers: set(request.headers, "host", request.headers["x-forwarded-host"]),
|
|
42
|
-
remoteAddress: request.headers["x-forwarded-for"]?.split(",")[0].trim()
|
|
43
|
-
}) : request));
|
|
44
|
-
|
|
45
|
-
/** @internal */
|
|
46
|
-
const loggerTracer$1 = /*#__PURE__*/flow(tracer$1, logger$1);
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* @since 1.0.0
|
|
50
|
-
*/
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* @since 1.0.0
|
|
54
|
-
* @category models
|
|
55
|
-
*/
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* @since 1.0.0
|
|
59
|
-
*/
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* @since 1.0.0
|
|
63
|
-
* @category constructors
|
|
64
|
-
*/
|
|
65
|
-
const make = make$1;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* @since 1.0.0
|
|
69
|
-
* @category constructors
|
|
70
|
-
*/
|
|
71
|
-
const logger = logger$1;
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* @since 1.0.0
|
|
75
|
-
* @category constructors
|
|
76
|
-
*/
|
|
77
|
-
const tracer = tracer$1;
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* @since 1.0.0
|
|
81
|
-
* @category constructors
|
|
82
|
-
*/
|
|
83
|
-
const loggerTracer = loggerTracer$1;
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* @since 1.0.0
|
|
87
|
-
* @category constructors
|
|
88
|
-
*/
|
|
89
|
-
const xForwardedHeaders = xForwardedHeaders$1;
|
|
90
|
-
|
|
91
|
-
var Middleware = /*#__PURE__*/Object.freeze({
|
|
92
|
-
__proto__: null,
|
|
93
|
-
make: make,
|
|
94
|
-
logger: logger,
|
|
95
|
-
tracer: tracer,
|
|
96
|
-
loggerTracer: loggerTracer,
|
|
97
|
-
xForwardedHeaders: xForwardedHeaders
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
export { Middleware as M, loggerTracer as a, logger as l, make as m, tracer as t, xForwardedHeaders as x };
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var Effect = require('effect/Effect');
|
|
4
|
-
var Function = require('effect/Function');
|
|
5
|
-
var Http_App_dist_effectPlatformHttpApp = require('./App-18152f12.cjs.dev.js');
|
|
6
|
-
var Http_Headers_dist_effectPlatformHttpHeaders = require('./Headers-f56bc667.cjs.dev.js');
|
|
7
|
-
var Http_IncomingMessage_dist_effectPlatformHttpIncomingMessage = require('../Http/IncomingMessage/dist/effect-platform-Http-IncomingMessage.cjs.dev.js');
|
|
8
|
-
var Http_ServerRequest_dist_effectPlatformHttpServerRequest = require('./ServerRequest-8e9629a5.cjs.dev.js');
|
|
9
|
-
var Http_ServerResponse_dist_effectPlatformHttpServerResponse = require('./ServerResponse-9af42ecb.cjs.dev.js');
|
|
10
|
-
|
|
11
|
-
function _interopNamespace(e) {
|
|
12
|
-
if (e && e.__esModule) return e;
|
|
13
|
-
var n = Object.create(null);
|
|
14
|
-
if (e) {
|
|
15
|
-
Object.keys(e).forEach(function (k) {
|
|
16
|
-
if (k !== 'default') {
|
|
17
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () { return e[k]; }
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
n["default"] = e;
|
|
26
|
-
return Object.freeze(n);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
|
|
30
|
-
|
|
31
|
-
/** @internal */
|
|
32
|
-
const make$1 = middleware => middleware;
|
|
33
|
-
|
|
34
|
-
/** @internal */
|
|
35
|
-
const logger$1 = /*#__PURE__*/make$1(httpApp => {
|
|
36
|
-
let counter = 0;
|
|
37
|
-
return Effect__namespace.flatMap(Http_ServerRequest_dist_effectPlatformHttpServerRequest.ServerRequest$1, request => Effect__namespace.withLogSpan(Effect__namespace.onExit(httpApp, exit => exit._tag === "Failure" ? Effect__namespace.annotateLogs(Effect__namespace.log(exit.cause), {
|
|
38
|
-
"http.method": request.method,
|
|
39
|
-
"http.url": request.url,
|
|
40
|
-
"http.status": 500
|
|
41
|
-
}) : Effect__namespace.annotateLogs(Effect__namespace.log(""), {
|
|
42
|
-
"http.method": request.method,
|
|
43
|
-
"http.url": request.url,
|
|
44
|
-
"http.status": exit.value.status
|
|
45
|
-
})), `http.span.${++counter}`));
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
/** @internal */
|
|
49
|
-
const tracer$1 = /*#__PURE__*/make$1(httpApp => {
|
|
50
|
-
const appWithStatus = Effect__namespace.tap(Effect__namespace.zipRight(Http_App_dist_effectPlatformHttpApp.appendPreResponseHandler(b3Response), httpApp), response => Effect__namespace.annotateCurrentSpan("http.status", response.status));
|
|
51
|
-
return Effect__namespace.flatMap(Http_ServerRequest_dist_effectPlatformHttpServerRequest.ServerRequest$1, request => Effect__namespace.flatMap(Effect__namespace.orElseSucceed(Http_IncomingMessage_dist_effectPlatformHttpIncomingMessage.schemaExternalSpan(request), () => undefined), parent => Effect__namespace.withSpan(appWithStatus, `http ${request.method}`, {
|
|
52
|
-
attributes: {
|
|
53
|
-
"http.method": request.method,
|
|
54
|
-
"http.url": request.url
|
|
55
|
-
},
|
|
56
|
-
parent
|
|
57
|
-
})));
|
|
58
|
-
});
|
|
59
|
-
const b3Response = (_request, response) => Effect__namespace.flatMap(Effect__namespace.currentSpan, span => span._tag === "Some" ? Http_ServerResponse_dist_effectPlatformHttpServerResponse.setHeader(response, "b3", `${span.value.traceId}-${span.value.spanId}-1${span.value.parent._tag === "Some" ? `-${span.value.parent.value.spanId}` : ""}`) : response);
|
|
60
|
-
|
|
61
|
-
/** @internal */
|
|
62
|
-
const xForwardedHeaders$1 = /*#__PURE__*/make$1(httpApp => Effect__namespace.updateService(httpApp, Http_ServerRequest_dist_effectPlatformHttpServerRequest.ServerRequest$1, request => request.headers["x-forwarded-host"] ? request.modify({
|
|
63
|
-
headers: Http_Headers_dist_effectPlatformHttpHeaders.set(request.headers, "host", request.headers["x-forwarded-host"]),
|
|
64
|
-
remoteAddress: request.headers["x-forwarded-for"]?.split(",")[0].trim()
|
|
65
|
-
}) : request));
|
|
66
|
-
|
|
67
|
-
/** @internal */
|
|
68
|
-
const loggerTracer$1 = /*#__PURE__*/Function.flow(tracer$1, logger$1);
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* @since 1.0.0
|
|
72
|
-
*/
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* @since 1.0.0
|
|
76
|
-
* @category models
|
|
77
|
-
*/
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* @since 1.0.0
|
|
81
|
-
*/
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* @since 1.0.0
|
|
85
|
-
* @category constructors
|
|
86
|
-
*/
|
|
87
|
-
const make = make$1;
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* @since 1.0.0
|
|
91
|
-
* @category constructors
|
|
92
|
-
*/
|
|
93
|
-
const logger = logger$1;
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* @since 1.0.0
|
|
97
|
-
* @category constructors
|
|
98
|
-
*/
|
|
99
|
-
const tracer = tracer$1;
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* @since 1.0.0
|
|
103
|
-
* @category constructors
|
|
104
|
-
*/
|
|
105
|
-
const loggerTracer = loggerTracer$1;
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* @since 1.0.0
|
|
109
|
-
* @category constructors
|
|
110
|
-
*/
|
|
111
|
-
const xForwardedHeaders = xForwardedHeaders$1;
|
|
112
|
-
|
|
113
|
-
var Middleware = /*#__PURE__*/Object.freeze({
|
|
114
|
-
__proto__: null,
|
|
115
|
-
make: make,
|
|
116
|
-
logger: logger,
|
|
117
|
-
tracer: tracer,
|
|
118
|
-
loggerTracer: loggerTracer,
|
|
119
|
-
xForwardedHeaders: xForwardedHeaders
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
exports.Middleware = Middleware;
|
|
123
|
-
exports.logger = logger;
|
|
124
|
-
exports.loggerTracer = loggerTracer;
|
|
125
|
-
exports.make = make;
|
|
126
|
-
exports.tracer = tracer;
|
|
127
|
-
exports.xForwardedHeaders = xForwardedHeaders;
|