{"version":3,"file":"OnlineDetector.cjs","sources":["../../../src/connectivity/OnlineDetector.ts"],"sourcesContent":["import type { OnlineDetector } from '../types'\n\n/**\n * Web-based online detector that uses browser APIs.\n * Listens for:\n * - `window.online` event for network connectivity changes\n * - `document.visibilitychange` event for tab/window focus changes\n */\nexport class WebOnlineDetector implements OnlineDetector {\n  private listeners: Set<() => void> = new Set()\n  private isListening = false\n\n  constructor() {\n    this.startListening()\n  }\n\n  private startListening(): void {\n    if (this.isListening) {\n      return\n    }\n\n    this.isListening = true\n\n    if (typeof window !== `undefined`) {\n      window.addEventListener(`online`, this.handleOnline)\n      document.addEventListener(`visibilitychange`, this.handleVisibilityChange)\n    }\n  }\n\n  private stopListening(): void {\n    if (!this.isListening) {\n      return\n    }\n\n    this.isListening = false\n\n    if (typeof window !== `undefined`) {\n      window.removeEventListener(`online`, this.handleOnline)\n      document.removeEventListener(\n        `visibilitychange`,\n        this.handleVisibilityChange,\n      )\n    }\n  }\n\n  private handleOnline = (): void => {\n    this.notifyListeners()\n  }\n\n  private handleVisibilityChange = (): void => {\n    if (document.visibilityState === `visible`) {\n      this.notifyListeners()\n    }\n  }\n\n  private notifyListeners(): void {\n    for (const listener of this.listeners) {\n      try {\n        listener()\n      } catch (error) {\n        console.warn(`OnlineDetector listener error:`, error)\n      }\n    }\n  }\n\n  subscribe(callback: () => void): () => void {\n    this.listeners.add(callback)\n\n    return () => {\n      this.listeners.delete(callback)\n\n      if (this.listeners.size === 0) {\n        this.stopListening()\n      }\n    }\n  }\n\n  notifyOnline(): void {\n    this.notifyListeners()\n  }\n\n  isOnline(): boolean {\n    if (typeof navigator !== `undefined`) {\n      return navigator.onLine\n    }\n    return true\n  }\n\n  dispose(): void {\n    this.stopListening()\n    this.listeners.clear()\n  }\n}\n\n/**\n * @deprecated Use `WebOnlineDetector` instead. This alias is kept for backwards compatibility.\n */\nexport const DefaultOnlineDetector = WebOnlineDetector\n"],"names":[],"mappings":";;AAQO,MAAM,kBAA4C;AAAA,EAIvD,cAAc;AAHd,SAAQ,gCAAiC,IAAA;AACzC,SAAQ,cAAc;AAmCtB,SAAQ,eAAe,MAAY;AACjC,WAAK,gBAAA;AAAA,IACP;AAEA,SAAQ,yBAAyB,MAAY;AAC3C,UAAI,SAAS,oBAAoB,WAAW;AAC1C,aAAK,gBAAA;AAAA,MACP;AAAA,IACF;AAxCE,SAAK,eAAA;AAAA,EACP;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,cAAc;AAEnB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,iBAAiB,UAAU,KAAK,YAAY;AACnD,eAAS,iBAAiB,oBAAoB,KAAK,sBAAsB;AAAA,IAC3E;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,CAAC,KAAK,aAAa;AACrB;AAAA,IACF;AAEA,SAAK,cAAc;AAEnB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,oBAAoB,UAAU,KAAK,YAAY;AACtD,eAAS;AAAA,QACP;AAAA,QACA,KAAK;AAAA,MAAA;AAAA,IAET;AAAA,EACF;AAAA,EAYQ,kBAAwB;AAC9B,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,iBAAA;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,KAAK,kCAAkC,KAAK;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,UAAkC;AAC1C,SAAK,UAAU,IAAI,QAAQ;AAE3B,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,QAAQ;AAE9B,UAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,aAAK,cAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAqB;AACnB,SAAK,gBAAA;AAAA,EACP;AAAA,EAEA,WAAoB;AAClB,QAAI,OAAO,cAAc,aAAa;AACpC,aAAO,UAAU;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAgB;AACd,SAAK,cAAA;AACL,SAAK,UAAU,MAAA;AAAA,EACjB;AACF;AAKO,MAAM,wBAAwB;;;"}