appium-remote-debugger 10.0.2 → 10.1.0

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.
Files changed (86) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/index.js +18 -33
  3. package/build/lib/atoms.d.ts +17 -0
  4. package/build/lib/atoms.d.ts.map +1 -0
  5. package/build/lib/atoms.js +75 -50
  6. package/build/lib/atoms.js.map +1 -1
  7. package/build/lib/logger.d.ts +3 -0
  8. package/build/lib/logger.d.ts.map +1 -0
  9. package/build/lib/logger.js +5 -11
  10. package/build/lib/logger.js.map +1 -1
  11. package/build/lib/mixins/connect.d.ts +125 -0
  12. package/build/lib/mixins/connect.d.ts.map +1 -0
  13. package/build/lib/mixins/connect.js +299 -202
  14. package/build/lib/mixins/connect.js.map +1 -1
  15. package/build/lib/mixins/events.d.ts +7 -0
  16. package/build/lib/mixins/events.d.ts.map +1 -0
  17. package/build/lib/mixins/events.js +7 -12
  18. package/build/lib/mixins/events.js.map +1 -1
  19. package/build/lib/mixins/execute.d.ts +38 -0
  20. package/build/lib/mixins/execute.d.ts.map +1 -0
  21. package/build/lib/mixins/execute.js +162 -122
  22. package/build/lib/mixins/execute.js.map +1 -1
  23. package/build/lib/mixins/index.d.ts +5 -0
  24. package/build/lib/mixins/index.d.ts.map +1 -0
  25. package/build/lib/mixins/index.js +14 -23
  26. package/build/lib/mixins/index.js.map +1 -1
  27. package/build/lib/mixins/message-handlers.d.ts +92 -0
  28. package/build/lib/mixins/message-handlers.d.ts.map +1 -0
  29. package/build/lib/mixins/message-handlers.js +160 -97
  30. package/build/lib/mixins/message-handlers.js.map +1 -1
  31. package/build/lib/mixins/navigate.d.ts +92 -0
  32. package/build/lib/mixins/navigate.d.ts.map +1 -0
  33. package/build/lib/mixins/navigate.js +199 -141
  34. package/build/lib/mixins/navigate.js.map +1 -1
  35. package/build/lib/protocol/index.d.ts +14 -0
  36. package/build/lib/protocol/index.d.ts.map +1 -0
  37. package/build/lib/protocol/index.js +192 -118
  38. package/build/lib/protocol/index.js.map +1 -1
  39. package/build/lib/remote-debugger-real-device.d.ts +6 -0
  40. package/build/lib/remote-debugger-real-device.d.ts.map +1 -0
  41. package/build/lib/remote-debugger-real-device.js +29 -32
  42. package/build/lib/remote-debugger-real-device.js.map +1 -1
  43. package/build/lib/remote-debugger.d.ts +119 -0
  44. package/build/lib/remote-debugger.d.ts.map +1 -0
  45. package/build/lib/remote-debugger.js +256 -226
  46. package/build/lib/remote-debugger.js.map +1 -1
  47. package/build/lib/rpc/index.d.ts +4 -0
  48. package/build/lib/rpc/index.d.ts.map +1 -0
  49. package/build/lib/rpc/index.js +10 -21
  50. package/build/lib/rpc/index.js.map +1 -1
  51. package/build/lib/rpc/remote-messages.d.ts +51 -0
  52. package/build/lib/rpc/remote-messages.d.ts.map +1 -0
  53. package/build/lib/rpc/remote-messages.js +203 -224
  54. package/build/lib/rpc/remote-messages.js.map +1 -1
  55. package/build/lib/rpc/rpc-client-real-device.d.ts +6 -0
  56. package/build/lib/rpc/rpc-client-real-device.d.ts.map +1 -0
  57. package/build/lib/rpc/rpc-client-real-device.js +43 -49
  58. package/build/lib/rpc/rpc-client-real-device.js.map +1 -1
  59. package/build/lib/rpc/rpc-client-simulator.d.ts +15 -0
  60. package/build/lib/rpc/rpc-client-simulator.d.ts.map +1 -0
  61. package/build/lib/rpc/rpc-client-simulator.js +138 -125
  62. package/build/lib/rpc/rpc-client-simulator.js.map +1 -1
  63. package/build/lib/rpc/rpc-client.d.ts +142 -0
  64. package/build/lib/rpc/rpc-client.d.ts.map +1 -0
  65. package/build/lib/rpc/rpc-client.js +559 -418
  66. package/build/lib/rpc/rpc-client.js.map +1 -1
  67. package/build/lib/rpc/rpc-message-handler.d.ts +13 -0
  68. package/build/lib/rpc/rpc-message-handler.d.ts.map +1 -0
  69. package/build/lib/rpc/rpc-message-handler.js +181 -166
  70. package/build/lib/rpc/rpc-message-handler.js.map +1 -1
  71. package/build/lib/utils.d.ts +61 -0
  72. package/build/lib/utils.d.ts.map +1 -0
  73. package/build/lib/utils.js +241 -155
  74. package/build/lib/utils.js.map +1 -1
  75. package/lib/atoms.js +25 -4
  76. package/lib/mixins/connect.js +102 -7
  77. package/lib/mixins/execute.js +46 -13
  78. package/lib/mixins/message-handlers.js +44 -1
  79. package/lib/mixins/navigate.js +55 -3
  80. package/lib/remote-debugger.js +112 -0
  81. package/lib/rpc/rpc-client-real-device.js +1 -6
  82. package/lib/rpc/rpc-client-simulator.js +7 -1
  83. package/lib/rpc/rpc-client.js +106 -6
  84. package/lib/rpc/rpc-message-handler.js +1 -1
  85. package/lib/utils.js +31 -1
  86. package/package.json +26 -16
@@ -1,232 +1,329 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- require("source-map-support/register");
9
- var _logger = _interopRequireDefault(require("../logger"));
10
- var _utils = require("../utils");
11
- var _events = _interopRequireDefault(require("./events"));
12
- var _support = require("@appium/support");
13
- var _asyncbox = require("asyncbox");
14
- var _lodash = _interopRequireDefault(require("lodash"));
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const logger_1 = __importDefault(require("../logger"));
7
+ const utils_1 = require("../utils");
8
+ const events_1 = __importDefault(require("./events"));
9
+ const support_1 = require("@appium/support");
10
+ const asyncbox_1 = require("asyncbox");
11
+ const lodash_1 = __importDefault(require("lodash"));
15
12
  const APP_CONNECT_TIMEOUT_MS = 0;
16
13
  const APP_CONNECT_INTERVAL_MS = 100;
17
14
  const SELECT_APP_RETRIES = 20;
18
15
  const SELECT_APP_RETRY_SLEEP_MS = 500;
19
16
  const SAFARI_BUNDLE_ID = 'com.apple.mobilesafari';
20
17
  const BLANK_PAGE_URL = 'about:blank';
18
+ /**
19
+ * @typedef {Object} AppPages
20
+ * @property {string} appIdKey
21
+ * @property {Record<string, any>} pageDict
22
+ */
23
+ /**
24
+ * @typedef {Object} App
25
+ * @property {string} id
26
+ * @property {string} bundleId
27
+ */
28
+ /**
29
+ *
30
+ * @this {import('../remote-debugger').RemoteDebugger}
31
+ */
21
32
  async function setConnectionKey() {
22
- _logger.default.debug('Sending connection key request');
23
- await this.rpcClient.send('setConnectionKey', {}, false);
33
+ logger_1.default.debug('Sending connection key request');
34
+ if (!this.rpcClient) {
35
+ throw new Error('rpcClient is undefined. Is the debugger connected?');
36
+ }
37
+ // send but only wait to make sure the socket worked
38
+ // as response from Web Inspector can take a long time
39
+ await this.rpcClient.send('setConnectionKey', {}, false);
24
40
  }
41
+ /**
42
+ *
43
+ * @this {import('../remote-debugger').RemoteDebugger}
44
+ */
25
45
  async function connect(timeout = APP_CONNECT_TIMEOUT_MS) {
26
- this.setup();
27
- this.initRpcClient();
28
- this.rpcClient.on('_rpc_reportSetup:', _lodash.default.noop);
29
- this.rpcClient.on('_rpc_forwardGetListing:', this.onPageChange.bind(this));
30
- this.rpcClient.on('_rpc_reportConnectedApplicationList:', this.onConnectedApplicationList.bind(this));
31
- this.rpcClient.on('_rpc_applicationConnected:', this.onAppConnect.bind(this));
32
- this.rpcClient.on('_rpc_applicationDisconnected:', this.onAppDisconnect.bind(this));
33
- this.rpcClient.on('_rpc_applicationUpdated:', this.onAppUpdate.bind(this));
34
- this.rpcClient.on('_rpc_reportConnectedDriverList:', this.onConnectedDriverList.bind(this));
35
- this.rpcClient.on('_rpc_reportCurrentState:', this.onCurrentState.bind(this));
36
- this.rpcClient.on('Page.frameDetached', this.frameDetached.bind(this));
37
- await this.rpcClient.connect();
38
- try {
39
- await this.setConnectionKey();
40
- if (timeout) {
41
- _logger.default.debug(`Waiting up to ${timeout}ms for applications to be reported`);
42
- try {
43
- await (0, _asyncbox.waitForCondition)(() => !_lodash.default.isEmpty(this.appDict), {
44
- waitMs: timeout,
45
- interval: APP_CONNECT_INTERVAL_MS
46
- });
47
- } catch (err) {
48
- _logger.default.debug(`Timed out waiting for applications to be reported`);
49
- }
50
- }
51
- return this.appDict || {};
52
- } catch (err) {
53
- _logger.default.error(`Error setting connection key: ${err.message}`);
54
- await this.disconnect();
55
- throw err;
56
- }
46
+ this.setup();
47
+ // initialize the rpc client
48
+ this.initRpcClient();
49
+ if (!this.rpcClient) {
50
+ throw new Error('rpcClient is undefined. Is the debugger connected?');
51
+ }
52
+ // listen for basic debugger-level events
53
+ this.rpcClient.on('_rpc_reportSetup:', lodash_1.default.noop);
54
+ this.rpcClient.on('_rpc_forwardGetListing:', this.onPageChange.bind(this));
55
+ this.rpcClient.on('_rpc_reportConnectedApplicationList:', this.onConnectedApplicationList.bind(this));
56
+ this.rpcClient.on('_rpc_applicationConnected:', this.onAppConnect.bind(this));
57
+ this.rpcClient.on('_rpc_applicationDisconnected:', this.onAppDisconnect.bind(this));
58
+ this.rpcClient.on('_rpc_applicationUpdated:', this.onAppUpdate.bind(this));
59
+ this.rpcClient.on('_rpc_reportConnectedDriverList:', this.onConnectedDriverList.bind(this));
60
+ this.rpcClient.on('_rpc_reportCurrentState:', this.onCurrentState.bind(this));
61
+ this.rpcClient.on('Page.frameDetached', this.frameDetached.bind(this));
62
+ await this.rpcClient.connect();
63
+ // get the connection information about the app
64
+ try {
65
+ this.setConnectionKey();
66
+ if (timeout) {
67
+ logger_1.default.debug(`Waiting up to ${timeout}ms for applications to be reported`);
68
+ try {
69
+ await (0, asyncbox_1.waitForCondition)(() => !lodash_1.default.isEmpty(this.appDict), {
70
+ waitMs: timeout,
71
+ intervalMs: APP_CONNECT_INTERVAL_MS,
72
+ });
73
+ }
74
+ catch (err) {
75
+ logger_1.default.debug(`Timed out waiting for applications to be reported`);
76
+ }
77
+ }
78
+ return this.appDict || {};
79
+ }
80
+ catch (err) {
81
+ logger_1.default.error(`Error setting connection key: ${err.message}`);
82
+ await this.disconnect();
83
+ throw err;
84
+ }
57
85
  }
86
+ /**
87
+ *
88
+ * @this {import('../remote-debugger').RemoteDebugger}
89
+ * @returns {Promise<void>}
90
+ */
58
91
  async function disconnect() {
59
- if (this.rpcClient) {
60
- await this.rpcClient.disconnect();
61
- }
62
- this.emit(_events.default.EVENT_DISCONNECT, true);
63
- this.teardown();
92
+ if (this.rpcClient) {
93
+ await this.rpcClient.disconnect();
94
+ }
95
+ this.emit(events_1.default.EVENT_DISCONNECT, true);
96
+ this.teardown();
64
97
  }
98
+ /**
99
+ *
100
+ * @this {import('../remote-debugger').RemoteDebugger}
101
+ * @param {string?} currentUrl
102
+ * @param {number} [maxTries]
103
+ * @param {boolean} [ignoreAboutBlankUrl]
104
+ * @returns {Promise<AppPages[]>}
105
+ */
65
106
  async function selectApp(currentUrl = null, maxTries = SELECT_APP_RETRIES, ignoreAboutBlankUrl = false) {
66
- const shouldCheckForTarget = this.rpcClient.shouldCheckForTarget;
67
- this.rpcClient.shouldCheckForTarget = false;
68
- try {
69
- const timer = new _support.timing.Timer().start();
70
- _logger.default.debug('Selecting application');
71
- if (!this.appDict || _lodash.default.isEmpty(this.appDict)) {
72
- _logger.default.debug('No applications currently connected.');
73
- return [];
74
- }
75
- const {
76
- appIdKey,
77
- pageDict
78
- } = await this.searchForApp(currentUrl, maxTries, ignoreAboutBlankUrl);
79
- if (!appIdKey || !pageDict) {
80
- _logger.default.errorAndThrow(`Could not connect to a valid app after ${maxTries} tries.`);
81
- }
82
- if (this.appIdKey !== appIdKey) {
83
- _logger.default.debug(`Received altered app id, updating from '${this.appIdKey}' to '${appIdKey}'`);
84
- this.appIdKey = appIdKey;
85
- }
86
- logApplicationDictionary(this.appDict);
87
- const pageArray = _lodash.default.isEmpty(this.appDict[appIdKey].pageArray) ? (0, _utils.pageArrayFromDict)(pageDict) : this.appDict[appIdKey].pageArray;
88
- _logger.default.debug(`Finally selecting app ${this.appIdKey}: ${(0, _utils.simpleStringify)(pageArray)}`);
89
- let fullPageArray = [];
90
- for (const [app, info] of _lodash.default.toPairs(this.appDict)) {
91
- if (!_lodash.default.isArray(info.pageArray) || !info.isActive) {
92
- continue;
93
- }
94
- const id = app.replace('PID:', '');
95
- for (const page of info.pageArray) {
96
- if (!(ignoreAboutBlankUrl && page.url === BLANK_PAGE_URL)) {
97
- let pageDict = _lodash.default.clone(page);
98
- pageDict.id = `${id}.${pageDict.id}`;
99
- pageDict.bundleId = info.bundleId;
100
- fullPageArray.push(pageDict);
107
+ logger_1.default.debug('Selecting application');
108
+ if (!this.rpcClient) {
109
+ throw new Error('rpcClient is undefined. Is the debugger connected?');
110
+ }
111
+ const shouldCheckForTarget = this.rpcClient.shouldCheckForTarget;
112
+ this.rpcClient.shouldCheckForTarget = false;
113
+ try {
114
+ const timer = new support_1.timing.Timer().start();
115
+ if (!this.appDict || lodash_1.default.isEmpty(this.appDict)) {
116
+ logger_1.default.debug('No applications currently connected.');
117
+ return [];
101
118
  }
102
- }
119
+ const { appIdKey, pageDict } = await this.searchForApp(currentUrl, maxTries, ignoreAboutBlankUrl);
120
+ // if, after all this, we have no dictionary, we have failed
121
+ if (!appIdKey || !pageDict) {
122
+ logger_1.default.errorAndThrow(`Could not connect to a valid app after ${maxTries} tries.`);
123
+ }
124
+ if (this.appIdKey !== appIdKey) {
125
+ logger_1.default.debug(`Received altered app id, updating from '${this.appIdKey}' to '${appIdKey}'`);
126
+ this.appIdKey = appIdKey;
127
+ }
128
+ logApplicationDictionary(this.appDict);
129
+ // translate the dictionary into a useful form, and return to sender
130
+ const pageArray = lodash_1.default.isEmpty(this.appDict[appIdKey].pageArray)
131
+ ? (0, utils_1.pageArrayFromDict)(pageDict)
132
+ : this.appDict[appIdKey].pageArray;
133
+ logger_1.default.debug(`Finally selecting app ${this.appIdKey}: ${(0, utils_1.simpleStringify)(pageArray)}`);
134
+ let fullPageArray = [];
135
+ for (const [app, info] of lodash_1.default.toPairs(this.appDict)) {
136
+ if (!lodash_1.default.isArray(info.pageArray) || !info.isActive) {
137
+ continue;
138
+ }
139
+ const id = app.replace('PID:', '');
140
+ for (const page of info.pageArray) {
141
+ if (!(ignoreAboutBlankUrl && page.url === BLANK_PAGE_URL)) {
142
+ let pageDict = lodash_1.default.clone(page);
143
+ pageDict.id = `${id}.${pageDict.id}`;
144
+ pageDict.bundleId = info.bundleId;
145
+ fullPageArray.push(pageDict);
146
+ }
147
+ }
148
+ }
149
+ logger_1.default.debug(`Selected app after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
150
+ return fullPageArray;
151
+ }
152
+ finally {
153
+ this.rpcClient.shouldCheckForTarget = shouldCheckForTarget;
103
154
  }
104
- _logger.default.debug(`Selected app after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
105
- return fullPageArray;
106
- } finally {
107
- this.rpcClient.shouldCheckForTarget = shouldCheckForTarget;
108
- }
109
155
  }
156
+ /**
157
+ *
158
+ * @this {import('../remote-debugger').RemoteDebugger}
159
+ * @param {string?} currentUrl
160
+ * @param {number} maxTries
161
+ * @param {boolean} ignoreAboutBlankUrl
162
+ * @returns {Promise<AppPages?>}
163
+ */
110
164
  async function searchForApp(currentUrl, maxTries, ignoreAboutBlankUrl) {
111
- const bundleIds = this.includeSafari && !this.isSafari ? [this.bundleId, ...this.additionalBundleIds, SAFARI_BUNDLE_ID] : [this.bundleId, ...this.additionalBundleIds];
112
- try {
113
- return await (0, _asyncbox.retryInterval)(maxTries, SELECT_APP_RETRY_SLEEP_MS, async retryCount => {
114
- logApplicationDictionary(this.appDict);
115
- const possibleAppIds = (0, _utils.getPossibleDebuggerAppKeys)(bundleIds, this.appDict);
116
- _logger.default.debug(`Trying out the possible app ids: ${possibleAppIds.join(', ')} (try #${retryCount + 1} of ${maxTries})`);
117
- for (const attemptedAppIdKey of possibleAppIds) {
118
- try {
119
- if (!this.appDict[attemptedAppIdKey].isActive) {
120
- _logger.default.debug(`Skipping app '${attemptedAppIdKey}' because it is not active`);
121
- continue;
122
- }
123
- _logger.default.debug(`Attempting app '${attemptedAppIdKey}'`);
124
- const [appIdKey, pageDict] = await this.rpcClient.selectApp(attemptedAppIdKey, this.onAppConnect.bind(this));
125
- if (_lodash.default.isEmpty(pageDict)) {
126
- _logger.default.debug('Empty page dictionary received. Trying again.');
127
- continue;
128
- }
129
- this.appDict[appIdKey].pageArray = (0, _utils.pageArrayFromDict)(pageDict);
130
- const result = this.searchForPage(this.appDict, currentUrl, ignoreAboutBlankUrl);
131
- if (result) {
132
- return result;
133
- }
134
- if (currentUrl) {
135
- _logger.default.debug(`Received app, but expected url ('${currentUrl}') was not found. Trying again.`);
136
- } else {
137
- _logger.default.debug('Received app, but no match was found. Trying again.');
138
- }
139
- } catch (err) {
140
- _logger.default.debug(`Error checking application: '${err.message}'. Retrying connection`);
141
- }
142
- }
143
- retryCount++;
144
- throw new Error('Failed to find an app to select');
145
- }, 0);
146
- } catch (ign) {
147
- _logger.default.errorAndThrow(`Could not connect to a valid app after ${maxTries} tries.`);
148
- }
165
+ const bundleIds = this.includeSafari && !this.isSafari
166
+ ? [this.bundleId, ...this.additionalBundleIds, SAFARI_BUNDLE_ID]
167
+ : [this.bundleId, ...this.additionalBundleIds];
168
+ try {
169
+ return await (0, asyncbox_1.retryInterval)(maxTries, SELECT_APP_RETRY_SLEEP_MS, async (retryCount) => {
170
+ if (!this.rpcClient) {
171
+ throw new Error('rpcClient is undefined. Is the debugger connected?');
172
+ }
173
+ logApplicationDictionary(this.appDict);
174
+ const possibleAppIds = (0, utils_1.getPossibleDebuggerAppKeys)(bundleIds, this.appDict);
175
+ logger_1.default.debug(`Trying out the possible app ids: ${possibleAppIds.join(', ')} (try #${retryCount + 1} of ${maxTries})`);
176
+ for (const attemptedAppIdKey of possibleAppIds) {
177
+ try {
178
+ if (!this.appDict[attemptedAppIdKey].isActive) {
179
+ logger_1.default.debug(`Skipping app '${attemptedAppIdKey}' because it is not active`);
180
+ continue;
181
+ }
182
+ logger_1.default.debug(`Attempting app '${attemptedAppIdKey}'`);
183
+ const [appIdKey, pageDict] = await this.rpcClient.selectApp(attemptedAppIdKey);
184
+ // in iOS 8.2 the connect logic happens, but with an empty dictionary
185
+ // which leads to the remote debugger getting disconnected, and into a loop
186
+ if (lodash_1.default.isEmpty(pageDict)) {
187
+ logger_1.default.debug('Empty page dictionary received. Trying again.');
188
+ continue;
189
+ }
190
+ // save the page array for this app
191
+ this.appDict[appIdKey].pageArray = (0, utils_1.pageArrayFromDict)(pageDict);
192
+ // if we are looking for a particular url, make sure we
193
+ // have the right page. Ignore empty or undefined urls.
194
+ // Ignore about:blank if requested.
195
+ const result = this.searchForPage(this.appDict, currentUrl, ignoreAboutBlankUrl);
196
+ if (result) {
197
+ return result;
198
+ }
199
+ if (currentUrl) {
200
+ logger_1.default.debug(`Received app, but expected url ('${currentUrl}') was not found. Trying again.`);
201
+ }
202
+ else {
203
+ logger_1.default.debug('Received app, but no match was found. Trying again.');
204
+ }
205
+ }
206
+ catch (err) {
207
+ logger_1.default.debug(`Error checking application: '${err.message}'. Retrying connection`);
208
+ }
209
+ }
210
+ retryCount++;
211
+ throw new Error('Failed to find an app to select');
212
+ }, 0);
213
+ }
214
+ catch (ign) {
215
+ logger_1.default.errorAndThrow(`Could not connect to a valid app after ${maxTries} tries.`);
216
+ }
217
+ return null;
149
218
  }
219
+ /**
220
+ *
221
+ * @this {import('../remote-debugger').RemoteDebugger}
222
+ * @param {Record<string, any>} appsDict
223
+ * @param {string?} currentUrl
224
+ * @param {boolean} [ignoreAboutBlankUrl]
225
+ * @returns {AppPages?}
226
+ */
150
227
  function searchForPage(appsDict, currentUrl = null, ignoreAboutBlankUrl = false) {
151
- for (const appDict of _lodash.default.values(appsDict)) {
152
- if (!appDict || !appDict.isActive || !appDict.pageArray || appDict.pageArray.promise) {
153
- continue;
154
- }
155
- for (const dict of appDict.pageArray) {
156
- if ((!ignoreAboutBlankUrl || dict.url !== BLANK_PAGE_URL) && (!currentUrl || dict.url === currentUrl || dict.url === `${currentUrl}/`)) {
157
- return {
158
- appIdKey: appDict.id,
159
- pageDict: dict
160
- };
161
- }
162
- }
163
- }
164
- return null;
228
+ for (const appDict of lodash_1.default.values(appsDict)) {
229
+ if (!appDict || !appDict.isActive || !appDict.pageArray || appDict.pageArray.promise) {
230
+ continue;
231
+ }
232
+ for (const dict of appDict.pageArray) {
233
+ if ((!ignoreAboutBlankUrl || dict.url !== BLANK_PAGE_URL) &&
234
+ (!currentUrl || dict.url === currentUrl || dict.url === `${currentUrl}/`)) {
235
+ return { appIdKey: appDict.id, pageDict: dict };
236
+ }
237
+ }
238
+ }
239
+ return null;
165
240
  }
241
+ /**
242
+ *
243
+ * @this {import('../remote-debugger').RemoteDebugger}
244
+ * @param {string} appIdKey
245
+ * @param {string} pageIdKey
246
+ * @param {boolean} [skipReadyCheck]
247
+ * @returns {Promise<void>}
248
+ */
166
249
  async function selectPage(appIdKey, pageIdKey, skipReadyCheck = false) {
167
- this.appIdKey = `PID:${appIdKey}`;
168
- this.pageIdKey = pageIdKey;
169
- _logger.default.debug(`Selecting page '${pageIdKey}' on app '${this.appIdKey}' and forwarding socket setup`);
170
- const timer = new _support.timing.Timer().start();
171
- await this.rpcClient.selectPage(this.appIdKey, pageIdKey);
172
- if (!skipReadyCheck && !(await this.checkPageIsReady())) {
173
- await this.pageUnload();
174
- }
175
- _logger.default.debug(`Selected page after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
250
+ this.appIdKey = `PID:${appIdKey}`;
251
+ this.pageIdKey = pageIdKey;
252
+ logger_1.default.debug(`Selecting page '${pageIdKey}' on app '${this.appIdKey}' and forwarding socket setup`);
253
+ if (!this.rpcClient) {
254
+ throw new Error('rpcClient is undefined. Is the debugger connected?');
255
+ }
256
+ const timer = new support_1.timing.Timer().start();
257
+ await this.rpcClient.selectPage(this.appIdKey, pageIdKey);
258
+ // make sure everything is ready to go
259
+ if (!skipReadyCheck && !await this.checkPageIsReady()) {
260
+ await this.pageUnload();
261
+ }
262
+ logger_1.default.debug(`Selected page after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
176
263
  }
264
+ /**
265
+ *
266
+ * @param {Record<string, any>} apps
267
+ * @returns {void}
268
+ */
177
269
  function logApplicationDictionary(apps) {
178
- function getValueString(key, value) {
179
- if (_lodash.default.isFunction(value)) {
180
- return '[Function]';
181
- }
182
- if (key === 'pageArray' && !_lodash.default.isArray(value)) {
183
- return `"Waiting for data"`;
184
- }
185
- return JSON.stringify(value);
186
- }
187
- _logger.default.debug('Current applications available:');
188
- for (const [app, info] of _lodash.default.toPairs(apps)) {
189
- _logger.default.debug(` Application: "${app}"`);
190
- for (const [key, value] of _lodash.default.toPairs(info)) {
191
- if (key === 'pageArray' && Array.isArray(value) && value.length) {
192
- _logger.default.debug(` ${key}:`);
193
- for (const page of value) {
194
- let prefix = '- ';
195
- for (const [k, v] of _lodash.default.toPairs(page)) {
196
- _logger.default.debug(` ${prefix}${k}: ${JSON.stringify(v)}`);
197
- prefix = ' ';
198
- }
270
+ function getValueString(key, value) {
271
+ if (lodash_1.default.isFunction(value)) {
272
+ return '[Function]';
273
+ }
274
+ if (key === 'pageArray' && !lodash_1.default.isArray(value)) {
275
+ return `"Waiting for data"`;
276
+ }
277
+ return JSON.stringify(value);
278
+ }
279
+ logger_1.default.debug('Current applications available:');
280
+ for (const [app, info] of lodash_1.default.toPairs(apps)) {
281
+ logger_1.default.debug(` Application: "${app}"`);
282
+ for (const [key, value] of lodash_1.default.toPairs(info)) {
283
+ if (key === 'pageArray' && Array.isArray(value) && value.length) {
284
+ logger_1.default.debug(` ${key}:`);
285
+ for (const page of value) {
286
+ let prefix = '- ';
287
+ for (const [k, v] of lodash_1.default.toPairs(page)) {
288
+ logger_1.default.debug(` ${prefix}${k}: ${JSON.stringify(v)}`);
289
+ prefix = ' ';
290
+ }
291
+ }
292
+ }
293
+ else {
294
+ const valueString = getValueString(key, value);
295
+ logger_1.default.debug(` ${key}: ${valueString}`);
296
+ }
199
297
  }
200
- } else {
201
- const valueString = getValueString(key, value);
202
- _logger.default.debug(` ${key}: ${valueString}`);
203
- }
204
298
  }
205
- }
206
299
  }
300
+ /**
301
+ *
302
+ * @this {import('../remote-debugger').RemoteDebugger}
303
+ * @param {Record<string, any>} dict
304
+ * @returns {void}
305
+ */
207
306
  function updateAppsWithDict(dict) {
208
- this.appDict = this.appDict || {};
209
- let [id, entry] = (0, _utils.appInfoFromDict)(dict);
210
- if (this.appDict[id]) {
211
- entry.pageArray = this.appDict[id].pageArray;
212
- }
213
- this.appDict[id] = entry;
214
- if (_lodash.default.isUndefined(entry.pageArray)) {
215
- entry.pageArray = (0, _utils.deferredPromise)();
216
- }
217
- if (!this.appIdKey) {
218
- this.appIdKey = (0, _utils.getDebuggerAppKey)(this.bundleId, this.appDict);
219
- }
307
+ // get the dictionary entry into a nice form, and add it to the
308
+ // application dictionary
309
+ this.appDict = this.appDict || {};
310
+ let [id, entry] = (0, utils_1.appInfoFromDict)(dict);
311
+ if (this.appDict[id]) {
312
+ // preserve the page dictionary for this entry
313
+ entry.pageArray = this.appDict[id].pageArray;
314
+ }
315
+ this.appDict[id] = entry;
316
+ // add a promise to get the page dictionary
317
+ if (lodash_1.default.isUndefined(entry.pageArray)) {
318
+ entry.pageArray = (0, utils_1.deferredPromise)();
319
+ }
320
+ // try to get the app id from our connected apps
321
+ if (!this.appIdKey) {
322
+ this.appIdKey = (0, utils_1.getDebuggerAppKey)(this.bundleId, this.appDict);
323
+ }
220
324
  }
221
- var _default = {
222
- setConnectionKey,
223
- connect,
224
- disconnect,
225
- selectApp,
226
- searchForApp,
227
- searchForPage,
228
- selectPage,
229
- updateAppsWithDict
325
+ exports.default = {
326
+ setConnectionKey, connect, disconnect, selectApp,
327
+ searchForApp, searchForPage, selectPage, updateAppsWithDict
230
328
  };
231
- exports.default = _default;
232
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfdXRpbHMiLCJfZXZlbnRzIiwiX3N1cHBvcnQiLCJfYXN5bmNib3giLCJfbG9kYXNoIiwiQVBQX0NPTk5FQ1RfVElNRU9VVF9NUyIsIkFQUF9DT05ORUNUX0lOVEVSVkFMX01TIiwiU0VMRUNUX0FQUF9SRVRSSUVTIiwiU0VMRUNUX0FQUF9SRVRSWV9TTEVFUF9NUyIsIlNBRkFSSV9CVU5ETEVfSUQiLCJCTEFOS19QQUdFX1VSTCIsInNldENvbm5lY3Rpb25LZXkiLCJsb2ciLCJkZWJ1ZyIsInJwY0NsaWVudCIsInNlbmQiLCJjb25uZWN0IiwidGltZW91dCIsInNldHVwIiwiaW5pdFJwY0NsaWVudCIsIm9uIiwiXyIsIm5vb3AiLCJvblBhZ2VDaGFuZ2UiLCJiaW5kIiwib25Db25uZWN0ZWRBcHBsaWNhdGlvbkxpc3QiLCJvbkFwcENvbm5lY3QiLCJvbkFwcERpc2Nvbm5lY3QiLCJvbkFwcFVwZGF0ZSIsIm9uQ29ubmVjdGVkRHJpdmVyTGlzdCIsIm9uQ3VycmVudFN0YXRlIiwiZnJhbWVEZXRhY2hlZCIsIndhaXRGb3JDb25kaXRpb24iLCJpc0VtcHR5IiwiYXBwRGljdCIsIndhaXRNcyIsImludGVydmFsIiwiZXJyIiwiZXJyb3IiLCJtZXNzYWdlIiwiZGlzY29ubmVjdCIsImVtaXQiLCJldmVudHMiLCJFVkVOVF9ESVNDT05ORUNUIiwidGVhcmRvd24iLCJzZWxlY3RBcHAiLCJjdXJyZW50VXJsIiwibWF4VHJpZXMiLCJpZ25vcmVBYm91dEJsYW5rVXJsIiwic2hvdWxkQ2hlY2tGb3JUYXJnZXQiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJhcHBJZEtleSIsInBhZ2VEaWN0Iiwic2VhcmNoRm9yQXBwIiwiZXJyb3JBbmRUaHJvdyIsImxvZ0FwcGxpY2F0aW9uRGljdGlvbmFyeSIsInBhZ2VBcnJheSIsInBhZ2VBcnJheUZyb21EaWN0Iiwic2ltcGxlU3RyaW5naWZ5IiwiZnVsbFBhZ2VBcnJheSIsImFwcCIsImluZm8iLCJ0b1BhaXJzIiwiaXNBcnJheSIsImlzQWN0aXZlIiwiaWQiLCJyZXBsYWNlIiwicGFnZSIsInVybCIsImNsb25lIiwiYnVuZGxlSWQiLCJwdXNoIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJidW5kbGVJZHMiLCJpbmNsdWRlU2FmYXJpIiwiaXNTYWZhcmkiLCJhZGRpdGlvbmFsQnVuZGxlSWRzIiwicmV0cnlJbnRlcnZhbCIsInJldHJ5Q291bnQiLCJwb3NzaWJsZUFwcElkcyIsImdldFBvc3NpYmxlRGVidWdnZXJBcHBLZXlzIiwiam9pbiIsImF0dGVtcHRlZEFwcElkS2V5IiwicmVzdWx0Iiwic2VhcmNoRm9yUGFnZSIsIkVycm9yIiwiaWduIiwiYXBwc0RpY3QiLCJ2YWx1ZXMiLCJwcm9taXNlIiwiZGljdCIsInNlbGVjdFBhZ2UiLCJwYWdlSWRLZXkiLCJza2lwUmVhZHlDaGVjayIsImNoZWNrUGFnZUlzUmVhZHkiLCJwYWdlVW5sb2FkIiwiYXBwcyIsImdldFZhbHVlU3RyaW5nIiwia2V5IiwidmFsdWUiLCJpc0Z1bmN0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsIkFycmF5IiwibGVuZ3RoIiwicHJlZml4IiwiayIsInYiLCJ2YWx1ZVN0cmluZyIsInVwZGF0ZUFwcHNXaXRoRGljdCIsImVudHJ5IiwiYXBwSW5mb0Zyb21EaWN0IiwiaXNVbmRlZmluZWQiLCJkZWZlcnJlZFByb21pc2UiLCJnZXREZWJ1Z2dlckFwcEtleSIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvbWl4aW5zL2Nvbm5lY3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgYXBwSW5mb0Zyb21EaWN0LCBwYWdlQXJyYXlGcm9tRGljdCwgZ2V0RGVidWdnZXJBcHBLZXksXG4gICAgICAgICBnZXRQb3NzaWJsZURlYnVnZ2VyQXBwS2V5cywgc2ltcGxlU3RyaW5naWZ5LCBkZWZlcnJlZFByb21pc2UgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgZXZlbnRzIGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBBUFBfQ09OTkVDVF9USU1FT1VUX01TID0gMDtcbmNvbnN0IEFQUF9DT05ORUNUX0lOVEVSVkFMX01TID0gMTAwO1xuY29uc3QgU0VMRUNUX0FQUF9SRVRSSUVTID0gMjA7XG5jb25zdCBTRUxFQ1RfQVBQX1JFVFJZX1NMRUVQX01TID0gNTAwO1xuY29uc3QgU0FGQVJJX0JVTkRMRV9JRCA9ICdjb20uYXBwbGUubW9iaWxlc2FmYXJpJztcbmNvbnN0IEJMQU5LX1BBR0VfVVJMID0gJ2Fib3V0OmJsYW5rJztcblxuXG5hc3luYyBmdW5jdGlvbiBzZXRDb25uZWN0aW9uS2V5ICgpIHtcbiAgbG9nLmRlYnVnKCdTZW5kaW5nIGNvbm5lY3Rpb24ga2V5IHJlcXVlc3QnKTtcbiAgLy8gc2VuZCBidXQgb25seSB3YWl0IHRvIG1ha2Ugc3VyZSB0aGUgc29ja2V0IHdvcmtlZFxuICAvLyBhcyByZXNwb25zZSBmcm9tIFdlYiBJbnNwZWN0b3IgY2FuIHRha2UgYSBsb25nIHRpbWVcbiAgYXdhaXQgdGhpcy5ycGNDbGllbnQuc2VuZCgnc2V0Q29ubmVjdGlvbktleScsIHt9LCBmYWxzZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QgKHRpbWVvdXQgPSBBUFBfQ09OTkVDVF9USU1FT1VUX01TKSB7XG4gIHRoaXMuc2V0dXAoKTtcblxuICAvLyBpbml0aWFsaXplIHRoZSBycGMgY2xpZW50XG4gIHRoaXMuaW5pdFJwY0NsaWVudCgpO1xuXG4gIC8vIGxpc3RlbiBmb3IgYmFzaWMgZGVidWdnZXItbGV2ZWwgZXZlbnRzXG4gIHRoaXMucnBjQ2xpZW50Lm9uKCdfcnBjX3JlcG9ydFNldHVwOicsIF8ubm9vcCk7XG4gIHRoaXMucnBjQ2xpZW50Lm9uKCdfcnBjX2ZvcndhcmRHZXRMaXN0aW5nOicsIHRoaXMub25QYWdlQ2hhbmdlLmJpbmQodGhpcykpO1xuICB0aGlzLnJwY0NsaWVudC5vbignX3JwY19yZXBvcnRDb25uZWN0ZWRBcHBsaWNhdGlvbkxpc3Q6JywgdGhpcy5vbkNvbm5lY3RlZEFwcGxpY2F0aW9uTGlzdC5iaW5kKHRoaXMpKTtcbiAgdGhpcy5ycGNDbGllbnQub24oJ19ycGNfYXBwbGljYXRpb25Db25uZWN0ZWQ6JywgdGhpcy5vbkFwcENvbm5lY3QuYmluZCh0aGlzKSk7XG4gIHRoaXMucnBjQ2xpZW50Lm9uKCdfcnBjX2FwcGxpY2F0aW9uRGlzY29ubmVjdGVkOicsIHRoaXMub25BcHBEaXNjb25uZWN0LmJpbmQodGhpcykpO1xuICB0aGlzLnJwY0NsaWVudC5vbignX3JwY19hcHBsaWNhdGlvblVwZGF0ZWQ6JywgdGhpcy5vbkFwcFVwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgdGhpcy5ycGNDbGllbnQub24oJ19ycGNfcmVwb3J0Q29ubmVjdGVkRHJpdmVyTGlzdDonLCB0aGlzLm9uQ29ubmVjdGVkRHJpdmVyTGlzdC5iaW5kKHRoaXMpKTtcbiAgdGhpcy5ycGNDbGllbnQub24oJ19ycGNfcmVwb3J0Q3VycmVudFN0YXRlOicsIHRoaXMub25DdXJyZW50U3RhdGUuYmluZCh0aGlzKSk7XG4gIHRoaXMucnBjQ2xpZW50Lm9uKCdQYWdlLmZyYW1lRGV0YWNoZWQnLCB0aGlzLmZyYW1lRGV0YWNoZWQuYmluZCh0aGlzKSk7XG5cbiAgYXdhaXQgdGhpcy5ycGNDbGllbnQuY29ubmVjdCgpO1xuXG4gIC8vIGdldCB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXBwXG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zZXRDb25uZWN0aW9uS2V5KCk7XG4gICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3RpbWVvdXR9bXMgZm9yIGFwcGxpY2F0aW9ucyB0byBiZSByZXBvcnRlZGApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbigoKSA9PiAhXy5pc0VtcHR5KHRoaXMuYXBwRGljdCksIHtcbiAgICAgICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICAgICAgaW50ZXJ2YWw6IEFQUF9DT05ORUNUX0lOVEVSVkFMX01TLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cuZGVidWcoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBhcHBsaWNhdGlvbnMgdG8gYmUgcmVwb3J0ZWRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBwRGljdCB8fCB7fTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKGBFcnJvciBzZXR0aW5nIGNvbm5lY3Rpb24ga2V5OiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNjb25uZWN0ICgpIHtcbiAgaWYgKHRoaXMucnBjQ2xpZW50KSB7XG4gICAgYXdhaXQgdGhpcy5ycGNDbGllbnQuZGlzY29ubmVjdCgpO1xuICB9XG4gIHRoaXMuZW1pdChldmVudHMuRVZFTlRfRElTQ09OTkVDVCwgdHJ1ZSk7XG4gIHRoaXMudGVhcmRvd24oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0QXBwIChjdXJyZW50VXJsID0gbnVsbCwgbWF4VHJpZXMgPSBTRUxFQ1RfQVBQX1JFVFJJRVMsIGlnbm9yZUFib3V0QmxhbmtVcmwgPSBmYWxzZSkge1xuICBjb25zdCBzaG91bGRDaGVja0ZvclRhcmdldCA9IHRoaXMucnBjQ2xpZW50LnNob3VsZENoZWNrRm9yVGFyZ2V0O1xuICB0aGlzLnJwY0NsaWVudC5zaG91bGRDaGVja0ZvclRhcmdldCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgbG9nLmRlYnVnKCdTZWxlY3RpbmcgYXBwbGljYXRpb24nKTtcbiAgICBpZiAoIXRoaXMuYXBwRGljdCB8fCBfLmlzRW1wdHkodGhpcy5hcHBEaWN0KSkge1xuICAgICAgbG9nLmRlYnVnKCdObyBhcHBsaWNhdGlvbnMgY3VycmVudGx5IGNvbm5lY3RlZC4nKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB7YXBwSWRLZXksIHBhZ2VEaWN0fSA9IGF3YWl0IHRoaXMuc2VhcmNoRm9yQXBwKGN1cnJlbnRVcmwsIG1heFRyaWVzLCBpZ25vcmVBYm91dEJsYW5rVXJsKTtcblxuICAgIC8vIGlmLCBhZnRlciBhbGwgdGhpcywgd2UgaGF2ZSBubyBkaWN0aW9uYXJ5LCB3ZSBoYXZlIGZhaWxlZFxuICAgIGlmICghYXBwSWRLZXkgfHwgIXBhZ2VEaWN0KSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGNvbm5lY3QgdG8gYSB2YWxpZCBhcHAgYWZ0ZXIgJHttYXhUcmllc30gdHJpZXMuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXBwSWRLZXkgIT09IGFwcElkS2V5KSB7XG4gICAgICBsb2cuZGVidWcoYFJlY2VpdmVkIGFsdGVyZWQgYXBwIGlkLCB1cGRhdGluZyBmcm9tICcke3RoaXMuYXBwSWRLZXl9JyB0byAnJHthcHBJZEtleX0nYCk7XG4gICAgICB0aGlzLmFwcElkS2V5ID0gYXBwSWRLZXk7XG4gICAgfVxuXG4gICAgbG9nQXBwbGljYXRpb25EaWN0aW9uYXJ5KHRoaXMuYXBwRGljdCk7XG5cbiAgICAvLyB0cmFuc2xhdGUgdGhlIGRpY3Rpb25hcnkgaW50byBhIHVzZWZ1bCBmb3JtLCBhbmQgcmV0dXJuIHRvIHNlbmRlclxuICAgIGNvbnN0IHBhZ2VBcnJheSA9IF8uaXNFbXB0eSh0aGlzLmFwcERpY3RbYXBwSWRLZXldLnBhZ2VBcnJheSlcbiAgICAgID8gcGFnZUFycmF5RnJvbURpY3QocGFnZURpY3QpXG4gICAgICA6IHRoaXMuYXBwRGljdFthcHBJZEtleV0ucGFnZUFycmF5O1xuICAgIGxvZy5kZWJ1ZyhgRmluYWxseSBzZWxlY3RpbmcgYXBwICR7dGhpcy5hcHBJZEtleX06ICR7c2ltcGxlU3RyaW5naWZ5KHBhZ2VBcnJheSl9YCk7XG5cbiAgICBsZXQgZnVsbFBhZ2VBcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2FwcCwgaW5mb10gb2YgXy50b1BhaXJzKHRoaXMuYXBwRGljdCkpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KGluZm8ucGFnZUFycmF5KSB8fCAhaW5mby5pc0FjdGl2ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkID0gYXBwLnJlcGxhY2UoJ1BJRDonLCAnJyk7XG4gICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgaW5mby5wYWdlQXJyYXkpIHtcbiAgICAgICAgaWYgKCEoaWdub3JlQWJvdXRCbGFua1VybCAmJiBwYWdlLnVybCA9PT0gQkxBTktfUEFHRV9VUkwpKSB7XG4gICAgICAgICAgbGV0IHBhZ2VEaWN0ID0gXy5jbG9uZShwYWdlKTtcbiAgICAgICAgICBwYWdlRGljdC5pZCA9IGAke2lkfS4ke3BhZ2VEaWN0LmlkfWA7XG4gICAgICAgICAgcGFnZURpY3QuYnVuZGxlSWQgPSBpbmZvLmJ1bmRsZUlkO1xuICAgICAgICAgIGZ1bGxQYWdlQXJyYXkucHVzaChwYWdlRGljdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2cuZGVidWcoYFNlbGVjdGVkIGFwcCBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIHJldHVybiBmdWxsUGFnZUFycmF5O1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMucnBjQ2xpZW50LnNob3VsZENoZWNrRm9yVGFyZ2V0ID0gc2hvdWxkQ2hlY2tGb3JUYXJnZXQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRm9yQXBwIChjdXJyZW50VXJsLCBtYXhUcmllcywgaWdub3JlQWJvdXRCbGFua1VybCkge1xuICBjb25zdCBidW5kbGVJZHMgPSB0aGlzLmluY2x1ZGVTYWZhcmkgJiYgIXRoaXMuaXNTYWZhcmlcbiAgICA/IFt0aGlzLmJ1bmRsZUlkLCAuLi50aGlzLmFkZGl0aW9uYWxCdW5kbGVJZHMsIFNBRkFSSV9CVU5ETEVfSURdXG4gICAgOiBbdGhpcy5idW5kbGVJZCwgLi4udGhpcy5hZGRpdGlvbmFsQnVuZGxlSWRzXTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChtYXhUcmllcywgU0VMRUNUX0FQUF9SRVRSWV9TTEVFUF9NUywgYXN5bmMgKHJldHJ5Q291bnQpID0+IHtcbiAgICAgIGxvZ0FwcGxpY2F0aW9uRGljdGlvbmFyeSh0aGlzLmFwcERpY3QpO1xuICAgICAgY29uc3QgcG9zc2libGVBcHBJZHMgPSBnZXRQb3NzaWJsZURlYnVnZ2VyQXBwS2V5cyhidW5kbGVJZHMsIHRoaXMuYXBwRGljdCk7XG4gICAgICBsb2cuZGVidWcoYFRyeWluZyBvdXQgdGhlIHBvc3NpYmxlIGFwcCBpZHM6ICR7cG9zc2libGVBcHBJZHMuam9pbignLCAnKX0gKHRyeSAjJHtyZXRyeUNvdW50ICsgMX0gb2YgJHttYXhUcmllc30pYCk7XG4gICAgICBmb3IgKGNvbnN0IGF0dGVtcHRlZEFwcElkS2V5IG9mIHBvc3NpYmxlQXBwSWRzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmFwcERpY3RbYXR0ZW1wdGVkQXBwSWRLZXldLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYFNraXBwaW5nIGFwcCAnJHthdHRlbXB0ZWRBcHBJZEtleX0nIGJlY2F1c2UgaXQgaXMgbm90IGFjdGl2ZWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyBhcHAgJyR7YXR0ZW1wdGVkQXBwSWRLZXl9J2ApO1xuICAgICAgICAgIGNvbnN0IFthcHBJZEtleSwgcGFnZURpY3RdID0gYXdhaXQgdGhpcy5ycGNDbGllbnQuc2VsZWN0QXBwKGF0dGVtcHRlZEFwcElkS2V5LCB0aGlzLm9uQXBwQ29ubmVjdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAvLyBpbiBpT1MgOC4yIHRoZSBjb25uZWN0IGxvZ2ljIGhhcHBlbnMsIGJ1dCB3aXRoIGFuIGVtcHR5IGRpY3Rpb25hcnlcbiAgICAgICAgICAvLyB3aGljaCBsZWFkcyB0byB0aGUgcmVtb3RlIGRlYnVnZ2VyIGdldHRpbmcgZGlzY29ubmVjdGVkLCBhbmQgaW50byBhIGxvb3BcbiAgICAgICAgICBpZiAoXy5pc0VtcHR5KHBhZ2VEaWN0KSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKCdFbXB0eSBwYWdlIGRpY3Rpb25hcnkgcmVjZWl2ZWQuIFRyeWluZyBhZ2Fpbi4nKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHNhdmUgdGhlIHBhZ2UgYXJyYXkgZm9yIHRoaXMgYXBwXG4gICAgICAgICAgdGhpcy5hcHBEaWN0W2FwcElkS2V5XS5wYWdlQXJyYXkgPSBwYWdlQXJyYXlGcm9tRGljdChwYWdlRGljdCk7XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgbG9va2luZyBmb3IgYSBwYXJ0aWN1bGFyIHVybCwgbWFrZSBzdXJlIHdlXG4gICAgICAgICAgLy8gaGF2ZSB0aGUgcmlnaHQgcGFnZS4gSWdub3JlIGVtcHR5IG9yIHVuZGVmaW5lZCB1cmxzLlxuICAgICAgICAgIC8vIElnbm9yZSBhYm91dDpibGFuayBpZiByZXF1ZXN0ZWQuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2hGb3JQYWdlKHRoaXMuYXBwRGljdCwgY3VycmVudFVybCwgaWdub3JlQWJvdXRCbGFua1VybCk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY3VycmVudFVybCkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBSZWNlaXZlZCBhcHAsIGJ1dCBleHBlY3RlZCB1cmwgKCcke2N1cnJlbnRVcmx9Jykgd2FzIG5vdCBmb3VuZC4gVHJ5aW5nIGFnYWluLmApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoJ1JlY2VpdmVkIGFwcCwgYnV0IG5vIG1hdGNoIHdhcyBmb3VuZC4gVHJ5aW5nIGFnYWluLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBFcnJvciBjaGVja2luZyBhcHBsaWNhdGlvbjogJyR7ZXJyLm1lc3NhZ2V9Jy4gUmV0cnlpbmcgY29ubmVjdGlvbmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXRyeUNvdW50Kys7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIGFuIGFwcCB0byBzZWxlY3QnKTtcbiAgICB9LCAwKTtcbiAgfSBjYXRjaCAoaWduKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBjb25uZWN0IHRvIGEgdmFsaWQgYXBwIGFmdGVyICR7bWF4VHJpZXN9IHRyaWVzLmApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlYXJjaEZvclBhZ2UgKGFwcHNEaWN0LCBjdXJyZW50VXJsID0gbnVsbCwgaWdub3JlQWJvdXRCbGFua1VybCA9IGZhbHNlKSB7XG4gIGZvciAoY29uc3QgYXBwRGljdCBvZiBfLnZhbHVlcyhhcHBzRGljdCkpIHtcbiAgICBpZiAoIWFwcERpY3QgfHwgIWFwcERpY3QuaXNBY3RpdmUgfHwgIWFwcERpY3QucGFnZUFycmF5IHx8IGFwcERpY3QucGFnZUFycmF5LnByb21pc2UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGljdCBvZiBhcHBEaWN0LnBhZ2VBcnJheSkge1xuICAgICAgaWYgKCghaWdub3JlQWJvdXRCbGFua1VybCB8fCBkaWN0LnVybCAhPT0gQkxBTktfUEFHRV9VUkwpICYmXG4gICAgICAgICAgKCFjdXJyZW50VXJsIHx8IGRpY3QudXJsID09PSBjdXJyZW50VXJsIHx8IGRpY3QudXJsID09PSBgJHtjdXJyZW50VXJsfS9gKSkge1xuICAgICAgICByZXR1cm4geyBhcHBJZEtleTogYXBwRGljdC5pZCwgcGFnZURpY3Q6IGRpY3QgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbGVjdFBhZ2UgKGFwcElkS2V5LCBwYWdlSWRLZXksIHNraXBSZWFkeUNoZWNrID0gZmFsc2UpIHtcbiAgdGhpcy5hcHBJZEtleSA9IGBQSUQ6JHthcHBJZEtleX1gO1xuICB0aGlzLnBhZ2VJZEtleSA9IHBhZ2VJZEtleTtcblxuICBsb2cuZGVidWcoYFNlbGVjdGluZyBwYWdlICcke3BhZ2VJZEtleX0nIG9uIGFwcCAnJHt0aGlzLmFwcElkS2V5fScgYW5kIGZvcndhcmRpbmcgc29ja2V0IHNldHVwYCk7XG5cbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcblxuICBhd2FpdCB0aGlzLnJwY0NsaWVudC5zZWxlY3RQYWdlKHRoaXMuYXBwSWRLZXksIHBhZ2VJZEtleSk7XG5cbiAgLy8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgcmVhZHkgdG8gZ29cbiAgaWYgKCFza2lwUmVhZHlDaGVjayAmJiAhYXdhaXQgdGhpcy5jaGVja1BhZ2VJc1JlYWR5KCkpIHtcbiAgICBhd2FpdCB0aGlzLnBhZ2VVbmxvYWQoKTtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgU2VsZWN0ZWQgcGFnZSBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xufVxuXG5mdW5jdGlvbiBsb2dBcHBsaWNhdGlvbkRpY3Rpb25hcnkgKGFwcHMpIHtcbiAgZnVuY3Rpb24gZ2V0VmFsdWVTdHJpbmcgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuICdbRnVuY3Rpb25dJztcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ3BhZ2VBcnJheScgJiYgIV8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgXCJXYWl0aW5nIGZvciBkYXRhXCJgO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG4gIGxvZy5kZWJ1ZygnQ3VycmVudCBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlOicpO1xuICBmb3IgKGNvbnN0IFthcHAsIGluZm9dIG9mIF8udG9QYWlycyhhcHBzKSkge1xuICAgIGxvZy5kZWJ1ZyhgICAgIEFwcGxpY2F0aW9uOiBcIiR7YXBwfVwiYCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGluZm8pKSB7XG4gICAgICBpZiAoa2V5ID09PSAncGFnZUFycmF5JyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgbG9nLmRlYnVnKGAgICAgICAgICR7a2V5fTpgKTtcbiAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHZhbHVlKSB7XG4gICAgICAgICAgbGV0IHByZWZpeCA9ICctICc7XG4gICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgXy50b1BhaXJzKHBhZ2UpKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYCAgICAgICAgICAke3ByZWZpeH0ke2t9OiAke0pTT04uc3RyaW5naWZ5KHYpfWApO1xuICAgICAgICAgICAgcHJlZml4ID0gJyAgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gZ2V0VmFsdWVTdHJpbmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgICAgICAgICAke2tleX06ICR7dmFsdWVTdHJpbmd9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUFwcHNXaXRoRGljdCAoZGljdCkge1xuICAvLyBnZXQgdGhlIGRpY3Rpb25hcnkgZW50cnkgaW50byBhIG5pY2UgZm9ybSwgYW5kIGFkZCBpdCB0byB0aGVcbiAgLy8gYXBwbGljYXRpb24gZGljdGlvbmFyeVxuICB0aGlzLmFwcERpY3QgPSB0aGlzLmFwcERpY3QgfHwge307XG4gIGxldCBbaWQsIGVudHJ5XSA9IGFwcEluZm9Gcm9tRGljdChkaWN0KTtcbiAgaWYgKHRoaXMuYXBwRGljdFtpZF0pIHtcbiAgICAvLyBwcmVzZXJ2ZSB0aGUgcGFnZSBkaWN0aW9uYXJ5IGZvciB0aGlzIGVudHJ5XG4gICAgZW50cnkucGFnZUFycmF5ID0gdGhpcy5hcHBEaWN0W2lkXS5wYWdlQXJyYXk7XG4gIH1cbiAgdGhpcy5hcHBEaWN0W2lkXSA9IGVudHJ5O1xuXG4gIC8vIGFkZCBhIHByb21pc2UgdG8gZ2V0IHRoZSBwYWdlIGRpY3Rpb25hcnlcbiAgaWYgKF8uaXNVbmRlZmluZWQoZW50cnkucGFnZUFycmF5KSkge1xuICAgIGVudHJ5LnBhZ2VBcnJheSA9IGRlZmVycmVkUHJvbWlzZSgpO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGdldCB0aGUgYXBwIGlkIGZyb20gb3VyIGNvbm5lY3RlZCBhcHBzXG4gIGlmICghdGhpcy5hcHBJZEtleSkge1xuICAgIHRoaXMuYXBwSWRLZXkgPSBnZXREZWJ1Z2dlckFwcEtleSh0aGlzLmJ1bmRsZUlkLCB0aGlzLmFwcERpY3QpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgc2V0Q29ubmVjdGlvbktleSwgY29ubmVjdCwgZGlzY29ubmVjdCwgc2VsZWN0QXBwLCBzZWFyY2hGb3JBcHAsIHNlYXJjaEZvclBhZ2UsIHNlbGVj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
329
+ //# sourceMappingURL=connect.js.map