{"version":3,"file":"registry.js","names":[],"sources":["esm/daemon/registry.js"],"sourcesContent":["import * as net from \"node:net\";\nlet idCounter = 0;\nfunction createRegistry() {\n  return {\n    servers: /* @__PURE__ */ new Map(),\n    routes: /* @__PURE__ */ new Map()\n  };\n}\nfunction checkServerAlive(server) {\n  return new Promise((resolve) => {\n    const socket = new net.Socket();\n    const timeout = setTimeout(() => {\n      socket.destroy();\n      resolve(false);\n    }, 1e3);\n    socket.on(\"connect\", () => {\n      clearTimeout(timeout);\n      socket.destroy();\n      resolve(true);\n    });\n    socket.on(\"error\", () => {\n      clearTimeout(timeout);\n      socket.destroy();\n      resolve(false);\n    });\n    socket.connect(server.port, \"127.0.0.1\");\n  });\n}\nasync function pruneDeadServers(state, onPruned) {\n  const servers = getAllServers(state);\n  let prunedCount = 0;\n  for (const server of servers) {\n    const alive = await checkServerAlive(server);\n    if (!alive) {\n      unregisterServer(state, server.id);\n      onPruned?.(server);\n      prunedCount++;\n    }\n  }\n  return prunedCount;\n}\nfunction registerServer(state, opts) {\n  const id = `server-${++idCounter}`;\n  const registration = {\n    id,\n    port: opts.port,\n    bundleId: opts.bundleId,\n    root: opts.root,\n    registeredAt: Date.now()\n  };\n  state.servers.set(id, registration);\n  return registration;\n}\nfunction unregisterServer(state, id) {\n  const deleted = state.servers.delete(id);\n  for (const [key, route] of state.routes) {\n    if (route.serverId === id) {\n      state.routes.delete(key);\n    }\n  }\n  return deleted;\n}\nfunction findServersByBundleId(state, bundleId) {\n  const matches = [];\n  for (const server of state.servers.values()) {\n    if (server.bundleId === bundleId) {\n      matches.push(server);\n    }\n  }\n  return matches;\n}\nfunction findServerById(state, id) {\n  return state.servers.get(id);\n}\nfunction setRoute(state, key, serverId) {\n  const binding = {\n    key,\n    serverId,\n    createdAt: Date.now()\n  };\n  state.routes.set(key, binding);\n  return binding;\n}\nfunction getRoute(state, key) {\n  return state.routes.get(key);\n}\nfunction clearRoute(state, key) {\n  return state.routes.delete(key);\n}\nfunction getAllServers(state) {\n  return Array.from(state.servers.values());\n}\nfunction getAllRoutes(state) {\n  return Array.from(state.routes.values());\n}\nfunction touchServer(state, id) {\n  const server = state.servers.get(id);\n  if (server) {\n    server.lastActiveAt = Date.now();\n    return true;\n  }\n  return false;\n}\nfunction getLastActiveServer(state) {\n  let lastActive = null;\n  let maxTime = 0;\n  for (const server of state.servers.values()) {\n    const activeTime = server.lastActiveAt || server.registeredAt;\n    if (activeTime > maxTime) {\n      maxTime = activeTime;\n      lastActive = server;\n    }\n  }\n  return lastActive;\n}\nexport {\n  checkServerAlive,\n  clearRoute,\n  createRegistry,\n  findServerById,\n  findServersByBundleId,\n  getAllRoutes,\n  getAllServers,\n  getLastActiveServer,\n  getRoute,\n  pruneDeadServers,\n  registerServer,\n  setRoute,\n  touchServer,\n  unregisterServer\n};\n//# sourceMappingURL=registry.js.map\n"],"mappings":";;;AACA,IAAI,YAAY;AAChB,SAAS,iBAAiB;CACxB,OAAO;EACL,yBAAyB,IAAI,IAAI;EACjC,wBAAwB,IAAI,IAAI;CAClC;AACF;AACA,SAAS,iBAAiB,QAAQ;CAChC,OAAO,IAAI,SAAS,YAAY;EAC9B,MAAM,SAAS,IAAI,IAAI,OAAO;EAC9B,MAAM,UAAU,iBAAiB;GAC/B,OAAO,QAAQ;GACf,QAAQ,KAAK;EACf,GAAG,GAAG;EACN,OAAO,GAAG,iBAAiB;GACzB,aAAa,OAAO;GACpB,OAAO,QAAQ;GACf,QAAQ,IAAI;EACd,CAAC;EACD,OAAO,GAAG,eAAe;GACvB,aAAa,OAAO;GACpB,OAAO,QAAQ;GACf,QAAQ,KAAK;EACf,CAAC;EACD,OAAO,QAAQ,OAAO,MAAM,WAAW;CACzC,CAAC;AACH;AACA,eAAe,iBAAiB,OAAO,UAAU;CAC/C,MAAM,UAAU,cAAc,KAAK;CACnC,IAAI,cAAc;CAClB,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,QAAQ,MAAM,iBAAiB,MAAM;EAC3C,IAAI,CAAC,OAAO;GACV,iBAAiB,OAAO,OAAO,EAAE;GACjC,WAAW,MAAM;GACjB;EACF;CACF;CACA,OAAO;AACT;AACA,SAAS,eAAe,OAAO,MAAM;CACnC,MAAM,KAAK,UAAU,EAAE;CACvB,MAAM,eAAe;EACnB;EACA,MAAM,KAAK;EACX,UAAU,KAAK;EACf,MAAM,KAAK;EACX,cAAc,KAAK,IAAI;CACzB;CACA,MAAM,QAAQ,IAAI,IAAI,YAAY;CAClC,OAAO;AACT;AACA,SAAS,iBAAiB,OAAO,IAAI;CACnC,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE;CACvC,KAAK,MAAM,CAAC,KAAK,UAAU,MAAM,QAAQ;EACvC,IAAI,MAAM,aAAa,IAAI;GACzB,MAAM,OAAO,OAAO,GAAG;EACzB;CACF;CACA,OAAO;AACT;AACA,SAAS,sBAAsB,OAAO,UAAU;CAC9C,MAAM,UAAU,CAAC;CACjB,KAAK,MAAM,UAAU,MAAM,QAAQ,OAAO,GAAG;EAC3C,IAAI,OAAO,aAAa,UAAU;GAChC,QAAQ,KAAK,MAAM;EACrB;CACF;CACA,OAAO;AACT;AACA,SAAS,eAAe,OAAO,IAAI;CACjC,OAAO,MAAM,QAAQ,IAAI,EAAE;AAC7B;AACA,SAAS,SAAS,OAAO,KAAK,UAAU;CACtC,MAAM,UAAU;EACd;EACA;EACA,WAAW,KAAK,IAAI;CACtB;CACA,MAAM,OAAO,IAAI,KAAK,OAAO;CAC7B,OAAO;AACT;AACA,SAAS,SAAS,OAAO,KAAK;CAC5B,OAAO,MAAM,OAAO,IAAI,GAAG;AAC7B;AACA,SAAS,WAAW,OAAO,KAAK;CAC9B,OAAO,MAAM,OAAO,OAAO,GAAG;AAChC;AACA,SAAS,cAAc,OAAO;CAC5B,OAAO,MAAM,KAAK,MAAM,QAAQ,OAAO,CAAC;AAC1C;AACA,SAAS,aAAa,OAAO;CAC3B,OAAO,MAAM,KAAK,MAAM,OAAO,OAAO,CAAC;AACzC;AACA,SAAS,YAAY,OAAO,IAAI;CAC9B,MAAM,SAAS,MAAM,QAAQ,IAAI,EAAE;CACnC,IAAI,QAAQ;EACV,OAAO,eAAe,KAAK,IAAI;EAC/B,OAAO;CACT;CACA,OAAO;AACT;AACA,SAAS,oBAAoB,OAAO;CAClC,IAAI,aAAa;CACjB,IAAI,UAAU;CACd,KAAK,MAAM,UAAU,MAAM,QAAQ,OAAO,GAAG;EAC3C,MAAM,aAAa,OAAO,gBAAgB,OAAO;EACjD,IAAI,aAAa,SAAS;GACxB,UAAU;GACV,aAAa;EACf;CACF;CACA,OAAO;AACT"}