{"version":3,"file":"fetch-DGCwcr7j.mjs","names":[],"sources":["../src/lib/fetch.ts"],"sourcesContent":["import { type $Fetch, ofetch } from 'ofetch';\nimport { type Socket, io } from 'socket.io-client';\n\nexport interface ApiAuthOptions {\n  token?: string;\n  // ApiKey?: string;\n}\n\ntype SocketCreator = (\n  namespace: string,\n  rooms?: string[]\n) => Socket | undefined;\n\nconst sockets = new Map<string, { con: Socket; rooms?: string[] }>();\n\n/**\n * Client for the API\n */\nexport const client = {\n  fetch: ofetch.create({}) as $Fetch,\n  socket: (() => {\n    // Will be init later\n  }) as SocketCreator,\n  token: '',\n};\n\nconst prepareSocketCreator = (\n  baseURL: URL,\n  auth?: ApiAuthOptions\n): SocketCreator => {\n  const wsURL = new URL(baseURL);\n  wsURL.protocol = wsURL.protocol.replace('http', 'ws');\n  // Ensure URL ends with / so we'll respect the baseURL when getting socket.io path\n  if (wsURL.href.at(-1) !== '/') {\n    wsURL.href = `${wsURL.href}/`;\n  }\n  // Respect baseURL for socket.io (allows running behind reverse proxy)\n  const socketIoPath = new URL('socket.io/', wsURL).pathname;\n\n  return (namespaceName, rooms) => {\n    let namespace = sockets.get(namespaceName);\n    const haveSameRooms = (namespace?.rooms ?? []).every((rs) =>\n      (rooms ?? []).includes(rs)\n    );\n    if (!haveSameRooms) {\n      namespace?.con.disconnect();\n      namespace = undefined;\n    }\n    if (!namespace) {\n      const url = new URL(namespaceName, wsURL);\n\n      try {\n        namespace = {\n          con: io(url.href, {\n            auth: auth || undefined,\n            path: socketIoPath,\n            query: rooms ? { rooms } : undefined,\n          }),\n          rooms,\n        };\n        sockets.set(namespaceName, namespace);\n      } catch (error) {\n        // oxlint-disable-next-line no-console\n        console.error(\n          `[ezreeport-sdk-js] Couldn't create socket for ${namespaceName}`,\n          error\n        );\n        return;\n      }\n    }\n\n    return namespace.con;\n  };\n};\n\n/**\n * Prepare the client for the rest of the SDK, will update config if needed\n *\n * @param baseURL Base HTTP URL of the API\n * @param auth Auth options to be authenticated\n */\nexport function prepareClient(\n  baseURL: string | URL,\n  auth?: ApiAuthOptions\n): void {\n  // Create HTTP client\n  const headers: Record<string, string> = {};\n\n  if (auth?.token) {\n    headers.Authorization = `Bearer ${auth.token}`;\n  }\n  // If (auth?.apiKey) {\n  //   Headers['X-Api-Key'] = auth.apiKey;\n  // }\n\n  let href;\n  let url;\n  if (typeof baseURL === 'string') {\n    href = baseURL;\n    url = new URL(baseURL);\n  } else {\n    href = baseURL.href;\n    url = baseURL;\n  }\n\n  client.fetch = ofetch.create({\n    baseURL: href,\n    headers,\n  });\n\n  // Set function to handle sockets\n  client.socket = prepareSocketCreator(url, auth);\n}\n"],"mappings":";;;;AAaA,MAAM,0BAAU,IAAI,IAA+C;;;;AAKnE,MAAa,SAAS;CACpB,OAAO,OAAO,OAAO,CAAC,CAAC;CACvB,eAAe,CAEf;CACA,OAAO;AACT;AAEA,MAAM,wBACJ,SACA,SACkB;CAClB,MAAM,QAAQ,IAAI,IAAI,OAAO;CAC7B,MAAM,WAAW,MAAM,SAAS,QAAQ,QAAQ,IAAI;CAEpD,IAAI,MAAM,KAAK,GAAG,EAAE,MAAM,KACxB,MAAM,OAAO,GAAG,MAAM,KAAK;CAG7B,MAAM,eAAe,IAAI,IAAI,cAAc,KAAK,CAAC,CAAC;CAElD,QAAQ,eAAe,UAAU;;EAC/B,IAAI,YAAY,QAAQ,IAAI,aAAa;EAIzC,IAAI,4EAHmB,UAAW,oEAAS,CAAC,EAAC,CAAE,OAAO,QACnD,6CAAS,CAAC,EAAC,CAAE,SAAS,EAAE,CAEV,GAAG;GAClB,wDAAW,IAAI,WAAW;GAC1B,YAAY;EACd;EACA,IAAI,CAAC,WAAW;GACd,MAAM,MAAM,IAAI,IAAI,eAAe,KAAK;GAExC,IAAI;IACF,YAAY;KACV,KAAK,GAAG,IAAI,MAAM;MAChB,MAAM,QAAQ;MACd,MAAM;MACN,OAAO,QAAQ,EAAE,MAAM,IAAI;KAC7B,CAAC;KACD;IACF;IACA,QAAQ,IAAI,eAAe,SAAS;GACtC,SAAS,OAAO;IAEd,QAAQ,MACN,iDAAiD,iBACjD,KACF;IACA;GACF;EACF;EAEA,OAAO,UAAU;CACnB;AACF;;;;;;;AAQA,SAAgB,cACd,SACA,MACM;CAEN,MAAM,UAAkC,CAAC;CAEzC,gDAAI,KAAM,OACR,QAAQ,gBAAgB,UAAU,KAAK;CAMzC,IAAI;CACJ,IAAI;CACJ,IAAI,OAAO,YAAY,UAAU;EAC/B,OAAO;EACP,MAAM,IAAI,IAAI,OAAO;CACvB,OAAO;EACL,OAAO,QAAQ;EACf,MAAM;CACR;CAEA,OAAO,QAAQ,OAAO,OAAO;EAC3B,SAAS;EACT;CACF,CAAC;CAGD,OAAO,SAAS,qBAAqB,KAAK,IAAI;AAChD"}