@effect/platform 0.22.0 → 0.23.0
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/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/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/package.json +27 -6
- 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/worker.ts +262 -0
- package/src/internal/workerError.ts +16 -0
- package/src/internal/workerRunner.ts +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-platform-Worker.cjs.d.mts","sourceRoot":"","sources":["../../dist/declarations/src/Worker.d.ts"],"names":[],"mappings":"AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-platform-Worker.cjs.d.ts","sourceRoot":"","sources":["../../dist/declarations/src/Worker.d.ts"],"names":[],"mappings":"AAAA"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var Context = require('effect/Context');
|
|
6
|
+
var Deferred = require('effect/Deferred');
|
|
7
|
+
var Effect = require('effect/Effect');
|
|
8
|
+
var Exit = require('effect/Exit');
|
|
9
|
+
var Fiber = require('effect/Fiber');
|
|
10
|
+
var Function = require('effect/Function');
|
|
11
|
+
var Layer = require('effect/Layer');
|
|
12
|
+
var Pool = require('effect/Pool');
|
|
13
|
+
var Queue = require('effect/Queue');
|
|
14
|
+
var Stream = require('effect/Stream');
|
|
15
|
+
|
|
16
|
+
function _interopNamespace(e) {
|
|
17
|
+
if (e && e.__esModule) return e;
|
|
18
|
+
var n = Object.create(null);
|
|
19
|
+
if (e) {
|
|
20
|
+
Object.keys(e).forEach(function (k) {
|
|
21
|
+
if (k !== 'default') {
|
|
22
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
23
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return e[k]; }
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
n["default"] = e;
|
|
31
|
+
return Object.freeze(n);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
var Context__namespace = /*#__PURE__*/_interopNamespace(Context);
|
|
35
|
+
var Deferred__namespace = /*#__PURE__*/_interopNamespace(Deferred);
|
|
36
|
+
var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
|
|
37
|
+
var Exit__namespace = /*#__PURE__*/_interopNamespace(Exit);
|
|
38
|
+
var Fiber__namespace = /*#__PURE__*/_interopNamespace(Fiber);
|
|
39
|
+
var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
|
|
40
|
+
var Pool__namespace = /*#__PURE__*/_interopNamespace(Pool);
|
|
41
|
+
var Queue__namespace = /*#__PURE__*/_interopNamespace(Queue);
|
|
42
|
+
var Stream__namespace = /*#__PURE__*/_interopNamespace(Stream);
|
|
43
|
+
|
|
44
|
+
/** @internal */
|
|
45
|
+
const defaultQueue = () => Effect__namespace.map(Queue__namespace.unbounded(), queue => ({
|
|
46
|
+
offer: (id, item) => Queue__namespace.offer(queue, [id, item]),
|
|
47
|
+
take: Queue__namespace.take(queue),
|
|
48
|
+
shutdown: Queue__namespace.shutdown(queue)
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
/** @internal */
|
|
52
|
+
const PlatformWorkerTypeId$1 = /*#__PURE__*/Symbol.for("@effect/platform/Worker/PlatformWorker");
|
|
53
|
+
|
|
54
|
+
/** @internal */
|
|
55
|
+
const PlatformWorker$1 = /*#__PURE__*/Context__namespace.Tag(PlatformWorkerTypeId$1);
|
|
56
|
+
|
|
57
|
+
/** @internal */
|
|
58
|
+
const WorkerManagerTypeId$1 = /*#__PURE__*/Symbol.for("@effect/platform/Worker/WorkerManager");
|
|
59
|
+
|
|
60
|
+
/** @internal */
|
|
61
|
+
const WorkerManager$1 = /*#__PURE__*/Context__namespace.Tag(WorkerManagerTypeId$1);
|
|
62
|
+
|
|
63
|
+
/** @internal */
|
|
64
|
+
const makeManager$1 = /*#__PURE__*/Effect__namespace.gen(function* (_) {
|
|
65
|
+
const platform = yield* _(PlatformWorker$1);
|
|
66
|
+
let idCounter = 0;
|
|
67
|
+
return WorkerManager$1.of({
|
|
68
|
+
[WorkerManagerTypeId$1]: WorkerManagerTypeId$1,
|
|
69
|
+
spawn({
|
|
70
|
+
permits = 1,
|
|
71
|
+
queue,
|
|
72
|
+
spawn,
|
|
73
|
+
transfers = _ => []
|
|
74
|
+
}) {
|
|
75
|
+
return Effect__namespace.gen(function* (_) {
|
|
76
|
+
const id = idCounter++;
|
|
77
|
+
const fiberId = yield* _(Effect__namespace.fiberId);
|
|
78
|
+
let requestIdCounter = 0;
|
|
79
|
+
const readyLatch = yield* _(Deferred__namespace.make());
|
|
80
|
+
const semaphore = yield* _(Effect__namespace.makeSemaphore(permits));
|
|
81
|
+
const requestMap = new Map();
|
|
82
|
+
const outbound = queue ?? (yield* _(defaultQueue()));
|
|
83
|
+
yield* _(Effect__namespace.addFinalizer(() => outbound.shutdown));
|
|
84
|
+
const backing = yield* _(platform.spawn(spawn(id)));
|
|
85
|
+
yield* _(Effect__namespace.addFinalizer(() => Effect__namespace.zipRight(Effect__namespace.forEach(requestMap.values(), ([queue]) => Queue__namespace.shutdown(queue), {
|
|
86
|
+
discard: true
|
|
87
|
+
}), Effect__namespace.sync(() => requestMap.clear()))));
|
|
88
|
+
const handleMessage = msg => Effect__namespace.suspend(() => {
|
|
89
|
+
switch (msg[0]) {
|
|
90
|
+
case 0:
|
|
91
|
+
{
|
|
92
|
+
return Deferred__namespace.complete(readyLatch, Effect__namespace.unit);
|
|
93
|
+
}
|
|
94
|
+
case 1:
|
|
95
|
+
{
|
|
96
|
+
const response = msg[1];
|
|
97
|
+
const queue = requestMap.get(response[0]);
|
|
98
|
+
if (!queue) return Effect__namespace.unit;
|
|
99
|
+
switch (response[1]) {
|
|
100
|
+
// data
|
|
101
|
+
case 0:
|
|
102
|
+
{
|
|
103
|
+
return Queue__namespace.offer(queue[0], Exit__namespace.succeed(response[2]));
|
|
104
|
+
}
|
|
105
|
+
// end
|
|
106
|
+
case 1:
|
|
107
|
+
{
|
|
108
|
+
return response.length === 2 ? Queue__namespace.shutdown(queue[0]) : Effect__namespace.zipRight(Queue__namespace.offer(queue[0], Exit__namespace.succeed(response[2])), Queue__namespace.shutdown(queue[0]));
|
|
109
|
+
}
|
|
110
|
+
// error / defect
|
|
111
|
+
case 2:
|
|
112
|
+
case 3:
|
|
113
|
+
{
|
|
114
|
+
return Effect__namespace.zipRight(Queue__namespace.offer(queue[0], response[1] === 2 ? Exit__namespace.fail(response[2]) : Exit__namespace.die(response[2])), Queue__namespace.shutdown(queue[0]));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
const executeAcquire = request => Effect__namespace.tap(Effect__namespace.all([Effect__namespace.sync(() => requestIdCounter++), Queue__namespace.unbounded(), Deferred__namespace.make()]), ([id, queue, deferred]) => Effect__namespace.suspend(() => {
|
|
121
|
+
requestMap.set(id, [queue, deferred]);
|
|
122
|
+
return outbound.offer(id, request);
|
|
123
|
+
}));
|
|
124
|
+
const executeRelease = ([id,, deferred], exit) => {
|
|
125
|
+
const release = Effect__namespace.zipRight(Deferred__namespace.complete(deferred, Effect__namespace.unit), Effect__namespace.sync(() => requestMap.delete(id)));
|
|
126
|
+
return Exit__namespace.isInterrupted(exit) ? Effect__namespace.zipRight(backing.send([id, 1]), release) : release;
|
|
127
|
+
};
|
|
128
|
+
const execute = request => Stream__namespace.flatMap(Stream__namespace.acquireRelease(executeAcquire(request), executeRelease), ([, queue]) => Stream__namespace.flatten(Stream__namespace.fromQueue(queue)));
|
|
129
|
+
const executeEffect = request => Effect__namespace.acquireUseRelease(executeAcquire(request), ([, queue]) => Effect__namespace.flatten(Queue__namespace.take(queue)), executeRelease);
|
|
130
|
+
const handleMessages = yield* _(Queue__namespace.take(backing.queue), Effect__namespace.flatMap(handleMessage), Effect__namespace.forever, Effect__namespace.forkDaemon);
|
|
131
|
+
yield* _(Effect__namespace.addFinalizer(() => handleMessages.interruptAsFork(fiberId)));
|
|
132
|
+
const postMessages = yield* _(semaphore.take(1), Effect__namespace.zipRight(outbound.take), Effect__namespace.flatMap(([id, request]) => Function.pipe(Effect__namespace.suspend(() => {
|
|
133
|
+
const result = requestMap.get(id);
|
|
134
|
+
if (!result) return Effect__namespace.unit;
|
|
135
|
+
const transferables = transfers(request);
|
|
136
|
+
return Effect__namespace.zipRight(backing.send([id, 0, request], transferables), Deferred__namespace.await(result[1]));
|
|
137
|
+
}), Effect__namespace.ensuring(semaphore.release(1)), Effect__namespace.fork)), Effect__namespace.forever, Effect__namespace.forkDaemon);
|
|
138
|
+
yield* _(Effect__namespace.addFinalizer(() => postMessages.interruptAsFork(fiberId)));
|
|
139
|
+
const join = Effect__namespace.race(Fiber__namespace.joinAll([handleMessages, postMessages]), backing.join);
|
|
140
|
+
return {
|
|
141
|
+
id,
|
|
142
|
+
join,
|
|
143
|
+
execute,
|
|
144
|
+
executeEffect
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
/** @internal */
|
|
152
|
+
const layerManager$1 = /*#__PURE__*/Layer__namespace.effect(WorkerManager$1, makeManager$1);
|
|
153
|
+
|
|
154
|
+
/** @internal */
|
|
155
|
+
const makePool$1 = () => options => Effect__namespace.gen(function* (_) {
|
|
156
|
+
const manager = yield* _(WorkerManager$1);
|
|
157
|
+
const backing = yield* _("timeToLive" in options ? Pool__namespace.makeWithTTL({
|
|
158
|
+
acquire: manager.spawn(options),
|
|
159
|
+
min: options.minSize,
|
|
160
|
+
max: options.maxSize,
|
|
161
|
+
timeToLive: options.timeToLive
|
|
162
|
+
}) : Pool__namespace.make({
|
|
163
|
+
acquire: manager.spawn(options),
|
|
164
|
+
size: options.size
|
|
165
|
+
}));
|
|
166
|
+
const pool = {
|
|
167
|
+
backing,
|
|
168
|
+
execute: message => Stream__namespace.unwrap(Effect__namespace.map(Effect__namespace.scoped(backing.get()), worker => worker.execute(message))),
|
|
169
|
+
executeEffect: message => Effect__namespace.flatMap(Effect__namespace.scoped(backing.get()), worker => worker.executeEffect(message))
|
|
170
|
+
};
|
|
171
|
+
return pool;
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
/** @internal */
|
|
175
|
+
const makePoolLayer$1 = managerLayer => (tag, options) => Layer__namespace.provide(managerLayer, Layer__namespace.scoped(tag, makePool$1()(options)));
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @since 1.0.0
|
|
179
|
+
*/
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @since 1.0.0
|
|
183
|
+
* @category models
|
|
184
|
+
*/
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* @since 1.0.0
|
|
188
|
+
* @category models
|
|
189
|
+
*/
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @since 1.0.0
|
|
193
|
+
* @category type ids
|
|
194
|
+
*/
|
|
195
|
+
const PlatformWorkerTypeId = PlatformWorkerTypeId$1;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @since 1.0.0
|
|
199
|
+
* @category type ids
|
|
200
|
+
*/
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* @since 1.0.0
|
|
204
|
+
* @category models
|
|
205
|
+
*/
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @since 1.0.0
|
|
209
|
+
* @category tags
|
|
210
|
+
*/
|
|
211
|
+
const PlatformWorker = PlatformWorker$1;
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @since 1.0.0
|
|
215
|
+
* @category models
|
|
216
|
+
*/
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* @since 1.0.0
|
|
220
|
+
* @category models
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @since 1.0.0
|
|
225
|
+
* @category models
|
|
226
|
+
*/
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* @since 1.0.0
|
|
230
|
+
* @category models
|
|
231
|
+
*/
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* @category models
|
|
235
|
+
* @since 1.0.0
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* @since 1.0.0
|
|
240
|
+
* @category type ids
|
|
241
|
+
*/
|
|
242
|
+
const WorkerManagerTypeId = WorkerManagerTypeId$1;
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* @since 1.0.0
|
|
246
|
+
* @category type ids
|
|
247
|
+
*/
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* @since 1.0.0
|
|
251
|
+
* @category models
|
|
252
|
+
*/
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* @since 1.0.0
|
|
256
|
+
* @category tags
|
|
257
|
+
*/
|
|
258
|
+
const WorkerManager = WorkerManager$1;
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* @since 1.0.0
|
|
262
|
+
* @category constructors
|
|
263
|
+
*/
|
|
264
|
+
const makeManager = makeManager$1;
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* @since 1.0.0
|
|
268
|
+
* @category layers
|
|
269
|
+
*/
|
|
270
|
+
const layerManager = layerManager$1;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @since 1.0.0
|
|
274
|
+
* @category constructors
|
|
275
|
+
*/
|
|
276
|
+
const makePool = makePool$1;
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* @since 1.0.0
|
|
280
|
+
* @category constructors
|
|
281
|
+
*/
|
|
282
|
+
const makePoolLayer = makePoolLayer$1;
|
|
283
|
+
|
|
284
|
+
exports.PlatformWorker = PlatformWorker;
|
|
285
|
+
exports.PlatformWorkerTypeId = PlatformWorkerTypeId;
|
|
286
|
+
exports.WorkerManager = WorkerManager;
|
|
287
|
+
exports.WorkerManagerTypeId = WorkerManagerTypeId;
|
|
288
|
+
exports.layerManager = layerManager;
|
|
289
|
+
exports.makeManager = makeManager;
|
|
290
|
+
exports.makePool = makePool;
|
|
291
|
+
exports.makePoolLayer = makePoolLayer;
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var Context = require('effect/Context');
|
|
6
|
+
var Deferred = require('effect/Deferred');
|
|
7
|
+
var Effect = require('effect/Effect');
|
|
8
|
+
var Exit = require('effect/Exit');
|
|
9
|
+
var Fiber = require('effect/Fiber');
|
|
10
|
+
var Function = require('effect/Function');
|
|
11
|
+
var Layer = require('effect/Layer');
|
|
12
|
+
var Pool = require('effect/Pool');
|
|
13
|
+
var Queue = require('effect/Queue');
|
|
14
|
+
var Stream = require('effect/Stream');
|
|
15
|
+
|
|
16
|
+
function _interopNamespace(e) {
|
|
17
|
+
if (e && e.__esModule) return e;
|
|
18
|
+
var n = Object.create(null);
|
|
19
|
+
if (e) {
|
|
20
|
+
Object.keys(e).forEach(function (k) {
|
|
21
|
+
if (k !== 'default') {
|
|
22
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
23
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return e[k]; }
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
n["default"] = e;
|
|
31
|
+
return Object.freeze(n);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
var Context__namespace = /*#__PURE__*/_interopNamespace(Context);
|
|
35
|
+
var Deferred__namespace = /*#__PURE__*/_interopNamespace(Deferred);
|
|
36
|
+
var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
|
|
37
|
+
var Exit__namespace = /*#__PURE__*/_interopNamespace(Exit);
|
|
38
|
+
var Fiber__namespace = /*#__PURE__*/_interopNamespace(Fiber);
|
|
39
|
+
var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
|
|
40
|
+
var Pool__namespace = /*#__PURE__*/_interopNamespace(Pool);
|
|
41
|
+
var Queue__namespace = /*#__PURE__*/_interopNamespace(Queue);
|
|
42
|
+
var Stream__namespace = /*#__PURE__*/_interopNamespace(Stream);
|
|
43
|
+
|
|
44
|
+
/** @internal */
|
|
45
|
+
const defaultQueue = () => Effect__namespace.map(Queue__namespace.unbounded(), queue => ({
|
|
46
|
+
offer: (id, item) => Queue__namespace.offer(queue, [id, item]),
|
|
47
|
+
take: Queue__namespace.take(queue),
|
|
48
|
+
shutdown: Queue__namespace.shutdown(queue)
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
/** @internal */
|
|
52
|
+
const PlatformWorkerTypeId$1 = /*#__PURE__*/Symbol.for("@effect/platform/Worker/PlatformWorker");
|
|
53
|
+
|
|
54
|
+
/** @internal */
|
|
55
|
+
const PlatformWorker$1 = /*#__PURE__*/Context__namespace.Tag(PlatformWorkerTypeId$1);
|
|
56
|
+
|
|
57
|
+
/** @internal */
|
|
58
|
+
const WorkerManagerTypeId$1 = /*#__PURE__*/Symbol.for("@effect/platform/Worker/WorkerManager");
|
|
59
|
+
|
|
60
|
+
/** @internal */
|
|
61
|
+
const WorkerManager$1 = /*#__PURE__*/Context__namespace.Tag(WorkerManagerTypeId$1);
|
|
62
|
+
|
|
63
|
+
/** @internal */
|
|
64
|
+
const makeManager$1 = /*#__PURE__*/Effect__namespace.gen(function* (_) {
|
|
65
|
+
const platform = yield* _(PlatformWorker$1);
|
|
66
|
+
let idCounter = 0;
|
|
67
|
+
return WorkerManager$1.of({
|
|
68
|
+
[WorkerManagerTypeId$1]: WorkerManagerTypeId$1,
|
|
69
|
+
spawn({
|
|
70
|
+
permits = 1,
|
|
71
|
+
queue,
|
|
72
|
+
spawn,
|
|
73
|
+
transfers = _ => []
|
|
74
|
+
}) {
|
|
75
|
+
return Effect__namespace.gen(function* (_) {
|
|
76
|
+
const id = idCounter++;
|
|
77
|
+
const fiberId = yield* _(Effect__namespace.fiberId);
|
|
78
|
+
let requestIdCounter = 0;
|
|
79
|
+
const readyLatch = yield* _(Deferred__namespace.make());
|
|
80
|
+
const semaphore = yield* _(Effect__namespace.makeSemaphore(permits));
|
|
81
|
+
const requestMap = new Map();
|
|
82
|
+
const outbound = queue ?? (yield* _(defaultQueue()));
|
|
83
|
+
yield* _(Effect__namespace.addFinalizer(() => outbound.shutdown));
|
|
84
|
+
const backing = yield* _(platform.spawn(spawn(id)));
|
|
85
|
+
yield* _(Effect__namespace.addFinalizer(() => Effect__namespace.zipRight(Effect__namespace.forEach(requestMap.values(), ([queue]) => Queue__namespace.shutdown(queue), {
|
|
86
|
+
discard: true
|
|
87
|
+
}), Effect__namespace.sync(() => requestMap.clear()))));
|
|
88
|
+
const handleMessage = msg => Effect__namespace.suspend(() => {
|
|
89
|
+
switch (msg[0]) {
|
|
90
|
+
case 0:
|
|
91
|
+
{
|
|
92
|
+
return Deferred__namespace.complete(readyLatch, Effect__namespace.unit);
|
|
93
|
+
}
|
|
94
|
+
case 1:
|
|
95
|
+
{
|
|
96
|
+
const response = msg[1];
|
|
97
|
+
const queue = requestMap.get(response[0]);
|
|
98
|
+
if (!queue) return Effect__namespace.unit;
|
|
99
|
+
switch (response[1]) {
|
|
100
|
+
// data
|
|
101
|
+
case 0:
|
|
102
|
+
{
|
|
103
|
+
return Queue__namespace.offer(queue[0], Exit__namespace.succeed(response[2]));
|
|
104
|
+
}
|
|
105
|
+
// end
|
|
106
|
+
case 1:
|
|
107
|
+
{
|
|
108
|
+
return response.length === 2 ? Queue__namespace.shutdown(queue[0]) : Effect__namespace.zipRight(Queue__namespace.offer(queue[0], Exit__namespace.succeed(response[2])), Queue__namespace.shutdown(queue[0]));
|
|
109
|
+
}
|
|
110
|
+
// error / defect
|
|
111
|
+
case 2:
|
|
112
|
+
case 3:
|
|
113
|
+
{
|
|
114
|
+
return Effect__namespace.zipRight(Queue__namespace.offer(queue[0], response[1] === 2 ? Exit__namespace.fail(response[2]) : Exit__namespace.die(response[2])), Queue__namespace.shutdown(queue[0]));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
const executeAcquire = request => Effect__namespace.tap(Effect__namespace.all([Effect__namespace.sync(() => requestIdCounter++), Queue__namespace.unbounded(), Deferred__namespace.make()]), ([id, queue, deferred]) => Effect__namespace.suspend(() => {
|
|
121
|
+
requestMap.set(id, [queue, deferred]);
|
|
122
|
+
return outbound.offer(id, request);
|
|
123
|
+
}));
|
|
124
|
+
const executeRelease = ([id,, deferred], exit) => {
|
|
125
|
+
const release = Effect__namespace.zipRight(Deferred__namespace.complete(deferred, Effect__namespace.unit), Effect__namespace.sync(() => requestMap.delete(id)));
|
|
126
|
+
return Exit__namespace.isInterrupted(exit) ? Effect__namespace.zipRight(backing.send([id, 1]), release) : release;
|
|
127
|
+
};
|
|
128
|
+
const execute = request => Stream__namespace.flatMap(Stream__namespace.acquireRelease(executeAcquire(request), executeRelease), ([, queue]) => Stream__namespace.flatten(Stream__namespace.fromQueue(queue)));
|
|
129
|
+
const executeEffect = request => Effect__namespace.acquireUseRelease(executeAcquire(request), ([, queue]) => Effect__namespace.flatten(Queue__namespace.take(queue)), executeRelease);
|
|
130
|
+
const handleMessages = yield* _(Queue__namespace.take(backing.queue), Effect__namespace.flatMap(handleMessage), Effect__namespace.forever, Effect__namespace.forkDaemon);
|
|
131
|
+
yield* _(Effect__namespace.addFinalizer(() => handleMessages.interruptAsFork(fiberId)));
|
|
132
|
+
const postMessages = yield* _(semaphore.take(1), Effect__namespace.zipRight(outbound.take), Effect__namespace.flatMap(([id, request]) => Function.pipe(Effect__namespace.suspend(() => {
|
|
133
|
+
const result = requestMap.get(id);
|
|
134
|
+
if (!result) return Effect__namespace.unit;
|
|
135
|
+
const transferables = transfers(request);
|
|
136
|
+
return Effect__namespace.zipRight(backing.send([id, 0, request], transferables), Deferred__namespace.await(result[1]));
|
|
137
|
+
}), Effect__namespace.ensuring(semaphore.release(1)), Effect__namespace.fork)), Effect__namespace.forever, Effect__namespace.forkDaemon);
|
|
138
|
+
yield* _(Effect__namespace.addFinalizer(() => postMessages.interruptAsFork(fiberId)));
|
|
139
|
+
const join = Effect__namespace.race(Fiber__namespace.joinAll([handleMessages, postMessages]), backing.join);
|
|
140
|
+
return {
|
|
141
|
+
id,
|
|
142
|
+
join,
|
|
143
|
+
execute,
|
|
144
|
+
executeEffect
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
/** @internal */
|
|
152
|
+
const layerManager$1 = /*#__PURE__*/Layer__namespace.effect(WorkerManager$1, makeManager$1);
|
|
153
|
+
|
|
154
|
+
/** @internal */
|
|
155
|
+
const makePool$1 = () => options => Effect__namespace.gen(function* (_) {
|
|
156
|
+
const manager = yield* _(WorkerManager$1);
|
|
157
|
+
const backing = yield* _("timeToLive" in options ? Pool__namespace.makeWithTTL({
|
|
158
|
+
acquire: manager.spawn(options),
|
|
159
|
+
min: options.minSize,
|
|
160
|
+
max: options.maxSize,
|
|
161
|
+
timeToLive: options.timeToLive
|
|
162
|
+
}) : Pool__namespace.make({
|
|
163
|
+
acquire: manager.spawn(options),
|
|
164
|
+
size: options.size
|
|
165
|
+
}));
|
|
166
|
+
const pool = {
|
|
167
|
+
backing,
|
|
168
|
+
execute: message => Stream__namespace.unwrap(Effect__namespace.map(Effect__namespace.scoped(backing.get()), worker => worker.execute(message))),
|
|
169
|
+
executeEffect: message => Effect__namespace.flatMap(Effect__namespace.scoped(backing.get()), worker => worker.executeEffect(message))
|
|
170
|
+
};
|
|
171
|
+
return pool;
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
/** @internal */
|
|
175
|
+
const makePoolLayer$1 = managerLayer => (tag, options) => Layer__namespace.provide(managerLayer, Layer__namespace.scoped(tag, makePool$1()(options)));
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @since 1.0.0
|
|
179
|
+
*/
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @since 1.0.0
|
|
183
|
+
* @category models
|
|
184
|
+
*/
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* @since 1.0.0
|
|
188
|
+
* @category models
|
|
189
|
+
*/
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @since 1.0.0
|
|
193
|
+
* @category type ids
|
|
194
|
+
*/
|
|
195
|
+
const PlatformWorkerTypeId = PlatformWorkerTypeId$1;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @since 1.0.0
|
|
199
|
+
* @category type ids
|
|
200
|
+
*/
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* @since 1.0.0
|
|
204
|
+
* @category models
|
|
205
|
+
*/
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @since 1.0.0
|
|
209
|
+
* @category tags
|
|
210
|
+
*/
|
|
211
|
+
const PlatformWorker = PlatformWorker$1;
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @since 1.0.0
|
|
215
|
+
* @category models
|
|
216
|
+
*/
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* @since 1.0.0
|
|
220
|
+
* @category models
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @since 1.0.0
|
|
225
|
+
* @category models
|
|
226
|
+
*/
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* @since 1.0.0
|
|
230
|
+
* @category models
|
|
231
|
+
*/
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* @category models
|
|
235
|
+
* @since 1.0.0
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* @since 1.0.0
|
|
240
|
+
* @category type ids
|
|
241
|
+
*/
|
|
242
|
+
const WorkerManagerTypeId = WorkerManagerTypeId$1;
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* @since 1.0.0
|
|
246
|
+
* @category type ids
|
|
247
|
+
*/
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* @since 1.0.0
|
|
251
|
+
* @category models
|
|
252
|
+
*/
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* @since 1.0.0
|
|
256
|
+
* @category tags
|
|
257
|
+
*/
|
|
258
|
+
const WorkerManager = WorkerManager$1;
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* @since 1.0.0
|
|
262
|
+
* @category constructors
|
|
263
|
+
*/
|
|
264
|
+
const makeManager = makeManager$1;
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* @since 1.0.0
|
|
268
|
+
* @category layers
|
|
269
|
+
*/
|
|
270
|
+
const layerManager = layerManager$1;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @since 1.0.0
|
|
274
|
+
* @category constructors
|
|
275
|
+
*/
|
|
276
|
+
const makePool = makePool$1;
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* @since 1.0.0
|
|
280
|
+
* @category constructors
|
|
281
|
+
*/
|
|
282
|
+
const makePoolLayer = makePoolLayer$1;
|
|
283
|
+
|
|
284
|
+
exports.PlatformWorker = PlatformWorker;
|
|
285
|
+
exports.PlatformWorkerTypeId = PlatformWorkerTypeId;
|
|
286
|
+
exports.WorkerManager = WorkerManager;
|
|
287
|
+
exports.WorkerManagerTypeId = WorkerManagerTypeId;
|
|
288
|
+
exports.layerManager = layerManager;
|
|
289
|
+
exports.makeManager = makeManager;
|
|
290
|
+
exports.makePool = makePool;
|
|
291
|
+
exports.makePoolLayer = makePoolLayer;
|