effect-genserver 0.1.0 → 0.1.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/README.md CHANGED
@@ -1,3 +1,100 @@
1
1
  # effect-genserver
2
2
 
3
3
  Because I miss elixir
4
+
5
+ ## Usage
6
+
7
+ ```
8
+ pnpm add effect-genserver
9
+ ```
10
+
11
+ ```ts
12
+ import { Effect, Layer, Schema } from "effect"
13
+ import { Rpc, RpcServer } from "effect/unstable/rpc"
14
+ import { ClusterGenServer, GenServer, RpcGenServer } from "effect-genserver"
15
+
16
+ // schema definition
17
+ export const Counter = GenServer.make({
18
+ state: Schema.Struct({
19
+ count: Schema.Int,
20
+ }),
21
+ protocol: [
22
+ Rpc.make("increment", {
23
+ payload: {
24
+ amount: Schema.Int,
25
+ },
26
+ }),
27
+ Rpc.make("decrement", {
28
+ payload: {
29
+ amount: Schema.Int,
30
+ },
31
+ }),
32
+ ],
33
+ })
34
+
35
+ // implementation
36
+ export const CounterLayer = Counter.toLayer(
37
+ Effect.gen(function* () {
38
+ yield* Effect.log("booting counter")
39
+ const send = yield* Counter.sender
40
+
41
+ // queue initial messages
42
+ yield* send("increment", { amount: 1 })
43
+
44
+ return Counter.of(
45
+ // initial state
46
+ { count: 0 },
47
+ // handlers
48
+ {
49
+ increment: Effect.fn("Counter.increment")(function* ({
50
+ payload,
51
+ state,
52
+ }) {
53
+ yield* Effect.log("incrementing counter")
54
+
55
+ // handlers return a tuple of [new state, success value]
56
+ return [
57
+ {
58
+ ...state,
59
+ count: state.count + payload.amount,
60
+ },
61
+ void 0,
62
+ ]
63
+ }),
64
+ decrement: Effect.fn("Counter.decrement")(function* ({
65
+ payload,
66
+ state,
67
+ }) {
68
+ yield* Effect.log("decrementing counter")
69
+ return [
70
+ {
71
+ ...state,
72
+ count: state.count - payload.amount,
73
+ },
74
+ void 0,
75
+ ]
76
+ }),
77
+ },
78
+ )
79
+ }),
80
+ )
81
+
82
+ // Derive a cluster entity
83
+ export const CounterEntity = ClusterGenServer.entity("Counter", Counter)
84
+
85
+ // Create the cluster implementation
86
+ export const CounterEntityLayer = CounterEntity.toLayer(
87
+ ClusterGenServer.entityHandlers(Counter, CounterLayer),
88
+ )
89
+
90
+ // Derive a RpcGroup
91
+ export class CounterRpcGroup extends Counter.protocol {}
92
+
93
+ // Create the rpc handlers implementation
94
+ export const RpcHandlers = RpcGenServer.toRpcHandlers(Counter, CounterLayer)
95
+
96
+ // Create the rpc server
97
+ export const RpcServerLayer = RpcServer.layer(CounterRpcGroup).pipe(
98
+ Layer.provide(RpcHandlers),
99
+ )
100
+ ```
@@ -18,9 +18,9 @@ export declare const make: <State extends Schema.Top, Rpcs extends Rpc.Any, E, I
18
18
  readonly initialState?: InitialState | undefined;
19
19
  }) => {
20
20
  readonly actor: Atom.Atom<AsyncResult.AsyncResult<GenServer.Actor<State, Rpcs>, E>>;
21
- readonly send: <Tag extends Rpcs["_tag"]>(tag: Tag, options?: {
21
+ readonly send: <Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(tag: Tag, options?: {
22
22
  readonly concurrent?: boolean | undefined;
23
- }) => Atom.AtomResultFn<Rpc.PayloadConstructor<Rpc.ExtractTag<Rpcs, Tag>>, Rpc.Success<Rpc.ExtractTag<Rpcs, Tag>>, E | Schema.Schema.Type<Rpc.ErrorSchema<Rpc.ExtractTag<Rpcs, Tag>>>>;
23
+ }) => Atom.AtomResultFn<Rpc.PayloadConstructor<Rpc>, Rpc.SuccessExit<Rpc>, E | Rpc.ErrorExit<Rpc>>;
24
24
  readonly state: Atom.Atom<[InitialState] extends [undefined] ? AsyncResult.AsyncResult<State["Type"], E> : State["Type"]>;
25
25
  };
26
26
  //# sourceMappingURL=AtomGenServer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AtomGenServer.d.ts","sourceRoot":"","sources":["../src/AtomGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAEnD,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAA;AAGvD,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAA;AACrE,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C;;;GAGG;AACH,eAAO,MAAM,IAAI,GACf,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,YAAY,SAAS,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,EAE1D,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EACxC,OACI,KAAK,CAAC,KAAK,CACT,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAClD,CAAC,EACD,SAAS,CAAC,WAAW,CACtB,GACD,CAAC,CACC,GAAG,EAAE,IAAI,CAAC,WAAW,KAClB,KAAK,CAAC,KAAK,CACd,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAClD,CAAC,EACD,SAAS,CAAC,WAAW,CACtB,CAAC,EACN,UAAU;IACR,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CACjD,KACA;IACD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CACvB,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CACzD,CAAA;IACD,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,EACtC,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAC1C,KACE,IAAI,CAAC,YAAY,CACpB,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EACjD,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EACtC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CACnE,CAAA;IACD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CACvB,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,GAC9B,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GACzC,KAAK,CAAC,MAAM,CAAC,CAClB,CAAA;CAkDF,CAAA"}
1
+ {"version":3,"file":"AtomGenServer.d.ts","sourceRoot":"","sources":["../src/AtomGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAGnD,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAA;AAGvD,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAA;AACrE,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C;;;GAGG;AACH,eAAO,MAAM,IAAI,GACf,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,YAAY,SAAS,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,EAE1D,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EACxC,OACI,KAAK,CAAC,KAAK,CACT,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAClD,CAAC,EACD,SAAS,CAAC,WAAW,CACtB,GACD,CAAC,CACC,GAAG,EAAE,IAAI,CAAC,WAAW,KAClB,KAAK,CAAC,KAAK,CACd,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAClD,CAAC,EACD,SAAS,CAAC,WAAW,CACtB,CAAC,EACN,UAAU;IACR,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CACjD,KACA;IACD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CACvB,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CACzD,CAAA;IACD,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EACvE,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAC1C,KACE,IAAI,CAAC,YAAY,CACpB,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAC3B,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EACpB,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CACvB,CAAA;IACD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CACvB,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,GAC9B,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GACzC,KAAK,CAAC,MAAM,CAAC,CAClB,CAAA;CAqEF,CAAA"}
@@ -1,3 +1,4 @@
1
+ import * as RpcSchema from "effect/unstable/rpc/RpcSchema";
1
2
  import * as Effect from "effect/Effect";
2
3
  import * as Layer from "effect/Layer";
3
4
  import * as GenServer from "./GenServer.js";
@@ -20,6 +21,11 @@ export const make = (server, layer, options) => {
20
21
  ? Atom.map(AsyncResult.getOrElse(() => options.initialState))
21
22
  : identity);
22
23
  const sendFamily = ([tag, concurrent]) => {
24
+ const rpc = server.protocol.requests.get(tag);
25
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
26
+ if (isStream) {
27
+ return Atom.fn((payload, get) => pipe(get.result(actor), Effect.map((actor) => actor.send(tag, payload)), Stream.unwrap));
28
+ }
23
29
  return Atom.fn((payload, get) => pipe(get.result(actor), Effect.flatMap((actor) => actor.send(tag, payload))), { concurrent });
24
30
  };
25
31
  const send = (tag, options) => sendFamily([tag, options?.concurrent ?? false]);
@@ -1 +1 @@
1
- {"version":3,"file":"AtomGenServer.js","sourceRoot":"","sources":["../src/AtomGenServer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAA;AACrE,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAMlB,MAAwC,EACxC,KAYM,EACN,OAIC,EAoBD,EAAE;IACF,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;IAExD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC/D,OAAO,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAC7C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC,CACrD,CAAA;IACH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAE3D,MAAM,KAAK,GAAG,IAAI,CAChB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAChB,IAAI,CACF,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EACjB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EACpC,MAAM,CAAC,MAAM,CACd,CACF,EACD,OAAO,EAAE,YAAY;QACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC,CAAC,QAAQ,CAC2C,CAAA;IAEzD,MAAM,UAAU,GAAG,CAGjB,CAAC,GAAG,EAAE,UAAU,CAAiB,EAIjC,EAAE;QACF,OAAO,IAAI,CAAC,EAAE,CACZ,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CACf,IAAI,CACF,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EACjB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CACpD,EACH,EAAE,UAAU,EAAE,CACf,CAAA;IACH,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,CACX,GAAQ,EACR,OAEC,EACD,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC,CAAC,CAAA;IAEpD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAC/B,CAAC,CAAA"}
1
+ {"version":3,"file":"AtomGenServer.js","sourceRoot":"","sources":["../src/AtomGenServer.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as Rpc from "effect/unstable/rpc/Rpc";
4
+ import * as Rpc from "effect/unstable/rpc/Rpc";
5
5
  import * as Effect from "effect/Effect";
6
6
  import type * as Schema from "effect/Schema";
7
7
  import type * as Layer from "effect/Layer";
@@ -27,7 +27,7 @@ export type EntityHandlersFrom<Rpcs extends Rpc.Any> = {
27
27
  * @since 1.0.0
28
28
  * @category Entity
29
29
  */
30
- export declare const entityHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer.GenServer<State, Rpcs>, layer: Layer.Layer<GenServer.ToHandler<Rpcs> | GenServer.InitialState, E, R>) => Effect.Effect<EntityHandlersFrom<Rpcs | Rpc.Rpc<"GenServerChanges", Schema.Void, RpcSchema.Stream<State, Schema.Never>, Schema.Never, never, never>>, E, Exclude<R, GenServer.SendDiscard> | Scope.Scope>;
30
+ export declare const entityHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer.GenServer<State, Rpcs>, layer: Layer.Layer<GenServer.InitialState | GenServer.ToHandler<Rpcs>, E, R>) => Effect.Effect<EntityHandlersFrom<Rpcs | Rpc.Rpc<"GenServerChanges", Schema.Void, RpcSchema.Stream<State, Schema.Never>, Schema.Never, never, never>>, E, Scope.Scope | Exclude<R, GenServer.SendDiscard>>;
31
31
  declare const ClusterRequest_base: Context.ServiceClass<ClusterRequest, "effect-genserver/ClusterGenServer/ClusterRequest", Envelope.Request<Rpc.AnyWithProps>>;
32
32
  /**
33
33
  * @since 1.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterGenServer.d.ts","sourceRoot":"","sources":["../src/ClusterGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,yBAAyB,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAA;AACxD,OAAO,KAAK,KAAK,QAAQ,MAAM,kCAAkC,CAAA;AACjE,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;GAGG;AACH,eAAO,MAAM,MAAM,GACjB,KAAK,CAAC,IAAI,SAAS,MAAM,EACzB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EAEpB,MAAM,IAAI,EACV,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KACvC,MAAM,CAAC,MAAM,CACd,IAAI,EACF,IAAI,GACJ,GAAG,CAAC,GAAG,CACL,kBAAkB,EAClB,MAAM,CAAC,IAAI,EACX,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CACtC,CAKF,CAAA;AAEH;;;GAGG;AACH,MAAM,MAAM,kBAAkB,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI;IACrD,QAAQ,EAAE,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAC7C,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAChC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;CACnD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,CAAC,sUA6BD,CAAA;;AAEF;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAGmB;CAAG"}
1
+ {"version":3,"file":"ClusterGenServer.d.ts","sourceRoot":"","sources":["../src/ClusterGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAA;AACxD,OAAO,KAAK,KAAK,QAAQ,MAAM,kCAAkC,CAAA;AACjE,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAG3C;;;GAGG;AACH,eAAO,MAAM,MAAM,GACjB,KAAK,CAAC,IAAI,SAAS,MAAM,EACzB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EAEpB,MAAM,IAAI,EACV,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KACvC,MAAM,CAAC,MAAM,CACd,IAAI,EACF,IAAI,GACJ,GAAG,CAAC,GAAG,CACL,kBAAkB,EAClB,MAAM,CAAC,IAAI,EACX,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CACtC,CAKF,CAAA;AAEH;;;GAGG;AACH,MAAM,MAAM,kBAAkB,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI;IACrD,QAAQ,EAAE,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAC7C,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAChC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;CACnD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,CAAC,sUA+BD,CAAA;;AAEF;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAGmB;CAAG"}
@@ -1,7 +1,12 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Rpc from "effect/unstable/rpc/Rpc";
1
5
  import * as Effect from "effect/Effect";
2
6
  import * as Context from "effect/Context";
3
7
  import * as Entity from "effect/unstable/cluster/Entity";
4
8
  import * as GenServer from "./GenServer.js";
9
+ import * as Stream from "effect/Stream";
5
10
  /**
6
11
  * @since 1.0.0
7
12
  * @category Entity
@@ -15,10 +20,13 @@ export const entityHandlers = Effect.fnUntraced(function* (schema, layer) {
15
20
  const { handlers } = yield* GenServer.makeHandlers(schema, layer);
16
21
  const entityHandlers = {};
17
22
  for (const { rpc, handler } of handlers.values()) {
18
- entityHandlers[rpc._tag] = (request) => handler({
19
- payload: request.payload,
20
- context: ClusterRequest.context(request),
21
- });
23
+ entityHandlers[rpc._tag] = (request) => {
24
+ const result = handler({
25
+ payload: request.payload,
26
+ context: ClusterRequest.context(request),
27
+ });
28
+ return Stream.isStream(result) ? Rpc.fork(result) : result;
29
+ };
22
30
  }
23
31
  return entityHandlers;
24
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterGenServer.js","sourceRoot":"","sources":["../src/ClusterGenServer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAIvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAA;AAExD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAKpB,IAAU,EACV,MAAwC,EASxC,EAAE,CACF,MAAM,CAAC,YAAY,CACjB,IAAI,EACJ,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CACvD,CAAA;AAYH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAMvD,MAAwC,EACxC,KAA4E;IAa5E,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,cAAc,GAGhB,EAAE,CAAA;IACN,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAA8B,EAAE,EAAE,CAC5D,OAAO,CAAC;YACN,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;SACzC,CAAC,CAAA;IACN,CAAC;IACD,OAAO,cAAqB,CAAA;AAC9B,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAGhD,CAAC,kDAAkD,CAAC;CAAG"}
1
+ {"version":3,"file":"ClusterGenServer.js","sourceRoot":"","sources":["../src/ClusterGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAIvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAA;AAExD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAKpB,IAAU,EACV,MAAwC,EASxC,EAAE,CACF,MAAM,CAAC,YAAY,CACjB,IAAI,EACJ,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CACvD,CAAA;AAYH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAMvD,MAAwC,EACxC,KAA4E;IAa5E,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,cAAc,GAGhB,EAAE,CAAA;IACN,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAA8B,EAAE,EAAE;YAC5D,MAAM,MAAM,GAAG,OAAO,CAAC;gBACrB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;aACzC,CAAC,CAAA;YACF,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QAC5D,CAAC,CAAA;IACH,CAAC;IACD,OAAO,cAAqB,CAAA;AAC9B,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAGhD,CAAC,kDAAkD,CAAC;CAAG"}
@@ -4,6 +4,7 @@
4
4
  import * as Rpc from "effect/unstable/rpc/Rpc";
5
5
  import * as RpcGroup from "effect/unstable/rpc/RpcGroup";
6
6
  import * as Effect from "effect/Effect";
7
+ import * as Deferred from "effect/Deferred";
7
8
  import * as Schema from "effect/Schema";
8
9
  import * as Layer from "effect/Layer";
9
10
  import type * as Scope from "effect/Scope";
@@ -13,7 +14,7 @@ import * as Persistence from "effect/unstable/persistence/Persistence";
13
14
  import * as PubSub from "effect/PubSub";
14
15
  import * as MutableRef from "effect/MutableRef";
15
16
  import * as Stream from "effect/Stream";
16
- import type * as RpcSchema from "effect/unstable/rpc/RpcSchema";
17
+ import * as RpcSchema from "effect/unstable/rpc/RpcSchema";
17
18
  import type { Types } from "effect";
18
19
  /**
19
20
  * @since 1.0.0
@@ -22,10 +23,10 @@ import type { Types } from "effect";
22
23
  export interface GenServer<State extends Schema.Top, Rpcs extends Rpc.Any> {
23
24
  readonly stateSchema: State;
24
25
  readonly protocol: RpcGroup.RpcGroup<Rpcs>;
25
- readonly sender: Effect.Effect<(<const Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>, Payload = Rpc.PayloadConstructor<Rpc>>(tag: Tag, ...args: Types.EqualsWith<Payload, void, [
26
- payload?: Payload
26
+ readonly sender: Effect.Effect<(<const Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(tag: Tag, ...args: Types.EqualsWith<Rpc.PayloadConstructor<Rpc>, void, [
27
+ payload?: Rpc.PayloadConstructor<Rpc>
27
28
  ], [
28
- payload: Payload
29
+ payload: Rpc.PayloadConstructor<Rpc>
29
30
  ]>) => Effect.Effect<void>), never, SendDiscard>;
30
31
  of<A extends Handlers<State, Rpcs>>(initialState: State["Type"], handlers: A): readonly [state: State["Type"], handlers: A];
31
32
  toLayer<A extends Handlers<State, Rpcs>, E, R>(build: Effect.Effect<readonly [state: State["Type"], handlers: A], E, R>): Layer.Layer<ToHandler<Rpcs> | InitialState, E, Exclude<R, Scope.Scope> | HandlerServices<A>>;
@@ -71,14 +72,18 @@ export type Handlers<State extends Schema.Top, Rpcs extends Rpc.Any> = {
71
72
  */
72
73
  export type HandlerFn<State extends Schema.Top, Rpc extends Rpc.Any, R> = (options: {
73
74
  readonly state: State["Type"];
75
+ readonly changes: Stream.Stream<State["Type"]>;
74
76
  readonly payload: Rpc.Payload<Rpc>;
75
77
  readonly context: Context.Context<never>;
76
- }) => Rpc.WrapperOr<Effect.Effect<readonly [state: State["Type"], result: Rpc.Success<Rpc>], Rpc.Error<Rpc>, R>>;
78
+ }) => Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E> ? Stream.Stream<A["Type"], E["Type"], R> : Effect.Effect<readonly [
79
+ state: State["Type"],
80
+ result: Rpc.Success<Rpc> | Deferred.Deferred<Rpc.Success<Rpc>, Rpc.Error<Rpc>>
81
+ ], Rpc.Error<Rpc>, R>;
77
82
  /**
78
83
  * @since 1.0.0
79
84
  * @category Handlers
80
85
  */
81
- export type HandlerServices<Handlers extends Record<string, any>> = keyof Handlers extends infer K ? K extends keyof Handlers ? ReturnType<Handlers[K]> extends Effect.Effect<infer _A, infer _E, infer _R> ? _R : never : never : never;
86
+ export type HandlerServices<Handlers extends Record<string, any>> = keyof Handlers extends infer K ? K extends keyof Handlers ? ReturnType<Handlers[K]> extends Effect.Effect<infer _A, infer _E, infer _R> ? _R : ReturnType<Handlers[K]> extends Stream.Stream<infer _A, infer _E, infer _R> ? _R : never : never : never;
82
87
  /**
83
88
  * @since 1.0.0
84
89
  * @category Constructors
@@ -99,7 +104,7 @@ export declare const fromRpcGroup: <State extends Schema.Top, Rpcs extends Rpc.A
99
104
  * @since 1.0.0
100
105
  * @category Handlers
101
106
  */
102
- export declare const makeHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer<State, Rpcs>, layer: Layer.Layer<ToHandler<Rpcs> | InitialState, E, R>) => Effect.Effect<{
107
+ export declare const makeHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer<State, Rpcs>, layer: Layer.Layer<InitialState | ToHandler<Rpcs>, E, R>) => Effect.Effect<{
103
108
  readonly state: MutableRef.MutableRef<State["Type"]>;
104
109
  readonly pubsub: PubSub.PubSub<State["Type"]>;
105
110
  readonly handlers: ReadonlyMap<string, {
@@ -107,9 +112,9 @@ export declare const makeHandlers: <State extends Schema.Top, Rpcs extends Rpc.A
107
112
  readonly handler: (options: {
108
113
  readonly payload: any;
109
114
  readonly context: Context.Context<never>;
110
- }) => Rpc.WrapperOr<Effect.Effect<any, any>>;
115
+ }) => Stream.Stream<any, any> | Effect.Effect<{} | Deferred.Deferred<any, any>, any>;
111
116
  }>;
112
- }, E, Exclude<R, SendDiscard> | Scope.Scope>;
117
+ }, E, Scope.Scope | Exclude<R, SendDiscard>>;
113
118
  /**
114
119
  * @since 1.0.0
115
120
  * @category RpcServer
@@ -122,11 +127,11 @@ export declare const RpcStateChanges: <State extends Schema.Top, Rpcs extends Rp
122
127
  export interface Actor<State extends Schema.Top, Rpcs extends Rpc.Any> {
123
128
  readonly changes: Stream.Stream<State["Type"]>;
124
129
  readonly state: MutableRef.MutableRef<State["Type"]>;
125
- send<Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>, Payload = Rpc.PayloadConstructor<Rpc>>(tag: Tag, ...args: Types.EqualsWith<Payload, void, [
126
- payload?: Payload
130
+ send<Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(tag: Tag, ...args: Types.EqualsWith<Rpc.PayloadConstructor<Rpc>, void, [
131
+ payload?: Rpc.PayloadConstructor<Rpc>
127
132
  ], [
128
- payload: Payload
129
- ]>): Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>;
133
+ payload: Rpc.PayloadConstructor<Rpc>
134
+ ]>): Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E> ? Stream.Stream<A["Type"], E["Type"]> : Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>;
130
135
  }
131
136
  /**
132
137
  * @since 1.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"GenServer.d.ts","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GenServer.d.ts","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"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"}
package/dist/GenServer.js CHANGED
@@ -4,6 +4,7 @@
4
4
  import * as Rpc from "effect/unstable/rpc/Rpc";
5
5
  import * as RpcGroup from "effect/unstable/rpc/RpcGroup";
6
6
  import * as Effect from "effect/Effect";
7
+ import * as Deferred from "effect/Deferred";
7
8
  import * as Schema from "effect/Schema";
8
9
  import * as Layer from "effect/Layer";
9
10
  import * as Context from "effect/Context";
@@ -13,6 +14,7 @@ import * as MutableRef from "effect/MutableRef";
13
14
  import * as Stream from "effect/Stream";
14
15
  import * as Semaphore from "effect/Semaphore";
15
16
  import { flow, identity, pipe } from "effect/Function";
17
+ import * as RpcSchema from "effect/unstable/rpc/RpcSchema";
16
18
  import * as Latch from "effect/Latch";
17
19
  /**
18
20
  * @since 1.0.0
@@ -46,18 +48,26 @@ const Proto = {
46
48
  return [initialState, handlers];
47
49
  },
48
50
  toLayer(build) {
51
+ // oxlint-disable-next-line typescript/no-this-alias
52
+ const schema = this;
49
53
  return Layer.fresh(Layer.effectContext(Effect.gen(function* () {
50
54
  const services = yield* Effect.context();
51
55
  const [initialState, handlers] = yield* build;
52
56
  const handlerMap = new Map();
53
57
  handlerMap.set(initialStateKey, initialState);
54
58
  for (const [tag, handler] of Object.entries(handlers)) {
55
- handlerMap.set(handlerKey(tag), (options) => Rpc.wrapMap(handler(options), Effect.provideContext(services)));
59
+ const rpc = schema.protocol.requests.get(tag);
60
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
61
+ handlerMap.set(handlerKey(tag), (options) => isStream
62
+ ? Stream.provideContext(handler(options), services)
63
+ : Rpc.wrapMap(handler(options), Effect.provideContext(services)));
56
64
  }
57
65
  return Context.makeUnsafe(handlerMap);
58
66
  })));
59
67
  },
60
68
  toLayerPersisted(build, options) {
69
+ // oxlint-disable-next-line typescript/no-this-alias
70
+ const schema = this;
61
71
  const storeId = options?.storeId ?? "machine";
62
72
  const stateFromJson = Schema.toCodecJson(this.stateSchema);
63
73
  const decode = Schema.decodeUnknownEffect(stateFromJson);
@@ -77,7 +87,11 @@ const Proto = {
77
87
  initialState,
78
88
  ]);
79
89
  for (const [tag, handler] of Object.entries(handlers)) {
80
- handlerMap.set(handlerKey(tag), (options) => Rpc.wrapMap(handler(options), flow(Effect.tap(([state]) => Effect.flatMap(encode(state), (a) => store.set(currentId, a, undefined))), Effect.provideContext(services))));
90
+ const rpc = schema.protocol.requests.get(tag);
91
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
92
+ handlerMap.set(handlerKey(tag), (options) => isStream
93
+ ? Stream.provideContext(handler(options), services)
94
+ : Rpc.wrapMap(handler(options), flow(Effect.tap(([state]) => Effect.flatMap(encode(state), (a) => store.set(currentId, a, undefined))), Effect.provideContext(services))));
81
95
  }
82
96
  return Context.makeUnsafe(handlerMap);
83
97
  })));
@@ -111,7 +125,7 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
111
125
  payload,
112
126
  context: Context.empty(),
113
127
  });
114
- return Rpc.isWrapper(result) ? result.value : result;
128
+ return Stream.isStream(result) ? Stream.runDrain(result) : result;
115
129
  });
116
130
  const services = yield* Layer.build(layer).pipe(Effect.provideService(SendDiscard, sendDiscard));
117
131
  const state = MutableRef.make(services.mapUnsafe.get(initialStateKey));
@@ -119,6 +133,7 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
119
133
  replay: 1,
120
134
  });
121
135
  PubSub.publishUnsafe(pubsub, state.current);
136
+ const changes = Stream.fromPubSub(pubsub);
122
137
  handlers.set(stateChanges._tag, {
123
138
  rpc: stateChanges,
124
139
  handler: (_) => Stream.fromPubSub(pubsub),
@@ -127,17 +142,23 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
127
142
  const handler = services.mapUnsafe.get(handlerKey(rpc._tag));
128
143
  handlers.set(rpc._tag, {
129
144
  rpc: rpc,
130
- handler: (options) => Rpc.wrapMap(handler({
131
- state: state.current,
132
- payload: options.payload,
133
- context: options.context,
134
- }), (effect) => pipe(effect, Effect.map(([nextState, result]) => {
135
- if (nextState !== state.current) {
136
- MutableRef.set(state, nextState);
137
- PubSub.publishUnsafe(pubsub, nextState);
138
- }
139
- return result;
140
- }), sendSemaphore.withPermits(1))),
145
+ handler: (options) => {
146
+ const result = handler({
147
+ state: state.current,
148
+ changes,
149
+ payload: options.payload,
150
+ context: options.context,
151
+ });
152
+ if (Stream.isStream(result))
153
+ return result;
154
+ return pipe(result, Effect.map(([nextState, result]) => {
155
+ if (nextState !== state.current) {
156
+ MutableRef.set(state, nextState);
157
+ PubSub.publishUnsafe(pubsub, nextState);
158
+ }
159
+ return result;
160
+ }), sendSemaphore.withPermits(1));
161
+ },
141
162
  });
142
163
  }
143
164
  startLatch.openUnsafe();
@@ -162,15 +183,22 @@ export const makeActor = Effect.fnUntraced(function* (schema, layer, options) {
162
183
  const send = (tag, payload_) => {
163
184
  const entry = handlers.get(tag);
164
185
  if (!entry) {
165
- return Effect.die(`Unknown tag: ${tag}`);
186
+ const rpc = schema.protocol.requests.get(tag);
187
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
188
+ const message = `Unknown tag: ${tag}`;
189
+ return isStream ? Stream.die(message) : Effect.die(message);
166
190
  }
167
- const effectOrWrap = entry.handler({
191
+ const result = entry.handler({
168
192
  payload: payload_ !== undefined
169
193
  ? entry.rpc.payloadSchema.make(payload_)
170
194
  : undefined,
171
195
  context: requestContext,
172
196
  });
173
- return Rpc.isWrapper(effectOrWrap) ? effectOrWrap.value : effectOrWrap;
197
+ return Stream.isStream(result)
198
+ ? result
199
+ : Effect.flatMap(result, (result) => Deferred.isDeferred(result)
200
+ ? Deferred.await(result)
201
+ : Effect.succeed(result));
174
202
  };
175
203
  return identity({
176
204
  changes: Stream.fromPubSub(pubsub),
@@ -1 +1 @@
1
- {"version":3,"file":"GenServer.js","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GenServer.js","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=GenServer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenServer.test.d.ts","sourceRoot":"","sources":["../src/GenServer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, expect, it } from "@effect/vitest";
2
+ import * as GenServer from "./GenServer.js";
3
+ import { Deferred, Effect, Fiber, pipe, Schema, Stream } from "effect";
4
+ import { Rpc } from "effect/unstable/rpc";
5
+ const Counter = GenServer.make({
6
+ state: Schema.Int,
7
+ protocol: [
8
+ Rpc.make("increment"),
9
+ Rpc.make("incrementDeferred"),
10
+ Rpc.make("count", {
11
+ success: Schema.String,
12
+ stream: true,
13
+ }),
14
+ ],
15
+ });
16
+ const CounterLayer = Counter.toLayer(Effect.gen(function* () {
17
+ yield* Effect.void;
18
+ return Counter.of(0, {
19
+ increment: ({ state }) => Effect.succeed([state + 1, void 0]),
20
+ incrementDeferred: Effect.fnUntraced(function* ({ state }) {
21
+ const deferred = yield* Deferred.make();
22
+ yield* Deferred.succeed(deferred, void 0);
23
+ return [state + 1, deferred];
24
+ }),
25
+ count: ({ changes }) => changes.pipe(Stream.map((a) => a.toString())),
26
+ });
27
+ }));
28
+ describe("GenServer", () => {
29
+ it.effect("handles streams", Effect.fn(function* () {
30
+ const actor = yield* GenServer.makeActor(Counter, CounterLayer);
31
+ const arr = yield* pipe(actor.send("count"), Stream.take(3), Stream.runCollect, Effect.forkChild({ startImmediately: true }));
32
+ yield* actor.send("increment");
33
+ yield* actor.send("increment");
34
+ expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"]);
35
+ }));
36
+ it.effect("handles deferreds", Effect.fn(function* () {
37
+ const actor = yield* GenServer.makeActor(Counter, CounterLayer);
38
+ const arr = yield* pipe(actor.send("count"), Stream.take(3), Stream.runCollect, Effect.forkChild({ startImmediately: true }));
39
+ yield* actor.send("incrementDeferred");
40
+ yield* actor.send("incrementDeferred");
41
+ expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"]);
42
+ }));
43
+ });
44
+ //# sourceMappingURL=GenServer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenServer.test.js","sourceRoot":"","sources":["../src/GenServer.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as Rpc from "effect/unstable/rpc/Rpc";
4
+ import * as Rpc from "effect/unstable/rpc/Rpc";
5
5
  import type * as Schema from "effect/Schema";
6
6
  import * as Layer from "effect/Layer";
7
7
  import * as Context from "effect/Context";
@@ -1 +1 @@
1
- {"version":3,"file":"RpcGenServer.d.ts","sourceRoot":"","sources":["../src/RpcGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAEnD,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,UAAU,MAAM,gCAAgC,CAAA;AACjE,OAAO,KAAK,KAAK,OAAO,MAAM,8BAA8B,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,CAAC,EAED,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EACxC,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3E,KAAK,CAAC,KAAK,CACZ,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,EACrD,CAAC,EACD,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAuBhC,CAAA;;qBASkB,GAAG,CAAC,YAAY;wBACb,UAAU,CAAC,SAAS;sBACtB,OAAO,CAAC,OAAO;kBACnB,GAAG,CAAC,YAAY;;AAVlC;;;GAGG;AACH,qBAAa,UAAW,SAAQ,eAQe;CAAG"}
1
+ {"version":3,"file":"RpcGenServer.d.ts","sourceRoot":"","sources":["../src/RpcGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAE9C,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,UAAU,MAAM,gCAAgC,CAAA;AACjE,OAAO,KAAK,KAAK,OAAO,MAAM,8BAA8B,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAG3C;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,CAAC,EAED,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EACxC,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3E,KAAK,CAAC,KAAK,CACZ,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,EACrD,CAAC,EACD,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAyBhC,CAAA;;qBASkB,GAAG,CAAC,YAAY;wBACb,UAAU,CAAC,SAAS;sBACtB,OAAO,CAAC,OAAO;kBACnB,GAAG,CAAC,YAAY;;AAVlC;;;GAGG;AACH,qBAAa,UAAW,SAAQ,eAQe;CAAG"}
@@ -1,7 +1,12 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Rpc from "effect/unstable/rpc/Rpc";
1
5
  import * as Effect from "effect/Effect";
2
6
  import * as Layer from "effect/Layer";
3
7
  import * as Context from "effect/Context";
4
8
  import * as GenServer from "./GenServer.js";
9
+ import * as Stream from "effect/Stream";
5
10
  /**
6
11
  * @since 1.0.0
7
12
  * @category RpcServer
@@ -15,10 +20,13 @@ export const toRpcHandlers = (schema, layer) => Layer.effectContext(Effect.gen(f
15
20
  _: null,
16
21
  tag: rpc._tag,
17
22
  context: services,
18
- handler: (payload, options) => handler({
19
- payload,
20
- context: RpcContext.context(options),
21
- }),
23
+ handler(payload, options) {
24
+ const result = handler({
25
+ payload,
26
+ context: RpcContext.context(options),
27
+ });
28
+ return Stream.isStream(result) ? Rpc.fork(result) : result;
29
+ },
22
30
  });
23
31
  }
24
32
  return Context.makeUnsafe(contextMap);
@@ -1 +1 @@
1
- {"version":3,"file":"RpcGenServer.js","sourceRoot":"","sources":["../src/RpcGenServer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAGzC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAM3B,MAAwC,EACxC,KAA4E,EAK5E,EAAE,CACF,KAAK,CAAC,aAAa,CACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAA;IACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAExC,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;YACtB,CAAC,EAAE,IAAW;YACd,GAAG,EAAE,GAAG,CAAC,IAAI;YACb,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC5B,OAAO,CAAC;gBACN,OAAO;gBACP,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,OAAc,CAAC;aAC5C,CAAQ;SACZ,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AACvC,CAAC,CAAC,CACH,CAAA;AAEH;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,OAAO,CAAC,OAAO,EAQ5C,CAAC,0CAA0C,CAAC;CAAG"}
1
+ {"version":3,"file":"RpcGenServer.js","sourceRoot":"","sources":["../src/RpcGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAGzC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAM3B,MAAwC,EACxC,KAA4E,EAK5E,EAAE,CACF,KAAK,CAAC,aAAa,CACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAA;IACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAExC,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;YACtB,CAAC,EAAE,IAAW;YACd,GAAG,EAAE,GAAG,CAAC,IAAI;YACb,OAAO,EAAE,QAAQ;YACjB,OAAO,CAAC,OAAO,EAAE,OAAO;gBACtB,MAAM,MAAM,GAAG,OAAO,CAAC;oBACrB,OAAO;oBACP,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,OAAc,CAAC;iBAC5C,CAAsD,CAAA;gBACvD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YAC5D,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AACvC,CAAC,CAAC,CACH,CAAA;AAEH;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,OAAO,CAAC,OAAO,EAQ5C,CAAC,0CAA0C,CAAC;CAAG"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "effect-genserver",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.1.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -23,16 +23,16 @@
23
23
  },
24
24
  "dependencies": {},
25
25
  "peerDependencies": {
26
- "effect": "4.0.0-beta.48"
26
+ "effect": "4.0.0-beta.50"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@changesets/changelog-github": "^0.6.0",
30
30
  "@changesets/cli": "^2.29.8",
31
31
  "@effect/language-service": "^0.85.1",
32
- "@effect/vitest": "4.0.0-beta.48",
32
+ "@effect/vitest": "4.0.0-beta.50",
33
33
  "@types/node": "^25.6.0",
34
34
  "@typescript/native-preview": "7.0.0-dev.20260412.1",
35
- "effect": "4.0.0-beta.48",
35
+ "effect": "4.0.0-beta.50",
36
36
  "husky": "^9.1.7",
37
37
  "lint-staged": "^16.4.0",
38
38
  "oxlint": "^1.57.0",
@@ -2,6 +2,7 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
  import type * as Rpc from "effect/unstable/rpc/Rpc"
5
+ import * as RpcSchema from "effect/unstable/rpc/RpcSchema"
5
6
  import * as Effect from "effect/Effect"
6
7
  import type * as Schema from "effect/Schema"
7
8
  import * as Layer from "effect/Layer"
@@ -45,15 +46,15 @@ export const make = <
45
46
  readonly actor: Atom.Atom<
46
47
  AsyncResult.AsyncResult<GenServer.Actor<State, Rpcs>, E>
47
48
  >
48
- readonly send: <Tag extends Rpcs["_tag"]>(
49
+ readonly send: <Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(
49
50
  tag: Tag,
50
51
  options?: {
51
52
  readonly concurrent?: boolean | undefined
52
53
  },
53
54
  ) => Atom.AtomResultFn<
54
- Rpc.PayloadConstructor<Rpc.ExtractTag<Rpcs, Tag>>,
55
- Rpc.Success<Rpc.ExtractTag<Rpcs, Tag>>,
56
- E | Schema.Schema.Type<Rpc.ErrorSchema<Rpc.ExtractTag<Rpcs, Tag>>>
55
+ Rpc.PayloadConstructor<Rpc>,
56
+ Rpc.SuccessExit<Rpc>,
57
+ E | Rpc.ErrorExit<Rpc>
57
58
  >
58
59
  readonly state: Atom.Atom<
59
60
  [InitialState] extends [undefined]
@@ -88,25 +89,44 @@ export const make = <
88
89
  Rpc = Rpc.ExtractTag<Rpcs, Tag>,
89
90
  >([tag, concurrent]: [Tag, boolean]): Atom.AtomResultFn<
90
91
  Rpc.PayloadConstructor<Rpc>,
91
- Rpc.Success<Rpc>,
92
- Rpc.Error<Rpc> | E
92
+ Rpc.SuccessExit<Rpc>,
93
+ Rpc.ErrorExit<Rpc> | E
93
94
  > => {
95
+ const rpc = server.protocol.requests.get(tag)! as any as Rpc.AnyWithProps
96
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
97
+ if (isStream) {
98
+ return Atom.fn((payload, get) =>
99
+ pipe(
100
+ get.result(actor),
101
+ Effect.map(
102
+ (actor) => actor.send(tag, payload) as Stream.Stream<any, any>,
103
+ ),
104
+ Stream.unwrap,
105
+ ),
106
+ )
107
+ }
94
108
  return Atom.fn(
95
109
  (payload, get) =>
96
110
  pipe(
97
111
  get.result(actor),
98
- Effect.flatMap((actor) => actor.send(tag, payload)),
112
+ Effect.flatMap(
113
+ (actor) => actor.send(tag, payload) as Effect.Effect<any, any>,
114
+ ),
99
115
  ),
100
116
  { concurrent },
101
117
  )
102
118
  }
103
119
 
104
- const send = <Tag extends Rpcs["_tag"]>(
120
+ const send = <Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(
105
121
  tag: Tag,
106
122
  options?: {
107
123
  readonly concurrent?: boolean | undefined
108
124
  },
109
- ) => sendFamily([tag, options?.concurrent ?? false])
125
+ ): Atom.AtomResultFn<
126
+ Rpc.PayloadConstructor<Rpc>,
127
+ Rpc.SuccessExit<Rpc>,
128
+ E | Rpc.ErrorExit<Rpc>
129
+ > => sendFamily([tag, options?.concurrent ?? false])
110
130
 
111
131
  return { actor, send, state }
112
132
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as Rpc from "effect/unstable/rpc/Rpc"
4
+ import * as Rpc from "effect/unstable/rpc/Rpc"
5
5
  import * as Effect from "effect/Effect"
6
6
  import type * as Schema from "effect/Schema"
7
7
  import type * as Layer from "effect/Layer"
@@ -11,6 +11,7 @@ import type * as RpcSchema from "effect/unstable/rpc/RpcSchema"
11
11
  import * as Entity from "effect/unstable/cluster/Entity"
12
12
  import type * as Envelope from "effect/unstable/cluster/Envelope"
13
13
  import * as GenServer from "./GenServer.ts"
14
+ import * as Stream from "effect/Stream"
14
15
 
15
16
  /**
16
17
  * @since 1.0.0
@@ -77,11 +78,13 @@ export const entityHandlers = Effect.fnUntraced(function* <
77
78
  (request: Envelope.Request<any>) => any
78
79
  > = {}
79
80
  for (const { rpc, handler } of handlers.values()) {
80
- entityHandlers[rpc._tag] = (request: Envelope.Request<any>) =>
81
- handler({
81
+ entityHandlers[rpc._tag] = (request: Envelope.Request<any>) => {
82
+ const result = handler({
82
83
  payload: request.payload,
83
84
  context: ClusterRequest.context(request),
84
85
  })
86
+ return Stream.isStream(result) ? Rpc.fork(result) : result
87
+ }
85
88
  }
86
89
  return entityHandlers as any
87
90
  })
@@ -0,0 +1,65 @@
1
+ import { describe, expect, it } from "@effect/vitest"
2
+ import * as GenServer from "./GenServer.ts"
3
+ import { Deferred, Effect, Fiber, pipe, Schema, Stream } from "effect"
4
+ import { Rpc } from "effect/unstable/rpc"
5
+
6
+ const Counter = GenServer.make({
7
+ state: Schema.Int,
8
+ protocol: [
9
+ Rpc.make("increment"),
10
+ Rpc.make("incrementDeferred"),
11
+ Rpc.make("count", {
12
+ success: Schema.String,
13
+ stream: true,
14
+ }),
15
+ ],
16
+ })
17
+
18
+ const CounterLayer = Counter.toLayer(
19
+ Effect.gen(function* () {
20
+ yield* Effect.void
21
+ return Counter.of(0, {
22
+ increment: ({ state }) => Effect.succeed([state + 1, void 0]),
23
+ incrementDeferred: Effect.fnUntraced(function* ({ state }) {
24
+ const deferred = yield* Deferred.make<void>()
25
+ yield* Deferred.succeed(deferred, void 0)
26
+ return [state + 1, deferred]
27
+ }),
28
+ count: ({ changes }) => changes.pipe(Stream.map((a) => a.toString())),
29
+ })
30
+ }),
31
+ )
32
+
33
+ describe("GenServer", () => {
34
+ it.effect(
35
+ "handles streams",
36
+ Effect.fn(function* () {
37
+ const actor = yield* GenServer.makeActor(Counter, CounterLayer)
38
+ const arr = yield* pipe(
39
+ actor.send("count"),
40
+ Stream.take(3),
41
+ Stream.runCollect,
42
+ Effect.forkChild({ startImmediately: true }),
43
+ )
44
+ yield* actor.send("increment")
45
+ yield* actor.send("increment")
46
+ expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"])
47
+ }),
48
+ )
49
+
50
+ it.effect(
51
+ "handles deferreds",
52
+ Effect.fn(function* () {
53
+ const actor = yield* GenServer.makeActor(Counter, CounterLayer)
54
+ const arr = yield* pipe(
55
+ actor.send("count"),
56
+ Stream.take(3),
57
+ Stream.runCollect,
58
+ Effect.forkChild({ startImmediately: true }),
59
+ )
60
+ yield* actor.send("incrementDeferred")
61
+ yield* actor.send("incrementDeferred")
62
+ expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"])
63
+ }),
64
+ )
65
+ })
package/src/GenServer.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  import * as Rpc from "effect/unstable/rpc/Rpc"
5
5
  import * as RpcGroup from "effect/unstable/rpc/RpcGroup"
6
6
  import * as Effect from "effect/Effect"
7
+ import * as Deferred from "effect/Deferred"
7
8
  import * as Schema from "effect/Schema"
8
9
  import * as Layer from "effect/Layer"
9
10
  import type * as Scope from "effect/Scope"
@@ -15,7 +16,7 @@ import * as MutableRef from "effect/MutableRef"
15
16
  import * as Stream from "effect/Stream"
16
17
  import * as Semaphore from "effect/Semaphore"
17
18
  import { flow, identity, pipe } from "effect/Function"
18
- import type * as RpcSchema from "effect/unstable/rpc/RpcSchema"
19
+ import * as RpcSchema from "effect/unstable/rpc/RpcSchema"
19
20
  import * as Latch from "effect/Latch"
20
21
  import type { Types } from "effect"
21
22
 
@@ -28,17 +29,13 @@ export interface GenServer<State extends Schema.Top, Rpcs extends Rpc.Any> {
28
29
  readonly protocol: RpcGroup.RpcGroup<Rpcs>
29
30
 
30
31
  readonly sender: Effect.Effect<
31
- <
32
- const Tag extends Rpcs["_tag"],
33
- Rpc = Rpc.ExtractTag<Rpcs, Tag>,
34
- Payload = Rpc.PayloadConstructor<Rpc>,
35
- >(
32
+ <const Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(
36
33
  tag: Tag,
37
34
  ...args: Types.EqualsWith<
38
- Payload,
35
+ Rpc.PayloadConstructor<Rpc>,
39
36
  void,
40
- [payload?: Payload],
41
- [payload: Payload]
37
+ [payload?: Rpc.PayloadConstructor<Rpc>],
38
+ [payload: Rpc.PayloadConstructor<Rpc>]
42
39
  >
43
40
  ) => Effect.Effect<void>,
44
41
  never,
@@ -130,15 +127,21 @@ export type HandlerFn<
130
127
  R,
131
128
  > = (options: {
132
129
  readonly state: State["Type"]
130
+ readonly changes: Stream.Stream<State["Type"]>
133
131
  readonly payload: Rpc.Payload<Rpc>
134
132
  readonly context: Context.Context<never>
135
- }) => Rpc.WrapperOr<
136
- Effect.Effect<
137
- readonly [state: State["Type"], result: Rpc.Success<Rpc>],
138
- Rpc.Error<Rpc>,
139
- R
140
- >
141
- >
133
+ }) => Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E>
134
+ ? Stream.Stream<A["Type"], E["Type"], R>
135
+ : Effect.Effect<
136
+ readonly [
137
+ state: State["Type"],
138
+ result:
139
+ | Rpc.Success<Rpc>
140
+ | Deferred.Deferred<Rpc.Success<Rpc>, Rpc.Error<Rpc>>,
141
+ ],
142
+ Rpc.Error<Rpc>,
143
+ R
144
+ >
142
145
 
143
146
  /**
144
147
  * @since 1.0.0
@@ -153,7 +156,13 @@ export type HandlerServices<Handlers extends Record<string, any>> =
153
156
  infer _R
154
157
  >
155
158
  ? _R
156
- : never
159
+ : ReturnType<Handlers[K]> extends Stream.Stream<
160
+ infer _A,
161
+ infer _E,
162
+ infer _R
163
+ >
164
+ ? _R
165
+ : never
157
166
  : never
158
167
  : never
159
168
 
@@ -205,6 +214,8 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
205
214
  any
206
215
  >,
207
216
  ) {
217
+ // oxlint-disable-next-line typescript/no-this-alias
218
+ const schema = this
208
219
  return Layer.fresh(
209
220
  Layer.effectContext(
210
221
  Effect.gen(function* () {
@@ -213,8 +224,15 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
213
224
  const handlerMap = new Map<string, any>()
214
225
  handlerMap.set(initialStateKey, initialState)
215
226
  for (const [tag, handler] of Object.entries(handlers)) {
227
+ const rpc = schema.protocol.requests.get(tag)! as Rpc.AnyWithProps
228
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
216
229
  handlerMap.set(handlerKey(tag), (options: any) =>
217
- Rpc.wrapMap(handler(options), Effect.provideContext(services)),
230
+ isStream
231
+ ? Stream.provideContext(handler(options) as any, services)
232
+ : Rpc.wrapMap(
233
+ handler(options),
234
+ Effect.provideContext(services),
235
+ ),
218
236
  )
219
237
  }
220
238
  return Context.makeUnsafe(handlerMap)
@@ -237,6 +255,8 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
237
255
  readonly storeId?: string | undefined
238
256
  },
239
257
  ) {
258
+ // oxlint-disable-next-line typescript/no-this-alias
259
+ const schema = this
240
260
  const storeId = options?.storeId ?? "machine"
241
261
  const stateFromJson = Schema.toCodecJson(this.stateSchema)
242
262
  const decode = Schema.decodeUnknownEffect(stateFromJson)
@@ -263,18 +283,22 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
263
283
  initialState,
264
284
  ])
265
285
  for (const [tag, handler] of Object.entries(handlers)) {
286
+ const rpc = schema.protocol.requests.get(tag)! as Rpc.AnyWithProps
287
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
266
288
  handlerMap.set(handlerKey(tag), (options: any) =>
267
- Rpc.wrapMap(
268
- handler(options),
269
- flow(
270
- Effect.tap(([state]) =>
271
- Effect.flatMap(encode(state), (a) =>
272
- store.set(currentId, a as any, undefined),
289
+ isStream
290
+ ? Stream.provideContext(handler(options) as any, services)
291
+ : Rpc.wrapMap(
292
+ handler(options),
293
+ flow(
294
+ Effect.tap(([state]) =>
295
+ Effect.flatMap(encode(state), (a) =>
296
+ store.set(currentId, a as any, undefined),
297
+ ),
298
+ ),
299
+ Effect.provideContext(services),
273
300
  ),
274
301
  ),
275
- Effect.provideContext(services),
276
- ),
277
- ),
278
302
  )
279
303
  }
280
304
  return Context.makeUnsafe(handlerMap)
@@ -310,7 +334,9 @@ export const makeHandlers = Effect.fnUntraced(function* <
310
334
  readonly handler: (options: {
311
335
  readonly payload: any
312
336
  readonly context: Context.Context<never>
313
- }) => Rpc.WrapperOr<Effect.Effect<any, any>>
337
+ }) =>
338
+ | Stream.Stream<any, any>
339
+ | Effect.Effect<{} | Deferred.Deferred<any, any>, any>
314
340
  }
315
341
  >
316
342
  },
@@ -324,7 +350,9 @@ export const makeHandlers = Effect.fnUntraced(function* <
324
350
  readonly handler: (options: {
325
351
  readonly payload: any
326
352
  readonly context: Context.Context<never>
327
- }) => Rpc.WrapperOr<Effect.Effect<any, any>>
353
+ }) =>
354
+ | Stream.Stream<any, any>
355
+ | Effect.Effect<{} | Deferred.Deferred<any, any>, any>
328
356
  }
329
357
  >()
330
358
  const scope = yield* Effect.scope
@@ -349,7 +377,7 @@ export const makeHandlers = Effect.fnUntraced(function* <
349
377
  payload,
350
378
  context: Context.empty(),
351
379
  })
352
- return Rpc.isWrapper(result) ? result.value : result
380
+ return Stream.isStream(result) ? Stream.runDrain(result) : result
353
381
  })
354
382
 
355
383
  const services = yield* Layer.build(layer).pipe(
@@ -362,6 +390,7 @@ export const makeHandlers = Effect.fnUntraced(function* <
362
390
  replay: 1,
363
391
  })
364
392
  PubSub.publishUnsafe(pubsub, state.current)
393
+ const changes = Stream.fromPubSub(pubsub)
365
394
 
366
395
  handlers.set(stateChanges._tag, {
367
396
  rpc: stateChanges,
@@ -376,26 +405,28 @@ export const makeHandlers = Effect.fnUntraced(function* <
376
405
  >
377
406
  handlers.set(rpc._tag, {
378
407
  rpc: rpc as any,
379
- handler: (options) =>
380
- Rpc.wrapMap(
381
- handler({
382
- state: state.current,
383
- payload: options.payload,
384
- context: options.context,
408
+ handler: (options) => {
409
+ const result = handler({
410
+ state: state.current,
411
+ changes,
412
+ payload: options.payload,
413
+ context: options.context,
414
+ }) as
415
+ | Stream.Stream<any, any>
416
+ | Effect.Effect<[any, {} | Deferred.Deferred<any, any>], any>
417
+ if (Stream.isStream(result)) return result
418
+ return pipe(
419
+ result,
420
+ Effect.map(([nextState, result]) => {
421
+ if (nextState !== state.current) {
422
+ MutableRef.set(state, nextState)
423
+ PubSub.publishUnsafe(pubsub, nextState)
424
+ }
425
+ return result
385
426
  }),
386
- (effect) =>
387
- pipe(
388
- effect,
389
- Effect.map(([nextState, result]) => {
390
- if (nextState !== state.current) {
391
- MutableRef.set(state, nextState)
392
- PubSub.publishUnsafe(pubsub, nextState)
393
- }
394
- return result
395
- }),
396
- sendSemaphore.withPermits(1),
397
- ),
398
- ),
427
+ sendSemaphore.withPermits(1),
428
+ )
429
+ },
399
430
  })
400
431
  }
401
432
 
@@ -428,19 +459,17 @@ export const RpcStateChanges = <State extends Schema.Top, Rpcs extends Rpc.Any>(
428
459
  export interface Actor<State extends Schema.Top, Rpcs extends Rpc.Any> {
429
460
  readonly changes: Stream.Stream<State["Type"]>
430
461
  readonly state: MutableRef.MutableRef<State["Type"]>
431
- send<
432
- Tag extends Rpcs["_tag"],
433
- Rpc = Rpc.ExtractTag<Rpcs, Tag>,
434
- Payload = Rpc.PayloadConstructor<Rpc>,
435
- >(
462
+ send<Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(
436
463
  tag: Tag,
437
464
  ...args: Types.EqualsWith<
438
- Payload,
465
+ Rpc.PayloadConstructor<Rpc>,
439
466
  void,
440
- [payload?: Payload],
441
- [payload: Payload]
467
+ [payload?: Rpc.PayloadConstructor<Rpc>],
468
+ [payload: Rpc.PayloadConstructor<Rpc>]
442
469
  >
443
- ): Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>
470
+ ): Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E>
471
+ ? Stream.Stream<A["Type"], E["Type"]>
472
+ : Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>
444
473
  }
445
474
 
446
475
  /**
@@ -473,16 +502,25 @@ export const makeActor = Effect.fnUntraced(function* <
473
502
  ) => {
474
503
  const entry = handlers.get(tag)
475
504
  if (!entry) {
476
- return Effect.die(`Unknown tag: ${tag}`)
505
+ const rpc = schema.protocol.requests.get(tag)! as any as Rpc.AnyWithProps
506
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
507
+ const message = `Unknown tag: ${tag}`
508
+ return isStream ? Stream.die(message) : Effect.die(message)
477
509
  }
478
- const effectOrWrap = entry.handler({
510
+ const result = entry.handler({
479
511
  payload:
480
512
  payload_ !== undefined
481
513
  ? entry.rpc.payloadSchema.make(payload_)
482
514
  : undefined,
483
515
  context: requestContext,
484
516
  })
485
- return Rpc.isWrapper(effectOrWrap) ? effectOrWrap.value : effectOrWrap
517
+ return Stream.isStream(result)
518
+ ? result
519
+ : Effect.flatMap(result, (result) =>
520
+ Deferred.isDeferred(result)
521
+ ? Deferred.await(result)
522
+ : Effect.succeed(result),
523
+ )
486
524
  }
487
525
 
488
526
  return identity<Actor<State, Rpcs>>({
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as Rpc from "effect/unstable/rpc/Rpc"
4
+ import * as Rpc from "effect/unstable/rpc/Rpc"
5
5
  import * as Effect from "effect/Effect"
6
6
  import type * as Schema from "effect/Schema"
7
7
  import * as Layer from "effect/Layer"
@@ -9,6 +9,7 @@ import * as Context from "effect/Context"
9
9
  import type * as RpcMessage from "effect/unstable/rpc/RpcMessage"
10
10
  import type * as Headers from "effect/unstable/http/Headers"
11
11
  import * as GenServer from "./GenServer.ts"
12
+ import * as Stream from "effect/Stream"
12
13
 
13
14
  /**
14
15
  * @since 1.0.0
@@ -38,11 +39,13 @@ export const toRpcHandlers = <
38
39
  _: null as any,
39
40
  tag: rpc._tag,
40
41
  context: services,
41
- handler: (payload, options) =>
42
- handler({
42
+ handler(payload, options): any {
43
+ const result = handler({
43
44
  payload,
44
45
  context: RpcContext.context(options as any),
45
- }) as any,
46
+ }) as Stream.Stream<any, any> | Effect.Effect<any, any>
47
+ return Stream.isStream(result) ? Rpc.fork(result) : result
48
+ },
46
49
  })
47
50
  }
48
51