@moltzap/client 2026.503.3 → 2026.504.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 +10 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +8 -5
- package/dist/auth.js.map +1 -1
- package/dist/channel-core.d.ts +1 -4
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +0 -9
- package/dist/channel-core.js.map +1 -1
- package/dist/channel-core.test.js +90 -71
- package/dist/channel-core.test.js.map +1 -1
- package/dist/cli/commands/agents.d.ts.map +1 -1
- package/dist/cli/commands/agents.js +5 -3
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/apps.d.ts +9 -27
- package/dist/cli/commands/apps.d.ts.map +1 -1
- package/dist/cli/commands/apps.js +36 -57
- package/dist/cli/commands/apps.js.map +1 -1
- package/dist/cli/commands/apps.test.js +63 -75
- package/dist/cli/commands/apps.test.js.map +1 -1
- package/dist/cli/commands/contacts.d.ts +1 -5
- package/dist/cli/commands/contacts.d.ts.map +1 -1
- package/dist/cli/commands/contacts.js +14 -27
- package/dist/cli/commands/contacts.js.map +1 -1
- package/dist/cli/commands/conversations-v2.test.js +34 -29
- package/dist/cli/commands/conversations-v2.test.js.map +1 -1
- package/dist/cli/commands/conversations.d.ts +7 -3
- package/dist/cli/commands/conversations.d.ts.map +1 -1
- package/dist/cli/commands/conversations.js +63 -48
- package/dist/cli/commands/conversations.js.map +1 -1
- package/dist/cli/commands/messages.d.ts +7 -3
- package/dist/cli/commands/messages.d.ts.map +1 -1
- package/dist/cli/commands/messages.js +13 -15
- package/dist/cli/commands/messages.js.map +1 -1
- package/dist/cli/commands/messages.test.js +30 -31
- package/dist/cli/commands/messages.test.js.map +1 -1
- package/dist/cli/commands/ping.d.ts +9 -0
- package/dist/cli/commands/ping.d.ts.map +1 -1
- package/dist/cli/commands/ping.js +17 -4
- package/dist/cli/commands/ping.js.map +1 -1
- package/dist/cli/commands/presence.d.ts.map +1 -1
- package/dist/cli/commands/presence.js +6 -4
- package/dist/cli/commands/presence.js.map +1 -1
- package/dist/cli/commands/register.d.ts.map +1 -1
- package/dist/cli/commands/register.js +2 -1
- package/dist/cli/commands/register.js.map +1 -1
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +22 -11
- package/dist/cli/commands/send.js.map +1 -1
- package/dist/cli/commands/send.test.js +12 -9
- package/dist/cli/commands/send.test.js.map +1 -1
- package/dist/cli/commands/status.js +2 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/test-transport.d.ts +10 -0
- package/dist/cli/commands/test-transport.d.ts.map +1 -0
- package/dist/cli/commands/test-transport.js +29 -0
- package/dist/cli/commands/test-transport.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +5 -1
- package/dist/cli/commands/whoami.js.map +1 -1
- package/dist/cli/config.d.ts +42 -6
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +91 -27
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/http-client.d.ts +11 -1
- package/dist/cli/http-client.d.ts.map +1 -1
- package/dist/cli/http-client.js +13 -4
- package/dist/cli/http-client.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/profile.d.ts +3 -4
- package/dist/cli/profile.d.ts.map +1 -1
- package/dist/cli/profile.js +42 -29
- package/dist/cli/profile.js.map +1 -1
- package/dist/cli/runtime.d.ts.map +1 -1
- package/dist/cli/runtime.js +9 -4
- package/dist/cli/runtime.js.map +1 -1
- package/dist/cli/socket-client.d.ts +29 -4
- package/dist/cli/socket-client.d.ts.map +1 -1
- package/dist/cli/socket-client.js +52 -21
- package/dist/cli/socket-client.js.map +1 -1
- package/dist/cli/transport.d.ts +6 -9
- package/dist/cli/transport.d.ts.map +1 -1
- package/dist/cli/transport.js +47 -37
- package/dist/cli/transport.js.map +1 -1
- package/dist/cli/transport.test.js +19 -16
- package/dist/cli/transport.test.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partition-key.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.d.ts.map +1 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.js +33 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partition-worker.test.js → app-callback-partition-worker.test.js} +6 -8
- package/dist/internal/__tests__/app-callback-partition-worker.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partitioned-dispatcher-real-ws.test.js → app-callback-partitioned-dispatcher-real-ws.test.js} +69 -93
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partitioned-dispatcher.test.js → app-callback-partitioned-dispatcher.test.js} +36 -69
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-test-requests.d.ts +58 -0
- package/dist/internal/__tests__/app-callback-test-requests.d.ts.map +1 -0
- package/dist/internal/__tests__/app-callback-test-requests.js +124 -0
- package/dist/internal/__tests__/app-callback-test-requests.js.map +1 -0
- package/dist/internal/{s2c-dispatcher-errors.d.ts → app-callback-dispatcher-errors.d.ts} +5 -21
- package/dist/internal/app-callback-dispatcher-errors.d.ts.map +1 -0
- package/dist/internal/{s2c-dispatcher-errors.js → app-callback-dispatcher-errors.js} +3 -13
- package/dist/internal/app-callback-dispatcher-errors.js.map +1 -0
- package/dist/internal/app-callback-partition-key.d.ts +68 -0
- package/dist/internal/app-callback-partition-key.d.ts.map +1 -0
- package/dist/internal/app-callback-partition-key.js +90 -0
- package/dist/internal/app-callback-partition-key.js.map +1 -0
- package/dist/internal/{s2c-partition-worker.d.ts → app-callback-partition-worker.d.ts} +5 -5
- package/dist/internal/app-callback-partition-worker.d.ts.map +1 -0
- package/dist/internal/{s2c-partition-worker.js → app-callback-partition-worker.js} +5 -5
- package/dist/internal/app-callback-partition-worker.js.map +1 -0
- package/dist/internal/{s2c-partitioned-dispatcher.d.ts → app-callback-partitioned-dispatcher.d.ts} +9 -10
- package/dist/internal/app-callback-partitioned-dispatcher.d.ts.map +1 -0
- package/dist/internal/{s2c-partitioned-dispatcher.js → app-callback-partitioned-dispatcher.js} +13 -21
- package/dist/internal/app-callback-partitioned-dispatcher.js.map +1 -0
- package/dist/runtime/close-info.d.ts +15 -16
- package/dist/runtime/close-info.d.ts.map +1 -1
- package/dist/runtime/close-info.js +12 -8
- package/dist/runtime/close-info.js.map +1 -1
- package/dist/runtime/errors.d.ts +2 -28
- package/dist/runtime/errors.d.ts.map +1 -1
- package/dist/runtime/errors.js +0 -9
- package/dist/runtime/errors.js.map +1 -1
- package/dist/runtime/errors.test.js +4 -3
- package/dist/runtime/errors.test.js.map +1 -1
- package/dist/runtime/frame.d.ts +17 -18
- package/dist/runtime/frame.d.ts.map +1 -1
- package/dist/runtime/frame.js +86 -31
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/frame.test.js +15 -11
- package/dist/runtime/frame.test.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/local-service-commands.d.ts +7 -0
- package/dist/runtime/local-service-commands.d.ts.map +1 -0
- package/dist/runtime/local-service-commands.js +6 -0
- package/dist/runtime/local-service-commands.js.map +1 -0
- package/dist/runtime/runtime.test.js +3 -3
- package/dist/runtime/runtime.test.js.map +1 -1
- package/dist/runtime/subscribers.d.ts +37 -33
- package/dist/runtime/subscribers.d.ts.map +1 -1
- package/dist/runtime/subscribers.js +22 -21
- package/dist/runtime/subscribers.js.map +1 -1
- package/dist/runtime/subscribers.test.js +50 -31
- package/dist/runtime/subscribers.test.js.map +1 -1
- package/dist/service.d.ts +24 -39
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +190 -171
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +117 -175
- package/dist/service.test.js.map +1 -1
- package/dist/test/index.d.ts +9 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +14 -3
- package/dist/test/index.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +1 -2
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +28 -20
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/conformance-adapter.d.ts +2 -2
- package/dist/test-utils/conformance-adapter.d.ts.map +1 -1
- package/dist/test-utils/conformance-adapter.js +78 -54
- package/dist/test-utils/conformance-adapter.js.map +1 -1
- package/dist/test-utils/fake-service.d.ts +14 -39
- package/dist/test-utils/fake-service.d.ts.map +1 -1
- package/dist/test-utils/fake-service.js +33 -39
- package/dist/test-utils/fake-service.js.map +1 -1
- package/dist/test-utils/ids.d.ts +9 -0
- package/dist/test-utils/ids.d.ts.map +1 -0
- package/dist/test-utils/ids.js +52 -0
- package/dist/test-utils/ids.js.map +1 -0
- package/dist/test-utils/index.d.ts +10 -2
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +25 -9
- package/dist/test-utils/index.js.map +1 -1
- package/dist/ws-client.d.ts +59 -64
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +228 -175
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.js +190 -176
- package/dist/ws-client.test.js.map +1 -1
- package/package.json +3 -3
- package/dist/cli/commands/permissions.d.ts +0 -66
- package/dist/cli/commands/permissions.d.ts.map +0 -1
- package/dist/cli/commands/permissions.js +0 -101
- package/dist/cli/commands/permissions.js.map +0 -1
- package/dist/cli/commands/permissions.test.d.ts +0 -2
- package/dist/cli/commands/permissions.test.d.ts.map +0 -1
- package/dist/cli/commands/permissions.test.js +0 -126
- package/dist/cli/commands/permissions.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partition-key.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partition-key.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partition-key.test.js +0 -230
- package/dist/internal/__tests__/s2c-partition-key.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partition-worker.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partition-worker.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partition-worker.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.js.map +0 -1
- package/dist/internal/s2c-dispatcher-errors.d.ts.map +0 -1
- package/dist/internal/s2c-dispatcher-errors.js.map +0 -1
- package/dist/internal/s2c-partition-key.d.ts +0 -71
- package/dist/internal/s2c-partition-key.d.ts.map +0 -1
- package/dist/internal/s2c-partition-key.js +0 -140
- package/dist/internal/s2c-partition-key.js.map +0 -1
- package/dist/internal/s2c-partition-worker.d.ts.map +0 -1
- package/dist/internal/s2c-partition-worker.js.map +0 -1
- package/dist/internal/s2c-partitioned-dispatcher.d.ts.map +0 -1
- package/dist/internal/s2c-partitioned-dispatcher.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/runtime/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/runtime/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,iFAAiF;AACjF,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAIrB;CAAG;AAEL,+CAA+C;AAC/C,MAAM,OAAO,kBAAmB,SAAQ,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAE3E;IACA,IAAa,OAAO;QAClB,OAAO,oBAAoB,IAAI,CAAC,SAAS,EAAE,CAAC;IAC9C,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,8BAA+B,SAAQ,IAAI,CAAC,WAAW,CAClE,gCAAgC,CAGhC;IACA,IAAa,OAAO;QAClB,OAAO,qDAAqD,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5E,CAAC;CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { AgentNotFoundError, MalformedFrameError
|
|
2
|
+
import { AgentNotFoundError, MalformedFrameError } from "./errors.js";
|
|
3
|
+
import { MessagesSend, NotConnectedError, RpcServerError, RpcTimeoutError, } from "@moltzap/protocol";
|
|
3
4
|
describe("AgentNotFoundError", () => {
|
|
4
5
|
it("carries agentName and derives a `_tag` + `message`", () => {
|
|
5
6
|
const err = new AgentNotFoundError({ agentName: "foo" });
|
|
@@ -29,11 +30,11 @@ describe("NotConnectedError", () => {
|
|
|
29
30
|
describe("RpcTimeoutError", () => {
|
|
30
31
|
it("carries method + timeoutMs and `_tag === 'RpcTimeoutError'`", () => {
|
|
31
32
|
const err = new RpcTimeoutError({
|
|
32
|
-
method:
|
|
33
|
+
method: MessagesSend.name,
|
|
33
34
|
timeoutMs: 30_000,
|
|
34
35
|
});
|
|
35
36
|
expect(err._tag).toBe("RpcTimeoutError");
|
|
36
|
-
expect(err.method).toBe(
|
|
37
|
+
expect(err.method).toBe(MessagesSend.name);
|
|
37
38
|
expect(err.timeoutMs).toBe(30_000);
|
|
38
39
|
});
|
|
39
40
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/runtime/errors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/runtime/errors.test.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/frame.d.ts
CHANGED
|
@@ -1,31 +1,30 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import { type
|
|
2
|
+
import { type AnyAppCallbackRpcDefinition, type AnyNotificationDefinition, type DecodedNotification as ProtocolDecodedNotification, type DecodedRpcRequest, type JsonRpcStringId, type ResponseFrame } from "@moltzap/protocol";
|
|
3
3
|
import { MalformedFrameError } from "./errors.js";
|
|
4
|
-
|
|
4
|
+
import { type AppCallbackPartitionRoute } from "../internal/app-callback-partition-key.js";
|
|
5
|
+
/** Decoded response frame — narrowed from the protocol's `ResponseFrame`. */
|
|
5
6
|
export interface DecodedResponse {
|
|
6
7
|
readonly _tag: "Response";
|
|
7
|
-
readonly id:
|
|
8
|
+
readonly id: JsonRpcStringId;
|
|
8
9
|
readonly result?: unknown;
|
|
9
|
-
readonly error?: ResponseFrame
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export interface DecodedEvent {
|
|
13
|
-
readonly _tag: "Event";
|
|
14
|
-
readonly frame: EventFrame;
|
|
10
|
+
readonly error?: Extract<ResponseFrame, {
|
|
11
|
+
error: unknown;
|
|
12
|
+
}>["error"];
|
|
15
13
|
}
|
|
14
|
+
/** Decoded notification frame. */
|
|
15
|
+
export type DecodedNotification<D extends AnyNotificationDefinition = AnyNotificationDefinition> = ProtocolDecodedNotification<D> & {
|
|
16
|
+
readonly _tag: "Notification";
|
|
17
|
+
};
|
|
16
18
|
/**
|
|
17
|
-
* Decoded server-initiated (
|
|
19
|
+
* Decoded server-initiated (appCallback) request frame. The client routes these to
|
|
18
20
|
* its per-method handler registry; the server is the originator and awaits
|
|
19
|
-
* a matching
|
|
21
|
+
* a matching JSON-RPC response with the same id.
|
|
20
22
|
*/
|
|
21
|
-
export
|
|
23
|
+
export type DecodedServerRequest<D extends AnyAppCallbackRpcDefinition = AnyAppCallbackRpcDefinition> = DecodedRpcRequest<D> & {
|
|
22
24
|
readonly _tag: "ServerRequest";
|
|
23
|
-
readonly
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
readonly traceparent?: string;
|
|
27
|
-
}
|
|
28
|
-
export type DecodedFrame = DecodedResponse | DecodedEvent | DecodedServerRequest;
|
|
25
|
+
readonly partition: AppCallbackPartitionRoute;
|
|
26
|
+
};
|
|
27
|
+
export type DecodedFrame = DecodedResponse | DecodedNotification | DecodedServerRequest;
|
|
29
28
|
export declare const splitRawFrames: (raw: string) => Effect.Effect<ReadonlyArray<string>, MalformedFrameError>;
|
|
30
29
|
/**
|
|
31
30
|
* Central typed inbound frame decoder. JSON.parse + shape validation via the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAEL,KAAK,
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAEL,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAW9B,KAAK,mBAAmB,IAAI,2BAA2B,EACvD,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAEpB,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,2CAA2C,CAAC;AAEnD,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,OAAO,CAAC,CAAC;CACtE;AAED,kCAAkC;AAClC,MAAM,MAAM,mBAAmB,CAC7B,CAAC,SAAS,yBAAyB,GAAG,yBAAyB,IAC7D,2BAA2B,CAAC,CAAC,CAAC,GAAG;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,CAC9B,CAAC,SAAS,2BAA2B,GAAG,2BAA2B,IACjE,iBAAiB,CAAC,CAAC,CAAC,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,mBAAmB,GACnB,oBAAoB,CAAC;AA6HzB,eAAO,MAAM,cAAc,GACzB,KAAK,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAsEvD,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,KAAK,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAwB7D,CAAC"}
|
package/dist/runtime/frame.js
CHANGED
|
@@ -1,42 +1,100 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import { validators, } from "@moltzap/protocol";
|
|
2
|
+
import { validators, AppsOnBeforeDispatch, AppsOnBeforeMessageDelivery, AppsOnClose, AppsOnJoin, AppsOnSessionActive, appCallbackRpcGroup, decodeRpcRequest, isDecodedRpcRequest, isJsonRpcStringId, notificationGroup, } from "@moltzap/protocol";
|
|
3
3
|
import { MalformedFrameError } from "./errors.js";
|
|
4
|
+
import { LIFECYCLE_CONVERSATION_SENTINEL, } from "../internal/app-callback-partition-key.js";
|
|
4
5
|
const isFramePadding = (char) => char === "\u0000" || char === "\ufeff" || /\s/u.test(char);
|
|
5
6
|
const toDecodedFrame = (parsed) => {
|
|
7
|
+
const raw = JSON.stringify(parsed);
|
|
6
8
|
if (validators.responseFrame(parsed)) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// client would correspond to a client-originated server reply — but
|
|
10
|
-
// the client never originates s2c requests, so route as malformed.
|
|
11
|
-
if (frame.direction !== "c2s") {
|
|
12
|
-
return new MalformedFrameError({ raw: JSON.stringify(parsed) });
|
|
9
|
+
if (!isJsonRpcStringId(parsed.id)) {
|
|
10
|
+
return Effect.fail(new MalformedFrameError({ raw }));
|
|
13
11
|
}
|
|
14
|
-
return {
|
|
12
|
+
return Effect.succeed({
|
|
15
13
|
_tag: "Response",
|
|
16
|
-
id:
|
|
17
|
-
result:
|
|
18
|
-
error:
|
|
19
|
-
};
|
|
14
|
+
id: parsed.id,
|
|
15
|
+
result: "result" in parsed ? parsed.result : undefined,
|
|
16
|
+
error: "error" in parsed ? parsed.error : undefined,
|
|
17
|
+
});
|
|
20
18
|
}
|
|
21
19
|
if (validators.requestFrame(parsed)) {
|
|
22
|
-
|
|
23
|
-
// Symmetric defense: a `direction: "c2s"` request inbound on the
|
|
24
|
-
// client would mean the server is acting as a client — never legal.
|
|
25
|
-
if (frame.direction !== "s2c") {
|
|
26
|
-
return new MalformedFrameError({ raw: JSON.stringify(parsed) });
|
|
27
|
-
}
|
|
28
|
-
return {
|
|
20
|
+
return decodeRpcRequest(appCallbackRpcGroup, parsed).pipe(Effect.mapError((cause) => new MalformedFrameError({ raw, cause })), Effect.flatMap((request) => appCallbackPartitionRoute(request).pipe(Effect.map((partition) => ({
|
|
29
21
|
_tag: "ServerRequest",
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
...request,
|
|
23
|
+
partition,
|
|
24
|
+
})))));
|
|
25
|
+
}
|
|
26
|
+
if (validators.notificationFrame(parsed)) {
|
|
27
|
+
return Effect.succeed(toDecodedNotification(parsed));
|
|
28
|
+
}
|
|
29
|
+
return Effect.fail(new MalformedFrameError({ raw }));
|
|
30
|
+
};
|
|
31
|
+
const PASSTHROUGH_PARAMS_SCHEMA = Object.freeze({});
|
|
32
|
+
function makePassthroughNotificationDefinition(method) {
|
|
33
|
+
const validate = (data) => data === data;
|
|
34
|
+
const def = {
|
|
35
|
+
name: method,
|
|
36
|
+
paramsSchema: PASSTHROUGH_PARAMS_SCHEMA,
|
|
37
|
+
validateParams: validate,
|
|
38
|
+
Params: undefined,
|
|
39
|
+
};
|
|
40
|
+
return passthroughCast(def);
|
|
41
|
+
}
|
|
42
|
+
// Single chokepoint for the runtime-only widening cast on a passthrough
|
|
43
|
+
// notification definition. ACG's `as-unknown-as` rule and the
|
|
44
|
+
// `sloppy-code-guard.sh` pragma check both opt out here; everywhere else
|
|
45
|
+
// in the package keeps the strict ban.
|
|
46
|
+
function passthroughCast(def) {
|
|
47
|
+
// eslint-disable-next-line agent-code-guard/as-unknown-as -- passthrough definition for unknown-method notifications; structurally compatible with NotificationDefinition but TypeScript can't narrow the literal `Name` union
|
|
48
|
+
return def; // #ignore-sloppy-code[as-unknown-as]: passthrough for unknown-method notifications
|
|
49
|
+
}
|
|
50
|
+
const toDecodedNotification = (parsed) => {
|
|
51
|
+
const known = notificationGroup.byName.get(parsed.method);
|
|
52
|
+
const definition = known ?? makePassthroughNotificationDefinition(parsed.method);
|
|
53
|
+
const decoded = {
|
|
54
|
+
jsonrpc: parsed.jsonrpc,
|
|
55
|
+
method: definition.name,
|
|
56
|
+
};
|
|
57
|
+
if (parsed.params !== undefined)
|
|
58
|
+
decoded["params"] = parsed.params;
|
|
59
|
+
Object.defineProperty(decoded, "_tag", {
|
|
60
|
+
value: "Notification",
|
|
61
|
+
enumerable: false,
|
|
62
|
+
});
|
|
63
|
+
Object.defineProperty(decoded, "definition", {
|
|
64
|
+
value: definition,
|
|
65
|
+
enumerable: false,
|
|
66
|
+
});
|
|
67
|
+
return decoded;
|
|
68
|
+
};
|
|
69
|
+
const lifecycleRoute = (sessionId) => ({
|
|
70
|
+
sessionId,
|
|
71
|
+
conversationId: LIFECYCLE_CONVERSATION_SENTINEL,
|
|
72
|
+
});
|
|
73
|
+
const appCallbackPartitionRoute = (request) => {
|
|
74
|
+
if (isDecodedRpcRequest(AppsOnBeforeDispatch, request)) {
|
|
75
|
+
return Effect.succeed({
|
|
76
|
+
sessionId: request.params.sessionId,
|
|
77
|
+
conversationId: request.params.conversationId,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (isDecodedRpcRequest(AppsOnBeforeMessageDelivery, request)) {
|
|
81
|
+
return Effect.succeed({
|
|
82
|
+
sessionId: request.params.sessionId,
|
|
83
|
+
conversationId: request.params.conversationId,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (isDecodedRpcRequest(AppsOnSessionActive, request)) {
|
|
87
|
+
return Effect.succeed(lifecycleRoute(request.params.sessionId));
|
|
35
88
|
}
|
|
36
|
-
if (
|
|
37
|
-
return
|
|
89
|
+
if (isDecodedRpcRequest(AppsOnJoin, request)) {
|
|
90
|
+
return Effect.succeed(lifecycleRoute(request.params.sessionId));
|
|
38
91
|
}
|
|
39
|
-
|
|
92
|
+
if (isDecodedRpcRequest(AppsOnClose, request)) {
|
|
93
|
+
return Effect.succeed(lifecycleRoute(request.params.sessionId));
|
|
94
|
+
}
|
|
95
|
+
return Effect.fail(new MalformedFrameError({
|
|
96
|
+
raw: "unroutable app-callback request descriptor",
|
|
97
|
+
}));
|
|
40
98
|
};
|
|
41
99
|
export const splitRawFrames = (raw) => Effect.try({
|
|
42
100
|
try: () => {
|
|
@@ -116,10 +174,7 @@ export const decodeFrames = (raw) => Effect.gen(function* () {
|
|
|
116
174
|
catch (err) {
|
|
117
175
|
return yield* Effect.fail(new MalformedFrameError({ raw: frameText, cause: err }));
|
|
118
176
|
}
|
|
119
|
-
const decoded = toDecodedFrame(parsed);
|
|
120
|
-
if (decoded instanceof MalformedFrameError) {
|
|
121
|
-
return yield* Effect.fail(new MalformedFrameError({ raw: frameText }));
|
|
122
|
-
}
|
|
177
|
+
const decoded = yield* toDecodedFrame(parsed).pipe(Effect.mapError((cause) => new MalformedFrameError({ raw: frameText, cause })));
|
|
123
178
|
decodedFrames.push(decoded);
|
|
124
179
|
}
|
|
125
180
|
return decodedFrames;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,UAAU,
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,UAAU,EAGV,oBAAoB,EACpB,2BAA2B,EAC3B,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,GAMlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,+BAA+B,GAEhC,MAAM,2CAA2C,CAAC;AAkCnD,MAAM,cAAc,GAAG,CAAC,IAAY,EAAW,EAAE,CAC/C,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE7D,MAAM,cAAc,GAAG,CACrB,MAAe,EACmC,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC;YACpB,IAAI,EAAE,UAAmB;YACzB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACtD,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACpD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,OAAO,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,IAAI,CACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EACnE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACzB,yBAAyB,CAAC,OAAO,CAAC,CAAC,IAAI,CACrC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,eAAwB;YAC9B,GAAG,OAAO;YACV,SAAS;SACV,CAAC,CAAC,CACJ,CACF,CACF,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEpD,SAAS,qCAAqC,CAC5C,MAAmC;IAEnC,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAmB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;IACnE,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,yBAAyB;QACvC,cAAc,EAAE,QAAQ;QACxB,MAAM,EAAE,SAAS;KAClB,CAAC;IACF,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,wEAAwE;AACxE,8DAA8D;AAC9D,yEAAyE;AACzE,uCAAuC;AACvC,SAAS,eAAe,CAAC,GAAW;IAClC,+NAA+N;IAC/N,OAAO,GAA2C,CAAC,CAAC,mFAAmF;AACzI,CAAC;AAED,MAAM,qBAAqB,GAAG,CAC5B,MAAyB,EACJ,EAAE;IACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GACd,KAAK,IAAI,qCAAqC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,OAAO,GAA4B;QACvC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,UAAU,CAAC,IAAI;KACxB,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACnE,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;QACrC,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE;QAC3C,KAAK,EAAE,UAAU;QACjB,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,OAAO,OAA8B,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAAiB,EAA6B,EAAE,CAAC,CAAC;IACxE,SAAS;IACT,cAAc,EAAE,+BAA+B;CAChD,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,CAChC,OAAuD,EACQ,EAAE;IACjE,IAAI,mBAAmB,CAAC,oBAAoB,EAAE,OAAO,CAAC,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC,OAAO,CAAC;YACpB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS;YACnC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc;SAC9C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,mBAAmB,CAAC,2BAA2B,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9D,OAAO,MAAM,CAAC,OAAO,CAAC;YACpB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS;YACnC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc;SAC9C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,mBAAmB,CAAC,mBAAmB,EAAE,OAAO,CAAC,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,mBAAmB,CAAC;QACtB,GAAG,EAAE,4CAA4C;KAClD,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,GAAW,EACgD,EAAE,CAC7D,MAAM,CAAC,GAAG,CAAC;IACT,GAAG,EAAE,GAAG,EAAE;QACR,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAE,CAAC;YAEzB,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzB,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACjB,MAAM,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,KAAK,GAAG,KAAK,CAAC;gBACd,KAAK,GAAG,CAAC,CAAC;gBACV,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,GAAG,KAAK,CAAC;oBAChB,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClB,OAAO,GAAG,IAAI,CAAC;oBACf,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACjB,QAAQ,GAAG,KAAK,CAAC;gBACnB,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,QAAQ,GAAG,IAAI,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,SAAS;YACX,CAAC;YAED,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACzC,KAAK,GAAG,CAAC,CAAC,CAAC;QACb,CAAC;QAED,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,KAAK,YAAY,mBAAmB;QAClC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;CAC9C,CAAC,CAAC;AAEL;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAW,EACsD,EAAE,CACnE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CACxD,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAChD,MAAM,CAAC,QAAQ,CACb,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAC9D,CACF,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { MessageReceivedNotificationDefinition, agentId, conversationId, messageId, notificationFrame, } from "@moltzap/protocol";
|
|
3
4
|
import { decodeFrames } from "./frame.js";
|
|
5
|
+
const TEST_MESSAGE = {
|
|
6
|
+
id: messageId("11111111-1111-4111-8111-111111111111"),
|
|
7
|
+
conversationId: conversationId("22222222-2222-4222-8222-222222222222"),
|
|
8
|
+
senderId: agentId("33333333-3333-4333-8333-333333333333"),
|
|
9
|
+
parts: [{ type: "text", text: "hello" }],
|
|
10
|
+
createdAt: "2026-05-03T00:00:00.000Z",
|
|
11
|
+
};
|
|
4
12
|
describe("decodeFrames", () => {
|
|
5
|
-
it("decodes padded chunks that contain both
|
|
6
|
-
const raw = JSON.stringify({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
event: "messages/received",
|
|
10
|
-
data: { message: { id: "m-1", conversationId: "c-1" } },
|
|
11
|
-
}) +
|
|
13
|
+
it("decodes padded chunks that contain both a notification and a response", async () => {
|
|
14
|
+
const raw = JSON.stringify(notificationFrame(MessageReceivedNotificationDefinition, {
|
|
15
|
+
message: TEST_MESSAGE,
|
|
16
|
+
})) +
|
|
12
17
|
"\u0000\n" +
|
|
13
18
|
JSON.stringify({
|
|
14
19
|
jsonrpc: "2.0",
|
|
15
|
-
type: "response",
|
|
16
|
-
direction: "c2s",
|
|
17
20
|
id: "rpc-7",
|
|
18
21
|
result: { ok: true },
|
|
19
22
|
});
|
|
20
23
|
const decoded = await Effect.runPromise(decodeFrames(raw));
|
|
21
24
|
expect(decoded).toHaveLength(2);
|
|
22
25
|
expect(decoded[0]).toMatchObject({
|
|
23
|
-
_tag: "
|
|
24
|
-
|
|
26
|
+
_tag: "Notification",
|
|
27
|
+
method: MessageReceivedNotificationDefinition.name,
|
|
28
|
+
params: { message: TEST_MESSAGE },
|
|
25
29
|
});
|
|
26
30
|
expect(decoded[1]).toMatchObject({
|
|
27
31
|
_tag: "Response",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.test.js","sourceRoot":"","sources":["../../src/runtime/frame.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"frame.test.js","sourceRoot":"","sources":["../../src/runtime/frame.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,qCAAqC,EACrC,OAAO,EACP,cAAc,EACd,SAAS,EACT,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,YAAY,GAAG;IACnB,EAAE,EAAE,SAAS,CAAC,sCAAsC,CAAC;IACrD,cAAc,EAAE,cAAc,CAAC,sCAAsC,CAAC;IACtE,QAAQ,EAAE,OAAO,CAAC,sCAAsC,CAAC;IACzD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACjD,SAAS,EAAE,0BAA0B;CACtC,CAAC;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,GAAG,GACP,IAAI,CAAC,SAAS,CACZ,iBAAiB,CAAC,qCAAqC,EAAE;YACvD,OAAO,EAAE,YAAY;SACtB,CAAC,CACH;YACD,UAAU;YACV,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;aACrB,CAAC,CAAC;QAEL,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3D,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/B,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,qCAAqC,CAAC,IAAI;YAClD,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/B,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { AgentNotFoundError,
|
|
1
|
+
export { AgentNotFoundError, MalformedFrameError } from "./errors.js";
|
|
2
2
|
export { snapshot, getOr } from "./refs.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { AgentNotFoundError,
|
|
1
|
+
export { AgentNotFoundError, MalformedFrameError } from "./errors.js";
|
|
2
2
|
export { snapshot, getOr } from "./refs.js";
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const LocalServiceCommands: {
|
|
2
|
+
readonly Ping: "ping";
|
|
3
|
+
readonly Status: "status";
|
|
4
|
+
readonly History: "history";
|
|
5
|
+
};
|
|
6
|
+
export type LocalServiceCommand = (typeof LocalServiceCommands)[keyof typeof LocalServiceCommands];
|
|
7
|
+
//# sourceMappingURL=local-service-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-service-commands.d.ts","sourceRoot":"","sources":["../../src/runtime/local-service-commands.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAC7B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-service-commands.js","sourceRoot":"","sources":["../../src/runtime/local-service-commands.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;CACV,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { it } from "@effect/vitest";
|
|
2
2
|
import { Effect, Exit } from "effect";
|
|
3
3
|
import { expect, it as itSync } from "vitest";
|
|
4
|
-
import { NotConnectedError, RpcServerError, RpcTimeoutError, } from "
|
|
4
|
+
import { MessagesSend, NotConnectedError, RpcServerError, RpcTimeoutError, } from "@moltzap/protocol";
|
|
5
5
|
it.effect("tagged errors discriminate by _tag", () => Effect.gen(function* () {
|
|
6
|
-
const exit = yield* Effect.exit(Effect.fail(new RpcTimeoutError({ method:
|
|
6
|
+
const exit = yield* Effect.exit(Effect.fail(new RpcTimeoutError({ method: MessagesSend.name, timeoutMs: 30_000 })));
|
|
7
7
|
if (Exit.isFailure(exit) && exit.cause._tag === "Fail") {
|
|
8
8
|
const err = exit.cause.error;
|
|
9
9
|
expect(err._tag).toBe("RpcTimeoutError");
|
|
10
|
-
expect(err.method).toBe(
|
|
10
|
+
expect(err.method).toBe(MessagesSend.name);
|
|
11
11
|
}
|
|
12
12
|
else {
|
|
13
13
|
throw new Error("expected failure");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.test.js","sourceRoot":"","sources":["../../src/runtime/runtime.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,
|
|
1
|
+
{"version":3,"file":"runtime.test.js","sourceRoot":"","sources":["../../src/runtime/runtime.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,EAAE,CAAC,MAAM,CAAC,oCAAoC,EAAE,GAAG,EAAE,CACnD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAC7B,MAAM,CAAC,IAAI,CACT,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CACtE,CACF,CAAC;IACF,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAClD,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC;QAC7B,IAAI,EAAE,CAAC,KAAK;QACZ,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC5D,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-subscription
|
|
2
|
+
* Per-subscription notification registry for `MoltZapWsClient`.
|
|
3
3
|
*
|
|
4
4
|
* Responsibility: own the list of live `subscribe()` handles and fan each
|
|
5
|
-
* inbound
|
|
5
|
+
* inbound JSON-RPC notification out to every subscription whose filter matches.
|
|
6
6
|
* Implements spec #222 §5.3 (C4 + the `RealClientEventSubscriber.subscribe`
|
|
7
7
|
* filter stub). Lives as an internal collaborator of `MoltZapWsClient`;
|
|
8
|
-
* the public types (`SubscriptionFilter`, `
|
|
8
|
+
* the public types (`SubscriptionFilter`, `NotificationSubscription`,
|
|
9
9
|
* `SubscriptionId`) re-export from the package barrel.
|
|
10
10
|
*
|
|
11
|
-
* Dispatch ordering (Invariant 6 —
|
|
11
|
+
* Dispatch ordering (Invariant 6 — notifications delivered in arrival order):
|
|
12
12
|
* 1. Inbound frames are handed to the registry in arrival order.
|
|
13
13
|
* 2. Within a single frame, subscriptions are notified in registration
|
|
14
14
|
* order.
|
|
15
|
-
* 3. There is no separate legacy `
|
|
16
|
-
* resolved by DELETING `MoltZapWsClientOptions.
|
|
17
|
-
* that want
|
|
15
|
+
* 3. There is no separate legacy `onNotification` fanout — spec #222 OQ-4 is
|
|
16
|
+
* resolved by DELETING `MoltZapWsClientOptions.onNotification`. Callers
|
|
17
|
+
* that want every notification register `subscribe({}, handler)` after
|
|
18
18
|
* construction and before `connect()`.
|
|
19
19
|
*
|
|
20
20
|
* Unsubscribe semantics (OQ-3 A): `unsubscribe` takes effect on the next
|
|
@@ -25,20 +25,23 @@
|
|
|
25
25
|
*
|
|
26
26
|
* Error channel: handlers are invoked inside a defect-catcher; a throw is
|
|
27
27
|
* logged via the client's injected `WsClientLogger` and swallowed
|
|
28
|
-
* (matching the prior `
|
|
28
|
+
* (matching the prior `onNotification` contract at `ws-client.ts:650-655`
|
|
29
29
|
* pre-deletion). The registry itself has no typed error surface —
|
|
30
30
|
* `register`, `dispatch`, and `closeAll` are `Effect<T, never>`.
|
|
31
31
|
*/
|
|
32
|
-
import { Effect } from "effect";
|
|
33
|
-
import type {
|
|
32
|
+
import { Brand, Effect } from "effect";
|
|
33
|
+
import type { DecodedNotification } from "./frame.js";
|
|
34
|
+
interface FilterableNotificationFrame {
|
|
35
|
+
readonly method: string;
|
|
36
|
+
readonly params?: unknown;
|
|
37
|
+
}
|
|
34
38
|
/** Branded identifier for a subscription handle. Minted by `register`. */
|
|
35
|
-
export type SubscriptionId = string &
|
|
36
|
-
|
|
37
|
-
};
|
|
39
|
+
export type SubscriptionId = string & Brand.Brand<"SubscriptionId">;
|
|
40
|
+
export declare const SubscriptionId: Brand.Brand.Constructor<SubscriptionId>;
|
|
38
41
|
/**
|
|
39
|
-
* Filter grammar for `subscribe`.
|
|
42
|
+
* Filter grammar for `subscribe`. A notification is delivered to a subscription
|
|
40
43
|
* iff it matches **every** field that is set on the filter. Unset fields
|
|
41
|
-
* are wildcards; the empty filter `{}` matches every
|
|
44
|
+
* are wildcards; the empty filter `{}` matches every notification.
|
|
42
45
|
*
|
|
43
46
|
* OQ-2 resolution (A): exactly these three fields, no free-form
|
|
44
47
|
* predicate, no schema-derived matcher. Matches the existing
|
|
@@ -47,20 +50,20 @@ export type SubscriptionId = string & {
|
|
|
47
50
|
* one-for-one.
|
|
48
51
|
*
|
|
49
52
|
* - `emissionTag` — exact match against the canonical payload key
|
|
50
|
-
* `frame.
|
|
53
|
+
* `frame.params.__emissionTag`. (The adapter reads the same key at
|
|
51
54
|
* `packages/client/src/test-utils/conformance-adapter.ts:77-79`;
|
|
52
55
|
* `emitTaggedEventDefault` writes it at `runner.ts:343-357`. The
|
|
53
56
|
* `__emissionId` string in the `runner.ts:108` doc comment is a
|
|
54
57
|
* known doc-bug — architect files a follow-up issue against
|
|
55
58
|
* protocol to correct the comment; it is not the canonical name.)
|
|
56
|
-
* - `conversationId` — exact match against `frame.
|
|
57
|
-
* when set on the
|
|
58
|
-
* - `
|
|
59
|
+
* - `conversationId` — exact match against `frame.params.conversationId`
|
|
60
|
+
* when set on the notification payload.
|
|
61
|
+
* - `notificationNamePrefix` — `frame.method.startsWith(prefix)`.
|
|
59
62
|
*/
|
|
60
63
|
export interface SubscriptionFilter {
|
|
61
64
|
readonly emissionTag?: string;
|
|
62
65
|
readonly conversationId?: string;
|
|
63
|
-
readonly
|
|
66
|
+
readonly notificationNamePrefix?: string;
|
|
64
67
|
}
|
|
65
68
|
/**
|
|
66
69
|
* Handle returned by `register` / `MoltZapWsClient.subscribe`. Caller
|
|
@@ -70,7 +73,7 @@ export interface SubscriptionFilter {
|
|
|
70
73
|
* `unsubscribe` is `Effect<void, never>`: it is idempotent and total.
|
|
71
74
|
* Calling `unsubscribe` a second time, or after `closeAll`, is a no-op.
|
|
72
75
|
*/
|
|
73
|
-
export interface
|
|
76
|
+
export interface NotificationSubscription {
|
|
74
77
|
readonly id: SubscriptionId;
|
|
75
78
|
readonly unsubscribe: Effect.Effect<void, never>;
|
|
76
79
|
}
|
|
@@ -86,7 +89,7 @@ export interface EventSubscription {
|
|
|
86
89
|
* handler on subscription A does not reorder frames seen by
|
|
87
90
|
* subscription B across frames.
|
|
88
91
|
*/
|
|
89
|
-
export type SubscriberHandler = (frame:
|
|
92
|
+
export type SubscriberHandler = (frame: DecodedNotification) => Effect.Effect<void, never>;
|
|
90
93
|
/**
|
|
91
94
|
* Subscriber registry. One instance per `MoltZapWsClient`, created at
|
|
92
95
|
* construction time and owned by the client. Not exported from the
|
|
@@ -98,13 +101,13 @@ export interface SubscriberRegistry {
|
|
|
98
101
|
* Add a subscription. Returns the handle immediately; delivery starts
|
|
99
102
|
* with the next frame passed to `dispatch`. Does not await any
|
|
100
103
|
* connection state — subscribe is legal pre-connect (spec §5.3 +
|
|
101
|
-
* Assumption 1 deletion: post-delete of `
|
|
102
|
-
* only pre-connect
|
|
104
|
+
* Assumption 1 deletion: post-delete of `onNotification`, subscribe is the
|
|
105
|
+
* only pre-connect notification hook).
|
|
103
106
|
*/
|
|
104
|
-
readonly register: (filter: SubscriptionFilter, handler: SubscriberHandler) => Effect.Effect<
|
|
107
|
+
readonly register: (filter: SubscriptionFilter, handler: SubscriberHandler) => Effect.Effect<NotificationSubscription, never>;
|
|
105
108
|
/**
|
|
106
|
-
* Fan an inbound
|
|
107
|
-
* `MoltZapWsClient.handleIncoming` at the existing
|
|
109
|
+
* Fan an inbound notification out to every matching subscription. Called by
|
|
110
|
+
* `MoltZapWsClient.handleIncoming` at the existing notification-dispatch
|
|
108
111
|
* point (`ws-client.ts:649-685`). Implementation snapshots the
|
|
109
112
|
* live-subscription list at the start of dispatch so
|
|
110
113
|
* unsubscribe-during-dispatch observes next-frame semantics (OQ-3 A).
|
|
@@ -113,7 +116,7 @@ export interface SubscriberRegistry {
|
|
|
113
116
|
* handlers block later subscriptions for this frame but never
|
|
114
117
|
* reorder frame N relative to frame N+1.
|
|
115
118
|
*/
|
|
116
|
-
readonly dispatch: (frame:
|
|
119
|
+
readonly dispatch: (frame: DecodedNotification) => Effect.Effect<void, never>;
|
|
117
120
|
/**
|
|
118
121
|
* Drop every live subscription. Called from `MoltZapWsClient.close`
|
|
119
122
|
* so handlers stop firing once the client is torn down. Idempotent.
|
|
@@ -137,7 +140,7 @@ export interface SubscriberRegistry {
|
|
|
137
140
|
* - Handler exceptions are caught with `Effect.catchAllDefect` after
|
|
138
141
|
* the handler Effect. Sync `throw` from a `(frame) => …` body
|
|
139
142
|
* surfaces as a defect; we log + swallow to match the pre-deletion
|
|
140
|
-
* `
|
|
143
|
+
* `onNotification` contract.
|
|
141
144
|
*/
|
|
142
145
|
export declare function makeSubscriberRegistry(logger: {
|
|
143
146
|
readonly warn: (...args: ReadonlyArray<unknown>) => void;
|
|
@@ -148,10 +151,11 @@ export declare function makeSubscriberRegistry(logger: {
|
|
|
148
151
|
* behavior without bypassing the production dispatch path.
|
|
149
152
|
*
|
|
150
153
|
* Returns `true` iff `frame` matches every set field on `filter`:
|
|
151
|
-
* - `filter.emissionTag === frame.
|
|
152
|
-
* - `filter.conversationId === frame.
|
|
153
|
-
* - `frame.
|
|
154
|
+
* - `filter.emissionTag === frame.params.__emissionTag` (strict ===)
|
|
155
|
+
* - `filter.conversationId === frame.params.conversationId` (strict ===)
|
|
156
|
+
* - `frame.method.startsWith(filter.notificationNamePrefix)`
|
|
154
157
|
* Unset filter fields are wildcards.
|
|
155
158
|
*/
|
|
156
|
-
export declare function matchesFilter(filter: SubscriptionFilter, frame:
|
|
159
|
+
export declare function matchesFilter(filter: SubscriptionFilter, frame: FilterableNotificationFrame): boolean;
|
|
160
|
+
export {};
|
|
157
161
|
//# sourceMappingURL=subscribers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,MAAM,EAAO,MAAM,QAAQ,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,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,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;AACpE,eAAO,MAAM,cAAc,yCAAkC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,mBAAmB,KACvB,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;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE9E;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAC/C;AAcD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CAC1D,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CA8C3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAmBT"}
|