NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Use Croct experimental endpoints
// @version 0.3.0-beta3
// @license MIT
// @author Fryuni
// @copyright 2022, Luiz Ferraz
// @updateURL https://openuserjs.org/meta/Fryuni/Use_Croct_experimental_endpoints.meta.js
// @downloadURL https://openuserjs.org/install/Fryuni/Use_Croct_experimental_endpoints.user.js
// @description Plugs Croct with the experimental endpoints. Configurable with Ctrl+Alt+C.
// @match **/**
// @icon https://www.google.com/s2/favicons?sz=64&domain=croct.com
// @run-at document-body
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
const ipAddress = fetch('https://api.ipify.org')
.then(resp => resp.text())
.catch(err => {
console.error(err);
return '';
});
function injectEap(croct, croctEap) {
const originalEap = {
...croctEap
};
// Return and mutate in-place. Works in as many browser isolations as possible.
return Object.assign(croctEap, {
...GM_config.get('hijack-fetch-eap') && {
fetch: async (slotId, options) => {
const url = GM_config.get('fetch-eap-endpoint');
const headers = new Headers();
// Constants for experimental environments.
// TODO: Drop this once PMS is released.
headers.set('X-Organization-Id', GM_config.get('dev-organization'));
headers.set('X-Workspace-Id', GM_config.get('dev-workspace'));
headers.set('X-Application-Id', GM_config.get('dev-application'));
headers.set('X-Client-Ip', await ipAddress);
headers.set('X-Visitor-Id', '00000000-0000-0000-0000-000000000000');
headers.set('X-Client-Id', await croct.instance.sdk.cidAssigner.assignCid());
headers.set('Content-Type', 'application/json');
const response = await fetch(url, {
method: 'POST',
headers,
mode: 'cors',
credentials: 'omit',
cache: 'no-cache',
body: JSON.stringify({
slotId,
}),
});
const data = await response.json();
return {
payload: data.content
};
},
},
})
}
(async function () {
'use strict';
const croctEap = window.croctEap ?? unsafeWindow.croctEap ?? {};
const croct = window.croct ?? unsafeWindow.croct;
if (croct !== undefined) {
GM_config.init({
id: 'croct-experiments',
fields: {
'dev-organization': {
label: 'Organization ID',
type: 'uuid',
default: 'd23da44c-470e-439c-84d0-27c04f5c9f1d',
},
'dev-workspace': {
label: 'Workspace ID',
type: 'uuid',
default: 'f65133ea-e745-4f6c-bc2e-542be9b1681d',
},
'dev-application': {
label: 'Application ID',
type: 'uuid',
default: croct.instance.sdk.appId,
},
'enable-debug': {
label: 'Enable Croct debug logs',
type: 'checkbox',
default: false,
},
'change-evaluation': {
label: 'Use custom evaluation endpoint',
type: 'checkbox',
default: false,
},
'evaluation-endpoint': {
label: 'Evaluation URL',
type: 'select',
options: [
'https://experiments.croct.tech/client/web/evaluate',
'https://api.croct.io/alpha/client/web/evaluate',
'https://api.croct.io/beta/client/web/evaluate',
],
default: 'https://api.croct.io/beta/client/web/evaluate',
},
'hijack-fetch-eap': {
label: 'Hijack Fetch EAP',
type: 'checkbox',
default: false,
},
'fetch-eap-endpoint': {
label: 'Fetch EAP Endpoint',
type: 'select',
options: [
'https://content-service-xzexsnymka-rj.a.run.app/content',
],
default: 'https://content-service-xzexsnymka-rj.a.run.app/content',
},
},
events: {
close: () => {
window.location.reload();
},
},
});
document.addEventListener('keydown', event => {
if (!(event instanceof KeyboardEvent)) return;
if (event.code === 'KeyC' && event.ctrlKey && event.altKey) {
GM_config.open();
}
});
const config = {
appId: GM_config.get('dev-application'),
debug: GM_config.get('enable-debug'),
...GM_config.get('change-evaluation') && {
evaluationEndpointUrl: GM_config.get('evaluation-endpoint'),
},
};
console.log('Configuring croct plug with:', config);
croct.unplug();
croct.plug(config);
window.croctEap = unsafeWindow.croctEap = injectEap(croct, croctEap);
}
})();