effect-genserver 0.1.0
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 +3 -0
- package/dist/AtomGenServer.d.ts +26 -0
- package/dist/AtomGenServer.d.ts.map +1 -0
- package/dist/AtomGenServer.js +28 -0
- package/dist/AtomGenServer.js.map +1 -0
- package/dist/ClusterGenServer.d.ts +39 -0
- package/dist/ClusterGenServer.d.ts.map +1 -0
- package/dist/ClusterGenServer.js +31 -0
- package/dist/ClusterGenServer.js.map +1 -0
- package/dist/GenServer.d.ts +139 -0
- package/dist/GenServer.d.ts.map +1 -0
- package/dist/GenServer.js +181 -0
- package/dist/GenServer.js.map +1 -0
- package/dist/RpcGenServer.d.ts +29 -0
- package/dist/RpcGenServer.d.ts.map +1 -0
- package/dist/RpcGenServer.js +32 -0
- package/dist/RpcGenServer.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
- package/src/AtomGenServer.ts +112 -0
- package/src/ClusterGenServer.ts +96 -0
- package/src/GenServer.ts +493 -0
- package/src/RpcGenServer.ts +65 -0
- package/src/index.ts +19 -0
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Rpc from "effect/unstable/rpc/Rpc";
|
|
5
|
+
import type * as Schema from "effect/Schema";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import * as GenServer from "./GenServer.ts";
|
|
8
|
+
import * as Atom from "effect/unstable/reactivity/Atom";
|
|
9
|
+
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
|
|
10
|
+
import * as Duration from "effect/Duration";
|
|
11
|
+
/**
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
* @category Atom
|
|
14
|
+
*/
|
|
15
|
+
export declare const make: <State extends Schema.Top, Rpcs extends Rpc.Any, E, InitialState extends State["Type"] | undefined = undefined>(server: GenServer.GenServer<State, Rpcs>, layer: Layer.Layer<GenServer.ToHandler<Rpcs> | GenServer.InitialState, E, GenServer.SendDiscard> | ((get: Atom.AtomContext) => Layer.Layer<GenServer.ToHandler<Rpcs> | GenServer.InitialState, E, GenServer.SendDiscard>), options?: {
|
|
16
|
+
readonly memoMap?: Layer.MemoMap | undefined;
|
|
17
|
+
readonly idleTTL?: Duration.Input | undefined;
|
|
18
|
+
readonly initialState?: InitialState | undefined;
|
|
19
|
+
}) => {
|
|
20
|
+
readonly actor: Atom.Atom<AsyncResult.AsyncResult<GenServer.Actor<State, Rpcs>, E>>;
|
|
21
|
+
readonly send: <Tag extends Rpcs["_tag"]>(tag: Tag, options?: {
|
|
22
|
+
readonly concurrent?: boolean | undefined;
|
|
23
|
+
}) => Atom.AtomResultFn<Rpc.PayloadConstructor<Rpc.ExtractTag<Rpcs, Tag>>, Rpc.Success<Rpc.ExtractTag<Rpcs, Tag>>, E | Schema.Schema.Type<Rpc.ErrorSchema<Rpc.ExtractTag<Rpcs, Tag>>>>;
|
|
24
|
+
readonly state: Atom.Atom<[InitialState] extends [undefined] ? AsyncResult.AsyncResult<State["Type"], E> : State["Type"]>;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=AtomGenServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AtomGenServer.d.ts","sourceRoot":"","sources":["../src/AtomGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAEnD,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAA;AAGvD,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAA;AACrE,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C;;;GAGG;AACH,eAAO,MAAM,IAAI,GACf,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,YAAY,SAAS,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,EAE1D,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EACxC,OACI,KAAK,CAAC,KAAK,CACT,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAClD,CAAC,EACD,SAAS,CAAC,WAAW,CACtB,GACD,CAAC,CACC,GAAG,EAAE,IAAI,CAAC,WAAW,KAClB,KAAK,CAAC,KAAK,CACd,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAClD,CAAC,EACD,SAAS,CAAC,WAAW,CACtB,CAAC,EACN,UAAU;IACR,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CACjD,KACA;IACD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CACvB,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CACzD,CAAA;IACD,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,EACtC,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAC1C,KACE,IAAI,CAAC,YAAY,CACpB,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EACjD,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EACtC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CACnE,CAAA;IACD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CACvB,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,GAC9B,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GACzC,KAAK,CAAC,MAAM,CAAC,CAClB,CAAA;CAkDF,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import * as GenServer from "./GenServer.js";
|
|
4
|
+
import * as Atom from "effect/unstable/reactivity/Atom";
|
|
5
|
+
import { identity, pipe } from "effect/Function";
|
|
6
|
+
import * as Stream from "effect/Stream";
|
|
7
|
+
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
|
|
8
|
+
import * as Duration from "effect/Duration";
|
|
9
|
+
/**
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
* @category Atom
|
|
12
|
+
*/
|
|
13
|
+
export const make = (server, layer, options) => {
|
|
14
|
+
const memoMap = options?.memoMap ?? Atom.runtime.memoMap;
|
|
15
|
+
const actor = Atom.make((get) => {
|
|
16
|
+
const layer_ = typeof layer === "function" ? layer(get) : layer;
|
|
17
|
+
return GenServer.makeActor(server, layer_).pipe(Effect.provideService(Layer.CurrentMemoMap, memoMap));
|
|
18
|
+
}).pipe(Atom.setIdleTTL(options?.idleTTL ?? Duration.zero));
|
|
19
|
+
const state = pipe(Atom.make((get) => pipe(get.result(actor), Effect.map((actor) => actor.changes), Stream.unwrap)), options?.initialState
|
|
20
|
+
? Atom.map(AsyncResult.getOrElse(() => options.initialState))
|
|
21
|
+
: identity);
|
|
22
|
+
const sendFamily = ([tag, concurrent]) => {
|
|
23
|
+
return Atom.fn((payload, get) => pipe(get.result(actor), Effect.flatMap((actor) => actor.send(tag, payload))), { concurrent });
|
|
24
|
+
};
|
|
25
|
+
const send = (tag, options) => sendFamily([tag, options?.concurrent ?? false]);
|
|
26
|
+
return { actor, send, state };
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=AtomGenServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AtomGenServer.js","sourceRoot":"","sources":["../src/AtomGenServer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAA;AACrE,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAMlB,MAAwC,EACxC,KAYM,EACN,OAIC,EAoBD,EAAE;IACF,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;IAExD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC/D,OAAO,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAC7C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC,CACrD,CAAA;IACH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAE3D,MAAM,KAAK,GAAG,IAAI,CAChB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAChB,IAAI,CACF,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EACjB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EACpC,MAAM,CAAC,MAAM,CACd,CACF,EACD,OAAO,EAAE,YAAY;QACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC,CAAC,QAAQ,CAC2C,CAAA;IAEzD,MAAM,UAAU,GAAG,CAGjB,CAAC,GAAG,EAAE,UAAU,CAAiB,EAIjC,EAAE;QACF,OAAO,IAAI,CAAC,EAAE,CACZ,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CACf,IAAI,CACF,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EACjB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CACpD,EACH,EAAE,UAAU,EAAE,CACf,CAAA;IACH,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,CACX,GAAQ,EACR,OAEC,EACD,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC,CAAC,CAAA;IAEpD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAC/B,CAAC,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Rpc from "effect/unstable/rpc/Rpc";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import type * as Schema from "effect/Schema";
|
|
7
|
+
import type * as Layer from "effect/Layer";
|
|
8
|
+
import type * as Scope from "effect/Scope";
|
|
9
|
+
import * as Context from "effect/Context";
|
|
10
|
+
import type * as RpcSchema from "effect/unstable/rpc/RpcSchema";
|
|
11
|
+
import * as Entity from "effect/unstable/cluster/Entity";
|
|
12
|
+
import type * as Envelope from "effect/unstable/cluster/Envelope";
|
|
13
|
+
import * as GenServer from "./GenServer.ts";
|
|
14
|
+
/**
|
|
15
|
+
* @since 1.0.0
|
|
16
|
+
* @category Entity
|
|
17
|
+
*/
|
|
18
|
+
export declare const entity: <const Type extends string, State extends Schema.Top, Rpcs extends Rpc.Any>(type: Type, schema: GenServer.GenServer<State, Rpcs>) => Entity.Entity<Type, Rpcs | Rpc.Rpc<"GenServerChanges", Schema.Void, RpcSchema.Stream<State, Schema.Never>>>;
|
|
19
|
+
/**
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
* @category Entity
|
|
22
|
+
*/
|
|
23
|
+
export type EntityHandlersFrom<Rpcs extends Rpc.Any> = {
|
|
24
|
+
readonly [Current in Rpcs as Current["_tag"]]: (envelope: Envelope.Request<Current>) => Rpc.WrapperOr<Rpc.ResultFrom<Current, never>>;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
* @category Entity
|
|
29
|
+
*/
|
|
30
|
+
export declare const entityHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer.GenServer<State, Rpcs>, layer: Layer.Layer<GenServer.ToHandler<Rpcs> | GenServer.InitialState, E, R>) => Effect.Effect<EntityHandlersFrom<Rpcs | Rpc.Rpc<"GenServerChanges", Schema.Void, RpcSchema.Stream<State, Schema.Never>, Schema.Never, never, never>>, E, Exclude<R, GenServer.SendDiscard> | Scope.Scope>;
|
|
31
|
+
declare const ClusterRequest_base: Context.ServiceClass<ClusterRequest, "effect-genserver/ClusterGenServer/ClusterRequest", Envelope.Request<Rpc.AnyWithProps>>;
|
|
32
|
+
/**
|
|
33
|
+
* @since 1.0.0
|
|
34
|
+
* @category Entity
|
|
35
|
+
*/
|
|
36
|
+
export declare class ClusterRequest extends ClusterRequest_base {
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=ClusterGenServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClusterGenServer.d.ts","sourceRoot":"","sources":["../src/ClusterGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,yBAAyB,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAA;AACxD,OAAO,KAAK,KAAK,QAAQ,MAAM,kCAAkC,CAAA;AACjE,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;GAGG;AACH,eAAO,MAAM,MAAM,GACjB,KAAK,CAAC,IAAI,SAAS,MAAM,EACzB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EAEpB,MAAM,IAAI,EACV,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KACvC,MAAM,CAAC,MAAM,CACd,IAAI,EACF,IAAI,GACJ,GAAG,CAAC,GAAG,CACL,kBAAkB,EAClB,MAAM,CAAC,IAAI,EACX,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CACtC,CAKF,CAAA;AAEH;;;GAGG;AACH,MAAM,MAAM,kBAAkB,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI;IACrD,QAAQ,EAAE,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAC7C,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAChC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;CACnD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,CAAC,sUA6BD,CAAA;;AAEF;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAGmB;CAAG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
3
|
+
import * as Entity from "effect/unstable/cluster/Entity";
|
|
4
|
+
import * as GenServer from "./GenServer.js";
|
|
5
|
+
/**
|
|
6
|
+
* @since 1.0.0
|
|
7
|
+
* @category Entity
|
|
8
|
+
*/
|
|
9
|
+
export const entity = (type, schema) => Entity.fromRpcGroup(type, schema.protocol.add(GenServer.RpcStateChanges(schema)));
|
|
10
|
+
/**
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
* @category Entity
|
|
13
|
+
*/
|
|
14
|
+
export const entityHandlers = Effect.fnUntraced(function* (schema, layer) {
|
|
15
|
+
const { handlers } = yield* GenServer.makeHandlers(schema, layer);
|
|
16
|
+
const entityHandlers = {};
|
|
17
|
+
for (const { rpc, handler } of handlers.values()) {
|
|
18
|
+
entityHandlers[rpc._tag] = (request) => handler({
|
|
19
|
+
payload: request.payload,
|
|
20
|
+
context: ClusterRequest.context(request),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return entityHandlers;
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* @since 1.0.0
|
|
27
|
+
* @category Entity
|
|
28
|
+
*/
|
|
29
|
+
export class ClusterRequest extends Context.Service()("effect-genserver/ClusterGenServer/ClusterRequest") {
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ClusterGenServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClusterGenServer.js","sourceRoot":"","sources":["../src/ClusterGenServer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAIvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAA;AAExD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAKpB,IAAU,EACV,MAAwC,EASxC,EAAE,CACF,MAAM,CAAC,YAAY,CACjB,IAAI,EACJ,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CACvD,CAAA;AAYH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAMvD,MAAwC,EACxC,KAA4E;IAa5E,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,cAAc,GAGhB,EAAE,CAAA;IACN,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAA8B,EAAE,EAAE,CAC5D,OAAO,CAAC;YACN,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;SACzC,CAAC,CAAA;IACN,CAAC;IACD,OAAO,cAAqB,CAAA;AAC9B,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAGhD,CAAC,kDAAkD,CAAC;CAAG"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Rpc from "effect/unstable/rpc/Rpc";
|
|
5
|
+
import * as RpcGroup from "effect/unstable/rpc/RpcGroup";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Schema from "effect/Schema";
|
|
8
|
+
import * as Layer from "effect/Layer";
|
|
9
|
+
import type * as Scope from "effect/Scope";
|
|
10
|
+
import * as Context from "effect/Context";
|
|
11
|
+
import type * as Option from "effect/Option";
|
|
12
|
+
import * as Persistence from "effect/unstable/persistence/Persistence";
|
|
13
|
+
import * as PubSub from "effect/PubSub";
|
|
14
|
+
import * as MutableRef from "effect/MutableRef";
|
|
15
|
+
import * as Stream from "effect/Stream";
|
|
16
|
+
import type * as RpcSchema from "effect/unstable/rpc/RpcSchema";
|
|
17
|
+
import type { Types } from "effect";
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
* @category Models
|
|
21
|
+
*/
|
|
22
|
+
export interface GenServer<State extends Schema.Top, Rpcs extends Rpc.Any> {
|
|
23
|
+
readonly stateSchema: State;
|
|
24
|
+
readonly protocol: RpcGroup.RpcGroup<Rpcs>;
|
|
25
|
+
readonly sender: Effect.Effect<(<const Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>, Payload = Rpc.PayloadConstructor<Rpc>>(tag: Tag, ...args: Types.EqualsWith<Payload, void, [
|
|
26
|
+
payload?: Payload
|
|
27
|
+
], [
|
|
28
|
+
payload: Payload
|
|
29
|
+
]>) => Effect.Effect<void>), never, SendDiscard>;
|
|
30
|
+
of<A extends Handlers<State, Rpcs>>(initialState: State["Type"], handlers: A): readonly [state: State["Type"], handlers: A];
|
|
31
|
+
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>>;
|
|
32
|
+
toLayerPersisted<A extends Handlers<State, Rpcs>, E, R>(build: (getPersistedState: (id: string) => Effect.Effect<Option.Option<State["Type"]>, Persistence.PersistenceError, State["DecodingServices"]>) => Effect.Effect<readonly [state: State["Type"], handlers: A], E, R>): Layer.Layer<ToHandler<Rpcs> | InitialState, E, Exclude<R, Scope.Scope> | HandlerServices<A> | Persistence.BackingPersistence | State["EncodingServices"]>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @since 1.0.0
|
|
36
|
+
* @category Initial state
|
|
37
|
+
*/
|
|
38
|
+
export interface InitialState {
|
|
39
|
+
readonly _: unique symbol;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @since 1.0.0
|
|
43
|
+
* @category Handlers
|
|
44
|
+
*/
|
|
45
|
+
export interface Handler<Tag extends string> {
|
|
46
|
+
readonly _: unique symbol;
|
|
47
|
+
readonly _tag: Tag;
|
|
48
|
+
}
|
|
49
|
+
declare const SendDiscard_base: Context.ServiceClass<SendDiscard, "@effectfultech/clanka-utils/GenServer/SendDiscard", (tag: string, payload: any) => Effect.Effect<void>>;
|
|
50
|
+
/**
|
|
51
|
+
* @since 1.0.0
|
|
52
|
+
* @category Initial state
|
|
53
|
+
*/
|
|
54
|
+
export declare class SendDiscard extends SendDiscard_base {
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @since 1.0.0
|
|
58
|
+
* @category Handlers
|
|
59
|
+
*/
|
|
60
|
+
export type ToHandler<Rpc extends Rpc.Any> = Rpc extends Rpc.Any ? Handler<Rpc["_tag"]> : never;
|
|
61
|
+
/**
|
|
62
|
+
* @since 1.0.0
|
|
63
|
+
* @category Handlers
|
|
64
|
+
*/
|
|
65
|
+
export type Handlers<State extends Schema.Top, Rpcs extends Rpc.Any> = {
|
|
66
|
+
[R in Rpcs as R["_tag"]]: HandlerFn<State, R, any>;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* @since 1.0.0
|
|
70
|
+
* @category Handlers
|
|
71
|
+
*/
|
|
72
|
+
export type HandlerFn<State extends Schema.Top, Rpc extends Rpc.Any, R> = (options: {
|
|
73
|
+
readonly state: State["Type"];
|
|
74
|
+
readonly payload: Rpc.Payload<Rpc>;
|
|
75
|
+
readonly context: Context.Context<never>;
|
|
76
|
+
}) => Rpc.WrapperOr<Effect.Effect<readonly [state: State["Type"], result: Rpc.Success<Rpc>], Rpc.Error<Rpc>, R>>;
|
|
77
|
+
/**
|
|
78
|
+
* @since 1.0.0
|
|
79
|
+
* @category Handlers
|
|
80
|
+
*/
|
|
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
|
+
/**
|
|
83
|
+
* @since 1.0.0
|
|
84
|
+
* @category Constructors
|
|
85
|
+
*/
|
|
86
|
+
export declare const make: <State extends Schema.Top, const Rpcs extends ReadonlyArray<Rpc.Any>>(options: {
|
|
87
|
+
readonly state: State;
|
|
88
|
+
readonly protocol: Rpcs;
|
|
89
|
+
}) => GenServer<State, Rpcs[number]>;
|
|
90
|
+
/**
|
|
91
|
+
* @since 1.0.0
|
|
92
|
+
* @category Constructors
|
|
93
|
+
*/
|
|
94
|
+
export declare const fromRpcGroup: <State extends Schema.Top, Rpcs extends Rpc.Any>(options: {
|
|
95
|
+
readonly state: State;
|
|
96
|
+
readonly group: RpcGroup.RpcGroup<Rpcs>;
|
|
97
|
+
}) => GenServer<State, Rpcs>;
|
|
98
|
+
/**
|
|
99
|
+
* @since 1.0.0
|
|
100
|
+
* @category Handlers
|
|
101
|
+
*/
|
|
102
|
+
export declare const makeHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer<State, Rpcs>, layer: Layer.Layer<ToHandler<Rpcs> | InitialState, E, R>) => Effect.Effect<{
|
|
103
|
+
readonly state: MutableRef.MutableRef<State["Type"]>;
|
|
104
|
+
readonly pubsub: PubSub.PubSub<State["Type"]>;
|
|
105
|
+
readonly handlers: ReadonlyMap<string, {
|
|
106
|
+
readonly rpc: Rpc.AnyWithProps;
|
|
107
|
+
readonly handler: (options: {
|
|
108
|
+
readonly payload: any;
|
|
109
|
+
readonly context: Context.Context<never>;
|
|
110
|
+
}) => Rpc.WrapperOr<Effect.Effect<any, any>>;
|
|
111
|
+
}>;
|
|
112
|
+
}, E, Exclude<R, SendDiscard> | Scope.Scope>;
|
|
113
|
+
/**
|
|
114
|
+
* @since 1.0.0
|
|
115
|
+
* @category RpcServer
|
|
116
|
+
*/
|
|
117
|
+
export declare const RpcStateChanges: <State extends Schema.Top, Rpcs extends Rpc.Any>(server: GenServer<State, Rpcs>) => Rpc.Rpc<"GenServerChanges", Schema.Void, RpcSchema.Stream<State, Schema.Never>>;
|
|
118
|
+
/**
|
|
119
|
+
* @since 1.0.0
|
|
120
|
+
* @category Actor
|
|
121
|
+
*/
|
|
122
|
+
export interface Actor<State extends Schema.Top, Rpcs extends Rpc.Any> {
|
|
123
|
+
readonly changes: Stream.Stream<State["Type"]>;
|
|
124
|
+
readonly state: MutableRef.MutableRef<State["Type"]>;
|
|
125
|
+
send<Tag extends Rpcs["_tag"], Rpc = Rpc.ExtractTag<Rpcs, Tag>, Payload = Rpc.PayloadConstructor<Rpc>>(tag: Tag, ...args: Types.EqualsWith<Payload, void, [
|
|
126
|
+
payload?: Payload
|
|
127
|
+
], [
|
|
128
|
+
payload: Payload
|
|
129
|
+
]>): Effect.Effect<Rpc.Success<Rpc>, Rpc.Error<Rpc>>;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* @since 1.0.0
|
|
133
|
+
* @category Actor
|
|
134
|
+
*/
|
|
135
|
+
export declare const makeActor: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer<State, Rpcs>, layer: Layer.Layer<InitialState | ToHandler<Rpcs>, E, R>, options?: {
|
|
136
|
+
readonly requestContext?: Context.Context<never> | undefined;
|
|
137
|
+
} | undefined) => Effect.Effect<Actor<State, Rpcs>, E, Scope.Scope | Exclude<R, SendDiscard>>;
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=GenServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenServer.d.ts","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Rpc from "effect/unstable/rpc/Rpc";
|
|
5
|
+
import * as RpcGroup from "effect/unstable/rpc/RpcGroup";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Schema from "effect/Schema";
|
|
8
|
+
import * as Layer from "effect/Layer";
|
|
9
|
+
import * as Context from "effect/Context";
|
|
10
|
+
import * as Persistence from "effect/unstable/persistence/Persistence";
|
|
11
|
+
import * as PubSub from "effect/PubSub";
|
|
12
|
+
import * as MutableRef from "effect/MutableRef";
|
|
13
|
+
import * as Stream from "effect/Stream";
|
|
14
|
+
import * as Semaphore from "effect/Semaphore";
|
|
15
|
+
import { flow, identity, pipe } from "effect/Function";
|
|
16
|
+
import * as Latch from "effect/Latch";
|
|
17
|
+
/**
|
|
18
|
+
* @since 1.0.0
|
|
19
|
+
* @category Initial state
|
|
20
|
+
*/
|
|
21
|
+
export class SendDiscard extends Context.Service()("@effectfultech/clanka-utils/GenServer/SendDiscard") {
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
* @category Constructors
|
|
26
|
+
*/
|
|
27
|
+
export const make = (options) => fromRpcGroup({
|
|
28
|
+
state: options.state,
|
|
29
|
+
group: RpcGroup.make(...options.protocol),
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* @since 1.0.0
|
|
33
|
+
* @category Constructors
|
|
34
|
+
*/
|
|
35
|
+
export const fromRpcGroup = (options) => {
|
|
36
|
+
const self = Object.create(Proto);
|
|
37
|
+
self.stateSchema = options.state;
|
|
38
|
+
self.protocol = options.group;
|
|
39
|
+
return self;
|
|
40
|
+
};
|
|
41
|
+
const Proto = {
|
|
42
|
+
get sender() {
|
|
43
|
+
return SendDiscard.useSync((send) => send);
|
|
44
|
+
},
|
|
45
|
+
of(initialState, handlers) {
|
|
46
|
+
return [initialState, handlers];
|
|
47
|
+
},
|
|
48
|
+
toLayer(build) {
|
|
49
|
+
return Layer.fresh(Layer.effectContext(Effect.gen(function* () {
|
|
50
|
+
const services = yield* Effect.context();
|
|
51
|
+
const [initialState, handlers] = yield* build;
|
|
52
|
+
const handlerMap = new Map();
|
|
53
|
+
handlerMap.set(initialStateKey, initialState);
|
|
54
|
+
for (const [tag, handler] of Object.entries(handlers)) {
|
|
55
|
+
handlerMap.set(handlerKey(tag), (options) => Rpc.wrapMap(handler(options), Effect.provideContext(services)));
|
|
56
|
+
}
|
|
57
|
+
return Context.makeUnsafe(handlerMap);
|
|
58
|
+
})));
|
|
59
|
+
},
|
|
60
|
+
toLayerPersisted(build, options) {
|
|
61
|
+
const storeId = options?.storeId ?? "machine";
|
|
62
|
+
const stateFromJson = Schema.toCodecJson(this.stateSchema);
|
|
63
|
+
const decode = Schema.decodeUnknownEffect(stateFromJson);
|
|
64
|
+
const encode = Schema.encodeUnknownEffect(stateFromJson);
|
|
65
|
+
return Layer.fresh(Layer.effectContext(Effect.gen(function* () {
|
|
66
|
+
const services = yield* Effect.context();
|
|
67
|
+
const persistence = yield* Persistence.BackingPersistence;
|
|
68
|
+
const store = yield* persistence.make(storeId);
|
|
69
|
+
let currentId = "default";
|
|
70
|
+
const load = (id) => Effect.suspend(() => {
|
|
71
|
+
currentId = id;
|
|
72
|
+
return store.get(id);
|
|
73
|
+
}).pipe(Effect.flatMap((a) => a ? Effect.asSome(Effect.orDie(decode(a))) : Effect.succeedNone));
|
|
74
|
+
const [initialState, handlers] = yield* build(load);
|
|
75
|
+
const handlerMap = new Map([
|
|
76
|
+
initialStateKey,
|
|
77
|
+
initialState,
|
|
78
|
+
]);
|
|
79
|
+
for (const [tag, handler] of Object.entries(handlers)) {
|
|
80
|
+
handlerMap.set(handlerKey(tag), (options) => Rpc.wrapMap(handler(options), flow(Effect.tap(([state]) => Effect.flatMap(encode(state), (a) => store.set(currentId, a, undefined))), Effect.provideContext(services))));
|
|
81
|
+
}
|
|
82
|
+
return Context.makeUnsafe(handlerMap);
|
|
83
|
+
})));
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
const initialStateKey = `effect-genserver/GenServer/InitialState`;
|
|
87
|
+
const handlerKey = (tag) => `effect-genserver/GenServer/Handler/${tag}`;
|
|
88
|
+
/**
|
|
89
|
+
* @since 1.0.0
|
|
90
|
+
* @category Handlers
|
|
91
|
+
*/
|
|
92
|
+
export const makeHandlers = Effect.fnUntraced(function* (schema, layer) {
|
|
93
|
+
const handlers = new Map();
|
|
94
|
+
const scope = yield* Effect.scope;
|
|
95
|
+
const startLatch = Latch.makeUnsafe(false);
|
|
96
|
+
let started = false;
|
|
97
|
+
const sendSemaphore = Semaphore.makeUnsafe(1);
|
|
98
|
+
const stateChanges = RpcStateChanges(schema);
|
|
99
|
+
const sendDiscard = (tag, payload) => {
|
|
100
|
+
const eff = started
|
|
101
|
+
? sendDiscardImpl(tag, payload)
|
|
102
|
+
: startLatch.whenOpen(sendDiscardImpl(tag, payload));
|
|
103
|
+
return eff.pipe(Effect.forkIn(scope), Effect.asVoid);
|
|
104
|
+
};
|
|
105
|
+
const sendDiscardImpl = (tag, payload) => Effect.suspend(() => {
|
|
106
|
+
const entry = handlers.get(tag);
|
|
107
|
+
if (!entry) {
|
|
108
|
+
return Effect.void;
|
|
109
|
+
}
|
|
110
|
+
const result = entry.handler({
|
|
111
|
+
payload,
|
|
112
|
+
context: Context.empty(),
|
|
113
|
+
});
|
|
114
|
+
return Rpc.isWrapper(result) ? result.value : result;
|
|
115
|
+
});
|
|
116
|
+
const services = yield* Layer.build(layer).pipe(Effect.provideService(SendDiscard, sendDiscard));
|
|
117
|
+
const state = MutableRef.make(services.mapUnsafe.get(initialStateKey));
|
|
118
|
+
const pubsub = yield* PubSub.unbounded({
|
|
119
|
+
replay: 1,
|
|
120
|
+
});
|
|
121
|
+
PubSub.publishUnsafe(pubsub, state.current);
|
|
122
|
+
handlers.set(stateChanges._tag, {
|
|
123
|
+
rpc: stateChanges,
|
|
124
|
+
handler: (_) => Stream.fromPubSub(pubsub),
|
|
125
|
+
});
|
|
126
|
+
for (const rpc of schema.protocol.requests.values()) {
|
|
127
|
+
const handler = services.mapUnsafe.get(handlerKey(rpc._tag));
|
|
128
|
+
handlers.set(rpc._tag, {
|
|
129
|
+
rpc: rpc,
|
|
130
|
+
handler: (options) => Rpc.wrapMap(handler({
|
|
131
|
+
state: state.current,
|
|
132
|
+
payload: options.payload,
|
|
133
|
+
context: options.context,
|
|
134
|
+
}), (effect) => pipe(effect, Effect.map(([nextState, result]) => {
|
|
135
|
+
if (nextState !== state.current) {
|
|
136
|
+
MutableRef.set(state, nextState);
|
|
137
|
+
PubSub.publishUnsafe(pubsub, nextState);
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}), sendSemaphore.withPermits(1))),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
startLatch.openUnsafe();
|
|
144
|
+
started = true;
|
|
145
|
+
return { handlers, state, pubsub };
|
|
146
|
+
});
|
|
147
|
+
/**
|
|
148
|
+
* @since 1.0.0
|
|
149
|
+
* @category RpcServer
|
|
150
|
+
*/
|
|
151
|
+
export const RpcStateChanges = (server) => Rpc.make("GenServerChanges", {
|
|
152
|
+
success: server.stateSchema,
|
|
153
|
+
stream: true,
|
|
154
|
+
});
|
|
155
|
+
/**
|
|
156
|
+
* @since 1.0.0
|
|
157
|
+
* @category Actor
|
|
158
|
+
*/
|
|
159
|
+
export const makeActor = Effect.fnUntraced(function* (schema, layer, options) {
|
|
160
|
+
const requestContext = options?.requestContext ?? Context.empty();
|
|
161
|
+
const { handlers, state, pubsub } = yield* makeHandlers(schema, layer);
|
|
162
|
+
const send = (tag, payload_) => {
|
|
163
|
+
const entry = handlers.get(tag);
|
|
164
|
+
if (!entry) {
|
|
165
|
+
return Effect.die(`Unknown tag: ${tag}`);
|
|
166
|
+
}
|
|
167
|
+
const effectOrWrap = entry.handler({
|
|
168
|
+
payload: payload_ !== undefined
|
|
169
|
+
? entry.rpc.payloadSchema.make(payload_)
|
|
170
|
+
: undefined,
|
|
171
|
+
context: requestContext,
|
|
172
|
+
});
|
|
173
|
+
return Rpc.isWrapper(effectOrWrap) ? effectOrWrap.value : effectOrWrap;
|
|
174
|
+
};
|
|
175
|
+
return identity({
|
|
176
|
+
changes: Stream.fromPubSub(pubsub),
|
|
177
|
+
state,
|
|
178
|
+
send: send,
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
//# sourceMappingURL=GenServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenServer.js","sourceRoot":"","sources":["../src/GenServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Rpc from "effect/unstable/rpc/Rpc";
|
|
5
|
+
import type * as Schema from "effect/Schema";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import * as Context from "effect/Context";
|
|
8
|
+
import type * as RpcMessage from "effect/unstable/rpc/RpcMessage";
|
|
9
|
+
import type * as Headers from "effect/unstable/http/Headers";
|
|
10
|
+
import * as GenServer from "./GenServer.ts";
|
|
11
|
+
/**
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
* @category RpcServer
|
|
14
|
+
*/
|
|
15
|
+
export declare const toRpcHandlers: <State extends Schema.Top, Rpcs extends Rpc.Any, E, R>(schema: GenServer.GenServer<State, Rpcs>, layer: Layer.Layer<GenServer.ToHandler<Rpcs> | GenServer.InitialState, E, R>) => Layer.Layer<Rpc.ToHandler<Rpcs> | Rpc.Handler<"GenServerChanges">, E, Exclude<R, GenServer.SendDiscard>>;
|
|
16
|
+
declare const RpcContext_base: Context.ServiceClass<RpcContext, "effect-genserver/RpcGenServer/RpcContext", {
|
|
17
|
+
readonly client: Rpc.ServerClient;
|
|
18
|
+
readonly requestId: RpcMessage.RequestId;
|
|
19
|
+
readonly headers: Headers.Headers;
|
|
20
|
+
readonly rpc: Rpc.AnyWithProps;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* @since 1.0.0
|
|
24
|
+
* @category RpcServer
|
|
25
|
+
*/
|
|
26
|
+
export declare class RpcContext extends RpcContext_base {
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=RpcGenServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcGenServer.d.ts","sourceRoot":"","sources":["../src/RpcGenServer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAEnD,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,UAAU,MAAM,gCAAgC,CAAA;AACjE,OAAO,KAAK,KAAK,OAAO,MAAM,8BAA8B,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,KAAK,SAAS,MAAM,CAAC,GAAG,EACxB,IAAI,SAAS,GAAG,CAAC,GAAG,EACpB,CAAC,EACD,CAAC,EAED,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EACxC,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3E,KAAK,CAAC,KAAK,CACZ,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,EACrD,CAAC,EACD,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAuBhC,CAAA;;qBASkB,GAAG,CAAC,YAAY;wBACb,UAAU,CAAC,SAAS;sBACtB,OAAO,CAAC,OAAO;kBACnB,GAAG,CAAC,YAAY;;AAVlC;;;GAGG;AACH,qBAAa,UAAW,SAAQ,eAQe;CAAG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import * as Context from "effect/Context";
|
|
4
|
+
import * as GenServer from "./GenServer.js";
|
|
5
|
+
/**
|
|
6
|
+
* @since 1.0.0
|
|
7
|
+
* @category RpcServer
|
|
8
|
+
*/
|
|
9
|
+
export const toRpcHandlers = (schema, layer) => Layer.effectContext(Effect.gen(function* () {
|
|
10
|
+
const { handlers } = yield* GenServer.makeHandlers(schema, layer);
|
|
11
|
+
const contextMap = new Map();
|
|
12
|
+
const services = yield* Effect.context();
|
|
13
|
+
for (const { rpc, handler } of handlers.values()) {
|
|
14
|
+
contextMap.set(rpc.key, {
|
|
15
|
+
_: null,
|
|
16
|
+
tag: rpc._tag,
|
|
17
|
+
context: services,
|
|
18
|
+
handler: (payload, options) => handler({
|
|
19
|
+
payload,
|
|
20
|
+
context: RpcContext.context(options),
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return Context.makeUnsafe(contextMap);
|
|
25
|
+
}));
|
|
26
|
+
/**
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
* @category RpcServer
|
|
29
|
+
*/
|
|
30
|
+
export class RpcContext extends Context.Service()("effect-genserver/RpcGenServer/RpcContext") {
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=RpcGenServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcGenServer.js","sourceRoot":"","sources":["../src/RpcGenServer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAGzC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAM3B,MAAwC,EACxC,KAA4E,EAK5E,EAAE,CACF,KAAK,CAAC,aAAa,CACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAA;IACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAExC,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;YACtB,CAAC,EAAE,IAAW;YACd,GAAG,EAAE,GAAG,CAAC,IAAI;YACb,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAC5B,OAAO,CAAC;gBACN,OAAO;gBACP,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,OAAc,CAAC;aAC5C,CAAQ;SACZ,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AACvC,CAAC,CAAC,CACH,CAAA;AAEH;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,OAAO,CAAC,OAAO,EAQ5C,CAAC,0CAA0C,CAAC;CAAG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
export * as AtomGenServer from "./AtomGenServer.ts";
|
|
5
|
+
/**
|
|
6
|
+
* @since 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
export * as ClusterGenServer from "./ClusterGenServer.ts";
|
|
9
|
+
/**
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export * as GenServer from "./GenServer.ts";
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
export * as RpcGenServer from "./RpcGenServer.ts";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
export * as AtomGenServer from "./AtomGenServer.js";
|
|
5
|
+
/**
|
|
6
|
+
* @since 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
export * as ClusterGenServer from "./ClusterGenServer.js";
|
|
9
|
+
/**
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export * as GenServer from "./GenServer.js";
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
export * as RpcGenServer from "./RpcGenServer.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
|