@coveo/relay 0.5.0 → 0.6.1
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/lib/cdn/relay.min.js +1 -1
- package/lib/cdn/relay.min.js.map +1 -1
- package/lib/cdn/types/emit/emit.d.ts +11 -2
- package/lib/cdn/types/emit/emit.d.ts.map +1 -1
- package/lib/cdn/types/environment/browser/browser.d.ts.map +1 -1
- package/lib/cdn/types/environment/node/node.d.ts.map +1 -1
- package/lib/cdn/types/listener/listener.d.ts +1 -1
- package/lib/cdn/types/listener/listener.d.ts.map +1 -1
- package/lib/cdn/types/relay.d.ts.map +1 -1
- package/lib/relay.cjs +34 -88
- package/lib/relay.js +34 -94
- package/lib/relay.mjs +34 -88
- package/lib/types/emit/emit.d.ts +11 -2
- package/lib/types/emit/emit.d.ts.map +1 -1
- package/lib/types/environment/browser/browser.d.ts.map +1 -1
- package/lib/types/environment/node/node.d.ts.map +1 -1
- package/lib/types/listener/listener.d.ts +1 -1
- package/lib/types/listener/listener.d.ts.map +1 -1
- package/lib/types/relay.d.ts.map +1 -1
- package/package.json +10 -6
package/lib/cdn/relay.min.js
CHANGED
|
@@ -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}
|
|
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}async function t(t){const{listenerManager:n,event:r,config:o}=t;return"disabled"!==o.mode&&n.call(r),"validate"===o.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??[]}}(t):async function(t){await e(t)}(t)}var n=/^(?:[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 r(e){const t="visitorId";return{getClientId:()=>{const r=e.storage,o=r.getItem(t),c=o&&("string"==typeof(a=o)&&n.test(a))?o:e.generateUUID();var a;return r.setItem(t,c),c},clear:()=>{e.storage.removeItem(t)}}}const o=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 c(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)=>c(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=>o.getItem(e)||localStorage.getItem(e),removeItem(e){o.removeItem(e),localStorage.removeItem(e)},setItem(e,t){localStorage.setItem(e,t),o.setItem(e,t,31556952e3)}}}}function i(){return{getItem:()=>null,removeItem(){},setItem(){}}}function l(){return function(){try{return"object"==typeof window}catch(e){return!1}}()?a():{runtime:"node",fetch:(e,t)=>c(e,t),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>crypto.randomUUID(),storage:i()}}const s="0.6.1";function u(e,t,n,r){const{getReferrerUrl:o,getUrl:c,getUserAgent:a}=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:a(),referrerUrl:o(),url:c()})}const g="*";function f(){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===g)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 m({url:e,token:t,trackingId:n,...r}){return Object.freeze({url:e,token:t,trackingId:n,...!!r.mode&&{mode:r.mode}})}function d(e){const n=function(e){let t=m(e);return{get:()=>t,update:e=>{t=m({...t,...e})}}}(e),o=f(),c=()=>"disabled"==n.get().mode?{runtime:"null",fetch:()=>Promise.resolve(new Response(JSON.stringify(""))),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>"",storage:i()}:l(),a=r(c());return{emit:(e,r)=>{const i=n.get(),l=c(),s=function(e,t,n,r,o){return{...t,meta:u(e,n,r,o)}}(e,r,i,l,a);return t({config:i,environment:l,event:s,listenerManager:o})},getMeta:e=>u(e,n.get(),c(),a),on:(e,t)=>o.add({type:e,callback:t}),off:(e,t)=>o.remove(e,t),updateConfig:e=>n.update(e),version:s,clearStorage:()=>{a.clear()}}}export{d as createRelay};
|
|
2
2
|
//# sourceMappingURL=relay.min.js.map
|
package/lib/cdn/relay.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.min.js","sources":["../../src/event-api-call/event-api-caller.ts","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/rng.js","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/regex.js","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/stringify.js","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/native.js","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/v4.js","../../src/client-id/client-id.ts","../../../../node_modules/.pnpm/uuid@9.0.0/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","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\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 './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","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 { v4 as uuidv4 } from \"uuid\";\nimport { 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: () => uuidv4(),\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 { v4 as uuidv4 } from \"uuid\";\nimport { 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: () => uuidv4(),\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","getRandomValues","rnds8","Uint8Array","rng","crypto","bind","REGEX","byteToHex","i","push","toString","slice","native","randomUUID","v4","options","buf","offset","rnds","random","arr","toLowerCase","unsafeStringify","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","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","uuidv4","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","removeMultiple","add","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,2,3,4,5,7]}
|
|
1
|
+
{"version":3,"file":"relay.min.js","sources":["../../src/event-api-call/event-api-caller.ts","../../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 { 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","import { Environment } from \"../environment/environment\";\nimport {\n callEventApi,\n EventApiCallParams,\n} from \"../event-api-call/event-api-caller\";\nimport { RelayEvent } from \"../event/relay-event\";\nimport { ListenerManager } from \"../listener/listener\";\nimport { RelayConfig } from \"../relay\";\nimport { validate } from \"../validate/validate\";\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\nasync function emitEvent(params: EventApiCallParams) {\n await callEventApi(params);\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","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\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<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 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 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","callEventApi","event","config","environment","url","token","headers","Authorization","response","fetch","mode","method","body","JSON","stringify","data","json","ok","Error","emit","params","listenerManager","call","valid","errors","type","message","path","validate","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","getReferrerUrl","referrer","getUrl","href","getUserAgent","navigator","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":[3,5]}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Environment } from "../environment/environment";
|
|
2
|
+
import { RelayEvent } from "../event/relay-event";
|
|
3
|
+
import { ListenerManager } from "../listener/listener";
|
|
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<void | Readonly<import("../relay").ValidationResponse>>;
|
|
3
12
|
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -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,
|
|
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"}
|
|
@@ -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,
|
|
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,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"}
|
package/lib/relay.cjs
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var crypto = require('crypto');
|
|
4
|
-
|
|
5
3
|
async function callEventApi({ event, config, environment, }) {
|
|
6
4
|
const { url, token } = config;
|
|
7
5
|
const headers = {
|
|
@@ -22,80 +20,41 @@ async function callEventApi({ event, config, environment, }) {
|
|
|
22
20
|
return data;
|
|
23
21
|
}
|
|
24
22
|
|
|
25
|
-
async function
|
|
26
|
-
await callEventApi(params);
|
|
23
|
+
async function validate$1(params) {
|
|
24
|
+
const data = await callEventApi(params);
|
|
25
|
+
if (!data) {
|
|
26
|
+
return {
|
|
27
|
+
valid: false,
|
|
28
|
+
errors: [{ type: "", message: "disabled", path: "" }],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const { valid, errors } = data[0];
|
|
32
|
+
return { valid, errors: errors ?? [] };
|
|
27
33
|
}
|
|
28
34
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return rnds8Pool.slice(poolPtr, poolPtr += 16);
|
|
35
|
+
async function emit(params) {
|
|
36
|
+
const { listenerManager, event, config } = params;
|
|
37
|
+
const isEnabled = config.mode !== "disabled";
|
|
38
|
+
isEnabled && listenerManager.call(event);
|
|
39
|
+
return config.mode === "validate" ? validate$1(params) : emitEvent(params);
|
|
40
|
+
}
|
|
41
|
+
async function emitEvent(params) {
|
|
42
|
+
await callEventApi(params);
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
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;
|
|
42
46
|
|
|
43
|
-
function validate
|
|
47
|
+
function validate(uuid) {
|
|
44
48
|
return typeof uuid === 'string' && REGEX.test(uuid);
|
|
45
49
|
}
|
|
46
50
|
|
|
47
|
-
/**
|
|
48
|
-
* Convert array of 16 byte values to UUID string format of the form:
|
|
49
|
-
* XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
|
|
50
|
-
*/
|
|
51
|
-
|
|
52
|
-
const byteToHex = [];
|
|
53
|
-
|
|
54
|
-
for (let i = 0; i < 256; ++i) {
|
|
55
|
-
byteToHex.push((i + 0x100).toString(16).slice(1));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function unsafeStringify(arr, offset = 0) {
|
|
59
|
-
// Note: Be careful editing this code! It's been tuned for performance
|
|
60
|
-
// and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
|
|
61
|
-
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
var native = {
|
|
65
|
-
randomUUID: crypto.randomUUID
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
function v4(options, buf, offset) {
|
|
69
|
-
if (native.randomUUID && !buf && !options) {
|
|
70
|
-
return native.randomUUID();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
options = options || {};
|
|
74
|
-
const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
|
|
75
|
-
|
|
76
|
-
rnds[6] = rnds[6] & 0x0f | 0x40;
|
|
77
|
-
rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
|
|
78
|
-
|
|
79
|
-
if (buf) {
|
|
80
|
-
offset = offset || 0;
|
|
81
|
-
|
|
82
|
-
for (let i = 0; i < 16; ++i) {
|
|
83
|
-
buf[offset + i] = rnds[i];
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return buf;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return unsafeStringify(rnds);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
51
|
function createClientIdManager(environment) {
|
|
93
52
|
const key = "visitorId";
|
|
94
53
|
return {
|
|
95
54
|
getClientId: () => {
|
|
96
55
|
const storage = environment.storage;
|
|
97
56
|
const existingClientId = storage.getItem(key);
|
|
98
|
-
const clientId = existingClientId && validate
|
|
57
|
+
const clientId = existingClientId && validate(existingClientId)
|
|
99
58
|
? existingClientId
|
|
100
59
|
: environment.generateUUID();
|
|
101
60
|
storage.setItem(key, clientId);
|
|
@@ -172,7 +131,7 @@ function buildBrowserEnvironment() {
|
|
|
172
131
|
getReferrerUrl: () => getReferrerUrl(),
|
|
173
132
|
getUrl: () => window.location.href,
|
|
174
133
|
getUserAgent: () => navigator.userAgent,
|
|
175
|
-
generateUUID: () =>
|
|
134
|
+
generateUUID: () => crypto.randomUUID(),
|
|
176
135
|
storage: createBrowserStorage(),
|
|
177
136
|
};
|
|
178
137
|
}
|
|
@@ -198,7 +157,7 @@ function buildNodeEnvironment() {
|
|
|
198
157
|
getReferrerUrl: () => null,
|
|
199
158
|
getUrl: () => null,
|
|
200
159
|
getUserAgent: () => null,
|
|
201
|
-
generateUUID: () =>
|
|
160
|
+
generateUUID: () => crypto.randomUUID(),
|
|
202
161
|
storage: createNullStorage(),
|
|
203
162
|
};
|
|
204
163
|
}
|
|
@@ -215,7 +174,7 @@ function isBrowser() {
|
|
|
215
174
|
}
|
|
216
175
|
}
|
|
217
176
|
|
|
218
|
-
const version = "0.
|
|
177
|
+
const version = "0.6.1" ;
|
|
219
178
|
|
|
220
179
|
function getEventConfig(config) {
|
|
221
180
|
const { trackingId } = config;
|
|
@@ -320,18 +279,6 @@ function createConfigManager(initialConfig) {
|
|
|
320
279
|
};
|
|
321
280
|
}
|
|
322
281
|
|
|
323
|
-
async function validate(params) {
|
|
324
|
-
const data = await callEventApi(params);
|
|
325
|
-
if (!data) {
|
|
326
|
-
return {
|
|
327
|
-
valid: false,
|
|
328
|
-
errors: [{ type: "", message: "disabled", path: "" }],
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
const { valid, errors } = data[0];
|
|
332
|
-
return { valid, errors: errors ?? [] };
|
|
333
|
-
}
|
|
334
|
-
|
|
335
282
|
function buildNullEnvironment() {
|
|
336
283
|
return {
|
|
337
284
|
runtime: "null",
|
|
@@ -346,27 +293,26 @@ function buildNullEnvironment() {
|
|
|
346
293
|
|
|
347
294
|
function createRelay(initialConfig) {
|
|
348
295
|
const configManager = createConfigManager(initialConfig);
|
|
296
|
+
const listenerManager = createListenerManager();
|
|
349
297
|
const getEnvironment = () => configManager.get().mode == "disabled"
|
|
350
298
|
? buildNullEnvironment()
|
|
351
299
|
: currentEnvironment();
|
|
352
300
|
const clientIdManager = createClientIdManager(getEnvironment());
|
|
353
|
-
const { add, call, remove } = createListenerManager();
|
|
354
301
|
return {
|
|
355
302
|
emit: (type, payload) => {
|
|
356
|
-
const
|
|
357
|
-
|
|
358
|
-
const
|
|
359
|
-
|
|
360
|
-
|
|
303
|
+
const config = configManager.get();
|
|
304
|
+
const environment = getEnvironment();
|
|
305
|
+
const event = createRelayEvent(type, payload, config, environment, clientIdManager);
|
|
306
|
+
return emit({
|
|
307
|
+
config,
|
|
308
|
+
environment,
|
|
361
309
|
event,
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
? validate(params)
|
|
365
|
-
: emit(params);
|
|
310
|
+
listenerManager,
|
|
311
|
+
});
|
|
366
312
|
},
|
|
367
313
|
getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
|
|
368
|
-
on: (type, callback) => add({ type, callback }),
|
|
369
|
-
off: (type, callback) => remove(type, callback),
|
|
314
|
+
on: (type, callback) => listenerManager.add({ type, callback }),
|
|
315
|
+
off: (type, callback) => listenerManager.remove(type, callback),
|
|
370
316
|
updateConfig: (config) => configManager.update(config),
|
|
371
317
|
version,
|
|
372
318
|
clearStorage: () => {
|
package/lib/relay.js
CHANGED
|
@@ -18,79 +18,32 @@ async function callEventApi({ event, config, environment, }) {
|
|
|
18
18
|
return data;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
async function
|
|
22
|
-
await callEventApi(params);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
let getRandomValues;
|
|
29
|
-
const rnds8 = new Uint8Array(16);
|
|
30
|
-
function rng() {
|
|
31
|
-
// lazy load so that environments that need to polyfill have a chance to do so
|
|
32
|
-
if (!getRandomValues) {
|
|
33
|
-
// getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
|
|
34
|
-
getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
|
|
35
|
-
|
|
36
|
-
if (!getRandomValues) {
|
|
37
|
-
throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
|
|
21
|
+
async function validate$1(params) {
|
|
22
|
+
const data = await callEventApi(params);
|
|
23
|
+
if (!data) {
|
|
24
|
+
return {
|
|
25
|
+
valid: false,
|
|
26
|
+
errors: [{ type: "", message: "disabled", path: "" }],
|
|
27
|
+
};
|
|
38
28
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return getRandomValues(rnds8);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
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;
|
|
45
|
-
|
|
46
|
-
function validate$1(uuid) {
|
|
47
|
-
return typeof uuid === 'string' && REGEX.test(uuid);
|
|
29
|
+
const { valid, errors } = data[0];
|
|
30
|
+
return { valid, errors: errors ?? [] };
|
|
48
31
|
}
|
|
49
32
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const byteToHex = [];
|
|
56
|
-
|
|
57
|
-
for (let i = 0; i < 256; ++i) {
|
|
58
|
-
byteToHex.push((i + 0x100).toString(16).slice(1));
|
|
33
|
+
async function emit(params) {
|
|
34
|
+
const { listenerManager, event, config } = params;
|
|
35
|
+
const isEnabled = config.mode !== "disabled";
|
|
36
|
+
isEnabled && listenerManager.call(event);
|
|
37
|
+
return config.mode === "validate" ? validate$1(params) : emitEvent(params);
|
|
59
38
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
// Note: Be careful editing this code! It's been tuned for performance
|
|
63
|
-
// and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
|
|
64
|
-
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
|
39
|
+
async function emitEvent(params) {
|
|
40
|
+
await callEventApi(params);
|
|
65
41
|
}
|
|
66
42
|
|
|
67
|
-
|
|
68
|
-
var native = {
|
|
69
|
-
randomUUID
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
function v4(options, buf, offset) {
|
|
73
|
-
if (native.randomUUID && !buf && !options) {
|
|
74
|
-
return native.randomUUID();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
options = options || {};
|
|
78
|
-
const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
|
|
79
|
-
|
|
80
|
-
rnds[6] = rnds[6] & 0x0f | 0x40;
|
|
81
|
-
rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
|
|
82
|
-
|
|
83
|
-
if (buf) {
|
|
84
|
-
offset = offset || 0;
|
|
85
|
-
|
|
86
|
-
for (let i = 0; i < 16; ++i) {
|
|
87
|
-
buf[offset + i] = rnds[i];
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return buf;
|
|
91
|
-
}
|
|
43
|
+
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;
|
|
92
44
|
|
|
93
|
-
|
|
45
|
+
function validate(uuid) {
|
|
46
|
+
return typeof uuid === 'string' && REGEX.test(uuid);
|
|
94
47
|
}
|
|
95
48
|
|
|
96
49
|
function createClientIdManager(environment) {
|
|
@@ -99,7 +52,7 @@ function createClientIdManager(environment) {
|
|
|
99
52
|
getClientId: () => {
|
|
100
53
|
const storage = environment.storage;
|
|
101
54
|
const existingClientId = storage.getItem(key);
|
|
102
|
-
const clientId = existingClientId && validate
|
|
55
|
+
const clientId = existingClientId && validate(existingClientId)
|
|
103
56
|
? existingClientId
|
|
104
57
|
: environment.generateUUID();
|
|
105
58
|
storage.setItem(key, clientId);
|
|
@@ -176,7 +129,7 @@ function buildBrowserEnvironment() {
|
|
|
176
129
|
getReferrerUrl: () => getReferrerUrl(),
|
|
177
130
|
getUrl: () => window.location.href,
|
|
178
131
|
getUserAgent: () => navigator.userAgent,
|
|
179
|
-
generateUUID: () =>
|
|
132
|
+
generateUUID: () => crypto.randomUUID(),
|
|
180
133
|
storage: createBrowserStorage(),
|
|
181
134
|
};
|
|
182
135
|
}
|
|
@@ -202,7 +155,7 @@ function buildNodeEnvironment() {
|
|
|
202
155
|
getReferrerUrl: () => null,
|
|
203
156
|
getUrl: () => null,
|
|
204
157
|
getUserAgent: () => null,
|
|
205
|
-
generateUUID: () =>
|
|
158
|
+
generateUUID: () => crypto.randomUUID(),
|
|
206
159
|
storage: createNullStorage(),
|
|
207
160
|
};
|
|
208
161
|
}
|
|
@@ -219,7 +172,7 @@ function isBrowser() {
|
|
|
219
172
|
}
|
|
220
173
|
}
|
|
221
174
|
|
|
222
|
-
const version = "0.
|
|
175
|
+
const version = "0.6.1" ;
|
|
223
176
|
|
|
224
177
|
function getEventConfig(config) {
|
|
225
178
|
const { trackingId } = config;
|
|
@@ -324,18 +277,6 @@ function createConfigManager(initialConfig) {
|
|
|
324
277
|
};
|
|
325
278
|
}
|
|
326
279
|
|
|
327
|
-
async function validate(params) {
|
|
328
|
-
const data = await callEventApi(params);
|
|
329
|
-
if (!data) {
|
|
330
|
-
return {
|
|
331
|
-
valid: false,
|
|
332
|
-
errors: [{ type: "", message: "disabled", path: "" }],
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
const { valid, errors } = data[0];
|
|
336
|
-
return { valid, errors: errors ?? [] };
|
|
337
|
-
}
|
|
338
|
-
|
|
339
280
|
function buildNullEnvironment() {
|
|
340
281
|
return {
|
|
341
282
|
runtime: "null",
|
|
@@ -350,27 +291,26 @@ function buildNullEnvironment() {
|
|
|
350
291
|
|
|
351
292
|
function createRelay(initialConfig) {
|
|
352
293
|
const configManager = createConfigManager(initialConfig);
|
|
294
|
+
const listenerManager = createListenerManager();
|
|
353
295
|
const getEnvironment = () => configManager.get().mode == "disabled"
|
|
354
296
|
? buildNullEnvironment()
|
|
355
297
|
: currentEnvironment();
|
|
356
298
|
const clientIdManager = createClientIdManager(getEnvironment());
|
|
357
|
-
const { add, call, remove } = createListenerManager();
|
|
358
299
|
return {
|
|
359
300
|
emit: (type, payload) => {
|
|
360
|
-
const
|
|
361
|
-
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
301
|
+
const config = configManager.get();
|
|
302
|
+
const environment = getEnvironment();
|
|
303
|
+
const event = createRelayEvent(type, payload, config, environment, clientIdManager);
|
|
304
|
+
return emit({
|
|
305
|
+
config,
|
|
306
|
+
environment,
|
|
365
307
|
event,
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
? validate(params)
|
|
369
|
-
: emit(params);
|
|
308
|
+
listenerManager,
|
|
309
|
+
});
|
|
370
310
|
},
|
|
371
311
|
getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
|
|
372
|
-
on: (type, callback) => add({ type, callback }),
|
|
373
|
-
off: (type, callback) => remove(type, callback),
|
|
312
|
+
on: (type, callback) => listenerManager.add({ type, callback }),
|
|
313
|
+
off: (type, callback) => listenerManager.remove(type, callback),
|
|
374
314
|
updateConfig: (config) => configManager.update(config),
|
|
375
315
|
version,
|
|
376
316
|
clearStorage: () => {
|
package/lib/relay.mjs
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import crypto from 'crypto';
|
|
2
|
-
|
|
3
1
|
async function callEventApi({ event, config, environment, }) {
|
|
4
2
|
const { url, token } = config;
|
|
5
3
|
const headers = {
|
|
@@ -20,80 +18,41 @@ async function callEventApi({ event, config, environment, }) {
|
|
|
20
18
|
return data;
|
|
21
19
|
}
|
|
22
20
|
|
|
23
|
-
async function
|
|
24
|
-
await callEventApi(params);
|
|
21
|
+
async function validate$1(params) {
|
|
22
|
+
const data = await callEventApi(params);
|
|
23
|
+
if (!data) {
|
|
24
|
+
return {
|
|
25
|
+
valid: false,
|
|
26
|
+
errors: [{ type: "", message: "disabled", path: "" }],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const { valid, errors } = data[0];
|
|
30
|
+
return { valid, errors: errors ?? [] };
|
|
25
31
|
}
|
|
26
32
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return rnds8Pool.slice(poolPtr, poolPtr += 16);
|
|
33
|
+
async function emit(params) {
|
|
34
|
+
const { listenerManager, event, config } = params;
|
|
35
|
+
const isEnabled = config.mode !== "disabled";
|
|
36
|
+
isEnabled && listenerManager.call(event);
|
|
37
|
+
return config.mode === "validate" ? validate$1(params) : emitEvent(params);
|
|
38
|
+
}
|
|
39
|
+
async function emitEvent(params) {
|
|
40
|
+
await callEventApi(params);
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
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;
|
|
40
44
|
|
|
41
|
-
function validate
|
|
45
|
+
function validate(uuid) {
|
|
42
46
|
return typeof uuid === 'string' && REGEX.test(uuid);
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
/**
|
|
46
|
-
* Convert array of 16 byte values to UUID string format of the form:
|
|
47
|
-
* XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
|
|
48
|
-
*/
|
|
49
|
-
|
|
50
|
-
const byteToHex = [];
|
|
51
|
-
|
|
52
|
-
for (let i = 0; i < 256; ++i) {
|
|
53
|
-
byteToHex.push((i + 0x100).toString(16).slice(1));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function unsafeStringify(arr, offset = 0) {
|
|
57
|
-
// Note: Be careful editing this code! It's been tuned for performance
|
|
58
|
-
// and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
|
|
59
|
-
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
var native = {
|
|
63
|
-
randomUUID: crypto.randomUUID
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
function v4(options, buf, offset) {
|
|
67
|
-
if (native.randomUUID && !buf && !options) {
|
|
68
|
-
return native.randomUUID();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
options = options || {};
|
|
72
|
-
const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
|
|
73
|
-
|
|
74
|
-
rnds[6] = rnds[6] & 0x0f | 0x40;
|
|
75
|
-
rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
|
|
76
|
-
|
|
77
|
-
if (buf) {
|
|
78
|
-
offset = offset || 0;
|
|
79
|
-
|
|
80
|
-
for (let i = 0; i < 16; ++i) {
|
|
81
|
-
buf[offset + i] = rnds[i];
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return buf;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return unsafeStringify(rnds);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
49
|
function createClientIdManager(environment) {
|
|
91
50
|
const key = "visitorId";
|
|
92
51
|
return {
|
|
93
52
|
getClientId: () => {
|
|
94
53
|
const storage = environment.storage;
|
|
95
54
|
const existingClientId = storage.getItem(key);
|
|
96
|
-
const clientId = existingClientId && validate
|
|
55
|
+
const clientId = existingClientId && validate(existingClientId)
|
|
97
56
|
? existingClientId
|
|
98
57
|
: environment.generateUUID();
|
|
99
58
|
storage.setItem(key, clientId);
|
|
@@ -170,7 +129,7 @@ function buildBrowserEnvironment() {
|
|
|
170
129
|
getReferrerUrl: () => getReferrerUrl(),
|
|
171
130
|
getUrl: () => window.location.href,
|
|
172
131
|
getUserAgent: () => navigator.userAgent,
|
|
173
|
-
generateUUID: () =>
|
|
132
|
+
generateUUID: () => crypto.randomUUID(),
|
|
174
133
|
storage: createBrowserStorage(),
|
|
175
134
|
};
|
|
176
135
|
}
|
|
@@ -196,7 +155,7 @@ function buildNodeEnvironment() {
|
|
|
196
155
|
getReferrerUrl: () => null,
|
|
197
156
|
getUrl: () => null,
|
|
198
157
|
getUserAgent: () => null,
|
|
199
|
-
generateUUID: () =>
|
|
158
|
+
generateUUID: () => crypto.randomUUID(),
|
|
200
159
|
storage: createNullStorage(),
|
|
201
160
|
};
|
|
202
161
|
}
|
|
@@ -213,7 +172,7 @@ function isBrowser() {
|
|
|
213
172
|
}
|
|
214
173
|
}
|
|
215
174
|
|
|
216
|
-
const version = "0.
|
|
175
|
+
const version = "0.6.1" ;
|
|
217
176
|
|
|
218
177
|
function getEventConfig(config) {
|
|
219
178
|
const { trackingId } = config;
|
|
@@ -318,18 +277,6 @@ function createConfigManager(initialConfig) {
|
|
|
318
277
|
};
|
|
319
278
|
}
|
|
320
279
|
|
|
321
|
-
async function validate(params) {
|
|
322
|
-
const data = await callEventApi(params);
|
|
323
|
-
if (!data) {
|
|
324
|
-
return {
|
|
325
|
-
valid: false,
|
|
326
|
-
errors: [{ type: "", message: "disabled", path: "" }],
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
const { valid, errors } = data[0];
|
|
330
|
-
return { valid, errors: errors ?? [] };
|
|
331
|
-
}
|
|
332
|
-
|
|
333
280
|
function buildNullEnvironment() {
|
|
334
281
|
return {
|
|
335
282
|
runtime: "null",
|
|
@@ -344,27 +291,26 @@ function buildNullEnvironment() {
|
|
|
344
291
|
|
|
345
292
|
function createRelay(initialConfig) {
|
|
346
293
|
const configManager = createConfigManager(initialConfig);
|
|
294
|
+
const listenerManager = createListenerManager();
|
|
347
295
|
const getEnvironment = () => configManager.get().mode == "disabled"
|
|
348
296
|
? buildNullEnvironment()
|
|
349
297
|
: currentEnvironment();
|
|
350
298
|
const clientIdManager = createClientIdManager(getEnvironment());
|
|
351
|
-
const { add, call, remove } = createListenerManager();
|
|
352
299
|
return {
|
|
353
300
|
emit: (type, payload) => {
|
|
354
|
-
const
|
|
355
|
-
|
|
356
|
-
const
|
|
357
|
-
|
|
358
|
-
|
|
301
|
+
const config = configManager.get();
|
|
302
|
+
const environment = getEnvironment();
|
|
303
|
+
const event = createRelayEvent(type, payload, config, environment, clientIdManager);
|
|
304
|
+
return emit({
|
|
305
|
+
config,
|
|
306
|
+
environment,
|
|
359
307
|
event,
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
? validate(params)
|
|
363
|
-
: emit(params);
|
|
308
|
+
listenerManager,
|
|
309
|
+
});
|
|
364
310
|
},
|
|
365
311
|
getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
|
|
366
|
-
on: (type, callback) => add({ type, callback }),
|
|
367
|
-
off: (type, callback) => remove(type, callback),
|
|
312
|
+
on: (type, callback) => listenerManager.add({ type, callback }),
|
|
313
|
+
off: (type, callback) => listenerManager.remove(type, callback),
|
|
368
314
|
updateConfig: (config) => configManager.update(config),
|
|
369
315
|
version,
|
|
370
316
|
clearStorage: () => {
|
package/lib/types/emit/emit.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Environment } from "../environment/environment";
|
|
2
|
+
import { RelayEvent } from "../event/relay-event";
|
|
3
|
+
import { ListenerManager } from "../listener/listener";
|
|
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<void | Readonly<import("../relay").ValidationResponse>>;
|
|
3
12
|
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -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,
|
|
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"}
|
package/lib/types/relay.d.ts.map
CHANGED
|
@@ -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,
|
|
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,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coveo/relay",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "A library for sending analytics events using Coveo's Event protocol.",
|
|
5
5
|
"files": [
|
|
6
6
|
"lib/**/*"
|
|
@@ -43,9 +43,10 @@
|
|
|
43
43
|
"@rollup/plugin-terser": "^0.4.3",
|
|
44
44
|
"@rollup/plugin-typescript": "^11.1.2",
|
|
45
45
|
"@types/jest": "^29.5.3",
|
|
46
|
-
"@types/uuid": "^9.0.
|
|
47
|
-
"jest": "^29.
|
|
48
|
-
"jest-environment-jsdom": "^29.
|
|
46
|
+
"@types/uuid": "^9.0.4",
|
|
47
|
+
"jest": "^29.7.0",
|
|
48
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
49
|
+
"rimraf": "5.0.5",
|
|
49
50
|
"rollup": "^3.28.0",
|
|
50
51
|
"ts-jest": "^29.1.1",
|
|
51
52
|
"typescript": "^5.1.6",
|
|
@@ -53,11 +54,14 @@
|
|
|
53
54
|
"tsconfig": "0.0.0"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
56
|
-
"uuid": "^9.0.
|
|
57
|
+
"uuid": "^9.0.1"
|
|
58
|
+
},
|
|
59
|
+
"engines": {
|
|
60
|
+
"node": "^18.12.0 || ^20.0.0"
|
|
57
61
|
},
|
|
58
62
|
"scripts": {
|
|
59
63
|
"build": "npm run clean && rollup --config ./config/rollup.config.mjs",
|
|
60
|
-
"clean": "
|
|
64
|
+
"clean": "rimraf -rf ./lib",
|
|
61
65
|
"test": "jest",
|
|
62
66
|
"test:watch": "jest --watch",
|
|
63
67
|
"npm:tag": "node ./scripts/update-npm-tag.mjs"
|