{"version":3,"sources":["../src/index.ts","../src/authentication.ts","../src/cert.ts","../src/client.ts","../src/http.ts","../src/trim.ts","../src/http2.ts","../src/websocket.ts","../src/request_deprecated.ts","../src/websocket_deprecated.ts"],"sourcesContent":["export {\n  authenticate,\n  type AuthenticationOptions,\n  type Credentials,\n  ClientNotFoundError,\n  ClientElevatedPermsError,\n  InvalidPlatformError\n} from './authentication.js'\nexport { LeagueClient, type LeagueClientOptions } from './client.js'\nexport { createHttp1Request, Http1Response } from './http.js'\nexport { createHttp2Request, createHttpSession, Http2Response } from './http2.js'\nexport {\n  createWebSocketConnection,\n  ConnectionOptions,\n  LeagueWebSocket,\n  EventResponse,\n  EventCallback\n} from './websocket.js'\nexport { DEPRECATED_request, DEPRECATED_RequestOptions, DEPRECATED_Response } from './request_deprecated.js'\nexport { DEPRECATED_connect } from './websocket_deprecated.js'\nexport type { HttpRequestOptions, HttpResponse, JsonObjectLike, HeaderPair } from './request_types.js'\n","import cp from 'child_process'\nimport util from 'util'\nimport { RIOT_GAMES_CERT } from './cert.js'\n\nconst exec = util.promisify<typeof cp.exec.__promisify__>(cp.exec)\n\nconst DEFAULT_NAME = 'LeagueClientUx'\nconst DEFAULT_POLL_INTERVAL = 2500\n\nexport interface Credentials {\n  /**\n   * The system port the LCU API is running on\n   */\n  port: number\n  /**\n   * The password for the LCU API\n   */\n  password: string\n  /**\n   * The system process id for the LeagueClientUx process\n   */\n  pid: number\n  /**\n   * Riot Games' self-signed root certificate (contents of .pem). If\n   * it is `undefined` then unsafe authentication will be used.\n   */\n  certificate?: string\n}\n\nexport interface AuthenticationOptions {\n  /**\n   * League Client process name. Set to RiotClientUx if you would like to\n   * authenticate with the Riot Client\n   *\n   * Defaults: LeagueClientUx\n   */\n  name?: string\n  /**\n   * Does not return before the League Client has been detected. This means the\n   * function stays unresolved until a League has been found.\n   *\n   * Defaults: false\n   */\n  awaitConnection?: boolean\n  /**\n   * The time duration in milliseconds between each attempt to locate a League\n   * Client process. Has no effect if awaitConnection is false\n   *\n   * Default: 2500\n   */\n  pollInterval?: number\n  /**\n   * Riot Games' self-signed root certificate (contents of .pem)\n   *\n   * Default: version of certificate bundled in package\n   */\n  certificate?: string\n  /**\n   * Do not authenticate requests with Riot Games' self-signed root certificate\n   *\n   * Default: true if `certificate` is `undefined`\n   */\n  unsafe?: boolean\n  /**\n   * Use deprecated Windows WMIC command line over Get-CimInstance. Does nothing\n   * if the system is not running on Windows. This is used to keep backwards\n   * compatability with Windows 7 systems that don't have Get-CimInstance\n   *\n   * See https://github.com/matsjla/league-connect/pull/54\n   * See https://github.com/matsjla/league-connect/pull/68\n   *\n   * Default: false\n   */\n  useDeprecatedWmic?: boolean\n  /**\n   * Set the Windows shell to use.\n   *\n   * Default: 'powershell'\n   */\n  windowsShell?: 'cmd' | 'powershell'\n  /**\n   * Debug mode. Prints error information to console.\n   * @internal\n   */\n  __internalDebug?: boolean\n}\n\n/**\n * Indicates that the application does not run on an environment that the\n * League Client supports. The Client runs on windows, linux or darwin.\n */\nexport class InvalidPlatformError extends Error {\n  constructor() {\n    super('process runs on platform client does not support')\n  }\n}\n\n/**\n * Indicates that the League Client could not be found\n */\nexport class ClientNotFoundError extends Error {\n  constructor() {\n    super('League Client process could not be located')\n  }\n}\n\n/**\n * Indicates that the League Client is running as administrator and the current script is not\n */\nexport class ClientElevatedPermsError extends Error {\n  constructor() {\n    super('League Client has been detected but is running as administrator')\n  }\n}\n\n/**\n * Locates a League Client and retrieves the credentials for the LCU API\n * from the found process\n *\n * If options.awaitConnection is false the promise will resolve into a\n * rejection if a League Client is not running\n *\n * @param {AuthenticationOptions} [options] Authentication options, if any\n *\n * @throws InvalidPlatformError If the environment is not running\n * windows/linux/darwin\n * @throws ClientNotFoundError If the League Client could not be found\n * @throws ClientElevatedPermsError If the League Client is running as administrator and the script is not (Windows only)\n */\nexport async function authenticate(options?: AuthenticationOptions): Promise<Credentials> {\n  async function tryAuthenticate() {\n    const name = options?.name ?? DEFAULT_NAME\n    const portRegex = /--app-port=([0-9]+)(?= *\"| --)/\n    const passwordRegex = /--remoting-auth-token=(.+?)(?= *\"| --)/\n    const pidRegex = /--app-pid=([0-9]+)(?= *\"| --)/\n    const isWindows = process.platform === 'win32'\n\n    let command: string\n    if (!isWindows) {\n      command = `ps x -o args | grep '${name}'`\n    } else if (isWindows && options?.useDeprecatedWmic === true) {\n      command = `wmic process where caption='${name}.exe' get commandline`\n    } else {\n      command = `Get-CimInstance -Query \"SELECT * from Win32_Process WHERE name LIKE '${name}.exe'\" | Select-Object -ExpandProperty CommandLine`\n    }\n\n    const executionOptions = isWindows ? { shell: options?.windowsShell ?? ('powershell' as string) } : {}\n\n    try {\n      const { stdout: rawStdout } = await exec(command, executionOptions)\n      // TODO: investigate regression with calling .replace on rawStdout\n      // Remove newlines from stdout\n      const stdout = rawStdout.replace(/\\n|\\r/g, '')\n      const [, port] = stdout.match(portRegex)!\n      const [, password] = stdout.match(passwordRegex)!\n      const [, pid] = stdout.match(pidRegex)!\n      const unsafe = options?.unsafe === true\n      const hasCert = options?.certificate !== undefined\n\n      // See flow chart for this here: https://github.com/matsjla/league-connect/pull/44#issuecomment-790384881\n      // If user specifies certificate, use it\n      const certificate = hasCert\n        ? options!.certificate\n        : // Otherwise: does the user want unsafe requests?\n        unsafe\n        ? undefined\n        : // Didn't specify, use our own certificate\n          RIOT_GAMES_CERT\n\n      return {\n        port: Number(port),\n        pid: Number(pid),\n        password,\n        certificate\n      }\n    } catch (err) {\n      if (options?.__internalDebug) console.error(err)\n      // Check if the user is running the client as an administrator leading to not being able to find the process\n      // Requires PowerShell 3.0 or higher\n      if (executionOptions.shell === 'powershell') {\n        const { stdout: isAdmin } = await exec(\n          `if ((Get-Process -Name ${name} -ErrorAction SilentlyContinue | Where-Object {!$_.Handle -and !$_.Path})) {Write-Output \"True\"} else {Write-Output \"False\"}`,\n          executionOptions\n        )\n        if (isAdmin.includes('True')) throw new ClientElevatedPermsError()\n      }\n      throw new ClientNotFoundError()\n    }\n  }\n\n  // Does not run windows/linux/darwin\n  if (!['win32', 'linux', 'darwin'].includes(process.platform)) {\n    throw new InvalidPlatformError()\n  }\n\n  if (options?.awaitConnection) {\n    // Poll until a client is found, attempting to resolve every\n    // `options.pollInterval` milliseconds\n    return new Promise(function self(resolve, reject) {\n      tryAuthenticate()\n        .then((result) => {\n          resolve(result)\n        })\n        .catch((err) => {\n          if (err instanceof ClientElevatedPermsError) reject(err)\n          setTimeout(self, options?.pollInterval ?? DEFAULT_POLL_INTERVAL, resolve, reject)\n        })\n    })\n  } else {\n    return tryAuthenticate()\n  }\n}\n","export const RIOT_GAMES_CERT = `\n-----BEGIN CERTIFICATE-----\nMIIEIDCCAwgCCQDJC+QAdVx4UDANBgkqhkiG9w0BAQUFADCB0TELMAkGA1UEBhMC\nVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDFNhbnRhIE1vbmljYTET\nMBEGA1UEChMKUmlvdCBHYW1lczEdMBsGA1UECxMUTG9MIEdhbWUgRW5naW5lZXJp\nbmcxMzAxBgNVBAMTKkxvTCBHYW1lIEVuZ2luZWVyaW5nIENlcnRpZmljYXRlIEF1\ndGhvcml0eTEtMCsGCSqGSIb3DQEJARYeZ2FtZXRlY2hub2xvZ2llc0ByaW90Z2Ft\nZXMuY29tMB4XDTEzMTIwNDAwNDgzOVoXDTQzMTEyNzAwNDgzOVowgdExCzAJBgNV\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRUwEwYDVQQHEwxTYW50YSBNb25p\nY2ExEzARBgNVBAoTClJpb3QgR2FtZXMxHTAbBgNVBAsTFExvTCBHYW1lIEVuZ2lu\nZWVyaW5nMTMwMQYDVQQDEypMb0wgR2FtZSBFbmdpbmVlcmluZyBDZXJ0aWZpY2F0\nZSBBdXRob3JpdHkxLTArBgkqhkiG9w0BCQEWHmdhbWV0ZWNobm9sb2dpZXNAcmlv\ndGdhbWVzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKoJemF/\n6PNG3GRJGbjzImTdOo1OJRDI7noRwJgDqkaJFkwv0X8aPUGbZSUzUO23cQcCgpYj\n21ygzKu5dtCN2EcQVVpNtyPuM2V4eEGr1woodzALtufL3Nlyh6g5jKKuDIfeUBHv\nJNyQf2h3Uha16lnrXmz9o9wsX/jf+jUAljBJqsMeACOpXfuZy+YKUCxSPOZaYTLC\ny+0GQfiT431pJHBQlrXAUwzOmaJPQ7M6mLfsnpHibSkxUfMfHROaYCZ/sbWKl3lr\nZA9DbwaKKfS1Iw0ucAeDudyuqb4JntGU/W0aboKA0c3YB02mxAM4oDnqseuKV/CX\n8SQAiaXnYotuNXMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAf3KPmddqEqqC8iLs\nlcd0euC4F5+USp9YsrZ3WuOzHqVxTtX3hR1scdlDXNvrsebQZUqwGdZGMS16ln3k\nWObw7BbhU89tDNCN7Lt/IjT4MGRYRE+TmRc5EeIXxHkQ78bQqbmAI3GsW+7kJsoO\nq3DdeE+M+BUJrhWorsAQCgUyZO166SAtKXKLIcxa+ddC49NvMQPJyzm3V+2b1roP\nSvD2WV8gRYUnGmy/N0+u6ANq5EsbhZ548zZc+BI4upsWChTLyxt2RxR7+uGlS1+5\nEcGfKZ+g024k/J32XP4hdho7WYAS2xMiV83CfLR/MNi8oSMaVQTdKD8cpgiWJk3L\nXWehWA==\n-----END CERTIFICATE-----\n`\n","import { EventEmitter } from 'events'\nimport { authenticate, ClientNotFoundError, Credentials } from './authentication.js'\n\nconst DEFAULT_POLL_INTERVAL = 2500\n\nexport declare interface LeagueClient {\n  on(event: 'connect', callback: (credentials: Credentials) => void): this\n  on(event: 'disconnect', callback: () => void): this\n}\n\nexport interface LeagueClientOptions {\n  /**\n   * The time duration in milliseconds between each check for a client\n   * disconnect\n   *\n   * Default: 2500\n   */\n  pollInterval: number\n}\n\nexport class LeagueClient extends EventEmitter {\n  private isListening: boolean = false\n  public credentials?: Credentials = undefined\n\n  constructor(credentials: Credentials, public options?: LeagueClientOptions) {\n    super()\n    this.credentials = credentials\n  }\n\n  /**\n   * Start listening for League Client processes\n   */\n  start() {\n    // Only trigger if it's not already\n    // running\n    if (!this.isListening) {\n      this.isListening = true\n\n      if (this.credentials === undefined || !processExists(this.credentials.pid)) {\n        // Invalidated credentials or no LeagueClientUx process, fail\n        throw new ClientNotFoundError()\n      }\n\n      this.onTick()\n    }\n  }\n\n  /**\n   * Stop listening for client stop/start\n   */\n  stop() {\n    this.isListening = false\n  }\n\n  private async onTick() {\n    if (this.isListening) {\n      if (this.credentials !== undefined) {\n        // Current credentials are valid\n        if (!processExists(this.credentials.pid)) {\n          // No such process, emit disconnect and\n          // invalidate credentials\n          this.emit('disconnect')\n          this.credentials = undefined\n          // Re-queue onTick to listen for credentials\n          this.onTick()\n        } else {\n          // Process still lives, queue onTick\n          setTimeout(() => {\n            this.onTick()\n          }, this.options?.pollInterval ?? DEFAULT_POLL_INTERVAL)\n        }\n      } else {\n        // Current credentials were invalidated, wait for\n        // client to come back up\n        const credentials = await authenticate({\n          awaitConnection: true,\n          pollInterval: this.options?.pollInterval ?? DEFAULT_POLL_INTERVAL\n        })\n        this.credentials = credentials\n        this.emit('connect', credentials)\n        setTimeout(() => {\n          this.onTick()\n        }, this.options?.pollInterval ?? DEFAULT_POLL_INTERVAL)\n      }\n    }\n  }\n}\n\nfunction processExists(pid: number): boolean {\n  try {\n    // `man 1 kill`: if sig is 0, then no signal is sent, but error checking\n    // is still performed.\n    return process.kill(pid, 0)\n  } catch (err: unknown) {\n    return (err as any)?.code === 'EPERM'\n  }\n}\n","import https from 'https'\nimport type { IncomingMessage } from 'http'\nimport { TextEncoder } from 'util'\nimport assert from 'assert'\nimport type { Credentials } from './authentication.js'\nimport type { HttpResponse, HeaderPair, HttpRequestOptions, JsonObjectLike } from './request_types.js'\nimport { trim } from './trim.js'\n\nexport class Http1Response implements HttpResponse {\n  public readonly ok: boolean\n  public readonly redirected: boolean\n  public readonly status: number\n\n  public constructor(private _message: IncomingMessage, private _raw: Buffer) {\n    assert(_message.complete, 'Response constructor called with incomplete HttpIncomingMessage')\n    // Safe assertion, this response originated from a http.ClientRequest\n    const code = _message!.statusCode!\n\n    // See https://fetch.spec.whatwg.org/#statuses\n    this.ok = code >= 200 && code < 300\n    this.redirected = [301, 302, 303, 307, 308].includes(code)\n    this.status = code\n  }\n\n  public json<T = JsonObjectLike>() {\n    return JSON.parse(this._raw.toString()) as T\n  }\n\n  public text(): string {\n    return this._raw.toString()\n  }\n\n  public buffer(): Buffer {\n    return this._raw\n  }\n\n  public headers(): HeaderPair[] {\n    const headers: HeaderPair[] = []\n\n    for (const [key, value] of Object.entries(this._message.headers)) {\n      if (key.startsWith(':')) {\n        continue\n      }\n\n      if (value === undefined) {\n        headers.push([key, ''])\n      } else if (Array.isArray(value)) {\n        headers.push([key, value.join(', ')])\n      } else {\n        headers.push([key, value])\n      }\n    }\n\n    return headers\n  }\n}\n\nexport async function createHttp1Request<T>(\n  options: HttpRequestOptions<T>,\n  credentials: Credentials\n): Promise<Http1Response> {\n  const agentOptions: https.AgentOptions =\n    credentials.certificate === undefined ? { rejectUnauthorized: false } : { ca: credentials.certificate }\n\n  return new Promise((resolve, reject) => {\n    const request = https.request(\n      {\n        host: '127.0.0.1',\n        port: credentials.port,\n        path: '/' + trim(options.url),\n        method: options.method,\n        headers: {\n          Accept: '*/*',\n          'Content-Type': 'application/json',\n          Authorization: 'Basic ' + Buffer.from(`riot:${credentials.password}`).toString('base64')\n        },\n        agent: new https.Agent(agentOptions)\n      },\n      (response) => {\n        let buffer: any = []\n        response.on('data', (data) => void buffer.push(data))\n\n        response.on('end', () => {\n          try {\n            resolve(new Http1Response(response, Buffer.concat(buffer)))\n          } catch (jsonError) {\n            reject(jsonError)\n          }\n        })\n      }\n    )\n    if (options.body !== undefined) {\n      const data = JSON.stringify(options.body)\n      const body = new TextEncoder().encode(data)\n      request.write(body, 'utf8')\n    }\n\n    request.on('error', (err) => reject(err))\n    request.end()\n  })\n}\n","export function trim(s: string): string {\n  let r = s\n  while (r.startsWith('/')) {\n    r = r.substring(1)\n  }\n  return r\n}\n","import http2, { type IncomingHttpHeaders, type IncomingHttpStatusHeader } from 'http2'\nimport { TextEncoder } from 'util'\nimport assert from 'assert'\nimport { trim } from './trim.js'\nimport type { Credentials } from './authentication.js'\nimport type { HeaderPair, HttpResponse, HttpRequestOptions, JsonObjectLike } from './request_types.js'\nimport { RIOT_GAMES_CERT } from './cert.js'\n\n/**\n * Create a HTTP/2.0 client session.\n *\n * This invocation requires the credentials to have\n */\nexport async function createHttpSession(credentials: Credentials): Promise<http2.ClientHttp2Session> {\n  const certificate = credentials.certificate ?? RIOT_GAMES_CERT\n\n  return http2.connect(`https://127.0.0.1:${credentials.port}`, {\n    ca: certificate\n  })\n}\n\nexport class Http2Response implements HttpResponse {\n  public readonly ok: boolean\n  public readonly redirected: boolean\n  public readonly status: number\n\n  public constructor(\n    private _headers: IncomingHttpHeaders & IncomingHttpStatusHeader,\n    private _stream: http2.ClientHttp2Stream,\n    private _raw: Buffer\n  ) {\n    assert(_stream.closed, 'Response constructor called with unclosed ClientHttp2Stream')\n    const code = _headers[':status']!\n\n    // See https://fetch.spec.whatwg.org/#statuses\n    this.ok = code >= 200 && code < 300\n    this.redirected = [301, 302, 303, 307, 308].includes(code)\n    this.status = code\n  }\n\n  public json<T = JsonObjectLike>() {\n    return JSON.parse(this._raw.toString()) as T\n  }\n\n  public text(): string {\n    return this._raw.toString()\n  }\n\n  public buffer(): Buffer {\n    return this._raw\n  }\n\n  public headers(): HeaderPair[] {\n    const headers: HeaderPair[] = []\n\n    for (const [key, value] of Object.entries(this._headers)) {\n      if (key.startsWith(':')) {\n        continue\n      }\n\n      if (value === undefined) {\n        headers.push([key, ''])\n      } else if (Array.isArray(value)) {\n        headers.push([key, value.join(', ')])\n      } else {\n        headers.push([key, value])\n      }\n    }\n\n    return headers\n  }\n}\n\nexport async function createHttp2Request<T>(\n  options: HttpRequestOptions<T>,\n  session: http2.ClientHttp2Session,\n  credentials: Credentials\n): Promise<Http2Response> {\n  assert(!session.closed, 'createHttp2Request called on closed session')\n  const request = session.request({\n    ':path': '/' + trim(options.url),\n    ':method': options.method,\n    Accept: '*/*',\n    'Content-Type': 'application/json',\n    Authorization: 'Basic ' + Buffer.from(`riot:${credentials.password}`).toString('base64')\n  })\n  if (options.body) {\n    const data = JSON.stringify(options.body)\n    const body = new TextEncoder().encode(data)\n    request.write(body, 'utf8')\n  }\n\n  return new Promise((resolve, reject) => {\n    let stream: any = []\n    let headers: IncomingHttpHeaders & IncomingHttpStatusHeader\n    request.on('response', (response) => {\n      headers = response\n    })\n    request.on('data', (data) => {\n      stream.push(data)\n    })\n    request.on('error', (err) => reject(err))\n    request.on('end', () => {\n      try {\n        request.close()\n        resolve(new Http2Response(headers, request, Buffer.concat(stream)))\n      } catch (jsonError) {\n        reject(jsonError)\n      }\n    })\n  })\n}\n","import https from 'https'\nimport WebSocket, { ClientOptions } from 'ws'\nimport { authenticate, AuthenticationOptions } from './authentication.js'\nimport { trim } from './trim.js'\n\nexport interface EventResponse<T = any> {\n  /**\n   * The uri this event was dispatched at\n   */\n  uri: string\n  /**\n   * The data, if any\n   */\n  data: T\n}\n\n/**\n * Callback function for an subscription listener\n *\n * @param data The data payload (deserialized json)\n */\nexport type EventCallback<T = any> = (data: T | null, event: EventResponse<T>) => void\n\n/**\n * WebSocket extension\n */\nexport class LeagueWebSocket extends WebSocket {\n  subscriptions: Map<string, EventCallback[]> = new Map()\n\n  constructor(address: string, options: ClientOptions) {\n    super(address, options)\n\n    // Subscribe to Json API\n    this.on('open', () => {\n      this.send(JSON.stringify([5, 'OnJsonApiEvent']))\n    })\n\n    // Attach the LeagueWebSocket subscription hook\n    this.on('message', (content: string) => {\n      // Attempt to parse into JSON and dispatch events\n      try {\n        const json = JSON.parse(content)\n        const [res]: [EventResponse] = json.slice(2)\n\n        if (this.subscriptions.has(res.uri)) {\n          this.subscriptions.get(res.uri)?.forEach((cb) => {\n            cb(res.data, res)\n          })\n        }\n      } catch {}\n    })\n  }\n\n  public subscribe<T extends any = any>(path: string, effect: EventCallback<T>) {\n    const p = `/${trim(path)}`\n\n    if (!this.subscriptions.has(p)) {\n      this.subscriptions.set(p, [effect])\n    } else {\n      this.subscriptions.get(p)?.push(effect)\n    }\n  }\n\n  public unsubscribe(path: string) {\n    const p = `/${trim(path)}`\n\n    this.subscriptions.delete(p)\n  }\n}\n\nexport interface ConnectionOptions {\n  /**\n   * Options that will be used to authenticate to the LCU WebSocket API\n   */\n  authenticationOptions?: AuthenticationOptions\n\n  /**\n   * Polling interval in case connection fails.\n   *\n   * Default: 1000\n   */\n  pollInterval?: number\n\n  /**\n   * Maximum number of retries to connect to the LCU WebSocket API.\n   * If set to -1, it will retry indefinitely.\n   * If set to 0, it will not retry.\n   * Default: 10\n   */\n  maxRetries?: number\n\n  /**\n   * Current retry count. Used internally, please do not modify.\n   * @internal\n   */\n  __internalRetryCount?: number\n\n  /**\n   * Mock faulty connections. Used internally.\n   * Value is the error message.\n   * @internal\n   */\n  __internalMockFaultyConnection?: string\n\n  /**\n   * Callback function to be called when a mock faulty connection is made.\n   * @internal\n   * */\n  __internalMockCallback?: () => void\n}\n\n/**\n * Creates a WebSocket connection to the League Client\n * @param {ConnectionOptions} [options] Options that will be used to authenticate to the League Client\n *\n * @throws Error If the connection fails due to ECONNREFUSED\n * @throws WebSocket.ErrorEvent If the connection fails for any other reason\n */\nexport async function createWebSocketConnection(options: ConnectionOptions = {}): Promise<LeagueWebSocket> {\n  const credentials = await authenticate(options.authenticationOptions)\n  const url = `wss://riot:${credentials.password}@127.0.0.1:${credentials.port}`\n\n  return await new Promise((resolve, reject) => {\n    const ws = new LeagueWebSocket(url, {\n      headers: {\n        Authorization: 'Basic ' + Buffer.from(`riot:${credentials.password}`).toString('base64')\n      },\n      agent: new https.Agent(\n        typeof credentials?.certificate === 'undefined'\n          ? {\n              rejectUnauthorized: false\n            }\n          : {\n              ca: credentials?.certificate\n            }\n      )\n    })\n\n    // Handle connection errors\n    const errorHandler = (ws.onerror = (err) => {\n      // Set options to default values if they are not set\n      options.__internalRetryCount = options.__internalRetryCount ?? 0\n      options.pollInterval = options.pollInterval ?? 1000\n      options.maxRetries = options.maxRetries ?? 10\n\n      // Check if this is a test and if so, call the mock callback\n      if (options.__internalMockFaultyConnection && options.__internalMockCallback) {\n        if (err.message.includes('EndTestOpen') && options.__internalRetryCount >= options.maxRetries) resolve(ws)\n        options.__internalMockCallback?.()\n      }\n\n      // Close the connection if it's still open to make sure there's no memory leak.\n      ws.close()\n\n      // Check if the error is a connection refused error. This is thrown when the LCU is starting but not completely ready yet.\n      if (err.message.includes('ECONNREFUSED')) {\n        options.__internalRetryCount++\n\n        // Check if the maximum number of retries has been reached and reject the promise if it has\n        if (options.maxRetries === 0) {\n          reject(new Error('Could not connect to LCU WebSocket API'))\n        } else if (options.maxRetries > 0 && options.__internalRetryCount > options.maxRetries) {\n          reject(new Error(`Could not connect to LCU WebSocket API after ${options.__internalRetryCount - 1} retries`))\n        } else {\n          // Wait for the poll interval and try again\n          setTimeout(() => {\n            resolve(createWebSocketConnection(options))\n          }, options.pollInterval)\n        }\n      } else {\n        reject(err)\n      }\n    })\n\n    // Check if this is a test and if so, emit an error.\n    // Requires waiting for the connection to be established since it's actually connecting to the LCU before emitting the error.\n    if (options.__internalMockFaultyConnection) {\n      ws.onopen = () => {\n        ws.emit('error', new Error(`${options.__internalMockFaultyConnection}`))\n        ws.removeListener('error', errorHandler)\n      }\n    } else {\n      // Remove the error handler once the connection is established and resolve the promise\n      ws.onopen = () => {\n        ws.removeListener('error', errorHandler)\n        resolve(ws)\n      }\n    }\n  })\n}\n","import fetch, { Response as FetchResponse } from 'node-fetch'\nimport https from 'https'\nimport type { Credentials } from './authentication.js'\nimport { trim } from './trim.js'\n\nexport interface DEPRECATED_RequestOptions<T = any> {\n  /**\n   * Relative URL (relative to LCU API base url) to send api request to\n   */\n  url: string\n  /**\n   * Http verb to use for request\n   */\n  method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n  /**\n   * Optionally a body to pass to PUT/PATCH/POST/DELETE. This is typically\n   * an object type as the library will parse this into JSON and send along\n   * with the request\n   */\n  body?: T\n}\n\n/**\n * Wrapper around Node-fetch Response which will deserialize JSON into the\n * proper type\n */\nexport class DEPRECATED_Response<T> extends FetchResponse {\n  constructor(parent: FetchResponse) {\n    super(parent.body, parent)\n  }\n\n  /**\n   * Deserialize the response body into T\n   */\n  async json(): Promise<T> {\n    const object = await super.json()\n\n    return object as T\n  }\n}\n\nexport async function DEPRECATED_request<T = any, R = any>(\n  options: DEPRECATED_RequestOptions<T>,\n  credentials?: Credentials\n): Promise<DEPRECATED_Response<R>> {\n  const uri = trim(options.url)\n  const url = `https://127.0.0.1:${credentials?.port}/${uri}`\n  const hasBody = options.method !== 'GET' && options.body !== undefined\n\n  const response = await fetch(url, {\n    method: options.method,\n    body: hasBody ? JSON.stringify(options.body) : undefined,\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n      Authorization: 'Basic ' + Buffer.from(`riot:${credentials?.password}`).toString('base64')\n    },\n    agent: new https.Agent(\n      typeof credentials?.certificate === 'undefined'\n        ? {\n            rejectUnauthorized: false\n          }\n        : {\n            ca: credentials?.certificate\n          }\n    )\n  })\n\n  return new DEPRECATED_Response<R>(response)\n}\n","import https from 'https'\nimport { LeagueWebSocket } from './websocket.js'\nimport { Credentials } from './authentication.js'\n\nexport async function DEPRECATED_connect(credentials: Credentials): Promise<LeagueWebSocket> {\n  const url = `wss://riot:${credentials.password}@127.0.0.1:${credentials.port}`\n\n  return new LeagueWebSocket(url, {\n    headers: {\n      Authorization: 'Basic ' + Buffer.from(`riot:${credentials.password}`).toString('base64')\n    },\n    agent: new https.Agent(\n      typeof credentials?.certificate === 'undefined'\n        ? {\n            rejectUnauthorized: false\n          }\n        : {\n            ca: credentials?.certificate\n          }\n    )\n  })\n}\n"],"mappings":"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","names":[]}