liminal 0.17.14 → 0.17.16
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/Actor.ts +22 -34
- package/ActorHandle.ts +34 -0
- package/ActorNamespace.ts +188 -0
- package/ActorRuntime.ts +449 -0
- package/ActorTransport.ts +8 -6
- package/Audition.ts +87 -40
- package/BrowserActorNamespace.ts +257 -0
- package/CHANGELOG.md +17 -0
- package/Client.ts +374 -197
- package/ClientDirectory.ts +71 -49
- package/ClientHandle.ts +9 -7
- package/ClientHandleEncoders.ts +15 -0
- package/Fn.ts +94 -0
- package/Method.ts +11 -21
- package/Protocol.ts +44 -36
- package/Reducer.ts +22 -0
- package/Tracing.ts +45 -0
- package/dist/Actor.d.ts +3 -5
- package/dist/Actor.js +5 -9
- package/dist/Actor.js.map +1 -1
- package/dist/ActorHandle.d.ts +12 -0
- package/dist/ActorHandle.js +4 -0
- package/dist/ActorHandle.js.map +1 -0
- package/dist/ActorNamespace.d.ts +25 -0
- package/dist/ActorNamespace.js +60 -0
- package/dist/ActorNamespace.js.map +1 -0
- package/dist/ActorRuntime.d.ts +20 -0
- package/dist/ActorRuntime.js +210 -0
- package/dist/ActorRuntime.js.map +1 -0
- package/dist/ActorTransport.d.ts +5 -4
- package/dist/Audition.d.ts +16 -9
- package/dist/Audition.js +25 -9
- package/dist/Audition.js.map +1 -1
- package/dist/BrowserActorNamespace.d.ts +39 -0
- package/dist/BrowserActorNamespace.js +134 -0
- package/dist/BrowserActorNamespace.js.map +1 -0
- package/dist/Client.d.ts +26 -16
- package/dist/Client.js +186 -109
- package/dist/Client.js.map +1 -1
- package/dist/ClientDirectory.d.ts +15 -7
- package/dist/ClientDirectory.js +32 -23
- package/dist/ClientDirectory.js.map +1 -1
- package/dist/ClientHandle.d.ts +5 -4
- package/dist/ClientHandleEncoders.d.ts +7 -0
- package/dist/ClientHandleEncoders.js +2 -0
- package/dist/ClientHandleEncoders.js.map +1 -0
- package/dist/Fn.d.ts +24 -0
- package/dist/Fn.js +2 -0
- package/dist/Fn.js.map +1 -0
- package/dist/Method.d.ts +9 -14
- package/dist/Method.js +0 -1
- package/dist/Method.js.map +1 -1
- package/dist/Protocol.d.ts +19 -22
- package/dist/Protocol.js +20 -15
- package/dist/Protocol.js.map +1 -1
- package/dist/Reducer.d.ts +11 -0
- package/dist/Reducer.js +2 -0
- package/dist/Reducer.js.map +1 -0
- package/dist/Tracing.d.ts +37 -0
- package/dist/Tracing.js +33 -0
- package/dist/Tracing.js.map +1 -0
- package/dist/errors.d.ts +0 -4
- package/dist/errors.js.map +1 -1
- package/dist/experimental/L/append.js +1 -1
- package/dist/experimental/L/append.js.map +1 -1
- package/dist/experimental/L/history.js +1 -1
- package/dist/experimental/L/history.js.map +1 -1
- package/dist/experimental/TaggedTemplateFunction.js +1 -1
- package/dist/experimental/TaggedTemplateFunction.js.map +1 -1
- package/dist/index.common.d.ts +12 -0
- package/dist/index.common.js +13 -0
- package/dist/index.common.js.map +1 -0
- package/dist/index.d.ts +4 -11
- package/dist/index.js +4 -11
- package/dist/index.js.map +1 -1
- package/dist/index.non-workerd.d.ts +1 -0
- package/dist/index.non-workerd.js +2 -0
- package/dist/index.non-workerd.js.map +1 -0
- package/dist/package.json +20 -19
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/errors.ts +0 -6
- package/experimental/L/append.ts +1 -1
- package/experimental/L/history.ts +1 -1
- package/experimental/TaggedTemplateFunction.ts +1 -1
- package/index.common.ts +12 -0
- package/index.non-workerd.ts +1 -0
- package/index.ts +4 -11
- package/package.json +11 -23
- package/tsconfig.json +1 -1
- package/vitest.config.ts +7 -0
- package/Accumulator.ts +0 -103
- package/F.ts +0 -10
- package/_diagnostic.ts +0 -3
- package/_util/Mutex.ts +0 -13
- package/_util/schema.ts +0 -7
- package/browser/BrowserActorNamespace.ts +0 -213
- package/browser/index.ts +0 -1
- package/dist/Accumulator.d.ts +0 -22
- package/dist/Accumulator.js +0 -37
- package/dist/Accumulator.js.map +0 -1
- package/dist/F.d.ts +0 -4
- package/dist/F.js +0 -2
- package/dist/F.js.map +0 -1
- package/dist/_diagnostic.d.ts +0 -4
- package/dist/_diagnostic.js +0 -3
- package/dist/_diagnostic.js.map +0 -1
- package/dist/_util/Mutex.d.ts +0 -7
- package/dist/_util/Mutex.js +0 -9
- package/dist/_util/Mutex.js.map +0 -1
- package/dist/_util/schema.d.ts +0 -4
- package/dist/_util/schema.js +0 -5
- package/dist/_util/schema.js.map +0 -1
- package/dist/browser/BrowserActorNamespace.d.ts +0 -16
- package/dist/browser/BrowserActorNamespace.js +0 -112
- package/dist/browser/BrowserActorNamespace.js.map +0 -1
- package/dist/browser/index.d.ts +0 -1
- package/dist/browser/index.js +0 -2
- package/dist/browser/index.js.map +0 -1
- package/dist/workerd/WorkerdActorNamespace.d.ts +0 -25
- package/dist/workerd/WorkerdActorNamespace.js +0 -146
- package/dist/workerd/WorkerdActorNamespace.js.map +0 -1
- package/dist/workerd/index.d.ts +0 -1
- package/dist/workerd/index.js +0 -2
- package/dist/workerd/index.js.map +0 -1
- package/workerd/WorkerdActorNamespace.ts +0 -362
- package/workerd/index.ts +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActorHandle.js","sourceRoot":"","sources":["../ActorHandle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Layer, Schema as S, Context, Exit } from "effect";
|
|
2
|
+
import { Env } from "effect-workerd";
|
|
3
|
+
import { type TopFromString } from "liminal-util/schema";
|
|
4
|
+
import type { Actor } from "./Actor.ts";
|
|
5
|
+
import type { ActorHandle } from "./ActorHandle.ts";
|
|
6
|
+
import type { Methods } from "./Method.ts";
|
|
7
|
+
import type { ProtocolDefinition } from "./Protocol.ts";
|
|
8
|
+
export interface ActorNamespaceDefinition<Internal extends Methods, ActorSelf, ActorId extends string, Name extends TopFromString, AttachmentFields extends S.Struct.Fields, ClientSelf, ClientId extends string, D extends ProtocolDefinition> {
|
|
9
|
+
readonly binding: string;
|
|
10
|
+
readonly internal: Internal;
|
|
11
|
+
readonly actor: Actor<ActorSelf, ActorId, Name, AttachmentFields, ClientSelf, ClientId, D>;
|
|
12
|
+
}
|
|
13
|
+
export interface ActorNamespace<NamespaceSelf, NamespaceId extends string, Internal extends Methods, ActorSelf, ActorId extends string, Name extends TopFromString, AttachmentFields extends S.Struct.Fields, ClientSelf, ClientId extends string, D extends ProtocolDefinition> {
|
|
14
|
+
new (_: never): Context.ServiceClass.Shape<NamespaceId, DurableObjectNamespace<Rpc.DurableObjectBranded & ActorNamespace.MakeRpc<Internal, D>>>;
|
|
15
|
+
readonly definition: ActorNamespaceDefinition<Methods, ActorSelf, ActorId, Name, AttachmentFields, ClientSelf, ClientId, D>;
|
|
16
|
+
readonly bind: (name: Name["Type"]) => ActorHandle<NamespaceSelf, Internal, Name, AttachmentFields, D>;
|
|
17
|
+
readonly layer: Layer.Layer<NamespaceSelf, S.SchemaError, Env>;
|
|
18
|
+
}
|
|
19
|
+
export declare namespace ActorNamespace {
|
|
20
|
+
type MakeRpc<Internal extends Methods, D extends ProtocolDefinition> = {
|
|
21
|
+
rpc: <K extends keyof Internal>(method: K, payload: Internal[K]["payload"]["Type"]) => Promise<Exit.Exit<Internal[K]["success"]["Type"], Internal[K]["failure"]["Type"]>>;
|
|
22
|
+
proxySendAll<K extends keyof D["events"]>(event: K, payload: S.Struct<D["events"][K]>["Type"]): void;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare const Service: <NamespaceSelf>() => <NamespaceId extends string, Internal extends Methods, ActorSelf, ActorId extends string, Name extends TopFromString, AttachmentFields extends S.Struct.Fields, ClientSelf, ClientId extends string, D extends ProtocolDefinition>(id: NamespaceId, definition: ActorNamespaceDefinition<Internal, ActorSelf, ActorId, Name, AttachmentFields, ClientSelf, ClientId, D>) => ActorNamespace<NamespaceSelf, NamespaceId, Internal, ActorSelf, ActorId, Name, AttachmentFields, ClientSelf, ClientId, D>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Layer, Effect, Schema as S, Context, flow, String, Array, Encoding, Exit } from "effect";
|
|
2
|
+
import { Binding, Env, NativeRequest } from "effect-workerd";
|
|
3
|
+
import { SecWebSocketProtocol, close } from "effect-workerd/socket_util";
|
|
4
|
+
import { HttpServerResponse, HttpTraceContext } from "effect/unstable/http";
|
|
5
|
+
import * as Boundary from "liminal-util/Boundary";
|
|
6
|
+
import { encodeJsonString } from "liminal-util/schema";
|
|
7
|
+
export const Service = () => (id, definition) => {
|
|
8
|
+
const { binding, actor } = definition;
|
|
9
|
+
const { definition: { name: Name, client: { key: clientId, protocol: P }, attachments: AttachmentFields, }, } = actor;
|
|
10
|
+
const tag = Context.Service()(id);
|
|
11
|
+
const encodeName = S.encodeEffect(Name);
|
|
12
|
+
const Attachments = S.Struct(AttachmentFields);
|
|
13
|
+
const encodeAttachmentsString = encodeJsonString(Attachments);
|
|
14
|
+
const encodeAuditionFailure = encodeJsonString(P.Audition.Failure);
|
|
15
|
+
const bind = (name) => {
|
|
16
|
+
const getStub = Effect.gen(function* () {
|
|
17
|
+
const namespace = yield* tag;
|
|
18
|
+
const nameEncoded = yield* encodeName(name);
|
|
19
|
+
return namespace.getByName(nameEncoded);
|
|
20
|
+
});
|
|
21
|
+
const upgrade = (attachments) => Effect.gen({ self: this }, function* () {
|
|
22
|
+
const request = yield* NativeRequest.NativeRequest;
|
|
23
|
+
const protocols = yield* Effect.fromNullishOr(request.headers.get(SecWebSocketProtocol)).pipe(Effect.map(flow(String.split(","), Array.map(String.trim))));
|
|
24
|
+
const liminalTokenI = yield* Array.findFirstIndex(protocols, (v) => v === "liminal").pipe(Effect.fromOption);
|
|
25
|
+
const liminalClientId = yield* Effect.fromNullishOr(protocols[liminalTokenI + 1]);
|
|
26
|
+
const requestClientId = yield* Effect.fromNullishOr(protocols[liminalTokenI + 2]).pipe(Effect.flatMap((v) => Encoding.decodeBase64UrlString(v).pipe(Effect.fromResult)));
|
|
27
|
+
if (requestClientId !== clientId) {
|
|
28
|
+
return close(yield* encodeAuditionFailure({
|
|
29
|
+
_tag: "Audition.Failure",
|
|
30
|
+
expected: clientId,
|
|
31
|
+
actual: requestClientId,
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
const url = new URL(request.url);
|
|
35
|
+
url.searchParams.set("__liminal_attachments", yield* encodeAttachmentsString(attachments));
|
|
36
|
+
url.searchParams.set("__liminal_client_id", liminalClientId);
|
|
37
|
+
const actorRequest = new Request(url, request);
|
|
38
|
+
const traceHeaders = yield* Effect.currentSpan.pipe(Effect.map(HttpTraceContext.toHeaders));
|
|
39
|
+
for (const [key, value] of Object.entries(traceHeaders)) {
|
|
40
|
+
actorRequest.headers.set(key, value);
|
|
41
|
+
}
|
|
42
|
+
const stub = yield* getStub;
|
|
43
|
+
return yield* Effect.promise(() => stub.fetch(actorRequest)).pipe(Effect.map(HttpServerResponse.raw));
|
|
44
|
+
}).pipe(Boundary.span("upgrade", import.meta.url, { kind: "client" }));
|
|
45
|
+
const call = Effect.fnUntraced(function* (method, payload) {
|
|
46
|
+
const stub = yield* getStub;
|
|
47
|
+
const exit = yield* Effect.promise(() => stub.rpc(method, payload));
|
|
48
|
+
return yield* exit;
|
|
49
|
+
}, Boundary.span("call", import.meta.url));
|
|
50
|
+
// TODO:
|
|
51
|
+
const proxySendAll = Effect.fnUntraced(function* (event, payload) {
|
|
52
|
+
const stub = yield* getStub;
|
|
53
|
+
yield* Effect.promise(() => stub.proxySendAll(event, payload));
|
|
54
|
+
}, Boundary.span("proxySendAll", import.meta.url));
|
|
55
|
+
return { upgrade, call, proxySendAll };
|
|
56
|
+
};
|
|
57
|
+
const layer = Binding.layer(tag, ["idFromName", "idFromString", "newUniqueId", "get", "getByName"])(binding);
|
|
58
|
+
return Object.assign(tag, { definition, bind, layer });
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=ActorNamespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActorNamespace.js","sourceRoot":"","sources":["../ActorNamespace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DurableObject } from "cloudflare:workers";
|
|
2
|
+
import { Layer, Effect, Scope, Schema as S, Duration } from "effect";
|
|
3
|
+
import { Env } from "effect-workerd";
|
|
4
|
+
import { HttpClient } from "effect/unstable/http";
|
|
5
|
+
import { type TopFromString } from "liminal-util/schema";
|
|
6
|
+
import type { ActorNamespace } from "./ActorNamespace.ts";
|
|
7
|
+
import type { Handlers, Methods } from "./Method.ts";
|
|
8
|
+
import type { ProtocolDefinition } from "./Protocol.ts";
|
|
9
|
+
export interface ActorRuntimeDefinition<NamespaceSelf, NamespaceId extends string, Internal extends Methods, ActorSelf, ActorId extends string, Name extends TopFromString, AttachmentFields extends S.Struct.Fields, ClientSelf, ClientId extends string, D extends ProtocolDefinition, PreludeROut, PreludeE, RunROut, RunE> {
|
|
10
|
+
readonly ""?: this["namespace"]["definition"]["actor"]["definition"]["client"]["protocol"];
|
|
11
|
+
readonly namespace: ActorNamespace<NamespaceSelf, NamespaceId, Internal, ActorSelf, ActorId, Name, AttachmentFields, ClientSelf, ClientId, D>;
|
|
12
|
+
readonly prelude: Layer.Layer<PreludeROut | NonNullable<this[""]>["F"]["Payload"]["DecodingServices"] | NonNullable<this[""]>["F"]["Success"]["EncodingServices"] | NonNullable<this[""]>["F"]["Failure"]["EncodingServices"] | NonNullable<this[""]>["Event"]["EncodingServices"] | S.Struct<AttachmentFields>["DecodingServices"] | S.Struct<AttachmentFields>["EncodingServices"] | Name["EncodingServices"] | Name["DecodingServices"], PreludeE, HttpClient.HttpClient | Env>;
|
|
13
|
+
readonly layer: Layer.Layer<RunROut, RunE, ActorSelf | HttpClient.HttpClient | Env | PreludeROut>;
|
|
14
|
+
readonly external: Handlers<D["external"], ActorSelf | HttpClient.HttpClient | Env | PreludeROut | RunROut | Scope.Scope>;
|
|
15
|
+
readonly internal: Handlers<Internal, ActorSelf | HttpClient.HttpClient | PreludeROut | RunROut | Scope.Scope>;
|
|
16
|
+
readonly hydrate: Effect.Effect<S.Struct<D["state"]>["Type"], never, ActorSelf | HttpClient.HttpClient | Env | PreludeROut | RunROut | Scope.Scope>;
|
|
17
|
+
readonly onDisconnect: Effect.Effect<void, never, ActorSelf | HttpClient.HttpClient | Env | PreludeROut | RunROut | Scope.Scope>;
|
|
18
|
+
readonly hibernation?: Duration.Input | undefined;
|
|
19
|
+
}
|
|
20
|
+
export declare const make: <NamespaceSelf, NamespaceId extends string, Internal extends Methods, ActorSelf, ActorId extends string, Name extends TopFromString, AttachmentFields extends S.Struct.Fields, ClientSelf, ClientId extends string, D extends ProtocolDefinition, PreludeROut, PreludeE, RunROut, RunE>(definition: ActorRuntimeDefinition<NamespaceSelf, NamespaceId, Internal, ActorSelf, ActorId, Name, AttachmentFields, ClientSelf, ClientId, D, PreludeROut, PreludeE, RunROut, RunE>) => new (state: DurableObjectState<{}>, env: Cloudflare.Env) => DurableObject;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { DurableObject } from "cloudflare:workers";
|
|
2
|
+
import { Layer, Effect, Scope, Schema as S, Context, ManagedRuntime, ConfigProvider, Duration, flow, Option, Tracer, pipe, Exit, } from "effect";
|
|
3
|
+
import { DoState } from "effect-workerd";
|
|
4
|
+
import { Env } from "effect-workerd";
|
|
5
|
+
import { Clock } from "effect-workerd/platform";
|
|
6
|
+
import { SecWebSocketProtocol } from "effect-workerd/socket_util";
|
|
7
|
+
import { Headers, FetchHttpClient, HttpClient, HttpTraceContext } from "effect/unstable/http";
|
|
8
|
+
import * as Boundary from "liminal-util/Boundary";
|
|
9
|
+
import { encodeJsonString, decodeJsonString } from "liminal-util/schema";
|
|
10
|
+
import * as ClientDirectory from "./ClientDirectory.js";
|
|
11
|
+
import * as Tracing from "./Tracing.js";
|
|
12
|
+
import { sessionAttributes, SessionId, sessionLink } from "./Tracing.js";
|
|
13
|
+
export const make = (definition) => {
|
|
14
|
+
const { hibernation, prelude, external, layer, hydrate, onDisconnect, internal, namespace: { definition: { actor }, }, } = definition;
|
|
15
|
+
const { definition: { name: Name, client: { protocol: P }, attachments: AttachmentFields, }, } = actor;
|
|
16
|
+
const Attachments = S.Struct(AttachmentFields);
|
|
17
|
+
const SocketAttachment = S.Struct({
|
|
18
|
+
attachments: S.toCodecJson(Attachments),
|
|
19
|
+
session: Tracing.Session,
|
|
20
|
+
});
|
|
21
|
+
const encodeSocketAttachment = S.encodeEffect(SocketAttachment);
|
|
22
|
+
const decodeSocketAttachment = S.decodeUnknownEffect(SocketAttachment);
|
|
23
|
+
const decodeAttachmentsString = decodeJsonString(Attachments);
|
|
24
|
+
const encodeAuditionSuccess = encodeJsonString(P.Audition.Success);
|
|
25
|
+
const decodeClient = decodeJsonString(P.Client);
|
|
26
|
+
const encodeFSuccess = encodeJsonString(P.F.Success);
|
|
27
|
+
const encodeFFailure = encodeJsonString(P.F.Failure);
|
|
28
|
+
const encodeEvent = encodeJsonString(P.Event);
|
|
29
|
+
const transport = {
|
|
30
|
+
key: ({ socket }) => socket,
|
|
31
|
+
send: ({ socket, session }, event) => {
|
|
32
|
+
const { _tag } = event.event;
|
|
33
|
+
return Effect.gen(function* () {
|
|
34
|
+
const trace = yield* Tracing.currentTrace;
|
|
35
|
+
const encoded = yield* encodeEvent({ ...event, ...(trace && { trace }) }).pipe(Effect.catchTags({
|
|
36
|
+
SchemaError: Effect.die,
|
|
37
|
+
}));
|
|
38
|
+
// @effect-diagnostics-next-line tryCatchInEffectGen:off
|
|
39
|
+
try {
|
|
40
|
+
socket.send(encoded);
|
|
41
|
+
// oxlint-disable-next-line no-unused-vars
|
|
42
|
+
}
|
|
43
|
+
catch (_e) { }
|
|
44
|
+
}).pipe(Boundary.span("send", import.meta.url, {
|
|
45
|
+
attributes: { _tag, ...sessionAttributes(session) },
|
|
46
|
+
kind: "producer",
|
|
47
|
+
links: [sessionLink(session)],
|
|
48
|
+
}));
|
|
49
|
+
},
|
|
50
|
+
close: ({ socket }) => Effect.sync(() => socket.close(1000)),
|
|
51
|
+
snapshot: ({ socket, session }, attachments) => encodeSocketAttachment({ attachments, session }).pipe(Effect.catchTags({
|
|
52
|
+
SchemaError: Effect.die,
|
|
53
|
+
}), Effect.andThen((v) => Effect.sync(() => socket.serializeAttachment(v)))),
|
|
54
|
+
};
|
|
55
|
+
class NameDecoded extends Context.Service()("liminal/ActorNamespace/NameDecoded") {
|
|
56
|
+
}
|
|
57
|
+
return class extends DurableObject {
|
|
58
|
+
run;
|
|
59
|
+
directory = ClientDirectory.make(actor, { transport });
|
|
60
|
+
provideActor = (currentClient) => flow(Effect.provide(Layer.provideMerge(layer, Effect.gen({ self: this }, function* () {
|
|
61
|
+
const name = yield* NameDecoded;
|
|
62
|
+
return Layer.succeed(actor, {
|
|
63
|
+
name,
|
|
64
|
+
clients: this.directory.handles,
|
|
65
|
+
currentClient,
|
|
66
|
+
});
|
|
67
|
+
}).pipe(Layer.unwrap))), Effect.scoped);
|
|
68
|
+
constructor(state, env) {
|
|
69
|
+
super(state, env);
|
|
70
|
+
if (hibernation) {
|
|
71
|
+
Option.andThen(Duration.fromInput(hibernation), flow(Duration.toMillis, (timeout) => state.setHibernatableWebSocketEventTimeout(timeout)));
|
|
72
|
+
}
|
|
73
|
+
const Live = Layer.mergeAll(FetchHttpClient.layer, Layer.succeed(DoState.DoState, state), Layer.succeed(Env, env), Layer.effect(NameDecoded, S.decodeUnknownEffect(Name)(state.id.name))).pipe(Layer.provideMerge(prelude.pipe(Layer.provideMerge(Layer.mergeAll(FetchHttpClient.layer, ConfigProvider.layer(ConfigProvider.fromUnknown(env)), Layer.succeed(Env, env))))), Layer.provideMerge(Clock.layer));
|
|
74
|
+
const HydrateClientsLive = Effect.gen({ self: this }, function* () {
|
|
75
|
+
for (const socket of state.getWebSockets()) {
|
|
76
|
+
const { attachments, session } = yield* decodeSocketAttachment(socket.deserializeAttachment());
|
|
77
|
+
yield* this.directory
|
|
78
|
+
.register({ socket, session }, attachments)
|
|
79
|
+
.pipe(Effect.linkSpans(Tracer.externalSpan(session.trace), sessionLink(session).attributes));
|
|
80
|
+
}
|
|
81
|
+
}).pipe(Boundary.span("hydrate", import.meta.url), Layer.effectDiscard);
|
|
82
|
+
const runtime = ManagedRuntime.make(HydrateClientsLive.pipe(Layer.provideMerge(Live), Boundary.layer("actor", import.meta.url)));
|
|
83
|
+
this.run = (effect) => Effect.onError(effect, Effect.logError).pipe(runtime.runPromise);
|
|
84
|
+
}
|
|
85
|
+
fetch(request) {
|
|
86
|
+
return Effect.gen({ self: this }, function* () {
|
|
87
|
+
const url = new URL(request.url);
|
|
88
|
+
const attachments = yield* decodeAttachmentsString(url.searchParams.get("__liminal_attachments"));
|
|
89
|
+
const clientId = yield* Effect.fromNullishOr(url.searchParams.get("__liminal_client_id"));
|
|
90
|
+
const { 0: webSocket, 1: server } = new WebSocketPair();
|
|
91
|
+
const state = yield* DoState.DoState;
|
|
92
|
+
const session = {
|
|
93
|
+
id: SessionId.make(clientId),
|
|
94
|
+
trace: yield* Effect.currentSpan.pipe(Effect.map(Tracing.toTraceEnvelope)),
|
|
95
|
+
};
|
|
96
|
+
const currentClient = yield* this.directory.register({ socket: server, session }, attachments);
|
|
97
|
+
state.acceptWebSocket(server);
|
|
98
|
+
const initial = yield* hydrate.pipe(this.provideActor(currentClient), Boundary.span("hydrate", import.meta.url, {
|
|
99
|
+
attributes: sessionAttributes(session),
|
|
100
|
+
links: [sessionLink(session)],
|
|
101
|
+
}));
|
|
102
|
+
server.send(yield* encodeAuditionSuccess({ _tag: "Audition.Success", initial }));
|
|
103
|
+
return new Response(null, {
|
|
104
|
+
status: 101,
|
|
105
|
+
webSocket,
|
|
106
|
+
headers: { [SecWebSocketProtocol]: "liminal" },
|
|
107
|
+
});
|
|
108
|
+
}).pipe(Boundary.span("fetch", import.meta.url, {
|
|
109
|
+
kind: "server",
|
|
110
|
+
parent: pipe(request.headers, Headers.fromInput, HttpTraceContext.fromHeaders, Option.getOrUndefined),
|
|
111
|
+
}), this.run);
|
|
112
|
+
}
|
|
113
|
+
webSocketMessage(socket, raw) {
|
|
114
|
+
Effect.gen({ self: this }, function* () {
|
|
115
|
+
const { client, handle: currentClient } = yield* this.directory.entry(socket);
|
|
116
|
+
const { session } = client;
|
|
117
|
+
yield* Effect.annotateCurrentSpan(sessionAttributes(session));
|
|
118
|
+
const message = yield* decodeClient(raw instanceof ArrayBuffer ? new TextDecoder().decode(raw) : raw);
|
|
119
|
+
if (message._tag === "Audition.Payload") {
|
|
120
|
+
return yield* Effect.die(undefined);
|
|
121
|
+
}
|
|
122
|
+
if (message._tag === "Disconnect") {
|
|
123
|
+
yield* currentClient.disconnect;
|
|
124
|
+
return yield* onDisconnect.pipe(this.provideActor(currentClient), Boundary.span("disconnect", import.meta.url, {
|
|
125
|
+
attributes: sessionAttributes(session),
|
|
126
|
+
links: [sessionLink(session)],
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
const { id, payload } = message;
|
|
130
|
+
const { _tag, value } = payload;
|
|
131
|
+
const parent = message.trace ? Tracer.externalSpan(message.trace) : undefined;
|
|
132
|
+
const transportSpan = yield* Tracing.parent;
|
|
133
|
+
const links = [
|
|
134
|
+
sessionLink(session),
|
|
135
|
+
...(parent && transportSpan
|
|
136
|
+
? [
|
|
137
|
+
{
|
|
138
|
+
span: transportSpan,
|
|
139
|
+
attributes: {
|
|
140
|
+
"liminal.link": "transport",
|
|
141
|
+
"liminal.transport": "websocket",
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
]
|
|
145
|
+
: []),
|
|
146
|
+
];
|
|
147
|
+
yield* external[_tag](value).pipe(Effect.matchEffect({
|
|
148
|
+
onSuccess: (value) => encodeFSuccess({
|
|
149
|
+
_tag: "F.Success",
|
|
150
|
+
id,
|
|
151
|
+
success: { _tag, value },
|
|
152
|
+
}),
|
|
153
|
+
onFailure: (value) => encodeFFailure({
|
|
154
|
+
_tag: "F.Failure",
|
|
155
|
+
id,
|
|
156
|
+
failure: { _tag, value },
|
|
157
|
+
}),
|
|
158
|
+
}), Effect.andThen((v) => Effect.try({
|
|
159
|
+
try: () => socket.send(v),
|
|
160
|
+
catch: () => { },
|
|
161
|
+
})), this.provideActor(currentClient), Boundary.span("handler", import.meta.url, {
|
|
162
|
+
attributes: { _tag, ...sessionAttributes(session) },
|
|
163
|
+
kind: "server",
|
|
164
|
+
parent,
|
|
165
|
+
links,
|
|
166
|
+
}));
|
|
167
|
+
}).pipe(Boundary.span("socket-message", import.meta.url), this.run);
|
|
168
|
+
}
|
|
169
|
+
webSocketClose(socket, _code, _reason, _wasClean) {
|
|
170
|
+
Effect.gen({ self: this }, function* () {
|
|
171
|
+
const entry = yield* this.directory.entry(socket).pipe(Effect.catchTags({
|
|
172
|
+
NoSuchElementError: () => Effect.undefined,
|
|
173
|
+
}));
|
|
174
|
+
if (!entry) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const { client: { session }, handle: currentClient, } = entry;
|
|
178
|
+
yield* Effect.annotateCurrentSpan(sessionAttributes(session));
|
|
179
|
+
yield* this.directory.unregister(socket);
|
|
180
|
+
yield* onDisconnect.pipe(this.provideActor(currentClient), Boundary.span("disconnect", import.meta.url, {
|
|
181
|
+
attributes: sessionAttributes(session),
|
|
182
|
+
links: [sessionLink(session)],
|
|
183
|
+
}));
|
|
184
|
+
}).pipe(Boundary.span("socket-close", import.meta.url), this.run);
|
|
185
|
+
}
|
|
186
|
+
webSocketError(socket, cause) {
|
|
187
|
+
Effect.gen({ self: this }, function* () {
|
|
188
|
+
const { client: { session }, handle: currentClient, } = yield* this.directory.entry(socket);
|
|
189
|
+
yield* Effect.annotateCurrentSpan(sessionAttributes(session));
|
|
190
|
+
yield* this.directory.unregister(socket);
|
|
191
|
+
yield* onDisconnect.pipe(this.provideActor(currentClient), Boundary.span("disconnect", import.meta.url, {
|
|
192
|
+
attributes: sessionAttributes(session),
|
|
193
|
+
links: [sessionLink(session)],
|
|
194
|
+
}));
|
|
195
|
+
yield* Effect.annotateLogs(Effect.logDebug("SocketErrored"), { cause });
|
|
196
|
+
}).pipe(Boundary.span("socket-error", import.meta.url), this.run);
|
|
197
|
+
}
|
|
198
|
+
async rpc(method, payload) {
|
|
199
|
+
const handler = internal[method];
|
|
200
|
+
return await handler(payload).pipe(this.provideActor(null), Boundary.span("fn-internal", import.meta.url), Effect.exit, this.run);
|
|
201
|
+
}
|
|
202
|
+
async proxySendAll(event, payload) {
|
|
203
|
+
await Effect.gen(function* () {
|
|
204
|
+
const { clients } = yield* actor;
|
|
205
|
+
yield* Effect.forEach(clients, ({ send }) => send(event, payload), { concurrency: "unbounded" });
|
|
206
|
+
}).pipe(this.provideActor(null), Boundary.span("fn-internal", import.meta.url), this.run);
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=ActorRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActorRuntime.js","sourceRoot":"","sources":["../ActorRuntime.ts"],"names":[],"mappings":"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"}
|
package/dist/ActorTransport.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Effect, Schema as S } from "effect";
|
|
2
2
|
import type { Protocol, ProtocolDefinition } from "./Protocol.ts";
|
|
3
|
-
export interface ActorTransport<
|
|
4
|
-
readonly
|
|
5
|
-
readonly
|
|
6
|
-
readonly
|
|
3
|
+
export interface ActorTransport<Key, Client, AttachmentFields extends S.Struct.Fields, D extends ProtocolDefinition> {
|
|
4
|
+
readonly key: (client: Client) => Key;
|
|
5
|
+
readonly send: (client: Client, event: Protocol<D>["Event"]["Type"]) => Effect.Effect<void, never, Protocol<D>["Event"]["EncodingServices"]>;
|
|
6
|
+
readonly close: (client: Client) => Effect.Effect<void>;
|
|
7
|
+
readonly snapshot: (client: Client, attachments: S.Struct<AttachmentFields>["Type"]) => Effect.Effect<void, never, S.Struct<AttachmentFields>["EncodingServices"]>;
|
|
7
8
|
}
|
package/dist/Audition.d.ts
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
|
-
import { Schema as S, Pipeable, Stream } from "effect";
|
|
2
|
-
import type { F } from "./F.ts";
|
|
3
|
-
import type { ProtocolDefinition } from "./Protocol.ts";
|
|
1
|
+
import { Schema as S, Pipeable, Stream, Types } from "effect";
|
|
4
2
|
import * as Client from "./Client.ts";
|
|
5
3
|
import { type ClientError } from "./errors.ts";
|
|
4
|
+
import type { Fn } from "./Fn.ts";
|
|
5
|
+
import type { Methods } from "./Method.ts";
|
|
6
|
+
import type { ProtocolDefinition } from "./Protocol.ts";
|
|
6
7
|
declare const TypeId: "~liminal/Audition";
|
|
7
|
-
export interface Audition<
|
|
8
|
+
export interface Audition<AuditionSelf, State extends S.Union<ReadonlyArray<S.Top>>, External extends Methods, Event> extends Pipeable.Pipeable {
|
|
8
9
|
readonly [TypeId]: typeof TypeId;
|
|
9
|
-
readonly
|
|
10
|
-
readonly
|
|
10
|
+
readonly state: Stream.Stream<State["Type"], ClientError | S.SchemaError, AuditionSelf | State["DecodingServices"]>;
|
|
11
|
+
readonly fn: Fn<AuditionSelf, External>;
|
|
12
|
+
readonly events: Stream.Stream<Event, ClientError | S.SchemaError, AuditionSelf>;
|
|
11
13
|
}
|
|
12
|
-
|
|
14
|
+
type MergeMethods<T extends Methods, U extends Methods> = [keyof T] extends [never] ? U : {
|
|
15
|
+
[K in keyof T & keyof U]: Types.Equals<T[K], U[K]> extends true ? T[K] : never;
|
|
16
|
+
};
|
|
17
|
+
type MergeState<State, D extends ProtocolDefinition> = [State] extends [never] ? S.Union<[S.Struct<D["state"]>]> : State extends S.Union<ReadonlyArray<S.Top>> ? S.Union<[...State["members"], S.Struct<D["state"]>]> : never;
|
|
18
|
+
export declare const empty: Audition<never, never, {}, never>;
|
|
19
|
+
export declare const cycleOn: <Event>(predicate: (event: Event) => boolean) => <AuditionSelf, State extends S.Union<ReadonlyArray<S.Top>>, External extends Methods>(audition: Audition<AuditionSelf, State, External, Event>) => Audition<AuditionSelf, State, External, Event>;
|
|
13
20
|
export declare const add: {
|
|
14
|
-
<ClientSelf, ClientId extends string, ClientD extends ProtocolDefinition>(client: Client.Client<ClientSelf, ClientId, ClientD>): <AuditionSelf,
|
|
15
|
-
<
|
|
21
|
+
<ClientSelf, ClientId extends string, ClientD extends ProtocolDefinition>(client: Client.Client<ClientSelf, ClientId, ClientD>): <AuditionSelf, State extends S.Union<ReadonlyArray<S.Top>> | never, External extends Methods, Event>(audition: Audition<AuditionSelf, State, External, Event>) => Audition<AuditionSelf | ClientSelf, MergeState<State, ClientD>, MergeMethods<External, ClientD["external"]>, Event | ReturnType<typeof S.TaggedUnion<ClientD["events"]>>["Type"]>;
|
|
22
|
+
<AuditionSelf, State extends S.Union<ReadonlyArray<S.Top>> | never, External extends Methods, Event, ClientSelf, ClientId extends string, ClientD extends ProtocolDefinition>(audition: Audition<AuditionSelf, State, External, Event>, client: Client.Client<ClientSelf, ClientId, ClientD>): Audition<AuditionSelf | ClientSelf, MergeState<State, ClientD>, MergeMethods<External, ClientD["external"]>, Event | ReturnType<typeof S.TaggedUnion<ClientD["events"]>>["Type"]>;
|
|
16
23
|
};
|
|
17
24
|
export {};
|
package/dist/Audition.js
CHANGED
|
@@ -1,29 +1,45 @@
|
|
|
1
|
-
import { Schema as S, Pipeable, Stream, Effect, Function } from "effect";
|
|
2
|
-
import { diagnostic } from "./_diagnostic.js";
|
|
1
|
+
import { Schema as S, Pipeable, Stream, Effect, Function, Types } from "effect";
|
|
3
2
|
import * as Client from "./Client.js";
|
|
4
3
|
import { AuditionError } from "./errors.js";
|
|
5
|
-
const { debug, span } = diagnostic("Audition");
|
|
6
4
|
const TypeId = "~liminal/Audition";
|
|
7
5
|
export const empty = {
|
|
8
6
|
[TypeId]: TypeId,
|
|
9
7
|
pipe() {
|
|
10
8
|
return Pipeable.pipeArguments(this, arguments);
|
|
11
9
|
},
|
|
10
|
+
state: Stream.fail(new AuditionError()),
|
|
11
|
+
fn: () => () => new AuditionError(),
|
|
12
12
|
events: Stream.fail(new AuditionError()),
|
|
13
|
-
|
|
13
|
+
};
|
|
14
|
+
export const cycleOn = (predicate) => (audition) => {
|
|
15
|
+
const events = audition.events.pipe(Stream.takeUntil(predicate), Stream.forever);
|
|
16
|
+
const state = audition.state.pipe(Stream.forever);
|
|
17
|
+
return {
|
|
18
|
+
[TypeId]: TypeId,
|
|
19
|
+
pipe() {
|
|
20
|
+
return Pipeable.pipeArguments(this, arguments);
|
|
21
|
+
},
|
|
22
|
+
events,
|
|
23
|
+
fn: audition.fn,
|
|
24
|
+
state,
|
|
25
|
+
};
|
|
14
26
|
};
|
|
15
27
|
export const add = Function.dual(2, (audition, client) => {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
28
|
+
const fn = ((method, ...f) => Effect.fnUntraced(function* (payload) {
|
|
29
|
+
return yield* audition
|
|
30
|
+
.fn(method)(payload)
|
|
31
|
+
.pipe(Effect.catchTag("AuditionError", () => client.fn(method)(payload)));
|
|
32
|
+
}, ...f));
|
|
33
|
+
const events = audition.events.pipe(Stream.catchTag("AuditionError", () => Effect.succeed(client.events).pipe(Stream.unwrap)));
|
|
34
|
+
const state = audition.state.pipe(Stream.catchTag("AuditionError", () => Effect.succeed(client.state).pipe(Stream.unwrap)));
|
|
20
35
|
return {
|
|
21
36
|
[TypeId]: TypeId,
|
|
22
37
|
pipe() {
|
|
23
38
|
return Pipeable.pipeArguments(this, arguments);
|
|
24
39
|
},
|
|
25
40
|
events,
|
|
26
|
-
|
|
41
|
+
fn,
|
|
42
|
+
state,
|
|
27
43
|
};
|
|
28
44
|
});
|
|
29
45
|
//# sourceMappingURL=Audition.js.map
|
package/dist/Audition.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Audition.js","sourceRoot":"","sources":["../Audition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"Audition.js","sourceRoot":"","sources":["../Audition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE/E,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAA;AAK7D,MAAM,MAAM,GAAG,mBAA4B,CAAA;AAuB3C,MAAM,CAAC,MAAM,KAAK,GAAsC;IACtD,CAAC,MAAM,CAAC,EAAE,MAAM;IAChB,IAAI;QACF,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAChD,CAAC;IACD,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC;IACvC,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC;CACzC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAClB,CAAQ,SAAoC,EAAE,EAAE,CAChD,CACE,QAAwD,EACR,EAAE;IAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAEjD,OAAO;QACL,CAAC,MAAM,CAAC,EAAE,MAAM;QAChB,IAAI;YACF,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAChD,CAAC;QACD,MAAM;QACN,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,KAAK;KACN,CAAA;AACH,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,GAAG,GA4BZ,QAAQ,CAAC,IAAI,CACf,CAAC,EACD,CASE,QAAwD,EACxD,MAAoD,EAMpD,EAAE;IACF,MAAM,EAAE,GAAG,CAAC,CAAC,MAAc,EAAE,GAAG,CAAQ,EAAE,EAAE,CAC1C,MAAM,CAAC,UAAU,CACf,QAAQ,CAAC,EAAE,OAAY;QACrB,OAAO,KAAK,CAAC,CAAC,QAAQ;aACnB,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;aACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC7E,CAAC,EACD,GAAG,CAAC,CACL,CAA+E,CAAA;IAElF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CACjC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAC1F,CAAA;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAC/B,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CACzF,CAAA;IAED,OAAO;QACL,CAAC,MAAM,CAAC,EAAE,MAAM;QAChB,IAAI;YACF,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAChD,CAAC;QACD,MAAM;QACN,EAAE;QACF,KAAK;KACN,CAAA;AACH,CAAC,CACF,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Effect, Schema as S, Scope, Stream, Tracer } from "effect";
|
|
2
|
+
import { type TopFromString } from "liminal-util/schema";
|
|
3
|
+
import type { Actor } from "./Actor.ts";
|
|
4
|
+
import type { ClientHandle } from "./ClientHandle.ts";
|
|
5
|
+
import * as Method from "./Method.ts";
|
|
6
|
+
import type { ProtocolDefinition } from "./Protocol.ts";
|
|
7
|
+
export interface Introduction<Name extends TopFromString, AttachmentFields extends S.Struct.Fields> {
|
|
8
|
+
readonly port: MessagePort;
|
|
9
|
+
readonly name: Name["Type"];
|
|
10
|
+
readonly attachments: S.Struct<AttachmentFields>["Type"];
|
|
11
|
+
}
|
|
12
|
+
export declare const make: <ActorSelf, ActorId extends string, Name extends TopFromString, AttachmentFields extends S.Struct.Fields, ClientSelf, ClientId extends string, D extends ProtocolDefinition, const Handlers extends Method.Handlers<D["external"], any>, E, R, IntroductionE, IntroductionR>(args_0: {
|
|
13
|
+
readonly actor: Actor<ActorSelf, ActorId, Name, AttachmentFields, ClientSelf, ClientId, D>;
|
|
14
|
+
readonly handlers: Handlers;
|
|
15
|
+
readonly hydrate: Effect.Effect<S.Struct<D["state"]>["Type"], E, R>;
|
|
16
|
+
readonly introductions: Stream.Stream<Introduction<Name, AttachmentFields>, IntroductionE, IntroductionR>;
|
|
17
|
+
}) => Effect.Effect<void, IntroductionE | import("effect/unstable/workers/WorkerError").WorkerError, Scope.Scope | Exclude<IntroductionR, Tracer.ParentSpan> | Exclude<Exclude<Exclude<Exclude<[Effect.Effect<void, S.SchemaError, Exclude<Exclude<Exclude<({ readonly [K_1 in keyof D["external"] & string]: S.TaggedStruct<K_1, {
|
|
18
|
+
readonly value: D["external"][K_1]["success"];
|
|
19
|
+
}>; } extends infer T extends Record<string, S.Top> ? { [K in keyof T]: T[K]["EncodingServices"]; } : never)[keyof D["external"] & string], Tracer.ParentSpan>, Scope.Scope>, ActorSelf> | Exclude<Exclude<Exclude<({ readonly [K_3 in keyof D["external"] & string]: S.TaggedStruct<K_3, {
|
|
20
|
+
readonly value: D["external"][K_3]["failure"];
|
|
21
|
+
}>; } extends infer T_1 extends Record<string, S.Top> ? { [K_2 in keyof T_1]: T_1[K_2]["EncodingServices"]; } : never)[keyof D["external"] & string], Tracer.ParentSpan>, Scope.Scope>, ActorSelf> | Exclude<Exclude<Exclude<Handlers[keyof Handlers] extends (v: never) => Effect.Effect<any, any, infer R_1> ? R_1 : never, Tracer.ParentSpan>, Scope.Scope>, ActorSelf>> | Effect.Effect<string, S.SchemaError, S.Struct.EncodingServices<D["state"]>> | Effect.Effect<ClientHandle<ActorSelf, AttachmentFields, D>, S.SchemaError, S.Struct.EncodingServices<AttachmentFields>> | Effect.Effect<S.Struct.Type_<D["state"], S.Struct.TypeOptionalKeys<D["state"]>, S.Struct.TypeMutableKeys<D["state"]>> extends infer T_2 ? { [K_4 in keyof T_2]: T_2[K_4]; } : never, E, Exclude<Exclude<Exclude<R, Scope.Scope>, Tracer.ParentSpan>, ActorSelf>> | Effect.Effect<Name["Encoded"], S.SchemaError, Name["EncodingServices"]> | Effect.Effect<{
|
|
22
|
+
readonly _tag: "Disconnect";
|
|
23
|
+
} | {
|
|
24
|
+
readonly _tag: "Audition.Payload";
|
|
25
|
+
readonly client: string;
|
|
26
|
+
} | {
|
|
27
|
+
readonly _tag: "F.Payload";
|
|
28
|
+
readonly id: number;
|
|
29
|
+
readonly payload: ({ readonly [K_6 in keyof D["external"] & string]: S.TaggedStruct<K_6, {
|
|
30
|
+
readonly value: D["external"][K_6]["payload"];
|
|
31
|
+
}>; } extends infer T_3 extends Record<string, S.Top> ? { [K_5 in keyof T_3]: T_3[K_5]["Type"]; } : never)[keyof D["external"] & string];
|
|
32
|
+
readonly trace?: {
|
|
33
|
+
readonly traceId: string;
|
|
34
|
+
readonly spanId: string;
|
|
35
|
+
readonly sampled: boolean;
|
|
36
|
+
} | undefined;
|
|
37
|
+
}, S.SchemaError, ({ readonly [K_6 in keyof D["external"] & string]: S.TaggedStruct<K_6, {
|
|
38
|
+
readonly value: D["external"][K_6]["payload"];
|
|
39
|
+
}>; } extends infer T_4 extends Record<string, S.Top> ? { [K_7 in keyof T_4]: T_4[K_7]["DecodingServices"]; } : never)[keyof D["external"] & string]>] extends [Effect.Effect<infer _A, infer _E, infer R_2>] ? R_2 : never, Tracer.ParentSpan>, Tracer.ParentSpan>, Scope.Scope>, Tracer.ParentSpan>>;
|