{
  "version": 3,
  "sources": ["../offline.ts", "../../user-offline-uuid/index.browser.ts", "../../undici-shim/index.ts", "../mojang.ts", "../yggdrasil.ts", "../microsoft.ts"],
  "sourcesContent": ["import { v4 } from 'uuid'\nimport { getOfflineUUID } from 'user-offline-uuid'\n\n/**\n * Random generate a new token by uuid v4. It can be client or auth token.\n * @returns a new token\n */\nexport function newToken() {\n  return v4().replace(/-/g, '')\n}\n\nexport { getOfflineUUID }\n\n/**\n * Create an offline auth. It'll ensure the user game profile's `uuid` is the same for the same `username`.\n *\n * @param username The username you want to have in-game.\n */\nexport function offline(username: string, uuid?: string) {\n  const id = uuid || getOfflineUUID(username)\n  const prof = {\n    id,\n    name: username,\n  }\n  return {\n    accessToken: newToken(),\n    clientToken: newToken(),\n    selectedProfile: prof,\n    availableProfiles: [prof],\n    user: {\n      id,\n      username,\n    },\n  }\n}\n", "/* eslint-disable camelcase */\nconst md5 = (s: string) => {\n  function md5cycle(x: Int32Array, k: any[]) {\n    let a = x[0]\n    let b = x[1]\n    let c = x[2]\n    let d = x[3]\n\n    a = ff(a, b, c, d, k[0], 7, -680876936)\n    d = ff(d, a, b, c, k[1], 12, -389564586)\n    c = ff(c, d, a, b, k[2], 17, 606105819)\n    b = ff(b, c, d, a, k[3], 22, -1044525330)\n    a = ff(a, b, c, d, k[4], 7, -176418897)\n    d = ff(d, a, b, c, k[5], 12, 1200080426)\n    c = ff(c, d, a, b, k[6], 17, -1473231341)\n    b = ff(b, c, d, a, k[7], 22, -45705983)\n    a = ff(a, b, c, d, k[8], 7, 1770035416)\n    d = ff(d, a, b, c, k[9], 12, -1958414417)\n    c = ff(c, d, a, b, k[10], 17, -42063)\n    b = ff(b, c, d, a, k[11], 22, -1990404162)\n    a = ff(a, b, c, d, k[12], 7, 1804603682)\n    d = ff(d, a, b, c, k[13], 12, -40341101)\n    c = ff(c, d, a, b, k[14], 17, -1502002290)\n    b = ff(b, c, d, a, k[15], 22, 1236535329)\n\n    a = gg(a, b, c, d, k[1], 5, -165796510)\n    d = gg(d, a, b, c, k[6], 9, -1069501632)\n    c = gg(c, d, a, b, k[11], 14, 643717713)\n    b = gg(b, c, d, a, k[0], 20, -373897302)\n    a = gg(a, b, c, d, k[5], 5, -701558691)\n    d = gg(d, a, b, c, k[10], 9, 38016083)\n    c = gg(c, d, a, b, k[15], 14, -660478335)\n    b = gg(b, c, d, a, k[4], 20, -405537848)\n    a = gg(a, b, c, d, k[9], 5, 568446438)\n    d = gg(d, a, b, c, k[14], 9, -1019803690)\n    c = gg(c, d, a, b, k[3], 14, -187363961)\n    b = gg(b, c, d, a, k[8], 20, 1163531501)\n    a = gg(a, b, c, d, k[13], 5, -1444681467)\n    d = gg(d, a, b, c, k[2], 9, -51403784)\n    c = gg(c, d, a, b, k[7], 14, 1735328473)\n    b = gg(b, c, d, a, k[12], 20, -1926607734)\n\n    a = hh(a, b, c, d, k[5], 4, -378558)\n    d = hh(d, a, b, c, k[8], 11, -2022574463)\n    c = hh(c, d, a, b, k[11], 16, 1839030562)\n    b = hh(b, c, d, a, k[14], 23, -35309556)\n    a = hh(a, b, c, d, k[1], 4, -1530992060)\n    d = hh(d, a, b, c, k[4], 11, 1272893353)\n    c = hh(c, d, a, b, k[7], 16, -155497632)\n    b = hh(b, c, d, a, k[10], 23, -1094730640)\n    a = hh(a, b, c, d, k[13], 4, 681279174)\n    d = hh(d, a, b, c, k[0], 11, -358537222)\n    c = hh(c, d, a, b, k[3], 16, -722521979)\n    b = hh(b, c, d, a, k[6], 23, 76029189)\n    a = hh(a, b, c, d, k[9], 4, -640364487)\n    d = hh(d, a, b, c, k[12], 11, -421815835)\n    c = hh(c, d, a, b, k[15], 16, 530742520)\n    b = hh(b, c, d, a, k[2], 23, -995338651)\n\n    a = ii(a, b, c, d, k[0], 6, -198630844)\n    d = ii(d, a, b, c, k[7], 10, 1126891415)\n    c = ii(c, d, a, b, k[14], 15, -1416354905)\n    b = ii(b, c, d, a, k[5], 21, -57434055)\n    a = ii(a, b, c, d, k[12], 6, 1700485571)\n    d = ii(d, a, b, c, k[3], 10, -1894986606)\n    c = ii(c, d, a, b, k[10], 15, -1051523)\n    b = ii(b, c, d, a, k[1], 21, -2054922799)\n    a = ii(a, b, c, d, k[8], 6, 1873313359)\n    d = ii(d, a, b, c, k[15], 10, -30611744)\n    c = ii(c, d, a, b, k[6], 15, -1560198380)\n    b = ii(b, c, d, a, k[13], 21, 1309151649)\n    a = ii(a, b, c, d, k[4], 6, -145523070)\n    d = ii(d, a, b, c, k[11], 10, -1120210379)\n    c = ii(c, d, a, b, k[2], 15, 718787259)\n    b = ii(b, c, d, a, k[9], 21, -343485551)\n\n    x[0] = add32(a, x[0])\n    x[1] = add32(b, x[1])\n    x[2] = add32(c, x[2])\n    x[3] = add32(d, x[3])\n  }\n\n  function cmn(q: number, a: number, b: any, x: any, s: number, t: any) {\n    a = add32(add32(a, q), add32(x, t))\n    return add32((a << s) | (a >>> (32 - s)), b)\n  }\n\n  function ff(a: any, b: number, c: number, d: number, x: any, s: number, t: number) {\n    return cmn((b & c) | (~b & d), a, b, x, s, t)\n  }\n\n  function gg(a: any, b: number, c: number, d: number, x: any, s: number, t: number) {\n    return cmn((b & d) | (c & ~d), a, b, x, s, t)\n  }\n\n  function hh(a: any, b: number, c: number, d: number, x: any, s: number, t: number) {\n    return cmn(b ^ c ^ d, a, b, x, s, t)\n  }\n\n  function ii(a: any, b: number, c: number, d: number, x: any, s: number, t: number) {\n    return cmn(c ^ (b | ~d), a, b, x, s, t)\n  }\n\n  function md51(s: string) {\n    const n = s.length\n    const state = new Int32Array([1732584193, -271733879, -1732584194, 271733878])\n    let i\n    for (i = 64; i <= s.length; i += 64) {\n      md5cycle(state, md5blk(s.substring(i - 64, i)))\n    }\n    s = s.substring(i - 64)\n    const tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n    for (i = 0; i < s.length; i++) {\n      tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3)\n    }\n    tail[i >> 2] |= 0x80 << ((i % 4) << 3)\n    if (i > 55) {\n      md5cycle(state, tail)\n      for (i = 0; i < 16; i++) tail[i] = 0\n    }\n    tail[14] = n * 8\n    md5cycle(state, tail)\n    return state\n  }\n\n  /* there needs to be support for Unicode here,\n   * unless we pretend that we can redefine the MD-5\n   * algorithm for multi-byte characters (perhaps\n   * by adding every four 16-bit characters and\n   * shortening the sum to 32 bits). Otherwise\n   * I suggest performing MD-5 as if every character\n   * was two bytes--e.g., 0040 0025 = @%--but then\n   * how will an ordinary MD-5 sum be matched?\n   * There is no way to standardize text to something\n   * like UTF-8 before transformation; speed cost is\n   * utterly prohibitive. The JavaScript standard\n   * itself needs to look at this: it should start\n   * providing access to strings as preformed UTF-8\n   * 8-bit unsigned value arrays.\n   */\n  function md5blk(s: string) {\n    /* I figured global was faster.   */\n    const md5blks = [] as number[]\n    let i /* Andy King said do it this way. */\n    for (i = 0; i < 64; i += 4) {\n      md5blks[i >> 2] =\n        s.charCodeAt(i) +\n        (s.charCodeAt(i + 1) << 8) +\n        (s.charCodeAt(i + 2) << 16) +\n        (s.charCodeAt(i + 3) << 24)\n    }\n    return md5blks\n  }\n\n  /* this function is much faster,\n  so if possible we use it. Some IEs\n  are the only ones I know of that\n  need the idiotic second function,\n  generated by an if clause.  */\n\n  function add32(a: number, b: number) {\n    return (a + b) & 0xffffffff\n  }\n\n  return md51(s)\n}\n\nexport function getOfflineUUID(username: string) {\n  const md5Bytes = md5(`OfflinePlayer:${username}`)\n  md5Bytes[6] &= 0x0f /* clear version        */\n  md5Bytes[6] |= 0x30 /* set to version 3     */\n  md5Bytes[8] &= 0x3f /* clear variant        */\n  md5Bytes[8] |= 0x80 /* set to IETF variant  */\n\n  const hex_chr = '0123456789abcdef'.split('')\n\n  function rhex(n: number) {\n    let s = ''\n    let j = 0\n    for (; j < 4; j++) {\n      s += hex_chr[(n >> (j * 8 + 4)) & 0x0f] + hex_chr[(n >> (j * 8)) & 0x0f]\n    }\n    return s\n  }\n\n  function hex(x: Int32Array) {\n    const reuslt = new Array(4) as string[]\n    for (let i = 0; i < x.length; i++) {\n      reuslt[i] = rhex(x[i])\n    }\n    return reuslt.join('')\n  }\n\n  return hex(md5Bytes).replace(/(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})/, '$1-$2-$3-$4-$5')\n}\n", "// eslint-disable-next-line @typescript-eslint/no-redeclare, n/no-unsupported-features/node-builtins\nexport const fetch = globalThis.fetch\n// eslint-disable-next-line n/no-unsupported-features/node-builtins, @typescript-eslint/no-redeclare\nexport const File = globalThis.File\n// eslint-disable-next-line n/no-unsupported-features/node-builtins, @typescript-eslint/no-redeclare\nexport const FormData = globalThis.FormData\n", "/* eslint-disable @typescript-eslint/no-redeclare */\nimport { fetch, FormData } from 'undici'\n\n/**\n * Users defined question when they register this account\n *\n * The question id, content mapping is:\n *\n * 1. What is your favorite pet's name?\n * 2. What is your favorite movie?\n * 3. What is your favorite author's last name?\n * 4. What is your favorite artist's last name?\n * 5. What is your favorite actor's last name?\n * 6. What is your favorite activity?\n * 7. What is your favorite restaurant?\n * 8. What is the name of your favorite cartoon?\n * 9. What is the name of the first school you attended?\n * 10. What is the last name of your favorite teacher?\n * 11. What is your best friend's first name?\n * 12. What is your favorite cousin's name?\n * 13. What was the first name of your first girl/boyfriend?\n * 14. What was the name of your first stuffed animal?\n * 15. What is your mother's middle name?\n * 16. What is your father's middle name?\n * 17. What is your oldest sibling's middle name?\n * 18. In what city did your parents meet?\n * 19. In what hospital were you born?\n * 20. What is your favorite team?\n * 21. How old were you when you got your first computer?\n * 22. How old were you when you got your first gaming console?\n * 23. What was your first video game?\n * 24. What is your favorite card game?\n * 25. What is your favorite board game?\n * 26. What was your first gaming console?\n * 27. What was the first book you ever read?\n * 28. Where did you go on your first holiday?\n * 29. In what city does your grandmother live?\n * 30. In what city does your grandfather live?\n * 31. What is your grandmother's first name?\n * 32. What is your grandfather's first name?\n * 33. What is your least favorite food?\n * 34. What is your favorite ice cream flavor?\n * 35. What is your favorite ice cream flavor?\n * 36. What is your favorite place to visit?\n * 37. What is your dream job?\n * 38. What color was your first pet?\n * 39. What is your lucky number?s\n *\n */\nexport interface MojangChallenge {\n  readonly answer: { id: number }\n  readonly question: { id: number; question: string }\n}\n\nexport interface MojangChallengeResponse {\n  id: number\n  answer: string\n}\nexport interface MinecraftProfileResponse {\n  id: string // the real uuid of the account, woo\n  name: string // the mc user name of the account\n  skins: [\n    {\n      id: string\n      state: 'ACTIVE' | 'string'\n      url: string\n      variant: 'CLASSIC' | string\n      alias: 'STEVE' | string\n    },\n  ]\n  capes: [\n    {\n      id: string\n      state: 'ACTIVE' | string\n      url: string\n    },\n  ]\n}\n\nexport interface MinecraftOwnershipResponse {\n  /**\n   * If the account doesn't own the game, the items array will be empty.\n   */\n  items: Array<{\n    name: 'product_minecraft' | 'game_minecraft'\n    /**\n     * jwt signature\n     */\n    signature: string\n  }>\n  /**\n   * jwt signature\n   */\n  signature: string\n  keyId: string\n}\n\nexport interface MinecraftProfileErrorResponse {\n  path: '/minecraft/profile'\n  errorType: 'NOT_FOUND' | string\n  error: string | 'NOT_FOUND'\n  errorMessage: string\n  developerMessage: string\n}\nexport interface MojangSkin {\n  id: string\n  state: 'ACTIVE' | 'INACTIVE'\n  url: string\n  variant: 'SLIM' | 'CLASSIC'\n}\nexport interface MojangCape {\n  id: string\n  state: 'ACTIVE' | 'INACTIVE'\n  url: string\n  /**\n   * Capes name\n   */\n  alias: string\n}\n\nexport interface MicrosoftMinecraftProfile {\n  id: string\n  name: string\n  skins: MojangSkin[]\n  capes: MojangCape[]\n}\n\nexport interface NameChangeInformation {\n  changedAt: string\n  createdAt: string\n  nameChangeAllowed: boolean\n}\n\nexport enum NameAvailability {\n  DUPLICATE = 'DUPLICATE',\n  AVAILABLE = 'AVAILABLE',\n  NOT_ALLOWED = 'NOT_ALLOWED',\n}\n\nexport class SetNameError extends Error {\n  public path: string\n  public errorType: string\n  public error: string\n  public details: object\n  public errorMessage: string\n  public developerMessage: string\n\n  constructor(message: string, err: any) {\n    super(message)\n    this.name = 'SetNameError'\n    this.path = err.path\n    this.errorType = err.errorType\n    this.error = err.error\n    this.details = err.details\n    this.errorMessage = err.errorMessage\n    this.developerMessage = err.developerMessage\n  }\n}\n\nexport class SetSkinError extends Error {\n  public path: string\n  public errorType: string\n  public error: string\n  public details: object\n  public errorMessage: string\n  public developerMessage: string\n\n  constructor(message: string, err: any) {\n    super(message)\n    this.name = 'SetSkinError'\n    this.path = err.path\n    this.errorType = err.errorType\n    this.error = err.error\n    this.details = err.details\n    this.errorMessage = err.errorMessage\n    this.developerMessage = err.developerMessage\n  }\n}\n\nexport class MojangError extends Error {\n  public path: string\n  public errorMessage: string\n  public developerMessage: string\n\n  constructor(err: any) {\n    super(err.errorMessage)\n    this.path = err.path\n    this.errorMessage = err.errorMessage\n    this.developerMessage = err.developerMessage\n    Object.assign(this, err)\n  }\n}\n\nexport class UnauthorizedError extends MojangError {\n  name = 'UnauthorizedError'\n  constructor(err: any) {\n    super(err)\n  }\n}\n\nexport class ProfileNotFoundError extends MojangError {\n  name = 'ProfileNotFoundError'\n\n  constructor(err: any) {\n    super(err)\n  }\n}\n\nexport interface MojangClientOptions {\n  fetch?: typeof fetch\n  FormData?: typeof FormData\n  File?: typeof File\n}\n\n/**\n * The mojang api client. Please referece https://wiki.vg/Mojang_API.\n *\n * All the apis need user to authenticate the access token from microsoft.\n * @see {@link MicrosoftAuthenticator}\n */\nexport class MojangClient {\n  private fetch: typeof fetch\n  protected FormData: typeof FormData\n  protected File: typeof File\n\n  constructor(options?: MojangClientOptions) {\n    this.fetch = options?.fetch || fetch\n    this.FormData = options?.FormData || FormData\n    this.File = options?.File || File\n  }\n\n  async setName(name: string, token: string, signal?: AbortSignal) {\n    const resp = await this.fetch(\n      `https://api.minecraftservices.com/minecraft/profile/name/${name}`,\n      {\n        method: 'PUT',\n        headers: {\n          Authorization: `Bearer ${token}`,\n        },\n        signal,\n      },\n    )\n    switch (resp.status) {\n      case 200:\n        return (await resp.json()) as MicrosoftMinecraftProfile\n      case 400:\n        throw new SetNameError(\n          'Name is unavailable (Either taken or has not become available)',\n          await resp.json(),\n        )\n      case 403:\n        throw new SetNameError(\n          'Name is unavailable (Either taken or has not become available)',\n          await resp.json(),\n        )\n      case 401:\n        throw new SetNameError(\n          'Unauthorized (Bearer token expired or is not correct)',\n          await resp.json(),\n        )\n      case 429:\n        throw new SetNameError('Too many requests sent', await resp.json())\n      case 500:\n        throw new SetNameError(\n          'Timed out (API lagged out and could not respond)',\n          await resp.json(),\n        )\n    }\n    throw new SetNameError('Unknown error', await resp.json())\n  }\n\n  async getNameChangeInformation(token: string) {\n    const resp = await this.fetch(\n      'https://api.minecraftservices.com/minecraft/profile/namechange',\n      {\n        method: 'GET',\n        headers: {\n          Authorization: `Bearer ${token}`,\n        },\n      },\n    )\n    return (await resp.json()) as NameChangeInformation\n  }\n\n  async checkNameAvailability(\n    name: string,\n    token: string,\n    signal?: AbortSignal,\n  ): Promise<NameAvailability> {\n    const resp = await this.fetch(\n      `https://api.minecraftservices.com/minecraft/profile/name/${name}/available`,\n      {\n        method: 'GET',\n        headers: {\n          Authorization: `Bearer ${token}`,\n        },\n        signal,\n      },\n    )\n    const result = (await resp.json()) as any\n    return result.status\n  }\n\n  async getProfile(token: string, signal?: AbortSignal): Promise<MicrosoftMinecraftProfile> {\n    const resp = await this.fetch('https://api.minecraftservices.com/minecraft/profile', {\n      method: 'GET',\n      headers: {\n        Authorization: `Bearer ${token}`,\n      },\n      signal,\n    })\n    if (resp.headers.get('content-type')?.toLocaleLowerCase() !== 'application/json') {\n      throw new Error(await resp.text())\n    }\n    const json = (await resp.json()) as any\n    if (resp.ok) {\n      return json as MicrosoftMinecraftProfile\n    } else if (json.error === 'NOT_FOUND') {\n      throw new ProfileNotFoundError(json)\n    } else if (resp.status === 401) {\n      throw new UnauthorizedError(json)\n    }\n    throw Object.assign(new Error('Unknown Error'), json)\n  }\n\n  async setSkin(\n    fileName: string,\n    skin: string | Buffer,\n    variant: 'slim' | 'classic',\n    token: string,\n    signal?: AbortSignal,\n  ) {\n    const getSkinFormData = (buf: Buffer, fileName: string, variant: 'slim' | 'classic') => {\n      const form = new this.FormData()\n      form.append('variant', variant)\n      const file = new this.File([buf] as any, fileName, { type: 'image/png' })\n      form.append('file', file)\n      return form\n    }\n    const body =\n      typeof skin === 'string'\n        ? JSON.stringify({ url: skin, variant })\n        : getSkinFormData(skin, fileName, variant)\n    const headers: Record<string, string> = {\n      Authorization: `Bearer ${token}`,\n    }\n\n    if (typeof body === 'string') {\n      headers['Content-Type'] = 'application/json'\n    }\n\n    const resp = await this.fetch('https://api.minecraftservices.com/minecraft/profile/skins', {\n      method: 'POST',\n      headers,\n      body,\n      signal,\n    })\n\n    const profileResponse: MinecraftProfileResponse | MinecraftProfileErrorResponse =\n      (await resp.json()) as any\n\n    if (resp.status === 401) {\n      throw new UnauthorizedError(await resp.json())\n    }\n\n    if ('error' in profileResponse || 'errorMessage' in profileResponse) {\n      throw new SetSkinError(`Fail to set skin ${profileResponse.errorMessage}`, profileResponse)\n    }\n\n    return profileResponse\n  }\n\n  async resetSkin(token: string, signal?: AbortSignal) {\n    const resp = await this.fetch(\n      'https://api.minecraftservices.com/minecraft/profile/skins/active',\n      {\n        method: 'DELETE',\n        headers: {\n          Authorization: `Bearer ${token}`,\n        },\n        signal,\n      },\n    )\n    if (resp.status === 401) {\n      throw new UnauthorizedError(await resp.json())\n    }\n  }\n\n  async hideCape(token: string, signal?: AbortSignal) {\n    const resp = await this.fetch(\n      'https://api.minecraftservices.com/minecraft/profile/capes/active',\n      {\n        method: 'DELETE',\n        headers: {\n          Authorization: `Bearer ${token}`,\n        },\n        signal,\n      },\n    )\n    if (resp.status === 401) {\n      throw new UnauthorizedError(await resp.json())\n    }\n  }\n\n  async showCape(capeId: string, token: string, signal?: AbortSignal) {\n    const resp = await this.fetch(\n      'https://api.minecraftservices.com/minecraft/profile/capes/active',\n      {\n        method: 'PUT',\n        headers: {\n          Authorization: `Bearer ${token}`,\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({ capeId }),\n        signal,\n      },\n    )\n    if (resp.status === 401) {\n      throw new UnauthorizedError(await resp.json())\n    }\n    if (resp.status === 400) {\n      throw new Error()\n    }\n    const profile = (await resp.json()) as MicrosoftMinecraftProfile\n    return profile\n  }\n\n  async verifySecurityLocation(token: string, signal?: AbortSignal) {\n    const resp = await this.fetch('https://api.mojang.com/user/security/location', {\n      method: 'GET',\n      headers: {\n        Authorization: `Bearer ${token}`,\n      },\n      signal,\n    })\n\n    if (resp.status === 204) {\n      return true\n    }\n    return false\n  }\n\n  async getSecurityChallenges(token: string) {\n    const resp = await this.fetch('https://api.mojang.com/user/security/challenges', {\n      method: 'GET',\n      headers: {\n        Authorization: `Bearer ${token}`,\n      },\n    })\n\n    if (resp.status === 401) {\n      throw new UnauthorizedError(await resp.json())\n    }\n    return (await resp.json()) as MojangChallenge[]\n  }\n\n  async submitSecurityChallenges(answers: MojangChallengeResponse[], token: string) {\n    const resp = await this.fetch('https://api.mojang.com/user/security/location', {\n      method: 'POST',\n      headers: {\n        Authorization: `Bearer ${token}`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(answers),\n    })\n\n    if (resp.status === 204) {\n      return\n    }\n    if (resp.status === 401) {\n      throw new UnauthorizedError(await resp.json())\n    }\n    throw new Error()\n  }\n\n  /**\n   * Return the owner ship list of the player with those token.\n   */\n  async checkGameOwnership(token: string, signal?: AbortSignal) {\n    const mcResponse = await this.fetch('https://api.minecraftservices.com/entitlements/mcstore', {\n      headers: {\n        Authorization: `Bearer ${token}`,\n      },\n      signal,\n    })\n\n    if (mcResponse.status === 401) {\n      throw new UnauthorizedError(await mcResponse.text())\n    }\n\n    if (\n      !mcResponse.ok ||\n      mcResponse.headers.get('content-type')?.toLocaleLowerCase() !== 'application/json'\n    ) {\n      throw new Error(await mcResponse.text())\n    }\n\n    const result = (await mcResponse.json()) as MinecraftOwnershipResponse\n\n    return result\n  }\n\n  // ---------- Minecraft Services Friends API ----------\n\n  /**\n   * Fetch the friends list of the current authenticated player.\n   *\n   * Returns `friends`, `incomingRequests` and `outgoingRequests` arrays.\n   *\n   * Throws {@link UnauthorizedError} on 401, {@link MojangFriendsError} on other failures.\n   */\n  async getFriends(token: string, etag?: string, signal?: AbortSignal): Promise<MojangFriendsListResponse | { notModified: true; etag?: string }> {\n    const headers: Record<string, string> = {\n      Authorization: `Bearer ${token}`,\n      Accept: 'application/json',\n    }\n    if (etag) headers['If-None-Match'] = etag\n    const resp = await this.fetch('https://api.minecraftservices.com/friends', {\n      method: 'GET',\n      headers,\n      signal,\n    })\n    if (resp.status === 304) {\n      return { notModified: true, etag: resp.headers.get('etag') ?? etag }\n    }\n    if (resp.status === 401) {\n      throw new UnauthorizedError(await safeJson(resp))\n    }\n    if (!resp.ok) {\n      throw new MojangFriendsError(`Failed to fetch friends list (status ${resp.status})`, resp.status, await safeJson(resp))\n    }\n    const json = (await resp.json()) as MojangFriendsListRaw\n    return normalizeFriendsResponse(json, resp.headers.get('etag') ?? undefined)\n  }\n\n  /**\n   * Add a friend either by Minecraft username or by profile uuid.\n   *\n   * If both are provided, `name` takes precedence.\n   */\n  async addFriend(token: string, target: { name?: string; profileId?: string }, signal?: AbortSignal): Promise<void> {\n    return this.updateFriend(token, { ...target, action: 'ADD' }, signal)\n  }\n\n  /**\n   * Remove a friend (or decline an incoming request, or revoke an outgoing\n   * request) by profile uuid or username.\n   */\n  async removeFriend(token: string, target: { name?: string; profileId?: string }, signal?: AbortSignal): Promise<void> {\n    return this.updateFriend(token, { ...target, action: 'REMOVE' }, signal)\n  }\n\n  private async updateFriend(token: string, options: { name?: string; profileId?: string; action: 'ADD' | 'REMOVE' }, signal?: AbortSignal): Promise<void> {\n    if (!options.name && !options.profileId) {\n      throw new MojangFriendsError('Either name or profileId must be provided', 400, undefined)\n    }\n    const body: Record<string, string> = { updateType: options.action }\n    if (options.name) body.name = options.name\n    if (options.profileId) body.profileId = options.profileId.replace(/-/g, '')\n\n    const resp = await this.fetch('https://api.minecraftservices.com/friends', {\n      method: 'PUT',\n      headers: {\n        Authorization: `Bearer ${token}`,\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(body),\n      signal,\n    })\n    if (resp.status === 200 || resp.status === 204) return\n    if (resp.status === 401) throw new UnauthorizedError(await safeJson(resp))\n    const payload = await safeJson(resp)\n    throw new MojangFriendsError(`Failed to ${options.action.toLowerCase()} friend (status ${resp.status})`, resp.status, payload)\n  }\n\n  /**\n   * Update the player's friend-related preferences.\n   */\n  async updatePlayerAttributes(token: string, prefs: { friendsEnabled?: boolean; acceptInvites?: boolean }, signal?: AbortSignal): Promise<void> {\n    const friendsPreferences: Record<string, 'ENABLED' | 'DISABLED'> = {}\n    if (typeof prefs.friendsEnabled === 'boolean') {\n      friendsPreferences.friends = prefs.friendsEnabled ? 'ENABLED' : 'DISABLED'\n    }\n    if (typeof prefs.acceptInvites === 'boolean') {\n      friendsPreferences.acceptInvites = prefs.acceptInvites ? 'ENABLED' : 'DISABLED'\n    }\n    const resp = await this.fetch('https://api.minecraftservices.com/player/attributes', {\n      method: 'POST',\n      headers: {\n        Authorization: `Bearer ${token}`,\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ friendsPreferences }),\n      signal,\n    })\n    if (resp.status === 200 || resp.status === 204) return\n    if (resp.status === 401) throw new UnauthorizedError(await safeJson(resp))\n    throw new MojangFriendsError(`Failed to update player attributes (status ${resp.status})`, resp.status, await safeJson(resp))\n  }\n\n  /**\n   * Fetch the player's attributes (including friends preferences).\n   */\n  async getPlayerAttributes(token: string, signal?: AbortSignal): Promise<MojangPlayerAttributes> {\n    const resp = await this.fetch('https://api.minecraftservices.com/player/attributes', {\n      method: 'GET',\n      headers: {\n        Authorization: `Bearer ${token}`,\n        Accept: 'application/json',\n      },\n      signal,\n    })\n    if (resp.status === 401) throw new UnauthorizedError(await safeJson(resp))\n    if (!resp.ok) {\n      throw new MojangFriendsError(`Failed to get player attributes (status ${resp.status})`, resp.status, await safeJson(resp))\n    }\n    return (await resp.json()) as MojangPlayerAttributes\n  }\n}\n\n// ---------- Friends helpers ----------\n\nexport interface MojangFriendProfile {\n  /**\n   * The profile uuid (with hyphens stripped, normalized).\n   */\n  profileId: string\n  /**\n   * The Minecraft player name.\n   */\n  name: string\n  /**\n   * Optional ISO-8601 timestamp from the server (when the friendship was added\n   * or when the request was made / expires).\n   */\n  addedAt?: string\n  expiresAt?: string\n}\n\nexport interface MojangFriendsListResponse {\n  friends: MojangFriendProfile[]\n  incomingRequests: MojangFriendProfile[]\n  outgoingRequests: MojangFriendProfile[]\n  /**\n   * The etag returned by the server. Used for `If-None-Match` to skip\n   * unchanged responses (the server replies with 304 in that case).\n   */\n  etag?: string\n}\n\nexport interface MojangPlayerAttributes {\n  privileges?: Record<string, { enabled: boolean }>\n  profanityFilterPreferences?: { profanityFilterOn: boolean }\n  banStatus?: unknown\n  friendsPreferences?: {\n    friends?: 'ENABLED' | 'DISABLED'\n    acceptInvites?: 'ENABLED' | 'DISABLED'\n  }\n}\n\nexport class MojangFriendsError extends Error {\n  name = 'MojangFriendsError'\n  /**\n   * The original error payload returned by the server, when available.\n   */\n  details?: any\n  status: number\n  /**\n   * Sub-status from the `details.status` field on 400 responses (e.g.\n   * `UNKNOWN_PROFILE`, `CANNOT_ADD_SELF`, `DUPLICATED_PROFILES`).\n   */\n  subStatus?: string\n\n  constructor(message: string, status: number, payload: any) {\n    super(message)\n    this.status = status\n    this.details = payload\n    if (payload && typeof payload === 'object') {\n      const details = (payload as any).details\n      if (details && typeof details === 'object' && typeof details.status === 'string') {\n        this.subStatus = details.status\n      }\n      if (typeof (payload as any).errorMessage === 'string') {\n        this.message = (payload as any).errorMessage\n      }\n    }\n  }\n}\n\ninterface MojangFriendsListRaw {\n  friends?: MojangFriendProfileRaw[]\n  // Some API revisions use these, others use incomingFriendRequests / outgoingFriendRequests.\n  incomingRequests?: MojangFriendProfileRaw[]\n  outgoingRequests?: MojangFriendProfileRaw[]\n  incomingFriendRequests?: MojangFriendProfileRaw[]\n  outgoingFriendRequests?: MojangFriendProfileRaw[]\n}\n\ninterface MojangFriendProfileRaw {\n  profileId?: string\n  uuid?: string\n  id?: string\n  name?: string\n  profileName?: string\n  addedAt?: string\n  added?: string\n  expiresAt?: string\n}\n\nfunction normalizeFriendsResponse(raw: MojangFriendsListRaw, etag?: string): MojangFriendsListResponse {\n  const incoming = raw.incomingRequests ?? raw.incomingFriendRequests ?? []\n  const outgoing = raw.outgoingRequests ?? raw.outgoingFriendRequests ?? []\n  return {\n    friends: (raw.friends ?? []).map(normalizeFriendProfile),\n    incomingRequests: incoming.map(normalizeFriendProfile),\n    outgoingRequests: outgoing.map(normalizeFriendProfile),\n    etag,\n  }\n}\n\nfunction normalizeFriendProfile(raw: MojangFriendProfileRaw): MojangFriendProfile {\n  const id = raw.profileId ?? raw.uuid ?? raw.id ?? ''\n  return {\n    profileId: id.replace(/-/g, ''),\n    name: raw.name ?? raw.profileName ?? '',\n    addedAt: raw.addedAt ?? raw.added,\n    expiresAt: raw.expiresAt,\n  }\n}\n\nasync function safeJson(resp: { json: () => Promise<any>; text: () => Promise<string> }): Promise<any> {\n  try {\n    return await resp.json()\n  } catch {\n    try {\n      return { errorMessage: await resp.text() }\n    } catch {\n      return undefined\n    }\n  }\n}\n", "/* eslint-disable n/no-unsupported-features/node-builtins */\nimport { GameProfile, GameProfileWithProperties } from './gameProfile'\n\n/**\n * The auth response format.\n *\n * Please refer https://wiki.vg/Authentication\n */\nexport interface YggrasilAuthentication {\n  /**\n   * hexadecimal or JSON-Web-Token (unconfirmed) [The normal accessToken can be found in the payload of the JWT (second by '.' separated part as Base64 encoded JSON object), in key \"yggt\"]\n   */\n  accessToken: string\n  /**\n   * identical to the one received\n   */\n  clientToken: string\n  /**\n   * only present if the agent field was received\n   */\n  availableProfiles: GameProfile[]\n  /**\n   * only present if the agent field was received\n   */\n  selectedProfile: GameProfile\n  /**\n   * only present if requestUser was true in the request payload\n   */\n  user?: {\n    id: string\n    username: string\n    email?: string\n    registerIp?: string\n    migratedFrom?: string\n    migratedAt?: number\n    registeredAt?: number\n    passwordChangedAt?: number\n    dateOfBirth?: number\n    suspended?: boolean\n    blocked?: boolean\n    secured?: boolean\n    migrated?: boolean\n    emailVerified?: boolean\n    legacyUser?: boolean\n    verifiedByParent?: boolean\n    properties?: object[]\n  }\n}\n\nexport interface YggdrasilClientOptions {\n  headers?: Record<string, string>\n  fetch?: typeof fetch\n  FormData?: typeof FormData\n  File?: typeof File\n}\n\nexport interface ProfileLookupException {\n  /**\n   * - statusCode=204 -> error=\"NoPlayerFound\"\n   * - statusCode=400 -> error=\"IllegalArgumentException\" (parsed from body)\n   * - statusCode=other -> error=statusCode.toString()\n   */\n  error: 'NoPlayerFoundException' | 'IllegalArgumentException' | 'GeneralException'\n  errorMessage?: string | 'Invalid timestamp.'\n  statusCode?: number\n  statusMessage?: string\n}\n\nexport interface SetTextureOption {\n  accessToken: string\n  uuid: string\n  type: 'skin' | 'cape' | 'elytra'\n  texture?:\n    | {\n        url: string\n        metadata?: { model?: 'slim' | 'steve'; [key: string]: any }\n      }\n    | {\n        data: Uint8Array\n        metadata?: { model?: 'slim' | 'steve'; [key: string]: any }\n      }\n}\n\nexport class YggdrasilError extends Error {\n  error: string\n  errorMessage: string\n  cause?: string\n\n  constructor(\n    readonly statusCode: number,\n    message: string,\n    o?: any,\n  ) {\n    super(message)\n    this.name = 'YggdrasilError'\n    this.error = o?.error\n    this.errorMessage = o?.errorMessage\n    this.cause = o?.cause\n  }\n}\n\nexport class YggdrasilClient {\n  protected headers: Record<string, string>\n  protected fetch: typeof fetch\n  protected FormData: typeof FormData\n  protected File: typeof File\n\n  /**\n   * Create client for official-like api endpoint\n   * @param api The official-like api endpoint\n   */\n  constructor(\n    public api: string,\n    options?: YggdrasilClientOptions,\n  ) {\n    this.headers = options?.headers ?? {}\n    this.fetch = options?.fetch || fetch\n    this.FormData = options?.FormData || FormData\n    this.File = options?.File || File\n  }\n\n  async validate(accessToken: string, clientToken: string, signal?: AbortSignal) {\n    const response = await this.fetch(this.api + '/validate', {\n      method: 'POST',\n      body: JSON.stringify({ accessToken, clientToken }),\n      headers: {\n        ...this.headers,\n        'content-type': 'application/json; charset=utf-8',\n      },\n      signal,\n    })\n    return response.ok\n  }\n\n  async invalidate(accessToken: string, clientToken: string, signal?: AbortSignal) {\n    return await this.fetch(this.api + '/invalidate', {\n      method: 'POST',\n      body: JSON.stringify({ accessToken, clientToken }),\n      headers: {\n        ...this.headers,\n        'content-type': 'application/json; charset=utf-8',\n      },\n      signal,\n    }).then((s) => s.ok)\n  }\n\n  async login(\n    {\n      username,\n      password,\n      clientToken,\n      requestUser,\n    }: { username: string; password: string; clientToken: string; requestUser?: boolean },\n    signal?: AbortSignal,\n  ) {\n    const response = await this.fetch(this.api + '/authenticate', {\n      method: 'POST',\n      body: JSON.stringify({\n        agent: { name: 'Minecraft', version: 1 },\n        requestUser: typeof requestUser === 'boolean' ? requestUser : false,\n        username,\n        password,\n        clientToken,\n      }),\n      headers: {\n        ...this.headers,\n        'content-type': 'application/json; charset=utf-8',\n      },\n      signal,\n    })\n\n    if (response.status >= 400) {\n      const body = await response.text()\n      throw new YggdrasilError(\n        response.status,\n        response.status + ':' + body,\n        response.headers.get('content-type')?.startsWith('application/json')\n          ? JSON.parse(body)\n          : undefined,\n      )\n    }\n\n    const authentication: YggrasilAuthentication = (await response.json()) as YggrasilAuthentication\n    return authentication\n  }\n\n  async refresh(\n    {\n      accessToken,\n      requestUser,\n      clientToken,\n    }: { accessToken: string; clientToken: string; requestUser?: boolean },\n    signal?: AbortSignal,\n  ) {\n    const response = await this.fetch(this.api + '/refresh', {\n      method: 'POST',\n      body: JSON.stringify({\n        accessToken,\n        clientToken,\n        requestUser: typeof requestUser === 'boolean' ? requestUser : false,\n      }),\n      headers: {\n        ...this.headers,\n        'content-type': 'application/json; charset=utf-8',\n      },\n      signal,\n    })\n\n    if (response.status >= 400) {\n      const body = await response.text()\n      throw new YggdrasilError(\n        response.status,\n        response.status + ':' + body,\n        response.headers.get('content-type')?.startsWith('application/json')\n          ? JSON.parse(body)\n          : undefined,\n      )\n    }\n\n    const authentication = (await response.json()) as YggrasilAuthentication\n    return authentication\n  }\n}\n\n/**\n * The texture structure for yggdrasil API\n */\nexport interface YggdrasilTexturesInfo {\n  /**\n   * java time in ms\n   */\n  timestamp: number\n  /**\n   * player name\n   */\n  profileName: string\n  /**\n   * player id\n   */\n  profileId: string\n  textures: {\n    SKIN?: YggdrasilTexture\n    CAPE?: YggdrasilTexture\n    ELYTRA?: YggdrasilTexture\n  }\n}\n\n/**\n * The data structure that hold the texture\n */\nexport interface YggdrasilTexture {\n  url: string\n  metadata?: { model?: 'slim' | 'steve'; [key: string]: any }\n}\n\nexport function isTextureSlim(o: YggdrasilTexture) {\n  return o.metadata ? o.metadata.model === 'slim' : false\n}\n\nexport function getTextureType(o: YggdrasilTexture) {\n  return isTextureSlim(o) ? 'slim' : 'steve'\n}\n\nexport class YggdrasilThirdPartyClient extends YggdrasilClient {\n  public profileApi: string\n  public textureApi: string\n  /**\n   * Create thirdparty (authlib-injector) style client\n   * @param api The api url following https://github.com/yushijinhun/authlib-injector/wiki/Yggdrasil-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8A%80%E6%9C%AF%E8%A7%84%E8%8C%83\n   * @param clientToken\n   * @param dispatcher\n   */\n  constructor(api: string, options?: YggdrasilClientOptions) {\n    super(api + '/authserver', options)\n    // eslint-disable-next-line no-template-curly-in-string\n    this.profileApi = api + '/sessionserver/session/minecraft/profile/${uuid}'\n    // this.profileApi = api + '/yggdrasil/sessionserver/session/minecraft/profile/${uuid}'\n    // eslint-disable-next-line no-template-curly-in-string\n    this.textureApi = api + '/api/user/profile/${uuid}/${type}'\n  }\n\n  async lookup(uuid: string, unsigned = true, signal?: AbortSignal) {\n    // eslint-disable-next-line no-template-curly-in-string\n    const url = new URL(this.profileApi.replace('${uuid}', uuid))\n    url.searchParams.append('unsigned', unsigned ? 'true' : 'false')\n    const response = await this.fetch(url.toString(), {\n      method: 'GET',\n      headers: this.headers,\n      signal,\n    })\n    if (response.status !== 200) {\n      const body = await response.text()\n      throw new YggdrasilError(\n        response.status,\n        response.status + ':' + body,\n        response.headers.get('content-type')?.startsWith('application/json')\n          ? JSON.parse(body)\n          : undefined,\n      )\n    }\n    const o = (await response.json()) as any\n    if (o.properties && o.properties instanceof Array) {\n      const properties = o.properties as Array<{ name: string; value: string; signature: string }>\n      const to: { [key: string]: string } = {}\n      for (const prop of properties) {\n        // if (prop.signature && api.publicKey && !await verify(prop.value, prop.signature, api.publicKey)) {\n        // console.warn(`Discard corrupted prop ${prop.name}: ${prop.value} as the signature mismatched!`)\n        // } else {\n        to[prop.name] = prop.value\n        // }\n      }\n      o.properties = to\n    }\n    return o as GameProfileWithProperties\n  }\n\n  async setTexture(options: SetTextureOption, signal?: AbortSignal) {\n    // eslint-disable-next-line no-template-curly-in-string\n    const url = new URL(\n      this.textureApi.replace('${uuid}', options.uuid).replace('${type}', options.type),\n    )\n\n    // eslint-disable-next-line no-undef\n    const requestOptions: RequestInit = {\n      headers: {\n        ...this.headers,\n        Authorization: `Bearer ${options.accessToken}`,\n      },\n      signal,\n    }\n    if (!options.texture) {\n      // delete texture\n      requestOptions.method = 'DELETE'\n    } else if ('data' in options.texture) {\n      requestOptions.method = 'PUT'\n      // upload texture\n      const form = new this.FormData()\n      form.append('model', options.texture.metadata?.model || 'steve')\n      form.append(\n        'file',\n        new this.File([options.texture.data] as any, 'Steve.png', { type: 'image/png' }),\n      )\n      requestOptions.body = form\n    } else if ('url' in options.texture) {\n      // set texture\n      requestOptions.method = 'POST'\n      url.searchParams.append('model', options.texture.metadata?.model || '')\n      url.searchParams.append('url', options.texture.url)\n    } else {\n      throw new TypeError('Illegal Option Format!')\n    }\n\n    const response = await this.fetch(url.toString(), requestOptions)\n    if (response.status === 401) {\n      if (response.headers.get('content-type') === 'application/json') {\n        const body = (await response.json()) as any\n        throw new YggdrasilError(response.status, response.status.toString(), {\n          error: body.error ?? 'Unauthorized',\n          errorMessage: body.errorMessage ?? 'Unauthorized',\n        })\n      } else {\n        const body = await response.text()\n        throw new YggdrasilError(response.status, response.status + ':' + body, {\n          error: 'Unauthorized',\n          errorMessage: 'Unauthorized: ' + body,\n        })\n      }\n    }\n    if (response.status >= 400) {\n      const body = await response.text()\n      throw new YggdrasilError(response.status, response.status + ':' + body, {\n        error: 'SetSkinFailed',\n        errorMessage: 'Fail to set skin ' + body,\n      })\n    }\n  }\n}\n", "/* eslint-disable n/no-unsupported-features/node-builtins */\n/* eslint-disable camelcase */\nexport interface XBoxResponse {\n  IssueInstant: string\n  NotAfter: string\n  Token: string\n  DisplayClaims: {\n    xui: [\n      {\n        /**\n         * gamer tag\n         */\n        gtg: string\n        /**\n         * user id\n         */\n        xid: string\n        uhs: string\n      },\n    ]\n  }\n}\n\nexport interface XBoxPresenceRecord {\n  xuid: string\n  state: 'Online' | 'Offline' | 'Away' | string\n  devices?: Array<{\n    type: string\n    titles?: Array<{\n      id: number\n      name: string\n      placement?: string\n      state?: string\n    }>\n  }>\n}\n\nexport interface XBoxPresenceResponse {\n  userPresence?: XBoxPresenceRecord[]\n}\n\nexport interface XBoxGameProfileResponse {\n  profileUsers: [\n    {\n      id: string\n      hostId: string | null\n      settings: [\n        {\n          id: 'Gamertag'\n          value: string\n        },\n        {\n          id: 'PublicGamerpic'\n          value: string\n        },\n      ]\n      isSponsoredUser: boolean\n    },\n  ]\n}\n\nexport interface MinecraftAuthResponse {\n  username: string // this is not the uuid of the account\n  roles: []\n  access_token: string // jwt, your good old minecraft access token\n  token_type: 'Bearer'\n  expires_in: number\n}\n\nexport interface MicrosoftAuthenticatorOptions {\n  fetch?: typeof fetch\n  xboxDeviceTokenStorage?: XboxDeviceTokenStorage\n}\n\nexport interface XboxDeviceTokenState {\n  id: string\n  privateKey: JsonWebKey\n  token?: Pick<XBoxResponse, 'Token' | 'NotAfter'>\n}\n\nexport interface XboxDeviceTokenStorage {\n  get(): Promise<XboxDeviceTokenState | undefined>\n  put(state: XboxDeviceTokenState): Promise<void>\n}\n\nconst textEncoder = new TextEncoder()\n\nfunction concatBytes(...parts: Uint8Array[]) {\n  const result = new Uint8Array(parts.reduce((size, part) => size + part.length, 0))\n  let offset = 0\n  for (const part of parts) {\n    result.set(part, offset)\n    offset += part.length\n  }\n  return result\n}\n\nfunction uint32(value: number) {\n  const bytes = new Uint8Array(4)\n  new DataView(bytes.buffer).setUint32(0, value)\n  return bytes\n}\n\nfunction uint64(value: bigint) {\n  const bytes = new Uint8Array(8)\n  new DataView(bytes.buffer).setBigUint64(0, value)\n  return bytes\n}\n\nfunction bytesToBase64(bytes: Uint8Array) {\n  return btoa(String.fromCharCode(...bytes))\n}\n\nasync function createXboxSignature(privateKey: CryptoKey, timestamp: bigint, path: string, body: string) {\n  const zero = new Uint8Array([0])\n  const policyVersion = uint32(1)\n  const signatureContent = concatBytes(\n    policyVersion,\n    zero,\n    uint64(timestamp),\n    zero,\n    textEncoder.encode('POST'),\n    zero,\n    textEncoder.encode(path),\n    zero,\n    zero,\n    textEncoder.encode(body),\n    zero,\n  )\n  const signature = new Uint8Array(await crypto.subtle.sign(\n    { name: 'ECDSA', hash: 'SHA-256' },\n    privateKey,\n    signatureContent,\n  ))\n  return bytesToBase64(concatBytes(policyVersion, uint64(timestamp), signature))\n}\n\n/**\n  * Thrown by {@link MicrosoftAuthenticator.loginMinecraftWithXBox} when the\n  * Minecraft auth endpoint returns a non-200 response. Carries enough\n  * context that the launcher can tell the user *exactly* what went wrong\n  * instead of a generic \"loginMinecraftByXboxFailed\" (see issue #1445).\n  *\n  * Retry semantics (for 408/425/429/5xx) are intentionally out of scope of\n  * this module -- compose them on the caller side by wrapping the injected\n  * `fetch` (see ``xmcl-runtime/user/utils/withRetry.ts`` in the launcher).\n  */\nexport class MicrosoftMinecraftXboxLoginError extends Error {\n  name = 'MicrosoftMinecraftXboxLoginError'\n  constructor(\n    public status: number,\n    public body: string,\n    /** Effective Retry-After in ms from the response header, if any. */\n    public retryAfter?: number,\n    /**\n     * True when the status is in the transient set a retrying client would\n     * normally retry (408/425/429/5xx). Useful to tell the user \"try again\n     * in a moment\" vs. \"this is a permanent error\".\n     */\n    public retryable?: boolean,\n  ) {\n    super(`Failed to login minecraft with xbox, status code: ${status}: ${body}}`)\n  }\n}\n\n/**\n * The microsoft authenticator for Minecraft (Xbox) account.\n */\nexport class MicrosoftAuthenticator {\n  fetch: typeof fetch\n  private xboxDeviceTokenStorage?: XboxDeviceTokenStorage\n  private xboxDeviceTokenState: XboxDeviceTokenState | undefined\n  private xboxDeviceTokenStateLoaded = false\n  private xboxDeviceTokenTask: Promise<Pick<XBoxResponse, 'Token' | 'NotAfter'>> | undefined\n\n  constructor(options?: MicrosoftAuthenticatorOptions) {\n    this.fetch = options?.fetch || fetch\n    this.xboxDeviceTokenStorage = options?.xboxDeviceTokenStorage\n  }\n\n  /**\n   * Authenticate with xbox live by ms oauth access token\n   * @param oauthAccessToken The oauth access token\n   */\n  async authenticateXboxLive(oauthAccessToken: string, signal?: AbortSignal) {\n    const xblResponse = await this.fetch('https://user.auth.xboxlive.com/user/authenticate', {\n      method: 'POST',\n      body: JSON.stringify({\n        Properties: {\n          AuthMethod: 'RPS',\n          SiteName: 'user.auth.xboxlive.com',\n          RpsTicket: `d=${oauthAccessToken}`,\n        },\n        RelyingParty: 'http://auth.xboxlive.com',\n        TokenType: 'JWT',\n      }),\n      headers: {\n        'Content-Type': 'application/json',\n        'x-xbl-contract-version': '1',\n      },\n      signal,\n    })\n\n    if (xblResponse.status !== 200) {\n      throw new Error(\n        `Failed to authenticate with xbox live, status code: ${xblResponse.status}: ${await xblResponse.text()}}`,\n      )\n    }\n\n    const result = (await xblResponse.json()) as XBoxResponse\n\n    return result\n  }\n\n  async authenticateXboxDevice(signal?: AbortSignal) {\n    let state = await this.loadXboxDeviceTokenState()\n    let privateKey: CryptoKey\n    if (state?.id && state.privateKey?.d && state.privateKey.x && state.privateKey.y) {\n      try {\n        privateKey = await crypto.subtle.importKey(\n          'jwk',\n          state.privateKey,\n          { name: 'ECDSA', namedCurve: 'P-256' },\n          true,\n          ['sign'],\n        )\n      } catch {\n        state = undefined\n      }\n    }\n    if (!state) {\n      const keyPair = await crypto.subtle.generateKey(\n        { name: 'ECDSA', namedCurve: 'P-256' },\n        true,\n        ['sign', 'verify'],\n      )\n      const privateKeyJwk = await crypto.subtle.exportKey('jwk', keyPair.privateKey)\n      state = {\n        id: crypto.randomUUID(),\n        privateKey: privateKeyJwk,\n      }\n      privateKey = keyPair.privateKey\n    }\n    const body = JSON.stringify({\n      Properties: {\n        DeviceType: 'Win32',\n        Id: `{${state.id}}`,\n        AuthMethod: 'ProofOfPossession',\n        ProofKey: {\n          kty: 'EC',\n          alg: 'ES256',\n          crv: 'P-256',\n          use: 'sig',\n          x: state.privateKey.x,\n          y: state.privateKey.y,\n        },\n      },\n      RelyingParty: 'http://auth.xboxlive.com',\n      TokenType: 'JWT',\n    })\n    const windowsTimestamp = BigInt(Date.now() + 11_644_473_600_000) * 10_000n\n    const response = await this.fetch('https://device.auth.xboxlive.com/device/authenticate', {\n      method: 'POST',\n      body,\n      headers: {\n        'Content-Type': 'application/json',\n        'x-xbl-contract-version': '1',\n        Signature: await createXboxSignature(privateKey!, windowsTimestamp, '/device/authenticate', body),\n      },\n      signal,\n    })\n\n    if (response.status !== 200) {\n      throw new Error(\n        `Failed to authenticate Xbox device, status code: ${response.status}: ${await response.text()}}`,\n      )\n    }\n\n    const token = (await response.json()) as Pick<XBoxResponse, 'Token' | 'NotAfter'>\n    state.token = token\n    this.xboxDeviceTokenState = state\n    await this.xboxDeviceTokenStorage?.put(state)\n    return token\n  }\n\n  private async loadXboxDeviceTokenState() {\n    if (!this.xboxDeviceTokenStateLoaded) {\n      this.xboxDeviceTokenState = await this.xboxDeviceTokenStorage?.get()\n      this.xboxDeviceTokenStateLoaded = true\n    }\n    return this.xboxDeviceTokenState\n  }\n\n  private async acquireXboxDeviceToken(signal?: AbortSignal) {\n    const state = await this.loadXboxDeviceTokenState()\n    const notAfter = state?.token?.NotAfter ? Date.parse(state.token.NotAfter) : Number.NaN\n    if (state?.token?.Token && Number.isFinite(notAfter) && notAfter > Date.now() + 5 * 60_000) {\n      return state.token\n    }\n    if (!this.xboxDeviceTokenTask) {\n      this.xboxDeviceTokenTask = this.authenticateXboxDevice(signal).finally(() => {\n        this.xboxDeviceTokenTask = undefined\n      })\n    }\n    return this.xboxDeviceTokenTask\n  }\n\n  /**\n   * Authorize the xbox live. It will get the xsts token in response.\n   * @param xblResponseToken The {@link XBoxResponse.Token}\n   */\n  async authorizeXboxLive(\n    xblResponseToken: string,\n    relyingParty:\n      | 'rp://api.minecraftservices.com/'\n      | 'http://xboxlive.com' = 'rp://api.minecraftservices.com/',\n    signal?: AbortSignal,\n    deviceToken?: string,\n  ) {\n    const xstsResponse = await this.fetch('https://xsts.auth.xboxlive.com/xsts/authorize', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        Properties: {\n          SandboxId: 'RETAIL',\n          UserTokens: [xblResponseToken],\n          ...(deviceToken ? { DeviceToken: deviceToken } : {}),\n        },\n        RelyingParty: relyingParty,\n        TokenType: 'JWT',\n      }),\n      signal,\n    })\n\n    if (xstsResponse.status !== 200) {\n      const errText = await xstsResponse.text()\n      let errObj = {} as any\n      try {\n        errObj = JSON.parse(errText)\n      } catch (e) {}\n      throw Object.assign(\n        new Error(\n          `Failed to authorize with xbox live, status code: ${xstsResponse.status}: ${errText}}`,\n        ),\n        errObj,\n      )\n    }\n\n    const result = (await xstsResponse.json()) as XBoxResponse\n\n    return result\n  }\n\n  /**\n   * Get xbox user profile, including **username** and **avatar**.\n   *\n   * You can find the parameters from the {@link XBoxResponse}.\n   *\n   * @param xuid The `xuid` in a {@link XBoxResponse.DisplayClaims}\n   * @param uhs The `uhs` in a {@link XBoxResponse.DisplayClaims}\n   * @param xstsToken The {@link XBoxResponse.Token}\n   * @returns The user game profile.\n   */\n  async getXboxGameProfile(xuid: string, uhs: string, xstsToken: string, signal?: AbortSignal) {\n    const url = new URL(`https://profile.xboxlive.com/users/xuid(${xuid})/profile/settings`)\n    url.searchParams.append('settings', ['PublicGamerpic', 'Gamertag'].join(','))\n    const response = await this.fetch(url.toString(), {\n      headers: {\n        'x-xbl-contract-version': '2',\n        'content-type': 'application/json',\n        Authorization: `XBL3.0 x=${uhs};${xstsToken}`,\n      },\n      signal,\n    })\n\n    if (response.status !== 200) {\n      throw new Error(\n        `Failed to get xbox game profile, status code: ${response.status}: ${await response.text()}}`,\n      )\n    }\n\n    const result = (await response.json()) as XBoxGameProfileResponse\n    return result\n  }\n\n  /**\n   * Fetch Xbox Live presence status for a list of xuids or single xuid.\n   *\n   * @param xuids Array of Xbox User IDs (xuid)\n   * @param uhs The `uhs` in {@link XBoxResponse.DisplayClaims}\n   * @param xstsToken The {@link XBoxResponse.Token}\n   */\n  async getXboxPresence(xuids: string[], uhs: string, xstsToken: string, signal?: AbortSignal): Promise<XBoxPresenceRecord[]> {\n    if (xuids.length === 0) return []\n    const response = await this.fetch('https://presence.xboxlive.com/users/batch', {\n      method: 'POST',\n      headers: {\n        'x-xbl-contract-version': '3',\n        'content-type': 'application/json',\n        Authorization: `XBL3.0 x=${uhs};${xstsToken}`,\n      },\n      body: JSON.stringify({\n        users: xuids,\n        level: 'all',\n      }),\n      signal,\n    })\n\n    if (response.status !== 200) {\n      return []\n    }\n\n    try {\n      const result = (await response.json()) as XBoxPresenceResponse | XBoxPresenceRecord[]\n      if (Array.isArray(result)) return result\n      if (result && Array.isArray((result as XBoxPresenceResponse).userPresence)) {\n        return (result as XBoxPresenceResponse).userPresence!\n      }\n      return []\n    } catch {\n      return []\n    }\n  }\n\n  /**\n   * Acquire both Minecraft and xbox token and xbox game profile.\n   * You can use the xbox token to login Minecraft by {@link loginMinecraftWithXBox}.\n   *\n   * This method is the composition of calling\n   * - {@link authenticateXboxLive}\n   * - {@link authorizeXboxLive} to `rp://api.minecraftservices.com/`\n   * - {@link authorizeXboxLive} to `http://xboxlive.com`\n   * - {@link getXboxGameProfile}\n   *\n   * You can call them individually if you want a more detailed control.\n   *\n   * @param oauthAccessToken The microsoft access token\n   * @param signal The abort signal\n   * @returns The object contain xstsResponse (minecraft xbox token) and xbox game profile\n   */\n  async acquireXBoxToken(oauthAccessToken: string, signal?: AbortSignal) {\n    const xblResponse: XBoxResponse = await this.authenticateXboxLive(oauthAccessToken, signal)\n    const deviceToken = (await this.acquireXboxDeviceToken(signal)).Token\n    const minecraftXstsResponse = await this.authorizeXboxLive(\n      xblResponse.Token,\n      'rp://api.minecraftservices.com/',\n      signal,\n      deviceToken,\n    )\n    // The `http://xboxlive.com` relying party is only needed to fetch the\n    // Xbox avatar/gamertag. Some accounts that legitimately own Minecraft\n    // (missing full Xbox Live profile, region/age restrictions, etc.) can\n    // authorize `rp://api.minecraftservices.com/` but fail here. The official\n    // launcher never requests this relying party, which is why those users\n    // report \"it runs fine in the regular launcher\". Treat it as optional so\n    // a failure here never blocks an otherwise valid login -- the caller just\n    // won't get an Xbox avatar.\n    const xstsResponse: XBoxResponse | undefined = await this.authorizeXboxLive(\n      xblResponse.Token,\n      'http://xboxlive.com',\n      signal,\n      deviceToken,\n    ).catch(() => undefined)\n\n    return { minecraftXstsResponse, liveXstsResponse: xstsResponse }\n  }\n\n  /**\n   * This will return the response with Minecraft access token!\n   *\n   * This access token allows us to launch the game, but, we haven't actually checked if the account owns the game. Everything until here works with a normal Microsoft account!\n   *\n   * @param uhs uhs from {@link XBoxResponse} of {@link acquireXBoxToken}\n   * @param xstsToken You need to get this token from {@link acquireXBoxToken}\n   */\n  /**\n    * Login Minecraft with an Xbox token. This method does exactly one HTTP\n    * attempt -- if you need retry/backoff for transient failures (408, 425,\n    * 429, 5xx), compose it on the caller side by wrapping the `fetch` you\n    * inject into this authenticator. On any non-200 the method throws a\n    * {@link MicrosoftMinecraftXboxLoginError} that carries `status`,\n    * `body`, parsed `retryAfter` (ms) and a `retryable` flag so the UI can\n    * surface a precise message (see issue #1445).\n    *\n    * @param uhs uhs from {@link XBoxResponse} of {@link acquireXBoxToken}\n    * @param xstsToken You need to get this token from {@link acquireXBoxToken}\n    */\n  async loginMinecraftWithXBox(uhs: string, xstsToken: string, signal?: AbortSignal) {\n    const mcResponse = await this.fetch(\n      'https://api.minecraftservices.com/authentication/login_with_xbox',\n      {\n        method: 'POST',\n        body: JSON.stringify({\n          identityToken: `XBL3.0 x=${uhs};${xstsToken}`,\n        }),\n        headers: {\n          'content-type': 'application/json',\n        },\n        signal,\n      },\n    )\n\n    if (mcResponse.status === 200) {\n      return (await mcResponse.json()) as MinecraftAuthResponse\n    }\n\n    const transientStatuses = new Set([408, 425, 429, 500, 502, 503, 504])\n    const body = await mcResponse.text()\n    // Parse Retry-After (seconds or HTTP-date) so the UI can show a sensible\n    // wait hint when the caller's retry budget has been exhausted.\n    let retryAfterMs: number | undefined\n    const retryAfter = mcResponse.headers.get('retry-after')\n    if (retryAfter) {\n      const asInt = parseInt(retryAfter, 10)\n      if (!Number.isNaN(asInt)) {\n        retryAfterMs = asInt * 1000\n      } else {\n        const dateMs = Date.parse(retryAfter)\n        if (!Number.isNaN(dateMs)) {\n          retryAfterMs = Math.max(0, dateMs - Date.now())\n        }\n      }\n    }\n\n    throw new MicrosoftMinecraftXboxLoginError(\n      mcResponse.status,\n      body,\n      retryAfterMs,\n      transientStatuses.has(mcResponse.status),\n    )\n  }\n}\n"],
  "mappings": "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",
  "names": ["s", "fetch", "File", "FormData", "NameAvailability", "fetch", "FormData", "fileName", "variant"]
}
