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