UNPKG

whistle.nohost

Version:

Nohost plugin for whistle

119 lines (107 loc) 2.72 kB
const LRU = require('lru-cache'); const { COOKIE_NAME, WHISTLE_ENV_HEADER, decodeURIComponentSafe, getClientId, isFromComposer, } = require('./util'); const followers = new LRU({ max: 10000, maxAge: 1000 * 60 * 30 }); const cache = new LRU({ max: 10000 }); let accountMgr; class EnvMgr { checkEnvName({ envList }, envName) { if (!envName) { return ''; } return envList.some(({ name }) => name === envName) ? envName : ''; } setFollower(followIp, ctx) { const clientIp = ctx.ip; if (clientIp !== followIp) { const env = cache.get(ctx.ip); if (env != null) { followers.set(followIp, clientIp); return true; } } return false; } unfollow(ctx) { followers.del(ctx.ip); } getFollower(ctx) { return followers.get(ctx.ip); } setEnv(ip, name, envName) { const account = accountMgr.getAccount(name); if (!account) { cache.set(ip, ''); return; } envName = this.checkEnvName(account, envName); const env = { name, envName }; cache.set(ip, env); return env; } getEnvFromCookie(ctx) { const env = decodeURIComponentSafe(ctx.cookies.get(COOKIE_NAME)); if (!env) { return ''; } const index = env.indexOf('/'); let name = env; let envName; if (index !== -1) { name = env.substring(0, index); envName = env.substring(index + 1); } const account = accountMgr.getAccount(name); if (!account) { return ''; } envName = this.checkEnvName(account, envName); return { name, envName }; } getEnv(ctx) { let env = cache.get(getClientId(ctx)); if (env != null) { if (env) { const { name, envName } = env; const account = accountMgr.getAccount(name); if (!account || !this.checkEnvName(account, envName)) { env.envName = ''; } } return env; } env = this.getEnvFromCookie(ctx); cache.set(getClientId(ctx), env); return env; } getEnvOnly(ctx) { return cache.get(getClientId(ctx)); } getEnvByHeader(ctx) { let name = decodeURIComponentSafe(ctx.get(WHISTLE_ENV_HEADER)); if (!name) { return (isFromComposer(ctx) && this.getEnvFromCookie(ctx)) || ''; } const index = name.indexOf('/'); let envName = ''; if (index !== -1) { envName = name.substring(index + 1); name = name.substring(0, index); } const account = accountMgr.getAccount(name); if (!account) { return ''; } envName = this.checkEnvName(account, envName); return { account, env: { name, envName } }; } } module.exports = (mgr) => { accountMgr = mgr; module.exports = new EnvMgr(); };