From fa28d0cc377d6aeee0f4777f252e14929df96b6e Mon Sep 17 00:00:00 2001 From: Bernard Gatt Date: Tue, 18 Feb 2025 13:13:00 +0100 Subject: [PATCH 1/4] Added support for Queue V3 --- src/services/network.js | 7 +++++-- src/services/queue-service.js | 36 ++++++++++++++++++++++++++++++++--- src/services/settings.js | 17 +++++++++++++++++ 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/services/network.js b/src/services/network.js index f1720d7..3b51879 100644 --- a/src/services/network.js +++ b/src/services/network.js @@ -6,8 +6,11 @@ import { getUserToken } from "../managers/user-manager"; export function UserNetworkInstance() { var instance = axios.create({ baseURL: settings.GIST_QUEUE_API_ENDPOINT[Gist.config.env], - timeout: 20000 // 20 seconds, TODO: should we reconsider? - }) + timeout: 5000 + }); + if (settings.getQueueAPIVersion() === "3") { + instance.defaults.baseURL = settings.GIST_QUEUE_V3_API_ENDPOINT[Gist.config.env]; + } instance.defaults.headers.common['X-CIO-Site-Id'] = Gist.config.siteId; instance.defaults.headers.common['X-CIO-Client-Platform'] = 'web'; var userToken = getUserToken(); diff --git a/src/services/queue-service.js b/src/services/queue-service.js index 1daaef9..3c23f6b 100644 --- a/src/services/queue-service.js +++ b/src/services/queue-service.js @@ -1,25 +1,35 @@ import { UserNetworkInstance } from './network'; -import { setKeyToLocalStore } from '../utilities/local-storage'; +import { getKeyFromLocalStore, setKeyToLocalStore } from '../utilities/local-storage'; import { log } from "../utilities/log"; import { isUsingGuestUserToken } from '../managers/user-manager'; import { getUserLocale } from '../managers/locale-manager'; +import { settings } from './settings'; +const CIOInstanceIdHeader = "X-CIO-Instance-Id"; const defaultPollingDelayInSeconds = 600; var currentPollingDelayInSeconds = defaultPollingDelayInSeconds; var checkInProgress = false; export const userQueueNextPullCheckLocalStoreName = "gist.web.userQueueNextPullCheck"; +export const stickyInstanceIdLocalStoreName = "gist.web.stickyInstanceId"; export async function getUserQueue() { var response; try { if (!checkInProgress) { - var timestamp = new Date().getTime(); checkInProgress = true; var headers = { "X-Gist-User-Anonymous": isUsingGuestUserToken(), "Content-Language": getUserLocale() } - response = await UserNetworkInstance().post(`/api/v2/users?timestamp=${timestamp}`, {}, { headers: headers }); + if (settings.getQueueAPIVersion() === "3") { + if (getKeyFromLocalStore(stickyInstanceIdLocalStoreName) !== null) { + headers[CIOInstanceIdHeader] = getKeyFromLocalStore(stickyInstanceIdLocalStoreName); + } + response = await UserNetworkInstance().post(`/api/v3/users`, {}, { headers: headers }); + } else { + var timestamp = new Date().getTime(); + response = await UserNetworkInstance().post(`/api/v2/users?timestamp=${timestamp}`, {}, { headers: headers }); + } } } catch (error) { if (error.response) { @@ -30,11 +40,31 @@ export async function getUserQueue() { } finally { checkInProgress = false; scheduleNextQueuePull(response); + setQueueAPIVersion(response); + setStickySessionHeader(response) } return response; } +function setQueueAPIVersion(response) { + if (response && response.headers) { + var queueVersion = response.headers["x-cio-queue-version"]; + if (queueVersion) { + settings.setQueueAPIVersion(queueVersion); + } + } +} + +function setStickySessionHeader(response) { + if (response && response.headers) { + var cioInstanceId = response.headers[CIOInstanceIdHeader.toLowerCase()]; + if (cioInstanceId) { + setKeyToLocalStore(stickyInstanceIdLocalStoreName, cioInstanceId); + } + } +} + function scheduleNextQueuePull(response) { if (response && response.headers) { var pollingInterval = response.headers['x-gist-queue-polling-interval']; diff --git a/src/services/settings.js b/src/services/settings.js index 0ea93c4..6863417 100644 --- a/src/services/settings.js +++ b/src/services/settings.js @@ -1,3 +1,7 @@ +import { getKeyFromLocalStore } from '../utilities/local-storage'; +import { log } from '../utilities/log'; +const userQueueVersionLocalStoreName = "gist.web.userQueueVersion"; + export const settings = { ENGINE_API_ENDPOINT: { "prod": "https://engine.api.gist.build", @@ -9,9 +13,22 @@ export const settings = { "dev": "https://gist-queue-consumer-api.cloud.dev.gist.build", "local": "http://api.local.gist.build:86" }, + GIST_QUEUE_V3_API_ENDPOINT: { + "prod": "https://consumer.cloud.gist.build", + "dev": "https://consumer.cloud.dev.gist.build", + "local": "http://api.local.gist.build:86" + }, GIST_VIEW_ENDPOINT: { "prod": "https://renderer.gist.build/3.0", "dev": "https://renderer.gist.build/3.0", "local": "http://app.local.gist.build:8080/web" + }, + getQueueAPIVersion: function(version) { + getKeyFromLocalStore(userQueueVersionLocalStoreName, version); + return version ?? "2"; + }, + setQueueAPIVersion: function(version) { + setKeyToLocalStore(userQueueVersionLocalStoreName, version); + log(`Set user queue version to "${version}"`); } } \ No newline at end of file From a81ee472b3bf17d5bcf7de47f34f5bb2026d41e0 Mon Sep 17 00:00:00 2001 From: Bernard Gatt Date: Tue, 18 Feb 2025 13:15:19 +0100 Subject: [PATCH 2/4] Fixes import --- src/services/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/settings.js b/src/services/settings.js index 6863417..5610f26 100644 --- a/src/services/settings.js +++ b/src/services/settings.js @@ -1,4 +1,4 @@ -import { getKeyFromLocalStore } from '../utilities/local-storage'; +import { getKeyFromLocalStore, setKeyToLocalStore } from '../utilities/local-storage'; import { log } from '../utilities/log'; const userQueueVersionLocalStoreName = "gist.web.userQueueVersion"; From 3398a95aec0d44864c87cced3e10518f0b6aba90 Mon Sep 17 00:00:00 2001 From: Bernard Gatt Date: Mon, 17 Mar 2025 09:39:47 +0100 Subject: [PATCH 3/4] Updated SDK to generate and maintain a SessionId and use it as a query parameter --- src/services/queue-service.js | 23 ++++++++++------------- src/services/settings.js | 5 ++--- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/services/queue-service.js b/src/services/queue-service.js index 3c23f6b..4d994e0 100644 --- a/src/services/queue-service.js +++ b/src/services/queue-service.js @@ -4,14 +4,14 @@ import { log } from "../utilities/log"; import { isUsingGuestUserToken } from '../managers/user-manager'; import { getUserLocale } from '../managers/locale-manager'; import { settings } from './settings'; +import { v4 as uuidv4 } from 'uuid'; -const CIOInstanceIdHeader = "X-CIO-Instance-Id"; const defaultPollingDelayInSeconds = 600; var currentPollingDelayInSeconds = defaultPollingDelayInSeconds; var checkInProgress = false; export const userQueueNextPullCheckLocalStoreName = "gist.web.userQueueNextPullCheck"; -export const stickyInstanceIdLocalStoreName = "gist.web.stickyInstanceId"; +export const sessionIdLocalStoreName = "gist.web.sessionId"; export async function getUserQueue() { var response; try { @@ -21,11 +21,9 @@ export async function getUserQueue() { "X-Gist-User-Anonymous": isUsingGuestUserToken(), "Content-Language": getUserLocale() } + if (settings.getQueueAPIVersion() === "3") { - if (getKeyFromLocalStore(stickyInstanceIdLocalStoreName) !== null) { - headers[CIOInstanceIdHeader] = getKeyFromLocalStore(stickyInstanceIdLocalStoreName); - } - response = await UserNetworkInstance().post(`/api/v3/users`, {}, { headers: headers }); + response = await UserNetworkInstance().post(`/api/v3/users?sessionId=${getSessionId()}`, {}, { headers: headers }); } else { var timestamp = new Date().getTime(); response = await UserNetworkInstance().post(`/api/v2/users?timestamp=${timestamp}`, {}, { headers: headers }); @@ -41,7 +39,6 @@ export async function getUserQueue() { checkInProgress = false; scheduleNextQueuePull(response); setQueueAPIVersion(response); - setStickySessionHeader(response) } return response; @@ -56,13 +53,13 @@ function setQueueAPIVersion(response) { } } -function setStickySessionHeader(response) { - if (response && response.headers) { - var cioInstanceId = response.headers[CIOInstanceIdHeader.toLowerCase()]; - if (cioInstanceId) { - setKeyToLocalStore(stickyInstanceIdLocalStoreName, cioInstanceId); - } +function getSessionId() { + var sessionId = getKeyFromLocalStore(sessionIdLocalStoreName); + if (!sessionId) { + sessionId = uuidv4(); } + setKeyToLocalStore(sessionIdLocalStoreName, sessionId, new Date(new Date().getTime() + 600000)); + return sessionId; } function scheduleNextQueuePull(response) { diff --git a/src/services/settings.js b/src/services/settings.js index 5610f26..8e863fa 100644 --- a/src/services/settings.js +++ b/src/services/settings.js @@ -23,9 +23,8 @@ export const settings = { "dev": "https://renderer.gist.build/3.0", "local": "http://app.local.gist.build:8080/web" }, - getQueueAPIVersion: function(version) { - getKeyFromLocalStore(userQueueVersionLocalStoreName, version); - return version ?? "2"; + getQueueAPIVersion: function() { + return getKeyFromLocalStore(userQueueVersionLocalStoreName) ?? "2"; }, setQueueAPIVersion: function(version) { setKeyToLocalStore(userQueueVersionLocalStoreName, version); From 298fe75e7c95a11f3663b8b60babfff64929166a Mon Sep 17 00:00:00 2001 From: Bernard Gatt Date: Mon, 17 Mar 2025 09:56:10 +0100 Subject: [PATCH 4/4] Added inline comment --- src/services/queue-service.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/queue-service.js b/src/services/queue-service.js index 4d994e0..d1df0d5 100644 --- a/src/services/queue-service.js +++ b/src/services/queue-service.js @@ -58,6 +58,7 @@ function getSessionId() { if (!sessionId) { sessionId = uuidv4(); } + // The session ID TTL is renewed with every poll request and extended by 10 minutes. setKeyToLocalStore(sessionIdLocalStoreName, sessionId, new Date(new Date().getTime() + 600000)); return sessionId; }