effect-genserver 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +18 -13
- package/dist/GenServer.d.ts.map +1 -1
- package/dist/GenServer.js +45 -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 +44 -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 +4 -4
- package/src/AtomGenServer.ts +29 -9
- package/src/ClusterGenServer.ts +6 -3
- package/src/GenServer.test.ts +65 -0
- package/src/GenServer.ts +99 -61
- 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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import * as Rpc from "effect/unstable/rpc/Rpc";
|
|
5
5
|
import * as RpcGroup from "effect/unstable/rpc/RpcGroup";
|
|
6
6
|
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Deferred from "effect/Deferred";
|
|
7
8
|
import * as Schema from "effect/Schema";
|
|
8
9
|
import * as Layer from "effect/Layer";
|
|
9
10
|
import type * as Scope from "effect/Scope";
|
|
@@ -13,7 +14,7 @@ import * as Persistence from "effect/unstable/persistence/Persistence";
|
|
|
13
14
|
import * as PubSub from "effect/PubSub";
|
|
14
15
|
import * as MutableRef from "effect/MutableRef";
|
|
15
16
|
import * as Stream from "effect/Stream";
|
|
16
|
-
import
|
|
17
|
+
import * as RpcSchema from "effect/unstable/rpc/RpcSchema";
|
|
17
18
|
import type { Types } from "effect";
|
|
18
19
|
/**
|
|
19
20
|
* @since 1.0.0
|
|
@@ -22,10 +23,10 @@ import type { Types } from "effect";
|
|
|
22
23
|
export interface GenServer<State extends Schema.Top, Rpcs extends Rpc.Any> {
|
|
23
24
|
readonly stateSchema: State;
|
|
24
25
|
readonly protocol: RpcGroup.RpcGroup<Rpcs>;
|
|
25
|
-
readonly sender: Effect.Effect<(<const Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag
|
|
26
|
-
payload?:
|
|
26
|
+
readonly sender: Effect.Effect<(<const Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(tag: Tag, ...args: Types.EqualsWith<Rpc.PayloadConstructor<Rpc>, void, [
|
|
27
|
+
payload?: Rpc.PayloadConstructor<Rpc>
|
|
27
28
|
], [
|
|
28
|
-
payload:
|
|
29
|
+
payload: Rpc.PayloadConstructor<Rpc>
|
|
29
30
|
]>) => Effect.Effect<void>), never, SendDiscard>;
|
|
30
31
|
of<A extends Handlers<State, Rpcs>>(initialState: State["Type"], handlers: A): readonly [state: State["Type"], handlers: A];
|
|
31
32
|
toLayer<A extends Handlers<State, Rpcs>, E, R>(build: Effect.Effect<readonly [state: State["Type"], handlers: A], E, R>): Layer.Layer<ToHandler<Rpcs> | InitialState, E, Exclude<R, Scope.Scope> | HandlerServices<A>>;
|
|
@@ -71,14 +72,18 @@ export type Handlers<State extends Schema.Top, Rpcs extends Rpc.Any> = {
|
|
|
71
72
|
*/
|
|
72
73
|
export type HandlerFn<State extends Schema.Top, Rpc extends Rpc.Any, R> = (options: {
|
|
73
74
|
readonly state: State["Type"];
|
|
75
|
+
readonly changes: Stream.Stream<State["Type"]>;
|
|
74
76
|
readonly payload: Rpc.Payload<Rpc>;
|
|
75
77
|
readonly context: Context.Context<never>;
|
|
76
|
-
}) => Rpc.
|
|
78
|
+
}) => Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E> ? Stream.Stream<A["Type"], E["Type"], R> : Effect.Effect<readonly [
|
|
79
|
+
state: State["Type"],
|
|
80
|
+
result: Rpc.Success<Rpc> | Deferred.Deferred<Rpc.Success<Rpc>, Rpc.Error<Rpc>>
|
|
81
|
+
], Rpc.Error<Rpc>, R>;
|
|
77
82
|
/**
|
|
78
83
|
* @since 1.0.0
|
|
79
84
|
* @category Handlers
|
|
80
85
|
*/
|
|
81
|
-
export type HandlerServices<Handlers extends Record<string, any>> = keyof Handlers extends infer K ? K extends keyof Handlers ? ReturnType<Handlers[K]> extends Effect.Effect<infer _A, infer _E, infer _R> ? _R : never : never : never;
|
|
86
|
+
export type HandlerServices<Handlers extends Record<string, any>> = keyof Handlers extends infer K ? K extends keyof Handlers ? ReturnType<Handlers[K]> extends Effect.Effect<infer _A, infer _E, infer _R> ? _R : ReturnType<Handlers[K]> extends Stream.Stream<infer _A, infer _E, infer _R> ? _R : never : never : never;
|
|
82
87
|
/**
|
|
83
88
|
* @since 1.0.0
|
|
84
89
|
* @category Constructors
|
|
@@ -99,7 +104,7 @@ export declare const fromRpcGroup: <State extends Schema.Top, Rpcs extends Rpc.A
|
|
|
99
104
|
* @since 1.0.0
|
|
100
105
|
* @category Handlers
|
|
101
106
|
*/
|
|
102
|
-
export declare const makeHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer<State, Rpcs>, layer: Layer.Layer<ToHandler<Rpcs
|
|
107
|
+
export declare const makeHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer<State, Rpcs>, layer: Layer.Layer<InitialState | ToHandler<Rpcs>, E, R>) => Effect.Effect<{
|
|
103
108
|
readonly state: MutableRef.MutableRef<State["Type"]>;
|
|
104
109
|
readonly pubsub: PubSub.PubSub<State["Type"]>;
|
|
105
110
|
readonly handlers: ReadonlyMap<string, {
|
|
@@ -107,9 +112,9 @@ export declare const makeHandlers: <State extends Schema.Top, Rpcs extends Rpc.A
|
|
|
107
112
|
readonly handler: (options: {
|
|
108
113
|
readonly payload: any;
|
|
109
114
|
readonly context: Context.Context<never>;
|
|
110
|
-
}) =>
|
|
115
|
+
}) => Stream.Stream<any, any> | Effect.Effect<{} | Deferred.Deferred<any, any>, any>;
|
|
111
116
|
}>;
|
|
112
|
-
}, E, Exclude<R, SendDiscard
|
|
117
|
+
}, E, Scope.Scope | Exclude<R, SendDiscard>>;
|
|
113
118
|
/**
|
|
114
119
|
* @since 1.0.0
|
|
115
120
|
* @category RpcServer
|
|
@@ -122,11 +127,11 @@ export declare const RpcStateChanges: <State extends Schema.Top, Rpcs extends Rp
|
|
|
122
127
|
export interface Actor<State extends Schema.Top, Rpcs extends Rpc.Any> {
|
|
123
128
|
readonly changes: Stream.Stream<State["Type"]>;
|
|
124
129
|
readonly state: MutableRef.MutableRef<State["Type"]>;
|
|
125
|
-
send<Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag
|
|
126
|
-
payload?:
|
|
130
|
+
send<Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(tag: Tag, ...args: Types.EqualsWith<Rpc.PayloadConstructor<Rpc>, void, [
|
|
131
|
+
payload?: Rpc.PayloadConstructor<Rpc>
|
|
127
132
|
], [
|
|
128
|
-
payload:
|
|
129
|
-
]>): Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>;
|
|
133
|
+
payload: Rpc.PayloadConstructor<Rpc>
|
|
134
|
+
]>): Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E> ? Stream.Stream<A["Type"], E["Type"]> : Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>;
|
|
130
135
|
}
|
|
131
136
|
/**
|
|
132
137
|
* @since 1.0.0
|
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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import * as Rpc from "effect/unstable/rpc/Rpc";
|
|
5
5
|
import * as RpcGroup from "effect/unstable/rpc/RpcGroup";
|
|
6
6
|
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Deferred from "effect/Deferred";
|
|
7
8
|
import * as Schema from "effect/Schema";
|
|
8
9
|
import * as Layer from "effect/Layer";
|
|
9
10
|
import * as Context from "effect/Context";
|
|
@@ -13,6 +14,7 @@ import * as MutableRef from "effect/MutableRef";
|
|
|
13
14
|
import * as Stream from "effect/Stream";
|
|
14
15
|
import * as Semaphore from "effect/Semaphore";
|
|
15
16
|
import { flow, identity, pipe } from "effect/Function";
|
|
17
|
+
import * as RpcSchema from "effect/unstable/rpc/RpcSchema";
|
|
16
18
|
import * as Latch from "effect/Latch";
|
|
17
19
|
/**
|
|
18
20
|
* @since 1.0.0
|
|
@@ -46,18 +48,26 @@ const Proto = {
|
|
|
46
48
|
return [initialState, handlers];
|
|
47
49
|
},
|
|
48
50
|
toLayer(build) {
|
|
51
|
+
// oxlint-disable-next-line typescript/no-this-alias
|
|
52
|
+
const schema = this;
|
|
49
53
|
return Layer.fresh(Layer.effectContext(Effect.gen(function* () {
|
|
50
54
|
const services = yield* Effect.context();
|
|
51
55
|
const [initialState, handlers] = yield* build;
|
|
52
56
|
const handlerMap = new Map();
|
|
53
57
|
handlerMap.set(initialStateKey, initialState);
|
|
54
58
|
for (const [tag, handler] of Object.entries(handlers)) {
|
|
55
|
-
|
|
59
|
+
const rpc = schema.protocol.requests.get(tag);
|
|
60
|
+
const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
|
|
61
|
+
handlerMap.set(handlerKey(tag), (options) => isStream
|
|
62
|
+
? Stream.provideContext(handler(options), services)
|
|
63
|
+
: Rpc.wrapMap(handler(options), Effect.provideContext(services)));
|
|
56
64
|
}
|
|
57
65
|
return Context.makeUnsafe(handlerMap);
|
|
58
66
|
})));
|
|
59
67
|
},
|
|
60
68
|
toLayerPersisted(build, options) {
|
|
69
|
+
// oxlint-disable-next-line typescript/no-this-alias
|
|
70
|
+
const schema = this;
|
|
61
71
|
const storeId = options?.storeId ?? "machine";
|
|
62
72
|
const stateFromJson = Schema.toCodecJson(this.stateSchema);
|
|
63
73
|
const decode = Schema.decodeUnknownEffect(stateFromJson);
|
|
@@ -77,7 +87,11 @@ const Proto = {
|
|
|
77
87
|
initialState,
|
|
78
88
|
]);
|
|
79
89
|
for (const [tag, handler] of Object.entries(handlers)) {
|
|
80
|
-
|
|
90
|
+
const rpc = schema.protocol.requests.get(tag);
|
|
91
|
+
const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
|
|
92
|
+
handlerMap.set(handlerKey(tag), (options) => isStream
|
|
93
|
+
? Stream.provideContext(handler(options), services)
|
|
94
|
+
: Rpc.wrapMap(handler(options), flow(Effect.tap(([state]) => Effect.flatMap(encode(state), (a) => store.set(currentId, a, undefined))), Effect.provideContext(services))));
|
|
81
95
|
}
|
|
82
96
|
return Context.makeUnsafe(handlerMap);
|
|
83
97
|
})));
|
|
@@ -111,7 +125,7 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
|
|
|
111
125
|
payload,
|
|
112
126
|
context: Context.empty(),
|
|
113
127
|
});
|
|
114
|
-
return
|
|
128
|
+
return Stream.isStream(result) ? Stream.runDrain(result) : result;
|
|
115
129
|
});
|
|
116
130
|
const services = yield* Layer.build(layer).pipe(Effect.provideService(SendDiscard, sendDiscard));
|
|
117
131
|
const state = MutableRef.make(services.mapUnsafe.get(initialStateKey));
|
|
@@ -119,6 +133,7 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
|
|
|
119
133
|
replay: 1,
|
|
120
134
|
});
|
|
121
135
|
PubSub.publishUnsafe(pubsub, state.current);
|
|
136
|
+
const changes = Stream.fromPubSub(pubsub);
|
|
122
137
|
handlers.set(stateChanges._tag, {
|
|
123
138
|
rpc: stateChanges,
|
|
124
139
|
handler: (_) => Stream.fromPubSub(pubsub),
|
|
@@ -127,17 +142,23 @@ export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
|
|
|
127
142
|
const handler = services.mapUnsafe.get(handlerKey(rpc._tag));
|
|
128
143
|
handlers.set(rpc._tag, {
|
|
129
144
|
rpc: rpc,
|
|
130
|
-
handler: (options) =>
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return result
|
|
140
|
-
|
|
145
|
+
handler: (options) => {
|
|
146
|
+
const result = handler({
|
|
147
|
+
state: state.current,
|
|
148
|
+
changes,
|
|
149
|
+
payload: options.payload,
|
|
150
|
+
context: options.context,
|
|
151
|
+
});
|
|
152
|
+
if (Stream.isStream(result))
|
|
153
|
+
return result;
|
|
154
|
+
return pipe(result, Effect.map(([nextState, result]) => {
|
|
155
|
+
if (nextState !== state.current) {
|
|
156
|
+
MutableRef.set(state, nextState);
|
|
157
|
+
PubSub.publishUnsafe(pubsub, nextState);
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}), sendSemaphore.withPermits(1));
|
|
161
|
+
},
|
|
141
162
|
});
|
|
142
163
|
}
|
|
143
164
|
startLatch.openUnsafe();
|
|
@@ -162,15 +183,22 @@ export const makeActor = Effect.fnUntraced(function* (schema, layer, options) {
|
|
|
162
183
|
const send = (tag, payload_) => {
|
|
163
184
|
const entry = handlers.get(tag);
|
|
164
185
|
if (!entry) {
|
|
165
|
-
|
|
186
|
+
const rpc = schema.protocol.requests.get(tag);
|
|
187
|
+
const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
|
|
188
|
+
const message = `Unknown tag: ${tag}`;
|
|
189
|
+
return isStream ? Stream.die(message) : Effect.die(message);
|
|
166
190
|
}
|
|
167
|
-
const
|
|
191
|
+
const result = entry.handler({
|
|
168
192
|
payload: payload_ !== undefined
|
|
169
193
|
? entry.rpc.payloadSchema.make(payload_)
|
|
170
194
|
: undefined,
|
|
171
195
|
context: requestContext,
|
|
172
196
|
});
|
|
173
|
-
return
|
|
197
|
+
return Stream.isStream(result)
|
|
198
|
+
? result
|
|
199
|
+
: Effect.flatMap(result, (result) => Deferred.isDeferred(result)
|
|
200
|
+
? Deferred.await(result)
|
|
201
|
+
: Effect.succeed(result));
|
|
174
202
|
};
|
|
175
203
|
return identity({
|
|
176
204
|
changes: Stream.fromPubSub(pubsub),
|
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,44 @@
|
|
|
1
|
+
import { describe, expect, it } from "@effect/vitest";
|
|
2
|
+
import * as GenServer from "./GenServer.js";
|
|
3
|
+
import { Deferred, Effect, Fiber, pipe, Schema, Stream } from "effect";
|
|
4
|
+
import { Rpc } from "effect/unstable/rpc";
|
|
5
|
+
const Counter = GenServer.make({
|
|
6
|
+
state: Schema.Int,
|
|
7
|
+
protocol: [
|
|
8
|
+
Rpc.make("increment"),
|
|
9
|
+
Rpc.make("incrementDeferred"),
|
|
10
|
+
Rpc.make("count", {
|
|
11
|
+
success: Schema.String,
|
|
12
|
+
stream: true,
|
|
13
|
+
}),
|
|
14
|
+
],
|
|
15
|
+
});
|
|
16
|
+
const CounterLayer = Counter.toLayer(Effect.gen(function* () {
|
|
17
|
+
yield* Effect.void;
|
|
18
|
+
return Counter.of(0, {
|
|
19
|
+
increment: ({ state }) => Effect.succeed([state + 1, void 0]),
|
|
20
|
+
incrementDeferred: Effect.fnUntraced(function* ({ state }) {
|
|
21
|
+
const deferred = yield* Deferred.make();
|
|
22
|
+
yield* Deferred.succeed(deferred, void 0);
|
|
23
|
+
return [state + 1, deferred];
|
|
24
|
+
}),
|
|
25
|
+
count: ({ changes }) => changes.pipe(Stream.map((a) => a.toString())),
|
|
26
|
+
});
|
|
27
|
+
}));
|
|
28
|
+
describe("GenServer", () => {
|
|
29
|
+
it.effect("handles streams", Effect.fn(function* () {
|
|
30
|
+
const actor = yield* GenServer.makeActor(Counter, CounterLayer);
|
|
31
|
+
const arr = yield* pipe(actor.send("count"), Stream.take(3), Stream.runCollect, Effect.forkChild({ startImmediately: true }));
|
|
32
|
+
yield* actor.send("increment");
|
|
33
|
+
yield* actor.send("increment");
|
|
34
|
+
expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"]);
|
|
35
|
+
}));
|
|
36
|
+
it.effect("handles deferreds", Effect.fn(function* () {
|
|
37
|
+
const actor = yield* GenServer.makeActor(Counter, CounterLayer);
|
|
38
|
+
const arr = yield* pipe(actor.send("count"), Stream.take(3), Stream.runCollect, Effect.forkChild({ startImmediately: true }));
|
|
39
|
+
yield* actor.send("incrementDeferred");
|
|
40
|
+
yield* actor.send("incrementDeferred");
|
|
41
|
+
expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"]);
|
|
42
|
+
}));
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=GenServer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenServer.test.js","sourceRoot":"","sources":["../src/GenServer.test.ts"],"names":[],"mappings":"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"}
|
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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "effect-genserver",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {},
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"effect": "4.0.0-beta.
|
|
26
|
+
"effect": "4.0.0-beta.50"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@changesets/changelog-github": "^0.6.0",
|
|
30
30
|
"@changesets/cli": "^2.29.8",
|
|
31
31
|
"@effect/language-service": "^0.85.1",
|
|
32
|
-
"@effect/vitest": "4.0.0-beta.
|
|
32
|
+
"@effect/vitest": "4.0.0-beta.50",
|
|
33
33
|
"@types/node": "^25.6.0",
|
|
34
34
|
"@typescript/native-preview": "7.0.0-dev.20260412.1",
|
|
35
|
-
"effect": "4.0.0-beta.
|
|
35
|
+
"effect": "4.0.0-beta.50",
|
|
36
36
|
"husky": "^9.1.7",
|
|
37
37
|
"lint-staged": "^16.4.0",
|
|
38
38
|
"oxlint": "^1.57.0",
|
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,65 @@
|
|
|
1
|
+
import { describe, expect, it } from "@effect/vitest"
|
|
2
|
+
import * as GenServer from "./GenServer.ts"
|
|
3
|
+
import { Deferred, Effect, Fiber, pipe, Schema, Stream } from "effect"
|
|
4
|
+
import { Rpc } from "effect/unstable/rpc"
|
|
5
|
+
|
|
6
|
+
const Counter = GenServer.make({
|
|
7
|
+
state: Schema.Int,
|
|
8
|
+
protocol: [
|
|
9
|
+
Rpc.make("increment"),
|
|
10
|
+
Rpc.make("incrementDeferred"),
|
|
11
|
+
Rpc.make("count", {
|
|
12
|
+
success: Schema.String,
|
|
13
|
+
stream: true,
|
|
14
|
+
}),
|
|
15
|
+
],
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
const CounterLayer = Counter.toLayer(
|
|
19
|
+
Effect.gen(function* () {
|
|
20
|
+
yield* Effect.void
|
|
21
|
+
return Counter.of(0, {
|
|
22
|
+
increment: ({ state }) => Effect.succeed([state + 1, void 0]),
|
|
23
|
+
incrementDeferred: Effect.fnUntraced(function* ({ state }) {
|
|
24
|
+
const deferred = yield* Deferred.make<void>()
|
|
25
|
+
yield* Deferred.succeed(deferred, void 0)
|
|
26
|
+
return [state + 1, deferred]
|
|
27
|
+
}),
|
|
28
|
+
count: ({ changes }) => changes.pipe(Stream.map((a) => a.toString())),
|
|
29
|
+
})
|
|
30
|
+
}),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
describe("GenServer", () => {
|
|
34
|
+
it.effect(
|
|
35
|
+
"handles streams",
|
|
36
|
+
Effect.fn(function* () {
|
|
37
|
+
const actor = yield* GenServer.makeActor(Counter, CounterLayer)
|
|
38
|
+
const arr = yield* pipe(
|
|
39
|
+
actor.send("count"),
|
|
40
|
+
Stream.take(3),
|
|
41
|
+
Stream.runCollect,
|
|
42
|
+
Effect.forkChild({ startImmediately: true }),
|
|
43
|
+
)
|
|
44
|
+
yield* actor.send("increment")
|
|
45
|
+
yield* actor.send("increment")
|
|
46
|
+
expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"])
|
|
47
|
+
}),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
it.effect(
|
|
51
|
+
"handles deferreds",
|
|
52
|
+
Effect.fn(function* () {
|
|
53
|
+
const actor = yield* GenServer.makeActor(Counter, CounterLayer)
|
|
54
|
+
const arr = yield* pipe(
|
|
55
|
+
actor.send("count"),
|
|
56
|
+
Stream.take(3),
|
|
57
|
+
Stream.runCollect,
|
|
58
|
+
Effect.forkChild({ startImmediately: true }),
|
|
59
|
+
)
|
|
60
|
+
yield* actor.send("incrementDeferred")
|
|
61
|
+
yield* actor.send("incrementDeferred")
|
|
62
|
+
expect(yield* Fiber.join(arr)).toEqual(["0", "1", "2"])
|
|
63
|
+
}),
|
|
64
|
+
)
|
|
65
|
+
})
|
package/src/GenServer.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import * as Rpc from "effect/unstable/rpc/Rpc"
|
|
5
5
|
import * as RpcGroup from "effect/unstable/rpc/RpcGroup"
|
|
6
6
|
import * as Effect from "effect/Effect"
|
|
7
|
+
import * as Deferred from "effect/Deferred"
|
|
7
8
|
import * as Schema from "effect/Schema"
|
|
8
9
|
import * as Layer from "effect/Layer"
|
|
9
10
|
import type * as Scope from "effect/Scope"
|
|
@@ -15,7 +16,7 @@ import * as MutableRef from "effect/MutableRef"
|
|
|
15
16
|
import * as Stream from "effect/Stream"
|
|
16
17
|
import * as Semaphore from "effect/Semaphore"
|
|
17
18
|
import { flow, identity, pipe } from "effect/Function"
|
|
18
|
-
import
|
|
19
|
+
import * as RpcSchema from "effect/unstable/rpc/RpcSchema"
|
|
19
20
|
import * as Latch from "effect/Latch"
|
|
20
21
|
import type { Types } from "effect"
|
|
21
22
|
|
|
@@ -28,17 +29,13 @@ export interface GenServer<State extends Schema.Top, Rpcs extends Rpc.Any> {
|
|
|
28
29
|
readonly protocol: RpcGroup.RpcGroup<Rpcs>
|
|
29
30
|
|
|
30
31
|
readonly sender: Effect.Effect<
|
|
31
|
-
<
|
|
32
|
-
const Tag extends Rpcs["_tag"],
|
|
33
|
-
Rpc = Rpc.ExtractTag<Rpcs, Tag>,
|
|
34
|
-
Payload = Rpc.PayloadConstructor<Rpc>,
|
|
35
|
-
>(
|
|
32
|
+
<const Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(
|
|
36
33
|
tag: Tag,
|
|
37
34
|
...args: Types.EqualsWith<
|
|
38
|
-
|
|
35
|
+
Rpc.PayloadConstructor<Rpc>,
|
|
39
36
|
void,
|
|
40
|
-
[payload?:
|
|
41
|
-
[payload:
|
|
37
|
+
[payload?: Rpc.PayloadConstructor<Rpc>],
|
|
38
|
+
[payload: Rpc.PayloadConstructor<Rpc>]
|
|
42
39
|
>
|
|
43
40
|
) => Effect.Effect<void>,
|
|
44
41
|
never,
|
|
@@ -130,15 +127,21 @@ export type HandlerFn<
|
|
|
130
127
|
R,
|
|
131
128
|
> = (options: {
|
|
132
129
|
readonly state: State["Type"]
|
|
130
|
+
readonly changes: Stream.Stream<State["Type"]>
|
|
133
131
|
readonly payload: Rpc.Payload<Rpc>
|
|
134
132
|
readonly context: Context.Context<never>
|
|
135
|
-
}) => Rpc.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
>
|
|
133
|
+
}) => Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E>
|
|
134
|
+
? Stream.Stream<A["Type"], E["Type"], R>
|
|
135
|
+
: Effect.Effect<
|
|
136
|
+
readonly [
|
|
137
|
+
state: State["Type"],
|
|
138
|
+
result:
|
|
139
|
+
| Rpc.Success<Rpc>
|
|
140
|
+
| Deferred.Deferred<Rpc.Success<Rpc>, Rpc.Error<Rpc>>,
|
|
141
|
+
],
|
|
142
|
+
Rpc.Error<Rpc>,
|
|
143
|
+
R
|
|
144
|
+
>
|
|
142
145
|
|
|
143
146
|
/**
|
|
144
147
|
* @since 1.0.0
|
|
@@ -153,7 +156,13 @@ export type HandlerServices<Handlers extends Record<string, any>> =
|
|
|
153
156
|
infer _R
|
|
154
157
|
>
|
|
155
158
|
? _R
|
|
156
|
-
:
|
|
159
|
+
: ReturnType<Handlers[K]> extends Stream.Stream<
|
|
160
|
+
infer _A,
|
|
161
|
+
infer _E,
|
|
162
|
+
infer _R
|
|
163
|
+
>
|
|
164
|
+
? _R
|
|
165
|
+
: never
|
|
157
166
|
: never
|
|
158
167
|
: never
|
|
159
168
|
|
|
@@ -205,6 +214,8 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
|
|
|
205
214
|
any
|
|
206
215
|
>,
|
|
207
216
|
) {
|
|
217
|
+
// oxlint-disable-next-line typescript/no-this-alias
|
|
218
|
+
const schema = this
|
|
208
219
|
return Layer.fresh(
|
|
209
220
|
Layer.effectContext(
|
|
210
221
|
Effect.gen(function* () {
|
|
@@ -213,8 +224,15 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
|
|
|
213
224
|
const handlerMap = new Map<string, any>()
|
|
214
225
|
handlerMap.set(initialStateKey, initialState)
|
|
215
226
|
for (const [tag, handler] of Object.entries(handlers)) {
|
|
227
|
+
const rpc = schema.protocol.requests.get(tag)! as Rpc.AnyWithProps
|
|
228
|
+
const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
|
|
216
229
|
handlerMap.set(handlerKey(tag), (options: any) =>
|
|
217
|
-
|
|
230
|
+
isStream
|
|
231
|
+
? Stream.provideContext(handler(options) as any, services)
|
|
232
|
+
: Rpc.wrapMap(
|
|
233
|
+
handler(options),
|
|
234
|
+
Effect.provideContext(services),
|
|
235
|
+
),
|
|
218
236
|
)
|
|
219
237
|
}
|
|
220
238
|
return Context.makeUnsafe(handlerMap)
|
|
@@ -237,6 +255,8 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
|
|
|
237
255
|
readonly storeId?: string | undefined
|
|
238
256
|
},
|
|
239
257
|
) {
|
|
258
|
+
// oxlint-disable-next-line typescript/no-this-alias
|
|
259
|
+
const schema = this
|
|
240
260
|
const storeId = options?.storeId ?? "machine"
|
|
241
261
|
const stateFromJson = Schema.toCodecJson(this.stateSchema)
|
|
242
262
|
const decode = Schema.decodeUnknownEffect(stateFromJson)
|
|
@@ -263,18 +283,22 @@ const Proto: Omit<GenServer<any, any>, "stateSchema" | "protocol"> = {
|
|
|
263
283
|
initialState,
|
|
264
284
|
])
|
|
265
285
|
for (const [tag, handler] of Object.entries(handlers)) {
|
|
286
|
+
const rpc = schema.protocol.requests.get(tag)! as Rpc.AnyWithProps
|
|
287
|
+
const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
|
|
266
288
|
handlerMap.set(handlerKey(tag), (options: any) =>
|
|
267
|
-
|
|
268
|
-
handler(options),
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
289
|
+
isStream
|
|
290
|
+
? Stream.provideContext(handler(options) as any, services)
|
|
291
|
+
: Rpc.wrapMap(
|
|
292
|
+
handler(options),
|
|
293
|
+
flow(
|
|
294
|
+
Effect.tap(([state]) =>
|
|
295
|
+
Effect.flatMap(encode(state), (a) =>
|
|
296
|
+
store.set(currentId, a as any, undefined),
|
|
297
|
+
),
|
|
298
|
+
),
|
|
299
|
+
Effect.provideContext(services),
|
|
273
300
|
),
|
|
274
301
|
),
|
|
275
|
-
Effect.provideContext(services),
|
|
276
|
-
),
|
|
277
|
-
),
|
|
278
302
|
)
|
|
279
303
|
}
|
|
280
304
|
return Context.makeUnsafe(handlerMap)
|
|
@@ -310,7 +334,9 @@ export const makeHandlers = Effect.fnUntraced(function* <
|
|
|
310
334
|
readonly handler: (options: {
|
|
311
335
|
readonly payload: any
|
|
312
336
|
readonly context: Context.Context<never>
|
|
313
|
-
}) =>
|
|
337
|
+
}) =>
|
|
338
|
+
| Stream.Stream<any, any>
|
|
339
|
+
| Effect.Effect<{} | Deferred.Deferred<any, any>, any>
|
|
314
340
|
}
|
|
315
341
|
>
|
|
316
342
|
},
|
|
@@ -324,7 +350,9 @@ export const makeHandlers = Effect.fnUntraced(function* <
|
|
|
324
350
|
readonly handler: (options: {
|
|
325
351
|
readonly payload: any
|
|
326
352
|
readonly context: Context.Context<never>
|
|
327
|
-
}) =>
|
|
353
|
+
}) =>
|
|
354
|
+
| Stream.Stream<any, any>
|
|
355
|
+
| Effect.Effect<{} | Deferred.Deferred<any, any>, any>
|
|
328
356
|
}
|
|
329
357
|
>()
|
|
330
358
|
const scope = yield* Effect.scope
|
|
@@ -349,7 +377,7 @@ export const makeHandlers = Effect.fnUntraced(function* <
|
|
|
349
377
|
payload,
|
|
350
378
|
context: Context.empty(),
|
|
351
379
|
})
|
|
352
|
-
return
|
|
380
|
+
return Stream.isStream(result) ? Stream.runDrain(result) : result
|
|
353
381
|
})
|
|
354
382
|
|
|
355
383
|
const services = yield* Layer.build(layer).pipe(
|
|
@@ -362,6 +390,7 @@ export const makeHandlers = Effect.fnUntraced(function* <
|
|
|
362
390
|
replay: 1,
|
|
363
391
|
})
|
|
364
392
|
PubSub.publishUnsafe(pubsub, state.current)
|
|
393
|
+
const changes = Stream.fromPubSub(pubsub)
|
|
365
394
|
|
|
366
395
|
handlers.set(stateChanges._tag, {
|
|
367
396
|
rpc: stateChanges,
|
|
@@ -376,26 +405,28 @@ export const makeHandlers = Effect.fnUntraced(function* <
|
|
|
376
405
|
>
|
|
377
406
|
handlers.set(rpc._tag, {
|
|
378
407
|
rpc: rpc as any,
|
|
379
|
-
handler: (options) =>
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
408
|
+
handler: (options) => {
|
|
409
|
+
const result = handler({
|
|
410
|
+
state: state.current,
|
|
411
|
+
changes,
|
|
412
|
+
payload: options.payload,
|
|
413
|
+
context: options.context,
|
|
414
|
+
}) as
|
|
415
|
+
| Stream.Stream<any, any>
|
|
416
|
+
| Effect.Effect<[any, {} | Deferred.Deferred<any, any>], any>
|
|
417
|
+
if (Stream.isStream(result)) return result
|
|
418
|
+
return pipe(
|
|
419
|
+
result,
|
|
420
|
+
Effect.map(([nextState, result]) => {
|
|
421
|
+
if (nextState !== state.current) {
|
|
422
|
+
MutableRef.set(state, nextState)
|
|
423
|
+
PubSub.publishUnsafe(pubsub, nextState)
|
|
424
|
+
}
|
|
425
|
+
return result
|
|
385
426
|
}),
|
|
386
|
-
(
|
|
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
|
-
),
|
|
427
|
+
sendSemaphore.withPermits(1),
|
|
428
|
+
)
|
|
429
|
+
},
|
|
399
430
|
})
|
|
400
431
|
}
|
|
401
432
|
|
|
@@ -428,19 +459,17 @@ export const RpcStateChanges = <State extends Schema.Top, Rpcs extends Rpc.Any>(
|
|
|
428
459
|
export interface Actor<State extends Schema.Top, Rpcs extends Rpc.Any> {
|
|
429
460
|
readonly changes: Stream.Stream<State["Type"]>
|
|
430
461
|
readonly state: MutableRef.MutableRef<State["Type"]>
|
|
431
|
-
send<
|
|
432
|
-
Tag extends Rpcs["_tag"],
|
|
433
|
-
Rpc = Rpc.ExtractTag<Rpcs, Tag>,
|
|
434
|
-
Payload = Rpc.PayloadConstructor<Rpc>,
|
|
435
|
-
>(
|
|
462
|
+
send<Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>>(
|
|
436
463
|
tag: Tag,
|
|
437
464
|
...args: Types.EqualsWith<
|
|
438
|
-
|
|
465
|
+
Rpc.PayloadConstructor<Rpc>,
|
|
439
466
|
void,
|
|
440
|
-
[payload?:
|
|
441
|
-
[payload:
|
|
467
|
+
[payload?: Rpc.PayloadConstructor<Rpc>],
|
|
468
|
+
[payload: Rpc.PayloadConstructor<Rpc>]
|
|
442
469
|
>
|
|
443
|
-
):
|
|
470
|
+
): Rpc.SuccessSchema<Rpc> extends RpcSchema.Stream<infer A, infer E>
|
|
471
|
+
? Stream.Stream<A["Type"], E["Type"]>
|
|
472
|
+
: Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>
|
|
444
473
|
}
|
|
445
474
|
|
|
446
475
|
/**
|
|
@@ -473,16 +502,25 @@ export const makeActor = Effect.fnUntraced(function* <
|
|
|
473
502
|
) => {
|
|
474
503
|
const entry = handlers.get(tag)
|
|
475
504
|
if (!entry) {
|
|
476
|
-
|
|
505
|
+
const rpc = schema.protocol.requests.get(tag)! as any as Rpc.AnyWithProps
|
|
506
|
+
const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
|
|
507
|
+
const message = `Unknown tag: ${tag}`
|
|
508
|
+
return isStream ? Stream.die(message) : Effect.die(message)
|
|
477
509
|
}
|
|
478
|
-
const
|
|
510
|
+
const result = entry.handler({
|
|
479
511
|
payload:
|
|
480
512
|
payload_ !== undefined
|
|
481
513
|
? entry.rpc.payloadSchema.make(payload_)
|
|
482
514
|
: undefined,
|
|
483
515
|
context: requestContext,
|
|
484
516
|
})
|
|
485
|
-
return
|
|
517
|
+
return Stream.isStream(result)
|
|
518
|
+
? result
|
|
519
|
+
: Effect.flatMap(result, (result) =>
|
|
520
|
+
Deferred.isDeferred(result)
|
|
521
|
+
? Deferred.await(result)
|
|
522
|
+
: Effect.succeed(result),
|
|
523
|
+
)
|
|
486
524
|
}
|
|
487
525
|
|
|
488
526
|
return identity<Actor<State, Rpcs>>({
|
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
|
|