@masons/runtime-broker 0.2.19 → 0.2.21
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 +45 -0
- package/dist/broker/connector-ws.d.ts +1 -0
- package/dist/broker/connector-ws.d.ts.map +1 -1
- package/dist/broker/connector-ws.js +15 -9
- package/dist/broker/entry.d.ts +8 -0
- package/dist/broker/entry.d.ts.map +1 -1
- package/dist/broker/entry.js +47 -1
- package/dist/broker/ipc-server.d.ts +4 -0
- package/dist/broker/ipc-server.d.ts.map +1 -1
- package/dist/broker/ipc-server.js +11 -0
- package/dist/broker/version-handshake.d.ts +1 -0
- package/dist/broker/version-handshake.d.ts.map +1 -1
- package/dist/broker/version-handshake.js +1 -0
- package/dist/broker-client/broker-client.d.ts +21 -1
- package/dist/broker-client/broker-client.d.ts.map +1 -1
- package/dist/broker-client/broker-client.js +210 -47
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -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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"}
|
|
@@ -146,6 +146,16 @@ function undispatchedReasonFromCandidate(candidate) {
|
|
|
146
146
|
}
|
|
147
147
|
return "unaddressed";
|
|
148
148
|
}
|
|
149
|
+
function countBoundContinuationPresence(candidates, endpointId) {
|
|
150
|
+
let boundContinuationCount = 0;
|
|
151
|
+
for (const candidate of candidates) {
|
|
152
|
+
if (candidate.claim_policy === "bound_session_pull_only" &&
|
|
153
|
+
candidate.target_endpoint_id_hint === endpointId) {
|
|
154
|
+
boundContinuationCount++;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { bound_continuation_count: boundContinuationCount };
|
|
158
|
+
}
|
|
149
159
|
function derivePublicDisplayLabel(body, workspace = normalizeWorkspace(body.workspace)) {
|
|
150
160
|
const parts = [
|
|
151
161
|
body.kind,
|
|
@@ -2042,6 +2052,41 @@ export async function startBrokerDaemon(opts) {
|
|
|
2042
2052
|
};
|
|
2043
2053
|
});
|
|
2044
2054
|
},
|
|
2055
|
+
async readUndispatchedPresence(endpoint_id) {
|
|
2056
|
+
if (!apiPort.listRuntimeClaimCandidates) {
|
|
2057
|
+
throw new BrokerHttpError(503, "runtime_claim_candidates_unavailable", "Services claim-candidates authority is not configured; refusing to expose broker-local presence", { retryable: true });
|
|
2058
|
+
}
|
|
2059
|
+
const entry = registry.get(endpoint_id);
|
|
2060
|
+
if (!entry) {
|
|
2061
|
+
throw new BrokerHttpError(409, "no_active_endpoint", "presence read requires an active registered endpoint");
|
|
2062
|
+
}
|
|
2063
|
+
if (entry.state !== "active") {
|
|
2064
|
+
throw new BrokerHttpError(409, "endpoint_not_active", `endpoint ${entry.endpoint_id} is ${entry.state}; presence read requires Active`);
|
|
2065
|
+
}
|
|
2066
|
+
let servicesItems;
|
|
2067
|
+
try {
|
|
2068
|
+
servicesItems = (await apiPort.listRuntimeClaimCandidates({
|
|
2069
|
+
endpoint_id: entry.endpoint_id,
|
|
2070
|
+
endpoint_nonce: entry.endpoint_nonce,
|
|
2071
|
+
limit: undispatchedInbox.capacity(),
|
|
2072
|
+
})).items;
|
|
2073
|
+
}
|
|
2074
|
+
catch (err) {
|
|
2075
|
+
logger.warn("runtime_presence_claim_candidates_failed", {
|
|
2076
|
+
endpoint_id: entry.endpoint_id,
|
|
2077
|
+
status: err instanceof PlatformApiError ? err.status : undefined,
|
|
2078
|
+
code: err instanceof PlatformApiError ? err.code : undefined,
|
|
2079
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
2080
|
+
});
|
|
2081
|
+
if (err instanceof PlatformApiError) {
|
|
2082
|
+
throw new BrokerHttpError(err.status, err.code, err.message, {
|
|
2083
|
+
retryable: err.status >= 500,
|
|
2084
|
+
});
|
|
2085
|
+
}
|
|
2086
|
+
throw new BrokerHttpError(503, "runtime_claim_candidates_unavailable", "Services claim-candidates read failed; refusing to expose broker-local presence", { retryable: true });
|
|
2087
|
+
}
|
|
2088
|
+
return countBoundContinuationPresence(servicesItems, entry.endpoint_id);
|
|
2089
|
+
},
|
|
2045
2090
|
async dispatch(undispatched_id, target_endpoint_id) {
|
|
2046
2091
|
const pending = undispatchedInbox.get(undispatched_id);
|
|
2047
2092
|
const target = registry.get(target_endpoint_id);
|
|
@@ -46,6 +46,7 @@ export declare class ConnectorWS {
|
|
|
46
46
|
off<E extends ConnectorWSEvent["event"]>(event: E, listener: ListenerFor<E>): this;
|
|
47
47
|
_emitForTesting(e: ConnectorWSEvent): void;
|
|
48
48
|
private wireForwarders;
|
|
49
|
+
private emitBus;
|
|
49
50
|
}
|
|
50
51
|
export { ConnectorError };
|
|
51
52
|
//# sourceMappingURL=connector-ws.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector-ws.d.ts","sourceRoot":"","sources":["../../src/broker/connector-ws.ts"],"names":[],"mappings":"AAaA,OAAO,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GAC7D;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,GACzB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvC,KAAK,WAAW,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,IAAI,CACtD,CAAC,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,KACvC,IAAI,CAAC;AAEV,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;gBAE9B,IAAI,EAAE,kBAAkB;IAMpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,UAAU,IAAI,IAAI;IASlB,IAAI,CACF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,YAAY,CAAC;IAKxB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKlC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKpC,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAKvC,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3D,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIxD,EAAE,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACpC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI;IAKP,GAAG,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI;IAMS,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAI1D,OAAO,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"connector-ws.d.ts","sourceRoot":"","sources":["../../src/broker/connector-ws.ts"],"names":[],"mappings":"AAaA,OAAO,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GAC7D;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,GACzB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvC,KAAK,WAAW,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,IAAI,CACtD,CAAC,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,KACvC,IAAI,CAAC;AAEV,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;gBAE9B,IAAI,EAAE,kBAAkB;IAMpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,UAAU,IAAI,IAAI;IASlB,IAAI,CACF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,YAAY,CAAC;IAKxB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKlC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKpC,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAKvC,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3D,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIxD,EAAE,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACpC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI;IAKP,GAAG,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI;IAMS,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAI1D,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,OAAO;CAMhB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -40,33 +40,39 @@ export class ConnectorWS {
|
|
|
40
40
|
return this;
|
|
41
41
|
}
|
|
42
42
|
_emitForTesting(e) {
|
|
43
|
-
this.
|
|
43
|
+
this.emitBus(e);
|
|
44
44
|
}
|
|
45
45
|
wireForwarders() {
|
|
46
46
|
this.client.on("message_received", (payload) => {
|
|
47
|
-
this.
|
|
47
|
+
this.emitBus({ event: "message_received", payload });
|
|
48
48
|
});
|
|
49
49
|
this.client.on("send_ack", (payload) => {
|
|
50
|
-
this.
|
|
50
|
+
this.emitBus({ event: "send_ack", payload });
|
|
51
51
|
});
|
|
52
52
|
this.client.on("delivery_pending", (payload) => {
|
|
53
|
-
this.
|
|
53
|
+
this.emitBus({ event: "delivery_pending", payload });
|
|
54
54
|
});
|
|
55
55
|
this.client.on("delivery_status", (payload) => {
|
|
56
|
-
this.
|
|
56
|
+
this.emitBus({ event: "delivery_status", payload });
|
|
57
57
|
});
|
|
58
58
|
this.client.on("structured_error", (payload) => {
|
|
59
|
-
this.
|
|
59
|
+
this.emitBus({ event: "structured_error", payload });
|
|
60
60
|
});
|
|
61
61
|
this.client.on("connected", () => {
|
|
62
|
-
this.
|
|
62
|
+
this.emitBus({ event: "connected" });
|
|
63
63
|
});
|
|
64
64
|
this.client.on("disconnected", () => {
|
|
65
|
-
this.
|
|
65
|
+
this.emitBus({ event: "disconnected" });
|
|
66
66
|
});
|
|
67
67
|
this.client.on("error", (err) => {
|
|
68
|
-
this.
|
|
68
|
+
this.emitBus({ event: "error", payload: err });
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
+
emitBus(e) {
|
|
72
|
+
if (e.event === "error" && this.bus.listenerCount("error") === 0) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return this.bus.emit(e.event, e);
|
|
76
|
+
}
|
|
71
77
|
}
|
|
72
78
|
export { ConnectorError };
|
package/dist/broker/entry.d.ts
CHANGED
|
@@ -14,6 +14,14 @@ interface RuntimePrincipal {
|
|
|
14
14
|
}
|
|
15
15
|
export declare function resolveCredentialsFromFile(filePath: string, accountId: string, envApiHost: string | undefined): Promise<ResolvedCredentials>;
|
|
16
16
|
export declare function resolveRuntimePrincipal(apiHost: string, runtimeKey: string, fetchImpl?: typeof globalThis.fetch): Promise<RuntimePrincipal>;
|
|
17
|
+
export interface ResolveRuntimePrincipalRetryOptions {
|
|
18
|
+
attempts?: number;
|
|
19
|
+
initialDelayMs?: number;
|
|
20
|
+
maxDelayMs?: number;
|
|
21
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
22
|
+
logger?: BrokerLogger;
|
|
23
|
+
}
|
|
24
|
+
export declare function resolveRuntimePrincipalWithRetry(apiHost: string, runtimeKey: string, opts?: ResolveRuntimePrincipalRetryOptions): Promise<RuntimePrincipal>;
|
|
17
25
|
export declare function buildApiPort(apiHost: string, runtimeKey: string, logger: BrokerLogger): RuntimeEndpointPort;
|
|
18
26
|
export declare function installFatalExitHandlers(logger: BrokerLogger): void;
|
|
19
27
|
export declare function main(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/broker/entry.ts"],"names":[],"mappings":"AAyFA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAEpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA8F9B;AA2DD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,OAAO,UAAU,CAAC,KAAwB,GACpD,OAAO,CAAC,gBAAgB,CAAC,CA4B3B;
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/broker/entry.ts"],"names":[],"mappings":"AAyFA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAEpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA8F9B;AA2DD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,OAAO,UAAU,CAAC,KAAwB,GACpD,OAAO,CAAC,gBAAgB,CAAC,CA4B3B;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACpC,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAWD,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,mCAAwC,GAC7C,OAAO,CAAC,gBAAgB,CAAC,CA4B3B;AAgCD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,GACnB,mBAAmB,CA8IrB;AAyCD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAenE;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqG1C"}
|
package/dist/broker/entry.js
CHANGED
|
@@ -123,6 +123,52 @@ export async function resolveRuntimePrincipal(apiHost, runtimeKey, fetchImpl = g
|
|
|
123
123
|
...(typeof raw.carrier === "string" && { carrier: raw.carrier }),
|
|
124
124
|
};
|
|
125
125
|
}
|
|
126
|
+
export async function resolveRuntimePrincipalWithRetry(apiHost, runtimeKey, opts = {}) {
|
|
127
|
+
const attempts = Math.max(1, Math.floor(opts.attempts ?? 5));
|
|
128
|
+
const initialDelayMs = Math.max(0, opts.initialDelayMs ?? 500);
|
|
129
|
+
const maxDelayMs = Math.max(initialDelayMs, opts.maxDelayMs ?? 5_000);
|
|
130
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
131
|
+
let delayMs = initialDelayMs;
|
|
132
|
+
let lastErr;
|
|
133
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
134
|
+
try {
|
|
135
|
+
return await resolveRuntimePrincipal(apiHost, runtimeKey, fetchImpl);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
lastErr = err;
|
|
139
|
+
if (attempt >= attempts || !isRetryableRuntimePrincipalError(err)) {
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
opts.logger?.warn("runtime_principal_resolve_retry", {
|
|
143
|
+
attempt,
|
|
144
|
+
next_attempt: attempt + 1,
|
|
145
|
+
delay_ms: delayMs,
|
|
146
|
+
err: err instanceof Error ? err.message : String(err),
|
|
147
|
+
});
|
|
148
|
+
if (delayMs > 0)
|
|
149
|
+
await sleep(delayMs);
|
|
150
|
+
delayMs = delayMs === 0 ? 0 : Math.min(maxDelayMs, delayMs * 2);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));
|
|
154
|
+
}
|
|
155
|
+
function isRetryableRuntimePrincipalError(err) {
|
|
156
|
+
if (!(err instanceof Error))
|
|
157
|
+
return false;
|
|
158
|
+
const cause = err.cause;
|
|
159
|
+
if (cause instanceof Error)
|
|
160
|
+
return true;
|
|
161
|
+
if (err.name === "TypeError" ||
|
|
162
|
+
err.name === "AbortError" ||
|
|
163
|
+
/fetch failed|network|ECONNRESET|ECONNREFUSED|ETIMEDOUT|EAI_AGAIN/i.test(err.message)) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
const status = /^whoami failed: (\d+)$/.exec(err.message)?.[1];
|
|
167
|
+
if (!status)
|
|
168
|
+
return false;
|
|
169
|
+
const code = Number(status);
|
|
170
|
+
return code === 408 || code === 429 || code >= 500;
|
|
171
|
+
}
|
|
126
172
|
export function buildApiPort(apiHost, runtimeKey, logger) {
|
|
127
173
|
return {
|
|
128
174
|
async register(params) {
|
|
@@ -245,7 +291,7 @@ export async function main() {
|
|
|
245
291
|
});
|
|
246
292
|
const logger = createBrokerLogger(paths.logDir);
|
|
247
293
|
installFatalExitHandlers(logger);
|
|
248
|
-
const principal = await
|
|
294
|
+
const principal = await resolveRuntimePrincipalWithRetry(creds.apiHost, creds.token, { logger });
|
|
249
295
|
logger.info("broker_entry_starting", {
|
|
250
296
|
accountId: creds.accountId,
|
|
251
297
|
subjectId: principal.subjectId,
|
|
@@ -14,6 +14,7 @@ export interface IPCServerHandlers {
|
|
|
14
14
|
reportProcessingState(body: ProcessingStateBody): Promise<void>;
|
|
15
15
|
reattachEndpoint(endpoint_id: string, plugin_pid: number, ipcWs: WebSocket): Promise<ReattachResponse>;
|
|
16
16
|
listUndispatched(plugin_pid: number, endpoint_id?: string): Promise<UndispatchedListResponse>;
|
|
17
|
+
readUndispatchedPresence(endpoint_id: string): Promise<UndispatchedPresenceResponse>;
|
|
17
18
|
dispatch(undispatched_id: string, target_endpoint_id: string): Promise<void>;
|
|
18
19
|
setTaskHint(body: TaskHintBody): Promise<void>;
|
|
19
20
|
}
|
|
@@ -22,6 +23,9 @@ export interface ReattachResponse {
|
|
|
22
23
|
reconnecting_buffer_count: number;
|
|
23
24
|
}
|
|
24
25
|
export type UndispatchedListResponse = import("./undispatched-inbox.js").UndispatchedMessage[];
|
|
26
|
+
export interface UndispatchedPresenceResponse {
|
|
27
|
+
bound_continuation_count: number;
|
|
28
|
+
}
|
|
25
29
|
export interface RegisterEndpointBody {
|
|
26
30
|
agent_id: string;
|
|
27
31
|
plugin_pid: number;
|
|
@@ -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;AAC9D,OAAO,KAAK,EACV,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,iBAAiB;IAEhC,gBAAgB,CACd,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAErC,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5C,0BAA0B,CACxB,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB,sBAAsB,CACpB,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAE3C,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGhE,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7B,gBAAgB,CACd,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ipc-server.d.ts","sourceRoot":"","sources":["../../src/broker/ipc-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -169,6 +169,17 @@ async function routeHttp(req, res, bearerToken, handlers, logger, getNetworkPres
|
|
|
169
169
|
sendJson(res, 200, { ok: true });
|
|
170
170
|
return;
|
|
171
171
|
}
|
|
172
|
+
if (method === "GET" &&
|
|
173
|
+
(url === "/v1/undispatched/presence" ||
|
|
174
|
+
url.startsWith("/v1/undispatched/presence?"))) {
|
|
175
|
+
const endpointId = new URL(url, "http://127.0.0.1").searchParams.get("endpoint_id");
|
|
176
|
+
if (typeof endpointId !== "string" || endpointId.length === 0) {
|
|
177
|
+
throw new BrokerHttpError(400, "endpoint_id_required", "GET /v1/undispatched/presence requires endpoint_id");
|
|
178
|
+
}
|
|
179
|
+
const out = await handlers.readUndispatchedPresence(endpointId);
|
|
180
|
+
sendJson(res, 200, out);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
172
183
|
if (method === "GET" &&
|
|
173
184
|
(url === "/v1/undispatched" || url.startsWith("/v1/undispatched?"))) {
|
|
174
185
|
const callerPid = readPluginPid(req);
|
|
@@ -7,6 +7,7 @@ export interface IpcCapabilities {
|
|
|
7
7
|
runtime_assignment_reply_v1?: boolean;
|
|
8
8
|
runtime_assignment_claim_v1?: boolean;
|
|
9
9
|
runtime_claim_candidates_v1?: boolean;
|
|
10
|
+
undispatched_presence_v1?: boolean;
|
|
10
11
|
push_receipt_ack_v1?: boolean;
|
|
11
12
|
structured_workspace_v1?: boolean;
|
|
12
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-handshake.d.ts","sourceRoot":"","sources":["../../src/broker/version-handshake.ts"],"names":[],"mappings":"AAmBA,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;IAEhC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAKtC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAMtC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAGD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"version-handshake.d.ts","sourceRoot":"","sources":["../../src/broker/version-handshake.ts"],"names":[],"mappings":"AAmBA,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;IAEhC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAKtC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAMtC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAMnC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAGD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe,CAUxD,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;IAErC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,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,CA4C7C"}
|
|
@@ -8,6 +8,7 @@ export const SERVER_CAPABILITIES = Object.freeze({
|
|
|
8
8
|
runtime_assignment_reply_v1: true,
|
|
9
9
|
runtime_assignment_claim_v1: true,
|
|
10
10
|
runtime_claim_candidates_v1: true,
|
|
11
|
+
undispatched_presence_v1: true,
|
|
11
12
|
push_receipt_ack_v1: true,
|
|
12
13
|
structured_workspace_v1: true,
|
|
13
14
|
});
|
|
@@ -100,6 +100,9 @@ export interface ClaimRuntimeAssignmentResponse {
|
|
|
100
100
|
sourceMessageId?: string;
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
|
+
export interface UndispatchedPresence {
|
|
104
|
+
bound_continuation_count: number;
|
|
105
|
+
}
|
|
103
106
|
export type { UndispatchedMessage };
|
|
104
107
|
export type AdapterRuntimeProcessingState = Exclude<RuntimeProcessingState, "assigned_to_runtime_target" | "reply_requested" | "reply_emitted">;
|
|
105
108
|
export interface ReportRuntimeProcessingStateArgs {
|
|
@@ -124,8 +127,12 @@ type Events = {
|
|
|
124
127
|
error: (err: Error) => void;
|
|
125
128
|
};
|
|
126
129
|
export declare class BrokerClient extends EventEmitter {
|
|
127
|
-
private
|
|
130
|
+
private handle;
|
|
131
|
+
private readonly discoverOptions;
|
|
128
132
|
private ws;
|
|
133
|
+
private autoRecoverEnabled;
|
|
134
|
+
private recoverInFlight;
|
|
135
|
+
private connectOptions;
|
|
129
136
|
private heartbeatInterval;
|
|
130
137
|
private heartbeatTimeout;
|
|
131
138
|
private heartbeatMisses;
|
|
@@ -139,6 +146,8 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
139
146
|
private _clientKind;
|
|
140
147
|
private _clientVersion;
|
|
141
148
|
private readonly endpointOwnerTokens;
|
|
149
|
+
private readonly endpointAliases;
|
|
150
|
+
private readonly endpointRegistrations;
|
|
142
151
|
private constructor();
|
|
143
152
|
static discover(opts: BrokerClientDiscoverOptions): Promise<BrokerClient>;
|
|
144
153
|
get spawnedNew(): boolean;
|
|
@@ -148,7 +157,9 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
148
157
|
get serverCapabilities(): Readonly<IpcCapabilities>;
|
|
149
158
|
get serverVersion(): string | null;
|
|
150
159
|
connect(opts: BrokerClientConnectOptions): Promise<InitializeResponseBody>;
|
|
160
|
+
private connectCurrentHandle;
|
|
151
161
|
registerEndpoint(args: RegisterEndpointArgs): Promise<RegisterEndpointOutcome>;
|
|
162
|
+
private registerEndpointOnCurrentBroker;
|
|
152
163
|
send(endpointId: string, to: string, content: string, contentType?: string, metadata?: Record<string, unknown>): Promise<{
|
|
153
164
|
messageId: string;
|
|
154
165
|
status: string;
|
|
@@ -161,6 +172,9 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
161
172
|
listUndispatched(args?: {
|
|
162
173
|
endpointId?: string;
|
|
163
174
|
}): Promise<UndispatchedMessage[]>;
|
|
175
|
+
readUndispatchedPresence(args: {
|
|
176
|
+
endpointId: string;
|
|
177
|
+
}): Promise<UndispatchedPresence>;
|
|
164
178
|
reportRuntimeProcessingState(args: ReportRuntimeProcessingStateArgs): Promise<void>;
|
|
165
179
|
close(endpointId?: string): Promise<void>;
|
|
166
180
|
on<K extends keyof Events>(event: K, listener: Events[K]): this;
|
|
@@ -172,7 +186,13 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
172
186
|
emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): boolean;
|
|
173
187
|
emit(event: string | symbol, ...args: unknown[]): boolean;
|
|
174
188
|
private httpJson;
|
|
189
|
+
private recoverBrokerConnection;
|
|
190
|
+
private recoverBrokerConnectionOnce;
|
|
191
|
+
private teardownWsForRecovery;
|
|
192
|
+
private reregisterCachedEndpoints;
|
|
193
|
+
private resolveEndpointId;
|
|
175
194
|
private requireEndpointOwnerToken;
|
|
195
|
+
private emitErrorIfObserved;
|
|
176
196
|
private handleFrame;
|
|
177
197
|
private sendPushAck;
|
|
178
198
|
private startHeartbeat;
|
|
@@ -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;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,KAAK,sBAAsB,EAE3B,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACV,8BAA8B,EAC9B,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"broker-client.d.ts","sourceRoot":"","sources":["../../src/broker-client/broker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ 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 { PLUGIN_VERSION } from "../version.js";
|
|
6
|
-
import { discoverBroker } from "./lazy-spawn.js";
|
|
6
|
+
import { discoverBroker, } from "./lazy-spawn.js";
|
|
7
7
|
export class ConnectorUnavailableError extends Error {
|
|
8
8
|
code = "connector_unavailable";
|
|
9
9
|
retryable = true;
|
|
@@ -60,9 +60,29 @@ function normalizeRuntimeAssignmentFailureCategory(category) {
|
|
|
60
60
|
}
|
|
61
61
|
return null;
|
|
62
62
|
}
|
|
63
|
+
function isIpcTransportError(err) {
|
|
64
|
+
if (!(err instanceof Error))
|
|
65
|
+
return false;
|
|
66
|
+
const cause = err.cause;
|
|
67
|
+
if (cause instanceof Error) {
|
|
68
|
+
return isIpcTransportError(cause);
|
|
69
|
+
}
|
|
70
|
+
return (err.name === "TypeError" ||
|
|
71
|
+
err.name === "AbortError" ||
|
|
72
|
+
/fetch failed|ECONNRESET|ECONNREFUSED|ECONNABORTED|EPIPE|ETIMEDOUT|socket|WebSocket/i.test(err.message));
|
|
73
|
+
}
|
|
74
|
+
function cacheRegistrationArgs(args) {
|
|
75
|
+
const cached = { ...args };
|
|
76
|
+
delete cached.spawnToken;
|
|
77
|
+
return cached;
|
|
78
|
+
}
|
|
63
79
|
export class BrokerClient extends EventEmitter {
|
|
64
80
|
handle;
|
|
81
|
+
discoverOptions;
|
|
65
82
|
ws = null;
|
|
83
|
+
autoRecoverEnabled = true;
|
|
84
|
+
recoverInFlight = null;
|
|
85
|
+
connectOptions = null;
|
|
66
86
|
heartbeatInterval = null;
|
|
67
87
|
heartbeatTimeout = null;
|
|
68
88
|
heartbeatMisses = 0;
|
|
@@ -76,15 +96,18 @@ export class BrokerClient extends EventEmitter {
|
|
|
76
96
|
_clientKind = null;
|
|
77
97
|
_clientVersion = null;
|
|
78
98
|
endpointOwnerTokens = new Map();
|
|
79
|
-
|
|
99
|
+
endpointAliases = new Map();
|
|
100
|
+
endpointRegistrations = new Map();
|
|
101
|
+
constructor(handle, discoverOptions) {
|
|
80
102
|
super();
|
|
81
103
|
this.handle = handle;
|
|
104
|
+
this.discoverOptions = discoverOptions;
|
|
82
105
|
}
|
|
83
106
|
static async discover(opts) {
|
|
84
107
|
const paths = resolveBrokerPaths(opts.accountId, opts.runtimeToken, {
|
|
85
108
|
userDataDir: opts.userDataDir,
|
|
86
109
|
});
|
|
87
|
-
const
|
|
110
|
+
const discoverOptions = {
|
|
88
111
|
discoveryFile: paths.discoveryFile,
|
|
89
112
|
timeoutMs: opts.timeoutMs,
|
|
90
113
|
brokerEntry: opts.brokerEntry,
|
|
@@ -97,8 +120,9 @@ export class BrokerClient extends EventEmitter {
|
|
|
97
120
|
: {}),
|
|
98
121
|
...(opts.env ?? {}),
|
|
99
122
|
},
|
|
100
|
-
}
|
|
101
|
-
|
|
123
|
+
};
|
|
124
|
+
const handle = await discoverBroker(discoverOptions);
|
|
125
|
+
return new BrokerClient(handle, discoverOptions);
|
|
102
126
|
}
|
|
103
127
|
get spawnedNew() {
|
|
104
128
|
return this.handle.spawned;
|
|
@@ -122,6 +146,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
122
146
|
if (this.ws) {
|
|
123
147
|
throw new Error("BrokerClient already connected");
|
|
124
148
|
}
|
|
149
|
+
this.autoRecoverEnabled = true;
|
|
150
|
+
this.connectOptions = { ...opts };
|
|
151
|
+
return this.connectCurrentHandle(opts, true);
|
|
152
|
+
}
|
|
153
|
+
async connectCurrentHandle(opts, allowRecover) {
|
|
125
154
|
this.pluginPid = opts.pluginPid;
|
|
126
155
|
this._clientKind = opts.clientKind;
|
|
127
156
|
this._clientVersion = opts.clientVersion;
|
|
@@ -136,12 +165,21 @@ export class BrokerClient extends EventEmitter {
|
|
|
136
165
|
.filter(([, enabled]) => enabled === true)
|
|
137
166
|
.map(([name]) => name)
|
|
138
167
|
.join(",");
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
168
|
+
let initRes;
|
|
169
|
+
try {
|
|
170
|
+
initRes = await this.httpJson("POST", "/v1/initialize", {
|
|
171
|
+
client_protocol_version: IPC_PROTOCOL_VERSION,
|
|
172
|
+
client_kind: opts.clientKind,
|
|
173
|
+
client_version: opts.clientVersion,
|
|
174
|
+
capabilities: clientCapabilities,
|
|
175
|
+
}, { allowRecover: false });
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (!allowRecover || !isIpcTransportError(err))
|
|
179
|
+
throw err;
|
|
180
|
+
await this.recoverBrokerConnection("initialize_failed", false);
|
|
181
|
+
return this.connectCurrentHandle(opts, false);
|
|
182
|
+
}
|
|
145
183
|
this._sessionId = initRes.session_id;
|
|
146
184
|
this._serverCapabilities = initRes.server_capabilities;
|
|
147
185
|
this._serverVersion =
|
|
@@ -158,26 +196,59 @@ export class BrokerClient extends EventEmitter {
|
|
|
158
196
|
},
|
|
159
197
|
});
|
|
160
198
|
this.ws = ws;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
199
|
+
try {
|
|
200
|
+
await new Promise((resolve, reject) => {
|
|
201
|
+
const onOpen = () => {
|
|
202
|
+
ws.off("error", onError);
|
|
203
|
+
resolve();
|
|
204
|
+
};
|
|
205
|
+
const onError = (err) => {
|
|
206
|
+
ws.off("open", onOpen);
|
|
207
|
+
reject(err);
|
|
208
|
+
};
|
|
209
|
+
ws.once("open", onOpen);
|
|
210
|
+
ws.once("error", onError);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
this.ws = null;
|
|
215
|
+
try {
|
|
216
|
+
ws.close();
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
}
|
|
220
|
+
if (!allowRecover || !isIpcTransportError(err))
|
|
221
|
+
throw err;
|
|
222
|
+
await this.recoverBrokerConnection("stream_open_failed", false);
|
|
223
|
+
return this.connectCurrentHandle(opts, false);
|
|
224
|
+
}
|
|
225
|
+
ws.on("message", (data) => {
|
|
226
|
+
if (this.ws !== ws)
|
|
227
|
+
return;
|
|
228
|
+
this.handleFrame(data.toString());
|
|
229
|
+
});
|
|
230
|
+
ws.on("pong", () => {
|
|
231
|
+
if (this.ws !== ws)
|
|
232
|
+
return;
|
|
233
|
+
this.markHeartbeatAlive();
|
|
172
234
|
});
|
|
173
|
-
ws.on("message", (data) => this.handleFrame(data.toString()));
|
|
174
|
-
ws.on("pong", () => this.markHeartbeatAlive());
|
|
175
235
|
ws.on("close", () => {
|
|
236
|
+
if (this.ws !== ws)
|
|
237
|
+
return;
|
|
176
238
|
this.clearHeartbeat();
|
|
177
239
|
this.ws = null;
|
|
178
240
|
this.emit("disconnected");
|
|
241
|
+
setTimeout(() => {
|
|
242
|
+
if (!this.autoRecoverEnabled || this.connectOptions === null)
|
|
243
|
+
return;
|
|
244
|
+
void this.recoverBrokerConnection("stream_closed", true).catch((err) => this.emitErrorIfObserved(err instanceof Error ? err : new Error(String(err))));
|
|
245
|
+
}, 0);
|
|
246
|
+
});
|
|
247
|
+
ws.on("error", (err) => {
|
|
248
|
+
if (this.ws !== ws)
|
|
249
|
+
return;
|
|
250
|
+
this.emitErrorIfObserved(err);
|
|
179
251
|
});
|
|
180
|
-
ws.on("error", (err) => this.emit("error", err));
|
|
181
252
|
this.startHeartbeat(opts.heartbeatIntervalMs ?? 30_000);
|
|
182
253
|
return initRes;
|
|
183
254
|
}
|
|
@@ -185,6 +256,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
185
256
|
if (this.pluginPid === null) {
|
|
186
257
|
throw new Error("BrokerClient.connect must be called before registerEndpoint");
|
|
187
258
|
}
|
|
259
|
+
const outcome = await this.registerEndpointOnCurrentBroker(args, true);
|
|
260
|
+
this.endpointRegistrations.set(outcome.endpoint_id, cacheRegistrationArgs(args));
|
|
261
|
+
return outcome;
|
|
262
|
+
}
|
|
263
|
+
async registerEndpointOnCurrentBroker(args, allowRecover) {
|
|
188
264
|
const outcome = await this.httpJson("POST", "/v1/endpoint/register", {
|
|
189
265
|
agent_id: args.agentId,
|
|
190
266
|
plugin_pid: this.pluginPid,
|
|
@@ -200,15 +276,16 @@ export class BrokerClient extends EventEmitter {
|
|
|
200
276
|
execution_surface: args.executionSurface,
|
|
201
277
|
background_exchange_mode: args.backgroundExchangeMode,
|
|
202
278
|
spawn_token: args.spawnToken,
|
|
203
|
-
});
|
|
279
|
+
}, { allowRecover });
|
|
204
280
|
if (typeof outcome.endpoint_owner_token === "string") {
|
|
205
281
|
this.endpointOwnerTokens.set(outcome.endpoint_id, outcome.endpoint_owner_token);
|
|
206
282
|
}
|
|
207
283
|
return outcome;
|
|
208
284
|
}
|
|
209
285
|
async send(endpointId, to, content, contentType = "text", metadata) {
|
|
286
|
+
const resolvedEndpointId = this.resolveEndpointId(endpointId);
|
|
210
287
|
return this.httpJson("POST", "/v1/send", {
|
|
211
|
-
endpoint_id:
|
|
288
|
+
endpoint_id: resolvedEndpointId,
|
|
212
289
|
to,
|
|
213
290
|
content,
|
|
214
291
|
contentType,
|
|
@@ -219,10 +296,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
219
296
|
if (this.pluginPid === null) {
|
|
220
297
|
throw new Error("BrokerClient.connect must be called before sendRuntimeAssignmentReply");
|
|
221
298
|
}
|
|
299
|
+
const endpointId = this.resolveEndpointId(args.endpointId);
|
|
222
300
|
return this.httpJson("POST", "/v1/runtime/assignment-reply", {
|
|
223
|
-
endpoint_id:
|
|
301
|
+
endpoint_id: endpointId,
|
|
224
302
|
plugin_pid: this.pluginPid,
|
|
225
|
-
endpoint_owner_token: this.requireEndpointOwnerToken(
|
|
303
|
+
endpoint_owner_token: this.requireEndpointOwnerToken(endpointId),
|
|
226
304
|
source_message_id: args.sourceMessageId,
|
|
227
305
|
assignment_id: args.assignmentId,
|
|
228
306
|
reply_request_id: args.replyRequestId,
|
|
@@ -234,10 +312,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
234
312
|
if (this.pluginPid === null) {
|
|
235
313
|
throw new Error("BrokerClient.connect must be called before claimRuntimeAssignment");
|
|
236
314
|
}
|
|
315
|
+
const endpointId = this.resolveEndpointId(args.endpointId);
|
|
237
316
|
return this.httpJson("POST", "/v1/runtime/assignment-claim", {
|
|
238
|
-
endpoint_id:
|
|
317
|
+
endpoint_id: endpointId,
|
|
239
318
|
plugin_pid: this.pluginPid,
|
|
240
|
-
endpoint_owner_token: this.requireEndpointOwnerToken(
|
|
319
|
+
endpoint_owner_token: this.requireEndpointOwnerToken(endpointId),
|
|
241
320
|
undispatched_id: args.undispatchedId,
|
|
242
321
|
...(args.recoverExisting === true && { recover_existing: true }),
|
|
243
322
|
});
|
|
@@ -247,19 +326,24 @@ export class BrokerClient extends EventEmitter {
|
|
|
247
326
|
throw new Error("BrokerClient.connect must be called before listUndispatched");
|
|
248
327
|
}
|
|
249
328
|
const path = args?.endpointId
|
|
250
|
-
? `/v1/undispatched?endpoint_id=${encodeURIComponent(args.endpointId)}`
|
|
329
|
+
? `/v1/undispatched?endpoint_id=${encodeURIComponent(this.resolveEndpointId(args.endpointId))}`
|
|
251
330
|
: "/v1/undispatched";
|
|
252
331
|
const res = await this.httpJson("GET", path);
|
|
253
332
|
return res.items ?? [];
|
|
254
333
|
}
|
|
334
|
+
async readUndispatchedPresence(args) {
|
|
335
|
+
const endpointId = encodeURIComponent(args.endpointId);
|
|
336
|
+
return this.httpJson("GET", `/v1/undispatched/presence?endpoint_id=${endpointId}`);
|
|
337
|
+
}
|
|
255
338
|
async reportRuntimeProcessingState(args) {
|
|
256
339
|
if (this.pluginPid === null) {
|
|
257
340
|
throw new Error("BrokerClient.connect must be called before reportRuntimeProcessingState");
|
|
258
341
|
}
|
|
342
|
+
const endpointId = this.resolveEndpointId(args.endpointId);
|
|
259
343
|
await this.httpJson("POST", "/v1/runtime/processing-state", {
|
|
260
|
-
endpoint_id:
|
|
344
|
+
endpoint_id: endpointId,
|
|
261
345
|
plugin_pid: this.pluginPid,
|
|
262
|
-
endpoint_owner_token: this.requireEndpointOwnerToken(
|
|
346
|
+
endpoint_owner_token: this.requireEndpointOwnerToken(endpointId),
|
|
263
347
|
source_message_id: args.sourceMessageId,
|
|
264
348
|
assignment_id: args.assignmentId,
|
|
265
349
|
state_event_id: args.stateEventId,
|
|
@@ -275,9 +359,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
275
359
|
});
|
|
276
360
|
}
|
|
277
361
|
async close(endpointId) {
|
|
362
|
+
this.autoRecoverEnabled = false;
|
|
278
363
|
if (endpointId) {
|
|
279
364
|
try {
|
|
280
|
-
|
|
365
|
+
const resolvedEndpointId = this.resolveEndpointId(endpointId);
|
|
366
|
+
await this.httpJson("DELETE", `/v1/endpoint/${encodeURIComponent(resolvedEndpointId)}`, undefined, { allowRecover: false });
|
|
281
367
|
}
|
|
282
368
|
catch {
|
|
283
369
|
}
|
|
@@ -302,18 +388,27 @@ export class BrokerClient extends EventEmitter {
|
|
|
302
388
|
emit(event, ...args) {
|
|
303
389
|
return super.emit(event, ...args);
|
|
304
390
|
}
|
|
305
|
-
async httpJson(method, path, body) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
391
|
+
async httpJson(method, path, body, opts = {}) {
|
|
392
|
+
let res;
|
|
393
|
+
try {
|
|
394
|
+
res = await fetch(`${this.handle.record.ipcUrl}${path}`, {
|
|
395
|
+
method,
|
|
396
|
+
headers: {
|
|
397
|
+
Authorization: `Bearer ${this.handle.record.bearerToken}`,
|
|
398
|
+
...(this.pluginPid !== null
|
|
399
|
+
? { "x-plugin-pid": String(this.pluginPid) }
|
|
400
|
+
: {}),
|
|
401
|
+
...(body ? { "Content-Type": "application/json" } : {}),
|
|
402
|
+
},
|
|
403
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
if (opts.allowRecover !== false && isIpcTransportError(err)) {
|
|
408
|
+
await this.recoverBrokerConnection("ipc_fetch_failed", true);
|
|
409
|
+
}
|
|
410
|
+
throw err;
|
|
411
|
+
}
|
|
317
412
|
if (!res.ok) {
|
|
318
413
|
const errText = await res.text().catch(() => "");
|
|
319
414
|
const parsed = safeJsonParse(errText);
|
|
@@ -375,6 +470,69 @@ export class BrokerClient extends EventEmitter {
|
|
|
375
470
|
}
|
|
376
471
|
return (await res.json());
|
|
377
472
|
}
|
|
473
|
+
async recoverBrokerConnection(reason, reconnect) {
|
|
474
|
+
if (this.recoverInFlight)
|
|
475
|
+
return this.recoverInFlight;
|
|
476
|
+
this.recoverInFlight = this.recoverBrokerConnectionOnce(reason, reconnect).finally(() => {
|
|
477
|
+
this.recoverInFlight = null;
|
|
478
|
+
});
|
|
479
|
+
return this.recoverInFlight;
|
|
480
|
+
}
|
|
481
|
+
async recoverBrokerConnectionOnce(_reason, reconnect) {
|
|
482
|
+
const previousAutoRecover = this.autoRecoverEnabled;
|
|
483
|
+
this.autoRecoverEnabled = false;
|
|
484
|
+
try {
|
|
485
|
+
this.teardownWsForRecovery();
|
|
486
|
+
const handle = await discoverBroker(this.discoverOptions);
|
|
487
|
+
this.handle = handle;
|
|
488
|
+
this._sessionId = null;
|
|
489
|
+
this._serverCapabilities = {};
|
|
490
|
+
this._serverVersion = null;
|
|
491
|
+
this._networkPresence = null;
|
|
492
|
+
this.endpointOwnerTokens.clear();
|
|
493
|
+
const connectOptions = this.connectOptions;
|
|
494
|
+
if (!reconnect || connectOptions === null)
|
|
495
|
+
return;
|
|
496
|
+
await this.connectCurrentHandle(connectOptions, false);
|
|
497
|
+
await this.reregisterCachedEndpoints();
|
|
498
|
+
}
|
|
499
|
+
finally {
|
|
500
|
+
this.autoRecoverEnabled = previousAutoRecover;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
teardownWsForRecovery() {
|
|
504
|
+
this.clearHeartbeat();
|
|
505
|
+
const ws = this.ws;
|
|
506
|
+
this.ws = null;
|
|
507
|
+
if (ws &&
|
|
508
|
+
(ws.readyState === WebSocket.OPEN ||
|
|
509
|
+
ws.readyState === WebSocket.CONNECTING)) {
|
|
510
|
+
try {
|
|
511
|
+
ws.close(1012, "broker_recover");
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
async reregisterCachedEndpoints() {
|
|
518
|
+
const entries = Array.from(this.endpointRegistrations.entries()).filter(([endpointId]) => this.resolveEndpointId(endpointId) === endpointId);
|
|
519
|
+
for (const [previousEndpointId, args] of entries) {
|
|
520
|
+
const outcome = await this.registerEndpointOnCurrentBroker(args, false);
|
|
521
|
+
this.endpointRegistrations.set(outcome.endpoint_id, cacheRegistrationArgs(args));
|
|
522
|
+
if (outcome.endpoint_id !== previousEndpointId) {
|
|
523
|
+
this.endpointAliases.set(previousEndpointId, outcome.endpoint_id);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
resolveEndpointId(endpointId) {
|
|
528
|
+
let current = endpointId;
|
|
529
|
+
const seen = new Set();
|
|
530
|
+
while (this.endpointAliases.has(current) && !seen.has(current)) {
|
|
531
|
+
seen.add(current);
|
|
532
|
+
current = this.endpointAliases.get(current) ?? current;
|
|
533
|
+
}
|
|
534
|
+
return current;
|
|
535
|
+
}
|
|
378
536
|
requireEndpointOwnerToken(endpointId) {
|
|
379
537
|
const token = this.endpointOwnerTokens.get(endpointId);
|
|
380
538
|
if (!token) {
|
|
@@ -382,6 +540,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
382
540
|
}
|
|
383
541
|
return token;
|
|
384
542
|
}
|
|
543
|
+
emitErrorIfObserved(err) {
|
|
544
|
+
if (this.listenerCount("error") === 0)
|
|
545
|
+
return false;
|
|
546
|
+
return this.emit("error", err);
|
|
547
|
+
}
|
|
385
548
|
handleFrame(raw) {
|
|
386
549
|
let parsed;
|
|
387
550
|
try {
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PLUGIN_VERSION = "0.2.
|
|
1
|
+
export declare const PLUGIN_VERSION = "0.2.21";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PLUGIN_VERSION = "0.2.
|
|
1
|
+
export const PLUGIN_VERSION = "0.2.21";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masons/runtime-broker",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.21",
|
|
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)",
|