@coveo/relay 0.6.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/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 +32 -27
- package/lib/relay.js +32 -27
- package/lib/relay.mjs +32 -27
- package/lib/types/emit/emit.d.ts +11 -2
- package/lib/types/emit/emit.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 +1 -1
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}var
|
|
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.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/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"}
|
|
@@ -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
|
@@ -20,13 +20,31 @@ async function callEventApi({ event, config, environment, }) {
|
|
|
20
20
|
return data;
|
|
21
21
|
}
|
|
22
22
|
|
|
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 ?? [] };
|
|
33
|
+
}
|
|
34
|
+
|
|
23
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) {
|
|
24
42
|
await callEventApi(params);
|
|
25
43
|
}
|
|
26
44
|
|
|
27
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;
|
|
28
46
|
|
|
29
|
-
function validate
|
|
47
|
+
function validate(uuid) {
|
|
30
48
|
return typeof uuid === 'string' && REGEX.test(uuid);
|
|
31
49
|
}
|
|
32
50
|
|
|
@@ -36,7 +54,7 @@ function createClientIdManager(environment) {
|
|
|
36
54
|
getClientId: () => {
|
|
37
55
|
const storage = environment.storage;
|
|
38
56
|
const existingClientId = storage.getItem(key);
|
|
39
|
-
const clientId = existingClientId && validate
|
|
57
|
+
const clientId = existingClientId && validate(existingClientId)
|
|
40
58
|
? existingClientId
|
|
41
59
|
: environment.generateUUID();
|
|
42
60
|
storage.setItem(key, clientId);
|
|
@@ -156,7 +174,7 @@ function isBrowser() {
|
|
|
156
174
|
}
|
|
157
175
|
}
|
|
158
176
|
|
|
159
|
-
const version = "0.6.
|
|
177
|
+
const version = "0.6.1" ;
|
|
160
178
|
|
|
161
179
|
function getEventConfig(config) {
|
|
162
180
|
const { trackingId } = config;
|
|
@@ -261,18 +279,6 @@ function createConfigManager(initialConfig) {
|
|
|
261
279
|
};
|
|
262
280
|
}
|
|
263
281
|
|
|
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
282
|
function buildNullEnvironment() {
|
|
277
283
|
return {
|
|
278
284
|
runtime: "null",
|
|
@@ -287,27 +293,26 @@ function buildNullEnvironment() {
|
|
|
287
293
|
|
|
288
294
|
function createRelay(initialConfig) {
|
|
289
295
|
const configManager = createConfigManager(initialConfig);
|
|
296
|
+
const listenerManager = createListenerManager();
|
|
290
297
|
const getEnvironment = () => configManager.get().mode == "disabled"
|
|
291
298
|
? buildNullEnvironment()
|
|
292
299
|
: currentEnvironment();
|
|
293
300
|
const clientIdManager = createClientIdManager(getEnvironment());
|
|
294
|
-
const { add, call, remove } = createListenerManager();
|
|
295
301
|
return {
|
|
296
302
|
emit: (type, payload) => {
|
|
297
|
-
const
|
|
298
|
-
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
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,
|
|
302
309
|
event,
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
? validate(params)
|
|
306
|
-
: emit(params);
|
|
310
|
+
listenerManager,
|
|
311
|
+
});
|
|
307
312
|
},
|
|
308
313
|
getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
|
|
309
|
-
on: (type, callback) => add({ type, callback }),
|
|
310
|
-
off: (type, callback) => remove(type, callback),
|
|
314
|
+
on: (type, callback) => listenerManager.add({ type, callback }),
|
|
315
|
+
off: (type, callback) => listenerManager.remove(type, callback),
|
|
311
316
|
updateConfig: (config) => configManager.update(config),
|
|
312
317
|
version,
|
|
313
318
|
clearStorage: () => {
|
package/lib/relay.js
CHANGED
|
@@ -18,13 +18,31 @@ async function callEventApi({ event, config, environment, }) {
|
|
|
18
18
|
return data;
|
|
19
19
|
}
|
|
20
20
|
|
|
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 ?? [] };
|
|
31
|
+
}
|
|
32
|
+
|
|
21
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) {
|
|
22
40
|
await callEventApi(params);
|
|
23
41
|
}
|
|
24
42
|
|
|
25
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;
|
|
26
44
|
|
|
27
|
-
function validate
|
|
45
|
+
function validate(uuid) {
|
|
28
46
|
return typeof uuid === 'string' && REGEX.test(uuid);
|
|
29
47
|
}
|
|
30
48
|
|
|
@@ -34,7 +52,7 @@ function createClientIdManager(environment) {
|
|
|
34
52
|
getClientId: () => {
|
|
35
53
|
const storage = environment.storage;
|
|
36
54
|
const existingClientId = storage.getItem(key);
|
|
37
|
-
const clientId = existingClientId && validate
|
|
55
|
+
const clientId = existingClientId && validate(existingClientId)
|
|
38
56
|
? existingClientId
|
|
39
57
|
: environment.generateUUID();
|
|
40
58
|
storage.setItem(key, clientId);
|
|
@@ -154,7 +172,7 @@ function isBrowser() {
|
|
|
154
172
|
}
|
|
155
173
|
}
|
|
156
174
|
|
|
157
|
-
const version = "0.6.
|
|
175
|
+
const version = "0.6.1" ;
|
|
158
176
|
|
|
159
177
|
function getEventConfig(config) {
|
|
160
178
|
const { trackingId } = config;
|
|
@@ -259,18 +277,6 @@ function createConfigManager(initialConfig) {
|
|
|
259
277
|
};
|
|
260
278
|
}
|
|
261
279
|
|
|
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
280
|
function buildNullEnvironment() {
|
|
275
281
|
return {
|
|
276
282
|
runtime: "null",
|
|
@@ -285,27 +291,26 @@ function buildNullEnvironment() {
|
|
|
285
291
|
|
|
286
292
|
function createRelay(initialConfig) {
|
|
287
293
|
const configManager = createConfigManager(initialConfig);
|
|
294
|
+
const listenerManager = createListenerManager();
|
|
288
295
|
const getEnvironment = () => configManager.get().mode == "disabled"
|
|
289
296
|
? buildNullEnvironment()
|
|
290
297
|
: currentEnvironment();
|
|
291
298
|
const clientIdManager = createClientIdManager(getEnvironment());
|
|
292
|
-
const { add, call, remove } = createListenerManager();
|
|
293
299
|
return {
|
|
294
300
|
emit: (type, payload) => {
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
const
|
|
298
|
-
|
|
299
|
-
|
|
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,
|
|
300
307
|
event,
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
? validate(params)
|
|
304
|
-
: emit(params);
|
|
308
|
+
listenerManager,
|
|
309
|
+
});
|
|
305
310
|
},
|
|
306
311
|
getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
|
|
307
|
-
on: (type, callback) => add({ type, callback }),
|
|
308
|
-
off: (type, callback) => remove(type, callback),
|
|
312
|
+
on: (type, callback) => listenerManager.add({ type, callback }),
|
|
313
|
+
off: (type, callback) => listenerManager.remove(type, callback),
|
|
309
314
|
updateConfig: (config) => configManager.update(config),
|
|
310
315
|
version,
|
|
311
316
|
clearStorage: () => {
|
package/lib/relay.mjs
CHANGED
|
@@ -18,13 +18,31 @@ async function callEventApi({ event, config, environment, }) {
|
|
|
18
18
|
return data;
|
|
19
19
|
}
|
|
20
20
|
|
|
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 ?? [] };
|
|
31
|
+
}
|
|
32
|
+
|
|
21
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) {
|
|
22
40
|
await callEventApi(params);
|
|
23
41
|
}
|
|
24
42
|
|
|
25
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;
|
|
26
44
|
|
|
27
|
-
function validate
|
|
45
|
+
function validate(uuid) {
|
|
28
46
|
return typeof uuid === 'string' && REGEX.test(uuid);
|
|
29
47
|
}
|
|
30
48
|
|
|
@@ -34,7 +52,7 @@ function createClientIdManager(environment) {
|
|
|
34
52
|
getClientId: () => {
|
|
35
53
|
const storage = environment.storage;
|
|
36
54
|
const existingClientId = storage.getItem(key);
|
|
37
|
-
const clientId = existingClientId && validate
|
|
55
|
+
const clientId = existingClientId && validate(existingClientId)
|
|
38
56
|
? existingClientId
|
|
39
57
|
: environment.generateUUID();
|
|
40
58
|
storage.setItem(key, clientId);
|
|
@@ -154,7 +172,7 @@ function isBrowser() {
|
|
|
154
172
|
}
|
|
155
173
|
}
|
|
156
174
|
|
|
157
|
-
const version = "0.6.
|
|
175
|
+
const version = "0.6.1" ;
|
|
158
176
|
|
|
159
177
|
function getEventConfig(config) {
|
|
160
178
|
const { trackingId } = config;
|
|
@@ -259,18 +277,6 @@ function createConfigManager(initialConfig) {
|
|
|
259
277
|
};
|
|
260
278
|
}
|
|
261
279
|
|
|
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
280
|
function buildNullEnvironment() {
|
|
275
281
|
return {
|
|
276
282
|
runtime: "null",
|
|
@@ -285,27 +291,26 @@ function buildNullEnvironment() {
|
|
|
285
291
|
|
|
286
292
|
function createRelay(initialConfig) {
|
|
287
293
|
const configManager = createConfigManager(initialConfig);
|
|
294
|
+
const listenerManager = createListenerManager();
|
|
288
295
|
const getEnvironment = () => configManager.get().mode == "disabled"
|
|
289
296
|
? buildNullEnvironment()
|
|
290
297
|
: currentEnvironment();
|
|
291
298
|
const clientIdManager = createClientIdManager(getEnvironment());
|
|
292
|
-
const { add, call, remove } = createListenerManager();
|
|
293
299
|
return {
|
|
294
300
|
emit: (type, payload) => {
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
const
|
|
298
|
-
|
|
299
|
-
|
|
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,
|
|
300
307
|
event,
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
? validate(params)
|
|
304
|
-
: emit(params);
|
|
308
|
+
listenerManager,
|
|
309
|
+
});
|
|
305
310
|
},
|
|
306
311
|
getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
|
|
307
|
-
on: (type, callback) => add({ type, callback }),
|
|
308
|
-
off: (type, callback) => remove(type, callback),
|
|
312
|
+
on: (type, callback) => listenerManager.add({ type, callback }),
|
|
313
|
+
off: (type, callback) => listenerManager.remove(type, callback),
|
|
309
314
|
updateConfig: (config) => configManager.update(config),
|
|
310
315
|
version,
|
|
311
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"}
|
|
@@ -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"}
|