@junobuild/analytics 0.0.1 → 0.0.3

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.
@@ -77,6 +77,7 @@ export interface SetTrackEvent {
77
77
  updated_at: [] | [bigint];
78
78
  metadata: [] | [Array<[string, string]>];
79
79
  name: string;
80
+ user_agent: [] | [string];
80
81
  collected_at: bigint;
81
82
  }
82
83
  export interface TrackEvent {
@@ -83,6 +83,7 @@ export const idlFactory = ({IDL}) => {
83
83
  updated_at: IDL.Opt(IDL.Nat64),
84
84
  metadata: IDL.Opt(IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text))),
85
85
  name: IDL.Text,
86
+ user_agent: IDL.Opt(IDL.Text),
86
87
  collected_at: IDL.Nat64
87
88
  });
88
89
  const Result_2 = IDL.Variant({Ok: TrackEvent, Err: IDL.Text});
@@ -1,2 +1,2 @@
1
- var p=e=>e==null,i=e=>!p(e),f=class extends Error{},s=(e,t)=>{if(p(e))throw new f(t)},c=e=>i(e)?[e]:[];var n,u=e=>{let{path:t}=e.worker??{},r=t===void 0?"./workers/analytics.worker.js":t;n=new Worker(r),d(e)},y=()=>{let e=new Proxy(history.pushState,{apply:(t,r,a)=>{t.apply(r,a),o()}});return history.pushState=e,addEventListener("popstate",o,{passive:!0}),{cleanup(){e=null,removeEventListener("popstate",o,!1)}}},l="Analytics worker not initialized. Did you call `initWorker`?",o=()=>{s(n,l);let{title:e,location:{href:t},referrer:r}=document,{innerWidth:a,innerHeight:m}=window,w={title:e,href:t,referrer:c(i(r)&&r!==""?r:void 0),device:{inner_width:a,inner_height:m}};n?.postMessage({msg:"junoTrackPageView",data:w})},k=e=>{s(n,l),n?.postMessage({msg:"junoTrackEvent",data:e})},d=e=>{s(n,l),n?.postMessage({msg:"junoInitEnvironment",data:e})};var P=async e=>{u(e);let{cleanup:t}=y();return o(),()=>{t()}};export{P as initOrbiter,k as trackEvent,o as trackPageView};
1
+ var y=e=>e==null,u=e=>!y(e),A=class extends Error{},a=(e,t)=>{if(y(e))throw new A(t)},g=e=>u(e)?[e]:[];var w=()=>typeof window<"u";function v(e){return new Promise((t,r)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>r(e.error)})}function l(e,t){let r=indexedDB.open(e);r.onupgradeneeded=()=>r.result.createObjectStore(t);let o=v(r);return(i,c)=>o.then(b=>c(b.transaction(t,i).objectStore(t)))}var p;function S(){return p||(p=l("keyval-store","keyval")),p}function d(e,t,r=S()){return r("readwrite",o=>(o.put(t,e),v(o.transaction)))}var m=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,r)=>(r&=63,r<36?t+=r.toString(36):r<62?t+=(r-26).toString(36).toUpperCase():r>62?t+="-":t+="_",t),"");var I=l("juno-views","views"),M=l("juno-events","events"),h=e=>d(m(),e,I);var k=e=>d(m(),e,M);var n,P=e=>{let{path:t}=e.worker??{},r=t===void 0?"./workers/analytics.worker.js":t;n=new Worker(r),j(e)},E=()=>{let e=async()=>await x(),t=new Proxy(history.pushState,{apply:async(r,o,i)=>{r.apply(o,i),await e()}});return history.pushState=t,addEventListener("popstate",e,{passive:!0}),{cleanup(){t=null,removeEventListener("popstate",e,!1)}}},s="Analytics worker not initialized. Did you call `initWorker`?",f=async()=>{let{title:e,location:{href:t},referrer:r}=document,{innerWidth:o,innerHeight:i}=window,c={title:e,href:t,referrer:g(u(r)&&r!==""?r:void 0),device:{inner_width:o,inner_height:i}};await h(c)},x=async()=>{a(n,s),await f(),n?.postMessage({msg:"junoTrackPageView"})},N=async e=>{a(n,s),await k(e),n?.postMessage({msg:"junoTrackEvent"})},j=e=>{a(n,s),n?.postMessage({msg:"junoInitEnvironment",data:e})},T=()=>{a(n,s),n?.postMessage({msg:"junoStartTrackTimer"})},V=()=>{a(n,s),n?.postMessage({msg:"junoStopTrackTimer"})};var z=async e=>{if(!w())return Promise.resolve;await f(),P(e);let{cleanup:t}=E();return T(),()=>{V(),t()}};export{z as initOrbiter,N as trackEvent,x as trackPageView};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../utils/src/utils/null.utils.ts", "../../../utils/src/utils/did.utils.ts", "../../src/services/analytics.services.ts", "../../src/index.ts"],
4
- "sourcesContent": ["/** Is null or undefined */\nexport const isNullish = <T>(argument: T | undefined | null): argument is undefined | null =>\n argument === null || argument === undefined;\n\n/** Not null and not undefined */\nexport const nonNullish = <T>(argument: T | undefined | null): argument is NonNullable<T> =>\n !isNullish(argument);\n\nexport class NullishError extends Error {}\n\nexport const assertNonNullish: <T>(\n value: T,\n message?: string\n) => asserts value is NonNullable<T> = <T>(value: T, message?: string): void => {\n if (isNullish(value)) {\n throw new NullishError(message);\n }\n};\n", "import {nonNullish} from './null.utils';\n\nexport const toNullable = <T>(value?: T): [] | [T] => {\n return nonNullish(value) ? [value] : [];\n};\n\nexport const fromNullable = <T>(value: [] | [T]): T | undefined => {\n return value?.[0];\n};\n\nexport const toArray = async <T>(data: T): Promise<Uint8Array> => {\n const blob: Blob = new Blob([JSON.stringify(data)], {\n type: 'application/json; charset=utf-8'\n });\n return new Uint8Array(await blob.arrayBuffer());\n};\n\nexport const fromArray = async <T>(data: Uint8Array | number[]): Promise<T> => {\n const blob: Blob = new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)], {\n type: 'application/json; charset=utf-8'\n });\n return JSON.parse(await blob.text());\n};\n", "import {assertNonNullish, nonNullish, toNullable} from '@junobuild/utils';\nimport type {Environment, EnvironmentWorker} from '../types/env';\nimport type {PostMessageInitAnalytics, PostMessagePageView} from '../types/post-message';\nimport type {TrackEvent} from '../types/track';\n\nlet worker: Worker | undefined;\n\nexport const initWorker = (env: Environment) => {\n const {path}: EnvironmentWorker = env.worker ?? {};\n const workerUrl = path === undefined ? './workers/analytics.worker.js' : path;\n\n worker = new Worker(workerUrl);\n\n initWorkerEnvironment(env);\n};\n\nexport const initTrackPageViews = (): {cleanup: () => void} => {\n let pushStateProxy: typeof history.pushState | null = new Proxy(history.pushState, {\n apply: (\n target,\n thisArg,\n argArray: [data: unknown, unused: string, url?: string | URL | null | undefined]\n ) => {\n target.apply(thisArg, argArray);\n trackPageView();\n }\n });\n\n history.pushState = pushStateProxy;\n\n addEventListener('popstate', trackPageView, {passive: true});\n\n return {\n cleanup() {\n pushStateProxy = null;\n removeEventListener('popstate', trackPageView, false);\n }\n };\n};\n\nconst WORKER_UNDEFINED_MSG =\n 'Analytics worker not initialized. Did you call `initWorker`?' as const;\n\nexport const trackPageView = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n const {\n title,\n location: {href},\n referrer\n } = document;\n const {innerWidth, innerHeight} = window;\n\n const data: PostMessagePageView = {\n title,\n href,\n referrer: toNullable(nonNullish(referrer) && referrer !== '' ? referrer : undefined),\n device: {\n inner_width: innerWidth,\n inner_height: innerHeight\n }\n };\n\n worker?.postMessage({msg: 'junoTrackPageView', data});\n};\n\nexport const trackEvent = (data: TrackEvent) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoTrackEvent', data});\n};\n\nexport const initWorkerEnvironment = (env: PostMessageInitAnalytics) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoInitEnvironment', data: env});\n};\n", "import {initTrackPageViews, initWorker, trackPageView} from './services/analytics.services';\nimport type {Environment} from './types/env';\n\nexport {trackEvent, trackPageView} from './services/analytics.services';\nexport * from './types/env';\nexport * from './types/proxy';\n\nexport const initOrbiter = async (env: Environment): Promise<() => void> => {\n initWorker(env);\n\n const {cleanup} = initTrackPageViews();\n\n // Tack first page\n trackPageView();\n\n return () => {\n cleanup();\n };\n};\n"],
5
- "mappings": "AACO,IAAMA,EAAgBC,GAC3BA,GAAa,KAGFC,EAAiBD,GAC5B,CAACD,EAAUC,CAAQ,EAERE,EAAN,cAA2B,KAAM,CAAC,EAE5BC,EAG0B,CAAIC,EAAUC,IAA2B,CAC9E,GAAIN,EAAUK,CAAK,EACjB,MAAM,IAAIF,EAAaG,CAAO,CAElC,ECfaC,EAAiBF,GACrBH,EAAWG,CAAK,EAAI,CAACA,CAAK,EAAI,CAAC,ECExC,IAAIG,EAESC,EAAcC,GAAqB,CAC9C,GAAM,CAAC,KAAAC,CAAI,EAAuBD,EAAI,QAAU,CAAC,EAC3CE,EAAYD,IAAS,OAAY,gCAAkCA,EAEzEH,EAAS,IAAI,OAAOI,CAAS,EAE7BC,EAAsBH,CAAG,CAC3B,EAEaI,EAAqB,IAA6B,CAC7D,IAAIC,EAAkD,IAAI,MAAM,QAAQ,UAAW,CACjF,MAAO,CACLC,EACAC,EACAC,IACG,CACHF,EAAO,MAAMC,EAASC,CAAQ,EAC9BC,EAAc,CAChB,CACF,CAAC,EAED,eAAQ,UAAYJ,EAEpB,iBAAiB,WAAYI,EAAe,CAAC,QAAS,EAAI,CAAC,EAEpD,CACL,SAAU,CACRJ,EAAiB,KACjB,oBAAoB,WAAYI,EAAe,EAAK,CACtD,CACF,CACF,EAEMC,EACJ,+DAEWD,EAAgB,IAAM,CACjC,EAAiBX,EAAQY,CAAoB,EAE7C,GAAM,CACJ,MAAAC,EACA,SAAU,CAAC,KAAAC,CAAI,EACf,SAAAC,CACF,EAAI,SACE,CAAC,WAAAC,EAAY,YAAAC,CAAW,EAAI,OAE5BC,EAA4B,CAChC,MAAAL,EACA,KAAAC,EACA,SAAUK,EAAWC,EAAWL,CAAQ,GAAKA,IAAa,GAAKA,EAAW,MAAS,EACnF,OAAQ,CACN,YAAaC,EACb,aAAcC,CAChB,CACF,EAEAjB,GAAQ,YAAY,CAAC,IAAK,oBAAqB,KAAAkB,CAAI,CAAC,CACtD,EAEaG,EAAcH,GAAqB,CAC9C,EAAiBlB,EAAQY,CAAoB,EAE7CZ,GAAQ,YAAY,CAAC,IAAK,iBAAkB,KAAAkB,CAAI,CAAC,CACnD,EAEab,EAAyBH,GAAkC,CACtE,EAAiBF,EAAQY,CAAoB,EAE7CZ,GAAQ,YAAY,CAAC,IAAK,sBAAuB,KAAME,CAAG,CAAC,CAC7D,ECrEO,IAAMoB,EAAc,MAAOC,GAA0C,CAC1EC,EAAWD,CAAG,EAEd,GAAM,CAAC,QAAAE,CAAO,EAAIC,EAAmB,EAGrC,OAAAC,EAAc,EAEP,IAAM,CACXF,EAAQ,CACV,CACF",
6
- "names": ["isNullish", "argument", "nonNullish", "NullishError", "assertNonNullish", "value", "message", "toNullable", "worker", "initWorker", "env", "path", "workerUrl", "initWorkerEnvironment", "initTrackPageViews", "pushStateProxy", "target", "thisArg", "argArray", "trackPageView", "WORKER_UNDEFINED_MSG", "title", "href", "referrer", "innerWidth", "innerHeight", "data", "a", "o", "trackEvent", "initOrbiter", "env", "initWorker", "cleanup", "initTrackPageViews", "trackPageView"]
3
+ "sources": ["../../../utils/src/utils/debounce.utils.ts", "../../../utils/src/utils/null.utils.ts", "../../../utils/src/utils/did.utils.ts", "../../../utils/src/utils/env.utils.ts", "../../../../node_modules/idb-keyval/dist/index.js", "../../../../node_modules/nanoid/index.browser.js", "../../src/services/idb.services.ts", "../../src/services/analytics.services.ts", "../../src/index.ts"],
4
+ "sourcesContent": ["/* eslint-disable-next-line @typescript-eslint/ban-types */\nexport const debounce = (func: Function, timeout?: number) => {\n let timer: NodeJS.Timer | undefined;\n\n return (...args: unknown[]) => {\n const next = () => func(...args);\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(next, timeout !== undefined && timeout > 0 ? timeout : 300);\n };\n};\n", "/** Is null or undefined */\nexport const isNullish = <T>(argument: T | undefined | null): argument is undefined | null =>\n argument === null || argument === undefined;\n\n/** Not null and not undefined */\nexport const nonNullish = <T>(argument: T | undefined | null): argument is NonNullable<T> =>\n !isNullish(argument);\n\nexport class NullishError extends Error {}\n\nexport const assertNonNullish: <T>(\n value: T,\n message?: string\n) => asserts value is NonNullable<T> = <T>(value: T, message?: string): void => {\n if (isNullish(value)) {\n throw new NullishError(message);\n }\n};\n", "import {nonNullish} from './null.utils';\n\nexport const toNullable = <T>(value?: T): [] | [T] => {\n return nonNullish(value) ? [value] : [];\n};\n\nexport const fromNullable = <T>(value: [] | [T]): T | undefined => {\n return value?.[0];\n};\n\nexport const toArray = async <T>(data: T): Promise<Uint8Array> => {\n const blob: Blob = new Blob([JSON.stringify(data)], {\n type: 'application/json; charset=utf-8'\n });\n return new Uint8Array(await blob.arrayBuffer());\n};\n\nexport const fromArray = async <T>(data: Uint8Array | number[]): Promise<T> => {\n const blob: Blob = new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)], {\n type: 'application/json; charset=utf-8'\n });\n return JSON.parse(await blob.text());\n};\n", "export const isBrowser = () => typeof window !== `undefined`;\n", "function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic \u2013 if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n", "export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n", "import {createStore, delMany, entries, set} from 'idb-keyval';\nimport {nanoid} from 'nanoid';\nimport type {IdbPageView, IdbTrackEvent} from '../types/idb';\n\nconst viewsStore = createStore('juno-views', 'views');\nconst eventsStore = createStore('juno-events', 'events');\n\nexport const setPageView = (view: IdbPageView): Promise<void> => set(nanoid(), view, viewsStore);\n\nexport const getPageViews = (): Promise<[IDBValidKey, IdbPageView][]> => entries(viewsStore);\n\nexport const delPageViews = (keys: IDBValidKey[]): Promise<void> => delMany(keys, viewsStore);\n\nexport const setTrackEvent = (track: IdbTrackEvent): Promise<void> =>\n set(nanoid(), track, eventsStore);\n\nexport const getTrackEvents = (): Promise<[IDBValidKey, IdbTrackEvent][]> => entries(eventsStore);\n\nexport const delTrackEvents = (keys: IDBValidKey[]): Promise<void> => delMany(keys, eventsStore);\n", "import {assertNonNullish, nonNullish, toNullable} from '@junobuild/utils';\nimport type {Environment, EnvironmentWorker} from '../types/env';\nimport type {IdbPageView} from '../types/idb';\nimport type {PostMessageInitEnvData} from '../types/post-message';\nimport type {TrackEvent} from '../types/track';\nimport {setPageView as idbSetPageView, setTrackEvent} from './idb.services';\n\nlet worker: Worker | undefined;\n\nexport const initWorker = (env: Environment) => {\n const {path}: EnvironmentWorker = env.worker ?? {};\n const workerUrl = path === undefined ? './workers/analytics.worker.js' : path;\n\n worker = new Worker(workerUrl);\n\n initWorkerEnvironment(env);\n};\n\nexport const initTrackPageViews = (): {cleanup: () => void} => {\n const trackPages = async () => await trackPageView();\n\n let pushStateProxy: typeof history.pushState | null = new Proxy(history.pushState, {\n apply: async (\n target,\n thisArg,\n argArray: [data: unknown, unused: string, url?: string | URL | null | undefined]\n ) => {\n target.apply(thisArg, argArray);\n await trackPages();\n }\n });\n\n history.pushState = pushStateProxy;\n\n addEventListener('popstate', trackPages, {passive: true});\n\n return {\n cleanup() {\n pushStateProxy = null;\n removeEventListener('popstate', trackPages, false);\n }\n };\n};\n\nconst WORKER_UNDEFINED_MSG =\n 'Analytics worker not initialized. Did you call `initWorker`?' as const;\n\nexport const setPageView = async () => {\n const {\n title,\n location: {href},\n referrer\n } = document;\n const {innerWidth, innerHeight} = window;\n\n const data: IdbPageView = {\n title,\n href,\n referrer: toNullable(nonNullish(referrer) && referrer !== '' ? referrer : undefined),\n device: {\n inner_width: innerWidth,\n inner_height: innerHeight\n }\n };\n\n await idbSetPageView(data);\n};\n\nexport const trackPageView = async () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setPageView();\n\n worker?.postMessage({msg: 'junoTrackPageView'});\n};\n\nexport const trackEvent = async (data: TrackEvent) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setTrackEvent(data);\n\n worker?.postMessage({msg: 'junoTrackEvent'});\n};\n\nexport const initWorkerEnvironment = (env: PostMessageInitEnvData) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoInitEnvironment', data: env});\n};\n\nexport const startTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStartTrackTimer'});\n};\n\nexport const stopTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStopTrackTimer'});\n};\n", "import {isBrowser} from '@junobuild/utils';\nimport {\n initTrackPageViews,\n initWorker,\n setPageView,\n startTracking,\n stopTracking\n} from './services/analytics.services';\nimport type {Environment} from './types/env';\n\nexport {trackEvent, trackPageView} from './services/analytics.services';\nexport * from './types/env';\n\nexport const initOrbiter = async (env: Environment): Promise<() => void> => {\n if (!isBrowser()) {\n // Avoid pre-rendering issue when window and indexedDB is not available\n return Promise.resolve;\n }\n\n // Save first page as soon as possible\n await setPageView();\n\n initWorker(env);\n\n const {cleanup} = initTrackPageViews();\n\n // Starting tracking will instantly sync the first page and the data from previous sessions that have not been synced yet\n startTracking();\n\n return () => {\n stopTracking();\n cleanup();\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["isNullish", "argument", "nonNullish", "NullishError", "assertNonNullish", "value", "message", "toNullable", "isBrowser", "promisifyRequest", "request", "resolve", "reject", "createStore", "dbName", "storeName", "dbp", "txMode", "callback", "db", "defaultGetStoreFunc", "defaultGetStore", "set", "key", "value", "customStore", "defaultGetStore", "store", "promisifyRequest", "nanoid", "size", "id", "byte", "viewsStore", "createStore", "eventsStore", "setPageView", "view", "set", "nanoid", "setTrackEvent", "track", "set", "nanoid", "eventsStore", "worker", "initWorker", "env", "path", "workerUrl", "initWorkerEnvironment", "initTrackPageViews", "trackPages", "trackPageView", "pushStateProxy", "target", "thisArg", "argArray", "WORKER_UNDEFINED_MSG", "setPageView", "title", "href", "referrer", "innerWidth", "innerHeight", "data", "T", "s", "f", "trackEvent", "setTrackEvent", "startTracking", "stopTracking", "initOrbiter", "env", "y", "setPageView", "initWorker", "cleanup", "initTrackPageViews", "startTracking", "stopTracking"]
7
7
  }
@@ -77,6 +77,7 @@ export interface SetTrackEvent {
77
77
  updated_at: [] | [bigint];
78
78
  metadata: [] | [Array<[string, string]>];
79
79
  name: string;
80
+ user_agent: [] | [string];
80
81
  collected_at: bigint;
81
82
  }
82
83
  export interface TrackEvent {
@@ -83,6 +83,7 @@ export const idlFactory = ({IDL}) => {
83
83
  updated_at: IDL.Opt(IDL.Nat64),
84
84
  metadata: IDL.Opt(IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text))),
85
85
  name: IDL.Text,
86
+ user_agent: IDL.Opt(IDL.Text),
86
87
  collected_at: IDL.Nat64
87
88
  });
88
89
  const Result_2 = IDL.Variant({Ok: TrackEvent, Err: IDL.Text});
@@ -1,4 +1,4 @@
1
1
  import { createRequire as topLevelCreateRequire } from 'module';
2
2
  const require = topLevelCreateRequire(import.meta.url);
3
- import{createRequire as w}from"module";var h=w(import.meta.url),p=e=>e==null,i=e=>!p(e),k=class extends Error{},s=(e,t)=>{if(p(e))throw new k(t)},c=e=>i(e)?[e]:[];var n,u=e=>{let{path:t}=e.worker??{},r=t===void 0?"./workers/analytics.worker.js":t;n=new Worker(r),g(e)},m=()=>{let e=new Proxy(history.pushState,{apply:(t,r,a)=>{t.apply(r,a),o()}});return history.pushState=e,addEventListener("popstate",o,{passive:!0}),{cleanup(){e=null,removeEventListener("popstate",o,!1)}}},l="Analytics worker not initialized. Did you call `initWorker`?",o=()=>{s(n,l);let{title:e,location:{href:t},referrer:r}=document,{innerWidth:a,innerHeight:y}=window,f={title:e,href:t,referrer:c(i(r)&&r!==""?r:void 0),device:{inner_width:a,inner_height:y}};n?.postMessage({msg:"junoTrackPageView",data:f})},d=e=>{s(n,l),n?.postMessage({msg:"junoTrackEvent",data:e})},g=e=>{s(n,l),n?.postMessage({msg:"junoInitEnvironment",data:e})};var A=async e=>{u(e);let{cleanup:t}=m();return o(),()=>{t()}};export{A as initOrbiter,d as trackEvent,o as trackPageView};
3
+ import{createRequire as N}from"module";var _=N(import.meta.url);var w=e=>e==null,d=e=>!w(e),j=class extends Error{},a=(e,t)=>{if(w(e))throw new j(t)},v=e=>d(e)?[e]:[];var h=()=>typeof window<"u";function k(e){return new Promise((t,r)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>r(e.error)})}function u(e,t){let r=indexedDB.open(e);r.onupgradeneeded=()=>r.result.createObjectStore(t);let o=k(r);return(l,p)=>o.then(M=>p(M.transaction(t,l).objectStore(t)))}var m;function B(){return m||(m=u("keyval-store","keyval")),m}function f(e,t,r=B()){return r("readwrite",o=>(o.put(t,e),k(o.transaction)))}import{randomFillSync as E}from"crypto";var P="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var D=128,i,s,W=e=>{!i||i.length<e?(i=Buffer.allocUnsafe(e*D),E(i),s=0):s+e>i.length&&(E(i),s=0),s+=e};var y=(e=21)=>{W(e-=0);let t="";for(let r=s-e;r<s;r++)t+=P[i[r]&63];return t};var K=u("juno-views","views"),O=u("juno-events","events"),x=e=>f(y(),e,K);var T=e=>f(y(),e,O);var n,b=e=>{let{path:t}=e.worker??{},r=t===void 0?"./workers/analytics.worker.js":t;n=new Worker(r),U(e)},V=()=>{let e=async()=>await I(),t=new Proxy(history.pushState,{apply:async(r,o,l)=>{r.apply(o,l),await e()}});return history.pushState=t,addEventListener("popstate",e,{passive:!0}),{cleanup(){t=null,removeEventListener("popstate",e,!1)}}},c="Analytics worker not initialized. Did you call `initWorker`?",g=async()=>{let{title:e,location:{href:t},referrer:r}=document,{innerWidth:o,innerHeight:l}=window,p={title:e,href:t,referrer:v(d(r)&&r!==""?r:void 0),device:{inner_width:o,inner_height:l}};await x(p)},I=async()=>{a(n,c),await g(),n?.postMessage({msg:"junoTrackPageView"})},R=async e=>{a(n,c),await T(e),n?.postMessage({msg:"junoTrackEvent"})},U=e=>{a(n,c),n?.postMessage({msg:"junoInitEnvironment",data:e})},S=()=>{a(n,c),n?.postMessage({msg:"junoStartTrackTimer"})},A=()=>{a(n,c),n?.postMessage({msg:"junoStopTrackTimer"})};var ie=async e=>{if(!h())return Promise.resolve;await g(),b(e);let{cleanup:t}=V();return S(),()=>{A(),t()}};export{ie as initOrbiter,R as trackEvent,I as trackPageView};
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../utils/src/utils/null.utils.ts", "../../../utils/src/utils/did.utils.ts", "../../src/services/analytics.services.ts", "../../src/index.ts"],
4
- "sourcesContent": ["/** Is null or undefined */\nexport const isNullish = <T>(argument: T | undefined | null): argument is undefined | null =>\n argument === null || argument === undefined;\n\n/** Not null and not undefined */\nexport const nonNullish = <T>(argument: T | undefined | null): argument is NonNullable<T> =>\n !isNullish(argument);\n\nexport class NullishError extends Error {}\n\nexport const assertNonNullish: <T>(\n value: T,\n message?: string\n) => asserts value is NonNullable<T> = <T>(value: T, message?: string): void => {\n if (isNullish(value)) {\n throw new NullishError(message);\n }\n};\n", "import {nonNullish} from './null.utils';\n\nexport const toNullable = <T>(value?: T): [] | [T] => {\n return nonNullish(value) ? [value] : [];\n};\n\nexport const fromNullable = <T>(value: [] | [T]): T | undefined => {\n return value?.[0];\n};\n\nexport const toArray = async <T>(data: T): Promise<Uint8Array> => {\n const blob: Blob = new Blob([JSON.stringify(data)], {\n type: 'application/json; charset=utf-8'\n });\n return new Uint8Array(await blob.arrayBuffer());\n};\n\nexport const fromArray = async <T>(data: Uint8Array | number[]): Promise<T> => {\n const blob: Blob = new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)], {\n type: 'application/json; charset=utf-8'\n });\n return JSON.parse(await blob.text());\n};\n", "import {assertNonNullish, nonNullish, toNullable} from '@junobuild/utils';\nimport type {Environment, EnvironmentWorker} from '../types/env';\nimport type {PostMessageInitAnalytics, PostMessagePageView} from '../types/post-message';\nimport type {TrackEvent} from '../types/track';\n\nlet worker: Worker | undefined;\n\nexport const initWorker = (env: Environment) => {\n const {path}: EnvironmentWorker = env.worker ?? {};\n const workerUrl = path === undefined ? './workers/analytics.worker.js' : path;\n\n worker = new Worker(workerUrl);\n\n initWorkerEnvironment(env);\n};\n\nexport const initTrackPageViews = (): {cleanup: () => void} => {\n let pushStateProxy: typeof history.pushState | null = new Proxy(history.pushState, {\n apply: (\n target,\n thisArg,\n argArray: [data: unknown, unused: string, url?: string | URL | null | undefined]\n ) => {\n target.apply(thisArg, argArray);\n trackPageView();\n }\n });\n\n history.pushState = pushStateProxy;\n\n addEventListener('popstate', trackPageView, {passive: true});\n\n return {\n cleanup() {\n pushStateProxy = null;\n removeEventListener('popstate', trackPageView, false);\n }\n };\n};\n\nconst WORKER_UNDEFINED_MSG =\n 'Analytics worker not initialized. Did you call `initWorker`?' as const;\n\nexport const trackPageView = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n const {\n title,\n location: {href},\n referrer\n } = document;\n const {innerWidth, innerHeight} = window;\n\n const data: PostMessagePageView = {\n title,\n href,\n referrer: toNullable(nonNullish(referrer) && referrer !== '' ? referrer : undefined),\n device: {\n inner_width: innerWidth,\n inner_height: innerHeight\n }\n };\n\n worker?.postMessage({msg: 'junoTrackPageView', data});\n};\n\nexport const trackEvent = (data: TrackEvent) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoTrackEvent', data});\n};\n\nexport const initWorkerEnvironment = (env: PostMessageInitAnalytics) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoInitEnvironment', data: env});\n};\n", "import {initTrackPageViews, initWorker, trackPageView} from './services/analytics.services';\nimport type {Environment} from './types/env';\n\nexport {trackEvent, trackPageView} from './services/analytics.services';\nexport * from './types/env';\nexport * from './types/proxy';\n\nexport const initOrbiter = async (env: Environment): Promise<() => void> => {\n initWorker(env);\n\n const {cleanup} = initTrackPageViews();\n\n // Tack first page\n trackPageView();\n\n return () => {\n cleanup();\n };\n};\n"],
5
- "mappings": ";;gEACaA,EAAgBC,GAC3BA,GAAa,KAGFC,EAAiBD,GAC5B,CAACD,EAAUC,CAAQ,EAERE,EAAN,cAA2B,KAAM,CAAC,EAE5BC,EAG0B,CAAIC,EAAUC,IAA2B,CAC9E,GAAIN,EAAUK,CAAK,EACjB,MAAM,IAAIF,EAAaG,CAAO,CAElC,ECfaC,EAAiBF,GACrBH,EAAWG,CAAK,EAAI,CAACA,CAAK,EAAI,CAAC,ECExC,IAAIG,EAESC,EAAcC,GAAqB,CAC9C,GAAM,CAAC,KAAAC,CAAI,EAAuBD,EAAI,QAAU,CAAC,EAC3CE,EAAYD,IAAS,OAAY,gCAAkCA,EAEzEH,EAAS,IAAI,OAAOI,CAAS,EAE7BC,EAAsBH,CAAG,CAC3B,EAEaI,EAAqB,IAA6B,CAC7D,IAAIC,EAAkD,IAAI,MAAM,QAAQ,UAAW,CACjF,MAAO,CACLC,EACAC,EACAC,IACG,CACHF,EAAO,MAAMC,EAASC,CAAQ,EAC9BC,EAAc,CAChB,CACF,CAAC,EAED,eAAQ,UAAYJ,EAEpB,iBAAiB,WAAYI,EAAe,CAAC,QAAS,EAAI,CAAC,EAEpD,CACL,SAAU,CACRJ,EAAiB,KACjB,oBAAoB,WAAYI,EAAe,EAAK,CACtD,CACF,CACF,EAEMC,EACJ,+DAEWD,EAAgB,IAAM,CACjC,EAAiBX,EAAQY,CAAoB,EAE7C,GAAM,CACJ,MAAAC,EACA,SAAU,CAAC,KAAAC,CAAI,EACf,SAAAC,CACF,EAAI,SACE,CAAC,WAAAC,EAAY,YAAAC,CAAW,EAAI,OAE5BC,EAA4B,CAChC,MAAAL,EACA,KAAAC,EACA,SAAUK,EAAWC,EAAWL,CAAQ,GAAKA,IAAa,GAAKA,EAAW,MAAS,EACnF,OAAQ,CACN,YAAaC,EACb,aAAcC,CAChB,CACF,EAEAjB,GAAQ,YAAY,CAAC,IAAK,oBAAqB,KAAAkB,CAAI,CAAC,CACtD,EAEaG,EAAcH,GAAqB,CAC9C,EAAiBlB,EAAQY,CAAoB,EAE7CZ,GAAQ,YAAY,CAAC,IAAK,iBAAkB,KAAAkB,CAAI,CAAC,CACnD,EAEab,EAAyBH,GAAkC,CACtE,EAAiBF,EAAQY,CAAoB,EAE7CZ,GAAQ,YAAY,CAAC,IAAK,sBAAuB,KAAME,CAAG,CAAC,CAC7D,ECrEO,IAAMoB,EAAc,MAAOC,GAA0C,CAC1EC,EAAWD,CAAG,EAEd,GAAM,CAAC,QAAAE,CAAO,EAAIC,EAAmB,EAGrC,OAAAC,EAAc,EAEP,IAAM,CACXF,EAAQ,CACV,CACF",
6
- "names": ["isNullish", "argument", "nonNullish", "NullishError", "assertNonNullish", "value", "message", "toNullable", "worker", "initWorker", "env", "path", "workerUrl", "initWorkerEnvironment", "initTrackPageViews", "pushStateProxy", "target", "thisArg", "argArray", "trackPageView", "WORKER_UNDEFINED_MSG", "title", "href", "referrer", "innerWidth", "innerHeight", "data", "a", "o", "trackEvent", "initOrbiter", "env", "initWorker", "cleanup", "initTrackPageViews", "trackPageView"]
3
+ "sources": ["../../../utils/src/utils/debounce.utils.ts", "../../../utils/src/utils/null.utils.ts", "../../../utils/src/utils/did.utils.ts", "../../../utils/src/utils/env.utils.ts", "../../../../node_modules/idb-keyval/dist/index.js", "../../../../node_modules/nanoid/index.js", "../../../../node_modules/nanoid/url-alphabet/index.js", "../../src/services/idb.services.ts", "../../src/services/analytics.services.ts", "../../src/index.ts"],
4
+ "sourcesContent": ["/* eslint-disable-next-line @typescript-eslint/ban-types */\nexport const debounce = (func: Function, timeout?: number) => {\n let timer: NodeJS.Timer | undefined;\n\n return (...args: unknown[]) => {\n const next = () => func(...args);\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(next, timeout !== undefined && timeout > 0 ? timeout : 300);\n };\n};\n", "/** Is null or undefined */\nexport const isNullish = <T>(argument: T | undefined | null): argument is undefined | null =>\n argument === null || argument === undefined;\n\n/** Not null and not undefined */\nexport const nonNullish = <T>(argument: T | undefined | null): argument is NonNullable<T> =>\n !isNullish(argument);\n\nexport class NullishError extends Error {}\n\nexport const assertNonNullish: <T>(\n value: T,\n message?: string\n) => asserts value is NonNullable<T> = <T>(value: T, message?: string): void => {\n if (isNullish(value)) {\n throw new NullishError(message);\n }\n};\n", "import {nonNullish} from './null.utils';\n\nexport const toNullable = <T>(value?: T): [] | [T] => {\n return nonNullish(value) ? [value] : [];\n};\n\nexport const fromNullable = <T>(value: [] | [T]): T | undefined => {\n return value?.[0];\n};\n\nexport const toArray = async <T>(data: T): Promise<Uint8Array> => {\n const blob: Blob = new Blob([JSON.stringify(data)], {\n type: 'application/json; charset=utf-8'\n });\n return new Uint8Array(await blob.arrayBuffer());\n};\n\nexport const fromArray = async <T>(data: Uint8Array | number[]): Promise<T> => {\n const blob: Blob = new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)], {\n type: 'application/json; charset=utf-8'\n });\n return JSON.parse(await blob.text());\n};\n", "export const isBrowser = () => typeof window !== `undefined`;\n", "function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic \u2013 if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n", "import { randomFillSync } from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet }\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nexport let random = bytes => {\n fillPool((bytes -= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) => {\n fillPool((size -= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\n", "export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n", "import {createStore, delMany, entries, set} from 'idb-keyval';\nimport {nanoid} from 'nanoid';\nimport type {IdbPageView, IdbTrackEvent} from '../types/idb';\n\nconst viewsStore = createStore('juno-views', 'views');\nconst eventsStore = createStore('juno-events', 'events');\n\nexport const setPageView = (view: IdbPageView): Promise<void> => set(nanoid(), view, viewsStore);\n\nexport const getPageViews = (): Promise<[IDBValidKey, IdbPageView][]> => entries(viewsStore);\n\nexport const delPageViews = (keys: IDBValidKey[]): Promise<void> => delMany(keys, viewsStore);\n\nexport const setTrackEvent = (track: IdbTrackEvent): Promise<void> =>\n set(nanoid(), track, eventsStore);\n\nexport const getTrackEvents = (): Promise<[IDBValidKey, IdbTrackEvent][]> => entries(eventsStore);\n\nexport const delTrackEvents = (keys: IDBValidKey[]): Promise<void> => delMany(keys, eventsStore);\n", "import {assertNonNullish, nonNullish, toNullable} from '@junobuild/utils';\nimport type {Environment, EnvironmentWorker} from '../types/env';\nimport type {IdbPageView} from '../types/idb';\nimport type {PostMessageInitEnvData} from '../types/post-message';\nimport type {TrackEvent} from '../types/track';\nimport {setPageView as idbSetPageView, setTrackEvent} from './idb.services';\n\nlet worker: Worker | undefined;\n\nexport const initWorker = (env: Environment) => {\n const {path}: EnvironmentWorker = env.worker ?? {};\n const workerUrl = path === undefined ? './workers/analytics.worker.js' : path;\n\n worker = new Worker(workerUrl);\n\n initWorkerEnvironment(env);\n};\n\nexport const initTrackPageViews = (): {cleanup: () => void} => {\n const trackPages = async () => await trackPageView();\n\n let pushStateProxy: typeof history.pushState | null = new Proxy(history.pushState, {\n apply: async (\n target,\n thisArg,\n argArray: [data: unknown, unused: string, url?: string | URL | null | undefined]\n ) => {\n target.apply(thisArg, argArray);\n await trackPages();\n }\n });\n\n history.pushState = pushStateProxy;\n\n addEventListener('popstate', trackPages, {passive: true});\n\n return {\n cleanup() {\n pushStateProxy = null;\n removeEventListener('popstate', trackPages, false);\n }\n };\n};\n\nconst WORKER_UNDEFINED_MSG =\n 'Analytics worker not initialized. Did you call `initWorker`?' as const;\n\nexport const setPageView = async () => {\n const {\n title,\n location: {href},\n referrer\n } = document;\n const {innerWidth, innerHeight} = window;\n\n const data: IdbPageView = {\n title,\n href,\n referrer: toNullable(nonNullish(referrer) && referrer !== '' ? referrer : undefined),\n device: {\n inner_width: innerWidth,\n inner_height: innerHeight\n }\n };\n\n await idbSetPageView(data);\n};\n\nexport const trackPageView = async () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setPageView();\n\n worker?.postMessage({msg: 'junoTrackPageView'});\n};\n\nexport const trackEvent = async (data: TrackEvent) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setTrackEvent(data);\n\n worker?.postMessage({msg: 'junoTrackEvent'});\n};\n\nexport const initWorkerEnvironment = (env: PostMessageInitEnvData) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoInitEnvironment', data: env});\n};\n\nexport const startTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStartTrackTimer'});\n};\n\nexport const stopTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStopTrackTimer'});\n};\n", "import {isBrowser} from '@junobuild/utils';\nimport {\n initTrackPageViews,\n initWorker,\n setPageView,\n startTracking,\n stopTracking\n} from './services/analytics.services';\nimport type {Environment} from './types/env';\n\nexport {trackEvent, trackPageView} from './services/analytics.services';\nexport * from './types/env';\n\nexport const initOrbiter = async (env: Environment): Promise<() => void> => {\n if (!isBrowser()) {\n // Avoid pre-rendering issue when window and indexedDB is not available\n return Promise.resolve;\n }\n\n // Save first page as soon as possible\n await setPageView();\n\n initWorker(env);\n\n const {cleanup} = initTrackPageViews();\n\n // Starting tracking will instantly sync the first page and the data from previous sessions that have not been synced yet\n startTracking();\n\n return () => {\n stopTracking();\n cleanup();\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["isNullish", "argument", "nonNullish", "NullishError", "assertNonNullish", "value", "message", "toNullable", "isBrowser", "promisifyRequest", "request", "resolve", "reject", "createStore", "dbName", "storeName", "dbp", "txMode", "callback", "db", "defaultGetStoreFunc", "defaultGetStore", "set", "key", "value", "customStore", "defaultGetStore", "store", "promisifyRequest", "randomFillSync", "urlAlphabet", "POOL_SIZE_MULTIPLIER", "pool", "poolOffset", "fillPool", "bytes", "randomFillSync", "nanoid", "size", "fillPool", "id", "i", "poolOffset", "urlAlphabet", "pool", "viewsStore", "createStore", "eventsStore", "setPageView", "view", "set", "nanoid", "setTrackEvent", "track", "set", "nanoid", "eventsStore", "worker", "initWorker", "env", "path", "workerUrl", "initWorkerEnvironment", "initTrackPageViews", "trackPages", "trackPageView", "pushStateProxy", "target", "thisArg", "argArray", "WORKER_UNDEFINED_MSG", "setPageView", "title", "href", "referrer", "innerWidth", "innerHeight", "data", "T", "s", "f", "trackEvent", "setTrackEvent", "startTracking", "stopTracking", "initOrbiter", "env", "y", "setPageView", "initWorker", "cleanup", "initTrackPageViews", "startTracking", "stopTracking"]
7
7
  }
@@ -0,0 +1,3 @@
1
+ import type { _SERVICE as OrbiterActor } from '../../declarations/orbiter/orbiter.did';
2
+ import type { EnvironmentActor } from '../types/env';
3
+ export declare const getOrbiterActor: (env: EnvironmentActor) => Promise<OrbiterActor>;
@@ -1,5 +1,4 @@
1
1
  import type { Environment } from './types/env';
2
2
  export { trackEvent, trackPageView } from './services/analytics.services';
3
3
  export * from './types/env';
4
- export * from './types/proxy';
5
4
  export declare const initOrbiter: (env: Environment) => Promise<() => void>;
@@ -1,10 +1,13 @@
1
1
  import type { Environment } from '../types/env';
2
- import type { PostMessageInitAnalytics } from '../types/post-message';
2
+ import type { PostMessageInitEnvData } from '../types/post-message';
3
3
  import type { TrackEvent } from '../types/track';
4
4
  export declare const initWorker: (env: Environment) => void;
5
5
  export declare const initTrackPageViews: () => {
6
6
  cleanup: () => void;
7
7
  };
8
- export declare const trackPageView: () => void;
9
- export declare const trackEvent: (data: TrackEvent) => void;
10
- export declare const initWorkerEnvironment: (env: PostMessageInitAnalytics) => void;
8
+ export declare const setPageView: () => Promise<void>;
9
+ export declare const trackPageView: () => Promise<void>;
10
+ export declare const trackEvent: (data: TrackEvent) => Promise<void>;
11
+ export declare const initWorkerEnvironment: (env: PostMessageInitEnvData) => void;
12
+ export declare const startTracking: () => void;
13
+ export declare const stopTracking: () => void;
@@ -0,0 +1,7 @@
1
+ import type { IdbPageView, IdbTrackEvent } from '../types/idb';
2
+ export declare const setPageView: (view: IdbPageView) => Promise<void>;
3
+ export declare const getPageViews: () => Promise<[IDBValidKey, IdbPageView][]>;
4
+ export declare const delPageViews: (keys: IDBValidKey[]) => Promise<void>;
5
+ export declare const setTrackEvent: (track: IdbTrackEvent) => Promise<void>;
6
+ export declare const getTrackEvents: () => Promise<[IDBValidKey, IdbTrackEvent][]>;
7
+ export declare const delTrackEvents: (keys: IDBValidKey[]) => Promise<void>;
@@ -1,15 +1,13 @@
1
1
  export type EnvironmentWorkerPath = string;
2
2
  export interface EnvironmentWorker {
3
3
  path?: EnvironmentWorkerPath;
4
+ timerInterval?: number;
4
5
  }
5
- export interface EnvironmentProxyUrls {
6
- pageViewProxyUrl?: string;
7
- trackEventProxyUrl?: string;
8
- }
9
- export type EnvironmentProxy = {
6
+ export type EnvironmentActor = {
10
7
  orbiterId: string;
11
8
  satelliteId: string;
12
- } & EnvironmentProxyUrls;
13
- export type Environment = EnvironmentProxy & {
9
+ env?: 'dev' | 'prod';
10
+ };
11
+ export type Environment = EnvironmentActor & {
14
12
  worker?: EnvironmentWorker;
15
13
  };
@@ -0,0 +1,4 @@
1
+ import type { SetPageView } from '../../declarations/orbiter/orbiter.did';
2
+ import type { TrackEvent } from './track';
3
+ export type IdbPageView = Omit<SetPageView, 'time_zone' | 'user_agent' | 'collected_at' | 'updated_at'>;
4
+ export type IdbTrackEvent = TrackEvent;
@@ -1,11 +1,7 @@
1
- import type { SetPageView } from '../../declarations/orbiter/orbiter.did';
2
- import type { EnvironmentProxy } from './env';
3
- import type { TrackEvent } from './track';
4
- export type PostMessageRequest = 'junoInitEnvironment' | 'junoTrackPageView' | 'junoTrackEvent';
5
- export type PostMessageInitAnalytics = EnvironmentProxy;
6
- export type PostMessagePageView = Omit<SetPageView, 'time_zone' | 'user_agent' | 'collected_at' | 'updated_at'>;
7
- export type PostMessageTrackEvent = TrackEvent;
1
+ import type { Environment } from './env';
2
+ export type PostMessageRequest = 'junoInitEnvironment' | 'junoTrackPageView' | 'junoTrackEvent' | 'junoStartTrackTimer' | 'junoStopTrackTimer';
3
+ export type PostMessageInitEnvData = Environment;
8
4
  export interface PostMessage {
9
5
  msg: PostMessageRequest;
10
- data: PostMessageInitAnalytics | PostMessagePageView | PostMessageTrackEvent;
6
+ data?: PostMessageInitEnvData;
11
7
  }
@@ -0,0 +1,6 @@
1
+ import type { ActorMethod, ActorSubclass } from '@dfinity/agent';
2
+ import type { IDL } from '@dfinity/candid';
3
+ import type { EnvironmentActor } from '../types/env';
4
+ export declare const createActor: <T = Record<string, ActorMethod<unknown[], unknown>>>({ orbiterId: canisterId, idlFactory, env }: {
5
+ idlFactory: IDL.InterfaceFactory;
6
+ } & EnvironmentActor) => Promise<ActorSubclass<T>>;