mdns.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { Log } from "@/util/log"
  2. import { Bonjour } from "bonjour-service"
  3. const log = Log.create({ service: "mdns" })
  4. export namespace MDNS {
  5. let bonjour: Bonjour | undefined
  6. let currentPort: number | undefined
  7. export function publish(port: number, name = "opencode") {
  8. if (currentPort === port) return
  9. if (bonjour) unpublish()
  10. try {
  11. bonjour = new Bonjour()
  12. const service = bonjour.publish({
  13. name,
  14. type: "http",
  15. port,
  16. txt: { path: "/" },
  17. })
  18. service.on("up", () => {
  19. log.info("mDNS service published", { name, port })
  20. })
  21. service.on("error", (err) => {
  22. log.error("mDNS service error", { error: err })
  23. })
  24. currentPort = port
  25. } catch (err) {
  26. log.error("mDNS publish failed", { error: err })
  27. if (bonjour) {
  28. try {
  29. bonjour.destroy()
  30. } catch {}
  31. }
  32. bonjour = undefined
  33. currentPort = undefined
  34. }
  35. }
  36. export function unpublish() {
  37. if (bonjour) {
  38. try {
  39. bonjour.unpublishAll()
  40. bonjour.destroy()
  41. } catch (err) {
  42. log.error("mDNS unpublish failed", { error: err })
  43. }
  44. bonjour = undefined
  45. currentPort = undefined
  46. log.info("mDNS service unpublished")
  47. }
  48. }
  49. }