mdns.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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) {
  8. if (currentPort === port) return
  9. if (bonjour) unpublish()
  10. try {
  11. const name = `opencode-${port}`
  12. bonjour = new Bonjour()
  13. const service = bonjour.publish({
  14. name,
  15. type: "http",
  16. host: "opencode.local",
  17. port,
  18. txt: { path: "/" },
  19. })
  20. service.on("up", () => {
  21. log.info("mDNS service published", { name, port })
  22. })
  23. service.on("error", (err) => {
  24. log.error("mDNS service error", { error: err })
  25. })
  26. currentPort = port
  27. } catch (err) {
  28. log.error("mDNS publish failed", { error: err })
  29. if (bonjour) {
  30. try {
  31. bonjour.destroy()
  32. } catch {}
  33. }
  34. bonjour = undefined
  35. currentPort = undefined
  36. }
  37. }
  38. export function unpublish() {
  39. if (bonjour) {
  40. try {
  41. bonjour.unpublishAll()
  42. bonjour.destroy()
  43. } catch (err) {
  44. log.error("mDNS unpublish failed", { error: err })
  45. }
  46. bonjour = undefined
  47. currentPort = undefined
  48. log.info("mDNS service unpublished")
  49. }
  50. }
  51. }