import { errorToString } from '@threekit/diagnostics'; import { healthcheck } from '../../../operators/healthCheck.js'; import type { ThreekitAxiosContext } from '../../../operators/HttpContext.js'; import { request } from '../../../operators/request.js'; import type { ThreekitAuthProps } from '../../../ThreekitAuthProps.js'; import { createLocalAxios } from '../utils/createLocalAxios.js'; import { objectToPayload } from '../utils/payload.js'; import { type JobEvent, jobEventTypeToEventZod } from './JobEvents.js'; import { type SessionEvent, sessionEventTypeToEventZod } from './SessionEvents.js'; export type PlatformVersion = { host: string; version: string; }; const DEBUG = false; const API_ROUTE = `api/analytics`; const API_HOST = DEBUG ? 'localhost:4005' : 'analytics.alpha.3kit.com'; const API_PROTOCOL = DEBUG ? 'http://' : 'https://'; export class Analytics2 { context: ThreekitAxiosContext; constructor(auth: ThreekitAuthProps) { this.context = { axios: createLocalAxios({ protocol: API_PROTOCOL, host: API_HOST }), auth, urlPrefix: API_ROUTE }; } healthcheck() { return healthcheck(this.context); } reportSessionEvent(event: SessionEvent) { // validate event using Zod, it if fails validation, throw the error const eventType = event.eventType; const eventZod = sessionEventTypeToEventZod[eventType]; if (eventZod === undefined) { throw new Error(`Invalid session eventType: ${eventType}`); } try { eventZod.parse(event); } catch (error) { console.log('error', errorToString(error), { event }); throw error; } // emit as window event, if we are running on the client side if (typeof window !== 'undefined') { window.dispatchEvent( new CustomEvent('threekit-analytics', { detail: event }) ); } return request(this.context, { method: 'GET', url: 'report-event', params: { payload: objectToPayload(event), payloadVersion: '1' } }); } reportJobEvent(event: JobEvent) { // validate event using Zod, it if fails validation, throw the error const eventType = event.eventType; const eventZod = jobEventTypeToEventZod[eventType]; if (eventZod === undefined) { throw new Error(`Invalid job eventType: ${eventType}`); } try { eventZod.parse(event); } catch (error) { console.log('error', errorToString(error), { event }); throw error; } return request(this.context, { method: 'GET', url: 'report-job-event', params: { payload: objectToPayload(event), payloadVersion: '1' } }); } }