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 +97 -0
- package/dist/AtomGenServer.d.ts +2 -2
- package/dist/AtomGenServer.d.ts.map +1 -1
- package/dist/AtomGenServer.js +6 -0
- package/dist/AtomGenServer.js.map +1 -1
- package/dist/ClusterGenServer.d.ts +2 -2
- package/dist/ClusterGenServer.d.ts.map +1 -1
- package/dist/ClusterGenServer.js +12 -4
- package/dist/ClusterGenServer.js.map +1 -1
- package/dist/GenServer.d.ts +8 -7
- package/dist/GenServer.d.ts.map +1 -1
- package/dist/GenServer.js +39 -17
- package/dist/GenServer.js.map +1 -1
- package/dist/GenServer.test.d.ts +2 -0
- package/dist/GenServer.test.d.ts.map +1 -0
- package/dist/GenServer.test.js +31 -0
- package/dist/GenServer.test.js.map +1 -0
- package/dist/RpcGenServer.d.ts +1 -1
- package/dist/RpcGenServer.d.ts.map +1 -1
- package/dist/RpcGenServer.js +12 -4
- package/dist/RpcGenServer.js.map +1 -1
- package/package.json +1 -1
- package/src/AtomGenServer.ts +29 -9
- package/src/ClusterGenServer.ts +6 -3
- package/src/GenServer.test.ts +43 -0
- package/src/GenServer.ts +72 -45
- package/src/RpcGenServer.ts +7 -4
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
|
+
```
|
package/dist/AtomGenServer.d.ts
CHANGED
|
@@ -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"]
|
|
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
|
|
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;
|
|
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"}
|
package/dist/AtomGenServer.js
CHANGED
|
@@ -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,
|
|
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
|
|
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.
|
|
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,
|
|
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"}
|
package/dist/ClusterGenServer.js
CHANGED
|
@@ -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) =>
|
|
19
|
-
|
|
20
|
-
|
|
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":"
|
|
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"}
|
package/dist/GenServer.d.ts
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
|
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
|
-
}) =>
|
|
111
|
+
}) => Stream.Stream<any, any> | Effect.Effect<any, any>;
|
|
111
112
|
}>;
|
|
112
|
-
}, E, Exclude<R, SendDiscard
|
|
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
|
package/dist/GenServer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenServer.d.ts","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAC9C,OAAO,KAAK,QAAQ,MAAM,8BAA8B,CAAA;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,WAAW,MAAM,yCAAyC,CAAA;AACtE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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) =>
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return result
|
|
140
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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),
|
package/dist/GenServer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenServer.js","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAC9C,OAAO,KAAK,QAAQ,MAAM,8BAA8B,CAAA;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,WAAW,MAAM,yCAAyC,CAAA;AACtE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"GenServer.js","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/RpcGenServer.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcGenServer.d.ts","sourceRoot":"","sources":["../src/RpcGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,
|
|
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"}
|
package/dist/RpcGenServer.js
CHANGED
|
@@ -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
|
|
19
|
-
|
|
20
|
-
|
|
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);
|
package/dist/RpcGenServer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcGenServer.js","sourceRoot":"","sources":["../src/RpcGenServer.ts"],"names":[],"mappings":"
|
|
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
package/src/AtomGenServer.ts
CHANGED
|
@@ -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
|
|
55
|
-
Rpc.
|
|
56
|
-
E |
|
|
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.
|
|
92
|
-
Rpc.
|
|
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(
|
|
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
|
-
)
|
|
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
|
}
|
package/src/ClusterGenServer.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
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
|
|
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.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
:
|
|
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
|
-
|
|
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
|
-
|
|
268
|
-
handler(options),
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
}) =>
|
|
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
|
-
}) =>
|
|
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
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
(
|
|
387
|
-
|
|
388
|
-
|
|
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
|
-
):
|
|
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
|
-
|
|
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
|
-
|
|
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>>({
|
package/src/RpcGenServer.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
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
|
|
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
|
|