@appium/base-driver 8.7.2 → 9.0.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 (121) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +11 -163
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -1
  3. package/build/lib/basedriver/capabilities.js +354 -236
  4. package/build/lib/basedriver/capabilities.js.map +1 -1
  5. package/build/lib/basedriver/commands/event.d.ts +7 -6
  6. package/build/lib/basedriver/commands/event.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/event.js +55 -35
  8. package/build/lib/basedriver/commands/event.js.map +1 -1
  9. package/build/lib/basedriver/commands/execute.d.ts +7 -6
  10. package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
  11. package/build/lib/basedriver/commands/execute.js +66 -58
  12. package/build/lib/basedriver/commands/execute.js.map +1 -1
  13. package/build/lib/basedriver/commands/find.d.ts +9 -7
  14. package/build/lib/basedriver/commands/find.d.ts.map +1 -1
  15. package/build/lib/basedriver/commands/find.js +102 -54
  16. package/build/lib/basedriver/commands/find.js.map +1 -1
  17. package/build/lib/basedriver/commands/index.d.ts +3 -7
  18. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  19. package/build/lib/basedriver/commands/index.js +30 -33
  20. package/build/lib/basedriver/commands/index.js.map +1 -1
  21. package/build/lib/basedriver/commands/log.d.ts +8 -9
  22. package/build/lib/basedriver/commands/log.d.ts.map +1 -1
  23. package/build/lib/basedriver/commands/log.js +54 -38
  24. package/build/lib/basedriver/commands/log.js.map +1 -1
  25. package/build/lib/basedriver/commands/session.d.ts +7 -6
  26. package/build/lib/basedriver/commands/session.d.ts.map +1 -1
  27. package/build/lib/basedriver/commands/session.js +46 -39
  28. package/build/lib/basedriver/commands/session.js.map +1 -1
  29. package/build/lib/basedriver/commands/settings.d.ts +7 -7
  30. package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
  31. package/build/lib/basedriver/commands/settings.js +35 -28
  32. package/build/lib/basedriver/commands/settings.js.map +1 -1
  33. package/build/lib/basedriver/commands/timeout.d.ts +7 -5
  34. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
  35. package/build/lib/basedriver/commands/timeout.js +144 -162
  36. package/build/lib/basedriver/commands/timeout.js.map +1 -1
  37. package/build/lib/basedriver/core.d.ts +6 -157
  38. package/build/lib/basedriver/core.d.ts.map +1 -1
  39. package/build/lib/basedriver/core.js +361 -230
  40. package/build/lib/basedriver/core.js.map +1 -1
  41. package/build/lib/basedriver/desired-caps.js +80 -110
  42. package/build/lib/basedriver/desired-caps.js.map +1 -1
  43. package/build/lib/basedriver/device-settings.js +57 -62
  44. package/build/lib/basedriver/device-settings.js.map +1 -1
  45. package/build/lib/basedriver/driver.d.ts +21 -267
  46. package/build/lib/basedriver/driver.d.ts.map +1 -1
  47. package/build/lib/basedriver/driver.js +362 -258
  48. package/build/lib/basedriver/driver.js.map +1 -1
  49. package/build/lib/basedriver/helpers.js +500 -495
  50. package/build/lib/basedriver/helpers.js.map +1 -1
  51. package/build/lib/basedriver/logger.d.ts +1 -1
  52. package/build/lib/basedriver/logger.d.ts.map +1 -1
  53. package/build/lib/basedriver/logger.js +5 -15
  54. package/build/lib/basedriver/logger.js.map +1 -1
  55. package/build/lib/constants.js +14 -14
  56. package/build/lib/constants.js.map +1 -1
  57. package/build/lib/express/crash.js +8 -15
  58. package/build/lib/express/crash.js.map +1 -1
  59. package/build/lib/express/express-logging.js +49 -59
  60. package/build/lib/express/express-logging.js.map +1 -1
  61. package/build/lib/express/idempotency.js +125 -177
  62. package/build/lib/express/idempotency.js.map +1 -1
  63. package/build/lib/express/logger.d.ts +1 -1
  64. package/build/lib/express/logger.d.ts.map +1 -1
  65. package/build/lib/express/logger.js +5 -15
  66. package/build/lib/express/logger.js.map +1 -1
  67. package/build/lib/express/middleware.js +82 -107
  68. package/build/lib/express/middleware.js.map +1 -1
  69. package/build/lib/express/server.d.ts +17 -5
  70. package/build/lib/express/server.d.ts.map +1 -1
  71. package/build/lib/express/server.js +259 -224
  72. package/build/lib/express/server.js.map +1 -1
  73. package/build/lib/express/static.js +64 -81
  74. package/build/lib/express/static.js.map +1 -1
  75. package/build/lib/express/websocket.js +115 -87
  76. package/build/lib/express/websocket.js.map +1 -1
  77. package/build/lib/helpers/capabilities.d.ts +1 -59
  78. package/build/lib/helpers/capabilities.d.ts.map +1 -1
  79. package/build/lib/helpers/capabilities.js +72 -69
  80. package/build/lib/helpers/capabilities.js.map +1 -1
  81. package/build/lib/index.js +64 -180
  82. package/build/lib/index.js.map +1 -1
  83. package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
  84. package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
  85. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
  86. package/build/lib/jsonwp-proxy/proxy.js +355 -393
  87. package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
  88. package/build/lib/jsonwp-status/status.js +119 -130
  89. package/build/lib/jsonwp-status/status.js.map +1 -1
  90. package/build/lib/protocol/errors.d.ts +135 -32
  91. package/build/lib/protocol/errors.d.ts.map +1 -1
  92. package/build/lib/protocol/errors.js +871 -919
  93. package/build/lib/protocol/errors.js.map +1 -1
  94. package/build/lib/protocol/helpers.js +37 -37
  95. package/build/lib/protocol/helpers.js.map +1 -1
  96. package/build/lib/protocol/index.js +22 -109
  97. package/build/lib/protocol/index.js.map +1 -1
  98. package/build/lib/protocol/protocol.js +394 -350
  99. package/build/lib/protocol/protocol.js.map +1 -1
  100. package/build/lib/protocol/routes.d.ts +1238 -4
  101. package/build/lib/protocol/routes.d.ts.map +1 -1
  102. package/build/lib/protocol/routes.js +964 -1327
  103. package/build/lib/protocol/routes.js.map +1 -1
  104. package/build/lib/protocol/validators.js +32 -39
  105. package/build/lib/protocol/validators.js.map +1 -1
  106. package/build/tsconfig.tsbuildinfo +1 -1
  107. package/lib/basedriver/capabilities.js +80 -39
  108. package/lib/basedriver/commands/event.js +10 -5
  109. package/lib/basedriver/commands/execute.js +14 -9
  110. package/lib/basedriver/commands/find.js +18 -12
  111. package/lib/basedriver/commands/index.js +21 -16
  112. package/lib/basedriver/commands/log.js +24 -18
  113. package/lib/basedriver/commands/session.js +10 -5
  114. package/lib/basedriver/commands/settings.js +9 -6
  115. package/lib/basedriver/commands/timeout.js +10 -4
  116. package/lib/basedriver/core.js +2 -3
  117. package/lib/basedriver/driver.js +29 -18
  118. package/lib/express/server.js +6 -3
  119. package/lib/protocol/errors.js +155 -44
  120. package/lib/protocol/routes.js +11 -7
  121. package/package.json +14 -16
@@ -1,1018 +1,970 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.XPathLookupError = exports.UnsupportedOperationError = exports.UnknownMethodError = exports.UnknownError = exports.UnknownCommandError = exports.UnexpectedAlertOpenError = exports.UnableToSetCookieError = exports.UnableToCaptureScreen = exports.TimeoutError = exports.StaleElementReferenceError = exports.SessionNotCreatedError = exports.ScriptTimeoutError = exports.ProxyRequestError = exports.ProtocolError = exports.NotYetImplementedError = exports.NotImplementedError = exports.NoSuchWindowError = exports.NoSuchFrameError = exports.NoSuchElementError = exports.NoSuchDriverError = exports.NoSuchCookieError = exports.NoSuchContextError = exports.NoSuchAlertError = exports.NoAlertOpenError = exports.MoveTargetOutOfBoundsError = exports.JavaScriptError = exports.InvalidSelectorError = exports.InvalidElementStateError = exports.InvalidElementCoordinatesError = exports.InvalidCoordinatesError = exports.InvalidCookieDomainError = exports.InvalidContextError = exports.InvalidArgumentError = exports.InsecureCertificateError = exports.IMENotAvailableError = exports.IMEEngineActivationFailedError = exports.ElementNotVisibleError = exports.ElementNotInteractableError = exports.ElementIsNotSelectableError = exports.ElementClickInterceptedError = exports.BadParametersError = void 0;
7
- exports.errorFromMJSONWPStatusCode = errorFromMJSONWPStatusCode;
8
- exports.errorFromW3CJsonCode = errorFromW3CJsonCode;
9
- exports.errors = void 0;
10
- exports.getResponseForJsonwpError = getResponseForJsonwpError;
11
- exports.getResponseForW3CError = getResponseForW3CError;
12
- exports.isErrorType = isErrorType;
13
- exports.isUnknownError = isUnknownError;
14
-
15
- require("source-map-support/register");
16
-
17
- var _es6Error = _interopRequireDefault(require("es6-error"));
18
-
19
- var _lodash = _interopRequireDefault(require("lodash"));
20
-
21
- var _support = require("@appium/support");
22
-
23
- var _httpStatusCodes = require("http-status-codes");
24
-
25
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
-
27
- const mjsonwpLog = _support.logger.getLogger('MJSONWP');
28
-
29
- const w3cLog = _support.logger.getLogger('W3C');
30
-
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
+ exports.getResponseForJsonwpError = exports.getResponseForW3CError = exports.errorFromW3CJsonCode = exports.errorFromMJSONWPStatusCode = exports.isUnknownError = exports.isErrorType = exports.errors = exports.ProxyRequestError = exports.BadParametersError = exports.UnableToCaptureScreen = exports.NotImplementedError = exports.NotYetImplementedError = exports.InvalidContextError = exports.NoSuchContextError = exports.MoveTargetOutOfBoundsError = exports.SessionNotCreatedError = exports.InvalidSelectorError = exports.IMEEngineActivationFailedError = exports.IMENotAvailableError = exports.InvalidCoordinatesError = exports.InvalidElementCoordinatesError = exports.ScriptTimeoutError = exports.NoSuchAlertError = exports.NoAlertOpenError = exports.UnexpectedAlertOpenError = exports.UnableToSetCookieError = exports.NoSuchCookieError = exports.InvalidCookieDomainError = exports.InvalidArgumentError = exports.NoSuchWindowError = exports.TimeoutError = exports.XPathLookupError = exports.JavaScriptError = exports.InsecureCertificateError = exports.ElementNotInteractableError = exports.ElementClickInterceptedError = exports.ElementIsNotSelectableError = exports.UnsupportedOperationError = exports.UnknownMethodError = exports.UnknownError = exports.InvalidElementStateError = exports.ElementNotVisibleError = exports.StaleElementReferenceError = exports.UnknownCommandError = exports.NoSuchFrameError = exports.NoSuchElementError = exports.NoSuchDriverError = exports.ProtocolError = void 0;
7
+ const es6_error_1 = __importDefault(require("es6-error"));
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const support_1 = require("@appium/support");
10
+ const http_status_codes_1 = require("http-status-codes");
11
+ const mjsonwpLog = support_1.logger.getLogger('MJSONWP');
12
+ const w3cLog = support_1.logger.getLogger('W3C');
31
13
  const W3C_UNKNOWN_ERROR = 'unknown error';
32
-
33
- class ProtocolError extends _es6Error.default {
34
- constructor(msg, jsonwpCode, w3cStatus, error) {
35
- super(msg);
36
- this.jsonwpCode = jsonwpCode;
37
- this.error = error || W3C_UNKNOWN_ERROR;
38
-
39
- if (this.jsonwpCode === null) {
40
- this.jsonwpCode = 13;
41
- }
42
-
43
- this.w3cStatus = w3cStatus || _httpStatusCodes.StatusCodes.BAD_REQUEST;
44
- this._stacktrace = null;
45
- }
46
-
47
- get stacktrace() {
48
- return this._stacktrace || this.stack;
49
- }
50
-
51
- set stacktrace(value) {
52
- this._stacktrace = value;
53
- }
54
-
55
- }
56
-
14
+ // base error class for all of our errors
15
+ class ProtocolError extends es6_error_1.default {
16
+ constructor(msg, jsonwpCode, w3cStatus, error) {
17
+ super(msg);
18
+ this.jsonwpCode = jsonwpCode;
19
+ this.error = error || W3C_UNKNOWN_ERROR;
20
+ if (this.jsonwpCode === null) {
21
+ this.jsonwpCode = 13;
22
+ }
23
+ this.w3cStatus = w3cStatus || http_status_codes_1.StatusCodes.BAD_REQUEST;
24
+ this._stacktrace = null;
25
+ }
26
+ get stacktrace() {
27
+ return this._stacktrace || this.stack;
28
+ }
29
+ set stacktrace(value) {
30
+ this._stacktrace = value;
31
+ }
32
+ }
57
33
  exports.ProtocolError = ProtocolError;
58
-
34
+ // https://github.com/SeleniumHQ/selenium/blob/176b4a9e3082ac1926f2a436eb346760c37a5998/java/client/src/org/openqa/selenium/remote/ErrorCodes.java#L215
35
+ // https://github.com/SeleniumHQ/selenium/issues/5562#issuecomment-370379470
36
+ // https://w3c.github.io/webdriver/webdriver-spec.html#dfn-error-code
59
37
  class NoSuchDriverError extends ProtocolError {
60
- static code() {
61
- return 6;
62
- }
63
-
64
- static w3cStatus() {
65
- return _httpStatusCodes.StatusCodes.NOT_FOUND;
66
- }
67
-
68
- static error() {
69
- return 'invalid session id';
70
- }
71
-
72
- constructor(err) {
73
- super(err || 'A session is either terminated or not started', NoSuchDriverError.code(), NoSuchDriverError.w3cStatus(), NoSuchDriverError.error());
74
- }
75
-
76
- }
77
-
38
+ static code() {
39
+ return 6;
40
+ }
41
+ // W3C Error is called InvalidSessionID
42
+ static w3cStatus() {
43
+ return http_status_codes_1.StatusCodes.NOT_FOUND;
44
+ }
45
+ static error() {
46
+ return 'invalid session id';
47
+ }
48
+ /**
49
+ * @param {string} [message] error message
50
+ */
51
+ constructor(message) {
52
+ super(message || 'A session is either terminated or not started', NoSuchDriverError.code(), NoSuchDriverError.w3cStatus(), NoSuchDriverError.error());
53
+ }
54
+ }
78
55
  exports.NoSuchDriverError = NoSuchDriverError;
79
-
80
56
  class NoSuchElementError extends ProtocolError {
81
- static code() {
82
- return 7;
83
- }
84
-
85
- static w3cStatus() {
86
- return _httpStatusCodes.StatusCodes.NOT_FOUND;
87
- }
88
-
89
- static error() {
90
- return 'no such element';
91
- }
92
-
93
- constructor(err) {
94
- super(err || 'An element could not be located on the page using the given ' + 'search parameters.', NoSuchElementError.code(), NoSuchElementError.w3cStatus(), NoSuchElementError.error());
95
- }
96
-
97
- }
98
-
57
+ static code() {
58
+ return 7;
59
+ }
60
+ static w3cStatus() {
61
+ return http_status_codes_1.StatusCodes.NOT_FOUND;
62
+ }
63
+ static error() {
64
+ return 'no such element';
65
+ }
66
+ /**
67
+ * @param {string} [message] error message
68
+ */
69
+ constructor(message) {
70
+ super(message ||
71
+ 'An element could not be located on the page using the given ' + 'search parameters.', NoSuchElementError.code(), NoSuchElementError.w3cStatus(), NoSuchElementError.error());
72
+ }
73
+ }
99
74
  exports.NoSuchElementError = NoSuchElementError;
100
-
101
75
  class NoSuchFrameError extends ProtocolError {
102
- static code() {
103
- return 8;
104
- }
105
-
106
- static error() {
107
- return 'no such frame';
108
- }
109
-
110
- static w3cStatus() {
111
- return _httpStatusCodes.StatusCodes.NOT_FOUND;
112
- }
113
-
114
- constructor(err) {
115
- super(err || 'A request to switch to a frame could not be satisfied because ' + 'the frame could not be found.', NoSuchFrameError.code(), NoSuchFrameError.w3cStatus(), NoSuchFrameError.error());
116
- }
117
-
118
- }
119
-
76
+ static code() {
77
+ return 8;
78
+ }
79
+ static error() {
80
+ return 'no such frame';
81
+ }
82
+ static w3cStatus() {
83
+ return http_status_codes_1.StatusCodes.NOT_FOUND;
84
+ }
85
+ /**
86
+ *
87
+ * @param {string} [message]
88
+ */
89
+ constructor(message) {
90
+ super(message ||
91
+ 'A request to switch to a frame could not be satisfied because ' +
92
+ 'the frame could not be found.', NoSuchFrameError.code(), NoSuchFrameError.w3cStatus(), NoSuchFrameError.error());
93
+ }
94
+ }
120
95
  exports.NoSuchFrameError = NoSuchFrameError;
121
-
122
96
  class UnknownCommandError extends ProtocolError {
123
- static code() {
124
- return 9;
125
- }
126
-
127
- static w3cStatus() {
128
- return _httpStatusCodes.StatusCodes.NOT_FOUND;
129
- }
130
-
131
- static error() {
132
- return 'unknown command';
133
- }
134
-
135
- constructor(err) {
136
- super(err || 'The requested resource could not be found, or a request was ' + 'received using an HTTP method that is not supported by the mapped ' + 'resource.', UnknownCommandError.code(), UnknownCommandError.w3cStatus(), UnknownCommandError.error());
137
- }
138
-
139
- }
140
-
97
+ static code() {
98
+ return 9;
99
+ }
100
+ static w3cStatus() {
101
+ return http_status_codes_1.StatusCodes.NOT_FOUND;
102
+ }
103
+ static error() {
104
+ return 'unknown command';
105
+ }
106
+ /**
107
+ *
108
+ * @param {string} [message]
109
+ */
110
+ constructor(message) {
111
+ super(message ||
112
+ 'The requested resource could not be found, or a request was ' +
113
+ 'received using an HTTP method that is not supported by the mapped ' +
114
+ 'resource.', UnknownCommandError.code(), UnknownCommandError.w3cStatus(), UnknownCommandError.error());
115
+ }
116
+ }
141
117
  exports.UnknownCommandError = UnknownCommandError;
142
-
143
118
  class StaleElementReferenceError extends ProtocolError {
144
- static code() {
145
- return 10;
146
- }
147
-
148
- static w3cStatus() {
149
- return _httpStatusCodes.StatusCodes.NOT_FOUND;
150
- }
151
-
152
- static error() {
153
- return 'stale element reference';
154
- }
155
-
156
- constructor(err) {
157
- super(err || 'An element command failed because the referenced element is no ' + 'longer attached to the DOM.', StaleElementReferenceError.code(), StaleElementReferenceError.w3cStatus(), StaleElementReferenceError.error());
158
- }
159
-
160
- }
161
-
119
+ static code() {
120
+ return 10;
121
+ }
122
+ static w3cStatus() {
123
+ return http_status_codes_1.StatusCodes.NOT_FOUND;
124
+ }
125
+ static error() {
126
+ return 'stale element reference';
127
+ }
128
+ /**
129
+ *
130
+ * @param {string} [message]
131
+ */
132
+ constructor(message) {
133
+ super(message ||
134
+ 'An element command failed because the referenced element is no ' +
135
+ 'longer attached to the DOM.', StaleElementReferenceError.code(), StaleElementReferenceError.w3cStatus(), StaleElementReferenceError.error());
136
+ }
137
+ }
162
138
  exports.StaleElementReferenceError = StaleElementReferenceError;
163
-
164
139
  class ElementNotVisibleError extends ProtocolError {
165
- static code() {
166
- return 11;
167
- }
168
-
169
- static w3cStatus() {
170
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
171
- }
172
-
173
- static error() {
174
- return 'element not visible';
175
- }
176
-
177
- constructor(err) {
178
- super(err || 'An element command could not be completed because the element is ' + 'not visible on the page.', ElementNotVisibleError.code(), ElementNotVisibleError.w3cStatus(), ElementNotVisibleError.error());
179
- }
180
-
181
- }
182
-
140
+ static code() {
141
+ return 11;
142
+ }
143
+ static w3cStatus() {
144
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
145
+ }
146
+ static error() {
147
+ return 'element not visible';
148
+ }
149
+ /**
150
+ * @param {string} [message] error message
151
+ */
152
+ constructor(message) {
153
+ super(message ||
154
+ 'An element command could not be completed because the element is ' +
155
+ 'not visible on the page.', ElementNotVisibleError.code(), ElementNotVisibleError.w3cStatus(), ElementNotVisibleError.error());
156
+ }
157
+ }
183
158
  exports.ElementNotVisibleError = ElementNotVisibleError;
184
-
185
159
  class InvalidElementStateError extends ProtocolError {
186
- static code() {
187
- return 12;
188
- }
189
-
190
- static w3cStatus() {
191
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
192
- }
193
-
194
- static error() {
195
- return 'invalid element state';
196
- }
197
-
198
- constructor(err) {
199
- super(err || 'An element command could not be completed because the element is ' + 'in an invalid state (e.g. attempting to click a disabled element).', InvalidElementStateError.code(), InvalidElementStateError.w3cStatus(), InvalidElementStateError.error());
200
- }
201
-
202
- }
203
-
160
+ static code() {
161
+ return 12;
162
+ }
163
+ static w3cStatus() {
164
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
165
+ }
166
+ static error() {
167
+ return 'invalid element state';
168
+ }
169
+ /**
170
+ *
171
+ * @param {string} [message]
172
+ */
173
+ constructor(message) {
174
+ super(message ||
175
+ 'An element command could not be completed because the element is ' +
176
+ 'in an invalid state (e.g. attempting to click a disabled element).', InvalidElementStateError.code(), InvalidElementStateError.w3cStatus(), InvalidElementStateError.error());
177
+ }
178
+ }
204
179
  exports.InvalidElementStateError = InvalidElementStateError;
205
-
206
180
  class UnknownError extends ProtocolError {
207
- static code() {
208
- return 13;
209
- }
210
-
211
- static w3cStatus() {
212
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
213
- }
214
-
215
- static error() {
216
- return W3C_UNKNOWN_ERROR;
217
- }
218
-
219
- constructor(errorOrMessage) {
220
- const origMessage = _lodash.default.isString((errorOrMessage || {}).message) ? errorOrMessage.message : errorOrMessage;
221
- const message = 'An unknown server-side error occurred while processing the command.' + (origMessage ? ` Original error: ${origMessage}` : '');
222
- super(message, UnknownError.code(), UnknownError.w3cStatus(), UnknownError.error());
223
- }
224
-
225
- }
226
-
181
+ static code() {
182
+ return 13;
183
+ }
184
+ static w3cStatus() {
185
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
186
+ }
187
+ static error() {
188
+ return W3C_UNKNOWN_ERROR;
189
+ }
190
+ constructor(errorOrMessage) {
191
+ const origMessage = lodash_1.default.isString((errorOrMessage || {}).message)
192
+ ? errorOrMessage.message
193
+ : errorOrMessage;
194
+ const message = 'An unknown server-side error occurred while processing the command.' +
195
+ (origMessage ? ` Original error: ${origMessage}` : '');
196
+ super(message, UnknownError.code(), UnknownError.w3cStatus(), UnknownError.error());
197
+ }
198
+ }
227
199
  exports.UnknownError = UnknownError;
228
-
229
200
  class UnknownMethodError extends ProtocolError {
230
- static code() {
231
- return 405;
232
- }
233
-
234
- static w3cStatus() {
235
- return _httpStatusCodes.StatusCodes.METHOD_NOT_ALLOWED;
236
- }
237
-
238
- static error() {
239
- return 'unknown method';
240
- }
241
-
242
- constructor(err) {
243
- super(err || 'The requested command matched a known URL but did not match an method for that URL', UnknownMethodError.code(), UnknownMethodError.w3cStatus(), UnknownMethodError.error());
244
- }
245
-
246
- }
247
-
201
+ static code() {
202
+ return 405;
203
+ }
204
+ static w3cStatus() {
205
+ return http_status_codes_1.StatusCodes.METHOD_NOT_ALLOWED;
206
+ }
207
+ static error() {
208
+ return 'unknown method';
209
+ }
210
+ /**
211
+ * @param {string} [message] error message
212
+ */
213
+ constructor(message) {
214
+ super(message ||
215
+ 'The requested command matched a known URL but did not match an method for that URL', UnknownMethodError.code(), UnknownMethodError.w3cStatus(), UnknownMethodError.error());
216
+ }
217
+ }
248
218
  exports.UnknownMethodError = UnknownMethodError;
249
-
250
219
  class UnsupportedOperationError extends ProtocolError {
251
- static code() {
252
- return 405;
253
- }
254
-
255
- static w3cStatus() {
256
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
257
- }
258
-
259
- static error() {
260
- return 'unsupported operation';
261
- }
262
-
263
- constructor(err) {
264
- super(err || 'A server-side error occurred. Command cannot be supported.', UnsupportedOperationError.code(), UnsupportedOperationError.w3cStatus(), UnsupportedOperationError.error());
265
- }
266
-
267
- }
268
-
220
+ static code() {
221
+ return 405;
222
+ }
223
+ static w3cStatus() {
224
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
225
+ }
226
+ static error() {
227
+ return 'unsupported operation';
228
+ }
229
+ /**
230
+ * @param {string} [message] error message
231
+ */
232
+ constructor(message) {
233
+ super(message || 'A server-side error occurred. Command cannot be supported.', UnsupportedOperationError.code(), UnsupportedOperationError.w3cStatus(), UnsupportedOperationError.error());
234
+ }
235
+ }
269
236
  exports.UnsupportedOperationError = UnsupportedOperationError;
270
-
271
237
  class ElementIsNotSelectableError extends ProtocolError {
272
- static code() {
273
- return 15;
274
- }
275
-
276
- static error() {
277
- return 'element not selectable';
278
- }
279
-
280
- static w3cStatus() {
281
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
282
- }
283
-
284
- constructor(err) {
285
- super(err || 'An attempt was made to select an element that cannot be selected.', ElementIsNotSelectableError.code(), ElementIsNotSelectableError.w3cStatus(), ElementIsNotSelectableError.error());
286
- }
287
-
288
- }
289
-
238
+ static code() {
239
+ return 15;
240
+ }
241
+ static error() {
242
+ return 'element not selectable';
243
+ }
244
+ static w3cStatus() {
245
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
246
+ }
247
+ /**
248
+ * @param {string} [message] error message
249
+ */
250
+ constructor(message) {
251
+ super(message || 'An attempt was made to select an element that cannot be selected.', ElementIsNotSelectableError.code(), ElementIsNotSelectableError.w3cStatus(), ElementIsNotSelectableError.error());
252
+ }
253
+ }
290
254
  exports.ElementIsNotSelectableError = ElementIsNotSelectableError;
291
-
292
255
  class ElementClickInterceptedError extends ProtocolError {
293
- static code() {
294
- return 64;
295
- }
296
-
297
- static error() {
298
- return 'element click intercepted';
299
- }
300
-
301
- static w3cStatus() {
302
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
303
- }
304
-
305
- constructor(err) {
306
- super(err || 'The Element Click command could not be completed because the element receiving ' + 'the events is obscuring the element that was requested clicked', ElementClickInterceptedError.code(), ElementClickInterceptedError.w3cStatus(), ElementClickInterceptedError.error());
307
- }
308
-
309
- }
310
-
256
+ static code() {
257
+ return 64;
258
+ }
259
+ static error() {
260
+ return 'element click intercepted';
261
+ }
262
+ static w3cStatus() {
263
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
264
+ }
265
+ /**
266
+ * @param {string} [message] error message
267
+ */
268
+ constructor(message) {
269
+ super(message ||
270
+ 'The Element Click command could not be completed because the element receiving ' +
271
+ 'the events is obscuring the element that was requested clicked', ElementClickInterceptedError.code(), ElementClickInterceptedError.w3cStatus(), ElementClickInterceptedError.error());
272
+ }
273
+ }
311
274
  exports.ElementClickInterceptedError = ElementClickInterceptedError;
312
-
313
275
  class ElementNotInteractableError extends ProtocolError {
314
- static code() {
315
- return 60;
316
- }
317
-
318
- static error() {
319
- return 'element not interactable';
320
- }
321
-
322
- static w3cStatus() {
323
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
324
- }
325
-
326
- constructor(err) {
327
- super(err || 'A command could not be completed because the element is not pointer- or keyboard interactable', ElementNotInteractableError.code(), ElementNotInteractableError.w3cStatus(), ElementNotInteractableError.error());
328
- }
329
-
330
- }
331
-
276
+ static code() {
277
+ return 60;
278
+ }
279
+ static error() {
280
+ return 'element not interactable';
281
+ }
282
+ static w3cStatus() {
283
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
284
+ }
285
+ /**
286
+ * @param {string} [message] error message
287
+ */
288
+ constructor(message) {
289
+ super(message ||
290
+ 'A command could not be completed because the element is not pointer- or keyboard interactable', ElementNotInteractableError.code(), ElementNotInteractableError.w3cStatus(), ElementNotInteractableError.error());
291
+ }
292
+ }
332
293
  exports.ElementNotInteractableError = ElementNotInteractableError;
333
-
334
294
  class InsecureCertificateError extends ProtocolError {
335
- static error() {
336
- return 'insecure certificate';
337
- }
338
-
339
- constructor(err) {
340
- super(err || 'Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate', ElementIsNotSelectableError.code(), null, InsecureCertificateError.error());
341
- }
342
-
343
- }
344
-
295
+ static error() {
296
+ return 'insecure certificate';
297
+ }
298
+ /**
299
+ * @param {string} [message] error message
300
+ */
301
+ constructor(message) {
302
+ super(message ||
303
+ 'Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate', ElementIsNotSelectableError.code(), null, InsecureCertificateError.error());
304
+ }
305
+ }
345
306
  exports.InsecureCertificateError = InsecureCertificateError;
346
-
347
307
  class JavaScriptError extends ProtocolError {
348
- static code() {
349
- return 17;
350
- }
351
-
352
- static w3cStatus() {
353
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
354
- }
355
-
356
- static error() {
357
- return 'javascript error';
358
- }
359
-
360
- constructor(err) {
361
- super(err || 'An error occurred while executing user supplied JavaScript.', JavaScriptError.code(), JavaScriptError.w3cStatus(), JavaScriptError.error());
362
- }
363
-
364
- }
365
-
308
+ static code() {
309
+ return 17;
310
+ }
311
+ static w3cStatus() {
312
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
313
+ }
314
+ static error() {
315
+ return 'javascript error';
316
+ }
317
+ /**
318
+ * @param {string} [message] error message
319
+ */
320
+ constructor(message) {
321
+ super(message || 'An error occurred while executing user supplied JavaScript.', JavaScriptError.code(), JavaScriptError.w3cStatus(), JavaScriptError.error());
322
+ }
323
+ }
366
324
  exports.JavaScriptError = JavaScriptError;
367
-
368
325
  class XPathLookupError extends ProtocolError {
369
- static code() {
370
- return 19;
371
- }
372
-
373
- static w3cStatus() {
374
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
375
- }
376
-
377
- static error() {
378
- return 'invalid selector';
379
- }
380
-
381
- constructor(err) {
382
- super(err || 'An error occurred while searching for an element by XPath.', XPathLookupError.code(), XPathLookupError.w3cStatus(), XPathLookupError.error());
383
- }
384
-
385
- }
386
-
326
+ static code() {
327
+ return 19;
328
+ }
329
+ static w3cStatus() {
330
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
331
+ }
332
+ static error() {
333
+ return 'invalid selector';
334
+ }
335
+ /**
336
+ * @param {string} [message] error message
337
+ */
338
+ constructor(message) {
339
+ super(message || 'An error occurred while searching for an element by XPath.', XPathLookupError.code(), XPathLookupError.w3cStatus(), XPathLookupError.error());
340
+ }
341
+ }
387
342
  exports.XPathLookupError = XPathLookupError;
388
-
389
343
  class TimeoutError extends ProtocolError {
390
- static code() {
391
- return 21;
392
- }
393
-
394
- static w3cStatus() {
395
- return _httpStatusCodes.StatusCodes.REQUEST_TIMEOUT;
396
- }
397
-
398
- static error() {
399
- return 'timeout';
400
- }
401
-
402
- constructor(err) {
403
- super(err || 'An operation did not complete before its timeout expired.', TimeoutError.code(), TimeoutError.w3cStatus(), TimeoutError.error());
404
- }
405
-
406
- }
407
-
344
+ static code() {
345
+ return 21;
346
+ }
347
+ static w3cStatus() {
348
+ return http_status_codes_1.StatusCodes.REQUEST_TIMEOUT;
349
+ }
350
+ static error() {
351
+ return 'timeout';
352
+ }
353
+ /**
354
+ * @param {string} [message] error message
355
+ */
356
+ constructor(message) {
357
+ super(message || 'An operation did not complete before its timeout expired.', TimeoutError.code(), TimeoutError.w3cStatus(), TimeoutError.error());
358
+ }
359
+ }
408
360
  exports.TimeoutError = TimeoutError;
409
-
410
361
  class NoSuchWindowError extends ProtocolError {
411
- static code() {
412
- return 23;
413
- }
414
-
415
- static error() {
416
- return 'no such window';
417
- }
418
-
419
- static w3cStatus() {
420
- return _httpStatusCodes.StatusCodes.NOT_FOUND;
421
- }
422
-
423
- constructor(err) {
424
- super(err || 'A request to switch to a different window could not be satisfied ' + 'because the window could not be found.', NoSuchWindowError.code(), NoSuchWindowError.w3cStatus(), NoSuchWindowError.error());
425
- }
426
-
427
- }
428
-
362
+ static code() {
363
+ return 23;
364
+ }
365
+ static error() {
366
+ return 'no such window';
367
+ }
368
+ static w3cStatus() {
369
+ return http_status_codes_1.StatusCodes.NOT_FOUND;
370
+ }
371
+ /**
372
+ * @param {string} [message] error message
373
+ */
374
+ constructor(message) {
375
+ super(message ||
376
+ 'A request to switch to a different window could not be satisfied ' +
377
+ 'because the window could not be found.', NoSuchWindowError.code(), NoSuchWindowError.w3cStatus(), NoSuchWindowError.error());
378
+ }
379
+ }
429
380
  exports.NoSuchWindowError = NoSuchWindowError;
430
-
431
381
  class InvalidArgumentError extends ProtocolError {
432
- static code() {
433
- return 61;
434
- }
435
-
436
- static error() {
437
- return 'invalid argument';
438
- }
439
-
440
- static w3cStatus() {
441
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
442
- }
443
-
444
- constructor(err) {
445
- super(err || 'The arguments passed to the command are either invalid or malformed', InvalidArgumentError.code(), InvalidArgumentError.w3cStatus(), InvalidArgumentError.error());
446
- }
447
-
448
- }
449
-
382
+ static code() {
383
+ return 61;
384
+ }
385
+ static error() {
386
+ return 'invalid argument';
387
+ }
388
+ static w3cStatus() {
389
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
390
+ }
391
+ /**
392
+ * @param {string} [err] error message
393
+ */
394
+ constructor(err) {
395
+ super(err || 'The arguments passed to the command are either invalid or malformed', InvalidArgumentError.code(), InvalidArgumentError.w3cStatus(), InvalidArgumentError.error());
396
+ }
397
+ }
450
398
  exports.InvalidArgumentError = InvalidArgumentError;
451
-
452
399
  class InvalidCookieDomainError extends ProtocolError {
453
- static code() {
454
- return 24;
455
- }
456
-
457
- static error() {
458
- return 'invalid cookie domain';
459
- }
460
-
461
- static w3cStatus() {
462
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
463
- }
464
-
465
- constructor(err) {
466
- super(err || 'An illegal attempt was made to set a cookie under a different ' + 'domain than the current page.', InvalidCookieDomainError.code(), InvalidCookieDomainError.w3cStatus(), InvalidCookieDomainError.error());
467
- }
468
-
469
- }
470
-
400
+ static code() {
401
+ return 24;
402
+ }
403
+ static error() {
404
+ return 'invalid cookie domain';
405
+ }
406
+ static w3cStatus() {
407
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
408
+ }
409
+ /**
410
+ * @param {string} [err] error message
411
+ */
412
+ constructor(err) {
413
+ super(err ||
414
+ 'An illegal attempt was made to set a cookie under a different ' +
415
+ 'domain than the current page.', InvalidCookieDomainError.code(), InvalidCookieDomainError.w3cStatus(), InvalidCookieDomainError.error());
416
+ }
417
+ }
471
418
  exports.InvalidCookieDomainError = InvalidCookieDomainError;
472
-
473
419
  class NoSuchCookieError extends ProtocolError {
474
- static code() {
475
- return 62;
476
- }
477
-
478
- static w3cStatus() {
479
- return _httpStatusCodes.StatusCodes.NOT_FOUND;
480
- }
481
-
482
- static error() {
483
- return 'no such cookie';
484
- }
485
-
486
- constructor(err) {
487
- super(err || 'No cookie matching the given path name was found amongst the associated cookies of the current browsing context’s active document', NoSuchCookieError.code(), NoSuchCookieError.w3cStatus(), NoSuchCookieError.error());
488
- }
489
-
490
- }
491
-
420
+ static code() {
421
+ return 62;
422
+ }
423
+ static w3cStatus() {
424
+ return http_status_codes_1.StatusCodes.NOT_FOUND;
425
+ }
426
+ static error() {
427
+ return 'no such cookie';
428
+ }
429
+ /**
430
+ * @param {string} [err] error message
431
+ */
432
+ constructor(err) {
433
+ super(err ||
434
+ 'No cookie matching the given path name was found amongst the associated cookies of the current browsing context’s active document', NoSuchCookieError.code(), NoSuchCookieError.w3cStatus(), NoSuchCookieError.error());
435
+ }
436
+ }
492
437
  exports.NoSuchCookieError = NoSuchCookieError;
493
-
494
438
  class UnableToSetCookieError extends ProtocolError {
495
- static code() {
496
- return 25;
497
- }
498
-
499
- static w3cStatus() {
500
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
501
- }
502
-
503
- static error() {
504
- return 'unable to set cookie';
505
- }
506
-
507
- constructor(err) {
508
- super(err || "A request to set a cookie's value could not be satisfied.", UnableToSetCookieError.code(), UnableToSetCookieError.w3cStatus(), UnableToSetCookieError.error());
509
- }
510
-
511
- }
512
-
439
+ static code() {
440
+ return 25;
441
+ }
442
+ static w3cStatus() {
443
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
444
+ }
445
+ static error() {
446
+ return 'unable to set cookie';
447
+ }
448
+ /**
449
+ * @param {string} [err] error message
450
+ */
451
+ constructor(err) {
452
+ super(err || "A request to set a cookie's value could not be satisfied.", UnableToSetCookieError.code(), UnableToSetCookieError.w3cStatus(), UnableToSetCookieError.error());
453
+ }
454
+ }
513
455
  exports.UnableToSetCookieError = UnableToSetCookieError;
514
-
515
456
  class UnexpectedAlertOpenError extends ProtocolError {
516
- static code() {
517
- return 26;
518
- }
519
-
520
- static w3cStatus() {
521
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
522
- }
523
-
524
- static error() {
525
- return 'unexpected alert open';
526
- }
527
-
528
- constructor(err) {
529
- super(err || 'A modal dialog was open, blocking this operation', UnexpectedAlertOpenError.code(), UnexpectedAlertOpenError.w3cStatus(), UnexpectedAlertOpenError.error());
530
- }
531
-
532
- }
533
-
457
+ static code() {
458
+ return 26;
459
+ }
460
+ static w3cStatus() {
461
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
462
+ }
463
+ static error() {
464
+ return 'unexpected alert open';
465
+ }
466
+ /**
467
+ * @param {string} [message] error message
468
+ */
469
+ constructor(message) {
470
+ super(message || 'A modal dialog was open, blocking this operation', UnexpectedAlertOpenError.code(), UnexpectedAlertOpenError.w3cStatus(), UnexpectedAlertOpenError.error());
471
+ }
472
+ }
534
473
  exports.UnexpectedAlertOpenError = UnexpectedAlertOpenError;
535
-
536
474
  class NoAlertOpenError extends ProtocolError {
537
- static code() {
538
- return 27;
539
- }
540
-
541
- static w3cStatus() {
542
- return _httpStatusCodes.StatusCodes.NOT_FOUND;
543
- }
544
-
545
- static error() {
546
- return 'no such alert';
547
- }
548
-
549
- constructor(err) {
550
- super(err || 'An attempt was made to operate on a modal dialog when one ' + 'was not open.', NoAlertOpenError.code(), NoAlertOpenError.w3cStatus(), NoAlertOpenError.error());
551
- }
552
-
553
- }
554
-
475
+ static code() {
476
+ return 27;
477
+ }
478
+ static w3cStatus() {
479
+ return http_status_codes_1.StatusCodes.NOT_FOUND;
480
+ }
481
+ static error() {
482
+ return 'no such alert';
483
+ }
484
+ /**
485
+ *
486
+ * @param {string} [message]
487
+ */
488
+ constructor(message) {
489
+ super(message || 'An attempt was made to operate on a modal dialog when one ' + 'was not open.', NoAlertOpenError.code(), NoAlertOpenError.w3cStatus(), NoAlertOpenError.error());
490
+ }
491
+ }
555
492
  exports.NoAlertOpenError = NoAlertOpenError;
556
-
557
- class NoSuchAlertError extends NoAlertOpenError {}
558
-
493
+ class NoSuchAlertError extends NoAlertOpenError {
494
+ }
559
495
  exports.NoSuchAlertError = NoSuchAlertError;
560
-
561
496
  class ScriptTimeoutError extends ProtocolError {
562
- static code() {
563
- return 28;
564
- }
565
-
566
- static w3cStatus() {
567
- return _httpStatusCodes.StatusCodes.REQUEST_TIMEOUT;
568
- }
569
-
570
- static error() {
571
- return 'script timeout';
572
- }
573
-
574
- constructor(err) {
575
- super(err || 'A script did not complete before its timeout expired.', ScriptTimeoutError.code(), ScriptTimeoutError.w3cStatus(), ScriptTimeoutError.error());
576
- }
577
-
578
- }
579
-
497
+ static code() {
498
+ return 28;
499
+ }
500
+ static w3cStatus() {
501
+ return http_status_codes_1.StatusCodes.REQUEST_TIMEOUT;
502
+ }
503
+ static error() {
504
+ return 'script timeout';
505
+ }
506
+ /**
507
+ * @param {string} [err] error message
508
+ */
509
+ constructor(err) {
510
+ super(err || 'A script did not complete before its timeout expired.', ScriptTimeoutError.code(), ScriptTimeoutError.w3cStatus(), ScriptTimeoutError.error());
511
+ }
512
+ }
580
513
  exports.ScriptTimeoutError = ScriptTimeoutError;
581
-
582
514
  class InvalidElementCoordinatesError extends ProtocolError {
583
- static code() {
584
- return 29;
585
- }
586
-
587
- static w3cStatus() {
588
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
589
- }
590
-
591
- static error() {
592
- return 'invalid coordinates';
593
- }
594
-
595
- constructor(err) {
596
- super(err || 'The coordinates provided to an interactions operation are invalid.', InvalidElementCoordinatesError.code(), InvalidElementCoordinatesError.w3cStatus(), InvalidElementCoordinatesError.error());
597
- }
598
-
599
- }
600
-
515
+ static code() {
516
+ return 29;
517
+ }
518
+ static w3cStatus() {
519
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
520
+ }
521
+ static error() {
522
+ return 'invalid coordinates';
523
+ }
524
+ /**
525
+ * @param {string} [err] error message
526
+ */
527
+ constructor(err) {
528
+ super(err || 'The coordinates provided to an interactions operation are invalid.', InvalidElementCoordinatesError.code(), InvalidElementCoordinatesError.w3cStatus(), InvalidElementCoordinatesError.error());
529
+ }
530
+ }
601
531
  exports.InvalidElementCoordinatesError = InvalidElementCoordinatesError;
602
-
603
- class InvalidCoordinatesError extends InvalidElementCoordinatesError {}
604
-
532
+ class InvalidCoordinatesError extends InvalidElementCoordinatesError {
533
+ }
605
534
  exports.InvalidCoordinatesError = InvalidCoordinatesError;
606
-
607
535
  class IMENotAvailableError extends ProtocolError {
608
- static code() {
609
- return 30;
610
- }
611
-
612
- static w3cStatus() {
613
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
614
- }
615
-
616
- static error() {
617
- return 'unsupported operation';
618
- }
619
-
620
- constructor(err) {
621
- super(err || 'IME was not available.', IMENotAvailableError.code(), IMENotAvailableError.w3cStatus(), IMENotAvailableError.error());
622
- }
623
-
624
- }
625
-
536
+ static code() {
537
+ return 30;
538
+ }
539
+ static w3cStatus() {
540
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
541
+ }
542
+ static error() {
543
+ return 'unsupported operation';
544
+ }
545
+ /**
546
+ * @param {string} [message] error message
547
+ */
548
+ constructor(message) {
549
+ super(message || 'IME was not available.', IMENotAvailableError.code(), IMENotAvailableError.w3cStatus(), IMENotAvailableError.error());
550
+ }
551
+ }
626
552
  exports.IMENotAvailableError = IMENotAvailableError;
627
-
628
553
  class IMEEngineActivationFailedError extends ProtocolError {
629
- static code() {
630
- return 31;
631
- }
632
-
633
- static w3cStatus() {
634
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
635
- }
636
-
637
- static error() {
638
- return 'unsupported operation';
639
- }
640
-
641
- constructor(err) {
642
- super(err || 'An IME engine could not be started.', IMEEngineActivationFailedError.code(), IMEEngineActivationFailedError.w3cStatus(), IMEEngineActivationFailedError.error());
643
- }
644
-
645
- }
646
-
554
+ static code() {
555
+ return 31;
556
+ }
557
+ static w3cStatus() {
558
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
559
+ }
560
+ static error() {
561
+ return 'unsupported operation';
562
+ }
563
+ /**
564
+ * @param {string} [err] error message
565
+ */
566
+ constructor(err) {
567
+ super(err || 'An IME engine could not be started.', IMEEngineActivationFailedError.code(), IMEEngineActivationFailedError.w3cStatus(), IMEEngineActivationFailedError.error());
568
+ }
569
+ }
647
570
  exports.IMEEngineActivationFailedError = IMEEngineActivationFailedError;
648
-
649
571
  class InvalidSelectorError extends ProtocolError {
650
- static code() {
651
- return 32;
652
- }
653
-
654
- static w3cStatus() {
655
- return _httpStatusCodes.StatusCodes.BAD_REQUEST;
656
- }
657
-
658
- static error() {
659
- return 'invalid selector';
660
- }
661
-
662
- constructor(err) {
663
- super(err || 'Argument was an invalid selector (e.g. XPath/CSS).', InvalidSelectorError.code(), InvalidSelectorError.w3cStatus(), InvalidSelectorError.error());
664
- }
665
-
666
- }
667
-
572
+ static code() {
573
+ return 32;
574
+ }
575
+ static w3cStatus() {
576
+ return http_status_codes_1.StatusCodes.BAD_REQUEST;
577
+ }
578
+ static error() {
579
+ return 'invalid selector';
580
+ }
581
+ /**
582
+ * @param {string} [err] error message
583
+ */
584
+ constructor(err) {
585
+ super(err || 'Argument was an invalid selector (e.g. XPath/CSS).', InvalidSelectorError.code(), InvalidSelectorError.w3cStatus(), InvalidSelectorError.error());
586
+ }
587
+ }
668
588
  exports.InvalidSelectorError = InvalidSelectorError;
669
-
670
589
  class SessionNotCreatedError extends ProtocolError {
671
- static code() {
672
- return 33;
673
- }
674
-
675
- static w3cStatus() {
676
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
677
- }
678
-
679
- static error() {
680
- return 'session not created';
681
- }
682
-
683
- constructor(details) {
684
- let message = 'A new session could not be created.';
685
-
686
- if (details) {
687
- message += ` Details: ${details}`;
688
- }
689
-
690
- super(message, SessionNotCreatedError.code(), SessionNotCreatedError.w3cStatus(), SessionNotCreatedError.error());
691
- }
692
-
693
- }
694
-
590
+ static code() {
591
+ return 33;
592
+ }
593
+ static w3cStatus() {
594
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
595
+ }
596
+ static error() {
597
+ return 'session not created';
598
+ }
599
+ constructor(details) {
600
+ let message = 'A new session could not be created.';
601
+ if (details) {
602
+ message += ` Details: ${details}`;
603
+ }
604
+ super(message, SessionNotCreatedError.code(), SessionNotCreatedError.w3cStatus(), SessionNotCreatedError.error());
605
+ }
606
+ }
695
607
  exports.SessionNotCreatedError = SessionNotCreatedError;
696
-
697
608
  class MoveTargetOutOfBoundsError extends ProtocolError {
698
- static code() {
699
- return 34;
700
- }
701
-
702
- static w3cStatus() {
703
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
704
- }
705
-
706
- static error() {
707
- return 'move target out of bounds';
708
- }
709
-
710
- constructor(err) {
711
- super(err || 'Target provided for a move action is out of bounds.', MoveTargetOutOfBoundsError.code(), MoveTargetOutOfBoundsError.w3cStatus(), MoveTargetOutOfBoundsError.error());
712
- }
713
-
714
- }
715
-
609
+ static code() {
610
+ return 34;
611
+ }
612
+ static w3cStatus() {
613
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
614
+ }
615
+ static error() {
616
+ return 'move target out of bounds';
617
+ }
618
+ /**
619
+ * @param {string} [err] error message
620
+ */
621
+ constructor(err) {
622
+ super(err || 'Target provided for a move action is out of bounds.', MoveTargetOutOfBoundsError.code(), MoveTargetOutOfBoundsError.w3cStatus(), MoveTargetOutOfBoundsError.error());
623
+ }
624
+ }
716
625
  exports.MoveTargetOutOfBoundsError = MoveTargetOutOfBoundsError;
717
-
718
626
  class NoSuchContextError extends ProtocolError {
719
- static code() {
720
- return 35;
721
- }
722
-
723
- constructor(err) {
724
- super(err || 'No such context found.', NoSuchContextError.code());
725
- }
726
-
727
- }
728
-
627
+ static code() {
628
+ return 35;
629
+ }
630
+ /**
631
+ *
632
+ * @param {string} [message]
633
+ */
634
+ constructor(message) {
635
+ super(message || 'No such context found.', NoSuchContextError.code());
636
+ }
637
+ }
729
638
  exports.NoSuchContextError = NoSuchContextError;
730
-
731
639
  class InvalidContextError extends ProtocolError {
732
- static code() {
733
- return 36;
734
- }
735
-
736
- constructor(err) {
737
- super(err || 'That command could not be executed in the current context.', InvalidContextError.code());
738
- }
739
-
740
- }
741
-
640
+ static code() {
641
+ return 36;
642
+ }
643
+ /**
644
+ *
645
+ * @param {string} [message]
646
+ */
647
+ constructor(message) {
648
+ super(message || 'That command could not be executed in the current context.', InvalidContextError.code());
649
+ }
650
+ }
742
651
  exports.InvalidContextError = InvalidContextError;
743
-
652
+ // These are aliases for UnknownMethodError
744
653
  class NotYetImplementedError extends UnknownMethodError {
745
- constructor(err) {
746
- super(err || 'Method has not yet been implemented');
747
- }
748
-
654
+ /**
655
+ * @param {string} [err] error message
656
+ */
657
+ constructor(err) {
658
+ super(err || 'Method has not yet been implemented');
659
+ }
749
660
  }
750
-
751
661
  exports.NotYetImplementedError = NotYetImplementedError;
752
-
753
662
  class NotImplementedError extends UnknownMethodError {
754
- constructor(err) {
755
- super(err || 'Method is not implemented');
756
- }
757
-
663
+ /**
664
+ * @param {string} [err] error message
665
+ */
666
+ constructor(err) {
667
+ super(err || 'Method is not implemented');
668
+ }
758
669
  }
759
-
760
670
  exports.NotImplementedError = NotImplementedError;
761
-
762
671
  class UnableToCaptureScreen extends ProtocolError {
763
- static code() {
764
- return 63;
765
- }
766
-
767
- static w3cStatus() {
768
- return _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
769
- }
770
-
771
- static error() {
772
- return 'unable to capture screen';
773
- }
774
-
775
- constructor(err) {
776
- super(err || 'A screen capture was made impossible', UnableToCaptureScreen.code(), UnableToCaptureScreen.w3cStatus(), UnableToCaptureScreen.error());
777
- }
778
-
779
- }
780
-
672
+ static code() {
673
+ return 63;
674
+ }
675
+ static w3cStatus() {
676
+ return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
677
+ }
678
+ static error() {
679
+ return 'unable to capture screen';
680
+ }
681
+ /**
682
+ * @param {string} [err] error message
683
+ */
684
+ constructor(err) {
685
+ super(err || 'A screen capture was made impossible', UnableToCaptureScreen.code(), UnableToCaptureScreen.w3cStatus(), UnableToCaptureScreen.error());
686
+ }
687
+ }
781
688
  exports.UnableToCaptureScreen = UnableToCaptureScreen;
782
-
783
- class BadParametersError extends _es6Error.default {
784
- static error() {
785
- return 'invalid argument';
786
- }
787
-
788
- constructor(requiredParams, actualParams, errMessage) {
789
- let message;
790
-
791
- if (!errMessage) {
792
- message = `Parameters were incorrect. We wanted ` + `${JSON.stringify(requiredParams)} and you ` + `sent ${JSON.stringify(actualParams)}`;
793
- } else {
794
- message = `Parameters were incorrect. You sent ${JSON.stringify(actualParams)}, ${errMessage}`;
795
- }
796
-
797
- super(message);
798
- this.w3cStatus = _httpStatusCodes.StatusCodes.BAD_REQUEST;
799
- }
800
-
801
- }
802
-
689
+ // Equivalent to W3C InvalidArgumentError
690
+ class BadParametersError extends es6_error_1.default {
691
+ static error() {
692
+ return 'invalid argument';
693
+ }
694
+ constructor(requiredParams, actualParams, errMessage) {
695
+ let message;
696
+ if (!errMessage) {
697
+ message =
698
+ `Parameters were incorrect. We wanted ` +
699
+ `${JSON.stringify(requiredParams)} and you ` +
700
+ `sent ${JSON.stringify(actualParams)}`;
701
+ }
702
+ else {
703
+ message = `Parameters were incorrect. You sent ${JSON.stringify(actualParams)}, ${errMessage}`;
704
+ }
705
+ super(message);
706
+ this.w3cStatus = http_status_codes_1.StatusCodes.BAD_REQUEST;
707
+ }
708
+ }
803
709
  exports.BadParametersError = BadParametersError;
804
-
805
- class ProxyRequestError extends _es6Error.default {
806
- constructor(err, responseError, httpStatus) {
807
- let responseErrorObj = _support.util.safeJsonParse(responseError);
808
-
809
- if (!_lodash.default.isPlainObject(responseErrorObj)) {
810
- responseErrorObj = {};
811
- }
812
-
813
- let origMessage = _lodash.default.isString(responseError) ? responseError : '';
814
-
815
- if (!_lodash.default.isEmpty(responseErrorObj)) {
816
- if (_lodash.default.isString(responseErrorObj.value)) {
817
- origMessage = responseErrorObj.value;
818
- } else if (_lodash.default.isPlainObject(responseErrorObj.value) && _lodash.default.isString(responseErrorObj.value.message)) {
819
- origMessage = responseErrorObj.value.message;
820
- }
821
- }
822
-
823
- super(_lodash.default.isEmpty(err) ? `Proxy request unsuccessful. ${origMessage}` : err);
824
- this.w3cStatus = _httpStatusCodes.StatusCodes.BAD_REQUEST;
825
-
826
- if (_lodash.default.isPlainObject(responseErrorObj.value) && _lodash.default.has(responseErrorObj.value, 'error')) {
827
- this.w3c = responseErrorObj.value;
828
- this.w3cStatus = httpStatus || _httpStatusCodes.StatusCodes.BAD_REQUEST;
829
- } else {
830
- this.jsonwp = responseErrorObj;
831
- }
832
- }
833
-
834
- getActualError() {
835
- var _this$jsonwp, _this$jsonwp2;
836
-
837
- if (_support.util.hasValue((_this$jsonwp = this.jsonwp) === null || _this$jsonwp === void 0 ? void 0 : _this$jsonwp.status) && _support.util.hasValue((_this$jsonwp2 = this.jsonwp) === null || _this$jsonwp2 === void 0 ? void 0 : _this$jsonwp2.value)) {
838
- return errorFromMJSONWPStatusCode(this.jsonwp.status, this.jsonwp.value);
839
- } else if (_support.util.hasValue(this.w3c) && _lodash.default.isNumber(this.w3cStatus) && this.w3cStatus >= 300) {
840
- return errorFromW3CJsonCode(this.w3c.error, this.w3c.message || this.message, this.w3c.stacktrace);
841
- }
842
-
843
- return new UnknownError(this.message);
844
- }
845
-
846
- }
847
-
710
+ /**
711
+ * ProxyRequestError is a custom error and will be thrown up on unsuccessful proxy request and
712
+ * will contain information about the proxy failure.
713
+ * In case of ProxyRequestError should fetch the actual error by calling `getActualError()`
714
+ * for proxy failure to generate the client response.
715
+ */
716
+ class ProxyRequestError extends es6_error_1.default {
717
+ constructor(err, responseError, httpStatus) {
718
+ let responseErrorObj = support_1.util.safeJsonParse(responseError);
719
+ if (!lodash_1.default.isPlainObject(responseErrorObj)) {
720
+ responseErrorObj = {};
721
+ }
722
+ let origMessage = lodash_1.default.isString(responseError) ? responseError : '';
723
+ if (!lodash_1.default.isEmpty(responseErrorObj)) {
724
+ if (lodash_1.default.isString(responseErrorObj.value)) {
725
+ origMessage = responseErrorObj.value;
726
+ }
727
+ else if (lodash_1.default.isPlainObject(responseErrorObj.value) &&
728
+ lodash_1.default.isString(responseErrorObj.value.message)) {
729
+ origMessage = responseErrorObj.value.message;
730
+ }
731
+ }
732
+ super(lodash_1.default.isEmpty(err) ? `Proxy request unsuccessful. ${origMessage}` : err);
733
+ this.w3cStatus = http_status_codes_1.StatusCodes.BAD_REQUEST;
734
+ // If the response error is an object and value is an object, it's a W3C error (for JSONWP value is a string)
735
+ if (lodash_1.default.isPlainObject(responseErrorObj.value) && lodash_1.default.has(responseErrorObj.value, 'error')) {
736
+ this.w3c = responseErrorObj.value;
737
+ this.w3cStatus = httpStatus || http_status_codes_1.StatusCodes.BAD_REQUEST;
738
+ }
739
+ else {
740
+ this.jsonwp = responseErrorObj;
741
+ }
742
+ }
743
+ getActualError() {
744
+ // If it's MJSONWP error, returns actual error cause for request failure based on `jsonwp.status`
745
+ if (support_1.util.hasValue(this.jsonwp?.status) && support_1.util.hasValue(this.jsonwp?.value)) {
746
+ return errorFromMJSONWPStatusCode(this.jsonwp.status, this.jsonwp.value);
747
+ }
748
+ else if (support_1.util.hasValue(this.w3c) && lodash_1.default.isNumber(this.w3cStatus) && this.w3cStatus >= 300) {
749
+ return errorFromW3CJsonCode(this.w3c.error, this.w3c.message || this.message, this.w3c.stacktrace);
750
+ }
751
+ return new UnknownError(this.message);
752
+ }
753
+ }
848
754
  exports.ProxyRequestError = ProxyRequestError;
755
+ // map of error class name to error class
849
756
  const errors = {
850
- NotYetImplementedError,
851
- NotImplementedError,
852
- BadParametersError,
853
- InvalidArgumentError,
854
- NoSuchDriverError,
855
- NoSuchElementError,
856
- UnknownCommandError,
857
- StaleElementReferenceError,
858
- ElementNotVisibleError,
859
- InvalidElementStateError,
860
- UnknownError,
861
- ElementIsNotSelectableError,
862
- ElementClickInterceptedError,
863
- ElementNotInteractableError,
864
- InsecureCertificateError,
865
- JavaScriptError,
866
- XPathLookupError,
867
- TimeoutError,
868
- NoSuchWindowError,
869
- NoSuchCookieError,
870
- InvalidCookieDomainError,
871
- InvalidCoordinatesError,
872
- UnableToSetCookieError,
873
- UnexpectedAlertOpenError,
874
- NoAlertOpenError,
875
- ScriptTimeoutError,
876
- InvalidElementCoordinatesError,
877
- IMENotAvailableError,
878
- IMEEngineActivationFailedError,
879
- InvalidSelectorError,
880
- SessionNotCreatedError,
881
- MoveTargetOutOfBoundsError,
882
- NoSuchAlertError,
883
- NoSuchContextError,
884
- InvalidContextError,
885
- NoSuchFrameError,
886
- UnableToCaptureScreen,
887
- UnknownMethodError,
888
- UnsupportedOperationError,
889
- ProxyRequestError
757
+ NotYetImplementedError,
758
+ NotImplementedError,
759
+ BadParametersError,
760
+ InvalidArgumentError,
761
+ NoSuchDriverError,
762
+ NoSuchElementError,
763
+ UnknownCommandError,
764
+ StaleElementReferenceError,
765
+ ElementNotVisibleError,
766
+ InvalidElementStateError,
767
+ UnknownError,
768
+ ElementIsNotSelectableError,
769
+ ElementClickInterceptedError,
770
+ ElementNotInteractableError,
771
+ InsecureCertificateError,
772
+ JavaScriptError,
773
+ XPathLookupError,
774
+ TimeoutError,
775
+ NoSuchWindowError,
776
+ NoSuchCookieError,
777
+ InvalidCookieDomainError,
778
+ InvalidCoordinatesError,
779
+ UnableToSetCookieError,
780
+ UnexpectedAlertOpenError,
781
+ NoAlertOpenError,
782
+ ScriptTimeoutError,
783
+ InvalidElementCoordinatesError,
784
+ IMENotAvailableError,
785
+ IMEEngineActivationFailedError,
786
+ InvalidSelectorError,
787
+ SessionNotCreatedError,
788
+ MoveTargetOutOfBoundsError,
789
+ NoSuchAlertError,
790
+ NoSuchContextError,
791
+ InvalidContextError,
792
+ NoSuchFrameError,
793
+ UnableToCaptureScreen,
794
+ UnknownMethodError,
795
+ UnsupportedOperationError,
796
+ ProxyRequestError,
890
797
  };
891
798
  exports.errors = errors;
799
+ // map of error code to error class
892
800
  const jsonwpErrorCodeMap = {};
893
-
894
- for (let ErrorClass of _lodash.default.values(errors)) {
895
- if ('code' in ErrorClass) {
896
- jsonwpErrorCodeMap[ErrorClass.code()] = ErrorClass;
897
- }
801
+ for (let ErrorClass of lodash_1.default.values(errors)) {
802
+ if ('code' in ErrorClass) {
803
+ jsonwpErrorCodeMap[ErrorClass.code()] = ErrorClass;
804
+ }
898
805
  }
899
-
900
806
  const w3cErrorCodeMap = {};
901
-
902
- for (let ErrorClass of _lodash.default.values(errors)) {
903
- if ('error' in ErrorClass) {
904
- w3cErrorCodeMap[ErrorClass.error()] = ErrorClass;
905
- }
807
+ for (let ErrorClass of lodash_1.default.values(errors)) {
808
+ if ('error' in ErrorClass) {
809
+ w3cErrorCodeMap[ErrorClass.error()] = ErrorClass;
810
+ }
906
811
  }
907
-
908
812
  function isUnknownError(err) {
909
- return !err.constructor.name || !_lodash.default.values(errors).find(function equalNames(error) {
910
- return error.name === err.constructor.name;
911
- });
813
+ return (!err.constructor.name ||
814
+ !lodash_1.default.values(errors).find(function equalNames(error) {
815
+ return error.name === err.constructor.name;
816
+ }));
912
817
  }
913
-
818
+ exports.isUnknownError = isUnknownError;
914
819
  function isErrorType(err, type) {
915
- if (type.name === ProtocolError.name) {
916
- return !!err.jsonwpCode;
917
- } else if (type.name === ProxyRequestError.name) {
918
- if (err.jsonwp) {
919
- return !!err.jsonwp.status;
920
- }
921
-
922
- if (_lodash.default.isPlainObject(err.w3c)) {
923
- return _lodash.default.isNumber(err.w3cStatus) && err.w3cStatus >= 300;
924
- }
925
-
926
- return false;
927
- }
928
-
929
- return err.constructor.name === type.name;
930
- }
931
-
820
+ // `name` property is the constructor name
821
+ if (type.name === ProtocolError.name) {
822
+ // `jsonwpCode` is `0` on success
823
+ return !!err.jsonwpCode;
824
+ }
825
+ else if (type.name === ProxyRequestError.name) {
826
+ // `status` is `0` on success
827
+ if (err.jsonwp) {
828
+ return !!err.jsonwp.status;
829
+ }
830
+ if (lodash_1.default.isPlainObject(err.w3c)) {
831
+ return lodash_1.default.isNumber(err.w3cStatus) && err.w3cStatus >= 300;
832
+ }
833
+ return false;
834
+ }
835
+ return err.constructor.name === type.name;
836
+ }
837
+ exports.isErrorType = isErrorType;
838
+ /**
839
+ * Retrieve an error derived from MJSONWP status
840
+ * @param {number} code JSONWP status code
841
+ * @param {string|Object} value The error message, or an object with a `message` property
842
+ * @return {ProtocolError} The error that is associated with provided JSONWP status code
843
+ */
932
844
  function errorFromMJSONWPStatusCode(code, value = '') {
933
- const message = (value || {}).message || value || '';
934
-
935
- if (code !== UnknownError.code() && jsonwpErrorCodeMap[code]) {
936
- mjsonwpLog.debug(`Matched JSONWP error code ${code} to ${jsonwpErrorCodeMap[code].name}`);
937
- return new jsonwpErrorCodeMap[code](message);
938
- }
939
-
940
- mjsonwpLog.debug(`Matched JSONWP error code ${code} to UnknownError`);
941
- return new UnknownError(message);
942
- }
943
-
845
+ // if `value` is an object, pull message from it, otherwise use the plain
846
+ // value, or default to an empty string, if null
847
+ const message = (value || {}).message || value || '';
848
+ if (code !== UnknownError.code() && jsonwpErrorCodeMap[code]) {
849
+ mjsonwpLog.debug(`Matched JSONWP error code ${code} to ${jsonwpErrorCodeMap[code].name}`);
850
+ return new jsonwpErrorCodeMap[code](message);
851
+ }
852
+ mjsonwpLog.debug(`Matched JSONWP error code ${code} to UnknownError`);
853
+ return new UnknownError(message);
854
+ }
855
+ exports.errorFromMJSONWPStatusCode = errorFromMJSONWPStatusCode;
856
+ /**
857
+ * Retrieve an error derived from W3C JSON Code
858
+ * @param {string} code W3C error string (see https://www.w3.org/TR/webdriver/#handling-errors `JSON Error Code` column)
859
+ * @param {string} message the error message
860
+ * @param {?string} stacktrace an optional error stacktrace
861
+ * @return {ProtocolError} The error that is associated with the W3C error string
862
+ */
944
863
  function errorFromW3CJsonCode(code, message, stacktrace = null) {
945
- if (code && w3cErrorCodeMap[code.toLowerCase()]) {
946
- w3cLog.debug(`Matched W3C error code '${code}' to ${w3cErrorCodeMap[code.toLowerCase()].name}`);
947
- const resultError = new w3cErrorCodeMap[code.toLowerCase()](message);
864
+ if (code && w3cErrorCodeMap[code.toLowerCase()]) {
865
+ w3cLog.debug(`Matched W3C error code '${code}' to ${w3cErrorCodeMap[code.toLowerCase()].name}`);
866
+ const resultError = new w3cErrorCodeMap[code.toLowerCase()](message);
867
+ resultError.stacktrace = stacktrace;
868
+ return resultError;
869
+ }
870
+ w3cLog.debug(`Matched W3C error code '${code}' to UnknownError`);
871
+ const resultError = new UnknownError(message);
948
872
  resultError.stacktrace = stacktrace;
949
873
  return resultError;
950
- }
951
-
952
- w3cLog.debug(`Matched W3C error code '${code}' to UnknownError`);
953
- const resultError = new UnknownError(message);
954
- resultError.stacktrace = stacktrace;
955
- return resultError;
956
- }
957
-
874
+ }
875
+ exports.errorFromW3CJsonCode = errorFromW3CJsonCode;
876
+ /**
877
+ *
878
+ * @param {any} err
879
+ * @returns {err is ProtocolError}
880
+ */
958
881
  function isProtocolError(err) {
959
- return 'w3cStatus' in err;
882
+ return 'w3cStatus' in err;
960
883
  }
961
-
884
+ /**
885
+ * Convert an Appium error to proper W3C HTTP response
886
+ * @param {ProtocolError|MJSONWPError} err The error that needs to be translated
887
+ */
962
888
  function getResponseForW3CError(err) {
963
- let httpStatus;
964
- let w3cErrorString;
965
-
966
- if (!isProtocolError(err)) {
967
- err = _support.util.hasValue(err.status) ? errorFromMJSONWPStatusCode(err.status, err.value) : new errors.UnknownError(err.message);
968
- }
969
-
970
- if (isErrorType(err, errors.BadParametersError)) {
971
- w3cLog.debug(`Bad parameters: ${err}`);
972
- w3cErrorString = BadParametersError.error();
973
- } else {
974
- w3cErrorString = err.error;
975
- }
976
-
977
- httpStatus = err.w3cStatus;
978
-
979
- if (!w3cErrorString) {
980
- w3cErrorString = UnknownError.error();
981
- }
982
-
983
- let httpResBody = {
984
- value: {
985
- error: w3cErrorString,
986
- message: err.message,
987
- stacktrace: err.stacktrace || err.stack
988
- }
989
- };
990
- return [httpStatus, httpResBody];
991
- }
992
-
889
+ let httpStatus;
890
+ // W3C defined error message (https://www.w3.org/TR/webdriver/#dfn-error-code)
891
+ let w3cErrorString;
892
+ if (!isProtocolError(err)) {
893
+ err = support_1.util.hasValue(err.status)
894
+ ? // If it's a JSONWP error, find corresponding error
895
+ errorFromMJSONWPStatusCode(err.status, err.value)
896
+ : new errors.UnknownError(err.message);
897
+ }
898
+ if (isErrorType(err, errors.BadParametersError)) {
899
+ // respond with a 400 if we have bad parameters
900
+ w3cLog.debug(`Bad parameters: ${err}`);
901
+ w3cErrorString = BadParametersError.error();
902
+ }
903
+ else {
904
+ w3cErrorString = err.error;
905
+ }
906
+ httpStatus = err.w3cStatus;
907
+ if (!w3cErrorString) {
908
+ w3cErrorString = UnknownError.error();
909
+ }
910
+ let httpResBody = {
911
+ value: {
912
+ error: w3cErrorString,
913
+ message: err.message,
914
+ stacktrace: err.stacktrace || err.stack,
915
+ },
916
+ };
917
+ return [httpStatus, httpResBody];
918
+ }
919
+ exports.getResponseForW3CError = getResponseForW3CError;
920
+ /**
921
+ * Convert an Appium error to a proper JSONWP response
922
+ * @param {ProtocolError} err The error to be converted
923
+ */
993
924
  function getResponseForJsonwpError(err) {
994
- if (isUnknownError(err)) {
995
- err = new errors.UnknownError(err);
996
- }
997
-
998
- let httpStatus = _httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR;
999
- let httpResBody = {
1000
- status: err.jsonwpCode,
1001
- value: {
1002
- message: err.message
1003
- }
1004
- };
1005
-
1006
- if (isErrorType(err, errors.BadParametersError)) {
1007
- mjsonwpLog.debug(`Bad parameters: ${err}`);
1008
- httpStatus = _httpStatusCodes.StatusCodes.BAD_REQUEST;
1009
- httpResBody = err.message;
1010
- } else if (isErrorType(err, errors.NotYetImplementedError) || isErrorType(err, errors.NotImplementedError)) {
1011
- httpStatus = _httpStatusCodes.StatusCodes.NOT_IMPLEMENTED;
1012
- } else if (isErrorType(err, errors.NoSuchDriverError)) {
1013
- httpStatus = _httpStatusCodes.StatusCodes.NOT_FOUND;
1014
- }
1015
-
1016
- return [httpStatus, httpResBody];
1017
- }
1018
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtanNvbndwTG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidzNjTG9nIiwiVzNDX1VOS05PV05fRVJST1IiLCJQcm90b2NvbEVycm9yIiwiRVM2RXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1zZyIsImpzb253cENvZGUiLCJ3M2NTdGF0dXMiLCJlcnJvciIsIkhUVFBTdGF0dXNDb2RlcyIsIkJBRF9SRVFVRVNUIiwiX3N0YWNrdHJhY2UiLCJzdGFja3RyYWNlIiwic3RhY2siLCJ2YWx1ZSIsIk5vU3VjaERyaXZlckVycm9yIiwiY29kZSIsIk5PVF9GT1VORCIsImVyciIsIk5vU3VjaEVsZW1lbnRFcnJvciIsIk5vU3VjaEZyYW1lRXJyb3IiLCJVbmtub3duQ29tbWFuZEVycm9yIiwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IiLCJFbGVtZW50Tm90VmlzaWJsZUVycm9yIiwiSW52YWxpZEVsZW1lbnRTdGF0ZUVycm9yIiwiVW5rbm93bkVycm9yIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwiZXJyb3JPck1lc3NhZ2UiLCJvcmlnTWVzc2FnZSIsIl8iLCJpc1N0cmluZyIsIm1lc3NhZ2UiLCJVbmtub3duTWV0aG9kRXJyb3IiLCJNRVRIT0RfTk9UX0FMTE9XRUQiLCJVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yIiwiRWxlbWVudElzTm90U2VsZWN0YWJsZUVycm9yIiwiRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciIsIkVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciIsIkluc2VjdXJlQ2VydGlmaWNhdGVFcnJvciIsIkphdmFTY3JpcHRFcnJvciIsIlhQYXRoTG9va3VwRXJyb3IiLCJUaW1lb3V0RXJyb3IiLCJSRVFVRVNUX1RJTUVPVVQiLCJOb1N1Y2hXaW5kb3dFcnJvciIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiSW52YWxpZENvb2tpZURvbWFpbkVycm9yIiwiTm9TdWNoQ29va2llRXJyb3IiLCJVbmFibGVUb1NldENvb2tpZUVycm9yIiwiVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIiwiTm9BbGVydE9wZW5FcnJvciIsIk5vU3VjaEFsZXJ0RXJyb3IiLCJTY3JpcHRUaW1lb3V0RXJyb3IiLCJJbnZhbGlkRWxlbWVudENvb3JkaW5hdGVzRXJyb3IiLCJJbnZhbGlkQ29vcmRpbmF0ZXNFcnJvciIsIklNRU5vdEF2YWlsYWJsZUVycm9yIiwiSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yIiwiSW52YWxpZFNlbGVjdG9yRXJyb3IiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiZGV0YWlscyIsIk1vdmVUYXJnZXRPdXRPZkJvdW5kc0Vycm9yIiwiTm9TdWNoQ29udGV4dEVycm9yIiwiSW52YWxpZENvbnRleHRFcnJvciIsIk5vdFlldEltcGxlbWVudGVkRXJyb3IiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiVW5hYmxlVG9DYXB0dXJlU2NyZWVuIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwicmVxdWlyZWRQYXJhbXMiLCJhY3R1YWxQYXJhbXMiLCJlcnJNZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsIlByb3h5UmVxdWVzdEVycm9yIiwicmVzcG9uc2VFcnJvciIsImh0dHBTdGF0dXMiLCJyZXNwb25zZUVycm9yT2JqIiwidXRpbCIsInNhZmVKc29uUGFyc2UiLCJpc1BsYWluT2JqZWN0IiwiaXNFbXB0eSIsImhhcyIsInczYyIsImpzb253cCIsImdldEFjdHVhbEVycm9yIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSIsImlzTnVtYmVyIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJlcnJvcnMiLCJqc29ud3BFcnJvckNvZGVNYXAiLCJFcnJvckNsYXNzIiwidmFsdWVzIiwidzNjRXJyb3JDb2RlTWFwIiwiaXNVbmtub3duRXJyb3IiLCJuYW1lIiwiZmluZCIsImVxdWFsTmFtZXMiLCJpc0Vycm9yVHlwZSIsInR5cGUiLCJkZWJ1ZyIsInRvTG93ZXJDYXNlIiwicmVzdWx0RXJyb3IiLCJpc1Byb3RvY29sRXJyb3IiLCJnZXRSZXNwb25zZUZvclczQ0Vycm9yIiwidzNjRXJyb3JTdHJpbmciLCJodHRwUmVzQm9keSIsImdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IiLCJOT1RfSU1QTEVNRU5URUQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvcHJvdG9jb2wvZXJyb3JzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFUzZFcnJvciBmcm9tICdlczYtZXJyb3InO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7dXRpbCwgbG9nZ2VyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtTdGF0dXNDb2RlcyBhcyBIVFRQU3RhdHVzQ29kZXN9IGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcblxuY29uc3QgbWpzb253cExvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ01KU09OV1AnKTtcbmNvbnN0IHczY0xvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1czQycpO1xuXG5jb25zdCBXM0NfVU5LTk9XTl9FUlJPUiA9ICd1bmtub3duIGVycm9yJztcblxuLy8gYmFzZSBlcnJvciBjbGFzcyBmb3IgYWxsIG9mIG91ciBlcnJvcnNcbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgRVM2RXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2csIGpzb253cENvZGUsIHczY1N0YXR1cywgZXJyb3IpIHtcbiAgICBzdXBlcihtc2cpO1xuICAgIHRoaXMuanNvbndwQ29kZSA9IGpzb253cENvZGU7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yIHx8IFczQ19VTktOT1dOX0VSUk9SO1xuICAgIGlmICh0aGlzLmpzb253cENvZGUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuanNvbndwQ29kZSA9IDEzO1xuICAgIH1cbiAgICB0aGlzLnczY1N0YXR1cyA9IHczY1N0YXR1cyB8fCBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1Q7XG4gICAgdGhpcy5fc3RhY2t0cmFjZSA9IG51bGw7XG4gIH1cblxuICBnZXQgc3RhY2t0cmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhY2t0cmFjZSB8fCB0aGlzLnN0YWNrO1xuICB9XG5cbiAgc2V0IHN0YWNrdHJhY2UodmFsdWUpIHtcbiAgICB0aGlzLl9zdGFja3RyYWNlID0gdmFsdWU7XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbGVuaXVtSFEvc2VsZW5pdW0vYmxvYi8xNzZiNGE5ZTMwODJhYzE5MjZmMmE0MzZlYjM0Njc2MGMzN2E1OTk4L2phdmEvY2xpZW50L3NyYy9vcmcvb3BlbnFhL3NlbGVuaXVtL3JlbW90ZS9FcnJvckNvZGVzLmphdmEjTDIxNVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbGVuaXVtSFEvc2VsZW5pdW0vaXNzdWVzLzU1NjIjaXNzdWVjb21tZW50LTM3MDM3OTQ3MFxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmRyaXZlci93ZWJkcml2ZXItc3BlYy5odG1sI2Rmbi1lcnJvci1jb2RlXG5cbmV4cG9ydCBjbGFzcyBOb1N1Y2hEcml2ZXJFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gNjtcbiAgfVxuICAvLyBXM0MgRXJyb3IgaXMgY2FsbGVkIEludmFsaWRTZXNzaW9uSURcbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLk5PVF9GT1VORDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIHNlc3Npb24gaWQnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBIHNlc3Npb24gaXMgZWl0aGVyIHRlcm1pbmF0ZWQgb3Igbm90IHN0YXJ0ZWQnLFxuICAgICAgTm9TdWNoRHJpdmVyRXJyb3IuY29kZSgpLFxuICAgICAgTm9TdWNoRHJpdmVyRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBOb1N1Y2hEcml2ZXJFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9TdWNoRWxlbWVudEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA3O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnbm8gc3VjaCBlbGVtZW50JztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnQW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbG9jYXRlZCBvbiB0aGUgcGFnZSB1c2luZyB0aGUgZ2l2ZW4gJyArICdzZWFyY2ggcGFyYW1ldGVycy4nLFxuICAgICAgTm9TdWNoRWxlbWVudEVycm9yLmNvZGUoKSxcbiAgICAgIE5vU3VjaEVsZW1lbnRFcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIE5vU3VjaEVsZW1lbnRFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9TdWNoRnJhbWVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gODtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdubyBzdWNoIGZyYW1lJztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuTk9UX0ZPVU5EO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8XG4gICAgICAgICdBIHJlcXVlc3QgdG8gc3dpdGNoIHRvIGEgZnJhbWUgY291bGQgbm90IGJlIHNhdGlzZmllZCBiZWNhdXNlICcgK1xuICAgICAgICAgICd0aGUgZnJhbWUgY291bGQgbm90IGJlIGZvdW5kLicsXG4gICAgICBOb1N1Y2hGcmFtZUVycm9yLmNvZGUoKSxcbiAgICAgIE5vU3VjaEZyYW1lRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBOb1N1Y2hGcmFtZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duQ29tbWFuZEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA5O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAndW5rbm93biBjb21tYW5kJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fFxuICAgICAgICAnVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQsIG9yIGEgcmVxdWVzdCB3YXMgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkIHVzaW5nIGFuIEhUVFAgbWV0aG9kIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbWFwcGVkICcgK1xuICAgICAgICAgICdyZXNvdXJjZS4nLFxuICAgICAgVW5rbm93bkNvbW1hbmRFcnJvci5jb2RlKCksXG4gICAgICBVbmtub3duQ29tbWFuZEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVW5rbm93bkNvbW1hbmRFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDEwO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnc3RhbGUgZWxlbWVudCByZWZlcmVuY2UnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8XG4gICAgICAgICdBbiBlbGVtZW50IGNvbW1hbmQgZmFpbGVkIGJlY2F1c2UgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBpcyBubyAnICtcbiAgICAgICAgICAnbG9uZ2VyIGF0dGFjaGVkIHRvIHRoZSBET00uJyxcbiAgICAgIFN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLmNvZGUoKSxcbiAgICAgIFN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnROb3RWaXNpYmxlRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDExO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdlbGVtZW50IG5vdCB2aXNpYmxlJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fFxuICAgICAgICAnQW4gZWxlbWVudCBjb21tYW5kIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZSB0aGUgZWxlbWVudCBpcyAnICtcbiAgICAgICAgICAnbm90IHZpc2libGUgb24gdGhlIHBhZ2UuJyxcbiAgICAgIEVsZW1lbnROb3RWaXNpYmxlRXJyb3IuY29kZSgpLFxuICAgICAgRWxlbWVudE5vdFZpc2libGVFcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIEVsZW1lbnROb3RWaXNpYmxlRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRFbGVtZW50U3RhdGVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMTI7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ2ludmFsaWQgZWxlbWVudCBzdGF0ZSc7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHxcbiAgICAgICAgJ0FuIGVsZW1lbnQgY29tbWFuZCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGJlY2F1c2UgdGhlIGVsZW1lbnQgaXMgJyArXG4gICAgICAgICAgJ2luIGFuIGludmFsaWQgc3RhdGUgKGUuZy4gYXR0ZW1wdGluZyB0byBjbGljayBhIGRpc2FibGVkIGVsZW1lbnQpLicsXG4gICAgICBJbnZhbGlkRWxlbWVudFN0YXRlRXJyb3IuY29kZSgpLFxuICAgICAgSW52YWxpZEVsZW1lbnRTdGF0ZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgSW52YWxpZEVsZW1lbnRTdGF0ZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDEzO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiBXM0NfVU5LTk9XTl9FUlJPUjtcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnJvck9yTWVzc2FnZSkge1xuICAgIGNvbnN0IG9yaWdNZXNzYWdlID0gXy5pc1N0cmluZygoZXJyb3JPck1lc3NhZ2UgfHwge30pLm1lc3NhZ2UpXG4gICAgICA/IGVycm9yT3JNZXNzYWdlLm1lc3NhZ2VcbiAgICAgIDogZXJyb3JPck1lc3NhZ2U7XG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAnQW4gdW5rbm93biBzZXJ2ZXItc2lkZSBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBjb21tYW5kLicgK1xuICAgICAgKG9yaWdNZXNzYWdlID8gYCBPcmlnaW5hbCBlcnJvcjogJHtvcmlnTWVzc2FnZX1gIDogJycpO1xuICAgIHN1cGVyKG1lc3NhZ2UsIFVua25vd25FcnJvci5jb2RlKCksIFVua25vd25FcnJvci53M2NTdGF0dXMoKSwgVW5rbm93bkVycm9yLmVycm9yKCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duTWV0aG9kRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDQwNTtcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuTUVUSE9EX05PVF9BTExPV0VEO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3Vua25vd24gbWV0aG9kJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnVGhlIHJlcXVlc3RlZCBjb21tYW5kIG1hdGNoZWQgYSBrbm93biBVUkwgYnV0IGRpZCBub3QgbWF0Y2ggYW4gbWV0aG9kIGZvciB0aGF0IFVSTCcsXG4gICAgICBVbmtub3duTWV0aG9kRXJyb3IuY29kZSgpLFxuICAgICAgVW5rbm93bk1ldGhvZEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVW5rbm93bk1ldGhvZEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA0MDU7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICd1bnN1cHBvcnRlZCBvcGVyYXRpb24nO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBIHNlcnZlci1zaWRlIGVycm9yIG9jY3VycmVkLiBDb21tYW5kIGNhbm5vdCBiZSBzdXBwb3J0ZWQuJyxcbiAgICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IuY29kZSgpLFxuICAgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRJc05vdFNlbGVjdGFibGVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMTU7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnZWxlbWVudCBub3Qgc2VsZWN0YWJsZSc7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHNlbGVjdCBhbiBlbGVtZW50IHRoYXQgY2Fubm90IGJlIHNlbGVjdGVkLicsXG4gICAgICBFbGVtZW50SXNOb3RTZWxlY3RhYmxlRXJyb3IuY29kZSgpLFxuICAgICAgRWxlbWVudElzTm90U2VsZWN0YWJsZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgRWxlbWVudElzTm90U2VsZWN0YWJsZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA2NDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdlbGVtZW50IGNsaWNrIGludGVyY2VwdGVkJztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1Q7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHxcbiAgICAgICAgJ1RoZSBFbGVtZW50IENsaWNrIGNvbW1hbmQgY291bGQgbm90IGJlIGNvbXBsZXRlZCBiZWNhdXNlIHRoZSBlbGVtZW50IHJlY2VpdmluZyAnICtcbiAgICAgICAgICAndGhlIGV2ZW50cyBpcyBvYnNjdXJpbmcgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmVxdWVzdGVkIGNsaWNrZWQnLFxuICAgICAgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvci5jb2RlKCksXG4gICAgICBFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA2MDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdlbGVtZW50IG5vdCBpbnRlcmFjdGFibGUnO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fFxuICAgICAgICAnQSBjb21tYW5kIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZSB0aGUgZWxlbWVudCBpcyBub3QgcG9pbnRlci0gb3Iga2V5Ym9hcmQgaW50ZXJhY3RhYmxlJyxcbiAgICAgIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvci5jb2RlKCksXG4gICAgICBFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluc2VjdXJlQ2VydGlmaWNhdGVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnNlY3VyZSBjZXJ0aWZpY2F0ZSc7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHxcbiAgICAgICAgJ05hdmlnYXRpb24gY2F1c2VkIHRoZSB1c2VyIGFnZW50IHRvIGhpdCBhIGNlcnRpZmljYXRlIHdhcm5pbmcsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBhbiBleHBpcmVkIG9yIGludmFsaWQgVExTIGNlcnRpZmljYXRlJyxcbiAgICAgIEVsZW1lbnRJc05vdFNlbGVjdGFibGVFcnJvci5jb2RlKCksXG4gICAgICBudWxsLFxuICAgICAgSW5zZWN1cmVDZXJ0aWZpY2F0ZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKYXZhU2NyaXB0RXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDE3O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnamF2YXNjcmlwdCBlcnJvcic7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyB1c2VyIHN1cHBsaWVkIEphdmFTY3JpcHQuJyxcbiAgICAgIEphdmFTY3JpcHRFcnJvci5jb2RlKCksXG4gICAgICBKYXZhU2NyaXB0RXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBKYXZhU2NyaXB0RXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFhQYXRoTG9va3VwRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDE5O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIHNlbGVjdG9yJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2VhcmNoaW5nIGZvciBhbiBlbGVtZW50IGJ5IFhQYXRoLicsXG4gICAgICBYUGF0aExvb2t1cEVycm9yLmNvZGUoKSxcbiAgICAgIFhQYXRoTG9va3VwRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBYUGF0aExvb2t1cEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDIxO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5SRVFVRVNUX1RJTUVPVVQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAndGltZW91dCc7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ0FuIG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIGJlZm9yZSBpdHMgdGltZW91dCBleHBpcmVkLicsXG4gICAgICBUaW1lb3V0RXJyb3IuY29kZSgpLFxuICAgICAgVGltZW91dEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVGltZW91dEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1N1Y2hXaW5kb3dFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMjM7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnbm8gc3VjaCB3aW5kb3cnO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHxcbiAgICAgICAgJ0EgcmVxdWVzdCB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgd2luZG93IGNvdWxkIG5vdCBiZSBzYXRpc2ZpZWQgJyArXG4gICAgICAgICAgJ2JlY2F1c2UgdGhlIHdpbmRvdyBjb3VsZCBub3QgYmUgZm91bmQuJyxcbiAgICAgIE5vU3VjaFdpbmRvd0Vycm9yLmNvZGUoKSxcbiAgICAgIE5vU3VjaFdpbmRvd0Vycm9yLnczY1N0YXR1cygpLFxuICAgICAgTm9TdWNoV2luZG93RXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA2MTtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIGFyZ3VtZW50JztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1Q7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ1RoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjb21tYW5kIGFyZSBlaXRoZXIgaW52YWxpZCBvciBtYWxmb3JtZWQnLFxuICAgICAgSW52YWxpZEFyZ3VtZW50RXJyb3IuY29kZSgpLFxuICAgICAgSW52YWxpZEFyZ3VtZW50RXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBJbnZhbGlkQXJndW1lbnRFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZENvb2tpZURvbWFpbkVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAyNDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIGNvb2tpZSBkb21haW4nO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fFxuICAgICAgICAnQW4gaWxsZWdhbCBhdHRlbXB0IHdhcyBtYWRlIHRvIHNldCBhIGNvb2tpZSB1bmRlciBhIGRpZmZlcmVudCAnICtcbiAgICAgICAgICAnZG9tYWluIHRoYW4gdGhlIGN1cnJlbnQgcGFnZS4nLFxuICAgICAgSW52YWxpZENvb2tpZURvbWFpbkVycm9yLmNvZGUoKSxcbiAgICAgIEludmFsaWRDb29raWVEb21haW5FcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIEludmFsaWRDb29raWVEb21haW5FcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9TdWNoQ29va2llRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDYyO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnbm8gc3VjaCBjb29raWUnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8XG4gICAgICAgICdObyBjb29raWUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhdGggbmFtZSB3YXMgZm91bmQgYW1vbmdzdCB0aGUgYXNzb2NpYXRlZCBjb29raWVzIG9mIHRoZSBjdXJyZW50IGJyb3dzaW5nIGNvbnRleHTigJlzIGFjdGl2ZSBkb2N1bWVudCcsXG4gICAgICBOb1N1Y2hDb29raWVFcnJvci5jb2RlKCksXG4gICAgICBOb1N1Y2hDb29raWVFcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIE5vU3VjaENvb2tpZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmFibGVUb1NldENvb2tpZUVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAyNTtcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3VuYWJsZSB0byBzZXQgY29va2llJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCBcIkEgcmVxdWVzdCB0byBzZXQgYSBjb29raWUncyB2YWx1ZSBjb3VsZCBub3QgYmUgc2F0aXNmaWVkLlwiLFxuICAgICAgVW5hYmxlVG9TZXRDb29raWVFcnJvci5jb2RlKCksXG4gICAgICBVbmFibGVUb1NldENvb2tpZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVW5hYmxlVG9TZXRDb29raWVFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAyNjtcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3VuZXhwZWN0ZWQgYWxlcnQgb3Blbic7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ0EgbW9kYWwgZGlhbG9nIHdhcyBvcGVuLCBibG9ja2luZyB0aGlzIG9wZXJhdGlvbicsXG4gICAgICBVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3IuY29kZSgpLFxuICAgICAgVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0FsZXJ0T3BlbkVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAyNztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuTk9UX0ZPVU5EO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ25vIHN1Y2ggYWxlcnQnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIG9wZXJhdGUgb24gYSBtb2RhbCBkaWFsb2cgd2hlbiBvbmUgJyArICd3YXMgbm90IG9wZW4uJyxcbiAgICAgIE5vQWxlcnRPcGVuRXJyb3IuY29kZSgpLFxuICAgICAgTm9BbGVydE9wZW5FcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIE5vQWxlcnRPcGVuRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vU3VjaEFsZXJ0RXJyb3IgZXh0ZW5kcyBOb0FsZXJ0T3BlbkVycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBTY3JpcHRUaW1lb3V0RXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDI4O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5SRVFVRVNUX1RJTUVPVVQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnc2NyaXB0IHRpbWVvdXQnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBIHNjcmlwdCBkaWQgbm90IGNvbXBsZXRlIGJlZm9yZSBpdHMgdGltZW91dCBleHBpcmVkLicsXG4gICAgICBTY3JpcHRUaW1lb3V0RXJyb3IuY29kZSgpLFxuICAgICAgU2NyaXB0VGltZW91dEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgU2NyaXB0VGltZW91dEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkRWxlbWVudENvb3JkaW5hdGVzRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDI5O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIGNvb3JkaW5hdGVzJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnVGhlIGNvb3JkaW5hdGVzIHByb3ZpZGVkIHRvIGFuIGludGVyYWN0aW9ucyBvcGVyYXRpb24gYXJlIGludmFsaWQuJyxcbiAgICAgIEludmFsaWRFbGVtZW50Q29vcmRpbmF0ZXNFcnJvci5jb2RlKCksXG4gICAgICBJbnZhbGlkRWxlbWVudENvb3JkaW5hdGVzRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBJbnZhbGlkRWxlbWVudENvb3JkaW5hdGVzRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRDb29yZGluYXRlc0Vycm9yIGV4dGVuZHMgSW52YWxpZEVsZW1lbnRDb29yZGluYXRlc0Vycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBJTUVOb3RBdmFpbGFibGVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzA7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICd1bnN1cHBvcnRlZCBvcGVyYXRpb24nO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdJTUUgd2FzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgIElNRU5vdEF2YWlsYWJsZUVycm9yLmNvZGUoKSxcbiAgICAgIElNRU5vdEF2YWlsYWJsZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgSU1FTm90QXZhaWxhYmxlRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElNRUVuZ2luZUFjdGl2YXRpb25GYWlsZWRFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzE7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICd1bnN1cHBvcnRlZCBvcGVyYXRpb24nO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBbiBJTUUgZW5naW5lIGNvdWxkIG5vdCBiZSBzdGFydGVkLicsXG4gICAgICBJTUVFbmdpbmVBY3RpdmF0aW9uRmFpbGVkRXJyb3IuY29kZSgpLFxuICAgICAgSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkU2VsZWN0b3JFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ2ludmFsaWQgc2VsZWN0b3InO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBcmd1bWVudCB3YXMgYW4gaW52YWxpZCBzZWxlY3RvciAoZS5nLiBYUGF0aC9DU1MpLicsXG4gICAgICBJbnZhbGlkU2VsZWN0b3JFcnJvci5jb2RlKCksXG4gICAgICBJbnZhbGlkU2VsZWN0b3JFcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIEludmFsaWRTZWxlY3RvckVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTm90Q3JlYXRlZEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAzMztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3Nlc3Npb24gbm90IGNyZWF0ZWQnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGRldGFpbHMpIHtcbiAgICBsZXQgbWVzc2FnZSA9ICdBIG5ldyBzZXNzaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLic7XG4gICAgaWYgKGRldGFpbHMpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYCBEZXRhaWxzOiAke2RldGFpbHN9YDtcbiAgICB9XG5cbiAgICBzdXBlcihcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBTZXNzaW9uTm90Q3JlYXRlZEVycm9yLmNvZGUoKSxcbiAgICAgIFNlc3Npb25Ob3RDcmVhdGVkRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBTZXNzaW9uTm90Q3JlYXRlZEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb3ZlVGFyZ2V0T3V0T2ZCb3VuZHNFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzQ7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdtb3ZlIHRhcmdldCBvdXQgb2YgYm91bmRzJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnVGFyZ2V0IHByb3ZpZGVkIGZvciBhIG1vdmUgYWN0aW9uIGlzIG91dCBvZiBib3VuZHMuJyxcbiAgICAgIE1vdmVUYXJnZXRPdXRPZkJvdW5kc0Vycm9yLmNvZGUoKSxcbiAgICAgIE1vdmVUYXJnZXRPdXRPZkJvdW5kc0Vycm9yLnczY1N0YXR1cygpLFxuICAgICAgTW92ZVRhcmdldE91dE9mQm91bmRzRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vU3VjaENvbnRleHRFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzU7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoZXJyIHx8ICdObyBzdWNoIGNvbnRleHQgZm91bmQuJywgTm9TdWNoQ29udGV4dEVycm9yLmNvZGUoKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRDb250ZXh0RXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDM2O1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdUaGF0IGNvbW1hbmQgY291bGQgbm90IGJlIGV4ZWN1dGVkIGluIHRoZSBjdXJyZW50IGNvbnRleHQuJyxcbiAgICAgIEludmFsaWRDb250ZXh0RXJyb3IuY29kZSgpXG4gICAgKTtcbiAgfVxufVxuXG4vLyBUaGVzZSBhcmUgYWxpYXNlcyBmb3IgVW5rbm93bk1ldGhvZEVycm9yXG5leHBvcnQgY2xhc3MgTm90WWV0SW1wbGVtZW50ZWRFcnJvciBleHRlbmRzIFVua25vd25NZXRob2RFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKGVyciB8fCAnTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBVbmtub3duTWV0aG9kRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihlcnIgfHwgJ01ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hYmxlVG9DYXB0dXJlU2NyZWVuIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA2MztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3VuYWJsZSB0byBjYXB0dXJlIHNjcmVlbic7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ0Egc2NyZWVuIGNhcHR1cmUgd2FzIG1hZGUgaW1wb3NzaWJsZScsXG4gICAgICBVbmFibGVUb0NhcHR1cmVTY3JlZW4uY29kZSgpLFxuICAgICAgVW5hYmxlVG9DYXB0dXJlU2NyZWVuLnczY1N0YXR1cygpLFxuICAgICAgVW5hYmxlVG9DYXB0dXJlU2NyZWVuLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbi8vIEVxdWl2YWxlbnQgdG8gVzNDIEludmFsaWRBcmd1bWVudEVycm9yXG5leHBvcnQgY2xhc3MgQmFkUGFyYW1ldGVyc0Vycm9yIGV4dGVuZHMgRVM2RXJyb3Ige1xuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIGFyZ3VtZW50JztcbiAgfVxuICBjb25zdHJ1Y3RvcihyZXF1aXJlZFBhcmFtcywgYWN0dWFsUGFyYW1zLCBlcnJNZXNzYWdlKSB7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgaWYgKCFlcnJNZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlID1cbiAgICAgICAgYFBhcmFtZXRlcnMgd2VyZSBpbmNvcnJlY3QuIFdlIHdhbnRlZCBgICtcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocmVxdWlyZWRQYXJhbXMpfSBhbmQgeW91IGAgK1xuICAgICAgICBgc2VudCAke0pTT04uc3RyaW5naWZ5KGFjdHVhbFBhcmFtcyl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZSA9IGBQYXJhbWV0ZXJzIHdlcmUgaW5jb3JyZWN0LiBZb3Ugc2VudCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBhY3R1YWxQYXJhbXNcbiAgICAgICl9LCAke2Vyck1lc3NhZ2V9YDtcbiAgICB9XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy53M2NTdGF0dXMgPSBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1Q7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm94eVJlcXVlc3RFcnJvciBpcyBhIGN1c3RvbSBlcnJvciBhbmQgd2lsbCBiZSB0aHJvd24gdXAgb24gdW5zdWNjZXNzZnVsIHByb3h5IHJlcXVlc3QgYW5kXG4gKiB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3h5IGZhaWx1cmUuXG4gKiBJbiBjYXNlIG9mIFByb3h5UmVxdWVzdEVycm9yIHNob3VsZCBmZXRjaCB0aGUgYWN0dWFsIGVycm9yIGJ5IGNhbGxpbmcgYGdldEFjdHVhbEVycm9yKClgXG4gKiBmb3IgcHJveHkgZmFpbHVyZSB0byBnZW5lcmF0ZSB0aGUgY2xpZW50IHJlc3BvbnNlLlxuICovXG5leHBvcnQgY2xhc3MgUHJveHlSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFUzZFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGVyciwgcmVzcG9uc2VFcnJvciwgaHR0cFN0YXR1cykge1xuICAgIGxldCByZXNwb25zZUVycm9yT2JqID0gdXRpbC5zYWZlSnNvblBhcnNlKHJlc3BvbnNlRXJyb3IpO1xuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KHJlc3BvbnNlRXJyb3JPYmopKSB7XG4gICAgICByZXNwb25zZUVycm9yT2JqID0ge307XG4gICAgfVxuICAgIGxldCBvcmlnTWVzc2FnZSA9IF8uaXNTdHJpbmcocmVzcG9uc2VFcnJvcikgPyByZXNwb25zZUVycm9yIDogJyc7XG4gICAgaWYgKCFfLmlzRW1wdHkocmVzcG9uc2VFcnJvck9iaikpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHJlc3BvbnNlRXJyb3JPYmoudmFsdWUpKSB7XG4gICAgICAgIG9yaWdNZXNzYWdlID0gcmVzcG9uc2VFcnJvck9iai52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIF8uaXNQbGFpbk9iamVjdChyZXNwb25zZUVycm9yT2JqLnZhbHVlKSAmJlxuICAgICAgICBfLmlzU3RyaW5nKHJlc3BvbnNlRXJyb3JPYmoudmFsdWUubWVzc2FnZSlcbiAgICAgICkge1xuICAgICAgICBvcmlnTWVzc2FnZSA9IHJlc3BvbnNlRXJyb3JPYmoudmFsdWUubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIoXy5pc0VtcHR5KGVycikgPyBgUHJveHkgcmVxdWVzdCB1bnN1Y2Nlc3NmdWwuICR7b3JpZ01lc3NhZ2V9YCA6IGVycik7XG5cbiAgICB0aGlzLnczY1N0YXR1cyA9IEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcblxuICAgIC8vIElmIHRoZSByZXNwb25zZSBlcnJvciBpcyBhbiBvYmplY3QgYW5kIHZhbHVlIGlzIGFuIG9iamVjdCwgaXQncyBhIFczQyBlcnJvciAoZm9yIEpTT05XUCB2YWx1ZSBpcyBhIHN0cmluZylcbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHJlc3BvbnNlRXJyb3JPYmoudmFsdWUpICYmIF8uaGFzKHJlc3BvbnNlRXJyb3JPYmoudmFsdWUsICdlcnJvcicpKSB7XG4gICAgICB0aGlzLnczYyA9IHJlc3BvbnNlRXJyb3JPYmoudmFsdWU7XG4gICAgICB0aGlzLnczY1N0YXR1cyA9IGh0dHBTdGF0dXMgfHwgSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmpzb253cCA9IHJlc3BvbnNlRXJyb3JPYmo7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0dWFsRXJyb3IoKSB7XG4gICAgLy8gSWYgaXQncyBNSlNPTldQIGVycm9yLCByZXR1cm5zIGFjdHVhbCBlcnJvciBjYXVzZSBmb3IgcmVxdWVzdCBmYWlsdXJlIGJhc2VkIG9uIGBqc29ud3Auc3RhdHVzYFxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMuanNvbndwPy5zdGF0dXMpICYmIHV0aWwuaGFzVmFsdWUodGhpcy5qc29ud3A/LnZhbHVlKSkge1xuICAgICAgcmV0dXJuIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKHRoaXMuanNvbndwLnN0YXR1cywgdGhpcy5qc29ud3AudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLnczYykgJiYgXy5pc051bWJlcih0aGlzLnczY1N0YXR1cykgJiYgdGhpcy53M2NTdGF0dXMgPj0gMzAwKSB7XG4gICAgICByZXR1cm4gZXJyb3JGcm9tVzNDSnNvbkNvZGUoXG4gICAgICAgIHRoaXMudzNjLmVycm9yLFxuICAgICAgICB0aGlzLnczYy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgdGhpcy53M2Muc3RhY2t0cmFjZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3IodGhpcy5tZXNzYWdlKTtcbiAgfVxufVxuLy8gbWFwIG9mIGVycm9yIGNsYXNzIG5hbWUgdG8gZXJyb3IgY2xhc3NcbmNvbnN0IGVycm9ycyA9IHtcbiAgTm90WWV0SW1wbGVtZW50ZWRFcnJvcixcbiAgTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgQmFkUGFyYW1ldGVyc0Vycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgTm9TdWNoRHJpdmVyRXJyb3IsXG4gIE5vU3VjaEVsZW1lbnRFcnJvcixcbiAgVW5rbm93bkNvbW1hbmRFcnJvcixcbiAgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IsXG4gIEVsZW1lbnROb3RWaXNpYmxlRXJyb3IsXG4gIEludmFsaWRFbGVtZW50U3RhdGVFcnJvcixcbiAgVW5rbm93bkVycm9yLFxuICBFbGVtZW50SXNOb3RTZWxlY3RhYmxlRXJyb3IsXG4gIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3IsXG4gIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvcixcbiAgSW5zZWN1cmVDZXJ0aWZpY2F0ZUVycm9yLFxuICBKYXZhU2NyaXB0RXJyb3IsXG4gIFhQYXRoTG9va3VwRXJyb3IsXG4gIFRpbWVvdXRFcnJvcixcbiAgTm9TdWNoV2luZG93RXJyb3IsXG4gIE5vU3VjaENvb2tpZUVycm9yLFxuICBJbnZhbGlkQ29va2llRG9tYWluRXJyb3IsXG4gIEludmFsaWRDb29yZGluYXRlc0Vycm9yLFxuICBVbmFibGVUb1NldENvb2tpZUVycm9yLFxuICBVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3IsXG4gIE5vQWxlcnRPcGVuRXJyb3IsXG4gIFNjcmlwdFRpbWVvdXRFcnJvcixcbiAgSW52YWxpZEVsZW1lbnRDb29yZGluYXRlc0Vycm9yLFxuICBJTUVOb3RBdmFpbGFibGVFcnJvcixcbiAgSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yLFxuICBJbnZhbGlkU2VsZWN0b3JFcnJvcixcbiAgU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcixcbiAgTW92ZVRhcmdldE91dE9mQm91bmRzRXJyb3IsXG4gIE5vU3VjaEFsZXJ0RXJyb3IsXG4gIE5vU3VjaENvbnRleHRFcnJvcixcbiAgSW52YWxpZENvbnRleHRFcnJvcixcbiAgTm9TdWNoRnJhbWVFcnJvcixcbiAgVW5hYmxlVG9DYXB0dXJlU2NyZWVuLFxuICBVbmtub3duTWV0aG9kRXJyb3IsXG4gIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IsXG4gIFByb3h5UmVxdWVzdEVycm9yLFxufTtcblxuLy8gbWFwIG9mIGVycm9yIGNvZGUgdG8gZXJyb3IgY2xhc3NcbmNvbnN0IGpzb253cEVycm9yQ29kZU1hcCA9IHt9O1xuZm9yIChsZXQgRXJyb3JDbGFzcyBvZiBfLnZhbHVlcyhlcnJvcnMpKSB7XG4gIGlmICgnY29kZScgaW4gRXJyb3JDbGFzcykge1xuICAgIGpzb253cEVycm9yQ29kZU1hcFtFcnJvckNsYXNzLmNvZGUoKV0gPSBFcnJvckNsYXNzO1xuICB9XG59XG5cbmNvbnN0IHczY0Vycm9yQ29kZU1hcCA9IHt9O1xuZm9yIChsZXQgRXJyb3JDbGFzcyBvZiBfLnZhbHVlcyhlcnJvcnMpKSB7XG4gIGlmICgnZXJyb3InIGluIEVycm9yQ2xhc3MpIHtcbiAgICB3M2NFcnJvckNvZGVNYXBbRXJyb3JDbGFzcy5lcnJvcigpXSA9IEVycm9yQ2xhc3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNVbmtub3duRXJyb3IoZXJyKSB7XG4gIHJldHVybiAoXG4gICAgIWVyci5jb25zdHJ1Y3Rvci5uYW1lIHx8XG4gICAgIV8udmFsdWVzKGVycm9ycykuZmluZChmdW5jdGlvbiBlcXVhbE5hbWVzKGVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3IubmFtZSA9PT0gZXJyLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNFcnJvclR5cGUoZXJyLCB0eXBlKSB7XG4gIC8vIGBuYW1lYCBwcm9wZXJ0eSBpcyB0aGUgY29uc3RydWN0b3IgbmFtZVxuICBpZiAodHlwZS5uYW1lID09PSBQcm90b2NvbEVycm9yLm5hbWUpIHtcbiAgICAvLyBganNvbndwQ29kZWAgaXMgYDBgIG9uIHN1Y2Nlc3NcbiAgICByZXR1cm4gISFlcnIuanNvbndwQ29kZTtcbiAgfSBlbHNlIGlmICh0eXBlLm5hbWUgPT09IFByb3h5UmVxdWVzdEVycm9yLm5hbWUpIHtcbiAgICAvLyBgc3RhdHVzYCBpcyBgMGAgb24gc3VjY2Vzc1xuICAgIGlmIChlcnIuanNvbndwKSB7XG4gICAgICByZXR1cm4gISFlcnIuanNvbndwLnN0YXR1cztcbiAgICB9XG5cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGVyci53M2MpKSB7XG4gICAgICByZXR1cm4gXy5pc051bWJlcihlcnIudzNjU3RhdHVzKSAmJiBlcnIudzNjU3RhdHVzID49IDMwMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGVyci5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWU7XG59XG5cbi8qKlxuICogUmV0cmlldmUgYW4gZXJyb3IgZGVyaXZlZCBmcm9tIE1KU09OV1Agc3RhdHVzXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZSBKU09OV1Agc3RhdHVzIGNvZGVcbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gdmFsdWUgVGhlIGVycm9yIG1lc3NhZ2UsIG9yIGFuIG9iamVjdCB3aXRoIGEgYG1lc3NhZ2VgIHByb3BlcnR5XG4gKiBAcmV0dXJuIHtQcm90b2NvbEVycm9yfSBUaGUgZXJyb3IgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggcHJvdmlkZWQgSlNPTldQIHN0YXR1cyBjb2RlXG4gKi9cbmZ1bmN0aW9uIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGNvZGUsIHZhbHVlID0gJycpIHtcbiAgLy8gaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIHB1bGwgbWVzc2FnZSBmcm9tIGl0LCBvdGhlcndpc2UgdXNlIHRoZSBwbGFpblxuICAvLyB2YWx1ZSwgb3IgZGVmYXVsdCB0byBhbiBlbXB0eSBzdHJpbmcsIGlmIG51bGxcbiAgY29uc3QgbWVzc2FnZSA9ICh2YWx1ZSB8fCB7fSkubWVzc2FnZSB8fCB2YWx1ZSB8fCAnJztcbiAgaWYgKGNvZGUgIT09IFVua25vd25FcnJvci5jb2RlKCkgJiYganNvbndwRXJyb3JDb2RlTWFwW2NvZGVdKSB7XG4gICAgbWpzb253cExvZy5kZWJ1ZyhgTWF0Y2hlZCBKU09OV1AgZXJyb3IgY29kZSAke2NvZGV9IHRvICR7anNvbndwRXJyb3JDb2RlTWFwW2NvZGVdLm5hbWV9YCk7XG4gICAgcmV0dXJuIG5ldyBqc29ud3BFcnJvckNvZGVNYXBbY29kZV0obWVzc2FnZSk7XG4gIH1cbiAgbWpzb253cExvZy5kZWJ1ZyhgTWF0Y2hlZCBKU09OV1AgZXJyb3IgY29kZSAke2NvZGV9IHRvIFVua25vd25FcnJvcmApO1xuICByZXR1cm4gbmV3IFVua25vd25FcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSBhbiBlcnJvciBkZXJpdmVkIGZyb20gVzNDIEpTT04gQ29kZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgVzNDIGVycm9yIHN0cmluZyAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2hhbmRsaW5nLWVycm9ycyBgSlNPTiBFcnJvciBDb2RlYCBjb2x1bW4pXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHs/c3RyaW5nfSBzdGFja3RyYWNlIGFuIG9wdGlvbmFsIGVycm9yIHN0YWNrdHJhY2VcbiAqIEByZXR1cm4ge1Byb3RvY29sRXJyb3J9ICBUaGUgZXJyb3IgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIFczQyBlcnJvciBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZXJyb3JGcm9tVzNDSnNvbkNvZGUoY29kZSwgbWVzc2FnZSwgc3RhY2t0cmFjZSA9IG51bGwpIHtcbiAgaWYgKGNvZGUgJiYgdzNjRXJyb3JDb2RlTWFwW2NvZGUudG9Mb3dlckNhc2UoKV0pIHtcbiAgICB3M2NMb2cuZGVidWcoYE1hdGNoZWQgVzNDIGVycm9yIGNvZGUgJyR7Y29kZX0nIHRvICR7dzNjRXJyb3JDb2RlTWFwW2NvZGUudG9Mb3dlckNhc2UoKV0ubmFtZX1gKTtcbiAgICBjb25zdCByZXN1bHRFcnJvciA9IG5ldyB3M2NFcnJvckNvZGVNYXBbY29kZS50b0xvd2VyQ2FzZSgpXShtZXNzYWdlKTtcbiAgICByZXN1bHRFcnJvci5zdGFja3RyYWNlID0gc3RhY2t0cmFjZTtcbiAgICByZXR1cm4gcmVzdWx0RXJyb3I7XG4gIH1cbiAgdzNjTG9nLmRlYnVnKGBNYXRjaGVkIFczQyBlcnJvciBjb2RlICcke2NvZGV9JyB0byBVbmtub3duRXJyb3JgKTtcbiAgY29uc3QgcmVzdWx0RXJyb3IgPSBuZXcgVW5rbm93bkVycm9yKG1lc3NhZ2UpO1xuICByZXN1bHRFcnJvci5zdGFja3RyYWNlID0gc3RhY2t0cmFjZTtcbiAgcmV0dXJuIHJlc3VsdEVycm9yO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gZXJyXG4gKiBAcmV0dXJucyB7ZXJyIGlzIFByb3RvY29sRXJyb3J9XG4gKi9cbmZ1bmN0aW9uIGlzUHJvdG9jb2xFcnJvcihlcnIpIHtcbiAgcmV0dXJuICd3M2NTdGF0dXMnIGluIGVycjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFwcGl1bSBlcnJvciB0byBwcm9wZXIgVzNDIEhUVFAgcmVzcG9uc2VcbiAqIEBwYXJhbSB7UHJvdG9jb2xFcnJvcnxNSlNPTldQRXJyb3J9IGVyciBUaGUgZXJyb3IgdGhhdCBuZWVkcyB0byBiZSB0cmFuc2xhdGVkXG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BvbnNlRm9yVzNDRXJyb3IoZXJyKSB7XG4gIGxldCBodHRwU3RhdHVzO1xuXG4gIC8vIFczQyBkZWZpbmVkIGVycm9yIG1lc3NhZ2UgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi1lcnJvci1jb2RlKVxuICBsZXQgdzNjRXJyb3JTdHJpbmc7XG5cbiAgaWYgKCFpc1Byb3RvY29sRXJyb3IoZXJyKSkge1xuICAgIGVyciA9IHV0aWwuaGFzVmFsdWUoZXJyLnN0YXR1cylcbiAgICAgID8gLy8gSWYgaXQncyBhIEpTT05XUCBlcnJvciwgZmluZCBjb3JyZXNwb25kaW5nIGVycm9yXG4gICAgICAgIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGVyci5zdGF0dXMsIGVyci52YWx1ZSlcbiAgICAgIDogbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICB9XG5cbiAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcikpIHtcbiAgICAvLyByZXNwb25kIHdpdGggYSA0MDAgaWYgd2UgaGF2ZSBiYWQgcGFyYW1ldGVyc1xuICAgIHczY0xvZy5kZWJ1ZyhgQmFkIHBhcmFtZXRlcnM6ICR7ZXJyfWApO1xuICAgIHczY0Vycm9yU3RyaW5nID0gQmFkUGFyYW1ldGVyc0Vycm9yLmVycm9yKCk7XG4gIH0gZWxzZSB7XG4gICAgdzNjRXJyb3JTdHJpbmcgPSBlcnIuZXJyb3I7XG4gIH1cblxuICBodHRwU3RhdHVzID0gZXJyLnczY1N0YXR1cztcblxuICBpZiAoIXczY0Vycm9yU3RyaW5nKSB7XG4gICAgdzNjRXJyb3JTdHJpbmcgPSBVbmtub3duRXJyb3IuZXJyb3IoKTtcbiAgfVxuXG4gIGxldCBodHRwUmVzQm9keSA9IHtcbiAgICB2YWx1ZToge1xuICAgICAgZXJyb3I6IHczY0Vycm9yU3RyaW5nLFxuICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICBzdGFja3RyYWNlOiBlcnIuc3RhY2t0cmFjZSB8fCBlcnIuc3RhY2ssXG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIFtodHRwU3RhdHVzLCBodHRwUmVzQm9keV07XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBBcHBpdW0gZXJyb3IgdG8gYSBwcm9wZXIgSlNPTldQIHJlc3BvbnNlXG4gKiBAcGFyYW0ge1Byb3RvY29sRXJyb3J9IGVyciBUaGUgZXJyb3IgdG8gYmUgY29udmVydGVkXG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IoZXJyKSB7XG4gIGlmIChpc1Vua25vd25FcnJvcihlcnIpKSB7XG4gICAgZXJyID0gbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoZXJyKTtcbiAgfVxuICAvLyBNSlNPTldQIGVycm9ycyBhcmUgdXN1YWxseSA1MDAgc3RhdHVzIGNvZGUgc28gc2V0IGl0IHRvIHRoYXQgYnkgZGVmYXVsdFxuICBsZXQgaHR0cFN0YXR1cyA9IEhUVFBTdGF0dXNDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG5cbiAgLyoqIEB0eXBlIHtIdHRwUmVzdWx0Qm9keX0gKi9cbiAgbGV0IGh0dHBSZXNCb2R5ID0ge1xuICAgIHN0YXR1czogZXJyLmpzb253cENvZGUsXG4gICAgdmFsdWU6IHtcbiAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgIH0sXG4gIH07XG5cbiAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcikpIHtcbiAgICAvLyByZXNwb25kIHdpdGggYSA0MDAgaWYgd2UgaGF2ZSBiYWQgcGFyYW1ldGVyc1xuICAgIG1qc29ud3BMb2cuZGVidWcoYEJhZCBwYXJhbWV0ZXJzOiAke2Vycn1gKTtcbiAgICBodHRwU3RhdHVzID0gSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICAgIGh0dHBSZXNCb2R5ID0gZXJyLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAoXG4gICAgaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcikgfHxcbiAgICBpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKVxuICApIHtcbiAgICAvLyByZXNwb25kIHdpdGggYSA1MDEgaWYgdGhlIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWRcbiAgICBodHRwU3RhdHVzID0gSFRUUFN0YXR1c0NvZGVzLk5PVF9JTVBMRU1FTlRFRDtcbiAgfSBlbHNlIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcikpIHtcbiAgICAvLyByZXNwb25kIHdpdGggYSA0MDQgaWYgdGhlcmUgaXMgbm8gZHJpdmVyIGZvciB0aGUgc2Vzc2lvblxuICAgIGh0dHBTdGF0dXMgPSBIVFRQU3RhdHVzQ29kZXMuTk9UX0ZPVU5EO1xuICB9XG5cbiAgcmV0dXJuIFtodHRwU3RhdHVzLCBodHRwUmVzQm9keV07XG59XG5cbmV4cG9ydCB7XG4gIGVycm9ycyxcbiAgaXNFcnJvclR5cGUsXG4gIGlzVW5rbm93bkVycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSxcbiAgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG4gIGdldFJlc3BvbnNlRm9yVzNDRXJyb3IsXG4gIGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgc3RyaW5nIHwge3ZhbHVlOiBIdHRwUmVzdWx0Qm9keVZhbHVlLCBzdGF0dXM/OiBudW1iZXIgfSB9IEh0dHBSZXN1bHRCb2R5XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdHRwUmVzdWx0Qm9keVZhbHVlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21lc3NhZ2VdXG4gKiBAcHJvcGVydHkge3N0cmluZ3xFcnJvcn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzdGFja3RyYWNlXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTUpTT05XUEVycm9yXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3RhdHVzXG4gKiBAcHJvcGVydHkge3N0cmluZ3xvYmplY3R9IHZhbHVlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZVxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFVBQVUsR0FBR0MsZUFBQSxDQUFPQyxTQUFQLENBQWlCLFNBQWpCLENBQW5COztBQUNBLE1BQU1DLE1BQU0sR0FBR0YsZUFBQSxDQUFPQyxTQUFQLENBQWlCLEtBQWpCLENBQWY7O0FBRUEsTUFBTUUsaUJBQWlCLEdBQUcsZUFBMUI7O0FBR08sTUFBTUMsYUFBTixTQUE0QkMsaUJBQTVCLENBQXFDO0VBQzFDQyxXQUFXLENBQUNDLEdBQUQsRUFBTUMsVUFBTixFQUFrQkMsU0FBbEIsRUFBNkJDLEtBQTdCLEVBQW9DO0lBQzdDLE1BQU1ILEdBQU47SUFDQSxLQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtJQUNBLEtBQUtFLEtBQUwsR0FBYUEsS0FBSyxJQUFJUCxpQkFBdEI7O0lBQ0EsSUFBSSxLQUFLSyxVQUFMLEtBQW9CLElBQXhCLEVBQThCO01BQzVCLEtBQUtBLFVBQUwsR0FBa0IsRUFBbEI7SUFDRDs7SUFDRCxLQUFLQyxTQUFMLEdBQWlCQSxTQUFTLElBQUlFLDRCQUFBLENBQWdCQyxX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
925
+ if (isUnknownError(err)) {
926
+ err = new errors.UnknownError(err);
927
+ }
928
+ // MJSONWP errors are usually 500 status code so set it to that by default
929
+ let httpStatus = http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
930
+ /** @type {HttpResultBody} */
931
+ let httpResBody = {
932
+ status: err.jsonwpCode,
933
+ value: {
934
+ message: err.message,
935
+ },
936
+ };
937
+ if (isErrorType(err, errors.BadParametersError)) {
938
+ // respond with a 400 if we have bad parameters
939
+ mjsonwpLog.debug(`Bad parameters: ${err}`);
940
+ httpStatus = http_status_codes_1.StatusCodes.BAD_REQUEST;
941
+ httpResBody = err.message;
942
+ }
943
+ else if (isErrorType(err, errors.NotYetImplementedError) ||
944
+ isErrorType(err, errors.NotImplementedError)) {
945
+ // respond with a 501 if the method is not implemented
946
+ httpStatus = http_status_codes_1.StatusCodes.NOT_IMPLEMENTED;
947
+ }
948
+ else if (isErrorType(err, errors.NoSuchDriverError)) {
949
+ // respond with a 404 if there is no driver for the session
950
+ httpStatus = http_status_codes_1.StatusCodes.NOT_FOUND;
951
+ }
952
+ return [httpStatus, httpResBody];
953
+ }
954
+ exports.getResponseForJsonwpError = getResponseForJsonwpError;
955
+ /**
956
+ * @typedef { string | {value: HttpResultBodyValue, status?: number } } HttpResultBody
957
+ */
958
+ /**
959
+ * @typedef HttpResultBodyValue
960
+ * @property {string} [message]
961
+ * @property {string|Error} [error]
962
+ * @property {string} [stacktrace]
963
+ */
964
+ /**
965
+ * @typedef MJSONWPError
966
+ * @property {number} status
967
+ * @property {string|object} value
968
+ * @property {string} message
969
+ */
970
+ //# sourceMappingURL=errors.js.map