@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.
@@ -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 handleRequests = pipe(Queue.take(backing.queue), Effect.tap(req => {
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 => backing.send([id, 2, 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
- const payload = options?.encode ? options.encode(data) : data;
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(item => {
41
- const transfers = options?.transfers ? options.transfers(item) : undefined;
42
- const payload = options?.encode ? options.encode(item) : item;
43
- return backing.send([id, 0, payload], transfers);
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 => backing.send([id, 2, 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","handleRequests","take","queue","tap","req","id","fiber","get","unit","interrupt","stream","effect","isEffect","matchCauseEffect","onFailure","cause","match","failureOrCause","onLeft","error","send","onRight","squash","onSuccess","data","transfers","undefined","payload","encode","item","runDrain","ensuring","sync","delete","fork","set","forever","all","join","concurrency","discard","makeSerialized","schema","handlers","parseRequest","decode","effectTags","Set","request","hasProperty","has","_tag","flatMap","handler","dieMessage","encodeSuccess","successSchema","matchEffect","serializeFailure","fail","add","catchAll","mapEffect","message"],"sources":["../../../src/internal/workerRunner.ts"],"sourcesContent":[null],"mappings":"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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/platform",
3
- "version": "0.37.0",
3
+ "version": "0.37.2",
4
4
  "description": "Unified interfaces for common platform-specific services",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -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 (typeof u === "object" && u !== null && symbol in u) {
25
- return (u as Transferable)[symbol]()
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
 
@@ -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
@@ -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 Fiber from "effect/Fiber"
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 encode?: (message: O) => unknown
75
- readonly transfers?: (message: O) => ReadonlyArray<unknown>
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, never> = internal.make
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
- never
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
@@ -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"