@coveo/relay 0.6.0 → 0.6.2

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.
Files changed (36) hide show
  1. package/lib/cdn/relay.min.js +1 -1
  2. package/lib/cdn/relay.min.js.map +1 -1
  3. package/lib/cdn/types/emit/emit.d.ts +12 -2
  4. package/lib/cdn/types/emit/emit.d.ts.map +1 -1
  5. package/lib/cdn/types/environment/browser/browser.d.ts.map +1 -1
  6. package/lib/cdn/types/environment/environment.d.ts +1 -0
  7. package/lib/cdn/types/environment/environment.d.ts.map +1 -1
  8. package/lib/cdn/types/environment/node/node.d.ts.map +1 -1
  9. package/lib/cdn/types/environment/null/null.d.ts.map +1 -1
  10. package/lib/cdn/types/listener/listener.d.ts +1 -1
  11. package/lib/cdn/types/listener/listener.d.ts.map +1 -1
  12. package/lib/cdn/types/relay.d.ts +1 -1
  13. package/lib/cdn/types/relay.d.ts.map +1 -1
  14. package/lib/cdn/types/validate/validate.d.ts +9 -2
  15. package/lib/cdn/types/validate/validate.d.ts.map +1 -1
  16. package/lib/relay.cjs +54 -31
  17. package/lib/relay.js +54 -31
  18. package/lib/relay.mjs +54 -31
  19. package/lib/types/emit/emit.d.ts +12 -2
  20. package/lib/types/emit/emit.d.ts.map +1 -1
  21. package/lib/types/environment/browser/browser.d.ts.map +1 -1
  22. package/lib/types/environment/environment.d.ts +1 -0
  23. package/lib/types/environment/environment.d.ts.map +1 -1
  24. package/lib/types/environment/node/node.d.ts.map +1 -1
  25. package/lib/types/environment/null/null.d.ts.map +1 -1
  26. package/lib/types/listener/listener.d.ts +1 -1
  27. package/lib/types/listener/listener.d.ts.map +1 -1
  28. package/lib/types/relay.d.ts +1 -1
  29. package/lib/types/relay.d.ts.map +1 -1
  30. package/lib/types/validate/validate.d.ts +9 -2
  31. package/lib/types/validate/validate.d.ts.map +1 -1
  32. package/package.json +3 -3
  33. package/lib/cdn/types/event-api-call/event-api-caller.d.ts +0 -10
  34. package/lib/cdn/types/event-api-call/event-api-caller.d.ts.map +0 -1
  35. package/lib/types/event-api-call/event-api-caller.d.ts +0 -10
  36. package/lib/types/event-api-call/event-api-caller.d.ts.map +0 -1
@@ -1,2 +1,2 @@
1
- async function e({event:e,config:t,environment:n}){const{url:r,token:o}=t,c={"Content-Type":"application/json",Authorization:`Bearer ${o}`},a=await n.fetch(`${r}${"validate"==t.mode?"/validate":""}`,{method:"POST",body:JSON.stringify([e]),headers:c}),i=await a.json();if(!a.ok)throw new Error({...i});return i}var t=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function n(e){const n="visitorId";return{getClientId:()=>{const r=e.storage,o=r.getItem(n),c=o&&("string"==typeof(a=o)&&t.test(a))?o:e.generateUUID();var a;return r.setItem(n,c),c},clear:()=>{e.storage.removeItem(n)}}}const r=function(){const e="coveo_";return{getItem(t){const n=`${e}${t}=`,r=document.cookie.split(";");for(const e of r){const t=e.replace(/^\s+/,"");if(0===t.lastIndexOf(n,0))return t.substring(n.length,t.length)}return null},setItem(t,n,r){const o=(e=>{const t=e.split(".").slice(-2);return 2==t.length?t.join("."):""})(window.location.hostname),c=`;expires=${new Date((new Date).getTime()+r).toUTCString()}`,a=o?`;domain=${o}`:"";document.cookie=`${e}${t}=${n}${c}${a};path=/;SameSite=Lax`},removeItem(e){this.setItem(e,"",-1)}}}();async function o(e,t){return fetch(e,t).catch((e=>{throw new Error(`${e.message}: The "host" value is invalid or a network error occured, according to the FetchAPI's response.`,{cause:e})}))}function c(){return{runtime:"browser",fetch:(e,t)=>o(e,t),getReferrerUrl:()=>function(){const e=document.referrer;return""===e?null:e}(),getUrl:()=>window.location.href,getUserAgent:()=>navigator.userAgent,generateUUID:()=>crypto.randomUUID(),storage:{getItem:e=>r.getItem(e)||localStorage.getItem(e),removeItem(e){r.removeItem(e),localStorage.removeItem(e)},setItem(e,t){localStorage.setItem(e,t),r.setItem(e,t,31556952e3)}}}}function a(){return{getItem:()=>null,removeItem(){},setItem(){}}}function i(){return function(){try{return"object"==typeof window}catch(e){return!1}}()?c():{runtime:"node",fetch:(e,t)=>o(e,t),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>crypto.randomUUID(),storage:a()}}const l="0.6.0";function s(e,t,n,r){const{getReferrerUrl:o,getUrl:c,getUserAgent:a}=n,i=function(e){const{trackingId:t}=e;return{trackingId:t}}(t),s=r.getClientId();return Object.freeze({type:e,config:i,ts:Date.now(),source:`relay@${l}`,clientId:s,userAgent:a(),referrerUrl:o(),url:c()})}const u="*";function g(){const e=[];function t({type:t,callback:n}){return e.findIndex((e=>e.type===t&&e.callback===n))}function n(n,r){r?function(n){const r=t(n);r>=0&&e.splice(r,1)}({type:n,callback:r}):function(t){if(t===u)e.length=0;else for(let n=e.length-1;n>=0;n--)e[n].type===t&&e.splice(n,1)}(n)}return{add:function(r){return t(r)<0&&e.push(r),()=>n(r.type,r.callback)},call:function(t){e.forEach((e=>{if(function(e,t){return"*"===e.type||t===e.type}(e,t.meta.type))try{e.callback(t)}catch(e){console.error(e)}}))},remove:n}}function f({url:e,token:t,trackingId:n,...r}){return Object.freeze({url:e,token:t,trackingId:n,...!!r.mode&&{mode:r.mode}})}function m(t){const r=function(e){let t=f(e);return{get:()=>t,update:e=>{t=f({...t,...e})}}}(t),o=()=>"disabled"==r.get().mode?{runtime:"null",fetch:()=>Promise.resolve(new Response(JSON.stringify(""))),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>"",storage:a()}:i(),c=n(o()),{add:u,call:m,remove:d}=g();return{emit:(t,n)=>{const a=function(e,t,n,r,o){return{...t,meta:s(e,n,r,o)}}(t,n,r.get(),o(),c);m(a);const i={config:r.get(),environment:o(),event:a};return"validate"===r.get().mode?async function(t){const n=await e(t);if(!n)return{valid:!1,errors:[{type:"",message:"disabled",path:""}]};const{valid:r,errors:o}=n[0];return{valid:r,errors:o??[]}}(i):async function(t){await e(t)}(i)},getMeta:e=>s(e,r.get(),o(),c),on:(e,t)=>u({type:e,callback:t}),off:(e,t)=>d(e,t),updateConfig:e=>r.update(e),version:l,clearStorage:()=>{c.clear()}}}export{m as createRelay};
1
+ async function e(e){const{listenerManager:t,event:n,config:r}=e;return"disabled"!==r.mode&&t.call(n),"validate"===r.mode?async function({config:e,environment:t,event:n}){const{url:r,token:o}=e,a={"Content-Type":"application/json",Authorization:`Bearer ${o}`},c=await t.fetch(`${r}/validate`,{method:"POST",body:JSON.stringify([n]),headers:a}),i=await c.json();if(!c.ok)throw new Error({...i});if(!i)return{valid:!1,errors:[{type:"",message:"disabled",path:""}]};const{valid:s,errors:l}=i[0];return{valid:s,errors:l??[]}}(e):async function({event:e,config:t,environment:n}){const{url:r,token:o}=t;return n.send(r,o,JSON.stringify([e]))}(e)}var t=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function n(e){const n="visitorId";return{getClientId:()=>{const r=e.storage,o=r.getItem(n),a=o&&("string"==typeof(c=o)&&t.test(c))?o:e.generateUUID();var c;return r.setItem(n,a),a},clear:()=>{e.storage.removeItem(n)}}}const r=function(){const e="coveo_";return{getItem(t){const n=`${e}${t}=`,r=document.cookie.split(";");for(const e of r){const t=e.replace(/^\s+/,"");if(0===t.lastIndexOf(n,0))return t.substring(n.length,t.length)}return null},setItem(t,n,r){const o=(e=>{const t=e.split(".").slice(-2);return 2==t.length?t.join("."):""})(window.location.hostname),a=`;expires=${new Date((new Date).getTime()+r).toUTCString()}`,c=o?`;domain=${o}`:"";document.cookie=`${e}${t}=${n}${a}${c};path=/;SameSite=Lax`},removeItem(e){this.setItem(e,"",-1)}}}();async function o(e,t){return fetch(e,t).catch((e=>{throw new Error(`${e.message}: The "host" value is invalid or a network error occured, according to the FetchAPI's response.`,{cause:e})}))}function a(){return{runtime:"browser",fetch:(e,t)=>o(e,t),send:async(e,t,n)=>{if(!navigator.sendBeacon(`${e}?access_token=${t}`,new Blob([n],{type:"application/json"})))throw new Error("Failed to send the event(s) because the payload size exceeded the maximum allowed size (32 KB). Please contact support if the problem persists.");return null},getReferrerUrl:()=>function(){const e=document.referrer;return""===e?null:e}(),getUrl:()=>window.location.href,getUserAgent:()=>navigator.userAgent,generateUUID:()=>crypto.randomUUID(),storage:{getItem:e=>r.getItem(e)||localStorage.getItem(e),removeItem(e){r.removeItem(e),localStorage.removeItem(e)},setItem(e,t){localStorage.setItem(e,t),r.setItem(e,t,31556952e3)}}}}function c(){return{getItem:()=>null,removeItem(){},setItem(){}}}function i(){return function(){try{return"object"==typeof window}catch(e){return!1}}()?a():{runtime:"node",fetch:(e,t)=>o(e,t),send:async(e,t,n)=>(o(e,{method:"POST",body:n,headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`}}),null),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>crypto.randomUUID(),storage:c()}}const s="0.6.2";function l(e,t,n,r){const{getReferrerUrl:o,getUrl:a,getUserAgent:c}=n,i=function(e){const{trackingId:t}=e;return{trackingId:t}}(t),l=r.getClientId();return Object.freeze({type:e,config:i,ts:Date.now(),source:`relay@${s}`,clientId:l,userAgent:c(),referrerUrl:o(),url:a()})}const u="*";function g(){const e=[];function t({type:t,callback:n}){return e.findIndex((e=>e.type===t&&e.callback===n))}function n(n,r){r?function(n){const r=t(n);r>=0&&e.splice(r,1)}({type:n,callback:r}):function(t){if(t===u)e.length=0;else for(let n=e.length-1;n>=0;n--)e[n].type===t&&e.splice(n,1)}(n)}return{add:function(r){return t(r)<0&&e.push(r),()=>n(r.type,r.callback)},call:function(t){e.forEach((e=>{if(function(e,t){return"*"===e.type||t===e.type}(e,t.meta.type))try{e.callback(t)}catch(e){console.error(e)}}))},remove:n}}function f({url:e,token:t,trackingId:n,...r}){return Object.freeze({url:e,token:t,trackingId:n,...!!r.mode&&{mode:r.mode}})}function d(t){const r=function(e){let t=f(e);return{get:()=>t,update:e=>{t=f({...t,...e})}}}(t),o=g(),a=()=>"disabled"==r.get().mode?{runtime:"null",fetch:()=>Promise.resolve(new Response(JSON.stringify(""))),send:async()=>null,getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>"",storage:c()}:i(),u=n(a());return{emit:(t,n)=>{const c=r.get(),i=a(),s=function(e,t,n,r,o){return{...t,meta:l(e,n,r,o)}}(t,n,c,i,u);return e({config:c,environment:i,event:s,listenerManager:o})},getMeta:e=>l(e,r.get(),a(),u),on:(e,t)=>o.add({type:e,callback:t}),off:(e,t)=>o.remove(e,t),updateConfig:e=>r.update(e),version:s,clearStorage:()=>{u.clear()}}}export{d as createRelay};
2
2
  //# sourceMappingURL=relay.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"relay.min.js","sources":["../../src/event-api-call/event-api-caller.ts","../../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/regex.js","../../src/client-id/client-id.ts","../../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/validate.js","../../src/environment/browser/storage/cookie.ts","../../src/environment/utils/fetch.ts","../../src/environment/browser/browser.ts","../../src/environment/browser/storage/storage.ts","../../src/environment/storage.ts","../../src/environment/environment.ts","../../src/environment/node/node.ts","../../src/version.ts","../../src/event/meta/meta.ts","../../src/listener/listener.ts","../../src/config/config.ts","../../src/relay.ts","../../src/environment/null/null.ts","../../src/event/relay-event.ts","../../src/validate/validate.ts","../../src/emit/emit.ts"],"sourcesContent":["import { Environment } from \"../environment/environment\";\nimport { RelayEvent } from \"../event/relay-event\";\nimport { RelayConfig } from \"../config/config\";\nimport { ValidationResponse } from \"../relay\";\n\nexport interface EventApiCallParams {\n config: RelayConfig;\n environment: Environment;\n event: Readonly<RelayEvent>;\n}\n\nexport async function callEventApi<T>({\n event,\n config,\n environment,\n}: EventApiCallParams): Promise<T> {\n const { url, token } = config;\n const headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n };\n const response = await environment.fetch(\n `${url}${config.mode == \"validate\" ? \"/validate\" : \"\"}`,\n {\n method: \"POST\",\n body: JSON.stringify([event]),\n headers,\n }\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error({\n ...data,\n });\n }\n\n return data;\n}\n","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import { validate } from \"uuid\";\nimport { Environment } from \"../environment/environment\";\n\nexport interface ClientIdManager {\n getClientId: () => string;\n clear: () => void;\n}\n\nexport function createClientIdManager(\n environment: Environment\n): ClientIdManager {\n const key = \"visitorId\";\n return {\n getClientId: () => {\n const storage = environment.storage;\n\n const existingClientId = storage.getItem(key);\n const clientId =\n existingClientId && validate(existingClientId)\n ? existingClientId\n : environment.generateUUID();\n storage.setItem(key, clientId);\n return clientId;\n },\n clear: () => {\n environment.storage.removeItem(key);\n },\n };\n}\n","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","export interface CookieManager {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, data: string, expire: number) => void;\n}\n\nexport const cookieManager: CookieManager = createCookieManager();\n\nfunction createCookieManager(): CookieManager {\n const prefix = \"coveo_\";\n const getDomain = (host: string) => {\n const parts = host.split(\".\").slice(-2);\n return parts.length == 2 ? parts.join(\".\") : \"\";\n };\n\n return {\n getItem(key: string): string | null {\n const cookiePrefix = `${prefix}${key}=`;\n const cookieArray = document.cookie.split(\";\");\n for (const cookie of cookieArray) {\n const prettifyCookie = cookie.replace(/^\\s+/, \"\");\n if (prettifyCookie.lastIndexOf(cookiePrefix, 0) === 0) {\n return prettifyCookie.substring(\n cookiePrefix.length,\n prettifyCookie.length\n );\n }\n }\n return null;\n },\n setItem(key: string, data: string, expire: number): void {\n const domain = getDomain(window.location.hostname);\n const expireSection = `;expires=${new Date(\n new Date().getTime() + expire\n ).toUTCString()}`;\n const domainSection = domain ? `;domain=${domain}` : \"\";\n document.cookie = `${prefix}${key}=${data}${expireSection}${domainSection};path=/;SameSite=Lax`;\n },\n\n removeItem(key: string): void {\n this.setItem(key, \"\", -1);\n },\n };\n}\n","export async function fetchAPI(\n url: string,\n init?: RequestInit\n): Promise<Response> {\n return fetch(url, init).catch((err: Error) => {\n throw new Error(\n `${err.message}: The \"host\" value is invalid or a network error occured, according to the FetchAPI's response.`,\n { cause: err }\n );\n });\n}\n","import { Environment } from \"../environment\";\nimport { createBrowserStorage } from \"./storage/storage\";\nimport { fetchAPI } from \"../utils/fetch\";\n\nfunction getReferrerUrl() {\n const referrer = document.referrer;\n\n return referrer === \"\" ? null : referrer;\n}\n\nexport function buildBrowserEnvironment(): Environment {\n return {\n runtime: \"browser\",\n fetch: (url: string, init?: RequestInit) => fetchAPI(url, init),\n getReferrerUrl: () => getReferrerUrl(),\n getUrl: () => window.location.href,\n getUserAgent: () => navigator.userAgent,\n generateUUID: () => crypto.randomUUID(),\n storage: createBrowserStorage(),\n };\n}\n","import { Storage } from \"../../storage\";\nimport { cookieManager } from \"./cookie\";\n\nexport function createBrowserStorage(): Storage {\n return {\n getItem(key: string): string | null {\n return cookieManager.getItem(key) || localStorage.getItem(key);\n },\n\n removeItem(key: string): void {\n cookieManager.removeItem(key);\n localStorage.removeItem(key);\n },\n\n setItem(key: string, data: string): void {\n const oneYear = 31556952000;\n localStorage.setItem(key, data);\n cookieManager.setItem(key, data, oneYear);\n },\n };\n}\n","export interface Storage {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, data: string) => void;\n}\n\nexport function createNullStorage(): Storage {\n return {\n getItem(): string | null {\n return null;\n },\n removeItem(): void {\n return;\n },\n setItem(): void {\n return;\n },\n };\n}\n","import { buildBrowserEnvironment } from \"./browser/browser\";\nimport { buildNodeEnvironment } from \"./node/node\";\nimport { Storage } from \"./storage\";\n\nexport interface Environment {\n runtime: \"browser\" | \"node\" | \"null\";\n fetch: (url: string, init?: RequestInit) => Promise<Response>;\n getReferrerUrl: () => string | null;\n getUrl: () => string | null;\n getUserAgent: () => string | null;\n generateUUID: () => string;\n storage: Storage;\n}\n\nexport function currentEnvironment(): Environment {\n return isBrowser() ? buildBrowserEnvironment() : buildNodeEnvironment();\n}\n\nfunction isBrowser() {\n try {\n return typeof window === \"object\";\n } catch (e) {\n return false;\n }\n}\n","import { Environment } from \"../environment\";\nimport { createNullStorage } from \"../storage\";\nimport { fetchAPI } from \"../utils/fetch\";\n\nexport function buildNodeEnvironment(): Environment {\n return {\n runtime: \"node\",\n fetch: (url: string, init?: RequestInit) => fetchAPI(url, init),\n getReferrerUrl: () => null,\n getUrl: () => null,\n getUserAgent: () => null,\n generateUUID: () => crypto.randomUUID(),\n storage: createNullStorage(),\n };\n}\n","export const version: string = process.env.VERSION ?? \"\";\n","import { ClientIdManager } from \"../../client-id/client-id\";\nimport { Environment } from \"../../environment/environment\";\nimport { RelayConfig } from \"../../config/config\";\nimport { version } from \"../../version\";\n\ninterface EventConfig {\n trackingId: string;\n}\n\nexport interface Meta {\n type: string;\n config: EventConfig;\n ts: number;\n source: string;\n clientId: string;\n userAgent: string | null;\n referrerUrl: string | null;\n url: string | null;\n}\n\nfunction getEventConfig(config: RelayConfig): EventConfig {\n const { trackingId } = config;\n return { trackingId };\n}\n\nfunction getSource(): string {\n return `relay@${version}`;\n}\n\nexport function createMeta(\n type: string,\n config: RelayConfig,\n environment: Environment,\n clientIdManager: ClientIdManager\n): Readonly<Meta> {\n const { getReferrerUrl, getUrl, getUserAgent } = environment;\n const eventConfig = getEventConfig(config);\n const clientId = clientIdManager.getClientId();\n\n return Object.freeze({\n type,\n config: eventConfig,\n ts: Date.now(),\n source: getSource(),\n clientId,\n userAgent: getUserAgent(),\n referrerUrl: getReferrerUrl(),\n url: getUrl(),\n });\n}\n","import { RelayEvent } from \"../event/relay-event\";\n\nconst ANY_EVENT_TYPE = \"*\";\n\nexport type EventCallback = (event: RelayEvent) => void;\n\ninterface Listener {\n type: string;\n callback: EventCallback;\n}\n\ninterface ListenerManager {\n add: (listener: Listener) => () => void;\n call: (event: RelayEvent) => void;\n remove: (type: string, callback?: EventCallback) => void;\n}\n\nexport function createListenerManager(): ListenerManager {\n const listeners: Listener[] = [];\n\n function getListenerIndex({ type, callback }: Listener): number {\n return listeners.findIndex(\n (listener) => listener.type === type && listener.callback === callback\n );\n }\n\n function isMatchesType(listener: Listener, type: string): boolean {\n return listener.type === \"*\" || type === listener.type;\n }\n\n function add(listener: Listener): () => void {\n if (getListenerIndex(listener) < 0) {\n listeners.push(listener);\n }\n return () => remove(listener.type, listener.callback);\n }\n\n function call(event: RelayEvent) {\n listeners.forEach((listener) => {\n if (isMatchesType(listener, event.meta.type)) {\n try {\n listener.callback(event);\n } catch (e) {\n console.error(e);\n }\n }\n });\n }\n\n function removeMultiple(type: string) {\n if (type === ANY_EVENT_TYPE) {\n listeners.length = 0;\n } else {\n for (let i = listeners.length - 1; i >= 0; i--) {\n if (listeners[i].type === type) {\n listeners.splice(i, 1);\n }\n }\n }\n }\n\n function removeOne(listener: Listener) {\n const index = getListenerIndex(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n }\n\n function remove(type: string, callback?: EventCallback) {\n !!callback ? removeOne({ type, callback }) : removeMultiple(type);\n }\n\n return {\n add,\n call,\n remove,\n };\n}\n","export type RelayMode = \"emit\" | \"validate\" | \"disabled\";\n\nexport interface RelayConfig {\n url: string;\n token: string;\n trackingId: string;\n mode?: RelayMode;\n}\n\nexport interface ConfigManager {\n get: () => Readonly<RelayConfig>;\n update: (updatedConfig: Partial<RelayConfig>) => void;\n}\n\nfunction pick({\n url,\n token,\n trackingId,\n ...rest\n}: RelayConfig): Readonly<RelayConfig> {\n return Object.freeze({\n url,\n token,\n trackingId,\n ...(!!rest.mode && { mode: rest.mode }),\n });\n}\n\nexport function createConfigManager(\n initialConfig: RelayConfig\n): Readonly<ConfigManager> {\n let _config: Readonly<RelayConfig> = pick(initialConfig);\n\n return {\n get: () => _config,\n update: (updatedConfig: Partial<RelayConfig>) => {\n _config = pick({ ..._config, ...updatedConfig });\n },\n };\n}\n","import { emit } from \"./emit/emit\";\nimport { createClientIdManager } from \"./client-id/client-id\";\nimport { currentEnvironment } from \"./environment/environment\";\nimport { createRelayEvent } from \"./event/relay-event\";\nimport { version } from \"./version\";\nimport { createMeta, Meta } from \"./event/meta/meta\";\nimport { createListenerManager, EventCallback } from \"./listener/listener\";\nimport { createConfigManager, RelayConfig } from \"./config/config\";\nimport {\n validate,\n ValidationError,\n ValidationResponse,\n} from \"./validate/validate\";\nimport { buildNullEnvironment } from \"./environment/null/null\";\n\ntype RelayPayload = Record<string, unknown>;\ntype Off = () => void;\n\ninterface Relay {\n emit: (\n type: string,\n payload: RelayPayload\n ) => Promise<void | ValidationResponse>;\n getMeta: (type: string) => Meta;\n on: (type: string, callback: EventCallback) => Off;\n off: (type: string, callback?: EventCallback) => void;\n updateConfig: (config: Partial<RelayConfig>) => void;\n version: string;\n clearStorage: () => void;\n}\n\nexport function createRelay(initialConfig: RelayConfig): Relay {\n const configManager = createConfigManager(initialConfig);\n const getEnvironment = () =>\n configManager.get().mode == \"disabled\"\n ? buildNullEnvironment()\n : currentEnvironment();\n const clientIdManager = createClientIdManager(getEnvironment());\n\n const { add, call, remove } = createListenerManager();\n\n return {\n emit: (type: string, payload: RelayPayload) => {\n const event = createRelayEvent(\n type,\n payload,\n configManager.get(),\n getEnvironment(),\n clientIdManager\n );\n\n call(event);\n\n const params = {\n config: configManager.get(),\n environment: getEnvironment(),\n event,\n };\n\n return configManager.get().mode === \"validate\"\n ? validate(params)\n : emit(params);\n },\n getMeta: (type: string) =>\n createMeta(type, configManager.get(), getEnvironment(), clientIdManager),\n on: (type: string, callback: EventCallback) => add({ type, callback }),\n off: (type: string, callback?: EventCallback) => remove(type, callback),\n updateConfig: (config: Partial<RelayConfig>) =>\n configManager.update(config),\n version,\n clearStorage: () => {\n clientIdManager.clear();\n },\n };\n}\n\nexport type { RelayPayload, RelayConfig, ValidationError, ValidationResponse };\n","import { Environment } from \"../environment\";\nimport { createNullStorage } from \"../storage\";\n\nexport function buildNullEnvironment(): Environment {\n return {\n runtime: \"null\",\n fetch: () => Promise.resolve(new Response(JSON.stringify(\"\"))),\n getReferrerUrl: () => null,\n getUrl: () => null,\n getUserAgent: () => null,\n generateUUID: () => \"\",\n storage: createNullStorage(),\n };\n}\n","import { ClientIdManager } from \"../client-id/client-id\";\nimport { Environment } from \"../environment/environment\";\nimport { RelayConfig, RelayPayload } from \"../relay\";\nimport { createMeta, Meta } from \"./meta/meta\";\n\nexport interface RelayEvent extends RelayPayload {\n meta: Readonly<Meta>;\n}\n\nexport function createRelayEvent(\n type: string,\n payload: RelayPayload,\n config: RelayConfig,\n environment: Environment,\n clientIdManager: ClientIdManager\n): Readonly<RelayEvent> {\n return {\n ...payload,\n meta: createMeta(type, config, environment, clientIdManager),\n };\n}\n","import {\n callEventApi,\n EventApiCallParams,\n} from \"../event-api-call/event-api-caller\";\n\nexport interface ValidationError {\n type: string;\n message: string;\n path: string;\n}\n\nexport interface ValidationResponse {\n valid: boolean;\n errors: ValidationError[];\n}\n\nexport async function validate(\n params: EventApiCallParams\n): Promise<Readonly<ValidationResponse>> {\n const data = await callEventApi<ValidationResponse[] | \"\">(params);\n\n if (!data) {\n return {\n valid: false,\n errors: [{ type: \"\", message: \"disabled\", path: \"\" }],\n };\n }\n\n const { valid, errors } = data[0];\n\n return { valid, errors: errors ?? [] };\n}\n","import {\n callEventApi,\n EventApiCallParams,\n} from \"../event-api-call/event-api-caller\";\n\nexport async function emit(params: EventApiCallParams) {\n await callEventApi(params);\n}\n"],"names":["async","callEventApi","event","config","environment","url","token","headers","Authorization","response","fetch","mode","method","body","JSON","stringify","data","json","ok","Error","REGEX","createClientIdManager","key","getClientId","storage","existingClientId","getItem","clientId","uuid","test","generateUUID","setItem","clear","removeItem","cookieManager","prefix","cookiePrefix","cookieArray","document","cookie","split","prettifyCookie","replace","lastIndexOf","substring","length","expire","domain","host","parts","slice","join","getDomain","window","location","hostname","expireSection","Date","getTime","toUTCString","domainSection","this","createCookieManager","fetchAPI","init","catch","err","message","cause","buildBrowserEnvironment","runtime","getReferrerUrl","referrer","getUrl","href","getUserAgent","navigator","userAgent","crypto","randomUUID","localStorage","createNullStorage","currentEnvironment","e","isBrowser","version","createMeta","type","clientIdManager","eventConfig","trackingId","getEventConfig","Object","freeze","ts","now","source","referrerUrl","ANY_EVENT_TYPE","createListenerManager","listeners","getListenerIndex","callback","findIndex","listener","remove","index","splice","removeOne","i","removeMultiple","add","push","call","forEach","isMatchesType","meta","console","error","pick","rest","createRelay","initialConfig","configManager","_config","get","update","updatedConfig","createConfigManager","getEnvironment","Promise","resolve","Response","emit","payload","createRelayEvent","params","valid","errors","path","validate","getMeta","on","off","updateConfig","clearStorage"],"mappings":"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","x_google_ignoreList":[1,3]}
1
+ {"version":3,"file":"relay.min.js","sources":["../../src/emit/emit.ts","../../src/validate/validate.ts","../../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/regex.js","../../src/client-id/client-id.ts","../../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/validate.js","../../src/environment/browser/storage/cookie.ts","../../src/environment/utils/fetch.ts","../../src/environment/browser/browser.ts","../../src/environment/browser/storage/storage.ts","../../src/environment/storage.ts","../../src/environment/environment.ts","../../src/environment/node/node.ts","../../src/version.ts","../../src/event/meta/meta.ts","../../src/listener/listener.ts","../../src/config/config.ts","../../src/relay.ts","../../src/environment/null/null.ts","../../src/event/relay-event.ts"],"sourcesContent":["import { Environment } from \"../environment/environment\";\nimport { ListenerManager } from \"../listener/listener\";\nimport { validate } from \"../validate/validate\";\nimport { RelayEvent } from \"../event/relay-event\";\nimport { RelayConfig } from \"../relay\";\n\nexport interface EmitParams {\n config: RelayConfig;\n environment: Environment;\n event: RelayEvent;\n listenerManager: ListenerManager;\n}\n\nexport async function emit(params: EmitParams) {\n const { listenerManager, event, config } = params;\n const isEnabled = config.mode !== \"disabled\";\n\n isEnabled && listenerManager.call(event);\n return config.mode === \"validate\" ? validate(params) : emitEvent(params);\n}\n\nexport async function emitEvent({\n event,\n config,\n environment,\n}: EmitParams): Promise<null> {\n const { url, token } = config;\n\n return environment.send(url, token, JSON.stringify([event]));\n}\n","import { Environment } from \"../environment/environment\";\nimport { RelayEvent } from \"../event/relay-event\";\nimport { RelayConfig } from \"../relay\";\n\nexport interface ValidateParams {\n config: RelayConfig;\n environment: Environment;\n event: Readonly<RelayEvent>;\n}\n\nexport interface ValidationError {\n type: string;\n message: string;\n path: string;\n}\n\nexport interface ValidationResponse {\n valid: boolean;\n errors: ValidationError[];\n}\n\nexport async function validate({\n config,\n environment,\n event,\n}: ValidateParams): Promise<Readonly<ValidationResponse>> {\n const { url, token } = config;\n const headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n };\n\n const response = await environment.fetch(`${url}/validate`, {\n method: \"POST\",\n body: JSON.stringify([event]),\n headers,\n });\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error({\n ...data,\n });\n }\n\n if (!data) {\n return {\n valid: false,\n errors: [{ type: \"\", message: \"disabled\", path: \"\" }],\n };\n }\n\n const { valid, errors } = data[0];\n\n return { valid, errors: errors ?? [] };\n}\n","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import { validate } from \"uuid\";\nimport { Environment } from \"../environment/environment\";\n\nexport interface ClientIdManager {\n getClientId: () => string;\n clear: () => void;\n}\n\nexport function createClientIdManager(\n environment: Environment\n): ClientIdManager {\n const key = \"visitorId\";\n return {\n getClientId: () => {\n const storage = environment.storage;\n\n const existingClientId = storage.getItem(key);\n const clientId =\n existingClientId && validate(existingClientId)\n ? existingClientId\n : environment.generateUUID();\n storage.setItem(key, clientId);\n return clientId;\n },\n clear: () => {\n environment.storage.removeItem(key);\n },\n };\n}\n","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","export interface CookieManager {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, data: string, expire: number) => void;\n}\n\nexport const cookieManager: CookieManager = createCookieManager();\n\nfunction createCookieManager(): CookieManager {\n const prefix = \"coveo_\";\n const getDomain = (host: string) => {\n const parts = host.split(\".\").slice(-2);\n return parts.length == 2 ? parts.join(\".\") : \"\";\n };\n\n return {\n getItem(key: string): string | null {\n const cookiePrefix = `${prefix}${key}=`;\n const cookieArray = document.cookie.split(\";\");\n for (const cookie of cookieArray) {\n const prettifyCookie = cookie.replace(/^\\s+/, \"\");\n if (prettifyCookie.lastIndexOf(cookiePrefix, 0) === 0) {\n return prettifyCookie.substring(\n cookiePrefix.length,\n prettifyCookie.length\n );\n }\n }\n return null;\n },\n setItem(key: string, data: string, expire: number): void {\n const domain = getDomain(window.location.hostname);\n const expireSection = `;expires=${new Date(\n new Date().getTime() + expire\n ).toUTCString()}`;\n const domainSection = domain ? `;domain=${domain}` : \"\";\n document.cookie = `${prefix}${key}=${data}${expireSection}${domainSection};path=/;SameSite=Lax`;\n },\n\n removeItem(key: string): void {\n this.setItem(key, \"\", -1);\n },\n };\n}\n","export async function fetchAPI(\n url: string,\n init?: RequestInit\n): Promise<Response> {\n return fetch(url, init).catch((err: Error) => {\n throw new Error(\n `${err.message}: The \"host\" value is invalid or a network error occured, according to the FetchAPI's response.`,\n { cause: err }\n );\n });\n}\n","import { Environment } from \"../environment\";\nimport { createBrowserStorage } from \"./storage/storage\";\nimport { fetchAPI } from \"../utils/fetch\";\n\nfunction getReferrerUrl() {\n const referrer = document.referrer;\n\n return referrer === \"\" ? null : referrer;\n}\n\nexport function buildBrowserEnvironment(): Environment {\n return {\n runtime: \"browser\",\n fetch: (url: string, init?: RequestInit) => fetchAPI(url, init),\n send: async (url: string, token: string, body: string) => {\n const response = navigator.sendBeacon(\n `${url}?access_token=${token}`,\n new Blob([body], {\n type: \"application/json\",\n })\n );\n\n if (!response) {\n throw new Error(\n `Failed to send the event(s) because the payload size exceeded the maximum allowed size (32 KB). Please contact support if the problem persists.`\n );\n }\n\n return null;\n },\n getReferrerUrl: () => getReferrerUrl(),\n getUrl: () => window.location.href,\n getUserAgent: () => navigator.userAgent,\n generateUUID: () => crypto.randomUUID(),\n storage: createBrowserStorage(),\n };\n}\n","import { Storage } from \"../../storage\";\nimport { cookieManager } from \"./cookie\";\n\nexport function createBrowserStorage(): Storage {\n return {\n getItem(key: string): string | null {\n return cookieManager.getItem(key) || localStorage.getItem(key);\n },\n\n removeItem(key: string): void {\n cookieManager.removeItem(key);\n localStorage.removeItem(key);\n },\n\n setItem(key: string, data: string): void {\n const oneYear = 31556952000;\n localStorage.setItem(key, data);\n cookieManager.setItem(key, data, oneYear);\n },\n };\n}\n","export interface Storage {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, data: string) => void;\n}\n\nexport function createNullStorage(): Storage {\n return {\n getItem(): string | null {\n return null;\n },\n removeItem(): void {\n return;\n },\n setItem(): void {\n return;\n },\n };\n}\n","import { buildBrowserEnvironment } from \"./browser/browser\";\nimport { buildNodeEnvironment } from \"./node/node\";\nimport { Storage } from \"./storage\";\n\nexport interface Environment {\n runtime: \"browser\" | \"node\" | \"null\";\n fetch: (url: string, init?: RequestInit) => Promise<Response>;\n send: (url: string, token: string, body: string) => Promise<null>;\n getReferrerUrl: () => string | null;\n getUrl: () => string | null;\n getUserAgent: () => string | null;\n generateUUID: () => string;\n storage: Storage;\n}\n\nexport function currentEnvironment(): Environment {\n return isBrowser() ? buildBrowserEnvironment() : buildNodeEnvironment();\n}\n\nfunction isBrowser() {\n try {\n return typeof window === \"object\";\n } catch (e) {\n return false;\n }\n}\n","import { Environment } from \"../environment\";\nimport { createNullStorage } from \"../storage\";\nimport { fetchAPI } from \"../utils/fetch\";\n\nexport function buildNodeEnvironment(): Environment {\n return {\n runtime: \"node\",\n fetch: (url: string, init?: RequestInit) => fetchAPI(url, init),\n send: async (url: string, token: string, body: string) => {\n const headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n };\n fetchAPI(url, {\n method: \"POST\",\n body,\n headers,\n });\n return null;\n },\n getReferrerUrl: () => null,\n getUrl: () => null,\n getUserAgent: () => null,\n generateUUID: () => crypto.randomUUID(),\n storage: createNullStorage(),\n };\n}\n","export const version: string = process.env.VERSION ?? \"\";\n","import { ClientIdManager } from \"../../client-id/client-id\";\nimport { Environment } from \"../../environment/environment\";\nimport { RelayConfig } from \"../../config/config\";\nimport { version } from \"../../version\";\n\ninterface EventConfig {\n trackingId: string;\n}\n\nexport interface Meta {\n type: string;\n config: EventConfig;\n ts: number;\n source: string;\n clientId: string;\n userAgent: string | null;\n referrerUrl: string | null;\n url: string | null;\n}\n\nfunction getEventConfig(config: RelayConfig): EventConfig {\n const { trackingId } = config;\n return { trackingId };\n}\n\nfunction getSource(): string {\n return `relay@${version}`;\n}\n\nexport function createMeta(\n type: string,\n config: RelayConfig,\n environment: Environment,\n clientIdManager: ClientIdManager\n): Readonly<Meta> {\n const { getReferrerUrl, getUrl, getUserAgent } = environment;\n const eventConfig = getEventConfig(config);\n const clientId = clientIdManager.getClientId();\n\n return Object.freeze({\n type,\n config: eventConfig,\n ts: Date.now(),\n source: getSource(),\n clientId,\n userAgent: getUserAgent(),\n referrerUrl: getReferrerUrl(),\n url: getUrl(),\n });\n}\n","import { RelayEvent } from \"../event/relay-event\";\n\nconst ANY_EVENT_TYPE = \"*\";\n\nexport type EventCallback = (event: RelayEvent) => void;\n\ninterface Listener {\n type: string;\n callback: EventCallback;\n}\n\nexport interface ListenerManager {\n add: (listener: Listener) => () => void;\n call: (event: RelayEvent) => void;\n remove: (type: string, callback?: EventCallback) => void;\n}\n\nexport function createListenerManager(): ListenerManager {\n const listeners: Listener[] = [];\n\n function getListenerIndex({ type, callback }: Listener): number {\n return listeners.findIndex(\n (listener) => listener.type === type && listener.callback === callback\n );\n }\n\n function isMatchesType(listener: Listener, type: string): boolean {\n return listener.type === \"*\" || type === listener.type;\n }\n\n function add(listener: Listener): () => void {\n if (getListenerIndex(listener) < 0) {\n listeners.push(listener);\n }\n return () => remove(listener.type, listener.callback);\n }\n\n function call(event: RelayEvent) {\n listeners.forEach((listener) => {\n if (isMatchesType(listener, event.meta.type)) {\n try {\n listener.callback(event);\n } catch (e) {\n console.error(e);\n }\n }\n });\n }\n\n function removeMultiple(type: string) {\n if (type === ANY_EVENT_TYPE) {\n listeners.length = 0;\n } else {\n for (let i = listeners.length - 1; i >= 0; i--) {\n if (listeners[i].type === type) {\n listeners.splice(i, 1);\n }\n }\n }\n }\n\n function removeOne(listener: Listener) {\n const index = getListenerIndex(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n }\n\n function remove(type: string, callback?: EventCallback) {\n !!callback ? removeOne({ type, callback }) : removeMultiple(type);\n }\n\n return {\n add,\n call,\n remove,\n };\n}\n","export type RelayMode = \"emit\" | \"validate\" | \"disabled\";\n\nexport interface RelayConfig {\n url: string;\n token: string;\n trackingId: string;\n mode?: RelayMode;\n}\n\nexport interface ConfigManager {\n get: () => Readonly<RelayConfig>;\n update: (updatedConfig: Partial<RelayConfig>) => void;\n}\n\nfunction pick({\n url,\n token,\n trackingId,\n ...rest\n}: RelayConfig): Readonly<RelayConfig> {\n return Object.freeze({\n url,\n token,\n trackingId,\n ...(!!rest.mode && { mode: rest.mode }),\n });\n}\n\nexport function createConfigManager(\n initialConfig: RelayConfig\n): Readonly<ConfigManager> {\n let _config: Readonly<RelayConfig> = pick(initialConfig);\n\n return {\n get: () => _config,\n update: (updatedConfig: Partial<RelayConfig>) => {\n _config = pick({ ..._config, ...updatedConfig });\n },\n };\n}\n","import { emit } from \"./emit/emit\";\nimport { createClientIdManager } from \"./client-id/client-id\";\nimport { currentEnvironment } from \"./environment/environment\";\nimport { createRelayEvent } from \"./event/relay-event\";\nimport { version } from \"./version\";\nimport { createMeta, Meta } from \"./event/meta/meta\";\nimport { createListenerManager, EventCallback } from \"./listener/listener\";\nimport { createConfigManager, RelayConfig } from \"./config/config\";\nimport { ValidationError, ValidationResponse } from \"./validate/validate\";\nimport { buildNullEnvironment } from \"./environment/null/null\";\n\ntype RelayPayload = Record<string, unknown>;\ntype Off = () => void;\n\ninterface Relay {\n emit: (\n type: string,\n payload: RelayPayload\n ) => Promise<ValidationResponse | null>;\n getMeta: (type: string) => Meta;\n on: (type: string, callback: EventCallback) => Off;\n off: (type: string, callback?: EventCallback) => void;\n updateConfig: (config: Partial<RelayConfig>) => void;\n version: string;\n clearStorage: () => void;\n}\n\nexport function createRelay(initialConfig: RelayConfig): Relay {\n const configManager = createConfigManager(initialConfig);\n const listenerManager = createListenerManager();\n\n const getEnvironment = () =>\n configManager.get().mode == \"disabled\"\n ? buildNullEnvironment()\n : currentEnvironment();\n const clientIdManager = createClientIdManager(getEnvironment());\n\n return {\n emit: (type: string, payload: RelayPayload) => {\n const config = configManager.get();\n const environment = getEnvironment();\n\n const event = createRelayEvent(\n type,\n payload,\n config,\n environment,\n clientIdManager\n );\n\n return emit({\n config,\n environment,\n event,\n listenerManager,\n });\n },\n getMeta: (type: string) =>\n createMeta(type, configManager.get(), getEnvironment(), clientIdManager),\n on: (type: string, callback: EventCallback) =>\n listenerManager.add({ type, callback }),\n off: (type: string, callback?: EventCallback) =>\n listenerManager.remove(type, callback),\n updateConfig: (config: Partial<RelayConfig>) =>\n configManager.update(config),\n version,\n clearStorage: () => {\n clientIdManager.clear();\n },\n };\n}\n\nexport type { RelayPayload, RelayConfig, ValidationError, ValidationResponse };\n","import { Environment } from \"../environment\";\nimport { createNullStorage } from \"../storage\";\n\nexport function buildNullEnvironment(): Environment {\n return {\n runtime: \"null\",\n fetch: () => Promise.resolve(new Response(JSON.stringify(\"\"))),\n send: async () => null,\n getReferrerUrl: () => null,\n getUrl: () => null,\n getUserAgent: () => null,\n generateUUID: () => \"\",\n storage: createNullStorage(),\n };\n}\n","import { ClientIdManager } from \"../client-id/client-id\";\nimport { Environment } from \"../environment/environment\";\nimport { RelayConfig, RelayPayload } from \"../relay\";\nimport { createMeta, Meta } from \"./meta/meta\";\n\nexport interface RelayEvent extends RelayPayload {\n meta: Readonly<Meta>;\n}\n\nexport function createRelayEvent(\n type: string,\n payload: RelayPayload,\n config: RelayConfig,\n environment: Environment,\n clientIdManager: ClientIdManager\n): Readonly<RelayEvent> {\n return {\n ...payload,\n meta: createMeta(type, config, environment, clientIdManager),\n };\n}\n"],"names":["async","emit","params","listenerManager","event","config","mode","call","environment","url","token","headers","Authorization","response","fetch","method","body","JSON","stringify","data","json","ok","Error","valid","errors","type","message","path","validate","send","emitEvent","REGEX","createClientIdManager","key","getClientId","storage","existingClientId","getItem","clientId","uuid","test","generateUUID","setItem","clear","removeItem","cookieManager","prefix","cookiePrefix","cookieArray","document","cookie","split","prettifyCookie","replace","lastIndexOf","substring","length","expire","domain","host","parts","slice","join","getDomain","window","location","hostname","expireSection","Date","getTime","toUTCString","domainSection","this","createCookieManager","fetchAPI","init","catch","err","cause","buildBrowserEnvironment","runtime","navigator","sendBeacon","Blob","getReferrerUrl","referrer","getUrl","href","getUserAgent","userAgent","crypto","randomUUID","localStorage","createNullStorage","currentEnvironment","e","isBrowser","version","createMeta","clientIdManager","eventConfig","trackingId","getEventConfig","Object","freeze","ts","now","source","referrerUrl","ANY_EVENT_TYPE","createListenerManager","listeners","getListenerIndex","callback","findIndex","listener","remove","index","splice","removeOne","i","removeMultiple","add","push","forEach","isMatchesType","meta","console","error","pick","rest","createRelay","initialConfig","configManager","_config","get","update","updatedConfig","createConfigManager","getEnvironment","Promise","resolve","Response","payload","createRelayEvent","getMeta","on","off","updateConfig","clearStorage"],"mappings":"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","x_google_ignoreList":[2,4]}
@@ -1,3 +1,13 @@
1
- import { EventApiCallParams } from "../event-api-call/event-api-caller";
2
- export declare function emit(params: EventApiCallParams): Promise<void>;
1
+ import { Environment } from "../environment/environment";
2
+ import { ListenerManager } from "../listener/listener";
3
+ import { RelayEvent } from "../event/relay-event";
4
+ import { RelayConfig } from "../relay";
5
+ export interface EmitParams {
6
+ config: RelayConfig;
7
+ environment: Environment;
8
+ event: RelayEvent;
9
+ listenerManager: ListenerManager;
10
+ }
11
+ export declare function emit(params: EmitParams): Promise<Readonly<import("../relay").ValidationResponse> | null>;
12
+ export declare function emitEvent({ event, config, environment, }: EmitParams): Promise<null>;
3
13
  //# sourceMappingURL=emit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EACnB,MAAM,oCAAoC,CAAC;AAE5C,wBAAsB,IAAI,CAAC,MAAM,EAAE,kBAAkB,iBAEpD"}
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,UAAU,mEAM5C;AAED,wBAAsB,SAAS,CAAC,EAC9B,KAAK,EACL,MAAM,EACN,WAAW,GACZ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,uBAAuB,IAAI,WAAW,CAUrD"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,uBAAuB,IAAI,WAAW,CA0BrD"}
@@ -2,6 +2,7 @@ import { Storage } from "./storage";
2
2
  export interface Environment {
3
3
  runtime: "browser" | "node" | "null";
4
4
  fetch: (url: string, init?: RequestInit) => Promise<Response>;
5
+ send: (url: string, token: string, body: string) => Promise<null>;
5
6
  getReferrerUrl: () => string | null;
6
7
  getUrl: () => string | null;
7
8
  getUserAgent: () => string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/environment/environment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9D,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/environment/environment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,wBAAgB,oBAAoB,IAAI,WAAW,CAUlD"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,wBAAgB,oBAAoB,IAAI,WAAW,CAsBlD"}
@@ -1 +1 @@
1
- {"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../../../src/environment/null/null.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,wBAAgB,oBAAoB,IAAI,WAAW,CAUlD"}
1
+ {"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../../../src/environment/null/null.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,wBAAgB,oBAAoB,IAAI,WAAW,CAWlD"}
@@ -4,7 +4,7 @@ interface Listener {
4
4
  type: string;
5
5
  callback: EventCallback;
6
6
  }
7
- interface ListenerManager {
7
+ export interface ListenerManager {
8
8
  add: (listener: Listener) => () => void;
9
9
  call: (event: RelayEvent) => void;
10
10
  remove: (type: string, callback?: EventCallback) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/listener/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA4DvD"}
1
+ {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/listener/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA4DvD"}
@@ -5,7 +5,7 @@ import { ValidationError, ValidationResponse } from "./validate/validate";
5
5
  type RelayPayload = Record<string, unknown>;
6
6
  type Off = () => void;
7
7
  interface Relay {
8
- emit: (type: string, payload: RelayPayload) => Promise<void | ValidationResponse>;
8
+ emit: (type: string, payload: RelayPayload) => Promise<ValidationResponse | null>;
9
9
  getMeta: (type: string) => Meta;
10
10
  on: (type: string, callback: EventCallback) => Off;
11
11
  off: (type: string, callback?: EventCallback) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAEL,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAG7B,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAEtB,UAAU,KAAK;IACb,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,GAAG,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,WAAW,GAAG,KAAK,CA2C7D;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG1E,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAEtB,UAAU,KAAK;IACb,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,GAAG,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,WAAW,GAAG,KAAK,CA2C7D;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1,4 +1,11 @@
1
- import { EventApiCallParams } from "../event-api-call/event-api-caller";
1
+ import { Environment } from "../environment/environment";
2
+ import { RelayEvent } from "../event/relay-event";
3
+ import { RelayConfig } from "../relay";
4
+ export interface ValidateParams {
5
+ config: RelayConfig;
6
+ environment: Environment;
7
+ event: Readonly<RelayEvent>;
8
+ }
2
9
  export interface ValidationError {
3
10
  type: string;
4
11
  message: string;
@@ -8,5 +15,5 @@ export interface ValidationResponse {
8
15
  valid: boolean;
9
16
  errors: ValidationError[];
10
17
  }
11
- export declare function validate(params: EventApiCallParams): Promise<Readonly<ValidationResponse>>;
18
+ export declare function validate({ config, environment, event, }: ValidateParams): Promise<Readonly<ValidationResponse>>;
12
19
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EACnB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAavC"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,wBAAsB,QAAQ,CAAC,EAC7B,MAAM,EACN,WAAW,EACX,KAAK,GACN,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CA8BxD"}
package/lib/relay.cjs CHANGED
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- async function callEventApi({ event, config, environment, }) {
3
+ async function validate$1({ config, environment, event, }) {
4
4
  const { url, token } = config;
5
5
  const headers = {
6
6
  "Content-Type": "application/json",
7
7
  Authorization: `Bearer ${token}`,
8
8
  };
9
- const response = await environment.fetch(`${url}${config.mode == "validate" ? "/validate" : ""}`, {
9
+ const response = await environment.fetch(`${url}/validate`, {
10
10
  method: "POST",
11
11
  body: JSON.stringify([event]),
12
12
  headers,
@@ -17,16 +17,30 @@ async function callEventApi({ event, config, environment, }) {
17
17
  ...data,
18
18
  });
19
19
  }
20
- return data;
20
+ if (!data) {
21
+ return {
22
+ valid: false,
23
+ errors: [{ type: "", message: "disabled", path: "" }],
24
+ };
25
+ }
26
+ const { valid, errors } = data[0];
27
+ return { valid, errors: errors ?? [] };
21
28
  }
22
29
 
23
30
  async function emit(params) {
24
- await callEventApi(params);
31
+ const { listenerManager, event, config } = params;
32
+ const isEnabled = config.mode !== "disabled";
33
+ isEnabled && listenerManager.call(event);
34
+ return config.mode === "validate" ? validate$1(params) : emitEvent(params);
35
+ }
36
+ async function emitEvent({ event, config, environment, }) {
37
+ const { url, token } = config;
38
+ return environment.send(url, token, JSON.stringify([event]));
25
39
  }
26
40
 
27
41
  var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
28
42
 
29
- function validate$1(uuid) {
43
+ function validate(uuid) {
30
44
  return typeof uuid === 'string' && REGEX.test(uuid);
31
45
  }
32
46
 
@@ -36,7 +50,7 @@ function createClientIdManager(environment) {
36
50
  getClientId: () => {
37
51
  const storage = environment.storage;
38
52
  const existingClientId = storage.getItem(key);
39
- const clientId = existingClientId && validate$1(existingClientId)
53
+ const clientId = existingClientId && validate(existingClientId)
40
54
  ? existingClientId
41
55
  : environment.generateUUID();
42
56
  storage.setItem(key, clientId);
@@ -110,6 +124,15 @@ function buildBrowserEnvironment() {
110
124
  return {
111
125
  runtime: "browser",
112
126
  fetch: (url, init) => fetchAPI(url, init),
127
+ send: async (url, token, body) => {
128
+ const response = navigator.sendBeacon(`${url}?access_token=${token}`, new Blob([body], {
129
+ type: "application/json",
130
+ }));
131
+ if (!response) {
132
+ throw new Error(`Failed to send the event(s) because the payload size exceeded the maximum allowed size (32 KB). Please contact support if the problem persists.`);
133
+ }
134
+ return null;
135
+ },
113
136
  getReferrerUrl: () => getReferrerUrl(),
114
137
  getUrl: () => window.location.href,
115
138
  getUserAgent: () => navigator.userAgent,
@@ -136,6 +159,18 @@ function buildNodeEnvironment() {
136
159
  return {
137
160
  runtime: "node",
138
161
  fetch: (url, init) => fetchAPI(url, init),
162
+ send: async (url, token, body) => {
163
+ const headers = {
164
+ "Content-Type": "application/json",
165
+ Authorization: `Bearer ${token}`,
166
+ };
167
+ fetchAPI(url, {
168
+ method: "POST",
169
+ body,
170
+ headers,
171
+ });
172
+ return null;
173
+ },
139
174
  getReferrerUrl: () => null,
140
175
  getUrl: () => null,
141
176
  getUserAgent: () => null,
@@ -156,7 +191,7 @@ function isBrowser() {
156
191
  }
157
192
  }
158
193
 
159
- const version = "0.6.0" ;
194
+ const version = "0.6.2" ;
160
195
 
161
196
  function getEventConfig(config) {
162
197
  const { trackingId } = config;
@@ -261,22 +296,11 @@ function createConfigManager(initialConfig) {
261
296
  };
262
297
  }
263
298
 
264
- async function validate(params) {
265
- const data = await callEventApi(params);
266
- if (!data) {
267
- return {
268
- valid: false,
269
- errors: [{ type: "", message: "disabled", path: "" }],
270
- };
271
- }
272
- const { valid, errors } = data[0];
273
- return { valid, errors: errors ?? [] };
274
- }
275
-
276
299
  function buildNullEnvironment() {
277
300
  return {
278
301
  runtime: "null",
279
302
  fetch: () => Promise.resolve(new Response(JSON.stringify(""))),
303
+ send: async () => null,
280
304
  getReferrerUrl: () => null,
281
305
  getUrl: () => null,
282
306
  getUserAgent: () => null,
@@ -287,27 +311,26 @@ function buildNullEnvironment() {
287
311
 
288
312
  function createRelay(initialConfig) {
289
313
  const configManager = createConfigManager(initialConfig);
314
+ const listenerManager = createListenerManager();
290
315
  const getEnvironment = () => configManager.get().mode == "disabled"
291
316
  ? buildNullEnvironment()
292
317
  : currentEnvironment();
293
318
  const clientIdManager = createClientIdManager(getEnvironment());
294
- const { add, call, remove } = createListenerManager();
295
319
  return {
296
320
  emit: (type, payload) => {
297
- const event = createRelayEvent(type, payload, configManager.get(), getEnvironment(), clientIdManager);
298
- call(event);
299
- const params = {
300
- config: configManager.get(),
301
- environment: getEnvironment(),
321
+ const config = configManager.get();
322
+ const environment = getEnvironment();
323
+ const event = createRelayEvent(type, payload, config, environment, clientIdManager);
324
+ return emit({
325
+ config,
326
+ environment,
302
327
  event,
303
- };
304
- return configManager.get().mode === "validate"
305
- ? validate(params)
306
- : emit(params);
328
+ listenerManager,
329
+ });
307
330
  },
308
331
  getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
309
- on: (type, callback) => add({ type, callback }),
310
- off: (type, callback) => remove(type, callback),
332
+ on: (type, callback) => listenerManager.add({ type, callback }),
333
+ off: (type, callback) => listenerManager.remove(type, callback),
311
334
  updateConfig: (config) => configManager.update(config),
312
335
  version,
313
336
  clearStorage: () => {
package/lib/relay.js CHANGED
@@ -1,10 +1,10 @@
1
- async function callEventApi({ event, config, environment, }) {
1
+ async function validate$1({ config, environment, event, }) {
2
2
  const { url, token } = config;
3
3
  const headers = {
4
4
  "Content-Type": "application/json",
5
5
  Authorization: `Bearer ${token}`,
6
6
  };
7
- const response = await environment.fetch(`${url}${config.mode == "validate" ? "/validate" : ""}`, {
7
+ const response = await environment.fetch(`${url}/validate`, {
8
8
  method: "POST",
9
9
  body: JSON.stringify([event]),
10
10
  headers,
@@ -15,16 +15,30 @@ async function callEventApi({ event, config, environment, }) {
15
15
  ...data,
16
16
  });
17
17
  }
18
- return data;
18
+ if (!data) {
19
+ return {
20
+ valid: false,
21
+ errors: [{ type: "", message: "disabled", path: "" }],
22
+ };
23
+ }
24
+ const { valid, errors } = data[0];
25
+ return { valid, errors: errors ?? [] };
19
26
  }
20
27
 
21
28
  async function emit(params) {
22
- await callEventApi(params);
29
+ const { listenerManager, event, config } = params;
30
+ const isEnabled = config.mode !== "disabled";
31
+ isEnabled && listenerManager.call(event);
32
+ return config.mode === "validate" ? validate$1(params) : emitEvent(params);
33
+ }
34
+ async function emitEvent({ event, config, environment, }) {
35
+ const { url, token } = config;
36
+ return environment.send(url, token, JSON.stringify([event]));
23
37
  }
24
38
 
25
39
  var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
26
40
 
27
- function validate$1(uuid) {
41
+ function validate(uuid) {
28
42
  return typeof uuid === 'string' && REGEX.test(uuid);
29
43
  }
30
44
 
@@ -34,7 +48,7 @@ function createClientIdManager(environment) {
34
48
  getClientId: () => {
35
49
  const storage = environment.storage;
36
50
  const existingClientId = storage.getItem(key);
37
- const clientId = existingClientId && validate$1(existingClientId)
51
+ const clientId = existingClientId && validate(existingClientId)
38
52
  ? existingClientId
39
53
  : environment.generateUUID();
40
54
  storage.setItem(key, clientId);
@@ -108,6 +122,15 @@ function buildBrowserEnvironment() {
108
122
  return {
109
123
  runtime: "browser",
110
124
  fetch: (url, init) => fetchAPI(url, init),
125
+ send: async (url, token, body) => {
126
+ const response = navigator.sendBeacon(`${url}?access_token=${token}`, new Blob([body], {
127
+ type: "application/json",
128
+ }));
129
+ if (!response) {
130
+ throw new Error(`Failed to send the event(s) because the payload size exceeded the maximum allowed size (32 KB). Please contact support if the problem persists.`);
131
+ }
132
+ return null;
133
+ },
111
134
  getReferrerUrl: () => getReferrerUrl(),
112
135
  getUrl: () => window.location.href,
113
136
  getUserAgent: () => navigator.userAgent,
@@ -134,6 +157,18 @@ function buildNodeEnvironment() {
134
157
  return {
135
158
  runtime: "node",
136
159
  fetch: (url, init) => fetchAPI(url, init),
160
+ send: async (url, token, body) => {
161
+ const headers = {
162
+ "Content-Type": "application/json",
163
+ Authorization: `Bearer ${token}`,
164
+ };
165
+ fetchAPI(url, {
166
+ method: "POST",
167
+ body,
168
+ headers,
169
+ });
170
+ return null;
171
+ },
137
172
  getReferrerUrl: () => null,
138
173
  getUrl: () => null,
139
174
  getUserAgent: () => null,
@@ -154,7 +189,7 @@ function isBrowser() {
154
189
  }
155
190
  }
156
191
 
157
- const version = "0.6.0" ;
192
+ const version = "0.6.2" ;
158
193
 
159
194
  function getEventConfig(config) {
160
195
  const { trackingId } = config;
@@ -259,22 +294,11 @@ function createConfigManager(initialConfig) {
259
294
  };
260
295
  }
261
296
 
262
- async function validate(params) {
263
- const data = await callEventApi(params);
264
- if (!data) {
265
- return {
266
- valid: false,
267
- errors: [{ type: "", message: "disabled", path: "" }],
268
- };
269
- }
270
- const { valid, errors } = data[0];
271
- return { valid, errors: errors ?? [] };
272
- }
273
-
274
297
  function buildNullEnvironment() {
275
298
  return {
276
299
  runtime: "null",
277
300
  fetch: () => Promise.resolve(new Response(JSON.stringify(""))),
301
+ send: async () => null,
278
302
  getReferrerUrl: () => null,
279
303
  getUrl: () => null,
280
304
  getUserAgent: () => null,
@@ -285,27 +309,26 @@ function buildNullEnvironment() {
285
309
 
286
310
  function createRelay(initialConfig) {
287
311
  const configManager = createConfigManager(initialConfig);
312
+ const listenerManager = createListenerManager();
288
313
  const getEnvironment = () => configManager.get().mode == "disabled"
289
314
  ? buildNullEnvironment()
290
315
  : currentEnvironment();
291
316
  const clientIdManager = createClientIdManager(getEnvironment());
292
- const { add, call, remove } = createListenerManager();
293
317
  return {
294
318
  emit: (type, payload) => {
295
- const event = createRelayEvent(type, payload, configManager.get(), getEnvironment(), clientIdManager);
296
- call(event);
297
- const params = {
298
- config: configManager.get(),
299
- environment: getEnvironment(),
319
+ const config = configManager.get();
320
+ const environment = getEnvironment();
321
+ const event = createRelayEvent(type, payload, config, environment, clientIdManager);
322
+ return emit({
323
+ config,
324
+ environment,
300
325
  event,
301
- };
302
- return configManager.get().mode === "validate"
303
- ? validate(params)
304
- : emit(params);
326
+ listenerManager,
327
+ });
305
328
  },
306
329
  getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
307
- on: (type, callback) => add({ type, callback }),
308
- off: (type, callback) => remove(type, callback),
330
+ on: (type, callback) => listenerManager.add({ type, callback }),
331
+ off: (type, callback) => listenerManager.remove(type, callback),
309
332
  updateConfig: (config) => configManager.update(config),
310
333
  version,
311
334
  clearStorage: () => {
package/lib/relay.mjs CHANGED
@@ -1,10 +1,10 @@
1
- async function callEventApi({ event, config, environment, }) {
1
+ async function validate$1({ config, environment, event, }) {
2
2
  const { url, token } = config;
3
3
  const headers = {
4
4
  "Content-Type": "application/json",
5
5
  Authorization: `Bearer ${token}`,
6
6
  };
7
- const response = await environment.fetch(`${url}${config.mode == "validate" ? "/validate" : ""}`, {
7
+ const response = await environment.fetch(`${url}/validate`, {
8
8
  method: "POST",
9
9
  body: JSON.stringify([event]),
10
10
  headers,
@@ -15,16 +15,30 @@ async function callEventApi({ event, config, environment, }) {
15
15
  ...data,
16
16
  });
17
17
  }
18
- return data;
18
+ if (!data) {
19
+ return {
20
+ valid: false,
21
+ errors: [{ type: "", message: "disabled", path: "" }],
22
+ };
23
+ }
24
+ const { valid, errors } = data[0];
25
+ return { valid, errors: errors ?? [] };
19
26
  }
20
27
 
21
28
  async function emit(params) {
22
- await callEventApi(params);
29
+ const { listenerManager, event, config } = params;
30
+ const isEnabled = config.mode !== "disabled";
31
+ isEnabled && listenerManager.call(event);
32
+ return config.mode === "validate" ? validate$1(params) : emitEvent(params);
33
+ }
34
+ async function emitEvent({ event, config, environment, }) {
35
+ const { url, token } = config;
36
+ return environment.send(url, token, JSON.stringify([event]));
23
37
  }
24
38
 
25
39
  var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
26
40
 
27
- function validate$1(uuid) {
41
+ function validate(uuid) {
28
42
  return typeof uuid === 'string' && REGEX.test(uuid);
29
43
  }
30
44
 
@@ -34,7 +48,7 @@ function createClientIdManager(environment) {
34
48
  getClientId: () => {
35
49
  const storage = environment.storage;
36
50
  const existingClientId = storage.getItem(key);
37
- const clientId = existingClientId && validate$1(existingClientId)
51
+ const clientId = existingClientId && validate(existingClientId)
38
52
  ? existingClientId
39
53
  : environment.generateUUID();
40
54
  storage.setItem(key, clientId);
@@ -108,6 +122,15 @@ function buildBrowserEnvironment() {
108
122
  return {
109
123
  runtime: "browser",
110
124
  fetch: (url, init) => fetchAPI(url, init),
125
+ send: async (url, token, body) => {
126
+ const response = navigator.sendBeacon(`${url}?access_token=${token}`, new Blob([body], {
127
+ type: "application/json",
128
+ }));
129
+ if (!response) {
130
+ throw new Error(`Failed to send the event(s) because the payload size exceeded the maximum allowed size (32 KB). Please contact support if the problem persists.`);
131
+ }
132
+ return null;
133
+ },
111
134
  getReferrerUrl: () => getReferrerUrl(),
112
135
  getUrl: () => window.location.href,
113
136
  getUserAgent: () => navigator.userAgent,
@@ -134,6 +157,18 @@ function buildNodeEnvironment() {
134
157
  return {
135
158
  runtime: "node",
136
159
  fetch: (url, init) => fetchAPI(url, init),
160
+ send: async (url, token, body) => {
161
+ const headers = {
162
+ "Content-Type": "application/json",
163
+ Authorization: `Bearer ${token}`,
164
+ };
165
+ fetchAPI(url, {
166
+ method: "POST",
167
+ body,
168
+ headers,
169
+ });
170
+ return null;
171
+ },
137
172
  getReferrerUrl: () => null,
138
173
  getUrl: () => null,
139
174
  getUserAgent: () => null,
@@ -154,7 +189,7 @@ function isBrowser() {
154
189
  }
155
190
  }
156
191
 
157
- const version = "0.6.0" ;
192
+ const version = "0.6.2" ;
158
193
 
159
194
  function getEventConfig(config) {
160
195
  const { trackingId } = config;
@@ -259,22 +294,11 @@ function createConfigManager(initialConfig) {
259
294
  };
260
295
  }
261
296
 
262
- async function validate(params) {
263
- const data = await callEventApi(params);
264
- if (!data) {
265
- return {
266
- valid: false,
267
- errors: [{ type: "", message: "disabled", path: "" }],
268
- };
269
- }
270
- const { valid, errors } = data[0];
271
- return { valid, errors: errors ?? [] };
272
- }
273
-
274
297
  function buildNullEnvironment() {
275
298
  return {
276
299
  runtime: "null",
277
300
  fetch: () => Promise.resolve(new Response(JSON.stringify(""))),
301
+ send: async () => null,
278
302
  getReferrerUrl: () => null,
279
303
  getUrl: () => null,
280
304
  getUserAgent: () => null,
@@ -285,27 +309,26 @@ function buildNullEnvironment() {
285
309
 
286
310
  function createRelay(initialConfig) {
287
311
  const configManager = createConfigManager(initialConfig);
312
+ const listenerManager = createListenerManager();
288
313
  const getEnvironment = () => configManager.get().mode == "disabled"
289
314
  ? buildNullEnvironment()
290
315
  : currentEnvironment();
291
316
  const clientIdManager = createClientIdManager(getEnvironment());
292
- const { add, call, remove } = createListenerManager();
293
317
  return {
294
318
  emit: (type, payload) => {
295
- const event = createRelayEvent(type, payload, configManager.get(), getEnvironment(), clientIdManager);
296
- call(event);
297
- const params = {
298
- config: configManager.get(),
299
- environment: getEnvironment(),
319
+ const config = configManager.get();
320
+ const environment = getEnvironment();
321
+ const event = createRelayEvent(type, payload, config, environment, clientIdManager);
322
+ return emit({
323
+ config,
324
+ environment,
300
325
  event,
301
- };
302
- return configManager.get().mode === "validate"
303
- ? validate(params)
304
- : emit(params);
326
+ listenerManager,
327
+ });
305
328
  },
306
329
  getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
307
- on: (type, callback) => add({ type, callback }),
308
- off: (type, callback) => remove(type, callback),
330
+ on: (type, callback) => listenerManager.add({ type, callback }),
331
+ off: (type, callback) => listenerManager.remove(type, callback),
309
332
  updateConfig: (config) => configManager.update(config),
310
333
  version,
311
334
  clearStorage: () => {
@@ -1,3 +1,13 @@
1
- import { EventApiCallParams } from "../event-api-call/event-api-caller";
2
- export declare function emit(params: EventApiCallParams): Promise<void>;
1
+ import { Environment } from "../environment/environment";
2
+ import { ListenerManager } from "../listener/listener";
3
+ import { RelayEvent } from "../event/relay-event";
4
+ import { RelayConfig } from "../relay";
5
+ export interface EmitParams {
6
+ config: RelayConfig;
7
+ environment: Environment;
8
+ event: RelayEvent;
9
+ listenerManager: ListenerManager;
10
+ }
11
+ export declare function emit(params: EmitParams): Promise<Readonly<import("../relay").ValidationResponse> | null>;
12
+ export declare function emitEvent({ event, config, environment, }: EmitParams): Promise<null>;
3
13
  //# sourceMappingURL=emit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EACnB,MAAM,oCAAoC,CAAC;AAE5C,wBAAsB,IAAI,CAAC,MAAM,EAAE,kBAAkB,iBAEpD"}
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,UAAU,mEAM5C;AAED,wBAAsB,SAAS,CAAC,EAC9B,KAAK,EACL,MAAM,EACN,WAAW,GACZ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,uBAAuB,IAAI,WAAW,CAUrD"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,uBAAuB,IAAI,WAAW,CA0BrD"}
@@ -2,6 +2,7 @@ import { Storage } from "./storage";
2
2
  export interface Environment {
3
3
  runtime: "browser" | "node" | "null";
4
4
  fetch: (url: string, init?: RequestInit) => Promise<Response>;
5
+ send: (url: string, token: string, body: string) => Promise<null>;
5
6
  getReferrerUrl: () => string | null;
6
7
  getUrl: () => string | null;
7
8
  getUserAgent: () => string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/environment/environment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9D,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/environment/environment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,wBAAgB,oBAAoB,IAAI,WAAW,CAUlD"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,wBAAgB,oBAAoB,IAAI,WAAW,CAsBlD"}
@@ -1 +1 @@
1
- {"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../../../src/environment/null/null.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,wBAAgB,oBAAoB,IAAI,WAAW,CAUlD"}
1
+ {"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../../../src/environment/null/null.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,wBAAgB,oBAAoB,IAAI,WAAW,CAWlD"}
@@ -4,7 +4,7 @@ interface Listener {
4
4
  type: string;
5
5
  callback: EventCallback;
6
6
  }
7
- interface ListenerManager {
7
+ export interface ListenerManager {
8
8
  add: (listener: Listener) => () => void;
9
9
  call: (event: RelayEvent) => void;
10
10
  remove: (type: string, callback?: EventCallback) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/listener/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA4DvD"}
1
+ {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/listener/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA4DvD"}
@@ -5,7 +5,7 @@ import { ValidationError, ValidationResponse } from "./validate/validate";
5
5
  type RelayPayload = Record<string, unknown>;
6
6
  type Off = () => void;
7
7
  interface Relay {
8
- emit: (type: string, payload: RelayPayload) => Promise<void | ValidationResponse>;
8
+ emit: (type: string, payload: RelayPayload) => Promise<ValidationResponse | null>;
9
9
  getMeta: (type: string) => Meta;
10
10
  on: (type: string, callback: EventCallback) => Off;
11
11
  off: (type: string, callback?: EventCallback) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAEL,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAG7B,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAEtB,UAAU,KAAK;IACb,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,GAAG,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,WAAW,GAAG,KAAK,CA2C7D;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG1E,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAEtB,UAAU,KAAK;IACb,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,GAAG,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,WAAW,GAAG,KAAK,CA2C7D;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1,4 +1,11 @@
1
- import { EventApiCallParams } from "../event-api-call/event-api-caller";
1
+ import { Environment } from "../environment/environment";
2
+ import { RelayEvent } from "../event/relay-event";
3
+ import { RelayConfig } from "../relay";
4
+ export interface ValidateParams {
5
+ config: RelayConfig;
6
+ environment: Environment;
7
+ event: Readonly<RelayEvent>;
8
+ }
2
9
  export interface ValidationError {
3
10
  type: string;
4
11
  message: string;
@@ -8,5 +15,5 @@ export interface ValidationResponse {
8
15
  valid: boolean;
9
16
  errors: ValidationError[];
10
17
  }
11
- export declare function validate(params: EventApiCallParams): Promise<Readonly<ValidationResponse>>;
18
+ export declare function validate({ config, environment, event, }: ValidateParams): Promise<Readonly<ValidationResponse>>;
12
19
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EACnB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAavC"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,wBAAsB,QAAQ,CAAC,EAC7B,MAAM,EACN,WAAW,EACX,KAAK,GACN,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CA8BxD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coveo/relay",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "A library for sending analytics events using Coveo's Event protocol.",
5
5
  "files": [
6
6
  "lib/**/*"
@@ -50,8 +50,8 @@
50
50
  "rollup": "^3.28.0",
51
51
  "ts-jest": "^29.1.1",
52
52
  "typescript": "^5.1.6",
53
- "eslint-config-custom": "0.0.0",
54
- "tsconfig": "0.0.0"
53
+ "tsconfig": "0.0.0",
54
+ "eslint-config-custom": "0.0.0"
55
55
  },
56
56
  "dependencies": {
57
57
  "uuid": "^9.0.1"
@@ -1,10 +0,0 @@
1
- import { Environment } from "../environment/environment";
2
- import { RelayEvent } from "../event/relay-event";
3
- import { RelayConfig } from "../config/config";
4
- export interface EventApiCallParams {
5
- config: RelayConfig;
6
- environment: Environment;
7
- event: Readonly<RelayEvent>;
8
- }
9
- export declare function callEventApi<T>({ event, config, environment, }: EventApiCallParams): Promise<T>;
10
- //# sourceMappingURL=event-api-caller.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-api-caller.d.ts","sourceRoot":"","sources":["../../../src/event-api-call/event-api-caller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;CAC7B;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,EACpC,KAAK,EACL,MAAM,EACN,WAAW,GACZ,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAwBjC"}
@@ -1,10 +0,0 @@
1
- import { Environment } from "../environment/environment";
2
- import { RelayEvent } from "../event/relay-event";
3
- import { RelayConfig } from "../config/config";
4
- export interface EventApiCallParams {
5
- config: RelayConfig;
6
- environment: Environment;
7
- event: Readonly<RelayEvent>;
8
- }
9
- export declare function callEventApi<T>({ event, config, environment, }: EventApiCallParams): Promise<T>;
10
- //# sourceMappingURL=event-api-caller.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-api-caller.d.ts","sourceRoot":"","sources":["../../../src/event-api-call/event-api-caller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;CAC7B;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,EACpC,KAAK,EACL,MAAM,EACN,WAAW,GACZ,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAwBjC"}