@effect/platform 0.37.0 → 0.37.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.
- package/dist/cjs/Transferable.js +70 -2
- package/dist/cjs/Transferable.js.map +1 -1
- package/dist/cjs/Worker.js.map +1 -1
- package/dist/cjs/WorkerRunner.js +11 -1
- package/dist/cjs/WorkerRunner.js.map +1 -1
- package/dist/cjs/internal/worker.js +51 -41
- package/dist/cjs/internal/worker.js.map +1 -1
- package/dist/cjs/internal/workerRunner.js +35 -15
- package/dist/cjs/internal/workerRunner.js.map +1 -1
- package/dist/dts/Transferable.d.ts +19 -0
- package/dist/dts/Transferable.d.ts.map +1 -1
- package/dist/dts/Worker.d.ts +5 -4
- package/dist/dts/Worker.d.ts.map +1 -1
- package/dist/dts/WorkerError.d.ts +2 -2
- package/dist/dts/WorkerError.d.ts.map +1 -1
- package/dist/dts/WorkerRunner.d.ts +22 -8
- package/dist/dts/WorkerRunner.d.ts.map +1 -1
- package/dist/esm/Transferable.js +41 -1
- package/dist/esm/Transferable.js.map +1 -1
- package/dist/esm/Worker.js.map +1 -1
- package/dist/esm/WorkerRunner.js +10 -0
- package/dist/esm/WorkerRunner.js.map +1 -1
- package/dist/esm/internal/worker.js +51 -41
- package/dist/esm/internal/worker.js.map +1 -1
- package/dist/esm/internal/workerRunner.js +32 -14
- package/dist/esm/internal/workerRunner.js.map +1 -1
- package/package.json +1 -1
- package/src/Transferable.ts +80 -2
- package/src/Worker.ts +6 -5
- package/src/WorkerError.ts +2 -2
- package/src/WorkerRunner.ts +41 -9
- package/src/internal/command.ts +1 -1
- package/src/internal/worker.ts +114 -83
- package/src/internal/workerRunner.ts +76 -19
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import * as Schema from "@effect/schema/Schema";
|
|
2
2
|
import * as Serializable from "@effect/schema/Serializable";
|
|
3
3
|
import * as Cause from "effect/Cause";
|
|
4
|
+
import * as Chunk from "effect/Chunk";
|
|
4
5
|
import * as Context from "effect/Context";
|
|
5
6
|
import * as Effect from "effect/Effect";
|
|
6
7
|
import * as Either from "effect/Either";
|
|
7
8
|
import * as Fiber from "effect/Fiber";
|
|
8
9
|
import { pipe } from "effect/Function";
|
|
10
|
+
import * as Layer from "effect/Layer";
|
|
11
|
+
import * as Option from "effect/Option";
|
|
9
12
|
import * as Predicate from "effect/Predicate";
|
|
10
13
|
import * as Queue from "effect/Queue";
|
|
11
14
|
import * as Stream from "effect/Stream";
|
|
@@ -19,7 +22,8 @@ export const make = (process, options) => Effect.gen(function* (_) {
|
|
|
19
22
|
const platform = yield* _(PlatformRunner);
|
|
20
23
|
const backing = yield* _(platform.start());
|
|
21
24
|
const fiberMap = new Map();
|
|
22
|
-
const
|
|
25
|
+
const parentFiber = Option.getOrThrow(Fiber.getCurrentFiber());
|
|
26
|
+
yield* _(Queue.take(backing.queue), Effect.tap(req => {
|
|
23
27
|
const id = req[0];
|
|
24
28
|
if (req[1] === 1) {
|
|
25
29
|
const fiber = fiberMap.get(id);
|
|
@@ -29,33 +33,45 @@ export const make = (process, options) => Effect.gen(function* (_) {
|
|
|
29
33
|
const stream = process(req[2]);
|
|
30
34
|
const effect = Effect.isEffect(stream) ? Effect.matchCauseEffect(stream, {
|
|
31
35
|
onFailure: cause => Either.match(Cause.failureOrCause(cause), {
|
|
32
|
-
onLeft: error =>
|
|
36
|
+
onLeft: error => {
|
|
37
|
+
const transfers = options?.transfers ? options.transfers(error) : undefined;
|
|
38
|
+
return pipe(options?.encodeError ? options.encodeError(error) : Effect.succeed(error), Effect.flatMap(payload => backing.send([id, 2, payload], transfers)), Effect.catchAllCause(cause => backing.send([id, 3, Cause.squash(cause)])));
|
|
39
|
+
},
|
|
33
40
|
onRight: cause => backing.send([id, 3, Cause.squash(cause)])
|
|
34
41
|
}),
|
|
35
42
|
onSuccess: data => {
|
|
36
43
|
const transfers = options?.transfers ? options.transfers(data) : undefined;
|
|
37
|
-
|
|
38
|
-
return backing.send([id, 1, payload], transfers);
|
|
44
|
+
return pipe(options?.encodeOutput ? options.encodeOutput(data) : Effect.succeed(data), Effect.flatMap(payload => backing.send([id, 0, [payload]], transfers)), Effect.catchAllCause(cause => backing.send([id, 3, Cause.squash(cause)])));
|
|
39
45
|
}
|
|
40
|
-
}) : pipe(stream, Stream.tap(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
}) : pipe(stream, Stream.chunks, Stream.tap(data => {
|
|
47
|
+
if (options?.encodeOutput === undefined) {
|
|
48
|
+
const payload = Chunk.toReadonlyArray(data);
|
|
49
|
+
const transfers = options?.transfers ? payload.flatMap(options.transfers) : undefined;
|
|
50
|
+
return backing.send([id, 0, payload], transfers);
|
|
51
|
+
}
|
|
52
|
+
const transfers = [];
|
|
53
|
+
return Effect.flatMap(Effect.forEach(data, data => {
|
|
54
|
+
if (options?.transfers) {
|
|
55
|
+
transfers.push(...options.transfers(data));
|
|
56
|
+
}
|
|
57
|
+
return Effect.orDie(options.encodeOutput(data));
|
|
58
|
+
}), payload => backing.send([id, 0, payload], transfers));
|
|
44
59
|
}), Stream.runDrain, Effect.matchCauseEffect({
|
|
45
60
|
onFailure: cause => Either.match(Cause.failureOrCause(cause), {
|
|
46
|
-
onLeft: error =>
|
|
61
|
+
onLeft: error => {
|
|
62
|
+
const transfers = options?.transfers ? options.transfers(error) : undefined;
|
|
63
|
+
return pipe(options?.encodeError ? options.encodeError(error) : Effect.succeed(error), Effect.flatMap(payload => backing.send([id, 2, payload], transfers)), Effect.catchAllCause(cause => backing.send([id, 3, Cause.squash(cause)])));
|
|
64
|
+
},
|
|
47
65
|
onRight: cause => backing.send([id, 3, Cause.squash(cause)])
|
|
48
66
|
}),
|
|
49
67
|
onSuccess: () => backing.send([id, 1])
|
|
50
68
|
}));
|
|
51
69
|
return pipe(effect, Effect.ensuring(Effect.sync(() => fiberMap.delete(id))), Effect.fork, Effect.tap(fiber => Effect.sync(() => fiberMap.set(id, fiber))));
|
|
52
|
-
}), Effect.forever);
|
|
53
|
-
return yield* _(Effect.all([handleRequests, Fiber.join(backing.fiber)], {
|
|
54
|
-
concurrency: "unbounded",
|
|
55
|
-
discard: true
|
|
56
|
-
}));
|
|
70
|
+
}), Effect.forever, Effect.onInterrupt(() => Fiber.interrupt(parentFiber)), Effect.forkScoped);
|
|
57
71
|
});
|
|
58
72
|
/** @internal */
|
|
73
|
+
export const layer = (process, options) => Layer.scopedDiscard(make(process, options));
|
|
74
|
+
/** @internal */
|
|
59
75
|
export const makeSerialized = (schema, handlers) => {
|
|
60
76
|
const parseRequest = Schema.decode(schema);
|
|
61
77
|
const effectTags = new Set();
|
|
@@ -91,4 +107,6 @@ export const makeSerialized = (schema, handlers) => {
|
|
|
91
107
|
}
|
|
92
108
|
});
|
|
93
109
|
};
|
|
110
|
+
/** @internal */
|
|
111
|
+
export const layerSerialized = (schema, handlers) => Layer.scopedDiscard(makeSerialized(schema, handlers));
|
|
94
112
|
//# sourceMappingURL=workerRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerRunner.js","names":["Schema","Serializable","Cause","Context","Effect","Either","Fiber","pipe","Predicate","Queue","Stream","Transferable","PlatformRunnerTypeId","Symbol","for","PlatformRunner","Tag","make","process","options","gen","_","platform","backing","start","fiberMap","Map","
|
|
1
|
+
{"version":3,"file":"workerRunner.js","names":["Schema","Serializable","Cause","Chunk","Context","Effect","Either","Fiber","pipe","Layer","Option","Predicate","Queue","Stream","Transferable","PlatformRunnerTypeId","Symbol","for","PlatformRunner","Tag","make","process","options","gen","_","platform","backing","start","fiberMap","Map","parentFiber","getOrThrow","getCurrentFiber","take","queue","tap","req","id","fiber","get","unit","interrupt","stream","effect","isEffect","matchCauseEffect","onFailure","cause","match","failureOrCause","onLeft","error","transfers","undefined","encodeError","succeed","flatMap","payload","send","catchAllCause","squash","onRight","onSuccess","data","encodeOutput","chunks","toReadonlyArray","forEach","push","orDie","runDrain","ensuring","sync","delete","fork","set","forever","onInterrupt","forkScoped","layer","scopedDiscard","makeSerialized","schema","handlers","parseRequest","decode","effectTags","Set","request","hasProperty","has","_tag","handler","dieMessage","encodeSuccess","encode","successSchema","matchEffect","serializeFailure","fail","add","catchAll","mapEffect","message","layerSerialized"],"sources":["../../../src/internal/workerRunner.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Transferable.ts
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
import * as AST from "@effect/schema/AST"
|
|
6
|
+
import * as ParseResult from "@effect/schema/ParseResult"
|
|
7
|
+
import * as Schema from "@effect/schema/Schema"
|
|
8
|
+
import { dual } from "effect/Function"
|
|
9
|
+
|
|
5
10
|
/**
|
|
6
11
|
* @since 1.0.0
|
|
7
12
|
* @category symbols
|
|
@@ -16,13 +21,86 @@ export interface Transferable {
|
|
|
16
21
|
readonly [symbol]: () => ReadonlyArray<globalThis.Transferable>
|
|
17
22
|
}
|
|
18
23
|
|
|
24
|
+
/**
|
|
25
|
+
* @since 1.0.0
|
|
26
|
+
* @category predicates
|
|
27
|
+
*/
|
|
28
|
+
export const isTransferable = (u: unknown): u is Transferable => typeof u === "object" && u !== null && symbol in u
|
|
29
|
+
|
|
19
30
|
/**
|
|
20
31
|
* @since 1.0.0
|
|
21
32
|
* @category accessors
|
|
22
33
|
*/
|
|
23
34
|
export const get = (u: unknown): ReadonlyArray<globalThis.Transferable> => {
|
|
24
|
-
if (
|
|
25
|
-
return
|
|
35
|
+
if (isTransferable(u)) {
|
|
36
|
+
return u[symbol]()
|
|
26
37
|
}
|
|
27
38
|
return []
|
|
28
39
|
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @since 1.0.0
|
|
43
|
+
* @category schema
|
|
44
|
+
*/
|
|
45
|
+
export const schema: {
|
|
46
|
+
<A>(
|
|
47
|
+
f: (_: A) => ReadonlyArray<globalThis.Transferable>
|
|
48
|
+
): <I>(self: Schema.Schema<I, A>) => Schema.Schema<I, A & Transferable>
|
|
49
|
+
<I, A>(
|
|
50
|
+
self: Schema.Schema<I, A>,
|
|
51
|
+
f: (_: A) => ReadonlyArray<globalThis.Transferable>
|
|
52
|
+
): Schema.Schema<I, A & Transferable>
|
|
53
|
+
} = dual<
|
|
54
|
+
<A>(
|
|
55
|
+
f: (_: A) => ReadonlyArray<globalThis.Transferable>
|
|
56
|
+
) => <I>(self: Schema.Schema<I, A>) => Schema.Schema<I, A & Transferable>,
|
|
57
|
+
<I, A>(
|
|
58
|
+
self: Schema.Schema<I, A>,
|
|
59
|
+
f: (_: A) => ReadonlyArray<globalThis.Transferable>
|
|
60
|
+
) => Schema.Schema<I, A & Transferable>
|
|
61
|
+
>(2, <I, A>(
|
|
62
|
+
self: Schema.Schema<I, A>,
|
|
63
|
+
f: (_: A) => ReadonlyArray<globalThis.Transferable>
|
|
64
|
+
) =>
|
|
65
|
+
Schema.transform(
|
|
66
|
+
self,
|
|
67
|
+
schemaFromSelf(Schema.to(self)),
|
|
68
|
+
(input) =>
|
|
69
|
+
({
|
|
70
|
+
...input,
|
|
71
|
+
[symbol]() {
|
|
72
|
+
return f(this as any)
|
|
73
|
+
}
|
|
74
|
+
}) as A & Transferable,
|
|
75
|
+
(output) => output as A
|
|
76
|
+
))
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @since 1.0.0
|
|
80
|
+
* @category schema
|
|
81
|
+
*/
|
|
82
|
+
export const schemaFromSelf = <I, A>(
|
|
83
|
+
item: Schema.Schema<I, A>
|
|
84
|
+
): Schema.Schema<I & Transferable, A & Transferable> => {
|
|
85
|
+
return Schema.declare(
|
|
86
|
+
[item],
|
|
87
|
+
item,
|
|
88
|
+
(isDecoding, item) => {
|
|
89
|
+
const parse = isDecoding ? Schema.parse(item) : Schema.encode(item)
|
|
90
|
+
return (u, options, ast) => {
|
|
91
|
+
if (!isTransferable(u)) {
|
|
92
|
+
return ParseResult.fail(ParseResult.type(ast, u))
|
|
93
|
+
}
|
|
94
|
+
const proto = {
|
|
95
|
+
__proto__: Object.getPrototypeOf(u),
|
|
96
|
+
[symbol]: u[symbol]
|
|
97
|
+
}
|
|
98
|
+
return ParseResult.map(
|
|
99
|
+
parse(u, options),
|
|
100
|
+
(a) => Object.setPrototypeOf(a, proto)
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{ [AST.IdentifierAnnotationId]: "Transferable" }
|
|
105
|
+
)
|
|
106
|
+
}
|
package/src/Worker.ts
CHANGED
|
@@ -8,6 +8,7 @@ import type * as Context from "effect/Context"
|
|
|
8
8
|
import type * as Duration from "effect/Duration"
|
|
9
9
|
import type * as Effect from "effect/Effect"
|
|
10
10
|
import type * as Fiber from "effect/Fiber"
|
|
11
|
+
import type { LazyArg } from "effect/Function"
|
|
11
12
|
import type * as Layer from "effect/Layer"
|
|
12
13
|
import type * as Pool from "effect/Pool"
|
|
13
14
|
import type * as Queue from "effect/Queue"
|
|
@@ -71,7 +72,6 @@ export const PlatformWorker: Context.Tag<PlatformWorker, PlatformWorker> = inter
|
|
|
71
72
|
*/
|
|
72
73
|
export interface Worker<I, E, O> {
|
|
73
74
|
readonly id: number
|
|
74
|
-
readonly join: Effect.Effect<never, WorkerError, never>
|
|
75
75
|
readonly execute: (message: I) => Stream.Stream<never, E | WorkerError, O>
|
|
76
76
|
readonly executeEffect: (message: I) => Effect.Effect<never, E | WorkerError, O>
|
|
77
77
|
}
|
|
@@ -87,10 +87,11 @@ export declare namespace Worker {
|
|
|
87
87
|
*/
|
|
88
88
|
export interface Options<I, W = unknown> {
|
|
89
89
|
readonly spawn: (id: number) => W
|
|
90
|
-
readonly encode?: (message: I) => unknown
|
|
90
|
+
readonly encode?: (message: I) => Effect.Effect<never, WorkerError, unknown>
|
|
91
91
|
readonly transfers?: (message: I) => ReadonlyArray<unknown>
|
|
92
92
|
readonly permits?: number
|
|
93
93
|
readonly queue?: WorkerQueue<I>
|
|
94
|
+
readonly initialMessage?: LazyArg<I>
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
/**
|
|
@@ -104,9 +105,9 @@ export declare namespace Worker {
|
|
|
104
105
|
* @category models
|
|
105
106
|
*/
|
|
106
107
|
export type Response<E, O = unknown> =
|
|
107
|
-
| readonly [id: number, data: 0, O]
|
|
108
|
+
| readonly [id: number, data: 0, ReadonlyArray<O>]
|
|
108
109
|
| readonly [id: number, end: 1]
|
|
109
|
-
| readonly [id: number, end: 1, O]
|
|
110
|
+
| readonly [id: number, end: 1, ReadonlyArray<O>]
|
|
110
111
|
| readonly [id: number, error: 2, E]
|
|
111
112
|
| readonly [id: number, defect: 3, unknown]
|
|
112
113
|
}
|
|
@@ -220,7 +221,6 @@ export const makePoolLayer: <W>(
|
|
|
220
221
|
*/
|
|
221
222
|
export interface SerializedWorker<I extends Schema.TaggedRequest.Any> {
|
|
222
223
|
readonly id: number
|
|
223
|
-
readonly join: Effect.Effect<never, WorkerError, never>
|
|
224
224
|
readonly execute: <Req extends I>(
|
|
225
225
|
message: Req
|
|
226
226
|
) => Req extends Serializable.WithResult<infer _IE, infer E, infer _IA, infer A>
|
|
@@ -246,6 +246,7 @@ export declare namespace SerializedWorker {
|
|
|
246
246
|
readonly spawn: (id: number) => W
|
|
247
247
|
readonly permits?: number
|
|
248
248
|
readonly queue?: WorkerQueue<I>
|
|
249
|
+
readonly initialMessage?: LazyArg<I>
|
|
249
250
|
}
|
|
250
251
|
}
|
|
251
252
|
|
package/src/WorkerError.ts
CHANGED
|
@@ -23,7 +23,7 @@ export type WorkerErrorTypeId = typeof WorkerErrorTypeId
|
|
|
23
23
|
export interface WorkerError extends Data.Case {
|
|
24
24
|
readonly [WorkerErrorTypeId]: WorkerErrorTypeId
|
|
25
25
|
readonly _tag: "WorkerError"
|
|
26
|
-
readonly reason: "spawn" | "decode" | "send" | "unknown"
|
|
26
|
+
readonly reason: "spawn" | "decode" | "send" | "unknown" | "encode"
|
|
27
27
|
readonly error: unknown
|
|
28
28
|
readonly stack?: string
|
|
29
29
|
}
|
|
@@ -33,7 +33,7 @@ export interface WorkerError extends Data.Case {
|
|
|
33
33
|
* @category errors
|
|
34
34
|
*/
|
|
35
35
|
export const WorkerError: (
|
|
36
|
-
reason: "spawn" | "decode" | "send" | "unknown",
|
|
36
|
+
reason: "spawn" | "decode" | "send" | "unknown" | "encode",
|
|
37
37
|
error: unknown,
|
|
38
38
|
stack?: string
|
|
39
39
|
) => WorkerError = internal.WorkerError
|
package/src/WorkerRunner.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type * as Schema from "@effect/schema/Schema"
|
|
|
5
5
|
import type * as Serializable from "@effect/schema/Serializable"
|
|
6
6
|
import type * as Context from "effect/Context"
|
|
7
7
|
import type * as Effect from "effect/Effect"
|
|
8
|
-
import type * as
|
|
8
|
+
import type * as Layer from "effect/Layer"
|
|
9
9
|
import type * as Queue from "effect/Queue"
|
|
10
10
|
import type * as Scope from "effect/Scope"
|
|
11
11
|
import type * as Stream from "effect/Stream"
|
|
@@ -17,7 +17,6 @@ import type { WorkerError } from "./WorkerError.js"
|
|
|
17
17
|
* @category models
|
|
18
18
|
*/
|
|
19
19
|
export interface BackingRunner<I, O> {
|
|
20
|
-
readonly fiber: Fiber.Fiber<WorkerError, never>
|
|
21
20
|
readonly queue: Queue.Dequeue<I>
|
|
22
21
|
readonly send: (message: O, transfers?: ReadonlyArray<unknown>) => Effect.Effect<never, never, void>
|
|
23
22
|
}
|
|
@@ -70,9 +69,10 @@ export declare namespace Runner {
|
|
|
70
69
|
* @since 1.0.0
|
|
71
70
|
* @category models
|
|
72
71
|
*/
|
|
73
|
-
export interface Options<O> {
|
|
74
|
-
readonly
|
|
75
|
-
readonly
|
|
72
|
+
export interface Options<E, O> {
|
|
73
|
+
readonly encodeOutput?: (message: O) => Effect.Effect<never, WorkerError, unknown>
|
|
74
|
+
readonly encodeError?: (message: E) => Effect.Effect<never, WorkerError, unknown>
|
|
75
|
+
readonly transfers?: (message: O | E) => ReadonlyArray<unknown>
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
|
|
@@ -82,8 +82,17 @@ export declare namespace Runner {
|
|
|
82
82
|
*/
|
|
83
83
|
export const make: <I, R, E, O>(
|
|
84
84
|
process: (request: I) => Stream.Stream<R, E, O> | Effect.Effect<R, E, O>,
|
|
85
|
-
options?: Runner.Options<O> | undefined
|
|
86
|
-
) => Effect.Effect<Scope.Scope | R | PlatformRunner, WorkerError,
|
|
85
|
+
options?: Runner.Options<E, O> | undefined
|
|
86
|
+
) => Effect.Effect<Scope.Scope | R | PlatformRunner, WorkerError, void> = internal.make
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @since 1.0.0
|
|
90
|
+
* @category layers
|
|
91
|
+
*/
|
|
92
|
+
export const layer: <I, R, E, O>(
|
|
93
|
+
process: (request: I) => Stream.Stream<R, E, O> | Effect.Effect<R, E, O>,
|
|
94
|
+
options?: Runner.Options<E, O> | undefined
|
|
95
|
+
) => Layer.Layer<R | PlatformRunner, WorkerError, never> = internal.layer
|
|
87
96
|
|
|
88
97
|
/**
|
|
89
98
|
* @since 1.0.0
|
|
@@ -92,7 +101,7 @@ export const make: <I, R, E, O>(
|
|
|
92
101
|
export const makeSerialized: <
|
|
93
102
|
I,
|
|
94
103
|
A extends Schema.TaggedRequest.Any,
|
|
95
|
-
Handlers extends {
|
|
104
|
+
const Handlers extends {
|
|
96
105
|
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
|
|
97
106
|
Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
|
|
98
107
|
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
|
|
@@ -106,5 +115,28 @@ export const makeSerialized: <
|
|
|
106
115
|
| Scope.Scope
|
|
107
116
|
| (ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
|
|
108
117
|
WorkerError,
|
|
109
|
-
|
|
118
|
+
void
|
|
110
119
|
> = internal.makeSerialized
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @since 1.0.0
|
|
123
|
+
* @category layers
|
|
124
|
+
*/
|
|
125
|
+
export const layerSerialized: <
|
|
126
|
+
I,
|
|
127
|
+
A extends Schema.TaggedRequest.Any,
|
|
128
|
+
const Handlers extends {
|
|
129
|
+
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
|
|
130
|
+
Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
|
|
131
|
+
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
|
|
132
|
+
never
|
|
133
|
+
}
|
|
134
|
+
>(
|
|
135
|
+
schema: Schema.Schema<I, A>,
|
|
136
|
+
handlers: Handlers
|
|
137
|
+
) => Layer.Layer<
|
|
138
|
+
| PlatformRunner
|
|
139
|
+
| (ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
|
|
140
|
+
WorkerError,
|
|
141
|
+
never
|
|
142
|
+
> = internal.layerSerialized
|
package/src/internal/command.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { dual } from "effect/Function"
|
|
|
4
4
|
import * as HashMap from "effect/HashMap"
|
|
5
5
|
import * as Option from "effect/Option"
|
|
6
6
|
import { pipeArguments } from "effect/Pipeable"
|
|
7
|
-
import type ReadonlyArray from "effect/ReadonlyArray"
|
|
7
|
+
import type * as ReadonlyArray from "effect/ReadonlyArray"
|
|
8
8
|
import type { Scope } from "effect/Scope"
|
|
9
9
|
import * as Stream from "effect/Stream"
|
|
10
10
|
import type * as Command from "../Command.js"
|