@vectry/js-core
Version:
Universal JavaScript SDK core for Vectry Analytics. Enables structured event capture, enrichment, validation, and transport across environments.
1 lines • 25.8 kB
Source Map (JSON)
{"version":3,"sources":["../src/services/base/api.service.ts","../src/services/observation/event.service.ts","../src/config/environmentMap.ts","../src/config/defaultConfig.ts","../src/config/runtimeConfig.ts","../src/utils/timestamp.ts","../src/utils/object.ts","../src/utils/detect-mutation.ts","../src/core/enrich.ts","../src/core/validate.ts","../src/core/capture.ts","../src/services/observation/event-explanation.service.ts","../src/services/execution/trace.service.ts","../src/services/execution/causal-thread.service.ts","../src/services/analysis/anomaly.service.ts","../src/sdk/VectryCore.ts"],"sourcesContent":["import { VectryConfig } from '../../interfaces';\nimport { Response } from '../../types/response';\n\nexport interface EndpointMap {\n get?: string;\n create?: string;\n update?: string;\n delete?: string;\n patch?: string;\n put?: string;\n [key: string]: string | undefined;\n}\n\nexport interface IApiService {\n config: VectryConfig,\n baseUrl: string, \n endpoints: EndpointMap\n}\n\nexport abstract class ApiService {\n protected apiServiceConfig: VectryConfig;\n protected endpointUrl: string;\n protected endpoints: EndpointMap;\n\n constructor(apiServiceParameters: IApiService) {\n this.apiServiceConfig = apiServiceParameters.config;\n this.endpointUrl = apiServiceParameters.baseUrl;\n this.endpoints = apiServiceParameters.endpoints;\n }\n\n protected objectToQueryString(obj: any): string {\n if (!obj || typeof obj !== 'object') return '';\n const build = (o: any, prefix = ''): string[] =>\n Object.keys(o).flatMap((key) => {\n const k = prefix ? `${prefix}[${key}]` : key;\n const v = o[key];\n if (v && typeof v === 'object') return build(v, k);\n return `${encodeURIComponent(k)}=${encodeURIComponent(v ?? '')}`;\n });\n\n const query = build(obj).join('&');\n return query ? `?${query}` : '';\n }\n\n async getByParameters(data: { queryselector: string; [key: string]: any }): Promise<Response | undefined> {\n if (!data?.queryselector) throw new Error('Missing queryselector');\n\n const query = this.objectToQueryString(data);\n const fullPath = `${this.apiServiceConfig.baseUrl}${this.endpointUrl}${this.endpoints.get ?? ''}${data.queryselector}${query}`;\n\n return this.apiServiceConfig?.transport?.get(fullPath, {});\n }\n\n async create(payload: any): Promise<Response | undefined> {\n const fullPath = `${this.apiServiceConfig.baseUrl}${this.endpointUrl}${this.endpoints.create ?? ''}`;\n return this.apiServiceConfig?.transport?.post(fullPath, payload);\n }\n\n async update(payload: any): Promise<Response | undefined> {\n const fullPath = `${this.apiServiceConfig.baseUrl}${this.endpointUrl}${this.endpoints.update ?? ''}`;\n return this.apiServiceConfig?.transport?.patch(fullPath, payload);\n }\n\n async delete(payload: any): Promise<Response | undefined> {\n const fullPath = `${this.apiServiceConfig.baseUrl}${this.endpointUrl}${this.endpoints.delete ?? ''}`;\n return this.apiServiceConfig?.transport?.delete(fullPath, payload);\n }\n\n async post(payload: any, endpoint?: string): Promise<Response | undefined> {\n const fullPath = `${this.apiServiceConfig.baseUrl}${this.endpointUrl}${endpoint ?? this.endpoints.post ?? ''}`;\n return this.apiServiceConfig?.transport?.post(fullPath, payload);\n }\n\n async put(payload: any, endpoint?: string): Promise<Response | undefined> {\n const fullPath = `${this.apiServiceConfig.baseUrl}${this.endpointUrl}${endpoint ?? this.endpoints.put ?? ''}`;\n return this.apiServiceConfig?.transport?.put(fullPath, payload);\n }\n\n async patch(payload: any, endpoint?: string): Promise<Response | undefined> {\n const fullPath = `${this.apiServiceConfig.baseUrl}${this.endpointUrl}${endpoint ?? this.endpoints.patch ?? ''}`;\n return this.apiServiceConfig?.transport?.patch(fullPath, payload);\n }\n}\n","import { VectryConfig } from '../../interfaces';\nimport { Event, Response } from '../../types';\nimport { ApiService } from '../base/api.service';\n\nexport class EventService extends ApiService {\n constructor(config: VectryConfig) {\n super({\n config,\n baseUrl: '/causal/observation/event',\n endpoints: {\n get: '/',\n create: '',\n update: '',\n delete: ''\n }\n });\n }\n\n /**\n * Fetches events based on custom filtering parameters.\n * @param data An object containing the query selector and filters.\n */\n async getByParameters(data: { queryselector: string; [key: string]: any }): Promise<Response | undefined> {\n return super.getByParameters(data);\n }\n\n /**\n * Sends a new event to the backend.\n * @param payload Event data to be created.\n */\n async create(payload: Partial<Event>): Promise<Response | undefined> {\n return super.create(payload);\n }\n\n /**\n * Updates an existing event.\n * @param payload Event data to be updated.\n */\n async update(payload: Partial<Event>): Promise<Response | undefined> {\n return super.update(payload);\n }\n\n /**\n * Deletes an event.\n * @param payload Identifier or full object of the event to delete.\n */\n async delete(payload: Partial<Event>): Promise<Response | undefined> {\n return super.delete(payload);\n }\n}\n","export const EnvironmentBaseUrls: Record<string, string> = {\n local: 'http://localhost:3101',\n development: 'https://vectry-backend-svc-dev.azurewebsites.net',\n production: 'https://api.vectry.io'\n};\n","import { VectryConfig } from \"../interfaces\";\nimport { EnvironmentBaseUrls } from \"./environmentMap\";\n\nexport const defaultConfig: VectryConfig = {\n organizationId: '',\n vectryEnvironment: 'production',\n baseUrl: EnvironmentBaseUrls['production'],\n contextProvider: async () => ({ user: { id: 'anonymous' } }),\n autoFlush: true,\n flushIntervalMs: 10000,\n enrichers: [],\n};\n","import { VectryConfig } from '../interfaces';\nimport { defaultConfig } from './defaultConfig';\n\nlet currentConfig: VectryConfig = { ...defaultConfig };\n\n/**\n * Retrieves the current Vectry runtime configuration.\n * @returns {VectryConfig}\n */\nexport function getRuntimeConfig(): VectryConfig {\n return currentConfig;\n}\n\n/**\n * Merges and updates the runtime configuration.\n * @param config Partial configuration to override defaults.\n */\nexport function setRuntimeConfig(config: Partial<VectryConfig>) {\n currentConfig = {\n ...defaultConfig,\n ...currentConfig,\n ...config,\n };\n}\n","export function getCurrentTimestamp(): string {\n return new Date().toISOString();\n}\n\nexport function normalizeTimestamp(input: string | number | Date): string {\n if (input instanceof Date) return input.toISOString();\n if (typeof input === 'number') return new Date(input).toISOString();\n return new Date(input).toISOString();\n}\n","export function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n }\n \n export function isEmptyObject(obj: Record<string, any>): boolean {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n }\n ","export interface IMutationInput {\n original: Record<string, any>;\n updated: Record<string, any>;\n ignoreProperties?: string[];\n}\n\n/**\n * Compares two object snapshots and returns a structured mutation result.\n * Ignores any keys specified in `ignoreProperties`.\n * If no differences are found, returns null.\n *\n * @param input Object containing `original`, `updated` and optional `ignoreProperties`\n * @returns A mutation object with only the fields that changed, or null\n */\nexport function detectMutation(input: IMutationInput): IMutationInput | null {\n const { original, updated, ignoreProperties = [] } = input;\n const originalDiff: Record<string, any> = {};\n const updatedDiff: Record<string, any> = {};\n\n function compare(key: string, a: any, b: any): boolean {\n if (ignoreProperties.includes(key)) return false;\n\n const bothObjects = typeof a === 'object' && typeof b === 'object' && a !== null && b !== null;\n\n if (bothObjects && !Array.isArray(a) && !Array.isArray(b)) {\n const nested = detectMutation({ original: a, updated: b, ignoreProperties });\n if (nested) {\n originalDiff[key] = nested.original;\n updatedDiff[key] = nested.updated;\n return true;\n }\n return false;\n }\n\n const isDifferent = JSON.stringify(a) !== JSON.stringify(b);\n if (isDifferent) {\n originalDiff[key] = a;\n updatedDiff[key] = b;\n }\n\n return isDifferent;\n }\n\n const keys = new Set([...Object.keys(original || {}), ...Object.keys(updated || {})]);\n\n let hasDiff = false;\n for (const key of keys) {\n if (compare(key, original?.[key], updated?.[key])) {\n hasDiff = true;\n }\n }\n\n return hasDiff ? { original: originalDiff, updated: updatedDiff } : null;\n}\n","\nimport { Event } from '../types';\nimport { getCurrentTimestamp } from '../utils';\n\n\n/**\n * Enriches an Event with system-generated fields like id, created timestamp,\n * and ensures required nested objects are present.\n * \n * @param event - Partial input provided by the integrator.\n * @returns Complete Event object, ready to be validated and sent.\n */\nexport function enrichEvent(event: Event): Event {\n return {\n ...event,\n created: {\n user: { id: 'anonymous' }, // Can be replaced by context provider later\n timestamp: getCurrentTimestamp(),\n },\n status: {\n id: 1,\n name: 'active',\n title: 'Active',\n },\n metadata: event.metadata ?? {},\n context: event.context ?? {},\n };\n}\n","import { Event } from '../types';\n\nexport function validateEvent(event: Event): void {\n const requiredFields = [\n 'organization_id',\n 'namespace',\n 'actor_id',\n 'actor_type'\n ];\n\n const missing = requiredFields.filter((field) => !(event as any)[field]);\n if (missing.length > 0) {\n throw new Error(`Missing required event fields: ${missing.join(', ')}`);\n }\n}\n","import { Event, Response } from '../types';\nimport { EventService } from '../services/observation/event.service';\nimport { getRuntimeConfig } from '../config/runtimeConfig';\nimport { enrichEvent } from './enrich';\nimport { validateEvent } from './validate';\n\nexport async function capture(event: Event): Promise<Response | undefined> {\n const config = getRuntimeConfig();\n if (!config.transport) {\n throw new Error('Transport not initialized in runtime config.');\n }\n\n const enriched = enrichEvent(event);\n validateEvent(enriched);\n\n const service = new EventService(config);\n return await service.create(enriched);\n}\n","import { VectryConfig } from '../../interfaces';\nimport { EventExplanation, Response } from '../../types';\nimport { ApiService } from '../base/api.service';\n\nexport class EventExplanationService extends ApiService {\n constructor(config: VectryConfig) {\n super({\n config,\n baseUrl: '/causal/observation/event',\n endpoints: {\n get: '/',\n create: '',\n update: '',\n delete: ''\n }\n });\n }\n\n /**\n * Fetches events based on custom filtering parameters.\n * @param data An object containing the query selector and filters.\n */\n async getByParameters(data: {\n queryselector: string;\n [key: string]: any;\n }): Promise<Response | undefined> {\n return super.getByParameters(data);\n }\n\n /**\n * Sends a new event to the backend.\n * @param payload EventExplanation data to be created.\n */\n async create(payload: Partial<EventExplanation>): Promise<Response | undefined> {\n return super.create(payload);\n }\n\n /**\n * Updates an existing event.\n * @param payload EventExplanation data to be updated.\n */\n async update(payload: Partial<EventExplanation>): Promise<Response | undefined> {\n return super.update(payload);\n }\n\n /**\n * Deletes an event.\n * @param payload Identifier or full object of the event to delete.\n */\n async delete(payload: Partial<EventExplanation>): Promise<Response | undefined> {\n return super.delete(payload);\n }\n}\n","import { VectryConfig } from '../../interfaces';\nimport { Response, Trace } from '../../types';\nimport { ApiService } from '../base/api.service';\n\nexport class TraceService extends ApiService {\n constructor(config: VectryConfig) {\n super({\n config,\n baseUrl: '/causal/observation/event',\n endpoints: {\n get: '/',\n create: '',\n update: '',\n delete: ''\n }\n });\n }\n\n /**\n * Fetches events based on custom filtering parameters.\n * @param data An object containing the query selector and filters.\n */\n async getByParameters(data: { queryselector: string; [key: string]: any }): Promise<Response | undefined> {\n return super.getByParameters(data);\n }\n\n /**\n * Sends a new event to the backend.\n * @param payload Trace data to be created.\n */\n async create(payload: Partial<Trace>): Promise<Response | undefined> {\n return super.create(payload);\n }\n\n /**\n * Updates an existing event.\n * @param payload Trace data to be updated.\n */\n async update(payload: Partial<Trace>): Promise<Response | undefined> {\n return super.update(payload);\n }\n\n /**\n * Deletes an event.\n * @param payload Identifier or full object of the event to delete.\n */\n async delete(payload: Partial<Trace>): Promise<Response | undefined> {\n return super.delete(payload);\n }\n}\n","import { VectryConfig } from '../../interfaces';\nimport { CausalThread, Response } from '../../types';\nimport { ApiService } from '../base/api.service';\n\nexport class CausalThreadService extends ApiService {\n constructor(config: VectryConfig) {\n super({\n config,\n baseUrl: '/causal/observation/event',\n endpoints: {\n get: '/',\n create: '',\n update: '',\n delete: ''\n }\n });\n }\n\n /**\n * Fetches events based on custom filtering parameters.\n * @param data An object containing the query selector and filters.\n */\n async getByParameters(data: {\n queryselector: string;\n [key: string]: any;\n }): Promise<Response | undefined> {\n return super.getByParameters(data);\n }\n\n /**\n * Sends a new event to the backend.\n * @param payload CausalThread data to be created.\n */\n async create(payload: Partial<CausalThread>): Promise<Response | undefined> {\n return super.create(payload);\n }\n\n /**\n * Updates an existing event.\n * @param payload CausalThread data to be updated.\n */\n async update(payload: Partial<CausalThread>): Promise<Response | undefined> {\n return super.update(payload);\n }\n\n /**\n * Deletes an event.\n * @param payload Identifier or full object of the event to delete.\n */\n async delete(payload: Partial<CausalThread>): Promise<Response | undefined> {\n return super.delete(payload);\n }\n}\n","import { VectryConfig } from '../../interfaces';\nimport { Anomaly, Response } from '../../types';\nimport { ApiService } from '../base/api.service';\n\nexport class AnomalyService extends ApiService {\n constructor(config: VectryConfig) {\n super({\n config,\n baseUrl: '/causal/observation/event',\n endpoints: {\n get: '/',\n create: '',\n update: '',\n delete: ''\n }\n });\n }\n\n /**\n * Fetches events based on custom filtering parameters.\n * @param data An object containing the query selector and filters.\n */\n async getByParameters(data: { queryselector: string; [key: string]: any }): Promise<Response | undefined> {\n return super.getByParameters(data);\n }\n\n /**\n * Sends a new event to the backend.\n * @param payload Anomaly data to be created.\n */\n async create(payload: Partial<Anomaly>): Promise<Response | undefined> {\n return super.create(payload);\n }\n\n /**\n * Updates an existing event.\n * @param payload Anomaly data to be updated.\n */\n async update(payload: Partial<Anomaly>): Promise<Response | undefined> {\n return super.update(payload);\n }\n\n /**\n * Deletes an event.\n * @param payload Identifier or full object of the event to delete.\n */\n async delete(payload: Partial<Anomaly>): Promise<Response | undefined> {\n return super.delete(payload);\n }\n}\n","import { ITransport, VectryConfig } from '../interfaces';\nimport { capture as coreCapture } from '../core/capture';\nimport {\n AnomalyService,\n CausalThreadService,\n EventExplanationService,\n EventService,\n TraceService\n} from '../services';\nimport { setRuntimeConfig } from '../config/runtimeConfig';\nimport { defaultConfig } from '../config/defaultConfig';\nimport { detectMutation } from '../utils';\n\nexport class VectryCore {\n private transport: ITransport | undefined;\n \n public detectMutation = detectMutation;\n\n public organizationId?: string;\n\n public event: EventService;\n public trace: TraceService;\n public thread: CausalThreadService;\n public eventExplanation: EventExplanationService;\n public anomaly: AnomalyService;\n\n constructor(args: VectryConfig) {\n this.transport = args.transport;\n this.organizationId = args.organizationId;\n\n setRuntimeConfig({\n ...defaultConfig,\n ...args\n });\n\n this.event = new EventService({ transport: this.transport } as VectryConfig);\n this.trace = new TraceService({ transport: this.transport } as VectryConfig);\n this.thread = new CausalThreadService({ transport: this.transport } as VectryConfig);\n this.eventExplanation = new EventExplanationService({ transport: this.transport } as VectryConfig);\n this.anomaly = new AnomalyService({ transport: this.transport } as VectryConfig);\n }\n\n /**\n * Captures a raw event and sends it to Vectry using the core handler.\n * Automatically enriches, validates, and dispatches the event.\n */\n async capture(event: any) {\n if (!event) {\n throw new Error('Event cannot be null or undefined');\n }\n\n return coreCapture(event);\n }\n}\n"],"mappings":"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","names":[]}