{"version":3,"sources":["../../../src/utils/api/basic.ts"],"sourcesContent":["import { type APIDefaults } from \".\";\nimport { pack } from \"..\";\n\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type Res<T = any> =\n  | { success: false; error: { msg: string; [key: string]: any } }\n  | ({ success: true } & T);\n\nexport const basic = (defaults: APIDefaults) => {\n  return {\n    get: async <T = any>({\n      token,\n      uri,\n      headers = {},\n      json = false\n    }: {\n      token?: string | null;\n      uri: string;\n      headers?: Record<string, string>;\n      json?: boolean;\n    }): Promise<Res<T>> => {\n      let res: Response;\n      try {\n        res = await fetch(`https://tetr.io/api/${uri}`, {\n          headers: {\n            Accept: json\n              ? \"application/json\"\n              : \"application/vnd.osk.theorypack\",\n            \"User-Agent\": defaults.userAgent,\n            cookie: `${defaults.turnstile ? \"cf_clearance=\" + defaults.turnstile : \"\"}`,\n            Authorization:\n              token === null ? undefined : `Bearer ${token || defaults.token}`,\n            ...headers\n          } as any\n        });\n      } catch (err: any) {\n        throw new Error(`Fetch failed on GET to ${uri}: ${err.message || err}`);\n      }\n\n      const copy = res.clone();\n      try {\n        return json\n          ? ((await res.json()) as Res<T>)\n          : pack.unpack(Buffer.from(await res.arrayBuffer()));\n      } catch {\n        if (res.status === 429)\n          throw new Error(`Rate limit (429) on GET to ${uri}`);\n        else {\n          try {\n            await fs.readdir(path.join(os.homedir(), \".trianglejs\", \"errors\"));\n          } catch {\n            await fs.mkdir(path.join(os.homedir(), \".trianglejs\", \"errors\"), {\n              recursive: true\n            });\n          }\n          const now = Date.now();\n          const text = await copy.text();\n          await fs.writeFile(\n            path.join(os.homedir(), \".trianglejs\", \"errors\", `${now}.html`),\n            text\n          );\n          if (copy.status === 404) throw new Error(`404 on GET to ${uri}`);\n\n          if (text.includes(\"<title>Server error</title>\"))\n            throw new Error(\n              `The TETR.IO Servers are currently unavailable. Check https://status.osk.sh for updates. You can view more information at ${path.join(\n                os.homedir(),\n                \".trianglejs\",\n                \"errors\",\n                `${now}.html`\n              )}`\n            );\n          if (text.includes(\"<title>Maintenance</title>\"))\n            throw new Error(\n              `The TETR.IO Servers are under maintanence. Check https://status.osk.sh for updates. You can view more information at ${path.join(\n                os.homedir(),\n                \".trianglejs\",\n                \"errors\",\n                `${now}.html`\n              )}`\n            );\n          else\n            throw new Error(\n              `An error occured. This was likely because it the request was blocked by Cloudflare Turnstile on GET to ${uri}. Try passing in a turnstile token. View the error at ${path.join(\n                os.homedir(),\n                \".trianglejs\",\n                \"errors\",\n                `${now}.html`\n              )}`\n            );\n        }\n      }\n    },\n\n    post: async <T = any>({\n      token,\n      uri,\n      body,\n      headers = {},\n      json = false\n    }: {\n      token?: string;\n      uri: string;\n      body: Record<string, any>;\n      headers?: Record<string, string>;\n      json?: boolean;\n    }): Promise<Res<T>> => {\n      let res: Response;\n      try {\n        res = await fetch(`https://tetr.io/api/${uri}`, {\n          method: \"POST\",\n          //@ts-ignore\n          body: json ? JSON.stringify(body) : pack.pack(body),\n          headers: {\n            Accept: json\n              ? \"application/json\"\n              : \"application/vnd.osk.theorypack\",\n            \"User-Agent\": defaults.userAgent,\n            cookie: `${defaults.turnstile ? \"cf_clearance=\" + defaults.turnstile : \"\"}`,\n            \"Content-Type\": json\n              ? \"application/json\"\n              : \"application/vnd.osk.theorypack\",\n\n            Authorization:\n              token === null ? undefined : `Bearer ${token || defaults.token}`,\n            ...headers\n          } as any\n        });\n      } catch (err: any) {\n        throw new Error(\n          `Fetch failed on POST to ${uri}: ${err.message || err}`\n        );\n      }\n\n      const copy = res.clone();\n      try {\n        return json\n          ? ((await res.json()) as Res<T>)\n          : pack.unpack(Buffer.from(await res.arrayBuffer()));\n      } catch {\n        if (res.status === 429)\n          throw new Error(`Rate limit (429) on GET to ${uri}`);\n        else {\n          try {\n            await fs.readdir(path.join(os.homedir(), \".trianglejs\", \"errors\"));\n          } catch {\n            await fs.mkdir(path.join(os.homedir(), \".trianglejs\", \"errors\"), {\n              recursive: true\n            });\n          }\n          const now = Date.now();\n          const text = await copy.text();\n          await fs.writeFile(\n            path.join(os.homedir(), \".trianglejs\", \"errors\", `${now}.html`),\n            text\n          );\n          console.log(text);\n          if (copy.status === 404) throw new Error(`404 on POST to ${uri}`);\n          if (text.includes(\"<title>Maintenance</title>\"))\n            throw new Error(\n              `The TETR.IO Servers are under maintanence. Check https://status.osk.sh for updates. You can view more information at ${path.join(\n                os.homedir(),\n                \".trianglejs\",\n                \"errors\",\n                `${now}.html`\n              )}`\n            );\n          else\n            throw new Error(\n              `An error occured. This was likely because the request was blocked by Cloudflare Turnstile on GET to ${uri}. Try passing in a turnstile token. View the error at ${path.join(\n                os.homedir(),\n                \".trianglejs\",\n                \"errors\",\n                `${now}.html`\n              )}`\n            );\n        }\n      }\n    }\n  };\n};\n\nexport type Get = ReturnType<typeof basic>[\"get\"];\nexport type Post = ReturnType<typeof basic>[\"post\"];\n"],"names":["pack","fs","os","path","basic","defaults","get","token","uri","headers","json","res","fetch","Accept","userAgent","cookie","turnstile","Authorization","undefined","err","Error","message","copy","clone","unpack","Buffer","from","arrayBuffer","status","readdir","join","homedir","mkdir","recursive","now","Date","text","writeFile","includes","post","body","method","JSON","stringify","console","log"],"mappings":"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"}