@seeka-labs/sdk-apps-server-telemetry-core 2.2.2 → 2.2.4

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.
@@ -1,2 +1,2 @@
1
- import{fetch as D,Headers as K}from"undici";import{getNewOrCachedAppInstallToken as _}from"@seeka-labs/sdk-apps-server";var E=new TextEncoder;function d(t){let e=t>>>0,r=[];for(;e>=128;)r.push(e&127|128),e>>>=7;return r.push(e),Uint8Array.from(r)}function f(t,e){let r=t<<3|e;return d(r)}function c(t,e){if(e==null)return[];let r=E.encode(e);return[f(t,2),d(r.length),r]}function a(t,e){return[f(t,2),d(e.length),e]}function h(t,e){if(e==null)return[];let r=new ArrayBuffer(8);return new DataView(r).setFloat64(0,e,!0),[f(t,1),new Uint8Array(r)]}function o(t){let e=t.filter(s=>s instanceof Uint8Array),r=e.reduce((s,p)=>s+p.length,0),n=new Uint8Array(r),i=0;for(let s of e)n.set(s,i),i+=s.length;return n}function M(t){if(!t)return new Uint8Array(0);let e;if("stringValue"in t&&typeof t.stringValue=="string")e=t.stringValue;else{let n=t.doubleValue??t.intValue??t.boolValue??t.bytesValue??t.arrayValue??t.kvlistValue;try{e=typeof n=="string"?n:JSON.stringify(n)}catch{e=String(n)}}let r=o(c(1,e));return r}function P(t){let e=[];return e.push(...c(1,t.key)),e.push(...a(2,M(t.value))),o(e)}function v(t){if(!t)return new Uint8Array(0);let e=[];for(let r of t.attributes??[])e.push(...a(1,P(r)));return o(e)}function k(t){let e=[];return t&&(e.push(...c(1,t.name)),e.push(...c(2,t.version))),o(e)}function V(t){let e=[];return e.push(...h(4,t.asDouble)),o(e)}function R(t){let e=[];for(let r of t.dataPoints??[])e.push(...a(1,V(r)));return o(e)}function C(t){let e=[];return e.push(...c(1,t.name)),e.push(...c(2,t.description)),e.push(...c(3,t.unit)),t.gauge&&e.push(...a(5,R(t.gauge))),o(e)}function N(t){let e=[];e.push(...a(1,k(t.scope)));for(let r of t.metrics??[])e.push(...a(2,C(r)));return o(e)}function w(t){let e=[];e.push(...a(1,v(t.resource)));for(let r of t.scopeMetrics??[])e.push(...a(2,N(r)));return o(e)}function I(t){let e=[];for(let r of t.resourceMetrics??[]){let n=w(r);e.push(...a(1,n))}return o(e)}var b=t=>{let e=n=>String(n).padStart(2,"0"),r=n=>String(n).padStart(3,"0");return t.getUTCFullYear()+"-"+e(t.getUTCMonth()+1)+"-"+e(t.getUTCDate())+"T"+e(t.getUTCHours())+":"+e(t.getUTCMinutes())+":"+e(t.getUTCSeconds())+"."+r(t.getUTCMilliseconds())};import"winston";import{urls as S}from"@seeka-labs/sdk-apps-server";var O="seeka.tel",A=class{options;constructor(e){this.options=e}sendEgressMetric=async(e,r)=>{let n=[],i=(u,g)=>{g!=null&&n.push({key:`${O}.${u}`,value:{stringValue:String(g)}})},s=u=>{if(typeof u=="string")return u;try{return JSON.stringify(u??{})}catch{return'""'}},p=new Date;i("type","record.activity.egress"),i("tenantId",e.tenantId??r.organisationId),i("originActivityId",e.originActivityId),i("convergeInstanceId",e.convergeInstanceId),i("organisationBrandId",e.organisationBrandId),i("occurredAt",b(e.occurredAt||p)),i("timestamp",b(p)),i("personId",e.personId),i("originSessionIdentifier",e.originSessionIdentifier),i("originDnsName",e.originDnsName),i("destinationPlatformIdentifier",e.destinationPlatformIdentifier),i("destinationPlatformEgressType",e.destinationPlatformEgressType),i("destinationPlatformTypeKey",e.destinationPlatformTypeKey),i("originActivityName",e.originActivityName),i("originActivityNameCustom",e.originActivityNameCustom),i("publishedPayload",s(e.publishedPayload)),i("egressQualityMetrics",s(e.egressQualityMetrics)),i("egressIdentityMetrics",s(e.egressIdentityMetrics));let l={resourceMetrics:[{resource:{attributes:n},scopeMetrics:[{scope:{name:"seeka.telemetry.apps-server-core",version:"0.0.0"},metrics:[{name:"record.activity.egress",description:"Activity egress record",unit:"1",gauge:{dataPoints:[{asDouble:1}]}}]}]}]};await this.sendMetric(l,r)};sendMetric=async(e,r)=>{let{telemetryEndpointUrl:n,logger:i,issuerUrl:s}=this.options;if(!e||!Array.isArray(e.resourceMetrics))throw new Error("SeekaTelemetry: metric must be an OTLP ExportMetricsServiceRequest with a resourceMetrics array");let p={appId:r.appId,appSecret:r.appSecret,issuerUrl:s,ingestUrl:n,organisationId:r.organisationId,applicationInstallId:r.appInstallId,logger:i,grantedPermissions:[],runtime:this.getRuntimeInfo()},l=await _(p);if(!l||!l.access_token)throw new Error("SeekaTelemetry: failed to get access token for install");let u=n.endsWith("/")?n:n+"/",g=new URL("v1/metrics",u).toString(),m=new K;m.set("Content-Type",this.options.protobuf?"application/x-protobuf":"application/json"),m.set("Accept",this.options.protobuf?"application/x-protobuf":"application/json"),m.set("Authorization",`Bearer ${l.access_token}`),m.set("X-OrgId",r.organisationId);let T=this.options.protobuf?I(e):JSON.stringify(e),y=await D(g,{method:"POST",headers:m,body:T});if(!y.ok){let U=await y.text().catch(()=>""),x=`SeekaTelemetry: metric send failed with status ${y.status} ${y.statusText}`;throw i?.error(x,{body:U}),new Error(x)}};shutdown=async()=>{};getRuntimeInfo(){return{type:"sdk/js/apps-server-telemetry-core",ver:"0.0.0",client:{type:"server",ver:process.versions?.node||"unknown"}}}},$=(t,e)=>new A({...t,appId:t?.appId||process.env.SEEKA_APP_ID,appSecret:t?.appSecret||process.env.SEEKA_APP_SECRET,telemetryEndpointUrl:t?.telemetryEndpointUrl||process.env.SEEKA_TELEMETRY_URL||S.defaultTelemetryUrl,issuerUrl:t?.issuerUrl||process.env.SEEKA_ISSUER_URL||S.defaultIssuerUrl,logger:e});var L=(n=>(n[n.AGGREGATION_TEMPORALITY_UNSPECIFIED=0]="AGGREGATION_TEMPORALITY_UNSPECIFIED",n[n.AGGREGATION_TEMPORALITY_DELTA=1]="AGGREGATION_TEMPORALITY_DELTA",n[n.AGGREGATION_TEMPORALITY_CUMULATIVE=2]="AGGREGATION_TEMPORALITY_CUMULATIVE",n))(L||{});export{L as AggregationTemporality,$ as createSeekaTelemetryClient,b as toIsoDateTime};
1
+ import{fetch as L,Headers as O}from"undici";import{jwtDecode as q}from"jwt-decode";import{getNewOrCachedAppInstallToken as H}from"@seeka-labs/sdk-apps-server";var M=new TextEncoder;function d(t){let e=t>>>0,n=[];for(;e>=128;)n.push(e&127|128),e>>>=7;return n.push(e),Uint8Array.from(n)}function f(t,e){let n=t<<3|e;return d(n)}function u(t,e){if(e==null)return[];let n=M.encode(e);return[f(t,2),d(n.length),n]}function a(t,e){return[f(t,2),d(e.length),e]}function P(t,e){if(e==null)return[];let n=new ArrayBuffer(8);return new DataView(n).setFloat64(0,e,!0),[f(t,1),new Uint8Array(n)]}function o(t){let e=t.filter(s=>s instanceof Uint8Array),n=e.reduce((s,p)=>s+p.length,0),r=new Uint8Array(n),i=0;for(let s of e)r.set(s,i),i+=s.length;return r}function k(t){if(!t)return new Uint8Array(0);let e;if("stringValue"in t&&typeof t.stringValue=="string")e=t.stringValue;else{let r=t.doubleValue??t.intValue??t.boolValue??t.bytesValue??t.arrayValue??t.kvlistValue;try{e=typeof r=="string"?r:JSON.stringify(r)}catch{e=String(r)}}let n=o(u(1,e));return n}function R(t){let e=[];return e.push(...u(1,t.key)),e.push(...a(2,k(t.value))),o(e)}function V(t){if(!t)return new Uint8Array(0);let e=[];for(let n of t.attributes??[])e.push(...a(1,R(n)));return o(e)}function C(t){let e=[];return t&&(e.push(...u(1,t.name)),e.push(...u(2,t.version))),o(e)}function N(t){let e=[];return e.push(...P(4,t.asDouble)),o(e)}function w(t){let e=[];for(let n of t.dataPoints??[])e.push(...a(1,N(n)));return o(e)}function D(t){let e=[];return e.push(...u(1,t.name)),e.push(...u(2,t.description)),e.push(...u(3,t.unit)),t.gauge&&e.push(...a(5,w(t.gauge))),o(e)}function _(t){let e=[];e.push(...a(1,C(t.scope)));for(let n of t.metrics??[])e.push(...a(2,D(n)));return o(e)}function K(t){let e=[];e.push(...a(1,V(t.resource)));for(let n of t.scopeMetrics??[])e.push(...a(2,_(n)));return o(e)}function h(t){let e=[];for(let n of t.resourceMetrics??[]){let r=K(n);e.push(...a(1,r))}return o(e)}var A=t=>{let e=r=>String(r).padStart(2,"0"),n=r=>String(r).padStart(3,"0");return t.getUTCFullYear()+"-"+e(t.getUTCMonth()+1)+"-"+e(t.getUTCDate())+"T"+e(t.getUTCHours())+":"+e(t.getUTCMinutes())+":"+e(t.getUTCSeconds())+"."+n(t.getUTCMilliseconds())};import"winston";import{urls as x}from"@seeka-labs/sdk-apps-server";var T="seeka.tel",b=class{options;constructor(e){this.options=e}pushStr=(e,n,r)=>{n!=null&&r.push({key:`${T}.${e}`,value:{stringValue:String(n)}})};getStr(e,n){let r=`${T}.${e}`,i=n.find(s=>s.key===r);if(i?.value&&"stringValue"in i.value)return i.value.stringValue}sendEgressMetric=async(e,n)=>{let r=[],i=c=>{if(typeof c=="string")return c;try{return JSON.stringify(c??{})}catch{return'""'}},s=new Date;this.pushStr("type","record.activity.egress",r),this.pushStr("originActivityId",e.originActivityId,r),this.pushStr("occurredAt",A(e.occurredAt||s),r),this.pushStr("timestamp",A(s),r),this.pushStr("personId",e.personId,r),this.pushStr("originSessionIdentifier",e.originSessionIdentifier,r),this.pushStr("originDnsName",e.originDnsName,r),this.pushStr("destinationPlatformIdentifier",e.destinationPlatformIdentifier,r),this.pushStr("destinationPlatformEgressType",e.destinationPlatformEgressType,r),this.pushStr("destinationPlatformTypeKey",e.destinationPlatformTypeKey,r),this.pushStr("originActivityName",e.originActivityName,r),this.pushStr("originActivityNameCustom",e.originActivityNameCustom,r),this.pushStr("publishedPayload",i(e.publishedPayload),r),this.pushStr("egressQualityMetrics",i(e.egressQualityMetrics),r),this.pushStr("egressIdentityMetrics",i(e.egressIdentityMetrics),r);let p={resourceMetrics:[{resource:{attributes:r},scopeMetrics:[{scope:{name:"seeka.telemetry.apps-server-core",version:"0.0.0"},metrics:[{name:"record.activity.egress",description:"Activity egress record",unit:"1",gauge:{dataPoints:[{asDouble:1}]}}]}]}]};await this.sendMetric(p,n)};sendMetric=async(e,n)=>{let{telemetryEndpointUrl:r,logger:i,issuerUrl:s}=this.options;if(!e||!Array.isArray(e.resourceMetrics))throw new Error("SeekaTelemetry: metric must be an OTLP ExportMetricsServiceRequest with a resourceMetrics array");let p={appId:n.appId,appSecret:n.appSecret,issuerUrl:s,ingestUrl:r,applicationInstallId:n.appInstallId,logger:i,grantedPermissions:[],runtime:this.getRuntimeInfo()},c=await H(p);if(!c||!c.access_token)throw new Error("SeekaTelemetry: failed to get access token for install");let E=r.endsWith("/")?r:r+"/",U=new URL("v1/metrics",E).toString(),m=q(c.access_token),l=new O;l.set("Content-Type",this.options.protobuf?"application/x-protobuf":"application/json"),l.set("Accept",this.options.protobuf?"application/x-protobuf":"application/json"),l.set("Authorization",`Bearer ${c.access_token}`),l.set("X-OrgId",m.tenantid);let y=e.resourceMetrics[0]?.resource?.attributes||[];this.pushStr("tenantId",m.tenantid,y),this.pushStr("organisationBrandId",m.org_brand_id,y),this.getStr("type",y)==="record.activity.egress"&&this.pushStr("convergeInstanceId",m.converge_instance_id,y);let v=this.options.protobuf?h(e):JSON.stringify(e),g=await L(U,{method:"POST",headers:l,body:v});if(!g.ok){let I=await g.text().catch(()=>""),S=`SeekaTelemetry: metric send failed with status ${g.status} ${g.statusText}`;throw i?.error(S,{body:I}),new Error(S)}};shutdown=async()=>{};getRuntimeInfo(){return{type:"sdk/js/apps-server-telemetry-core",ver:"0.0.0",client:{type:"server",ver:process.versions?.node||"unknown"}}}},X=(t,e)=>new b({...t,appId:t?.appId||process.env.SEEKA_APP_ID,appSecret:t?.appSecret||process.env.SEEKA_APP_SECRET,telemetryEndpointUrl:t?.telemetryEndpointUrl||process.env.SEEKA_TELEMETRY_URL||x.defaultTelemetryUrl,issuerUrl:t?.issuerUrl||process.env.SEEKA_ISSUER_URL||x.defaultIssuerUrl,logger:e});var B=(r=>(r[r.AGGREGATION_TEMPORALITY_UNSPECIFIED=0]="AGGREGATION_TEMPORALITY_UNSPECIFIED",r[r.AGGREGATION_TEMPORALITY_DELTA=1]="AGGREGATION_TEMPORALITY_DELTA",r[r.AGGREGATION_TEMPORALITY_CUMULATIVE=2]="AGGREGATION_TEMPORALITY_CUMULATIVE",r))(B||{}),ee=(t,e,n)=>({...e,...t,personId:n.personId,originActivityId:n.activity?.activityId,occurredAt:new Date,originActivityName:n.activity?.activityName,originActivityNameCustom:n.activity?.activityNameCustom,originSessionIdentifier:n.source?.sess,originDnsName:new URL(n.source?.loc||"").hostname.toLowerCase()});export{B as AggregationTemporality,ee as createEgressTelemetryRecord,X as createSeekaTelemetryClient,A as toIsoDateTime};
2
2
  //# sourceMappingURL=sdk-apps-server-telemetry-core.module.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/client.ts", "../../src/otlpEncoder.ts", "../../src/helpers.ts", "../../src/models.ts"],
4
- "sourcesContent": ["\uFEFF\n\n// We use undici's fetch for Node environments\nimport { fetch as undiciFetch, Headers as UndiciHeaders } from 'undici';\n// For safely requiring CJS modules from ESM (used under Jest)\n// import { createRequire } from 'node:module';\n\n// OTLP metric types (type-safe input)\nimport {type AppRuntimeInfo, getNewOrCachedAppInstallToken} from \"@seeka-labs/sdk-apps-server\";\nimport type {\n ActivityEgressTelemetryRecord,\n ExportMetricsServiceRequest, KeyValue, SeekaTelemetryClientCore, SeekaTelemetryClientCoreOptions,\n SeekaTelemetryInstallContext\n} from \"./models.ts\";\nimport { encodeExportMetricsServiceRequestToProto } from './otlpEncoder.ts';\nimport {toIsoDateTime} from \"./helpers.ts\";\nimport * as winston from \"winston\";\nimport {urls} from \"@seeka-labs/sdk-apps-server\";\n\nconst attrPrefix = 'seeka.tel';\n\nclass SeekaTelemetryClientCoreImpl implements SeekaTelemetryClientCore {\n private readonly options: SeekaTelemetryClientCoreOptions;\n\n constructor(options: SeekaTelemetryClientCoreOptions) {\n this.options = options;\n }\n\n // Convenience: build and send a standardised record.activity.egress metric\n public sendEgressMetric = async (\n record: ActivityEgressTelemetryRecord,\n installContext: SeekaTelemetryInstallContext\n ): Promise<void> => {\n const attrs: KeyValue[] = [];\n\n const pushStr = (key: string, value: string | undefined | null) => {\n if (value == null) return;\n attrs.push({ key: `${attrPrefix}.${key}`, value: { stringValue: String(value) } });\n };\n\n const stringifyJson = (v: unknown): string => {\n if (typeof v === 'string') return v;\n try { return JSON.stringify(v ?? {}); } catch { return '\"\"'; }\n };\n\n const now = new Date();\n // Required core attributes (resource-level) \u2014 default certain values from installContext when sensible\n pushStr('type', 'record.activity.egress');\n pushStr('tenantId', record.tenantId ?? installContext.organisationId);\n pushStr('originActivityId', record.originActivityId);\n pushStr('convergeInstanceId', record.convergeInstanceId);\n pushStr('organisationBrandId', record.organisationBrandId);\n pushStr('occurredAt', toIsoDateTime(record.occurredAt || now));\n pushStr('timestamp', toIsoDateTime(now));\n // pushStr('occurredAt', (record.occurredAt || now).toISOString());\n // pushStr('timestamp', now.toISOString());\n\n // Strings\n pushStr('personId', record.personId);\n pushStr('originSessionIdentifier', record.originSessionIdentifier);\n pushStr('originDnsName', record.originDnsName);\n pushStr('destinationPlatformIdentifier', record.destinationPlatformIdentifier);\n pushStr('destinationPlatformEgressType', record.destinationPlatformEgressType);\n pushStr('destinationPlatformTypeKey', record.destinationPlatformTypeKey);\n pushStr('originActivityName', record.originActivityName);\n pushStr('originActivityNameCustom', record.originActivityNameCustom);\n\n // JSON payloads as strings per validation expectations\n pushStr('publishedPayload', stringifyJson(record.publishedPayload));\n pushStr('egressQualityMetrics', stringifyJson(record.egressQualityMetrics));\n pushStr('egressIdentityMetrics', stringifyJson(record.egressIdentityMetrics));\n\n const metric: ExportMetricsServiceRequest = {\n resourceMetrics: [\n {\n resource: {\n attributes: attrs\n },\n scopeMetrics: [\n {\n scope: { name: 'seeka.telemetry.apps-server-core', version: '0.0.0' },\n metrics: [\n {\n name: 'record.activity.egress',\n description: 'Activity egress record',\n unit: '1',\n gauge: {\n dataPoints: [\n {\n asDouble: 1\n }\n ]\n }\n }\n ]\n }\n ]\n }\n ]\n };\n\n await this.sendMetric(metric, installContext);\n };\n\n // Minimal serverless-friendly metric sender using OTLP/HTTP 1.1 Protobuf\n public sendMetric = async (metric: ExportMetricsServiceRequest, installContext: SeekaTelemetryInstallContext): Promise<void> => {\n const { telemetryEndpointUrl, logger, issuerUrl } = this.options;\n\n // Minimal runtime guard to help diagnose common shape mistakes without heavy validation\n if (!metric || !Array.isArray((metric as any).resourceMetrics)) {\n throw new Error('SeekaTelemetry: metric must be an OTLP ExportMetricsServiceRequest with a resourceMetrics array');\n }\n\n // Lazily load the server SDK. Prefer require() so Jest can map to a CJS mock.\n // let getNewOrCachedAppInstallToken: any;\n // try {\n // const req = createRequire(import.meta.url);\n // const mod = req('@seeka-labs/sdk-apps-server');\n // getNewOrCachedAppInstallToken = mod.getNewOrCachedAppInstallToken || mod.default?.getNewOrCachedAppInstallToken;\n // } catch {\n // // Fallback to dynamic import (ESM)\n // try {\n // ({ getNewOrCachedAppInstallToken } = await import('@seeka-labs/sdk-apps-server'));\n // } catch {\n // // Last resort: explicit ESM file path (if package exports are strict)\n // ({ getNewOrCachedAppInstallToken } = await import('@seeka-labs/sdk-apps-server/dist/sdk-apps-server.module.mjs'));\n // }\n // }\n\n // Build a minimal config POJO with the fields used by the auth flow\n const config: any = {\n appId: installContext.appId,\n appSecret: installContext.appSecret,\n issuerUrl: issuerUrl,\n ingestUrl: telemetryEndpointUrl,\n organisationId: installContext.organisationId,\n applicationInstallId: installContext.appInstallId,\n logger,\n grantedPermissions: [],\n runtime: this.getRuntimeInfo()\n };\n\n const token = await\n getNewOrCachedAppInstallToken(config as any);\n if (!token || !token.access_token) {\n throw new Error('SeekaTelemetry: failed to get access token for install');\n }\n\n const base = telemetryEndpointUrl.endsWith('/') ? telemetryEndpointUrl : telemetryEndpointUrl + '/';\n const url = new URL('v1/metrics', base).toString();\n\n const headers = new UndiciHeaders();\n headers.set('Content-Type', this.options.protobuf ? 'application/x-protobuf' : 'application/json');\n headers.set('Accept', this.options.protobuf ? 'application/x-protobuf' : 'application/json');\n headers.set('Authorization', `Bearer ${token.access_token}`);\n headers.set('X-OrgId', installContext.organisationId);\n\n // Encode to Protobuf (OTLP/HTTP 1.1 over HTTP/1.1)\n const body = this.options.protobuf ? encodeExportMetricsServiceRequestToProto(metric) : JSON.stringify(metric);\n\n // Avoid batching entirely: send exactly what we were given, immediately await response\n const resp = await undiciFetch(url, {\n method: 'POST',\n headers: headers as any,\n body\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => '');\n const msg = `SeekaTelemetry: metric send failed with status ${resp.status} ${resp.statusText}`;\n logger?.error(msg, { body: text });\n throw new Error(msg);\n }\n }\n\n public shutdown = async (): Promise<void> => {\n // Core package has no SDK to shutdown; provided for API symmetry.\n }\n\n // NodeSDK support is intentionally omitted from the core package.\n\n private getRuntimeInfo(): AppRuntimeInfo {\n return {\n type: 'sdk/js/apps-server-telemetry-core',\n ver: '0.0.0',\n client: {\n type: 'server',\n ver: process.versions?.node || 'unknown'\n }\n };\n }\n}\n\nexport const createSeekaTelemetryClient = (options?: SeekaTelemetryClientCoreOptions | null | undefined, logger?: winston.Logger): SeekaTelemetryClientCore => {\n return new SeekaTelemetryClientCoreImpl({\n ...options,\n appId: options?.appId || process.env.SEEKA_APP_ID as string,\n appSecret: options?.appSecret || process.env.SEEKA_APP_SECRET as string,\n telemetryEndpointUrl: options?.telemetryEndpointUrl || process.env.SEEKA_TELEMETRY_URL || urls.defaultTelemetryUrl,\n issuerUrl: options?.issuerUrl || process.env.SEEKA_ISSUER_URL || urls.defaultIssuerUrl,\n logger\n });\n};\n", "\uFEFF// Minimal OTLP Metrics protobuf encoder for the subset we use (HTTP/1.1, no HTTP/2)\n// We hand-encode only the fields we need for our gauge metric with string attributes.\n// This avoids pulling in a full protobuf runtime and keeps the package light.\n\nimport type {\n AnyValue,\n ExportMetricsServiceRequest,\n Gauge,\n InstrumentationScope,\n KeyValue,\n Metric,\n NumberDataPoint,\n Resource,\n ResourceMetrics,\n ScopeMetrics,\n} from './models.ts';\n\n// Protobuf wire types\n// const WT_VARINT = 0;\nconst WT_64BIT = 1; // fixed64 / double\nconst WT_LEN = 2; // length-delimited (strings, bytes, submessages)\n\n// Utilities\nconst textEncoder = new TextEncoder();\n\nfunction encodeVarint(value: number): Uint8Array {\n // Support up to 32-bit values used in tags/lengths; sufficient for our use.\n let v = value >>> 0;\n const bytes: number[] = [];\n while (v >= 0x80) {\n bytes.push((v & 0x7f) | 0x80);\n v >>>= 7;\n }\n bytes.push(v);\n return Uint8Array.from(bytes);\n}\n\nfunction encodeTag(fieldNumber: number, wireType: number): Uint8Array {\n const key = (fieldNumber << 3) | wireType;\n return encodeVarint(key);\n}\n\nfunction encodeStringField(fieldNumber: number, value: string | undefined): Uint8Array[] {\n if (value == null) return [];\n const str = textEncoder.encode(value);\n return [encodeTag(fieldNumber, WT_LEN), encodeVarint(str.length), str];\n}\n\nfunction encodeBytesField(fieldNumber: number, value: Uint8Array): Uint8Array[] {\n return [encodeTag(fieldNumber, WT_LEN), encodeVarint(value.length), value];\n}\n\nfunction encodeDoubleField(fieldNumber: number, value: number | undefined): Uint8Array[] {\n if (value == null) return [];\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, value, true); // little-endian\n return [encodeTag(fieldNumber, WT_64BIT), new Uint8Array(buf)];\n}\n\nfunction concatParts(parts: (Uint8Array | undefined)[]): Uint8Array {\n const filtered = parts.filter((p): p is Uint8Array => p instanceof Uint8Array);\n const total = filtered.reduce((sum, p) => sum + p.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of filtered) { out.set(p, off); off += p.length; }\n return out;\n}\n\nfunction encodeAnyValue(value: AnyValue | undefined): Uint8Array {\n if (!value) return new Uint8Array(0);\n // We only support stringValue directly; other types are coerced to string via JSON.\n let str: string | undefined = undefined;\n if ('stringValue' in value && typeof value.stringValue === 'string') {\n str = value.stringValue;\n } else {\n // Coerce any present field to a string representation to keep encoder simple\n const v = (value as any).doubleValue ?? (value as any).intValue ?? (value as any).boolValue ?? (value as any).bytesValue ?? (value as any).arrayValue ?? (value as any).kvlistValue;\n try { str = typeof v === 'string' ? v : JSON.stringify(v); } catch { str = String(v); }\n }\n const inner = concatParts(encodeStringField(1, str)); // AnyValue.string_value = 1\n return wrapMessage(inner);\n}\n\nfunction encodeKeyValue(kv: KeyValue): Uint8Array {\n const parts: Uint8Array[] = [];\n parts.push(...encodeStringField(1, kv.key)); // key = 1\n parts.push(...encodeBytesField(2, encodeAnyValue(kv.value))); // value = 2 (submessage)\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeResource(res?: Resource): Uint8Array {\n if (!res) return wrapMessage(new Uint8Array(0));\n const parts: Uint8Array[] = [];\n for (const kv of res.attributes ?? []) {\n parts.push(...encodeBytesField(1, encodeKeyValue(kv))); // attributes = 1 (repeated)\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeInstrumentationScope(scope?: InstrumentationScope): Uint8Array {\n const parts: Uint8Array[] = [];\n if (scope) {\n parts.push(...encodeStringField(1, scope.name)); // name = 1\n parts.push(...encodeStringField(2, scope.version)); // version = 2\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeNumberDataPoint(ndp: NumberDataPoint): Uint8Array {\n const parts: Uint8Array[] = [];\n // We only encode the value as double (as_double = 4) and ignore timestamps/attributes for now\n parts.push(...encodeDoubleField(4, ndp.asDouble));\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeGauge(g: Gauge): Uint8Array {\n const parts: Uint8Array[] = [];\n for (const dp of g.dataPoints ?? []) {\n parts.push(...encodeBytesField(1, encodeNumberDataPoint(dp))); // data_points = 1\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeMetric(m: Metric): Uint8Array {\n const parts: Uint8Array[] = [];\n parts.push(...encodeStringField(1, m.name));\n parts.push(...encodeStringField(2, m.description));\n parts.push(...encodeStringField(3, m.unit));\n if (m.gauge) {\n parts.push(...encodeBytesField(5, encodeGauge(m.gauge))); // gauge = 5\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeScopeMetrics(sm: ScopeMetrics): Uint8Array {\n const parts: Uint8Array[] = [];\n parts.push(...encodeBytesField(1, encodeInstrumentationScope(sm.scope))); // scope = 1\n for (const metric of sm.metrics ?? []) {\n parts.push(...encodeBytesField(2, encodeMetric(metric))); // metrics = 2\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeResourceMetrics(rm: ResourceMetrics): Uint8Array {\n const parts: Uint8Array[] = [];\n parts.push(...encodeBytesField(1, encodeResource(rm.resource))); // resource = 1\n for (const sm of rm.scopeMetrics ?? []) {\n parts.push(...encodeBytesField(2, encodeScopeMetrics(sm))); // scope_metrics = 2\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction wrapMessage(inner: Uint8Array): Uint8Array {\n // Caller will add the field tag and length for embedding; this wraps raw fields into a message body\n return inner;\n}\n\nexport function encodeExportMetricsServiceRequestToProto(req: ExportMetricsServiceRequest): Uint8Array {\n const parts: Uint8Array[] = [];\n for (const rm of req.resourceMetrics ?? []) {\n const rmBytes = encodeResourceMetrics(rm);\n parts.push(...encodeBytesField(1, rmBytes)); // resource_metrics = 1 (repeated)\n }\n return concatParts(parts);\n}\n", "\uFEFFexport const toIsoDateTime = (date: Date) => {\n const pad = (n: number) => String(n).padStart(2, '0');\n const pad3 = (n: number) => String(n).padStart(3, '0');\n\n return (\n date.getUTCFullYear() + '-' +\n pad(date.getUTCMonth() + 1) + '-' +\n pad(date.getUTCDate()) + 'T' +\n pad(date.getUTCHours()) + ':' +\n pad(date.getUTCMinutes()) + ':' +\n pad(date.getUTCSeconds()) + '.' +\n pad3(date.getUTCMilliseconds())\n );\n}", "\uFEFF// Minimal OTLP/HTTP 1.1 JSON type definitions for Metrics\n// These follow the protobuf JSON mapping for the OpenTelemetry Metrics protocol.\n// Only commonly used fields are included to keep the types lightweight but useful.\n\nimport type {Logger} from \"winston\";\nimport type {TrackingActivityNames} from \"@seeka-labs/sdk-apps-server\";\n\nexport interface ExportMetricsServiceRequest {\n resourceMetrics: ResourceMetrics[];\n}\n\nexport interface ResourceMetrics {\n resource?: Resource;\n scopeMetrics: ScopeMetrics[];\n schemaUrl?: string;\n}\n\nexport interface Resource {\n attributes?: KeyValue[];\n droppedAttributesCount?: number;\n}\n\nexport interface ScopeMetrics {\n scope?: InstrumentationScope;\n metrics: Metric[];\n schemaUrl?: string;\n}\n\nexport interface InstrumentationScope {\n name: string;\n version?: string;\n attributes?: KeyValue[];\n droppedAttributesCount?: number;\n}\n\nexport interface Metric {\n name: string;\n description?: string;\n unit?: string;\n sum?: Sum;\n gauge?: Gauge;\n histogram?: Histogram;\n exponentialHistogram?: ExponentialHistogram;\n summary?: Summary; // kept for completeness (deprecated in OTLP but some exporters still accept)\n}\n\nexport interface Sum {\n dataPoints: NumberDataPoint[];\n aggregationTemporality: AggregationTemporality; // 0=Unspecified, 1=Delta, 2=Cumulative\n isMonotonic?: boolean;\n}\n\nexport interface Gauge {\n dataPoints: NumberDataPoint[];\n}\n\nexport interface Histogram {\n dataPoints: HistogramDataPoint[];\n aggregationTemporality: AggregationTemporality; // 0=Unspecified, 1=Delta, 2=Cumulative\n}\n\nexport interface ExponentialHistogram {\n dataPoints: ExponentialHistogramDataPoint[];\n aggregationTemporality: AggregationTemporality; // 0=Unspecified, 1=Delta, 2=Cumulative\n}\n\nexport interface Summary {\n dataPoints: SummaryDataPoint[];\n}\n\nexport interface NumberDataPoint {\n attributes?: KeyValue[];\n startTimeUnixNano?: string; // uint64 as string per JSON mapping\n timeUnixNano?: string; // uint64 as string per JSON mapping\n exemplars?: Exemplar[];\n flags?: number; // DataPointFlags bitfield\n asDouble?: number;\n asInt?: string | number; // int64 as string per JSON mapping; allow number for convenience\n}\n\nexport interface HistogramDataPoint {\n attributes?: KeyValue[];\n startTimeUnixNano?: string;\n timeUnixNano?: string;\n count: string | number; // uint64\n sum?: number;\n bucketCounts?: Array<string | number>; // repeated uint64\n explicitBounds?: number[];\n min?: number; // available depending on OTLP version/feature gate\n max?: number; // available depending on OTLP version/feature gate\n exemplars?: Exemplar[];\n flags?: number;\n}\n\nexport interface ExponentialHistogramDataPoint {\n attributes?: KeyValue[];\n startTimeUnixNano?: string;\n timeUnixNano?: string;\n count: string | number; // uint64\n sum?: number;\n scale?: number; // int32\n zeroCount?: string | number; // uint64\n positive?: ExponentialHistogramBuckets;\n negative?: ExponentialHistogramBuckets;\n min?: number;\n max?: number;\n exemplars?: Exemplar[];\n flags?: number;\n}\n\nexport interface ExponentialHistogramBuckets {\n offset?: number; // int32\n bucketCounts?: Array<string | number>; // repeated uint64\n}\n\nexport interface SummaryDataPoint {\n attributes?: KeyValue[];\n startTimeUnixNano?: string;\n timeUnixNano?: string;\n count: string | number; // uint64\n sum: number;\n quantileValues?: ValueAtQuantile[];\n flags?: number;\n}\n\nexport interface ValueAtQuantile {\n quantile: number;\n value: number;\n}\n\nexport interface Exemplar {\n filteredAttributes?: KeyValue[];\n timeUnixNano?: string;\n asDouble?: number;\n asInt?: string | number;\n spanId?: string; // base64-encoded or hex per exporter; keep string\n traceId?: string;\n}\n\n// Common attribute/value types\nexport interface KeyValue {\n key: string;\n value: AnyValue;\n}\n\nexport type AnyValue =\n { stringValue: string }\n | { boolValue: boolean }\n | { intValue: string | number }\n | { doubleValue: number }\n | { bytesValue: string }\n | { arrayValue: ArrayValue }\n | { kvlistValue: KeyValueList };\n\nexport interface ArrayValue {\n values: AnyValue[];\n}\n\nexport interface KeyValueList {\n values: KeyValue[];\n}\n\n// Enum mirrors otlp AggregationTemporality; we allow numbers to align with protobuf JSON mapping\nexport enum AggregationTemporality {\n AGGREGATION_TEMPORALITY_UNSPECIFIED = 0,\n AGGREGATION_TEMPORALITY_DELTA = 1,\n AGGREGATION_TEMPORALITY_CUMULATIVE = 2,\n}\n\n// Helpful alias for consumers\nexport type OtlpMetricsExportRequest = ExportMetricsServiceRequest;\n\n\n// Public types\nexport type SeekaTelemetryClientCoreOptions = {\n appId: string;\n appSecret: string;\n issuerUrl?: string;\n telemetryEndpointUrl: string;\n logger?: Logger;\n protobuf?: boolean;\n};\n\nexport type SeekaTelemetryInstallContext = {\n appId: string;\n appSecret: string;\n organisationId: string;\n appInstallId: string;\n};\n\n\n// export interface AppRuntimeInfo {\n// type: string;\n// ver: string;\n// client: {\n// type: 'server' | 'browser' | string;\n// ver: string;\n// };\n// }\n\n\n// Activity Egress record type mirroring the C# model (JS-friendly)\nexport type ActivityEgressTelemetryRecord = {\n tenantId?: string;\n egressQualityMetrics: Record<string, boolean>;\n egressIdentityMetrics: { qualityRating: number; dataPoints: number };\n personId: string;\n originActivityId?: string;\n convergeInstanceId: string;\n organisationBrandId: string;\n occurredAt?: Date | undefined;\n originSessionIdentifier: string;\n originDnsName: string;\n originActivityName: TrackingActivityNames;\n originActivityNameCustom?: string | null | undefined;\n publishedPayload: unknown;\n destinationPlatformTypeKey:\n | 'google.ads'\n | 'google.analytics'\n | 'meta.capi'\n | 'pinterest.capi'\n | 'tiktok.capi'\n | 'snapchat.capi'\n | (string & {});\n destinationPlatformEgressType: string;\n destinationPlatformIdentifier: string;\n};\n\n\n\n\nexport interface SeekaTelemetryClientCore {\n sendMetric: (metric: ExportMetricsServiceRequest, installContext: SeekaTelemetryInstallContext) => Promise<void>;\n // Convenience helper to send a standardised activity egress metric\n sendEgressMetric: (record: ActivityEgressTelemetryRecord, installContext: SeekaTelemetryInstallContext) => Promise<void>;\n shutdown: () => Promise<void>;\n}\n"],
5
- "mappings": "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",
6
- "names": ["undiciFetch", "UndiciHeaders", "getNewOrCachedAppInstallToken", "textEncoder", "encodeVarint", "value", "v", "bytes", "encodeTag", "fieldNumber", "wireType", "key", "encodeStringField", "str", "encodeBytesField", "encodeDoubleField", "buf", "concatParts", "parts", "filtered", "p", "total", "sum", "out", "off", "encodeAnyValue", "inner", "encodeKeyValue", "kv", "encodeResource", "res", "encodeInstrumentationScope", "scope", "encodeNumberDataPoint", "ndp", "encodeGauge", "g", "dp", "encodeMetric", "m", "encodeScopeMetrics", "sm", "metric", "encodeResourceMetrics", "rm", "encodeExportMetricsServiceRequestToProto", "req", "parts", "rm", "rmBytes", "encodeResourceMetrics", "encodeBytesField", "concatParts", "toIsoDateTime", "date", "pad", "pad3", "urls", "attrPrefix", "SeekaTelemetryClientCoreImpl", "options", "record", "installContext", "attrs", "pushStr", "key", "value", "stringifyJson", "v", "now", "toIsoDateTime", "metric", "telemetryEndpointUrl", "logger", "issuerUrl", "config", "token", "getNewOrCachedAppInstallToken", "base", "url", "headers", "UndiciHeaders", "body", "encodeExportMetricsServiceRequestToProto", "resp", "undiciFetch", "text", "msg", "createSeekaTelemetryClient", "AggregationTemporality"]
4
+ "sourcesContent": ["\uFEFF\n\n// We use undici's fetch for Node environments\nimport { fetch as undiciFetch, Headers as UndiciHeaders } from 'undici';\n// For safely requiring CJS modules from ESM (used under Jest)\n// import { createRequire } from 'node:module';\n\nimport {jwtDecode, type JwtPayload} from \"jwt-decode\";\n\n// OTLP metric types (type-safe input)\nimport {type AppRuntimeInfo, getNewOrCachedAppInstallToken} from \"@seeka-labs/sdk-apps-server\";\nimport type {\n ActivityEgressTelemetryRecord,\n ExportMetricsServiceRequest, KeyValue, SeekaTelemetryClientCore, SeekaTelemetryClientCoreOptions,\n SeekaTelemetryInstallContext\n} from \"./models.ts\";\nimport { encodeExportMetricsServiceRequestToProto } from './otlpEncoder.ts';\nimport {toIsoDateTime} from \"./helpers.ts\";\nimport * as winston from \"winston\";\nimport {urls} from \"@seeka-labs/sdk-apps-server\";\n\nconst attrPrefix = 'seeka.tel';\n\nclass SeekaTelemetryClientCoreImpl implements SeekaTelemetryClientCore {\n private readonly options: SeekaTelemetryClientCoreOptions;\n\n constructor(options: SeekaTelemetryClientCoreOptions) {\n this.options = options;\n }\n\n private pushStr = (key: string, value: string | undefined | null, attrs: KeyValue[]) => {\n if (value == null) return;\n attrs.push({ key: `${attrPrefix}.${key}`, value: { stringValue: String(value) } });\n };\n\n private getStr(key: string, attrs: KeyValue[]): string | undefined {\n const targetKey = `${attrPrefix}.${key}`;\n const attr = attrs.find((a) => a.key === targetKey);\n\n if (attr?.value && 'stringValue' in attr.value) {\n return attr.value.stringValue;\n }\n\n return undefined;\n }\n\n // Convenience: build and send a standardised record.activity.egress metric\n public sendEgressMetric = async (\n record: ActivityEgressTelemetryRecord,\n installContext: SeekaTelemetryInstallContext\n ): Promise<void> => {\n const attrs: KeyValue[] = [];\n\n const stringifyJson = (v: unknown): string => {\n if (typeof v === 'string') return v;\n try { return JSON.stringify(v ?? {}); } catch { return '\"\"'; }\n };\n\n const now = new Date();\n // Required core attributes (resource-level) \u2014 default certain values from installContext when sensible\n this.pushStr('type', 'record.activity.egress', attrs);\n // this.pushStr('tenantId', record.tenantId ?? installContext.organisationId, attrs);\n this.pushStr('originActivityId', record.originActivityId, attrs);\n // this.pushStr('convergeInstanceId', record.convergeInstanceId, attrs);\n // this.pushStr('organisationBrandId', record.organisationBrandId, attrs);\n this.pushStr('occurredAt', toIsoDateTime(record.occurredAt || now), attrs);\n this.pushStr('timestamp', toIsoDateTime(now), attrs);\n // pushStr('occurredAt', (record.occurredAt || now).toISOString());\n // pushStr('timestamp', now.toISOString());\n\n // Strings\n this.pushStr('personId', record.personId, attrs);\n this.pushStr('originSessionIdentifier', record.originSessionIdentifier, attrs);\n this.pushStr('originDnsName', record.originDnsName, attrs);\n this.pushStr('destinationPlatformIdentifier', record.destinationPlatformIdentifier, attrs);\n this.pushStr('destinationPlatformEgressType', record.destinationPlatformEgressType, attrs);\n this.pushStr('destinationPlatformTypeKey', record.destinationPlatformTypeKey, attrs);\n this.pushStr('originActivityName', record.originActivityName, attrs);\n this.pushStr('originActivityNameCustom', record.originActivityNameCustom, attrs);\n\n // JSON payloads as strings per validation expectations\n this.pushStr('publishedPayload', stringifyJson(record.publishedPayload), attrs);\n this.pushStr('egressQualityMetrics', stringifyJson(record.egressQualityMetrics), attrs);\n this.pushStr('egressIdentityMetrics', stringifyJson(record.egressIdentityMetrics), attrs);\n\n const metric: ExportMetricsServiceRequest = {\n resourceMetrics: [\n {\n resource: {\n attributes: attrs\n },\n scopeMetrics: [\n {\n scope: { name: 'seeka.telemetry.apps-server-core', version: '0.0.0' },\n metrics: [\n {\n name: 'record.activity.egress',\n description: 'Activity egress record',\n unit: '1',\n gauge: {\n dataPoints: [\n {\n asDouble: 1\n }\n ]\n }\n }\n ]\n }\n ]\n }\n ]\n };\n\n await this.sendMetric(metric, installContext);\n };\n\n // Minimal serverless-friendly metric sender using OTLP/HTTP 1.1 Protobuf\n public sendMetric = async (metric: ExportMetricsServiceRequest, installContext: SeekaTelemetryInstallContext): Promise<void> => {\n const { telemetryEndpointUrl, logger, issuerUrl } = this.options;\n\n // Minimal runtime guard to help diagnose common shape mistakes without heavy validation\n if (!metric || !Array.isArray((metric as any).resourceMetrics)) {\n throw new Error('SeekaTelemetry: metric must be an OTLP ExportMetricsServiceRequest with a resourceMetrics array');\n }\n\n // Lazily load the server SDK. Prefer require() so Jest can map to a CJS mock.\n // let getNewOrCachedAppInstallToken: any;\n // try {\n // const req = createRequire(import.meta.url);\n // const mod = req('@seeka-labs/sdk-apps-server');\n // getNewOrCachedAppInstallToken = mod.getNewOrCachedAppInstallToken || mod.default?.getNewOrCachedAppInstallToken;\n // } catch {\n // // Fallback to dynamic import (ESM)\n // try {\n // ({ getNewOrCachedAppInstallToken } = await import('@seeka-labs/sdk-apps-server'));\n // } catch {\n // // Last resort: explicit ESM file path (if package exports are strict)\n // ({ getNewOrCachedAppInstallToken } = await import('@seeka-labs/sdk-apps-server/dist/sdk-apps-server.module.mjs'));\n // }\n // }\n\n // Build a minimal config POJO with the fields used by the auth flow\n const config: any = {\n appId: installContext.appId,\n appSecret: installContext.appSecret,\n issuerUrl: issuerUrl,\n ingestUrl: telemetryEndpointUrl,\n // organisationId: installContext.organisationId,\n applicationInstallId: installContext.appInstallId,\n logger,\n grantedPermissions: [],\n runtime: this.getRuntimeInfo()\n };\n\n const token = await\n getNewOrCachedAppInstallToken(config as any);\n\n if (!token || !token.access_token) {\n throw new Error('SeekaTelemetry: failed to get access token for install');\n }\n\n const base = telemetryEndpointUrl.endsWith('/') ? telemetryEndpointUrl : telemetryEndpointUrl + '/';\n const url = new URL('v1/metrics', base).toString();\n const decoded = jwtDecode<JwtPayload & {converge_instance_id: string, org_brand_id: string, tenantid: string}>(token.access_token);\n\n const headers = new UndiciHeaders();\n headers.set('Content-Type', this.options.protobuf ? 'application/x-protobuf' : 'application/json');\n headers.set('Accept', this.options.protobuf ? 'application/x-protobuf' : 'application/json');\n headers.set('Authorization', `Bearer ${token.access_token}`);\n headers.set('X-OrgId', decoded.tenantid);\n\n // Encode to Protobuf (OTLP/HTTP 1.1 over HTTP/1.1)\n // const attrs = metric.resourceMetrics[0].resource.attributes['convergeInstanceId'] = ;\n const attrs = metric.resourceMetrics[0]?.resource?.attributes || [];\n\n this.pushStr('tenantId', decoded.tenantid, attrs);\n this.pushStr('organisationBrandId', decoded.org_brand_id, attrs);\n if(this.getStr('type', attrs) === 'record.activity.egress'){\n // set convergeInstanceId to the converge_instance_id claim of the token\n // get claims from jwt token.access_token\n // console.log(JSON.stringify(decoded));\n\n this.pushStr('convergeInstanceId', decoded.converge_instance_id, attrs);\n }\n\n const body = this.options.protobuf ? encodeExportMetricsServiceRequestToProto(metric) : JSON.stringify(metric);\n\n // Avoid batching entirely: send exactly what we were given, immediately await response\n const resp = await undiciFetch(url, {\n method: 'POST',\n headers: headers as any,\n body\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => '');\n const msg = `SeekaTelemetry: metric send failed with status ${resp.status} ${resp.statusText}`;\n logger?.error(msg, { body: text });\n throw new Error(msg);\n }\n }\n\n public shutdown = async (): Promise<void> => {\n // Core package has no SDK to shutdown; provided for API symmetry.\n }\n\n // NodeSDK support is intentionally omitted from the core package.\n\n private getRuntimeInfo(): AppRuntimeInfo {\n return {\n type: 'sdk/js/apps-server-telemetry-core',\n ver: '0.0.0',\n client: {\n type: 'server',\n ver: process.versions?.node || 'unknown'\n }\n };\n }\n}\n\nexport const createSeekaTelemetryClient = (options?: SeekaTelemetryClientCoreOptions | null | undefined, logger?: winston.Logger): SeekaTelemetryClientCore => {\n return new SeekaTelemetryClientCoreImpl({\n ...options,\n appId: options?.appId || process.env.SEEKA_APP_ID as string,\n appSecret: options?.appSecret || process.env.SEEKA_APP_SECRET as string,\n telemetryEndpointUrl: options?.telemetryEndpointUrl || process.env.SEEKA_TELEMETRY_URL || urls.defaultTelemetryUrl,\n issuerUrl: options?.issuerUrl || process.env.SEEKA_ISSUER_URL || urls.defaultIssuerUrl,\n logger\n });\n};\n", "\uFEFF// Minimal OTLP Metrics protobuf encoder for the subset we use (HTTP/1.1, no HTTP/2)\n// We hand-encode only the fields we need for our gauge metric with string attributes.\n// This avoids pulling in a full protobuf runtime and keeps the package light.\n\nimport type {\n AnyValue,\n ExportMetricsServiceRequest,\n Gauge,\n InstrumentationScope,\n KeyValue,\n Metric,\n NumberDataPoint,\n Resource,\n ResourceMetrics,\n ScopeMetrics,\n} from './models.ts';\n\n// Protobuf wire types\n// const WT_VARINT = 0;\nconst WT_64BIT = 1; // fixed64 / double\nconst WT_LEN = 2; // length-delimited (strings, bytes, submessages)\n\n// Utilities\nconst textEncoder = new TextEncoder();\n\nfunction encodeVarint(value: number): Uint8Array {\n // Support up to 32-bit values used in tags/lengths; sufficient for our use.\n let v = value >>> 0;\n const bytes: number[] = [];\n while (v >= 0x80) {\n bytes.push((v & 0x7f) | 0x80);\n v >>>= 7;\n }\n bytes.push(v);\n return Uint8Array.from(bytes);\n}\n\nfunction encodeTag(fieldNumber: number, wireType: number): Uint8Array {\n const key = (fieldNumber << 3) | wireType;\n return encodeVarint(key);\n}\n\nfunction encodeStringField(fieldNumber: number, value: string | undefined): Uint8Array[] {\n if (value == null) return [];\n const str = textEncoder.encode(value);\n return [encodeTag(fieldNumber, WT_LEN), encodeVarint(str.length), str];\n}\n\nfunction encodeBytesField(fieldNumber: number, value: Uint8Array): Uint8Array[] {\n return [encodeTag(fieldNumber, WT_LEN), encodeVarint(value.length), value];\n}\n\nfunction encodeDoubleField(fieldNumber: number, value: number | undefined): Uint8Array[] {\n if (value == null) return [];\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, value, true); // little-endian\n return [encodeTag(fieldNumber, WT_64BIT), new Uint8Array(buf)];\n}\n\nfunction concatParts(parts: (Uint8Array | undefined)[]): Uint8Array {\n const filtered = parts.filter((p): p is Uint8Array => p instanceof Uint8Array);\n const total = filtered.reduce((sum, p) => sum + p.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of filtered) { out.set(p, off); off += p.length; }\n return out;\n}\n\nfunction encodeAnyValue(value: AnyValue | undefined): Uint8Array {\n if (!value) return new Uint8Array(0);\n // We only support stringValue directly; other types are coerced to string via JSON.\n let str: string | undefined = undefined;\n if ('stringValue' in value && typeof value.stringValue === 'string') {\n str = value.stringValue;\n } else {\n // Coerce any present field to a string representation to keep encoder simple\n const v = (value as any).doubleValue ?? (value as any).intValue ?? (value as any).boolValue ?? (value as any).bytesValue ?? (value as any).arrayValue ?? (value as any).kvlistValue;\n try { str = typeof v === 'string' ? v : JSON.stringify(v); } catch { str = String(v); }\n }\n const inner = concatParts(encodeStringField(1, str)); // AnyValue.string_value = 1\n return wrapMessage(inner);\n}\n\nfunction encodeKeyValue(kv: KeyValue): Uint8Array {\n const parts: Uint8Array[] = [];\n parts.push(...encodeStringField(1, kv.key)); // key = 1\n parts.push(...encodeBytesField(2, encodeAnyValue(kv.value))); // value = 2 (submessage)\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeResource(res?: Resource): Uint8Array {\n if (!res) return wrapMessage(new Uint8Array(0));\n const parts: Uint8Array[] = [];\n for (const kv of res.attributes ?? []) {\n parts.push(...encodeBytesField(1, encodeKeyValue(kv))); // attributes = 1 (repeated)\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeInstrumentationScope(scope?: InstrumentationScope): Uint8Array {\n const parts: Uint8Array[] = [];\n if (scope) {\n parts.push(...encodeStringField(1, scope.name)); // name = 1\n parts.push(...encodeStringField(2, scope.version)); // version = 2\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeNumberDataPoint(ndp: NumberDataPoint): Uint8Array {\n const parts: Uint8Array[] = [];\n // We only encode the value as double (as_double = 4) and ignore timestamps/attributes for now\n parts.push(...encodeDoubleField(4, ndp.asDouble));\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeGauge(g: Gauge): Uint8Array {\n const parts: Uint8Array[] = [];\n for (const dp of g.dataPoints ?? []) {\n parts.push(...encodeBytesField(1, encodeNumberDataPoint(dp))); // data_points = 1\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeMetric(m: Metric): Uint8Array {\n const parts: Uint8Array[] = [];\n parts.push(...encodeStringField(1, m.name));\n parts.push(...encodeStringField(2, m.description));\n parts.push(...encodeStringField(3, m.unit));\n if (m.gauge) {\n parts.push(...encodeBytesField(5, encodeGauge(m.gauge))); // gauge = 5\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeScopeMetrics(sm: ScopeMetrics): Uint8Array {\n const parts: Uint8Array[] = [];\n parts.push(...encodeBytesField(1, encodeInstrumentationScope(sm.scope))); // scope = 1\n for (const metric of sm.metrics ?? []) {\n parts.push(...encodeBytesField(2, encodeMetric(metric))); // metrics = 2\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction encodeResourceMetrics(rm: ResourceMetrics): Uint8Array {\n const parts: Uint8Array[] = [];\n parts.push(...encodeBytesField(1, encodeResource(rm.resource))); // resource = 1\n for (const sm of rm.scopeMetrics ?? []) {\n parts.push(...encodeBytesField(2, encodeScopeMetrics(sm))); // scope_metrics = 2\n }\n return wrapMessage(concatParts(parts));\n}\n\nfunction wrapMessage(inner: Uint8Array): Uint8Array {\n // Caller will add the field tag and length for embedding; this wraps raw fields into a message body\n return inner;\n}\n\nexport function encodeExportMetricsServiceRequestToProto(req: ExportMetricsServiceRequest): Uint8Array {\n const parts: Uint8Array[] = [];\n for (const rm of req.resourceMetrics ?? []) {\n const rmBytes = encodeResourceMetrics(rm);\n parts.push(...encodeBytesField(1, rmBytes)); // resource_metrics = 1 (repeated)\n }\n return concatParts(parts);\n}\n", "\uFEFFexport const toIsoDateTime = (date: Date) => {\n const pad = (n: number) => String(n).padStart(2, '0');\n const pad3 = (n: number) => String(n).padStart(3, '0');\n\n return (\n date.getUTCFullYear() + '-' +\n pad(date.getUTCMonth() + 1) + '-' +\n pad(date.getUTCDate()) + 'T' +\n pad(date.getUTCHours()) + ':' +\n pad(date.getUTCMinutes()) + ':' +\n pad(date.getUTCSeconds()) + '.' +\n pad3(date.getUTCMilliseconds())\n );\n}", "\uFEFF// Minimal OTLP/HTTP 1.1 JSON type definitions for Metrics\n// These follow the protobuf JSON mapping for the OpenTelemetry Metrics protocol.\n// Only commonly used fields are included to keep the types lightweight but useful.\n\nimport type {Logger} from \"winston\";\nimport type {TrackingActivityNames, SeekaActivityAcceptedWebhookContent} from \"@seeka-labs/sdk-apps-server\";\n\nexport interface ExportMetricsServiceRequest {\n resourceMetrics: ResourceMetrics[];\n}\n\nexport interface ResourceMetrics {\n resource?: Resource;\n scopeMetrics: ScopeMetrics[];\n schemaUrl?: string;\n}\n\nexport interface Resource {\n attributes?: KeyValue[];\n droppedAttributesCount?: number;\n}\n\nexport interface ScopeMetrics {\n scope?: InstrumentationScope;\n metrics: Metric[];\n schemaUrl?: string;\n}\n\nexport interface InstrumentationScope {\n name: string;\n version?: string;\n attributes?: KeyValue[];\n droppedAttributesCount?: number;\n}\n\nexport interface Metric {\n name: string;\n description?: string;\n unit?: string;\n sum?: Sum;\n gauge?: Gauge;\n histogram?: Histogram;\n exponentialHistogram?: ExponentialHistogram;\n summary?: Summary; // kept for completeness (deprecated in OTLP but some exporters still accept)\n}\n\nexport interface Sum {\n dataPoints: NumberDataPoint[];\n aggregationTemporality: AggregationTemporality; // 0=Unspecified, 1=Delta, 2=Cumulative\n isMonotonic?: boolean;\n}\n\nexport interface Gauge {\n dataPoints: NumberDataPoint[];\n}\n\nexport interface Histogram {\n dataPoints: HistogramDataPoint[];\n aggregationTemporality: AggregationTemporality; // 0=Unspecified, 1=Delta, 2=Cumulative\n}\n\nexport interface ExponentialHistogram {\n dataPoints: ExponentialHistogramDataPoint[];\n aggregationTemporality: AggregationTemporality; // 0=Unspecified, 1=Delta, 2=Cumulative\n}\n\nexport interface Summary {\n dataPoints: SummaryDataPoint[];\n}\n\nexport interface NumberDataPoint {\n attributes?: KeyValue[];\n startTimeUnixNano?: string; // uint64 as string per JSON mapping\n timeUnixNano?: string; // uint64 as string per JSON mapping\n exemplars?: Exemplar[];\n flags?: number; // DataPointFlags bitfield\n asDouble?: number;\n asInt?: string | number; // int64 as string per JSON mapping; allow number for convenience\n}\n\nexport interface HistogramDataPoint {\n attributes?: KeyValue[];\n startTimeUnixNano?: string;\n timeUnixNano?: string;\n count: string | number; // uint64\n sum?: number;\n bucketCounts?: Array<string | number>; // repeated uint64\n explicitBounds?: number[];\n min?: number; // available depending on OTLP version/feature gate\n max?: number; // available depending on OTLP version/feature gate\n exemplars?: Exemplar[];\n flags?: number;\n}\n\nexport interface ExponentialHistogramDataPoint {\n attributes?: KeyValue[];\n startTimeUnixNano?: string;\n timeUnixNano?: string;\n count: string | number; // uint64\n sum?: number;\n scale?: number; // int32\n zeroCount?: string | number; // uint64\n positive?: ExponentialHistogramBuckets;\n negative?: ExponentialHistogramBuckets;\n min?: number;\n max?: number;\n exemplars?: Exemplar[];\n flags?: number;\n}\n\nexport interface ExponentialHistogramBuckets {\n offset?: number; // int32\n bucketCounts?: Array<string | number>; // repeated uint64\n}\n\nexport interface SummaryDataPoint {\n attributes?: KeyValue[];\n startTimeUnixNano?: string;\n timeUnixNano?: string;\n count: string | number; // uint64\n sum: number;\n quantileValues?: ValueAtQuantile[];\n flags?: number;\n}\n\nexport interface ValueAtQuantile {\n quantile: number;\n value: number;\n}\n\nexport interface Exemplar {\n filteredAttributes?: KeyValue[];\n timeUnixNano?: string;\n asDouble?: number;\n asInt?: string | number;\n spanId?: string; // base64-encoded or hex per exporter; keep string\n traceId?: string;\n}\n\n// Common attribute/value types\nexport interface KeyValue {\n key: string;\n value: AnyValue;\n}\n\nexport type AnyValue =\n { stringValue: string }\n | { boolValue: boolean }\n | { intValue: string | number }\n | { doubleValue: number }\n | { bytesValue: string }\n | { arrayValue: ArrayValue }\n | { kvlistValue: KeyValueList };\n\nexport interface ArrayValue {\n values: AnyValue[];\n}\n\nexport interface KeyValueList {\n values: KeyValue[];\n}\n\n// Enum mirrors otlp AggregationTemporality; we allow numbers to align with protobuf JSON mapping\nexport enum AggregationTemporality {\n AGGREGATION_TEMPORALITY_UNSPECIFIED = 0,\n AGGREGATION_TEMPORALITY_DELTA = 1,\n AGGREGATION_TEMPORALITY_CUMULATIVE = 2,\n}\n\n// Helpful alias for consumers\nexport type OtlpMetricsExportRequest = ExportMetricsServiceRequest;\n\n\n// Public types\nexport type SeekaTelemetryClientCoreOptions = {\n appId: string;\n appSecret: string;\n issuerUrl?: string;\n telemetryEndpointUrl: string;\n logger?: Logger;\n protobuf?: boolean;\n};\n\nexport type SeekaTelemetryInstallContext = {\n appId: string;\n appSecret: string;\n // organisationId: string;\n appInstallId: string;\n};\n\n\n// export interface AppRuntimeInfo {\n// type: string;\n// ver: string;\n// client: {\n// type: 'server' | 'browser' | string;\n// ver: string;\n// };\n// }\n\n\n// Activity Egress record type mirroring the C# model (JS-friendly)\nexport type ActivityEgressTelemetryRecord = ActivityEgressTelemetryRecordBase & ActivityEgressTelemetryRecordMetrics & {\n personId: string;\n originActivityId?: string;\n occurredAt?: Date | undefined;\n originSessionIdentifier: string;\n originDnsName: string;\n originActivityName: TrackingActivityNames;\n originActivityNameCustom?: string | null | undefined;\n};\n\nexport interface ActivityEgressTelemetryRecordBase {\n publishedPayload: unknown;\n destinationPlatformTypeKey:\n | 'google.ads'\n | 'google.analytics'\n | 'meta.capi'\n | 'pinterest.capi'\n | 'tiktok.capi'\n | 'snapchat.capi'\n | (string & {});\n destinationPlatformEgressType: string;\n destinationPlatformIdentifier: string;\n}\n\nexport interface ActivityEgressTelemetryRecordMetrics {\n egressQualityMetrics: Record<string, boolean>;\n egressIdentityMetrics: { qualityRating: number; dataPoints: number };\n}\n\nexport const createEgressTelemetryRecord = (egressRecord: ActivityEgressTelemetryRecordBase, egressMetrics: ActivityEgressTelemetryRecordMetrics, originActivity: SeekaActivityAcceptedWebhookContent): ActivityEgressTelemetryRecord => {\n return {\n ...egressMetrics,\n ...egressRecord,\n // tenantId: appInstallState.organisationId,\n // egressQualityMetrics: {'fn': true, 'em': true},\n // egressIdentityMetrics: {qualityRating: 0.8, dataPoints: 7},\n personId: originActivity.personId as string,\n originActivityId: originActivity.activity?.activityId,\n // convergeInstanceId: process.env.SEEKA_CONVERGE_INSTANCE_ID as string,\n // organisationBrandId: appInstallState.organisationBrandId,\n occurredAt: new Date(),\n originActivityName: originActivity.activity?.activityName as TrackingActivityNames,\n originActivityNameCustom: originActivity.activity?.activityNameCustom,\n originSessionIdentifier: originActivity.source?.sess as string,\n originDnsName: new URL(originActivity.source?.loc ||'').hostname.toLowerCase()\n }\n};\n\n\nexport interface SeekaTelemetryClientCore {\n sendMetric: (metric: ExportMetricsServiceRequest, installContext: SeekaTelemetryInstallContext) => Promise<void>;\n // Convenience helper to send a standardised activity egress metric\n sendEgressMetric: (record: ActivityEgressTelemetryRecord, installContext: SeekaTelemetryInstallContext) => Promise<void>;\n shutdown: () => Promise<void>;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["undiciFetch", "UndiciHeaders", "jwtDecode", "getNewOrCachedAppInstallToken", "textEncoder", "encodeVarint", "value", "v", "bytes", "encodeTag", "fieldNumber", "wireType", "key", "encodeStringField", "str", "encodeBytesField", "encodeDoubleField", "buf", "concatParts", "parts", "filtered", "p", "total", "sum", "out", "off", "encodeAnyValue", "inner", "encodeKeyValue", "kv", "encodeResource", "res", "encodeInstrumentationScope", "scope", "encodeNumberDataPoint", "ndp", "encodeGauge", "g", "dp", "encodeMetric", "m", "encodeScopeMetrics", "sm", "metric", "encodeResourceMetrics", "rm", "encodeExportMetricsServiceRequestToProto", "req", "parts", "rm", "rmBytes", "encodeResourceMetrics", "encodeBytesField", "concatParts", "toIsoDateTime", "date", "pad", "n", "pad3", "urls", "attrPrefix", "SeekaTelemetryClientCoreImpl", "options", "key", "value", "attrs", "targetKey", "attr", "a", "record", "installContext", "stringifyJson", "v", "now", "toIsoDateTime", "metric", "telemetryEndpointUrl", "logger", "issuerUrl", "config", "token", "getNewOrCachedAppInstallToken", "base", "url", "decoded", "jwtDecode", "headers", "UndiciHeaders", "body", "encodeExportMetricsServiceRequestToProto", "resp", "undiciFetch", "text", "msg", "createSeekaTelemetryClient", "AggregationTemporality", "createEgressTelemetryRecord", "egressRecord", "egressMetrics", "originActivity"]
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import type { Logger } from "winston";
2
- import type { TrackingActivityNames } from "@seeka-labs/sdk-apps-server";
2
+ import type { TrackingActivityNames, SeekaActivityAcceptedWebhookContent } from "@seeka-labs/sdk-apps-server";
3
3
  export interface ExportMetricsServiceRequest {
4
4
  resourceMetrics: ResourceMetrics[];
5
5
  }
@@ -156,30 +156,31 @@ export type SeekaTelemetryClientCoreOptions = {
156
156
  export type SeekaTelemetryInstallContext = {
157
157
  appId: string;
158
158
  appSecret: string;
159
- organisationId: string;
160
159
  appInstallId: string;
161
160
  };
162
- export type ActivityEgressTelemetryRecord = {
163
- tenantId?: string;
164
- egressQualityMetrics: Record<string, boolean>;
165
- egressIdentityMetrics: {
166
- qualityRating: number;
167
- dataPoints: number;
168
- };
161
+ export type ActivityEgressTelemetryRecord = ActivityEgressTelemetryRecordBase & ActivityEgressTelemetryRecordMetrics & {
169
162
  personId: string;
170
163
  originActivityId?: string;
171
- convergeInstanceId: string;
172
- organisationBrandId: string;
173
164
  occurredAt?: Date | undefined;
174
165
  originSessionIdentifier: string;
175
166
  originDnsName: string;
176
167
  originActivityName: TrackingActivityNames;
177
168
  originActivityNameCustom?: string | null | undefined;
169
+ };
170
+ export interface ActivityEgressTelemetryRecordBase {
178
171
  publishedPayload: unknown;
179
172
  destinationPlatformTypeKey: 'google.ads' | 'google.analytics' | 'meta.capi' | 'pinterest.capi' | 'tiktok.capi' | 'snapchat.capi' | (string & {});
180
173
  destinationPlatformEgressType: string;
181
174
  destinationPlatformIdentifier: string;
182
- };
175
+ }
176
+ export interface ActivityEgressTelemetryRecordMetrics {
177
+ egressQualityMetrics: Record<string, boolean>;
178
+ egressIdentityMetrics: {
179
+ qualityRating: number;
180
+ dataPoints: number;
181
+ };
182
+ }
183
+ export declare const createEgressTelemetryRecord: (egressRecord: ActivityEgressTelemetryRecordBase, egressMetrics: ActivityEgressTelemetryRecordMetrics, originActivity: SeekaActivityAcceptedWebhookContent) => ActivityEgressTelemetryRecord;
183
184
  export interface SeekaTelemetryClientCore {
184
185
  sendMetric: (metric: ExportMetricsServiceRequest, installContext: SeekaTelemetryInstallContext) => Promise<void>;
185
186
  sendEgressMetric: (record: ActivityEgressTelemetryRecord, installContext: SeekaTelemetryInstallContext) => Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seeka-labs/sdk-apps-server-telemetry-core",
3
- "version": "2.2.2",
3
+ "version": "2.2.4",
4
4
  "description": "Seeka - Apps SDK - Server Telemetry Core (lightweight OTLP/HTTP exporter wrapper)",
5
5
  "author": "SEEKA <platform@seeka.co>",
6
6
  "license": "MIT",
@@ -37,11 +37,14 @@
37
37
  "undici": "^7",
38
38
  "winston": "^3"
39
39
  },
40
+ "dependencies": {
41
+ "jwt-decode": "^4"
42
+ },
40
43
  "devDependencies": {
41
44
  "@babel/core": "^7",
42
45
  "@babel/preset-env": "^7",
43
46
  "@babel/preset-typescript": "^7",
44
- "@seeka-labs/sdk-apps-server": "2.2.2",
47
+ "@seeka-labs/sdk-apps-server": "2.2.4",
45
48
  "@types/node": "^24",
46
49
  "ava": "^6",
47
50
  "axios": "^1",
@@ -56,5 +59,5 @@
56
59
  "undici": "^7",
57
60
  "winston": "^3"
58
61
  },
59
- "gitHead": "642ed62df0a2a50857e352fe65de6f3adc0c4f5d"
62
+ "gitHead": "029da967dd19ad000be10df6ea6dbaf08bcf0906"
60
63
  }