tedious 14.7.0 → 15.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/appveyor.yml +1 -1
- package/lib/connection.js +84 -173
- package/lib/connector.js +100 -144
- package/lib/data-types/tvp.js +4 -4
- package/lib/errors/abort-error.js +19 -0
- package/lib/errors/timeout-error.js +19 -0
- package/lib/instance-lookup.js +77 -117
- package/lib/message-io.js +94 -65
- package/lib/metadata-parser.js +1 -1
- package/lib/request.js +2 -2
- package/lib/sender.js +41 -88
- package/lib/token/colmetadata-token-parser.js +1 -1
- package/lib/token/done-token-parser.js +1 -1
- package/lib/token/env-change-token-parser.js +1 -1
- package/lib/token/feature-ext-ack-parser.js +1 -1
- package/lib/token/fedauth-info-parser.js +1 -1
- package/lib/token/infoerror-token-parser.js +1 -1
- package/lib/token/loginack-token-parser.js +1 -1
- package/lib/token/nbcrow-token-parser.js +1 -1
- package/lib/token/order-token-parser.js +1 -1
- package/lib/token/returnstatus-token-parser.js +1 -1
- package/lib/token/returnvalue-token-parser.js +1 -1
- package/lib/token/sspi-token-parser.js +1 -1
- package/lib/token/stream-parser.js +1 -1
- package/lib/token/token-stream-parser.js +1 -1
- package/lib/utils/with-timeout.js +45 -0
- package/lib/value-parser.js +1 -1
- package/package.json +4 -4
- package/types/native-duplexpair.d.ts +12 -0
package/lib/instance-lookup.js
CHANGED
|
@@ -3,14 +3,17 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.instanceLookup = instanceLookup;
|
|
7
|
+
exports.parseBrowserResponse = parseBrowserResponse;
|
|
7
8
|
|
|
8
9
|
var _dns = _interopRequireDefault(require("dns"));
|
|
9
10
|
|
|
10
|
-
var
|
|
11
|
+
var _abortError = _interopRequireDefault(require("./errors/abort-error"));
|
|
11
12
|
|
|
12
13
|
var _sender = require("./sender");
|
|
13
14
|
|
|
15
|
+
var _withTimeout = require("./utils/with-timeout");
|
|
16
|
+
|
|
14
17
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
18
|
|
|
16
19
|
const SQL_SERVER_BROWSER_PORT = 1434;
|
|
@@ -19,149 +22,106 @@ const RETRIES = 3; // There are three bytes at the start of the response, whose
|
|
|
19
22
|
|
|
20
23
|
const MYSTERY_HEADER_LENGTH = 3;
|
|
21
24
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
// Most of the functionality has been determined from from jTDS's MSSqlServerInfo class.
|
|
26
|
+
async function instanceLookup(options) {
|
|
27
|
+
const server = options.server;
|
|
28
|
+
|
|
29
|
+
if (typeof server !== 'string') {
|
|
30
|
+
throw new TypeError('Invalid arguments: "server" must be a string');
|
|
28
31
|
}
|
|
29
32
|
|
|
30
|
-
|
|
33
|
+
const instanceName = options.instanceName;
|
|
31
34
|
|
|
35
|
+
if (typeof instanceName !== 'string') {
|
|
36
|
+
throw new TypeError('Invalid arguments: "instanceName" must be a string');
|
|
37
|
+
}
|
|
32
38
|
|
|
33
|
-
|
|
34
|
-
instanceLookup(options, callback) {
|
|
35
|
-
var _options$lookup, _options$port;
|
|
39
|
+
const timeout = options.timeout === undefined ? TIMEOUT : options.timeout;
|
|
36
40
|
|
|
37
|
-
|
|
41
|
+
if (typeof timeout !== 'number') {
|
|
42
|
+
throw new TypeError('Invalid arguments: "timeout" must be a number');
|
|
43
|
+
}
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
throw new TypeError('Invalid arguments: "server" must be a string');
|
|
41
|
-
}
|
|
45
|
+
const retries = options.retries === undefined ? RETRIES : options.retries;
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
if (typeof retries !== 'number') {
|
|
48
|
+
throw new TypeError('Invalid arguments: "retries" must be a number');
|
|
49
|
+
}
|
|
44
50
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
if (options.lookup !== undefined && typeof options.lookup !== 'function') {
|
|
52
|
+
throw new TypeError('Invalid arguments: "lookup" must be a function');
|
|
53
|
+
}
|
|
48
54
|
|
|
49
|
-
|
|
55
|
+
const lookup = options.lookup ?? _dns.default.lookup;
|
|
50
56
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
if (options.port !== undefined && typeof options.port !== 'number') {
|
|
58
|
+
throw new TypeError('Invalid arguments: "port" must be a number');
|
|
59
|
+
}
|
|
54
60
|
|
|
55
|
-
|
|
61
|
+
const port = options.port ?? SQL_SERVER_BROWSER_PORT;
|
|
62
|
+
const signal = options.signal;
|
|
56
63
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
64
|
+
if (signal.aborted) {
|
|
65
|
+
throw new _abortError.default();
|
|
66
|
+
}
|
|
60
67
|
|
|
61
|
-
|
|
62
|
-
throw new TypeError('Invalid arguments: "lookup" must be a function');
|
|
63
|
-
}
|
|
68
|
+
let response;
|
|
64
69
|
|
|
65
|
-
|
|
70
|
+
for (let i = 0; i <= retries; i++) {
|
|
71
|
+
try {
|
|
72
|
+
response = await (0, _withTimeout.withTimeout)(timeout, async signal => {
|
|
73
|
+
const request = Buffer.from([0x02]);
|
|
74
|
+
return await (0, _sender.sendMessage)(options.server, port, lookup, signal, request);
|
|
75
|
+
}, signal);
|
|
76
|
+
} catch (err) {
|
|
77
|
+
// If the current attempt timed out, continue with the next
|
|
78
|
+
if (!signal.aborted && err instanceof Error && err.name === 'TimeoutError') {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
66
81
|
|
|
67
|
-
|
|
68
|
-
throw new TypeError('Invalid arguments: "port" must be a number');
|
|
82
|
+
throw err;
|
|
69
83
|
}
|
|
84
|
+
}
|
|
70
85
|
|
|
71
|
-
|
|
72
|
-
|
|
86
|
+
if (!response) {
|
|
87
|
+
throw new Error('Failed to get response from SQL Server Browser on ' + server);
|
|
88
|
+
}
|
|
73
89
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
90
|
+
const message = response.toString('ascii', MYSTERY_HEADER_LENGTH);
|
|
91
|
+
const foundPort = parseBrowserResponse(message, instanceName);
|
|
77
92
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
93
|
+
if (!foundPort) {
|
|
94
|
+
throw new Error('Port for ' + instanceName + ' not found in ' + options.server);
|
|
95
|
+
}
|
|
81
96
|
|
|
82
|
-
|
|
97
|
+
return foundPort;
|
|
98
|
+
}
|
|
83
99
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const controller = new _nodeAbortController.AbortController();
|
|
100
|
+
function parseBrowserResponse(response, instanceName) {
|
|
101
|
+
let getPort;
|
|
102
|
+
const instances = response.split(';;');
|
|
88
103
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
// forward the abort to the controller of the current
|
|
93
|
-
// lookup attempt.
|
|
104
|
+
for (let i = 0, len = instances.length; i < len; i++) {
|
|
105
|
+
const instance = instances[i];
|
|
106
|
+
const parts = instance.split(';');
|
|
94
107
|
|
|
108
|
+
for (let p = 0, partsLen = parts.length; p < partsLen; p += 2) {
|
|
109
|
+
const name = parts[p];
|
|
110
|
+
const value = parts[p + 1];
|
|
95
111
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const request = Buffer.from([0x02]);
|
|
100
|
-
const sender = new _sender.Sender(options.server, port, lookup, controller.signal, request);
|
|
101
|
-
const timer = setTimeout(abortCurrentAttempt, timeout);
|
|
102
|
-
sender.execute((err, response) => {
|
|
103
|
-
clearTimeout(timer);
|
|
104
|
-
|
|
105
|
-
if (err) {
|
|
106
|
-
if ((err === null || err === void 0 ? void 0 : err.name) === 'AbortError') {
|
|
107
|
-
// If the overall instance lookup was aborted,
|
|
108
|
-
// do not perform any further attempts.
|
|
109
|
-
if (signal.aborted) {
|
|
110
|
-
return callback(new AbortError());
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return makeAttempt();
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return callback(new Error('Failed to lookup instance on ' + server + ' - ' + err.message));
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const message = response.toString('ascii', MYSTERY_HEADER_LENGTH);
|
|
120
|
-
const port = this.parseBrowserResponse(message, instanceName);
|
|
121
|
-
|
|
122
|
-
if (port) {
|
|
123
|
-
callback(undefined, port);
|
|
124
|
-
} else {
|
|
125
|
-
callback(new Error('Port for ' + instanceName + ' not found in ' + options.server));
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
} else {
|
|
129
|
-
callback(new Error('Failed to get response from SQL Server Browser on ' + server));
|
|
112
|
+
if (name === 'tcp' && getPort) {
|
|
113
|
+
const port = parseInt(value, 10);
|
|
114
|
+
return port;
|
|
130
115
|
}
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
makeAttempt();
|
|
134
|
-
}
|
|
135
116
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const instance = instances[i];
|
|
142
|
-
const parts = instance.split(';');
|
|
143
|
-
|
|
144
|
-
for (let p = 0, partsLen = parts.length; p < partsLen; p += 2) {
|
|
145
|
-
const name = parts[p];
|
|
146
|
-
const value = parts[p + 1];
|
|
147
|
-
|
|
148
|
-
if (name === 'tcp' && getPort) {
|
|
149
|
-
const port = parseInt(value, 10);
|
|
150
|
-
return port;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (name === 'InstanceName') {
|
|
154
|
-
if (value.toUpperCase() === instanceName.toUpperCase()) {
|
|
155
|
-
getPort = true;
|
|
156
|
-
} else {
|
|
157
|
-
getPort = false;
|
|
158
|
-
}
|
|
117
|
+
if (name === 'InstanceName') {
|
|
118
|
+
if (value.toUpperCase() === instanceName.toUpperCase()) {
|
|
119
|
+
getPort = true;
|
|
120
|
+
} else {
|
|
121
|
+
getPort = false;
|
|
159
122
|
}
|
|
160
123
|
}
|
|
161
124
|
}
|
|
162
125
|
}
|
|
163
|
-
|
|
164
126
|
}
|
|
165
|
-
|
|
166
|
-
exports.InstanceLookup = InstanceLookup;
|
|
167
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTUUxfU0VSVkVSX0JST1dTRVJfUE9SVCIsIlRJTUVPVVQiLCJSRVRSSUVTIiwiTVlTVEVSWV9IRUFERVJfTEVOR1RIIiwiQWJvcnRFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJjb2RlIiwibmFtZSIsIkluc3RhbmNlTG9va3VwIiwiaW5zdGFuY2VMb29rdXAiLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZXJ2ZXIiLCJUeXBlRXJyb3IiLCJpbnN0YW5jZU5hbWUiLCJ0aW1lb3V0IiwidW5kZWZpbmVkIiwicmV0cmllcyIsImxvb2t1cCIsImRucyIsInBvcnQiLCJzaWduYWwiLCJhYm9ydGVkIiwicHJvY2VzcyIsIm5leHRUaWNrIiwicmV0cmllc0xlZnQiLCJtYWtlQXR0ZW1wdCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJhYm9ydEN1cnJlbnRBdHRlbXB0IiwiYWJvcnQiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsInJlcXVlc3QiLCJCdWZmZXIiLCJmcm9tIiwic2VuZGVyIiwiU2VuZGVyIiwidGltZXIiLCJzZXRUaW1lb3V0IiwiZXhlY3V0ZSIsImVyciIsInJlc3BvbnNlIiwiY2xlYXJUaW1lb3V0IiwibWVzc2FnZSIsInRvU3RyaW5nIiwicGFyc2VCcm93c2VyUmVzcG9uc2UiLCJnZXRQb3J0IiwiaW5zdGFuY2VzIiwic3BsaXQiLCJpIiwibGVuIiwibGVuZ3RoIiwiaW5zdGFuY2UiLCJwYXJ0cyIsInAiLCJwYXJ0c0xlbiIsInZhbHVlIiwicGFyc2VJbnQiLCJ0b1VwcGVyQ2FzZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0YW5jZS1sb29rdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRucyBmcm9tICdkbnMnO1xuaW1wb3J0IHsgQWJvcnRDb250cm9sbGVyLCBBYm9ydFNpZ25hbCB9IGZyb20gJ25vZGUtYWJvcnQtY29udHJvbGxlcic7XG5cbmltcG9ydCB7IFNlbmRlciB9IGZyb20gJy4vc2VuZGVyJztcblxuY29uc3QgU1FMX1NFUlZFUl9CUk9XU0VSX1BPUlQgPSAxNDM0O1xuY29uc3QgVElNRU9VVCA9IDIgKiAxMDAwO1xuY29uc3QgUkVUUklFUyA9IDM7XG4vLyBUaGVyZSBhcmUgdGhyZWUgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZXNwb25zZSwgd2hvc2UgcHVycG9zZSBpcyB1bmtub3duLlxuY29uc3QgTVlTVEVSWV9IRUFERVJfTEVOR1RIID0gMztcblxudHlwZSBMb29rdXBGdW5jdGlvbiA9IChob3N0bmFtZTogc3RyaW5nLCBvcHRpb25zOiBkbnMuTG9va3VwQWxsT3B0aW9ucywgY2FsbGJhY2s6IChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IG51bGwsIGFkZHJlc3NlczogZG5zLkxvb2t1cEFkZHJlc3NbXSkgPT4gdm9pZCkgPT4gdm9pZDtcblxuY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJyk7XG5cbiAgICB0aGlzLmNvZGUgPSAnQUJPUlRfRVJSJztcbiAgICB0aGlzLm5hbWUgPSAnQWJvcnRFcnJvcic7XG4gIH1cbn1cblxuLy8gTW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBkZXRlcm1pbmVkIGZyb20gZnJvbSBqVERTJ3MgTVNTcWxTZXJ2ZXJJbmZvIGNsYXNzLlxuZXhwb3J0IGNsYXNzIEluc3RhbmNlTG9va3VwIHtcbiAgaW5zdGFuY2VMb29rdXAob3B0aW9uczogeyBzZXJ2ZXI6IHN0cmluZywgaW5zdGFuY2VOYW1lOiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXIsIHJldHJpZXM/OiBudW1iZXIsIHBvcnQ/OiBudW1iZXIsIGxvb2t1cD86IExvb2t1cEZ1bmN0aW9uLCBzaWduYWw6IEFib3J0U2lnbmFsIH0sIGNhbGxiYWNrOiAoZXJyOiBFcnJvciB8IHVuZGVmaW5lZCwgcG9ydD86IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IHNlcnZlciA9IG9wdGlvbnMuc2VydmVyO1xuICAgIGlmICh0eXBlb2Ygc2VydmVyICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwic2VydmVyXCIgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IG9wdGlvbnMuaW5zdGFuY2VOYW1lO1xuICAgIGlmICh0eXBlb2YgaW5zdGFuY2VOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwiaW5zdGFuY2VOYW1lXCIgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgPT09IHVuZGVmaW5lZCA/IFRJTUVPVVQgOiBvcHRpb25zLnRpbWVvdXQ7XG4gICAgaWYgKHR5cGVvZiB0aW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwidGltZW91dFwiIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXRyaWVzID0gb3B0aW9ucy5yZXRyaWVzID09PSB1bmRlZmluZWQgPyBSRVRSSUVTIDogb3B0aW9ucy5yZXRyaWVzO1xuICAgIGlmICh0eXBlb2YgcmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzOiBcInJldHJpZXNcIiBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubG9va3VwICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMubG9va3VwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50czogXCJsb29rdXBcIiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3QgbG9va3VwID0gb3B0aW9ucy5sb29rdXAgPz8gZG5zLmxvb2t1cDtcblxuICAgIGlmIChvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5wb3J0ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwicG9ydFwiIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gICAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyBTUUxfU0VSVkVSX0JST1dTRVJfUE9SVDtcblxuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwiY2FsbGJhY2tcIiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgQWJvcnRFcnJvcigpKTtcbiAgICB9XG5cbiAgICBsZXQgcmV0cmllc0xlZnQgPSByZXRyaWVzO1xuXG4gICAgY29uc3QgbWFrZUF0dGVtcHQgPSAoKSA9PiB7XG4gICAgICBpZiAocmV0cmllc0xlZnQgPj0gMCkge1xuICAgICAgICByZXRyaWVzTGVmdC0tO1xuXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgICAgY29uc3QgYWJvcnRDdXJyZW50QXR0ZW1wdCA9ICgpID0+IHtcbiAgICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSWYgdGhlIG92ZXJhbGwgaW5zdGFuY2UgbG9va3VwIGlzIGFib3J0ZWQsXG4gICAgICAgIC8vIGZvcndhcmQgdGhlIGFib3J0IHRvIHRoZSBjb250cm9sbGVyIG9mIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIGxvb2t1cCBhdHRlbXB0LlxuICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEN1cnJlbnRBdHRlbXB0LCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJ1ZmZlci5mcm9tKFsweDAyXSk7XG4gICAgICAgIGNvbnN0IHNlbmRlciA9IG5ldyBTZW5kZXIob3B0aW9ucy5zZXJ2ZXIsIHBvcnQsIGxvb2t1cCwgY29udHJvbGxlci5zaWduYWwsIHJlcXVlc3QpO1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoYWJvcnRDdXJyZW50QXR0ZW1wdCwgdGltZW91dCk7XG4gICAgICAgIHNlbmRlci5leGVjdXRlKChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcblxuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgb3ZlcmFsbCBpbnN0YW5jZSBsb29rdXAgd2FzIGFib3J0ZWQsXG4gICAgICAgICAgICAgIC8vIGRvIG5vdCBwZXJmb3JtIGFueSBmdXJ0aGVyIGF0dGVtcHRzLlxuICAgICAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEFib3J0RXJyb3IoKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gbWFrZUF0dGVtcHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignRmFpbGVkIHRvIGxvb2t1cCBpbnN0YW5jZSBvbiAnICsgc2VydmVyICsgJyAtICcgKyBlcnIubWVzc2FnZSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXNwb25zZSEudG9TdHJpbmcoJ2FzY2lpJywgTVlTVEVSWV9IRUFERVJfTEVOR1RIKTtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5wYXJzZUJyb3dzZXJSZXNwb25zZShtZXNzYWdlLCBpbnN0YW5jZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKHBvcnQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgcG9ydCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignUG9ydCBmb3IgJyArIGluc3RhbmNlTmFtZSArICcgbm90IGZvdW5kIGluICcgKyBvcHRpb25zLnNlcnZlcikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgcmVzcG9uc2UgZnJvbSBTUUwgU2VydmVyIEJyb3dzZXIgb24gJyArIHNlcnZlcikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBtYWtlQXR0ZW1wdCgpO1xuICB9XG5cbiAgcGFyc2VCcm93c2VyUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZywgaW5zdGFuY2VOYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgZ2V0UG9ydDtcblxuICAgIGNvbnN0IGluc3RhbmNlcyA9IHJlc3BvbnNlLnNwbGl0KCc7OycpO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpbnN0YW5jZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VzW2ldO1xuICAgICAgY29uc3QgcGFydHMgPSBpbnN0YW5jZS5zcGxpdCgnOycpO1xuXG4gICAgICBmb3IgKGxldCBwID0gMCwgcGFydHNMZW4gPSBwYXJ0cy5sZW5ndGg7IHAgPCBwYXJ0c0xlbjsgcCArPSAyKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwYXJ0c1twXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJ0c1twICsgMV07XG5cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0Y3AnICYmIGdldFBvcnQpIHtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgICAgICByZXR1cm4gcG9ydDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lID09PSAnSW5zdGFuY2VOYW1lJykge1xuICAgICAgICAgIGlmICh2YWx1ZS50b1VwcGVyQ2FzZSgpID09PSBpbnN0YW5jZU5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgZ2V0UG9ydCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBvcnQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUVBOzs7O0FBRUEsTUFBTUEsdUJBQXVCLEdBQUcsSUFBaEM7QUFDQSxNQUFNQyxPQUFPLEdBQUcsSUFBSSxJQUFwQjtBQUNBLE1BQU1DLE9BQU8sR0FBRyxDQUFoQixDLENBQ0E7O0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsQ0FBOUI7O0FBSUEsTUFBTUMsVUFBTixTQUF5QkMsS0FBekIsQ0FBK0I7RUFHN0JDLFdBQVcsR0FBRztJQUNaLE1BQU0sMkJBQU47SUFEWSxLQUZkQyxJQUVjO0lBR1osS0FBS0EsSUFBTCxHQUFZLFdBQVo7SUFDQSxLQUFLQyxJQUFMLEdBQVksWUFBWjtFQUNEOztBQVI0QixDLENBVy9COzs7QUFDTyxNQUFNQyxjQUFOLENBQXFCO0VBQzFCQyxjQUFjLENBQUNDLE9BQUQsRUFBcUpDLFFBQXJKLEVBQWdOO0lBQUE7O0lBQzVOLE1BQU1DLE1BQU0sR0FBR0YsT0FBTyxDQUFDRSxNQUF2Qjs7SUFDQSxJQUFJLE9BQU9BLE1BQVAsS0FBa0IsUUFBdEIsRUFBZ0M7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
|
|
127
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTUUxfU0VSVkVSX0JST1dTRVJfUE9SVCIsIlRJTUVPVVQiLCJSRVRSSUVTIiwiTVlTVEVSWV9IRUFERVJfTEVOR1RIIiwiaW5zdGFuY2VMb29rdXAiLCJvcHRpb25zIiwic2VydmVyIiwiVHlwZUVycm9yIiwiaW5zdGFuY2VOYW1lIiwidGltZW91dCIsInVuZGVmaW5lZCIsInJldHJpZXMiLCJsb29rdXAiLCJkbnMiLCJwb3J0Iiwic2lnbmFsIiwiYWJvcnRlZCIsIkFib3J0RXJyb3IiLCJyZXNwb25zZSIsImkiLCJyZXF1ZXN0IiwiQnVmZmVyIiwiZnJvbSIsImVyciIsIkVycm9yIiwibmFtZSIsIm1lc3NhZ2UiLCJ0b1N0cmluZyIsImZvdW5kUG9ydCIsInBhcnNlQnJvd3NlclJlc3BvbnNlIiwiZ2V0UG9ydCIsImluc3RhbmNlcyIsInNwbGl0IiwibGVuIiwibGVuZ3RoIiwiaW5zdGFuY2UiLCJwYXJ0cyIsInAiLCJwYXJ0c0xlbiIsInZhbHVlIiwicGFyc2VJbnQiLCJ0b1VwcGVyQ2FzZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0YW5jZS1sb29rdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRucyBmcm9tICdkbnMnO1xuaW1wb3J0IHsgQWJvcnRTaWduYWwgfSBmcm9tICdub2RlLWFib3J0LWNvbnRyb2xsZXInO1xuXG5pbXBvcnQgQWJvcnRFcnJvciBmcm9tICcuL2Vycm9ycy9hYm9ydC1lcnJvcic7XG5pbXBvcnQgeyBzZW5kTWVzc2FnZSB9IGZyb20gJy4vc2VuZGVyJztcbmltcG9ydCB7IHdpdGhUaW1lb3V0IH0gZnJvbSAnLi91dGlscy93aXRoLXRpbWVvdXQnO1xuXG5jb25zdCBTUUxfU0VSVkVSX0JST1dTRVJfUE9SVCA9IDE0MzQ7XG5jb25zdCBUSU1FT1VUID0gMiAqIDEwMDA7XG5jb25zdCBSRVRSSUVTID0gMztcbi8vIFRoZXJlIGFyZSB0aHJlZSBieXRlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlc3BvbnNlLCB3aG9zZSBwdXJwb3NlIGlzIHVua25vd24uXG5jb25zdCBNWVNURVJZX0hFQURFUl9MRU5HVEggPSAzO1xuXG50eXBlIExvb2t1cEZ1bmN0aW9uID0gKGhvc3RuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGRucy5Mb29rdXBBbGxPcHRpb25zLCBjYWxsYmFjazogKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgbnVsbCwgYWRkcmVzc2VzOiBkbnMuTG9va3VwQWRkcmVzc1tdKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG4vLyBNb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIGRldGVybWluZWQgZnJvbSBmcm9tIGpURFMncyBNU1NxbFNlcnZlckluZm8gY2xhc3MuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFuY2VMb29rdXAob3B0aW9uczogeyBzZXJ2ZXI6IHN0cmluZywgaW5zdGFuY2VOYW1lOiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXIsIHJldHJpZXM/OiBudW1iZXIsIHBvcnQ/OiBudW1iZXIsIGxvb2t1cD86IExvb2t1cEZ1bmN0aW9uLCBzaWduYWw6IEFib3J0U2lnbmFsIH0pIHtcbiAgY29uc3Qgc2VydmVyID0gb3B0aW9ucy5zZXJ2ZXI7XG4gIGlmICh0eXBlb2Ygc2VydmVyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzOiBcInNlcnZlclwiIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGNvbnN0IGluc3RhbmNlTmFtZSA9IG9wdGlvbnMuaW5zdGFuY2VOYW1lO1xuICBpZiAodHlwZW9mIGluc3RhbmNlTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50czogXCJpbnN0YW5jZU5hbWVcIiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID09PSB1bmRlZmluZWQgPyBUSU1FT1VUIDogb3B0aW9ucy50aW1lb3V0O1xuICBpZiAodHlwZW9mIHRpbWVvdXQgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwidGltZW91dFwiIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJldHJpZXMgPSBvcHRpb25zLnJldHJpZXMgPT09IHVuZGVmaW5lZCA/IFJFVFJJRVMgOiBvcHRpb25zLnJldHJpZXM7XG4gIGlmICh0eXBlb2YgcmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50czogXCJyZXRyaWVzXCIgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubG9va3VwICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMubG9va3VwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwibG9va3VwXCIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgY29uc3QgbG9va3VwID0gb3B0aW9ucy5sb29rdXAgPz8gZG5zLmxvb2t1cDtcblxuICBpZiAob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMucG9ydCAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50czogXCJwb3J0XCIgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgPz8gU1FMX1NFUlZFUl9CUk9XU0VSX1BPUlQ7XG5cbiAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucy5zaWduYWw7XG5cbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKTtcbiAgfVxuXG4gIGxldCByZXNwb25zZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8PSByZXRyaWVzOyBpKyspIHtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB3aXRoVGltZW91dCh0aW1lb3V0LCBhc3luYyAoc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCdWZmZXIuZnJvbShbMHgwMl0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgc2VuZE1lc3NhZ2Uob3B0aW9ucy5zZXJ2ZXIsIHBvcnQsIGxvb2t1cCwgc2lnbmFsLCByZXF1ZXN0KTtcbiAgICAgIH0sIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJZiB0aGUgY3VycmVudCBhdHRlbXB0IHRpbWVkIG91dCwgY29udGludWUgd2l0aCB0aGUgbmV4dFxuICAgICAgaWYgKCFzaWduYWwuYWJvcnRlZCAmJiBlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubmFtZSA9PT0gJ1RpbWVvdXRFcnJvcicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIGZyb20gU1FMIFNlcnZlciBCcm93c2VyIG9uICcgKyBzZXJ2ZXIpO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHJlc3BvbnNlLnRvU3RyaW5nKCdhc2NpaScsIE1ZU1RFUllfSEVBREVSX0xFTkdUSCk7XG4gIGNvbnN0IGZvdW5kUG9ydCA9IHBhcnNlQnJvd3NlclJlc3BvbnNlKG1lc3NhZ2UsIGluc3RhbmNlTmFtZSk7XG5cbiAgaWYgKCFmb3VuZFBvcnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnQgZm9yICcgKyBpbnN0YW5jZU5hbWUgKyAnIG5vdCBmb3VuZCBpbiAnICsgb3B0aW9ucy5zZXJ2ZXIpO1xuICB9XG5cbiAgcmV0dXJuIGZvdW5kUG9ydDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnJvd3NlclJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcsIGluc3RhbmNlTmFtZTogc3RyaW5nKSB7XG4gIGxldCBnZXRQb3J0O1xuXG4gIGNvbnN0IGluc3RhbmNlcyA9IHJlc3BvbnNlLnNwbGl0KCc7OycpO1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gaW5zdGFuY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaV07XG4gICAgY29uc3QgcGFydHMgPSBpbnN0YW5jZS5zcGxpdCgnOycpO1xuXG4gICAgZm9yIChsZXQgcCA9IDAsIHBhcnRzTGVuID0gcGFydHMubGVuZ3RoOyBwIDwgcGFydHNMZW47IHAgKz0gMikge1xuICAgICAgY29uc3QgbmFtZSA9IHBhcnRzW3BdO1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXJ0c1twICsgMV07XG5cbiAgICAgIGlmIChuYW1lID09PSAndGNwJyAmJiBnZXRQb3J0KSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICByZXR1cm4gcG9ydDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgPT09ICdJbnN0YW5jZU5hbWUnKSB7XG4gICAgICAgIGlmICh2YWx1ZS50b1VwcGVyQ2FzZSgpID09PSBpbnN0YW5jZU5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgIGdldFBvcnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdldFBvcnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQUdBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsdUJBQXVCLEdBQUcsSUFBaEM7QUFDQSxNQUFNQyxPQUFPLEdBQUcsSUFBSSxJQUFwQjtBQUNBLE1BQU1DLE9BQU8sR0FBRyxDQUFoQixDLENBQ0E7O0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsQ0FBOUI7O0FBSUE7QUFDTyxlQUFl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
|
package/lib/message-io.js
CHANGED
|
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
+
var _nativeDuplexpair = _interopRequireDefault(require("native-duplexpair"));
|
|
9
|
+
|
|
8
10
|
var tls = _interopRequireWildcard(require("tls"));
|
|
9
11
|
|
|
10
12
|
var _events = require("events");
|
|
@@ -17,14 +19,11 @@ var _incomingMessageStream = _interopRequireDefault(require("./incoming-message-
|
|
|
17
19
|
|
|
18
20
|
var _outgoingMessageStream = _interopRequireDefault(require("./outgoing-message-stream"));
|
|
19
21
|
|
|
20
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
22
22
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
23
|
|
|
24
24
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
const DuplexPair = require('native-duplexpair');
|
|
26
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
28
27
|
|
|
29
28
|
class MessageIO extends _events.EventEmitter {
|
|
30
29
|
constructor(socket, packetSize, debug) {
|
|
@@ -60,60 +59,100 @@ class MessageIO extends _events.EventEmitter {
|
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
return this.outgoingMessageStream.packetSize;
|
|
63
|
-
}
|
|
62
|
+
} // Negotiate TLS encryption.
|
|
64
63
|
|
|
65
|
-
startTls(secureContext, hostname, trustServerCertificate) {
|
|
66
|
-
const duplexpair = new DuplexPair();
|
|
67
|
-
const securePair = this.securePair = {
|
|
68
|
-
cleartext: tls.connect({
|
|
69
|
-
socket: duplexpair.socket1,
|
|
70
|
-
servername: hostname,
|
|
71
|
-
secureContext: secureContext,
|
|
72
|
-
rejectUnauthorized: !trustServerCertificate
|
|
73
|
-
}),
|
|
74
|
-
encrypted: duplexpair.socket2
|
|
75
|
-
}; // If an error happens in the TLS layer, there is nothing we can do about it.
|
|
76
|
-
// Forward the error to the socket so the connection gets properly cleaned up.
|
|
77
|
-
|
|
78
|
-
securePair.cleartext.on('error', err => {
|
|
79
|
-
// Streams in node.js versions before 8.0.0 don't support `.destroy`
|
|
80
|
-
if (typeof securePair.encrypted.destroy === 'function') {
|
|
81
|
-
securePair.encrypted.destroy();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
this.socket.destroy(err);
|
|
85
|
-
});
|
|
86
|
-
securePair.cleartext.on('secureConnect', () => {
|
|
87
|
-
const cipher = securePair.cleartext.getCipher();
|
|
88
64
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
65
|
+
startTls(credentialsDetails, hostname, trustServerCertificate) {
|
|
66
|
+
if (!credentialsDetails.maxVersion || !['TLSv1.2', 'TLSv1.1', 'TLSv1'].includes(credentialsDetails.maxVersion)) {
|
|
67
|
+
credentialsDetails.maxVersion = 'TLSv1.2';
|
|
68
|
+
}
|
|
92
69
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
70
|
+
const secureContext = tls.createSecureContext(credentialsDetails);
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
const duplexpair = new _nativeDuplexpair.default();
|
|
73
|
+
const securePair = this.securePair = {
|
|
74
|
+
cleartext: tls.connect({
|
|
75
|
+
socket: duplexpair.socket1,
|
|
76
|
+
servername: hostname,
|
|
77
|
+
secureContext: secureContext,
|
|
78
|
+
rejectUnauthorized: !trustServerCertificate
|
|
79
|
+
}),
|
|
80
|
+
encrypted: duplexpair.socket2
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const onSecureConnect = () => {
|
|
84
|
+
securePair.encrypted.removeListener('readable', onReadable);
|
|
85
|
+
securePair.cleartext.removeListener('error', onError);
|
|
86
|
+
securePair.cleartext.removeListener('secureConnect', onSecureConnect); // If we encounter any errors from this point on,
|
|
87
|
+
// we just forward them to the actual network socket.
|
|
88
|
+
|
|
89
|
+
securePair.cleartext.once('error', err => {
|
|
90
|
+
this.socket.destroy(err);
|
|
91
|
+
});
|
|
92
|
+
const cipher = securePair.cleartext.getCipher();
|
|
93
|
+
|
|
94
|
+
if (cipher) {
|
|
95
|
+
this.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
this.emit('secure', securePair.cleartext);
|
|
99
|
+
securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);
|
|
100
|
+
this.outgoingMessageStream.unpipe(this.socket);
|
|
101
|
+
this.socket.unpipe(this.incomingMessageStream);
|
|
102
|
+
this.socket.pipe(securePair.encrypted);
|
|
103
|
+
securePair.encrypted.pipe(this.socket);
|
|
104
|
+
securePair.cleartext.pipe(this.incomingMessageStream);
|
|
105
|
+
this.outgoingMessageStream.pipe(securePair.cleartext);
|
|
106
|
+
this.tlsNegotiationComplete = true;
|
|
107
|
+
resolve();
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const onError = err => {
|
|
111
|
+
securePair.encrypted.removeListener('readable', onReadable);
|
|
112
|
+
securePair.cleartext.removeListener('error', onError);
|
|
113
|
+
securePair.cleartext.removeListener('secureConnect', onSecureConnect);
|
|
114
|
+
securePair.cleartext.destroy();
|
|
115
|
+
securePair.encrypted.destroy();
|
|
116
|
+
reject(err);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const onReadable = () => {
|
|
120
|
+
// When there is handshake data on the encryped stream of the secure pair,
|
|
121
|
+
// we wrap it into a `PRELOGIN` message and send it to the server.
|
|
122
|
+
//
|
|
123
|
+
// For each `PRELOGIN` message we sent we get back exactly one response message
|
|
124
|
+
// that contains the server's handshake response data.
|
|
125
|
+
const message = new _message.default({
|
|
126
|
+
type: _packet.TYPE.PRELOGIN,
|
|
127
|
+
resetConnection: false
|
|
128
|
+
});
|
|
129
|
+
let chunk;
|
|
130
|
+
|
|
131
|
+
while (chunk = securePair.encrypted.read()) {
|
|
132
|
+
message.write(chunk);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
this.outgoingMessageStream.write(message);
|
|
136
|
+
message.end();
|
|
137
|
+
this.readMessage().then(async response => {
|
|
138
|
+
// Setup readable handler for the next round of handshaking.
|
|
139
|
+
// If we encounter a `secureConnect` on the cleartext side
|
|
140
|
+
// of the secure pair, the `readable` handler is cleared
|
|
141
|
+
// and no further handshake handling will happen.
|
|
142
|
+
securePair.encrypted.once('readable', onReadable);
|
|
143
|
+
|
|
144
|
+
for await (const data of response) {
|
|
145
|
+
// We feed the server's handshake response back into the
|
|
146
|
+
// encrypted end of the secure pair.
|
|
147
|
+
securePair.encrypted.write(data);
|
|
148
|
+
}
|
|
149
|
+
}).catch(onError);
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
securePair.cleartext.once('error', onError);
|
|
153
|
+
securePair.cleartext.once('secureConnect', onSecureConnect);
|
|
154
|
+
securePair.encrypted.once('readable', onReadable);
|
|
98
155
|
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
encryptAllFutureTraffic() {
|
|
102
|
-
const securePair = this.securePair;
|
|
103
|
-
securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);
|
|
104
|
-
securePair.encrypted.removeAllListeners('data');
|
|
105
|
-
this.outgoingMessageStream.unpipe(this.socket);
|
|
106
|
-
this.socket.unpipe(this.incomingMessageStream);
|
|
107
|
-
this.socket.pipe(securePair.encrypted);
|
|
108
|
-
securePair.encrypted.pipe(this.socket);
|
|
109
|
-
securePair.cleartext.pipe(this.incomingMessageStream);
|
|
110
|
-
this.outgoingMessageStream.pipe(securePair.cleartext);
|
|
111
|
-
this.tlsNegotiationComplete = true;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
tlsHandshakeData(data) {
|
|
115
|
-
const securePair = this.securePair;
|
|
116
|
-
securePair.encrypted.write(data);
|
|
117
156
|
} // TODO listen for 'drain' event when socket.write returns false.
|
|
118
157
|
// TODO implement incomplete request cancelation (2.2.1.6)
|
|
119
158
|
|
|
@@ -140,16 +179,6 @@ class MessageIO extends _events.EventEmitter {
|
|
|
140
179
|
}
|
|
141
180
|
|
|
142
181
|
return result.value;
|
|
143
|
-
} // Temporarily suspends the flow of incoming packets.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
pause() {
|
|
147
|
-
this.incomingMessageStream.pause();
|
|
148
|
-
} // Resumes the flow of incoming packets.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
resume() {
|
|
152
|
-
this.incomingMessageStream.resume();
|
|
153
182
|
}
|
|
154
183
|
|
|
155
184
|
}
|
|
@@ -157,4 +186,4 @@ class MessageIO extends _events.EventEmitter {
|
|
|
157
186
|
var _default = MessageIO;
|
|
158
187
|
exports.default = _default;
|
|
159
188
|
module.exports = MessageIO;
|
|
160
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEdXBsZXhQYWlyIiwicmVxdWlyZSIsIk1lc3NhZ2VJTyIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwic29ja2V0IiwicGFja2V0U2l6ZSIsImRlYnVnIiwidGxzTmVnb3RpYXRpb25Db21wbGV0ZSIsImluY29taW5nTWVzc2FnZVN0cmVhbSIsIm91dGdvaW5nTWVzc2FnZVN0cmVhbSIsInNlY3VyZVBhaXIiLCJpbmNvbWluZ01lc3NhZ2VJdGVyYXRvciIsIkluY29taW5nTWVzc2FnZVN0cmVhbSIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJPdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJwaXBlIiwiYXJncyIsImxlbmd0aCIsImxvZyIsImNsZWFydGV4dCIsInNldE1heFNlbmRGcmFnbWVudCIsInN0YXJ0VGxzIiwic2VjdXJlQ29udGV4dCIsImhvc3RuYW1lIiwidHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSIsImR1cGxleHBhaXIiLCJ0bHMiLCJjb25uZWN0Iiwic29ja2V0MSIsInNlcnZlcm5hbWUiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJlbmNyeXB0ZWQiLCJzb2NrZXQyIiwib24iLCJlcnIiLCJkZXN0cm95IiwiY2lwaGVyIiwiZ2V0Q2lwaGVyIiwibmFtZSIsInZlcnNpb24iLCJlbWl0IiwiZW5jcnlwdEFsbEZ1dHVyZVRyYWZmaWMiLCJkYXRhIiwic2VuZE1lc3NhZ2UiLCJUWVBFIiwiUFJFTE9HSU4iLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJ1bnBpcGUiLCJ0bHNIYW5kc2hha2VEYXRhIiwid3JpdGUiLCJwYWNrZXRUeXBlIiwicmVzZXRDb25uZWN0aW9uIiwibWVzc2FnZSIsIk1lc3NhZ2UiLCJ0eXBlIiwiZW5kIiwicmVhZE1lc3NhZ2UiLCJyZXN1bHQiLCJuZXh0IiwiZG9uZSIsIkVycm9yIiwidmFsdWUiLCJwYXVzZSIsInJlc3VtZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvbWVzc2FnZS1pby50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgRHVwbGV4UGFpciA9IHJlcXVpcmUoJ25hdGl2ZS1kdXBsZXhwYWlyJyk7XG5cbmltcG9ydCB7IER1cGxleCB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgKiBhcyB0bHMgZnJvbSAndGxzJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJ25ldCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuXG5pbXBvcnQgRGVidWcgZnJvbSAnLi9kZWJ1Zyc7XG5cbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vbWVzc2FnZSc7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi9wYWNrZXQnO1xuXG5pbXBvcnQgSW5jb21pbmdNZXNzYWdlU3RyZWFtIGZyb20gJy4vaW5jb21pbmctbWVzc2FnZS1zdHJlYW0nO1xuaW1wb3J0IE91dGdvaW5nTWVzc2FnZVN0cmVhbSBmcm9tICcuL291dGdvaW5nLW1lc3NhZ2Utc3RyZWFtJztcblxuY2xhc3MgTWVzc2FnZUlPIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc29ja2V0OiBTb2NrZXQ7XG4gIGRlYnVnOiBEZWJ1ZztcblxuICB0bHNOZWdvdGlhdGlvbkNvbXBsZXRlOiBib29sZWFuO1xuXG4gIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlU3RyZWFtOiBJbmNvbWluZ01lc3NhZ2VTdHJlYW07XG4gIG91dGdvaW5nTWVzc2FnZVN0cmVhbTogT3V0Z29pbmdNZXNzYWdlU3RyZWFtO1xuXG4gIHNlY3VyZVBhaXI/OiB7XG4gICAgY2xlYXJ0ZXh0OiB0bHMuVExTU29ja2V0O1xuICAgIGVuY3J5cHRlZDogRHVwbGV4O1xuICB9XG5cbiAgaW5jb21pbmdNZXNzYWdlSXRlcmF0b3I6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxNZXNzYWdlPjtcblxuICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IFNvY2tldCwgcGFja2V0U2l6ZTogbnVtYmVyLCBkZWJ1ZzogRGVidWcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnO1xuXG4gICAgdGhpcy50bHNOZWdvdGlhdGlvbkNvbXBsZXRlID0gZmFsc2U7XG5cbiAgICB0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSA9IG5ldyBJbmNvbWluZ01lc3NhZ2VTdHJlYW0odGhpcy5kZWJ1Zyk7XG4gICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VJdGVyYXRvciA9IHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4gICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0gPSBuZXcgT3V0Z29pbmdNZXNzYWdlU3RyZWFtKHRoaXMuZGVidWcsIHsgcGFja2V0U2l6ZTogcGFja2V0U2l6ZSB9KTtcblxuICAgIHRoaXMuc29ja2V0LnBpcGUodGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0pO1xuICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBpcGUodGhpcy5zb2NrZXQpO1xuICB9XG5cbiAgcGFja2V0U2l6ZSguLi5hcmdzOiBbbnVtYmVyXSkge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhY2tldFNpemUgPSBhcmdzWzBdO1xuICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1BhY2tldCBzaXplIGNoYW5nZWQgZnJvbSAnICsgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZSArICcgdG8gJyArIHBhY2tldFNpemUpO1xuICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZSA9IHBhY2tldFNpemU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VjdXJlUGFpcikge1xuICAgICAgdGhpcy5zZWN1cmVQYWlyLmNsZWFydGV4dC5zZXRNYXhTZW5kRnJhZ21lbnQodGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemU7XG4gIH1cblxuICBzdGFydFRscyhzZWN1cmVDb250ZXh0OiB0bHMuU2VjdXJlQ29udGV4dCwgaG9zdG5hbWU6IHN0cmluZywgdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGR1cGxleHBhaXIgPSBuZXcgRHVwbGV4UGFpcigpO1xuICAgIGNvbnN0IHNlY3VyZVBhaXIgPSB0aGlzLnNlY3VyZVBhaXIgPSB7XG4gICAgICBjbGVhcnRleHQ6IHRscy5jb25uZWN0KHtcbiAgICAgICAgc29ja2V0OiBkdXBsZXhwYWlyLnNvY2tldDEgYXMgU29ja2V0LFxuICAgICAgICBzZXJ2ZXJuYW1lOiBob3N0bmFtZSxcbiAgICAgICAgc2VjdXJlQ29udGV4dDogc2VjdXJlQ29udGV4dCxcbiAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiAhdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZVxuICAgICAgfSksXG4gICAgICBlbmNyeXB0ZWQ6IGR1cGxleHBhaXIuc29ja2V0MlxuICAgIH07XG5cbiAgICAvLyBJZiBhbiBlcnJvciBoYXBwZW5zIGluIHRoZSBUTFMgbGF5ZXIsIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0LlxuICAgIC8vIEZvcndhcmQgdGhlIGVycm9yIHRvIHRoZSBzb2NrZXQgc28gdGhlIGNvbm5lY3Rpb24gZ2V0cyBwcm9wZXJseSBjbGVhbmVkIHVwLlxuICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0Lm9uKCdlcnJvcicsIChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgLy8gU3RyZWFtcyBpbiBub2RlLmpzIHZlcnNpb25zIGJlZm9yZSA4LjAuMCBkb24ndCBzdXBwb3J0IGAuZGVzdHJveWBcbiAgICAgIGlmICh0eXBlb2Ygc2VjdXJlUGFpci5lbmNyeXB0ZWQuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNvY2tldC5kZXN0cm95KGVycik7XG4gICAgfSk7XG5cbiAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5vbignc2VjdXJlQ29ubmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlciA9IHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LmdldENpcGhlcigpO1xuICAgICAgaWYgKGNpcGhlcikge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZygnVExTIG5lZ290aWF0ZWQgKCcgKyBjaXBoZXIubmFtZSArICcsICcgKyBjaXBoZXIudmVyc2lvbiArICcpJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXQoJ3NlY3VyZScsIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0KTtcbiAgICAgIHRoaXMuZW5jcnlwdEFsbEZ1dHVyZVRyYWZmaWMoKTtcbiAgICB9KTtcblxuICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgdGhpcy5zZW5kTWVzc2FnZShUWVBFLlBSRUxPR0lOLCBkYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBlbmNyeXB0QWxsRnV0dXJlVHJhZmZpYygpIHtcbiAgICBjb25zdCBzZWN1cmVQYWlyID0gdGhpcy5zZWN1cmVQYWlyITtcblxuICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnNldE1heFNlbmRGcmFnbWVudCh0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplKTtcbiAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2RhdGEnKTtcblxuICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnVucGlwZSh0aGlzLnNvY2tldCk7XG4gICAgdGhpcy5zb2NrZXQudW5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcblxuICAgIHRoaXMuc29ja2V0LnBpcGUoc2VjdXJlUGFpci5lbmNyeXB0ZWQpO1xuICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLnBpcGUodGhpcy5zb2NrZXQpO1xuXG4gICAgc2VjdXJlUGFpci5jbGVhcnRleHQucGlwZSh0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSk7XG4gICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGlwZShzZWN1cmVQYWlyLmNsZWFydGV4dCk7XG5cbiAgICB0aGlzLnRsc05lZ290aWF0aW9uQ29tcGxldGUgPSB0cnVlO1xuICB9XG5cbiAgdGxzSGFuZHNoYWtlRGF0YShkYXRhOiBCdWZmZXIpIHtcbiAgICBjb25zdCBzZWN1cmVQYWlyID0gdGhpcy5zZWN1cmVQYWlyITtcblxuICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLndyaXRlKGRhdGEpO1xuICB9XG5cbiAgLy8gVE9ETyBsaXN0ZW4gZm9yICdkcmFpbicgZXZlbnQgd2hlbiBzb2NrZXQud3JpdGUgcmV0dXJucyBmYWxzZS5cbiAgLy8gVE9ETyBpbXBsZW1lbnQgaW5jb21wbGV0ZSByZXF1ZXN0IGNhbmNlbGF0aW9uICgyLjIuMS42KVxuICBzZW5kTWVzc2FnZShwYWNrZXRUeXBlOiBudW1iZXIsIGRhdGE/OiBCdWZmZXIsIHJlc2V0Q29ubmVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBwYWNrZXRUeXBlLCByZXNldENvbm5lY3Rpb246IHJlc2V0Q29ubmVjdGlvbiB9KTtcbiAgICBtZXNzYWdlLmVuZChkYXRhKTtcbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBuZXh0IGluY29taW5nIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0LlxuICAgKi9cbiAgYXN5bmMgcmVhZE1lc3NhZ2UoKTogUHJvbWlzZTxNZXNzYWdlPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5pbmNvbWluZ01lc3NhZ2VJdGVyYXRvci5uZXh0KCk7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBlbmQgb2YgbWVzc2FnZSBzdHJlYW0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgLy8gVGVtcG9yYXJpbHkgc3VzcGVuZHMgdGhlIGZsb3cgb2YgaW5jb21pbmcgcGFja2V0cy5cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0ucGF1c2UoKTtcbiAgfVxuXG4gIC8vIFJlc3VtZXMgdGhlIGZsb3cgb2YgaW5jb21pbmcgcGFja2V0cy5cbiAgcmVzdW1lKCkge1xuICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtLnJlc3VtZSgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VJTztcbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZUlPO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBSUE7O0FBRUE7O0FBSUE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7O0FBZEE7QUFDQSxNQUFNQSxVQUFVLEdBQUdDLE9BQU8sQ0FBQyxtQkFBRCxDQUExQjs7QUFlQSxNQUFNQyxTQUFOLFNBQXdCQyxvQkFBeEIsQ0FBcUM7RUFnQm5DQyxXQUFXLENBQUNDLE1BQUQsRUFBaUJDLFVBQWpCLEVBQXFDQyxLQUFyQyxFQUFtRDtJQUM1RDtJQUQ0RCxLQWY5REYsTUFlOEQ7SUFBQSxLQWQ5REUsS0FjOEQ7SUFBQSxLQVo5REMsc0JBWThEO0lBQUEsS0FWdERDLHFCQVVzRDtJQUFBLEtBVDlEQyxxQkFTOEQ7SUFBQSxLQVA5REMsVUFPOEQ7SUFBQSxLQUY5REMsdUJBRThEO0lBRzVELEtBQUtQLE1BQUwsR0FBY0EsTUFBZDtJQUNBLEtBQUtFLEtBQUwsR0FBYUEsS0FBYjtJQUVBLEtBQUtDLHNCQUFMLEdBQThCLEtBQTlCO0lBRUEsS0FBS0MscUJBQUwsR0FBNkIsSUFB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
|
|
189
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlSU8iLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsInNvY2tldCIsInBhY2tldFNpemUiLCJkZWJ1ZyIsInRsc05lZ290aWF0aW9uQ29tcGxldGUiLCJpbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJvdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJzZWN1cmVQYWlyIiwiaW5jb21pbmdNZXNzYWdlSXRlcmF0b3IiLCJJbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwiT3V0Z29pbmdNZXNzYWdlU3RyZWFtIiwicGlwZSIsImFyZ3MiLCJsZW5ndGgiLCJsb2ciLCJjbGVhcnRleHQiLCJzZXRNYXhTZW5kRnJhZ21lbnQiLCJzdGFydFRscyIsImNyZWRlbnRpYWxzRGV0YWlscyIsImhvc3RuYW1lIiwidHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSIsIm1heFZlcnNpb24iLCJpbmNsdWRlcyIsInNlY3VyZUNvbnRleHQiLCJ0bHMiLCJjcmVhdGVTZWN1cmVDb250ZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJkdXBsZXhwYWlyIiwiRHVwbGV4UGFpciIsImNvbm5lY3QiLCJzb2NrZXQxIiwic2VydmVybmFtZSIsInJlamVjdFVuYXV0aG9yaXplZCIsImVuY3J5cHRlZCIsInNvY2tldDIiLCJvblNlY3VyZUNvbm5lY3QiLCJyZW1vdmVMaXN0ZW5lciIsIm9uUmVhZGFibGUiLCJvbkVycm9yIiwib25jZSIsImVyciIsImRlc3Ryb3kiLCJjaXBoZXIiLCJnZXRDaXBoZXIiLCJuYW1lIiwidmVyc2lvbiIsImVtaXQiLCJ1bnBpcGUiLCJtZXNzYWdlIiwiTWVzc2FnZSIsInR5cGUiLCJUWVBFIiwiUFJFTE9HSU4iLCJyZXNldENvbm5lY3Rpb24iLCJjaHVuayIsInJlYWQiLCJ3cml0ZSIsImVuZCIsInJlYWRNZXNzYWdlIiwidGhlbiIsInJlc3BvbnNlIiwiZGF0YSIsImNhdGNoIiwic2VuZE1lc3NhZ2UiLCJwYWNrZXRUeXBlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJFcnJvciIsInZhbHVlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXNzYWdlLWlvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEdXBsZXhQYWlyIGZyb20gJ25hdGl2ZS1kdXBsZXhwYWlyJztcblxuaW1wb3J0IHsgRHVwbGV4IH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCAqIGFzIHRscyBmcm9tICd0bHMnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnbmV0JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5cbmltcG9ydCBEZWJ1ZyBmcm9tICcuL2RlYnVnJztcblxuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi9tZXNzYWdlJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuL3BhY2tldCc7XG5cbmltcG9ydCBJbmNvbWluZ01lc3NhZ2VTdHJlYW0gZnJvbSAnLi9pbmNvbWluZy1tZXNzYWdlLXN0cmVhbSc7XG5pbXBvcnQgT3V0Z29pbmdNZXNzYWdlU3RyZWFtIGZyb20gJy4vb3V0Z29pbmctbWVzc2FnZS1zdHJlYW0nO1xuXG5jbGFzcyBNZXNzYWdlSU8gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzb2NrZXQ6IFNvY2tldDtcbiAgZGVidWc6IERlYnVnO1xuXG4gIHRsc05lZ290aWF0aW9uQ29tcGxldGU6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VTdHJlYW06IEluY29taW5nTWVzc2FnZVN0cmVhbTtcbiAgb3V0Z29pbmdNZXNzYWdlU3RyZWFtOiBPdXRnb2luZ01lc3NhZ2VTdHJlYW07XG5cbiAgc2VjdXJlUGFpcj86IHtcbiAgICBjbGVhcnRleHQ6IHRscy5UTFNTb2NrZXQ7XG4gICAgZW5jcnlwdGVkOiBEdXBsZXg7XG4gIH1cblxuICBpbmNvbWluZ01lc3NhZ2VJdGVyYXRvcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPE1lc3NhZ2U+O1xuXG4gIGNvbnN0cnVjdG9yKHNvY2tldDogU29ja2V0LCBwYWNrZXRTaXplOiBudW1iZXIsIGRlYnVnOiBEZWJ1Zykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XG5cbiAgICB0aGlzLnRsc05lZ290aWF0aW9uQ29tcGxldGUgPSBmYWxzZTtcblxuICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtID0gbmV3IEluY29taW5nTWVzc2FnZVN0cmVhbSh0aGlzLmRlYnVnKTtcbiAgICB0aGlzLmluY29taW5nTWVzc2FnZUl0ZXJhdG9yID0gdGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbSA9IG5ldyBPdXRnb2luZ01lc3NhZ2VTdHJlYW0odGhpcy5kZWJ1ZywgeyBwYWNrZXRTaXplOiBwYWNrZXRTaXplIH0pO1xuXG4gICAgdGhpcy5zb2NrZXQucGlwZSh0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSk7XG4gICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGlwZSh0aGlzLnNvY2tldCk7XG4gIH1cblxuICBwYWNrZXRTaXplKC4uLmFyZ3M6IFtudW1iZXJdKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFja2V0U2l6ZSA9IGFyZ3NbMF07XG4gICAgICB0aGlzLmRlYnVnLmxvZygnUGFja2V0IHNpemUgY2hhbmdlZCBmcm9tICcgKyB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplICsgJyB0byAnICsgcGFja2V0U2l6ZSk7XG4gICAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplID0gcGFja2V0U2l6ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWN1cmVQYWlyKSB7XG4gICAgICB0aGlzLnNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnNldE1heFNlbmRGcmFnbWVudCh0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZTtcbiAgfVxuXG4gIC8vIE5lZ290aWF0ZSBUTFMgZW5jcnlwdGlvbi5cbiAgc3RhcnRUbHMoY3JlZGVudGlhbHNEZXRhaWxzOiB0bHMuU2VjdXJlQ29udGV4dE9wdGlvbnMsIGhvc3RuYW1lOiBzdHJpbmcsIHRydXN0U2VydmVyQ2VydGlmaWNhdGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIWNyZWRlbnRpYWxzRGV0YWlscy5tYXhWZXJzaW9uIHx8ICFbJ1RMU3YxLjInLCAnVExTdjEuMScsICdUTFN2MSddLmluY2x1ZGVzKGNyZWRlbnRpYWxzRGV0YWlscy5tYXhWZXJzaW9uKSkge1xuICAgICAgY3JlZGVudGlhbHNEZXRhaWxzLm1heFZlcnNpb24gPSAnVExTdjEuMic7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdXJlQ29udGV4dCA9IHRscy5jcmVhdGVTZWN1cmVDb250ZXh0KGNyZWRlbnRpYWxzRGV0YWlscyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgZHVwbGV4cGFpciA9IG5ldyBEdXBsZXhQYWlyKCk7XG4gICAgICBjb25zdCBzZWN1cmVQYWlyID0gdGhpcy5zZWN1cmVQYWlyID0ge1xuICAgICAgICBjbGVhcnRleHQ6IHRscy5jb25uZWN0KHtcbiAgICAgICAgICBzb2NrZXQ6IGR1cGxleHBhaXIuc29ja2V0MSBhcyBTb2NrZXQsXG4gICAgICAgICAgc2VydmVybmFtZTogaG9zdG5hbWUsXG4gICAgICAgICAgc2VjdXJlQ29udGV4dDogc2VjdXJlQ29udGV4dCxcbiAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6ICF0cnVzdFNlcnZlckNlcnRpZmljYXRlXG4gICAgICAgIH0pLFxuICAgICAgICBlbmNyeXB0ZWQ6IGR1cGxleHBhaXIuc29ja2V0MlxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TZWN1cmVDb25uZWN0ID0gKCkgPT4ge1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBvblJlYWRhYmxlKTtcbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnJlbW92ZUxpc3RlbmVyKCdzZWN1cmVDb25uZWN0Jywgb25TZWN1cmVDb25uZWN0KTtcblxuICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYW55IGVycm9ycyBmcm9tIHRoaXMgcG9pbnQgb24sXG4gICAgICAgIC8vIHdlIGp1c3QgZm9yd2FyZCB0aGVtIHRvIHRoZSBhY3R1YWwgbmV0d29yayBzb2NrZXQuXG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0Lm9uY2UoJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuc29ja2V0LmRlc3Ryb3koZXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2lwaGVyID0gc2VjdXJlUGFpci5jbGVhcnRleHQuZ2V0Q2lwaGVyKCk7XG4gICAgICAgIGlmIChjaXBoZXIpIHtcbiAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnVExTIG5lZ290aWF0ZWQgKCcgKyBjaXBoZXIubmFtZSArICcsICcgKyBjaXBoZXIudmVyc2lvbiArICcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ3NlY3VyZScsIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0KTtcblxuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5zZXRNYXhTZW5kRnJhZ21lbnQodGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZSk7XG5cbiAgICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0udW5waXBlKHRoaXMuc29ja2V0KTtcbiAgICAgICAgdGhpcy5zb2NrZXQudW5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcblxuICAgICAgICB0aGlzLnNvY2tldC5waXBlKHNlY3VyZVBhaXIuZW5jcnlwdGVkKTtcbiAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQucGlwZSh0aGlzLnNvY2tldCk7XG5cbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucGlwZSh0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSk7XG4gICAgICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBpcGUoc2VjdXJlUGFpci5jbGVhcnRleHQpO1xuXG4gICAgICAgIHRoaXMudGxzTmVnb3RpYXRpb25Db21wbGV0ZSA9IHRydWU7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBvblJlYWRhYmxlKTtcbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnJlbW92ZUxpc3RlbmVyKCdzZWN1cmVDb25uZWN0Jywgb25TZWN1cmVDb25uZWN0KTtcblxuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5kZXN0cm95KCk7XG4gICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLmRlc3Ryb3koKTtcblxuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uUmVhZGFibGUgPSAoKSA9PiB7XG4gICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgaGFuZHNoYWtlIGRhdGEgb24gdGhlIGVuY3J5cGVkIHN0cmVhbSBvZiB0aGUgc2VjdXJlIHBhaXIsXG4gICAgICAgIC8vIHdlIHdyYXAgaXQgaW50byBhIGBQUkVMT0dJTmAgbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBGb3IgZWFjaCBgUFJFTE9HSU5gIG1lc3NhZ2Ugd2Ugc2VudCB3ZSBnZXQgYmFjayBleGFjdGx5IG9uZSByZXNwb25zZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoYXQgY29udGFpbnMgdGhlIHNlcnZlcidzIGhhbmRzaGFrZSByZXNwb25zZSBkYXRhLlxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBUWVBFLlBSRUxPR0lOLCByZXNldENvbm5lY3Rpb246IGZhbHNlIH0pO1xuXG4gICAgICAgIGxldCBjaHVuaztcbiAgICAgICAgd2hpbGUgKGNodW5rID0gc2VjdXJlUGFpci5lbmNyeXB0ZWQucmVhZCgpKSB7XG4gICAgICAgICAgbWVzc2FnZS53cml0ZShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG5cbiAgICAgICAgdGhpcy5yZWFkTWVzc2FnZSgpLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgLy8gU2V0dXAgcmVhZGFibGUgaGFuZGxlciBmb3IgdGhlIG5leHQgcm91bmQgb2YgaGFuZHNoYWtpbmcuXG4gICAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgYHNlY3VyZUNvbm5lY3RgIG9uIHRoZSBjbGVhcnRleHQgc2lkZVxuICAgICAgICAgIC8vIG9mIHRoZSBzZWN1cmUgcGFpciwgdGhlIGByZWFkYWJsZWAgaGFuZGxlciBpcyBjbGVhcmVkXG4gICAgICAgICAgLy8gYW5kIG5vIGZ1cnRoZXIgaGFuZHNoYWtlIGhhbmRsaW5nIHdpbGwgaGFwcGVuLlxuICAgICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLm9uY2UoJ3JlYWRhYmxlJywgb25SZWFkYWJsZSk7XG5cbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIC8vIFdlIGZlZWQgdGhlIHNlcnZlcidzIGhhbmRzaGFrZSByZXNwb25zZSBiYWNrIGludG8gdGhlXG4gICAgICAgICAgICAvLyBlbmNyeXB0ZWQgZW5kIG9mIHRoZSBzZWN1cmUgcGFpci5cbiAgICAgICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLndyaXRlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2gob25FcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5vbmNlKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQub25jZSgnc2VjdXJlQ29ubmVjdCcsIG9uU2VjdXJlQ29ubmVjdCk7XG4gICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5vbmNlKCdyZWFkYWJsZScsIG9uUmVhZGFibGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVE9ETyBsaXN0ZW4gZm9yICdkcmFpbicgZXZlbnQgd2hlbiBzb2NrZXQud3JpdGUgcmV0dXJucyBmYWxzZS5cbiAgLy8gVE9ETyBpbXBsZW1lbnQgaW5jb21wbGV0ZSByZXF1ZXN0IGNhbmNlbGF0aW9uICgyLjIuMS42KVxuICBzZW5kTWVzc2FnZShwYWNrZXRUeXBlOiBudW1iZXIsIGRhdGE/OiBCdWZmZXIsIHJlc2V0Q29ubmVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBwYWNrZXRUeXBlLCByZXNldENvbm5lY3Rpb246IHJlc2V0Q29ubmVjdGlvbiB9KTtcbiAgICBtZXNzYWdlLmVuZChkYXRhKTtcbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBuZXh0IGluY29taW5nIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0LlxuICAgKi9cbiAgYXN5bmMgcmVhZE1lc3NhZ2UoKTogUHJvbWlzZTxNZXNzYWdlPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5pbmNvbWluZ01lc3NhZ2VJdGVyYXRvci5uZXh0KCk7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBlbmQgb2YgbWVzc2FnZSBzdHJlYW0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VJTztcbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZUlPO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBR0E7O0FBRUE7O0FBSUE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7O0FBRUEsTUFBTUEsU0FBTixTQUF3QkMsb0JBQXhCLENBQXFDO0VBZ0JuQ0MsV0FBVyxDQUFDQyxNQUFELEVBQWlCQyxVQUFqQixFQUFxQ0MsS0FBckMsRUFBbUQ7SUFDNUQ7SUFENEQsS0FmOURGLE1BZThEO0lBQUEsS0FkOURFLEtBYzhEO0lBQUEsS0FaOURDLHNCQVk4RDtJQUFBLEtBVnREQyxxQkFVc0Q7SUFBQSxLQVQ5REMscUJBUzhEO0lBQUEsS0FQOURDLFVBTzhEO0lBQUEsS0FGOURDLHVCQUU4RDtJQUc1RCxLQUFLUCxNQUFMLEdBQWNBLE1BQWQ7SUFDQSxLQUFLRSxLQUFMLEdBQWFBLEtBQWI7SUFFQSxLQUFLQyxzQkFBTCxHQUE4QixLQUE5QjtJQUVBLEtBQUtDLHFCQUFMLEdBQTZCLElBQUlJLDhCQUFKLENBQTBCLEtBQUtOLEtBQS9CLENBQTdCO0lBQ0EsS0FBS0ssdUJBQUwsR0FBK0IsS0FBS0gscUJBQUwsQ0FBMkJLLE1BQU0sQ0FBQ0MsYUFBbEMsR0FBL0I7SUFFQSxLQUFLTCxxQkFBTCxHQUE2QixJQUFJTSw4QkFBSixDQUEwQixLQUFLVCxLQUEvQixFQUFzQztNQUFFRCxVQUFVLEVBQUVBO0lBQWQs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
|