testchimp-rum-js 0.0.4 → 0.0.6

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.
package/README.md CHANGED
@@ -49,11 +49,11 @@ Initializes the RUM client. Call once before using `emit`, `flush`, or `resetSes
49
49
  |-----------|------|----------|--------------|
50
50
  | `config.projectId` | `string` | Yes | TestChimp project ID. |
51
51
  | `config.apiKey` | `string` | Yes | TestChimp API key for this project. |
52
+ | `config.environment` | `string` | Yes | Logical environment for the session (e.g. `'production'`, `'staging'`). |
52
53
  | `config.sessionId` | `string` | No | Override session ID (otherwise derived from `localStorage` or generated). |
53
- | `config.environment` | `string` | No | Logical environment for the session (e.g. `'production'`, `'staging'`). |
54
54
  | `config.release` | `string` | No | Application release/version identifier (e.g. `'2.1.0'`). |
55
55
  | `config.branchName` | `string` | No | Git branch name associated with this session (e.g. `'feature/checkout'`). |
56
- | `config.sessionMetadata` | `Struct` | No | Additional immutable metadata for the session (same validation as event metadata). Do **not** put `environment`, `release`, or `branch_name` here—use the top-level fields above. |
56
+ | `config.sessionMetadata` | `Struct` | No | Additional immutable metadata for the session (same validation as event metadata). Do **not** put `environment`, `release`, or `branchName` here—use the top-level fields above. |
57
57
  | `config.config` | `object` | No | Optional tuning; see [Configuration options](#configuration-options). |
58
58
 
59
59
  **Example with options**
@@ -128,6 +128,7 @@ Pass these under `config` in `init()`:
128
128
  | Option | Type | Default | Description |
129
129
  |--------|------|--------|-------------|
130
130
  | `captureEnabled` | `boolean` | `true` | If `false`, `emit` is a no-op. |
131
+ | `enableDefaultSessionMetadata` | `boolean` | `true` | When `true` (default), the session init request is automatically populated with client-derived metadata (browser, device type, OS, language, timezone). Set to `false` to disable and send only your own `sessionMetadata`. |
131
132
  | `maxEventsPerSession` | `number` | `100` | Max events accepted per session (by title count + repeats). |
132
133
  | `maxRepeatsPerEvent` | `number` | `3` | Max number of events with the same `title` per session. |
133
134
  | `eventSendInterval` | `number` | `10000` | Interval (ms) for sending buffered events. |
@@ -135,6 +136,22 @@ Pass these under `config` in `init()`:
135
136
  | `inactivityTimeoutMillis` | `number` | `1800000` (30 min) | Session considered expired after this much inactivity; next load gets a new session. |
136
137
  | `testchimpEndpoint` | `string` | `'https://ingress.testchimp.io'` | Base URL for RUM API (session start and events). |
137
138
 
139
+ **Default session metadata (updated behaviour)**
140
+
141
+ - **Config:** `enableDefaultSessionMetadata` under `config` in `init()`.
142
+ - **Default value:** `true`. Session init requests are automatically populated with the metadata below unless you set it to `false`.
143
+ - **What gets populated:** When enabled, the **session init** request (only) includes the following client-derived keys in `metadata`. They are computed in the browser from `navigator` and `Intl`; you do not need to pass them. User-provided `sessionMetadata` overrides any of these if you use the same key name.
144
+
145
+ | Key | Populated with |
146
+ |-----|----------------|
147
+ | `_browser` | Browser name only (e.g. Chrome, Firefox, Edge, Safari). No version. |
148
+ | `_device_type` | One of: `desktop`, `mobile`, `tablet`. |
149
+ | `_os` | Normalized OS (e.g. mac, windows, linux, ios, android). |
150
+ | `_language` | Browser language (e.g. en-US). |
151
+ | `_timezone` | IANA timezone (e.g. America/New_York). |
152
+
153
+ These fields are added **only to the session init** call (`/rum/session/start`). Individual `emit()` calls are unchanged and do not include this metadata.
154
+
138
155
  **Example: high-frequency sampling**
139
156
 
140
157
  ```javascript
@@ -0,0 +1,7 @@
1
+ import type { Struct } from "./validation";
2
+ /**
3
+ * Returns client-derived default metadata for session init only.
4
+ * Safe to call in non-browser environments (returns {}).
5
+ */
6
+ export declare function getDefaultSessionMetadata(): Struct;
7
+ //# sourceMappingURL=defaultSessionMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultSessionMetadata.d.ts","sourceRoot":"","sources":["../src/defaultSessionMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAwE3C;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CASlD"}
package/dist/index.d.ts CHANGED
@@ -4,12 +4,13 @@ export interface InitConfig {
4
4
  projectId: string;
5
5
  apiKey: string;
6
6
  sessionId?: string;
7
- environment?: string;
7
+ environment: string;
8
8
  release?: string;
9
9
  branchName?: string;
10
10
  sessionMetadata?: Struct;
11
11
  config?: {
12
12
  captureEnabled?: boolean;
13
+ enableDefaultSessionMetadata?: boolean;
13
14
  maxEventsPerSession?: number;
14
15
  maxRepeatsPerEvent?: number;
15
16
  eventSendInterval?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAOlC,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE;QACP,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAsCD,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAiF7C;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAkB3C;AAED,wBAAgB,KAAK,IAAI,IAAI,CAI5B;AAED,wBAAgB,YAAY,IAAI,MAAM,CAKrC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAgBnC;AAGD,QAAA,MAAM,SAAS;;;;;;CAMd,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAOlC,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE;QACP,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,4BAA4B,CAAC,EAAE,OAAO,CAAC;QACvC,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAsCD,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAqF7C;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAkB3C;AAED,wBAAgB,KAAK,IAAI,IAAI,CAI5B;AAED,wBAAgB,YAAY,IAAI,MAAM,CAKrC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAgBnC;AAGD,QAAA,MAAM,SAAS;;;;;;CAMd,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- "use strict";var testchimp=(()=>{var y=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var q=(e,t)=>{for(var n in t)y(e,n,{get:t[n],enumerable:!0})},W=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of J(t))!Z.call(e,s)&&s!==n&&y(e,s,{get:()=>t[s],enumerable:!(r=$(t,s))||r.enumerable});return e};var Q=e=>W(y({},"__esModule",{value:!0}),e);var pe={};q(pe,{default:()=>me,emit:()=>j,flush:()=>K,getSessionId:()=>Y,init:()=>z,resetSession:()=>F});function ee(){if(typeof fetch<"u")return fetch;throw new Error("testchimp-rum-js: fetch is not available. Use a browser or Node 18+.")}function te(){if(typeof window>"u")return;let t=window.__TC_CI_TEST_INFO;return typeof t=="string"&&t.length>0?t:void 0}function ne(e,t){let n=e.baseUrl.replace(/\/$/,""),r=t.startsWith("/")?t:`/${t}`;return`${n}${r}`}async function E(e,t,n,r){try{let s=ne(e,t),o={"Content-Type":"application/json","Project-Id":e.projectId,"TestChimp-Api-Key":e.apiKey,...r?.keepalive&&{"Keep-Alive":"true"}},f=te();return f&&(o["ci-test-info"]=f),(await ee()(s,{method:"POST",headers:o,body:JSON.stringify(n)})).ok}catch{return!1}}var N="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function I(){let e=Date.now(),t=re(e,10),n=ie(16);return t+n}function re(e,t){let n="";for(let r=t;r>0;r--)n=N[e%32]+n,e=Math.floor(e/32);return n}function ie(e){let t=new Uint8Array(e);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(t);else for(let r=0;r<e;r++)t[r]=Math.floor(Math.random()*256);let n="";for(let r=0;r<e;r++)n+=N[t[r]%32];return n}function w(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}function M(e){if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,reason:"metadata must be a plain object"};let t=Object.keys(e);if(t.length>10)return{ok:!1,reason:"metadata has more than 10 keys"};let n={};for(let r of t){if(r.length>50)return{ok:!1,reason:"metadata key exceeds 50 chars"};let s=e[r];if(Array.isArray(s)){if(s.length>50)return{ok:!1,reason:"metadata array length exceeds 50"};for(let o=0;o<s.length;o++){let f=s[o];if(!w(f))return{ok:!1,reason:"metadata array values must be string, number, boolean, or null"};if(typeof f=="string"&&f.length>200)return{ok:!1,reason:"metadata string in array exceeds 200 chars"}}n[r]=s}else if(w(s)){if(typeof s=="string"&&s.length>200)return{ok:!1,reason:"metadata string value exceeds 200 chars"};n[r]=s}else return{ok:!1,reason:"metadata values must be primitive or array of primitives (no nested objects)"}}return{ok:!0,value:n}}function C(e){if(!e.title||typeof e.title!="string")return console.warn("[testchimp-rum] Event dropped: title is required"),null;if(e.title.length>100)return console.warn("[testchimp-rum] Event dropped: title exceeds 100 chars"),null;let t;if(e.metadata!=null&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)){let s=M(e.metadata);if(!s.ok)return console.warn(`[testchimp-rum] Event dropped: ${s.reason}`),null;t=Object.keys(s.value).length>0?s.value:void 0}let n={title:e.title,timestampMillis:Date.now(),metadata:t},r=JSON.stringify(n);return new TextEncoder().encode(r).length>5120?(console.warn("[testchimp-rum] Event dropped: total size exceeds 5120 bytes"),null):n}function v(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=M(e);if(t.ok)return Object.keys(t.value).length>0?t.value:void 0}var h="testchimp_session_id",g="testchimp_last_activity",T="testchimp_event_count",_="testchimp_event_type_counts";function l(){try{return typeof window<"u"&&window.localStorage?window.localStorage:null}catch{return null}}function L(e,t,n){if(e&&typeof e=="string"&&e.length>0)return{sessionId:e,isNew:!1};let r=l();if(!r)return{sessionId:I(),isNew:!0};let s=r.getItem(h),o=r.getItem(g),f=Date.now();if(s&&o){let d=parseInt(o,10);if(!isNaN(d)&&f-d<n)return{sessionId:s,isNew:!1}}return{sessionId:I(),isNew:!0}}function R(e,t){let n=l();if(!n)return;let r=Date.now();n.setItem(h,e),n.setItem(g,String(r)),n.setItem(T,"0");let s=v(t);if(s)try{n.setItem("testchimp_session_metadata",JSON.stringify(s))}catch{}let o={};try{n.setItem(_,JSON.stringify(o))}catch{}}function D(){let e=l();e&&e.setItem(g,String(Date.now()))}function b(){let e=l();if(!e)return 0;let t=e.getItem(T),n=parseInt(t??"0",10);return isNaN(n)?0:n}function B(e){let t=l();t&&t.setItem(T,String(e))}function x(){let e=l();if(!e)return{};try{let t=e.getItem(_);if(!t)return{};let n=JSON.parse(t);return typeof n=="object"&&n!==null?n:{}}catch{return{}}}function k(e){let t=l();if(t)try{t.setItem(_,JSON.stringify(e))}catch{}}function V(){let e=l();if(e)try{let t=e.getItem("testchimp_session_metadata");if(!t)return;let n=JSON.parse(t);return typeof n=="object"&&n!==null?n:void 0}catch{return}}function P(){let e=l();e&&(e.removeItem(h),e.removeItem(g),e.removeItem(T),e.removeItem(_),e.removeItem("testchimp_session_metadata"))}var se=100,oe=3;function G(e,t,n){let r=[],s=!1;function o(a){return!(b()>=n.maxEventsPerSession||(x()[a]??0)>=n.maxRepeatsPerEvent)}function f(a){let c=b()+1;B(c);let u=x();return u[a]=(u[a]??0)+1,k(u),c}function d(a,c=!1){a.length!==0&&E(e,"/rum/events",{session_id:t,events:a.map(u=>({title:u.title,event_index:u.eventIndex,timestamp_millis:u.timestampMillis,metadata:u.metadata??{}}))},{keepalive:c})}function m(a=!1){if(r.length===0)return;let c=[...r];r=[],d(c,a)}function A(a){if(!o(a.title))return!1;let c=f(a.title);return r.push({...a,eventIndex:c}),!0}function p(){return r.length}function S(){return r}return{add:A,flush:m,getBufferSize:p,getBuffer:S,get maxBufferSize(){return n.maxBufferSize}}}function H(){return{maxEventsPerSession:se,maxRepeatsPerEvent:oe,maxBufferSize:100}}var ae="https://ingress.testchimp.io",ue=1e4,fe=100,ce=30*60*1e3,i=null;function de(e){i.flushTimerId&&clearInterval(i.flushTimerId),i.flushTimerId=setInterval(()=>{i&&i.buffer.getBufferSize()>0&&i.buffer.flush(!1)},e)}function O(){document.visibilityState==="hidden"&&i&&i.buffer.flush(!0)}function U(){i&&i.buffer.flush(!0)}function X(e){e.key==="testchimp_session_id"&&e.newValue&&i&&(i.sessionId=e.newValue)}function z(e){if(!e.projectId||!e.apiKey){console.warn("[testchimp-rum] init: projectId and apiKey are required");return}let t=e.config??{},n=t.captureEnabled!==!1,r=t.testchimpEndpoint??ae,s=t.inactivityTimeoutMillis??ce,o=t.eventSendInterval??ue,f=t.maxBufferSize??fe,d=v(e.sessionMetadata),{sessionId:m,isNew:A}=L(e.sessionId,d,s);R(m,d??e.sessionMetadata);let p={baseUrl:r,projectId:e.projectId,apiKey:e.apiKey},S={...H(),maxEventsPerSession:t.maxEventsPerSession??100,maxRepeatsPerEvent:t.maxRepeatsPerEvent??3,maxBufferSize:f},a=G(p,m,S);if(i&&i.flushTimerId&&clearInterval(i.flushTimerId),i={httpConfig:p,sessionId:m,buffer:a,captureEnabled:n,flushTimerId:null,initialized:!0},de(o),typeof document<"u"&&(document.addEventListener("visibilitychange",O),window.addEventListener("beforeunload",U)),typeof window<"u"&&window.addEventListener("storage",X),A&&n){let c=V()??d??{},u={session_id:m,started_at:Date.now(),metadata:c};e.environment&&(u.environment=e.environment),e.release&&(u.release=e.release),e.branchName&&(u.branch_name=e.branchName),E(p,"/rum/session/start",u)}}function j(e){if(!i||!i.initialized){console.warn("[testchimp-rum] emit: call init() first");return}if(!i.captureEnabled)return;let t=C(e);!t||(D(),!i.buffer.add(t))||i.buffer.getBufferSize()>=i.buffer.maxBufferSize&&i.buffer.flush(!1)}function K(){i&&i.initialized&&i.buffer.flush(!1)}function Y(){return!i||!i.initialized?"":i.sessionId}function F(){i&&(i.flushTimerId&&(clearInterval(i.flushTimerId),i.flushTimerId=null),i=null),typeof document<"u"&&(document.removeEventListener("visibilitychange",O),window.removeEventListener("beforeunload",U)),typeof window<"u"&&window.removeEventListener("storage",X),P()}var le={init:z,emit:j,flush:K,getSessionId:Y,resetSession:F},me=le;return Q(pe);})();
1
+ "use strict";var testchimp=(()=>{var h=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var ee=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})},te=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of W(t))!Q.call(e,o)&&o!==n&&h(e,o,{get:()=>t[o],enumerable:!(r=q(t,o))||r.enumerable});return e};var ne=e=>te(h({},"__esModule",{value:!0}),e);var Se={};ee(Se,{default:()=>ye,emit:()=>Y,flush:()=>$,getSessionId:()=>J,init:()=>K,resetSession:()=>Z});function re(){if(typeof fetch<"u")return fetch;throw new Error("testchimp-rum-js: fetch is not available. Use a browser or Node 18+.")}function ie(){if(typeof window>"u")return;let t=window.__TC_CI_TEST_INFO;return typeof t=="string"&&t.length>0?t:void 0}function oe(e,t){let n=e.baseUrl.replace(/\/$/,""),r=t.startsWith("/")?t:`/${t}`;return`${n}${r}`}async function v(e,t,n,r){try{let o=oe(e,t),s={"Content-Type":"application/json","Project-Id":e.projectId,"TestChimp-Api-Key":e.apiKey,...r?.keepalive&&{"Keep-Alive":"true"}},u=ie();return u&&(s["ci-test-info"]=u),(await re()(o,{method:"POST",headers:s,body:JSON.stringify(n)})).ok}catch{return!1}}var N="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function I(){let e=Date.now(),t=se(e,10),n=ae(16);return t+n}function se(e,t){let n="";for(let r=t;r>0;r--)n=N[e%32]+n,e=Math.floor(e/32);return n}function ae(e){let t=new Uint8Array(e);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(t);else for(let r=0;r<e;r++)t[r]=Math.floor(Math.random()*256);let n="";for(let r=0;r<e;r++)n+=N[t[r]%32];return n}function D(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}function L(e){if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,reason:"metadata must be a plain object"};let t=Object.keys(e);if(t.length>10)return{ok:!1,reason:"metadata has more than 10 keys"};let n={};for(let r of t){if(r.length>50)return{ok:!1,reason:"metadata key exceeds 50 chars"};let o=e[r];if(Array.isArray(o)){if(o.length>50)return{ok:!1,reason:"metadata array length exceeds 50"};for(let s=0;s<o.length;s++){let u=o[s];if(!D(u))return{ok:!1,reason:"metadata array values must be string, number, boolean, or null"};if(typeof u=="string"&&u.length>200)return{ok:!1,reason:"metadata string in array exceeds 200 chars"}}n[r]=o}else if(D(o)){if(typeof o=="string"&&o.length>200)return{ok:!1,reason:"metadata string value exceeds 200 chars"};n[r]=o}else return{ok:!1,reason:"metadata values must be primitive or array of primitives (no nested objects)"}}return{ok:!0,value:n}}function k(e){if(!e.title||typeof e.title!="string")return console.warn("[testchimp-rum] Event dropped: title is required"),null;if(e.title.length>100)return console.warn("[testchimp-rum] Event dropped: title exceeds 100 chars"),null;let t;if(e.metadata!=null&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)){let o=L(e.metadata);if(!o.ok)return console.warn(`[testchimp-rum] Event dropped: ${o.reason}`),null;t=Object.keys(o.value).length>0?o.value:void 0}let n={title:e.title,timestampMillis:Date.now(),metadata:t},r=JSON.stringify(n);return new TextEncoder().encode(r).length>5120?(console.warn("[testchimp-rum] Event dropped: total size exceeds 5120 bytes"),null):n}function _(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=L(e);if(t.ok)return Object.keys(t.value).length>0?t.value:void 0}var w="testchimp_session_id",T="testchimp_last_activity",A="testchimp_event_count",y="testchimp_event_type_counts";function l(){try{return typeof window<"u"&&window.localStorage?window.localStorage:null}catch{return null}}function C(e,t,n){if(e&&typeof e=="string"&&e.length>0)return{sessionId:e,isNew:!1};let r=l();if(!r)return{sessionId:I(),isNew:!0};let o=r.getItem(w),s=r.getItem(T),u=Date.now();if(o&&s){let c=parseInt(s,10);if(!isNaN(c)&&u-c<n)return{sessionId:o,isNew:!1}}return{sessionId:I(),isNew:!0}}function R(e,t){let n=l();if(!n)return;let r=Date.now();n.setItem(w,e),n.setItem(T,String(r)),n.setItem(A,"0");let o=_(t);if(o)try{n.setItem("testchimp_session_metadata",JSON.stringify(o))}catch{}let s={};try{n.setItem(y,JSON.stringify(s))}catch{}}function B(){let e=l();e&&e.setItem(T,String(Date.now()))}function x(){let e=l();if(!e)return 0;let t=e.getItem(A),n=parseInt(t??"0",10);return isNaN(n)?0:n}function P(e){let t=l();t&&t.setItem(A,String(e))}function M(){let e=l();if(!e)return{};try{let t=e.getItem(y);if(!t)return{};let n=JSON.parse(t);return typeof n=="object"&&n!==null?n:{}}catch{return{}}}function V(e){let t=l();if(t)try{t.setItem(y,JSON.stringify(e))}catch{}}function O(){let e=l();if(e)try{let t=e.getItem("testchimp_session_metadata");if(!t)return;let n=JSON.parse(t);return typeof n=="object"&&n!==null?n:void 0}catch{return}}function X(){let e=l();e&&(e.removeItem(w),e.removeItem(T),e.removeItem(A),e.removeItem(y),e.removeItem("testchimp_session_metadata"))}function E(e){return e.length<=200?e:e.slice(0,200)}function ue(){if(typeof navigator>"u")return"unknown";let e=navigator.userAgent??"",t=navigator;if(t.userAgentData?.brands?.length){let n=t.userAgentData.brands[0]?.brand;if(n){let r=n==="Not_A Brand"?t.userAgentData.brands[1]?.brand:n;if(r)return E(r==="Edg"?"Edge":r)}}return/Edg\//i.test(e)?"Edge":/Firefox\//i.test(e)?"Firefox":/Chrome\//i.test(e)&&!/Edg\//i.test(e)?"Chrome":/Safari\//i.test(e)&&!/Chrome\//i.test(e)?"Safari":/OPR\//i.test(e)?"Opera":E(e.slice(0,50))||"unknown"}function fe(){if(typeof navigator>"u"||typeof window>"u")return"unknown";let e=navigator.userAgent??"";return navigator.userAgentData?.mobile===!0?/iPad/i.test(e)||/Mac/i.test(e)&&typeof navigator.maxTouchPoints=="number"&&navigator.maxTouchPoints>0?"tablet":"mobile":/Tablet|iPad/i.test(e)?"tablet":/Mobile|Android/i.test(e)&&!/iPad/i.test(e)?"mobile":"desktop"}function de(){if(typeof navigator>"u")return"unknown";let e=navigator,t=(e.userAgentData?.platform??e.platform??navigator.userAgent??"").toLowerCase();return t.includes("win")?"windows":t.includes("mac")||t==="macintel"?"mac":t.includes("linux")||t==="linux"?"linux":t.includes("iphone")||t.includes("ipod")||t.includes("ipad")?"ios":t.includes("android")?"android":E(t||"unknown")}function ce(){if(typeof navigator>"u")return"unknown";let e=navigator.language??navigator.userLanguage;return E(e??"unknown")}function le(){try{if(typeof Intl>"u"||!Intl.DateTimeFormat)return"unknown";let e=Intl.DateTimeFormat().resolvedOptions().timeZone;return E(e??"unknown")}catch{return"unknown"}}function G(){return typeof navigator>"u"?{}:{_browser:ue(),_device_type:fe(),_os:de(),_language:ce(),_timezone:le()}}var me=100,pe=3;function H(e,t,n){let r=[],o=!1;function s(a){return!(x()>=n.maxEventsPerSession||(M()[a]??0)>=n.maxRepeatsPerEvent)}function u(a){let f=x()+1;P(f);let d=M();return d[a]=(d[a]??0)+1,V(d),f}function c(a,f=!1){a.length!==0&&v(e,"/rum/events",{session_id:t,events:a.map(d=>({title:d.title,event_index:d.eventIndex,timestamp_millis:d.timestampMillis,metadata:d.metadata??{}}))},{keepalive:f})}function m(a=!1){if(r.length===0)return;let f=[...r];r=[],c(f,a)}function S(a){if(!s(a.title))return!1;let f=u(a.title);return r.push({...a,eventIndex:f}),!0}function p(){return r.length}function b(){return r}return{add:S,flush:m,getBufferSize:p,getBuffer:b,get maxBufferSize(){return n.maxBufferSize}}}function U(){return{maxEventsPerSession:me,maxRepeatsPerEvent:pe,maxBufferSize:100}}var ge="https://ingress.testchimp.io",Ee=1e4,ve=100,_e=30*60*1e3,i=null;function Te(e){i.flushTimerId&&clearInterval(i.flushTimerId),i.flushTimerId=setInterval(()=>{i&&i.buffer.getBufferSize()>0&&i.buffer.flush(!1)},e)}function z(){document.visibilityState==="hidden"&&i&&i.buffer.flush(!0)}function F(){i&&i.buffer.flush(!0)}function j(e){e.key==="testchimp_session_id"&&e.newValue&&i&&(i.sessionId=e.newValue)}function K(e){if(!e.projectId||!e.apiKey){console.warn("[testchimp-rum] init: projectId and apiKey are required");return}let t=e.config??{},n=t.captureEnabled!==!1,r=t.testchimpEndpoint??ge,o=t.inactivityTimeoutMillis??_e,s=t.eventSendInterval??Ee,u=t.maxBufferSize??ve,c=_(e.sessionMetadata),{sessionId:m,isNew:S}=C(e.sessionId,c,o);R(m,c??e.sessionMetadata);let p={baseUrl:r,projectId:e.projectId,apiKey:e.apiKey},b={...U(),maxEventsPerSession:t.maxEventsPerSession??100,maxRepeatsPerEvent:t.maxRepeatsPerEvent??3,maxBufferSize:u},a=H(p,m,b);if(i&&i.flushTimerId&&clearInterval(i.flushTimerId),i={httpConfig:p,sessionId:m,buffer:a,captureEnabled:n,flushTimerId:null,initialized:!0},Te(s),typeof document<"u"&&(document.addEventListener("visibilitychange",z),window.addEventListener("beforeunload",F)),typeof window<"u"&&window.addEventListener("storage",j),S&&n){let f=O()??c??{},d=t.enableDefaultSessionMetadata!==!1?{...G(),...f}:f,g={session_id:m,started_at:Date.now(),metadata:d};e.environment&&(g.environment=e.environment),e.release&&(g.release=e.release),e.branchName&&(g.branch_name=e.branchName),v(p,"/rum/session/start",g)}}function Y(e){if(!i||!i.initialized){console.warn("[testchimp-rum] emit: call init() first");return}if(!i.captureEnabled)return;let t=k(e);!t||(B(),!i.buffer.add(t))||i.buffer.getBufferSize()>=i.buffer.maxBufferSize&&i.buffer.flush(!1)}function $(){i&&i.initialized&&i.buffer.flush(!1)}function J(){return!i||!i.initialized?"":i.sessionId}function Z(){i&&(i.flushTimerId&&(clearInterval(i.flushTimerId),i.flushTimerId=null),i=null),typeof document<"u"&&(document.removeEventListener("visibilitychange",z),window.removeEventListener("beforeunload",F)),typeof window<"u"&&window.removeEventListener("storage",j),X()}var Ae={init:K,emit:Y,flush:$,getSessionId:J,resetSession:Z},ye=Ae;return ne(Se);})();
@@ -1 +1 @@
1
- function X(){if(typeof fetch<"u")return fetch;throw new Error("testchimp-rum-js: fetch is not available. Use a browser or Node 18+.")}function z(){if(typeof window>"u")return;let t=window.__TC_CI_TEST_INFO;return typeof t=="string"&&t.length>0?t:void 0}function j(e,t){let n=e.baseUrl.replace(/\/$/,""),r=t.startsWith("/")?t:`/${t}`;return`${n}${r}`}async function E(e,t,n,r){try{let s=j(e,t),o={"Content-Type":"application/json","Project-Id":e.projectId,"TestChimp-Api-Key":e.apiKey,...r?.keepalive&&{"Keep-Alive":"true"}},f=z();return f&&(o["ci-test-info"]=f),(await X()(s,{method:"POST",headers:o,body:JSON.stringify(n)})).ok}catch{return!1}}var x="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function y(){let e=Date.now(),t=K(e,10),n=Y(16);return t+n}function K(e,t){let n="";for(let r=t;r>0;r--)n=x[e%32]+n,e=Math.floor(e/32);return n}function Y(e){let t=new Uint8Array(e);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(t);else for(let r=0;r<e;r++)t[r]=Math.floor(Math.random()*256);let n="";for(let r=0;r<e;r++)n+=x[t[r]%32];return n}function N(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}function w(e){if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,reason:"metadata must be a plain object"};let t=Object.keys(e);if(t.length>10)return{ok:!1,reason:"metadata has more than 10 keys"};let n={};for(let r of t){if(r.length>50)return{ok:!1,reason:"metadata key exceeds 50 chars"};let s=e[r];if(Array.isArray(s)){if(s.length>50)return{ok:!1,reason:"metadata array length exceeds 50"};for(let o=0;o<s.length;o++){let f=s[o];if(!N(f))return{ok:!1,reason:"metadata array values must be string, number, boolean, or null"};if(typeof f=="string"&&f.length>200)return{ok:!1,reason:"metadata string in array exceeds 200 chars"}}n[r]=s}else if(N(s)){if(typeof s=="string"&&s.length>200)return{ok:!1,reason:"metadata string value exceeds 200 chars"};n[r]=s}else return{ok:!1,reason:"metadata values must be primitive or array of primitives (no nested objects)"}}return{ok:!0,value:n}}function M(e){if(!e.title||typeof e.title!="string")return console.warn("[testchimp-rum] Event dropped: title is required"),null;if(e.title.length>100)return console.warn("[testchimp-rum] Event dropped: title exceeds 100 chars"),null;let t;if(e.metadata!=null&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)){let s=w(e.metadata);if(!s.ok)return console.warn(`[testchimp-rum] Event dropped: ${s.reason}`),null;t=Object.keys(s.value).length>0?s.value:void 0}let n={title:e.title,timestampMillis:Date.now(),metadata:t},r=JSON.stringify(n);return new TextEncoder().encode(r).length>5120?(console.warn("[testchimp-rum] Event dropped: total size exceeds 5120 bytes"),null):n}function v(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=w(e);if(t.ok)return Object.keys(t.value).length>0?t.value:void 0}var I="testchimp_session_id",g="testchimp_last_activity",T="testchimp_event_count",_="testchimp_event_type_counts";function l(){try{return typeof window<"u"&&window.localStorage?window.localStorage:null}catch{return null}}function C(e,t,n){if(e&&typeof e=="string"&&e.length>0)return{sessionId:e,isNew:!1};let r=l();if(!r)return{sessionId:y(),isNew:!0};let s=r.getItem(I),o=r.getItem(g),f=Date.now();if(s&&o){let d=parseInt(o,10);if(!isNaN(d)&&f-d<n)return{sessionId:s,isNew:!1}}return{sessionId:y(),isNew:!0}}function L(e,t){let n=l();if(!n)return;let r=Date.now();n.setItem(I,e),n.setItem(g,String(r)),n.setItem(T,"0");let s=v(t);if(s)try{n.setItem("testchimp_session_metadata",JSON.stringify(s))}catch{}let o={};try{n.setItem(_,JSON.stringify(o))}catch{}}function R(){let e=l();e&&e.setItem(g,String(Date.now()))}function h(){let e=l();if(!e)return 0;let t=e.getItem(T),n=parseInt(t??"0",10);return isNaN(n)?0:n}function D(e){let t=l();t&&t.setItem(T,String(e))}function b(){let e=l();if(!e)return{};try{let t=e.getItem(_);if(!t)return{};let n=JSON.parse(t);return typeof n=="object"&&n!==null?n:{}}catch{return{}}}function B(e){let t=l();if(t)try{t.setItem(_,JSON.stringify(e))}catch{}}function k(){let e=l();if(e)try{let t=e.getItem("testchimp_session_metadata");if(!t)return;let n=JSON.parse(t);return typeof n=="object"&&n!==null?n:void 0}catch{return}}function V(){let e=l();e&&(e.removeItem(I),e.removeItem(g),e.removeItem(T),e.removeItem(_),e.removeItem("testchimp_session_metadata"))}var F=100,$=3;function P(e,t,n){let r=[],s=!1;function o(a){return!(h()>=n.maxEventsPerSession||(b()[a]??0)>=n.maxRepeatsPerEvent)}function f(a){let c=h()+1;D(c);let u=b();return u[a]=(u[a]??0)+1,B(u),c}function d(a,c=!1){a.length!==0&&E(e,"/rum/events",{session_id:t,events:a.map(u=>({title:u.title,event_index:u.eventIndex,timestamp_millis:u.timestampMillis,metadata:u.metadata??{}}))},{keepalive:c})}function m(a=!1){if(r.length===0)return;let c=[...r];r=[],d(c,a)}function A(a){if(!o(a.title))return!1;let c=f(a.title);return r.push({...a,eventIndex:c}),!0}function p(){return r.length}function S(){return r}return{add:A,flush:m,getBufferSize:p,getBuffer:S,get maxBufferSize(){return n.maxBufferSize}}}function G(){return{maxEventsPerSession:F,maxRepeatsPerEvent:$,maxBufferSize:100}}var J="https://ingress.testchimp.io",Z=1e4,q=100,W=30*60*1e3,i=null;function Q(e){i.flushTimerId&&clearInterval(i.flushTimerId),i.flushTimerId=setInterval(()=>{i&&i.buffer.getBufferSize()>0&&i.buffer.flush(!1)},e)}function H(){document.visibilityState==="hidden"&&i&&i.buffer.flush(!0)}function O(){i&&i.buffer.flush(!0)}function U(e){e.key==="testchimp_session_id"&&e.newValue&&i&&(i.sessionId=e.newValue)}function ee(e){if(!e.projectId||!e.apiKey){console.warn("[testchimp-rum] init: projectId and apiKey are required");return}let t=e.config??{},n=t.captureEnabled!==!1,r=t.testchimpEndpoint??J,s=t.inactivityTimeoutMillis??W,o=t.eventSendInterval??Z,f=t.maxBufferSize??q,d=v(e.sessionMetadata),{sessionId:m,isNew:A}=C(e.sessionId,d,s);L(m,d??e.sessionMetadata);let p={baseUrl:r,projectId:e.projectId,apiKey:e.apiKey},S={...G(),maxEventsPerSession:t.maxEventsPerSession??100,maxRepeatsPerEvent:t.maxRepeatsPerEvent??3,maxBufferSize:f},a=P(p,m,S);if(i&&i.flushTimerId&&clearInterval(i.flushTimerId),i={httpConfig:p,sessionId:m,buffer:a,captureEnabled:n,flushTimerId:null,initialized:!0},Q(o),typeof document<"u"&&(document.addEventListener("visibilitychange",H),window.addEventListener("beforeunload",O)),typeof window<"u"&&window.addEventListener("storage",U),A&&n){let c=k()??d??{},u={session_id:m,started_at:Date.now(),metadata:c};e.environment&&(u.environment=e.environment),e.release&&(u.release=e.release),e.branchName&&(u.branch_name=e.branchName),E(p,"/rum/session/start",u)}}function te(e){if(!i||!i.initialized){console.warn("[testchimp-rum] emit: call init() first");return}if(!i.captureEnabled)return;let t=M(e);!t||(R(),!i.buffer.add(t))||i.buffer.getBufferSize()>=i.buffer.maxBufferSize&&i.buffer.flush(!1)}function ne(){i&&i.initialized&&i.buffer.flush(!1)}function re(){return!i||!i.initialized?"":i.sessionId}function ie(){i&&(i.flushTimerId&&(clearInterval(i.flushTimerId),i.flushTimerId=null),i=null),typeof document<"u"&&(document.removeEventListener("visibilitychange",H),window.removeEventListener("beforeunload",O)),typeof window<"u"&&window.removeEventListener("storage",U),V()}var se={init:ee,emit:te,flush:ne,getSessionId:re,resetSession:ie},ye=se;export{ye as default,te as emit,ne as flush,re as getSessionId,ee as init,ie as resetSession};
1
+ function j(){if(typeof fetch<"u")return fetch;throw new Error("testchimp-rum-js: fetch is not available. Use a browser or Node 18+.")}function K(){if(typeof window>"u")return;let t=window.__TC_CI_TEST_INFO;return typeof t=="string"&&t.length>0?t:void 0}function Y(e,t){let n=e.baseUrl.replace(/\/$/,""),r=t.startsWith("/")?t:`/${t}`;return`${n}${r}`}async function v(e,t,n,r){try{let o=Y(e,t),s={"Content-Type":"application/json","Project-Id":e.projectId,"TestChimp-Api-Key":e.apiKey,...r?.keepalive&&{"Keep-Alive":"true"}},u=K();return u&&(s["ci-test-info"]=u),(await j()(o,{method:"POST",headers:s,body:JSON.stringify(n)})).ok}catch{return!1}}var M="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function h(){let e=Date.now(),t=$(e,10),n=J(16);return t+n}function $(e,t){let n="";for(let r=t;r>0;r--)n=M[e%32]+n,e=Math.floor(e/32);return n}function J(e){let t=new Uint8Array(e);if(typeof crypto<"u"&&crypto.getRandomValues)crypto.getRandomValues(t);else for(let r=0;r<e;r++)t[r]=Math.floor(Math.random()*256);let n="";for(let r=0;r<e;r++)n+=M[t[r]%32];return n}function N(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}function D(e){if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,reason:"metadata must be a plain object"};let t=Object.keys(e);if(t.length>10)return{ok:!1,reason:"metadata has more than 10 keys"};let n={};for(let r of t){if(r.length>50)return{ok:!1,reason:"metadata key exceeds 50 chars"};let o=e[r];if(Array.isArray(o)){if(o.length>50)return{ok:!1,reason:"metadata array length exceeds 50"};for(let s=0;s<o.length;s++){let u=o[s];if(!N(u))return{ok:!1,reason:"metadata array values must be string, number, boolean, or null"};if(typeof u=="string"&&u.length>200)return{ok:!1,reason:"metadata string in array exceeds 200 chars"}}n[r]=o}else if(N(o)){if(typeof o=="string"&&o.length>200)return{ok:!1,reason:"metadata string value exceeds 200 chars"};n[r]=o}else return{ok:!1,reason:"metadata values must be primitive or array of primitives (no nested objects)"}}return{ok:!0,value:n}}function L(e){if(!e.title||typeof e.title!="string")return console.warn("[testchimp-rum] Event dropped: title is required"),null;if(e.title.length>100)return console.warn("[testchimp-rum] Event dropped: title exceeds 100 chars"),null;let t;if(e.metadata!=null&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)){let o=D(e.metadata);if(!o.ok)return console.warn(`[testchimp-rum] Event dropped: ${o.reason}`),null;t=Object.keys(o.value).length>0?o.value:void 0}let n={title:e.title,timestampMillis:Date.now(),metadata:t},r=JSON.stringify(n);return new TextEncoder().encode(r).length>5120?(console.warn("[testchimp-rum] Event dropped: total size exceeds 5120 bytes"),null):n}function _(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=D(e);if(t.ok)return Object.keys(t.value).length>0?t.value:void 0}var I="testchimp_session_id",T="testchimp_last_activity",A="testchimp_event_count",y="testchimp_event_type_counts";function l(){try{return typeof window<"u"&&window.localStorage?window.localStorage:null}catch{return null}}function k(e,t,n){if(e&&typeof e=="string"&&e.length>0)return{sessionId:e,isNew:!1};let r=l();if(!r)return{sessionId:h(),isNew:!0};let o=r.getItem(I),s=r.getItem(T),u=Date.now();if(o&&s){let c=parseInt(s,10);if(!isNaN(c)&&u-c<n)return{sessionId:o,isNew:!1}}return{sessionId:h(),isNew:!0}}function C(e,t){let n=l();if(!n)return;let r=Date.now();n.setItem(I,e),n.setItem(T,String(r)),n.setItem(A,"0");let o=_(t);if(o)try{n.setItem("testchimp_session_metadata",JSON.stringify(o))}catch{}let s={};try{n.setItem(y,JSON.stringify(s))}catch{}}function R(){let e=l();e&&e.setItem(T,String(Date.now()))}function w(){let e=l();if(!e)return 0;let t=e.getItem(A),n=parseInt(t??"0",10);return isNaN(n)?0:n}function B(e){let t=l();t&&t.setItem(A,String(e))}function x(){let e=l();if(!e)return{};try{let t=e.getItem(y);if(!t)return{};let n=JSON.parse(t);return typeof n=="object"&&n!==null?n:{}}catch{return{}}}function P(e){let t=l();if(t)try{t.setItem(y,JSON.stringify(e))}catch{}}function V(){let e=l();if(e)try{let t=e.getItem("testchimp_session_metadata");if(!t)return;let n=JSON.parse(t);return typeof n=="object"&&n!==null?n:void 0}catch{return}}function O(){let e=l();e&&(e.removeItem(I),e.removeItem(T),e.removeItem(A),e.removeItem(y),e.removeItem("testchimp_session_metadata"))}function E(e){return e.length<=200?e:e.slice(0,200)}function Z(){if(typeof navigator>"u")return"unknown";let e=navigator.userAgent??"",t=navigator;if(t.userAgentData?.brands?.length){let n=t.userAgentData.brands[0]?.brand;if(n){let r=n==="Not_A Brand"?t.userAgentData.brands[1]?.brand:n;if(r)return E(r==="Edg"?"Edge":r)}}return/Edg\//i.test(e)?"Edge":/Firefox\//i.test(e)?"Firefox":/Chrome\//i.test(e)&&!/Edg\//i.test(e)?"Chrome":/Safari\//i.test(e)&&!/Chrome\//i.test(e)?"Safari":/OPR\//i.test(e)?"Opera":E(e.slice(0,50))||"unknown"}function q(){if(typeof navigator>"u"||typeof window>"u")return"unknown";let e=navigator.userAgent??"";return navigator.userAgentData?.mobile===!0?/iPad/i.test(e)||/Mac/i.test(e)&&typeof navigator.maxTouchPoints=="number"&&navigator.maxTouchPoints>0?"tablet":"mobile":/Tablet|iPad/i.test(e)?"tablet":/Mobile|Android/i.test(e)&&!/iPad/i.test(e)?"mobile":"desktop"}function W(){if(typeof navigator>"u")return"unknown";let e=navigator,t=(e.userAgentData?.platform??e.platform??navigator.userAgent??"").toLowerCase();return t.includes("win")?"windows":t.includes("mac")||t==="macintel"?"mac":t.includes("linux")||t==="linux"?"linux":t.includes("iphone")||t.includes("ipod")||t.includes("ipad")?"ios":t.includes("android")?"android":E(t||"unknown")}function Q(){if(typeof navigator>"u")return"unknown";let e=navigator.language??navigator.userLanguage;return E(e??"unknown")}function ee(){try{if(typeof Intl>"u"||!Intl.DateTimeFormat)return"unknown";let e=Intl.DateTimeFormat().resolvedOptions().timeZone;return E(e??"unknown")}catch{return"unknown"}}function X(){return typeof navigator>"u"?{}:{_browser:Z(),_device_type:q(),_os:W(),_language:Q(),_timezone:ee()}}var te=100,ne=3;function G(e,t,n){let r=[],o=!1;function s(a){return!(w()>=n.maxEventsPerSession||(x()[a]??0)>=n.maxRepeatsPerEvent)}function u(a){let f=w()+1;B(f);let d=x();return d[a]=(d[a]??0)+1,P(d),f}function c(a,f=!1){a.length!==0&&v(e,"/rum/events",{session_id:t,events:a.map(d=>({title:d.title,event_index:d.eventIndex,timestamp_millis:d.timestampMillis,metadata:d.metadata??{}}))},{keepalive:f})}function m(a=!1){if(r.length===0)return;let f=[...r];r=[],c(f,a)}function S(a){if(!s(a.title))return!1;let f=u(a.title);return r.push({...a,eventIndex:f}),!0}function p(){return r.length}function b(){return r}return{add:S,flush:m,getBufferSize:p,getBuffer:b,get maxBufferSize(){return n.maxBufferSize}}}function H(){return{maxEventsPerSession:te,maxRepeatsPerEvent:ne,maxBufferSize:100}}var re="https://ingress.testchimp.io",ie=1e4,oe=100,se=30*60*1e3,i=null;function ae(e){i.flushTimerId&&clearInterval(i.flushTimerId),i.flushTimerId=setInterval(()=>{i&&i.buffer.getBufferSize()>0&&i.buffer.flush(!1)},e)}function U(){document.visibilityState==="hidden"&&i&&i.buffer.flush(!0)}function z(){i&&i.buffer.flush(!0)}function F(e){e.key==="testchimp_session_id"&&e.newValue&&i&&(i.sessionId=e.newValue)}function ue(e){if(!e.projectId||!e.apiKey){console.warn("[testchimp-rum] init: projectId and apiKey are required");return}let t=e.config??{},n=t.captureEnabled!==!1,r=t.testchimpEndpoint??re,o=t.inactivityTimeoutMillis??se,s=t.eventSendInterval??ie,u=t.maxBufferSize??oe,c=_(e.sessionMetadata),{sessionId:m,isNew:S}=k(e.sessionId,c,o);C(m,c??e.sessionMetadata);let p={baseUrl:r,projectId:e.projectId,apiKey:e.apiKey},b={...H(),maxEventsPerSession:t.maxEventsPerSession??100,maxRepeatsPerEvent:t.maxRepeatsPerEvent??3,maxBufferSize:u},a=G(p,m,b);if(i&&i.flushTimerId&&clearInterval(i.flushTimerId),i={httpConfig:p,sessionId:m,buffer:a,captureEnabled:n,flushTimerId:null,initialized:!0},ae(s),typeof document<"u"&&(document.addEventListener("visibilitychange",U),window.addEventListener("beforeunload",z)),typeof window<"u"&&window.addEventListener("storage",F),S&&n){let f=V()??c??{},d=t.enableDefaultSessionMetadata!==!1?{...X(),...f}:f,g={session_id:m,started_at:Date.now(),metadata:d};e.environment&&(g.environment=e.environment),e.release&&(g.release=e.release),e.branchName&&(g.branch_name=e.branchName),v(p,"/rum/session/start",g)}}function fe(e){if(!i||!i.initialized){console.warn("[testchimp-rum] emit: call init() first");return}if(!i.captureEnabled)return;let t=L(e);!t||(R(),!i.buffer.add(t))||i.buffer.getBufferSize()>=i.buffer.maxBufferSize&&i.buffer.flush(!1)}function de(){i&&i.initialized&&i.buffer.flush(!1)}function ce(){return!i||!i.initialized?"":i.sessionId}function le(){i&&(i.flushTimerId&&(clearInterval(i.flushTimerId),i.flushTimerId=null),i=null),typeof document<"u"&&(document.removeEventListener("visibilitychange",U),window.removeEventListener("beforeunload",z)),typeof window<"u"&&window.removeEventListener("storage",F),O()}var me={init:ue,emit:fe,flush:de,getSessionId:ce,resetSession:le},Le=me;export{Le as default,fe as emit,de as flush,ce as getSessionId,ue as init,le as resetSession};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "testchimp-rum-js",
3
- "version": "0.0.4",
4
- "description": "Lightweight browser library for emitting structured user interaction events to TestChimp",
3
+ "version": "0.0.6",
4
+ "description": "Lightweight browser library for emitting structured user interaction events to TestChimp - for test coverage analytics grounded in real user behaviour",
5
5
  "main": "dist/testchimp-rum.min.js",
6
6
  "module": "dist/testchimp-rum.mjs",
7
7
  "unpkg": "dist/testchimp-rum.min.js",