tedious 14.6.0 → 15.0.0-beta.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,95 @@ class MessageIO extends _events.EventEmitter {
60
59
  }
61
60
 
62
61
  return this.outgoingMessageStream.packetSize;
63
- }
62
+ } // Negotiate TLS encryption.
63
+
64
64
 
65
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') {
66
+ return new Promise((resolve, reject) => {
67
+ const duplexpair = new _nativeDuplexpair.default();
68
+ const securePair = this.securePair = {
69
+ cleartext: tls.connect({
70
+ socket: duplexpair.socket1,
71
+ servername: hostname,
72
+ secureContext: secureContext,
73
+ rejectUnauthorized: !trustServerCertificate
74
+ }),
75
+ encrypted: duplexpair.socket2
76
+ };
77
+
78
+ const onSecureConnect = () => {
79
+ securePair.encrypted.removeListener('readable', onReadable);
80
+ securePair.cleartext.removeListener('error', onError);
81
+ securePair.cleartext.removeListener('secureConnect', onSecureConnect); // If we encounter any errors from this point on,
82
+ // we just forward them to the actual network socket.
83
+
84
+ securePair.cleartext.once('error', err => {
85
+ this.socket.destroy(err);
86
+ });
87
+ const cipher = securePair.cleartext.getCipher();
88
+
89
+ if (cipher) {
90
+ this.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');
91
+ }
92
+
93
+ this.emit('secure', securePair.cleartext);
94
+ securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);
95
+ this.outgoingMessageStream.unpipe(this.socket);
96
+ this.socket.unpipe(this.incomingMessageStream);
97
+ this.socket.pipe(securePair.encrypted);
98
+ securePair.encrypted.pipe(this.socket);
99
+ securePair.cleartext.pipe(this.incomingMessageStream);
100
+ this.outgoingMessageStream.pipe(securePair.cleartext);
101
+ this.tlsNegotiationComplete = true;
102
+ resolve();
103
+ };
104
+
105
+ const onError = err => {
106
+ securePair.encrypted.removeListener('readable', onReadable);
107
+ securePair.cleartext.removeListener('error', onError);
108
+ securePair.cleartext.removeListener('secureConnect', onSecureConnect);
109
+ securePair.cleartext.destroy();
81
110
  securePair.encrypted.destroy();
82
- }
83
-
84
- this.socket.destroy(err);
85
- });
86
- securePair.cleartext.on('secureConnect', () => {
87
- const cipher = securePair.cleartext.getCipher();
88
-
89
- if (cipher) {
90
- this.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');
91
- }
92
-
93
- this.emit('secure', securePair.cleartext);
94
- this.encryptAllFutureTraffic();
111
+ reject(err);
112
+ };
113
+
114
+ const onReadable = () => {
115
+ // When there is handshake data on the encryped stream of the secure pair,
116
+ // we wrap it into a `PRELOGIN` message and send it to the server.
117
+ //
118
+ // For each `PRELOGIN` message we sent we get back exactly one response message
119
+ // that contains the server's handshake response data.
120
+ const message = new _message.default({
121
+ type: _packet.TYPE.PRELOGIN,
122
+ resetConnection: false
123
+ });
124
+ let chunk;
125
+
126
+ while (chunk = securePair.encrypted.read()) {
127
+ message.write(chunk);
128
+ }
129
+
130
+ this.outgoingMessageStream.write(message);
131
+ message.end();
132
+ this.readMessage().then(async response => {
133
+ // Setup readable handler for the next round of handshaking.
134
+ // If we encounter a `secureConnect` on the cleartext side
135
+ // of the secure pair, the `readable` handler is cleared
136
+ // and no further handshake handling will happen.
137
+ securePair.encrypted.once('readable', onReadable);
138
+
139
+ for await (const data of response) {
140
+ // We feed the server's handshake response back into the
141
+ // encrypted end of the secure pair.
142
+ securePair.encrypted.write(data);
143
+ }
144
+ }).catch(onError);
145
+ };
146
+
147
+ securePair.cleartext.once('error', onError);
148
+ securePair.cleartext.once('secureConnect', onSecureConnect);
149
+ securePair.encrypted.once('readable', onReadable);
95
150
  });
96
- securePair.encrypted.on('data', data => {
97
- this.sendMessage(_packet.TYPE.PRELOGIN, data, false);
98
- });
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
151
  } // TODO listen for 'drain' event when socket.write returns false.
118
152
  // TODO implement incomplete request cancelation (2.2.1.6)
119
153
 
@@ -140,16 +174,6 @@ class MessageIO extends _events.EventEmitter {
140
174
  }
141
175
 
142
176
  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
177
  }
154
178
 
155
179
  }
@@ -157,4 +181,4 @@ class MessageIO extends _events.EventEmitter {
157
181
  var _default = MessageIO;
158
182
  exports.default = _default;
159
183
  module.exports = MessageIO;
160
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEdXBsZXhQYWlyIiwicmVxdWlyZSIsIk1lc3NhZ2VJTyIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwic29ja2V0IiwicGFja2V0U2l6ZSIsImRlYnVnIiwidGxzTmVnb3RpYXRpb25Db21wbGV0ZSIsImluY29taW5nTWVzc2FnZVN0cmVhbSIsIm91dGdvaW5nTWVzc2FnZVN0cmVhbSIsInNlY3VyZVBhaXIiLCJpbmNvbWluZ01lc3NhZ2VJdGVyYXRvciIsIkluY29taW5nTWVzc2FnZVN0cmVhbSIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJPdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJwaXBlIiwiYXJncyIsImxlbmd0aCIsImxvZyIsImNsZWFydGV4dCIsInNldE1heFNlbmRGcmFnbWVudCIsInN0YXJ0VGxzIiwic2VjdXJlQ29udGV4dCIsImhvc3RuYW1lIiwidHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSIsImR1cGxleHBhaXIiLCJ0bHMiLCJjb25uZWN0Iiwic29ja2V0MSIsInNlcnZlcm5hbWUiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJlbmNyeXB0ZWQiLCJzb2NrZXQyIiwib24iLCJlcnIiLCJkZXN0cm95IiwiY2lwaGVyIiwiZ2V0Q2lwaGVyIiwibmFtZSIsInZlcnNpb24iLCJlbWl0IiwiZW5jcnlwdEFsbEZ1dHVyZVRyYWZmaWMiLCJkYXRhIiwic2VuZE1lc3NhZ2UiLCJUWVBFIiwiUFJFTE9HSU4iLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJ1bnBpcGUiLCJ0bHNIYW5kc2hha2VEYXRhIiwid3JpdGUiLCJwYWNrZXRUeXBlIiwicmVzZXRDb25uZWN0aW9uIiwibWVzc2FnZSIsIk1lc3NhZ2UiLCJ0eXBlIiwiZW5kIiwicmVhZE1lc3NhZ2UiLCJyZXN1bHQiLCJuZXh0IiwiZG9uZSIsIkVycm9yIiwidmFsdWUiLCJwYXVzZSIsInJlc3VtZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvbWVzc2FnZS1pby50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgRHVwbGV4UGFpciA9IHJlcXVpcmUoJ25hdGl2ZS1kdXBsZXhwYWlyJyk7XG5cbmltcG9ydCB7IER1cGxleCB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgKiBhcyB0bHMgZnJvbSAndGxzJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJ25ldCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuXG5pbXBvcnQgRGVidWcgZnJvbSAnLi9kZWJ1Zyc7XG5cbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vbWVzc2FnZSc7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi9wYWNrZXQnO1xuXG5pbXBvcnQgSW5jb21pbmdNZXNzYWdlU3RyZWFtIGZyb20gJy4vaW5jb21pbmctbWVzc2FnZS1zdHJlYW0nO1xuaW1wb3J0IE91dGdvaW5nTWVzc2FnZVN0cmVhbSBmcm9tICcuL291dGdvaW5nLW1lc3NhZ2Utc3RyZWFtJztcblxuY2xhc3MgTWVzc2FnZUlPIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc29ja2V0OiBTb2NrZXQ7XG4gIGRlYnVnOiBEZWJ1ZztcblxuICB0bHNOZWdvdGlhdGlvbkNvbXBsZXRlOiBib29sZWFuO1xuXG4gIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlU3RyZWFtOiBJbmNvbWluZ01lc3NhZ2VTdHJlYW07XG4gIG91dGdvaW5nTWVzc2FnZVN0cmVhbTogT3V0Z29pbmdNZXNzYWdlU3RyZWFtO1xuXG4gIHNlY3VyZVBhaXI/OiB7XG4gICAgY2xlYXJ0ZXh0OiB0bHMuVExTU29ja2V0O1xuICAgIGVuY3J5cHRlZDogRHVwbGV4O1xuICB9XG5cbiAgaW5jb21pbmdNZXNzYWdlSXRlcmF0b3I6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxNZXNzYWdlPjtcblxuICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IFNvY2tldCwgcGFja2V0U2l6ZTogbnVtYmVyLCBkZWJ1ZzogRGVidWcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnO1xuXG4gICAgdGhpcy50bHNOZWdvdGlhdGlvbkNvbXBsZXRlID0gZmFsc2U7XG5cbiAgICB0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSA9IG5ldyBJbmNvbWluZ01lc3NhZ2VTdHJlYW0odGhpcy5kZWJ1Zyk7XG4gICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VJdGVyYXRvciA9IHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4gICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0gPSBuZXcgT3V0Z29pbmdNZXNzYWdlU3RyZWFtKHRoaXMuZGVidWcsIHsgcGFja2V0U2l6ZTogcGFja2V0U2l6ZSB9KTtcblxuICAgIHRoaXMuc29ja2V0LnBpcGUodGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0pO1xuICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBpcGUodGhpcy5zb2NrZXQpO1xuICB9XG5cbiAgcGFja2V0U2l6ZSguLi5hcmdzOiBbbnVtYmVyXSkge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhY2tldFNpemUgPSBhcmdzWzBdO1xuICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1BhY2tldCBzaXplIGNoYW5nZWQgZnJvbSAnICsgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZSArICcgdG8gJyArIHBhY2tldFNpemUpO1xuICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZSA9IHBhY2tldFNpemU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VjdXJlUGFpcikge1xuICAgICAgdGhpcy5zZWN1cmVQYWlyLmNsZWFydGV4dC5zZXRNYXhTZW5kRnJhZ21lbnQodGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemU7XG4gIH1cblxuICBzdGFydFRscyhzZWN1cmVDb250ZXh0OiB0bHMuU2VjdXJlQ29udGV4dCwgaG9zdG5hbWU6IHN0cmluZywgdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGR1cGxleHBhaXIgPSBuZXcgRHVwbGV4UGFpcigpO1xuICAgIGNvbnN0IHNlY3VyZVBhaXIgPSB0aGlzLnNlY3VyZVBhaXIgPSB7XG4gICAgICBjbGVhcnRleHQ6IHRscy5jb25uZWN0KHtcbiAgICAgICAgc29ja2V0OiBkdXBsZXhwYWlyLnNvY2tldDEgYXMgU29ja2V0LFxuICAgICAgICBzZXJ2ZXJuYW1lOiBob3N0bmFtZSxcbiAgICAgICAgc2VjdXJlQ29udGV4dDogc2VjdXJlQ29udGV4dCxcbiAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiAhdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZVxuICAgICAgfSksXG4gICAgICBlbmNyeXB0ZWQ6IGR1cGxleHBhaXIuc29ja2V0MlxuICAgIH07XG5cbiAgICAvLyBJZiBhbiBlcnJvciBoYXBwZW5zIGluIHRoZSBUTFMgbGF5ZXIsIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0LlxuICAgIC8vIEZvcndhcmQgdGhlIGVycm9yIHRvIHRoZSBzb2NrZXQgc28gdGhlIGNvbm5lY3Rpb24gZ2V0cyBwcm9wZXJseSBjbGVhbmVkIHVwLlxuICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0Lm9uKCdlcnJvcicsIChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgLy8gU3RyZWFtcyBpbiBub2RlLmpzIHZlcnNpb25zIGJlZm9yZSA4LjAuMCBkb24ndCBzdXBwb3J0IGAuZGVzdHJveWBcbiAgICAgIGlmICh0eXBlb2Ygc2VjdXJlUGFpci5lbmNyeXB0ZWQuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNvY2tldC5kZXN0cm95KGVycik7XG4gICAgfSk7XG5cbiAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5vbignc2VjdXJlQ29ubmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlciA9IHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LmdldENpcGhlcigpO1xuICAgICAgaWYgKGNpcGhlcikge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZygnVExTIG5lZ290aWF0ZWQgKCcgKyBjaXBoZXIubmFtZSArICcsICcgKyBjaXBoZXIudmVyc2lvbiArICcpJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXQoJ3NlY3VyZScsIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0KTtcbiAgICAgIHRoaXMuZW5jcnlwdEFsbEZ1dHVyZVRyYWZmaWMoKTtcbiAgICB9KTtcblxuICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgdGhpcy5zZW5kTWVzc2FnZShUWVBFLlBSRUxPR0lOLCBkYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBlbmNyeXB0QWxsRnV0dXJlVHJhZmZpYygpIHtcbiAgICBjb25zdCBzZWN1cmVQYWlyID0gdGhpcy5zZWN1cmVQYWlyITtcblxuICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnNldE1heFNlbmRGcmFnbWVudCh0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplKTtcbiAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2RhdGEnKTtcblxuICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnVucGlwZSh0aGlzLnNvY2tldCk7XG4gICAgdGhpcy5zb2NrZXQudW5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcblxuICAgIHRoaXMuc29ja2V0LnBpcGUoc2VjdXJlUGFpci5lbmNyeXB0ZWQpO1xuICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLnBpcGUodGhpcy5zb2NrZXQpO1xuXG4gICAgc2VjdXJlUGFpci5jbGVhcnRleHQucGlwZSh0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSk7XG4gICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGlwZShzZWN1cmVQYWlyLmNsZWFydGV4dCk7XG5cbiAgICB0aGlzLnRsc05lZ290aWF0aW9uQ29tcGxldGUgPSB0cnVlO1xuICB9XG5cbiAgdGxzSGFuZHNoYWtlRGF0YShkYXRhOiBCdWZmZXIpIHtcbiAgICBjb25zdCBzZWN1cmVQYWlyID0gdGhpcy5zZWN1cmVQYWlyITtcblxuICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLndyaXRlKGRhdGEpO1xuICB9XG5cbiAgLy8gVE9ETyBsaXN0ZW4gZm9yICdkcmFpbicgZXZlbnQgd2hlbiBzb2NrZXQud3JpdGUgcmV0dXJucyBmYWxzZS5cbiAgLy8gVE9ETyBpbXBsZW1lbnQgaW5jb21wbGV0ZSByZXF1ZXN0IGNhbmNlbGF0aW9uICgyLjIuMS42KVxuICBzZW5kTWVzc2FnZShwYWNrZXRUeXBlOiBudW1iZXIsIGRhdGE/OiBCdWZmZXIsIHJlc2V0Q29ubmVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBwYWNrZXRUeXBlLCByZXNldENvbm5lY3Rpb246IHJlc2V0Q29ubmVjdGlvbiB9KTtcbiAgICBtZXNzYWdlLmVuZChkYXRhKTtcbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBuZXh0IGluY29taW5nIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0LlxuICAgKi9cbiAgYXN5bmMgcmVhZE1lc3NhZ2UoKTogUHJvbWlzZTxNZXNzYWdlPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5pbmNvbWluZ01lc3NhZ2VJdGVyYXRvci5uZXh0KCk7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBlbmQgb2YgbWVzc2FnZSBzdHJlYW0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgLy8gVGVtcG9yYXJpbHkgc3VzcGVuZHMgdGhlIGZsb3cgb2YgaW5jb21pbmcgcGFja2V0cy5cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0ucGF1c2UoKTtcbiAgfVxuXG4gIC8vIFJlc3VtZXMgdGhlIGZsb3cgb2YgaW5jb21pbmcgcGFja2V0cy5cbiAgcmVzdW1lKCkge1xuICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtLnJlc3VtZSgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VJTztcbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZUlPO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBSUE7O0FBRUE7O0FBSUE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7O0FBZEE7QUFDQSxNQUFNQSxVQUFVLEdBQUdDLE9BQU8sQ0FBQyxtQkFBRCxDQUExQjs7QUFlQSxNQUFNQyxTQUFOLFNBQXdCQyxvQkFBeEIsQ0FBcUM7RUFnQm5DQyxXQUFXLENBQUNDLE1BQUQsRUFBaUJDLFVBQWpCLEVBQXFDQyxLQUFyQyxFQUFtRDtJQUM1RDtJQUQ0RCxLQWY5REYsTUFlOEQ7SUFBQSxLQWQ5REUsS0FjOEQ7SUFBQSxLQVo5REMsc0JBWThEO0lBQUEsS0FWdERDLHFCQVVzRDtJQUFBLEtBVDlEQyxxQkFTOEQ7SUFBQSxLQVA5REMsVUFPOEQ7SUFBQSxLQUY5REMsdUJBRThEO0lBRzVELEtBQUtQLE1BQUwsR0FBY0EsTUFBZDtJQUNBLEtBQUtFLEtBQUwsR0FBYUEsS0FBYjtJQUVBLEtBQUtDLHNCQUFMLEdBQThCLEtBQTlCO0lBRUEsS0FBS0MscUJBQUwsR0FBNkIsSUFB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
184
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlSU8iLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsInNvY2tldCIsInBhY2tldFNpemUiLCJkZWJ1ZyIsInRsc05lZ290aWF0aW9uQ29tcGxldGUiLCJpbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJvdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJzZWN1cmVQYWlyIiwiaW5jb21pbmdNZXNzYWdlSXRlcmF0b3IiLCJJbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwiT3V0Z29pbmdNZXNzYWdlU3RyZWFtIiwicGlwZSIsImFyZ3MiLCJsZW5ndGgiLCJsb2ciLCJjbGVhcnRleHQiLCJzZXRNYXhTZW5kRnJhZ21lbnQiLCJzdGFydFRscyIsInNlY3VyZUNvbnRleHQiLCJob3N0bmFtZSIsInRydXN0U2VydmVyQ2VydGlmaWNhdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImR1cGxleHBhaXIiLCJEdXBsZXhQYWlyIiwidGxzIiwiY29ubmVjdCIsInNvY2tldDEiLCJzZXJ2ZXJuYW1lIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZW5jcnlwdGVkIiwic29ja2V0MiIsIm9uU2VjdXJlQ29ubmVjdCIsInJlbW92ZUxpc3RlbmVyIiwib25SZWFkYWJsZSIsIm9uRXJyb3IiLCJvbmNlIiwiZXJyIiwiZGVzdHJveSIsImNpcGhlciIsImdldENpcGhlciIsIm5hbWUiLCJ2ZXJzaW9uIiwiZW1pdCIsInVucGlwZSIsIm1lc3NhZ2UiLCJNZXNzYWdlIiwidHlwZSIsIlRZUEUiLCJQUkVMT0dJTiIsInJlc2V0Q29ubmVjdGlvbiIsImNodW5rIiwicmVhZCIsIndyaXRlIiwiZW5kIiwicmVhZE1lc3NhZ2UiLCJ0aGVuIiwicmVzcG9uc2UiLCJkYXRhIiwiY2F0Y2giLCJzZW5kTWVzc2FnZSIsInBhY2tldFR5cGUiLCJyZXN1bHQiLCJuZXh0IiwiZG9uZSIsIkVycm9yIiwidmFsdWUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL21lc3NhZ2UtaW8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IER1cGxleFBhaXIgZnJvbSAnbmF0aXZlLWR1cGxleHBhaXInO1xuXG5pbXBvcnQgeyBEdXBsZXggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgdGxzIGZyb20gJ3Rscyc7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tICduZXQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuaW1wb3J0IERlYnVnIGZyb20gJy4vZGVidWcnO1xuXG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL21lc3NhZ2UnO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4vcGFja2V0JztcblxuaW1wb3J0IEluY29taW5nTWVzc2FnZVN0cmVhbSBmcm9tICcuL2luY29taW5nLW1lc3NhZ2Utc3RyZWFtJztcbmltcG9ydCBPdXRnb2luZ01lc3NhZ2VTdHJlYW0gZnJvbSAnLi9vdXRnb2luZy1tZXNzYWdlLXN0cmVhbSc7XG5cbmNsYXNzIE1lc3NhZ2VJTyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHNvY2tldDogU29ja2V0O1xuICBkZWJ1ZzogRGVidWc7XG5cbiAgdGxzTmVnb3RpYXRpb25Db21wbGV0ZTogYm9vbGVhbjtcblxuICBwcml2YXRlIGluY29taW5nTWVzc2FnZVN0cmVhbTogSW5jb21pbmdNZXNzYWdlU3RyZWFtO1xuICBvdXRnb2luZ01lc3NhZ2VTdHJlYW06IE91dGdvaW5nTWVzc2FnZVN0cmVhbTtcblxuICBzZWN1cmVQYWlyPzoge1xuICAgIGNsZWFydGV4dDogdGxzLlRMU1NvY2tldDtcbiAgICBlbmNyeXB0ZWQ6IER1cGxleDtcbiAgfVxuXG4gIGluY29taW5nTWVzc2FnZUl0ZXJhdG9yOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8TWVzc2FnZT47XG5cbiAgY29uc3RydWN0b3Ioc29ja2V0OiBTb2NrZXQsIHBhY2tldFNpemU6IG51bWJlciwgZGVidWc6IERlYnVnKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIHRoaXMuZGVidWcgPSBkZWJ1ZztcblxuICAgIHRoaXMudGxzTmVnb3RpYXRpb25Db21wbGV0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0gPSBuZXcgSW5jb21pbmdNZXNzYWdlU3RyZWFtKHRoaXMuZGVidWcpO1xuICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSXRlcmF0b3IgPSB0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtID0gbmV3IE91dGdvaW5nTWVzc2FnZVN0cmVhbSh0aGlzLmRlYnVnLCB7IHBhY2tldFNpemU6IHBhY2tldFNpemUgfSk7XG5cbiAgICB0aGlzLnNvY2tldC5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5waXBlKHRoaXMuc29ja2V0KTtcbiAgfVxuXG4gIHBhY2tldFNpemUoLi4uYXJnczogW251bWJlcl0pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwYWNrZXRTaXplID0gYXJnc1swXTtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdQYWNrZXQgc2l6ZSBjaGFuZ2VkIGZyb20gJyArIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUgKyAnIHRvICcgKyBwYWNrZXRTaXplKTtcbiAgICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUgPSBwYWNrZXRTaXplO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlY3VyZVBhaXIpIHtcbiAgICAgIHRoaXMuc2VjdXJlUGFpci5jbGVhcnRleHQuc2V0TWF4U2VuZEZyYWdtZW50KHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBhY2tldFNpemUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplO1xuICB9XG5cbiAgLy8gTmVnb3RpYXRlIFRMUyBlbmNyeXB0aW9uLlxuICBzdGFydFRscyhzZWN1cmVDb250ZXh0OiB0bHMuU2VjdXJlQ29udGV4dCwgaG9zdG5hbWU6IHN0cmluZywgdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZTogYm9vbGVhbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBkdXBsZXhwYWlyID0gbmV3IER1cGxleFBhaXIoKTtcbiAgICAgIGNvbnN0IHNlY3VyZVBhaXIgPSB0aGlzLnNlY3VyZVBhaXIgPSB7XG4gICAgICAgIGNsZWFydGV4dDogdGxzLmNvbm5lY3Qoe1xuICAgICAgICAgIHNvY2tldDogZHVwbGV4cGFpci5zb2NrZXQxIGFzIFNvY2tldCxcbiAgICAgICAgICBzZXJ2ZXJuYW1lOiBob3N0bmFtZSxcbiAgICAgICAgICBzZWN1cmVDb250ZXh0OiBzZWN1cmVDb250ZXh0LFxuICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogIXRydXN0U2VydmVyQ2VydGlmaWNhdGVcbiAgICAgICAgfSksXG4gICAgICAgIGVuY3J5cHRlZDogZHVwbGV4cGFpci5zb2NrZXQyXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblNlY3VyZUNvbm5lY3QgPSAoKSA9PiB7XG4gICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLnJlbW92ZUxpc3RlbmVyKCdyZWFkYWJsZScsIG9uUmVhZGFibGUpO1xuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucmVtb3ZlTGlzdGVuZXIoJ3NlY3VyZUNvbm5lY3QnLCBvblNlY3VyZUNvbm5lY3QpO1xuXG4gICAgICAgIC8vIElmIHdlIGVuY291bnRlciBhbnkgZXJyb3JzIGZyb20gdGhpcyBwb2ludCBvbixcbiAgICAgICAgLy8gd2UganVzdCBmb3J3YXJkIHRoZW0gdG8gdGhlIGFjdHVhbCBuZXR3b3JrIHNvY2tldC5cbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQub25jZSgnZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQuZGVzdHJveShlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjaXBoZXIgPSBzZWN1cmVQYWlyLmNsZWFydGV4dC5nZXRDaXBoZXIoKTtcbiAgICAgICAgaWYgKGNpcGhlcikge1xuICAgICAgICAgIHRoaXMuZGVidWcubG9nKCdUTFMgbmVnb3RpYXRlZCAoJyArIGNpcGhlci5uYW1lICsgJywgJyArIGNpcGhlci52ZXJzaW9uICsgJyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnc2VjdXJlJywgc2VjdXJlUGFpci5jbGVhcnRleHQpO1xuXG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnNldE1heFNlbmRGcmFnbWVudCh0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplKTtcblxuICAgICAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS51bnBpcGUodGhpcy5zb2NrZXQpO1xuICAgICAgICB0aGlzLnNvY2tldC51bnBpcGUodGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW0pO1xuXG4gICAgICAgIHRoaXMuc29ja2V0LnBpcGUoc2VjdXJlUGFpci5lbmNyeXB0ZWQpO1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5waXBlKHRoaXMuc29ja2V0KTtcblxuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcbiAgICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGlwZShzZWN1cmVQYWlyLmNsZWFydGV4dCk7XG5cbiAgICAgICAgdGhpcy50bHNOZWdvdGlhdGlvbkNvbXBsZXRlID0gdHJ1ZTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycj86IEVycm9yKSA9PiB7XG4gICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLnJlbW92ZUxpc3RlbmVyKCdyZWFkYWJsZScsIG9uUmVhZGFibGUpO1xuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucmVtb3ZlTGlzdGVuZXIoJ3NlY3VyZUNvbm5lY3QnLCBvblNlY3VyZUNvbm5lY3QpO1xuXG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LmRlc3Ryb3koKTtcbiAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQuZGVzdHJveSgpO1xuXG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25SZWFkYWJsZSA9ICgpID0+IHtcbiAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBoYW5kc2hha2UgZGF0YSBvbiB0aGUgZW5jcnlwZWQgc3RyZWFtIG9mIHRoZSBzZWN1cmUgcGFpcixcbiAgICAgICAgLy8gd2Ugd3JhcCBpdCBpbnRvIGEgYFBSRUxPR0lOYCBtZXNzYWdlIGFuZCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEZvciBlYWNoIGBQUkVMT0dJTmAgbWVzc2FnZSB3ZSBzZW50IHdlIGdldCBiYWNrIGV4YWN0bHkgb25lIHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgLy8gdGhhdCBjb250YWlucyB0aGUgc2VydmVyJ3MgaGFuZHNoYWtlIHJlc3BvbnNlIGRhdGEuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7IHR5cGU6IFRZUEUuUFJFTE9HSU4sIHJlc2V0Q29ubmVjdGlvbjogZmFsc2UgfSk7XG5cbiAgICAgICAgbGV0IGNodW5rO1xuICAgICAgICB3aGlsZSAoY2h1bmsgPSBzZWN1cmVQYWlyLmVuY3J5cHRlZC5yZWFkKCkpIHtcbiAgICAgICAgICBtZXNzYWdlLndyaXRlKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgbWVzc2FnZS5lbmQoKTtcblxuICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKCkudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAvLyBTZXR1cCByZWFkYWJsZSBoYW5kbGVyIGZvciB0aGUgbmV4dCByb3VuZCBvZiBoYW5kc2hha2luZy5cbiAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBgc2VjdXJlQ29ubmVjdGAgb24gdGhlIGNsZWFydGV4dCBzaWRlXG4gICAgICAgICAgLy8gb2YgdGhlIHNlY3VyZSBwYWlyLCB0aGUgYHJlYWRhYmxlYCBoYW5kbGVyIGlzIGNsZWFyZWRcbiAgICAgICAgICAvLyBhbmQgbm8gZnVydGhlciBoYW5kc2hha2UgaGFuZGxpbmcgd2lsbCBoYXBwZW4uXG4gICAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQub25jZSgncmVhZGFibGUnLCBvblJlYWRhYmxlKTtcblxuICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZGF0YSBvZiByZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gV2UgZmVlZCB0aGUgc2VydmVyJ3MgaGFuZHNoYWtlIHJlc3BvbnNlIGJhY2sgaW50byB0aGVcbiAgICAgICAgICAgIC8vIGVuY3J5cHRlZCBlbmQgb2YgdGhlIHNlY3VyZSBwYWlyLlxuICAgICAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQud3JpdGUoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaChvbkVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0Lm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5vbmNlKCdzZWN1cmVDb25uZWN0Jywgb25TZWN1cmVDb25uZWN0KTtcbiAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLm9uY2UoJ3JlYWRhYmxlJywgb25SZWFkYWJsZSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBUT0RPIGxpc3RlbiBmb3IgJ2RyYWluJyBldmVudCB3aGVuIHNvY2tldC53cml0ZSByZXR1cm5zIGZhbHNlLlxuICAvLyBUT0RPIGltcGxlbWVudCBpbmNvbXBsZXRlIHJlcXVlc3QgY2FuY2VsYXRpb24gKDIuMi4xLjYpXG4gIHNlbmRNZXNzYWdlKHBhY2tldFR5cGU6IG51bWJlciwgZGF0YT86IEJ1ZmZlciwgcmVzZXRDb25uZWN0aW9uPzogYm9vbGVhbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7IHR5cGU6IHBhY2tldFR5cGUsIHJlc2V0Q29ubmVjdGlvbjogcmVzZXRDb25uZWN0aW9uIH0pO1xuICAgIG1lc3NhZ2UuZW5kKGRhdGEpO1xuICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLndyaXRlKG1lc3NhZ2UpO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIG5leHQgaW5jb21pbmcgbWVzc2FnZSBmcm9tIHRoZSBzb2NrZXQuXG4gICAqL1xuICBhc3luYyByZWFkTWVzc2FnZSgpOiBQcm9taXNlPE1lc3NhZ2U+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmluY29taW5nTWVzc2FnZUl0ZXJhdG9yLm5leHQoKTtcblxuICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBtZXNzYWdlIHN0cmVhbScpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZUlPO1xubW9kdWxlLmV4cG9ydHMgPSBNZXNzYWdlSU87XG4iXSwibWFwcGluZ3MiOiI7Ozs7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