@appium/base-driver 8.7.3 → 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 +11 -262
  46. package/build/lib/basedriver/driver.d.ts.map +1 -1
  47. package/build/lib/basedriver/driver.js +362 -262
  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 +12 -16
  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,193 +1,141 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.handleIdempotency = handleIdempotency;
7
-
8
- require("source-map-support/register");
9
-
10
- var _logger = _interopRequireDefault(require("./logger"));
11
-
12
- var _lruCache = _interopRequireDefault(require("lru-cache"));
13
-
14
- var _support = require("@appium/support");
15
-
16
- var _os = _interopRequireDefault(require("os"));
17
-
18
- var _path = _interopRequireDefault(require("path"));
19
-
20
- var _events = require("events");
21
-
22
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
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.handleIdempotency = void 0;
7
+ const logger_1 = __importDefault(require("./logger"));
8
+ const lru_cache_1 = __importDefault(require("lru-cache"));
9
+ const support_1 = require("@appium/support");
10
+ const os_1 = __importDefault(require("os"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const events_1 = require("events");
24
13
  const CACHE_SIZE = 1024;
25
- const IDEMPOTENT_RESPONSES = new _lruCache.default({
26
- max: CACHE_SIZE,
27
- updateAgeOnGet: true,
28
-
29
- dispose(key, {
30
- response
31
- }) {
32
- if (response) {
33
- _support.fs.rimrafSync(response);
34
- }
35
- }
36
-
14
+ const IDEMPOTENT_RESPONSES = new lru_cache_1.default({
15
+ max: CACHE_SIZE,
16
+ updateAgeOnGet: true,
17
+ dispose(key, { response }) {
18
+ if (response) {
19
+ support_1.fs.rimrafSync(response);
20
+ }
21
+ },
37
22
  });
38
23
  const MONITORED_METHODS = ['POST', 'PATCH'];
39
24
  const IDEMPOTENCY_KEY_HEADER = 'x-idempotency-key';
40
25
  process.on('exit', () => {
41
- const resPaths = [...IDEMPOTENT_RESPONSES.values()].map(({
42
- response
43
- }) => response).filter(Boolean);
44
-
45
- for (const resPath of resPaths) {
46
- try {
47
- _support.fs.rimrafSync(resPath);
48
- } catch (ign) {}
49
- }
26
+ const resPaths = [...IDEMPOTENT_RESPONSES.values()].map(({ response }) => response).filter(Boolean);
27
+ for (const resPath of resPaths) {
28
+ try {
29
+ // Asynchronous calls are not supported in onExit handler
30
+ support_1.fs.rimrafSync(resPath);
31
+ }
32
+ catch (ign) { }
33
+ }
50
34
  });
51
-
52
35
  function cacheResponse(key, req, res) {
53
- const responseStateListener = new _events.EventEmitter();
54
- IDEMPOTENT_RESPONSES.set(key, {
55
- method: req.method,
56
- path: req.path,
57
- response: null,
58
- responseStateListener
59
- });
60
-
61
- const tmpFile = _path.default.resolve(_os.default.tmpdir(), `${_support.util.uuidV4()}.response`);
62
-
63
- const responseListener = _support.fs.createWriteStream(tmpFile, {
64
- emitClose: true
65
- });
66
-
67
- const originalSocketWriter = res.socket.write.bind(res.socket);
68
-
69
- const patchedWriter = (chunk, encoding, next) => {
70
- if (responseListener.writable) {
71
- responseListener.write(chunk);
72
- }
73
-
74
- return originalSocketWriter(chunk, encoding, next);
75
- };
76
-
77
- res.socket.write = patchedWriter;
78
- let writeError = null;
79
- let isResponseFullySent = false;
80
- responseListener.once('error', e => {
81
- writeError = e;
82
- });
83
- res.once('finish', () => {
84
- isResponseFullySent = true;
85
- responseListener.end();
86
- });
87
- res.once('close', () => {
88
- if (!isResponseFullySent) {
89
- responseListener.end();
36
+ const responseStateListener = new events_1.EventEmitter();
37
+ IDEMPOTENT_RESPONSES.set(key, {
38
+ method: req.method,
39
+ path: req.path,
40
+ response: null,
41
+ responseStateListener,
42
+ });
43
+ const tmpFile = path_1.default.resolve(os_1.default.tmpdir(), `${support_1.util.uuidV4()}.response`);
44
+ const responseListener = support_1.fs.createWriteStream(tmpFile, {
45
+ emitClose: true,
46
+ });
47
+ const originalSocketWriter = res.socket.write.bind(res.socket);
48
+ const patchedWriter = (chunk, encoding, next) => {
49
+ if (responseListener.writable) {
50
+ responseListener.write(chunk);
51
+ }
52
+ return originalSocketWriter(chunk, encoding, next);
53
+ };
54
+ res.socket.write = patchedWriter;
55
+ let writeError = null;
56
+ let isResponseFullySent = false;
57
+ responseListener.once('error', (e) => {
58
+ writeError = e;
59
+ });
60
+ res.once('finish', () => {
61
+ isResponseFullySent = true;
62
+ responseListener.end();
63
+ });
64
+ res.once('close', () => {
65
+ if (!isResponseFullySent) {
66
+ responseListener.end();
67
+ }
68
+ });
69
+ responseListener.once('close', () => {
70
+ if (res.socket?.write === patchedWriter) {
71
+ res.socket.write = originalSocketWriter;
72
+ }
73
+ if (!IDEMPOTENT_RESPONSES.has(key)) {
74
+ logger_1.default.info(`Could not cache the response identified by '${key}'. ` +
75
+ `Cache consistency has been damaged`);
76
+ return responseStateListener.emit('ready', null);
77
+ }
78
+ if (writeError) {
79
+ logger_1.default.info(`Could not cache the response identified by '${key}': ${writeError.message}`);
80
+ IDEMPOTENT_RESPONSES.delete(key);
81
+ return responseStateListener.emit('ready', null);
82
+ }
83
+ if (!isResponseFullySent) {
84
+ logger_1.default.info(`Could not cache the response identified by '${key}', ` +
85
+ `because it has not been completed`);
86
+ logger_1.default.info('Does the client terminate connections too early?');
87
+ IDEMPOTENT_RESPONSES.delete(key);
88
+ return responseStateListener.emit('ready', null);
89
+ }
90
+ IDEMPOTENT_RESPONSES.get(key).response = tmpFile;
91
+ responseStateListener.emit('ready', tmpFile);
92
+ });
93
+ }
94
+ async function handleIdempotency(req, res, next) {
95
+ const key = req.headers[IDEMPOTENCY_KEY_HEADER];
96
+ if (!key) {
97
+ return next();
90
98
  }
91
- });
92
- responseListener.once('close', () => {
93
- var _res$socket;
94
-
95
- if (((_res$socket = res.socket) === null || _res$socket === void 0 ? void 0 : _res$socket.write) === patchedWriter) {
96
- res.socket.write = originalSocketWriter;
99
+ if (!MONITORED_METHODS.includes(req.method)) {
100
+ // GET, DELETE, etc. requests are idempotent by default
101
+ // there is no need to cache them
102
+ return next();
97
103
  }
98
-
104
+ logger_1.default.debug(`Request idempotency key: ${key}`);
99
105
  if (!IDEMPOTENT_RESPONSES.has(key)) {
100
- _logger.default.info(`Could not cache the response identified by '${key}'. ` + `Cache consistency has been damaged`);
101
-
102
- return responseStateListener.emit('ready', null);
106
+ cacheResponse(key, req, res);
107
+ return next();
103
108
  }
104
-
105
- if (writeError) {
106
- _logger.default.info(`Could not cache the response identified by '${key}': ${writeError.message}`);
107
-
108
- IDEMPOTENT_RESPONSES.delete(key);
109
- return responseStateListener.emit('ready', null);
109
+ const { method: storedMethod, path: storedPath, response, responseStateListener, } = IDEMPOTENT_RESPONSES.get(key);
110
+ if (req.method !== storedMethod || req.path !== storedPath) {
111
+ logger_1.default.warn(`Got two different requests with the same idempotency key '${key}'`);
112
+ logger_1.default.warn('Is the client generating idempotency keys properly?');
113
+ return next();
110
114
  }
111
-
112
- if (!isResponseFullySent) {
113
- _logger.default.info(`Could not cache the response identified by '${key}', ` + `because it has not been completed`);
114
-
115
- _logger.default.info('Does the client terminate connections too early?');
116
-
117
- IDEMPOTENT_RESPONSES.delete(key);
118
- return responseStateListener.emit('ready', null);
115
+ const rerouteCachedResponse = async (cachedResPath) => {
116
+ if (!(await support_1.fs.exists(cachedResPath))) {
117
+ IDEMPOTENT_RESPONSES.delete(key);
118
+ logger_1.default.warn(`Could not read the cached response identified by key '${key}'`);
119
+ logger_1.default.warn('The temporary storage is not accessible anymore');
120
+ return next();
121
+ }
122
+ support_1.fs.createReadStream(cachedResPath).pipe(res.socket);
123
+ };
124
+ if (response) {
125
+ logger_1.default.info(`The same request with the idempotency key '${key}' has been already processed`);
126
+ logger_1.default.info(`Rerouting its response to the current request`);
127
+ await rerouteCachedResponse(response);
119
128
  }
120
-
121
- IDEMPOTENT_RESPONSES.get(key).response = tmpFile;
122
- responseStateListener.emit('ready', tmpFile);
123
- });
124
- }
125
-
126
- async function handleIdempotency(req, res, next) {
127
- const key = req.headers[IDEMPOTENCY_KEY_HEADER];
128
-
129
- if (!key) {
130
- return next();
131
- }
132
-
133
- if (!MONITORED_METHODS.includes(req.method)) {
134
- return next();
135
- }
136
-
137
- _logger.default.debug(`Request idempotency key: ${key}`);
138
-
139
- if (!IDEMPOTENT_RESPONSES.has(key)) {
140
- cacheResponse(key, req, res);
141
- return next();
142
- }
143
-
144
- const {
145
- method: storedMethod,
146
- path: storedPath,
147
- response,
148
- responseStateListener
149
- } = IDEMPOTENT_RESPONSES.get(key);
150
-
151
- if (req.method !== storedMethod || req.path !== storedPath) {
152
- _logger.default.warn(`Got two different requests with the same idempotency key '${key}'`);
153
-
154
- _logger.default.warn('Is the client generating idempotency keys properly?');
155
-
156
- return next();
157
- }
158
-
159
- const rerouteCachedResponse = async cachedResPath => {
160
- if (!(await _support.fs.exists(cachedResPath))) {
161
- IDEMPOTENT_RESPONSES.delete(key);
162
-
163
- _logger.default.warn(`Could not read the cached response identified by key '${key}'`);
164
-
165
- _logger.default.warn('The temporary storage is not accessible anymore');
166
-
167
- return next();
129
+ else {
130
+ logger_1.default.info(`The same request with the idempotency key '${key}' is being processed`);
131
+ logger_1.default.info(`Waiting for the response to be rerouted to the current request`);
132
+ responseStateListener.once('ready', async (cachedResponsePath) => {
133
+ if (!cachedResponsePath) {
134
+ return next();
135
+ }
136
+ await rerouteCachedResponse(cachedResponsePath);
137
+ });
168
138
  }
169
-
170
- _support.fs.createReadStream(cachedResPath).pipe(res.socket);
171
- };
172
-
173
- if (response) {
174
- _logger.default.info(`The same request with the idempotency key '${key}' has been already processed`);
175
-
176
- _logger.default.info(`Rerouting its response to the current request`);
177
-
178
- await rerouteCachedResponse(response);
179
- } else {
180
- _logger.default.info(`The same request with the idempotency key '${key}' is being processed`);
181
-
182
- _logger.default.info(`Waiting for the response to be rerouted to the current request`);
183
-
184
- responseStateListener.once('ready', async cachedResponsePath => {
185
- if (!cachedResponsePath) {
186
- return next();
187
- }
188
-
189
- await rerouteCachedResponse(cachedResponsePath);
190
- });
191
- }
192
139
  }
193
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDQUNIRV9TSVpFIiwiSURFTVBPVEVOVF9SRVNQT05TRVMiLCJMUlUiLCJtYXgiLCJ1cGRhdGVBZ2VPbkdldCIsImRpc3Bvc2UiLCJrZXkiLCJyZXNwb25zZSIsImZzIiwicmltcmFmU3luYyIsIk1PTklUT1JFRF9NRVRIT0RTIiwiSURFTVBPVEVOQ1lfS0VZX0hFQURFUiIsInByb2Nlc3MiLCJvbiIsInJlc1BhdGhzIiwidmFsdWVzIiwibWFwIiwiZmlsdGVyIiwiQm9vbGVhbiIsInJlc1BhdGgiLCJpZ24iLCJjYWNoZVJlc3BvbnNlIiwicmVxIiwicmVzIiwicmVzcG9uc2VTdGF0ZUxpc3RlbmVyIiwiRXZlbnRFbWl0dGVyIiwic2V0IiwibWV0aG9kIiwicGF0aCIsInRtcEZpbGUiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ1dGlsIiwidXVpZFY0IiwicmVzcG9uc2VMaXN0ZW5lciIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiZW1pdENsb3NlIiwib3JpZ2luYWxTb2NrZXRXcml0ZXIiLCJzb2NrZXQiLCJ3cml0ZSIsImJpbmQiLCJwYXRjaGVkV3JpdGVyIiwiY2h1bmsiLCJlbmNvZGluZyIsIm5leHQiLCJ3cml0YWJsZSIsIndyaXRlRXJyb3IiLCJpc1Jlc3BvbnNlRnVsbHlTZW50Iiwib25jZSIsImUiLCJlbmQiLCJoYXMiLCJsb2ciLCJpbmZvIiwiZW1pdCIsIm1lc3NhZ2UiLCJkZWxldGUiLCJnZXQiLCJoYW5kbGVJZGVtcG90ZW5jeSIsImhlYWRlcnMiLCJpbmNsdWRlcyIsImRlYnVnIiwic3RvcmVkTWV0aG9kIiwic3RvcmVkUGF0aCIsIndhcm4iLCJyZXJvdXRlQ2FjaGVkUmVzcG9uc2UiLCJjYWNoZWRSZXNQYXRoIiwiZXhpc3RzIiwiY3JlYXRlUmVhZFN0cmVhbSIsInBpcGUiLCJjYWNoZWRSZXNwb25zZVBhdGgiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXhwcmVzcy9pZGVtcG90ZW5jeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7ZnMsIHV0aWx9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcblxuY29uc3QgQ0FDSEVfU0laRSA9IDEwMjQ7XG5jb25zdCBJREVNUE9URU5UX1JFU1BPTlNFUyA9IG5ldyBMUlUoe1xuICBtYXg6IENBQ0hFX1NJWkUsXG4gIHVwZGF0ZUFnZU9uR2V0OiB0cnVlLFxuICBkaXNwb3NlKGtleSwge3Jlc3BvbnNlfSkge1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgZnMucmltcmFmU3luYyhyZXNwb25zZSk7XG4gICAgfVxuICB9LFxufSk7XG5jb25zdCBNT05JVE9SRURfTUVUSE9EUyA9IFsnUE9TVCcsICdQQVRDSCddO1xuY29uc3QgSURFTVBPVEVOQ1lfS0VZX0hFQURFUiA9ICd4LWlkZW1wb3RlbmN5LWtleSc7XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGNvbnN0IHJlc1BhdGhzID0gWy4uLklERU1QT1RFTlRfUkVTUE9OU0VTLnZhbHVlcygpXS5tYXAoKHtyZXNwb25zZX0pID0+IHJlc3BvbnNlKS5maWx0ZXIoQm9vbGVhbik7XG4gIGZvciAoY29uc3QgcmVzUGF0aCBvZiByZXNQYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luY2hyb25vdXMgY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gb25FeGl0IGhhbmRsZXJcbiAgICAgIGZzLnJpbXJhZlN5bmMocmVzUGF0aCk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG59KTtcblxuZnVuY3Rpb24gY2FjaGVSZXNwb25zZShrZXksIHJlcSwgcmVzKSB7XG4gIGNvbnN0IHJlc3BvbnNlU3RhdGVMaXN0ZW5lciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgSURFTVBPVEVOVF9SRVNQT05TRVMuc2V0KGtleSwge1xuICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICBwYXRoOiByZXEucGF0aCxcbiAgICByZXNwb25zZTogbnVsbCxcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIsXG4gIH0pO1xuICBjb25zdCB0bXBGaWxlID0gcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCBgJHt1dGlsLnV1aWRWNCgpfS5yZXNwb25zZWApO1xuICBjb25zdCByZXNwb25zZUxpc3RlbmVyID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odG1wRmlsZSwge1xuICAgIGVtaXRDbG9zZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IG9yaWdpbmFsU29ja2V0V3JpdGVyID0gcmVzLnNvY2tldC53cml0ZS5iaW5kKHJlcy5zb2NrZXQpO1xuICBjb25zdCBwYXRjaGVkV3JpdGVyID0gKGNodW5rLCBlbmNvZGluZywgbmV4dCkgPT4ge1xuICAgIGlmIChyZXNwb25zZUxpc3RlbmVyLndyaXRhYmxlKSB7XG4gICAgICByZXNwb25zZUxpc3RlbmVyLndyaXRlKGNodW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsU29ja2V0V3JpdGVyKGNodW5rLCBlbmNvZGluZywgbmV4dCk7XG4gIH07XG4gIHJlcy5zb2NrZXQud3JpdGUgPSBwYXRjaGVkV3JpdGVyO1xuICBsZXQgd3JpdGVFcnJvciA9IG51bGw7XG4gIGxldCBpc1Jlc3BvbnNlRnVsbHlTZW50ID0gZmFsc2U7XG4gIHJlc3BvbnNlTGlzdGVuZXIub25jZSgnZXJyb3InLCAoZSkgPT4ge1xuICAgIHdyaXRlRXJyb3IgPSBlO1xuICB9KTtcbiAgcmVzLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICBpc1Jlc3BvbnNlRnVsbHlTZW50ID0gdHJ1ZTtcbiAgICByZXNwb25zZUxpc3RlbmVyLmVuZCgpO1xuICB9KTtcbiAgcmVzLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghaXNSZXNwb25zZUZ1bGx5U2VudCkge1xuICAgICAgcmVzcG9uc2VMaXN0ZW5lci5lbmQoKTtcbiAgICB9XG4gIH0pO1xuICByZXNwb25zZUxpc3RlbmVyLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmIChyZXMuc29ja2V0Py53cml0ZSA9PT0gcGF0Y2hlZFdyaXRlcikge1xuICAgICAgcmVzLnNvY2tldC53cml0ZSA9IG9yaWdpbmFsU29ja2V0V3JpdGVyO1xuICAgIH1cblxuICAgIGlmICghSURFTVBPVEVOVF9SRVNQT05TRVMuaGFzKGtleSkpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nLiBgICtcbiAgICAgICAgICBgQ2FjaGUgY29uc2lzdGVuY3kgaGFzIGJlZW4gZGFtYWdlZGBcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzcG9uc2VTdGF0ZUxpc3RlbmVyLmVtaXQoJ3JlYWR5JywgbnVsbCk7XG4gICAgfVxuICAgIGlmICh3cml0ZUVycm9yKSB7XG4gICAgICBsb2cuaW5mbyhgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nOiAke3dyaXRlRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlU3RhdGVMaXN0ZW5lci5lbWl0KCdyZWFkeScsIG51bGwpO1xuICAgIH1cbiAgICBpZiAoIWlzUmVzcG9uc2VGdWxseVNlbnQpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nLCBgICtcbiAgICAgICAgICBgYmVjYXVzZSBpdCBoYXMgbm90IGJlZW4gY29tcGxldGVkYFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKCdEb2VzIHRoZSBjbGllbnQgdGVybWluYXRlIGNvbm5lY3Rpb25zIHRvbyBlYXJseT8nKTtcbiAgICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlU3RhdGVMaXN0ZW5lci5lbWl0KCdyZWFkeScsIG51bGwpO1xuICAgIH1cblxuICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmdldChrZXkpLnJlc3BvbnNlID0gdG1wRmlsZTtcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIuZW1pdCgncmVhZHknLCB0bXBGaWxlKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUlkZW1wb3RlbmN5KHJlcSwgcmVzLCBuZXh0KSB7XG4gIGNvbnN0IGtleSA9IHJlcS5oZWFkZXJzW0lERU1QT1RFTkNZX0tFWV9IRUFERVJdO1xuICBpZiAoIWtleSkge1xuICAgIHJldHVybiBuZXh0KCk7XG4gIH1cbiAgaWYgKCFNT05JVE9SRURfTUVUSE9EUy5pbmNsdWRlcyhyZXEubWV0aG9kKSkge1xuICAgIC8vIEdFVCwgREVMRVRFLCBldGMuIHJlcXVlc3RzIGFyZSBpZGVtcG90ZW50IGJ5IGRlZmF1bHRcbiAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhY2hlIHRoZW1cbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBSZXF1ZXN0IGlkZW1wb3RlbmN5IGtleTogJHtrZXl9YCk7XG4gIGlmICghSURFTVBPVEVOVF9SRVNQT05TRVMuaGFzKGtleSkpIHtcbiAgICBjYWNoZVJlc3BvbnNlKGtleSwgcmVxLCByZXMpO1xuICAgIHJldHVybiBuZXh0KCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWV0aG9kOiBzdG9yZWRNZXRob2QsXG4gICAgcGF0aDogc3RvcmVkUGF0aCxcbiAgICByZXNwb25zZSxcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIsXG4gIH0gPSBJREVNUE9URU5UX1JFU1BPTlNFUy5nZXQoa2V5KTtcbiAgaWYgKHJlcS5tZXRob2QgIT09IHN0b3JlZE1ldGhvZCB8fCByZXEucGF0aCAhPT0gc3RvcmVkUGF0aCkge1xuICAgIGxvZy53YXJuKGBHb3QgdHdvIGRpZmZlcmVudCByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSAnJHtrZXl9J2ApO1xuICAgIGxvZy53YXJuKCdJcyB0aGUgY2xpZW50IGdlbmVyYXRpbmcgaWRlbXBvdGVuY3kga2V5cyBwcm9wZXJseT8nKTtcbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG5cbiAgY29uc3QgcmVyb3V0ZUNhY2hlZFJlc3BvbnNlID0gYXN5bmMgKGNhY2hlZFJlc1BhdGgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHMoY2FjaGVkUmVzUGF0aCkpKSB7XG4gICAgICBJREVNUE9URU5UX1JFU1BPTlNFUy5kZWxldGUoa2V5KTtcbiAgICAgIGxvZy53YXJuKGBDb3VsZCBub3QgcmVhZCB0aGUgY2FjaGVkIHJlc3BvbnNlIGlkZW50aWZpZWQgYnkga2V5ICcke2tleX0nYCk7XG4gICAgICBsb2cud2FybignVGhlIHRlbXBvcmFyeSBzdG9yYWdlIGlzIG5vdCBhY2Nlc3NpYmxlIGFueW1vcmUnKTtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuICAgIGZzLmNyZWF0ZVJlYWRTdHJlYW0oY2FjaGVkUmVzUGF0aCkucGlwZShyZXMuc29ja2V0KTtcbiAgfTtcblxuICBpZiAocmVzcG9uc2UpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHNhbWUgcmVxdWVzdCB3aXRoIHRoZSBpZGVtcG90ZW5jeSBrZXkgJyR7a2V5fScgaGFzIGJlZW4gYWxyZWFkeSBwcm9jZXNzZWRgKTtcbiAgICBsb2cuaW5mbyhgUmVyb3V0aW5nIGl0cyByZXNwb25zZSB0byB0aGUgY3VycmVudCByZXF1ZXN0YCk7XG4gICAgYXdhaXQgcmVyb3V0ZUNhY2hlZFJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgVGhlIHNhbWUgcmVxdWVzdCB3aXRoIHRoZSBpZGVtcG90ZW5jeSBrZXkgJyR7a2V5fScgaXMgYmVpbmcgcHJvY2Vzc2VkYCk7XG4gICAgbG9nLmluZm8oYFdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0byBiZSByZXJvdXRlZCB0byB0aGUgY3VycmVudCByZXF1ZXN0YCk7XG4gICAgcmVzcG9uc2VTdGF0ZUxpc3RlbmVyLm9uY2UoJ3JlYWR5JywgYXN5bmMgKGNhY2hlZFJlc3BvbnNlUGF0aCkgPT4ge1xuICAgICAgaWYgKCFjYWNoZWRSZXNwb25zZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJlcm91dGVDYWNoZWRSZXNwb25zZShjYWNoZWRSZXNwb25zZVBhdGgpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7aGFuZGxlSWRlbXBvdGVuY3l9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFVBQVUsR0FBRyxJQUFuQjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLElBQUlDLGlCQUFKLENBQVE7RUFDbkNDLEdBQUcsRUFBRUgsVUFEOEI7RUFFbkNJLGNBQWMsRUFBRSxJQUZtQjs7RUFHbkNDLE9BQU8sQ0FBQ0MsR0FBRCxFQUFNO0lBQUNDO0VBQUQsQ0FBTixFQUFrQjtJQUN2QixJQUFJQSxRQUFKLEVBQWM7TUFDWkMsV0FBQSxDQUFHQyxVQUFILENBQWNGLFFBQWQ7SUFDRDtFQUNGOztBQVBrQyxDQUFSLENBQTdCO0FBU0EsTUFBTUcsaUJBQWlCLEdBQUcsQ0FBQyxNQUFELEVBQVMsT0FBVCxDQUExQjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLG1CQUEvQjtBQUVBQyxPQUFPLENBQUNDLEVBQVIsQ0FBVyxNQUFYLEVBQW1CLE1BQU07RUFDdkIsTUFBTUMsUUFBUSxHQUFHLENBQUMsR0FBR2Isb0JBQW9CLENBQUNjLE1BQXJCLEVBQUosRUFBbUNDLEdBQW5DLENBQXVDLENBQUM7SUFBQ1Q7RUFBRCxDQUFELEtBQWdCQSxRQUF2RCxFQUFpRVUsTUFBakUsQ0FBd0VDLE9BQXhF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
140
+ exports.handleIdempotency = handleIdempotency;
141
+ //# sourceMappingURL=idempotency.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"idempotency.js","names":["CACHE_SIZE","IDEMPOTENT_RESPONSES","LRU","max","updateAgeOnGet","dispose","key","response","fs","rimrafSync","MONITORED_METHODS","IDEMPOTENCY_KEY_HEADER","process","on","resPaths","values","map","filter","Boolean","resPath","ign","cacheResponse","req","res","responseStateListener","EventEmitter","set","method","path","tmpFile","resolve","os","tmpdir","util","uuidV4","responseListener","createWriteStream","emitClose","originalSocketWriter","socket","write","bind","patchedWriter","chunk","encoding","next","writable","writeError","isResponseFullySent","once","e","end","has","log","info","emit","message","delete","get","handleIdempotency","headers","includes","debug","storedMethod","storedPath","warn","rerouteCachedResponse","cachedResPath","exists","createReadStream","pipe","cachedResponsePath"],"sources":["../../../lib/express/idempotency.js"],"sourcesContent":["import log from './logger';\nimport LRU from 'lru-cache';\nimport {fs, util} from '@appium/support';\nimport os from 'os';\nimport path from 'path';\nimport {EventEmitter} from 'events';\n\nconst CACHE_SIZE = 1024;\nconst IDEMPOTENT_RESPONSES = new LRU({\n max: CACHE_SIZE,\n updateAgeOnGet: true,\n dispose(key, {response}) {\n if (response) {\n fs.rimrafSync(response);\n }\n },\n});\nconst MONITORED_METHODS = ['POST', 'PATCH'];\nconst IDEMPOTENCY_KEY_HEADER = 'x-idempotency-key';\n\nprocess.on('exit', () => {\n const resPaths = [...IDEMPOTENT_RESPONSES.values()].map(({response}) => response).filter(Boolean);\n for (const resPath of resPaths) {\n try {\n // Asynchronous calls are not supported in onExit handler\n fs.rimrafSync(resPath);\n } catch (ign) {}\n }\n});\n\nfunction cacheResponse(key, req, res) {\n const responseStateListener = new EventEmitter();\n IDEMPOTENT_RESPONSES.set(key, {\n method: req.method,\n path: req.path,\n response: null,\n responseStateListener,\n });\n const tmpFile = path.resolve(os.tmpdir(), `${util.uuidV4()}.response`);\n const responseListener = fs.createWriteStream(tmpFile, {\n emitClose: true,\n });\n const originalSocketWriter = res.socket.write.bind(res.socket);\n const patchedWriter = (chunk, encoding, next) => {\n if (responseListener.writable) {\n responseListener.write(chunk);\n }\n return originalSocketWriter(chunk, encoding, next);\n };\n res.socket.write = patchedWriter;\n let writeError = null;\n let isResponseFullySent = false;\n responseListener.once('error', (e) => {\n writeError = e;\n });\n res.once('finish', () => {\n isResponseFullySent = true;\n responseListener.end();\n });\n res.once('close', () => {\n if (!isResponseFullySent) {\n responseListener.end();\n }\n });\n responseListener.once('close', () => {\n if (res.socket?.write === patchedWriter) {\n res.socket.write = originalSocketWriter;\n }\n\n if (!IDEMPOTENT_RESPONSES.has(key)) {\n log.info(\n `Could not cache the response identified by '${key}'. ` +\n `Cache consistency has been damaged`\n );\n return responseStateListener.emit('ready', null);\n }\n if (writeError) {\n log.info(`Could not cache the response identified by '${key}': ${writeError.message}`);\n IDEMPOTENT_RESPONSES.delete(key);\n return responseStateListener.emit('ready', null);\n }\n if (!isResponseFullySent) {\n log.info(\n `Could not cache the response identified by '${key}', ` +\n `because it has not been completed`\n );\n log.info('Does the client terminate connections too early?');\n IDEMPOTENT_RESPONSES.delete(key);\n return responseStateListener.emit('ready', null);\n }\n\n IDEMPOTENT_RESPONSES.get(key).response = tmpFile;\n responseStateListener.emit('ready', tmpFile);\n });\n}\n\nasync function handleIdempotency(req, res, next) {\n const key = req.headers[IDEMPOTENCY_KEY_HEADER];\n if (!key) {\n return next();\n }\n if (!MONITORED_METHODS.includes(req.method)) {\n // GET, DELETE, etc. requests are idempotent by default\n // there is no need to cache them\n return next();\n }\n\n log.debug(`Request idempotency key: ${key}`);\n if (!IDEMPOTENT_RESPONSES.has(key)) {\n cacheResponse(key, req, res);\n return next();\n }\n\n const {\n method: storedMethod,\n path: storedPath,\n response,\n responseStateListener,\n } = IDEMPOTENT_RESPONSES.get(key);\n if (req.method !== storedMethod || req.path !== storedPath) {\n log.warn(`Got two different requests with the same idempotency key '${key}'`);\n log.warn('Is the client generating idempotency keys properly?');\n return next();\n }\n\n const rerouteCachedResponse = async (cachedResPath) => {\n if (!(await fs.exists(cachedResPath))) {\n IDEMPOTENT_RESPONSES.delete(key);\n log.warn(`Could not read the cached response identified by key '${key}'`);\n log.warn('The temporary storage is not accessible anymore');\n return next();\n }\n fs.createReadStream(cachedResPath).pipe(res.socket);\n };\n\n if (response) {\n log.info(`The same request with the idempotency key '${key}' has been already processed`);\n log.info(`Rerouting its response to the current request`);\n await rerouteCachedResponse(response);\n } else {\n log.info(`The same request with the idempotency key '${key}' is being processed`);\n log.info(`Waiting for the response to be rerouted to the current request`);\n responseStateListener.once('ready', async (cachedResponsePath) => {\n if (!cachedResponsePath) {\n return next();\n }\n await rerouteCachedResponse(cachedResponsePath);\n });\n }\n}\n\nexport {handleIdempotency};\n"],"mappings":"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"}
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../../lib/express/idempotency.js"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export default log;
2
- declare const log: import("../../../types/build").AppiumLogger;
2
+ declare const log: import("../../../types/build/lib").AppiumLogger;
3
3
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../lib/express/logger.js"],"names":[],"mappings":";AAEA,+DAAqC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../lib/express/logger.js"],"names":[],"mappings":";AAEA,mEAAqC"}
@@ -1,16 +1,6 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _support = require("@appium/support");
11
-
12
- const log = _support.logger.getLogger('HTTP');
13
-
14
- var _default = log;
15
- exports.default = _default;
16
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXhwcmVzcy9sb2dnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtsb2dnZXJ9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0hUVFAnKTtcbmV4cG9ydCBkZWZhdWx0IGxvZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBRUEsTUFBTUEsR0FBRyxHQUFHQyxlQUFBLENBQU9DLFNBQVAsQ0FBaUIsTUFBakIsQ0FBWjs7ZUFDZUYsRyJ9
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const support_1 = require("@appium/support");
4
+ const log = support_1.logger.getLogger('HTTP');
5
+ exports.default = log;
6
+ //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","names":["log","logger","getLogger"],"sources":["../../../lib/express/logger.js"],"sourcesContent":["import {logger} from '@appium/support';\n\nconst log = logger.getLogger('HTTP');\nexport default log;\n"],"mappings":";;;;;;;;;AAAA;;AAEA,MAAMA,GAAG,GAAGC,eAAA,CAAOC,SAAP,CAAiB,MAAjB,CAAZ;;eACeF,G"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../lib/express/logger.js"],"names":[],"mappings":";;AAAA,6CAAuC;AAEvC,MAAM,GAAG,GAAG,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACrC,kBAAe,GAAG,CAAC"}