{"version":3,"file":"bridge-mode/io-client.mjs","sources":["../../../src/bridge-mode/io-client.ts"],"sourcesContent":["import { assert } from '@midscene/shared/utils';\nimport { io as ClientIO, type Socket as ClientSocket } from 'socket.io-client';\nimport {\n  type BridgeCallRequest,\n  type BridgeCallResponse,\n  type BridgeConnectedEventPayload,\n  BridgeEvent,\n} from './common';\n\ndeclare const __VERSION__: string;\n\n// ws client, this is where the request is processed\nexport class BridgeClient {\n  private socket: ClientSocket | null = null;\n  public serverVersion: string | null = null;\n  constructor(\n    public endpoint: string,\n    public onBridgeCall: (method: string, args: any[]) => Promise<any>,\n    public onDisconnect?: () => void,\n  ) {}\n\n  async connect() {\n    return new Promise((resolve, reject) => {\n      // Force WebSocket if XMLHttpRequest is not available (e.g., Service Worker)\n      const forceWebSocket = typeof XMLHttpRequest === 'undefined';\n\n      this.socket = ClientIO(this.endpoint, {\n        reconnection: false,\n        // Force WebSocket in environments without XHR (Service Worker)\n        ...(forceWebSocket ? { transports: ['websocket'] } : {}),\n        query: {\n          version: __VERSION__,\n        },\n      });\n\n      const timeout = setTimeout(() => {\n        try {\n          this.socket?.offAny();\n          this.socket?.close();\n        } catch (e) {\n          console.warn('got error when offing socket', e);\n        }\n        this.socket = null;\n        reject(new Error('failed to connect to bridge server after timeout'));\n      }, 5 * 1000);\n\n      // on disconnect\n      this.socket.on('disconnect', (reason: string) => {\n        // console.log('bridge-disconnected, reason:', reason);\n        this.socket = null;\n        this.onDisconnect?.();\n      });\n\n      this.socket.on('connect_error', (e: any) => {\n        console.error('bridge-connect-error', e);\n        reject(new Error(e || 'bridge connect error'));\n      });\n\n      this.socket.on(\n        BridgeEvent.Connected,\n        (payload: BridgeConnectedEventPayload) => {\n          clearTimeout(timeout);\n          this.serverVersion = payload?.version || 'unknown';\n          resolve(this.socket);\n        },\n      );\n      this.socket.on(BridgeEvent.Refused, (e: any) => {\n        console.error('bridge-refused', e);\n        try {\n          this.socket?.disconnect();\n        } catch (e) {\n          // console.warn('got error when disconnecting socket', e);\n        }\n        reject(new Error(e || 'bridge refused'));\n      });\n      this.socket.on(BridgeEvent.Call, (call: BridgeCallRequest) => {\n        const id = call.id;\n        assert(typeof id !== 'undefined', 'call id is required');\n        (async () => {\n          let response: any;\n          try {\n            response = await this.onBridgeCall(call.method, call.args);\n          } catch (e: any) {\n            const errorContent = `Error from bridge client when calling, method: ${call.method}, args: ${call.args}, error: ${e?.message || e}\\n${e?.stack || ''}`;\n            console.error(errorContent);\n            return this.socket?.emit(BridgeEvent.CallResponse, {\n              id,\n              error: errorContent,\n            } as BridgeCallResponse);\n          }\n          this.socket?.emit(BridgeEvent.CallResponse, {\n            id,\n            response,\n          } as BridgeCallResponse);\n        })();\n      });\n    });\n  }\n\n  disconnect() {\n    this.socket?.disconnect();\n    this.socket = null;\n  }\n}\n"],"names":["BridgeClient","Promise","resolve","reject","forceWebSocket","XMLHttpRequest","ClientIO","__VERSION__","timeout","setTimeout","e","console","Error","reason","BridgeEvent","payload","clearTimeout","call","id","assert","response","errorContent","endpoint","onBridgeCall","onDisconnect"],"mappings":";;;;;;;;;;;;;AAYO,MAAMA;IASX,MAAM,UAAU;QACd,OAAO,IAAIC,QAAQ,CAACC,SAASC;YAE3B,MAAMC,iBAAiB,AAA0B,eAA1B,OAAOC;YAE9B,IAAI,CAAC,MAAM,GAAGC,GAAS,IAAI,CAAC,QAAQ,EAAE;gBACpC,cAAc;gBAEd,GAAIF,iBAAiB;oBAAE,YAAY;wBAAC;qBAAY;gBAAC,IAAI,CAAC,CAAC;gBACvD,OAAO;oBACL,SAASG;gBACX;YACF;YAEA,MAAMC,UAAUC,WAAW;gBACzB,IAAI;oBACF,IAAI,CAAC,MAAM,EAAE;oBACb,IAAI,CAAC,MAAM,EAAE;gBACf,EAAE,OAAOC,GAAG;oBACVC,QAAQ,IAAI,CAAC,gCAAgCD;gBAC/C;gBACA,IAAI,CAAC,MAAM,GAAG;gBACdP,OAAO,IAAIS,MAAM;YACnB,GAAG;YAGH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,CAACC;gBAE5B,IAAI,CAAC,MAAM,GAAG;gBACd,IAAI,CAAC,YAAY;YACnB;YAEA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAACH;gBAC/BC,QAAQ,KAAK,CAAC,wBAAwBD;gBACtCP,OAAO,IAAIS,MAAMF,KAAK;YACxB;YAEA,IAAI,CAAC,MAAM,CAAC,EAAE,CACZI,YAAY,SAAS,EACrB,CAACC;gBACCC,aAAaR;gBACb,IAAI,CAAC,aAAa,GAAGO,SAAS,WAAW;gBACzCb,QAAQ,IAAI,CAAC,MAAM;YACrB;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAACY,YAAY,OAAO,EAAE,CAACJ;gBACnCC,QAAQ,KAAK,CAAC,kBAAkBD;gBAChC,IAAI;oBACF,IAAI,CAAC,MAAM,EAAE;gBACf,EAAE,OAAOA,GAAG,CAEZ;gBACAP,OAAO,IAAIS,MAAMF,KAAK;YACxB;YACA,IAAI,CAAC,MAAM,CAAC,EAAE,CAACI,YAAY,IAAI,EAAE,CAACG;gBAChC,MAAMC,KAAKD,KAAK,EAAE;gBAClBE,OAAO,AAAc,WAAPD,IAAoB;gBACjC;oBACC,IAAIE;oBACJ,IAAI;wBACFA,WAAW,MAAM,IAAI,CAAC,YAAY,CAACH,KAAK,MAAM,EAAEA,KAAK,IAAI;oBAC3D,EAAE,OAAOP,GAAQ;wBACf,MAAMW,eAAe,CAAC,+CAA+C,EAAEJ,KAAK,MAAM,CAAC,QAAQ,EAAEA,KAAK,IAAI,CAAC,SAAS,EAAEP,GAAG,WAAWA,EAAE,EAAE,EAAEA,GAAG,SAAS,IAAI;wBACtJC,QAAQ,KAAK,CAACU;wBACd,OAAO,IAAI,CAAC,MAAM,EAAE,KAAKP,YAAY,YAAY,EAAE;4BACjDI;4BACA,OAAOG;wBACT;oBACF;oBACA,IAAI,CAAC,MAAM,EAAE,KAAKP,YAAY,YAAY,EAAE;wBAC1CI;wBACAE;oBACF;gBACF;YACF;QACF;IACF;IAEA,aAAa;QACX,IAAI,CAAC,MAAM,EAAE;QACb,IAAI,CAAC,MAAM,GAAG;IAChB;IAvFA,YACSE,QAAgB,EAChBC,YAA2D,EAC3DC,YAAyB,CAChC;;;;QANF,uBAAQ,UAAR;QACA,uBAAO,iBAAP;aAESF,QAAQ,GAARA;aACAC,YAAY,GAAZA;aACAC,YAAY,GAAZA;aALD,MAAM,GAAwB;aAC/B,aAAa,GAAkB;IAKnC;AAoFL"}