@ezbot-ai/javascript-sdk
Version:
The easiest way to interact with ezbot via JS (node and browser)
146 lines • 12.8 kB
JavaScript
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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