Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@snowplow/tracker-core

Package Overview
Dependencies
Maintainers
0
Versions
76
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@snowplow/tracker-core - npm Package Compare versions

Comparing version 3.24.2 to 3.24.3-dev.0

284

dist/index.d.ts

@@ -29,3 +29,3 @@ declare const version: string;

/**
* Called just before the trackerCore callback fires
* Called before the `filter` method is called and before the trackerCore callback fires (if the filter passes)
* @param payloadBuilder - The payloadBuilder which will be sent to the callback, can be modified

@@ -40,2 +40,8 @@ */

/**
* Called before the payload is sent to the callback to decide whether to send the payload or skip it
* @param payload - The final event payload, can't be modified.
* @returns True if the payload should be sent, false if it should be skipped
*/
filter?: (payload: Payload) => boolean;
/**
* Called when constructing the context for each event

@@ -55,3 +61,5 @@ * Useful for adding additional context to events

*/
type SelfDescribingJson<T extends Record<keyof T, unknown> = Record<string, unknown>> = {
type SelfDescribingJson<T extends {
[_: string]: unknown;
} = Record<string, unknown>> = {
/**

@@ -71,3 +79,5 @@ * The schema string

*/
type SelfDescribingJsonArray<T extends Record<keyof T, unknown> = Record<string, unknown>> = {
type SelfDescribingJsonArray<T extends {
[_: string]: unknown;
} = Record<string, unknown>> = {
/**

@@ -81,3 +91,3 @@ * The schema string

*/
data: Array<T>;
data: (T extends SelfDescribingJson ? T : SelfDescribingJson<T>)[];
};

@@ -103,3 +113,5 @@ /**

/** Additional data points to set when tracking an event */
interface CommonEventProperties<T = Record<string, unknown>> {
interface CommonEventProperties<T extends {
[_: string]: unknown;
} = Record<string, unknown>> {
/** Add context to an event by setting an Array of Self Describing JSON */

@@ -122,3 +134,3 @@ context?: Array<SelfDescribingJson<T>> | null;

* @param timestamp - Timestamp of the event
* @returns Payload after the callback is applied
* @returns Payload after the callback is applied or undefined if the event is skipped
*/

@@ -128,3 +140,3 @@ track: (/** A PayloadBuilder created by one of the `buildX` functions */

context?: Array<SelfDescribingJson> | null, /** Timestamp override */
timestamp?: Timestamp | null) => Payload;
timestamp?: Timestamp | null) => Payload | undefined;
/**

@@ -237,3 +249,3 @@ * Set a persistent key-value pair to be added to every payload

*/
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive> | Record<string, ConditionalContextProvider | ContextPrimitive>): void;
/**

@@ -247,3 +259,3 @@ * Removes all global contexts

*/
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive | string>): void;
/**

@@ -988,3 +1000,3 @@ * Add a plugin into the plugin collection after Core has already been initialised

*/
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive> | Record<string, ConditionalContextProvider | ContextPrimitive>): void;
/**

@@ -998,3 +1010,3 @@ * Removes all global contexts

*/
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive | string>): void;
/**

@@ -1119,2 +1131,250 @@ * Returns all applicable global contexts for a specified event

declare function matchSchemaAgainstRule(rule: string, schema: string): boolean;
export { version, ContextEvent, ContextGenerator, ContextFilter, ContextPrimitive, FilterProvider, RuleSet, RuleSetProvider, ConditionalContextProvider, DynamicContext, GlobalContexts, globalContexts, PluginContexts, pluginContexts, resolveDynamicContext, getSchemaParts, validateVendorParts, validateVendor, getRuleParts, isValidRule, isStringArray, isValidRuleSetArg, isSelfDescribingJson, isRuleSet, isContextCallbackFunction, isContextPrimitive, isFilterProvider, isRuleSetProvider, isConditionalContextProvider, matchSchemaAgainstRuleSet, matchSchemaAgainstRule, CorePlugin, Payload, EventJsonWithKeys, EventJson, JsonProcessor, PayloadBuilder, payloadBuilder, payloadJsonProcessor, isNonEmptyJson, isJson, SelfDescribingJson, SelfDescribingJsonArray, Timestamp, TrueTimestamp, DeviceTimestamp, CommonEventProperties, TrackerCore, CoreConfiguration, CorePluginConfiguration, trackerCore, SelfDescribingEvent, buildSelfDescribingEvent, PageViewEvent, buildPageView, PagePingEvent, buildPagePing, StructuredEvent, buildStructEvent, EcommerceTransactionEvent, buildEcommerceTransaction, EcommerceTransactionItemEvent, buildEcommerceTransactionItem, ScreenViewEvent, buildScreenView, LinkClickEvent, buildLinkClick, AdImpressionEvent, buildAdImpression, AdClickEvent, buildAdClick, AdConversionEvent, buildAdConversion, SocialInteractionEvent, buildSocialInteraction, AddToCartEvent, buildAddToCart, RemoveFromCartEvent, buildRemoveFromCart, FormFocusOrChangeEvent, buildFormFocusOrChange, FormElement, FormSubmissionEvent, buildFormSubmission, SiteSearchEvent, buildSiteSearch, ConsentWithdrawnEvent, EventPayloadAndContext, buildConsentWithdrawn, ConsentGrantedEvent, buildConsentGranted, removeEmptyProperties, LOG_LEVEL, Logger, LOG };
interface EventStorePayload {
/**
* The event payload to be stored
*/
payload: Payload;
/**
* If the request should undergo server anonymization.
* @defaultValue false
*/
svrAnon?: boolean;
}
/**
* Create a new EventStorePayload
*/
declare function newEventStorePayload({ payload, svrAnon }: EventStorePayload): EventStorePayload;
interface EventStoreIterator {
/**
* Retrieve the next event in the store
*/
next: () => Promise<{
value: EventStorePayload | undefined;
done: boolean;
}>;
}
/**
* EventStore allows storing and retrieving events before they are sent to the collector
*/
interface EventStore {
/**
* Count all events in the store
*/
count: () => Promise<number>;
/**
* Add an event to the store
* @returns the number of events in the store after adding
*/
add: (payload: EventStorePayload) => Promise<number>;
/**
* Remove the first `count` events from the store
*/
removeHead: (count: number) => Promise<void>;
/**
* Get an iterator over all events in the store
*/
iterator: () => EventStoreIterator;
/**
* Retrieve all payloads including their meta configuration in the store
*/
getAll: () => Promise<readonly EventStorePayload[]>;
/**
* Retrieve all pure payloads in the store
*/
getAllPayloads: () => Promise<readonly Payload[]>;
}
interface EventStoreConfiguration {
/**
* The maximum amount of events that will be buffered in the event store
*
* This is useful to ensure the Tracker doesn't fill the 5MB or 10MB available to
* each website should the collector be unavailable due to lost connectivity.
* Will drop old events once the limit is hit
*/
maxSize?: number;
}
interface InMemoryEventStoreConfiguration {
/**
* Initial events to add to the store
*/
events?: EventStorePayload[];
}
declare function newInMemoryEventStore({ maxSize, events }: EventStoreConfiguration & InMemoryEventStoreConfiguration): EventStore;
/**
* A collection of event payloads which are sent to the collector.
*/
type EventBatch = Payload[];
/**
* The data that will be available to the `onRequestFailure` callback
*/
type RequestFailure = {
/** The batch of events that failed to send */
events: EventBatch;
/** The status code of the failed request */
status?: number;
/** The error message of the failed request */
message?: string;
/** Whether the tracker will retry the request */
willRetry: boolean;
};
/* The supported methods which events can be sent with */
type EventMethod = "post" | "get";
interface EmitterConfigurationBase {
/**
* The preferred technique to use to send events
* @defaultValue post
*/
eventMethod?: EventMethod;
/**
* The post path which events will be sent to.
* Ensure your collector is configured to accept events on this post path
* @defaultValue '/com.snowplowanalytics.snowplow/tp2'
*/
postPath?: string;
/**
* The amount of events that should be buffered before sending
* Recommended to leave as 1 to reduce change of losing events
* @defaultValue 1 on Web, 10 on Node
*/
bufferSize?: number;
/**
* The max size a POST request can be before the tracker will force send it
* @defaultValue 40000
*/
maxPostBytes?: number;
/**
* The max size a GET request (its complete URL) can be. Requests over this size will be tried as a POST request.
* @defaultValue unlimited
*/
maxGetBytes?: number;
/**
* Should the Sent Timestamp be attached to events.
* Only applies for GET events.
* @defaultValue true
*/
useStm?: boolean;
/**
* How long to wait before aborting requests to the collector
* @defaultValue 5000 (milliseconds)
*/
connectionTimeout?: number;
/**
* An object of key value pairs which represent headers to
* attach when sending a POST request, only works for POST
* @defaultValue `{}`
*/
customHeaders?: Record<string, string>;
/**
* Controls whether or not the browser sends credentials (defaults to 'include')
* @defaultValue 'include'
*/
credentials?: "omit" | "same-origin" | "include";
/**
* Whether to retry failed requests to the collector.
*
* Failed requests are requests that failed due to
* [timeouts](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout_event),
* [network errors](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/error_event),
* and [abort events](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort_event).
*
* Takes precedent over `retryStatusCodes` and `dontRetryStatusCodes`.
*
* @defaultValue true
*/
retryFailedRequests?: boolean;
/**
* List of HTTP response status codes for which events sent to Collector should be retried in future requests.
* Only non-success status codes are considered (greater or equal to 300).
* The retry codes are only considered for GET and POST requests.
* They take priority over the `dontRetryStatusCodes` option.
* By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422.
*/
retryStatusCodes?: number[];
/**
* List of HTTP response status codes for which events sent to Collector should not be retried in future request.
* Only non-success status codes are considered (greater or equal to 300).
* The don't retry codes are only considered for GET and POST requests.
* By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422 (these don't retry codes will remain even if you set your own `dontRetryStatusCodes` but can be changed using the `retryStatusCodes`).
*/
dontRetryStatusCodes?: number[];
/**
* Id service full URL. This URL will be added to the queue and will be called using a GET method.
* This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies.
*
* The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option.
*/
idService?: string;
/**
* Indicates that the request should be allowed to outlive the webpage that initiated it.
* Enables collector requests to complete even if the page is closed or navigated away from.
* @defaultValue true (not supported in Node.js)
*/
keepalive?: boolean;
/**
* Enables overriding the default fetch function with a custom implementation.
* @param input - Instance of Request
* @param options - Additional options for the request
* @returns A Promise that resolves to the Response.
*/
customFetch?: (input: Request, options?: RequestInit) => Promise<Response>;
/**
* A callback function to be executed whenever a request is successfully sent to the collector.
* In practice this means any request which returns a 2xx status code will trigger this callback.
*
* @param data - The event batch that was successfully sent
*/
onRequestSuccess?: (data: EventBatch, response: Response) => void;
/**
* A callback function to be executed whenever a request fails to be sent to the collector.
* This is the inverse of the onRequestSuccess callback, so any non 2xx status code will trigger this callback.
*
* @param data - The data associated with the event(s) that failed to send
*/
onRequestFailure?: (data: RequestFailure, response?: Response) => void;
/**
* Enables providing a custom EventStore implementation to store events before sending them to the collector.
*/
eventStore?: EventStore;
}
interface EmitterConfiguration extends EmitterConfigurationBase {
/* The collector URL to which events will be sent */
endpoint: string;
/* http or https. Defaults to https */
protocol?: "http" | "https";
/* Collector port number */
port?: number;
/* If the request should undergo server anonymization. */
serverAnonymization?: boolean;
}
/**
* Emitter is responsible for sending events to the collector.
* It manages the event queue and sends events in batches depending on configuration.
*/
interface Emitter {
/**
* Forces the emitter to send all events in the event store to the collector.
* @returns A Promise that resolves when all events have been sent to the collector.
*/
flush: () => Promise<void>;
/**
* Adds a payload to the event store or sends it to the collector.
* @param payload - A payload to be sent to the collector
* @returns Promise that resolves when the payload has been added to the event store or sent to the collector
*/
input: (payload: Payload) => Promise<void>;
/**
* Updates the collector URL to which events will be sent.
* @param url - New collector URL
*/
setCollectorUrl: (url: string) => void;
/**
* Sets the server anonymization flag.
*/
setAnonymousTracking: (anonymous: boolean) => void;
/**
* Updates the buffer size of the emitter.
*/
setBufferSize: (bufferSize: number) => void;
}
declare function newEmitter({ endpoint, eventMethod, protocol, port, maxPostBytes, maxGetBytes, bufferSize, customHeaders, serverAnonymization, connectionTimeout, keepalive, idService, dontRetryStatusCodes, retryStatusCodes, retryFailedRequests, onRequestFailure, onRequestSuccess, customFetch, useStm, eventStore, credentials }: EmitterConfiguration): Emitter;
export { version, ContextEvent, ContextGenerator, ContextFilter, ContextPrimitive, FilterProvider, RuleSet, RuleSetProvider, ConditionalContextProvider, DynamicContext, GlobalContexts, globalContexts, PluginContexts, pluginContexts, resolveDynamicContext, getSchemaParts, validateVendorParts, validateVendor, getRuleParts, isValidRule, isStringArray, isValidRuleSetArg, isSelfDescribingJson, isRuleSet, isContextCallbackFunction, isContextPrimitive, isFilterProvider, isRuleSetProvider, isConditionalContextProvider, matchSchemaAgainstRuleSet, matchSchemaAgainstRule, CorePlugin, Payload, EventJsonWithKeys, EventJson, JsonProcessor, PayloadBuilder, payloadBuilder, payloadJsonProcessor, isNonEmptyJson, isJson, EventStorePayload, newEventStorePayload, SelfDescribingJson, SelfDescribingJsonArray, Timestamp, TrueTimestamp, DeviceTimestamp, CommonEventProperties, TrackerCore, CoreConfiguration, CorePluginConfiguration, trackerCore, SelfDescribingEvent, buildSelfDescribingEvent, PageViewEvent, buildPageView, PagePingEvent, buildPagePing, StructuredEvent, buildStructEvent, EcommerceTransactionEvent, buildEcommerceTransaction, EcommerceTransactionItemEvent, buildEcommerceTransactionItem, ScreenViewEvent, buildScreenView, LinkClickEvent, buildLinkClick, AdImpressionEvent, buildAdImpression, AdClickEvent, buildAdClick, AdConversionEvent, buildAdConversion, SocialInteractionEvent, buildSocialInteraction, AddToCartEvent, buildAddToCart, RemoveFromCartEvent, buildRemoveFromCart, FormFocusOrChangeEvent, buildFormFocusOrChange, FormElement, FormSubmissionEvent, buildFormSubmission, SiteSearchEvent, buildSiteSearch, ConsentWithdrawnEvent, EventPayloadAndContext, buildConsentWithdrawn, ConsentGrantedEvent, buildConsentGranted, removeEmptyProperties, LOG_LEVEL, Logger, LOG, EventBatch, RequestFailure, EventMethod, EmitterConfigurationBase, EmitterConfiguration, Emitter, newEmitter, EventStoreIterator, EventStore, EventStoreConfiguration, InMemoryEventStoreConfiguration, newInMemoryEventStore };

@@ -29,3 +29,3 @@ declare const version: string;

/**
* Called just before the trackerCore callback fires
* Called before the `filter` method is called and before the trackerCore callback fires (if the filter passes)
* @param payloadBuilder - The payloadBuilder which will be sent to the callback, can be modified

@@ -40,2 +40,8 @@ */

/**
* Called before the payload is sent to the callback to decide whether to send the payload or skip it
* @param payload - The final event payload, can't be modified.
* @returns True if the payload should be sent, false if it should be skipped
*/
filter?: (payload: Payload) => boolean;
/**
* Called when constructing the context for each event

@@ -55,3 +61,5 @@ * Useful for adding additional context to events

*/
type SelfDescribingJson<T extends Record<keyof T, unknown> = Record<string, unknown>> = {
type SelfDescribingJson<T extends {
[_: string]: unknown;
} = Record<string, unknown>> = {
/**

@@ -71,3 +79,5 @@ * The schema string

*/
type SelfDescribingJsonArray<T extends Record<keyof T, unknown> = Record<string, unknown>> = {
type SelfDescribingJsonArray<T extends {
[_: string]: unknown;
} = Record<string, unknown>> = {
/**

@@ -81,3 +91,3 @@ * The schema string

*/
data: Array<T>;
data: (T extends SelfDescribingJson ? T : SelfDescribingJson<T>)[];
};

@@ -103,3 +113,5 @@ /**

/** Additional data points to set when tracking an event */
interface CommonEventProperties<T = Record<string, unknown>> {
interface CommonEventProperties<T extends {
[_: string]: unknown;
} = Record<string, unknown>> {
/** Add context to an event by setting an Array of Self Describing JSON */

@@ -122,3 +134,3 @@ context?: Array<SelfDescribingJson<T>> | null;

* @param timestamp - Timestamp of the event
* @returns Payload after the callback is applied
* @returns Payload after the callback is applied or undefined if the event is skipped
*/

@@ -128,3 +140,3 @@ track: (/** A PayloadBuilder created by one of the `buildX` functions */

context?: Array<SelfDescribingJson> | null, /** Timestamp override */
timestamp?: Timestamp | null) => Payload;
timestamp?: Timestamp | null) => Payload | undefined;
/**

@@ -237,3 +249,3 @@ * Set a persistent key-value pair to be added to every payload

*/
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive> | Record<string, ConditionalContextProvider | ContextPrimitive>): void;
/**

@@ -247,3 +259,3 @@ * Removes all global contexts

*/
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive | string>): void;
/**

@@ -988,3 +1000,3 @@ * Add a plugin into the plugin collection after Core has already been initialised

*/
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive> | Record<string, ConditionalContextProvider | ContextPrimitive>): void;
/**

@@ -998,3 +1010,3 @@ * Removes all global contexts

*/
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive | string>): void;
/**

@@ -1119,2 +1131,250 @@ * Returns all applicable global contexts for a specified event

declare function matchSchemaAgainstRule(rule: string, schema: string): boolean;
export { version, ContextEvent, ContextGenerator, ContextFilter, ContextPrimitive, FilterProvider, RuleSet, RuleSetProvider, ConditionalContextProvider, DynamicContext, GlobalContexts, globalContexts, PluginContexts, pluginContexts, resolveDynamicContext, getSchemaParts, validateVendorParts, validateVendor, getRuleParts, isValidRule, isStringArray, isValidRuleSetArg, isSelfDescribingJson, isRuleSet, isContextCallbackFunction, isContextPrimitive, isFilterProvider, isRuleSetProvider, isConditionalContextProvider, matchSchemaAgainstRuleSet, matchSchemaAgainstRule, CorePlugin, Payload, EventJsonWithKeys, EventJson, JsonProcessor, PayloadBuilder, payloadBuilder, payloadJsonProcessor, isNonEmptyJson, isJson, SelfDescribingJson, SelfDescribingJsonArray, Timestamp, TrueTimestamp, DeviceTimestamp, CommonEventProperties, TrackerCore, CoreConfiguration, CorePluginConfiguration, trackerCore, SelfDescribingEvent, buildSelfDescribingEvent, PageViewEvent, buildPageView, PagePingEvent, buildPagePing, StructuredEvent, buildStructEvent, EcommerceTransactionEvent, buildEcommerceTransaction, EcommerceTransactionItemEvent, buildEcommerceTransactionItem, ScreenViewEvent, buildScreenView, LinkClickEvent, buildLinkClick, AdImpressionEvent, buildAdImpression, AdClickEvent, buildAdClick, AdConversionEvent, buildAdConversion, SocialInteractionEvent, buildSocialInteraction, AddToCartEvent, buildAddToCart, RemoveFromCartEvent, buildRemoveFromCart, FormFocusOrChangeEvent, buildFormFocusOrChange, FormElement, FormSubmissionEvent, buildFormSubmission, SiteSearchEvent, buildSiteSearch, ConsentWithdrawnEvent, EventPayloadAndContext, buildConsentWithdrawn, ConsentGrantedEvent, buildConsentGranted, removeEmptyProperties, LOG_LEVEL, Logger, LOG };
interface EventStorePayload {
/**
* The event payload to be stored
*/
payload: Payload;
/**
* If the request should undergo server anonymization.
* @defaultValue false
*/
svrAnon?: boolean;
}
/**
* Create a new EventStorePayload
*/
declare function newEventStorePayload({ payload, svrAnon }: EventStorePayload): EventStorePayload;
interface EventStoreIterator {
/**
* Retrieve the next event in the store
*/
next: () => Promise<{
value: EventStorePayload | undefined;
done: boolean;
}>;
}
/**
* EventStore allows storing and retrieving events before they are sent to the collector
*/
interface EventStore {
/**
* Count all events in the store
*/
count: () => Promise<number>;
/**
* Add an event to the store
* @returns the number of events in the store after adding
*/
add: (payload: EventStorePayload) => Promise<number>;
/**
* Remove the first `count` events from the store
*/
removeHead: (count: number) => Promise<void>;
/**
* Get an iterator over all events in the store
*/
iterator: () => EventStoreIterator;
/**
* Retrieve all payloads including their meta configuration in the store
*/
getAll: () => Promise<readonly EventStorePayload[]>;
/**
* Retrieve all pure payloads in the store
*/
getAllPayloads: () => Promise<readonly Payload[]>;
}
interface EventStoreConfiguration {
/**
* The maximum amount of events that will be buffered in the event store
*
* This is useful to ensure the Tracker doesn't fill the 5MB or 10MB available to
* each website should the collector be unavailable due to lost connectivity.
* Will drop old events once the limit is hit
*/
maxSize?: number;
}
interface InMemoryEventStoreConfiguration {
/**
* Initial events to add to the store
*/
events?: EventStorePayload[];
}
declare function newInMemoryEventStore({ maxSize, events }: EventStoreConfiguration & InMemoryEventStoreConfiguration): EventStore;
/**
* A collection of event payloads which are sent to the collector.
*/
type EventBatch = Payload[];
/**
* The data that will be available to the `onRequestFailure` callback
*/
type RequestFailure = {
/** The batch of events that failed to send */
events: EventBatch;
/** The status code of the failed request */
status?: number;
/** The error message of the failed request */
message?: string;
/** Whether the tracker will retry the request */
willRetry: boolean;
};
/* The supported methods which events can be sent with */
type EventMethod = "post" | "get";
interface EmitterConfigurationBase {
/**
* The preferred technique to use to send events
* @defaultValue post
*/
eventMethod?: EventMethod;
/**
* The post path which events will be sent to.
* Ensure your collector is configured to accept events on this post path
* @defaultValue '/com.snowplowanalytics.snowplow/tp2'
*/
postPath?: string;
/**
* The amount of events that should be buffered before sending
* Recommended to leave as 1 to reduce change of losing events
* @defaultValue 1 on Web, 10 on Node
*/
bufferSize?: number;
/**
* The max size a POST request can be before the tracker will force send it
* @defaultValue 40000
*/
maxPostBytes?: number;
/**
* The max size a GET request (its complete URL) can be. Requests over this size will be tried as a POST request.
* @defaultValue unlimited
*/
maxGetBytes?: number;
/**
* Should the Sent Timestamp be attached to events.
* Only applies for GET events.
* @defaultValue true
*/
useStm?: boolean;
/**
* How long to wait before aborting requests to the collector
* @defaultValue 5000 (milliseconds)
*/
connectionTimeout?: number;
/**
* An object of key value pairs which represent headers to
* attach when sending a POST request, only works for POST
* @defaultValue `{}`
*/
customHeaders?: Record<string, string>;
/**
* Controls whether or not the browser sends credentials (defaults to 'include')
* @defaultValue 'include'
*/
credentials?: "omit" | "same-origin" | "include";
/**
* Whether to retry failed requests to the collector.
*
* Failed requests are requests that failed due to
* [timeouts](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout_event),
* [network errors](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/error_event),
* and [abort events](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort_event).
*
* Takes precedent over `retryStatusCodes` and `dontRetryStatusCodes`.
*
* @defaultValue true
*/
retryFailedRequests?: boolean;
/**
* List of HTTP response status codes for which events sent to Collector should be retried in future requests.
* Only non-success status codes are considered (greater or equal to 300).
* The retry codes are only considered for GET and POST requests.
* They take priority over the `dontRetryStatusCodes` option.
* By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422.
*/
retryStatusCodes?: number[];
/**
* List of HTTP response status codes for which events sent to Collector should not be retried in future request.
* Only non-success status codes are considered (greater or equal to 300).
* The don't retry codes are only considered for GET and POST requests.
* By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422 (these don't retry codes will remain even if you set your own `dontRetryStatusCodes` but can be changed using the `retryStatusCodes`).
*/
dontRetryStatusCodes?: number[];
/**
* Id service full URL. This URL will be added to the queue and will be called using a GET method.
* This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies.
*
* The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option.
*/
idService?: string;
/**
* Indicates that the request should be allowed to outlive the webpage that initiated it.
* Enables collector requests to complete even if the page is closed or navigated away from.
* @defaultValue true (not supported in Node.js)
*/
keepalive?: boolean;
/**
* Enables overriding the default fetch function with a custom implementation.
* @param input - Instance of Request
* @param options - Additional options for the request
* @returns A Promise that resolves to the Response.
*/
customFetch?: (input: Request, options?: RequestInit) => Promise<Response>;
/**
* A callback function to be executed whenever a request is successfully sent to the collector.
* In practice this means any request which returns a 2xx status code will trigger this callback.
*
* @param data - The event batch that was successfully sent
*/
onRequestSuccess?: (data: EventBatch, response: Response) => void;
/**
* A callback function to be executed whenever a request fails to be sent to the collector.
* This is the inverse of the onRequestSuccess callback, so any non 2xx status code will trigger this callback.
*
* @param data - The data associated with the event(s) that failed to send
*/
onRequestFailure?: (data: RequestFailure, response?: Response) => void;
/**
* Enables providing a custom EventStore implementation to store events before sending them to the collector.
*/
eventStore?: EventStore;
}
interface EmitterConfiguration extends EmitterConfigurationBase {
/* The collector URL to which events will be sent */
endpoint: string;
/* http or https. Defaults to https */
protocol?: "http" | "https";
/* Collector port number */
port?: number;
/* If the request should undergo server anonymization. */
serverAnonymization?: boolean;
}
/**
* Emitter is responsible for sending events to the collector.
* It manages the event queue and sends events in batches depending on configuration.
*/
interface Emitter {
/**
* Forces the emitter to send all events in the event store to the collector.
* @returns A Promise that resolves when all events have been sent to the collector.
*/
flush: () => Promise<void>;
/**
* Adds a payload to the event store or sends it to the collector.
* @param payload - A payload to be sent to the collector
* @returns Promise that resolves when the payload has been added to the event store or sent to the collector
*/
input: (payload: Payload) => Promise<void>;
/**
* Updates the collector URL to which events will be sent.
* @param url - New collector URL
*/
setCollectorUrl: (url: string) => void;
/**
* Sets the server anonymization flag.
*/
setAnonymousTracking: (anonymous: boolean) => void;
/**
* Updates the buffer size of the emitter.
*/
setBufferSize: (bufferSize: number) => void;
}
declare function newEmitter({ endpoint, eventMethod, protocol, port, maxPostBytes, maxGetBytes, bufferSize, customHeaders, serverAnonymization, connectionTimeout, keepalive, idService, dontRetryStatusCodes, retryStatusCodes, retryFailedRequests, onRequestFailure, onRequestSuccess, customFetch, useStm, eventStore, credentials }: EmitterConfiguration): Emitter;
export { version, ContextEvent, ContextGenerator, ContextFilter, ContextPrimitive, FilterProvider, RuleSet, RuleSetProvider, ConditionalContextProvider, DynamicContext, GlobalContexts, globalContexts, PluginContexts, pluginContexts, resolveDynamicContext, getSchemaParts, validateVendorParts, validateVendor, getRuleParts, isValidRule, isStringArray, isValidRuleSetArg, isSelfDescribingJson, isRuleSet, isContextCallbackFunction, isContextPrimitive, isFilterProvider, isRuleSetProvider, isConditionalContextProvider, matchSchemaAgainstRuleSet, matchSchemaAgainstRule, CorePlugin, Payload, EventJsonWithKeys, EventJson, JsonProcessor, PayloadBuilder, payloadBuilder, payloadJsonProcessor, isNonEmptyJson, isJson, EventStorePayload, newEventStorePayload, SelfDescribingJson, SelfDescribingJsonArray, Timestamp, TrueTimestamp, DeviceTimestamp, CommonEventProperties, TrackerCore, CoreConfiguration, CorePluginConfiguration, trackerCore, SelfDescribingEvent, buildSelfDescribingEvent, PageViewEvent, buildPageView, PagePingEvent, buildPagePing, StructuredEvent, buildStructEvent, EcommerceTransactionEvent, buildEcommerceTransaction, EcommerceTransactionItemEvent, buildEcommerceTransactionItem, ScreenViewEvent, buildScreenView, LinkClickEvent, buildLinkClick, AdImpressionEvent, buildAdImpression, AdClickEvent, buildAdClick, AdConversionEvent, buildAdConversion, SocialInteractionEvent, buildSocialInteraction, AddToCartEvent, buildAddToCart, RemoveFromCartEvent, buildRemoveFromCart, FormFocusOrChangeEvent, buildFormFocusOrChange, FormElement, FormSubmissionEvent, buildFormSubmission, SiteSearchEvent, buildSiteSearch, ConsentWithdrawnEvent, EventPayloadAndContext, buildConsentWithdrawn, ConsentGrantedEvent, buildConsentGranted, removeEmptyProperties, LOG_LEVEL, Logger, LOG, EventBatch, RequestFailure, EventMethod, EmitterConfigurationBase, EmitterConfiguration, Emitter, newEmitter, EventStoreIterator, EventStore, EventStoreConfiguration, InMemoryEventStoreConfiguration, newInMemoryEventStore };

4

dist/index.min.js
/*!
* Core functionality for Snowplow JavaScript trackers v3.24.2 (http://bit.ly/sp-js)
* Core functionality for Snowplow JavaScript trackers v3.24.3-dev.0 (http://bit.ly/sp-js)
* Copyright 2022 Snowplow Analytics Ltd, 2010 Anthon Pang

@@ -7,3 +7,3 @@ * Licensed under BSD-3-Clause

"use strict";!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).snowplowTrackerCore={})}(this,(function(e){function n(e,n,t){if(t||2===arguments.length)for(var r,o=0,a=n.length;o<a;o++)!r&&o in n||(r||(r=Array.prototype.slice.call(n,0,o)),r[o]=n[o]);return e.concat(r||Array.prototype.slice.call(n))}function t(){var e,n={},t=[],r=[],a=[],i=function(e,t){null!=t&&""!==t&&(n[e]=t)};return{add:i,addDict:function(e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&i(n,e[n])},addJson:function(e,n,a){a&&o(a)&&(e={keyIfEncoded:e,keyIfNotEncoded:n,json:a},r.push(e),t.push(e))},addContextEntity:function(e){a.push(e)},getPayload:function(){return n},getJson:function(){return t},withJsonProcessor:function(n){e=n},build:function(){return null==e||e(this,r,a),n}}}function r(e){return function(t,r,o){for(var a=function(n,r,o){if(n=JSON.stringify(n),e){if(o=t.add,n){var a=0,i=0,c=[];if(n){n=unescape(encodeURIComponent(n));do{var l=n.charCodeAt(a++),s=n.charCodeAt(a++),u=n.charCodeAt(a++),d=l<<16|s<<8|u;l=d>>18&63,s=d>>12&63,u=d>>6&63,d&=63,c[i++]=S.charAt(l)+S.charAt(s)+S.charAt(u)+S.charAt(d)}while(a<n.length);a=c.join(""),n=((n=n.length%3)?a.slice(0,n-3):a)+"===".slice(n||3)}n=n.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}o.call(t,r,n)}else t.add(o,n)},i=function(n,r){if(!n){var o=t.getPayload();if(e?o.cx:o.co){var a=(n=JSON).parse;if(e){if(o=o.cx){switch(4-o.length%4){case 2:o+="==";break;case 3:o+="="}o=function(e){var n,t=0,r=0,o="",a=[];if(!e)return e;e+="";do{var i=S.indexOf(e.charAt(t++)),c=S.indexOf(e.charAt(t++));o=S.indexOf(e.charAt(t++));var l=S.indexOf(e.charAt(t++)),s=i<<18|c<<12|o<<6|l;i=s>>16&255,c=s>>8&255,s&=255,a[r++]=64===o?String.fromCharCode(i):64===l?String.fromCharCode(i,c):String.fromCharCode(i,c,s)}while(t<e.length);return o=a.join(""),n=o.replace(/\0+$/,""),decodeURIComponent(n.split("").map((function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)})).join(""))}(o=o.replace(/-/g,"+").replace(/_/g,"/"))}}else o=o.co;n=a.call(n,o)}else n=void 0}return n?n.data=n.data.concat(r.data):n=r,n},c=void 0,l=0;l<r.length;l++){var s=r[l];"cx"===s.keyIfEncoded?c=i(c,s.json):a(s.json,s.keyIfEncoded,s.keyIfNotEncoded)}r.length=0,o.length&&(c=i(c,r={schema:"iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0",data:n([],o,!0)}),o.length=0),c&&a(c,"cx","co")}}function o(e){if(!a(e))return!1;for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n))return!0;return!1}function a(e){return null!=e&&(e.constructor==={}.constructor||e.constructor===[].constructor)}function i(){var e=[],n=[];return{getGlobalPrimitives:function(){return e},getConditionalProviders:function(){return n},addGlobalContexts:function(t){for(var r=[],o=[],a=0;a<t.length;a++){var i=t[a];_(i)?r.push(i):h(i)&&o.push(i)}e=e.concat(o),n=n.concat(r)},clearGlobalContexts:function(){n=[],e=[]},removeGlobalContexts:function(t){for(var r=function(t){_(t)?n=n.filter((function(e){return JSON.stringify(e)!==JSON.stringify(t)})):h(t)&&(e=e.filter((function(e){return JSON.stringify(e)!==JSON.stringify(t)})))},o=0;o<t.length;o++)r(t[o])},getApplicableContexts:function(t){e:{for(var r=0,o=t.getJson();r<o.length;r++){var a=o[r];if("ue_px"===a.keyIfEncoded&&"object"==typeof a.json.data&&"string"==typeof(a=a.json.data.schema)){r=a;break e}}r=""}a="string"==typeof(o=t.getPayload().e)?o:"",o=[];var i=j(e,t,a,r);return o.push.apply(o,i),t=function(e,n,t,r){var o;return e=I(e).map((function(e){e:{if(w(e)){var o=e[0],a=!1;try{a=o({event:n.getPayload(),eventType:t,eventSchema:r})}catch(e){a=!1}if(!0===a){e=j(e[1],n,t,r);break e}}else if(b(e)&&C(e[0],r)){e=j(e[1],n,t,r);break e}e=[]}if(e&&0!==e.length)return e})),(o=[]).concat.apply(o,e.filter((function(e){return null!=e&&e.filter(Boolean)})))}(n,t,a,r),o.push.apply(o,t),o}}}function c(e){return{addPluginContexts:function(t){var r=t?n([],t,!0):[];return e.forEach((function(e){try{e.contexts&&r.push.apply(r,e.contexts())}catch(e){L.error("Error adding plugin contexts",e)}})),r}}}function l(e){if(null!==(e=/^iglu:([a-zA-Z0-9-_.]+)\/([a-zA-Z0-9-_]+)\/jsonschema\/([1-9][0-9]*)-(0|[1-9][0-9]*)-(0|[1-9][0-9]*)$/.exec(e)))return e.slice(1,6)}function s(e){if("*"===e[0]||"*"===e[1])return!1;if(0<e.slice(2).length){var n=!1,t=0;for(e=e.slice(2);t<e.length;t++)if("*"===e[t])n=!0;else if(n)return!1;return!0}return 2==e.length}function u(e){return!!((e=e.split("."))&&1<e.length)&&s(e)}function d(e){if(null!==(e=/^iglu:((?:(?:[a-zA-Z0-9-_]+|\*).)+(?:[a-zA-Z0-9-_]+|\*))\/([a-zA-Z0-9-_.]+|\*)\/jsonschema\/([1-9][0-9]*|\*)-(0|[1-9][0-9]*|\*)-(0|[1-9][0-9]*|\*)$/.exec(e))&&u(e[1]))return e.slice(1,6)}function f(e){if(e=d(e)){var n=e[0];return 5===e.length&&u(n)}return!1}function p(e){return Array.isArray(e)&&e.every((function(e){return"string"==typeof e}))}function m(e){return p(e)?e.every((function(e){return f(e)})):"string"==typeof e&&f(e)}function y(e){return!!(o(e)&&"schema"in e&&"data"in e)&&("string"==typeof e.schema&&"object"==typeof e.data)}function g(e){var n=0;if(null!=e&&"object"==typeof e&&!Array.isArray(e)){if(Object.prototype.hasOwnProperty.call(e,"accept")){if(!m(e.accept))return!1;n+=1}if(Object.prototype.hasOwnProperty.call(e,"reject")){if(!m(e.reject))return!1;n+=1}return 0<n&&2>=n}return!1}function v(e){return"function"==typeof e&&1>=e.length}function h(e){return v(e)||y(e)}function w(e){return!(!Array.isArray(e)||2!==e.length)&&(Array.isArray(e[1])?v(e[0])&&e[1].every(h):v(e[0])&&h(e[1]))}function b(e){return!(!Array.isArray(e)||2!==e.length)&&(!!g(e[0])&&(Array.isArray(e[1])?e[1].every(h):h(e[1])))}function _(e){return w(e)||b(e)}function C(e,n){var t=0,r=0,o=e.accept;return Array.isArray(o)?e.accept.some((function(e){return A(e,n)}))&&r++:"string"==typeof o&&A(o,n)&&r++,o=e.reject,Array.isArray(o)?e.reject.some((function(e){return A(e,n)}))&&t++:"string"==typeof o&&A(o,n)&&t++,0<r&&0===t}function A(e,n){if(!f(e))return!1;if(e=d(e),n=l(n),e&&n){if(!function(e,n){if(n=n.split("."),e=e.split("."),n&&e){if(n.length!==e.length)return!1;for(var t=0;t<e.length;t++)if(!x(n[t],e[t]))return!1;return!0}return!1}(e[0],n[0]))return!1;for(var t=1;5>t;t++)if(!x(e[t],n[t]))return!1;return!0}return!1}function x(e,n){return e&&n&&"*"===e||e===n}function I(e){return Array.isArray(e)?e:[e]}function j(e,n,t,r){var o;return e=I(e).map((function(e){e:if(y(e))e=[e];else{if(v(e)){n:{var o=void 0;try{if(o=e({event:n.getPayload(),eventType:t,eventSchema:r}),Array.isArray(o)&&o.every(y)||y(o)){var a=o;break n}a=void 0;break n}catch(e){}a=void 0}if(y(a)){e=[a];break e}if(Array.isArray(a)){e=a;break e}}e=void 0}if(e&&0!==e.length)return e})),(o=[]).concat.apply(o,e.filter((function(e){return null!=e&&e.filter(Boolean)})))}function k(e){var n=e.event;return e={schema:"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0",data:{schema:e=n.schema,data:n.data}},(n=t()).add("e","ue"),n.addJson("ue_px","ue_pr",e),n}function P(e,n){void 0===n&&(n={});var t,r={};for(t in e)(n[t]||null!==e[t]&&void 0!==e[t])&&(r[t]=e[t]);return r}var E,O=function(){return O=Object.assign||function(e){for(var n,t=1,r=arguments.length;t<r;t++)for(var o in n=arguments[t])Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o]);return e},O.apply(this,arguments)},S="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";e.LOG_LEVEL=void 0,(E=e.LOG_LEVEL||(e.LOG_LEVEL={}))[E.none=0]="none",E[E.error=1]="error",E[E.warn=2]="warn",E[E.debug=3]="debug",E[E.info=4]="info";var L=function(t){return void 0===t&&(t=e.LOG_LEVEL.warn),{setLogLevel:function(n){t=e.LOG_LEVEL[n]?n:e.LOG_LEVEL.warn},warn:function(r,o){for(var a=[],i=2;i<arguments.length;i++)a[i-2]=arguments[i];t>=e.LOG_LEVEL.warn&&"undefined"!=typeof console&&(i="Snowplow: "+r,o?console.warn.apply(console,n([i+"\n",o],a,!1)):console.warn.apply(console,n([i],a,!1)))},error:function(r,o){for(var a=[],i=2;i<arguments.length;i++)a[i-2]=arguments[i];t>=e.LOG_LEVEL.error&&"undefined"!=typeof console&&(i="Snowplow: "+r+"\n",o?console.error.apply(console,n([i+"\n",o],a,!1)):console.error.apply(console,n([i],a,!1)))},debug:function(r){for(var o=[],a=1;a<arguments.length;a++)o[a-1]=arguments[a];t>=e.LOG_LEVEL.debug&&"undefined"!=typeof console&&console.debug.apply(console,n(["Snowplow: "+r],o,!1))},info:function(r){for(var o=[],a=1;a<arguments.length;a++)o[a-1]=arguments[a];t>=e.LOG_LEVEL.info&&"undefined"!=typeof console&&console.info.apply(console,n(["Snowplow: "+r],o,!1))}}}(),T={},N="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(N){var V=new Uint8Array(16);T=function(){return N(V),V}}else{var G=Array(16);T=function(){for(var e,n=0;16>n;n++)0==(3&n)&&(e=4294967296*Math.random()),G[n]=e>>>((3&n)<<3)&255;return G}}for(var R=[],J=0;256>J;++J)R[J]=(J+256).toString(16).substr(1);var U,z,D=function(e,n){return n=n||0,[R[e[n++]],R[e[n++]],R[e[n++]],R[e[n++]],"-",R[e[n++]],R[e[n++]],"-",R[e[n++]],R[e[n++]],"-",R[e[n++]],R[e[n++]],"-",R[e[n++]],R[e[n++]],R[e[n++]],R[e[n++]],R[e[n++]],R[e[n++]]].join("")},q=T,M=0,B=0,F=T,Z=function(e,n,t){if(t=n&&t||0,"string"==typeof e&&(n="binary"===e?Array(16):null,e=null),(e=(e=e||{}).random||(e.rng||F)())[6]=15&e[6]|64,e[8]=63&e[8]|128,n)for(var r=0;16>r;++r)n[t+r]=e[r];return n||D(e)};Z.v1=function(e,n,t){t=n&&t||0;var r=n||[],o=(e=e||{}).node||U,a=void 0!==e.clockseq?e.clockseq:z;if(null==o||null==a){var i=q();null==o&&(o=U=[1|i[0],i[1],i[2],i[3],i[4],i[5]]),null==a&&(a=z=16383&(i[6]<<8|i[7]))}i=void 0!==e.msecs?e.msecs:(new Date).getTime();var c=void 0!==e.nsecs?e.nsecs:B+1,l=i-M+(c-B)/1e4;if(0>l&&void 0===e.clockseq&&(a=a+1&16383),(0>l||i>M)&&void 0===e.nsecs&&(c=0),1e4<=c)throw Error("uuid.v1(): Can't create more than 10M uuids/sec");for(M=i,B=c,z=a,e=(1e4*(268435455&(i+=122192928e5))+c)%4294967296,r[t++]=e>>>24&255,r[t++]=e>>>16&255,r[t++]=e>>>8&255,r[t++]=255&e,e=i/4294967296*1e4&268435455,r[t++]=e>>>8&255,r[t++]=255&e,r[t++]=e>>>24&15|16,r[t++]=e>>>16&255,r[t++]=a>>>8|128,r[t++]=255&a,a=0;6>a;++a)r[t+a]=o[a];return n||D(r)},Z.v4=Z,e.LOG=L,e.buildAdClick=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/ad_click/jsonschema/1-0-0",data:P({targetUrl:e.targetUrl,clickId:e.clickId,costModel:e.costModel,cost:e.cost,bannerId:e.bannerId,zoneId:e.zoneId,impressionId:e.impressionId,advertiserId:e.advertiserId,campaignId:e.campaignId})}})},e.buildAdConversion=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/ad_conversion/jsonschema/1-0-0",data:P({conversionId:e.conversionId,costModel:e.costModel,cost:e.cost,category:e.category,action:e.action,property:e.property,initialValue:e.initialValue,advertiserId:e.advertiserId,campaignId:e.campaignId})}})},e.buildAdImpression=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/ad_impression/jsonschema/1-0-0",data:P({impressionId:e.impressionId,costModel:e.costModel,cost:e.cost,targetUrl:e.targetUrl,bannerId:e.bannerId,zoneId:e.zoneId,advertiserId:e.advertiserId,campaignId:e.campaignId})}})},e.buildAddToCart=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/add_to_cart/jsonschema/1-0-0",data:P({sku:e.sku,quantity:e.quantity,name:e.name,category:e.category,unitPrice:e.unitPrice,currency:e.currency})}})},e.buildConsentGranted=function(e){var n=e.expiry;return e={schema:"iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0",data:P({id:e.id,version:e.version,name:e.name,description:e.description})},{event:k({event:{schema:"iglu:com.snowplowanalytics.snowplow/consent_granted/jsonschema/1-0-0",data:P({expiry:n})}}),context:[e]}},e.buildConsentWithdrawn=function(e){var n=e.all;return e={schema:"iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0",data:P({id:e.id,version:e.version,name:e.name,description:e.description})},{event:k({event:{schema:"iglu:com.snowplowanalytics.snowplow/consent_withdrawn/jsonschema/1-0-0",data:P({all:n})}}),context:[e]}},e.buildEcommerceTransaction=function(e){var n=e.orderId,r=e.total,o=e.affiliation,a=e.tax,i=e.shipping,c=e.city,l=e.state,s=e.country;e=e.currency;var u=t();return u.add("e","tr"),u.add("tr_id",n),u.add("tr_af",o),u.add("tr_tt",r),u.add("tr_tx",a),u.add("tr_sh",i),u.add("tr_ci",c),u.add("tr_st",l),u.add("tr_co",s),u.add("tr_cu",e),u},e.buildEcommerceTransactionItem=function(e){var n=e.orderId,r=e.sku,o=e.price,a=e.name,i=e.category,c=e.quantity;e=e.currency;var l=t();return l.add("e","ti"),l.add("ti_id",n),l.add("ti_sk",r),l.add("ti_nm",a),l.add("ti_ca",i),l.add("ti_pr",o),l.add("ti_qu",c),l.add("ti_cu",e),l},e.buildFormFocusOrChange=function(e){var n="",t=e.schema,r=e.type;return e={formId:e.formId,elementId:e.elementId,nodeName:e.nodeName,elementClasses:e.elementClasses,value:e.value},"change_form"===t?(n="iglu:com.snowplowanalytics.snowplow/change_form/jsonschema/1-0-0",e.type=r):"focus_form"===t&&(n="iglu:com.snowplowanalytics.snowplow/focus_form/jsonschema/1-0-0",e.elementType=r),k({event:{schema:n,data:P(e,{value:!0})}})},e.buildFormSubmission=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/submit_form/jsonschema/1-0-0",data:P({formId:e.formId,formClasses:e.formClasses,elements:e.elements})}})},e.buildLinkClick=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1",data:P({targetUrl:e.targetUrl,elementId:e.elementId,elementClasses:e.elementClasses,elementTarget:e.elementTarget,elementContent:e.elementContent})}})},e.buildPagePing=function(e){var n=e.pageUrl,r=e.pageTitle,o=e.referrer,a=e.minXOffset,i=e.maxXOffset,c=e.minYOffset;e=e.maxYOffset;var l=t();return l.add("e","pp"),l.add("url",n),l.add("page",r),l.add("refr",o),a&&!isNaN(Number(a))&&l.add("pp_mix",a.toString()),i&&!isNaN(Number(i))&&l.add("pp_max",i.toString()),c&&!isNaN(Number(c))&&l.add("pp_miy",c.toString()),e&&!isNaN(Number(e))&&l.add("pp_may",e.toString()),l},e.buildPageView=function(e){var n=e.pageUrl,r=e.pageTitle;e=e.referrer;var o=t();return o.add("e","pv"),o.add("url",n),o.add("page",r),o.add("refr",e),o},e.buildRemoveFromCart=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/remove_from_cart/jsonschema/1-0-0",data:P({sku:e.sku,quantity:e.quantity,name:e.name,category:e.category,unitPrice:e.unitPrice,currency:e.currency})}})},e.buildScreenView=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/screen_view/jsonschema/1-0-0",data:P({name:e.name,id:e.id})}})},e.buildSelfDescribingEvent=k,e.buildSiteSearch=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/site_search/jsonschema/1-0-0",data:P({terms:e.terms,filters:e.filters,totalResults:e.totalResults,pageResults:e.pageResults})}})},e.buildSocialInteraction=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/social_interaction/jsonschema/1-0-0",data:P({action:e.action,network:e.network,target:e.target})}})},e.buildStructEvent=function(e){var n=e.category,r=e.action,o=e.label,a=e.property;e=e.value;var i=t();return i.add("e","se"),i.add("se_ca",n),i.add("se_ac",r),i.add("se_la",o),i.add("se_pr",a),i.add("se_va",null==e?void 0:e.toString()),i},e.getRuleParts=d,e.getSchemaParts=l,e.globalContexts=i,e.isConditionalContextProvider=_,e.isContextCallbackFunction=v,e.isContextPrimitive=h,e.isFilterProvider=w,e.isJson=a,e.isNonEmptyJson=o,e.isRuleSet=g,e.isRuleSetProvider=b,e.isSelfDescribingJson=y,e.isStringArray=p,e.isValidRule=f,e.isValidRuleSetArg=m,e.matchSchemaAgainstRule=A,e.matchSchemaAgainstRuleSet=C,e.payloadBuilder=t,e.payloadJsonProcessor=r,e.pluginContexts=c,e.removeEmptyProperties=P,e.resolveDynamicContext=function(e){for(var n,t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return null!==(n=null==e?void 0:e.map((function(e){if("function"!=typeof e)return e;try{return e.apply(void 0,t)}catch(e){}})).filter(Boolean))&&void 0!==n?n:[]},e.trackerCore=function(e){void 0===e&&(e={});var n,t,o,l,s,u,d,f=e.base64,p=e.corePlugins,m=null!=p?p:[];n=null==f||f,t=m,o=e.callback,l=c(t),s=i(),u=n,d={};var y=O(O({},e={track:function(e,n,a){e.withJsonProcessor(r(u)),e.add("eid",Z.v4()),e.addDict(d),a=function(e){return null==e?{type:"dtm",value:(new Date).getTime()}:"number"==typeof e?{type:"dtm",value:e}:"ttm"===e.type?{type:"ttm",value:e.value}:{type:"dtm",value:e.value||(new Date).getTime()}}(a),e.add(a.type,a.value.toString()),n=function(e,n){e=s.getApplicableContexts(e);var t=[];return n&&n.length&&t.push.apply(t,n),e&&e.length&&t.push.apply(t,e),t}(e,l.addPluginContexts(n)),void 0!==(n=n&&n.length?{schema:"iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0",data:n}:void 0)&&e.addJson("cx","co",n),t.forEach((function(n){try{n.beforeTrack&&n.beforeTrack(e)}catch(e){L.error("Plugin beforeTrack",e)}})),"function"==typeof o&&o(e);var i=e.build();return t.forEach((function(e){try{e.afterTrack&&e.afterTrack(i)}catch(e){L.error("Plugin afterTrack",e)}})),i},addPayloadPair:function(e,n){d[e]=n},getBase64Encoding:function(){return u},setBase64Encoding:function(e){u=e},addPayloadDict:function(e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(d[n]=e[n])},resetPayloadPairs:function(e){d=a(e)?e:{}},setTrackerVersion:function(e){d.tv=e},setTrackerNamespace:function(e){d.tna=e},setAppId:function(e){d.aid=e},setPlatform:function(e){d.p=e},setUserId:function(e){d.uid=e},setScreenResolution:function(e,n){d.res=e+"x"+n},setViewport:function(e,n){d.vp=e+"x"+n},setColorDepth:function(e){d.cd=e},setTimezone:function(e){d.tz=e},setLang:function(e){d.lang=e},setIpAddress:function(e){d.ip=e},setUseragent:function(e){d.ua=e},addGlobalContexts:function(e){s.addGlobalContexts(e)},clearGlobalContexts:function(){s.clearGlobalContexts()},removeGlobalContexts:function(e){s.removeGlobalContexts(e)}}),{addPlugin:function(e){var n,t;e=e.plugin,m.push(e),null===(n=e.logger)||void 0===n||n.call(e,L),null===(t=e.activateCorePlugin)||void 0===t||t.call(e,y)}});return null==m||m.forEach((function(e){var n,t;null===(n=e.logger)||void 0===n||n.call(e,L),null===(t=e.activateCorePlugin)||void 0===t||t.call(e,y)})),y},e.validateVendor=u,e.validateVendorParts=s,e.version="3.24.2",Object.defineProperty(e,"__esModule",{value:!0})}));
"use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).snowplowTrackerCore={})}(this,(function(e){function t(e,t,n,r){return new(n||(n=Promise))((function(o,a){function i(e){try{s(r.next(e))}catch(e){a(e)}}function c(e){try{s(r.throw(e))}catch(e){a(e)}}function s(e){e.done?o(e.value):function(e){return e instanceof n?e:new n((function(t){t(e)}))}(e.value).then(i,c)}s((r=r.apply(e,t||[])).next())}))}function n(e,t){function n(n){return function(s){return function(n){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,n[0]&&(c=0)),c;)try{if(r=1,o&&(a=2&n[0]?o.return:n[0]?o.throw||((a=o.return)&&a.call(o),0):o.next)&&!(a=a.call(o,n[1])).done)return a;switch(o=0,a&&(n=[2&n[0],a.value]),n[0]){case 0:case 1:a=n;break;case 4:return c.label++,{value:n[1],done:!1};case 5:c.label++,o=n[1],n=[0];continue;case 7:n=c.ops.pop(),c.trys.pop();continue;default:if(!(a=c.trys,(a=0<a.length&&a[a.length-1])||6!==n[0]&&2!==n[0])){c=0;continue}if(3===n[0]&&(!a||n[1]>a[0]&&n[1]<a[3]))c.label=n[1];else if(6===n[0]&&c.label<a[1])c.label=a[1],a=n;else{if(!(a&&c.label<a[2])){a[2]&&c.ops.pop(),c.trys.pop();continue}c.label=a[2],c.ops.push(n)}}n=t.call(e,c)}catch(e){n=[6,e],o=0}finally{r=a=0}if(5&n[0])throw n[1];return{value:n[0]?n[1]:void 0,done:!0}}([n,s])}}var r,o,a,i,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return i={next:n(0),throw:n(1),return:n(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i}function r(e,t,n){if(n||2===arguments.length)for(var r,o=0,a=t.length;o<a;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}function o(){var e,t={},n=[],r=[],o=[],a=function(e,n){null!=n&&""!==n&&(t[e]=n)};return{add:a,addDict:function(e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&a(t,e[t])},addJson:function(e,t,o){o&&i(o)&&(e={keyIfEncoded:e,keyIfNotEncoded:t,json:o},r.push(e),n.push(e))},addContextEntity:function(e){o.push(e)},getPayload:function(){return t},getJson:function(){return n},withJsonProcessor:function(t){e=t},build:function(){return null==e||e(this,r,o),t}}}function a(e){return function(t,n,o){for(var a=function(n,r,o){if(n=JSON.stringify(n),e){if(o=t.add,n){var a=0,i=0,c=[];if(n){n=unescape(encodeURIComponent(n));do{var s=n.charCodeAt(a++),u=n.charCodeAt(a++),l=n.charCodeAt(a++),d=s<<16|u<<8|l;s=d>>18&63,u=d>>12&63,l=d>>6&63,d&=63,c[i++]=U.charAt(s)+U.charAt(u)+U.charAt(l)+U.charAt(d)}while(a<n.length);a=c.join(""),n=((n=n.length%3)?a.slice(0,n-3):a)+"===".slice(n||3)}n=n.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}o.call(t,r,n)}else t.add(o,n)},i=function(n,r){if(!n){var o=t.getPayload();if(e?o.cx:o.co){var a=(n=JSON).parse;if(e){if(o=o.cx){switch(4-o.length%4){case 2:o+="==";break;case 3:o+="="}o=function(e){var t,n=0,r=0,o="",a=[];if(!e)return e;e+="";do{var i=U.indexOf(e.charAt(n++)),c=U.indexOf(e.charAt(n++));o=U.indexOf(e.charAt(n++));var s=U.indexOf(e.charAt(n++)),u=i<<18|c<<12|o<<6|s;i=u>>16&255,c=u>>8&255,u&=255,a[r++]=64===o?String.fromCharCode(i):64===s?String.fromCharCode(i,c):String.fromCharCode(i,c,u)}while(n<e.length);return o=a.join(""),t=o.replace(/\0+$/,""),decodeURIComponent(t.split("").map((function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)})).join(""))}(o=o.replace(/-/g,"+").replace(/_/g,"/"))}}else o=o.co;n=a.call(n,o)}else n=void 0}return n?n.data=n.data.concat(r.data):n=r,n},c=void 0,s=0;s<n.length;s++){var u=n[s];"cx"===u.keyIfEncoded?c=i(c,u.json):a(u.json,u.keyIfEncoded,u.keyIfNotEncoded)}n.length=0,o.length&&(c=i(c,n={schema:"iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0",data:r([],o,!0)}),o.length=0),c&&a(c,"cx","co")}}function i(e){if(!c(e))return!1;for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!0;return!1}function c(e){return null!=e&&(e.constructor==={}.constructor||e.constructor===[].constructor)}function s(){var e=[],t=[],n={},r={};return{getGlobalPrimitives:function(){return e.concat(Object.values(n))},getConditionalProviders:function(){return t.concat(Object.values(r))},addGlobalContexts:function(o){if(Array.isArray(o)){for(var a=[],i=[],c=0;c<o.length;c++){var s=o[c];E(s)?a.push(s):b(s)&&i.push(s)}e=e.concat(i),t=t.concat(a)}else for(a=0,o=Object.entries(o);a<o.length;a++)i=(s=o[a])[0],E(s=s[1])?r[i]=s:b(s)&&(n[i]=s)},clearGlobalContexts:function(){t=[],e=[],r={},n={}},removeGlobalContexts:function(o){for(var a=function(o){"string"==typeof o?(delete r[o],delete n[o]):E(o)?t=t.filter((function(e){return JSON.stringify(e)!==JSON.stringify(o)})):b(o)&&(e=e.filter((function(e){return JSON.stringify(e)!==JSON.stringify(o)})))},i=0;i<o.length;i++)a(o[i])},getApplicableContexts:function(o){e:{for(var a=0,i=o.getJson();a<i.length;a++){var c=i[a];if("ue_px"===c.keyIfEncoded&&"object"==typeof c.json.data&&"string"==typeof(c=c.json.data.schema)){a=c;break e}}a=""}c="string"==typeof(i=o.getPayload().e)?i:"",i=[];var s=O(e.concat(Object.values(n)),o,c,a);return i.push.apply(i,s),o=function(e,t,n,r){var o;return e=_(e).map((function(e){e:{if(S(e)){var o=e[0],a=!1;try{a=o({event:t.getPayload(),eventType:n,eventSchema:r})}catch(e){a=!1}if(!0===a){e=O(e[1],t,n,r);break e}}else if(C(e)&&A(e[0],r)){e=O(e[1],t,n,r);break e}e=[]}if(e&&0!==e.length)return e})),(o=[]).concat.apply(o,e.filter((function(e){return null!=e&&e.filter(Boolean)})))}(t.concat(Object.values(r)),o,c,a),i.push.apply(i,o),i}}}function u(e){return{addPluginContexts:function(t){var n=t?r([],t,!0):[];return e.forEach((function(e){try{e.contexts&&n.push.apply(n,e.contexts())}catch(e){J.error("Error adding plugin contexts",e)}})),n}}}function l(e){if(null!==(e=/^iglu:([a-zA-Z0-9-_.]+)\/([a-zA-Z0-9-_]+)\/jsonschema\/([1-9][0-9]*)-(0|[1-9][0-9]*)-(0|[1-9][0-9]*)$/.exec(e)))return e.slice(1,6)}function d(e){if("*"===e[0]||"*"===e[1])return!1;if(0<e.slice(2).length){var t=!1,n=0;for(e=e.slice(2);n<e.length;n++)if("*"===e[n])t=!0;else if(t)return!1;return!0}return 2==e.length}function f(e){return!!((e=e.split("."))&&1<e.length)&&d(e)}function p(e){if(null!==(e=/^iglu:((?:(?:[a-zA-Z0-9-_]+|\*).)+(?:[a-zA-Z0-9-_]+|\*))\/([a-zA-Z0-9-_.]+|\*)\/jsonschema\/([1-9][0-9]*|\*)-(0|[1-9][0-9]*|\*)-(0|[1-9][0-9]*|\*)$/.exec(e))&&f(e[1]))return e.slice(1,6)}function v(e){if(e=p(e)){var t=e[0];return 5===e.length&&f(t)}return!1}function m(e){return Array.isArray(e)&&e.every((function(e){return"string"==typeof e}))}function y(e){return m(e)?e.every((function(e){return v(e)})):"string"==typeof e&&v(e)}function g(e){return!!(i(e)&&"schema"in e&&"data"in e)&&("string"==typeof e.schema&&"object"==typeof e.data)}function h(e){var t=0;if(null!=e&&"object"==typeof e&&!Array.isArray(e)){if(Object.prototype.hasOwnProperty.call(e,"accept")){if(!y(e.accept))return!1;t+=1}if(Object.prototype.hasOwnProperty.call(e,"reject")){if(!y(e.reject))return!1;t+=1}return 0<t&&2>=t}return!1}function w(e){return"function"==typeof e&&1>=e.length}function b(e){return w(e)||g(e)}function S(e){return!(!Array.isArray(e)||2!==e.length)&&(Array.isArray(e[1])?w(e[0])&&e[1].every(b):w(e[0])&&b(e[1]))}function C(e){return!(!Array.isArray(e)||2!==e.length)&&(!!h(e[0])&&(Array.isArray(e[1])?e[1].every(b):b(e[1])))}function E(e){return S(e)||C(e)}function A(e,t){var n=0,r=0,o=e.accept;return Array.isArray(o)?e.accept.some((function(e){return P(e,t)}))&&r++:"string"==typeof o&&P(o,t)&&r++,o=e.reject,Array.isArray(o)?e.reject.some((function(e){return P(e,t)}))&&n++:"string"==typeof o&&P(o,t)&&n++,0<r&&0===n}function P(e,t){if(!v(e))return!1;if(e=p(e),t=l(t),e&&t){if(!function(e,t){if(t=t.split("."),e=e.split("."),t&&e){if(t.length!==e.length)return!1;for(var n=0;n<e.length;n++)if(!x(t[n],e[n]))return!1;return!0}return!1}(e[0],t[0]))return!1;for(var n=1;5>n;n++)if(!x(e[n],t[n]))return!1;return!0}return!1}function x(e,t){return e&&t&&"*"===e||e===t}function _(e){return Array.isArray(e)?e:[e]}function O(e,t,n,r){var o;return e=_(e).map((function(e){e:if(g(e))e=[e];else{if(w(e)){t:{var o=void 0;try{if(o=e({event:t.getPayload(),eventType:n,eventSchema:r}),Array.isArray(o)&&o.every(g)||g(o)){var a=o;break t}a=void 0;break t}catch(e){}a=void 0}if(g(a)){e=[a];break e}if(Array.isArray(a)){e=a;break e}}e=void 0}if(e&&0!==e.length)return e})),(o=[]).concat.apply(o,e.filter((function(e){return null!=e&&e.filter(Boolean)})))}function T(e){var t=e.svrAnon;return{payload:e.payload,svrAnon:void 0!==t&&t}}function j(){if(!z&&!(z="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return z(F)}function I(e,t,n){if((e=(e=e||{}).random||(e.rng||j)())[6]=15&e[6]|64,e[8]=63&e[8]|128,t){n=n||0;for(var r=0;16>r;++r)t[n+r]=e[r];return t}return function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0;if("string"!=typeof(t=(M[e[t+0]]+M[e[t+1]]+M[e[t+2]]+M[e[t+3]]+"-"+M[e[t+4]]+M[e[t+5]]+"-"+M[e[t+6]]+M[e[t+7]]+"-"+M[e[t+8]]+M[e[t+9]]+"-"+M[e[t+10]]+M[e[t+11]]+M[e[t+12]]+M[e[t+13]]+M[e[t+14]]+M[e[t+15]]).toLowerCase())||!D.test(t))throw TypeError("Stringified UUID is invalid");return t}(e)}function k(e){var t=e.event;return e={schema:"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0",data:{schema:e=t.schema,data:t.data}},(t=o()).add("e","ue"),t.addJson("ue_px","ue_pr",e),t}function R(e,t){void 0===t&&(t={});var n,r={};for(n in e)(t[n]||null!==e[n]&&void 0!==e[n])&&(r[n]=e[n]);return r}function L(e){var t=e.maxSize,n=void 0===t?1e3:t,o=r([],void 0===(e=e.events)?[]:e,!0),a=function(){return Promise.resolve(o.length)};return{count:a,add:function(e){for(o.push(e);o.length>n;)o.shift();return a()},removeHead:function(e){for(var t=0;t<e;t++)o.shift();return Promise.resolve()},iterator:function(){var e=0,t=r([],o,!0);return{next:function(){return e<t.length?Promise.resolve({value:t[e++],done:!1}):Promise.resolve({value:void 0,done:!0})}}},getAll:function(){return Promise.resolve(r([],o,!0))},getAllPayloads:function(){return Promise.resolve(o.map((function(e){return e.payload})))}}}function G(e){function t(){return S.reduce((function(e,t){return e+(C?t.getPOSTRequestBytesCount():t.getGETRequestBytesCount())}),0)}function n(){return S.length}function r(){var e=new Headers;return C&&e.append("Content-Type","application/json; charset=UTF-8"),f&&Object.keys(f).forEach((function(t){e.append(t,f[t])})),0<S.length&&S[0].getServerAnonymization()&&e.append("SP-Anonymous","*"),e}function o(){var e=c;return c.includes("://")||(e="".concat(u,"://").concat(c)),l&&(e="".concat(e,":").concat(l)),e+(C?y:"/i")}function a(e,t){var n=new AbortController;return d=setTimeout((function(){console.error("Request timed out"),n.abort()}),null!=p?p:5e3),t=V({headers:r(),signal:n.signal,keepalive:m,credentials:b},t),new Request(e,t)}function i(){var e=function(e){for(var t=(new Date).getTime().toString(),n=0;n<e.length;n++)e[n].stm=t;return e}(S.map((function(e){return e.getPOSTRequestBody()})));return a(o(),{method:"POST",body:JSON.stringify({schema:"iglu:com.snowplowanalytics.snowplow/payload_data/jsonschema/1-0-4",data:e})})}var c=e.endpoint,s=e.protocol,u=void 0===s?"https":s,l=e.port;s=e.eventMethod;var d,f=e.customHeaders,p=e.connectionTimeout,v=e.keepalive,m=void 0===v||v,y=void 0===(v=e.postPath)?"/com.snowplowanalytics.snowplow/tp2":v,g=void 0===(v=e.useStm)||v,h=e.bufferSize,w=void 0===(v=e.maxPostBytes)?4e4:v,b=void 0===(e=e.credentials)?"include":e,S=[],C="post"===(void 0===s?"post":s).toLowerCase();return{addEvent:function(e){return!(0<S.length&&(0<S.length?S[0].getServerAnonymization():void 0)!==e.getServerAnonymization())&&(S.push(e),!0)},getEvents:function(){return S},toRequest:function(){if(0!==S.length){if(C)return i();if(1!==S.length)throw Error("Only one event can be sent in a GET request");return a(S[0].getGETRequestURL(o(),g),{method:"GET"})}},countBytes:t,countEvents:n,isFull:function(){return C?void 0!==h&&n()>=Math.max(1,h)||t()>=w:1<=S.length},cancelTimeoutTimer:function(){d&&(clearTimeout(d),d=void 0)}}}function q(e){for(var t=0,n=0;n<e.length;n++){var r=e.charCodeAt(n);127>=r?t+=1:2047>=r?t+=2:55296<=r&&57343>=r?(t+=4,n++):t=65535>r?t+3:t+4}return t}function N(e){function t(){return e.payload}function n(e){if(null===o){var t,n={co:!0,cx:!0},r=[];for(t in e)e.hasOwnProperty(t)&&!n[t]&&r.push(t+"="+encodeURIComponent(e[t]));for(var a in n)e.hasOwnProperty(a)&&n[a]&&r.push(a+"="+encodeURIComponent(e[a]));o="?"+r.join("&")}return o}function r(){return null===a&&(a=function(e){return Object.keys(e).map((function(t){return[t,e[t]]})).reduce((function(e,t){return e[t[0]]=t[1].toString(),e}),{})}(t())),a}var o=null,a=null,i=null,c=null;return{getPayload:t,getServerAnonymization:function(){var t;return null!==(t=e.svrAnon)&&void 0!==t&&t},getGETRequestURL:function(e,r){var o=n(t());return r?e+o.replace("?","?stm="+(new Date).getTime()+"&"):e+o},getGETRequestBytesCount:function(){if(null===i){var e=n(t());i=q(e)}return i},getPOSTRequestBody:r,getPOSTRequestBytesCount:function(){return null===c&&(c=q(JSON.stringify(r()))),c}}}var V=function(){return V=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},V.apply(this,arguments)};"function"==typeof SuppressedError&&SuppressedError;var B,U="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";e.LOG_LEVEL=void 0,(B=e.LOG_LEVEL||(e.LOG_LEVEL={}))[B.none=0]="none",B[B.error=1]="error",B[B.warn=2]="warn",B[B.debug=3]="debug",B[B.info=4]="info";for(var z,J=function(t){return void 0===t&&(t=e.LOG_LEVEL.warn),{setLogLevel:function(n){t=e.LOG_LEVEL[n]?n:e.LOG_LEVEL.warn},warn:function(n,o){for(var a=[],i=2;i<arguments.length;i++)a[i-2]=arguments[i];t>=e.LOG_LEVEL.warn&&"undefined"!=typeof console&&(i="Snowplow: "+n,o?console.warn.apply(console,r([i+"\n",o],a,!1)):console.warn.apply(console,r([i],a,!1)))},error:function(n,o){for(var a=[],i=2;i<arguments.length;i++)a[i-2]=arguments[i];t>=e.LOG_LEVEL.error&&"undefined"!=typeof console&&(i="Snowplow: "+n+"\n",o?console.error.apply(console,r([i+"\n",o],a,!1)):console.error.apply(console,r([i],a,!1)))},debug:function(n){for(var o=[],a=1;a<arguments.length;a++)o[a-1]=arguments[a];t>=e.LOG_LEVEL.debug&&"undefined"!=typeof console&&console.debug.apply(console,r(["Snowplow: "+n],o,!1))},info:function(n){for(var o=[],a=1;a<arguments.length;a++)o[a-1]=arguments[a];t>=e.LOG_LEVEL.info&&"undefined"!=typeof console&&console.info.apply(console,r(["Snowplow: "+n],o,!1))}}}(),F=new Uint8Array(16),D=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,M=[],H=0;256>H;++H)M.push((H+256).toString(16).substr(1));e.LOG=J,e.buildAdClick=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/ad_click/jsonschema/1-0-0",data:R({targetUrl:e.targetUrl,clickId:e.clickId,costModel:e.costModel,cost:e.cost,bannerId:e.bannerId,zoneId:e.zoneId,impressionId:e.impressionId,advertiserId:e.advertiserId,campaignId:e.campaignId})}})},e.buildAdConversion=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/ad_conversion/jsonschema/1-0-0",data:R({conversionId:e.conversionId,costModel:e.costModel,cost:e.cost,category:e.category,action:e.action,property:e.property,initialValue:e.initialValue,advertiserId:e.advertiserId,campaignId:e.campaignId})}})},e.buildAdImpression=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/ad_impression/jsonschema/1-0-0",data:R({impressionId:e.impressionId,costModel:e.costModel,cost:e.cost,targetUrl:e.targetUrl,bannerId:e.bannerId,zoneId:e.zoneId,advertiserId:e.advertiserId,campaignId:e.campaignId})}})},e.buildAddToCart=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/add_to_cart/jsonschema/1-0-0",data:R({sku:e.sku,quantity:e.quantity,name:e.name,category:e.category,unitPrice:e.unitPrice,currency:e.currency})}})},e.buildConsentGranted=function(e){var t=e.expiry;return e={schema:"iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0",data:R({id:e.id,version:e.version,name:e.name,description:e.description})},{event:k({event:{schema:"iglu:com.snowplowanalytics.snowplow/consent_granted/jsonschema/1-0-0",data:R({expiry:t})}}),context:[e]}},e.buildConsentWithdrawn=function(e){var t=e.all;return e={schema:"iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0",data:R({id:e.id,version:e.version,name:e.name,description:e.description})},{event:k({event:{schema:"iglu:com.snowplowanalytics.snowplow/consent_withdrawn/jsonschema/1-0-0",data:R({all:t})}}),context:[e]}},e.buildEcommerceTransaction=function(e){var t=e.orderId,n=e.total,r=e.affiliation,a=e.tax,i=e.shipping,c=e.city,s=e.state,u=e.country;e=e.currency;var l=o();return l.add("e","tr"),l.add("tr_id",t),l.add("tr_af",r),l.add("tr_tt",n),l.add("tr_tx",a),l.add("tr_sh",i),l.add("tr_ci",c),l.add("tr_st",s),l.add("tr_co",u),l.add("tr_cu",e),l},e.buildEcommerceTransactionItem=function(e){var t=e.orderId,n=e.sku,r=e.price,a=e.name,i=e.category,c=e.quantity;e=e.currency;var s=o();return s.add("e","ti"),s.add("ti_id",t),s.add("ti_sk",n),s.add("ti_nm",a),s.add("ti_ca",i),s.add("ti_pr",r),s.add("ti_qu",c),s.add("ti_cu",e),s},e.buildFormFocusOrChange=function(e){var t="",n=e.schema,r=e.type;return e={formId:e.formId,elementId:e.elementId,nodeName:e.nodeName,elementClasses:e.elementClasses,value:e.value},"change_form"===n?(t="iglu:com.snowplowanalytics.snowplow/change_form/jsonschema/1-0-0",e.type=r):"focus_form"===n&&(t="iglu:com.snowplowanalytics.snowplow/focus_form/jsonschema/1-0-0",e.elementType=r),k({event:{schema:t,data:R(e,{value:!0})}})},e.buildFormSubmission=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/submit_form/jsonschema/1-0-0",data:R({formId:e.formId,formClasses:e.formClasses,elements:e.elements})}})},e.buildLinkClick=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1",data:R({targetUrl:e.targetUrl,elementId:e.elementId,elementClasses:e.elementClasses,elementTarget:e.elementTarget,elementContent:e.elementContent})}})},e.buildPagePing=function(e){var t=e.pageUrl,n=e.pageTitle,r=e.referrer,a=e.minXOffset,i=e.maxXOffset,c=e.minYOffset;e=e.maxYOffset;var s=o();return s.add("e","pp"),s.add("url",t),s.add("page",n),s.add("refr",r),a&&!isNaN(Number(a))&&s.add("pp_mix",a.toString()),i&&!isNaN(Number(i))&&s.add("pp_max",i.toString()),c&&!isNaN(Number(c))&&s.add("pp_miy",c.toString()),e&&!isNaN(Number(e))&&s.add("pp_may",e.toString()),s},e.buildPageView=function(e){var t=e.pageUrl,n=e.pageTitle;e=e.referrer;var r=o();return r.add("e","pv"),r.add("url",t),r.add("page",n),r.add("refr",e),r},e.buildRemoveFromCart=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/remove_from_cart/jsonschema/1-0-0",data:R({sku:e.sku,quantity:e.quantity,name:e.name,category:e.category,unitPrice:e.unitPrice,currency:e.currency})}})},e.buildScreenView=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/screen_view/jsonschema/1-0-0",data:R({name:e.name,id:e.id})}})},e.buildSelfDescribingEvent=k,e.buildSiteSearch=function(e){return k({event:{schema:"iglu:com.snowplowanalytics.snowplow/site_search/jsonschema/1-0-0",data:R({terms:e.terms,filters:e.filters,totalResults:e.totalResults,pageResults:e.pageResults})}})},e.buildSocialInteraction=function(e){return k({event:e={schema:"iglu:com.snowplowanalytics.snowplow/social_interaction/jsonschema/1-0-0",data:R({action:e.action,network:e.network,target:e.target})}})},e.buildStructEvent=function(e){var t=e.category,n=e.action,r=e.label,a=e.property;e=e.value;var i=o();return i.add("e","se"),i.add("se_ca",t),i.add("se_ac",n),i.add("se_la",r),i.add("se_pr",a),i.add("se_va",null==e?void 0:e.toString()),i},e.getRuleParts=p,e.getSchemaParts=l,e.globalContexts=s,e.isConditionalContextProvider=E,e.isContextCallbackFunction=w,e.isContextPrimitive=b,e.isFilterProvider=S,e.isJson=c,e.isNonEmptyJson=i,e.isRuleSet=h,e.isRuleSetProvider=C,e.isSelfDescribingJson=g,e.isStringArray=m,e.isValidRule=v,e.isValidRuleSetArg=y,e.matchSchemaAgainstRule=P,e.matchSchemaAgainstRuleSet=A,e.newEmitter=function(e){function r(e,t){void 0!==P&&setTimeout((function(){try{null==P||P(e,t)}catch(e){J.error("Error in onRequestFailure",e)}}),0)}function o(e){return t(this,void 0,void 0,(function(){var t,o,a,i,c,s;return n(this,(function(n){switch(n.label){case 0:if(void 0===(t=e.toRequest()))throw Error("Empty batch");o=e.getEvents().map((function(e){return e.getPayload()})),n.label=1;case 1:return n.trys.push([1,3,,4]),[4,_(t)];case 2:return a=n.sent(),e.cancelTimeoutTimer(),a.ok?(function(e,t){void 0!==x&&setTimeout((function(){try{null==x||x(e,t)}catch(e){J.error("Error in onRequestSuccess",e)}}),0)}(o,a),[2,{success:!0,retry:!1,status:a.status}]):(i=function(e){return!(200<=e&&300>e||!A||!E.includes(e)&&C.includes(e))}(a.status),r({events:o,status:a.status,message:a.statusText,willRetry:i},a),[2,{success:!1,retry:i,status:a.status}]);case 3:return c=n.sent(),s="string"==typeof c?c:c?c.message:"Unknown error",r({events:o,message:s,willRetry:!0}),[2,{success:!1,retry:!0}];case 4:return[2]}}))}))}function a(){return G({endpoint:u,protocol:f,port:p,eventMethod:d,customHeaders:g,connectionTimeout:w,keepalive:b,bufferSize:y,maxPostBytes:v,useStm:O,credentials:I})}function i(){return t(this,void 0,void 0,(function(){var e;return n(this,(function(t){switch(t.label){case 0:return!S||k?[3,2]:(k=!0,e=new Request(S,{method:"GET"}),[4,_(e)]);case 1:t.sent(),t.label=2;case 2:return[2]}}))}))}function c(){return t(this,void 0,void 0,(function(){var e;return n(this,(function(t){switch(t.label){case 0:if(R)return[3,5];R=!0,t.label=1;case 1:return t.trys.push([1,3,4,5]),[4,s()];case 2:return t.sent(),[3,5];case 3:return e=t.sent(),J.error("Error sending events",e),[3,5];case 4:return R=!1,[7];case 5:return[2]}}))}))}function s(){return t(this,void 0,void 0,(function(){var e,t,r,c,u,l,d,f,p;return n(this,(function(n){switch(n.label){case 0:return[4,i()];case 1:n.sent(),e=a(),t=j.iterator(),n.label=2;case 2:return e.isFull()?[3,4]:[4,t.next()];case 3:return r=n.sent(),c=r.value,r.done||void 0===c?[3,4]:(u=N(c),e.addEvent(u)?[3,2]:[3,4]);case 4:return 0===e.countEvents()?[2]:[4,o(e)];case 5:return l=n.sent(),d=l.success,f=l.retry,p=l.status,!d&&f?[3,7]:(d||J.error("Status ".concat(p,", will not retry.")),[4,j.removeHead(e.countEvents())]);case 6:n.sent(),n.label=7;case 7:return d?[4,s()]:[3,9];case 8:n.sent(),n.label=9;case 9:return[2]}}))}))}var u=e.endpoint,l=e.eventMethod,d=void 0===l?"post":l,f=e.protocol,p=e.port,v=void 0===(l=e.maxPostBytes)?4e4:l,m=e.maxGetBytes,y=void 0===(l=e.bufferSize)?1:l,g=e.customHeaders,h=e.serverAnonymization,w=e.connectionTimeout,b=e.keepalive,S=e.idService,C=void 0===(l=e.dontRetryStatusCodes)?[]:l,E=void 0===(l=e.retryStatusCodes)?[]:l,A=void 0===(l=e.retryFailedRequests)||l,P=e.onRequestFailure,x=e.onRequestSuccess,_=void 0===(l=e.customFetch)?fetch:l,O=e.useStm,j=void 0===(l=e.eventStore)?L({}):l,I=e.credentials,k=!1,R=!1,q="post"===d.toLowerCase();return C=C.concat([400,401,403,410,422]),{flush:c,input:function(e){return t(this,void 0,void 0,(function(){var t,r,i;return n(this,(function(n){switch(n.label){case 0:t=T({payload:e,svrAnon:h});e:{if(n=r=N(t),q){var s=(n=n.getPOSTRequestBytesCount())>v;s&&J.warn("Event ("+n+"B) too big, max is "+v)}else{if(void 0===m){n=!1;break e}(s=(n=n.getGETRequestBytesCount())>m)&&J.warn("Event ("+n+"B) too big, max is "+m)}n=s}return n?((i=a()).addEvent(r),[4,o(i)]):[3,2];case 1:return n.sent(),[3,5];case 2:return[4,j.add(t)];case 3:return n.sent()>=y?[4,c()]:[3,5];case 4:n.sent(),n.label=5;case 5:return[2]}}))}))},setCollectorUrl:function(e){u=e},setAnonymousTracking:function(e){h=e},setBufferSize:function(e){y=e}}},e.newEventStorePayload=T,e.newInMemoryEventStore=L,e.payloadBuilder=o,e.payloadJsonProcessor=a,e.pluginContexts=u,e.removeEmptyProperties=R,e.resolveDynamicContext=function(e){for(var t,n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];return null!==(t=null==e?void 0:e.map((function(e){if("function"!=typeof e)return e;try{return e.apply(void 0,n)}catch(e){}})).filter(Boolean))&&void 0!==t?t:[]},e.trackerCore=function(e){void 0===e&&(e={});var t,n,r,o,i,l,d,f=e.base64,p=e.corePlugins,v=null!=p?p:[];t=null==f||f,n=v,r=e.callback,o=u(n),i=s(),l=t,d={};var m=V(V({},e={track:function(e,t,c){if(e.withJsonProcessor(a(l)),e.add("eid",I()),e.addDict(d),c=function(e){return null==e?{type:"dtm",value:(new Date).getTime()}:"number"==typeof e?{type:"dtm",value:e}:"ttm"===e.type?{type:"ttm",value:e.value}:{type:"dtm",value:e.value||(new Date).getTime()}}(c),e.add(c.type,c.value.toString()),t=function(e,t){e=i.getApplicableContexts(e);var n=[];return t&&t.length&&n.push.apply(n,t),e&&e.length&&n.push.apply(n,e),n}(e,o.addPluginContexts(t)),void 0!==(t=t&&t.length?{schema:"iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0",data:t}:void 0)&&e.addJson("cx","co",t),n.forEach((function(t){try{t.beforeTrack&&t.beforeTrack(e)}catch(e){J.error("Plugin beforeTrack",e)}})),!n.find((function(t){try{return t.filter&&!1===t.filter(e.build())}catch(e){return J.error("Plugin filter",e),!1}}))){"function"==typeof r&&r(e);var s=e.build();return n.forEach((function(e){try{e.afterTrack&&e.afterTrack(s)}catch(e){J.error("Plugin afterTrack",e)}})),s}},addPayloadPair:function(e,t){d[e]=t},getBase64Encoding:function(){return l},setBase64Encoding:function(e){l=e},addPayloadDict:function(e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(d[t]=e[t])},resetPayloadPairs:function(e){d=c(e)?e:{}},setTrackerVersion:function(e){d.tv=e},setTrackerNamespace:function(e){d.tna=e},setAppId:function(e){d.aid=e},setPlatform:function(e){d.p=e},setUserId:function(e){d.uid=e},setScreenResolution:function(e,t){d.res=e+"x"+t},setViewport:function(e,t){d.vp=e+"x"+t},setColorDepth:function(e){d.cd=e},setTimezone:function(e){d.tz=e},setLang:function(e){d.lang=e},setIpAddress:function(e){d.ip=e},setUseragent:function(e){d.ua=e},addGlobalContexts:function(e){i.addGlobalContexts(e)},clearGlobalContexts:function(){i.clearGlobalContexts()},removeGlobalContexts:function(e){i.removeGlobalContexts(e)}}),{addPlugin:function(e){var t,n;e=e.plugin,v.push(e),null===(t=e.logger)||void 0===t||t.call(e,J),null===(n=e.activateCorePlugin)||void 0===n||n.call(e,m)}});return null==v||v.forEach((function(e){var t,n;null===(t=e.logger)||void 0===t||t.call(e,J),null===(n=e.activateCorePlugin)||void 0===n||n.call(e,m)})),m},e.validateVendor=f,e.validateVendorParts=d,e.version="3.24.3-dev.0",Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=index.min.js.map

@@ -29,3 +29,3 @@ declare const version: string;

/**
* Called just before the trackerCore callback fires
* Called before the `filter` method is called and before the trackerCore callback fires (if the filter passes)
* @param payloadBuilder - The payloadBuilder which will be sent to the callback, can be modified

@@ -40,2 +40,8 @@ */

/**
* Called before the payload is sent to the callback to decide whether to send the payload or skip it
* @param payload - The final event payload, can't be modified.
* @returns True if the payload should be sent, false if it should be skipped
*/
filter?: (payload: Payload) => boolean;
/**
* Called when constructing the context for each event

@@ -55,3 +61,5 @@ * Useful for adding additional context to events

*/
type SelfDescribingJson<T extends Record<keyof T, unknown> = Record<string, unknown>> = {
type SelfDescribingJson<T extends {
[_: string]: unknown;
} = Record<string, unknown>> = {
/**

@@ -71,3 +79,5 @@ * The schema string

*/
type SelfDescribingJsonArray<T extends Record<keyof T, unknown> = Record<string, unknown>> = {
type SelfDescribingJsonArray<T extends {
[_: string]: unknown;
} = Record<string, unknown>> = {
/**

@@ -81,3 +91,3 @@ * The schema string

*/
data: Array<T>;
data: (T extends SelfDescribingJson ? T : SelfDescribingJson<T>)[];
};

@@ -103,3 +113,5 @@ /**

/** Additional data points to set when tracking an event */
interface CommonEventProperties<T = Record<string, unknown>> {
interface CommonEventProperties<T extends {
[_: string]: unknown;
} = Record<string, unknown>> {
/** Add context to an event by setting an Array of Self Describing JSON */

@@ -122,3 +134,3 @@ context?: Array<SelfDescribingJson<T>> | null;

* @param timestamp - Timestamp of the event
* @returns Payload after the callback is applied
* @returns Payload after the callback is applied or undefined if the event is skipped
*/

@@ -128,3 +140,3 @@ track: (/** A PayloadBuilder created by one of the `buildX` functions */

context?: Array<SelfDescribingJson> | null, /** Timestamp override */
timestamp?: Timestamp | null) => Payload;
timestamp?: Timestamp | null) => Payload | undefined;
/**

@@ -237,3 +249,3 @@ * Set a persistent key-value pair to be added to every payload

*/
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive> | Record<string, ConditionalContextProvider | ContextPrimitive>): void;
/**

@@ -247,3 +259,3 @@ * Removes all global contexts

*/
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive | string>): void;
/**

@@ -988,3 +1000,3 @@ * Add a plugin into the plugin collection after Core has already been initialised

*/
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
addGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive> | Record<string, ConditionalContextProvider | ContextPrimitive>): void;
/**

@@ -998,3 +1010,3 @@ * Removes all global contexts

*/
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive>): void;
removeGlobalContexts(contexts: Array<ConditionalContextProvider | ContextPrimitive | string>): void;
/**

@@ -1119,2 +1131,250 @@ * Returns all applicable global contexts for a specified event

declare function matchSchemaAgainstRule(rule: string, schema: string): boolean;
export { version, ContextEvent, ContextGenerator, ContextFilter, ContextPrimitive, FilterProvider, RuleSet, RuleSetProvider, ConditionalContextProvider, DynamicContext, GlobalContexts, globalContexts, PluginContexts, pluginContexts, resolveDynamicContext, getSchemaParts, validateVendorParts, validateVendor, getRuleParts, isValidRule, isStringArray, isValidRuleSetArg, isSelfDescribingJson, isRuleSet, isContextCallbackFunction, isContextPrimitive, isFilterProvider, isRuleSetProvider, isConditionalContextProvider, matchSchemaAgainstRuleSet, matchSchemaAgainstRule, CorePlugin, Payload, EventJsonWithKeys, EventJson, JsonProcessor, PayloadBuilder, payloadBuilder, payloadJsonProcessor, isNonEmptyJson, isJson, SelfDescribingJson, SelfDescribingJsonArray, Timestamp, TrueTimestamp, DeviceTimestamp, CommonEventProperties, TrackerCore, CoreConfiguration, CorePluginConfiguration, trackerCore, SelfDescribingEvent, buildSelfDescribingEvent, PageViewEvent, buildPageView, PagePingEvent, buildPagePing, StructuredEvent, buildStructEvent, EcommerceTransactionEvent, buildEcommerceTransaction, EcommerceTransactionItemEvent, buildEcommerceTransactionItem, ScreenViewEvent, buildScreenView, LinkClickEvent, buildLinkClick, AdImpressionEvent, buildAdImpression, AdClickEvent, buildAdClick, AdConversionEvent, buildAdConversion, SocialInteractionEvent, buildSocialInteraction, AddToCartEvent, buildAddToCart, RemoveFromCartEvent, buildRemoveFromCart, FormFocusOrChangeEvent, buildFormFocusOrChange, FormElement, FormSubmissionEvent, buildFormSubmission, SiteSearchEvent, buildSiteSearch, ConsentWithdrawnEvent, EventPayloadAndContext, buildConsentWithdrawn, ConsentGrantedEvent, buildConsentGranted, removeEmptyProperties, LOG_LEVEL, Logger, LOG };
interface EventStorePayload {
/**
* The event payload to be stored
*/
payload: Payload;
/**
* If the request should undergo server anonymization.
* @defaultValue false
*/
svrAnon?: boolean;
}
/**
* Create a new EventStorePayload
*/
declare function newEventStorePayload({ payload, svrAnon }: EventStorePayload): EventStorePayload;
interface EventStoreIterator {
/**
* Retrieve the next event in the store
*/
next: () => Promise<{
value: EventStorePayload | undefined;
done: boolean;
}>;
}
/**
* EventStore allows storing and retrieving events before they are sent to the collector
*/
interface EventStore {
/**
* Count all events in the store
*/
count: () => Promise<number>;
/**
* Add an event to the store
* @returns the number of events in the store after adding
*/
add: (payload: EventStorePayload) => Promise<number>;
/**
* Remove the first `count` events from the store
*/
removeHead: (count: number) => Promise<void>;
/**
* Get an iterator over all events in the store
*/
iterator: () => EventStoreIterator;
/**
* Retrieve all payloads including their meta configuration in the store
*/
getAll: () => Promise<readonly EventStorePayload[]>;
/**
* Retrieve all pure payloads in the store
*/
getAllPayloads: () => Promise<readonly Payload[]>;
}
interface EventStoreConfiguration {
/**
* The maximum amount of events that will be buffered in the event store
*
* This is useful to ensure the Tracker doesn't fill the 5MB or 10MB available to
* each website should the collector be unavailable due to lost connectivity.
* Will drop old events once the limit is hit
*/
maxSize?: number;
}
interface InMemoryEventStoreConfiguration {
/**
* Initial events to add to the store
*/
events?: EventStorePayload[];
}
declare function newInMemoryEventStore({ maxSize, events }: EventStoreConfiguration & InMemoryEventStoreConfiguration): EventStore;
/**
* A collection of event payloads which are sent to the collector.
*/
type EventBatch = Payload[];
/**
* The data that will be available to the `onRequestFailure` callback
*/
type RequestFailure = {
/** The batch of events that failed to send */
events: EventBatch;
/** The status code of the failed request */
status?: number;
/** The error message of the failed request */
message?: string;
/** Whether the tracker will retry the request */
willRetry: boolean;
};
/* The supported methods which events can be sent with */
type EventMethod = "post" | "get";
interface EmitterConfigurationBase {
/**
* The preferred technique to use to send events
* @defaultValue post
*/
eventMethod?: EventMethod;
/**
* The post path which events will be sent to.
* Ensure your collector is configured to accept events on this post path
* @defaultValue '/com.snowplowanalytics.snowplow/tp2'
*/
postPath?: string;
/**
* The amount of events that should be buffered before sending
* Recommended to leave as 1 to reduce change of losing events
* @defaultValue 1 on Web, 10 on Node
*/
bufferSize?: number;
/**
* The max size a POST request can be before the tracker will force send it
* @defaultValue 40000
*/
maxPostBytes?: number;
/**
* The max size a GET request (its complete URL) can be. Requests over this size will be tried as a POST request.
* @defaultValue unlimited
*/
maxGetBytes?: number;
/**
* Should the Sent Timestamp be attached to events.
* Only applies for GET events.
* @defaultValue true
*/
useStm?: boolean;
/**
* How long to wait before aborting requests to the collector
* @defaultValue 5000 (milliseconds)
*/
connectionTimeout?: number;
/**
* An object of key value pairs which represent headers to
* attach when sending a POST request, only works for POST
* @defaultValue `{}`
*/
customHeaders?: Record<string, string>;
/**
* Controls whether or not the browser sends credentials (defaults to 'include')
* @defaultValue 'include'
*/
credentials?: "omit" | "same-origin" | "include";
/**
* Whether to retry failed requests to the collector.
*
* Failed requests are requests that failed due to
* [timeouts](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout_event),
* [network errors](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/error_event),
* and [abort events](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort_event).
*
* Takes precedent over `retryStatusCodes` and `dontRetryStatusCodes`.
*
* @defaultValue true
*/
retryFailedRequests?: boolean;
/**
* List of HTTP response status codes for which events sent to Collector should be retried in future requests.
* Only non-success status codes are considered (greater or equal to 300).
* The retry codes are only considered for GET and POST requests.
* They take priority over the `dontRetryStatusCodes` option.
* By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422.
*/
retryStatusCodes?: number[];
/**
* List of HTTP response status codes for which events sent to Collector should not be retried in future request.
* Only non-success status codes are considered (greater or equal to 300).
* The don't retry codes are only considered for GET and POST requests.
* By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422 (these don't retry codes will remain even if you set your own `dontRetryStatusCodes` but can be changed using the `retryStatusCodes`).
*/
dontRetryStatusCodes?: number[];
/**
* Id service full URL. This URL will be added to the queue and will be called using a GET method.
* This option is there to allow the service URL to be called in order to set any required identifiers e.g. extra cookies.
*
* The request respects the `anonymousTracking` option, including the SP-Anonymous header if needed, and any additional custom headers from the customHeaders option.
*/
idService?: string;
/**
* Indicates that the request should be allowed to outlive the webpage that initiated it.
* Enables collector requests to complete even if the page is closed or navigated away from.
* @defaultValue true (not supported in Node.js)
*/
keepalive?: boolean;
/**
* Enables overriding the default fetch function with a custom implementation.
* @param input - Instance of Request
* @param options - Additional options for the request
* @returns A Promise that resolves to the Response.
*/
customFetch?: (input: Request, options?: RequestInit) => Promise<Response>;
/**
* A callback function to be executed whenever a request is successfully sent to the collector.
* In practice this means any request which returns a 2xx status code will trigger this callback.
*
* @param data - The event batch that was successfully sent
*/
onRequestSuccess?: (data: EventBatch, response: Response) => void;
/**
* A callback function to be executed whenever a request fails to be sent to the collector.
* This is the inverse of the onRequestSuccess callback, so any non 2xx status code will trigger this callback.
*
* @param data - The data associated with the event(s) that failed to send
*/
onRequestFailure?: (data: RequestFailure, response?: Response) => void;
/**
* Enables providing a custom EventStore implementation to store events before sending them to the collector.
*/
eventStore?: EventStore;
}
interface EmitterConfiguration extends EmitterConfigurationBase {
/* The collector URL to which events will be sent */
endpoint: string;
/* http or https. Defaults to https */
protocol?: "http" | "https";
/* Collector port number */
port?: number;
/* If the request should undergo server anonymization. */
serverAnonymization?: boolean;
}
/**
* Emitter is responsible for sending events to the collector.
* It manages the event queue and sends events in batches depending on configuration.
*/
interface Emitter {
/**
* Forces the emitter to send all events in the event store to the collector.
* @returns A Promise that resolves when all events have been sent to the collector.
*/
flush: () => Promise<void>;
/**
* Adds a payload to the event store or sends it to the collector.
* @param payload - A payload to be sent to the collector
* @returns Promise that resolves when the payload has been added to the event store or sent to the collector
*/
input: (payload: Payload) => Promise<void>;
/**
* Updates the collector URL to which events will be sent.
* @param url - New collector URL
*/
setCollectorUrl: (url: string) => void;
/**
* Sets the server anonymization flag.
*/
setAnonymousTracking: (anonymous: boolean) => void;
/**
* Updates the buffer size of the emitter.
*/
setBufferSize: (bufferSize: number) => void;
}
declare function newEmitter({ endpoint, eventMethod, protocol, port, maxPostBytes, maxGetBytes, bufferSize, customHeaders, serverAnonymization, connectionTimeout, keepalive, idService, dontRetryStatusCodes, retryStatusCodes, retryFailedRequests, onRequestFailure, onRequestSuccess, customFetch, useStm, eventStore, credentials }: EmitterConfiguration): Emitter;
export { version, ContextEvent, ContextGenerator, ContextFilter, ContextPrimitive, FilterProvider, RuleSet, RuleSetProvider, ConditionalContextProvider, DynamicContext, GlobalContexts, globalContexts, PluginContexts, pluginContexts, resolveDynamicContext, getSchemaParts, validateVendorParts, validateVendor, getRuleParts, isValidRule, isStringArray, isValidRuleSetArg, isSelfDescribingJson, isRuleSet, isContextCallbackFunction, isContextPrimitive, isFilterProvider, isRuleSetProvider, isConditionalContextProvider, matchSchemaAgainstRuleSet, matchSchemaAgainstRule, CorePlugin, Payload, EventJsonWithKeys, EventJson, JsonProcessor, PayloadBuilder, payloadBuilder, payloadJsonProcessor, isNonEmptyJson, isJson, EventStorePayload, newEventStorePayload, SelfDescribingJson, SelfDescribingJsonArray, Timestamp, TrueTimestamp, DeviceTimestamp, CommonEventProperties, TrackerCore, CoreConfiguration, CorePluginConfiguration, trackerCore, SelfDescribingEvent, buildSelfDescribingEvent, PageViewEvent, buildPageView, PagePingEvent, buildPagePing, StructuredEvent, buildStructEvent, EcommerceTransactionEvent, buildEcommerceTransaction, EcommerceTransactionItemEvent, buildEcommerceTransactionItem, ScreenViewEvent, buildScreenView, LinkClickEvent, buildLinkClick, AdImpressionEvent, buildAdImpression, AdClickEvent, buildAdClick, AdConversionEvent, buildAdConversion, SocialInteractionEvent, buildSocialInteraction, AddToCartEvent, buildAddToCart, RemoveFromCartEvent, buildRemoveFromCart, FormFocusOrChangeEvent, buildFormFocusOrChange, FormElement, FormSubmissionEvent, buildFormSubmission, SiteSearchEvent, buildSiteSearch, ConsentWithdrawnEvent, EventPayloadAndContext, buildConsentWithdrawn, ConsentGrantedEvent, buildConsentGranted, removeEmptyProperties, LOG_LEVEL, Logger, LOG, EventBatch, RequestFailure, EventMethod, EmitterConfigurationBase, EmitterConfiguration, Emitter, newEmitter, EventStoreIterator, EventStore, EventStoreConfiguration, InMemoryEventStoreConfiguration, newInMemoryEventStore };
{
"name": "@snowplow/tracker-core",
"version": "3.24.2",
"version": "3.24.3-dev.0",
"description": "Core functionality for Snowplow JavaScript trackers",

@@ -44,3 +44,3 @@ "keywords": [

"tslib": "^2.3.1",
"uuid": "^3.4.0"
"uuid": "^8.3.2"
},

@@ -53,6 +53,6 @@ "devDependencies": {

"@types/node": "~14.6.0",
"@types/uuid": "~3.4.6",
"@types/uuid": "^8.3.2",
"@typescript-eslint/eslint-plugin": "~5.15.0",
"@typescript-eslint/parser": "~5.15.0",
"ava": "~4.1.0",
"ava": "~5.1.1",
"eslint": "~8.11.0",

@@ -71,4 +71,3 @@ "jest-standard-reporter": "~2.0.0",

"test": "ava"
},
"readme": "# Snowplow Tracker Core\n\n[![npm version][npm-image]][npm-url]\n[![License][license-image]](LICENSE)\n\nCore module to be used by Snowplow JavaScript based trackers.\n\n## Maintainer quick start\n\nPart of the Snowplow JavaScript Tracker monorepo. \nBuild with [Node.js](https://nodejs.org/en/) (14 or 16) and [Rush](https://rushjs.io/).\n\n### Setup repository\n\n```bash\nnpm install -g @microsoft/rush \ngit clone https://github.com/snowplow/snowplow-javascript-tracker.git\nrush update\n```\n\n### Building Tracker Core\n\n```bash\ncd libraries/tracker-core\nrushx build\n```\n\n### Running tests\n\n```bash\nrushx test\n```\n\n## Package Installation\n\nWith npm:\n\n```bash\nnpm install @snowplow/tracker-core\n```\n\n## Usage\n\n### CommonJS Example\n\n```js\nconst trackerCore = require('@snowplow/tracker-core').trackerCore;\n\n// Create an instance with base 64 encoding set to false (it defaults to true)\nconst core = trackerCore({\n base64: false\n});\n```\n\n### ES Module Example\n\n```js\nimport { trackerCore } from '@snowplow/tracker-core';\n\n// Create an instance with base 64 encoding set to false (it defaults to true)\nconst core = trackerCore({\n base64: false\n})\n```\n\n### Example\n\n```js\n// Add a name-value pair to all payloads\ncore.addPayloadPair('vid', 2);\n\n// Add each name-value pair in a dictionary to all payloads\ncore.addPayloadDict({\n 'ds': '1160x620',\n 'fp': 4070134789\n});\n\n// Add name-value pairs to all payloads using convenience methods\ncore.setTrackerVersion('js-3.6.0');\ncore.setPlatform('web');\ncore.setUserId('user-321');\ncore.setColorDepth('24');\ncore.setViewport('600', '400');\ncore.setUseragent('Snowplow/0.0.1');\n\n// Track a page view with URL and title\nconst pageViewPayload = core.track(\n buildPageView({\n pageUrl: 'http://www.example.com',\n pageTitle: 'landing page',\n })\n);\n\nconsole.log(pageViewPayload);\n/*\n{\n 'e': 'pv',\n 'url': 'http://www.example.com',\n 'page': 'landing page',\n 'uid': 'user-321',\n 'vid': 2,\n 'ds': '1160x620',\n 'fp': 4070134789,\n 'tv': 'js-3.6.0',\n 'p': 'web',\n 'cd': '24',\n 'vp': '600x400',\n 'ua': 'Snowplow/0.0.1',\n 'dtm': '1406879959702', // timestamp\n 'eid': 'cd39f493-dd3c-4838-b096-6e6f31015409' // UUID\n}\n*/\n\n// Stop automatically adding tv, p, and dtm to the payload.\ncore.resetPayloadPairs({});\n\n// Track an unstructured event\nconst selfDescribingEventPayload = core.track(\n buildSelfDescribingEvent({\n event: {\n 'schema': 'iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-0',\n 'data': {\n 'targetUrl': 'http://www.destination.com',\n 'elementId': 'bannerLink'\n }\n }\n })\n);\n\nconsole.log(selfDescribingEventPayload);\n/*\n{\n 'e': 'ue',\n 'eid': '4ed5da6b-7fff-4f24-a8a9-21bc749881c6',\n 'dtm': '1659086693634',\n 'ue_pr': \"{\\\"schema\\\":\\\"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0\\\",\\\"data\\\":{\\\"schema\\\":\\\"iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-0\\\",\\\"data\\\":{\\\"targetUrl\\\":\\\"http://www.destination.com\\\",\\\"elementId\\\":\\\"bannerLink\\\"}}}\"\n}\n*/\n```\n\n## Other features\n\nCore instances can be initialized with a configuration object. `base64` Determines whether custom contexts and unstructured events will be base 64 encoded. `corePlugins` are used to intercept payload creation and add contexts on every event. `callback` is an optional callback function which gets applied to every payload created by the instance.\n\n```js\nconst core = trackerCore({\n base64: true,\n corePlugins: [/* Your plugins here*/],\n callback: console.log\n});\n```\n\nThe above example would base 64 encode all unstructured events and custom contexts and would log each payload to the console.\n\nUse the `setBase64Encoding` method to turn base 64 encoding on or off after initializing a core instance:\n\n```js\nconst core = trackerCore(); // Base 64 encoding on by default\n\ncore.setBase64Encoding(false); // Base 64 encoding is now off\n```\n\n## Documentation\n\nFor more information on the Snowplow JavaScript Tracker Core's API, view its [docs page][docs].\n\n## Copyright and license\n\nLicensed and distributed under the [BSD 3-Clause License](LICENSE) ([An OSI Approved License][osi]).\n\nCopyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang.\n\nAll rights reserved.\n\n[npm-url]: https://www.npmjs.com/package/@snowplow/tracker-core\n[npm-image]: https://img.shields.io/npm/v/@snowplow/tracker-core\n[docs]: https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/node-js-tracker/javascript-tracker-core/\n[osi]: https://opensource.org/licenses/BSD-3-Clause\n[license-image]: https://img.shields.io/npm/l/@snowplow/tracker-core\n"
}
}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc