blinksocks/src/presets/index.js
2018-07-07 10:21:15 +08:00

102 lines
2.7 KiB
JavaScript

// private presets
import MuxPreset from './_mux';
// basic
import BaseAuthPreset from './base-auth';
// shadowsocks
import SsBasePreset from './ss-base';
import SsStreamCipherPreset from './ss-stream-cipher';
import SsAeadCipherPreset from './ss-aead-cipher';
// shadowsocksr
import SsrAuthAes128Md5Preset from './ssr-auth-aes128-md5';
import SsrAuthAes128Sha1Preset from './ssr-auth-aes128-sha1';
import SsrAuthChainAPreset from './ssr-auth-chain-a';
import SsrAuthChainBPreset from './ssr-auth-chain-b';
// v2ray
import V2rayVmessPreset from './v2ray-vmess';
// obfuscator
import ObfsRandomPaddingPreset from './obfs-random-padding';
import ObfsHttpPreset from './obfs-http';
import ObfsTls12TicketPreset from './obfs-tls1.2-ticket';
// others
import AeadRandomCipherPreset from './aead-random-cipher';
/**
* check if a class is a valid preset class
* @param clazz
* @returns {boolean}
*/
function checkPresetClass(clazz) {
if (typeof clazz !== 'function') {
return false;
}
// check require hooks
const requiredMethods = [
'onDestroy', 'onInit',
'beforeOut', 'beforeIn', 'clientOut', 'serverIn', 'serverOut', 'clientIn',
'beforeOutUdp', 'beforeInUdp', 'clientOutUdp', 'serverInUdp', 'serverOutUdp', 'clientInUdp'
];
if (requiredMethods.some((method) => typeof clazz.prototype[method] !== 'function')) {
return false;
}
const requiredStaticMethods = ['onCheckParams', 'onCache'];
return !requiredStaticMethods.some((method) => typeof clazz[method] !== 'function');
}
export const builtInPresetMap = {
// functional
'mux': MuxPreset,
// basic
'base-auth': BaseAuthPreset,
// shadowsocks
'ss-base': SsBasePreset,
'ss-stream-cipher': SsStreamCipherPreset,
'ss-aead-cipher': SsAeadCipherPreset,
// shadowsocksr
'ssr-auth-aes128-md5': SsrAuthAes128Md5Preset,
'ssr-auth-aes128-sha1': SsrAuthAes128Sha1Preset,
'ssr-auth-chain-a': SsrAuthChainAPreset,
'ssr-auth-chain-b': SsrAuthChainBPreset,
// v2ray
'v2ray-vmess': V2rayVmessPreset,
// obfuscator
'obfs-random-padding': ObfsRandomPaddingPreset,
'obfs-http': ObfsHttpPreset,
'obfs-tls1.2-ticket': ObfsTls12TicketPreset,
// others
'aead-random-cipher': AeadRandomCipherPreset
};
export function getPresetClassByName(name, allowPrivate = false) {
// load from built-in
let clazz = builtInPresetMap[name];
if (clazz === undefined) {
try {
// load from external
clazz = require(name);
} catch (err) {
throw Error(`cannot load preset "${name}" from built-in modules or external`);
}
if (!checkPresetClass(clazz)) {
throw Error(`definition of preset "${name}" is invalid`);
}
}
if (!allowPrivate && clazz.isPrivate) {
throw Error(`cannot load private preset "${name}"`);
}
return clazz;
}
export * from './defs';