customerio-gist-web
Version:
Build beautiful in-app flows with no code and deliver them instantly to your app. http://customer.io
76 lines (68 loc) • 2.62 kB
JavaScript
import { UserNetworkInstance } from './network';
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';
import { v4 as uuidv4 } from 'uuid';
const defaultPollingDelayInSeconds = 600;
var currentPollingDelayInSeconds = defaultPollingDelayInSeconds;
var checkInProgress = false;
export const userQueueNextPullCheckLocalStoreName = "gist.web.userQueueNextPullCheck";
export const sessionIdLocalStoreName = "gist.web.sessionId";
export async function getUserQueue() {
var response;
try {
if (!checkInProgress) {
checkInProgress = true;
var headers = {
"X-Gist-User-Anonymous": isUsingGuestUserToken(),
"Content-Language": getUserLocale()
}
if (settings.getQueueAPIVersion() === "3") {
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 });
}
}
} catch (error) {
if (error.response) {
response = error.response;
} else {
log(`Error getting user queue: ${error}`);
}
} finally {
checkInProgress = false;
scheduleNextQueuePull(response);
setQueueAPIVersion(response);
}
return response;
}
function setQueueAPIVersion(response) {
if (response && response.headers) {
var queueVersion = response.headers["x-cio-queue-version"];
if (queueVersion) {
settings.setQueueAPIVersion(queueVersion);
}
}
}
function getSessionId() {
var sessionId = getKeyFromLocalStore(sessionIdLocalStoreName);
if (!sessionId) {
sessionId = uuidv4();
}
// The session ID TTL is renewed with every poll request and extended by 30 minutes.
setKeyToLocalStore(sessionIdLocalStoreName, sessionId, new Date(new Date().getTime() + 1800000));
return sessionId;
}
function scheduleNextQueuePull(response) {
if (response && response.headers) {
var pollingInterval = response.headers['x-gist-queue-polling-interval'];
if (pollingInterval && pollingInterval > 0) {
currentPollingDelayInSeconds = pollingInterval;
}
}
var expiryDate = new Date(new Date().getTime() + currentPollingDelayInSeconds * 1000);
setKeyToLocalStore(userQueueNextPullCheckLocalStoreName, currentPollingDelayInSeconds, expiryDate);
}