71 lines
1.8 KiB
JavaScript
71 lines
1.8 KiB
JavaScript
(() => {
|
|
const SESSION_STORAGE_KEY = 'cc_session';
|
|
const SUPERVISOR_REALTIME_PATH = '/proxy/supervisor/supervisor/realtime';
|
|
|
|
function currentRole() {
|
|
try {
|
|
const raw = window.localStorage.getItem(SESSION_STORAGE_KEY);
|
|
if (!raw) {
|
|
return '';
|
|
}
|
|
const payload = JSON.parse(raw);
|
|
return String(payload?.role || '').toLowerCase();
|
|
} catch {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
function roleFromRequest(input, init) {
|
|
try {
|
|
const headers = new Headers((init && init.headers) || (input && input.headers) || undefined);
|
|
return String(headers.get('X-Role') || '').toLowerCase();
|
|
} catch {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
function urlFromRequest(input) {
|
|
if (typeof input === 'string') {
|
|
return input;
|
|
}
|
|
if (input && typeof input.url === 'string') {
|
|
return input.url;
|
|
}
|
|
return '';
|
|
}
|
|
|
|
function isRestrictedSupervisorRealtime(input, init) {
|
|
const url = urlFromRequest(input);
|
|
if (!url.includes(SUPERVISOR_REALTIME_PATH)) {
|
|
return false;
|
|
}
|
|
const role = roleFromRequest(input, init) || currentRole();
|
|
return role === 'operator';
|
|
}
|
|
|
|
function restrictedSupervisorResponse() {
|
|
return new Response(
|
|
JSON.stringify({
|
|
agents: { total: 0, by_state: {}, items: [] },
|
|
queues: [],
|
|
timestamp: new Date().toISOString(),
|
|
restricted: true,
|
|
}),
|
|
{
|
|
status: 200,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
const originalFetch = window.fetch.bind(window);
|
|
window.fetch = function patchedFetch(input, init) {
|
|
if (isRestrictedSupervisorRealtime(input, init)) {
|
|
return Promise.resolve(restrictedSupervisorResponse());
|
|
}
|
|
return originalFetch(input, init);
|
|
};
|
|
})();
|