@project-sunbird/telemetry-sdk 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/TelemetryConfig.ts","../src/utils/Dispatcher.ts","../src/utils/Utils.ts","../src/core/TelemetrySyncManager.ts","../src/services/Validator.ts","../src/schema/telemetry-spec.json","../src/services/DeviceService.ts","../src/utils/DeviceInfo.ts","../src/core/Telemetry.ts","../src/index.ts"],"sourcesContent":["export interface TelemetryConfig {\n pdata: { id: string; ver: string; pid?: string };\n env: string;\n channel: string;\n did?: string;\n authtoken?: string;\n uid?: string;\n sid?: string;\n batchsize?: number;\n mode?: string;\n host?: string;\n endpoint?: string;\n tags?: string[];\n cdata?: Array<{ type: string; id: string }>;\n dispatcher?: { dispatch: (event: any) => void };\n enableValidation?: boolean;\n timeDiff?: number;\n runningEnv?: string;\n object?: { id: string; ver: string; rollup?: any };\n rollup?: any;\n}\n\nexport const defaultConfig: Partial<TelemetryConfig> = {\n pdata: { id: 'sunbird', ver: '1.0' },\n env: 'contentplayer',\n channel: 'sunbird',\n uid: 'anonymous',\n authtoken: '',\n batchsize: 20,\n host: 'https://api.ekstep.in',\n endpoint: '/data/v3/telemetry',\n tags: [],\n cdata: [],\n enableValidation: false,\n timeDiff: 0\n};\n","export class Dispatcher {\n static async dispatch(url: string, data: any, headers: Record<string, string>): Promise<any> {\n // Check if fetch is available (Node 18+ or browser)\n if (typeof fetch === 'undefined') {\n throw new Error('fetch is not available. Node.js 18+ is required for native fetch support.');\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);\n }\n\n // Handle empty and non-JSON responses safely\n if (response.status === 204) {\n // No Content\n return null;\n }\n\n const contentType = response.headers.get('content-type') || '';\n const text = await response.text();\n\n if (!text.trim()) {\n // Empty body on a successful response\n return null;\n }\n\n if (!contentType.toLowerCase().includes('application/json')) {\n // Non-JSON successful response; return raw text\n return text;\n }\n\n return JSON.parse(text);\n } catch (error) {\n console.error('Dispatcher error:', error);\n throw error;\n }\n }\n }\n","import CryptoJS from 'crypto-js';\n\nexport class Utils {\n static getMD5(message: string): string {\n return CryptoJS.MD5(message).toString();\n }\n\n static generateUUID(): string {\n // Use crypto.randomUUID() when available (Browser + Node 18+)\n if (typeof crypto !== 'undefined') {\n if (crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n if (crypto.getRandomValues) {\n const buf = new Uint8Array(16);\n crypto.getRandomValues(buf);\n\n // Set version (4) and variant (RFC4122)\n buf[6] = (buf[6] & 0x0f) | 0x40;\n buf[8] = (buf[8] & 0x3f) | 0x80;\n\n const hex = (b: number) => b.toString(16).padStart(2, '0');\n\n return (\n hex(buf[0]) + hex(buf[1]) + hex(buf[2]) + hex(buf[3]) + '-' +\n hex(buf[4]) + hex(buf[5]) + '-' +\n hex(buf[6]) + hex(buf[7]) + '-' +\n hex(buf[8]) + hex(buf[9]) + '-' +\n hex(buf[10]) + hex(buf[11]) + hex(buf[12]) + hex(buf[13]) + hex(buf[14]) + hex(buf[15])\n );\n }\n }\n\n // Fallback to Math.random() for older environments\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n static getEpochTime(): number {\n return new Date().getTime();\n }\n\n static isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n }\n}\n","import { TelemetryConfig } from './TelemetryConfig';\nimport { Dispatcher } from '../utils/Dispatcher';\nimport { Utils } from '../utils/Utils';\n\nexport class TelemetrySyncManager {\n private _teleData: any[] = [];\n private _failedBatch: any[] = [];\n private _config: TelemetryConfig;\n private _retryAttempts = 0;\n private _retryTimeout: any = null;\n\n private static readonly MAX_FAILED_BATCH_SIZE = 10000;\n private static readonly RETRY_SUCCESS_DELAY_MS = 1000;\n private static readonly MAX_BACKOFF_DELAY_MS = 60000;\n\n constructor(config: TelemetryConfig) {\n this._config = config;\n }\n\n public updateConfig(config: TelemetryConfig) {\n this._config = config;\n }\n\n public sendTelemetry(event: any) {\n const telemetryEvent = event.detail || event;\n this._teleData.push({ ...telemetryEvent });\n\n if (\n (telemetryEvent.eid && telemetryEvent.eid.toUpperCase() === 'END') ||\n this._teleData.length >= (this._config.batchsize || 20)\n ) {\n this.syncEvents();\n }\n }\n\n public async syncEvents() {\n const batchSize = this._config.batchsize || 20;\n\n if (!this._teleData.length) {\n return;\n }\n\n // Get events and remove them from the main queue immediately to prevent duplicate processing\n const events = this._teleData.splice(0, batchSize);\n\n const telemetryObj = {\n id: 'api.sunbird.telemetry',\n ver: '3.0',\n params: {\n msgid: Utils.getMD5(JSON.stringify(events)),\n },\n ets: Utils.getEpochTime() + (this._config.timeDiff || 0) * 1000,\n events: events,\n };\n\n const headers: Record<string, string> = {};\n if (this._config.authtoken) {\n headers['Authorization'] = 'Bearer ' + this._config.authtoken;\n }\n headers['x-app-id'] = this._config.pdata.id;\n headers['x-device-id'] = this._config.did || '';\n headers['x-channel-id'] = this._config.channel;\n\n const host = this._config.host || '';\n const endpoint = this._config.endpoint || '';\n const fullPath = host + endpoint;\n\n try {\n if (this._config.dispatcher && typeof this._config.dispatcher.dispatch === 'function') {\n this._config.dispatcher.dispatch(telemetryObj);\n // Reset retry attempts on success\n this._retryAttempts = 0;\n } else {\n await Dispatcher.dispatch(fullPath, telemetryObj, headers);\n // Reset retry attempts on success\n this._retryAttempts = 0;\n }\n } catch (error) {\n console.error('Telemetry Sync Failed', error);\n // Re-queue failed events back to the front with exponential backoff retry\n this._handleFailedBatch(telemetryObj);\n }\n }\n\n private _handleFailedBatch(telemetryObj: any) {\n // Add to failed batch with a maximum size cap to prevent unbounded growth\n if (this._failedBatch.length < TelemetrySyncManager.MAX_FAILED_BATCH_SIZE) {\n this._failedBatch.push(telemetryObj);\n\n // Implement exponential backoff for retry\n this._retryAttempts++;\n const backoffDelay = Math.min(\n 1000 * Math.pow(2, this._retryAttempts - 1),\n TelemetrySyncManager.MAX_BACKOFF_DELAY_MS\n );\n\n // Clear any existing retry timeout\n if (this._retryTimeout) {\n clearTimeout(this._retryTimeout);\n }\n\n // Schedule retry with exponential backoff\n this._retryTimeout = setTimeout(() => {\n this._retryFailedBatch();\n }, backoffDelay);\n\n console.log(`Retry scheduled in ${backoffDelay}ms (attempt ${this._retryAttempts})`);\n } else {\n console.warn('Failed batch buffer is full. Dropping telemetry events.');\n }\n }\n\n private async _retryFailedBatch() {\n if (this._failedBatch.length === 0) {\n return;\n }\n\n // Get the first failed batch to retry\n const telemetryObj = this._failedBatch.shift();\n\n const headers: Record<string, string> = {};\n if (this._config.authtoken) {\n headers['Authorization'] = 'Bearer ' + this._config.authtoken;\n }\n headers['x-app-id'] = this._config.pdata.id;\n headers['x-device-id'] = this._config.did || '';\n headers['x-channel-id'] = this._config.channel;\n\n const host = this._config.host || '';\n const endpoint = this._config.endpoint || '';\n const fullPath = host + endpoint;\n\n try {\n if (this._config.dispatcher && typeof this._config.dispatcher.dispatch === 'function') {\n this._config.dispatcher.dispatch(telemetryObj);\n console.log('Retry successful');\n } else {\n await Dispatcher.dispatch(fullPath, telemetryObj, headers);\n console.log('Retry successful');\n }\n\n // Reset retry attempts when successfully clearing the queue\n if (this._failedBatch.length === 0) {\n this._retryAttempts = 0;\n }\n\n // If there are more failed batches, retry them with a short delay\n if (this._failedBatch.length > 0) {\n this._retryTimeout = setTimeout(() => {\n this._retryFailedBatch();\n }, TelemetrySyncManager.RETRY_SUCCESS_DELAY_MS);\n }\n } catch (error) {\n console.error('Retry failed', error);\n // Put the batch back at the front of the queue (don't call _handleFailedBatch to avoid duplicate)\n this._failedBatch.unshift(telemetryObj);\n\n // Increment retry attempts and schedule with exponential backoff\n this._retryAttempts++;\n const backoffDelay = Math.min(\n 1000 * Math.pow(2, this._retryAttempts - 1),\n TelemetrySyncManager.MAX_BACKOFF_DELAY_MS\n );\n\n // Clear any existing retry timeout\n if (this._retryTimeout) {\n clearTimeout(this._retryTimeout);\n }\n\n // Schedule retry with exponential backoff\n this._retryTimeout = setTimeout(() => {\n this._retryFailedBatch();\n }, backoffDelay);\n\n console.log(`Retry scheduled in ${backoffDelay}ms (attempt ${this._retryAttempts})`);\n }\n }\n}\n","import Ajv from 'ajv';\nimport telemetrySchema from '../schema/telemetry-spec.json';\n\nexport class Validator {\n private ajv: Ajv;\n private isEnabled: boolean;\n\n constructor(isEnabled: boolean) {\n this.isEnabled = isEnabled;\n this.ajv = new Ajv({ schemas: telemetrySchema });\n }\n\n validate(event: any): boolean {\n if (!this.isEnabled) {\n return true;\n }\n const schemaKey = `http://api.ekstep.org/telemetry/${event.eid.toLowerCase()}`;\n const validate = this.ajv.getSchema(schemaKey);\n\n if (!validate) {\n console.error(`Schema not found for event: ${event.eid}`);\n return false;\n }\n\n const valid = validate(event);\n if (!valid) {\n console.error(\n `Invalid ${event.eid} Event: ${this.ajv.errorsText(validate.errors)}`\n );\n return false;\n }\n return true;\n }\n}\n","[\n {\n \"$id\": \"http://api.ekstep.org/telemetry/actor\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/actor/id\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/actor/type\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"id\"\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/assess\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"ASSESS\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"item\",\n \"pass\",\n \"score\",\n \"resvalues\",\n \"duration\"\n ],\n \"properties\": {\n \"item\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/question\"\n },\n \"index\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/index\",\n \"type\": \"number\"\n },\n \"pass\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pass\",\n \"type\": \"string\"\n },\n \"score\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/score\",\n \"type\": \"number\"\n },\n \"resvalues\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/resvalues\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"duration\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/duration\",\n \"type\": \"number\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/audit\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"AUDIT\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"props\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/props\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"state\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/state\",\n \"type\": \"string\"\n },\n \"prevstate\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/prevstate\",\n \"type\": \"string\"\n },\n \"duration\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/duration\",\n \"type\": \"number\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/cdata\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/cdata/type\",\n \"type\": \"string\"\n },\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/cdata/id\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"id\"\n ]\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/common\",\n \"type\": \"object\",\n \"properties\": {\n \"ets\": {\n \"$id\": \"http://api.ekstep.org/telemetry/ets\",\n \"type\": \"number\"\n },\n \"ver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/ver\",\n \"type\": \"string\",\n \"enum\": [\n \"3.0\"\n ]\n },\n \"mid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/mid\",\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"actor\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/actor\"\n },\n \"context\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/context\"\n },\n \"object\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/object\"\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/context\",\n \"type\": \"object\",\n \"properties\": {\n \"channel\": {\n \"$id\": \"http://api.ekstep.org/telemetry/context/channel\",\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"pdata\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/pdata\"\n },\n \"env\": {\n \"$id\": \"http://api.ekstep.org/telemetry/context/env\",\n \"type\": \"string\"\n },\n \"sid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/context/sid\",\n \"type\": \"string\"\n },\n \"did\": {\n \"$id\": \"http://api.ekstep.org/telemetry/context/did\",\n \"type\": \"string\"\n },\n \"cdata\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/cdata\"\n }\n },\n \"required\": [\n \"channel\",\n \"env\",\n \"pdata\"\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec\",\n \"type\": \"object\",\n \"properties\": {\n \"os\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/os\",\n \"type\": \"string\"\n },\n \"make\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/make\",\n \"type\": \"string\"\n },\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/id\",\n \"type\": \"string\"\n },\n \"mem\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/mem\",\n \"type\": \"number\",\n \"minimum\": -1\n },\n \"idisk\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/idisk\",\n \"type\": \"number\",\n \"minimum\": -1\n },\n \"edisk\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/edisk\",\n \"type\": \"number\",\n \"minimum\": -1\n },\n \"scrn\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/scrn\",\n \"type\": \"number\",\n \"minimum\": -1\n },\n \"camera\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/camera\",\n \"type\": \"string\"\n },\n \"cpu\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/cpu\",\n \"type\": \"string\"\n },\n \"sims\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/sims\",\n \"type\": \"number\",\n \"minimum\": -1\n },\n \"cap\": {\n \"$id\": \"http://api.ekstep.org/telemetry/dspec/cap\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/end\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"END\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/mode\",\n \"type\": \"string\"\n },\n \"duration\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/duration\",\n \"type\": \"number\"\n },\n \"pageid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pageid\",\n \"type\": \"string\"\n },\n \"summary\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/summary\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/error\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"ERROR\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"err\",\n \"errtype\",\n \"stacktrace\"\n ],\n \"properties\": {\n \"err\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/err\",\n \"type\": \"string\"\n },\n \"errtype\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/errtype\",\n \"type\": \"string\"\n },\n \"stacktrace\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/stacktrace\",\n \"type\": \"string\"\n },\n \"traceid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/traceid\",\n \"type\": \"string\"\n },\n \"pageid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pageid\",\n \"type\": \"string\"\n },\n \"object\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/inlineobject\"\n },\n \"plugin\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/plugin\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/exdata\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"EXDATA\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"data\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/data\",\n \"type\": \"string\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/feedback\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"FEEDBACK\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"rating\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/rating\",\n \"type\": \"number\"\n },\n \"commentid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/commentid\",\n \"type\": \"string\"\n },\n \"commenttxt\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/commenttxt\",\n \"type\": \"string\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/heartbeat\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"HEARTBEAT\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\"\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/impression\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"IMPRESSION\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pageid\",\n \"uri\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"subtype\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/subtype\",\n \"type\": \"string\"\n },\n \"pageid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pageid\",\n \"type\": \"string\"\n },\n \"uri\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/uri\",\n \"type\": \"string\"\n },\n \"duration\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/duration\",\n \"type\": \"number\"\n },\n \"visits\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/visits\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"objid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/visits/objid\",\n \"type\": \"string\"\n },\n \"objtype\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/visits/objtype\",\n \"type\": \"string\"\n },\n \"objver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/visits/objver\",\n \"type\": \"string\"\n },\n \"section\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/visits/section\",\n \"type\": \"string\"\n },\n \"index\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/visits/index\",\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"objid\",\n \"objtype\"\n ]\n }\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/inlineobject\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"type\",\n \"ver\"\n ],\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/inlineobject/id\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/inlineobject/type\",\n \"type\": \"string\"\n },\n \"ver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/inlineobject/ver\",\n \"type\": \"string\"\n },\n \"subtype\": {\n \"$id\": \"http://api.ekstep.org/telemetry/inlineobject/subtype\",\n \"type\": \"string\"\n },\n \"name\": {\n \"$id\": \"http://api.ekstep.org/telemetry/inlineobject/name\",\n \"type\": \"string\"\n },\n \"code\": {\n \"$id\": \"http://api.ekstep.org/telemetry/inlineobject/code\",\n \"type\": \"string\"\n },\n \"parent\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/parent\"\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/interact\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"INTERACT\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"id\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"subtype\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/subtype\",\n \"type\": \"string\"\n },\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/id\",\n \"type\": \"string\"\n },\n \"pageid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pageid\",\n \"type\": \"string\"\n },\n \"duration\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/duration\",\n \"type\": \"number\"\n },\n \"target\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/target\"\n },\n \"plugin\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/plugin\"\n },\n \"extra\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/extra\",\n \"type\": \"object\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/interrupt\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"INTERRUPT\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"pageid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pageid\",\n \"type\": \"string\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/items\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/id\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/type\",\n \"type\": \"string\"\n },\n \"ver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/ver\",\n \"type\": \"string\"\n },\n \"params\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/params\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"origin\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/origin\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/origin/id\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/origin/type\",\n \"type\": \"string\"\n }\n }\n },\n \"to\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/to\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/to/id\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/items/to/type\",\n \"type\": \"string\"\n }\n }\n }\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/log\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"LOG\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"level\",\n \"message\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"level\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/level\",\n \"type\": \"string\"\n },\n \"message\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/message\",\n \"type\": \"string\"\n },\n \"pageid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pageid\",\n \"type\": \"string\"\n },\n \"params\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/params\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/metrics\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"METRICS\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/object\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/object/id\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/object/type\",\n \"type\": \"string\"\n },\n \"ver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/object/ver\",\n \"type\": \"string\"\n },\n \"rollup\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/rollup\"\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/parent\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/parent/id\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/parent/type\",\n \"type\": \"string\"\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/pdata\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/pdata/id\",\n \"type\": \"string\"\n },\n \"pid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/pdata/pid\",\n \"type\": \"string\"\n },\n \"ver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/pdata/ver\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/plugin\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"ver\"\n ],\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/plugin/id\",\n \"type\": \"string\"\n },\n \"ver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/plugin/ver\",\n \"type\": \"string\"\n },\n \"category\": {\n \"$id\": \"http://api.ekstep.org/telemetry/plugin/category\",\n \"type\": \"string\"\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/question\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\"\n ],\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/id\",\n \"type\": \"string\"\n },\n \"maxscore\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/maxscore\",\n \"type\": \"number\"\n },\n \"exlength\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/exlength\",\n \"type\": \"number\"\n },\n \"params\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/params\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"uri\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/uri\",\n \"type\": \"string\"\n },\n \"desc\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/desc\",\n \"type\": \"string\"\n },\n \"title\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/title\",\n \"type\": \"string\"\n },\n \"mmc\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/mmc\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"mc\": {\n \"$id\": \"http://api.ekstep.org/telemetry/question/mc\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/response\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"RESPONSE\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"target\",\n \"type\",\n \"values\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/type\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/target\"\n },\n \"values\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/rollup\",\n \"type\": \"object\",\n \"properties\": {\n \"l1\": {\n \"$id\": \"http://api.ekstep.org/telemetry/context/rollup/l1\",\n \"type\": \"string\"\n },\n \"l2\": {\n \"$id\": \"http://api.ekstep.org/telemetry/context/rollup/l2\",\n \"type\": \"string\"\n },\n \"l3\": {\n \"$id\": \"http://api.ekstep.org/telemetry/context/rollup/l3\",\n \"type\": \"string\"\n },\n \"l4\": {\n \"$id\": \"http://api.ekstep.org/telemetry/context/rollup/l4\",\n \"type\": \"string\"\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/search\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"SEARCH\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"query\",\n \"size\",\n \"topn\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"query\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/query\",\n \"type\": \"string\"\n },\n \"filters\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/filters\",\n \"type\": \"object\"\n },\n \"sort\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/sort\",\n \"type\": \"object\"\n },\n \"correlationid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/correlationid\",\n \"type\": \"string\"\n },\n \"size\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/size\",\n \"type\": \"number\"\n },\n \"topn\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/topn\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/share\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"SHARE\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"items\"\n ],\n \"properties\": {\n \"dir\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/dir\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"items\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/items\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/start\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"START\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"dspec\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/dspec\"\n },\n \"uaspec\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/uaspec\"\n },\n \"loc\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/loc\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/mode\",\n \"type\": \"string\"\n },\n \"duration\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/duration\",\n \"type\": \"number\"\n },\n \"pageid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pageid\",\n \"type\": \"string\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/summary\",\n \"type\": \"object\",\n \"required\": [\n \"eid\",\n \"ets\",\n \"ver\",\n \"mid\",\n \"actor\",\n \"context\",\n \"edata\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"http://api.ekstep.org/telemetry/common\"\n },\n {\n \"properties\": {\n \"eid\": {\n \"$id\": \"http://api.ekstep.org/telemetry/eid\",\n \"enum\": [\n \"SUMMARY\"\n ]\n },\n \"edata\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"starttime\",\n \"endtime\",\n \"timespent\",\n \"pageviews\",\n \"interactions\"\n ],\n \"properties\": {\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/type\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/mode\",\n \"type\": \"string\"\n },\n \"starttime\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/starttime\",\n \"type\": \"number\"\n },\n \"endtime\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/endtime\",\n \"type\": \"number\"\n },\n \"timespent\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/timespent\",\n \"type\": \"string\"\n },\n \"pageviews\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/pageviews\",\n \"type\": \"number\"\n },\n \"interactions\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/interactions\",\n \"type\": \"number\"\n },\n \"extra\": {\n \"$id\": \"http://api.ekstep.org/telemetry/edata/extra\",\n \"type\": \"array\"\n }\n }\n }\n }\n }\n ]\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/target\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"ver\",\n \"type\"\n ],\n \"properties\": {\n \"id\": {\n \"$id\": \"http://api.ekstep.org/telemetry/target/id\",\n \"type\": \"string\"\n },\n \"ver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/target/ver\",\n \"type\": \"string\"\n },\n \"type\": {\n \"$id\": \"http://api.ekstep.org/telemetry/target/type\",\n \"type\": \"string\"\n },\n \"parent\": {\n \"$ref\": \"http://api.ekstep.org/telemetry/parent\"\n }\n }\n },\n {\n \"$id\": \"http://api.ekstep.org/telemetry/uaspec\",\n \"type\": \"object\",\n \"properties\": {\n \"agent\": {\n \"$id\": \"http://api.ekstep.org/telemetry/uaspec/agent\",\n \"type\": \"string\"\n },\n \"ver\": {\n \"$id\": \"http://api.ekstep.org/telemetry/uaspec/ver\",\n \"type\": \"string\"\n },\n \"system\": {\n \"$id\": \"http://api.ekstep.org/telemetry/uaspec/system\",\n \"type\": \"string\"\n },\n \"platform\": {\n \"$id\": \"http://api.ekstep.org/telemetry/uaspec/platform\",\n \"type\": \"string\"\n },\n \"raw\": {\n \"$id\": \"http://api.ekstep.org/telemetry/uaspec/raw\",\n \"type\": \"string\"\n }\n }\n }\n]\n","import FingerprintJS from '@fingerprintjs/fingerprintjs';\nimport { Utils } from '../utils/Utils';\n\nexport class DeviceService {\n private static fingerPrintId: string | undefined;\n\n static async getFingerPrint(): Promise<string> {\n if (this.fingerPrintId) {\n return this.fingerPrintId;\n }\n\n if (!Utils.isBrowser()) {\n // In Node.js, we expect the DID to be passed in configuration.\n // If not, we generate a random UUID as a session-based fallback.\n // This is a design decision: server-side telemetry usually comes with a DID.\n this.fingerPrintId = Utils.generateUUID();\n return this.fingerPrintId;\n }\n\n // Browser Logic with \"sticky\" localStorage support\n const ver = 'v2';\n const storageKey = `fpDetails_${ver}`;\n\n try {\n if (localStorage.getItem(storageKey)) {\n const data = JSON.parse(localStorage.getItem(storageKey)!);\n if (data && data.result) {\n this.fingerPrintId = data.result;\n return data.result;\n }\n }\n } catch(e) {\n console.warn(\"LocalStorage access failed\", e);\n }\n\n // Generate new fingerprint\n try {\n const fpPromise = await FingerprintJS.load();\n const result = await fpPromise.get();\n const deviceId = result.visitorId;\n\n try {\n // Store only the minimal fingerprint identifier to reduce privacy risk\n localStorage.setItem(storageKey, JSON.stringify({ result: deviceId }));\n } catch(e) {\n console.warn(\"LocalStorage set failed\", e);\n }\n\n this.fingerPrintId = deviceId;\n return deviceId;\n\n } catch (error) {\n console.error(\"Fingerprint generation failed\", error);\n // Fallback to random UUID if fingerprinting fails\n this.fingerPrintId = Utils.generateUUID();\n return this.fingerPrintId;\n }\n }\n}\n","import UAParser from 'ua-parser-js';\n\nexport class DeviceInfo {\n static getUserAgent(): any {\n if (typeof navigator === 'undefined') {\n return {\n agent: 'Node',\n ver: process.version,\n system: process.platform,\n platform: process.arch,\n raw: `Node.js ${process.version}`\n };\n }\n\n const parser = new UAParser();\n const result = parser.getResult();\n\n return {\n agent: result.browser.name ?? '',\n ver: result.browser.version ?? '',\n system: result.os.name ?? '',\n platform: result.os.version ?? '',\n raw: navigator.userAgent\n };\n }\n}\n","import { TelemetryConfig, defaultConfig } from './TelemetryConfig';\nimport { TelemetrySyncManager } from './TelemetrySyncManager';\nimport { Validator } from '../services/Validator';\nimport { DeviceService } from '../services/DeviceService';\nimport { Utils } from '../utils/Utils';\nimport { DeviceInfo } from '../utils/DeviceInfo';\n\nexport class Telemetry {\n private static instance: Telemetry;\n private _config: TelemetryConfig;\n private _initialized = false;\n private _syncManager: TelemetrySyncManager;\n private _validator: Validator;\n private _startData: any[] = [];\n\n // Context state\n private _globalContext: any = {};\n private _globalObject: any = {};\n\n private _currentContext: any = {};\n private _currentObject: any = {};\n private _currentActor: any = {};\n private _currentTags: any[] = [];\n\n private constructor() {\n this._config = defaultConfig as TelemetryConfig;\n this._syncManager = new TelemetrySyncManager(this._config);\n this._validator = new Validator(false);\n }\n\n public static getInstance(): Telemetry {\n if (!Telemetry.instance) {\n Telemetry.instance = new Telemetry();\n }\n return Telemetry.instance;\n }\n\n public get isInitialized(): boolean {\n return this._initialized;\n }\n\n public get config(): TelemetryConfig {\n return this._config;\n }\n\n public initialize(config: Partial<TelemetryConfig>) {\n if (this._initialized) {\n console.warn('Telemetry is already initialized');\n return;\n }\n\n // Start with a shallow merge, then deep-merge nested objects that must retain defaults.\n const mergedConfig = { ...defaultConfig, ...config } as TelemetryConfig;\n\n // Deep-merge pdata to avoid dropping default fields (e.g., ver) when a partial pdata is provided.\n if ((defaultConfig as any).pdata || (config as any)?.pdata) {\n (mergedConfig as any).pdata = {\n ...(defaultConfig as any).pdata,\n ...(config as any)?.pdata,\n };\n }\n\n this._config = mergedConfig;\n // Validate batchsize\n if (this._config.batchsize && this._config.batchsize > 1000) {\n this._config.batchsize = 1000;\n }\n\n this._initialized = true;\n this._validator = new Validator(!!this._config.enableValidation);\n this._syncManager.updateConfig(this._config);\n\n // Initialize global context\n // Deep merge pdata to ensure required fields (id, ver) are present even if config provides partial pdata\n const defaultPData = { id: 'sunbird', ver: '1.0', pid: '' };\n this._globalContext = {\n channel: this._config.channel || 'sunbird',\n pdata: { ...defaultPData, ...this._config.pdata },\n env: this._config.env || 'contentplayer',\n sid: this._config.sid || '',\n did: this._config.did || '',\n cdata: this._config.cdata || [],\n rollup: this._config.rollup || {},\n };\n\n if (this._config.object) {\n this._globalObject = this._config.object;\n }\n }\n\n public async start(config: Partial<TelemetryConfig>, contentId: string, contentVer: string, data: any, options?: any) {\n if (!this._initialized) {\n this.initialize(config);\n }\n\n if (contentId && contentVer) {\n this._globalObject.id = contentId;\n this._globalObject.ver = contentVer;\n }\n\n // Ensure device ID is present\n if (!this._globalContext.did) {\n const did = await DeviceService.getFingerPrint();\n this._globalContext.did = did;\n this._config.did = did; // Update main config as well\n }\n\n if (!data) {\n data = {};\n }\n\n data.duration = data.duration || 0;\n\n // Add uaspec if not present\n if (!data.uaspec) {\n data.uaspec = DeviceInfo.getUserAgent();\n }\n\n this.updateValues(options);\n const event = this.getEvent('START', data);\n this._dispatch(event);\n this._startData.push(JSON.parse(JSON.stringify(event)));\n }\n\n public end(data: any, options?: any) {\n if (this._startData.length) {\n const startEvent = this._startData.pop();\n const startTime = startEvent.ets;\n const currentTime = Utils.getEpochTime() + (this._config.timeDiff || 0) * 1000;\n\n if (!data) {\n data = {};\n }\n\n data.duration = parseFloat(((currentTime - startTime) * 0.001).toFixed(2));\n\n this.updateValues(options);\n this._dispatch(this.getEvent('END', data));\n } else {\n console.info('Please invoke start before invoking end event.');\n }\n }\n\n public interact(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('INTERACT', data));\n }\n\n public impression(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('IMPRESSION', data));\n }\n\n public assess(data: any, options?: any) {\n this.updateValues(options);\n const event = this.getEvent('ASSESS', data);\n if(options && options.eventVer) {\n event.ver = options.eventVer;\n }\n this._dispatch(event);\n }\n\n public response(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('RESPONSE', data));\n }\n\n public interrupt(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('INTERRUPT', data));\n }\n\n public feedback(data: any, options?: any) {\n if (!data) {\n data = {};\n }\n const eksData = {\n rating: data.rating,\n commentid: data.commentid || '',\n commenttxt: data.commenttxt || ''\n };\n this.updateValues(options);\n this._dispatch(this.getEvent('FEEDBACK', eksData));\n }\n\n public share(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('SHARE', data));\n }\n\n public audit(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('AUDIT', data));\n }\n\n public error(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('ERROR', data));\n }\n\n public heartbeat(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('HEARTBEAT', data));\n }\n\n public log(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('LOG', data));\n }\n\n public search(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('SEARCH', data));\n }\n\n public metrics(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('METRICS', data));\n }\n\n public exdata(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('EXDATA', data));\n }\n\n public summary(data: any, options?: any) {\n this.updateValues(options);\n this._dispatch(this.getEvent('SUMMARY', data));\n }\n\n // Reset Methods\n public resetContext(context: any) {\n this._currentContext = context || {};\n }\n\n public resetObject(object: any) {\n this._currentObject = object || {};\n }\n\n public resetActor(actor: any) {\n this._currentActor = actor || {};\n }\n\n public resetTags(tags: any[]) {\n this._currentTags = Array.isArray(tags) ? tags : [];\n }\n\n public syncEvents() {\n this._syncManager.syncEvents();\n }\n\n private updateValues(options: any) {\n if (options) {\n options.context && (this._currentContext = options.context);\n options.object && (this._currentObject = options.object);\n options.actor && (this._currentActor = options.actor);\n if (options.tags) {\n this._currentTags = Array.isArray(options.tags) ? options.tags : [];\n }\n options.runningEnv && (this._config.runningEnv = options.runningEnv);\n }\n }\n\n private getEvent(eventId: string, data: any) {\n const configTags = Array.isArray(this._config.tags) ? this._config.tags : [];\n const currentTags = Array.isArray(this._currentTags) ? this._currentTags : [];\n\n const event: any = {\n eid: eventId,\n ets: Utils.getEpochTime() + (this._config.timeDiff || 0) * 1000,\n ver: '3.0',\n mid: '',\n actor: {\n id: this._config.uid || 'anonymous',\n type: 'User',\n ...this._currentActor\n },\n context: {\n ...this._globalContext,\n ...this._currentContext\n },\n object: {\n ...this._globalObject,\n ...this._currentObject\n },\n tags: [\n ...configTags,\n ...currentTags\n ],\n edata: data\n };\n\n // Fix actor ID based on device ID if anonymous\n if (event.actor.id === 'anonymous' && event.context.did) {\n event.actor.id = event.context.did;\n }\n\n // Generate Message ID (mid)\n event.mid = eventId + ':' + Utils.getMD5(JSON.stringify(event));\n\n return event;\n }\n\n private _dispatch(message: any) {\n if (this._validator.validate(message)) {\n this._syncManager.sendTelemetry(message);\n\n // Legacy support: dispatch event to document for client-side listeners\n if (typeof document !== 'undefined') {\n document.dispatchEvent(new CustomEvent('TelemetryEvent', { detail: message }));\n }\n }\n }\n}\n","import { Telemetry } from './core/Telemetry';\n\nexport * from './core/Telemetry';\nexport * from './core/TelemetryConfig';\nexport * from './core/TelemetrySyncManager';\nexport * from './services/DeviceService';\nexport * from './utils/Dispatcher';\n\n// Singleton instance export for easy usage\nexport const $t = Telemetry.getInstance();\n\n// Backward compatibility for browser globals\nif (typeof window !== 'undefined') {\n (window as any).$t = $t;\n // Legacy integrations expect EkTelemetry to be the singleton instance\n (window as any).EkTelemetry = $t;\n // Optionally expose the class separately for advanced usage\n (window as any).EkTelemetryClass = Telemetry;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,60 +1,49 @@
1
1
  {
2
- "name": "@project-sunbird/telemetry-sdk",
3
- "version": "1.3.0",
4
- "description": "Telemetry Service javascript library helps to generate the telemetry events.",
5
- "directories": {
6
- "example": "example",
7
- "test": "test"
8
- },
9
- "devDependencies": {
10
- "@metahub/karma-jasmine-jquery": "^4.0.1",
11
- "ajv": "^6.12.6",
12
- "codecov": "^3.8.3",
13
- "cpy-cli": "^5.0.0",
14
- "jasmine-core": "3.2.1",
15
- "jquery": "^3.7.1",
16
- "karma": "^6.4.2",
17
- "karma-chrome-launcher": "^1.0.1",
18
- "karma-coverage": "^2.2.1",
19
- "karma-jasmine": "1.1.2",
20
- "karma-jasmine-matchers": "3.8.3",
21
- "karma-junit-reporter": "1.2.0",
22
- "karma-mocha-reporter": "2.2.5",
23
- "karma-ng-html2js-preprocessor": "1.0.0",
24
- "karma-phantomjs-launcher": "^1.0.4",
25
- "karma-verbose-reporter": "0.0.6",
26
- "rimraf": "2.6.2"
27
- },
28
- "scripts": {
29
- "test": "karma start karma.renderer.config.js",
30
- "codecov": "codecov",
31
- "test-sdk": "karma start karma.renderer.config.js",
32
- "build": "node_modules/.bin/rimraf ./dist && node bundle-schema.js && node buildSDK.js && node_modules/.bin/cpy package.json ./dist && node_modules/.bin/cpy README.md ./dist"
33
- },
34
- "repository": {
35
- "type": "git",
36
- "url": "git+https://github.com/project-sunbird/sunbird-telemetry-sdk.git"
37
- },
38
- "keywords": [
39
- "telemetry",
40
- "telemetry library",
41
- "telemetry-lib",
42
- "telemetry-library",
43
- "project-sunbird",
44
- "sunbird telemetry",
45
- "telemetry-sdk",
46
- "telemetry sdk",
47
- "sunbird telemetry",
48
- "sunbird-telemetry",
49
- "sunbird"
50
- ],
51
- "author": "Manjunath Davanam <manjunathd@ilimi.in>",
52
- "license": "MIT",
53
- "bugs": {
54
- "url": "https://github.com/project-sunbird/sunbird-telemetry-sdk/issues"
55
- },
56
- "homepage": "https://github.com/project-sunbird/sunbird-telemetry-sdk/tree/master/js#readme",
57
- "overrides": {
58
- "graceful-fs": "^4.2.11"
59
- }
2
+ "name": "@project-sunbird/telemetry-sdk",
3
+ "version": "2.0.0",
4
+ "description": "Telemetry Service javascript library helps to generate the telemetry events.",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "LICENSE"
12
+ ],
13
+ "engines": {
14
+ "node": ">=18.0.0"
15
+ },
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "lint": "eslint 'src/**/*.{ts,js}'",
19
+ "test": "vitest run",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/project-sunbird/sunbird-telemetry-sdk.git"
25
+ },
26
+ "keywords": [
27
+ "telemetry",
28
+ "sunbird"
29
+ ],
30
+ "author": "Sunbird",
31
+ "license": "MIT",
32
+ "devDependencies": {
33
+ "@types/crypto-js": "^4.2.2",
34
+ "@types/node": "^20.11.24",
35
+ "@types/ua-parser-js": "^0.7.39",
36
+ "@typescript-eslint/eslint-plugin": "^7.1.0",
37
+ "@typescript-eslint/parser": "^7.1.0",
38
+ "eslint": "^8.57.0",
39
+ "tsup": "^8.0.2",
40
+ "typescript": "^5.3.3",
41
+ "vitest": "^1.3.1"
42
+ },
43
+ "dependencies": {
44
+ "@fingerprintjs/fingerprintjs": "^3.4.2",
45
+ "ajv": "^8.12.0",
46
+ "crypto-js": "^4.2.0",
47
+ "ua-parser-js": "^1.0.37"
48
+ }
60
49
  }