@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,67 @@
|
|
|
1
|
+
import type { RosTransport } from "../transport.js";
|
|
2
|
+
import type { ConnectionStatus, ConnectionHandler, Subscription, PublishOptions, SubscribeOptions, ServiceCallOptions, ServiceCallResult, ActionGoalOptions, ActionResult, TopicInfo, ServiceInfo, ActionInfo, MessageHandler, RTCIceServerConfig } from "../types.js";
|
|
3
|
+
export interface WebRTCTransportOptions {
|
|
4
|
+
/** WebSocket URL of the signaling server (e.g., wss://signal-host). */
|
|
5
|
+
signalingUrl: string;
|
|
6
|
+
/** REST API URL of the signaling server (e.g., https://signal-host). */
|
|
7
|
+
apiUrl: string;
|
|
8
|
+
/** Target robot's ID on the signaling server. */
|
|
9
|
+
robotId: string;
|
|
10
|
+
/** Robot key secret — validated by the robot, not the signaling server. */
|
|
11
|
+
robotKey: string;
|
|
12
|
+
/** STUN/TURN server configuration. */
|
|
13
|
+
iceServers?: RTCIceServerConfig[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Mode C transport: WebRTC data channel for cloud/remote deployments.
|
|
17
|
+
*
|
|
18
|
+
* The frontend (this class) acts as the answering peer:
|
|
19
|
+
* 1. POST /api/robots/{robotId}/connect → get session_id, room_id
|
|
20
|
+
* 2. Open signaling WebSocket → JOIN_ROOM
|
|
21
|
+
* 3. Wait for robot's SDP offer
|
|
22
|
+
* 4. Create RTCPeerConnection, set remote description, create answer
|
|
23
|
+
* 5. Exchange ICE candidates
|
|
24
|
+
* 6. Data channel opens → rosbridge JSON over WebRTC
|
|
25
|
+
*/
|
|
26
|
+
export declare class WebRTCTransport implements RosTransport {
|
|
27
|
+
private options;
|
|
28
|
+
private signaling;
|
|
29
|
+
private pc;
|
|
30
|
+
private dataChannel;
|
|
31
|
+
private status;
|
|
32
|
+
private connectionHandlers;
|
|
33
|
+
private topicHandlers;
|
|
34
|
+
private pendingRequests;
|
|
35
|
+
private idCounter;
|
|
36
|
+
private sessionId;
|
|
37
|
+
private roomId;
|
|
38
|
+
private peerId;
|
|
39
|
+
private robotPeerId;
|
|
40
|
+
constructor(options: WebRTCTransportOptions);
|
|
41
|
+
connect(): Promise<void>;
|
|
42
|
+
disconnect(): Promise<void>;
|
|
43
|
+
getStatus(): ConnectionStatus;
|
|
44
|
+
onConnection(handler: ConnectionHandler): () => void;
|
|
45
|
+
publish(options: PublishOptions): void;
|
|
46
|
+
subscribe(options: SubscribeOptions, handler: MessageHandler): Subscription;
|
|
47
|
+
callService(options: ServiceCallOptions): Promise<ServiceCallResult>;
|
|
48
|
+
sendActionGoal(options: ActionGoalOptions): Promise<ActionResult>;
|
|
49
|
+
cancelActionGoal(action: string): Promise<void>;
|
|
50
|
+
listTopics(): Promise<TopicInfo[]>;
|
|
51
|
+
listServices(): Promise<ServiceInfo[]>;
|
|
52
|
+
listActions(): Promise<ActionInfo[]>;
|
|
53
|
+
private nextId;
|
|
54
|
+
private setStatus;
|
|
55
|
+
private sendOverDataChannel;
|
|
56
|
+
private registerPending;
|
|
57
|
+
private resolvePending;
|
|
58
|
+
/** Handle incoming rosbridge JSON from the data channel. */
|
|
59
|
+
private handleDataChannelMessage;
|
|
60
|
+
/** Handle signaling messages during connection setup. */
|
|
61
|
+
private handleSignalingMessage;
|
|
62
|
+
/** Handle SDP offer from the robot and create an answer. */
|
|
63
|
+
private handleOffer;
|
|
64
|
+
private cleanup;
|
|
65
|
+
private rejectAllPending;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,aAAa,CAAC;AASrB,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACnC;AASD;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAuB;gBAE9B,OAAO,EAAE,sBAAsB;IAKrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2CxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,SAAS,IAAI,gBAAgB;IAI7B,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAOpD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAStC,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY;IAiCrE,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqBpE,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAuCjE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAWlC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAWtC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAsB1C,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;IAStB,4DAA4D;IAC5D,OAAO,CAAC,wBAAwB;IAmDhC,yDAAyD;IACzD,OAAO,CAAC,sBAAsB;IAqC9B,4DAA4D;IAC5D,OAAO,CAAC,WAAW;IA6DnB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,gBAAgB;CAOzB"}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { PeerConnection, DescriptionType } from "node-datachannel";
|
|
2
|
+
import { SignalingClient } from "./signaling-client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Mode C transport: WebRTC data channel for cloud/remote deployments.
|
|
5
|
+
*
|
|
6
|
+
* The frontend (this class) acts as the answering peer:
|
|
7
|
+
* 1. POST /api/robots/{robotId}/connect → get session_id, room_id
|
|
8
|
+
* 2. Open signaling WebSocket → JOIN_ROOM
|
|
9
|
+
* 3. Wait for robot's SDP offer
|
|
10
|
+
* 4. Create RTCPeerConnection, set remote description, create answer
|
|
11
|
+
* 5. Exchange ICE candidates
|
|
12
|
+
* 6. Data channel opens → rosbridge JSON over WebRTC
|
|
13
|
+
*/
|
|
14
|
+
export class WebRTCTransport {
|
|
15
|
+
options;
|
|
16
|
+
signaling;
|
|
17
|
+
pc = null;
|
|
18
|
+
dataChannel = null;
|
|
19
|
+
status = "disconnected";
|
|
20
|
+
connectionHandlers = new Set();
|
|
21
|
+
topicHandlers = new Map();
|
|
22
|
+
pendingRequests = new Map();
|
|
23
|
+
idCounter = 0;
|
|
24
|
+
sessionId = null;
|
|
25
|
+
roomId = null;
|
|
26
|
+
peerId = null;
|
|
27
|
+
robotPeerId = null;
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.options = options;
|
|
30
|
+
this.signaling = new SignalingClient(options.apiUrl, options.signalingUrl);
|
|
31
|
+
}
|
|
32
|
+
async connect() {
|
|
33
|
+
if (this.status === "connected")
|
|
34
|
+
return;
|
|
35
|
+
this.setStatus("connecting");
|
|
36
|
+
try {
|
|
37
|
+
// Step 1: Request connection via REST API
|
|
38
|
+
const userId = `frontend_${Date.now()}`;
|
|
39
|
+
const connectRes = await this.signaling.requestConnection(this.options.robotId, {
|
|
40
|
+
user_id: userId,
|
|
41
|
+
robot_id: this.options.robotId,
|
|
42
|
+
robot_key: this.options.robotKey,
|
|
43
|
+
});
|
|
44
|
+
this.sessionId = connectRes.session.session_id;
|
|
45
|
+
this.roomId = connectRes.room_id;
|
|
46
|
+
this.peerId = userId;
|
|
47
|
+
// Step 2: Connect signaling WebSocket
|
|
48
|
+
await this.signaling.connectWs();
|
|
49
|
+
// Step 3: Set up message handler before joining room
|
|
50
|
+
const connected = new Promise((resolve, reject) => {
|
|
51
|
+
const timeout = setTimeout(() => {
|
|
52
|
+
reject(new Error("WebRTC connection timed out (30s)"));
|
|
53
|
+
}, 30_000);
|
|
54
|
+
this.signaling.onMessage((msg) => {
|
|
55
|
+
this.handleSignalingMessage(msg, resolve, reject, timeout);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
// Step 4: Join room
|
|
59
|
+
this.signaling.joinRoom(this.roomId, userId, "frontend", this.sessionId);
|
|
60
|
+
// Step 5: Wait for data channel to be established
|
|
61
|
+
await connected;
|
|
62
|
+
this.setStatus("connected");
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
this.setStatus("disconnected");
|
|
66
|
+
this.cleanup();
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async disconnect() {
|
|
71
|
+
this.cleanup();
|
|
72
|
+
// Notify signaling server
|
|
73
|
+
if (this.sessionId) {
|
|
74
|
+
try {
|
|
75
|
+
await this.signaling.requestDisconnect(this.options.robotId);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Best-effort disconnect notification
|
|
79
|
+
}
|
|
80
|
+
this.sessionId = null;
|
|
81
|
+
}
|
|
82
|
+
this.signaling.close();
|
|
83
|
+
this.setStatus("disconnected");
|
|
84
|
+
}
|
|
85
|
+
getStatus() {
|
|
86
|
+
return this.status;
|
|
87
|
+
}
|
|
88
|
+
onConnection(handler) {
|
|
89
|
+
this.connectionHandlers.add(handler);
|
|
90
|
+
return () => {
|
|
91
|
+
this.connectionHandlers.delete(handler);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
publish(options) {
|
|
95
|
+
this.sendOverDataChannel({
|
|
96
|
+
op: "publish",
|
|
97
|
+
topic: options.topic,
|
|
98
|
+
type: options.type,
|
|
99
|
+
msg: options.msg,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
subscribe(options, handler) {
|
|
103
|
+
const topic = options.topic;
|
|
104
|
+
if (!this.topicHandlers.has(topic)) {
|
|
105
|
+
this.topicHandlers.set(topic, new Set());
|
|
106
|
+
}
|
|
107
|
+
this.topicHandlers.get(topic).add(handler);
|
|
108
|
+
// Send rosbridge subscribe command
|
|
109
|
+
this.sendOverDataChannel({
|
|
110
|
+
op: "subscribe",
|
|
111
|
+
id: this.nextId("sub"),
|
|
112
|
+
topic,
|
|
113
|
+
type: options.type,
|
|
114
|
+
throttle_rate: options.throttleRate,
|
|
115
|
+
queue_length: options.queueLength,
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
unsubscribe: () => {
|
|
119
|
+
this.topicHandlers.get(topic)?.delete(handler);
|
|
120
|
+
if (this.topicHandlers.get(topic)?.size === 0) {
|
|
121
|
+
this.topicHandlers.delete(topic);
|
|
122
|
+
try {
|
|
123
|
+
this.sendOverDataChannel({ op: "unsubscribe", topic });
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Already disconnected
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async callService(options) {
|
|
133
|
+
const id = this.nextId("service");
|
|
134
|
+
const response = await new Promise((resolve, reject) => {
|
|
135
|
+
this.registerPending(id, (v) => resolve(v), reject, 30_000);
|
|
136
|
+
this.sendOverDataChannel({
|
|
137
|
+
op: "call_service",
|
|
138
|
+
id,
|
|
139
|
+
service: options.service,
|
|
140
|
+
args: options.args,
|
|
141
|
+
type: options.type,
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
return {
|
|
145
|
+
result: response.result,
|
|
146
|
+
values: response.values,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
async sendActionGoal(options) {
|
|
150
|
+
const id = this.nextId("action");
|
|
151
|
+
// Register feedback handler if provided
|
|
152
|
+
let feedbackKey = null;
|
|
153
|
+
if (options.onFeedback) {
|
|
154
|
+
feedbackKey = `__action_feedback__${id}`;
|
|
155
|
+
if (!this.topicHandlers.has(feedbackKey)) {
|
|
156
|
+
this.topicHandlers.set(feedbackKey, new Set());
|
|
157
|
+
}
|
|
158
|
+
this.topicHandlers.get(feedbackKey).add((msg) => {
|
|
159
|
+
options.onFeedback(msg.values);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const response = await new Promise((resolve, reject) => {
|
|
164
|
+
this.registerPending(id, (v) => resolve(v), reject, 120_000);
|
|
165
|
+
this.sendOverDataChannel({
|
|
166
|
+
op: "send_action_goal",
|
|
167
|
+
id,
|
|
168
|
+
action: options.action,
|
|
169
|
+
action_type: options.actionType,
|
|
170
|
+
args: options.args,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
return {
|
|
174
|
+
result: response.result,
|
|
175
|
+
values: response.values,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
if (feedbackKey) {
|
|
180
|
+
this.topicHandlers.delete(feedbackKey);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async cancelActionGoal(action) {
|
|
185
|
+
this.sendOverDataChannel({
|
|
186
|
+
op: "cancel_action_goal",
|
|
187
|
+
id: this.nextId("cancel"),
|
|
188
|
+
action,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
async listTopics() {
|
|
192
|
+
const result = await this.callService({
|
|
193
|
+
service: "/rosapi/topics",
|
|
194
|
+
type: "rosapi/srv/Topics",
|
|
195
|
+
args: {},
|
|
196
|
+
});
|
|
197
|
+
const topics = result.values?.["topics"] ?? [];
|
|
198
|
+
const types = result.values?.["types"] ?? [];
|
|
199
|
+
return topics.map((name, i) => ({ name, type: types[i] ?? "" }));
|
|
200
|
+
}
|
|
201
|
+
async listServices() {
|
|
202
|
+
const result = await this.callService({
|
|
203
|
+
service: "/rosapi/services",
|
|
204
|
+
type: "rosapi/srv/Services",
|
|
205
|
+
args: {},
|
|
206
|
+
});
|
|
207
|
+
const services = result.values?.["services"] ?? [];
|
|
208
|
+
const types = result.values?.["types"] ?? [];
|
|
209
|
+
return services.map((name, i) => ({ name, type: types[i] ?? "" }));
|
|
210
|
+
}
|
|
211
|
+
async listActions() {
|
|
212
|
+
// Same heuristic as RosbridgeTransport — extract from feedback topics
|
|
213
|
+
const topics = await this.listTopics();
|
|
214
|
+
const actions = [];
|
|
215
|
+
const feedbackSuffix = "/_action/feedback";
|
|
216
|
+
for (const topic of topics) {
|
|
217
|
+
if (topic.name.endsWith(feedbackSuffix)) {
|
|
218
|
+
const actionName = topic.name.slice(0, -feedbackSuffix.length);
|
|
219
|
+
let actionType = topic.type;
|
|
220
|
+
if (actionType.endsWith("_FeedbackMessage")) {
|
|
221
|
+
actionType = actionType.slice(0, -"_FeedbackMessage".length);
|
|
222
|
+
}
|
|
223
|
+
actions.push({ name: actionName, type: actionType });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return actions;
|
|
227
|
+
}
|
|
228
|
+
// --- Private helpers ---
|
|
229
|
+
nextId(prefix = "agenticros") {
|
|
230
|
+
return `${prefix}_${++this.idCounter}`;
|
|
231
|
+
}
|
|
232
|
+
setStatus(status) {
|
|
233
|
+
this.status = status;
|
|
234
|
+
for (const handler of this.connectionHandlers) {
|
|
235
|
+
handler(status);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
sendOverDataChannel(msg) {
|
|
239
|
+
if (!this.dataChannel) {
|
|
240
|
+
throw new Error("Data channel is not open");
|
|
241
|
+
}
|
|
242
|
+
this.dataChannel.sendMessage(JSON.stringify(msg));
|
|
243
|
+
}
|
|
244
|
+
registerPending(id, resolve, reject, timeoutMs) {
|
|
245
|
+
const timer = setTimeout(() => {
|
|
246
|
+
this.pendingRequests.delete(id);
|
|
247
|
+
reject(new Error(`Request ${id} timed out after ${timeoutMs}ms`));
|
|
248
|
+
}, timeoutMs);
|
|
249
|
+
this.pendingRequests.set(id, { resolve, reject, timer });
|
|
250
|
+
}
|
|
251
|
+
resolvePending(id, result) {
|
|
252
|
+
const pending = this.pendingRequests.get(id);
|
|
253
|
+
if (pending) {
|
|
254
|
+
clearTimeout(pending.timer);
|
|
255
|
+
this.pendingRequests.delete(id);
|
|
256
|
+
pending.resolve(result);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/** Handle incoming rosbridge JSON from the data channel. */
|
|
260
|
+
handleDataChannelMessage(data) {
|
|
261
|
+
let msg;
|
|
262
|
+
try {
|
|
263
|
+
msg = JSON.parse(data);
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const op = msg.op;
|
|
269
|
+
if (!op)
|
|
270
|
+
return;
|
|
271
|
+
switch (op) {
|
|
272
|
+
case "publish": {
|
|
273
|
+
const topic = msg.topic;
|
|
274
|
+
const payload = msg.msg;
|
|
275
|
+
const handlers = this.topicHandlers.get(topic);
|
|
276
|
+
if (handlers) {
|
|
277
|
+
for (const handler of handlers) {
|
|
278
|
+
handler(payload);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
case "service_response": {
|
|
284
|
+
const id = msg.id;
|
|
285
|
+
if (id)
|
|
286
|
+
this.resolvePending(id, msg);
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
case "action_result": {
|
|
290
|
+
const id = msg.id;
|
|
291
|
+
if (id)
|
|
292
|
+
this.resolvePending(id, msg);
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
case "action_feedback": {
|
|
296
|
+
const id = msg.id;
|
|
297
|
+
if (id) {
|
|
298
|
+
const handlers = this.topicHandlers.get(`__action_feedback__${id}`);
|
|
299
|
+
if (handlers) {
|
|
300
|
+
for (const handler of handlers) {
|
|
301
|
+
handler(msg);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/** Handle signaling messages during connection setup. */
|
|
310
|
+
handleSignalingMessage(msg, onConnected, onError, timeout) {
|
|
311
|
+
switch (msg.type) {
|
|
312
|
+
case "peer_joined": {
|
|
313
|
+
const peerMsg = msg;
|
|
314
|
+
if (peerMsg.peer_type === "robot") {
|
|
315
|
+
this.robotPeerId = peerMsg.peer_id;
|
|
316
|
+
}
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
case "offer": {
|
|
320
|
+
const offerMsg = msg;
|
|
321
|
+
this.handleOffer(offerMsg, onConnected, onError, timeout);
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
case "ice_candidate": {
|
|
325
|
+
const iceMsg = msg;
|
|
326
|
+
if (this.pc) {
|
|
327
|
+
this.pc.addRemoteCandidate(iceMsg.data.candidate, iceMsg.data.sdpMid ?? "0");
|
|
328
|
+
}
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
case "error": {
|
|
332
|
+
clearTimeout(timeout);
|
|
333
|
+
onError(new Error(`Signaling error: ${msg.message}`));
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/** Handle SDP offer from the robot and create an answer. */
|
|
339
|
+
handleOffer(offer, onConnected, onError, timeout) {
|
|
340
|
+
// Build ICE server strings for node-datachannel
|
|
341
|
+
const iceServers = this.options.iceServers ?? [{ urls: "stun:stun.l.google.com:19302" }];
|
|
342
|
+
const iceServerStrs = iceServers.map((s) => {
|
|
343
|
+
const urls = Array.isArray(s.urls) ? s.urls : [s.urls];
|
|
344
|
+
return urls[0]; // node-datachannel takes individual server strings
|
|
345
|
+
});
|
|
346
|
+
const rtcConfig = { iceServers: iceServerStrs };
|
|
347
|
+
this.pc = new PeerConnection("agenticros-frontend", rtcConfig);
|
|
348
|
+
// Handle ICE candidates from our side → send to robot
|
|
349
|
+
this.pc.onLocalCandidate((candidate, mid) => {
|
|
350
|
+
this.signaling.sendIceCandidate(candidate, mid, null, this.robotPeerId ?? undefined);
|
|
351
|
+
});
|
|
352
|
+
// Handle state changes
|
|
353
|
+
this.pc.onStateChange((state) => {
|
|
354
|
+
if (state === "failed" || state === "closed") {
|
|
355
|
+
this.setStatus("disconnected");
|
|
356
|
+
this.rejectAllPending(new Error("Peer connection closed"));
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
// Handle incoming data channel
|
|
360
|
+
this.pc.onDataChannel((dc) => {
|
|
361
|
+
this.dataChannel = dc;
|
|
362
|
+
dc.onOpen(() => {
|
|
363
|
+
clearTimeout(timeout);
|
|
364
|
+
onConnected();
|
|
365
|
+
});
|
|
366
|
+
dc.onMessage((data) => {
|
|
367
|
+
const str = typeof data === "string" ? data : data.toString("utf-8");
|
|
368
|
+
this.handleDataChannelMessage(str);
|
|
369
|
+
});
|
|
370
|
+
dc.onClosed(() => {
|
|
371
|
+
this.dataChannel = null;
|
|
372
|
+
this.setStatus("disconnected");
|
|
373
|
+
this.rejectAllPending(new Error("Data channel closed"));
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
// Set remote offer and create answer
|
|
377
|
+
this.pc.setRemoteDescription(offer.data.sdp, DescriptionType.Offer);
|
|
378
|
+
const answer = this.pc.localDescription();
|
|
379
|
+
if (answer) {
|
|
380
|
+
this.signaling.sendAnswer(answer.sdp, this.roomId, this.peerId, this.robotPeerId ?? undefined);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
clearTimeout(timeout);
|
|
384
|
+
onError(new Error("Failed to create SDP answer"));
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
cleanup() {
|
|
388
|
+
this.rejectAllPending(new Error("Transport disconnected"));
|
|
389
|
+
if (this.dataChannel) {
|
|
390
|
+
this.dataChannel.close();
|
|
391
|
+
this.dataChannel = null;
|
|
392
|
+
}
|
|
393
|
+
if (this.pc) {
|
|
394
|
+
this.pc.close();
|
|
395
|
+
this.pc = null;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
rejectAllPending(error) {
|
|
399
|
+
for (const [, pending] of this.pendingRequests) {
|
|
400
|
+
clearTimeout(pending.timer);
|
|
401
|
+
pending.reject(error);
|
|
402
|
+
}
|
|
403
|
+
this.pendingRequests.clear();
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/transport/webrtc/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { RosTransport } from "../transport.js";
|
|
2
|
+
import type { ConnectionStatus, ConnectionHandler, Subscription, PublishOptions, SubscribeOptions, ServiceCallOptions, ServiceCallResult, ActionGoalOptions, ActionResult, TopicInfo, ServiceInfo, ActionInfo, MessageHandler } from "../types.js";
|
|
3
|
+
import { type ZenohKeyFormat } from "./keys.js";
|
|
4
|
+
export interface ZenohAdapterConfig {
|
|
5
|
+
routerEndpoint: string;
|
|
6
|
+
domainId?: number;
|
|
7
|
+
/** "ros2dds" for zenoh-bridge-ros2dds, "rmw_zenoh" for ROS2 with Zenoh RMW */
|
|
8
|
+
keyFormat?: ZenohKeyFormat;
|
|
9
|
+
/** When ros2dds bridge uses a non-"/" namespace, set to the same value (e.g. "/bot1"). */
|
|
10
|
+
bridgeNamespace?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Zenoh transport adapter (Mode D).
|
|
14
|
+
* Connects to a Zenoh router via zenoh-ts (WebSocket to zenoh-plugin-remote-api).
|
|
15
|
+
* Uses rmw_zenoh key mapping and CDR payloads for ROS 2 compatibility.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ZenohTransport implements RosTransport {
|
|
18
|
+
private config;
|
|
19
|
+
private session;
|
|
20
|
+
private status;
|
|
21
|
+
private connectionHandlers;
|
|
22
|
+
private subscribers;
|
|
23
|
+
/** Serialize Session.open/close so two connect()s never open parallel WebSockets to remote-api. */
|
|
24
|
+
private sessionOpQueue;
|
|
25
|
+
/** Serialize listTopics so overlapping tool calls do not undeclare each other's subscribers. */
|
|
26
|
+
private listTopicsOpQueue;
|
|
27
|
+
constructor(config: ZenohAdapterConfig);
|
|
28
|
+
private setStatus;
|
|
29
|
+
private domainId;
|
|
30
|
+
private keyFormat;
|
|
31
|
+
private key;
|
|
32
|
+
private enqueueSessionOp;
|
|
33
|
+
connect(): Promise<void>;
|
|
34
|
+
disconnect(): Promise<void>;
|
|
35
|
+
getStatus(): ConnectionStatus;
|
|
36
|
+
onConnection(handler: ConnectionHandler): () => void;
|
|
37
|
+
publish(options: PublishOptions): Promise<void>;
|
|
38
|
+
subscribe(options: SubscribeOptions, handler: MessageHandler): Subscription;
|
|
39
|
+
subscribeAsync(options: SubscribeOptions, handler: MessageHandler): Promise<Subscription>;
|
|
40
|
+
callService(_options: ServiceCallOptions): Promise<ServiceCallResult>;
|
|
41
|
+
sendActionGoal(_options: ActionGoalOptions): Promise<ActionResult>;
|
|
42
|
+
cancelActionGoal(_action: string): Promise<void>;
|
|
43
|
+
listTopics(): Promise<TopicInfo[]>;
|
|
44
|
+
listServices(): Promise<ServiceInfo[]>;
|
|
45
|
+
listActions(): Promise<ActionInfo[]>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/transport/zenoh/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGxF,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,0FAA0F;IAC1F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,WAAW,CAA8D;IACjF,mGAAmG;IACnG,OAAO,CAAC,cAAc,CAAoC;IAC1D,gGAAgG;IAChG,OAAO,CAAC,iBAAiB,CAA6C;gBAE1D,MAAM,EAAE,kBAAkB;IActC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,gBAAgB;IAMlB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAcjC,SAAS,IAAI,gBAAgB;IAI7B,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAKpD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC/C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY;IAiDrE,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IA6CzF,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOrE,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAOlE,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA+DlC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAItC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAG3C"}
|