@agenticros/core 0.5.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/LICENSE +192 -0
- package/README.md +88 -0
- package/dist/banner.d.ts +7 -0
- package/dist/banner.d.ts.map +1 -0
- package/dist/banner.js +25 -0
- package/dist/banner.js.map +1 -0
- package/dist/capabilities.d.ts +101 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +240 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cmd-vel-twist.d.ts +9 -0
- package/dist/cmd-vel-twist.d.ts.map +1 -0
- package/dist/cmd-vel-twist.js +32 -0
- package/dist/cmd-vel-twist.js.map +1 -0
- package/dist/config.d.ts +1195 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +427 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +113 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +141 -0
- package/dist/discovery.js.map +1 -0
- package/dist/find-robots-for.d.ts +85 -0
- package/dist/find-robots-for.d.ts.map +1 -0
- package/dist/find-robots-for.js +120 -0
- package/dist/find-robots-for.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/factory.d.ts +18 -0
- package/dist/memory/factory.d.ts.map +1 -0
- package/dist/memory/factory.js +51 -0
- package/dist/memory/factory.js.map +1 -0
- package/dist/memory/index.d.ts +3 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/local/provider.d.ts +29 -0
- package/dist/memory/local/provider.d.ts.map +1 -0
- package/dist/memory/local/provider.js +202 -0
- package/dist/memory/local/provider.js.map +1 -0
- package/dist/memory/mem0/provider.d.ts +66 -0
- package/dist/memory/mem0/provider.d.ts.map +1 -0
- package/dist/memory/mem0/provider.js +310 -0
- package/dist/memory/mem0/provider.js.map +1 -0
- package/dist/memory/types.d.ts +91 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +10 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/mission-registry.d.ts +94 -0
- package/dist/mission-registry.d.ts.map +1 -0
- package/dist/mission-registry.js +123 -0
- package/dist/mission-registry.js.map +1 -0
- package/dist/mission-transcript-sink.d.ts +33 -0
- package/dist/mission-transcript-sink.d.ts.map +1 -0
- package/dist/mission-transcript-sink.js +76 -0
- package/dist/mission-transcript-sink.js.map +1 -0
- package/dist/mission.d.ts +281 -0
- package/dist/mission.d.ts.map +1 -0
- package/dist/mission.js +331 -0
- package/dist/mission.js.map +1 -0
- package/dist/planner/index.d.ts +84 -0
- package/dist/planner/index.d.ts.map +1 -0
- package/dist/planner/index.js +486 -0
- package/dist/planner/index.js.map +1 -0
- package/dist/robots.d.ts +133 -0
- package/dist/robots.d.ts.map +1 -0
- package/dist/robots.js +220 -0
- package/dist/robots.js.map +1 -0
- package/dist/topic-utils.d.ts +47 -0
- package/dist/topic-utils.d.ts.map +1 -0
- package/dist/topic-utils.js +136 -0
- package/dist/topic-utils.js.map +1 -0
- package/dist/transport/factory.d.ts +10 -0
- package/dist/transport/factory.d.ts.map +1 -0
- package/dist/transport/factory.js +40 -0
- package/dist/transport/factory.js.map +1 -0
- package/dist/transport/local/conversion.d.ts +30 -0
- package/dist/transport/local/conversion.d.ts.map +1 -0
- package/dist/transport/local/conversion.js +340 -0
- package/dist/transport/local/conversion.js.map +1 -0
- package/dist/transport/local/entities.d.ts +34 -0
- package/dist/transport/local/entities.d.ts.map +1 -0
- package/dist/transport/local/entities.js +108 -0
- package/dist/transport/local/entities.js.map +1 -0
- package/dist/transport/local/transport.d.ts +53 -0
- package/dist/transport/local/transport.d.ts.map +1 -0
- package/dist/transport/local/transport.js +344 -0
- package/dist/transport/local/transport.js.map +1 -0
- package/dist/transport/rosbridge/actions.d.ts +30 -0
- package/dist/transport/rosbridge/actions.d.ts.map +1 -0
- package/dist/transport/rosbridge/actions.js +61 -0
- package/dist/transport/rosbridge/actions.js.map +1 -0
- package/dist/transport/rosbridge/adapter.d.ts +29 -0
- package/dist/transport/rosbridge/adapter.d.ts.map +1 -0
- package/dist/transport/rosbridge/adapter.js +108 -0
- package/dist/transport/rosbridge/adapter.js.map +1 -0
- package/dist/transport/rosbridge/client.d.ts +55 -0
- package/dist/transport/rosbridge/client.d.ts.map +1 -0
- package/dist/transport/rosbridge/client.js +375 -0
- package/dist/transport/rosbridge/client.js.map +1 -0
- package/dist/transport/rosbridge/services.d.ts +14 -0
- package/dist/transport/rosbridge/services.d.ts.map +1 -0
- package/dist/transport/rosbridge/services.js +25 -0
- package/dist/transport/rosbridge/services.js.map +1 -0
- package/dist/transport/rosbridge/topics.d.ts +28 -0
- package/dist/transport/rosbridge/topics.d.ts.map +1 -0
- package/dist/transport/rosbridge/topics.js +59 -0
- package/dist/transport/rosbridge/topics.js.map +1 -0
- package/dist/transport/rosbridge/types.d.ts +87 -0
- package/dist/transport/rosbridge/types.d.ts.map +1 -0
- package/dist/transport/rosbridge/types.js +6 -0
- package/dist/transport/rosbridge/types.js.map +1 -0
- package/dist/transport/transport.d.ts +39 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +2 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/transport/types.d.ts +100 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +5 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/webrtc/signaling-client.d.ts +38 -0
- package/dist/transport/webrtc/signaling-client.d.ts.map +1 -0
- package/dist/transport/webrtc/signaling-client.js +161 -0
- package/dist/transport/webrtc/signaling-client.js.map +1 -0
- package/dist/transport/webrtc/signaling-types.d.ts +112 -0
- package/dist/transport/webrtc/signaling-types.d.ts.map +1 -0
- package/dist/transport/webrtc/signaling-types.js +8 -0
- package/dist/transport/webrtc/signaling-types.js.map +1 -0
- package/dist/transport/webrtc/transport.d.ts +67 -0
- package/dist/transport/webrtc/transport.d.ts.map +1 -0
- package/dist/transport/webrtc/transport.js +406 -0
- package/dist/transport/webrtc/transport.js.map +1 -0
- package/dist/transport/zenoh/adapter.d.ts +47 -0
- package/dist/transport/zenoh/adapter.d.ts.map +1 -0
- package/dist/transport/zenoh/adapter.js +296 -0
- package/dist/transport/zenoh/adapter.js.map +1 -0
- package/dist/transport/zenoh/cdr.d.ts +17 -0
- package/dist/transport/zenoh/cdr.d.ts.map +1 -0
- package/dist/transport/zenoh/cdr.js +170 -0
- package/dist/transport/zenoh/cdr.js.map +1 -0
- package/dist/transport/zenoh/keys.d.ts +21 -0
- package/dist/transport/zenoh/keys.d.ts.map +1 -0
- package/dist/transport/zenoh/keys.js +44 -0
- package/dist/transport/zenoh/keys.js.map +1 -0
- package/dist/transport-pool.d.ts +74 -0
- package/dist/transport-pool.d.ts.map +1 -0
- package/dist/transport-pool.js +135 -0
- package/dist/transport-pool.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rosbridge WebSocket protocol types.
|
|
3
|
+
* @see https://github.com/RobotWebTools/rosbridge_suite/blob/ros2/ROSBRIDGE_PROTOCOL.md
|
|
4
|
+
*/
|
|
5
|
+
export interface RosbridgeClientOptions {
|
|
6
|
+
url: string;
|
|
7
|
+
reconnect?: boolean;
|
|
8
|
+
reconnectInterval?: number;
|
|
9
|
+
maxReconnectAttempts?: number;
|
|
10
|
+
}
|
|
11
|
+
export type ConnectionStatus = "disconnected" | "connecting" | "connected";
|
|
12
|
+
export interface RosbridgeMessage {
|
|
13
|
+
op: string;
|
|
14
|
+
id?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface PublishMessage extends RosbridgeMessage {
|
|
17
|
+
op: "publish";
|
|
18
|
+
topic: string;
|
|
19
|
+
msg: Record<string, unknown>;
|
|
20
|
+
type?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface SubscribeMessage extends RosbridgeMessage {
|
|
23
|
+
op: "subscribe";
|
|
24
|
+
topic: string;
|
|
25
|
+
type?: string;
|
|
26
|
+
throttle_rate?: number;
|
|
27
|
+
queue_length?: number;
|
|
28
|
+
fragment_size?: number;
|
|
29
|
+
compression?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface UnsubscribeMessage extends RosbridgeMessage {
|
|
32
|
+
op: "unsubscribe";
|
|
33
|
+
topic: string;
|
|
34
|
+
}
|
|
35
|
+
export interface TopicMessage extends RosbridgeMessage {
|
|
36
|
+
op: "publish";
|
|
37
|
+
topic: string;
|
|
38
|
+
msg: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
export interface ServiceCallMessage extends RosbridgeMessage {
|
|
41
|
+
op: "call_service";
|
|
42
|
+
service: string;
|
|
43
|
+
args?: Record<string, unknown>;
|
|
44
|
+
type?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ServiceResponseMessage extends RosbridgeMessage {
|
|
47
|
+
op: "service_response";
|
|
48
|
+
service: string;
|
|
49
|
+
values?: Record<string, unknown>;
|
|
50
|
+
result: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface ActionGoalMessage extends RosbridgeMessage {
|
|
53
|
+
op: "send_action_goal";
|
|
54
|
+
action: string;
|
|
55
|
+
action_type: string;
|
|
56
|
+
args?: Record<string, unknown>;
|
|
57
|
+
}
|
|
58
|
+
export interface ActionFeedbackMessage extends RosbridgeMessage {
|
|
59
|
+
op: "action_feedback";
|
|
60
|
+
action: string;
|
|
61
|
+
values: Record<string, unknown>;
|
|
62
|
+
}
|
|
63
|
+
export interface ActionResultMessage extends RosbridgeMessage {
|
|
64
|
+
op: "action_result";
|
|
65
|
+
action: string;
|
|
66
|
+
values?: Record<string, unknown>;
|
|
67
|
+
result: boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface ActionCancelMessage extends RosbridgeMessage {
|
|
70
|
+
op: "cancel_action_goal";
|
|
71
|
+
action: string;
|
|
72
|
+
}
|
|
73
|
+
export interface TopicInfo {
|
|
74
|
+
name: string;
|
|
75
|
+
type: string;
|
|
76
|
+
}
|
|
77
|
+
export interface ServiceInfo {
|
|
78
|
+
name: string;
|
|
79
|
+
type: string;
|
|
80
|
+
}
|
|
81
|
+
export interface ActionInfo {
|
|
82
|
+
name: string;
|
|
83
|
+
type: string;
|
|
84
|
+
}
|
|
85
|
+
export type MessageHandler = (msg: Record<string, unknown>) => void;
|
|
86
|
+
export type ConnectionHandler = (status: ConnectionStatus) => void;
|
|
87
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/transport/rosbridge/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC;AAI3E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAID,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,EAAE,EAAE,WAAW,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAID,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,EAAE,EAAE,cAAc,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,EAAE,EAAE,kBAAkB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB;AAID,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,EAAE,EAAE,kBAAkB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D,EAAE,EAAE,iBAAiB,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,EAAE,EAAE,eAAe,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,EAAE,EAAE,oBAAoB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAID,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/transport/rosbridge/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ConnectionStatus, ConnectionHandler, Subscription, PublishOptions, AdvertiseOptions, SubscribeOptions, ServiceCallOptions, ServiceCallResult, ActionGoalOptions, ActionResult, TopicInfo, ServiceInfo, ActionInfo, MessageHandler } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Unified transport interface for ROS2 communication.
|
|
4
|
+
*
|
|
5
|
+
* All deployment modes (local DDS, rosbridge WebSocket, WebRTC data channel)
|
|
6
|
+
* implement this interface so that plugin tools work identically regardless
|
|
7
|
+
* of the underlying transport.
|
|
8
|
+
*/
|
|
9
|
+
export interface RosTransport {
|
|
10
|
+
/** Establish the transport connection. */
|
|
11
|
+
connect(): Promise<void>;
|
|
12
|
+
/** Gracefully close the transport connection. */
|
|
13
|
+
disconnect(): Promise<void>;
|
|
14
|
+
/** Get current connection status. */
|
|
15
|
+
getStatus(): ConnectionStatus;
|
|
16
|
+
/** Register a connection status change handler. Returns a cleanup function. */
|
|
17
|
+
onConnection(handler: ConnectionHandler): () => void;
|
|
18
|
+
/** Optional: advertise topic with type (rosbridge uses this so publish works when topic not yet established). */
|
|
19
|
+
advertise?(options: AdvertiseOptions): void;
|
|
20
|
+
/** Publish a message to a ROS2 topic. May return a Promise so callers can await delivery (e.g. Zenoh put). */
|
|
21
|
+
publish(options: PublishOptions): void | Promise<void>;
|
|
22
|
+
/** Subscribe to a ROS2 topic. Returns a Subscription handle. */
|
|
23
|
+
subscribe(options: SubscribeOptions, handler: MessageHandler): Subscription;
|
|
24
|
+
/** Optional: async subscribe so the subscriber is declared before returning (Zenoh). Use when waiting for first message immediately. */
|
|
25
|
+
subscribeAsync?(options: SubscribeOptions, handler: MessageHandler): Promise<Subscription>;
|
|
26
|
+
/** Call a ROS2 service and return the result. */
|
|
27
|
+
callService(options: ServiceCallOptions): Promise<ServiceCallResult>;
|
|
28
|
+
/** Send a goal to a ROS2 action server. */
|
|
29
|
+
sendActionGoal(options: ActionGoalOptions): Promise<ActionResult>;
|
|
30
|
+
/** Cancel an in-progress action goal. */
|
|
31
|
+
cancelActionGoal(action: string): Promise<void>;
|
|
32
|
+
/** List all available ROS2 topics. */
|
|
33
|
+
listTopics(): Promise<TopicInfo[]>;
|
|
34
|
+
/** List all available ROS2 services. */
|
|
35
|
+
listServices(): Promise<ServiceInfo[]>;
|
|
36
|
+
/** List all available ROS2 action servers. */
|
|
37
|
+
listActions(): Promise<ActionInfo[]>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAG3B,0CAA0C;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,iDAAiD;IACjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,qCAAqC;IACrC,SAAS,IAAI,gBAAgB,CAAC;IAE9B,+EAA+E;IAC/E,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAC;IAIrD,iHAAiH;IACjH,SAAS,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAE5C,8GAA8G;IAC9G,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD,gEAAgE;IAChE,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY,CAAC;IAE5E,wIAAwI;IACxI,cAAc,CAAC,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAI3F,iDAAiD;IACjD,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAIrE,2CAA2C;IAC3C,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAElE,yCAAyC;IACzC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAIhD,sCAAsC;IACtC,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAEnC,wCAAwC;IACxC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEvC,8CAA8C;IAC9C,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport/transport.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the AgenticROS transport abstraction layer.
|
|
3
|
+
*/
|
|
4
|
+
export type ConnectionStatus = "disconnected" | "connecting" | "connected";
|
|
5
|
+
export type MessageHandler = (msg: Record<string, unknown>) => void;
|
|
6
|
+
export type ConnectionHandler = (status: ConnectionStatus) => void;
|
|
7
|
+
/** Returned by subscribe(); call unsubscribe() to stop receiving messages. */
|
|
8
|
+
export interface Subscription {
|
|
9
|
+
unsubscribe(): void;
|
|
10
|
+
}
|
|
11
|
+
export interface PublishOptions {
|
|
12
|
+
topic: string;
|
|
13
|
+
type: string;
|
|
14
|
+
msg: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
/** Optional: advertise a topic (type) before publishing. Used by rosbridge so the server creates the publisher with the right type. */
|
|
17
|
+
export interface AdvertiseOptions {
|
|
18
|
+
topic: string;
|
|
19
|
+
type: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SubscribeOptions {
|
|
22
|
+
topic: string;
|
|
23
|
+
type?: string;
|
|
24
|
+
throttleRate?: number;
|
|
25
|
+
queueLength?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ServiceCallOptions {
|
|
28
|
+
service: string;
|
|
29
|
+
type?: string;
|
|
30
|
+
args?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface ServiceCallResult {
|
|
33
|
+
result: boolean;
|
|
34
|
+
values?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
export interface ActionGoalOptions {
|
|
37
|
+
action: string;
|
|
38
|
+
actionType: string;
|
|
39
|
+
args?: Record<string, unknown>;
|
|
40
|
+
onFeedback?: (feedback: Record<string, unknown>) => void;
|
|
41
|
+
}
|
|
42
|
+
export interface ActionResult {
|
|
43
|
+
result: boolean;
|
|
44
|
+
values?: Record<string, unknown>;
|
|
45
|
+
}
|
|
46
|
+
export interface TopicInfo {
|
|
47
|
+
name: string;
|
|
48
|
+
type: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ServiceInfo {
|
|
51
|
+
name: string;
|
|
52
|
+
type: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ActionInfo {
|
|
55
|
+
name: string;
|
|
56
|
+
type: string;
|
|
57
|
+
}
|
|
58
|
+
export interface RosbridgeTransportConfig {
|
|
59
|
+
mode: "rosbridge";
|
|
60
|
+
rosbridge: {
|
|
61
|
+
url: string;
|
|
62
|
+
reconnect?: boolean;
|
|
63
|
+
reconnectInterval?: number;
|
|
64
|
+
maxReconnectAttempts?: number;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface LocalTransportConfig {
|
|
68
|
+
mode: "local";
|
|
69
|
+
local?: {
|
|
70
|
+
domainId?: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export interface WebRTCTransportConfig {
|
|
74
|
+
mode: "webrtc";
|
|
75
|
+
webrtc: {
|
|
76
|
+
signalingUrl: string;
|
|
77
|
+
apiUrl: string;
|
|
78
|
+
robotId: string;
|
|
79
|
+
robotKey: string;
|
|
80
|
+
iceServers?: RTCIceServerConfig[];
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export interface ZenohTransportConfig {
|
|
84
|
+
mode: "zenoh";
|
|
85
|
+
zenoh: {
|
|
86
|
+
routerEndpoint: string;
|
|
87
|
+
domainId?: number;
|
|
88
|
+
keyFormat?: "ros2dds" | "rmw_zenoh";
|
|
89
|
+
/** Matches zenoh-bridge-ros2dds ros2dds.namespace when not default "/". */
|
|
90
|
+
bridgeNamespace?: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export interface RTCIceServerConfig {
|
|
94
|
+
urls: string | string[];
|
|
95
|
+
username?: string;
|
|
96
|
+
credential?: string;
|
|
97
|
+
}
|
|
98
|
+
/** Discriminated union of all transport configurations. */
|
|
99
|
+
export type TransportConfig = RosbridgeTransportConfig | LocalTransportConfig | WebRTCTransportConfig | ZenohTransportConfig;
|
|
100
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ConnectRequest, ConnectResponse, DisconnectResponse, DiscoverResponse, SignalingMessage } from "./signaling-types.js";
|
|
2
|
+
export type SignalingMessageHandler = (msg: SignalingMessage) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Client for the WebRTC signaling server.
|
|
5
|
+
*
|
|
6
|
+
* Encapsulates REST API calls (discover, connect, disconnect) and
|
|
7
|
+
* WebSocket lifecycle (connect, send, message routing, heartbeat).
|
|
8
|
+
*/
|
|
9
|
+
export declare class SignalingClient {
|
|
10
|
+
private ws;
|
|
11
|
+
private apiUrl;
|
|
12
|
+
private signalingUrl;
|
|
13
|
+
private messageHandler;
|
|
14
|
+
private heartbeatInterval;
|
|
15
|
+
constructor(apiUrl: string, signalingUrl: string);
|
|
16
|
+
discoverRobots(): Promise<DiscoverResponse>;
|
|
17
|
+
requestConnection(robotId: string, request: ConnectRequest): Promise<ConnectResponse>;
|
|
18
|
+
requestDisconnect(robotId: string): Promise<DisconnectResponse>;
|
|
19
|
+
/** Connect to the signaling WebSocket server. */
|
|
20
|
+
connectWs(): Promise<void>;
|
|
21
|
+
/** Set the handler for incoming signaling messages. */
|
|
22
|
+
onMessage(handler: SignalingMessageHandler): void;
|
|
23
|
+
/** Send a signaling message over WebSocket. */
|
|
24
|
+
send(message: SignalingMessage): void;
|
|
25
|
+
/** Send join_room to enter the session room. */
|
|
26
|
+
joinRoom(roomId: string, peerId: string, peerType: "frontend" | "robot", sessionId: string): void;
|
|
27
|
+
/** Send an SDP answer back to the peer. */
|
|
28
|
+
sendAnswer(sdp: string, roomId: string, peerId: string, targetPeerId?: string): void;
|
|
29
|
+
/** Send an ICE candidate to the peer. */
|
|
30
|
+
sendIceCandidate(candidate: string, sdpMid: string | null, sdpMLineIndex: number | null, targetPeerId?: string): void;
|
|
31
|
+
/** Close the signaling WebSocket. */
|
|
32
|
+
close(): void;
|
|
33
|
+
/** Whether the WebSocket is currently connected. */
|
|
34
|
+
get isConnected(): boolean;
|
|
35
|
+
private startHeartbeat;
|
|
36
|
+
private stopHeartbeat;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=signaling-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signaling-client.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc/signaling-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAKjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEtE;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,iBAAiB,CAA+C;gBAE5D,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAQ1C,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAQ3C,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAarF,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAYrE,iDAAiD;IAC3C,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAgDhC,uDAAuD;IACvD,SAAS,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAIjD,+CAA+C;IAC/C,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAOrC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAUjG,2CAA2C;IAC3C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAUpF,yCAAyC;IACzC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAYrH,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAQb,oDAAoD;IACpD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;CAMtB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import WebSocket from "ws";
|
|
2
|
+
/**
|
|
3
|
+
* Client for the WebRTC signaling server.
|
|
4
|
+
*
|
|
5
|
+
* Encapsulates REST API calls (discover, connect, disconnect) and
|
|
6
|
+
* WebSocket lifecycle (connect, send, message routing, heartbeat).
|
|
7
|
+
*/
|
|
8
|
+
export class SignalingClient {
|
|
9
|
+
ws = null;
|
|
10
|
+
apiUrl;
|
|
11
|
+
signalingUrl;
|
|
12
|
+
messageHandler = null;
|
|
13
|
+
heartbeatInterval = null;
|
|
14
|
+
constructor(apiUrl, signalingUrl) {
|
|
15
|
+
// Normalize: strip trailing slashes
|
|
16
|
+
this.apiUrl = apiUrl.replace(/\/+$/, "");
|
|
17
|
+
this.signalingUrl = signalingUrl.replace(/\/+$/, "");
|
|
18
|
+
}
|
|
19
|
+
// --- REST API ---
|
|
20
|
+
async discoverRobots() {
|
|
21
|
+
const res = await fetch(`${this.apiUrl}/api/robots/`);
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
throw new Error(`Discovery failed: ${res.status} ${res.statusText}`);
|
|
24
|
+
}
|
|
25
|
+
return res.json();
|
|
26
|
+
}
|
|
27
|
+
async requestConnection(robotId, request) {
|
|
28
|
+
const res = await fetch(`${this.apiUrl}/api/robots/${robotId}/connect`, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "Content-Type": "application/json" },
|
|
31
|
+
body: JSON.stringify(request),
|
|
32
|
+
});
|
|
33
|
+
if (!res.ok) {
|
|
34
|
+
const body = await res.text();
|
|
35
|
+
throw new Error(`Connection request failed: ${res.status} — ${body}`);
|
|
36
|
+
}
|
|
37
|
+
return res.json();
|
|
38
|
+
}
|
|
39
|
+
async requestDisconnect(robotId) {
|
|
40
|
+
const res = await fetch(`${this.apiUrl}/api/robots/${robotId}/disconnect`, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
});
|
|
43
|
+
if (!res.ok) {
|
|
44
|
+
throw new Error(`Disconnect request failed: ${res.status} ${res.statusText}`);
|
|
45
|
+
}
|
|
46
|
+
return res.json();
|
|
47
|
+
}
|
|
48
|
+
// --- WebSocket ---
|
|
49
|
+
/** Connect to the signaling WebSocket server. */
|
|
50
|
+
async connectWs() {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const wsUrl = `${this.signalingUrl}/ws`;
|
|
53
|
+
const timeout = setTimeout(() => {
|
|
54
|
+
reject(new Error(`Signaling WebSocket connection to ${wsUrl} timed out`));
|
|
55
|
+
}, 10_000);
|
|
56
|
+
this.ws = new WebSocket(wsUrl);
|
|
57
|
+
this.ws.onopen = () => {
|
|
58
|
+
clearTimeout(timeout);
|
|
59
|
+
this.startHeartbeat();
|
|
60
|
+
resolve();
|
|
61
|
+
};
|
|
62
|
+
this.ws.onmessage = (event) => {
|
|
63
|
+
const data = typeof event.data === "string" ? event.data : event.data.toString();
|
|
64
|
+
let msg;
|
|
65
|
+
try {
|
|
66
|
+
msg = JSON.parse(data);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Auto-respond to heartbeat requests
|
|
72
|
+
if (msg.type === "heartbeat_request") {
|
|
73
|
+
this.send({ type: "heartbeat", timestamp: Date.now() });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (this.messageHandler) {
|
|
77
|
+
this.messageHandler(msg);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
this.ws.onerror = () => {
|
|
81
|
+
clearTimeout(timeout);
|
|
82
|
+
reject(new Error(`Signaling WebSocket error connecting to ${wsUrl}`));
|
|
83
|
+
};
|
|
84
|
+
this.ws.onclose = () => {
|
|
85
|
+
clearTimeout(timeout);
|
|
86
|
+
this.stopHeartbeat();
|
|
87
|
+
this.ws = null;
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/** Set the handler for incoming signaling messages. */
|
|
92
|
+
onMessage(handler) {
|
|
93
|
+
this.messageHandler = handler;
|
|
94
|
+
}
|
|
95
|
+
/** Send a signaling message over WebSocket. */
|
|
96
|
+
send(message) {
|
|
97
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
98
|
+
throw new Error("Signaling WebSocket is not connected");
|
|
99
|
+
}
|
|
100
|
+
this.ws.send(JSON.stringify(message));
|
|
101
|
+
}
|
|
102
|
+
/** Send join_room to enter the session room. */
|
|
103
|
+
joinRoom(roomId, peerId, peerType, sessionId) {
|
|
104
|
+
this.send({
|
|
105
|
+
type: "join_room",
|
|
106
|
+
room_id: roomId,
|
|
107
|
+
peer_id: peerId,
|
|
108
|
+
peer_type: peerType,
|
|
109
|
+
session_id: sessionId,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/** Send an SDP answer back to the peer. */
|
|
113
|
+
sendAnswer(sdp, roomId, peerId, targetPeerId) {
|
|
114
|
+
this.send({
|
|
115
|
+
type: "answer",
|
|
116
|
+
data: { type: "answer", sdp },
|
|
117
|
+
room_id: roomId,
|
|
118
|
+
peer_id: peerId,
|
|
119
|
+
target_peer_id: targetPeerId,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/** Send an ICE candidate to the peer. */
|
|
123
|
+
sendIceCandidate(candidate, sdpMid, sdpMLineIndex, targetPeerId) {
|
|
124
|
+
this.send({
|
|
125
|
+
type: "ice_candidate",
|
|
126
|
+
data: {
|
|
127
|
+
candidate,
|
|
128
|
+
sdpMid,
|
|
129
|
+
sdpMLineIndex,
|
|
130
|
+
},
|
|
131
|
+
target_peer_id: targetPeerId,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/** Close the signaling WebSocket. */
|
|
135
|
+
close() {
|
|
136
|
+
this.stopHeartbeat();
|
|
137
|
+
if (this.ws) {
|
|
138
|
+
this.ws.close();
|
|
139
|
+
this.ws = null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Whether the WebSocket is currently connected. */
|
|
143
|
+
get isConnected() {
|
|
144
|
+
return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
|
|
145
|
+
}
|
|
146
|
+
startHeartbeat() {
|
|
147
|
+
this.stopHeartbeat();
|
|
148
|
+
this.heartbeatInterval = setInterval(() => {
|
|
149
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
150
|
+
this.send({ type: "heartbeat", timestamp: Date.now() });
|
|
151
|
+
}
|
|
152
|
+
}, 15_000);
|
|
153
|
+
}
|
|
154
|
+
stopHeartbeat() {
|
|
155
|
+
if (this.heartbeatInterval) {
|
|
156
|
+
clearInterval(this.heartbeatInterval);
|
|
157
|
+
this.heartbeatInterval = null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=signaling-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signaling-client.js","sourceRoot":"","sources":["../../../src/transport/webrtc/signaling-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAe3B;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IAClB,EAAE,GAAqB,IAAI,CAAC;IAC5B,MAAM,CAAS;IACf,YAAY,CAAS;IACrB,cAAc,GAAmC,IAAI,CAAC;IACtD,iBAAiB,GAA0C,IAAI,CAAC;IAExE,YAAY,MAAc,EAAE,YAAoB;QAC9C,oCAAoC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,mBAAmB;IAEnB,KAAK,CAAC,cAAc;QAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAA+B,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAe,EAAE,OAAuB;QAC9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,eAAe,OAAO,UAAU,EAAE;YACtE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAA8B,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAe;QACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,eAAe,OAAO,aAAa,EAAE;YACzE,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAiC,CAAC;IACnD,CAAC;IAED,oBAAoB;IAEpB,iDAAiD;IACjD,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,YAAY,KAAK,CAAC;YACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,KAAK,YAAY,CAAC,CAAC,CAAC;YAC5E,CAAC,EAAE,MAAM,CAAC,CAAC;YAEX,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;YAE/B,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;gBACpB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBAC5B,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjF,IAAI,GAAqB,CAAC;gBAC1B,IAAI,CAAC;oBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;gBAED,qCAAqC;gBACrC,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;oBACrC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAA6B,CAAC,CAAC;oBACnF,OAAO;gBACT,CAAC;gBAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;gBACrB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC,CAAC;YACxE,CAAC,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;gBACrB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACjB,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,SAAS,CAAC,OAAgC;QACxC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,+CAA+C;IAC/C,IAAI,CAAC,OAAyB;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,gDAAgD;IAChD,QAAQ,CAAC,MAAc,EAAE,MAAc,EAAE,QAA8B,EAAE,SAAiB;QACxF,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,SAAS;SACI,CAAC,CAAC;IAC/B,CAAC;IAED,2CAA2C;IAC3C,UAAU,CAAC,GAAW,EAAE,MAAc,EAAE,MAAc,EAAE,YAAqB;QAC3E,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;YAC7B,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;YACf,cAAc,EAAE,YAAY;SACL,CAAC,CAAC;IAC7B,CAAC;IAED,yCAAyC;IACzC,gBAAgB,CAAC,SAAiB,EAAE,MAAqB,EAAE,aAA4B,EAAE,YAAqB;QAC5G,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE;gBACJ,SAAS;gBACT,MAAM;gBACN,aAAa;aACd;YACD,cAAc,EAAE,YAAY;SACC,CAAC,CAAC;IACnC,CAAC;IAED,qCAAqC;IACrC,KAAK;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IACnE,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;YACxC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAA6B,CAAC,CAAC;YACrF,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACtC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the WebRTC signaling server protocol.
|
|
3
|
+
*
|
|
4
|
+
* These match the message format used by the webrtc-py signaling server
|
|
5
|
+
* (see mock_client.py and mock_robot.py for reference implementations).
|
|
6
|
+
*/
|
|
7
|
+
export interface ConnectRequest {
|
|
8
|
+
user_id: string;
|
|
9
|
+
robot_id: string;
|
|
10
|
+
robot_key: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ConnectResponse {
|
|
13
|
+
session: {
|
|
14
|
+
session_id: string;
|
|
15
|
+
};
|
|
16
|
+
room_id: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DisconnectResponse {
|
|
19
|
+
status: string;
|
|
20
|
+
}
|
|
21
|
+
export interface RobotInfo {
|
|
22
|
+
robot_id: string;
|
|
23
|
+
status: string;
|
|
24
|
+
capabilities?: string[];
|
|
25
|
+
}
|
|
26
|
+
export type DiscoverResponse = RobotInfo[];
|
|
27
|
+
/** Base shape for all signaling messages. */
|
|
28
|
+
export interface SignalingMessage {
|
|
29
|
+
type: string;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface JoinRoomMessage extends SignalingMessage {
|
|
33
|
+
type: "join_room";
|
|
34
|
+
room_id: string;
|
|
35
|
+
peer_id: string;
|
|
36
|
+
peer_type: "frontend" | "robot";
|
|
37
|
+
session_id: string;
|
|
38
|
+
}
|
|
39
|
+
export interface RobotConnectMessage extends SignalingMessage {
|
|
40
|
+
type: "robot_connect";
|
|
41
|
+
robot_token: string;
|
|
42
|
+
robot_id: string;
|
|
43
|
+
capabilities?: string[];
|
|
44
|
+
}
|
|
45
|
+
export interface SessionAcceptedMessage extends SignalingMessage {
|
|
46
|
+
type: "session_accepted";
|
|
47
|
+
session_id: string;
|
|
48
|
+
robot_id: string;
|
|
49
|
+
}
|
|
50
|
+
export interface OfferMessage extends SignalingMessage {
|
|
51
|
+
type: "offer";
|
|
52
|
+
data: {
|
|
53
|
+
type: string;
|
|
54
|
+
sdp: string;
|
|
55
|
+
};
|
|
56
|
+
from_peer_id?: string;
|
|
57
|
+
target_peer_id?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface AnswerMessage extends SignalingMessage {
|
|
60
|
+
type: "answer";
|
|
61
|
+
data: {
|
|
62
|
+
type: string;
|
|
63
|
+
sdp: string;
|
|
64
|
+
};
|
|
65
|
+
room_id?: string;
|
|
66
|
+
peer_id?: string;
|
|
67
|
+
target_peer_id?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface IceCandidateMessage extends SignalingMessage {
|
|
70
|
+
type: "ice_candidate";
|
|
71
|
+
data: {
|
|
72
|
+
candidate: string;
|
|
73
|
+
sdpMid: string | null;
|
|
74
|
+
sdpMLineIndex: number | null;
|
|
75
|
+
};
|
|
76
|
+
target_peer_id?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface HeartbeatMessage extends SignalingMessage {
|
|
79
|
+
type: "heartbeat";
|
|
80
|
+
timestamp: number;
|
|
81
|
+
}
|
|
82
|
+
export interface PeerJoinedMessage extends SignalingMessage {
|
|
83
|
+
type: "peer_joined";
|
|
84
|
+
peer_id: string;
|
|
85
|
+
peer_type: "frontend" | "robot";
|
|
86
|
+
}
|
|
87
|
+
export interface PeerLeftMessage extends SignalingMessage {
|
|
88
|
+
type: "peer_left";
|
|
89
|
+
peer_id: string;
|
|
90
|
+
}
|
|
91
|
+
export interface SessionInvitationMessage extends SignalingMessage {
|
|
92
|
+
type: "session_invitation";
|
|
93
|
+
session_id: string;
|
|
94
|
+
room_id: string;
|
|
95
|
+
robot_key: string;
|
|
96
|
+
user_id: string;
|
|
97
|
+
}
|
|
98
|
+
export interface SessionEndedMessage extends SignalingMessage {
|
|
99
|
+
type: "session_ended";
|
|
100
|
+
session_id: string;
|
|
101
|
+
reason?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface HeartbeatRequestMessage extends SignalingMessage {
|
|
104
|
+
type: "heartbeat_request";
|
|
105
|
+
timestamp: number;
|
|
106
|
+
}
|
|
107
|
+
export interface ErrorMessage extends SignalingMessage {
|
|
108
|
+
type: "error";
|
|
109
|
+
message: string;
|
|
110
|
+
code?: string;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=signaling-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signaling-types.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc/signaling-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the WebRTC signaling server protocol.
|
|
3
|
+
*
|
|
4
|
+
* These match the message format used by the webrtc-py signaling server
|
|
5
|
+
* (see mock_client.py and mock_robot.py for reference implementations).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=signaling-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signaling-types.js","sourceRoot":"","sources":["../../../src/transport/webrtc/signaling-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|