@tiledesk/tiledesk-server
Version:
The Tiledesk server module
64 lines (55 loc) • 2.13 kB
JavaScript
;
const axios = require("axios");
const crypto = require("crypto");
const winston = require("../config/winston");
const INGEST_BASE_URL = process.env.ANALYTICS_INGEST_URL;
const INGEST_API_KEY = process.env.ANALYTICS_INGEST_API_KEY;
const SOURCE_SERVICE = "tiledesk-server";
const EVENT_VERSION = "1.0";
const client = axios.create({
baseURL: INGEST_BASE_URL || "http://localhost:3099", // placeholder; disabled when INGEST_BASE_URL unset
timeout: 5000,
headers: INGEST_API_KEY ? { "X-Api-Key": INGEST_API_KEY } : {},
});
/**
* Build a full analytics event envelope.
* Mirrors the tiledesk-llm _build_envelope() pattern so both services
* produce identical envelope shapes, enabling event_id-based deduplication
* in the consumer.
*/
function _buildEnvelope(eventType, idProject, payload, eventId) {
return {
event_id: eventId || crypto.randomUUID(),
event_type: eventType,
timestamp: new Date().toISOString(),
id_project: idProject,
source_service: SOURCE_SERVICE,
event_version: EVENT_VERSION,
payload: payload,
};
}
/**
* Fire-and-forget analytics event. No-op when ANALYTICS_INGEST_URL is unset.
*
* @param {string} eventType - e.g. 'conversation.created'
* @param {string} idProject - Tiledesk project ID
* @param {object} payload - event-specific fields
* @param {string} [eventId] - optional caller-supplied UUID for idempotency
* (deterministic id so live + backfill events for
* the same entity dedupe). Random when omitted.
*/
function track(eventType, idProject, payload, eventId) {
if (!INGEST_BASE_URL) return;
if (!idProject) return;
var body = _buildEnvelope(eventType, idProject, payload, eventId);
client.post("/events", body).catch(function (err) {
var status = err.response && err.response.status;
var detail =
(err.response && err.response.data && err.response.data.error) ||
err.message;
winston.warn(
"[analytics] Failed to track " + eventType + ": " + status + " " + detail,
);
});
}
module.exports = { track: track };