@uipath/codedapp-tool 1.201.0-preview.133 → 1.202.0-preview.134

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.
@@ -1,4 +1,4 @@
1
- import"./tool-wckvcay0.js";
1
+ import"./packager-tool-1yh8g550.js";
2
2
 
3
3
  // ../../node_modules/js-yaml/dist/js-yaml.mjs
4
4
  function getDefaultExportFromCjs(x) {
@@ -3125,21 +3125,21 @@ var {
3125
3125
  safeDump
3126
3126
  } = yaml;
3127
3127
  export {
3128
- types,
3129
- safeLoadAll,
3130
- safeLoad,
3131
- safeDump,
3132
- loadAll,
3133
- load,
3134
- dump,
3135
- yaml as default,
3136
- YAMLException,
3137
- Type,
3138
- Schema,
3139
- JSON_SCHEMA,
3140
- FAILSAFE_SCHEMA,
3128
+ CORE_SCHEMA,
3141
3129
  DEFAULT_SCHEMA,
3142
- CORE_SCHEMA
3130
+ FAILSAFE_SCHEMA,
3131
+ JSON_SCHEMA,
3132
+ Schema,
3133
+ Type,
3134
+ YAMLException,
3135
+ yaml as default,
3136
+ dump,
3137
+ load,
3138
+ loadAll,
3139
+ safeDump,
3140
+ safeLoad,
3141
+ safeLoadAll,
3142
+ types
3143
3143
  };
3144
3144
 
3145
- //# debugId=6D9E579FD7979E6964756E2164756E21
3145
+ //# debugId=3FF8535573D0966A64756E2164756E21
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  FormData,
3
3
  file_default
4
- } from "./tool-y0g9grx6.js";
5
- import"./tool-wckvcay0.js";
4
+ } from "./packager-tool-vv9c52ax.js";
5
+ import"./packager-tool-1yh8g550.js";
6
6
 
7
7
  // ../../node_modules/node-fetch/src/utils/multipart-parser.js
8
8
  var s = 0;
@@ -1,17 +1,19 @@
1
1
  import {
2
2
  catchError,
3
3
  getFileSystem
4
- } from "./tool-4pvh3k50.js";
4
+ } from "./packager-tool-qyctya2j.js";
5
5
  import {
6
6
  AUTH_CANCELLED_ERROR_CODE,
7
+ AUTH_RECLAIMED_ERROR_CODE,
7
8
  AUTH_TIMEOUT_ERROR_CODE,
8
9
  DEFAULT_AUTH_TIMEOUT_MS
9
- } from "./tool-q42rrs00.js";
10
+ } from "./packager-tool-yc4kw997.js";
10
11
  import {
11
12
  __require
12
- } from "./tool-wckvcay0.js";
13
+ } from "./packager-tool-1yh8g550.js";
13
14
 
14
15
  // ../auth/src/getBaseHtml.ts
16
+ var CALLBACK_PAGE_TITLE_SUFFIX = " - UiPath CLI";
15
17
  var escapeHtml = (value) => value.replace(/[&<>"']/g, (char) => {
16
18
  switch (char) {
17
19
  case "&":
@@ -39,7 +41,7 @@ var getBaseHtml = ({ title, message, type }) => {
39
41
  <head>
40
42
  <meta charset="UTF-8">
41
43
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
42
- <title>${safeTitle} - UiPath CLI</title>
44
+ <title>${safeTitle}${CALLBACK_PAGE_TITLE_SUFFIX}</title>
43
45
  <link rel="preconnect" href="https://fonts.googleapis.com">
44
46
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
45
47
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400&family=Poppins:wght@600&display=swap" rel="stylesheet">
@@ -175,11 +177,60 @@ var getBaseHtml = ({ title, message, type }) => {
175
177
  };
176
178
 
177
179
  // ../auth/src/server.ts
180
+ var RECLAIM_PROBE_PATH = "/uip-reclaim-probe";
181
+ var RECLAIM_LISTENER_PID_HEADER = "x-uipath-cli-login-pid";
182
+ var RECLAIM_PROBER_PID_HEADER = "x-uipath-cli-prober-pid";
183
+ var RECLAIM_MARKER = `${CALLBACK_PAGE_TITLE_SUFFIX}</title>`;
184
+ var RECLAIM_PROBE_TIMEOUT_MS = 1000;
185
+ var RECLAIM_REBIND_DELAY_MS = 150;
186
+ var RECLAIM_PROBE_READ_LIMIT = 16 * 1024;
187
+ var probeStaleCallbackListener = (http, host, port) => new Promise((resolve) => {
188
+ let sawResponse = false;
189
+ let listenerPid;
190
+ let deadline;
191
+ const settle = (verdict) => {
192
+ clearTimeout(deadline);
193
+ resolve({ verdict, pid: listenerPid });
194
+ };
195
+ const req = http.get({
196
+ host,
197
+ port,
198
+ path: RECLAIM_PROBE_PATH,
199
+ timeout: RECLAIM_PROBE_TIMEOUT_MS,
200
+ headers: { [RECLAIM_PROBER_PID_HEADER]: String(process.pid) }
201
+ }, (res) => {
202
+ sawResponse = true;
203
+ const rawPid = res.headers[RECLAIM_LISTENER_PID_HEADER];
204
+ if (typeof rawPid === "string" && /^\d+$/.test(rawPid)) {
205
+ listenerPid = Number.parseInt(rawPid, 10);
206
+ }
207
+ res.on("error", () => {});
208
+ let body = "";
209
+ res.setEncoding("utf8");
210
+ const classify = () => settle(body.includes(RECLAIM_MARKER) ? "reclaimed" : "foreign");
211
+ res.on("data", (chunk) => {
212
+ body += chunk;
213
+ if (body.length >= RECLAIM_PROBE_READ_LIMIT) {
214
+ classify();
215
+ req.destroy();
216
+ }
217
+ });
218
+ res.on("end", classify);
219
+ });
220
+ const giveUp = () => {
221
+ settle("foreign");
222
+ req.destroy();
223
+ };
224
+ req.on("timeout", giveUp);
225
+ deadline = setTimeout(giveUp, RECLAIM_PROBE_TIMEOUT_MS);
226
+ req.on("error", () => settle(sawResponse ? "foreign" : "gone"));
227
+ });
178
228
  var startServer = async ({
179
229
  redirectUri,
180
230
  timeoutMs = DEFAULT_AUTH_TIMEOUT_MS,
181
231
  onListening,
182
- signal
232
+ signal,
233
+ onPortReclaimed
183
234
  }) => {
184
235
  let http;
185
236
  try {
@@ -204,6 +255,25 @@ var startServer = async ({
204
255
  return;
205
256
  }
206
257
  const url = new URL(req.url, redirectUri);
258
+ if (url.pathname === RECLAIM_PROBE_PATH) {
259
+ const proberPidRaw = req.headers[RECLAIM_PROBER_PID_HEADER];
260
+ const proberPid = typeof proberPidRaw === "string" && /^\d+$/.test(proberPidRaw) ? ` (PID ${proberPidRaw})` : "";
261
+ res.writeHead(200, {
262
+ "Content-Type": "text/html; charset=utf-8",
263
+ Connection: "close",
264
+ [RECLAIM_LISTENER_PID_HEADER]: String(process.pid)
265
+ });
266
+ res.end(getBaseHtml({
267
+ title: "Login superseded",
268
+ message: "This sign-in was taken over by a newer 'uip login' on this machine.",
269
+ type: "error"
270
+ }));
271
+ server.close();
272
+ const err = new Error(`Another 'uip login'${proberPid} on this machine took over the callback port; this login was cancelled.`);
273
+ err.code = AUTH_RECLAIMED_ERROR_CODE;
274
+ reject(err);
275
+ return;
276
+ }
207
277
  const error = url.searchParams.get("error");
208
278
  if (error) {
209
279
  res.writeHead(400, {
@@ -248,7 +318,9 @@ var startServer = async ({
248
318
  return;
249
319
  });
250
320
  let timeoutHandle;
321
+ let settled = false;
251
322
  const onAbort = () => {
323
+ settled = true;
252
324
  clearTimeout(timeoutHandle);
253
325
  server.close();
254
326
  const err = new Error("Authentication cancelled");
@@ -263,6 +335,7 @@ var startServer = async ({
263
335
  signal.addEventListener("abort", onAbort, { once: true });
264
336
  }
265
337
  timeoutHandle = setTimeout(() => {
338
+ settled = true;
266
339
  server.close();
267
340
  signal?.removeEventListener("abort", onAbort);
268
341
  const err = new Error("Authentication timeout");
@@ -270,20 +343,62 @@ var startServer = async ({
270
343
  reject(err);
271
344
  }, timeoutMs);
272
345
  const bindHost = redirectUri.hostname === "localhost" ? "127.0.0.1" : redirectUri.hostname;
273
- server.on("error", (err) => {
346
+ const fail = (err) => {
347
+ settled = true;
274
348
  clearTimeout(timeoutHandle);
275
349
  signal?.removeEventListener("abort", onAbort);
276
350
  reject(err);
351
+ };
352
+ let reclaimAttempted = false;
353
+ let reclaimed = false;
354
+ let reclaimedPid;
355
+ let rebindAttemptsLeft = 0;
356
+ server.on("listening", () => {
357
+ Promise.resolve().then(() => {
358
+ if (reclaimed)
359
+ onPortReclaimed?.({ pid: reclaimedPid });
360
+ }).then(() => onListening?.()).catch((err) => {
361
+ settled = true;
362
+ server.close();
363
+ clearTimeout(timeoutHandle);
364
+ reject(err);
365
+ });
277
366
  });
278
- server.listen(Number(redirectUri.port), bindHost, () => {
279
- if (onListening) {
280
- Promise.resolve(onListening()).catch((err) => {
281
- server.close();
282
- clearTimeout(timeoutHandle);
283
- reject(err);
284
- });
367
+ const listen = () => {
368
+ if (settled)
369
+ return;
370
+ server.listen(Number(redirectUri.port), bindHost);
371
+ };
372
+ server.on("error", (err) => {
373
+ if (settled)
374
+ return;
375
+ const code = err.code;
376
+ if (code === "EADDRINUSE") {
377
+ if (!reclaimAttempted) {
378
+ reclaimAttempted = true;
379
+ probeStaleCallbackListener(http, bindHost, Number(redirectUri.port)).then(({ verdict, pid }) => {
380
+ if (settled)
381
+ return;
382
+ if (verdict === "foreign") {
383
+ fail(err);
384
+ return;
385
+ }
386
+ reclaimed = verdict === "reclaimed";
387
+ reclaimedPid = pid;
388
+ rebindAttemptsLeft = 3;
389
+ setTimeout(listen, RECLAIM_REBIND_DELAY_MS);
390
+ });
391
+ return;
392
+ }
393
+ if (rebindAttemptsLeft > 0) {
394
+ rebindAttemptsLeft -= 1;
395
+ setTimeout(listen, RECLAIM_REBIND_DELAY_MS);
396
+ return;
397
+ }
285
398
  }
399
+ fail(err);
286
400
  });
401
+ listen();
287
402
  server.on("close", () => {
288
403
  clearTimeout(timeoutHandle);
289
404
  signal?.removeEventListener("abort", onAbort);
@@ -299,6 +414,7 @@ class NodeAuthStrategy {
299
414
  redirectUri,
300
415
  timeoutMs: opts?.timeoutMs,
301
416
  signal: opts?.signal,
417
+ onPortReclaimed: opts?.onPortReclaimed,
302
418
  onListening: async () => {
303
419
  let safeUrl = "";
304
420
  for (const ch of url) {
@@ -345,4 +461,4 @@ export {
345
461
  NodeAuthStrategy
346
462
  };
347
463
 
348
- //# debugId=A8160D47DD46BDEC64756E2164756E21
464
+ //# debugId=61C68C1CA3F57C5B64756E2164756E21