@masons/runtime-broker 0.1.1 → 0.2.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/broker/broker-daemon.d.ts.map +1 -1
- package/dist/broker/broker-daemon.js +24 -2
- package/dist/broker/ipc-server.d.ts +9 -1
- package/dist/broker/ipc-server.d.ts.map +1 -1
- package/dist/broker/ipc-server.js +30 -6
- package/dist/broker/version-handshake.d.ts +5 -1
- package/dist/broker/version-handshake.d.ts.map +1 -1
- package/dist/broker/version-handshake.js +2 -1
- package/dist/broker-client/broker-client.d.ts +13 -0
- package/dist/broker-client/broker-client.d.ts.map +1 -1
- package/dist/broker-client/broker-client.js +54 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broker-daemon.d.ts","sourceRoot":"","sources":["../../src/broker/broker-daemon.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"broker-daemon.d.ts","sourceRoot":"","sources":["../../src/broker/broker-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -113,6 +113,7 @@ export async function startBrokerDaemon(opts) {
|
|
|
113
113
|
return;
|
|
114
114
|
replyCorrelationCache.record(endpoint_id, c);
|
|
115
115
|
};
|
|
116
|
+
const channels = new Map();
|
|
116
117
|
let networkPresence = "offline";
|
|
117
118
|
let presenceGraceTimer;
|
|
118
119
|
const applyPresenceTransition = (event) => {
|
|
@@ -150,6 +151,15 @@ export async function startBrokerDaemon(opts) {
|
|
|
150
151
|
ts: Date.now(),
|
|
151
152
|
reason: effect.reason,
|
|
152
153
|
});
|
|
154
|
+
if (channels.size > 0) {
|
|
155
|
+
for (const ws of channels.values()) {
|
|
156
|
+
pushToPlugin(ws, {
|
|
157
|
+
event: "presence_changed",
|
|
158
|
+
presence: effect.presence,
|
|
159
|
+
...(effect.reason ? { reason: effect.reason } : {}),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
153
163
|
if (effect.presence === "online") {
|
|
154
164
|
void retryQueue.flush(async (entry) => {
|
|
155
165
|
await apiPort.transitionState(entry.endpoint_id, entry.params);
|
|
@@ -166,7 +176,6 @@ export async function startBrokerDaemon(opts) {
|
|
|
166
176
|
connector.on("disconnected", () => {
|
|
167
177
|
applyPresenceTransition({ type: "connector_disconnected" });
|
|
168
178
|
});
|
|
169
|
-
const channels = new Map();
|
|
170
179
|
const wsEndpoints = new WeakMap();
|
|
171
180
|
const heartbeatTimers = new Map();
|
|
172
181
|
const displacedWs = new WeakSet();
|
|
@@ -571,7 +580,19 @@ export async function startBrokerDaemon(opts) {
|
|
|
571
580
|
source_endpoint_id: body.endpoint_id,
|
|
572
581
|
require_live: body.require_live ?? false,
|
|
573
582
|
};
|
|
574
|
-
|
|
583
|
+
let ack;
|
|
584
|
+
try {
|
|
585
|
+
ack = await connector.send(body.to, body.content, body.contentType ?? "text", metadata);
|
|
586
|
+
}
|
|
587
|
+
catch (err) {
|
|
588
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
589
|
+
if (msg === "WebSocket not connected" || msg === "SEND_ACK timeout") {
|
|
590
|
+
throw new BrokerHttpError(503, "connector_unavailable", msg, {
|
|
591
|
+
retryable: true,
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
throw err;
|
|
595
|
+
}
|
|
575
596
|
return { messageId: ack.messageId, status: ack.status };
|
|
576
597
|
},
|
|
577
598
|
async reattachEndpoint(endpoint_id, plugin_pid, _ipcWsHint) {
|
|
@@ -672,6 +693,7 @@ export async function startBrokerDaemon(opts) {
|
|
|
672
693
|
bearerToken,
|
|
673
694
|
handlers,
|
|
674
695
|
logger,
|
|
696
|
+
getNetworkPresence: () => networkPresence,
|
|
675
697
|
onChannelOpened: (plugin_pid, ws) => {
|
|
676
698
|
const prior = channels.get(plugin_pid);
|
|
677
699
|
if (prior && prior !== ws) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type RawData, WebSocket } from "ws";
|
|
2
2
|
import type { BrokerLogger } from "./logger.js";
|
|
3
|
+
import type { NetworkPresence } from "./network-presence.js";
|
|
3
4
|
export interface IPCServerHandlers {
|
|
4
5
|
registerEndpoint(body: RegisterEndpointBody, ipcWs: WebSocket): Promise<RegisterEndpointResponse>;
|
|
5
6
|
heartbeatEndpoint(endpoint_id: string): Promise<void>;
|
|
@@ -46,10 +47,12 @@ export interface SendResponse {
|
|
|
46
47
|
messageId: string;
|
|
47
48
|
status: string;
|
|
48
49
|
}
|
|
50
|
+
export type BrokerHttpErrorExtra = Record<string, unknown>;
|
|
49
51
|
export declare class BrokerHttpError extends Error {
|
|
50
52
|
readonly status: number;
|
|
51
53
|
readonly code: string;
|
|
52
|
-
|
|
54
|
+
readonly extra?: BrokerHttpErrorExtra;
|
|
55
|
+
constructor(status: number, code: string, message: string, extra?: BrokerHttpErrorExtra);
|
|
53
56
|
}
|
|
54
57
|
export interface IPCServerOptions {
|
|
55
58
|
bearerToken: string;
|
|
@@ -57,6 +60,7 @@ export interface IPCServerOptions {
|
|
|
57
60
|
logger: BrokerLogger;
|
|
58
61
|
onChannelOpened?: (plugin_pid: number, ws: WebSocket) => void;
|
|
59
62
|
onChannelClosed?: (plugin_pid: number, ws: WebSocket) => void;
|
|
63
|
+
getNetworkPresence: () => NetworkPresence;
|
|
60
64
|
}
|
|
61
65
|
export interface RunningIPCServer {
|
|
62
66
|
ipcUrl: string;
|
|
@@ -74,6 +78,10 @@ export type PushEvent = {
|
|
|
74
78
|
} | {
|
|
75
79
|
event: "ping";
|
|
76
80
|
ts: string;
|
|
81
|
+
} | {
|
|
82
|
+
event: "presence_changed";
|
|
83
|
+
presence: NetworkPresence;
|
|
84
|
+
reason?: string;
|
|
77
85
|
};
|
|
78
86
|
export declare function parsePluginFrame(data: RawData): unknown;
|
|
79
87
|
//# sourceMappingURL=ipc-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc-server.d.ts","sourceRoot":"","sources":["../../src/broker/ipc-server.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,KAAK,OAAO,EAAE,SAAS,EAAmB,MAAM,IAAI,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ipc-server.d.ts","sourceRoot":"","sources":["../../src/broker/ipc-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,20 +2,36 @@ import { createServer } from "node:http";
|
|
|
2
2
|
import { WebSocket, WebSocketServer } from "ws";
|
|
3
3
|
import { PLUGIN_VERSION } from "../version.js";
|
|
4
4
|
import { handleInitialize, IPC_PROTOCOL_VERSION, SERVER_CAPABILITIES, } from "./version-handshake.js";
|
|
5
|
+
const BROKER_ERROR_RESERVED_KEYS = new Set(["error", "message"]);
|
|
6
|
+
function sanitizeBrokerErrorExtra(extra) {
|
|
7
|
+
if (!extra)
|
|
8
|
+
return {};
|
|
9
|
+
const out = {};
|
|
10
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
11
|
+
if (BROKER_ERROR_RESERVED_KEYS.has(key))
|
|
12
|
+
continue;
|
|
13
|
+
out[key] = value;
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
5
17
|
export class BrokerHttpError extends Error {
|
|
6
18
|
status;
|
|
7
19
|
code;
|
|
8
|
-
|
|
20
|
+
extra;
|
|
21
|
+
constructor(status, code, message, extra) {
|
|
9
22
|
super(message);
|
|
10
23
|
this.name = "BrokerHttpError";
|
|
11
24
|
this.status = status;
|
|
12
25
|
this.code = code;
|
|
26
|
+
if (extra !== undefined) {
|
|
27
|
+
this.extra = extra;
|
|
28
|
+
}
|
|
13
29
|
}
|
|
14
30
|
}
|
|
15
31
|
export async function startIPCServer(opts) {
|
|
16
|
-
const { bearerToken, handlers, logger, onChannelOpened, onChannelClosed } = opts;
|
|
32
|
+
const { bearerToken, handlers, logger, onChannelOpened, onChannelClosed, getNetworkPresence, } = opts;
|
|
17
33
|
const http = createServer((req, res) => {
|
|
18
|
-
void routeHttp(req, res, bearerToken, handlers, logger);
|
|
34
|
+
void routeHttp(req, res, bearerToken, handlers, logger, getNetworkPresence);
|
|
19
35
|
});
|
|
20
36
|
const wss = new WebSocketServer({ noServer: true });
|
|
21
37
|
http.on("upgrade", (req, socket, head) => {
|
|
@@ -59,7 +75,7 @@ export async function startIPCServer(opts) {
|
|
|
59
75
|
},
|
|
60
76
|
};
|
|
61
77
|
}
|
|
62
|
-
async function routeHttp(req, res, bearerToken, handlers, logger) {
|
|
78
|
+
async function routeHttp(req, res, bearerToken, handlers, logger, getNetworkPresence) {
|
|
63
79
|
const url = req.url ?? "";
|
|
64
80
|
const method = req.method ?? "GET";
|
|
65
81
|
if (method === "GET" && url === "/health") {
|
|
@@ -78,7 +94,9 @@ async function routeHttp(req, res, bearerToken, handlers, logger) {
|
|
|
78
94
|
try {
|
|
79
95
|
if (method === "POST" && url === "/v1/initialize") {
|
|
80
96
|
const body = await readJson(req);
|
|
81
|
-
const result = handleInitialize(body
|
|
97
|
+
const result = handleInitialize(body, {
|
|
98
|
+
networkPresence: getNetworkPresence(),
|
|
99
|
+
});
|
|
82
100
|
sendJson(res, result.status, result.body);
|
|
83
101
|
return;
|
|
84
102
|
}
|
|
@@ -161,14 +179,20 @@ async function routeHttp(req, res, bearerToken, handlers, logger) {
|
|
|
161
179
|
}
|
|
162
180
|
catch (err) {
|
|
163
181
|
if (err instanceof BrokerHttpError) {
|
|
182
|
+
const safeExtra = sanitizeBrokerErrorExtra(err.extra);
|
|
164
183
|
logger.info("ipc_route_rejected", {
|
|
165
184
|
url,
|
|
166
185
|
method,
|
|
167
186
|
status: err.status,
|
|
168
187
|
code: err.code,
|
|
169
188
|
message: err.message,
|
|
189
|
+
...safeExtra,
|
|
190
|
+
});
|
|
191
|
+
sendJson(res, err.status, {
|
|
192
|
+
error: err.code,
|
|
193
|
+
message: err.message,
|
|
194
|
+
...safeExtra,
|
|
170
195
|
});
|
|
171
|
-
sendJson(res, err.status, { error: err.code, message: err.message });
|
|
172
196
|
return;
|
|
173
197
|
}
|
|
174
198
|
logger.error("ipc_route_error", {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NetworkPresence } from "./network-presence.js";
|
|
1
2
|
export declare const IPC_PROTOCOL_VERSION = "1.0";
|
|
2
3
|
export interface IpcCapabilities {
|
|
3
4
|
endpoint_metadata_v1?: boolean;
|
|
@@ -15,12 +16,15 @@ export interface InitializeResponseBody {
|
|
|
15
16
|
server_protocol_version: string;
|
|
16
17
|
server_capabilities: IpcCapabilities;
|
|
17
18
|
session_id: string;
|
|
19
|
+
network_presence: NetworkPresence;
|
|
18
20
|
}
|
|
19
21
|
export interface InitializeErrorBody {
|
|
20
22
|
error: "protocol_version_mismatch" | "bad_request";
|
|
21
23
|
message: string;
|
|
22
24
|
}
|
|
23
|
-
export declare function handleInitialize(req: InitializeRequestBody
|
|
25
|
+
export declare function handleInitialize(req: InitializeRequestBody, ctx: {
|
|
26
|
+
networkPresence: NetworkPresence;
|
|
27
|
+
}): {
|
|
24
28
|
status: 200;
|
|
25
29
|
body: InitializeResponseBody;
|
|
26
30
|
} | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-handshake.d.ts","sourceRoot":"","sources":["../../src/broker/version-handshake.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"version-handshake.d.ts","sourceRoot":"","sources":["../../src/broker/version-handshake.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAM1C,MAAM,WAAW,eAAe;IAE9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAGD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe,CAIxD,CAAC;AAEH,MAAM,WAAW,qBAAqB;IAEpC,uBAAuB,EAAE,MAAM,CAAC;IAEhC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,eAAe,CAAC;IAErC,UAAU,EAAE,MAAM,CAAC;IAanB,gBAAgB,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,2BAA2B,GAAG,aAAa,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,qBAAqB,EAC1B,GAAG,EAAE;IAAE,eAAe,EAAE,eAAe,CAAA;CAAE,GAEvC;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAC7C;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,CA2C7C"}
|
|
@@ -5,7 +5,7 @@ export const SERVER_CAPABILITIES = Object.freeze({
|
|
|
5
5
|
remote_spawn_v1: false,
|
|
6
6
|
undispatched_inbox_v1: false,
|
|
7
7
|
});
|
|
8
|
-
export function handleInitialize(req) {
|
|
8
|
+
export function handleInitialize(req, ctx) {
|
|
9
9
|
if (typeof req.client_protocol_version !== "string") {
|
|
10
10
|
return {
|
|
11
11
|
status: 400,
|
|
@@ -42,6 +42,7 @@ export function handleInitialize(req) {
|
|
|
42
42
|
server_protocol_version: IPC_PROTOCOL_VERSION,
|
|
43
43
|
server_capabilities: { ...SERVER_CAPABILITIES },
|
|
44
44
|
session_id: randomUUID(),
|
|
45
|
+
network_presence: ctx.networkPresence,
|
|
45
46
|
},
|
|
46
47
|
};
|
|
47
48
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { NetworkPresence } from "../broker/network-presence.js";
|
|
2
3
|
import { type InitializeResponseBody } from "../broker/version-handshake.js";
|
|
4
|
+
export declare class ConnectorUnavailableError extends Error {
|
|
5
|
+
readonly code: "connector_unavailable";
|
|
6
|
+
readonly retryable: true;
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
3
9
|
export interface BrokerClientDiscoverOptions {
|
|
4
10
|
accountId: string;
|
|
5
11
|
runtimeToken: string;
|
|
@@ -34,6 +40,7 @@ export interface BrokerInboundMessage {
|
|
|
34
40
|
}
|
|
35
41
|
type Events = {
|
|
36
42
|
message_received: (msg: BrokerInboundMessage) => void;
|
|
43
|
+
presence: (presence: NetworkPresence, reason?: string) => void;
|
|
37
44
|
disconnected: () => void;
|
|
38
45
|
error: (err: Error) => void;
|
|
39
46
|
};
|
|
@@ -42,11 +49,13 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
42
49
|
private ws;
|
|
43
50
|
private pluginPid;
|
|
44
51
|
private _sessionId;
|
|
52
|
+
private _networkPresence;
|
|
45
53
|
private constructor();
|
|
46
54
|
static discover(opts: BrokerClientDiscoverOptions): Promise<BrokerClient>;
|
|
47
55
|
get spawnedNew(): boolean;
|
|
48
56
|
get ipcUrl(): string;
|
|
49
57
|
get sessionId(): string | null;
|
|
58
|
+
get networkPresence(): NetworkPresence | null;
|
|
50
59
|
connect(opts: BrokerClientConnectOptions): Promise<InitializeResponseBody>;
|
|
51
60
|
registerEndpoint(args: RegisterEndpointArgs): Promise<RegisterEndpointOutcome>;
|
|
52
61
|
send(endpointId: string, to: string, content: string, contentType?: string, metadata?: Record<string, unknown>): Promise<{
|
|
@@ -56,6 +65,10 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
56
65
|
close(endpointId?: string): Promise<void>;
|
|
57
66
|
on<K extends keyof Events>(event: K, listener: Events[K]): this;
|
|
58
67
|
on(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
68
|
+
once<K extends keyof Events>(event: K, listener: Events[K]): this;
|
|
69
|
+
once(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
70
|
+
off<K extends keyof Events>(event: K, listener: Events[K]): this;
|
|
71
|
+
off(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
59
72
|
emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): boolean;
|
|
60
73
|
emit(event: string | symbol, ...args: unknown[]): boolean;
|
|
61
74
|
private httpJson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broker-client.d.ts","sourceRoot":"","sources":["../../src/broker-client/broker-client.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"broker-client.d.ts","sourceRoot":"","sources":["../../src/broker-client/broker-client.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EACL,KAAK,sBAAsB,EAE5B,MAAM,gCAAgC,CAAC;AAexC,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAG,uBAAuB,CAAU;IACjD,QAAQ,CAAC,SAAS,EAAG,IAAI,CAAU;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAgBD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAQlB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,KAAK,MAAM,GAAG;IACZ,gBAAgB,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAStD,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC7B,CAAC;AAEF,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAuB;IAOzC,OAAO,CAAC,gBAAgB,CAAgC;IAExD,OAAO;WAUM,QAAQ,CACnB,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,YAAY,CAAC;IAqBxB,IAAI,UAAU,IAAI,OAAO,CAExB;IAGD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAGD,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAWD,IAAI,eAAe,IAAI,eAAe,GAAG,IAAI,CAE5C;IAGK,OAAO,CACX,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,sBAAsB,CAAC;IA0D5B,gBAAgB,CACpB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,uBAAuB,CAAC;IAuB7B,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAW3C,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtC,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAC/D,EAAE,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GACrC,IAAI;IAQE,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IACjE,IAAI,CACX,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GACrC,IAAI;IAQE,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAChE,GAAG,CACV,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GACrC,IAAI;IAQE,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAClC,KAAK,EAAE,CAAC,EACR,GAAG,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAC7B,OAAO;IACD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO;YASpD,QAAQ;IA0CtB,OAAO,CAAC,WAAW;CAyCpB"}
|
|
@@ -3,11 +3,28 @@ import WebSocket from "ws";
|
|
|
3
3
|
import { resolveBrokerPaths } from "../broker/paths.js";
|
|
4
4
|
import { IPC_PROTOCOL_VERSION, } from "../broker/version-handshake.js";
|
|
5
5
|
import { discoverBroker } from "./lazy-spawn.js";
|
|
6
|
+
export class ConnectorUnavailableError extends Error {
|
|
7
|
+
code = "connector_unavailable";
|
|
8
|
+
retryable = true;
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "ConnectorUnavailableError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function safeJsonParse(text) {
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(text);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
6
22
|
export class BrokerClient extends EventEmitter {
|
|
7
23
|
handle;
|
|
8
24
|
ws = null;
|
|
9
25
|
pluginPid = null;
|
|
10
26
|
_sessionId = null;
|
|
27
|
+
_networkPresence = null;
|
|
11
28
|
constructor(handle) {
|
|
12
29
|
super();
|
|
13
30
|
this.handle = handle;
|
|
@@ -40,6 +57,9 @@ export class BrokerClient extends EventEmitter {
|
|
|
40
57
|
get sessionId() {
|
|
41
58
|
return this._sessionId;
|
|
42
59
|
}
|
|
60
|
+
get networkPresence() {
|
|
61
|
+
return this._networkPresence;
|
|
62
|
+
}
|
|
43
63
|
async connect(opts) {
|
|
44
64
|
if (this.ws) {
|
|
45
65
|
throw new Error("BrokerClient already connected");
|
|
@@ -52,6 +72,7 @@ export class BrokerClient extends EventEmitter {
|
|
|
52
72
|
capabilities: { endpoint_metadata_v1: true },
|
|
53
73
|
});
|
|
54
74
|
this._sessionId = initRes.session_id;
|
|
75
|
+
this._networkPresence = initRes.network_presence;
|
|
55
76
|
const wsUrl = `${this.handle.record.ipcUrl.replace(/^http/, "ws")}/v1/stream`;
|
|
56
77
|
const ws = new WebSocket(wsUrl, {
|
|
57
78
|
headers: {
|
|
@@ -122,6 +143,12 @@ export class BrokerClient extends EventEmitter {
|
|
|
122
143
|
on(event, listener) {
|
|
123
144
|
return super.on(event, listener);
|
|
124
145
|
}
|
|
146
|
+
once(event, listener) {
|
|
147
|
+
return super.once(event, listener);
|
|
148
|
+
}
|
|
149
|
+
off(event, listener) {
|
|
150
|
+
return super.off(event, listener);
|
|
151
|
+
}
|
|
125
152
|
emit(event, ...args) {
|
|
126
153
|
return super.emit(event, ...args);
|
|
127
154
|
}
|
|
@@ -136,6 +163,17 @@ export class BrokerClient extends EventEmitter {
|
|
|
136
163
|
});
|
|
137
164
|
if (!res.ok) {
|
|
138
165
|
const errText = await res.text().catch(() => "");
|
|
166
|
+
if (res.status === 503) {
|
|
167
|
+
const parsed = safeJsonParse(errText);
|
|
168
|
+
if (parsed !== null &&
|
|
169
|
+
typeof parsed === "object" &&
|
|
170
|
+
"error" in parsed &&
|
|
171
|
+
parsed.error === "connector_unavailable") {
|
|
172
|
+
const msgField = parsed.message;
|
|
173
|
+
const msg = typeof msgField === "string" ? msgField : "Connector unavailable";
|
|
174
|
+
throw new ConnectorUnavailableError(msg);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
139
177
|
throw new Error(`broker ${method} ${path} failed: ${res.status} ${errText}`);
|
|
140
178
|
}
|
|
141
179
|
return (await res.json());
|
|
@@ -160,6 +198,22 @@ export class BrokerClient extends EventEmitter {
|
|
|
160
198
|
contentType: msg.contentType,
|
|
161
199
|
metadata: msg.metadata,
|
|
162
200
|
});
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (event === "presence_changed") {
|
|
204
|
+
const frame = parsed;
|
|
205
|
+
if (frame.presence === "online" ||
|
|
206
|
+
frame.presence === "reconnecting" ||
|
|
207
|
+
frame.presence === "offline") {
|
|
208
|
+
this._networkPresence = frame.presence;
|
|
209
|
+
if (typeof frame.reason === "string") {
|
|
210
|
+
this.emit("presence", frame.presence, frame.reason);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
this.emit("presence", frame.presence);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return;
|
|
163
217
|
}
|
|
164
218
|
}
|
|
165
219
|
}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PLUGIN_VERSION = "0.
|
|
1
|
+
export declare const PLUGIN_VERSION = "0.2.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PLUGIN_VERSION = "0.
|
|
1
|
+
export const PLUGIN_VERSION = "0.2.0";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masons/runtime-broker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "MASONS Runtime Broker — local daemon and BrokerClient SDK for multi-session agent runtime coordination.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "MASONS.ai <hello@masons.ai> (https://masons.ai)",
|
|
@@ -20,15 +20,6 @@
|
|
|
20
20
|
"publishConfig": {
|
|
21
21
|
"access": "public"
|
|
22
22
|
},
|
|
23
|
-
"scripts": {
|
|
24
|
-
"build": "tsc",
|
|
25
|
-
"dev": "tsc --watch",
|
|
26
|
-
"test": "tsc -p test/tsconfig.json && node --test --loader ts-node/esm 'test/**/*.test.ts'",
|
|
27
|
-
"lint": "biome check",
|
|
28
|
-
"format": "biome format --write",
|
|
29
|
-
"prepublishOnly": "bash scripts/check-version.sh && npm run build && npm run test",
|
|
30
|
-
"release": "pnpm publish --access public"
|
|
31
|
-
},
|
|
32
23
|
"files": [
|
|
33
24
|
"dist/"
|
|
34
25
|
],
|
|
@@ -53,8 +44,16 @@
|
|
|
53
44
|
"@types/debug": "^4.1.12",
|
|
54
45
|
"@types/node": "^25",
|
|
55
46
|
"@types/ws": "^8",
|
|
56
|
-
"@workspace/types": "workspace:*",
|
|
57
47
|
"ts-node": "^10",
|
|
58
|
-
"typescript": "^5"
|
|
48
|
+
"typescript": "^5",
|
|
49
|
+
"@workspace/types": "0.0.0"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsc",
|
|
53
|
+
"dev": "tsc --watch",
|
|
54
|
+
"test": "tsc -p test/tsconfig.json && node --test --loader ts-node/esm 'test/**/*.test.ts'",
|
|
55
|
+
"lint": "biome check",
|
|
56
|
+
"format": "biome format --write",
|
|
57
|
+
"release": "pnpm publish --access public"
|
|
59
58
|
}
|
|
60
|
-
}
|
|
59
|
+
}
|