From b43a7760b1fd51be80af0da89d760e789daa338b Mon Sep 17 00:00:00 2001
From: Peter Perlepes
Date: Thu, 11 May 2023 16:29:18 +0300
Subject: [PATCH] Add the idService option to the tracker configuration (close
#1185)
---
...85-id-service-option_2023-05-11-20-22.json | 10 ++++++++
...85-id-service-option_2023-05-12-07-26.json | 10 ++++++++
.../browser-tracker-core/src/tracker/index.ts | 3 ++-
.../src/tracker/out_queue.ts | 23 +++++++++++++++----
.../browser-tracker-core/src/tracker/types.ts | 7 ++++++
.../docs/browser-tracker.api.md | 1 +
6 files changed, 49 insertions(+), 5 deletions(-)
create mode 100644 common/changes/@snowplow/browser-tracker-core/feature-1185-id-service-option_2023-05-11-20-22.json
create mode 100644 common/changes/@snowplow/browser-tracker/feature-1185-id-service-option_2023-05-12-07-26.json
diff --git a/common/changes/@snowplow/browser-tracker-core/feature-1185-id-service-option_2023-05-11-20-22.json b/common/changes/@snowplow/browser-tracker-core/feature-1185-id-service-option_2023-05-11-20-22.json
new file mode 100644
index 000000000..de331a7c7
--- /dev/null
+++ b/common/changes/@snowplow/browser-tracker-core/feature-1185-id-service-option_2023-05-11-20-22.json
@@ -0,0 +1,10 @@
+{
+ "changes": [
+ {
+ "packageName": "@snowplow/browser-tracker-core",
+ "comment": "Add idService option",
+ "type": "none"
+ }
+ ],
+ "packageName": "@snowplow/browser-tracker-core"
+}
\ No newline at end of file
diff --git a/common/changes/@snowplow/browser-tracker/feature-1185-id-service-option_2023-05-12-07-26.json b/common/changes/@snowplow/browser-tracker/feature-1185-id-service-option_2023-05-12-07-26.json
new file mode 100644
index 000000000..934020399
--- /dev/null
+++ b/common/changes/@snowplow/browser-tracker/feature-1185-id-service-option_2023-05-12-07-26.json
@@ -0,0 +1,10 @@
+{
+ "changes": [
+ {
+ "packageName": "@snowplow/browser-tracker",
+ "comment": "Add idService option",
+ "type": "none"
+ }
+ ],
+ "packageName": "@snowplow/browser-tracker"
+}
\ No newline at end of file
diff --git a/libraries/browser-tracker-core/src/tracker/index.ts b/libraries/browser-tracker-core/src/tracker/index.ts
index 8669b9375..7e37ff2d2 100755
--- a/libraries/browser-tracker-core/src/tracker/index.ts
+++ b/libraries/browser-tracker-core/src/tracker/index.ts
@@ -301,7 +301,8 @@ export function Tracker(
trackerConfiguration.customHeaders ?? {},
trackerConfiguration.withCredentials ?? true,
trackerConfiguration.retryStatusCodes ?? [],
- (trackerConfiguration.dontRetryStatusCodes ?? []).concat([400, 401, 403, 410, 422])
+ (trackerConfiguration.dontRetryStatusCodes ?? []).concat([400, 401, 403, 410, 422]),
+ trackerConfiguration.idService
),
// Whether pageViewId should be regenerated after each trackPageView. Affect web_page context
preservePageViewId = false,
diff --git a/libraries/browser-tracker-core/src/tracker/out_queue.ts b/libraries/browser-tracker-core/src/tracker/out_queue.ts
index b838ba436..063ffb40a 100644
--- a/libraries/browser-tracker-core/src/tracker/out_queue.ts
+++ b/libraries/browser-tracker-core/src/tracker/out_queue.ts
@@ -63,6 +63,7 @@ export interface OutQueue {
* @param withCredentials - Sets the value of the withCredentials flag on XMLHttpRequest (GET and POST) requests
* @param retryStatusCodes – Failure HTTP response status codes from Collector for which sending events should be retried (they can override the `dontRetryStatusCodes`)
* @param dontRetryStatusCodes – Failure HTTP response status codes from Collector for which sending events should not be retried
+ * @param idService - Id service full URL. This URL will be added to the queue and will be called using a GET method.
* @returns object OutQueueManager instance
*/
export function OutQueueManager(
@@ -81,7 +82,8 @@ export function OutQueueManager(
customHeaders: Record,
withCredentials: boolean,
retryStatusCodes: number[],
- dontRetryStatusCodes: number[]
+ dontRetryStatusCodes: number[],
+ idService?: string
): OutQueue {
type PostEvent = {
evt: Record;
@@ -90,7 +92,8 @@ export function OutQueueManager(
let executingQueue = false,
configCollectorUrl: string,
- outQueue: Array | Array = [];
+ outQueue: Array | Array = [],
+ idServicalled = false;
//Force to lower case if its a string
eventMethod = typeof eventMethod === 'string' ? eventMethod.toLowerCase() : eventMethod;
@@ -222,7 +225,7 @@ export function OutQueueManager(
}
const postable = (queue: Array | Array): queue is Array => {
- return typeof queue[0] === 'object';
+ return typeof queue[0] === 'object' && 'evt' in queue[0];
};
/**
@@ -293,7 +296,7 @@ export function OutQueueManager(
outQueue.shift();
}
- if (outQueue.length < 1) {
+ if (!outQueue.length) {
executingQueue = false;
return;
}
@@ -305,6 +308,18 @@ export function OutQueueManager(
executingQueue = true;
+ if (idService && !idServicalled) {
+ const xhr = initializeXMLHttpRequest(idService, false, sync);
+ idServicalled = true;
+ xhr.send();
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4 && xhr.status >= 200) {
+ executeQueue();
+ }
+ };
+ return;
+ }
+
if (useXhr) {
// Keep track of number of events to delete from queue
const chooseHowManyToSend = (queue: Array<{ bytes: number }>) => {
diff --git a/libraries/browser-tracker-core/src/tracker/types.ts b/libraries/browser-tracker-core/src/tracker/types.ts
index 45751c533..83ee1236f 100755
--- a/libraries/browser-tracker-core/src/tracker/types.ts
+++ b/libraries/browser-tracker-core/src/tracker/types.ts
@@ -237,6 +237,13 @@ export type TrackerConfiguration = {
* By default, the tracker retries on all non-success status codes except for 400, 401, 403, 410, and 422.
*/
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;
};
/**
diff --git a/trackers/browser-tracker/docs/browser-tracker.api.md b/trackers/browser-tracker/docs/browser-tracker.api.md
index 2a1762eb1..f4e27006e 100644
--- a/trackers/browser-tracker/docs/browser-tracker.api.md
+++ b/trackers/browser-tracker/docs/browser-tracker.api.md
@@ -347,6 +347,7 @@ export type TrackerConfiguration = {
customHeaders?: Record;
retryStatusCodes?: number[];
dontRetryStatusCodes?: number[];
+ idService?: string;
};
// @public