UNPKG

@ezbot-ai/javascript-sdk

Version:

The easiest way to interact with ezbot via JS (node and browser)

146 lines 12.8 kB
import { Agent as HttpAgent, request as httpRequest, } from 'http'; import { Agent as HttpsAgent, request as httpsRequest } from 'https'; import { URL } from 'url'; export function extractUtmFromSearchParams(obj) { return { utmSource: Array.isArray(obj.utm_source) ? obj.utm_source[0] : obj.utm_source, utmMedium: Array.isArray(obj.utm_medium) ? obj.utm_medium[0] : obj.utm_medium, utmCampaign: Array.isArray(obj.utm_campaign) ? obj.utm_campaign[0] : obj.utm_campaign, utmContent: Array.isArray(obj.utm_content) ? obj.utm_content[0] : obj.utm_content, utmTerm: Array.isArray(obj.utm_term) ? obj.utm_term[0] : obj.utm_term, }; } export function buildQueryParams(params) { const processedParams = { projectId: typeof params.projectId === 'number' ? params.projectId.toString() : params.projectId, sessionId: params.sessionId ?? generateSessionId(), pageUrlPath: params.pageUrlPath ?? '/', domainSessionIdx: params.domainSessionIdx, utmContent: params.utmContent ?? 'unknown', utmMedium: params.utmMedium ?? 'unknown', utmSource: params.utmSource ?? 'unknown', utmCampaign: params.utmCampaign ?? 'unknown', utmTerm: params.utmTerm ?? 'unknown', referrer: params.referrer ?? 'unknown', tz: params.tz ?? Intl.DateTimeFormat().resolvedOptions().timeZone, }; return Object.entries(processedParams) .filter(([, value]) => value !== undefined) .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`) .join('&'); } export const DEFAULT_API_BASE_URL = 'https://api.ezbot.ai'; export function createEzbotClient(options) { const { baseUrl = DEFAULT_API_BASE_URL, timeoutMs = 500, agentOptions, } = options; const isHttpsBase = new URL(baseUrl).protocol === 'https:'; const agent = isHttpsBase ? new HttpsAgent({ keepAlive: true, maxSockets: 50, maxFreeSockets: 10, ...agentOptions, }) : new HttpAgent({ keepAlive: true, maxSockets: 50, maxFreeSockets: 10, ...agentOptions, }); async function makeRequest(url, meta) { /* eslint-disable functional/no-return-void */ return new Promise((resolve, reject) => { const parsedUrl = new URL(url); const isHttps = parsedUrl.protocol === 'https:'; const defaultOrigin = meta?.referrer ? new URL(meta.referrer).origin : undefined; const headers = { accept: '*/*', 'accept-language': 'en-US,en;q=0.9', origin: meta?.origin || defaultOrigin || '', referer: meta?.referrer || '', 'user-agent': meta?.userAgent || '', ...meta?.headers, }; const requestOptions = { hostname: parsedUrl.hostname, port: parsedUrl.port || (isHttps ? 443 : 80), path: parsedUrl.pathname + parsedUrl.search, method: 'GET', agent, headers, }; const req = (isHttps ? httpsRequest : httpRequest)(requestOptions, (res) => { res.setEncoding('utf8'); // eslint-disable-next-line functional/no-let let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { resolve({ status: res.statusCode || 0, statusText: res.statusMessage || '', json: async () => JSON.parse(data || '{}'), }); }); }); req.on('error', (err) => reject(err)); // Socket timeout slightly above overall timeout to let race resolve first req.setTimeout(Math.max(timeoutMs, 100), () => { req.destroy(new Error('Request socket timeout')); }); req.end(); // Overall timeout guard if (timeoutMs > 0) { setTimeout(() => { try { req.destroy(); } catch { /* noop */ } reject(new Error('Request timeout')); }, timeoutMs); } }); /* eslint-enable functional/no-return-void */ } return { async getPredictions(params, meta) { const url = new URL('/predict', baseUrl).toString(); const qp = buildQueryParams(params); const fullUrl = `${url}?${qp}`; try { const response = await makeRequest(fullUrl, meta); if (response.status !== 200) { throw new Error(`Failed to fetch predictions: ${response.status}`); } const responseJSON = await response.json(); return responseJSON.predictions; } catch (e) { // For server-side callers, degrade gracefully return []; } }, dispose() { agent.destroy(); return undefined; }, }; } export function generateSessionId() { return `ssr-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyUHJlZGljdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NlcnZlclByZWRpY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxLQUFLLElBQUksU0FBUyxFQUNsQixPQUFPLElBQUksV0FBVyxHQUV2QixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFLE9BQU8sSUFBSSxZQUFZLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDckUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEtBQUssQ0FBQztBQTZDMUIsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxHQUFrRDtJQUtsRCxPQUFPO1FBQ0wsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUN0QyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVO1FBQ2xCLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFDdEMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVTtRQUNsQixXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1lBQzFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVk7UUFDcEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUN4QyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDcEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXO1FBQ25C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