@effect/platform 0.26.5 → 0.26.7

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.
@@ -78,6 +78,7 @@ const makeManager$1 = /*#__PURE__*/Effect__namespace.gen(function* (_) {
78
78
  }) {
79
79
  return Effect__namespace.gen(function* (_) {
80
80
  const id = idCounter++;
81
+ const fiberId = yield* _(Effect__namespace.fiberId);
81
82
  let requestIdCounter = 0;
82
83
  const readyLatch = yield* _(Deferred__namespace.make());
83
84
  const semaphore = yield* _(Effect__namespace.makeSemaphore(permits));
@@ -136,15 +137,20 @@ const makeManager$1 = /*#__PURE__*/Effect__namespace.gen(function* (_) {
136
137
  return Stream__namespace.fromChannel(loop);
137
138
  });
138
139
  const executeEffect = request => Effect__namespace.acquireUseRelease(executeAcquire(request), ([, queue]) => Effect__namespace.flatten(Queue__namespace.take(queue)), executeRelease);
139
- const handleMessages = yield* _(Queue__namespace.take(backing.queue), Effect__namespace.flatMap(handleMessage), Effect__namespace.forever, Effect__namespace.forkScoped);
140
- const postMessages = yield* _(semaphore.take(1), Effect__namespace.zipRight(outbound.take), Effect__namespace.flatMap(([id, request]) => Function.pipe(Effect__namespace.suspend(() => {
140
+ const handleMessages = Function.pipe(Queue__namespace.take(backing.queue), Effect__namespace.flatMap(handleMessage), Effect__namespace.forever);
141
+ const postMessages = Function.pipe(semaphore.take(1), Effect__namespace.zipRight(outbound.take), Effect__namespace.flatMap(([id, request]) => Function.pipe(Effect__namespace.suspend(() => {
141
142
  const result = requestMap.get(id);
142
143
  if (!result) return Effect__namespace.unit;
143
144
  const transferables = transfers(request);
144
145
  const payload = encode ? encode(request) : request;
145
146
  return Effect__namespace.zipRight(backing.send([id, 0, payload], transferables), Deferred__namespace.await(result[1]));
146
- }), Effect__namespace.ensuring(semaphore.release(1)), Effect__namespace.fork)), Effect__namespace.forever, Effect__namespace.forkScoped);
147
- const join = Effect__namespace.race(Fiber__namespace.joinAll([handleMessages, postMessages]), backing.join);
147
+ }), Effect__namespace.ensuring(semaphore.release(1)), Effect__namespace.fork)), Effect__namespace.forever);
148
+ const fiber = yield* _(Effect__namespace.all([backing.run, handleMessages, postMessages], {
149
+ concurrency: "unbounded",
150
+ discard: true
151
+ }), Effect__namespace.forkDaemon);
152
+ yield* _(Effect__namespace.addFinalizer(() => fiber.interruptAsFork(fiberId)));
153
+ const join = Fiber__namespace.join(fiber);
148
154
  return {
149
155
  id,
150
156
  join,
@@ -163,16 +169,14 @@ const layerManager$1 = /*#__PURE__*/Layer__namespace.effect(WorkerManager$1, mak
163
169
  const makePool$1 = () => options => Effect__namespace.gen(function* (_) {
164
170
  const manager = yield* _(WorkerManager$1);
165
171
  const workers = new Set();
166
- const backing = yield* _(
167
- // "timeToLive" in options ?
168
- // Pool.makeWithTTL({
169
- // acquire: manager.spawn<I, E, O>(options),
170
- // min: options.minSize,
171
- // max: options.maxSize,
172
- // timeToLive: options.timeToLive
173
- // }) :
174
- Pool__namespace.make({
175
- acquire: Function.pipe(manager.spawn(options), Effect__namespace.tap(worker => Effect__namespace.sync(() => workers.add(worker))), Effect__namespace.tap(worker => Effect__namespace.addFinalizer(() => Effect__namespace.sync(() => workers.delete(worker)))), options.onCreate ? Effect__namespace.tap(options.onCreate) : Function.identity),
172
+ const acquire = Function.pipe(manager.spawn(options), Effect__namespace.tap(worker => Effect__namespace.sync(() => workers.add(worker))), Effect__namespace.tap(worker => Effect__namespace.addFinalizer(() => Effect__namespace.sync(() => workers.delete(worker)))), options.onCreate ? Effect__namespace.tap(options.onCreate) : Function.identity);
173
+ const backing = yield* _("timeToLive" in options ? Pool__namespace.makeWithTTL({
174
+ acquire,
175
+ min: options.minSize,
176
+ max: options.maxSize,
177
+ timeToLive: options.timeToLive
178
+ }) : Pool__namespace.make({
179
+ acquire,
176
180
  size: options.size
177
181
  }));
178
182
  const pool = {
@@ -185,7 +189,7 @@ const makePool$1 = () => options => Effect__namespace.gen(function* (_) {
185
189
  executeEffect: message => Effect__namespace.flatMap(Effect__namespace.scoped(backing.get()), worker => worker.executeEffect(message))
186
190
  };
187
191
  return pool;
188
- });
192
+ }).pipe(Effect__namespace.parallelFinalizers);
189
193
 
190
194
  /** @internal */
191
195
  const makePoolLayer$1 = managerLayer => (tag, options) => Layer__namespace.provide(managerLayer, Layer__namespace.scoped(tag, makePool$1()(options)));
@@ -78,6 +78,7 @@ const makeManager$1 = /*#__PURE__*/Effect__namespace.gen(function* (_) {
78
78
  }) {
79
79
  return Effect__namespace.gen(function* (_) {
80
80
  const id = idCounter++;
81
+ const fiberId = yield* _(Effect__namespace.fiberId);
81
82
  let requestIdCounter = 0;
82
83
  const readyLatch = yield* _(Deferred__namespace.make());
83
84
  const semaphore = yield* _(Effect__namespace.makeSemaphore(permits));
@@ -136,15 +137,20 @@ const makeManager$1 = /*#__PURE__*/Effect__namespace.gen(function* (_) {
136
137
  return Stream__namespace.fromChannel(loop);
137
138
  });
138
139
  const executeEffect = request => Effect__namespace.acquireUseRelease(executeAcquire(request), ([, queue]) => Effect__namespace.flatten(Queue__namespace.take(queue)), executeRelease);
139
- const handleMessages = yield* _(Queue__namespace.take(backing.queue), Effect__namespace.flatMap(handleMessage), Effect__namespace.forever, Effect__namespace.forkScoped);
140
- const postMessages = yield* _(semaphore.take(1), Effect__namespace.zipRight(outbound.take), Effect__namespace.flatMap(([id, request]) => Function.pipe(Effect__namespace.suspend(() => {
140
+ const handleMessages = Function.pipe(Queue__namespace.take(backing.queue), Effect__namespace.flatMap(handleMessage), Effect__namespace.forever);
141
+ const postMessages = Function.pipe(semaphore.take(1), Effect__namespace.zipRight(outbound.take), Effect__namespace.flatMap(([id, request]) => Function.pipe(Effect__namespace.suspend(() => {
141
142
  const result = requestMap.get(id);
142
143
  if (!result) return Effect__namespace.unit;
143
144
  const transferables = transfers(request);
144
145
  const payload = encode ? encode(request) : request;
145
146
  return Effect__namespace.zipRight(backing.send([id, 0, payload], transferables), Deferred__namespace.await(result[1]));
146
- }), Effect__namespace.ensuring(semaphore.release(1)), Effect__namespace.fork)), Effect__namespace.forever, Effect__namespace.forkScoped);
147
- const join = Effect__namespace.race(Fiber__namespace.joinAll([handleMessages, postMessages]), backing.join);
147
+ }), Effect__namespace.ensuring(semaphore.release(1)), Effect__namespace.fork)), Effect__namespace.forever);
148
+ const fiber = yield* _(Effect__namespace.all([backing.run, handleMessages, postMessages], {
149
+ concurrency: "unbounded",
150
+ discard: true
151
+ }), Effect__namespace.forkDaemon);
152
+ yield* _(Effect__namespace.addFinalizer(() => fiber.interruptAsFork(fiberId)));
153
+ const join = Fiber__namespace.join(fiber);
148
154
  return {
149
155
  id,
150
156
  join,
@@ -163,16 +169,14 @@ const layerManager$1 = /*#__PURE__*/Layer__namespace.effect(WorkerManager$1, mak
163
169
  const makePool$1 = () => options => Effect__namespace.gen(function* (_) {
164
170
  const manager = yield* _(WorkerManager$1);
165
171
  const workers = new Set();
166
- const backing = yield* _(
167
- // "timeToLive" in options ?
168
- // Pool.makeWithTTL({
169
- // acquire: manager.spawn<I, E, O>(options),
170
- // min: options.minSize,
171
- // max: options.maxSize,
172
- // timeToLive: options.timeToLive
173
- // }) :
174
- Pool__namespace.make({
175
- acquire: Function.pipe(manager.spawn(options), Effect__namespace.tap(worker => Effect__namespace.sync(() => workers.add(worker))), Effect__namespace.tap(worker => Effect__namespace.addFinalizer(() => Effect__namespace.sync(() => workers.delete(worker)))), options.onCreate ? Effect__namespace.tap(options.onCreate) : Function.identity),
172
+ const acquire = Function.pipe(manager.spawn(options), Effect__namespace.tap(worker => Effect__namespace.sync(() => workers.add(worker))), Effect__namespace.tap(worker => Effect__namespace.addFinalizer(() => Effect__namespace.sync(() => workers.delete(worker)))), options.onCreate ? Effect__namespace.tap(options.onCreate) : Function.identity);
173
+ const backing = yield* _("timeToLive" in options ? Pool__namespace.makeWithTTL({
174
+ acquire,
175
+ min: options.minSize,
176
+ max: options.maxSize,
177
+ timeToLive: options.timeToLive
178
+ }) : Pool__namespace.make({
179
+ acquire,
176
180
  size: options.size
177
181
  }));
178
182
  const pool = {
@@ -185,7 +189,7 @@ const makePool$1 = () => options => Effect__namespace.gen(function* (_) {
185
189
  executeEffect: message => Effect__namespace.flatMap(Effect__namespace.scoped(backing.get()), worker => worker.executeEffect(message))
186
190
  };
187
191
  return pool;
188
- });
192
+ }).pipe(Effect__namespace.parallelFinalizers);
189
193
 
190
194
  /** @internal */
191
195
  const makePoolLayer$1 = managerLayer => (tag, options) => Layer__namespace.provide(managerLayer, Layer__namespace.scoped(tag, makePool$1()(options)));
@@ -45,6 +45,7 @@ const makeManager$1 = /*#__PURE__*/Effect.gen(function* (_) {
45
45
  }) {
46
46
  return Effect.gen(function* (_) {
47
47
  const id = idCounter++;
48
+ const fiberId = yield* _(Effect.fiberId);
48
49
  let requestIdCounter = 0;
49
50
  const readyLatch = yield* _(Deferred.make());
50
51
  const semaphore = yield* _(Effect.makeSemaphore(permits));
@@ -103,15 +104,20 @@ const makeManager$1 = /*#__PURE__*/Effect.gen(function* (_) {
103
104
  return Stream.fromChannel(loop);
104
105
  });
105
106
  const executeEffect = request => Effect.acquireUseRelease(executeAcquire(request), ([, queue]) => Effect.flatten(Queue.take(queue)), executeRelease);
106
- const handleMessages = yield* _(Queue.take(backing.queue), Effect.flatMap(handleMessage), Effect.forever, Effect.forkScoped);
107
- const postMessages = yield* _(semaphore.take(1), Effect.zipRight(outbound.take), Effect.flatMap(([id, request]) => pipe(Effect.suspend(() => {
107
+ const handleMessages = pipe(Queue.take(backing.queue), Effect.flatMap(handleMessage), Effect.forever);
108
+ const postMessages = pipe(semaphore.take(1), Effect.zipRight(outbound.take), Effect.flatMap(([id, request]) => pipe(Effect.suspend(() => {
108
109
  const result = requestMap.get(id);
109
110
  if (!result) return Effect.unit;
110
111
  const transferables = transfers(request);
111
112
  const payload = encode ? encode(request) : request;
112
113
  return Effect.zipRight(backing.send([id, 0, payload], transferables), Deferred.await(result[1]));
113
- }), Effect.ensuring(semaphore.release(1)), Effect.fork)), Effect.forever, Effect.forkScoped);
114
- const join = Effect.race(Fiber.joinAll([handleMessages, postMessages]), backing.join);
114
+ }), Effect.ensuring(semaphore.release(1)), Effect.fork)), Effect.forever);
115
+ const fiber = yield* _(Effect.all([backing.run, handleMessages, postMessages], {
116
+ concurrency: "unbounded",
117
+ discard: true
118
+ }), Effect.forkDaemon);
119
+ yield* _(Effect.addFinalizer(() => fiber.interruptAsFork(fiberId)));
120
+ const join = Fiber.join(fiber);
115
121
  return {
116
122
  id,
117
123
  join,
@@ -130,16 +136,14 @@ const layerManager$1 = /*#__PURE__*/Layer.effect(WorkerManager$1, makeManager$1)
130
136
  const makePool$1 = () => options => Effect.gen(function* (_) {
131
137
  const manager = yield* _(WorkerManager$1);
132
138
  const workers = new Set();
133
- const backing = yield* _(
134
- // "timeToLive" in options ?
135
- // Pool.makeWithTTL({
136
- // acquire: manager.spawn<I, E, O>(options),
137
- // min: options.minSize,
138
- // max: options.maxSize,
139
- // timeToLive: options.timeToLive
140
- // }) :
141
- Pool.make({
142
- acquire: pipe(manager.spawn(options), Effect.tap(worker => Effect.sync(() => workers.add(worker))), Effect.tap(worker => Effect.addFinalizer(() => Effect.sync(() => workers.delete(worker)))), options.onCreate ? Effect.tap(options.onCreate) : identity),
139
+ const acquire = pipe(manager.spawn(options), Effect.tap(worker => Effect.sync(() => workers.add(worker))), Effect.tap(worker => Effect.addFinalizer(() => Effect.sync(() => workers.delete(worker)))), options.onCreate ? Effect.tap(options.onCreate) : identity);
140
+ const backing = yield* _("timeToLive" in options ? Pool.makeWithTTL({
141
+ acquire,
142
+ min: options.minSize,
143
+ max: options.maxSize,
144
+ timeToLive: options.timeToLive
145
+ }) : Pool.make({
146
+ acquire,
143
147
  size: options.size
144
148
  }));
145
149
  const pool = {
@@ -152,7 +156,7 @@ const makePool$1 = () => options => Effect.gen(function* (_) {
152
156
  executeEffect: message => Effect.flatMap(Effect.scoped(backing.get()), worker => worker.executeEffect(message))
153
157
  };
154
158
  return pool;
155
- });
159
+ }).pipe(Effect.parallelFinalizers);
156
160
 
157
161
  /** @internal */
158
162
  const makePoolLayer$1 = managerLayer => (tag, options) => Layer.provide(managerLayer, Layer.scoped(tag, makePool$1()(options)));
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import type { Effect } from "effect";
5
5
  import type * as Context from "effect/Context";
6
+ import type * as Duration from "effect/Duration";
6
7
  import type * as Layer from "effect/Layer";
7
8
  import type * as Pool from "effect/Pool";
8
9
  import type * as Queue from "effect/Queue";
@@ -14,7 +15,7 @@ import type { WorkerError } from "./WorkerError.js";
14
15
  * @category models
15
16
  */
16
17
  export interface BackingWorker<I, O> {
17
- readonly join: Effect.Effect<never, WorkerError, never>;
18
+ readonly run: Effect.Effect<never, WorkerError, never>;
18
19
  readonly send: (message: I, transfers?: ReadonlyArray<unknown>) => Effect.Effect<never, never, void>;
19
20
  readonly queue: Queue.Dequeue<BackingWorker.Message<O>>;
20
21
  }
@@ -111,6 +112,11 @@ export declare namespace WorkerPool {
111
112
  type Options<I, W = unknown> = Worker.Options<I, W> & ({
112
113
  readonly onCreate?: (worker: Worker<I, unknown, unknown>) => Effect.Effect<never, WorkerError, void>;
113
114
  readonly size: number;
115
+ } | {
116
+ readonly onCreate?: (worker: Worker<I, unknown, unknown>) => Effect.Effect<never, WorkerError, void>;
117
+ readonly minSize: number;
118
+ readonly maxSize: number;
119
+ readonly timeToLive: Duration.DurationInput;
114
120
  });
115
121
  }
116
122
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Worker.d.ts","sourceRoot":"../../../src","sources":["Worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Worker.d.ts","sourceRoot":"../../../src","sources":["Worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/platform",
3
- "version": "0.26.5",
3
+ "version": "0.26.7",
4
4
  "description": "Unified interfaces for common platform-specific services",
5
5
  "main": "dist/effect-platform.cjs.js",
6
6
  "module": "dist/effect-platform.esm.js",
package/src/Worker.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import type { Effect } from "effect"
5
5
  import type * as Context from "effect/Context"
6
+ import type * as Duration from "effect/Duration"
6
7
  import type * as Layer from "effect/Layer"
7
8
  import type * as Pool from "effect/Pool"
8
9
  import type * as Queue from "effect/Queue"
@@ -16,7 +17,7 @@ import type { WorkerError } from "./WorkerError"
16
17
  * @category models
17
18
  */
18
19
  export interface BackingWorker<I, O> {
19
- readonly join: Effect.Effect<never, WorkerError, never>
20
+ readonly run: Effect.Effect<never, WorkerError, never>
20
21
  readonly send: (message: I, transfers?: ReadonlyArray<unknown>) => Effect.Effect<never, never, void>
21
22
  readonly queue: Queue.Dequeue<BackingWorker.Message<O>>
22
23
  }
@@ -131,10 +132,11 @@ export declare namespace WorkerPool {
131
132
  & ({
132
133
  readonly onCreate?: (worker: Worker<I, unknown, unknown>) => Effect.Effect<never, WorkerError, void>
133
134
  readonly size: number
134
- // } | {
135
- // readonly minSize: number
136
- // readonly maxSize: number
137
- // readonly timeToLive: Duration.DurationInput
135
+ } | {
136
+ readonly onCreate?: (worker: Worker<I, unknown, unknown>) => Effect.Effect<never, WorkerError, void>
137
+ readonly minSize: number
138
+ readonly maxSize: number
139
+ readonly timeToLive: Duration.DurationInput
138
140
  })
139
141
  }
140
142
 
@@ -53,6 +53,7 @@ export const makeManager = Effect.gen(function*(_) {
53
53
  spawn<I, E, O>({ encode, permits = 1, queue, spawn, transfers = (_) => [] }: Worker.Worker.Options<I>) {
54
54
  return Effect.gen(function*(_) {
55
55
  const id = idCounter++
56
+ const fiberId = yield* _(Effect.fiberId)
56
57
  let requestIdCounter = 0
57
58
  const readyLatch = yield* _(Deferred.make<never, void>())
58
59
  const semaphore = yield* _(Effect.makeSemaphore(permits))
@@ -169,14 +170,13 @@ export const makeManager = Effect.gen(function*(_) {
169
170
  executeRelease
170
171
  )
171
172
 
172
- const handleMessages = yield* _(
173
+ const handleMessages = pipe(
173
174
  Queue.take(backing.queue),
174
175
  Effect.flatMap(handleMessage),
175
- Effect.forever,
176
- Effect.forkScoped
176
+ Effect.forever
177
177
  )
178
178
 
179
- const postMessages = yield* _(
179
+ const postMessages = pipe(
180
180
  semaphore.take(1),
181
181
  Effect.zipRight(outbound.take),
182
182
  Effect.flatMap(([id, request]) =>
@@ -195,17 +195,23 @@ export const makeManager = Effect.gen(function*(_) {
195
195
  Effect.fork
196
196
  )
197
197
  ),
198
- Effect.forever,
199
- Effect.forkScoped
198
+ Effect.forever
200
199
  )
201
200
 
202
- const join = Effect.race(
203
- Fiber.joinAll([
204
- handleMessages,
205
- postMessages
206
- ]),
207
- backing.join
208
- ) as Effect.Effect<never, WorkerError, never>
201
+ const fiber = yield* _(
202
+ Effect.all([backing.run, handleMessages, postMessages], {
203
+ concurrency: "unbounded",
204
+ discard: true
205
+ }) as Effect.Effect<
206
+ never,
207
+ WorkerError,
208
+ never
209
+ >,
210
+ Effect.forkDaemon
211
+ )
212
+ yield* _(Effect.addFinalizer(() => fiber.interruptAsFork(fiberId)))
213
+
214
+ const join = Fiber.join(fiber)
209
215
 
210
216
  return { id, join, execute, executeEffect }
211
217
  })
@@ -224,23 +230,24 @@ export const makePool = <W>() =>
224
230
  Effect.gen(function*(_) {
225
231
  const manager = yield* _(WorkerManager)
226
232
  const workers = new Set<Worker.Worker<I, E, O>>()
233
+ const acquire = pipe(
234
+ manager.spawn<I, E, O>(options),
235
+ Effect.tap((worker) => Effect.sync(() => workers.add(worker))),
236
+ Effect.tap((worker) => Effect.addFinalizer(() => Effect.sync(() => workers.delete(worker)))),
237
+ options.onCreate ? Effect.tap(options.onCreate) : identity
238
+ )
227
239
  const backing = yield* _(
228
- // "timeToLive" in options ?
229
- // Pool.makeWithTTL({
230
- // acquire: manager.spawn<I, E, O>(options),
231
- // min: options.minSize,
232
- // max: options.maxSize,
233
- // timeToLive: options.timeToLive
234
- // }) :
235
- Pool.make({
236
- acquire: pipe(
237
- manager.spawn<I, E, O>(options),
238
- Effect.tap((worker) => Effect.sync(() => workers.add(worker))),
239
- Effect.tap((worker) => Effect.addFinalizer(() => Effect.sync(() => workers.delete(worker)))),
240
- options.onCreate ? Effect.tap(options.onCreate) : identity
241
- ),
242
- size: options.size
243
- })
240
+ "timeToLive" in options ?
241
+ Pool.makeWithTTL({
242
+ acquire,
243
+ min: options.minSize,
244
+ max: options.maxSize,
245
+ timeToLive: options.timeToLive
246
+ }) :
247
+ Pool.make({
248
+ acquire,
249
+ size: options.size
250
+ })
244
251
  )
245
252
  const pool: Worker.WorkerPool<I, E, O> = {
246
253
  backing,
@@ -264,7 +271,9 @@ export const makePool = <W>() =>
264
271
  }
265
272
 
266
273
  return pool
267
- })
274
+ }).pipe(
275
+ Effect.parallelFinalizers
276
+ )
268
277
 
269
278
  /** @internal */
270
279
  export const makePoolLayer = <W>(managerLayer: Layer.Layer<never, never, Worker.WorkerManager>) =>