abb-rws-client 0.7.2 → 1.0.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/CHANGELOG.md +137 -0
- package/README.md +17 -8
- package/dist/HalJsonParser.d.ts +55 -0
- package/dist/HalJsonParser.d.ts.map +1 -0
- package/dist/HalJsonParser.js +155 -0
- package/dist/HalJsonParser.js.map +1 -0
- package/dist/HttpSession.d.ts.map +1 -1
- package/dist/HttpSession.js +13 -2
- package/dist/HttpSession.js.map +1 -1
- package/dist/IRWSAdapter.d.ts +7 -1
- package/dist/IRWSAdapter.d.ts.map +1 -1
- package/dist/MdnsDiscovery.d.ts +57 -0
- package/dist/MdnsDiscovery.d.ts.map +1 -0
- package/dist/MdnsDiscovery.js +313 -0
- package/dist/MdnsDiscovery.js.map +1 -0
- package/dist/MultiRobotManager.d.ts +5 -2
- package/dist/MultiRobotManager.d.ts.map +1 -1
- package/dist/MultiRobotManager.js +8 -3
- package/dist/MultiRobotManager.js.map +1 -1
- package/dist/RWS1Adapter.d.ts +60 -2
- package/dist/RWS1Adapter.d.ts.map +1 -1
- package/dist/RWS1Adapter.js +152 -4
- package/dist/RWS1Adapter.js.map +1 -1
- package/dist/ResourceMapper.d.ts +4 -0
- package/dist/ResourceMapper.d.ts.map +1 -1
- package/dist/ResourceMapper.js +9 -1
- package/dist/ResourceMapper.js.map +1 -1
- package/dist/RobotManager.d.ts +72 -12
- package/dist/RobotManager.d.ts.map +1 -1
- package/dist/RobotManager.js +255 -50
- package/dist/RobotManager.js.map +1 -1
- package/dist/RwsClient2.d.ts +150 -10
- package/dist/RwsClient2.d.ts.map +1 -1
- package/dist/RwsClient2.js +599 -236
- package/dist/RwsClient2.js.map +1 -1
- package/dist/WsSubscriber.d.ts +31 -5
- package/dist/WsSubscriber.d.ts.map +1 -1
- package/dist/WsSubscriber.js +104 -50
- package/dist/WsSubscriber.js.map +1 -1
- package/dist/detect.d.ts +12 -3
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +69 -25
- package/dist/detect.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/examples/05-remote-control-rmmp.mjs +10 -12
- package/examples/06-pull-module-source.mjs +13 -20
- package/package.json +62 -60
- package/src/HalJsonParser.ts +137 -0
- package/src/HttpSession.ts +460 -0
- package/src/IRWSAdapter.ts +422 -0
- package/src/Logger.ts +54 -0
- package/src/MdnsDiscovery.ts +336 -0
- package/src/MultiRobotManager.ts +159 -0
- package/src/RWS1Adapter.ts +1018 -0
- package/src/RWS2Adapter.ts +19 -0
- package/src/ResourceMapper.ts +517 -0
- package/src/ResponseParser.ts +710 -0
- package/src/RobotManager.ts +1705 -0
- package/src/RwsClient.ts +1150 -0
- package/src/RwsClient2.ts +2214 -0
- package/src/WsSubscriber.ts +350 -0
- package/src/XhtmlParser.ts +53 -0
- package/src/detect.ts +261 -0
- package/src/index.ts +83 -0
- package/src/types.ts +336 -0
package/dist/WsSubscriber.js
CHANGED
|
@@ -4,34 +4,39 @@
|
|
|
4
4
|
* Flow:
|
|
5
5
|
* 1. POST /subscription via HttpSession to register resources → get subscription ID
|
|
6
6
|
* 2. Open WebSocket to ws://{host}/subscription/{id} with robapi2_subscription subprotocol
|
|
7
|
-
* 3.
|
|
8
|
-
*
|
|
7
|
+
* 3. subscribe() resolves only once the WebSocket is open; if the socket errors or
|
|
8
|
+
* closes before opening, subscribe() rejects and best-effort DELETEs the
|
|
9
|
+
* registration so the controller-side subscription slot is not leaked
|
|
10
|
+
* 4. Parse incoming XML event messages → emit typed SubscriptionEvent objects
|
|
11
|
+
* 5. Auto-reconnect when an established stream drops: max 3 retries, exponential
|
|
12
|
+
* backoff 1s/2s/4s
|
|
9
13
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
14
|
+
* Always connects through the 'ws' package: the RWS upgrade request must carry the
|
|
15
|
+
* session Cookie header, and native (undici) WebSocket has no headers option — it
|
|
16
|
+
* silently ignores the ws-style third constructor argument, so the handshake goes
|
|
17
|
+
* out unauthenticated. Live-verified 2026-07-08 against IRC5 RW6.16: native WS is
|
|
18
|
+
* rejected with HTTP 403, 'ws' with the same Cookie opens and delivers events.
|
|
12
19
|
*/
|
|
13
|
-
import { RwsError } from './types.js';
|
|
14
20
|
import { createRequire } from 'module';
|
|
21
|
+
import { RwsError } from './types.js';
|
|
22
|
+
import { subscriptions } from './ResourceMapper.js';
|
|
23
|
+
import { parseSubscriptionId } from './ResponseParser.js';
|
|
24
|
+
const BACKOFF_MS = [1000, 2000, 4000];
|
|
25
|
+
const MAX_RETRIES = 3;
|
|
15
26
|
/**
|
|
16
|
-
* Resolve
|
|
17
|
-
*
|
|
27
|
+
* Resolve the 'ws' package constructor. Never returns native globalThis.WebSocket —
|
|
28
|
+
* it cannot send the Cookie header the controller requires for WS auth.
|
|
18
29
|
*/
|
|
19
30
|
function resolveWebSocket() {
|
|
20
|
-
if (globalThis.WebSocket)
|
|
21
|
-
return globalThis.WebSocket;
|
|
22
31
|
try {
|
|
23
32
|
const require = createRequire(import.meta.url);
|
|
24
33
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
34
|
return require('ws');
|
|
26
35
|
}
|
|
27
36
|
catch {
|
|
28
|
-
throw new RwsError('
|
|
37
|
+
throw new RwsError('The "ws" package is required for RWS 1.0 subscriptions but could not be loaded.', 'NETWORK_ERROR');
|
|
29
38
|
}
|
|
30
39
|
}
|
|
31
|
-
import { subscriptions } from './ResourceMapper.js';
|
|
32
|
-
import { parseSubscriptionId } from './ResponseParser.js';
|
|
33
|
-
const BACKOFF_MS = [1000, 2000, 4000];
|
|
34
|
-
const MAX_RETRIES = 3;
|
|
35
40
|
// ─── Path builder for subscription resources ─────────────────────────────────
|
|
36
41
|
/**
|
|
37
42
|
* Map a SubscriptionResource to its RWS 1.0 event path (with ;state suffix where needed).
|
|
@@ -120,15 +125,22 @@ export class WsSubscriber {
|
|
|
120
125
|
session;
|
|
121
126
|
host;
|
|
122
127
|
port;
|
|
128
|
+
wsCtor;
|
|
123
129
|
subscriptions = new Map();
|
|
124
|
-
constructor(session, host, port) {
|
|
130
|
+
constructor(session, host, port, wsCtor) {
|
|
125
131
|
this.session = session;
|
|
126
132
|
this.host = host;
|
|
127
133
|
this.port = port;
|
|
134
|
+
this.wsCtor = wsCtor;
|
|
128
135
|
}
|
|
129
136
|
/**
|
|
130
137
|
* Subscribe to one or more RWS resources. Returns an unsubscribe function.
|
|
131
138
|
*
|
|
139
|
+
* Resolves only once the event WebSocket is open. If the socket fails before
|
|
140
|
+
* opening (refused connection, failed upgrade), rejects with RwsError after
|
|
141
|
+
* best-effort deleting the subscription registered by the POST — otherwise the
|
|
142
|
+
* caller believes it has live events while the controller streams to nobody.
|
|
143
|
+
*
|
|
132
144
|
* @param resources - Array of resources to subscribe to
|
|
133
145
|
* @param handler - Called for each incoming event
|
|
134
146
|
* @returns - Async function that cancels the subscription and closes the WebSocket
|
|
@@ -171,7 +183,19 @@ export class WsSubscriber {
|
|
|
171
183
|
closed: false,
|
|
172
184
|
};
|
|
173
185
|
this.subscriptions.set(subscriptionId, sub);
|
|
174
|
-
|
|
186
|
+
// Step 3: open the WebSocket and wait for it — a subscription without a live
|
|
187
|
+
// event stream is worse than no subscription (silent staleness).
|
|
188
|
+
try {
|
|
189
|
+
await this.openWebSocket(sub);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
sub.closed = true;
|
|
193
|
+
sub.ws = null;
|
|
194
|
+
this.subscriptions.delete(subscriptionId);
|
|
195
|
+
// Free the controller-side slot registered by the POST — best-effort
|
|
196
|
+
await this.session.delete(sub.deleteUrl).catch(() => undefined);
|
|
197
|
+
throw err;
|
|
198
|
+
}
|
|
175
199
|
// Return unsubscribe function
|
|
176
200
|
return async () => {
|
|
177
201
|
sub.closed = true;
|
|
@@ -199,43 +223,73 @@ export class WsSubscriber {
|
|
|
199
223
|
await Promise.allSettled(promises);
|
|
200
224
|
}
|
|
201
225
|
// ─── WebSocket lifecycle ────────────────────────────────────────────────────
|
|
226
|
+
/**
|
|
227
|
+
* Open the event WebSocket for a subscription. Resolves once the socket is
|
|
228
|
+
* open; rejects if it errors or closes before ever opening (refused connection,
|
|
229
|
+
* rejected upgrade). Reconnect handling for established streams lives in the
|
|
230
|
+
* close handler, so callers of reconnect attempts must catch rejections.
|
|
231
|
+
*/
|
|
202
232
|
openWebSocket(sub) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
233
|
+
return new Promise((resolve, reject) => {
|
|
234
|
+
const cookieHeader = this.session.getCookieHeader();
|
|
235
|
+
const WS = this.wsCtor ?? resolveWebSocket();
|
|
236
|
+
const ws = new WS(sub.wsUrl, ['robapi2_subscription'], {
|
|
237
|
+
headers: { Cookie: cookieHeader },
|
|
238
|
+
});
|
|
239
|
+
sub.ws = ws;
|
|
240
|
+
let opened = false;
|
|
241
|
+
const failBeforeOpen = () => {
|
|
242
|
+
reject(new RwsError(`WebSocket for subscription ${sub.id} failed before opening`, 'NETWORK_ERROR'));
|
|
243
|
+
};
|
|
244
|
+
ws.onopen = () => {
|
|
245
|
+
opened = true;
|
|
246
|
+
sub.retryCount = 0;
|
|
247
|
+
resolve();
|
|
248
|
+
};
|
|
249
|
+
ws.onmessage = (event) => {
|
|
250
|
+
try {
|
|
251
|
+
const data = typeof event.data === 'string' ? event.data : String(event.data);
|
|
252
|
+
const events = parseWsMessage(data);
|
|
253
|
+
for (const e of events) {
|
|
254
|
+
sub.handler(e);
|
|
255
|
+
}
|
|
218
256
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
257
|
+
catch {
|
|
258
|
+
// Silently discard unparseable messages — don't crash the subscriber
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
ws.onerror = () => {
|
|
262
|
+
// Post-open errors are followed by onclose; reconnect logic lives there
|
|
263
|
+
if (!opened)
|
|
264
|
+
failBeforeOpen();
|
|
265
|
+
};
|
|
266
|
+
ws.onclose = (event) => {
|
|
267
|
+
if (!opened) {
|
|
268
|
+
// Never established — reject and let the caller decide (subscribe
|
|
269
|
+
// deletes the registration; reconnect attempts consume a retry)
|
|
270
|
+
failBeforeOpen();
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (sub.closed)
|
|
274
|
+
return; // intentional close — do not reconnect
|
|
275
|
+
if (!event.wasClean) {
|
|
276
|
+
this.scheduleReconnect(sub);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
/** Reconnect a lost (previously open) stream with backoff; gives up after MAX_RETRIES. */
|
|
282
|
+
scheduleReconnect(sub) {
|
|
283
|
+
if (sub.closed || sub.retryCount >= MAX_RETRIES)
|
|
284
|
+
return;
|
|
285
|
+
const delay = BACKOFF_MS[sub.retryCount] ?? BACKOFF_MS[BACKOFF_MS.length - 1];
|
|
286
|
+
sub.retryCount++;
|
|
287
|
+
setTimeout(() => {
|
|
228
288
|
if (sub.closed)
|
|
229
|
-
return;
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
setTimeout(() => {
|
|
234
|
-
if (!sub.closed)
|
|
235
|
-
this.openWebSocket(sub);
|
|
236
|
-
}, delay);
|
|
237
|
-
}
|
|
238
|
-
};
|
|
289
|
+
return;
|
|
290
|
+
// A reconnect attempt that fails before opening consumes a retry and tries again
|
|
291
|
+
this.openWebSocket(sub).catch(() => this.scheduleReconnect(sub));
|
|
292
|
+
}, delay);
|
|
239
293
|
}
|
|
240
294
|
}
|
|
241
295
|
//# sourceMappingURL=WsSubscriber.js.map
|
package/dist/WsSubscriber.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WsSubscriber.js","sourceRoot":"","sources":["../src/WsSubscriber.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"WsSubscriber.js","sourceRoot":"","sources":["../src/WsSubscriber.ts"],"names":[],"mappings":"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"}
|
package/dist/detect.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface ConnectOptions {
|
|
|
8
8
|
host: string;
|
|
9
9
|
/** TCP port. If omitted, common ports are probed (5466, 9403, 443 https; 80, 11811 http). */
|
|
10
10
|
port?: number;
|
|
11
|
-
/** Force the transport scheme. If omitted, inferred from port (
|
|
11
|
+
/** Force the transport scheme. If omitted, inferred from port (443, 5466, 9403 → https). */
|
|
12
12
|
https?: boolean;
|
|
13
13
|
/** Default 'Admin'. */
|
|
14
14
|
username?: string;
|
|
@@ -16,6 +16,15 @@ export interface ConnectOptions {
|
|
|
16
16
|
password?: string;
|
|
17
17
|
/** Per-request timeout in ms. Default 5000. */
|
|
18
18
|
timeout?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Verify TLS certificates. Default false — ABB controllers (virtual and
|
|
21
|
+
* real) ship self-signed certs, so verification stays off unless the
|
|
22
|
+
* deployment has a CA-signed cert on the controller. Applies to the probe
|
|
23
|
+
* requests and to the RWS 2.0 client this factory constructs.
|
|
24
|
+
* Live-verified 2026-07-09: strict probe rejects the OmniCore VC's
|
|
25
|
+
* self-signed cert (RW7.21); default detects it; plain-HTTP IRC5 unaffected.
|
|
26
|
+
*/
|
|
27
|
+
strictTls?: boolean;
|
|
19
28
|
}
|
|
20
29
|
export interface ProbeResult {
|
|
21
30
|
protocol: Protocol;
|
|
@@ -28,13 +37,13 @@ export interface ProbeResult {
|
|
|
28
37
|
* - "Digest …" → RWS 1.0
|
|
29
38
|
* - "Basic …" → RWS 2.0
|
|
30
39
|
*/
|
|
31
|
-
export declare function probeProtocol(host: string, port: number, useHttps: boolean, timeoutMs?: number): Promise<Protocol | null>;
|
|
40
|
+
export declare function probeProtocol(host: string, port: number, useHttps: boolean, timeoutMs?: number, strictTls?: boolean): Promise<Protocol | null>;
|
|
32
41
|
/**
|
|
33
42
|
* Probe common RWS ports on a host and return the first one that answers.
|
|
34
43
|
* Order favors known defaults: 5466 (OmniCore VC HTTPS), 9403 (alt OmniCore),
|
|
35
44
|
* 443 (real OmniCore), 80 (real IRC5 HTTP), 11811 (legacy IRC5 VC).
|
|
36
45
|
*/
|
|
37
|
-
export declare function probeHost(host: string, timeoutMs?: number): Promise<ProbeResult | null>;
|
|
46
|
+
export declare function probeHost(host: string, timeoutMs?: number, strictTls?: boolean): Promise<ProbeResult | null>;
|
|
38
47
|
/**
|
|
39
48
|
* Probe a controller's auth scheme and return the matching protocol-level client,
|
|
40
49
|
* already connected. The returned client is either an `RwsClient` (RWS 1.0) or
|
package/dist/detect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAC/C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAC/C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,SAAS,SAAO,EAChB,SAAS,UAAQ,GAChB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAqC1B;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAa9G;AAYD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CA8D3E;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CA2D9E"}
|
package/dist/detect.js
CHANGED
|
@@ -11,9 +11,10 @@ import { RwsError } from './types.js';
|
|
|
11
11
|
* - "Digest …" → RWS 1.0
|
|
12
12
|
* - "Basic …" → RWS 2.0
|
|
13
13
|
*/
|
|
14
|
-
export async function probeProtocol(host, port, useHttps, timeoutMs = 3000) {
|
|
14
|
+
export async function probeProtocol(host, port, useHttps, timeoutMs = 3000, strictTls = false) {
|
|
15
15
|
return new Promise(resolve => {
|
|
16
|
-
const
|
|
16
|
+
const insecure = useHttps && !strictTls;
|
|
17
|
+
const agent = insecure ? new https.Agent({ rejectUnauthorized: false }) : undefined;
|
|
17
18
|
const options = {
|
|
18
19
|
method: 'GET',
|
|
19
20
|
hostname: host,
|
|
@@ -21,6 +22,10 @@ export async function probeProtocol(host, port, useHttps, timeoutMs = 3000) {
|
|
|
21
22
|
path: '/rw/system',
|
|
22
23
|
headers: { Accept: 'application/xhtml+xml;v=2.0' },
|
|
23
24
|
agent,
|
|
25
|
+
// Per-request as well as on the agent: agent-swapping hosts (VS Code extension
|
|
26
|
+
// host on non-localhost targets) otherwise re-enable TLS verification (issue #2).
|
|
27
|
+
// Under strictTls neither is set, so certs verify normally.
|
|
28
|
+
...(insecure ? { rejectUnauthorized: false } : {}),
|
|
24
29
|
};
|
|
25
30
|
const transport = useHttps ? https : http;
|
|
26
31
|
const req = transport.request(options, res => {
|
|
@@ -36,12 +41,12 @@ export async function probeProtocol(host, port, useHttps, timeoutMs = 3000) {
|
|
|
36
41
|
resolve('rws2');
|
|
37
42
|
return;
|
|
38
43
|
}
|
|
39
|
-
// No challenge
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
// No Digest/Basic challenge → not an RWS controller. Anything else that
|
|
45
|
+
// answers /rw/system (Bearer-protected services, random web servers,
|
|
46
|
+
// captive portals) used to be misreported as rws2, sending connect
|
|
47
|
+
// attempts at hosts that will never speak the protocol. Controllers
|
|
48
|
+
// always challenge an unauthenticated probe, so there is no legitimate
|
|
49
|
+
// challenge-less case to allow.
|
|
45
50
|
resolve(null);
|
|
46
51
|
});
|
|
47
52
|
});
|
|
@@ -55,7 +60,7 @@ export async function probeProtocol(host, port, useHttps, timeoutMs = 3000) {
|
|
|
55
60
|
* Order favors known defaults: 5466 (OmniCore VC HTTPS), 9403 (alt OmniCore),
|
|
56
61
|
* 443 (real OmniCore), 80 (real IRC5 HTTP), 11811 (legacy IRC5 VC).
|
|
57
62
|
*/
|
|
58
|
-
export async function probeHost(host, timeoutMs = 1500) {
|
|
63
|
+
export async function probeHost(host, timeoutMs = 1500, strictTls = false) {
|
|
59
64
|
const candidates = [
|
|
60
65
|
[5466, true],
|
|
61
66
|
[9403, true],
|
|
@@ -64,13 +69,24 @@ export async function probeHost(host, timeoutMs = 1500) {
|
|
|
64
69
|
[11811, false],
|
|
65
70
|
];
|
|
66
71
|
for (const [port, https] of candidates) {
|
|
67
|
-
const proto = await probeProtocol(host, port, https, timeoutMs);
|
|
72
|
+
const proto = await probeProtocol(host, port, https, timeoutMs, strictTls);
|
|
68
73
|
if (proto) {
|
|
69
74
|
return { protocol: proto, port, https };
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
return null;
|
|
73
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* True when the failure is a credential rejection, in either protocol's flavor:
|
|
81
|
+
* RwsClient throws RwsError code='AUTH_FAILED' (message has no "401"), RwsClient2
|
|
82
|
+
* throws a plain Error with the HTTP status in the message.
|
|
83
|
+
*/
|
|
84
|
+
function isAuthRejection(err) {
|
|
85
|
+
if (err instanceof RwsError) {
|
|
86
|
+
return err.code === 'AUTH_FAILED';
|
|
87
|
+
}
|
|
88
|
+
return /401|unauthor/i.test(String(err));
|
|
89
|
+
}
|
|
74
90
|
/**
|
|
75
91
|
* Probe a controller's auth scheme and return the matching protocol-level client,
|
|
76
92
|
* already connected. The returned client is either an `RwsClient` (RWS 1.0) or
|
|
@@ -81,11 +97,12 @@ export async function probeHost(host, timeoutMs = 1500) {
|
|
|
81
97
|
*/
|
|
82
98
|
export async function createClient(opts) {
|
|
83
99
|
const { host, username = 'Admin', password = 'robotics', timeout = 5000 } = opts;
|
|
100
|
+
const strictTls = opts.strictTls === true;
|
|
84
101
|
let port = opts.port;
|
|
85
102
|
let useHttps = opts.https;
|
|
86
103
|
let protocol;
|
|
87
104
|
if (port === undefined) {
|
|
88
|
-
const probe = await probeHost(host);
|
|
105
|
+
const probe = await probeHost(host, opts.timeout, strictTls);
|
|
89
106
|
if (!probe) {
|
|
90
107
|
throw new RwsError(`No RWS endpoint found on ${host} — tried ports 5466, 9403, 443, 80, 11811`, 'PROTOCOL_DETECT_FAILED');
|
|
91
108
|
}
|
|
@@ -97,7 +114,7 @@ export async function createClient(opts) {
|
|
|
97
114
|
if (useHttps === undefined) {
|
|
98
115
|
useHttps = port === 443 || port === 5466 || port === 9403;
|
|
99
116
|
}
|
|
100
|
-
const detected = await probeProtocol(host, port, useHttps);
|
|
117
|
+
const detected = await probeProtocol(host, port, useHttps, opts.timeout, strictTls);
|
|
101
118
|
if (!detected) {
|
|
102
119
|
throw new RwsError(`No RWS auth challenge from ${host}:${port} — controller may be off, wrong port, or non-RWS service`, 'PROTOCOL_DETECT_FAILED');
|
|
103
120
|
}
|
|
@@ -117,7 +134,7 @@ export async function createClient(opts) {
|
|
|
117
134
|
return c;
|
|
118
135
|
}
|
|
119
136
|
catch (err) {
|
|
120
|
-
if (fallbackUser &&
|
|
137
|
+
if (fallbackUser && isAuthRejection(err)) {
|
|
121
138
|
const c = new RwsClient({ host, port, username: fallbackUser, password, timeout });
|
|
122
139
|
await c.connect();
|
|
123
140
|
return c;
|
|
@@ -127,14 +144,15 @@ export async function createClient(opts) {
|
|
|
127
144
|
}
|
|
128
145
|
else {
|
|
129
146
|
const scheme = useHttps ? 'https' : 'http';
|
|
147
|
+
const clientOpts = { timeout, rejectUnauthorized: strictTls };
|
|
130
148
|
try {
|
|
131
|
-
const c = new RwsClient2(`${scheme}://${host}:${port}`, username, password);
|
|
149
|
+
const c = new RwsClient2(`${scheme}://${host}:${port}`, username, password, clientOpts);
|
|
132
150
|
await c.connect();
|
|
133
151
|
return c;
|
|
134
152
|
}
|
|
135
153
|
catch (err) {
|
|
136
|
-
if (fallbackUser &&
|
|
137
|
-
const c = new RwsClient2(`${scheme}://${host}:${port}`, fallbackUser, password);
|
|
154
|
+
if (fallbackUser && isAuthRejection(err)) {
|
|
155
|
+
const c = new RwsClient2(`${scheme}://${host}:${port}`, fallbackUser, password, clientOpts);
|
|
138
156
|
await c.connect();
|
|
139
157
|
return c;
|
|
140
158
|
}
|
|
@@ -149,12 +167,13 @@ export async function createClient(opts) {
|
|
|
149
167
|
* caring whether the underlying transport is 1.0 or 2.0.
|
|
150
168
|
*/
|
|
151
169
|
export async function createAdapter(opts) {
|
|
152
|
-
const { host, username = 'Admin', password = 'robotics' } = opts;
|
|
170
|
+
const { host, username = 'Admin', password = 'robotics', timeout = 5000 } = opts;
|
|
171
|
+
const strictTls = opts.strictTls === true;
|
|
153
172
|
let port = opts.port;
|
|
154
173
|
let useHttps = opts.https;
|
|
155
174
|
let protocol;
|
|
156
175
|
if (port === undefined) {
|
|
157
|
-
const probe = await probeHost(host);
|
|
176
|
+
const probe = await probeHost(host, opts.timeout, strictTls);
|
|
158
177
|
if (!probe) {
|
|
159
178
|
throw new RwsError(`No RWS endpoint found on ${host}`, 'PROTOCOL_DETECT_FAILED');
|
|
160
179
|
}
|
|
@@ -166,22 +185,47 @@ export async function createAdapter(opts) {
|
|
|
166
185
|
if (useHttps === undefined) {
|
|
167
186
|
useHttps = port === 443 || port === 5466 || port === 9403;
|
|
168
187
|
}
|
|
169
|
-
const detected = await probeProtocol(host, port, useHttps);
|
|
188
|
+
const detected = await probeProtocol(host, port, useHttps, opts.timeout, strictTls);
|
|
170
189
|
if (!detected) {
|
|
171
190
|
throw new RwsError(`No RWS auth challenge from ${host}:${port}`, 'PROTOCOL_DETECT_FAILED');
|
|
172
191
|
}
|
|
173
192
|
protocol = detected;
|
|
174
193
|
}
|
|
194
|
+
// Same `Default User` retry as createClient — see the comment there.
|
|
195
|
+
const fallbackUser = opts.username === undefined && username === 'Admin'
|
|
196
|
+
? 'Default User'
|
|
197
|
+
: null;
|
|
175
198
|
if (protocol === 'rws1') {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
199
|
+
try {
|
|
200
|
+
const inner = new RwsClient({ host, port, username, password, timeout });
|
|
201
|
+
await inner.connect();
|
|
202
|
+
return new RWS1Adapter(inner, { host, port, username, password });
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
if (fallbackUser && isAuthRejection(err)) {
|
|
206
|
+
const inner = new RwsClient({ host, port, username: fallbackUser, password, timeout });
|
|
207
|
+
await inner.connect();
|
|
208
|
+
return new RWS1Adapter(inner, { host, port, username: fallbackUser, password });
|
|
209
|
+
}
|
|
210
|
+
throw err;
|
|
211
|
+
}
|
|
179
212
|
}
|
|
180
213
|
else {
|
|
181
214
|
const scheme = useHttps ? 'https' : 'http';
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
215
|
+
const clientOpts = { timeout, rejectUnauthorized: strictTls };
|
|
216
|
+
try {
|
|
217
|
+
const a = new RWS2Adapter(`${scheme}://${host}:${port}`, username, password, clientOpts);
|
|
218
|
+
await a.connect();
|
|
219
|
+
return a;
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
if (fallbackUser && isAuthRejection(err)) {
|
|
223
|
+
const a = new RWS2Adapter(`${scheme}://${host}:${port}`, fallbackUser, password, clientOpts);
|
|
224
|
+
await a.connect();
|
|
225
|
+
return a;
|
|
226
|
+
}
|
|
227
|
+
throw err;
|
|
228
|
+
}
|
|
185
229
|
}
|
|
186
230
|
}
|
|
187
231
|
//# sourceMappingURL=detect.js.map
|
package/dist/detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,9 +24,11 @@ export { RWS1Adapter } from './RWS1Adapter.js';
|
|
|
24
24
|
export { RWS2Adapter } from './RWS2Adapter.js';
|
|
25
25
|
export type { IRWSAdapter } from './IRWSAdapter.js';
|
|
26
26
|
export { RobotManager } from './RobotManager.js';
|
|
27
|
-
export type { RobotState, ChangeHandler, ProbeResult, DiscoveredController, ErrorListener } from './RobotManager.js';
|
|
27
|
+
export type { RobotState, ChangeHandler, ProbeResult, DiscoveredController, ErrorListener, RobotManagerOptions } from './RobotManager.js';
|
|
28
28
|
export { MultiRobotManager } from './MultiRobotManager.js';
|
|
29
29
|
export type { RobotConfig } from './MultiRobotManager.js';
|
|
30
|
+
export { discoverControllersMdns } from './MdnsDiscovery.js';
|
|
31
|
+
export type { MdnsController, MdnsDiscoveryOptions } from './MdnsDiscovery.js';
|
|
30
32
|
export { createClient, createAdapter, probeHost, probeProtocol } from './detect.js';
|
|
31
33
|
export type { AnyClient, Protocol, ConnectOptions, ProbeResult as DetectProbeResult } from './detect.js';
|
|
32
34
|
export { XhtmlParser } from './XhtmlParser.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC1I,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpF,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGzG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,aAAa,EACb,MAAM,EACN,SAAS,EACT,SAAS,EACT,QAAQ,EACR,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -27,6 +27,8 @@ export { RWS2Adapter } from './RWS2Adapter.js';
|
|
|
27
27
|
// High-level managers
|
|
28
28
|
export { RobotManager } from './RobotManager.js';
|
|
29
29
|
export { MultiRobotManager } from './MultiRobotManager.js';
|
|
30
|
+
// mDNS/Bonjour discovery (also reachable as RobotManager.discoverControllersMdns)
|
|
31
|
+
export { discoverControllersMdns } from './MdnsDiscovery.js';
|
|
30
32
|
// Auto-detection helpers
|
|
31
33
|
export { createClient, createAdapter, probeHost, probeProtocol } from './detect.js';
|
|
32
34
|
// Helpers
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,6BAA6B;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,yBAAyB;AACzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGpF,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,6BAA6B;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,kFAAkF;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,yBAAyB;AACzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGpF,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// abb-rws-client — type definitions
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// abb-rws-client — shared type definitions
|
|
2
|
+
// Used by BOTH protocol clients: RwsClient (RWS 1.0 / IRC5 / RW6) and
|
|
3
|
+
// RwsClient2 (RWS 2.0 / OmniCore / RW7). See src/index.ts for the public surface.
|
|
4
4
|
/**
|
|
5
5
|
* Typed error thrown by all abb-rws-client public methods.
|
|
6
6
|
* Always check `code` for programmatic error handling.
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sEAAsE;AACtE,kFAAkF;AAqSlF;;;GAGG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAe;IACnB,UAAU,CAAU;IACpB,SAAS,CAAU;IAE5B,YAAY,OAAe,EAAE,IAAkB,EAAE,UAAmB,EAAE,SAAkB;QACtF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,oFAAoF;QACpF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -6,19 +6,18 @@
|
|
|
6
6
|
// FlexPendant; the operator taps Allow once and you have write access.
|
|
7
7
|
//
|
|
8
8
|
// This is what RobotStudio Online does — that's why it "just works".
|
|
9
|
+
//
|
|
10
|
+
// Run: RWS_HOST=127.0.0.1 RWS_PORT=5466 node examples/05-remote-control-rmmp.mjs
|
|
9
11
|
|
|
10
|
-
import { RobotManager
|
|
12
|
+
import { RobotManager } from 'abb-rws-client';
|
|
11
13
|
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
port: Number(process.env.RWS_PORT) || 5466,
|
|
15
|
-
username: process.env.RWS_USER || 'Admin',
|
|
16
|
-
password: process.env.RWS_PASS || 'robotics',
|
|
17
|
-
});
|
|
18
|
-
await client.connect();
|
|
14
|
+
const host = process.env.RWS_HOST || '127.0.0.1';
|
|
15
|
+
const port = process.env.RWS_PORT ? Number(process.env.RWS_PORT) : undefined;
|
|
19
16
|
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
// RobotManager auto-detects the protocol (RWS 1.0 vs 2.0) and, when port is
|
|
18
|
+
// omitted, probes the common VC/controller ports.
|
|
19
|
+
const robot = new RobotManager();
|
|
20
|
+
await robot.connect(host, process.env.RWS_USER || 'Admin', process.env.RWS_PASS || 'robotics', port);
|
|
22
21
|
|
|
23
22
|
// 1) Check current RMMP state
|
|
24
23
|
let priv = await robot.getRmmpPrivilege();
|
|
@@ -48,5 +47,4 @@ if (priv === 'modify' || priv === 'exclusive') {
|
|
|
48
47
|
console.log(`✗ Operator did not grant RMMP. Cannot do modify ops.`);
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
await robot.
|
|
52
|
-
await client.disconnect();
|
|
50
|
+
await robot.disconnect();
|