{"version":3,"file":"plugin.cjs","sources":["../../src/plugin.ts"],"sourcesContent":["interface TanStackDevtoolsEvent<TEventName extends string, TPayload = any> {\n  type: TEventName\n  payload: TPayload\n  pluginId?: string // Optional pluginId to filter events by plugin\n}\ndeclare global {\n  var __TANSTACK_EVENT_TARGET__: EventTarget | null\n}\n\ntype AllDevtoolsEvents<TEventMap extends Record<string, any>> = {\n  [Key in keyof TEventMap & string]: TanStackDevtoolsEvent<Key, TEventMap[Key]>\n}[keyof TEventMap & string]\n\nexport class EventClient<TEventMap extends Record<string, any>> {\n  #enabled = true\n  #pluginId: string\n  #eventTarget: () => EventTarget\n  #debug: boolean\n  #queuedEvents: Array<TanStackDevtoolsEvent<string, any>>\n  #connected: boolean\n  #connectIntervalId: number | null\n  #connectEveryMs: number\n  #retryCount = 0\n  #maxRetries = 5\n  #connecting = false\n  #failedToConnect = false\n  #internalEventTarget: EventTarget | null = null\n\n  #onConnected = () => {\n    this.debugLog('Connected to event bus')\n    this.#connected = true\n    this.#connecting = false\n    this.debugLog('Emitting queued events', this.#queuedEvents)\n    this.#queuedEvents.forEach((event) => this.emitEventToBus(event))\n    this.#queuedEvents = []\n    this.stopConnectLoop()\n    this.#eventTarget().removeEventListener(\n      'tanstack-connect-success',\n      this.#onConnected,\n    )\n  }\n  // fired off right away and then at intervals\n  #retryConnection = () => {\n    if (this.#retryCount < this.#maxRetries) {\n      this.#retryCount++\n      this.dispatchCustomEvent('tanstack-connect', {})\n\n      return\n    }\n    this.#eventTarget().removeEventListener(\n      'tanstack-connect',\n      this.#retryConnection,\n    )\n    this.#failedToConnect = true\n    this.debugLog('Max retries reached, giving up on connection')\n    this.stopConnectLoop()\n  }\n\n  // This is run to register connection handlers on first emit attempt\n  #connectFunction = () => {\n    if (this.#connecting) return\n    this.#connecting = true\n    this.#eventTarget().addEventListener(\n      'tanstack-connect-success',\n      this.#onConnected,\n    )\n    this.#retryConnection()\n  }\n\n  constructor({\n    pluginId,\n    debug = false,\n    enabled = true,\n    reconnectEveryMs = 300,\n  }: {\n    pluginId: string\n    debug?: boolean\n    reconnectEveryMs?: number\n    enabled?: boolean\n  }) {\n    this.#pluginId = pluginId\n    this.#enabled = enabled\n    this.#eventTarget = this.getGlobalTarget\n    this.#debug = debug\n    this.debugLog(' Initializing event subscription for plugin', this.#pluginId)\n    this.#queuedEvents = []\n    this.#connected = false\n    this.#failedToConnect = false\n    this.#connectIntervalId = null\n    this.#connectEveryMs = reconnectEveryMs\n  }\n\n  private startConnectLoop() {\n    // if connected, trying to connect, or the internalId is already set, do nothing\n    if (this.#connectIntervalId !== null || this.#connected) return\n    this.debugLog(`Starting connect loop (every ${this.#connectEveryMs}ms)`)\n\n    this.#connectIntervalId = setInterval(\n      this.#retryConnection,\n      this.#connectEveryMs,\n    ) as unknown as number\n  }\n\n  private stopConnectLoop() {\n    this.#connecting = false\n\n    if (this.#connectIntervalId === null) {\n      return\n    }\n    clearInterval(this.#connectIntervalId)\n    this.#connectIntervalId = null\n    this.#queuedEvents = []\n    this.debugLog('Stopped connect loop')\n  }\n\n  private debugLog(...args: Array<any>) {\n    if (this.#debug) {\n      console.log(`🌴 [tanstack-devtools:${this.#pluginId}-plugin]`, ...args)\n    }\n  }\n  private getGlobalTarget() {\n    // server one is the global event target\n    if (\n      typeof globalThis !== 'undefined' &&\n      globalThis.__TANSTACK_EVENT_TARGET__\n    ) {\n      this.debugLog('Using global event target')\n      return globalThis.__TANSTACK_EVENT_TARGET__\n    }\n    // CLient event target is the browser window object\n    if (\n      typeof window !== 'undefined' &&\n      typeof window.addEventListener !== 'undefined'\n    ) {\n      this.debugLog('Using window as event target')\n\n      return window\n    }\n    // Protect against non-web environments like react-native\n    const eventTarget =\n      typeof EventTarget !== 'undefined' ? new EventTarget() : undefined\n\n    // For non-web environments like react-native\n    if (\n      typeof eventTarget === 'undefined' ||\n      typeof eventTarget.addEventListener === 'undefined'\n    ) {\n      this.debugLog(\n        'No event mechanism available, running in non-web environment',\n      )\n      return {\n        addEventListener: () => {},\n        removeEventListener: () => {},\n        dispatchEvent: () => false,\n      }\n    }\n\n    this.debugLog('Using new EventTarget as fallback')\n    return eventTarget\n  }\n\n  getPluginId() {\n    return this.#pluginId\n  }\n\n  private dispatchCustomEventShim(eventName: string, detail: any) {\n    try {\n      const event = new Event(eventName, {\n        detail: detail,\n      } as any)\n      this.#eventTarget().dispatchEvent(event)\n    } catch (e) {\n      this.debugLog('Failed to dispatch shim event')\n    }\n  }\n\n  private dispatchCustomEvent(eventName: string, detail?: any) {\n    try {\n      this.#eventTarget().dispatchEvent(new CustomEvent(eventName, { detail }))\n    } catch (e) {\n      this.dispatchCustomEventShim(eventName, detail)\n    }\n  }\n\n  private emitEventToBus(event: TanStackDevtoolsEvent<string, any>) {\n    this.debugLog('Emitting event to client bus', event)\n    this.dispatchCustomEvent('tanstack-dispatch-event', event)\n  }\n\n  createEventPayload<TEvent extends keyof TEventMap & string>(\n    eventSuffix: TEvent,\n    payload: TEventMap[TEvent],\n  ) {\n    return {\n      type: `${this.#pluginId}:${eventSuffix}`,\n      payload,\n      pluginId: this.#pluginId,\n    }\n  }\n  emit<TEvent extends keyof TEventMap & string>(\n    eventSuffix: TEvent,\n    payload: TEventMap[TEvent],\n  ) {\n    if (!this.#enabled) {\n      this.debugLog(\n        'Event bus client is disabled, not emitting event',\n        eventSuffix,\n        payload,\n      )\n      return\n    }\n    if (this.#internalEventTarget) {\n      this.debugLog(\n        'Emitting event to internal event target',\n        eventSuffix,\n        payload,\n      )\n      this.#internalEventTarget.dispatchEvent(\n        new CustomEvent(`${this.#pluginId}:${eventSuffix}`, {\n          detail: this.createEventPayload(eventSuffix, payload),\n        }),\n      )\n    }\n\n    if (this.#failedToConnect) {\n      this.debugLog('Previously failed to connect, not emitting to bus')\n      return\n    }\n    // wait to connect to the bus\n    if (!this.#connected) {\n      this.debugLog('Bus not available, will be pushed as soon as connected')\n      this.#queuedEvents.push(this.createEventPayload(eventSuffix, payload))\n      // start connection to event bus\n      if (typeof CustomEvent !== 'undefined' && !this.#connecting) {\n        this.#connectFunction()\n        this.startConnectLoop()\n      }\n      return\n    }\n    // emit right now\n    return this.emitEventToBus(this.createEventPayload(eventSuffix, payload))\n  }\n\n  on<TEvent extends keyof TEventMap & string>(\n    eventSuffix: TEvent,\n    cb: (event: TanStackDevtoolsEvent<TEvent, TEventMap[TEvent]>) => void,\n    options?: {\n      withEventTarget?: boolean\n    },\n  ) {\n    const withEventTarget = options?.withEventTarget ?? false\n    const eventName = `${this.#pluginId}:${eventSuffix}` as const\n    if (withEventTarget) {\n      if (!this.#internalEventTarget) {\n        this.#internalEventTarget = new EventTarget()\n      }\n      this.#internalEventTarget.addEventListener(eventName, (e) => {\n        cb((e as CustomEvent).detail)\n      })\n    }\n    if (!this.#enabled) {\n      this.debugLog(\n        'Event bus client is disabled, not registering event',\n        eventName,\n      )\n      return () => {}\n    }\n    const handler = (e: Event) => {\n      this.debugLog('Received event from bus', (e as CustomEvent).detail)\n      cb((e as CustomEvent).detail)\n    }\n    this.#eventTarget().addEventListener(eventName, handler)\n    this.debugLog('Registered event to bus', eventName)\n    return () => {\n      if (withEventTarget) {\n        this.#internalEventTarget?.removeEventListener(eventName, handler)\n      }\n      this.#eventTarget().removeEventListener(eventName, handler)\n    }\n  }\n\n  onAll(cb: (event: TanStackDevtoolsEvent<string, any>) => void) {\n    if (!this.#enabled) {\n      this.debugLog('Event bus client is disabled, not registering event')\n      return () => {}\n    }\n\n    const handler = (e: Event) => {\n      const event = (e as CustomEvent).detail\n\n      cb(event)\n    }\n    this.#eventTarget().addEventListener('tanstack-devtools-global', handler)\n    return () =>\n      this.#eventTarget().removeEventListener(\n        'tanstack-devtools-global',\n        handler,\n      )\n  }\n  onAllPluginEvents(cb: (event: AllDevtoolsEvents<TEventMap>) => void) {\n    if (!this.#enabled) {\n      this.debugLog('Event bus client is disabled, not registering event')\n      return () => {}\n    }\n    const handler = (e: Event) => {\n      const event = (e as CustomEvent).detail\n      if (this.#pluginId && event.pluginId !== this.#pluginId) {\n        return\n      }\n      cb(event)\n    }\n    this.#eventTarget().addEventListener('tanstack-devtools-global', handler)\n    return () =>\n      this.#eventTarget().removeEventListener(\n        'tanstack-devtools-global',\n        handler,\n      )\n  }\n}\n"],"names":[],"mappings":"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"}