index.js
1 "use strict"; 2 var __importDefault = (this && this.__importDefault) || function (mod) { 3 return (mod && mod.__esModule) ? mod : { "default": mod }; 4 }; 5 const url_1 = require("url"); 6 const degenerator_1 = require("degenerator"); 7 /** 8 * Built-in PAC functions. 9 */ 10 const dateRange_1 = __importDefault(require("./dateRange")); 11 const dnsDomainIs_1 = __importDefault(require("./dnsDomainIs")); 12 const dnsDomainLevels_1 = __importDefault(require("./dnsDomainLevels")); 13 const dnsResolve_1 = __importDefault(require("./dnsResolve")); 14 const isInNet_1 = __importDefault(require("./isInNet")); 15 const isPlainHostName_1 = __importDefault(require("./isPlainHostName")); 16 const isResolvable_1 = __importDefault(require("./isResolvable")); 17 const localHostOrDomainIs_1 = __importDefault(require("./localHostOrDomainIs")); 18 const myIpAddress_1 = __importDefault(require("./myIpAddress")); 19 const shExpMatch_1 = __importDefault(require("./shExpMatch")); 20 const timeRange_1 = __importDefault(require("./timeRange")); 21 const weekdayRange_1 = __importDefault(require("./weekdayRange")); 22 /** 23 * Returns an asynchronous `FindProxyForURL()` function 24 * from the given JS string (from a PAC file). 25 * 26 * @param {String} str JS string 27 * @param {Object} opts optional "options" object 28 * @return {Function} async resolver function 29 */ 30 function createPacResolver(_str, _opts = {}) { 31 const str = Buffer.isBuffer(_str) ? _str.toString('utf8') : _str; 32 // The sandbox to use for the `vm` context. 33 const sandbox = Object.assign(Object.assign({}, createPacResolver.sandbox), _opts.sandbox); 34 const opts = Object.assign(Object.assign({ filename: 'proxy.pac' }, _opts), { sandbox }); 35 // Construct the array of async function names to add `await` calls to. 36 const names = Object.keys(sandbox).filter(k => isAsyncFunction(sandbox[k])); 37 // Compile the JS `FindProxyForURL()` function into an async function. 38 const resolver = degenerator_1.compile(str, 'FindProxyForURL', names, opts); 39 function FindProxyForURL(url, _host, _callback) { 40 let host = null; 41 let callback = null; 42 if (typeof _callback === 'function') { 43 callback = _callback; 44 } 45 if (typeof _host === 'string') { 46 host = _host; 47 } 48 else if (typeof _host === 'function') { 49 callback = _host; 50 } 51 if (!host) { 52 host = url_1.parse(url).hostname; 53 } 54 if (!host) { 55 throw new TypeError('Could not determine `host`'); 56 } 57 const promise = resolver(url, host); 58 if (typeof callback === 'function') { 59 toCallback(promise, callback); 60 } 61 else { 62 return promise; 63 } 64 } 65 Object.defineProperty(FindProxyForURL, 'toString', { 66 value: () => resolver.toString(), 67 enumerable: false 68 }); 69 return FindProxyForURL; 70 } 71 (function (createPacResolver) { 72 createPacResolver.sandbox = Object.freeze({ 73 alert: (message = '') => console.log('%s', message), 74 dateRange: dateRange_1.default, 75 dnsDomainIs: dnsDomainIs_1.default, 76 dnsDomainLevels: dnsDomainLevels_1.default, 77 dnsResolve: dnsResolve_1.default, 78 isInNet: isInNet_1.default, 79 isPlainHostName: isPlainHostName_1.default, 80 isResolvable: isResolvable_1.default, 81 localHostOrDomainIs: localHostOrDomainIs_1.default, 82 myIpAddress: myIpAddress_1.default, 83 shExpMatch: shExpMatch_1.default, 84 timeRange: timeRange_1.default, 85 weekdayRange: weekdayRange_1.default 86 }); 87 })(createPacResolver || (createPacResolver = {})); 88 function toCallback(promise, callback) { 89 promise.then(rtn => callback(null, rtn), callback); 90 } 91 function isAsyncFunction(v) { 92 if (typeof v !== 'function') 93 return false; 94 // Native `AsyncFunction` 95 if (v.constructor.name === 'AsyncFunction') 96 return true; 97 // TypeScript compiled 98 if (String(v).indexOf('__awaiter(') !== -1) 99 return true; 100 // Legacy behavior - set `async` property on the function 101 return Boolean(v.async); 102 } 103 module.exports = createPacResolver; 104 //# sourceMappingURL=index.js.map