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.
- package/CHANGELOG.md +14 -0
- package/build/index.js +18 -33
- package/build/lib/atoms.d.ts +17 -0
- package/build/lib/atoms.d.ts.map +1 -0
- package/build/lib/atoms.js +75 -50
- package/build/lib/atoms.js.map +1 -1
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +5 -11
- package/build/lib/logger.js.map +1 -1
- package/build/lib/mixins/connect.d.ts +125 -0
- package/build/lib/mixins/connect.d.ts.map +1 -0
- package/build/lib/mixins/connect.js +299 -202
- package/build/lib/mixins/connect.js.map +1 -1
- package/build/lib/mixins/events.d.ts +7 -0
- package/build/lib/mixins/events.d.ts.map +1 -0
- package/build/lib/mixins/events.js +7 -12
- package/build/lib/mixins/events.js.map +1 -1
- package/build/lib/mixins/execute.d.ts +38 -0
- package/build/lib/mixins/execute.d.ts.map +1 -0
- package/build/lib/mixins/execute.js +162 -122
- package/build/lib/mixins/execute.js.map +1 -1
- package/build/lib/mixins/index.d.ts +5 -0
- package/build/lib/mixins/index.d.ts.map +1 -0
- package/build/lib/mixins/index.js +14 -23
- package/build/lib/mixins/index.js.map +1 -1
- package/build/lib/mixins/message-handlers.d.ts +92 -0
- package/build/lib/mixins/message-handlers.d.ts.map +1 -0
- package/build/lib/mixins/message-handlers.js +160 -97
- package/build/lib/mixins/message-handlers.js.map +1 -1
- package/build/lib/mixins/navigate.d.ts +92 -0
- package/build/lib/mixins/navigate.d.ts.map +1 -0
- package/build/lib/mixins/navigate.js +199 -141
- package/build/lib/mixins/navigate.js.map +1 -1
- package/build/lib/protocol/index.d.ts +14 -0
- package/build/lib/protocol/index.d.ts.map +1 -0
- package/build/lib/protocol/index.js +192 -118
- package/build/lib/protocol/index.js.map +1 -1
- package/build/lib/remote-debugger-real-device.d.ts +6 -0
- package/build/lib/remote-debugger-real-device.d.ts.map +1 -0
- package/build/lib/remote-debugger-real-device.js +29 -32
- package/build/lib/remote-debugger-real-device.js.map +1 -1
- package/build/lib/remote-debugger.d.ts +119 -0
- package/build/lib/remote-debugger.d.ts.map +1 -0
- package/build/lib/remote-debugger.js +256 -226
- package/build/lib/remote-debugger.js.map +1 -1
- package/build/lib/rpc/index.d.ts +4 -0
- package/build/lib/rpc/index.d.ts.map +1 -0
- package/build/lib/rpc/index.js +10 -21
- package/build/lib/rpc/index.js.map +1 -1
- package/build/lib/rpc/remote-messages.d.ts +51 -0
- package/build/lib/rpc/remote-messages.d.ts.map +1 -0
- package/build/lib/rpc/remote-messages.js +203 -224
- package/build/lib/rpc/remote-messages.js.map +1 -1
- package/build/lib/rpc/rpc-client-real-device.d.ts +6 -0
- package/build/lib/rpc/rpc-client-real-device.d.ts.map +1 -0
- package/build/lib/rpc/rpc-client-real-device.js +43 -49
- package/build/lib/rpc/rpc-client-real-device.js.map +1 -1
- package/build/lib/rpc/rpc-client-simulator.d.ts +15 -0
- package/build/lib/rpc/rpc-client-simulator.d.ts.map +1 -0
- package/build/lib/rpc/rpc-client-simulator.js +138 -125
- package/build/lib/rpc/rpc-client-simulator.js.map +1 -1
- package/build/lib/rpc/rpc-client.d.ts +142 -0
- package/build/lib/rpc/rpc-client.d.ts.map +1 -0
- package/build/lib/rpc/rpc-client.js +559 -418
- package/build/lib/rpc/rpc-client.js.map +1 -1
- package/build/lib/rpc/rpc-message-handler.d.ts +13 -0
- package/build/lib/rpc/rpc-message-handler.d.ts.map +1 -0
- package/build/lib/rpc/rpc-message-handler.js +181 -166
- package/build/lib/rpc/rpc-message-handler.js.map +1 -1
- package/build/lib/utils.d.ts +61 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +241 -155
- package/build/lib/utils.js.map +1 -1
- package/lib/atoms.js +25 -4
- package/lib/mixins/connect.js +102 -7
- package/lib/mixins/execute.js +46 -13
- package/lib/mixins/message-handlers.js +44 -1
- package/lib/mixins/navigate.js +55 -3
- package/lib/remote-debugger.js +112 -0
- package/lib/rpc/rpc-client-real-device.js +1 -6
- package/lib/rpc/rpc-client-simulator.js +7 -1
- package/lib/rpc/rpc-client.js +106 -6
- package/lib/rpc/rpc-message-handler.js +1 -1
- package/lib/utils.js +31 -1
- package/package.json +26 -16
|
@@ -1,232 +1,329 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
entry
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
232
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfdXRpbHMiLCJfZXZlbnRzIiwiX3N1cHBvcnQiLCJfYXN5bmNib3giLCJfbG9kYXNoIiwiQVBQX0NPTk5FQ1RfVElNRU9VVF9NUyIsIkFQUF9DT05ORUNUX0lOVEVSVkFMX01TIiwiU0VMRUNUX0FQUF9SRVRSSUVTIiwiU0VMRUNUX0FQUF9SRVRSWV9TTEVFUF9NUyIsIlNBRkFSSV9CVU5ETEVfSUQiLCJCTEFOS19QQUdFX1VSTCIsInNldENvbm5lY3Rpb25LZXkiLCJsb2ciLCJkZWJ1ZyIsInJwY0NsaWVudCIsInNlbmQiLCJjb25uZWN0IiwidGltZW91dCIsInNldHVwIiwiaW5pdFJwY0NsaWVudCIsIm9uIiwiXyIsIm5vb3AiLCJvblBhZ2VDaGFuZ2UiLCJiaW5kIiwib25Db25uZWN0ZWRBcHBsaWNhdGlvbkxpc3QiLCJvbkFwcENvbm5lY3QiLCJvbkFwcERpc2Nvbm5lY3QiLCJvbkFwcFVwZGF0ZSIsIm9uQ29ubmVjdGVkRHJpdmVyTGlzdCIsIm9uQ3VycmVudFN0YXRlIiwiZnJhbWVEZXRhY2hlZCIsIndhaXRGb3JDb25kaXRpb24iLCJpc0VtcHR5IiwiYXBwRGljdCIsIndhaXRNcyIsImludGVydmFsIiwiZXJyIiwiZXJyb3IiLCJtZXNzYWdlIiwiZGlzY29ubmVjdCIsImVtaXQiLCJldmVudHMiLCJFVkVOVF9ESVNDT05ORUNUIiwidGVhcmRvd24iLCJzZWxlY3RBcHAiLCJjdXJyZW50VXJsIiwibWF4VHJpZXMiLCJpZ25vcmVBYm91dEJsYW5rVXJsIiwic2hvdWxkQ2hlY2tGb3JUYXJnZXQiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJhcHBJZEtleSIsInBhZ2VEaWN0Iiwic2VhcmNoRm9yQXBwIiwiZXJyb3JBbmRUaHJvdyIsImxvZ0FwcGxpY2F0aW9uRGljdGlvbmFyeSIsInBhZ2VBcnJheSIsInBhZ2VBcnJheUZyb21EaWN0Iiwic2ltcGxlU3RyaW5naWZ5IiwiZnVsbFBhZ2VBcnJheSIsImFwcCIsImluZm8iLCJ0b1BhaXJzIiwiaXNBcnJheSIsImlzQWN0aXZlIiwiaWQiLCJyZXBsYWNlIiwicGFnZSIsInVybCIsImNsb25lIiwiYnVuZGxlSWQiLCJwdXNoIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJidW5kbGVJZHMiLCJpbmNsdWRlU2FmYXJpIiwiaXNTYWZhcmkiLCJhZGRpdGlvbmFsQnVuZGxlSWRzIiwicmV0cnlJbnRlcnZhbCIsInJldHJ5Q291bnQiLCJwb3NzaWJsZUFwcElkcyIsImdldFBvc3NpYmxlRGVidWdnZXJBcHBLZXlzIiwiam9pbiIsImF0dGVtcHRlZEFwcElkS2V5IiwicmVzdWx0Iiwic2VhcmNoRm9yUGFnZSIsIkVycm9yIiwiaWduIiwiYXBwc0RpY3QiLCJ2YWx1ZXMiLCJwcm9taXNlIiwiZGljdCIsInNlbGVjdFBhZ2UiLCJwYWdlSWRLZXkiLCJza2lwUmVhZHlDaGVjayIsImNoZWNrUGFnZUlzUmVhZHkiLCJwYWdlVW5sb2FkIiwiYXBwcyIsImdldFZhbHVlU3RyaW5nIiwia2V5IiwidmFsdWUiLCJpc0Z1bmN0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsIkFycmF5IiwibGVuZ3RoIiwicHJlZml4IiwiayIsInYiLCJ2YWx1ZVN0cmluZyIsInVwZGF0ZUFwcHNXaXRoRGljdCIsImVudHJ5IiwiYXBwSW5mb0Zyb21EaWN0IiwiaXNVbmRlZmluZWQiLCJkZWZlcnJlZFByb21pc2UiLCJnZXREZWJ1Z2dlckFwcEtleSIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvbWl4aW5zL2Nvbm5lY3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgYXBwSW5mb0Zyb21EaWN0LCBwYWdlQXJyYXlGcm9tRGljdCwgZ2V0RGVidWdnZXJBcHBLZXksXG4gICAgICAgICBnZXRQb3NzaWJsZURlYnVnZ2VyQXBwS2V5cywgc2ltcGxlU3RyaW5naWZ5LCBkZWZlcnJlZFByb21pc2UgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgZXZlbnRzIGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBBUFBfQ09OTkVDVF9USU1FT1VUX01TID0gMDtcbmNvbnN0IEFQUF9DT05ORUNUX0lOVEVSVkFMX01TID0gMTAwO1xuY29uc3QgU0VMRUNUX0FQUF9SRVRSSUVTID0gMjA7XG5jb25zdCBTRUxFQ1RfQVBQX1JFVFJZX1NMRUVQX01TID0gNTAwO1xuY29uc3QgU0FGQVJJX0JVTkRMRV9JRCA9ICdjb20uYXBwbGUubW9iaWxlc2FmYXJpJztcbmNvbnN0IEJMQU5LX1BBR0VfVVJMID0gJ2Fib3V0OmJsYW5rJztcblxuXG5hc3luYyBmdW5jdGlvbiBzZXRDb25uZWN0aW9uS2V5ICgpIHtcbiAgbG9nLmRlYnVnKCdTZW5kaW5nIGNvbm5lY3Rpb24ga2V5IHJlcXVlc3QnKTtcbiAgLy8gc2VuZCBidXQgb25seSB3YWl0IHRvIG1ha2Ugc3VyZSB0aGUgc29ja2V0IHdvcmtlZFxuICAvLyBhcyByZXNwb25zZSBmcm9tIFdlYiBJbnNwZWN0b3IgY2FuIHRha2UgYSBsb25nIHRpbWVcbiAgYXdhaXQgdGhpcy5ycGNDbGllbnQuc2VuZCgnc2V0Q29ubmVjdGlvbktleScsIHt9LCBmYWxzZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QgKHRpbWVvdXQgPSBBUFBfQ09OTkVDVF9USU1FT1VUX01TKSB7XG4gIHRoaXMuc2V0dXAoKTtcblxuICAvLyBpbml0aWFsaXplIHRoZSBycGMgY2xpZW50XG4gIHRoaXMuaW5pdFJwY0NsaWVudCgpO1xuXG4gIC8vIGxpc3RlbiBmb3IgYmFzaWMgZGVidWdnZXItbGV2ZWwgZXZlbnRzXG4gIHRoaXMucnBjQ2xpZW50Lm9uKCdfcnBjX3JlcG9ydFNldHVwOicsIF8ubm9vcCk7XG4gIHRoaXMucnBjQ2xpZW50Lm9uKCdfcnBjX2ZvcndhcmRHZXRMaXN0aW5nOicsIHRoaXMub25QYWdlQ2hhbmdlLmJpbmQodGhpcykpO1xuICB0aGlzLnJwY0NsaWVudC5vbignX3JwY19yZXBvcnRDb25uZWN0ZWRBcHBsaWNhdGlvbkxpc3Q6JywgdGhpcy5vbkNvbm5lY3RlZEFwcGxpY2F0aW9uTGlzdC5iaW5kKHRoaXMpKTtcbiAgdGhpcy5ycGNDbGllbnQub24oJ19ycGNfYXBwbGljYXRpb25Db25uZWN0ZWQ6JywgdGhpcy5vbkFwcENvbm5lY3QuYmluZCh0aGlzKSk7XG4gIHRoaXMucnBjQ2xpZW50Lm9uKCdfcnBjX2FwcGxpY2F0aW9uRGlzY29ubmVjdGVkOicsIHRoaXMub25BcHBEaXNjb25uZWN0LmJpbmQodGhpcykpO1xuICB0aGlzLnJwY0NsaWVudC5vbignX3JwY19hcHBsaWNhdGlvblVwZGF0ZWQ6JywgdGhpcy5vbkFwcFVwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgdGhpcy5ycGNDbGllbnQub24oJ19ycGNfcmVwb3J0Q29ubmVjdGVkRHJpdmVyTGlzdDonLCB0aGlzLm9uQ29ubmVjdGVkRHJpdmVyTGlzdC5iaW5kKHRoaXMpKTtcbiAgdGhpcy5ycGNDbGllbnQub24oJ19ycGNfcmVwb3J0Q3VycmVudFN0YXRlOicsIHRoaXMub25DdXJyZW50U3RhdGUuYmluZCh0aGlzKSk7XG4gIHRoaXMucnBjQ2xpZW50Lm9uKCdQYWdlLmZyYW1lRGV0YWNoZWQnLCB0aGlzLmZyYW1lRGV0YWNoZWQuYmluZCh0aGlzKSk7XG5cbiAgYXdhaXQgdGhpcy5ycGNDbGllbnQuY29ubmVjdCgpO1xuXG4gIC8vIGdldCB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXBwXG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zZXRDb25uZWN0aW9uS2V5KCk7XG4gICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3RpbWVvdXR9bXMgZm9yIGFwcGxpY2F0aW9ucyB0byBiZSByZXBvcnRlZGApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbigoKSA9PiAhXy5pc0VtcHR5KHRoaXMuYXBwRGljdCksIHtcbiAgICAgICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICAgICAgaW50ZXJ2YWw6IEFQUF9DT05ORUNUX0lOVEVSVkFMX01TLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cuZGVidWcoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBhcHBsaWNhdGlvbnMgdG8gYmUgcmVwb3J0ZWRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBwRGljdCB8fCB7fTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKGBFcnJvciBzZXR0aW5nIGNvbm5lY3Rpb24ga2V5OiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNjb25uZWN0ICgpIHtcbiAgaWYgKHRoaXMucnBjQ2xpZW50KSB7XG4gICAgYXdhaXQgdGhpcy5ycGNDbGllbnQuZGlzY29ubmVjdCgpO1xuICB9XG4gIHRoaXMuZW1pdChldmVudHMuRVZFTlRfRElTQ09OTkVDVCwgdHJ1ZSk7XG4gIHRoaXMudGVhcmRvd24oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0QXBwIChjdXJyZW50VXJsID0gbnVsbCwgbWF4VHJpZXMgPSBTRUxFQ1RfQVBQX1JFVFJJRVMsIGlnbm9yZUFib3V0QmxhbmtVcmwgPSBmYWxzZSkge1xuICBjb25zdCBzaG91bGRDaGVja0ZvclRhcmdldCA9IHRoaXMucnBjQ2xpZW50LnNob3VsZENoZWNrRm9yVGFyZ2V0O1xuICB0aGlzLnJwY0NsaWVudC5zaG91bGRDaGVja0ZvclRhcmdldCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgbG9nLmRlYnVnKCdTZWxlY3RpbmcgYXBwbGljYXRpb24nKTtcbiAgICBpZiAoIXRoaXMuYXBwRGljdCB8fCBfLmlzRW1wdHkodGhpcy5hcHBEaWN0KSkge1xuICAgICAgbG9nLmRlYnVnKCdObyBhcHBsaWNhdGlvbnMgY3VycmVudGx5IGNvbm5lY3RlZC4nKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB7YXBwSWRLZXksIHBhZ2VEaWN0fSA9IGF3YWl0IHRoaXMuc2VhcmNoRm9yQXBwKGN1cnJlbnRVcmwsIG1heFRyaWVzLCBpZ25vcmVBYm91dEJsYW5rVXJsKTtcblxuICAgIC8vIGlmLCBhZnRlciBhbGwgdGhpcywgd2UgaGF2ZSBubyBkaWN0aW9uYXJ5LCB3ZSBoYXZlIGZhaWxlZFxuICAgIGlmICghYXBwSWRLZXkgfHwgIXBhZ2VEaWN0KSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGNvbm5lY3QgdG8gYSB2YWxpZCBhcHAgYWZ0ZXIgJHttYXhUcmllc30gdHJpZXMuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXBwSWRLZXkgIT09IGFwcElkS2V5KSB7XG4gICAgICBsb2cuZGVidWcoYFJlY2VpdmVkIGFsdGVyZWQgYXBwIGlkLCB1cGRhdGluZyBmcm9tICcke3RoaXMuYXBwSWRLZXl9JyB0byAnJHthcHBJZEtleX0nYCk7XG4gICAgICB0aGlzLmFwcElkS2V5ID0gYXBwSWRLZXk7XG4gICAgfVxuXG4gICAgbG9nQXBwbGljYXRpb25EaWN0aW9uYXJ5KHRoaXMuYXBwRGljdCk7XG5cbiAgICAvLyB0cmFuc2xhdGUgdGhlIGRpY3Rpb25hcnkgaW50byBhIHVzZWZ1bCBmb3JtLCBhbmQgcmV0dXJuIHRvIHNlbmRlclxuICAgIGNvbnN0IHBhZ2VBcnJheSA9IF8uaXNFbXB0eSh0aGlzLmFwcERpY3RbYXBwSWRLZXldLnBhZ2VBcnJheSlcbiAgICAgID8gcGFnZUFycmF5RnJvbURpY3QocGFnZURpY3QpXG4gICAgICA6IHRoaXMuYXBwRGljdFthcHBJZEtleV0ucGFnZUFycmF5O1xuICAgIGxvZy5kZWJ1ZyhgRmluYWxseSBzZWxlY3RpbmcgYXBwICR7dGhpcy5hcHBJZEtleX06ICR7c2ltcGxlU3RyaW5naWZ5KHBhZ2VBcnJheSl9YCk7XG5cbiAgICBsZXQgZnVsbFBhZ2VBcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2FwcCwgaW5mb10gb2YgXy50b1BhaXJzKHRoaXMuYXBwRGljdCkpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KGluZm8ucGFnZUFycmF5KSB8fCAhaW5mby5pc0FjdGl2ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkID0gYXBwLnJlcGxhY2UoJ1BJRDonLCAnJyk7XG4gICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgaW5mby5wYWdlQXJyYXkpIHtcbiAgICAgICAgaWYgKCEoaWdub3JlQWJvdXRCbGFua1VybCAmJiBwYWdlLnVybCA9PT0gQkxBTktfUEFHRV9VUkwpKSB7XG4gICAgICAgICAgbGV0IHBhZ2VEaWN0ID0gXy5jbG9uZShwYWdlKTtcbiAgICAgICAgICBwYWdlRGljdC5pZCA9IGAke2lkfS4ke3BhZ2VEaWN0LmlkfWA7XG4gICAgICAgICAgcGFnZURpY3QuYnVuZGxlSWQgPSBpbmZvLmJ1bmRsZUlkO1xuICAgICAgICAgIGZ1bGxQYWdlQXJyYXkucHVzaChwYWdlRGljdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2cuZGVidWcoYFNlbGVjdGVkIGFwcCBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIHJldHVybiBmdWxsUGFnZUFycmF5O1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMucnBjQ2xpZW50LnNob3VsZENoZWNrRm9yVGFyZ2V0ID0gc2hvdWxkQ2hlY2tGb3JUYXJnZXQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRm9yQXBwIChjdXJyZW50VXJsLCBtYXhUcmllcywgaWdub3JlQWJvdXRCbGFua1VybCkge1xuICBjb25zdCBidW5kbGVJZHMgPSB0aGlzLmluY2x1ZGVTYWZhcmkgJiYgIXRoaXMuaXNTYWZhcmlcbiAgICA/IFt0aGlzLmJ1bmRsZUlkLCAuLi50aGlzLmFkZGl0aW9uYWxCdW5kbGVJZHMsIFNBRkFSSV9CVU5ETEVfSURdXG4gICAgOiBbdGhpcy5idW5kbGVJZCwgLi4udGhpcy5hZGRpdGlvbmFsQnVuZGxlSWRzXTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChtYXhUcmllcywgU0VMRUNUX0FQUF9SRVRSWV9TTEVFUF9NUywgYXN5bmMgKHJldHJ5Q291bnQpID0+IHtcbiAgICAgIGxvZ0FwcGxpY2F0aW9uRGljdGlvbmFyeSh0aGlzLmFwcERpY3QpO1xuICAgICAgY29uc3QgcG9zc2libGVBcHBJZHMgPSBnZXRQb3NzaWJsZURlYnVnZ2VyQXBwS2V5cyhidW5kbGVJZHMsIHRoaXMuYXBwRGljdCk7XG4gICAgICBsb2cuZGVidWcoYFRyeWluZyBvdXQgdGhlIHBvc3NpYmxlIGFwcCBpZHM6ICR7cG9zc2libGVBcHBJZHMuam9pbignLCAnKX0gKHRyeSAjJHtyZXRyeUNvdW50ICsgMX0gb2YgJHttYXhUcmllc30pYCk7XG4gICAgICBmb3IgKGNvbnN0IGF0dGVtcHRlZEFwcElkS2V5IG9mIHBvc3NpYmxlQXBwSWRzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmFwcERpY3RbYXR0ZW1wdGVkQXBwSWRLZXldLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYFNraXBwaW5nIGFwcCAnJHthdHRlbXB0ZWRBcHBJZEtleX0nIGJlY2F1c2UgaXQgaXMgbm90IGFjdGl2ZWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyBhcHAgJyR7YXR0ZW1wdGVkQXBwSWRLZXl9J2ApO1xuICAgICAgICAgIGNvbnN0IFthcHBJZEtleSwgcGFnZURpY3RdID0gYXdhaXQgdGhpcy5ycGNDbGllbnQuc2VsZWN0QXBwKGF0dGVtcHRlZEFwcElkS2V5LCB0aGlzLm9uQXBwQ29ubmVjdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAvLyBpbiBpT1MgOC4yIHRoZSBjb25uZWN0IGxvZ2ljIGhhcHBlbnMsIGJ1dCB3aXRoIGFuIGVtcHR5IGRpY3Rpb25hcnlcbiAgICAgICAgICAvLyB3aGljaCBsZWFkcyB0byB0aGUgcmVtb3RlIGRlYnVnZ2VyIGdldHRpbmcgZGlzY29ubmVjdGVkLCBhbmQgaW50byBhIGxvb3BcbiAgICAgICAgICBpZiAoXy5pc0VtcHR5KHBhZ2VEaWN0KSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKCdFbXB0eSBwYWdlIGRpY3Rpb25hcnkgcmVjZWl2ZWQuIFRyeWluZyBhZ2Fpbi4nKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHNhdmUgdGhlIHBhZ2UgYXJyYXkgZm9yIHRoaXMgYXBwXG4gICAgICAgICAgdGhpcy5hcHBEaWN0W2FwcElkS2V5XS5wYWdlQXJyYXkgPSBwYWdlQXJyYXlGcm9tRGljdChwYWdlRGljdCk7XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgbG9va2luZyBmb3IgYSBwYXJ0aWN1bGFyIHVybCwgbWFrZSBzdXJlIHdlXG4gICAgICAgICAgLy8gaGF2ZSB0aGUgcmlnaHQgcGFnZS4gSWdub3JlIGVtcHR5IG9yIHVuZGVmaW5lZCB1cmxzLlxuICAgICAgICAgIC8vIElnbm9yZSBhYm91dDpibGFuayBpZiByZXF1ZXN0ZWQuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2hGb3JQYWdlKHRoaXMuYXBwRGljdCwgY3VycmVudFVybCwgaWdub3JlQWJvdXRCbGFua1VybCk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY3VycmVudFVybCkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBSZWNlaXZlZCBhcHAsIGJ1dCBleHBlY3RlZCB1cmwgKCcke2N1cnJlbnRVcmx9Jykgd2FzIG5vdCBmb3VuZC4gVHJ5aW5nIGFnYWluLmApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoJ1JlY2VpdmVkIGFwcCwgYnV0IG5vIG1hdGNoIHdhcyBmb3VuZC4gVHJ5aW5nIGFnYWluLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBFcnJvciBjaGVja2luZyBhcHBsaWNhdGlvbjogJyR7ZXJyLm1lc3NhZ2V9Jy4gUmV0cnlpbmcgY29ubmVjdGlvbmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXRyeUNvdW50Kys7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIGFuIGFwcCB0byBzZWxlY3QnKTtcbiAgICB9LCAwKTtcbiAgfSBjYXRjaCAoaWduKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBjb25uZWN0IHRvIGEgdmFsaWQgYXBwIGFmdGVyICR7bWF4VHJpZXN9IHRyaWVzLmApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlYXJjaEZvclBhZ2UgKGFwcHNEaWN0LCBjdXJyZW50VXJsID0gbnVsbCwgaWdub3JlQWJvdXRCbGFua1VybCA9IGZhbHNlKSB7XG4gIGZvciAoY29uc3QgYXBwRGljdCBvZiBfLnZhbHVlcyhhcHBzRGljdCkpIHtcbiAgICBpZiAoIWFwcERpY3QgfHwgIWFwcERpY3QuaXNBY3RpdmUgfHwgIWFwcERpY3QucGFnZUFycmF5IHx8IGFwcERpY3QucGFnZUFycmF5LnByb21pc2UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGljdCBvZiBhcHBEaWN0LnBhZ2VBcnJheSkge1xuICAgICAgaWYgKCghaWdub3JlQWJvdXRCbGFua1VybCB8fCBkaWN0LnVybCAhPT0gQkxBTktfUEFHRV9VUkwpICYmXG4gICAgICAgICAgKCFjdXJyZW50VXJsIHx8IGRpY3QudXJsID09PSBjdXJyZW50VXJsIHx8IGRpY3QudXJsID09PSBgJHtjdXJyZW50VXJsfS9gKSkge1xuICAgICAgICByZXR1cm4geyBhcHBJZEtleTogYXBwRGljdC5pZCwgcGFnZURpY3Q6IGRpY3QgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbGVjdFBhZ2UgKGFwcElkS2V5LCBwYWdlSWRLZXksIHNraXBSZWFkeUNoZWNrID0gZmFsc2UpIHtcbiAgdGhpcy5hcHBJZEtleSA9IGBQSUQ6JHthcHBJZEtleX1gO1xuICB0aGlzLnBhZ2VJZEtleSA9IHBhZ2VJZEtleTtcblxuICBsb2cuZGVidWcoYFNlbGVjdGluZyBwYWdlICcke3BhZ2VJZEtleX0nIG9uIGFwcCAnJHt0aGlzLmFwcElkS2V5fScgYW5kIGZvcndhcmRpbmcgc29ja2V0IHNldHVwYCk7XG5cbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcblxuICBhd2FpdCB0aGlzLnJwY0NsaWVudC5zZWxlY3RQYWdlKHRoaXMuYXBwSWRLZXksIHBhZ2VJZEtleSk7XG5cbiAgLy8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgcmVhZHkgdG8gZ29cbiAgaWYgKCFza2lwUmVhZHlDaGVjayAmJiAhYXdhaXQgdGhpcy5jaGVja1BhZ2VJc1JlYWR5KCkpIHtcbiAgICBhd2FpdCB0aGlzLnBhZ2VVbmxvYWQoKTtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgU2VsZWN0ZWQgcGFnZSBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xufVxuXG5mdW5jdGlvbiBsb2dBcHBsaWNhdGlvbkRpY3Rpb25hcnkgKGFwcHMpIHtcbiAgZnVuY3Rpb24gZ2V0VmFsdWVTdHJpbmcgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuICdbRnVuY3Rpb25dJztcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ3BhZ2VBcnJheScgJiYgIV8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgXCJXYWl0aW5nIGZvciBkYXRhXCJgO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG4gIGxvZy5kZWJ1ZygnQ3VycmVudCBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlOicpO1xuICBmb3IgKGNvbnN0IFthcHAsIGluZm9dIG9mIF8udG9QYWlycyhhcHBzKSkge1xuICAgIGxvZy5kZWJ1ZyhgICAgIEFwcGxpY2F0aW9uOiBcIiR7YXBwfVwiYCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGluZm8pKSB7XG4gICAgICBpZiAoa2V5ID09PSAncGFnZUFycmF5JyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgbG9nLmRlYnVnKGAgICAgICAgICR7a2V5fTpgKTtcbiAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHZhbHVlKSB7XG4gICAgICAgICAgbGV0IHByZWZpeCA9ICctICc7XG4gICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgXy50b1BhaXJzKHBhZ2UpKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYCAgICAgICAgICAke3ByZWZpeH0ke2t9OiAke0pTT04uc3RyaW5naWZ5KHYpfWApO1xuICAgICAgICAgICAgcHJlZml4ID0gJyAgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gZ2V0VmFsdWVTdHJpbmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgICAgICAgICAke2tleX06ICR7dmFsdWVTdHJpbmd9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUFwcHNXaXRoRGljdCAoZGljdCkge1xuICAvLyBnZXQgdGhlIGRpY3Rpb25hcnkgZW50cnkgaW50byBhIG5pY2UgZm9ybSwgYW5kIGFkZCBpdCB0byB0aGVcbiAgLy8gYXBwbGljYXRpb24gZGljdGlvbmFyeVxuICB0aGlzLmFwcERpY3QgPSB0aGlzLmFwcERpY3QgfHwge307XG4gIGxldCBbaWQsIGVudHJ5XSA9IGFwcEluZm9Gcm9tRGljdChkaWN0KTtcbiAgaWYgKHRoaXMuYXBwRGljdFtpZF0pIHtcbiAgICAvLyBwcmVzZXJ2ZSB0aGUgcGFnZSBkaWN0aW9uYXJ5IGZvciB0aGlzIGVudHJ5XG4gICAgZW50cnkucGFnZUFycmF5ID0gdGhpcy5hcHBEaWN0W2lkXS5wYWdlQXJyYXk7XG4gIH1cbiAgdGhpcy5hcHBEaWN0W2lkXSA9IGVudHJ5O1xuXG4gIC8vIGFkZCBhIHByb21pc2UgdG8gZ2V0IHRoZSBwYWdlIGRpY3Rpb25hcnlcbiAgaWYgKF8uaXNVbmRlZmluZWQoZW50cnkucGFnZUFycmF5KSkge1xuICAgIGVudHJ5LnBhZ2VBcnJheSA9IGRlZmVycmVkUHJvbWlzZSgpO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGdldCB0aGUgYXBwIGlkIGZyb20gb3VyIGNvbm5lY3RlZCBhcHBzXG4gIGlmICghdGhpcy5hcHBJZEtleSkge1xuICAgIHRoaXMuYXBwSWRLZXkgPSBnZXREZWJ1Z2dlckFwcEtleSh0aGlzLmJ1bmRsZUlkLCB0aGlzLmFwcERpY3QpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgc2V0Q29ubmVjdGlvbktleSwgY29ubmVjdCwgZGlzY29ubmVjdCwgc2VsZWN0QXBwLCBzZWFyY2hGb3JBcHAsIHNlYXJjaEZvclBhZ2UsIHNlbGVj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
|
|
329
|
+
//# sourceMappingURL=connect.js.map
|