@moltzap/client 2026.511.0 → 2026.518.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/dist/auth.d.ts +12 -6
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +67 -29
- package/dist/auth.js.map +1 -1
- package/dist/auth.test.js +113 -76
- package/dist/auth.test.js.map +1 -1
- package/dist/channel-core-context.test.d.ts +2 -0
- package/dist/channel-core-context.test.d.ts.map +1 -0
- package/dist/channel-core-context.test.js +334 -0
- package/dist/channel-core-context.test.js.map +1 -0
- package/dist/channel-core-dispatch.test.d.ts +2 -0
- package/dist/channel-core-dispatch.test.d.ts.map +1 -0
- package/dist/channel-core-dispatch.test.js +550 -0
- package/dist/channel-core-dispatch.test.js.map +1 -0
- package/dist/channel-core-enrichment.d.ts +8 -0
- package/dist/channel-core-enrichment.d.ts.map +1 -0
- package/dist/channel-core-enrichment.js +134 -0
- package/dist/channel-core-enrichment.js.map +1 -0
- package/dist/channel-core-errors.d.ts +20 -0
- package/dist/channel-core-errors.d.ts.map +1 -0
- package/dist/channel-core-errors.js +12 -0
- package/dist/channel-core-errors.js.map +1 -0
- package/dist/channel-core-test-support.d.ts +48 -0
- package/dist/channel-core-test-support.d.ts.map +1 -0
- package/dist/channel-core-test-support.js +111 -0
- package/dist/channel-core-test-support.js.map +1 -0
- package/dist/channel-core.d.ts +30 -7
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +214 -237
- package/dist/channel-core.js.map +1 -1
- package/dist/channel-core.test.js +216 -1082
- package/dist/channel-core.test.js.map +1 -1
- package/dist/cli/__tests__/cli-multi-agent.int.test.js +129 -23
- package/dist/cli/__tests__/cli-multi-agent.int.test.js.map +1 -1
- package/dist/cli/commands/conversations-v2.test.js +64 -54
- package/dist/cli/commands/conversations-v2.test.js.map +1 -1
- package/dist/cli/commands/conversations.d.ts +5 -5
- package/dist/cli/commands/conversations.d.ts.map +1 -1
- package/dist/cli/commands/conversations.js +43 -36
- package/dist/cli/commands/conversations.js.map +1 -1
- package/dist/cli/commands/messages.d.ts +4 -4
- package/dist/cli/commands/messages.d.ts.map +1 -1
- package/dist/cli/commands/messages.js +4 -4
- package/dist/cli/commands/messages.js.map +1 -1
- package/dist/cli/commands/messages.test.js +61 -49
- package/dist/cli/commands/messages.test.js.map +1 -1
- package/dist/cli/commands/ping.d.ts +0 -9
- package/dist/cli/commands/ping.d.ts.map +1 -1
- package/dist/cli/commands/ping.js +1 -1
- package/dist/cli/commands/ping.js.map +1 -1
- package/dist/cli/commands/presence.d.ts +1 -1
- package/dist/cli/commands/presence.js +1 -1
- package/dist/cli/commands/register.d.ts +2 -2
- package/dist/cli/commands/register.d.ts.map +1 -1
- package/dist/cli/commands/register.js +98 -77
- package/dist/cli/commands/register.js.map +1 -1
- package/dist/cli/commands/register.test.js +63 -39
- package/dist/cli/commands/register.test.js.map +1 -1
- package/dist/cli/commands/send.d.ts +6 -6
- package/dist/cli/commands/send.js +6 -6
- package/dist/cli/commands/send.test.js +32 -28
- package/dist/cli/commands/send.test.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +3 -4
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/config.d.ts +0 -2
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +86 -76
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/config.test.js +80 -42
- package/dist/cli/config.test.js.map +1 -1
- package/dist/cli/index.d.ts +1 -16
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +50 -113
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/process-argv.d.ts +2 -0
- package/dist/cli/process-argv.d.ts.map +1 -0
- package/dist/cli/process-argv.js +2 -0
- package/dist/cli/process-argv.js.map +1 -0
- package/dist/cli/profile.d.ts +3 -10
- package/dist/cli/profile.d.ts.map +1 -1
- package/dist/cli/profile.js +105 -104
- package/dist/cli/profile.js.map +1 -1
- package/dist/cli/profile.test.js +338 -232
- package/dist/cli/profile.test.js.map +1 -1
- package/dist/cli/runtime.d.ts +5 -17
- package/dist/cli/runtime.d.ts.map +1 -1
- package/dist/cli/runtime.js +6 -59
- package/dist/cli/runtime.js.map +1 -1
- package/dist/cli/socket-client.d.ts +10 -15
- package/dist/cli/socket-client.d.ts.map +1 -1
- package/dist/cli/socket-client.js +74 -89
- package/dist/cli/socket-client.js.map +1 -1
- package/dist/cli/transport.d.ts +9 -5
- package/dist/cli/transport.d.ts.map +1 -1
- package/dist/cli/transport.js +45 -42
- package/dist/cli/transport.js.map +1 -1
- package/dist/cli/transport.test.js +227 -133
- package/dist/cli/transport.test.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/local-daemon-rpc.d.ts +13 -0
- package/dist/local-daemon-rpc.d.ts.map +1 -0
- package/dist/local-daemon-rpc.js +17 -0
- package/dist/local-daemon-rpc.js.map +1 -0
- package/dist/local-paths.d.ts +7 -0
- package/dist/local-paths.d.ts.map +1 -0
- package/dist/local-paths.js +20 -0
- package/dist/local-paths.js.map +1 -0
- package/dist/runtime/close-info.d.ts +3 -12
- package/dist/runtime/close-info.d.ts.map +1 -1
- package/dist/runtime/close-info.js +28 -39
- package/dist/runtime/close-info.js.map +1 -1
- package/dist/runtime/close-info.test.js +77 -70
- package/dist/runtime/close-info.test.js.map +1 -1
- package/dist/runtime/errors.test.js +42 -28
- package/dist/runtime/errors.test.js.map +1 -1
- package/dist/runtime/frame.d.ts +4 -31
- package/dist/runtime/frame.d.ts.map +1 -1
- package/dist/runtime/frame.js +7 -116
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/frame.test.js +41 -54
- package/dist/runtime/frame.test.js.map +1 -1
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +7 -11
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/local-history.d.ts +67 -0
- package/dist/runtime/local-history.d.ts.map +1 -0
- package/dist/runtime/local-history.js +77 -0
- package/dist/runtime/local-history.js.map +1 -0
- package/dist/runtime/local-service-commands.d.ts +19 -0
- package/dist/runtime/local-service-commands.d.ts.map +1 -1
- package/dist/runtime/local-service-commands.js +23 -0
- package/dist/runtime/local-service-commands.js.map +1 -1
- package/dist/runtime/local-socket-server.d.ts +20 -0
- package/dist/runtime/local-socket-server.d.ts.map +1 -0
- package/dist/runtime/local-socket-server.js +94 -0
- package/dist/runtime/local-socket-server.js.map +1 -0
- package/dist/runtime/refs.d.ts +1 -1
- package/dist/runtime/refs.js +1 -1
- package/dist/runtime/runtime.test.js +29 -21
- package/dist/runtime/runtime.test.js.map +1 -1
- package/dist/runtime/service-helpers.d.ts +32 -0
- package/dist/runtime/service-helpers.d.ts.map +1 -0
- package/dist/runtime/service-helpers.js +85 -0
- package/dist/runtime/service-helpers.js.map +1 -0
- package/dist/runtime/subscribers.d.ts +13 -17
- package/dist/runtime/subscribers.d.ts.map +1 -1
- package/dist/runtime/subscribers.js +37 -32
- package/dist/runtime/subscribers.js.map +1 -1
- package/dist/runtime/subscribers.test.js +139 -131
- package/dist/runtime/subscribers.test.js.map +1 -1
- package/dist/service-socket-path.test.d.ts +2 -0
- package/dist/service-socket-path.test.d.ts.map +1 -0
- package/dist/service-socket-path.test.js +87 -0
- package/dist/service-socket-path.test.js.map +1 -0
- package/dist/service.d.ts +46 -20
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +243 -340
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +650 -571
- package/dist/service.test.js.map +1 -1
- package/dist/test/index.d.ts +30 -14
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +25 -21
- package/dist/test/index.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +1 -0
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +139 -98
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/conformance-adapter.d.ts.map +1 -1
- package/dist/test-utils/conformance-adapter.js +145 -124
- package/dist/test-utils/conformance-adapter.js.map +1 -1
- package/dist/test-utils/fake-service.d.ts.map +1 -1
- package/dist/test-utils/fake-service.js +3 -3
- package/dist/test-utils/fake-service.js.map +1 -1
- package/dist/test-utils/index.d.ts +25 -0
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +25 -8
- package/dist/test-utils/index.js.map +1 -1
- package/dist/ws-client-test-support.d.ts +180 -0
- package/dist/ws-client-test-support.d.ts.map +1 -0
- package/dist/ws-client-test-support.js +399 -0
- package/dist/ws-client-test-support.js.map +1 -0
- package/dist/ws-client.d.ts +59 -32
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +272 -321
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.js +388 -800
- package/dist/ws-client.test.js.map +1 -1
- package/package.json +14 -10
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Effect, Scope } from "effect";
|
|
2
|
+
import { type LocalDaemonParams } from "../local-daemon-rpc.js";
|
|
3
|
+
interface LocalSocketServerOptions {
|
|
4
|
+
readonly socketPath: string;
|
|
5
|
+
readonly defaultSocketPath: string;
|
|
6
|
+
readonly handleRequest: (method: string, params: LocalDaemonParams) => Effect.Effect<unknown, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface RunningLocalSocketServer {
|
|
9
|
+
readonly socketScope: Scope.CloseableScope;
|
|
10
|
+
readonly socketPath: string;
|
|
11
|
+
}
|
|
12
|
+
interface StopLocalSocketServerOptions {
|
|
13
|
+
readonly socketScope: Scope.CloseableScope | null;
|
|
14
|
+
readonly socketPath: string;
|
|
15
|
+
readonly defaultSocketPath: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function startLocalSocketServer(options: LocalSocketServerOptions): Effect.Effect<RunningLocalSocketServer, unknown, never>;
|
|
18
|
+
export declare function stopLocalSocketServer(options: StopLocalSocketServerOptions): Effect.Effect<void, never>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=local-socket-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-socket-server.d.ts","sourceRoot":"","sources":["../../src/runtime/local-socket-server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAuB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAMhC,UAAU,wBAAwB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,KACtB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,4BAA4B;IACpC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAsGD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,wBAAwB,GAChC,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,OAAO,EAAE,KAAK,CAAC,CAazD;AAqCD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAc5B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { FileSystem, Path } from "@effect/platform";
|
|
2
|
+
import * as SocketServer from "@effect/platform/SocketServer";
|
|
3
|
+
import { NodeContext } from "@effect/platform-node";
|
|
4
|
+
import * as NodeSocketServer from "@effect/platform-node/NodeSocketServer";
|
|
5
|
+
import { RpcSerialization, RpcServer } from "@effect/rpc";
|
|
6
|
+
import { Effect, Either, Exit, Layer, Scope } from "effect";
|
|
7
|
+
import { LocalDaemonRpcs, } from "../local-daemon-rpc.js";
|
|
8
|
+
const SOCKET_FILE_MODE = 0o600;
|
|
9
|
+
function logFileSystemIssue(level, message, error) {
|
|
10
|
+
return (level === "warn" ? Effect.logWarning : Effect.logInfo)(message, error);
|
|
11
|
+
}
|
|
12
|
+
const errorMessage = (error) => error instanceof Error ? error.message : String(error);
|
|
13
|
+
function closeScope(scope) {
|
|
14
|
+
return Scope.close(scope, Exit.succeed(undefined));
|
|
15
|
+
}
|
|
16
|
+
function prepareSocketPath(socketPath) {
|
|
17
|
+
return Effect.gen(function* () {
|
|
18
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
19
|
+
const path = yield* Path.Path;
|
|
20
|
+
yield* fileSystem
|
|
21
|
+
.remove(socketPath, { force: true })
|
|
22
|
+
.pipe(Effect.catchAll((error) => logFileSystemIssue("warn", "unlink existing socket failed", error)));
|
|
23
|
+
yield* fileSystem.makeDirectory(path.dirname(socketPath), {
|
|
24
|
+
recursive: true,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function makeSocketServer(socketPath, socketScope) {
|
|
29
|
+
return NodeSocketServer.make({ path: socketPath }).pipe(Scope.extend(socketScope), Effect.tapError(() => closeScope(socketScope)));
|
|
30
|
+
}
|
|
31
|
+
function buildHandlerLayer(options) {
|
|
32
|
+
return LocalDaemonRpcs.toLayer({
|
|
33
|
+
LocalDaemonCall: ({ method, params }) => options.handleRequest(method, params).pipe(Effect.mapError(errorMessage)),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function buildSocketRpcLayer(server, socketScope, options) {
|
|
37
|
+
const rpcLayer = RpcServer.layer(LocalDaemonRpcs).pipe(Layer.provide(buildHandlerLayer(options)), Layer.provide(RpcServer.layerProtocolSocketServer), Layer.provide(RpcSerialization.layerNdjson), Layer.provide(Layer.succeed(SocketServer.SocketServer, server)));
|
|
38
|
+
return Layer.build(rpcLayer).pipe(Scope.extend(socketScope), Effect.tapError(() => closeScope(socketScope)));
|
|
39
|
+
}
|
|
40
|
+
function chmodSocketPath(socketPath) {
|
|
41
|
+
return FileSystem.FileSystem.pipe(Effect.flatMap((fileSystem) => fileSystem.chmod(socketPath, SOCKET_FILE_MODE)), Effect.catchAll((error) => logFileSystemIssue("warn", "chmod 0600 on socket failed", error)));
|
|
42
|
+
}
|
|
43
|
+
function installDefaultSocketSymlink(options) {
|
|
44
|
+
return Effect.gen(function* () {
|
|
45
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
46
|
+
yield* fileSystem
|
|
47
|
+
.remove(options.defaultSocketPath, { force: true })
|
|
48
|
+
.pipe(Effect.catchAll((error) => logFileSystemIssue("info", "unlink default socket symlink", error)));
|
|
49
|
+
yield* fileSystem
|
|
50
|
+
.symlink(options.socketPath, options.defaultSocketPath)
|
|
51
|
+
.pipe(Effect.catchAll((error) => logFileSystemIssue("warn", "symlink default socket failed", error)));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export function startLocalSocketServer(options) {
|
|
55
|
+
return Effect.gen(function* () {
|
|
56
|
+
yield* prepareSocketPath(options.socketPath);
|
|
57
|
+
const socketScope = yield* Scope.make();
|
|
58
|
+
const server = yield* makeSocketServer(options.socketPath, socketScope);
|
|
59
|
+
yield* buildSocketRpcLayer(server, socketScope, options);
|
|
60
|
+
yield* chmodSocketPath(options.socketPath);
|
|
61
|
+
yield* installDefaultSocketSymlink(options);
|
|
62
|
+
return { socketScope, socketPath: options.socketPath };
|
|
63
|
+
}).pipe(Effect.withSpan("startLocalSocketServer"), Effect.provide(NodeContext.layer));
|
|
64
|
+
}
|
|
65
|
+
function removeSocketPath(socketPath) {
|
|
66
|
+
return FileSystem.FileSystem.pipe(Effect.flatMap((fileSystem) => fileSystem.remove(socketPath, { force: true })), Effect.catchAll((error) => logFileSystemIssue("info", "unlink socket path", error)));
|
|
67
|
+
}
|
|
68
|
+
function removeDefaultSocketSymlinkIfOwned(options) {
|
|
69
|
+
return Effect.gen(function* () {
|
|
70
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
71
|
+
const target = yield* fileSystem
|
|
72
|
+
.readLink(options.defaultSocketPath)
|
|
73
|
+
.pipe(Effect.either);
|
|
74
|
+
const shouldRemoveDefaultSocket = Either.match(target, {
|
|
75
|
+
onLeft: () => false,
|
|
76
|
+
onRight: (value) => value === options.socketPath,
|
|
77
|
+
});
|
|
78
|
+
if (!shouldRemoveDefaultSocket)
|
|
79
|
+
return;
|
|
80
|
+
yield* fileSystem
|
|
81
|
+
.remove(options.defaultSocketPath, { force: true })
|
|
82
|
+
.pipe(Effect.catchAll((error) => logFileSystemIssue("info", "cleanup default symlink", error)));
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export function stopLocalSocketServer(options) {
|
|
86
|
+
return Effect.gen(function* () {
|
|
87
|
+
if (options.socketScope !== null) {
|
|
88
|
+
yield* closeScope(options.socketScope);
|
|
89
|
+
}
|
|
90
|
+
yield* removeSocketPath(options.socketPath);
|
|
91
|
+
yield* removeDefaultSocketSymlinkIfOwned(options);
|
|
92
|
+
}).pipe(Effect.withSpan("stopLocalSocketServer"), Effect.provide(NodeContext.layer), Effect.catchAll((error) => logFileSystemIssue("info", "cleanup default symlink", error)));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=local-socket-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-socket-server.js","sourceRoot":"","sources":["../../src/runtime/local-socket-server.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/refs.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { HashMap, Ref } from "effect";
|
|
2
2
|
/**
|
|
3
3
|
* Read a `Ref` synchronously outside an Effect scope. Only safe for `Ref`s
|
|
4
|
-
* that never fiber-park (the stock `Ref.Ref
|
|
4
|
+
* that never fiber-park (the stock `Ref.Ref<A>` never does). Use from
|
|
5
5
|
* object methods or sync code paths that hold a `Ref` set up at construction.
|
|
6
6
|
*/
|
|
7
7
|
export declare const snapshot: <A>(ref: Ref.Ref<A>) => A;
|
package/dist/runtime/refs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, HashMap, Option, Ref } from "effect";
|
|
2
2
|
/**
|
|
3
3
|
* Read a `Ref` synchronously outside an Effect scope. Only safe for `Ref`s
|
|
4
|
-
* that never fiber-park (the stock `Ref.Ref
|
|
4
|
+
* that never fiber-park (the stock `Ref.Ref<A>` never does). Use from
|
|
5
5
|
* object methods or sync code paths that hold a `Ref` set up at construction.
|
|
6
6
|
*/
|
|
7
7
|
export const snapshot = (ref) => Effect.runSync(Ref.get(ref));
|
|
@@ -1,29 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { expect, it as itSync } from "vitest";
|
|
1
|
+
import { Cause, Effect, Exit, Option } from "effect";
|
|
2
|
+
import { expect, it } from "vitest";
|
|
4
3
|
import { MessagesSend, NotConnectedError, RpcServerError, RpcTimeoutError, } from "@moltzap/protocol";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
const RPC_TIMEOUT_MS = 30_000;
|
|
5
|
+
const NOT_FOUND_CODE = -32002;
|
|
6
|
+
const RPC_TIMEOUT_TAG = "RpcTimeoutError";
|
|
7
|
+
const NOT_FOUND_MESSAGE = "Not found";
|
|
8
|
+
const SOCKET_CLOSED_MESSAGE = "socket closed";
|
|
9
|
+
it("tagged errors discriminate by _tag", () => Effect.runPromise(Effect.gen(function* () {
|
|
10
|
+
const exit = yield* Effect.exit(Effect.fail(new RpcTimeoutError({
|
|
11
|
+
method: MessagesSend.name,
|
|
12
|
+
timeoutMs: RPC_TIMEOUT_MS,
|
|
13
|
+
})));
|
|
14
|
+
expect(Exit.isFailure(exit)).toBe(true);
|
|
15
|
+
if (Exit.isFailure(exit)) {
|
|
16
|
+
const err = Option.getOrNull(Cause.failureOption(exit.cause));
|
|
17
|
+
expect(err).toBeInstanceOf(RpcTimeoutError);
|
|
18
|
+
if (err instanceof RpcTimeoutError) {
|
|
19
|
+
expect(err._tag).toBe(RPC_TIMEOUT_TAG);
|
|
20
|
+
expect(err.method).toBe(MessagesSend.name);
|
|
21
|
+
}
|
|
11
22
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
}));
|
|
16
|
-
itSync("RpcServerError preserves wire fields", () => {
|
|
23
|
+
})));
|
|
24
|
+
it("RpcServerError preserves wire fields", () => {
|
|
17
25
|
const err = new RpcServerError({
|
|
18
|
-
code:
|
|
19
|
-
message:
|
|
26
|
+
code: NOT_FOUND_CODE,
|
|
27
|
+
message: NOT_FOUND_MESSAGE,
|
|
20
28
|
});
|
|
21
|
-
expect(err.code).toBe(
|
|
22
|
-
expect(err.message).toBe(
|
|
29
|
+
expect(err.code).toBe(NOT_FOUND_CODE);
|
|
30
|
+
expect(err.message).toBe(NOT_FOUND_MESSAGE);
|
|
23
31
|
expect(err.data).toBeUndefined();
|
|
24
32
|
});
|
|
25
|
-
|
|
26
|
-
const err = new NotConnectedError({ message:
|
|
27
|
-
expect(err.message).toBe(
|
|
33
|
+
it("NotConnectedError compiles and carries message", () => {
|
|
34
|
+
const err = new NotConnectedError({ message: SOCKET_CLOSED_MESSAGE });
|
|
35
|
+
expect(err.message).toBe(SOCKET_CLOSED_MESSAGE);
|
|
28
36
|
});
|
|
29
37
|
//# sourceMappingURL=runtime.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.test.js","sourceRoot":"","sources":["../../src/runtime/runtime.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"runtime.test.js","sourceRoot":"","sources":["../../src/runtime/runtime.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC;AAC9B,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAC1C,MAAM,iBAAiB,GAAG,WAAW,CAAC;AACtC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAE9C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE,CAC5C,MAAM,CAAC,UAAU,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAC7B,MAAM,CAAC,IAAI,CACT,IAAI,eAAe,CAAC;QAClB,MAAM,EAAE,YAAY,CAAC,IAAI;QACzB,SAAS,EAAE,cAAc;KAC1B,CAAC,CACH,CACF,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAC5C,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CACH,CAAC,CAAC;AAEL,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAC9C,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC;QAC7B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,iBAAiB;KAC3B,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;IACxD,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type AnyNotificationDefinition, type DecodedNotification, type Message, type Part } from "@moltzap/protocol";
|
|
2
|
+
import { HashMap } from "effect";
|
|
3
|
+
import type { ConversationMeta, CrossConversationEntry } from "../service.js";
|
|
4
|
+
declare const ServiceInputError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
5
|
+
readonly _tag: "ServiceInputError";
|
|
6
|
+
} & Readonly<A>;
|
|
7
|
+
export declare class ServiceInputError extends ServiceInputError_base<{
|
|
8
|
+
readonly message: string;
|
|
9
|
+
}> {
|
|
10
|
+
}
|
|
11
|
+
export interface CrossConvState {
|
|
12
|
+
readonly messagesMap: HashMap.HashMap<string, ReadonlyArray<Message>>;
|
|
13
|
+
readonly conversationsMap: HashMap.HashMap<string, ConversationMeta>;
|
|
14
|
+
readonly agentNamesMap: HashMap.HashMap<string, string>;
|
|
15
|
+
readonly viewMarkers: HashMap.HashMap<string, string>;
|
|
16
|
+
}
|
|
17
|
+
export interface ContextCandidate {
|
|
18
|
+
readonly convId: string;
|
|
19
|
+
readonly newMsgs: ReadonlyArray<Message>;
|
|
20
|
+
readonly lastTs: number;
|
|
21
|
+
}
|
|
22
|
+
interface BuiltContextEntries {
|
|
23
|
+
readonly entries: CrossConversationEntry[];
|
|
24
|
+
readonly pendingAdvances: ReadonlyArray<readonly [string, string]>;
|
|
25
|
+
}
|
|
26
|
+
export declare const renderPart: (part: Part) => string;
|
|
27
|
+
export declare function newMessagesForConversation(convId: string, messages: ReadonlyArray<Message>, viewMarkers: HashMap.HashMap<string, string>, currentConvId: string): ReadonlyArray<Message>;
|
|
28
|
+
export declare function makeContextCandidate(convId: string, newMsgs: ReadonlyArray<Message>): ContextCandidate;
|
|
29
|
+
export declare function buildContextEntries(candidates: ReadonlyArray<ContextCandidate>, state: CrossConvState, maxMessagesPerConv: number): BuiltContextEntries;
|
|
30
|
+
export declare function notificationTraceRecord(notification: DecodedNotification<AnyNotificationDefinition>, agentId: string | undefined): Record<string, unknown>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=service-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-helpers.d.ts","sourceRoot":"","sources":["../../src/runtime/service-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,IAAI,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAQ,OAAO,EAAiB,MAAM,QAAQ,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;;;;AAK9E,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACrE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpE;AAwBD,eAAO,MAAM,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAMxC,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5C,aAAa,EAAE,MAAM,GACpB,aAAa,CAAC,OAAO,CAAC,CAQxB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,GAC9B,gBAAgB,CAOlB;AAyCD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,aAAa,CAAC,gBAAgB,CAAC,EAC3C,KAAK,EAAE,cAAc,EACrB,kBAAkB,EAAE,MAAM,GACzB,mBAAmB,CAarB;AAQD,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,EAC5D,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import {} from "@moltzap/protocol";
|
|
2
|
+
import { Data, HashMap, Match, Option } from "effect";
|
|
3
|
+
import { getOr } from "./refs.js";
|
|
4
|
+
const MILLISECONDS_PER_MINUTE = 60_000;
|
|
5
|
+
export class ServiceInputError extends Data.TaggedError("ServiceInputError") {
|
|
6
|
+
}
|
|
7
|
+
const isPlainRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
|
+
const recordOrEmpty = (value) => isPlainRecord(value) ? value : {};
|
|
9
|
+
const recordProperty = (record, key) => {
|
|
10
|
+
const value = record[key];
|
|
11
|
+
return isPlainRecord(value) ? value : undefined;
|
|
12
|
+
};
|
|
13
|
+
const stringProperty = (record, key) => {
|
|
14
|
+
const value = record[key];
|
|
15
|
+
return typeof value === "string" ? value : undefined;
|
|
16
|
+
};
|
|
17
|
+
export const renderPart = Match.type().pipe(Match.discriminatorsExhaustive("type")({
|
|
18
|
+
text: (text) => text.text,
|
|
19
|
+
image: () => "[image]",
|
|
20
|
+
file: (file) => `[file: ${file.name}]`,
|
|
21
|
+
}));
|
|
22
|
+
export function newMessagesForConversation(convId, messages, viewMarkers, currentConvId) {
|
|
23
|
+
if (convId === currentConvId || messages.length === 0)
|
|
24
|
+
return [];
|
|
25
|
+
const lastSeenId = Option.getOrUndefined(HashMap.get(viewMarkers, convId));
|
|
26
|
+
const lastSeenIndex = lastSeenId !== undefined
|
|
27
|
+
? messages.findIndex((message) => message.id === lastSeenId)
|
|
28
|
+
: -1;
|
|
29
|
+
return messages.slice(lastSeenIndex + 1);
|
|
30
|
+
}
|
|
31
|
+
export function makeContextCandidate(convId, newMsgs) {
|
|
32
|
+
const last = newMsgs[newMsgs.length - 1];
|
|
33
|
+
return {
|
|
34
|
+
convId,
|
|
35
|
+
newMsgs,
|
|
36
|
+
lastTs: new Date(last.createdAt).getTime(),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function minutesSince(timestamp) {
|
|
40
|
+
return Math.max(0, Math.round((Date.now() - new Date(timestamp).getTime()) / MILLISECONDS_PER_MINUTE));
|
|
41
|
+
}
|
|
42
|
+
function contextEntryForCandidate(candidate, state, maxMessagesPerConv) {
|
|
43
|
+
const reportable = candidate.newMsgs.slice(-maxMessagesPerConv);
|
|
44
|
+
const last = reportable[reportable.length - 1];
|
|
45
|
+
const senderName = getOr(state.agentNamesMap, last.senderId, () => last.senderId);
|
|
46
|
+
return {
|
|
47
|
+
entry: {
|
|
48
|
+
conversationId: candidate.convId,
|
|
49
|
+
conversationName: Option.getOrUndefined(HashMap.get(state.conversationsMap, candidate.convId))?.name,
|
|
50
|
+
senderName,
|
|
51
|
+
text: last.parts.map(renderPart).join(" "),
|
|
52
|
+
minutesAgo: minutesSince(last.createdAt),
|
|
53
|
+
count: reportable.length,
|
|
54
|
+
},
|
|
55
|
+
advance: [candidate.convId, last.id],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function buildContextEntries(candidates, state, maxMessagesPerConv) {
|
|
59
|
+
const entries = [];
|
|
60
|
+
const pendingAdvances = [];
|
|
61
|
+
for (const candidate of candidates) {
|
|
62
|
+
const { entry, advance } = contextEntryForCandidate(candidate, state, maxMessagesPerConv);
|
|
63
|
+
entries.push(entry);
|
|
64
|
+
pendingAdvances.push(advance);
|
|
65
|
+
}
|
|
66
|
+
return { entries, pendingAdvances };
|
|
67
|
+
}
|
|
68
|
+
const traceConversationId = (conversation, fallback) => conversation === undefined ? fallback : (conversation["id"] ?? fallback);
|
|
69
|
+
export function notificationTraceRecord(notification, agentId) {
|
|
70
|
+
const params = recordOrEmpty(notification.params);
|
|
71
|
+
const message = recordProperty(params, "message");
|
|
72
|
+
const conversation = recordProperty(params, "conversation");
|
|
73
|
+
const notificationConversationId = stringProperty(params, "conversationId");
|
|
74
|
+
return {
|
|
75
|
+
ts: new Date().toISOString(),
|
|
76
|
+
agentId: agentId ?? "unknown",
|
|
77
|
+
notification: notification.method,
|
|
78
|
+
messageId: message?.["id"],
|
|
79
|
+
messageConversationId: message?.["conversationId"],
|
|
80
|
+
messageSenderId: message?.["senderId"],
|
|
81
|
+
conversationId: traceConversationId(conversation, notificationConversationId),
|
|
82
|
+
conversationName: conversation?.["name"],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=service-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-helpers.js","sourceRoot":"","sources":["../../src/runtime/service-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
* unsubscribed state.
|
|
25
25
|
*
|
|
26
26
|
* Error channel: handlers are invoked inside a defect-catcher; a throw is
|
|
27
|
-
* logged
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* `
|
|
27
|
+
* logged through Effect logging and swallowed (matching the prior
|
|
28
|
+
* `onNotification` contract at `ws-client.ts:650-655` pre-deletion). The
|
|
29
|
+
* registry itself has no typed error surface — `register`, `dispatch`, and
|
|
30
|
+
* `closeAll` are `Effect<T, never>`.
|
|
31
31
|
*/
|
|
32
32
|
import { Brand, Effect } from "effect";
|
|
33
33
|
import type { AnyNotificationDefinition, DecodedNotification } from "@moltzap/protocol";
|
|
@@ -37,7 +37,6 @@ interface FilterableNotificationFrame {
|
|
|
37
37
|
}
|
|
38
38
|
/** Branded identifier for a subscription handle. Minted by `register`. */
|
|
39
39
|
export type SubscriptionId = string & Brand.Brand<"SubscriptionId">;
|
|
40
|
-
export declare const SubscriptionId: Brand.Brand.Constructor<SubscriptionId>;
|
|
41
40
|
/**
|
|
42
41
|
* Filter grammar for `subscribe`. A notification is delivered to a subscription
|
|
43
42
|
* iff it matches **every** field that is set on the filter. Unset fields
|
|
@@ -70,7 +69,7 @@ export interface SubscriptionFilter {
|
|
|
70
69
|
* holds the handle for its subscription's lifetime and runs
|
|
71
70
|
* `unsubscribe` to stop delivery.
|
|
72
71
|
*
|
|
73
|
-
* `unsubscribe` is `Effect
|
|
72
|
+
* `unsubscribe` is `Effect<void, never>`: it is idempotent and total.
|
|
74
73
|
* Calling `unsubscribe` a second time, or after `closeAll`, is a no-op.
|
|
75
74
|
*/
|
|
76
75
|
export interface NotificationSubscription {
|
|
@@ -79,13 +78,13 @@ export interface NotificationSubscription {
|
|
|
79
78
|
}
|
|
80
79
|
/**
|
|
81
80
|
* Per-subscription handler signature. Runs inside the registry's
|
|
82
|
-
* dispatch fiber. Must not throw — throws are caught by the registry,
|
|
83
|
-
*
|
|
81
|
+
* dispatch fiber. Must not throw — throws are caught by the registry, logged,
|
|
82
|
+
* and swallowed.
|
|
84
83
|
*
|
|
85
84
|
* The frame is a known-descriptor `DecodedNotification` (post-S9
|
|
86
85
|
* fail-close: malformed / unknown-method frames are rejected before
|
|
87
86
|
* dispatch). Handlers receive validated `params` typed as
|
|
88
|
-
* `NotificationParamsOf
|
|
87
|
+
* `NotificationParamsOf<D>` for the matching definition.
|
|
89
88
|
*
|
|
90
89
|
* Returning an `Effect` (not a plain `void`) lets handlers compose with
|
|
91
90
|
* Effect-native downstream code without an extra runSync shim. The
|
|
@@ -117,9 +116,9 @@ export interface SubscriberRegistry {
|
|
|
117
116
|
* live-subscription list at the start of dispatch so
|
|
118
117
|
* unsubscribe-during-dispatch observes next-frame semantics (OQ-3 A).
|
|
119
118
|
*
|
|
120
|
-
* Frames are pre-validation (`DecodedNotification
|
|
119
|
+
* Frames are pre-validation (`DecodedNotification<AnyNotificationDefinition>` union) — the
|
|
121
120
|
* type-system contract that subscribers see RAW frames, not the lifted
|
|
122
|
-
* `DecodedNotification
|
|
121
|
+
* `DecodedNotification<D>` shape that typed handlers see.
|
|
123
122
|
*
|
|
124
123
|
* Dispatch order: registration order, iterated sequentially; slow
|
|
125
124
|
* handlers block later subscriptions for this frame but never
|
|
@@ -134,11 +133,10 @@ export interface SubscriberRegistry {
|
|
|
134
133
|
}
|
|
135
134
|
/**
|
|
136
135
|
* Construct an empty registry. Called once from the `MoltZapWsClient`
|
|
137
|
-
* constructor.
|
|
138
|
-
* same sink as the rest of the client.
|
|
136
|
+
* constructor.
|
|
139
137
|
*
|
|
140
138
|
* Implementation notes:
|
|
141
|
-
* - Live subscriptions are stored in a `Ref
|
|
139
|
+
* - Live subscriptions are stored in a `Ref<ReadonlyArray<…>>` keyed
|
|
142
140
|
* by registration order. Append-on-register, filter-on-unsubscribe
|
|
143
141
|
* keeps the dispatch path O(N) with N = live subscription count.
|
|
144
142
|
* Bigger structures aren't justified at the expected sub count
|
|
@@ -151,9 +149,7 @@ export interface SubscriberRegistry {
|
|
|
151
149
|
* surfaces as a defect; we log + swallow to match the pre-deletion
|
|
152
150
|
* `onNotification` contract.
|
|
153
151
|
*/
|
|
154
|
-
export declare function makeSubscriberRegistry(
|
|
155
|
-
readonly warn: (...args: ReadonlyArray<unknown>) => void;
|
|
156
|
-
}): Effect.Effect<SubscriberRegistry, never>;
|
|
152
|
+
export declare function makeSubscriberRegistry(): Effect.Effect<SubscriberRegistry, never>;
|
|
157
153
|
/**
|
|
158
154
|
* Pure filter-match predicate. Exposed for unit testing so executable
|
|
159
155
|
* client-side divergence proofs can force known-bad subscription
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,2BAA2B;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,2BAA2B;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAGpE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAClD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,iBAAiB,KACvB,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAEpD;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAC/C;AAiDD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,CACrD,kBAAkB,EAClB,KAAK,CACN,CAoCA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAiBT"}
|
|
@@ -24,23 +24,34 @@
|
|
|
24
24
|
* unsubscribed state.
|
|
25
25
|
*
|
|
26
26
|
* Error channel: handlers are invoked inside a defect-catcher; a throw is
|
|
27
|
-
* logged
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* `
|
|
27
|
+
* logged through Effect logging and swallowed (matching the prior
|
|
28
|
+
* `onNotification` contract at `ws-client.ts:650-655` pre-deletion). The
|
|
29
|
+
* registry itself has no typed error surface — `register`, `dispatch`, and
|
|
30
|
+
* `closeAll` are `Effect<T, never>`.
|
|
31
31
|
*/
|
|
32
32
|
import { Brand, Effect, Ref } from "effect";
|
|
33
|
-
|
|
33
|
+
const SubscriptionIdBrand = Brand.nominal();
|
|
34
|
+
function nextSubscriptionId(counterRef) {
|
|
35
|
+
return Ref.updateAndGet(counterRef, (count) => count + 1).pipe(Effect.map((count) => SubscriptionIdBrand(`sub-${count}`)));
|
|
36
|
+
}
|
|
37
|
+
function appendSubscription(subsRef, live) {
|
|
38
|
+
return Ref.update(subsRef, (subscriptions) => [...subscriptions, live]);
|
|
39
|
+
}
|
|
40
|
+
function removeSubscription(subsRef, id) {
|
|
41
|
+
return Ref.update(subsRef, (subscriptions) => subscriptions.filter((subscription) => subscription.id !== id));
|
|
42
|
+
}
|
|
43
|
+
function dispatchToSubscriber(sub, frame) {
|
|
44
|
+
return Effect.suspend(() => sub.handler(frame)).pipe(Effect.catchAllDefect((err) => Effect.logWarning("subscriber handler threw", err)));
|
|
45
|
+
}
|
|
34
46
|
function isNotificationParamsRecord(value) {
|
|
35
47
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
36
48
|
}
|
|
37
49
|
/**
|
|
38
50
|
* Construct an empty registry. Called once from the `MoltZapWsClient`
|
|
39
|
-
* constructor.
|
|
40
|
-
* same sink as the rest of the client.
|
|
51
|
+
* constructor.
|
|
41
52
|
*
|
|
42
53
|
* Implementation notes:
|
|
43
|
-
* - Live subscriptions are stored in a `Ref
|
|
54
|
+
* - Live subscriptions are stored in a `Ref<ReadonlyArray<…>>` keyed
|
|
44
55
|
* by registration order. Append-on-register, filter-on-unsubscribe
|
|
45
56
|
* keeps the dispatch path O(N) with N = live subscription count.
|
|
46
57
|
* Bigger structures aren't justified at the expected sub count
|
|
@@ -53,16 +64,15 @@ function isNotificationParamsRecord(value) {
|
|
|
53
64
|
* surfaces as a defect; we log + swallow to match the pre-deletion
|
|
54
65
|
* `onNotification` contract.
|
|
55
66
|
*/
|
|
56
|
-
export function makeSubscriberRegistry(
|
|
67
|
+
export function makeSubscriberRegistry() {
|
|
57
68
|
return Effect.gen(function* () {
|
|
58
69
|
const subsRef = yield* Ref.make([]);
|
|
59
70
|
const counterRef = yield* Ref.make(0);
|
|
60
71
|
const register = (filter, handler) => Effect.gen(function* () {
|
|
61
|
-
const
|
|
62
|
-
const id = SubscriptionId(`sub-${n}`);
|
|
72
|
+
const id = yield* nextSubscriptionId(counterRef);
|
|
63
73
|
const live = { id, filter, handler };
|
|
64
|
-
yield*
|
|
65
|
-
const unsubscribe =
|
|
74
|
+
yield* appendSubscription(subsRef, live);
|
|
75
|
+
const unsubscribe = removeSubscription(subsRef, id);
|
|
66
76
|
return { id, unsubscribe };
|
|
67
77
|
});
|
|
68
78
|
const dispatch = (frame) => Effect.gen(function* () {
|
|
@@ -80,14 +90,12 @@ export function makeSubscriberRegistry(logger) {
|
|
|
80
90
|
// Handlers must not throw; we catch defects defensively so
|
|
81
91
|
// one buggy subscriber can't kill the dispatch loop or break
|
|
82
92
|
// the reader fiber.
|
|
83
|
-
yield*
|
|
84
|
-
logger.warn("subscriber handler threw", err);
|
|
85
|
-
})));
|
|
93
|
+
yield* dispatchToSubscriber(sub, frame);
|
|
86
94
|
}
|
|
87
95
|
});
|
|
88
96
|
const closeAll = Ref.set(subsRef, []);
|
|
89
97
|
return { register, dispatch, closeAll };
|
|
90
|
-
});
|
|
98
|
+
}).pipe(Effect.withSpan("makeSubscriberRegistry"));
|
|
91
99
|
}
|
|
92
100
|
/**
|
|
93
101
|
* Pure filter-match predicate. Exposed for unit testing so executable
|
|
@@ -101,23 +109,20 @@ export function makeSubscriberRegistry(logger) {
|
|
|
101
109
|
* Unset filter fields are wildcards.
|
|
102
110
|
*/
|
|
103
111
|
export function matchesFilter(filter, frame) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
112
|
+
const methodPrefix = filter.notificationNamePrefix;
|
|
113
|
+
if (methodPrefix !== undefined &&
|
|
114
|
+
!matchesMethodPrefix(methodPrefix, frame.method))
|
|
115
|
+
return false;
|
|
108
116
|
const params = isNotificationParamsRecord(frame.params)
|
|
109
117
|
? frame.params
|
|
110
118
|
: null;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
return true;
|
|
119
|
+
return (matchesPayloadValue(params, "__emissionTag", filter.emissionTag) &&
|
|
120
|
+
matchesPayloadValue(params, "conversationId", filter.conversationId));
|
|
121
|
+
}
|
|
122
|
+
function matchesMethodPrefix(prefix, method) {
|
|
123
|
+
return method.startsWith(prefix);
|
|
124
|
+
}
|
|
125
|
+
function matchesPayloadValue(params, key, expected) {
|
|
126
|
+
return expected === undefined || params?.[key] === expected;
|
|
122
127
|
}
|
|
123
128
|
//# sourceMappingURL=subscribers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAa5C,MAAM,
|
|
1
|
+
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"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"}
|