@schibsted/sourcepoint
Version:
Package containing scripts used by Schibsteds' sites to integrate with Sourcepoint CMP
56 lines (44 loc) • 2.18 kB
JavaScript
import { debug } from '../utils.js';
const defaultIdentityObjectName = 'Identity';
/**
* @deprecated use resolveIdentityInstance instead
*/
export function getIdentityObject(_window, config) {
if (_window.psi?.identityObject) return _window.psi.identityObject;
if (config?.identityObject) return config.identityObject;
const windowIdentity = _window.psi?.identityObjectName || config?.identityObjectName || defaultIdentityObjectName;
if (!_window[windowIdentity]) {
return console.warn('@schibsted/sourcepoint: No Schibsted Account integration detected.');
}
return _window[windowIdentity];
};
export async function resolveIdentityInstance(_window, config = {}, timeoutMs = 10_000) {
return new Promise((resolve, reject) => {
if (_window.schIdentity) {
return resolve(_window.schIdentity);
}
const timeoutTimer = setTimeout(() => {
reject(new Error(`@schibsted/sourcepoint: Timeout of ${timeoutMs}ms exceeded while waiting for schIdentity instance`));
}, timeoutMs);
_window.addEventListener('schIdentity:ready', ({ detail }) => {
debug('schIdentity instance resolved from schIdentity:ready event ', !!detail.instance);
clearTimeout(timeoutTimer);
resolve(detail.instance);
}, { once: true });
// legacy fallback for older versions of Schibsted Account SDK
const legacyIdentityInstance = getIdentityObject(_window, config);
if (legacyIdentityInstance) {
console.warn('@schibsted/sourcepoint: schIdentity instance not found, falling back to legacy Identity instance. Please update to the latest Schibsted Account SDK.');
clearTimeout(timeoutTimer);
resolve(legacyIdentityInstance);
}
});
}
export function handleLoginFlow(_window) {
const char = () => Math.floor((Math.random() * (122 - 97)) + 97);
const id = Array.from({ length: 20 }, () => String.fromCharCode(char())).join('');
const stateBase = btoa(JSON.stringify(id));
if (getIdentityObject(_window)) {
getIdentityObject(_window).login({ state: stateBase });
}
};