{"version":3,"sources":["../../src/utilities/authProviders.ts","../../src/utilities/hash.ts","../../src/utilities/json.ts","../../src/utilities/media.ts","../../src/utilities/random.ts","../../src/utilities/retry.ts"],"sourcesContent":["import axios from 'axios'\nimport jwt from 'jsonwebtoken'\nimport jwksClient from 'jwks-rsa'\n\nimport { EquippedError } from '../errors'\n\nexport const signinWithGoogle = async (idToken: string) => {\n\tconst authUrl = `https://oauth2.googleapis.com/tokeninfo?id_token=${idToken}`\n\tconst { data } = await axios.get(authUrl).catch((err) => {\n\t\tthrow new EquippedError('Failed to sign in with google', { idToken }, err)\n\t})\n\tdata.first_name = data.given_name\n\tdata.last_name = data.family_name\n\treturn data as {\n\t\temail: string\n\t\temail_verified: 'true' | 'false'\n\t\tfirst_name: string\n\t\tlast_name: string\n\t\tpicture: string\n\t\tsub: string\n\t} & Record<string, any>\n}\n\nexport const signinWithApple = async (idToken: string) => {\n\ttry {\n\t\tconst APPLE_BASE = 'https://appleid.apple.com'\n\t\tconst json = jwt.decode(idToken, { complete: true })\n\t\tif (!json?.header) throw new EquippedError('Missing JWT header', { idToken, json })\n\t\tconst { kid, alg } = json.header\n\t\tconst publicKey = await jwksClient({ jwksUri: `${APPLE_BASE}/auth/keys`, cache: true })\n\t\t\t.getSigningKey(kid)\n\t\t\t.then((key) => key.getPublicKey())\n\t\t\t.catch(() => null)\n\t\tif (!publicKey) throw new EquippedError('no publicKey', { idToken, publicKey, json })\n\t\tconst data = jwt.verify(idToken, publicKey, { algorithms: [alg as any] }) as Record<string, any>\n\t\tif (!data) throw new EquippedError('no data', { idToken, data })\n\t\tif (data.iss !== APPLE_BASE) throw new EquippedError('iss doesnt match', { idToken, data })\n\t\tif (data.exp * 1000 < Date.now()) throw new EquippedError('expired idToken', { idToken, data })\n\t\t// TODO: Find out how to get profile data from api\n\t\treturn data as {\n\t\t\temail?: string\n\t\t\tsub: string\n\t\t\temail_verified?: 'true' | 'false'\n\t\t\tis_private_email?: 'true' | 'false'\n\t\t} & Record<string, any>\n\t} catch (err) {\n\t\tthrow new EquippedError('Failed to sign in with apple', { idToken }, err)\n\t}\n}\n\nexport const signinWithFacebook = async (accessToken: string, fields = [] as string[]) => {\n\tfields = [...new Set([...fields, 'name', 'picture', 'email'])]\n\tconst { data } = await axios\n\t\t.request({\n\t\t\tmethod: 'get',\n\t\t\turl: 'https://graph.facebook.com/v15.0/me',\n\t\t\tparams: {\n\t\t\t\tfields: fields.join(','),\n\t\t\t\taccess_token: accessToken,\n\t\t\t},\n\t\t})\n\t\t.catch((err) => {\n\t\t\tthrow new EquippedError('Failed to sign in with facebook', { accessToken, fields }, err)\n\t\t})\n\tconst isValidData = fields.every((key) => key in data)\n\tif (!isValidData) throw new EquippedError('Incomplete scope for access token', { accessToken, fields, data })\n\tdata.email_verified = 'true'\n\treturn data as {\n\t\tid: string\n\t\temail: string\n\t\temail_verified: 'true' | 'false'\n\t\tname: string\n\t\tpicture: {\n\t\t\tdata: { height: number; is_silhouette: boolean; url: string; width: number }\n\t\t}\n\t} & Record<string, any>\n}\n","import * as bcrypt from 'bcryptjs'\n\nimport { Instance } from '../instance'\n\nexport const hash = async (password: string) => {\n\tpassword = password.trim()\n\tif (!password) return ''\n\treturn await bcrypt.hash(password, Instance.get().settings.utils.hashSaltRounds)\n}\n\nexport const compare = async (plainPassword: string, hashed: string) => {\n\tplainPassword = plainPassword.trim()\n\tif (!plainPassword && plainPassword === hashed) return true\n\treturn await bcrypt.compare(plainPassword, hashed)\n}\n","export const parseJSONValue = (data: any) => {\n\ttry {\n\t\tif (data?.constructor?.name !== 'String') return data\n\t\treturn JSON.parse(data)\n\t} catch {\n\t\treturn data\n\t}\n}\n","import { parseBuffer } from 'music-metadata'\n\nexport const getMediaDuration = async (buffer: Buffer) => {\n\ttry {\n\t\tconst meta = await parseBuffer(buffer)\n\t\treturn meta.format.duration ?? 0\n\t} catch {\n\t\treturn 0\n\t}\n}\n","import crypto from 'crypto'\n\nexport function string(length = 20) {\n\treturn crypto.randomBytes(length).toString('hex').slice(0, length)\n}\n\nexport function number(min = 0, max = 2 ** 48 - 1) {\n\treturn crypto.randomInt(min, max)\n}\n","import { EquippedError } from '../errors'\n\nexport const sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const retry = async <T>(cb: () => Promise<{ done: true; value: T } | { done: false }>, tries: number, waitTimeInMs: number) => {\n\tif (tries <= 0) throw new EquippedError('out of tries', { tries, waitTimeInMs })\n\tconst result = await cb()\n\tif (result.done === true) return result.value\n\tawait sleep(waitTimeInMs)\n\treturn await retry(cb, tries - 1, waitTimeInMs)\n}\n"],"mappings":"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","names":["compare","hash","hash","compare"]}