UNPKG

bgutils-js

Version:

A JavaScript library for interfacing with Botguard.

8 lines (7 loc) 25.8 kB
{ "version": 3, "sources": ["../dist/index.js", "../dist/core/index.js", "../dist/core/challengeFetcher.js", "../dist/utils/constants.js", "../dist/utils/helpers.js", "../dist/core/webPoClient.js", "../dist/core/botGuardClient.js", "../dist/core/webPoMinter.js"], "sourcesContent": ["import * as BG from './core/index.js';\nexport { BG };\nexport default BG;\nexport * from './utils/index.js';\n", "export * as Challenge from './challengeFetcher.js';\nexport * as PoToken from './webPoClient.js';\nexport { default as WebPoMinter } from './webPoMinter.js';\nexport { default as BotGuardClient } from './botGuardClient.js';\n", "import { base64ToU8, BGError, buildURL, getHeaders } from '../utils/index.js';\n/**\n * Creates a challenge.\n * @param bgConfig - The config.\n * @param interpreterHash - The ID of the challenge script. If provided, the server will assume that\n * the client already has the script and will not return it.\n * @returns The challenge data.\n */\nexport async function create(bgConfig, interpreterHash) {\n const requestKey = bgConfig.requestKey;\n if (!bgConfig.fetch)\n throw new BGError('BAD_CONFIG', 'No fetch function provided');\n const payload = [requestKey];\n if (interpreterHash)\n payload.push(interpreterHash);\n const response = await bgConfig.fetch(buildURL('Create', bgConfig.useYouTubeAPI), {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(payload)\n });\n if (!response.ok)\n throw new BGError('REQUEST_FAILED', 'Failed to fetch challenge', { status: response.status });\n const rawData = await response.json();\n return parseChallengeData(rawData);\n}\n/**\n * Parses the challenge data from the provided response data.\n */\nexport function parseChallengeData(rawData) {\n let challengeData = [];\n if (rawData.length > 1 && typeof rawData[1] === 'string') {\n const descrambled = descramble(rawData[1]);\n challengeData = JSON.parse(descrambled || '[]');\n }\n else if (rawData.length && typeof rawData[0] === 'object') {\n challengeData = rawData[0];\n }\n const [messageId, wrappedScript, wrappedUrl, interpreterHash, program, globalName, , clientExperimentsStateBlob] = challengeData;\n const privateDoNotAccessOrElseSafeScriptWrappedValue = Array.isArray(wrappedScript) ? wrappedScript.find((value) => value && typeof value === 'string') : null;\n const privateDoNotAccessOrElseTrustedResourceUrlWrappedValue = Array.isArray(wrappedUrl) ? wrappedUrl.find((value) => value && typeof value === 'string') : null;\n return {\n messageId,\n interpreterJavascript: {\n privateDoNotAccessOrElseSafeScriptWrappedValue,\n privateDoNotAccessOrElseTrustedResourceUrlWrappedValue\n },\n interpreterHash,\n program,\n globalName,\n clientExperimentsStateBlob\n };\n}\n/**\n * Descrambles the given challenge data.\n */\nexport function descramble(scrambledChallenge) {\n const buffer = base64ToU8(scrambledChallenge);\n if (buffer.length)\n return new TextDecoder().decode(buffer.map((b) => b + 97));\n}\n", "export const GOOG_BASE_URL = 'https://jnn-pa.googleapis.com';\nexport const YT_BASE_URL = 'https://www.youtube.com';\nexport const GOOG_API_KEY = 'AIzaSyDyT5W0Jh49F30Pqqtyfdf7pDLFKLJoAnw';\nexport const USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36(KHTML, like Gecko)';\n", "import { GOOG_API_KEY, GOOG_BASE_URL, USER_AGENT, YT_BASE_URL } from './constants.js';\nconst base64urlCharRegex = /[-_.]/g;\nconst base64urlToBase64Map = {\n '-': '+',\n _: '/',\n '.': '='\n};\nexport class DeferredPromise {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\nexport class BGError extends TypeError {\n constructor(code, message, info) {\n super(message);\n this.name = 'BGError';\n this.code = code;\n if (info)\n this.info = info;\n }\n}\nexport function base64ToU8(base64) {\n let base64Mod;\n if (base64urlCharRegex.test(base64)) {\n base64Mod = base64.replace(base64urlCharRegex, function (match) {\n return base64urlToBase64Map[match];\n });\n }\n else {\n base64Mod = base64;\n }\n base64Mod = atob(base64Mod);\n return new Uint8Array([...base64Mod].map((char) => char.charCodeAt(0)));\n}\nexport function u8ToBase64(u8, base64url = false) {\n const result = btoa(String.fromCharCode(...u8));\n if (base64url) {\n return result\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n }\n return result;\n}\nexport function isBrowser() {\n const isBrowser = typeof window !== 'undefined'\n && typeof window.document !== 'undefined'\n && typeof window.document.createElement !== 'undefined'\n && typeof window.HTMLElement !== 'undefined'\n && typeof window.navigator !== 'undefined'\n && typeof window.getComputedStyle === 'function'\n && typeof window.requestAnimationFrame === 'function'\n && typeof window.matchMedia === 'function';\n const hasValidWindow = Object.getOwnPropertyDescriptor(globalThis, 'window')?.get?.toString().includes('[native code]') ?? false;\n return isBrowser && hasValidWindow;\n}\nexport function getHeaders() {\n const headers = {\n 'content-type': 'application/json+protobuf',\n 'x-goog-api-key': GOOG_API_KEY,\n 'x-user-agent': 'grpc-web-javascript/0.1'\n };\n if (!isBrowser()) {\n headers['user-agent'] = USER_AGENT;\n }\n return headers;\n}\nexport function buildURL(endpointName, useYouTubeAPI) {\n return `${useYouTubeAPI ? YT_BASE_URL : GOOG_BASE_URL}/${useYouTubeAPI ? 'api/jnn/v1' : '$rpc/google.internal.waa.v1.Waa'}/${endpointName}`;\n}\n", "import BotGuardClient from './botGuardClient.js';\nimport WebPoMinter from './webPoMinter.js';\nimport { base64ToU8, buildURL, u8ToBase64, getHeaders, BGError } from '../utils/index.js';\n/**\n * Generates a Proof of Origin Token.\n * @param args - The arguments for generating the token.\n */\nexport async function generate(args) {\n const { program, bgConfig, globalName } = args;\n const { identifier } = bgConfig;\n const botguard = await BotGuardClient.create({ program, globalName, globalObj: bgConfig.globalObj });\n const webPoSignalOutput = [];\n const botguardResponse = await botguard.snapshot({ webPoSignalOutput });\n const payload = [bgConfig.requestKey, botguardResponse];\n const integrityTokenResponse = await bgConfig.fetch(buildURL('GenerateIT', bgConfig.useYouTubeAPI), {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(payload)\n });\n const integrityTokenJson = await integrityTokenResponse.json();\n const [integrityToken, estimatedTtlSecs, mintRefreshThreshold, websafeFallbackToken] = integrityTokenJson;\n const integrityTokenData = {\n integrityToken,\n estimatedTtlSecs,\n mintRefreshThreshold,\n websafeFallbackToken\n };\n const webPoMinter = await WebPoMinter.create(integrityTokenData, webPoSignalOutput);\n const poToken = await webPoMinter.mintAsWebsafeString(identifier);\n return { poToken, integrityTokenData };\n}\n/**\n * Creates a cold start token. This can be used while `sps` (StreamProtectionStatus) is 2, but will not work once it changes to 3.\n * @param identifier - Visitor ID or Data Sync ID.\n * @param clientState - The client state.\n */\nexport function generateColdStartToken(identifier, clientState) {\n const encodedIdentifier = new TextEncoder().encode(identifier);\n if (encodedIdentifier.length > 118)\n throw new BGError('BAD_INPUT', 'Content binding is too long.', { identifierLength: encodedIdentifier.length });\n const timestamp = Math.floor(Date.now() / 1000);\n const randomKeys = [Math.floor(Math.random() * 256), Math.floor(Math.random() * 256)];\n // NOTE: The \"0\" value before the client state is supposed to be someVal & 0xFF.\n // It is always 0 though, so I didn't bother investigating further.\n const header = randomKeys.concat([\n 0, (clientState ?? 1)\n ], [\n (timestamp >> 24) & 0xFF,\n (timestamp >> 16) & 0xFF,\n (timestamp >> 8) & 0xFF,\n timestamp & 0xFF\n ]);\n const packet = new Uint8Array(2 + header.length + encodedIdentifier.length);\n packet[0] = 34;\n packet[1] = header.length + encodedIdentifier.length;\n packet.set(header, 2);\n packet.set(encodedIdentifier, 2 + header.length);\n const payload = packet.subarray(2);\n const keyLength = randomKeys.length;\n for (let i = keyLength; i < payload.length; i++) {\n payload[i] ^= payload[i % keyLength];\n }\n return u8ToBase64(packet, true);\n}\n/**\n * @deprecated Use `generateColdStartToken` instead.\n */\nexport function generatePlaceholder(identifier, clientState) {\n return generateColdStartToken(identifier, clientState);\n}\n/**\n * Decodes a cold start webpo token.\n * @throws Error if the packet length is invalid.\n */\nexport function decodeColdStartToken(token) {\n const packet = base64ToU8(token);\n const payloadLength = packet[1];\n const totalPacketLength = 2 + payloadLength;\n if (packet.length !== totalPacketLength)\n throw new BGError('BAD_INPUT', 'Invalid packet length.', { packetLength: packet.length, expectedLength: totalPacketLength });\n const payload = packet.subarray(2);\n // Decrypt the payload by reversing the XOR operation\n const keyLength = 2;\n for (let i = keyLength; i < payload.length; ++i) {\n payload[i] ^= payload[i % keyLength];\n }\n const keys = [payload[0], payload[1]];\n const unknownVal = payload[2]; // The masked property I mentioned in the function above\n const clientState = payload[3];\n const timestamp = (payload[4] << 24) |\n (payload[5] << 16) |\n (payload[6] << 8) |\n payload[7];\n const date = new Date(timestamp * 1000);\n const identifier = new TextDecoder().decode(payload.subarray(8));\n return {\n identifier,\n timestamp,\n unknownVal,\n clientState,\n keys,\n date\n };\n}\n", "import { BGError, DeferredPromise } from '../utils/index.js';\nexport default class BotGuardClient {\n constructor(options) {\n this.deferredVmFunctions = new DeferredPromise();\n this.defaultTimeout = 3000;\n this.userInteractionElement = options.userInteractionElement;\n this.vm = options.globalObj[options.globalName];\n this.program = options.program;\n }\n /**\n * Factory method to create and load a BotGuardClient instance.\n * @param options - Configuration options for the BotGuardClient.\n * @returns A promise that resolves to a loaded BotGuardClient instance.\n */\n static async create(options) {\n return await new BotGuardClient(options).load();\n }\n async load() {\n if (!this.vm)\n throw new BGError('VM_INIT', 'VM not found');\n if (!this.vm.a)\n throw new BGError('VM_INIT', 'VM init function not found');\n const vmFunctionsCallback = (asyncSnapshotFunction, shutdownFunction, passEventFunction, checkCameraFunction) => {\n this.deferredVmFunctions.resolve({\n asyncSnapshotFunction,\n shutdownFunction,\n passEventFunction,\n checkCameraFunction\n });\n };\n try {\n this.syncSnapshotFunction = await this.vm.a(this.program, vmFunctionsCallback, true, this.userInteractionElement, () => { }, [[], []])[0];\n }\n catch (error) {\n throw new BGError('VM_ERROR', 'Could not load program', { error });\n }\n return this;\n }\n /**\n * Takes a snapshot asynchronously.\n * @returns The snapshot result.\n * @example\n * ```ts\n * const result = await botguard.snapshot({\n * contentBinding: {\n * c: \"a=6&a2=10&b=SZWDwKVIuixOp7Y4euGTgwckbJA&c=1729143849&d=1&t=7200&c1a=1&c6a=1&c6b=1&hh=HrMb5mRWTyxGJphDr0nW2Oxonh0_wl2BDqWuLHyeKLo\",\n * e: \"ENGAGEMENT_TYPE_VIDEO_LIKE\",\n * encryptedVideoId: \"P-vC09ZJcnM\"\n * }\n * });\n *\n * console.log(result);\n * ```\n */\n async snapshot(args, timeout = 3000) {\n return await Promise.race([\n new Promise(async (resolve, reject) => {\n const vmFunctions = await this.deferredVmFunctions.promise;\n if (!vmFunctions.asyncSnapshotFunction)\n return reject(new BGError('ASYNC_SNAPSHOT', 'Asynchronous snapshot function not found'));\n await vmFunctions.asyncSnapshotFunction((response) => resolve(response), [\n args.contentBinding,\n args.signedTimestamp,\n args.webPoSignalOutput,\n args.skipPrivacyBuffer\n ]);\n }),\n new Promise((_, reject) => setTimeout(() => reject(new BGError('TIMEOUT', 'VM operation timed out')), timeout))\n ]);\n }\n /**\n * Passes an event to the VM.\n * @throws Error Throws an error if the pass event function is not found.\n */\n async passEvent(args, timeout = this.defaultTimeout) {\n return await Promise.race([\n (async () => {\n const vmFunctions = await this.deferredVmFunctions.promise;\n if (!vmFunctions.passEventFunction)\n throw new BGError('PASS_EVENT', 'Pass event function not found');\n vmFunctions.passEventFunction(args);\n })(),\n new Promise((_, reject) => setTimeout(() => reject(new BGError('TIMEOUT', 'VM operation timed out')), timeout))\n ]);\n }\n /**\n * Checks the \"camera\".\n * @throws Error Throws an error if the check camera function is not found.\n */\n async checkCamera(args, timeout = this.defaultTimeout) {\n return await Promise.race([\n (async () => {\n const vmFunctions = await this.deferredVmFunctions.promise;\n if (!vmFunctions.checkCameraFunction)\n throw new BGError('CHECK_CAMERA', 'Check camera function not found');\n vmFunctions.checkCameraFunction(args);\n })(),\n new Promise((_, reject) => setTimeout(() => reject(new BGError('TIMEOUT', 'VM operation timed out')), timeout))\n ]);\n }\n /**\n * Shuts down the VM. Taking a snapshot after this will throw an error.\n * @throws Error Throws an error if the shutdown function is not found.\n */\n async shutdown(timeout = this.defaultTimeout) {\n return await Promise.race([\n (async () => {\n const vmFunctions = await this.deferredVmFunctions.promise;\n if (!vmFunctions.shutdownFunction)\n throw new BGError('SHUTDOWN', 'Shutdown function not found');\n vmFunctions.shutdownFunction();\n })(),\n new Promise((_, reject) => setTimeout(() => reject(new BGError('TIMEOUT', 'VM operation timed out')), timeout))\n ]);\n }\n /**\n * Takes a snapshot synchronously.\n * @returns The snapshot result.\n * @throws Error Throws an error if the synchronous snapshot function is not found.\n */\n async snapshotSynchronous(args) {\n if (!this.syncSnapshotFunction)\n throw new BGError('SYNC_SNAPSHOT', 'Synchronous snapshot function not found');\n return this.syncSnapshotFunction([\n args.contentBinding,\n args.signedTimestamp,\n args.webPoSignalOutput,\n args.skipPrivacyBuffer\n ]);\n }\n}\n", "import { base64ToU8, BGError, u8ToBase64 } from '../utils/helpers.js';\nexport default class WebPoMinter {\n constructor(mintCallback) {\n this.mintCallback = mintCallback;\n }\n static async create(integrityTokenResponse, webPoSignalOutput) {\n const getMinter = webPoSignalOutput[0];\n if (!getMinter)\n throw new BGError('VM_ERROR', 'PMD:Undefined');\n if (!integrityTokenResponse.integrityToken)\n throw new BGError('INTEGRITY_ERROR', 'No integrity token provided', { integrityTokenResponse });\n const mintCallback = await getMinter(base64ToU8(integrityTokenResponse.integrityToken));\n if (!(mintCallback instanceof Function))\n throw new BGError('VM_ERROR', 'APF:Failed');\n return new WebPoMinter(mintCallback);\n }\n async mintAsWebsafeString(identifier) {\n const result = await this.mint(identifier);\n return u8ToBase64(result, true);\n }\n async mint(identifier) {\n const result = await this.mintCallback(new TextEncoder().encode(identifier));\n if (!result)\n throw new BGError('VM_ERROR', 'YNJ:Undefined');\n if (!(result instanceof Uint8Array))\n throw new BGError('VM_ERROR', 'ODM:Invalid');\n return result;\n }\n}\n"], "mappings": "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", "names": ["isBrowser"] }