/
sberads
/
tps
Обзор
Документация
Войти
/
sberads
/
tps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
njs/sync.js
73 строки
2 KB
Alexey Pavlov
v.0.1.0
25 дек 2024, 10:12
25 дек 2024, 10:12
d873ad2
Код
Авторство
О чём код?
const querystring = require('querystring'); const serviceID = new Uint8Array([0, 0, 48, 0]); let startValue = (Math.floor(Date.now() * 1000 / 20) << 16) | (Math.floor(Math.random() * 0xFFFF)); let sequencer = 0; function generateUID() { const value = getSequencer(); const timestamp = Math.floor(Date.now() / 1000); const sequence = (value << 8) | 0x3; const data = new Uint8Array(16); putUint32LE(data, 0, toBigEndian(serviceID)); putUint32LE(data, 4, timestamp); putUint32LE(data, 8, startValue); putUint32LE(data, 12, sequence); const base64Encoded = btoa(String.fromCharCode.apply(null, data)); const modifiedBase64 = base64Encoded.slice(0, -2) + 'B' + base64Encoded.slice(-1); return modifiedBase64; } function getSequencer() { sequencer |= 0x030302; sequencer++; sequencer &= 0xFFFFFF; return sequencer; } function toBigEndian(arr) { return (arr[0] << 24) | (arr[1] << 16) | (arr[2] << 8) | arr[3]; } function putUint32LE(arr, offset, value) { arr[offset] = value & 0xFF; arr[offset + 1] = (value >> 8) & 0xFF; arr[offset + 2] = (value >> 16) & 0xFF; arr[offset + 3] = (value >> 24) & 0xFF; } async function sync(r) { try { if ( r.args['raid'] && r.args['synced'] ) { r.headersOut['Set-Cookie'] = `raid=${r.args['raid']}; max-age=86400; path=/`; let args = Object.assign({}, r.args); ngx.log(ngx.INFO, args); delete args.raid; delete args.synced; let qs = querystring.stringify(args); let is_args = qs == '' ? '' : '?'; r.return(302, `${r.variables.normalized_uri}${is_args}${qs}`); return; } let hc = await r.subrequest('/ping', { method: r.method }); if (hc.status > 200) { throw("Healthcheck failed"); } else { r.return(302, `${r.variables.redir_url}?path=${r.variables.scheme}://${r.variables.host}${encodeURIComponent(r.variables.original_uri)}`); } } catch (e) { ngx.log(ngx.ERR, `error: ${e}`); r.variables.cookie_is_set = 1; let cookie = generateUID(); r.headersOut['Set-Cookie'] = `raid: ${cookie}; max-age=86400; path=/`; r.internalRedirect(r.variables.original_uri); } } export default {sync};