-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathindex.js
More file actions
106 lines (91 loc) · 2.62 KB
/
index.js
File metadata and controls
106 lines (91 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
'use strict';
const vm = require('vm');
const Module = require('module');
const path = require('path');
const request = require('request');
try {
require.resolve('json-ws');
} catch (err) {
// Import error, make json-ws requireable (for require('json-ws/client') in proxies):
module.paths.unshift(path.resolve(__dirname, '..'));
}
const Service = (module.exports.service = require('./lib/service/service.js'));
module.exports.client = require('./lib/client/index.js').RpcClient;
module.exports.registry = require('./lib/registry');
module.exports.getLanguageProxy = require('./lib/get-language-proxy');
module.exports.transport = {
HTTP: require('./lib/transport/http-transport'),
WebSocket: require('./lib/transport/ws-transport'),
};
/**
* Fetches proxy code from a URL
* Attempts to run the script in the VM and return to result to the caller
* @param {String} proxyUrl
* @param {Object} sslSettings
* @param {Function} callback
*/
module.exports.proxy = function(proxyUrl, sslSettings, callback) {
if (!callback) {
callback = sslSettings;
sslSettings = {};
}
request(
proxyUrl,
{
agentOptions: sslSettings,
},
function(err, response, body) {
if (err) {
callback(err);
return;
}
if (response.statusCode !== 200) {
callback(new Error('Proxy not available at ' + proxyUrl));
return;
}
const proxyModule = { exports: {} };
try {
const moduleWrapper = vm.runInThisContext(Module.wrap(body), {
filename: proxyUrl,
});
moduleWrapper(proxyModule.exports, require, proxyModule);
} catch (vmError) {
const err = new Error('Error loading proxy');
err.stack = vmError.stack;
callback(err);
return;
}
callback(null, proxyModule.exports);
}
);
};
module.exports.getClientProxy = function(apiRoot, apiType, version, sslSettings, callback) {
if (!callback) {
callback = sslSettings;
sslSettings = {};
}
const serviceUrl = apiRoot + '/' + apiType + '/' + version;
const proxyClassName =
apiType
.split(/\W+/)
.map(function(string) {
return string[0].toUpperCase() + string.slice(1).toLowerCase();
})
.join('') + 'Proxy';
const proxyUrl = serviceUrl + '?proxy=JavaScript&localName=' + proxyClassName;
module.exports.proxy(proxyUrl, sslSettings, function(err, proxy) {
if (err) {
callback(err, null);
} else {
const ProxyClass = proxy[proxyClassName];
if (ProxyClass) {
callback(null, new ProxyClass(serviceUrl, sslSettings));
} else {
callback(new Error('Proxy not available'));
}
}
});
};
module.exports.setUseStringEnums = function setUseStringEnums(useStringEnums) {
Service.setUseStringEnums(useStringEnums);
};