@moquyun/proxy
Version:
Multi-user & multi-env web debugging proxy based on whistle
44 lines (39 loc) • 1.26 kB
JavaScript
const { Pool } = require('socketx');
const { encode } = require('simpleproto');
const crc32 = require('crc32');
const UID_RE = /^[\w.-]{1,64}$/;
exports.uiServer = (server, { data }) => {
const { storageServer } = data || '';
const len = storageServer && storageServer.length;
const rules = len ? '* whistle.storage:// includeFilter://reqH:x-whistle-nohost-storage-uid=/^[\\w.-]{1,64}$/' : '';
server.on('request', (_, res) => {
res.writeHead(200, { 'content-type': 'text/plain; charset=utf8' });
res.end(rules);
});
};
exports.resStatsServer = (server, { data }) => {
const { storageServer } = data || '';
const len = storageServer && storageServer.length;
if (!len) {
return;
}
const pool = new Pool();
storageServer.forEach((opt) => {
opt.idleTimeout = 30000;
});
server.on('request', (req) => {
req.getSession(async (s) => {
if (s) {
const uid = s.req.headers['x-whistle-nohost-storage-uid'];
if (!uid || !UID_RE.test(uid)) {
return;
}
const index = len > 1 ? (parseInt(crc32(uid), 16) % len) : 0;
try {
const socket = await pool.connect(storageServer[index]);
socket.write(encode(s));
} catch (e) {}
}
});
});
};