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.
@@ -3,14 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.InstanceLookup = void 0;
6
+ exports.instanceLookup = instanceLookup;
7
+ exports.parseBrowserResponse = parseBrowserResponse;
7
8
 
8
9
  var _dns = _interopRequireDefault(require("dns"));
9
10
 
10
- var _nodeAbortController = require("node-abort-controller");
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
- class AbortError extends Error {
23
- constructor() {
24
- super('The operation was aborted');
25
- this.code = void 0;
26
- this.code = 'ABORT_ERR';
27
- this.name = 'AbortError';
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
- } // Most of the functionality has been determined from from jTDS's MSSqlServerInfo class.
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
- class InstanceLookup {
34
- instanceLookup(options, callback) {
35
- var _options$lookup, _options$port;
39
+ const timeout = options.timeout === undefined ? TIMEOUT : options.timeout;
36
40
 
37
- const server = options.server;
41
+ if (typeof timeout !== 'number') {
42
+ throw new TypeError('Invalid arguments: "timeout" must be a number');
43
+ }
38
44
 
39
- if (typeof server !== 'string') {
40
- throw new TypeError('Invalid arguments: "server" must be a string');
41
- }
45
+ const retries = options.retries === undefined ? RETRIES : options.retries;
42
46
 
43
- const instanceName = options.instanceName;
47
+ if (typeof retries !== 'number') {
48
+ throw new TypeError('Invalid arguments: "retries" must be a number');
49
+ }
44
50
 
45
- if (typeof instanceName !== 'string') {
46
- throw new TypeError('Invalid arguments: "instanceName" must be a string');
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
- const timeout = options.timeout === undefined ? TIMEOUT : options.timeout;
55
+ const lookup = options.lookup ?? _dns.default.lookup;
50
56
 
51
- if (typeof timeout !== 'number') {
52
- throw new TypeError('Invalid arguments: "timeout" must be a number');
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
- const retries = options.retries === undefined ? RETRIES : options.retries;
61
+ const port = options.port ?? SQL_SERVER_BROWSER_PORT;
62
+ const signal = options.signal;
56
63
 
57
- if (typeof retries !== 'number') {
58
- throw new TypeError('Invalid arguments: "retries" must be a number');
59
- }
64
+ if (signal.aborted) {
65
+ throw new _abortError.default();
66
+ }
60
67
 
61
- if (options.lookup !== undefined && typeof options.lookup !== 'function') {
62
- throw new TypeError('Invalid arguments: "lookup" must be a function');
63
- }
68
+ let response;
64
69
 
65
- const lookup = (_options$lookup = options.lookup) !== null && _options$lookup !== void 0 ? _options$lookup : _dns.default.lookup;
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
- if (options.port !== undefined && typeof options.port !== 'number') {
68
- throw new TypeError('Invalid arguments: "port" must be a number');
82
+ throw err;
69
83
  }
84
+ }
70
85
 
71
- const port = (_options$port = options.port) !== null && _options$port !== void 0 ? _options$port : SQL_SERVER_BROWSER_PORT;
72
- const signal = options.signal;
86
+ if (!response) {
87
+ throw new Error('Failed to get response from SQL Server Browser on ' + server);
88
+ }
73
89
 
74
- if (typeof callback !== 'function') {
75
- throw new TypeError('Invalid arguments: "callback" must be a function');
76
- }
90
+ const message = response.toString('ascii', MYSTERY_HEADER_LENGTH);
91
+ const foundPort = parseBrowserResponse(message, instanceName);
77
92
 
78
- if (signal.aborted) {
79
- return process.nextTick(callback, new AbortError());
80
- }
93
+ if (!foundPort) {
94
+ throw new Error('Port for ' + instanceName + ' not found in ' + options.server);
95
+ }
81
96
 
82
- let retriesLeft = retries;
97
+ return foundPort;
98
+ }
83
99
 
84
- const makeAttempt = () => {
85
- if (retriesLeft >= 0) {
86
- retriesLeft--;
87
- const controller = new _nodeAbortController.AbortController();
100
+ function parseBrowserResponse(response, instanceName) {
101
+ let getPort;
102
+ const instances = response.split(';;');
88
103
 
89
- const abortCurrentAttempt = () => {
90
- controller.abort();
91
- }; // If the overall instance lookup is aborted,
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
- signal.addEventListener('abort', abortCurrentAttempt, {
97
- once: true
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
- parseBrowserResponse(response, instanceName) {
137
- let getPort;
138
- const instances = response.split(';;');
139
-
140
- for (let i = 0, len = instances.length; i < len; i++) {
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
- // eslint-disable-next-line @typescript-eslint/no-var-requires
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
- if (cipher) {
90
- this.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');
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
- this.emit('secure', securePair.cleartext);
94
- this.encryptAllFutureTraffic();
95
- });
96
- securePair.encrypted.on('data', data => {
97
- this.sendMessage(_packet.TYPE.PRELOGIN, data, false);
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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