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 ADDED
@@ -0,0 +1,3 @@
1
+ # effect-genserver
2
+
3
+ Because I miss elixir
@@ -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"}
@@ -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"}