@effect/platform-browser 0.10.0 → 0.10.2

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.
Files changed (36) hide show
  1. package/Worker/dist/effect-platform-browser-Worker.cjs.d.mts +2 -0
  2. package/Worker/dist/effect-platform-browser-Worker.cjs.d.mts.map +1 -0
  3. package/Worker/dist/effect-platform-browser-Worker.cjs.d.ts +2 -0
  4. package/Worker/dist/effect-platform-browser-Worker.cjs.d.ts.map +1 -0
  5. package/Worker/dist/effect-platform-browser-Worker.cjs.dev.js +125 -0
  6. package/Worker/dist/effect-platform-browser-Worker.cjs.js +7 -0
  7. package/Worker/dist/effect-platform-browser-Worker.cjs.mjs +1 -0
  8. package/Worker/dist/effect-platform-browser-Worker.cjs.prod.js +125 -0
  9. package/Worker/dist/effect-platform-browser-Worker.esm.js +90 -0
  10. package/Worker/package.json +4 -0
  11. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.d.mts +2 -0
  12. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.d.mts.map +1 -0
  13. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.d.ts +2 -0
  14. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.d.ts.map +1 -0
  15. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.dev.js +109 -0
  16. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.js +7 -0
  17. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.mjs +1 -0
  18. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.prod.js +109 -0
  19. package/WorkerRunner/dist/effect-platform-browser-WorkerRunner.esm.js +77 -0
  20. package/WorkerRunner/package.json +4 -0
  21. package/dist/declarations/src/Worker.d.ts +35 -0
  22. package/dist/declarations/src/Worker.d.ts.map +1 -0
  23. package/dist/declarations/src/WorkerRunner.d.ts +20 -0
  24. package/dist/declarations/src/WorkerRunner.d.ts.map +1 -0
  25. package/dist/declarations/src/index.d.ts +12 -0
  26. package/dist/declarations/src/index.d.ts.map +1 -1
  27. package/dist/effect-platform-browser.cjs.dev.js +6 -0
  28. package/dist/effect-platform-browser.cjs.mjs +3 -1
  29. package/dist/effect-platform-browser.cjs.prod.js +6 -0
  30. package/dist/effect-platform-browser.esm.js +4 -0
  31. package/package.json +18 -3
  32. package/src/Worker.ts +45 -0
  33. package/src/WorkerRunner.ts +25 -0
  34. package/src/index.ts +14 -0
  35. package/src/internal/worker.ts +58 -0
  36. package/src/internal/workerRunner.ts +62 -0
@@ -0,0 +1,2 @@
1
+ export * from "../../dist/declarations/src/Worker.js";
2
+ //# sourceMappingURL=effect-platform-browser-Worker.cjs.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-platform-browser-Worker.cjs.d.mts","sourceRoot":"","sources":["../../dist/declarations/src/Worker.d.ts"],"names":[],"mappings":"AAAA"}
@@ -0,0 +1,2 @@
1
+ export * from "../../dist/declarations/src/Worker";
2
+ //# sourceMappingURL=effect-platform-browser-Worker.cjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-platform-browser-Worker.cjs.d.ts","sourceRoot":"","sources":["../../dist/declarations/src/Worker.d.ts"],"names":[],"mappings":"AAAA"}
@@ -0,0 +1,125 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var Worker = require('@effect/platform/Worker');
6
+ var WorkerError = require('@effect/platform/WorkerError');
7
+ var effect = require('effect');
8
+ var Effect = require('effect/Effect');
9
+ var Layer = require('effect/Layer');
10
+ var Queue = require('effect/Queue');
11
+
12
+ function _interopNamespace(e) {
13
+ if (e && e.__esModule) return e;
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n["default"] = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var Worker__namespace = /*#__PURE__*/_interopNamespace(Worker);
31
+ var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
32
+ var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
33
+ var Queue__namespace = /*#__PURE__*/_interopNamespace(Queue);
34
+
35
+ const platformWorkerImpl = /*#__PURE__*/Worker__namespace.PlatformWorker.of({
36
+ [Worker__namespace.PlatformWorkerTypeId]: Worker__namespace.PlatformWorkerTypeId,
37
+ spawn(worker_) {
38
+ return Effect__namespace.gen(function* (_) {
39
+ const worker = worker_;
40
+ let port;
41
+ if ("port" in worker) {
42
+ port = worker.port;
43
+ port.start();
44
+ } else {
45
+ port = worker;
46
+ }
47
+ yield* _(Effect__namespace.addFinalizer(() => Effect__namespace.sync(() => port.postMessage([1]))));
48
+ const fiberId = yield* _(Effect__namespace.fiberId);
49
+ const queue = yield* _(Queue__namespace.unbounded());
50
+ const fiber = yield* _(Effect__namespace.async((resume, signal) => {
51
+ port.addEventListener("message", function (event) {
52
+ queue.unsafeOffer(event.data);
53
+ }, {
54
+ signal
55
+ });
56
+ port.addEventListener("error", function (event) {
57
+ resume(Effect__namespace.fail(WorkerError.WorkerError("unknown", event.message)));
58
+ }, {
59
+ signal
60
+ });
61
+ }), Effect__namespace.forkDaemon);
62
+ yield* _(Effect__namespace.addFinalizer(() => fiber.interruptAsFork(fiberId)));
63
+ const join = effect.Fiber.join(fiber);
64
+ const send = (message, transfers) => Effect__namespace.sync(() => port.postMessage([0, message], transfers));
65
+ return {
66
+ join,
67
+ queue,
68
+ send
69
+ };
70
+ });
71
+ }
72
+ });
73
+
74
+ /** @internal */
75
+ const layerWorker$1 = /*#__PURE__*/Layer__namespace.succeed(Worker__namespace.PlatformWorker, platformWorkerImpl);
76
+
77
+ /** @internal */
78
+ const layerManager$1 = /*#__PURE__*/Layer__namespace.provide(layerWorker$1, Worker__namespace.layerManager);
79
+
80
+ /** @internal */
81
+ const makePool$1 = /*#__PURE__*/Worker__namespace.makePool();
82
+
83
+ /** @internal */
84
+ const makePoolLayer$1 = /*#__PURE__*/Worker__namespace.makePoolLayer(layerManager$1);
85
+
86
+ /**
87
+ * @since 1.0.0
88
+ *
89
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
90
+ */
91
+
92
+ /**
93
+ * @since 1.0.0
94
+ * @category constructors
95
+ */
96
+ const makePool = makePool$1;
97
+
98
+ /**
99
+ * @since 1.0.0
100
+ * @category constructors
101
+ */
102
+ const makePoolLayer = makePoolLayer$1;
103
+
104
+ /**
105
+ * @since 1.0.0
106
+ * @category layers
107
+ */
108
+ const layerManager = layerManager$1;
109
+
110
+ /**
111
+ * @since 1.0.0
112
+ * @category layers
113
+ */
114
+ const layerWorker = layerWorker$1;
115
+
116
+ exports.layerManager = layerManager;
117
+ exports.layerWorker = layerWorker;
118
+ exports.makePool = makePool;
119
+ exports.makePoolLayer = makePoolLayer;
120
+ Object.keys(Worker).forEach(function (k) {
121
+ if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
122
+ enumerable: true,
123
+ get: function () { return Worker[k]; }
124
+ });
125
+ });
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ if (process.env.NODE_ENV === "production") {
4
+ module.exports = require("./effect-platform-browser-Worker.cjs.prod.js");
5
+ } else {
6
+ module.exports = require("./effect-platform-browser-Worker.cjs.dev.js");
7
+ }
@@ -0,0 +1 @@
1
+ export * from "./effect-platform-browser-Worker.cjs.js";
@@ -0,0 +1,125 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var Worker = require('@effect/platform/Worker');
6
+ var WorkerError = require('@effect/platform/WorkerError');
7
+ var effect = require('effect');
8
+ var Effect = require('effect/Effect');
9
+ var Layer = require('effect/Layer');
10
+ var Queue = require('effect/Queue');
11
+
12
+ function _interopNamespace(e) {
13
+ if (e && e.__esModule) return e;
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n["default"] = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var Worker__namespace = /*#__PURE__*/_interopNamespace(Worker);
31
+ var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
32
+ var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
33
+ var Queue__namespace = /*#__PURE__*/_interopNamespace(Queue);
34
+
35
+ const platformWorkerImpl = /*#__PURE__*/Worker__namespace.PlatformWorker.of({
36
+ [Worker__namespace.PlatformWorkerTypeId]: Worker__namespace.PlatformWorkerTypeId,
37
+ spawn(worker_) {
38
+ return Effect__namespace.gen(function* (_) {
39
+ const worker = worker_;
40
+ let port;
41
+ if ("port" in worker) {
42
+ port = worker.port;
43
+ port.start();
44
+ } else {
45
+ port = worker;
46
+ }
47
+ yield* _(Effect__namespace.addFinalizer(() => Effect__namespace.sync(() => port.postMessage([1]))));
48
+ const fiberId = yield* _(Effect__namespace.fiberId);
49
+ const queue = yield* _(Queue__namespace.unbounded());
50
+ const fiber = yield* _(Effect__namespace.async((resume, signal) => {
51
+ port.addEventListener("message", function (event) {
52
+ queue.unsafeOffer(event.data);
53
+ }, {
54
+ signal
55
+ });
56
+ port.addEventListener("error", function (event) {
57
+ resume(Effect__namespace.fail(WorkerError.WorkerError("unknown", event.message)));
58
+ }, {
59
+ signal
60
+ });
61
+ }), Effect__namespace.forkDaemon);
62
+ yield* _(Effect__namespace.addFinalizer(() => fiber.interruptAsFork(fiberId)));
63
+ const join = effect.Fiber.join(fiber);
64
+ const send = (message, transfers) => Effect__namespace.sync(() => port.postMessage([0, message], transfers));
65
+ return {
66
+ join,
67
+ queue,
68
+ send
69
+ };
70
+ });
71
+ }
72
+ });
73
+
74
+ /** @internal */
75
+ const layerWorker$1 = /*#__PURE__*/Layer__namespace.succeed(Worker__namespace.PlatformWorker, platformWorkerImpl);
76
+
77
+ /** @internal */
78
+ const layerManager$1 = /*#__PURE__*/Layer__namespace.provide(layerWorker$1, Worker__namespace.layerManager);
79
+
80
+ /** @internal */
81
+ const makePool$1 = /*#__PURE__*/Worker__namespace.makePool();
82
+
83
+ /** @internal */
84
+ const makePoolLayer$1 = /*#__PURE__*/Worker__namespace.makePoolLayer(layerManager$1);
85
+
86
+ /**
87
+ * @since 1.0.0
88
+ *
89
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
90
+ */
91
+
92
+ /**
93
+ * @since 1.0.0
94
+ * @category constructors
95
+ */
96
+ const makePool = makePool$1;
97
+
98
+ /**
99
+ * @since 1.0.0
100
+ * @category constructors
101
+ */
102
+ const makePoolLayer = makePoolLayer$1;
103
+
104
+ /**
105
+ * @since 1.0.0
106
+ * @category layers
107
+ */
108
+ const layerManager = layerManager$1;
109
+
110
+ /**
111
+ * @since 1.0.0
112
+ * @category layers
113
+ */
114
+ const layerWorker = layerWorker$1;
115
+
116
+ exports.layerManager = layerManager;
117
+ exports.layerWorker = layerWorker;
118
+ exports.makePool = makePool;
119
+ exports.makePoolLayer = makePoolLayer;
120
+ Object.keys(Worker).forEach(function (k) {
121
+ if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
122
+ enumerable: true,
123
+ get: function () { return Worker[k]; }
124
+ });
125
+ });
@@ -0,0 +1,90 @@
1
+ import * as Worker from '@effect/platform/Worker';
2
+ export * from '@effect/platform/Worker';
3
+ import { WorkerError } from '@effect/platform/WorkerError';
4
+ import { Fiber } from 'effect';
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Layer from 'effect/Layer';
7
+ import * as Queue from 'effect/Queue';
8
+
9
+ const platformWorkerImpl = /*#__PURE__*/Worker.PlatformWorker.of({
10
+ [Worker.PlatformWorkerTypeId]: Worker.PlatformWorkerTypeId,
11
+ spawn(worker_) {
12
+ return Effect.gen(function* (_) {
13
+ const worker = worker_;
14
+ let port;
15
+ if ("port" in worker) {
16
+ port = worker.port;
17
+ port.start();
18
+ } else {
19
+ port = worker;
20
+ }
21
+ yield* _(Effect.addFinalizer(() => Effect.sync(() => port.postMessage([1]))));
22
+ const fiberId = yield* _(Effect.fiberId);
23
+ const queue = yield* _(Queue.unbounded());
24
+ const fiber = yield* _(Effect.async((resume, signal) => {
25
+ port.addEventListener("message", function (event) {
26
+ queue.unsafeOffer(event.data);
27
+ }, {
28
+ signal
29
+ });
30
+ port.addEventListener("error", function (event) {
31
+ resume(Effect.fail(WorkerError("unknown", event.message)));
32
+ }, {
33
+ signal
34
+ });
35
+ }), Effect.forkDaemon);
36
+ yield* _(Effect.addFinalizer(() => fiber.interruptAsFork(fiberId)));
37
+ const join = Fiber.join(fiber);
38
+ const send = (message, transfers) => Effect.sync(() => port.postMessage([0, message], transfers));
39
+ return {
40
+ join,
41
+ queue,
42
+ send
43
+ };
44
+ });
45
+ }
46
+ });
47
+
48
+ /** @internal */
49
+ const layerWorker$1 = /*#__PURE__*/Layer.succeed(Worker.PlatformWorker, platformWorkerImpl);
50
+
51
+ /** @internal */
52
+ const layerManager$1 = /*#__PURE__*/Layer.provide(layerWorker$1, Worker.layerManager);
53
+
54
+ /** @internal */
55
+ const makePool$1 = /*#__PURE__*/Worker.makePool();
56
+
57
+ /** @internal */
58
+ const makePoolLayer$1 = /*#__PURE__*/Worker.makePoolLayer(layerManager$1);
59
+
60
+ /**
61
+ * @since 1.0.0
62
+ *
63
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
64
+ */
65
+
66
+ /**
67
+ * @since 1.0.0
68
+ * @category constructors
69
+ */
70
+ const makePool = makePool$1;
71
+
72
+ /**
73
+ * @since 1.0.0
74
+ * @category constructors
75
+ */
76
+ const makePoolLayer = makePoolLayer$1;
77
+
78
+ /**
79
+ * @since 1.0.0
80
+ * @category layers
81
+ */
82
+ const layerManager = layerManager$1;
83
+
84
+ /**
85
+ * @since 1.0.0
86
+ * @category layers
87
+ */
88
+ const layerWorker = layerWorker$1;
89
+
90
+ export { layerManager, layerWorker, makePool, makePoolLayer };
@@ -0,0 +1,4 @@
1
+ {
2
+ "main": "dist/effect-platform-browser-Worker.cjs.js",
3
+ "module": "dist/effect-platform-browser-Worker.esm.js"
4
+ }
@@ -0,0 +1,2 @@
1
+ export * from "../../dist/declarations/src/WorkerRunner.js";
2
+ //# sourceMappingURL=effect-platform-browser-WorkerRunner.cjs.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-platform-browser-WorkerRunner.cjs.d.mts","sourceRoot":"","sources":["../../dist/declarations/src/WorkerRunner.d.ts"],"names":[],"mappings":"AAAA"}
@@ -0,0 +1,2 @@
1
+ export * from "../../dist/declarations/src/WorkerRunner";
2
+ //# sourceMappingURL=effect-platform-browser-WorkerRunner.cjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-platform-browser-WorkerRunner.cjs.d.ts","sourceRoot":"","sources":["../../dist/declarations/src/WorkerRunner.d.ts"],"names":[],"mappings":"AAAA"}
@@ -0,0 +1,109 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var WorkerError = require('@effect/platform/WorkerError');
6
+ var Runner = require('@effect/platform/WorkerRunner');
7
+ var Effect = require('effect/Effect');
8
+ var Layer = require('effect/Layer');
9
+ var Queue = require('effect/Queue');
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 Runner__namespace = /*#__PURE__*/_interopNamespace(Runner);
30
+ var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
31
+ var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
32
+ var Queue__namespace = /*#__PURE__*/_interopNamespace(Queue);
33
+
34
+ const platformRunnerImpl = /*#__PURE__*/Runner__namespace.PlatformRunner.of({
35
+ [Runner__namespace.PlatformRunnerTypeId]: Runner__namespace.PlatformRunnerTypeId,
36
+ start() {
37
+ return Effect__namespace.gen(function* (_) {
38
+ const port = "postMessage" in self ? self : yield* _(Effect__namespace.async((resume, signal) => {
39
+ self.addEventListener("connect", function (event) {
40
+ const port = event.ports[0];
41
+ port.start();
42
+ resume(Effect__namespace.succeed(port));
43
+ }, {
44
+ once: true,
45
+ signal
46
+ });
47
+ }));
48
+ const queue = yield* _(Queue__namespace.unbounded());
49
+ const fiber = yield* _(Effect__namespace.async((resume, signal) => {
50
+ port.addEventListener("message", function (event) {
51
+ const message = event.data;
52
+ if (message[0] === 0) {
53
+ queue.unsafeOffer(message[1]);
54
+ } else {
55
+ Effect__namespace.runFork(Queue__namespace.shutdown(queue));
56
+ }
57
+ }, {
58
+ signal
59
+ });
60
+ port.addEventListener("messageerror", function (error) {
61
+ resume(Effect__namespace.fail(WorkerError.WorkerError("decode", error.message)));
62
+ }, {
63
+ signal
64
+ });
65
+ port.addEventListener("error", function (error) {
66
+ resume(Effect__namespace.fail(WorkerError.WorkerError("unknown", error.message)));
67
+ }, {
68
+ signal
69
+ });
70
+ }), Effect__namespace.forkScoped);
71
+ const send = (message, transfer) => Effect__namespace.sync(() => port.postMessage([1, message], {
72
+ transfer: transfer
73
+ }));
74
+ // ready
75
+ port.postMessage([0]);
76
+ return {
77
+ fiber,
78
+ queue,
79
+ send
80
+ };
81
+ });
82
+ }
83
+ });
84
+
85
+ /** @internal */
86
+ const layer = /*#__PURE__*/Layer__namespace.succeed(Runner__namespace.PlatformRunner, platformRunnerImpl);
87
+
88
+ /** @internal */
89
+ const make$1 = (process, options) => Effect__namespace.provide(Runner__namespace.make(process, options), layer);
90
+
91
+ /**
92
+ * @since 1.0.0
93
+ *
94
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
95
+ */
96
+
97
+ /**
98
+ * @since 1.0.0
99
+ * @category constructors
100
+ */
101
+ const make = make$1;
102
+
103
+ exports.make = make;
104
+ Object.keys(Runner).forEach(function (k) {
105
+ if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
106
+ enumerable: true,
107
+ get: function () { return Runner[k]; }
108
+ });
109
+ });
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ if (process.env.NODE_ENV === "production") {
4
+ module.exports = require("./effect-platform-browser-WorkerRunner.cjs.prod.js");
5
+ } else {
6
+ module.exports = require("./effect-platform-browser-WorkerRunner.cjs.dev.js");
7
+ }
@@ -0,0 +1 @@
1
+ export * from "./effect-platform-browser-WorkerRunner.cjs.js";
@@ -0,0 +1,109 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var WorkerError = require('@effect/platform/WorkerError');
6
+ var Runner = require('@effect/platform/WorkerRunner');
7
+ var Effect = require('effect/Effect');
8
+ var Layer = require('effect/Layer');
9
+ var Queue = require('effect/Queue');
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 Runner__namespace = /*#__PURE__*/_interopNamespace(Runner);
30
+ var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
31
+ var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
32
+ var Queue__namespace = /*#__PURE__*/_interopNamespace(Queue);
33
+
34
+ const platformRunnerImpl = /*#__PURE__*/Runner__namespace.PlatformRunner.of({
35
+ [Runner__namespace.PlatformRunnerTypeId]: Runner__namespace.PlatformRunnerTypeId,
36
+ start() {
37
+ return Effect__namespace.gen(function* (_) {
38
+ const port = "postMessage" in self ? self : yield* _(Effect__namespace.async((resume, signal) => {
39
+ self.addEventListener("connect", function (event) {
40
+ const port = event.ports[0];
41
+ port.start();
42
+ resume(Effect__namespace.succeed(port));
43
+ }, {
44
+ once: true,
45
+ signal
46
+ });
47
+ }));
48
+ const queue = yield* _(Queue__namespace.unbounded());
49
+ const fiber = yield* _(Effect__namespace.async((resume, signal) => {
50
+ port.addEventListener("message", function (event) {
51
+ const message = event.data;
52
+ if (message[0] === 0) {
53
+ queue.unsafeOffer(message[1]);
54
+ } else {
55
+ Effect__namespace.runFork(Queue__namespace.shutdown(queue));
56
+ }
57
+ }, {
58
+ signal
59
+ });
60
+ port.addEventListener("messageerror", function (error) {
61
+ resume(Effect__namespace.fail(WorkerError.WorkerError("decode", error.message)));
62
+ }, {
63
+ signal
64
+ });
65
+ port.addEventListener("error", function (error) {
66
+ resume(Effect__namespace.fail(WorkerError.WorkerError("unknown", error.message)));
67
+ }, {
68
+ signal
69
+ });
70
+ }), Effect__namespace.forkScoped);
71
+ const send = (message, transfer) => Effect__namespace.sync(() => port.postMessage([1, message], {
72
+ transfer: transfer
73
+ }));
74
+ // ready
75
+ port.postMessage([0]);
76
+ return {
77
+ fiber,
78
+ queue,
79
+ send
80
+ };
81
+ });
82
+ }
83
+ });
84
+
85
+ /** @internal */
86
+ const layer = /*#__PURE__*/Layer__namespace.succeed(Runner__namespace.PlatformRunner, platformRunnerImpl);
87
+
88
+ /** @internal */
89
+ const make$1 = (process, options) => Effect__namespace.provide(Runner__namespace.make(process, options), layer);
90
+
91
+ /**
92
+ * @since 1.0.0
93
+ *
94
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
95
+ */
96
+
97
+ /**
98
+ * @since 1.0.0
99
+ * @category constructors
100
+ */
101
+ const make = make$1;
102
+
103
+ exports.make = make;
104
+ Object.keys(Runner).forEach(function (k) {
105
+ if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
106
+ enumerable: true,
107
+ get: function () { return Runner[k]; }
108
+ });
109
+ });
@@ -0,0 +1,77 @@
1
+ import { WorkerError } from '@effect/platform/WorkerError';
2
+ import * as Runner from '@effect/platform/WorkerRunner';
3
+ export * from '@effect/platform/WorkerRunner';
4
+ import * as Effect from 'effect/Effect';
5
+ import * as Layer from 'effect/Layer';
6
+ import * as Queue from 'effect/Queue';
7
+
8
+ const platformRunnerImpl = /*#__PURE__*/Runner.PlatformRunner.of({
9
+ [Runner.PlatformRunnerTypeId]: Runner.PlatformRunnerTypeId,
10
+ start() {
11
+ return Effect.gen(function* (_) {
12
+ const port = "postMessage" in self ? self : yield* _(Effect.async((resume, signal) => {
13
+ self.addEventListener("connect", function (event) {
14
+ const port = event.ports[0];
15
+ port.start();
16
+ resume(Effect.succeed(port));
17
+ }, {
18
+ once: true,
19
+ signal
20
+ });
21
+ }));
22
+ const queue = yield* _(Queue.unbounded());
23
+ const fiber = yield* _(Effect.async((resume, signal) => {
24
+ port.addEventListener("message", function (event) {
25
+ const message = event.data;
26
+ if (message[0] === 0) {
27
+ queue.unsafeOffer(message[1]);
28
+ } else {
29
+ Effect.runFork(Queue.shutdown(queue));
30
+ }
31
+ }, {
32
+ signal
33
+ });
34
+ port.addEventListener("messageerror", function (error) {
35
+ resume(Effect.fail(WorkerError("decode", error.message)));
36
+ }, {
37
+ signal
38
+ });
39
+ port.addEventListener("error", function (error) {
40
+ resume(Effect.fail(WorkerError("unknown", error.message)));
41
+ }, {
42
+ signal
43
+ });
44
+ }), Effect.forkScoped);
45
+ const send = (message, transfer) => Effect.sync(() => port.postMessage([1, message], {
46
+ transfer: transfer
47
+ }));
48
+ // ready
49
+ port.postMessage([0]);
50
+ return {
51
+ fiber,
52
+ queue,
53
+ send
54
+ };
55
+ });
56
+ }
57
+ });
58
+
59
+ /** @internal */
60
+ const layer = /*#__PURE__*/Layer.succeed(Runner.PlatformRunner, platformRunnerImpl);
61
+
62
+ /** @internal */
63
+ const make$1 = (process, options) => Effect.provide(Runner.make(process, options), layer);
64
+
65
+ /**
66
+ * @since 1.0.0
67
+ *
68
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
69
+ */
70
+
71
+ /**
72
+ * @since 1.0.0
73
+ * @category constructors
74
+ */
75
+ const make = make$1;
76
+
77
+ export { make };
@@ -0,0 +1,4 @@
1
+ {
2
+ "main": "dist/effect-platform-browser-WorkerRunner.cjs.js",
3
+ "module": "dist/effect-platform-browser-WorkerRunner.esm.js"
4
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
5
+ */
6
+ import type * as Worker from "@effect/platform/Worker";
7
+ import type { Effect } from "effect";
8
+ import type * as Context from "effect/Context";
9
+ import type * as Layer from "effect/Layer";
10
+ import type * as Scope from "effect/Scope";
11
+ /**
12
+ * @since 1.0.0
13
+ */
14
+ export * from "@effect/platform/Worker";
15
+ /**
16
+ * @since 1.0.0
17
+ * @category constructors
18
+ */
19
+ export declare const makePool: <I, E, O>(options: Worker.WorkerPool.Options<I, Worker | SharedWorker>) => Effect.Effect<Worker.WorkerManager | Scope.Scope, never, Worker.WorkerPool<I, E, O>>;
20
+ /**
21
+ * @since 1.0.0
22
+ * @category constructors
23
+ */
24
+ export declare const makePoolLayer: <Tag, I, E, O>(tag: Context.Tag<Tag, Worker.WorkerPool<I, E, O>>, options: Worker.WorkerPool.Options<I, Worker | SharedWorker>) => Layer.Layer<never, never, Tag>;
25
+ /**
26
+ * @since 1.0.0
27
+ * @category layers
28
+ */
29
+ export declare const layerManager: Layer.Layer<never, never, Worker.WorkerManager>;
30
+ /**
31
+ * @since 1.0.0
32
+ * @category layers
33
+ */
34
+ export declare const layerWorker: Layer.Layer<never, never, Worker.PlatformWorker>;
35
+ //# sourceMappingURL=Worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Worker.d.ts","sourceRoot":"../../../src","sources":["Worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAG1C;;GAEG;AACH,cAAc,yBAAyB,CAAA;AAEvC;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7B,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,KACzD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAqB,CAAA;AAE7G;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACvC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACjD,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,KACzD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAA0B,CAAA;AAE5D;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,CAAyB,CAAA;AAElG;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,CAAwB,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
5
+ */
6
+ import type { WorkerError } from "@effect/platform/WorkerError";
7
+ import type * as Runner from "@effect/platform/WorkerRunner";
8
+ import type { Effect } from "effect";
9
+ import type * as Scope from "effect/Scope";
10
+ import type * as Stream from "effect/Stream";
11
+ /**
12
+ * @since 1.0.0
13
+ */
14
+ export * from "@effect/platform/WorkerRunner";
15
+ /**
16
+ * @since 1.0.0
17
+ * @category constructors
18
+ */
19
+ export declare const make: <I, R, E, O>(process: (request: I) => Stream.Stream<R, E, O>, options?: Runner.Runner.Options<O> | undefined) => Effect.Effect<R | Scope.Scope, WorkerError, void>;
20
+ //# sourceMappingURL=WorkerRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerRunner.d.ts","sourceRoot":"../../../src","sources":["WorkerRunner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,KAAK,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAG5C;;GAEG;AACH,cAAc,+BAA+B,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,KAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAiB,CAAA"}
@@ -30,4 +30,16 @@ export * as Path from "./Path.js";
30
30
  * @since 1.0.0
31
31
  */
32
32
  export * as Runtime from "./Runtime.js";
33
+ /**
34
+ * @since 1.0.0
35
+ *
36
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
37
+ */
38
+ export * as Worker from "./Worker.js";
39
+ /**
40
+ * @since 1.0.0
41
+ *
42
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
43
+ */
44
+ export * as WorkerRunner from "./WorkerRunner.js";
33
45
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"../../../src","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,SAAS,uBAA0C;AAE/D;;GAEG;AACH,OAAO,KAAK,SAAS,uBAA0C;AAE/D;;GAEG;AACH,OAAO,KAAK,KAAK,mBAAsC;AAEvD;;GAEG;AACH,OAAO,KAAK,UAAU,wBAA2C;AAEjE;;;;GAIG;AACH,OAAO,KAAK,aAAa,2BAA8C;AAEvE;;;;GAIG;AACH,OAAO,KAAK,IAAI,kBAAqC;AAErD;;GAEG;AACH,OAAO,KAAK,OAAO,qBAAwC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"../../../src","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,SAAS,uBAA0C;AAE/D;;GAEG;AACH,OAAO,KAAK,SAAS,uBAA0C;AAE/D;;GAEG;AACH,OAAO,KAAK,KAAK,mBAAsC;AAEvD;;GAEG;AACH,OAAO,KAAK,UAAU,wBAA2C;AAEjE;;;;GAIG;AACH,OAAO,KAAK,aAAa,2BAA8C;AAEvE;;;;GAIG;AACH,OAAO,KAAK,IAAI,kBAAqC;AAErD;;GAEG;AACH,OAAO,KAAK,OAAO,qBAAwC;AAE3D;;;;GAIG;AACH,OAAO,KAAK,MAAM,oBAAuC;AAEzD;;;;GAIG;AACH,OAAO,KAAK,YAAY,0BAA6C"}
@@ -9,6 +9,8 @@ var HttpClient = require('@effect/platform-browser/HttpClient');
9
9
  var KeyValueStore = require('@effect/platform-browser/KeyValueStore');
10
10
  var Path = require('@effect/platform-browser/Path');
11
11
  var Runtime = require('@effect/platform-browser/Runtime');
12
+ var Worker = require('@effect/platform-browser/Worker');
13
+ var WorkerRunner = require('@effect/platform-browser/WorkerRunner');
12
14
 
13
15
  function _interopNamespace(e) {
14
16
  if (e && e.__esModule) return e;
@@ -35,6 +37,8 @@ var HttpClient__namespace = /*#__PURE__*/_interopNamespace(HttpClient);
35
37
  var KeyValueStore__namespace = /*#__PURE__*/_interopNamespace(KeyValueStore);
36
38
  var Path__namespace = /*#__PURE__*/_interopNamespace(Path);
37
39
  var Runtime__namespace = /*#__PURE__*/_interopNamespace(Runtime);
40
+ var Worker__namespace = /*#__PURE__*/_interopNamespace(Worker);
41
+ var WorkerRunner__namespace = /*#__PURE__*/_interopNamespace(WorkerRunner);
38
42
 
39
43
 
40
44
 
@@ -45,3 +49,5 @@ exports.HttpClient = HttpClient__namespace;
45
49
  exports.KeyValueStore = KeyValueStore__namespace;
46
50
  exports.Path = Path__namespace;
47
51
  exports.Runtime = Runtime__namespace;
52
+ exports.Worker = Worker__namespace;
53
+ exports.WorkerRunner = WorkerRunner__namespace;
@@ -5,5 +5,7 @@ export {
5
5
  HttpClient,
6
6
  KeyValueStore,
7
7
  Path,
8
- Runtime
8
+ Runtime,
9
+ Worker,
10
+ WorkerRunner
9
11
  } from "./effect-platform-browser.cjs.js";
@@ -9,6 +9,8 @@ var HttpClient = require('@effect/platform-browser/HttpClient');
9
9
  var KeyValueStore = require('@effect/platform-browser/KeyValueStore');
10
10
  var Path = require('@effect/platform-browser/Path');
11
11
  var Runtime = require('@effect/platform-browser/Runtime');
12
+ var Worker = require('@effect/platform-browser/Worker');
13
+ var WorkerRunner = require('@effect/platform-browser/WorkerRunner');
12
14
 
13
15
  function _interopNamespace(e) {
14
16
  if (e && e.__esModule) return e;
@@ -35,6 +37,8 @@ var HttpClient__namespace = /*#__PURE__*/_interopNamespace(HttpClient);
35
37
  var KeyValueStore__namespace = /*#__PURE__*/_interopNamespace(KeyValueStore);
36
38
  var Path__namespace = /*#__PURE__*/_interopNamespace(Path);
37
39
  var Runtime__namespace = /*#__PURE__*/_interopNamespace(Runtime);
40
+ var Worker__namespace = /*#__PURE__*/_interopNamespace(Worker);
41
+ var WorkerRunner__namespace = /*#__PURE__*/_interopNamespace(WorkerRunner);
38
42
 
39
43
 
40
44
 
@@ -45,3 +49,5 @@ exports.HttpClient = HttpClient__namespace;
45
49
  exports.KeyValueStore = KeyValueStore__namespace;
46
50
  exports.Path = Path__namespace;
47
51
  exports.Runtime = Runtime__namespace;
52
+ exports.Worker = Worker__namespace;
53
+ exports.WorkerRunner = WorkerRunner__namespace;
@@ -12,3 +12,7 @@ import * as Path from '@effect/platform-browser/Path';
12
12
  export { Path };
13
13
  import * as Runtime from '@effect/platform-browser/Runtime';
14
14
  export { Runtime };
15
+ import * as Worker from '@effect/platform-browser/Worker';
16
+ export { Worker };
17
+ import * as WorkerRunner from '@effect/platform-browser/WorkerRunner';
18
+ export { WorkerRunner };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/platform-browser",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "Unified interfaces for common platform-specific services",
5
5
  "main": "dist/effect-platform-browser.cjs.js",
6
6
  "module": "dist/effect-platform-browser.esm.js",
@@ -29,10 +29,11 @@
29
29
  "license": "MIT",
30
30
  "sideEffects": false,
31
31
  "dependencies": {
32
- "@effect/platform": "^0.21.0"
32
+ "@effect/platform": "^0.22.1"
33
33
  },
34
34
  "devDependencies": {
35
35
  "effect": "2.0.0-next.48",
36
+ "happy-dom": "^12.9.1",
36
37
  "vitest-localstorage-mock": "^0.0.1"
37
38
  },
38
39
  "peerDependencies": {
@@ -47,7 +48,9 @@
47
48
  "HttpClient",
48
49
  "KeyValueStore",
49
50
  "Path",
50
- "Runtime"
51
+ "Runtime",
52
+ "Worker",
53
+ "WorkerRunner"
51
54
  ],
52
55
  "exports": {
53
56
  ".": {
@@ -98,6 +101,18 @@
98
101
  "module": "./Runtime/dist/effect-platform-browser-Runtime.esm.js",
99
102
  "import": "./Runtime/dist/effect-platform-browser-Runtime.cjs.mjs",
100
103
  "default": "./Runtime/dist/effect-platform-browser-Runtime.cjs.js"
104
+ },
105
+ "./Worker": {
106
+ "types": "./dist/declarations/src/Worker.d.ts",
107
+ "module": "./Worker/dist/effect-platform-browser-Worker.esm.js",
108
+ "import": "./Worker/dist/effect-platform-browser-Worker.cjs.mjs",
109
+ "default": "./Worker/dist/effect-platform-browser-Worker.cjs.js"
110
+ },
111
+ "./WorkerRunner": {
112
+ "types": "./dist/declarations/src/WorkerRunner.d.ts",
113
+ "module": "./WorkerRunner/dist/effect-platform-browser-WorkerRunner.esm.js",
114
+ "import": "./WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.mjs",
115
+ "default": "./WorkerRunner/dist/effect-platform-browser-WorkerRunner.cjs.js"
101
116
  }
102
117
  },
103
118
  "scripts": {
package/src/Worker.ts ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
5
+ */
6
+ import type * as Worker from "@effect/platform/Worker"
7
+ import type { Effect } from "effect"
8
+ import type * as Context from "effect/Context"
9
+ import type * as Layer from "effect/Layer"
10
+ import type * as Scope from "effect/Scope"
11
+ import * as internal from "./internal/worker"
12
+
13
+ /**
14
+ * @since 1.0.0
15
+ */
16
+ export * from "@effect/platform/Worker"
17
+
18
+ /**
19
+ * @since 1.0.0
20
+ * @category constructors
21
+ */
22
+ export const makePool: <I, E, O>(
23
+ options: Worker.WorkerPool.Options<I, Worker | SharedWorker>
24
+ ) => Effect.Effect<Worker.WorkerManager | Scope.Scope, never, Worker.WorkerPool<I, E, O>> = internal.makePool
25
+
26
+ /**
27
+ * @since 1.0.0
28
+ * @category constructors
29
+ */
30
+ export const makePoolLayer: <Tag, I, E, O>(
31
+ tag: Context.Tag<Tag, Worker.WorkerPool<I, E, O>>,
32
+ options: Worker.WorkerPool.Options<I, Worker | SharedWorker>
33
+ ) => Layer.Layer<never, never, Tag> = internal.makePoolLayer
34
+
35
+ /**
36
+ * @since 1.0.0
37
+ * @category layers
38
+ */
39
+ export const layerManager: Layer.Layer<never, never, Worker.WorkerManager> = internal.layerManager
40
+
41
+ /**
42
+ * @since 1.0.0
43
+ * @category layers
44
+ */
45
+ export const layerWorker: Layer.Layer<never, never, Worker.PlatformWorker> = internal.layerWorker
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
5
+ */
6
+ import type { WorkerError } from "@effect/platform/WorkerError"
7
+ import type * as Runner from "@effect/platform/WorkerRunner"
8
+ import type { Effect } from "effect"
9
+ import type * as Scope from "effect/Scope"
10
+ import type * as Stream from "effect/Stream"
11
+ import * as internal from "./internal/workerRunner"
12
+
13
+ /**
14
+ * @since 1.0.0
15
+ */
16
+ export * from "@effect/platform/WorkerRunner"
17
+
18
+ /**
19
+ * @since 1.0.0
20
+ * @category constructors
21
+ */
22
+ export const make: <I, R, E, O>(
23
+ process: (request: I) => Stream.Stream<R, E, O>,
24
+ options?: Runner.Runner.Options<O> | undefined
25
+ ) => Effect.Effect<R | Scope.Scope, WorkerError, void> = internal.make
package/src/index.ts CHANGED
@@ -36,3 +36,17 @@ export * as Path from "@effect/platform-browser/Path"
36
36
  * @since 1.0.0
37
37
  */
38
38
  export * as Runtime from "@effect/platform-browser/Runtime"
39
+
40
+ /**
41
+ * @since 1.0.0
42
+ *
43
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
44
+ */
45
+ export * as Worker from "@effect/platform-browser/Worker"
46
+
47
+ /**
48
+ * @since 1.0.0
49
+ *
50
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
51
+ */
52
+ export * as WorkerRunner from "@effect/platform-browser/WorkerRunner"
@@ -0,0 +1,58 @@
1
+ import * as Worker from "@effect/platform/Worker"
2
+ import { WorkerError } from "@effect/platform/WorkerError"
3
+ import { Fiber } from "effect"
4
+ import * as Effect from "effect/Effect"
5
+ import * as Layer from "effect/Layer"
6
+ import * as Queue from "effect/Queue"
7
+
8
+ const platformWorkerImpl = Worker.PlatformWorker.of({
9
+ [Worker.PlatformWorkerTypeId]: Worker.PlatformWorkerTypeId,
10
+ spawn<I, O>(worker_: unknown) {
11
+ return Effect.gen(function*(_) {
12
+ const worker = worker_ as globalThis.SharedWorker | globalThis.Worker
13
+ let port: globalThis.Worker | MessagePort
14
+ if ("port" in worker) {
15
+ port = worker.port
16
+ port.start()
17
+ } else {
18
+ port = worker
19
+ }
20
+
21
+ yield* _(Effect.addFinalizer(() => Effect.sync(() => port.postMessage([1]))))
22
+
23
+ const fiberId = yield* _(Effect.fiberId)
24
+ const queue = yield* _(Queue.unbounded<Worker.BackingWorker.Message<O>>())
25
+
26
+ const fiber = yield* _(
27
+ Effect.async<never, WorkerError, never>((resume, signal) => {
28
+ port.addEventListener("message", function(event) {
29
+ queue.unsafeOffer((event as MessageEvent).data)
30
+ }, { signal })
31
+ port.addEventListener("error", function(event) {
32
+ resume(Effect.fail(WorkerError("unknown", (event as ErrorEvent).message)))
33
+ }, { signal })
34
+ }),
35
+ Effect.forkDaemon
36
+ )
37
+ yield* _(Effect.addFinalizer(() => fiber.interruptAsFork(fiberId)))
38
+ const join = Fiber.join(fiber)
39
+
40
+ const send = (message: I, transfers?: ReadonlyArray<unknown>) =>
41
+ Effect.sync(() => port.postMessage([0, message], transfers as any))
42
+
43
+ return { join, queue, send }
44
+ })
45
+ }
46
+ })
47
+
48
+ /** @internal */
49
+ export const layerWorker = Layer.succeed(Worker.PlatformWorker, platformWorkerImpl)
50
+
51
+ /** @internal */
52
+ export const layerManager = Layer.provide(layerWorker, Worker.layerManager)
53
+
54
+ /** @internal */
55
+ export const makePool = Worker.makePool<globalThis.Worker | globalThis.SharedWorker>()
56
+
57
+ /** @internal */
58
+ export const makePoolLayer = Worker.makePoolLayer<globalThis.Worker | globalThis.SharedWorker>(layerManager)
@@ -0,0 +1,62 @@
1
+ import { WorkerError } from "@effect/platform/WorkerError"
2
+ import * as Runner from "@effect/platform/WorkerRunner"
3
+ import * as Effect from "effect/Effect"
4
+ import * as Layer from "effect/Layer"
5
+ import * as Queue from "effect/Queue"
6
+ import type * as Scope from "effect/Scope"
7
+ import type * as Stream from "effect/Stream"
8
+
9
+ const platformRunnerImpl = Runner.PlatformRunner.of({
10
+ [Runner.PlatformRunnerTypeId]: Runner.PlatformRunnerTypeId,
11
+ start<I, O>() {
12
+ return Effect.gen(function*(_) {
13
+ const port = "postMessage" in self ?
14
+ self :
15
+ (yield* _(Effect.async<never, never, MessagePort>((resume, signal) => {
16
+ self.addEventListener("connect", function(event) {
17
+ const port = (event as MessageEvent).ports[0]
18
+ port.start()
19
+ resume(Effect.succeed(port))
20
+ }, { once: true, signal })
21
+ })))
22
+ const queue = yield* _(Queue.unbounded<I>())
23
+ const fiber = yield* _(
24
+ Effect.async<never, WorkerError, never>((resume, signal) => {
25
+ port.addEventListener("message", function(event) {
26
+ const message = (event as MessageEvent).data as Runner.BackingRunner.Message<I>
27
+ if (message[0] === 0) {
28
+ queue.unsafeOffer(message[1])
29
+ } else {
30
+ Effect.runFork(Queue.shutdown(queue))
31
+ }
32
+ }, { signal })
33
+ port.addEventListener("messageerror", function(error) {
34
+ resume(Effect.fail(WorkerError("decode", (error as ErrorEvent).message)))
35
+ }, { signal })
36
+ port.addEventListener("error", function(error) {
37
+ resume(Effect.fail(WorkerError("unknown", (error as ErrorEvent).message)))
38
+ }, { signal })
39
+ }),
40
+ Effect.forkScoped
41
+ )
42
+ const send = (message: O, transfer?: ReadonlyArray<unknown>) =>
43
+ Effect.sync(() =>
44
+ port.postMessage([1, message], {
45
+ transfer: transfer as any
46
+ })
47
+ )
48
+ // ready
49
+ port.postMessage([0])
50
+ return { fiber, queue, send }
51
+ })
52
+ }
53
+ })
54
+
55
+ /** @internal */
56
+ export const layer = Layer.succeed(Runner.PlatformRunner, platformRunnerImpl)
57
+
58
+ /** @internal */
59
+ export const make = <I, R, E, O>(
60
+ process: (request: I) => Stream.Stream<R, E, O>,
61
+ options?: Runner.Runner.Options<O>
62
+ ): Effect.Effect<Scope.Scope | R, WorkerError, void> => Effect.provide(Runner.make(process, options), layer)