Files
CHOMPStation2/tgui/public/iframe.html
CHOMPStation2StaffMirrorBot a42bdce47b [MIRROR] Iframe fix (#12067)
Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com>
2025-12-05 02:18:52 +01:00

106 lines
2.9 KiB
HTML

<!doctype html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta charset="utf-8" />
<script type="text/javascript">
const INDEXED_DB_VERSION = 1;
const INDEXED_DB_NAME = 'tgui';
const INDEXED_DB_STORE_NAME = 'storage';
const READ_ONLY = 'readonly';
const READ_WRITE = 'readwrite';
const MAX_MESSAGES = 1000;
const urlParams = new URLSearchParams(window.location.search);
const storeValue = `${urlParams.get('store')}-${INDEXED_DB_NAME}`;
const dbPromise = new Promise((resolve, reject) => {
const indexedDB = window.indexedDB;
const req = indexedDB.open(storeValue, INDEXED_DB_VERSION);
req.onupgradeneeded = (event) => {
try {
if (event.oldVersion < 1) {
req.result.createObjectStore(INDEXED_DB_STORE_NAME);
}
} catch (err) {
reject(new Error('Failed to upgrade IDB: ' + req.error));
}
};
req.onsuccess = () => resolve(req.result);
req.onerror = () => {
reject(new Error('Failed to open IDB: ' + req.error));
};
});
window.addEventListener('message', (messageEvent) => {
switch (messageEvent.data.type) {
case 'ping':
messageEvent.source.postMessage(true, '*');
break;
case 'get':
get(messageEvent.data.key).then((value) => {
messageEvent.source.postMessage(
{ key: messageEvent.data.key, value: value },
'*',
);
});
break;
case 'set':
set(messageEvent.data.key, messageEvent.data.value);
break;
case 'remove':
remove(messageEvent.data.key);
break;
case 'clear':
clear();
break;
default:
break;
}
});
const getStore = async (mode) => {
return dbPromise.then((db) =>
db
.transaction(INDEXED_DB_STORE_NAME, mode)
.objectStore(INDEXED_DB_STORE_NAME),
);
};
const get = async (key) => {
const store = await getStore(READ_ONLY);
return new Promise((resolve, reject) => {
const req = store.get(key);
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
};
const set = async (key, value) => {
const store = await getStore(READ_WRITE);
store.put(value, key);
};
const remove = async (key) => {
const store = await getStore(READ_WRITE);
store.delete(key);
};
const clear = async () => {
const store = await getStore(READ_WRITE);
store.clear();
};
window.onload = () => {
window.parent.postMessage('ready', '*');
};
</script>
</head>
</html>