effect-genserver 0.1.0 → 0.1.1

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"}
@@ -13,7 +13,7 @@ import * as Persistence from "effect/unstable/persistence/Persistence";
13
13
  import * as PubSub from "effect/PubSub";
14
14
  import * as MutableRef from "effect/MutableRef";
15
15
  import * as Stream from "effect/Stream";
16
- import type * as RpcSchema from "effect/unstable/rpc/RpcSchema";
16
+ import * as RpcSchema from "effect/unstable/rpc/RpcSchema";
17
17
  import type { Types } from "effect";
18
18
  /**
19
19
  * @since 1.0.0
@@ -71,14 +71,15 @@ export type Handlers<State extends Schema.Top, Rpcs extends Rpc.Any> = {
71
71
  */
72
72
  export type HandlerFn<State extends Schema.Top, Rpc extends Rpc.Any, R> = (options: {
73
73
  readonly state: State["Type"];
74
+ readonly changes: Stream.Stream<State["Type"]>;
74
75
  readonly payload: Rpc.Payload<Rpc>;
75
76
  readonly context: Context.Context<never>;
76
- }) => Rpc.WrapperOr<Effect.Effect<readonly [state: State["Type"], result: Rpc.Success<Rpc>], Rpc.Error<Rpc>, R>>;
77
+ }) => Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E> ? Stream.Stream<A["Type"], E["Type"], R> : Effect.Effect<readonly [state: State["Type"], result: Rpc.Success<Rpc>], Rpc.Error<Rpc>, R>;
77
78
  /**
78
79
  * @since 1.0.0
79
80
  * @category Handlers
80
81
  */
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;
82
+ 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
83
  /**
83
84
  * @since 1.0.0
84
85
  * @category Constructors
@@ -99,7 +100,7 @@ export declare const fromRpcGroup: <State extends Schema.Top, Rpcs extends Rpc.A
99
100
  * @since 1.0.0
100
101
  * @category Handlers
101
102
  */
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<{
103
+ 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
104
  readonly state: MutableRef.MutableRef<State["Type"]>;
104
105
  readonly pubsub: PubSub.PubSub<State["Type"]>;
105
106
  readonly handlers: ReadonlyMap<string, {
@@ -107,9 +108,9 @@ export declare const makeHandlers: <State extends Schema.Top, Rpcs extends Rpc.A
107
108
  readonly handler: (options: {
108
109
  readonly payload: any;
109
110
  readonly context: Context.Context<never>;
110
- }) => Rpc.WrapperOr<Effect.Effect<any, any>>;
111
+ }) => Stream.Stream<any, any> | Effect.Effect<any, any>;
111
112
  }>;
112
- }, E, Exclude<R, SendDiscard> | Scope.Scope>;
113
+ }, E, Scope.Scope | Exclude<R, SendDiscard>>;
113
114
  /**
114
115
  * @since 1.0.0
115
116
  * @category RpcServer
@@ -126,7 +127,7 @@ export interface Actor<State extends Schema.Top, Rpcs extends Rpc.Any> {
126
127
  payload?: Payload
127
128
  ], [
128
129
  payload: Payload
129
- ]>): Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>;
130
+ ]>): 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
131
  }
131
132
  /**
132
133
  * @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
@@ -13,6 +13,7 @@ import * as MutableRef from "effect/MutableRef";
13
13
  import * as Stream from "effect/Stream";
14
14
  import * as Semaphore from "effect/Semaphore";
15
15
  import { flow, identity, pipe } from "effect/Function";
16
+ import * as RpcSchema from "effect/unstable/rpc/RpcSchema";
16
17
  import * as Latch from "effect/Latch";
17
18
  /**
18
19
  * @since 1.0.0
@@ -46,18 +47,26 @@ const Proto = {
46
47
  return [initialState, handlers];
47
48
  },
48
49
  toLayer(build) {
50
+ // oxlint-disable-next-line typescript/no-this-alias
51
+ const schema = this;
49
52
  return Layer.fresh(Layer.effectContext(Effect.gen(function* () {
50
53
  const services = yield* Effect.context();
51
54
  const [initialState, handlers] = yield* build;
52
55
  const handlerMap = new Map();
53
56
  handlerMap.set(initialStateKey, initialState);
54
57
  for (const [tag, handler] of Object.entries(handlers)) {
55
- handlerMap.set(handlerKey(tag), (options) => Rpc.wrapMap(handler(options), Effect.provideContext(services)));
58
+ const rpc = schema.protocol.requests.get(tag);
59
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
60
+ handlerMap.set(handlerKey(tag), (options) => isStream
61
+ ? Stream.provideContext(handler(options), services)
62
+ : Rpc.wrapMap(handler(options), Effect.provideContext(services)));
56
63
  }
57
64
  return Context.makeUnsafe(handlerMap);
58
65
  })));
59
66
  },
60
67
  toLayerPersisted(build, options) {
68
+ // oxlint-disable-next-line typescript/no-this-alias
69
+ const schema = this;
61
70
  const storeId = options?.storeId ?? "machine";
62
71
  const stateFromJson = Schema.toCodecJson(this.stateSchema);
63
72
  const decode = Schema.decodeUnknownEffect(stateFromJson);
@@ -77,7 +86,11 @@ const Proto = {
77
86
  initialState,
78
87
  ]);
79
88
  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))));
89
+ const rpc = schema.protocol.requests.get(tag);
90
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
91
+ handlerMap.set(handlerKey(tag), (options) => isStream
92
+ ? Stream.provideContext(handler(options), services)
93
+ : Rpc.wrapMap(handler(options), flow(Effect.tap(([state]) => Effect.flatMap(encode(state), (a) => store.set(currentId, a, undefined))), Effect.provideContext(services))));
81
94
  }
82
95
  return Context.makeUnsafe(handlerMap);
83
96
  })));
@@ -111,7 +124,7 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
111
124
  payload,
112
125
  context: Context.empty(),
113
126
  });
114
- return Rpc.isWrapper(result) ? result.value : result;
127
+ return Stream.isStream(result) ? Stream.runDrain(result) : result;
115
128
  });
116
129
  const services = yield* Layer.build(layer).pipe(Effect.provideService(SendDiscard, sendDiscard));
117
130
  const state = MutableRef.make(services.mapUnsafe.get(initialStateKey));
@@ -119,6 +132,7 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
119
132
  replay: 1,
120
133
  });
121
134
  PubSub.publishUnsafe(pubsub, state.current);
135
+ const changes = Stream.fromPubSub(pubsub);
122
136
  handlers.set(stateChanges._tag, {
123
137
  rpc: stateChanges,
124
138
  handler: (_) => Stream.fromPubSub(pubsub),
@@ -127,17 +141,23 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
127
141
  const handler = services.mapUnsafe.get(handlerKey(rpc._tag));
128
142
  handlers.set(rpc._tag, {
129
143
  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))),
144
+ handler: (options) => {
145
+ const result = handler({
146
+ state: state.current,
147
+ changes,
148
+ payload: options.payload,
149
+ context: options.context,
150
+ });
151
+ if (Stream.isStream(result))
152
+ return result;
153
+ return pipe(result, Effect.map(([nextState, result]) => {
154
+ if (nextState !== state.current) {
155
+ MutableRef.set(state, nextState);
156
+ PubSub.publishUnsafe(pubsub, nextState);
157
+ }
158
+ return result;
159
+ }), sendSemaphore.withPermits(1));
160
+ },
141
161
  });
142
162
  }
143
163
  startLatch.openUnsafe();
@@ -162,15 +182,17 @@ export const makeActor = Effect.fnUntraced(function* (schema, layer, options) {
162
182
  const send = (tag, payload_) => {
163
183
  const entry = handlers.get(tag);
164
184
  if (!entry) {
165
- return Effect.die(`Unknown tag: ${tag}`);
185
+ const rpc = schema.protocol.requests.get(tag);
186
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
187
+ const message = `Unknown tag: ${tag}`;
188
+ return isStream ? Stream.die(message) : Effect.die(message);
166
189
  }
167
- const effectOrWrap = entry.handler({
190
+ return entry.handler({
168
191
  payload: payload_ !== undefined
169
192
  ? entry.rpc.payloadSchema.make(payload_)
170
193
  : undefined,
171
194
  context: requestContext,
172
195
  });
173
- return Rpc.isWrapper(effectOrWrap) ? effectOrWrap.value : effectOrWrap;
174
196
  };
175
197
  return identity({
176
198
  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,31 @@
1
+ import { describe, expect, it } from "@effect/vitest";
2
+ import * as GenServer from "./GenServer.js";
3
+ import { 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("count", {
10
+ success: Schema.String,
11
+ stream: true,
12
+ }),
13
+ ],
14
+ });
15
+ const CounterLayer = Counter.toLayer(Effect.gen(function* () {
16
+ yield* Effect.void;
17
+ return Counter.of(0, {
18
+ increment: ({ state }) => Effect.succeed([state + 1, void 0]),
19
+ count: ({ changes }) => changes.pipe(Stream.map((a) => a.toString())),
20
+ });
21
+ }));
22
+ describe("GenServer", () => {
23
+ it.effect("handles streams", Effect.fn(function* () {
24
+ const actor = yield* GenServer.makeActor(Counter, CounterLayer);
25
+ const arr = yield* pipe(actor.send("count"), Stream.take(3), Stream.runCollect, Effect.forkChild({ startImmediately: true }));
26
+ yield* actor.send("increment");
27
+ yield* actor.send("increment");
28
+ expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"]);
29
+ }));
30
+ });
31
+ //# sourceMappingURL=GenServer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenServer.test.js","sourceRoot":"","sources":["../src/GenServer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAEzC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC,GAAG;IACjB,QAAQ,EAAE;QACR,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QACrB,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,MAAM,EAAE,IAAI;SACb,CAAC;KACH;CACF,CAAC,CAAA;AAEF,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;IAClB,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE;QACnB,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;KACtE,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CAAA;AAED,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,MAAM,CACP,iBAAiB,EACjB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;QACjB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;QAC/D,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,CACrB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EACnB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EACd,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,SAAS,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAC7C,CAAA;QACD,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC9B,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACzD,CAAC,CAAC,CACH,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -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.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -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,43 @@
1
+ import { describe, expect, it } from "@effect/vitest"
2
+ import * as GenServer from "./GenServer.ts"
3
+ import { 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("count", {
11
+ success: Schema.String,
12
+ stream: true,
13
+ }),
14
+ ],
15
+ })
16
+
17
+ const CounterLayer = Counter.toLayer(
18
+ Effect.gen(function* () {
19
+ yield* Effect.void
20
+ return Counter.of(0, {
21
+ increment: ({ state }) => Effect.succeed([state + 1, void 0]),
22
+ count: ({ changes }) => changes.pipe(Stream.map((a) => a.toString())),
23
+ })
24
+ }),
25
+ )
26
+
27
+ describe("GenServer", () => {
28
+ it.effect(
29
+ "handles streams",
30
+ Effect.fn(function* () {
31
+ const actor = yield* GenServer.makeActor(Counter, CounterLayer)
32
+ const arr = yield* pipe(
33
+ actor.send("count"),
34
+ Stream.take(3),
35
+ Stream.runCollect,
36
+ Effect.forkChild({ startImmediately: true }),
37
+ )
38
+ yield* actor.send("increment")
39
+ yield* actor.send("increment")
40
+ expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"])
41
+ }),
42
+ )
43
+ })
package/src/GenServer.ts CHANGED
@@ -15,7 +15,7 @@ import * as MutableRef from "effect/MutableRef"
15
15
  import * as Stream from "effect/Stream"
16
16
  import * as Semaphore from "effect/Semaphore"
17
17
  import { flow, identity, pipe } from "effect/Function"
18
- import type * as RpcSchema from "effect/unstable/rpc/RpcSchema"
18
+ import * as RpcSchema from "effect/unstable/rpc/RpcSchema"
19
19
  import * as Latch from "effect/Latch"
20
20
  import type { Types } from "effect"
21
21
 
@@ -130,15 +130,16 @@ export type HandlerFn<
130
130
  R,
131
131
  > = (options: {
132
132
  readonly state: State["Type"]
133
+ readonly changes: Stream.Stream<State["Type"]>
133
134
  readonly payload: Rpc.Payload<Rpc>
134
135
  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
- >
136
+ }) => Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E>
137
+ ? Stream.Stream<A["Type"], E["Type"], R>
138
+ : Effect.Effect<
139
+ readonly [state: State["Type"], result: Rpc.Success<Rpc>],
140
+ Rpc.Error<Rpc>,
141
+ R
142
+ >
142
143
 
143
144
  /**
144
145
  * @since 1.0.0
@@ -153,7 +154,13 @@ export type HandlerServices<Handlers extends Record<string, any>> =
153
154
  infer _R
154
155
  >
155
156
  ? _R
156
- : never
157
+ : ReturnType<Handlers[K]> extends Stream.Stream<
158
+ infer _A,
159
+ infer _E,
160
+ infer _R
161
+ >
162
+ ? _R
163
+ : never
157
164
  : never
158
165
  : never
159
166
 
@@ -205,6 +212,8 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
205
212
  any
206
213
  >,
207
214
  ) {
215
+ // oxlint-disable-next-line typescript/no-this-alias
216
+ const schema = this
208
217
  return Layer.fresh(
209
218
  Layer.effectContext(
210
219
  Effect.gen(function* () {
@@ -213,8 +222,15 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
213
222
  const handlerMap = new Map<string, any>()
214
223
  handlerMap.set(initialStateKey, initialState)
215
224
  for (const [tag, handler] of Object.entries(handlers)) {
225
+ const rpc = schema.protocol.requests.get(tag)! as Rpc.AnyWithProps
226
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
216
227
  handlerMap.set(handlerKey(tag), (options: any) =>
217
- Rpc.wrapMap(handler(options), Effect.provideContext(services)),
228
+ isStream
229
+ ? Stream.provideContext(handler(options) as any, services)
230
+ : Rpc.wrapMap(
231
+ handler(options),
232
+ Effect.provideContext(services),
233
+ ),
218
234
  )
219
235
  }
220
236
  return Context.makeUnsafe(handlerMap)
@@ -237,6 +253,8 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
237
253
  readonly storeId?: string | undefined
238
254
  },
239
255
  ) {
256
+ // oxlint-disable-next-line typescript/no-this-alias
257
+ const schema = this
240
258
  const storeId = options?.storeId ?? "machine"
241
259
  const stateFromJson = Schema.toCodecJson(this.stateSchema)
242
260
  const decode = Schema.decodeUnknownEffect(stateFromJson)
@@ -263,18 +281,22 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
263
281
  initialState,
264
282
  ])
265
283
  for (const [tag, handler] of Object.entries(handlers)) {
284
+ const rpc = schema.protocol.requests.get(tag)! as Rpc.AnyWithProps
285
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
266
286
  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),
287
+ isStream
288
+ ? Stream.provideContext(handler(options) as any, services)
289
+ : Rpc.wrapMap(
290
+ handler(options),
291
+ flow(
292
+ Effect.tap(([state]) =>
293
+ Effect.flatMap(encode(state), (a) =>
294
+ store.set(currentId, a as any, undefined),
295
+ ),
296
+ ),
297
+ Effect.provideContext(services),
273
298
  ),
274
299
  ),
275
- Effect.provideContext(services),
276
- ),
277
- ),
278
300
  )
279
301
  }
280
302
  return Context.makeUnsafe(handlerMap)
@@ -310,7 +332,7 @@ export const makeHandlers = Effect.fnUntraced(function* <
310
332
  readonly handler: (options: {
311
333
  readonly payload: any
312
334
  readonly context: Context.Context<never>
313
- }) => Rpc.WrapperOr<Effect.Effect<any, any>>
335
+ }) => Stream.Stream<any, any> | Effect.Effect<any, any>
314
336
  }
315
337
  >
316
338
  },
@@ -324,7 +346,7 @@ export const makeHandlers = Effect.fnUntraced(function* <
324
346
  readonly handler: (options: {
325
347
  readonly payload: any
326
348
  readonly context: Context.Context<never>
327
- }) => Rpc.WrapperOr<Effect.Effect<any, any>>
349
+ }) => Stream.Stream<any, any> | Effect.Effect<any, any>
328
350
  }
329
351
  >()
330
352
  const scope = yield* Effect.scope
@@ -349,7 +371,7 @@ export const makeHandlers = Effect.fnUntraced(function* <
349
371
  payload,
350
372
  context: Context.empty(),
351
373
  })
352
- return Rpc.isWrapper(result) ? result.value : result
374
+ return Stream.isStream(result) ? Stream.runDrain(result) : result
353
375
  })
354
376
 
355
377
  const services = yield* Layer.build(layer).pipe(
@@ -362,6 +384,7 @@ export const makeHandlers = Effect.fnUntraced(function* <
362
384
  replay: 1,
363
385
  })
364
386
  PubSub.publishUnsafe(pubsub, state.current)
387
+ const changes = Stream.fromPubSub(pubsub)
365
388
 
366
389
  handlers.set(stateChanges._tag, {
367
390
  rpc: stateChanges,
@@ -376,26 +399,26 @@ export const makeHandlers = Effect.fnUntraced(function* <
376
399
  >
377
400
  handlers.set(rpc._tag, {
378
401
  rpc: rpc as any,
379
- handler: (options) =>
380
- Rpc.wrapMap(
381
- handler({
382
- state: state.current,
383
- payload: options.payload,
384
- context: options.context,
402
+ handler: (options) => {
403
+ const result = handler({
404
+ state: state.current,
405
+ changes,
406
+ payload: options.payload,
407
+ context: options.context,
408
+ }) as Stream.Stream<any, any> | Effect.Effect<any, any>
409
+ if (Stream.isStream(result)) return result
410
+ return pipe(
411
+ result,
412
+ Effect.map(([nextState, result]) => {
413
+ if (nextState !== state.current) {
414
+ MutableRef.set(state, nextState)
415
+ PubSub.publishUnsafe(pubsub, nextState)
416
+ }
417
+ return result
385
418
  }),
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
- ),
419
+ sendSemaphore.withPermits(1),
420
+ )
421
+ },
399
422
  })
400
423
  }
401
424
 
@@ -440,7 +463,9 @@ export interface Actor<State extends Schema.Top, Rpcs extends Rpc.Any> {
440
463
  [payload?: Payload],
441
464
  [payload: Payload]
442
465
  >
443
- ): Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>
466
+ ): Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E>
467
+ ? Stream.Stream<A["Type"], E["Type"]>
468
+ : Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>
444
469
  }
445
470
 
446
471
  /**
@@ -473,16 +498,18 @@ export const makeActor = Effect.fnUntraced(function* <
473
498
  ) => {
474
499
  const entry = handlers.get(tag)
475
500
  if (!entry) {
476
- return Effect.die(`Unknown tag: ${tag}`)
501
+ const rpc = schema.protocol.requests.get(tag)! as any as Rpc.AnyWithProps
502
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
503
+ const message = `Unknown tag: ${tag}`
504
+ return isStream ? Stream.die(message) : Effect.die(message)
477
505
  }
478
- const effectOrWrap = entry.handler({
506
+ return entry.handler({
479
507
  payload:
480
508
  payload_ !== undefined
481
509
  ? entry.rpc.payloadSchema.make(payload_)
482
510
  : undefined,
483
511
  context: requestContext,
484
512
  })
485
- return Rpc.isWrapper(effectOrWrap) ? effectOrWrap.value : effectOrWrap
486
513
  }
487
514
 
488
515
  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