@@ -14,6 +14,7 @@ import type { Stream } from "@runloop/api-client/streaming";
1414import { isSystemError , SystemError } from "../shared/errors/system-error.js" ;
1515import { makeLogger } from "../shared/logging.js" ;
1616import { isFromAgent , isFromUser } from "../shared/origin-guards.js" ;
17+ import { getRequestId , isNonNullObject } from "../shared/structural-guards.js" ;
1718import type { LogFn } from "../shared/types.js" ;
1819import type { WireData } from "./types.js" ;
1920
@@ -22,7 +23,19 @@ import type { WireData } from "./types.js";
2223// ---------------------------------------------------------------------------
2324
2425/**
25- * Returns `true` if the event is a `control_request` (agent requesting permission).
26+ * AxonEventView narrowed to `control_request` event type.
27+ * @category Transport
28+ */
29+ export type ControlRequestEvent = AxonEventView & { event_type : "control_request" } ;
30+
31+ /**
32+ * AxonEventView narrowed to `control_response` event type.
33+ * @category Transport
34+ */
35+ export type ControlResponseEvent = AxonEventView & { event_type : "control_response" } ;
36+
37+ /**
38+ * Type guard that narrows an event to `control_request`.
2639 *
2740 * This checks the event *type* only; pair with {@link isFromAgent} to confirm
2841 * direction (control requests originate from the agent).
@@ -31,12 +44,12 @@ import type { WireData } from "./types.js";
3144 * @returns `true` if `event_type === "control_request"`.
3245 * @category Transport
3346 */
34- export function isControlRequest ( event : AxonEventView ) : boolean {
47+ export function isControlRequest ( event : AxonEventView ) : event is ControlRequestEvent {
3548 return event . event_type === "control_request" ;
3649}
3750
3851/**
39- * Returns `true` if the event is a `control_response` (client responding to permission request) .
52+ * Type guard that narrows an event to `control_response`.
4053 *
4154 * This checks the event *type* only; pair with {@link isFromUser} to confirm
4255 * direction (control responses originate from the client).
@@ -45,7 +58,7 @@ export function isControlRequest(event: AxonEventView): boolean {
4558 * @returns `true` if `event_type === "control_response"`.
4659 * @category Transport
4760 */
48- export function isControlResponse ( event : AxonEventView ) : boolean {
61+ export function isControlResponse ( event : AxonEventView ) : event is ControlResponseEvent {
4962 return event . event_type === "control_response" ;
5063}
5164
@@ -281,10 +294,10 @@ export class AxonTransport implements Transport {
281294 if ( event . payload != null ) {
282295 try {
283296 const parsed = JSON . parse ( event . payload ) ;
284- if ( parsed != null && typeof parsed === "object" ) {
285- const requestId : string | undefined = parsed . request_id ;
297+ if ( isNonNullObject ( parsed ) ) {
298+ const requestId = getRequestId ( parsed ) ;
286299 if ( requestId ) {
287- replayBuffer . set ( requestId , parsed ) ;
300+ replayBuffer . set ( requestId , parsed as WireData ) ;
288301 this . log ( "read" , `#${ eventCount } REPLAY buffered control_request ${ requestId } ` ) ;
289302 }
290303 }
@@ -297,8 +310,8 @@ export class AxonTransport implements Transport {
297310 if ( event . payload != null ) {
298311 try {
299312 const parsed = JSON . parse ( event . payload ) ;
300- const response = parsed ? .response ;
301- const requestId : string | undefined = response ?. request_id ;
313+ const response = isNonNullObject ( parsed ) ? parsed . response : undefined ;
314+ const requestId = getRequestId ( response ) ;
302315 if ( requestId && replayBuffer . has ( requestId ) ) {
303316 replayBuffer . delete ( requestId ) ;
304317 this . log ( "read" , `#${ eventCount } REPLAY resolved control_request ${ requestId } ` ) ;
@@ -344,11 +357,11 @@ export class AxonTransport implements Transport {
344357 }
345358 try {
346359 const parsed = JSON . parse ( event . payload ) ;
347- if ( parsed == null || typeof parsed !== "object" ) {
360+ if ( ! isNonNullObject ( parsed ) ) {
348361 this . log ( "read" , `#${ eventCount } skipping non-object payload` ) ;
349362 continue ;
350363 }
351- yield parsed ;
364+ yield parsed as WireData ;
352365 } catch ( err ) {
353366 this . log (
354367 "read" ,
0 commit comments