@effect/platform 0.50.2 → 0.50.4
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/dist/cjs/Http/Headers.js +59 -26
- package/dist/cjs/Http/Headers.js.map +1 -1
- package/dist/cjs/Http/UrlParams.js.map +1 -1
- package/dist/cjs/internal/http/client.js +11 -7
- package/dist/cjs/internal/http/client.js.map +1 -1
- package/dist/cjs/internal/http/middleware.js +13 -6
- package/dist/cjs/internal/http/middleware.js.map +1 -1
- package/dist/cjs/internal/worker.js +30 -30
- package/dist/cjs/internal/worker.js.map +1 -1
- package/dist/dts/Http/Headers.d.ts +9 -2
- package/dist/dts/Http/Headers.d.ts.map +1 -1
- package/dist/dts/Http/UrlParams.d.ts.map +1 -1
- package/dist/esm/Http/Headers.js +57 -24
- package/dist/esm/Http/Headers.js.map +1 -1
- package/dist/esm/Http/UrlParams.js.map +1 -1
- package/dist/esm/internal/http/client.js +11 -7
- package/dist/esm/internal/http/client.js.map +1 -1
- package/dist/esm/internal/http/middleware.js +13 -6
- package/dist/esm/internal/http/middleware.js.map +1 -1
- package/dist/esm/internal/worker.js +30 -30
- package/dist/esm/internal/worker.js.map +1 -1
- package/package.json +3 -3
- package/src/Http/Headers.ts +81 -43
- package/src/Http/UrlParams.ts +1 -0
- package/src/internal/http/client.ts +11 -7
- package/src/internal/http/middleware.ts +13 -6
- package/src/internal/worker.ts +74 -85
package/src/internal/worker.ts
CHANGED
|
@@ -59,8 +59,8 @@ export const Spawner = Context.GenericTag<Worker.Spawner, Worker.SpawnerFn>(
|
|
|
59
59
|
)
|
|
60
60
|
|
|
61
61
|
/** @internal */
|
|
62
|
-
export const makeManager = Effect.gen(function*(
|
|
63
|
-
const platform = yield*
|
|
62
|
+
export const makeManager = Effect.gen(function*() {
|
|
63
|
+
const platform = yield* PlatformWorker
|
|
64
64
|
let idCounter = 0
|
|
65
65
|
return WorkerManager.of({
|
|
66
66
|
[WorkerManagerTypeId]: WorkerManagerTypeId,
|
|
@@ -71,19 +71,19 @@ export const makeManager = Effect.gen(function*(_) {
|
|
|
71
71
|
queue,
|
|
72
72
|
transfers = (_) => []
|
|
73
73
|
}: Worker.Worker.Options<I>) {
|
|
74
|
-
return Effect.gen(function*(
|
|
75
|
-
const spawn = yield*
|
|
74
|
+
return Effect.gen(function*() {
|
|
75
|
+
const spawn = yield* Spawner
|
|
76
76
|
const id = idCounter++
|
|
77
77
|
let requestIdCounter = 0
|
|
78
|
-
const semaphore = yield*
|
|
78
|
+
const semaphore = yield* Effect.makeSemaphore(permits)
|
|
79
79
|
const requestMap = new Map<
|
|
80
80
|
number,
|
|
81
81
|
readonly [Queue.Queue<Exit.Exit<ReadonlyArray<O>, E | WorkerError>>, Deferred.Deferred<void>]
|
|
82
82
|
>()
|
|
83
|
-
const sendQueue = yield*
|
|
83
|
+
const sendQueue = yield* Effect.acquireRelease(
|
|
84
84
|
Queue.unbounded<readonly [message: Worker.Worker.Request, transfers?: ReadonlyArray<unknown>]>(),
|
|
85
85
|
Queue.shutdown
|
|
86
|
-
)
|
|
86
|
+
)
|
|
87
87
|
|
|
88
88
|
const collector = Transferable.unsafeMakeCollector()
|
|
89
89
|
const wrappedEncode = encode ?
|
|
@@ -94,36 +94,33 @@ export const makeManager = Effect.gen(function*(_) {
|
|
|
94
94
|
)) :
|
|
95
95
|
Effect.succeed
|
|
96
96
|
|
|
97
|
-
const outbound = queue ?? (yield*
|
|
98
|
-
yield
|
|
97
|
+
const outbound = queue ?? (yield* defaultQueue<I>())
|
|
98
|
+
yield Effect.addFinalizer(() => outbound.shutdown)
|
|
99
99
|
|
|
100
|
-
yield*
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
take
|
|
125
|
-
], { concurrency: "unbounded" }))
|
|
126
|
-
}),
|
|
100
|
+
yield Effect.gen(function*() {
|
|
101
|
+
const readyLatch = yield* Deferred.make<void>()
|
|
102
|
+
const backing = yield* platform.spawn<Worker.Worker.Request, Worker.Worker.Response<E, O>>(spawn(id))
|
|
103
|
+
const send = pipe(
|
|
104
|
+
sendQueue.take,
|
|
105
|
+
Effect.flatMap(([message, transfers]) => backing.send(message, transfers)),
|
|
106
|
+
Effect.forever
|
|
107
|
+
)
|
|
108
|
+
const take = pipe(
|
|
109
|
+
Queue.take(backing.queue),
|
|
110
|
+
Effect.flatMap((msg) => {
|
|
111
|
+
if (msg[0] === 0) {
|
|
112
|
+
return Deferred.complete(readyLatch, Effect.void)
|
|
113
|
+
}
|
|
114
|
+
return handleMessage(msg[1])
|
|
115
|
+
}),
|
|
116
|
+
Effect.forever
|
|
117
|
+
)
|
|
118
|
+
return yield* Effect.all([
|
|
119
|
+
Fiber.join(backing.fiber),
|
|
120
|
+
Effect.zipRight(Deferred.await(readyLatch), send),
|
|
121
|
+
take
|
|
122
|
+
], { concurrency: "unbounded" })
|
|
123
|
+
}).pipe(
|
|
127
124
|
Effect.scoped,
|
|
128
125
|
Effect.onError((cause) =>
|
|
129
126
|
Effect.forEach(requestMap.values(), ([queue]) => Queue.offer(queue, Exit.failCause(cause)))
|
|
@@ -141,14 +138,14 @@ export const makeManager = Effect.gen(function*(_) {
|
|
|
141
138
|
Effect.forkScoped
|
|
142
139
|
)
|
|
143
140
|
|
|
144
|
-
yield
|
|
141
|
+
yield Effect.addFinalizer(() =>
|
|
145
142
|
Effect.zipRight(
|
|
146
143
|
Effect.forEach(requestMap.values(), ([queue]) => Queue.offer(queue, Exit.failCause(Cause.empty)), {
|
|
147
144
|
discard: true
|
|
148
145
|
}),
|
|
149
146
|
Effect.sync(() => requestMap.clear())
|
|
150
147
|
)
|
|
151
|
-
)
|
|
148
|
+
)
|
|
152
149
|
|
|
153
150
|
const handleMessage = (response: Worker.Worker.Response<E, O>) =>
|
|
154
151
|
Effect.suspend(() => {
|
|
@@ -244,8 +241,7 @@ export const makeManager = Effect.gen(function*(_) {
|
|
|
244
241
|
executeRelease
|
|
245
242
|
)
|
|
246
243
|
|
|
247
|
-
yield
|
|
248
|
-
semaphore.take(1),
|
|
244
|
+
yield semaphore.take(1).pipe(
|
|
249
245
|
Effect.zipRight(outbound.take),
|
|
250
246
|
Effect.flatMap(([id, request, span]) =>
|
|
251
247
|
pipe(
|
|
@@ -279,8 +275,7 @@ export const makeManager = Effect.gen(function*(_) {
|
|
|
279
275
|
)
|
|
280
276
|
|
|
281
277
|
if (initialMessage) {
|
|
282
|
-
yield
|
|
283
|
-
Effect.sync(initialMessage),
|
|
278
|
+
yield Effect.sync(initialMessage).pipe(
|
|
284
279
|
Effect.flatMap(executeEffect),
|
|
285
280
|
Effect.mapError((error) => new WorkerError({ reason: "spawn", error }))
|
|
286
281
|
)
|
|
@@ -299,8 +294,8 @@ export const layerManager = Layer.effect(WorkerManager, makeManager)
|
|
|
299
294
|
export const makePool = <I, O, E>(
|
|
300
295
|
options: Worker.WorkerPool.Options<I>
|
|
301
296
|
) =>
|
|
302
|
-
Effect.gen(function*(
|
|
303
|
-
const manager = yield*
|
|
297
|
+
Effect.gen(function*() {
|
|
298
|
+
const manager = yield* WorkerManager
|
|
304
299
|
const workers = new Set<Worker.Worker<I, O, E>>()
|
|
305
300
|
const acquire = pipe(
|
|
306
301
|
manager.spawn<I, O, E>(options),
|
|
@@ -308,19 +303,17 @@ export const makePool = <I, O, E>(
|
|
|
308
303
|
Effect.tap((worker) => Effect.addFinalizer(() => Effect.sync(() => workers.delete(worker)))),
|
|
309
304
|
options.onCreate ? Effect.tap(options.onCreate) : identity
|
|
310
305
|
)
|
|
311
|
-
const backing = yield*
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
})
|
|
323
|
-
)
|
|
306
|
+
const backing = yield* "timeToLive" in options ?
|
|
307
|
+
Pool.makeWithTTL({
|
|
308
|
+
acquire,
|
|
309
|
+
min: options.minSize,
|
|
310
|
+
max: options.maxSize,
|
|
311
|
+
timeToLive: options.timeToLive
|
|
312
|
+
}) :
|
|
313
|
+
Pool.make({
|
|
314
|
+
acquire,
|
|
315
|
+
size: options.size
|
|
316
|
+
})
|
|
324
317
|
const pool: Worker.WorkerPool<I, O, E> = {
|
|
325
318
|
backing,
|
|
326
319
|
broadcast: (message: I) =>
|
|
@@ -357,19 +350,17 @@ export const makeSerialized = <
|
|
|
357
350
|
>(
|
|
358
351
|
options: Worker.SerializedWorker.Options<I>
|
|
359
352
|
): Effect.Effect<Worker.SerializedWorker<I>, WorkerError, Worker.WorkerManager | Worker.Spawner | Scope.Scope> =>
|
|
360
|
-
Effect.gen(function*(
|
|
361
|
-
const manager = yield*
|
|
362
|
-
const backing = yield*
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
})
|
|
372
|
-
)
|
|
353
|
+
Effect.gen(function*() {
|
|
354
|
+
const manager = yield* WorkerManager
|
|
355
|
+
const backing = yield* manager.spawn({
|
|
356
|
+
...options as any,
|
|
357
|
+
encode(message) {
|
|
358
|
+
return Effect.mapError(
|
|
359
|
+
Serializable.serialize(message as any),
|
|
360
|
+
(error) => new WorkerError({ reason: "encode", error })
|
|
361
|
+
)
|
|
362
|
+
}
|
|
363
|
+
})
|
|
373
364
|
const execute = <Req extends I>(message: Req) => {
|
|
374
365
|
const parseSuccess = Schema.decode(Serializable.successSchema(message as any))
|
|
375
366
|
const parseFailure = Schema.decode(Serializable.failureSchema(message as any))
|
|
@@ -398,8 +389,8 @@ export const makeSerialized = <
|
|
|
398
389
|
export const makePoolSerialized = <I extends Schema.TaggedRequest.Any>(
|
|
399
390
|
options: Worker.SerializedWorkerPool.Options<I>
|
|
400
391
|
) =>
|
|
401
|
-
Effect.gen(function*(
|
|
402
|
-
const manager = yield*
|
|
392
|
+
Effect.gen(function*() {
|
|
393
|
+
const manager = yield* WorkerManager
|
|
403
394
|
const workers = new Set<Worker.SerializedWorker<I>>()
|
|
404
395
|
const acquire = pipe(
|
|
405
396
|
makeSerialized<I>(options),
|
|
@@ -412,19 +403,17 @@ export const makePoolSerialized = <I extends Schema.TaggedRequest.Any>(
|
|
|
412
403
|
: identity,
|
|
413
404
|
Effect.provideService(WorkerManager, manager)
|
|
414
405
|
)
|
|
415
|
-
const backing = yield*
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
})
|
|
427
|
-
)
|
|
406
|
+
const backing = yield* "timeToLive" in options ?
|
|
407
|
+
Pool.makeWithTTL({
|
|
408
|
+
acquire,
|
|
409
|
+
min: options.minSize,
|
|
410
|
+
max: options.maxSize,
|
|
411
|
+
timeToLive: options.timeToLive
|
|
412
|
+
}) :
|
|
413
|
+
Pool.make({
|
|
414
|
+
acquire,
|
|
415
|
+
size: options.size
|
|
416
|
+
})
|
|
428
417
|
const pool: Worker.SerializedWorkerPool<I> = {
|
|
429
418
|
backing,
|
|
430
419
|
broadcast: <Req extends I>(message: Req) =>
|