@shware/analytics 2.16.2 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/feedback/index.cjs +2 -2
  2. package/dist/feedback/index.cjs.map +1 -1
  3. package/dist/feedback/index.mjs +1 -1
  4. package/dist/feedback/index.mjs.map +1 -1
  5. package/dist/hooks/use-click-id-persistence.cjs +3 -3
  6. package/dist/hooks/use-click-id-persistence.cjs.map +1 -1
  7. package/dist/hooks/use-click-id-persistence.mjs +1 -1
  8. package/dist/hooks/use-click-id-persistence.mjs.map +1 -1
  9. package/dist/hooks/use-web-session-analytics.cjs +18 -11
  10. package/dist/hooks/use-web-session-analytics.cjs.map +1 -1
  11. package/dist/hooks/use-web-session-analytics.mjs +18 -11
  12. package/dist/hooks/use-web-session-analytics.mjs.map +1 -1
  13. package/dist/link/index.cjs +3 -3
  14. package/dist/link/index.cjs.map +1 -1
  15. package/dist/link/index.mjs +1 -1
  16. package/dist/link/index.mjs.map +1 -1
  17. package/dist/server/linkedin-conversions-api.cjs +2 -2
  18. package/dist/server/linkedin-conversions-api.cjs.map +1 -1
  19. package/dist/server/linkedin-conversions-api.mjs +1 -1
  20. package/dist/server/linkedin-conversions-api.mjs.map +1 -1
  21. package/dist/server/reddit-conversions-api.cjs +2 -2
  22. package/dist/server/reddit-conversions-api.cjs.map +1 -1
  23. package/dist/server/reddit-conversions-api.mjs +1 -1
  24. package/dist/server/reddit-conversions-api.mjs.map +1 -1
  25. package/dist/setup/session.cjs +2 -0
  26. package/dist/setup/session.cjs.map +1 -1
  27. package/dist/setup/session.d.cts +2 -1
  28. package/dist/setup/session.d.ts +2 -1
  29. package/dist/setup/session.mjs +1 -0
  30. package/dist/setup/session.mjs.map +1 -1
  31. package/dist/track/index.cjs +3 -4
  32. package/dist/track/index.cjs.map +1 -1
  33. package/dist/track/index.mjs +1 -2
  34. package/dist/track/index.mjs.map +1 -1
  35. package/dist/visitor/index.cjs +4 -4
  36. package/dist/visitor/index.cjs.map +1 -1
  37. package/dist/visitor/index.mjs +1 -1
  38. package/dist/visitor/index.mjs.map +1 -1
  39. package/dist/web/index.cjs +3 -3
  40. package/dist/web/index.cjs.map +1 -1
  41. package/dist/web/index.mjs +1 -1
  42. package/dist/web/index.mjs.map +1 -1
  43. package/package.json +3 -3
  44. package/dist/utils/fetch.cjs +0 -78
  45. package/dist/utils/fetch.cjs.map +0 -1
  46. package/dist/utils/fetch.d.cts +0 -16
  47. package/dist/utils/fetch.d.ts +0 -16
  48. package/dist/utils/fetch.mjs +0 -53
  49. package/dist/utils/fetch.mjs.map +0 -1
  50. package/dist/utils/storage.cjs +0 -56
  51. package/dist/utils/storage.cjs.map +0 -1
  52. package/dist/utils/storage.d.cts +0 -10
  53. package/dist/utils/storage.d.ts +0 -10
  54. package/dist/utils/storage.mjs +0 -31
  55. package/dist/utils/storage.mjs.map +0 -1
  56. package/dist/utils/token-bucket.cjs +0 -73
  57. package/dist/utils/token-bucket.cjs.map +0 -1
  58. package/dist/utils/token-bucket.d.cts +0 -20
  59. package/dist/utils/token-bucket.d.ts +0 -20
  60. package/dist/utils/token-bucket.mjs +0 -48
  61. package/dist/utils/token-bucket.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/reddit-conversions-api.ts"],"sourcesContent":["import { mapRDTEvent, mapServerStandardEvent } from '../track/rdt';\nimport { fetch } from '../utils/fetch';\nimport { getFirst } from '../utils/field';\nimport { IGNORE_EVENTS } from './ignore-events';\nimport type { ServerStandardEvent } from '../track/rdt';\nimport type { TrackEvent, UserProvidedData } from '../track/types';\n\n/**\n * https://ads-api.reddit.com/docs/v3/operations/Post%20Conversion%20Events\n * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source\n */\nexport interface RedditEvent {\n /** Match keys: Share user identifiers to match conversions to a Reddit ad engagement. */\n click_id?: string;\n\n /** Unix epoch timestamp in milliseconds, event_at can't be older than seven days. */\n event_at: number;\n\n action_source: 'WEBSITE' | 'APP' | string;\n\n type: {\n tracking_type: ServerStandardEvent | 'CUSTOM';\n custom_event_name?: string;\n };\n\n /**\n * Event metadata\n * Share as much additional information about your conversion event as you'd like. If you're\n * using the Conversions API with the pixel, conversion_id is required for deduplication.\n */\n metadata?: {\n conversion_id?: string;\n currency?: string; // ISO 4217 3-letter currency code\n item_count?: number;\n value?: number;\n products?: { id: string; name?: string; category?: string }[];\n };\n\n user?: {\n email?: string;\n external_id?: string;\n ip_address?: string;\n phone_number?: string;\n user_agent?: string;\n\n /** The Identifier for Advertisers (IDFA) of the user's Apple device. */\n idfa?: string;\n\n /** The Android Advertising ID (AAID) of the user's Android device. */\n aaid?: string;\n /**\n * The value from the first-party Pixel _rdt_uuid cookie on your domain. Note that it is in\n * the {timestamp}.{uuid} format. You may use the full value or just the UUID portion.\n * Example: 1684189007728.7c73f2ae-a433-4d7b-9838-f467da98f48e\n */\n uuid?: string;\n\n screen_dimensions?: { width: number; height: number };\n\n /**\n * A structure of data processing options to specify the processing type for the event\n * https://business.reddithelp.com/s/article/Limited-Data-Use\n */\n data_processing_options?: {\n country: string;\n region: string;\n modes: string[] | ['LDU'];\n };\n };\n}\n\nexport interface CreateRedditEventDTO {\n data: { test_id?: string; events: RedditEvent[] };\n}\n\nexport function getServerEvent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n event: TrackEvent<any>,\n data: UserProvidedData\n): RedditEvent {\n const { id, name, properties, tags } = event;\n const [type, params] = mapRDTEvent(name, properties, id);\n\n return {\n click_id: tags.rdt_cid,\n event_at: Date.now(),\n action_source: tags.source === 'web' ? 'WEBSITE' : tags.source === 'app' ? 'APP' : 'UNKNOWN',\n type: {\n tracking_type: type === 'Custom' ? 'CUSTOM' : mapServerStandardEvent(type),\n custom_event_name: type === 'Custom' ? params.customEventName : undefined,\n },\n metadata: {\n conversion_id: id,\n currency:\n 'currency' in params && typeof params.currency === 'string'\n ? params.currency.toUpperCase()\n : undefined,\n item_count:\n 'itemCount' in params && typeof params.itemCount === 'number'\n ? params.itemCount\n : undefined,\n value: 'value' in params && typeof params.value === 'number' ? params.value : undefined,\n products:\n 'products' in params && Array.isArray(params.products) && params.products.length > 0\n ? params.products\n : undefined,\n },\n user: {\n email: getFirst(data.email),\n external_id: data.user_id,\n ip_address: data.ip_address,\n phone_number: getFirst(data.phone_number),\n user_agent: data.user_agent,\n idfa: tags.platform === 'ios' ? tags.advertising_id : undefined,\n aaid: tags.platform === 'android' ? tags.advertising_id : undefined,\n uuid: tags.rdt_uuid,\n screen_dimensions:\n tags.screen_width && tags.screen_height\n ? { width: tags.screen_width, height: tags.screen_height }\n : undefined,\n },\n };\n}\n\nexport async function sendEvents(\n accessToken: string,\n pixelId: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n events: TrackEvent<any>[],\n data: UserProvidedData = {},\n testId?: string\n) {\n const dto: CreateRedditEventDTO = {\n data: {\n test_id: testId,\n events: events\n .filter((event) => !IGNORE_EVENTS.includes(event.name))\n .map((event) => getServerEvent(event, data)),\n },\n };\n\n if (dto.data.events.length === 0) return;\n\n try {\n const response = await fetch(\n `https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(dto),\n }\n );\n if (response.ok) return;\n const { status } = response;\n const message = await response.text();\n console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);\n } catch (error) {\n console.error('Failed to send Reddit conversion, network error:', error);\n }\n}\n"],"mappings":";AAAA,SAAS,aAAa,8BAA8B;AACpD,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAwEvB,SAAS,eAEd,OACA,MACa;AACb,QAAM,EAAE,IAAI,MAAM,YAAY,KAAK,IAAI;AACvC,QAAM,CAAC,MAAM,MAAM,IAAI,YAAY,MAAM,YAAY,EAAE;AAEvD,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,UAAU,KAAK,IAAI;AAAA,IACnB,eAAe,KAAK,WAAW,QAAQ,YAAY,KAAK,WAAW,QAAQ,QAAQ;AAAA,IACnF,MAAM;AAAA,MACJ,eAAe,SAAS,WAAW,WAAW,uBAAuB,IAAI;AAAA,MACzE,mBAAmB,SAAS,WAAW,OAAO,kBAAkB;AAAA,IAClE;AAAA,IACA,UAAU;AAAA,MACR,eAAe;AAAA,MACf,UACE,cAAc,UAAU,OAAO,OAAO,aAAa,WAC/C,OAAO,SAAS,YAAY,IAC5B;AAAA,MACN,YACE,eAAe,UAAU,OAAO,OAAO,cAAc,WACjD,OAAO,YACP;AAAA,MACN,OAAO,WAAW,UAAU,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,MAC9E,UACE,cAAc,UAAU,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,IAC/E,OAAO,WACP;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,OAAO,SAAS,KAAK,KAAK;AAAA,MAC1B,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,cAAc,SAAS,KAAK,YAAY;AAAA,MACxC,YAAY,KAAK;AAAA,MACjB,MAAM,KAAK,aAAa,QAAQ,KAAK,iBAAiB;AAAA,MACtD,MAAM,KAAK,aAAa,YAAY,KAAK,iBAAiB;AAAA,MAC1D,MAAM,KAAK;AAAA,MACX,mBACE,KAAK,gBAAgB,KAAK,gBACtB,EAAE,OAAO,KAAK,cAAc,QAAQ,KAAK,cAAc,IACvD;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAsB,WACpB,aACA,SAEA,QACA,OAAyB,CAAC,GAC1B,QACA;AACA,QAAM,MAA4B;AAAA,IAChC,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ,OACL,OAAO,CAAC,UAAU,CAAC,cAAc,SAAS,MAAM,IAAI,CAAC,EACrD,IAAI,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,IAAI,KAAK,OAAO,WAAW,EAAG;AAElC,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB,4CAA4C,OAAO;AAAA,MACnD;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,eAAe,UAAU,WAAW;AAAA,QACtC;AAAA,QACA,MAAM,KAAK,UAAU,GAAG;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,SAAS,GAAI;AACjB,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,YAAQ,MAAM,6CAA6C,MAAM,WAAW,OAAO,EAAE;AAAA,EACvF,SAAS,OAAO;AACd,YAAQ,MAAM,oDAAoD,KAAK;AAAA,EACzE;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/server/reddit-conversions-api.ts"],"sourcesContent":["import { fetch } from '@shware/utils';\nimport { mapRDTEvent, mapServerStandardEvent } from '../track/rdt';\nimport { getFirst } from '../utils/field';\nimport { IGNORE_EVENTS } from './ignore-events';\nimport type { ServerStandardEvent } from '../track/rdt';\nimport type { TrackEvent, UserProvidedData } from '../track/types';\n\n/**\n * https://ads-api.reddit.com/docs/v3/operations/Post%20Conversion%20Events\n * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source\n */\nexport interface RedditEvent {\n /** Match keys: Share user identifiers to match conversions to a Reddit ad engagement. */\n click_id?: string;\n\n /** Unix epoch timestamp in milliseconds, event_at can't be older than seven days. */\n event_at: number;\n\n action_source: 'WEBSITE' | 'APP' | string;\n\n type: {\n tracking_type: ServerStandardEvent | 'CUSTOM';\n custom_event_name?: string;\n };\n\n /**\n * Event metadata\n * Share as much additional information about your conversion event as you'd like. If you're\n * using the Conversions API with the pixel, conversion_id is required for deduplication.\n */\n metadata?: {\n conversion_id?: string;\n currency?: string; // ISO 4217 3-letter currency code\n item_count?: number;\n value?: number;\n products?: { id: string; name?: string; category?: string }[];\n };\n\n user?: {\n email?: string;\n external_id?: string;\n ip_address?: string;\n phone_number?: string;\n user_agent?: string;\n\n /** The Identifier for Advertisers (IDFA) of the user's Apple device. */\n idfa?: string;\n\n /** The Android Advertising ID (AAID) of the user's Android device. */\n aaid?: string;\n /**\n * The value from the first-party Pixel _rdt_uuid cookie on your domain. Note that it is in\n * the {timestamp}.{uuid} format. You may use the full value or just the UUID portion.\n * Example: 1684189007728.7c73f2ae-a433-4d7b-9838-f467da98f48e\n */\n uuid?: string;\n\n screen_dimensions?: { width: number; height: number };\n\n /**\n * A structure of data processing options to specify the processing type for the event\n * https://business.reddithelp.com/s/article/Limited-Data-Use\n */\n data_processing_options?: {\n country: string;\n region: string;\n modes: string[] | ['LDU'];\n };\n };\n}\n\nexport interface CreateRedditEventDTO {\n data: { test_id?: string; events: RedditEvent[] };\n}\n\nexport function getServerEvent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n event: TrackEvent<any>,\n data: UserProvidedData\n): RedditEvent {\n const { id, name, properties, tags } = event;\n const [type, params] = mapRDTEvent(name, properties, id);\n\n return {\n click_id: tags.rdt_cid,\n event_at: Date.now(),\n action_source: tags.source === 'web' ? 'WEBSITE' : tags.source === 'app' ? 'APP' : 'UNKNOWN',\n type: {\n tracking_type: type === 'Custom' ? 'CUSTOM' : mapServerStandardEvent(type),\n custom_event_name: type === 'Custom' ? params.customEventName : undefined,\n },\n metadata: {\n conversion_id: id,\n currency:\n 'currency' in params && typeof params.currency === 'string'\n ? params.currency.toUpperCase()\n : undefined,\n item_count:\n 'itemCount' in params && typeof params.itemCount === 'number'\n ? params.itemCount\n : undefined,\n value: 'value' in params && typeof params.value === 'number' ? params.value : undefined,\n products:\n 'products' in params && Array.isArray(params.products) && params.products.length > 0\n ? params.products\n : undefined,\n },\n user: {\n email: getFirst(data.email),\n external_id: data.user_id,\n ip_address: data.ip_address,\n phone_number: getFirst(data.phone_number),\n user_agent: data.user_agent,\n idfa: tags.platform === 'ios' ? tags.advertising_id : undefined,\n aaid: tags.platform === 'android' ? tags.advertising_id : undefined,\n uuid: tags.rdt_uuid,\n screen_dimensions:\n tags.screen_width && tags.screen_height\n ? { width: tags.screen_width, height: tags.screen_height }\n : undefined,\n },\n };\n}\n\nexport async function sendEvents(\n accessToken: string,\n pixelId: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n events: TrackEvent<any>[],\n data: UserProvidedData = {},\n testId?: string\n) {\n const dto: CreateRedditEventDTO = {\n data: {\n test_id: testId,\n events: events\n .filter((event) => !IGNORE_EVENTS.includes(event.name))\n .map((event) => getServerEvent(event, data)),\n },\n };\n\n if (dto.data.events.length === 0) return;\n\n try {\n const response = await fetch(\n `https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(dto),\n }\n );\n if (response.ok) return;\n const { status } = response;\n const message = await response.text();\n console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);\n } catch (error) {\n console.error('Failed to send Reddit conversion, network error:', error);\n }\n}\n"],"mappings":";AAAA,SAAS,aAAa;AACtB,SAAS,aAAa,8BAA8B;AACpD,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAwEvB,SAAS,eAEd,OACA,MACa;AACb,QAAM,EAAE,IAAI,MAAM,YAAY,KAAK,IAAI;AACvC,QAAM,CAAC,MAAM,MAAM,IAAI,YAAY,MAAM,YAAY,EAAE;AAEvD,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,UAAU,KAAK,IAAI;AAAA,IACnB,eAAe,KAAK,WAAW,QAAQ,YAAY,KAAK,WAAW,QAAQ,QAAQ;AAAA,IACnF,MAAM;AAAA,MACJ,eAAe,SAAS,WAAW,WAAW,uBAAuB,IAAI;AAAA,MACzE,mBAAmB,SAAS,WAAW,OAAO,kBAAkB;AAAA,IAClE;AAAA,IACA,UAAU;AAAA,MACR,eAAe;AAAA,MACf,UACE,cAAc,UAAU,OAAO,OAAO,aAAa,WAC/C,OAAO,SAAS,YAAY,IAC5B;AAAA,MACN,YACE,eAAe,UAAU,OAAO,OAAO,cAAc,WACjD,OAAO,YACP;AAAA,MACN,OAAO,WAAW,UAAU,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,MAC9E,UACE,cAAc,UAAU,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,IAC/E,OAAO,WACP;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,OAAO,SAAS,KAAK,KAAK;AAAA,MAC1B,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,cAAc,SAAS,KAAK,YAAY;AAAA,MACxC,YAAY,KAAK;AAAA,MACjB,MAAM,KAAK,aAAa,QAAQ,KAAK,iBAAiB;AAAA,MACtD,MAAM,KAAK,aAAa,YAAY,KAAK,iBAAiB;AAAA,MAC1D,MAAM,KAAK;AAAA,MACX,mBACE,KAAK,gBAAgB,KAAK,gBACtB,EAAE,OAAO,KAAK,cAAc,QAAQ,KAAK,cAAc,IACvD;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAsB,WACpB,aACA,SAEA,QACA,OAAyB,CAAC,GAC1B,QACA;AACA,QAAM,MAA4B;AAAA,IAChC,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ,OACL,OAAO,CAAC,UAAU,CAAC,cAAc,SAAS,MAAM,IAAI,CAAC,EACrD,IAAI,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,IAAI,KAAK,OAAO,WAAW,EAAG;AAElC,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB,4CAA4C,OAAO;AAAA,MACnD;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,eAAe,UAAU,WAAW;AAAA,QACtC;AAAA,QACA,MAAM,KAAK,UAAU,GAAG;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,SAAS,GAAI;AACjB,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,YAAQ,MAAM,6CAA6C,MAAM,WAAW,OAAO,EAAE;AAAA,EACvF,SAAS,OAAO;AACd,YAAQ,MAAM,oDAAoD,KAAK;AAAA,EACzE;AACF;","names":[]}
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/setup/session.ts
21
21
  var session_exports = {};
22
22
  __export(session_exports, {
23
+ SESSION_TIMEOUT: () => SESSION_TIMEOUT,
23
24
  getCurrentSession: () => getCurrentSession,
24
25
  isSessionExpired: () => isSessionExpired,
25
26
  resetSession: () => resetSession,
@@ -44,6 +45,7 @@ function isSessionExpired() {
44
45
  }
45
46
  // Annotate the CommonJS export names for ESM import in node:
46
47
  0 && (module.exports = {
48
+ SESSION_TIMEOUT,
47
49
  getCurrentSession,
48
50
  isSessionExpired,
49
51
  resetSession,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport type Session = { id: string; lastActiveTime: number };\n\nconst SESSION_TIMEOUT = 30 * 60 * 1000;\nconst session: Session = { id: uuidv7(), lastActiveTime: Date.now() };\n\nexport function updateSessionActiveTime() {\n session.lastActiveTime = Date.now();\n}\n\nexport function resetSession() {\n session.id = uuidv7();\n session.lastActiveTime = Date.now();\n}\n\nexport function getCurrentSession() {\n return session;\n}\n\nexport function isSessionExpired() {\n return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AAI7B,IAAM,kBAAkB,KAAK,KAAK;AAClC,IAAM,UAAmB,EAAE,QAAI,YAAAA,IAAO,GAAG,gBAAgB,KAAK,IAAI,EAAE;AAE7D,SAAS,0BAA0B;AACxC,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,eAAe;AAC7B,UAAQ,SAAK,YAAAA,IAAO;AACpB,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,oBAAoB;AAClC,SAAO;AACT;AAEO,SAAS,mBAAmB;AACjC,SAAO,KAAK,IAAI,IAAI,QAAQ,iBAAiB;AAC/C;","names":["uuidv7"]}
1
+ {"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport type Session = { id: string; lastActiveTime: number };\n\nexport const SESSION_TIMEOUT = 30 * 60 * 1000;\nconst session: Session = { id: uuidv7(), lastActiveTime: Date.now() };\n\nexport function updateSessionActiveTime() {\n session.lastActiveTime = Date.now();\n}\n\nexport function resetSession() {\n session.id = uuidv7();\n session.lastActiveTime = Date.now();\n}\n\nexport function getCurrentSession() {\n return session;\n}\n\nexport function isSessionExpired() {\n return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AAItB,IAAM,kBAAkB,KAAK,KAAK;AACzC,IAAM,UAAmB,EAAE,QAAI,YAAAA,IAAO,GAAG,gBAAgB,KAAK,IAAI,EAAE;AAE7D,SAAS,0BAA0B;AACxC,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,eAAe;AAC7B,UAAQ,SAAK,YAAAA,IAAO;AACpB,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,oBAAoB;AAClC,SAAO;AACT;AAEO,SAAS,mBAAmB;AACjC,SAAO,KAAK,IAAI,IAAI,QAAQ,iBAAiB;AAC/C;","names":["uuidv7"]}
@@ -2,9 +2,10 @@ type Session = {
2
2
  id: string;
3
3
  lastActiveTime: number;
4
4
  };
5
+ declare const SESSION_TIMEOUT: number;
5
6
  declare function updateSessionActiveTime(): void;
6
7
  declare function resetSession(): void;
7
8
  declare function getCurrentSession(): Session;
8
9
  declare function isSessionExpired(): boolean;
9
10
 
10
- export { type Session, getCurrentSession, isSessionExpired, resetSession, updateSessionActiveTime };
11
+ export { SESSION_TIMEOUT, type Session, getCurrentSession, isSessionExpired, resetSession, updateSessionActiveTime };
@@ -2,9 +2,10 @@ type Session = {
2
2
  id: string;
3
3
  lastActiveTime: number;
4
4
  };
5
+ declare const SESSION_TIMEOUT: number;
5
6
  declare function updateSessionActiveTime(): void;
6
7
  declare function resetSession(): void;
7
8
  declare function getCurrentSession(): Session;
8
9
  declare function isSessionExpired(): boolean;
9
10
 
10
- export { type Session, getCurrentSession, isSessionExpired, resetSession, updateSessionActiveTime };
11
+ export { SESSION_TIMEOUT, type Session, getCurrentSession, isSessionExpired, resetSession, updateSessionActiveTime };
@@ -16,6 +16,7 @@ function isSessionExpired() {
16
16
  return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;
17
17
  }
18
18
  export {
19
+ SESSION_TIMEOUT,
19
20
  getCurrentSession,
20
21
  isSessionExpired,
21
22
  resetSession,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport type Session = { id: string; lastActiveTime: number };\n\nconst SESSION_TIMEOUT = 30 * 60 * 1000;\nconst session: Session = { id: uuidv7(), lastActiveTime: Date.now() };\n\nexport function updateSessionActiveTime() {\n session.lastActiveTime = Date.now();\n}\n\nexport function resetSession() {\n session.id = uuidv7();\n session.lastActiveTime = Date.now();\n}\n\nexport function getCurrentSession() {\n return session;\n}\n\nexport function isSessionExpired() {\n return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;\n}\n"],"mappings":";AAAA,SAAS,MAAM,cAAc;AAI7B,IAAM,kBAAkB,KAAK,KAAK;AAClC,IAAM,UAAmB,EAAE,IAAI,OAAO,GAAG,gBAAgB,KAAK,IAAI,EAAE;AAE7D,SAAS,0BAA0B;AACxC,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,eAAe;AAC7B,UAAQ,KAAK,OAAO;AACpB,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,oBAAoB;AAClC,SAAO;AACT;AAEO,SAAS,mBAAmB;AACjC,SAAO,KAAK,IAAI,IAAI,QAAQ,iBAAiB;AAC/C;","names":[]}
1
+ {"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport type Session = { id: string; lastActiveTime: number };\n\nexport const SESSION_TIMEOUT = 30 * 60 * 1000;\nconst session: Session = { id: uuidv7(), lastActiveTime: Date.now() };\n\nexport function updateSessionActiveTime() {\n session.lastActiveTime = Date.now();\n}\n\nexport function resetSession() {\n session.id = uuidv7();\n session.lastActiveTime = Date.now();\n}\n\nexport function getCurrentSession() {\n return session;\n}\n\nexport function isSessionExpired() {\n return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;\n}\n"],"mappings":";AAAA,SAAS,MAAM,cAAc;AAItB,IAAM,kBAAkB,KAAK,KAAK;AACzC,IAAM,UAAmB,EAAE,IAAI,OAAO,GAAG,gBAAgB,KAAK,IAAI,EAAE;AAE7D,SAAS,0BAA0B;AACxC,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,eAAe;AAC7B,UAAQ,KAAK,OAAO;AACpB,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,oBAAoB;AAClC,SAAO;AACT;AAEO,SAAS,mBAAmB;AACjC,SAAO,KAAK,IAAI,IAAI,QAAQ,iBAAiB;AAC/C;","names":[]}
@@ -25,13 +25,12 @@ __export(track_exports, {
25
25
  trackAsync: () => trackAsync
26
26
  });
27
27
  module.exports = __toCommonJS(track_exports);
28
+ var import_utils = require("@shware/utils");
28
29
  var import_setup = require("../setup/index.cjs");
29
30
  var import_session = require("../setup/session.cjs");
30
- var import_fetch = require("../utils/fetch.cjs");
31
- var import_token_bucket = require("../utils/token-bucket.cjs");
32
31
  var import_visitor = require("../visitor/index.cjs");
33
32
  var defaultOptions = { enableThirdPartyTracking: true };
34
- var tokenBucket = new import_token_bucket.TokenBucket({ rate: 1, capacity: 20, requested: 2 });
33
+ var tokenBucket = new import_utils.TokenBucket({ rate: 1, capacity: 20, requested: 2 });
35
34
  async function sendEvents(events) {
36
35
  var _a;
37
36
  try {
@@ -61,7 +60,7 @@ async function sendEvents(events) {
61
60
  environment: import_setup.config.environment,
62
61
  timestamp: event.timestamp
63
62
  }));
64
- const response = await (0, import_fetch.fetch)(`${import_setup.config.endpoint}/events`, {
63
+ const response = await (0, import_utils.fetch)(`${import_setup.config.endpoint}/events`, {
65
64
  method: "POST",
66
65
  credentials: "include",
67
66
  headers: await import_setup.config.getHeaders(),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type { EventName, TrackEventResponse, TrackName, TrackProperties } from './types';\nimport type { CreateTrackEventDTO } from '../schema/index';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log(e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { TokenBucket, fetch } from '@shware/utils';\nimport { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\nimport { getVisitor } from '../visitor/index';\nimport type { EventName, TrackEventResponse, TrackName, TrackProperties } from './types';\nimport type { CreateTrackEventDTO } from '../schema/index';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log(e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
@@ -1,4 +1,5 @@
1
1
  // src/track/index.ts
2
+ import { TokenBucket, fetch } from "@shware/utils";
2
3
  import { cache, config } from "../setup/index.mjs";
3
4
  import {
4
5
  getCurrentSession,
@@ -6,8 +7,6 @@ import {
6
7
  resetSession,
7
8
  updateSessionActiveTime
8
9
  } from "../setup/session.mjs";
9
- import { fetch } from "../utils/fetch.mjs";
10
- import { TokenBucket } from "../utils/token-bucket.mjs";
11
10
  import { getVisitor } from "../visitor/index.mjs";
12
11
  var defaultOptions = { enableThirdPartyTracking: true };
13
12
  var tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type { EventName, TrackEventResponse, TrackName, TrackProperties } from './types';\nimport type { CreateTrackEventDTO } from '../schema/index';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log(e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { TokenBucket, fetch } from '@shware/utils';\nimport { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\nimport { getVisitor } from '../visitor/index';\nimport type { EventName, TrackEventResponse, TrackName, TrackProperties } from './types';\nimport type { CreateTrackEventDTO } from '../schema/index';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log(e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
@@ -24,8 +24,8 @@ __export(visitor_exports, {
24
24
  setVisitor: () => setVisitor
25
25
  });
26
26
  module.exports = __toCommonJS(visitor_exports);
27
+ var import_utils = require("@shware/utils");
27
28
  var import_setup = require("../setup/index.cjs");
28
- var import_fetch = require("../utils/fetch.cjs");
29
29
  var key = "visitor_id";
30
30
  async function createVisitor() {
31
31
  const dto = {
@@ -34,7 +34,7 @@ async function createVisitor() {
34
34
  environment: import_setup.config.environment,
35
35
  properties: await import_setup.config.getTags()
36
36
  };
37
- const response = await (0, import_fetch.fetch)(`${import_setup.config.endpoint}/visitors`, {
37
+ const response = await (0, import_utils.fetch)(`${import_setup.config.endpoint}/visitors`, {
38
38
  method: "POST",
39
39
  credentials: "include",
40
40
  headers: await import_setup.config.getHeaders(),
@@ -47,7 +47,7 @@ async function createVisitor() {
47
47
  async function getOrCreateVisitor() {
48
48
  const visitorId = import_setup.config.storage.getItem(key);
49
49
  if (visitorId) {
50
- const response = await (0, import_fetch.fetch)(`${import_setup.config.endpoint}/visitors/${visitorId}`, {
50
+ const response = await (0, import_utils.fetch)(`${import_setup.config.endpoint}/visitors/${visitorId}`, {
51
51
  method: "GET",
52
52
  credentials: "include",
53
53
  headers: await import_setup.config.getHeaders()
@@ -69,7 +69,7 @@ async function getVisitor() {
69
69
  }
70
70
  async function setVisitor(dto) {
71
71
  const { id } = await getVisitor();
72
- const response = await (0, import_fetch.fetch)(`${import_setup.config.endpoint}/visitors/${id}`, {
72
+ const response = await (0, import_utils.fetch)(`${import_setup.config.endpoint}/visitors/${id}`, {
73
73
  method: "PATCH",
74
74
  credentials: "include",
75
75
  headers: await import_setup.config.getHeaders(),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport type { UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\nimport type { CreateVisitorDTO } from '../schema/index';\n\nconst key = 'visitor_id';\n\nasync function createVisitor(): Promise<Visitor> {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n platform: config.platform,\n environment: config.environment,\n properties: (await config.getTags()) as VisitorProperties,\n };\n\n const response = await fetch(`${config.endpoint}/visitors`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n const data = (await response.json()) as Visitor;\n config.storage.setItem(key, data.id);\n return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = config.storage.getItem(key);\n if (visitorId) {\n const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n method: 'GET',\n credentials: 'include',\n headers: await config.getHeaders(),\n });\n\n if (!response.ok) return createVisitor();\n return response.json() as Promise<Visitor>;\n } else {\n return createVisitor();\n }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (cache.visitor) return cache.visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n cache.visitor = await visitorFetcher;\n visitorFetcher = null;\n return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n const { id } = await getVisitor();\n const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n method: 'PATCH',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) throw new Error('Failed to set visitor');\n const data = (await response.json()) as Visitor;\n\n config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n cache.visitor = data;\n return data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8B;AAC9B,mBAAsB;AAItB,IAAM,MAAM;AAEZ,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,oBAAO,YAAY;AAAA,IACpC,UAAU,oBAAO;AAAA,IACjB,aAAa,oBAAO;AAAA,IACpB,YAAa,MAAM,oBAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,sBAAO,QAAQ,QAAQ,KAAK,KAAK,EAAE;AACnC,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,oBAAO,QAAQ,QAAQ,GAAG;AAC5C,MAAI,WAAW;AACb,UAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,mBAAM,QAAS,QAAO,mBAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,qBAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,mBAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,sBAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,qBAAM,UAAU;AAChB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { fetch } from '@shware/utils';\nimport { cache, config } from '../setup/index';\nimport type { UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\nimport type { CreateVisitorDTO } from '../schema/index';\n\nconst key = 'visitor_id';\n\nasync function createVisitor(): Promise<Visitor> {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n platform: config.platform,\n environment: config.environment,\n properties: (await config.getTags()) as VisitorProperties,\n };\n\n const response = await fetch(`${config.endpoint}/visitors`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n const data = (await response.json()) as Visitor;\n config.storage.setItem(key, data.id);\n return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = config.storage.getItem(key);\n if (visitorId) {\n const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n method: 'GET',\n credentials: 'include',\n headers: await config.getHeaders(),\n });\n\n if (!response.ok) return createVisitor();\n return response.json() as Promise<Visitor>;\n } else {\n return createVisitor();\n }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (cache.visitor) return cache.visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n cache.visitor = await visitorFetcher;\n visitorFetcher = null;\n return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n const { id } = await getVisitor();\n const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n method: 'PATCH',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) throw new Error('Failed to set visitor');\n const data = (await response.json()) as Visitor;\n\n config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n cache.visitor = data;\n return data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsB;AACtB,mBAA8B;AAI9B,IAAM,MAAM;AAEZ,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,oBAAO,YAAY;AAAA,IACpC,UAAU,oBAAO;AAAA,IACjB,aAAa,oBAAO;AAAA,IACpB,YAAa,MAAM,oBAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,sBAAO,QAAQ,QAAQ,KAAK,KAAK,EAAE;AACnC,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,oBAAO,QAAQ,QAAQ,GAAG;AAC5C,MAAI,WAAW;AACb,UAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,mBAAM,QAAS,QAAO,mBAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,qBAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,mBAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,sBAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,qBAAM,UAAU;AAChB,SAAO;AACT;","names":[]}
@@ -1,6 +1,6 @@
1
1
  // src/visitor/index.ts
2
+ import { fetch } from "@shware/utils";
2
3
  import { cache, config } from "../setup/index.mjs";
3
- import { fetch } from "../utils/fetch.mjs";
4
4
  var key = "visitor_id";
5
5
  async function createVisitor() {
6
6
  const dto = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport type { UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\nimport type { CreateVisitorDTO } from '../schema/index';\n\nconst key = 'visitor_id';\n\nasync function createVisitor(): Promise<Visitor> {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n platform: config.platform,\n environment: config.environment,\n properties: (await config.getTags()) as VisitorProperties,\n };\n\n const response = await fetch(`${config.endpoint}/visitors`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n const data = (await response.json()) as Visitor;\n config.storage.setItem(key, data.id);\n return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = config.storage.getItem(key);\n if (visitorId) {\n const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n method: 'GET',\n credentials: 'include',\n headers: await config.getHeaders(),\n });\n\n if (!response.ok) return createVisitor();\n return response.json() as Promise<Visitor>;\n } else {\n return createVisitor();\n }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (cache.visitor) return cache.visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n cache.visitor = await visitorFetcher;\n visitorFetcher = null;\n return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n const { id } = await getVisitor();\n const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n method: 'PATCH',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) throw new Error('Failed to set visitor');\n const data = (await response.json()) as Visitor;\n\n config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n cache.visitor = data;\n return data;\n}\n"],"mappings":";AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,aAAa;AAItB,IAAM,MAAM;AAEZ,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,OAAO,YAAY;AAAA,IACpC,UAAU,OAAO;AAAA,IACjB,aAAa,OAAO;AAAA,IACpB,YAAa,MAAM,OAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,SAAO,QAAQ,QAAQ,KAAK,KAAK,EAAE;AACnC,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,OAAO,QAAQ,QAAQ,GAAG;AAC5C,MAAI,WAAW;AACb,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,MAAM,QAAS,QAAO,MAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,QAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,MAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,SAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,QAAM,UAAU;AAChB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { fetch } from '@shware/utils';\nimport { cache, config } from '../setup/index';\nimport type { UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\nimport type { CreateVisitorDTO } from '../schema/index';\n\nconst key = 'visitor_id';\n\nasync function createVisitor(): Promise<Visitor> {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n platform: config.platform,\n environment: config.environment,\n properties: (await config.getTags()) as VisitorProperties,\n };\n\n const response = await fetch(`${config.endpoint}/visitors`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n const data = (await response.json()) as Visitor;\n config.storage.setItem(key, data.id);\n return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = config.storage.getItem(key);\n if (visitorId) {\n const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n method: 'GET',\n credentials: 'include',\n headers: await config.getHeaders(),\n });\n\n if (!response.ok) return createVisitor();\n return response.json() as Promise<Visitor>;\n } else {\n return createVisitor();\n }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (cache.visitor) return cache.visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n cache.visitor = await visitorFetcher;\n visitorFetcher = null;\n return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n const { id } = await getVisitor();\n const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n method: 'PATCH',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) throw new Error('Failed to set visitor');\n const data = (await response.json()) as Visitor;\n\n config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n cache.visitor = data;\n return data;\n}\n"],"mappings":";AAAA,SAAS,aAAa;AACtB,SAAS,OAAO,cAAc;AAI9B,IAAM,MAAM;AAEZ,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,OAAO,YAAY;AAAA,IACpC,UAAU,OAAO;AAAA,IACjB,aAAa,OAAO;AAAA,IACpB,YAAa,MAAM,OAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,SAAO,QAAQ,QAAQ,KAAK,KAAK,EAAE;AACnC,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,OAAO,QAAQ,QAAQ,GAAG;AAC5C,MAAI,WAAW;AACb,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,MAAM,QAAS,QAAO,MAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,QAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,MAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,SAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,QAAM,UAAU;AAChB,SAAO;AACT;","names":[]}
@@ -35,12 +35,12 @@ __export(web_exports, {
35
35
  storage: () => storage
36
36
  });
37
37
  module.exports = __toCommonJS(web_exports);
38
+ var import_utils = require("@shware/utils");
38
39
  var import_bowser = __toESM(require("bowser"), 1);
39
40
  var import_cookie = require("cookie");
40
41
  var import_uuid = require("uuid");
41
42
  var import_link = require("../link/index.cjs");
42
43
  var import_setup = require("../setup/index.cjs");
43
- var import_storage = require("../utils/storage.cjs");
44
44
  function getDeviceId() {
45
45
  const cached = localStorage.getItem("device_id");
46
46
  if (cached) return cached;
@@ -80,7 +80,7 @@ async function getTags() {
80
80
  source: "web",
81
81
  source_url: window.location.origin + window.location.pathname,
82
82
  // meta ads
83
- fbc: parsed._fbc ?? import_storage.expiringStorage.getItem("fbc") ?? void 0,
83
+ fbc: parsed._fbc ?? import_utils.expiringStorage.getItem("fbc") ?? void 0,
84
84
  fbp: parsed._fbp,
85
85
  fbclid: params.get("fbclid") ?? void 0,
86
86
  ad_id: params.get("ad_id") ?? void 0,
@@ -97,7 +97,7 @@ async function getTags() {
97
97
  gad_source: params.get("gad_source") ?? void 0,
98
98
  gad_campaignid: params.get("gad_campaignid") ?? void 0,
99
99
  // reddit ads
100
- rdt_cid: params.get("rdt_cid") ?? parsed._rdt_cid ?? import_storage.expiringStorage.getItem("rdt_cid") ?? void 0,
100
+ rdt_cid: params.get("rdt_cid") ?? parsed._rdt_cid ?? import_utils.expiringStorage.getItem("rdt_cid") ?? void 0,
101
101
  rdt_uuid: parsed._rdt_uuid,
102
102
  // linkedin ads: get click id from url params or first-party cookie
103
103
  li_fat_id: params.get("li_fat_id") ?? parsed.li_fat_id ?? void 0,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/web/index.ts"],"sourcesContent":["import Bowser from 'bowser';\nimport { parseCookie } from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { type Link, getLink } from '../link/index';\nimport { cache, config } from '../setup/index';\nimport { expiringStorage } from '../utils/storage';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem('device_id');\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem('device_id', id);\n return id;\n}\n\nexport async function getTags() {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = parseCookie(document.cookie);\n\n let link: Link | null = null;\n if (params.has('s')) link = await getLink(params.get('s')!);\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: window.devicePixelRatio,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release: config.release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.origin + window.location.pathname,\n // meta ads\n fbc: parsed._fbc ?? expiringStorage.getItem<string>('fbc') ?? undefined,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // google ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // reddit ads\n rdt_cid:\n params.get('rdt_cid') ??\n parsed._rdt_cid ??\n expiringStorage.getItem<string>('rdt_cid') ??\n undefined,\n rdt_uuid: parsed._rdt_uuid,\n // linkedin ads: get click id from url params or first-party cookie\n li_fat_id: params.get('li_fat_id') ?? parsed.li_fat_id ?? undefined,\n // click ids\n dclid: params.get('dclid') ?? undefined,\n ko_click_id: params.get('ko_click_id') ?? undefined,\n msclkid: params.get('msclkid') ?? undefined,\n sccid: params.get('sccid') ?? undefined,\n ttclid: params.get('ttclid') ?? undefined,\n twclid: params.get('twclid') ?? undefined,\n wbraid: params.get('wbraid') ?? undefined,\n yclid: params.get('yclid') ?? undefined,\n // utm params\n utm_source: link?.utm_source ?? params.get('utm_source') ?? undefined,\n utm_medium: link?.utm_medium ?? params.get('utm_medium') ?? undefined,\n utm_campaign: link?.utm_campaign ?? params.get('utm_campaign') ?? undefined,\n utm_term: link?.utm_term ?? params.get('utm_term') ?? undefined,\n utm_content: link?.utm_content ?? params.get('utm_content') ?? undefined,\n utm_id: link?.utm_id ?? params.get('utm_id') ?? undefined,\n utm_source_platform:\n link?.utm_source_platform ?? params.get('utm_source_platform') ?? undefined,\n utm_creative_format:\n link?.utm_creative_format ?? params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic:\n link?.utm_marketing_tactic ?? params.get('utm_marketing_tactic') ?? undefined,\n };\n\n cache.tags = tags;\n return tags;\n}\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n"],"mappings":"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","names":["uuidv4","Bowser"]}
1
+ {"version":3,"sources":["../../src/web/index.ts"],"sourcesContent":["import { expiringStorage } from '@shware/utils';\nimport Bowser from 'bowser';\nimport { parseCookie } from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { type Link, getLink } from '../link/index';\nimport { cache, config } from '../setup/index';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem('device_id');\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem('device_id', id);\n return id;\n}\n\nexport async function getTags() {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = parseCookie(document.cookie);\n\n let link: Link | null = null;\n if (params.has('s')) link = await getLink(params.get('s')!);\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: window.devicePixelRatio,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release: config.release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.origin + window.location.pathname,\n // meta ads\n fbc: parsed._fbc ?? expiringStorage.getItem<string>('fbc') ?? undefined,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // google ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // reddit ads\n rdt_cid:\n params.get('rdt_cid') ??\n parsed._rdt_cid ??\n expiringStorage.getItem<string>('rdt_cid') ??\n undefined,\n rdt_uuid: parsed._rdt_uuid,\n // linkedin ads: get click id from url params or first-party cookie\n li_fat_id: params.get('li_fat_id') ?? parsed.li_fat_id ?? undefined,\n // click ids\n dclid: params.get('dclid') ?? undefined,\n ko_click_id: params.get('ko_click_id') ?? undefined,\n msclkid: params.get('msclkid') ?? undefined,\n sccid: params.get('sccid') ?? undefined,\n ttclid: params.get('ttclid') ?? undefined,\n twclid: params.get('twclid') ?? undefined,\n wbraid: params.get('wbraid') ?? undefined,\n yclid: params.get('yclid') ?? undefined,\n // utm params\n utm_source: link?.utm_source ?? params.get('utm_source') ?? undefined,\n utm_medium: link?.utm_medium ?? params.get('utm_medium') ?? undefined,\n utm_campaign: link?.utm_campaign ?? params.get('utm_campaign') ?? undefined,\n utm_term: link?.utm_term ?? params.get('utm_term') ?? undefined,\n utm_content: link?.utm_content ?? params.get('utm_content') ?? undefined,\n utm_id: link?.utm_id ?? params.get('utm_id') ?? undefined,\n utm_source_platform:\n link?.utm_source_platform ?? params.get('utm_source_platform') ?? undefined,\n utm_creative_format:\n link?.utm_creative_format ?? params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic:\n link?.utm_marketing_tactic ?? params.get('utm_marketing_tactic') ?? undefined,\n };\n\n cache.tags = tags;\n return tags;\n}\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgC;AAChC,oBAAmB;AACnB,oBAA4B;AAC5B,kBAA6B;AAC7B,kBAAmC;AACnC,mBAA8B;AAIvB,SAAS,cAAc;AAC5B,QAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,MAAI,OAAQ,QAAO;AACnB,QAAM,MAAK,iCAAQ,cAAa,OAAO,WAAW,QAAI,YAAAA,IAAO;AAC7D,eAAa,QAAQ,aAAa,EAAE;AACpC,SAAO;AACT;AAEA,eAAsB,UAAU;AAC9B,QAAM,SAAS,cAAAC,QAAO,UAAU,OAAO,UAAU,SAAS;AAC1D,QAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,UAAU,OAAO,WAAW;AAClC,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,aAAS,2BAAY,SAAS,MAAM;AAE1C,MAAI,OAAoB;AACxB,MAAI,OAAO,IAAI,GAAG,EAAG,QAAO,UAAM,qBAAQ,OAAO,IAAI,GAAG,CAAE;AAE1D,QAAM,OAAkB;AAAA,IACtB,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,OAAO;AAAA,IAC5B,SAAS,GAAG;AAAA,IACZ,YAAY,GAAG;AAAA,IACf,SAAS,GAAG,QAAQ,IAAI,IAAI,QAAQ,OAAO;AAAA,IAC3C,cAAc,QAAQ;AAAA,IACtB,iBAAiB,QAAQ;AAAA,IACzB,UAAU;AAAA,IACV,QAAQ,SAAS;AAAA,IACjB,WAAW,YAAY;AAAA,IACvB,aAAa,SAAS;AAAA,IACtB,eAAe,SAAS;AAAA,IACxB,oBAAoB,OAAO;AAAA,IAC3B,cAAc,OAAO,OAAO;AAAA,IAC5B,eAAe,OAAO,OAAO;AAAA,IAC7B,mBAAmB,GAAG,OAAO,OAAO,KAAK,IAAI,OAAO,OAAO,MAAM;AAAA,IACjE,SAAS,oBAAO;AAAA,IAChB,UAAU,UAAU;AAAA,IACpB,WAAW,KAAK,eAAe,EAAE,gBAAgB,EAAE;AAAA,IACnD,aAAa,QAAQ,IAAI,aAAa,gBAAgB,gBAAgB;AAAA,IACtE,QAAQ;AAAA,IACR,YAAY,OAAO,SAAS,SAAS,OAAO,SAAS;AAAA;AAAA,IAErD,KAAK,OAAO,QAAQ,6BAAgB,QAAgB,KAAK,KAAK;AAAA,IAC9D,KAAK,OAAO;AAAA,IACZ,QAAQ,OAAO,IAAI,QAAQ,KAAK;AAAA,IAChC,OAAO,OAAO,IAAI,OAAO,KAAK;AAAA,IAC9B,SAAS,OAAO,IAAI,SAAS,KAAK;AAAA,IAClC,UAAU,OAAO,IAAI,UAAU,KAAK;AAAA,IACpC,YAAY,OAAO,IAAI,YAAY,KAAK;AAAA,IACxC,aAAa,OAAO,IAAI,aAAa,KAAK;AAAA,IAC1C,eAAe,OAAO,IAAI,eAAe,KAAK;AAAA,IAC9C,WAAW,OAAO,IAAI,WAAW,KAAK;AAAA,IACtC,kBAAkB,OAAO,IAAI,kBAAkB,KAAK;AAAA;AAAA,IAEpD,OAAO,OAAO,IAAI,OAAO,KAAK;AAAA,IAC9B,QAAQ,OAAO,IAAI,QAAQ,KAAK;AAAA,IAChC,YAAY,OAAO,IAAI,YAAY,KAAK;AAAA,IACxC,gBAAgB,OAAO,IAAI,gBAAgB,KAAK;AAAA;AAAA,IAEhD,SACE,OAAO,IAAI,SAAS,KACpB,OAAO,YACP,6BAAgB,QAAgB,SAAS,KACzC;AAAA,IACF,UAAU,OAAO;AAAA;AAAA,IAEjB,WAAW,OAAO,IAAI,WAAW,KAAK,OAAO,aAAa;AAAA;AAAA,IAE1D,OAAO,OAAO,IAAI,OAAO,KAAK;AAAA,IAC9B,aAAa,OAAO,IAAI,aAAa,KAAK;AAAA,IAC1C,SAAS,OAAO,IAAI,SAAS,KAAK;AAAA,IAClC,OAAO,OAAO,IAAI,OAAO,KAAK;AAAA,IAC9B,QAAQ,OAAO,IAAI,QAAQ,KAAK;AAAA,IAChC,QAAQ,OAAO,IAAI,QAAQ,KAAK;AAAA,IAChC,QAAQ,OAAO,IAAI,QAAQ,KAAK;AAAA,IAChC,OAAO,OAAO,IAAI,OAAO,KAAK;AAAA;AAAA,IAE9B,aAAY,6BAAM,eAAc,OAAO,IAAI,YAAY,KAAK;AAAA,IAC5D,aAAY,6BAAM,eAAc,OAAO,IAAI,YAAY,KAAK;AAAA,IAC5D,eAAc,6BAAM,iBAAgB,OAAO,IAAI,cAAc,KAAK;AAAA,IAClE,WAAU,6BAAM,aAAY,OAAO,IAAI,UAAU,KAAK;AAAA,IACtD,cAAa,6BAAM,gBAAe,OAAO,IAAI,aAAa,KAAK;AAAA,IAC/D,SAAQ,6BAAM,WAAU,OAAO,IAAI,QAAQ,KAAK;AAAA,IAChD,sBACE,6BAAM,wBAAuB,OAAO,IAAI,qBAAqB,KAAK;AAAA,IACpE,sBACE,6BAAM,wBAAuB,OAAO,IAAI,qBAAqB,KAAK;AAAA,IACpE,uBACE,6BAAM,yBAAwB,OAAO,IAAI,sBAAsB,KAAK;AAAA,EACxE;AAEA,qBAAM,OAAO;AACb,SAAO;AACT;AAEA,IAAM,MAAM,oBAAI,IAAoB;AAE7B,IAAM,UAAmB;AAAA,EAC9B,SAAS,CAAC,QAAQ;AAChB,QAAI;AACF,aAAO,aAAa,QAAQ,GAAG;AAAA,IACjC,QAAQ;AACN,cAAQ,MAAM,+BAA+B;AAC7C,aAAO,IAAI,IAAI,GAAG,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EACA,SAAS,CAAC,KAAK,UAAU;AACvB,QAAI;AACF,mBAAa,QAAQ,KAAK,KAAK;AAAA,IACjC,QAAQ;AACN,cAAQ,MAAM,+BAA+B;AAC7C,UAAI,IAAI,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AACF;","names":["uuidv4","Bowser"]}
@@ -1,10 +1,10 @@
1
1
  // src/web/index.ts
2
+ import { expiringStorage } from "@shware/utils";
2
3
  import Bowser from "bowser";
3
4
  import { parseCookie } from "cookie";
4
5
  import { v4 as uuidv4 } from "uuid";
5
6
  import { getLink } from "../link/index.mjs";
6
7
  import { cache, config } from "../setup/index.mjs";
7
- import { expiringStorage } from "../utils/storage.mjs";
8
8
  function getDeviceId() {
9
9
  const cached = localStorage.getItem("device_id");
10
10
  if (cached) return cached;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/web/index.ts"],"sourcesContent":["import Bowser from 'bowser';\nimport { parseCookie } from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { type Link, getLink } from '../link/index';\nimport { cache, config } from '../setup/index';\nimport { expiringStorage } from '../utils/storage';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem('device_id');\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem('device_id', id);\n return id;\n}\n\nexport async function getTags() {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = parseCookie(document.cookie);\n\n let link: Link | null = null;\n if (params.has('s')) link = await getLink(params.get('s')!);\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: window.devicePixelRatio,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release: config.release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.origin + window.location.pathname,\n // meta ads\n fbc: parsed._fbc ?? expiringStorage.getItem<string>('fbc') ?? undefined,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // google ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // reddit ads\n rdt_cid:\n params.get('rdt_cid') ??\n parsed._rdt_cid ??\n expiringStorage.getItem<string>('rdt_cid') ??\n undefined,\n rdt_uuid: parsed._rdt_uuid,\n // linkedin ads: get click id from url params or first-party cookie\n li_fat_id: params.get('li_fat_id') ?? parsed.li_fat_id ?? undefined,\n // click ids\n dclid: params.get('dclid') ?? undefined,\n ko_click_id: params.get('ko_click_id') ?? undefined,\n msclkid: params.get('msclkid') ?? undefined,\n sccid: params.get('sccid') ?? undefined,\n ttclid: params.get('ttclid') ?? undefined,\n twclid: params.get('twclid') ?? undefined,\n wbraid: params.get('wbraid') ?? undefined,\n yclid: params.get('yclid') ?? undefined,\n // utm params\n utm_source: link?.utm_source ?? params.get('utm_source') ?? undefined,\n utm_medium: link?.utm_medium ?? params.get('utm_medium') ?? undefined,\n utm_campaign: link?.utm_campaign ?? params.get('utm_campaign') ?? undefined,\n utm_term: link?.utm_term ?? params.get('utm_term') ?? undefined,\n utm_content: link?.utm_content ?? params.get('utm_content') ?? undefined,\n utm_id: link?.utm_id ?? params.get('utm_id') ?? undefined,\n utm_source_platform:\n link?.utm_source_platform ?? params.get('utm_source_platform') ?? undefined,\n utm_creative_format:\n link?.utm_creative_format ?? params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic:\n link?.utm_marketing_tactic ?? params.get('utm_marketing_tactic') ?? undefined,\n };\n\n cache.tags = tags;\n return tags;\n}\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/web/index.ts"],"sourcesContent":["import { expiringStorage } from '@shware/utils';\nimport Bowser from 'bowser';\nimport { parseCookie } from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { type Link, getLink } from '../link/index';\nimport { cache, config } from '../setup/index';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem('device_id');\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem('device_id', id);\n return id;\n}\n\nexport async function getTags() {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = parseCookie(document.cookie);\n\n let link: Link | null = null;\n if (params.has('s')) link = await getLink(params.get('s')!);\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: window.devicePixelRatio,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release: config.release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.origin + window.location.pathname,\n // meta ads\n fbc: parsed._fbc ?? expiringStorage.getItem<string>('fbc') ?? undefined,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // google ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // reddit ads\n rdt_cid:\n params.get('rdt_cid') ??\n parsed._rdt_cid ??\n expiringStorage.getItem<string>('rdt_cid') ??\n undefined,\n rdt_uuid: parsed._rdt_uuid,\n // linkedin ads: get click id from url params or first-party cookie\n li_fat_id: params.get('li_fat_id') ?? parsed.li_fat_id ?? undefined,\n // click ids\n dclid: params.get('dclid') ?? undefined,\n ko_click_id: params.get('ko_click_id') ?? undefined,\n msclkid: params.get('msclkid') ?? undefined,\n sccid: params.get('sccid') ?? undefined,\n ttclid: params.get('ttclid') ?? undefined,\n twclid: params.get('twclid') ?? undefined,\n wbraid: params.get('wbraid') ?? undefined,\n yclid: params.get('yclid') ?? undefined,\n // utm params\n utm_source: link?.utm_source ?? params.get('utm_source') ?? undefined,\n utm_medium: link?.utm_medium ?? params.get('utm_medium') ?? undefined,\n utm_campaign: link?.utm_campaign ?? params.get('utm_campaign') ?? undefined,\n utm_term: link?.utm_term ?? params.get('utm_term') ?? undefined,\n utm_content: link?.utm_content ?? params.get('utm_content') ?? undefined,\n utm_id: link?.utm_id ?? params.get('utm_id') ?? undefined,\n utm_source_platform:\n link?.utm_source_platform ?? params.get('utm_source_platform') ?? undefined,\n utm_creative_format:\n link?.utm_creative_format ?? params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic:\n link?.utm_marketing_tactic ?? params.get('utm_marketing_tactic') ?? undefined,\n };\n\n cache.tags = tags;\n return tags;\n}\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shware/analytics",
3
- "version": "2.16.2",
3
+ "version": "2.17.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "repository": {
@@ -70,8 +70,8 @@
70
70
  "@types/node": "^24.10.2",
71
71
  "@types/react": "^19.2.7",
72
72
  "typescript": "^5.9.3",
73
- "@repo/typescript-config": "0.0.0",
74
- "@repo/eslint-config": "0.0.10"
73
+ "@repo/eslint-config": "0.0.10",
74
+ "@repo/typescript-config": "0.0.0"
75
75
  },
76
76
  "peerDependencies": {
77
77
  "@react-native-firebase/analytics": "^23.3.1",
@@ -1,78 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/utils/fetch.ts
21
- var fetch_exports = {};
22
- __export(fetch_exports, {
23
- fetch: () => fetch
24
- });
25
- module.exports = __toCommonJS(fetch_exports);
26
- function defaultRetryCondition(response) {
27
- return response.status === 408 || response.status === 429 || response.status >= 500;
28
- }
29
- function parseRetryAfter(response) {
30
- if (!response) return null;
31
- const header = response.headers.get("retry-after");
32
- if (!header) return null;
33
- const seconds = Number(header);
34
- if (!Number.isNaN(seconds)) return Math.max(0, seconds * 1e3);
35
- const dateMs = Date.parse(header);
36
- if (!Number.isNaN(dateMs)) return Math.max(0, dateMs - Date.now());
37
- return null;
38
- }
39
- async function fetch(input, {
40
- retries = 3,
41
- delayFactor = 500,
42
- maxDelay = 3e4,
43
- retryCondition = defaultRetryCondition,
44
- ...init
45
- } = {}) {
46
- let retryCount = 0;
47
- let lastError = null;
48
- let lastResponse = null;
49
- while (retryCount <= retries) {
50
- try {
51
- const response = await globalThis.fetch(input, init);
52
- lastResponse = response;
53
- if (response.ok || !retryCondition(response) || retryCount === retries) {
54
- return response;
55
- }
56
- const retryAfter = parseRetryAfter(response);
57
- const delay = delayFactor * Math.pow(2, retryCount);
58
- const jitter = delay * 0.25 * (Math.random() * 2 - 1);
59
- const timeout = Math.min(retryAfter ?? delay + jitter, maxDelay);
60
- await new Promise((resolve) => setTimeout(resolve, timeout));
61
- } catch (error) {
62
- lastError = error;
63
- if (retryCount === retries) throw error;
64
- const delay = delayFactor * Math.pow(2, retryCount);
65
- const jitter = delay * 0.25 * (Math.random() * 2 - 1);
66
- const timeout = Math.min(delay + jitter, maxDelay);
67
- await new Promise((resolve) => setTimeout(resolve, timeout));
68
- }
69
- retryCount++;
70
- }
71
- if (lastResponse) return lastResponse;
72
- throw lastError ?? new Error("Fetch failed");
73
- }
74
- // Annotate the CommonJS export names for ESM import in node:
75
- 0 && (module.exports = {
76
- fetch
77
- });
78
- //# sourceMappingURL=fetch.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/fetch.ts"],"sourcesContent":["export interface RetryOptions {\n /** The number of times to retry before failing, default: 3 */\n retries?: number;\n\n /** The delay factor in milliseconds, default: 500 */\n delayFactor?: number;\n\n /** The maximum delay in milliseconds, default: 30_000 (30s) */\n maxDelay?: number;\n\n /**\n * A callback to further control if a request should be retried.\n * default: 408 (Request Timeout) or 429 (Too Many Requests) or 5xx (Server Error).\n */\n retryCondition?: (response: Response) => boolean;\n}\n\nfunction defaultRetryCondition(response: Response): boolean {\n return response.status === 408 || response.status === 429 || response.status >= 500;\n}\n\nfunction parseRetryAfter(response: Response | null): number | null {\n if (!response) return null;\n const header = response.headers.get('retry-after');\n if (!header) return null;\n\n // if the retry after header is a number, convert it to milliseconds\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return Math.max(0, seconds * 1000);\n\n // if the retry after header is a date, get the number of milliseconds until that date\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) return Math.max(0, dateMs - Date.now());\n\n return null;\n}\n\nexport async function fetch(\n input: RequestInfo,\n {\n retries = 3,\n delayFactor = 500,\n maxDelay = 30_000,\n retryCondition = defaultRetryCondition,\n ...init\n }: RequestInit & RetryOptions = {}\n): Promise<Response> {\n let retryCount = 0;\n let lastError: unknown | null = null;\n let lastResponse: Response | null = null;\n\n while (retryCount <= retries) {\n try {\n const response = await globalThis.fetch(input, init);\n lastResponse = response;\n if (response.ok || !retryCondition(response) || retryCount === retries) {\n return response;\n }\n\n const retryAfter = parseRetryAfter(response);\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(retryAfter ?? delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n } catch (error) {\n lastError = error;\n if (retryCount === retries) throw error;\n\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n retryCount++;\n }\n\n if (lastResponse) return lastResponse;\n throw lastError ?? new Error('Fetch failed');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,SAAS,sBAAsB,UAA6B;AAC1D,SAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU;AAClF;AAEA,SAAS,gBAAgB,UAA0C;AACjE,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SAAS,SAAS,QAAQ,IAAI,aAAa;AACjD,MAAI,CAAC,OAAQ,QAAO;AAGpB,QAAM,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,OAAO,MAAM,OAAO,EAAG,QAAO,KAAK,IAAI,GAAG,UAAU,GAAI;AAG7D,QAAM,SAAS,KAAK,MAAM,MAAM;AAChC,MAAI,CAAC,OAAO,MAAM,MAAM,EAAG,QAAO,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;AAEjE,SAAO;AACT;AAEA,eAAsB,MACpB,OACA;AAAA,EACE,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,GAAG;AACL,IAAgC,CAAC,GACd;AACnB,MAAI,aAAa;AACjB,MAAI,YAA4B;AAChC,MAAI,eAAgC;AAEpC,SAAO,cAAc,SAAS;AAC5B,QAAI;AACF,YAAM,WAAW,MAAM,WAAW,MAAM,OAAO,IAAI;AACnD,qBAAe;AACf,UAAI,SAAS,MAAM,CAAC,eAAe,QAAQ,KAAK,eAAe,SAAS;AACtE,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,gBAAgB,QAAQ;AAC3C,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,cAAc,QAAQ,QAAQ,QAAQ;AAC/D,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,kBAAY;AACZ,UAAI,eAAe,QAAS,OAAM;AAElC,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ;AACjD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D;AAEA;AAAA,EACF;AAEA,MAAI,aAAc,QAAO;AACzB,QAAM,aAAa,IAAI,MAAM,cAAc;AAC7C;","names":[]}
@@ -1,16 +0,0 @@
1
- interface RetryOptions {
2
- /** The number of times to retry before failing, default: 3 */
3
- retries?: number;
4
- /** The delay factor in milliseconds, default: 500 */
5
- delayFactor?: number;
6
- /** The maximum delay in milliseconds, default: 30_000 (30s) */
7
- maxDelay?: number;
8
- /**
9
- * A callback to further control if a request should be retried.
10
- * default: 408 (Request Timeout) or 429 (Too Many Requests) or 5xx (Server Error).
11
- */
12
- retryCondition?: (response: Response) => boolean;
13
- }
14
- declare function fetch(input: RequestInfo, { retries, delayFactor, maxDelay, retryCondition, ...init }?: RequestInit & RetryOptions): Promise<Response>;
15
-
16
- export { type RetryOptions, fetch };
@@ -1,16 +0,0 @@
1
- interface RetryOptions {
2
- /** The number of times to retry before failing, default: 3 */
3
- retries?: number;
4
- /** The delay factor in milliseconds, default: 500 */
5
- delayFactor?: number;
6
- /** The maximum delay in milliseconds, default: 30_000 (30s) */
7
- maxDelay?: number;
8
- /**
9
- * A callback to further control if a request should be retried.
10
- * default: 408 (Request Timeout) or 429 (Too Many Requests) or 5xx (Server Error).
11
- */
12
- retryCondition?: (response: Response) => boolean;
13
- }
14
- declare function fetch(input: RequestInfo, { retries, delayFactor, maxDelay, retryCondition, ...init }?: RequestInit & RetryOptions): Promise<Response>;
15
-
16
- export { type RetryOptions, fetch };