shepherd-onboard 0.1.18 → 0.1.19

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.
@@ -1259,12 +1259,20 @@ async function selectChatsInBrowser(chats, opts = {}) {
1259
1259
  const token = Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2);
1260
1260
  let settled = false;
1261
1261
  let server;
1262
+ const sockets = new Set();
1262
1263
 
1263
1264
  return new Promise((resolve, reject) => {
1265
+ const closeSelectorServer = () => {
1266
+ server?.close();
1267
+ server?.closeIdleConnections?.();
1268
+ for (const socket of sockets) socket.destroy();
1269
+ sockets.clear();
1270
+ };
1271
+
1264
1272
  const timeout = setTimeout(() => {
1265
1273
  if (settled) return;
1266
1274
  settled = true;
1267
- server?.close();
1275
+ closeSelectorServer();
1268
1276
  reject(new Error("Messages chat selection timed out."));
1269
1277
  }, 20 * 60 * 1000);
1270
1278
 
@@ -1292,11 +1300,11 @@ async function selectChatsInBrowser(chats, opts = {}) {
1292
1300
  return;
1293
1301
  }
1294
1302
 
1303
+ if (!settled) res.once("finish", closeSelectorServer);
1295
1304
  sendHtml(res, renderMessagesDonePage(`${selected.length} chat${selected.length === 1 ? "" : "s"} selected.`));
1296
1305
  if (!settled) {
1297
1306
  settled = true;
1298
1307
  clearTimeout(timeout);
1299
- setTimeout(() => server.close(), 100);
1300
1308
  resolve(selected);
1301
1309
  }
1302
1310
  return;
@@ -1307,16 +1315,22 @@ async function selectChatsInBrowser(chats, opts = {}) {
1307
1315
  if (!settled) {
1308
1316
  settled = true;
1309
1317
  clearTimeout(timeout);
1310
- server?.close();
1318
+ closeSelectorServer();
1311
1319
  reject(err);
1312
1320
  }
1313
1321
  }
1314
1322
  });
1315
1323
 
1324
+ server.on("connection", (socket) => {
1325
+ sockets.add(socket);
1326
+ socket.once("close", () => sockets.delete(socket));
1327
+ });
1328
+
1316
1329
  server.on("error", (err) => {
1317
1330
  if (settled) return;
1318
1331
  settled = true;
1319
1332
  clearTimeout(timeout);
1333
+ closeSelectorServer();
1320
1334
  reject(err);
1321
1335
  });
1322
1336
 
@@ -1326,7 +1340,7 @@ async function selectChatsInBrowser(chats, opts = {}) {
1326
1340
  if (!port) {
1327
1341
  settled = true;
1328
1342
  clearTimeout(timeout);
1329
- server.close();
1343
+ closeSelectorServer();
1330
1344
  reject(new Error("Could not start local Messages selector."));
1331
1345
  return;
1332
1346
  }
@@ -1642,6 +1656,7 @@ function renderMessagesSelectorPage(chats, token, error = "") {
1642
1656
  const search = document.getElementById("search");
1643
1657
  const empty = document.getElementById("empty");
1644
1658
  const selected = document.getElementById("selection-count");
1659
+ const form = document.querySelector("form");
1645
1660
  const checks = Array.from(document.querySelectorAll('input[name="chatId"]'));
1646
1661
 
1647
1662
  function updateRows() {
@@ -1663,6 +1678,11 @@ function renderMessagesSelectorPage(chats, token, error = "") {
1663
1678
  }
1664
1679
 
1665
1680
  search.addEventListener("input", updateRows);
1681
+ document.addEventListener("keydown", (event) => {
1682
+ if (event.key !== "Enter") return;
1683
+ event.preventDefault();
1684
+ form.requestSubmit();
1685
+ });
1666
1686
  for (const check of checks) check.addEventListener("change", updateSelected);
1667
1687
  updateRows();
1668
1688
  updateSelected();
@@ -1672,6 +1692,7 @@ function renderMessagesSelectorPage(chats, token, error = "") {
1672
1692
  }
1673
1693
 
1674
1694
  function renderMessagesDonePage(message, isError = false) {
1695
+ const closeScript = isError ? "" : "<script>setTimeout(() => window.close(), 150);</script>";
1675
1696
  return `<!doctype html>
1676
1697
  <html lang="en">
1677
1698
  <head>
@@ -1692,8 +1713,9 @@ function renderMessagesDonePage(message, isError = false) {
1692
1713
  <main>
1693
1714
  <div class="mark">${isError ? "!" : "OK"}</div>
1694
1715
  <h1>${html(message)}</h1>
1695
- <p>${isError ? "Return to the terminal and retry." : "You can close this tab and return to the terminal."}</p>
1716
+ <p>${isError ? "Return to the terminal and retry." : "Returning to the terminal."}</p>
1696
1717
  </main>
1718
+ ${closeScript}
1697
1719
  </body>
1698
1720
  </html>`;
1699
1721
  }
@@ -1760,6 +1782,7 @@ function sendHtml(res, body, status = 200) {
1760
1782
  res.writeHead(status, {
1761
1783
  "Content-Type": "text/html; charset=utf-8",
1762
1784
  "Cache-Control": "no-store",
1785
+ "Connection": "close",
1763
1786
  });
1764
1787
  res.end(body);
1765
1788
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shepherd-onboard",
3
- "version": "0.1.18",
3
+ "version": "0.1.19",
4
4
  "description": "Customer-facing Shepherd raw sync onboarding CLI",
5
5
  "type": "module",
6
6
  "bin": {