@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.
- package/build/lib/basedriver/capabilities.d.ts +11 -163
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +354 -236
- package/build/lib/basedriver/capabilities.js.map +1 -1
- package/build/lib/basedriver/commands/event.d.ts +7 -6
- package/build/lib/basedriver/commands/event.d.ts.map +1 -1
- package/build/lib/basedriver/commands/event.js +55 -35
- package/build/lib/basedriver/commands/event.js.map +1 -1
- package/build/lib/basedriver/commands/execute.d.ts +7 -6
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
- package/build/lib/basedriver/commands/execute.js +66 -58
- package/build/lib/basedriver/commands/execute.js.map +1 -1
- package/build/lib/basedriver/commands/find.d.ts +9 -7
- package/build/lib/basedriver/commands/find.d.ts.map +1 -1
- package/build/lib/basedriver/commands/find.js +102 -54
- package/build/lib/basedriver/commands/find.js.map +1 -1
- package/build/lib/basedriver/commands/index.d.ts +3 -7
- package/build/lib/basedriver/commands/index.d.ts.map +1 -1
- package/build/lib/basedriver/commands/index.js +30 -33
- package/build/lib/basedriver/commands/index.js.map +1 -1
- package/build/lib/basedriver/commands/log.d.ts +8 -9
- package/build/lib/basedriver/commands/log.d.ts.map +1 -1
- package/build/lib/basedriver/commands/log.js +54 -38
- package/build/lib/basedriver/commands/log.js.map +1 -1
- package/build/lib/basedriver/commands/session.d.ts +7 -6
- package/build/lib/basedriver/commands/session.d.ts.map +1 -1
- package/build/lib/basedriver/commands/session.js +46 -39
- package/build/lib/basedriver/commands/session.js.map +1 -1
- package/build/lib/basedriver/commands/settings.d.ts +7 -7
- package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
- package/build/lib/basedriver/commands/settings.js +35 -28
- package/build/lib/basedriver/commands/settings.js.map +1 -1
- package/build/lib/basedriver/commands/timeout.d.ts +7 -5
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
- package/build/lib/basedriver/commands/timeout.js +144 -162
- package/build/lib/basedriver/commands/timeout.js.map +1 -1
- package/build/lib/basedriver/core.d.ts +6 -157
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +361 -230
- package/build/lib/basedriver/core.js.map +1 -1
- package/build/lib/basedriver/desired-caps.js +80 -110
- package/build/lib/basedriver/desired-caps.js.map +1 -1
- package/build/lib/basedriver/device-settings.js +57 -62
- package/build/lib/basedriver/device-settings.js.map +1 -1
- package/build/lib/basedriver/driver.d.ts +21 -267
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +362 -258
- package/build/lib/basedriver/driver.js.map +1 -1
- package/build/lib/basedriver/helpers.js +500 -495
- package/build/lib/basedriver/helpers.js.map +1 -1
- package/build/lib/basedriver/logger.d.ts +1 -1
- package/build/lib/basedriver/logger.d.ts.map +1 -1
- package/build/lib/basedriver/logger.js +5 -15
- package/build/lib/basedriver/logger.js.map +1 -1
- package/build/lib/constants.js +14 -14
- package/build/lib/constants.js.map +1 -1
- package/build/lib/express/crash.js +8 -15
- package/build/lib/express/crash.js.map +1 -1
- package/build/lib/express/express-logging.js +49 -59
- package/build/lib/express/express-logging.js.map +1 -1
- package/build/lib/express/idempotency.js +125 -177
- package/build/lib/express/idempotency.js.map +1 -1
- package/build/lib/express/logger.d.ts +1 -1
- package/build/lib/express/logger.d.ts.map +1 -1
- package/build/lib/express/logger.js +5 -15
- package/build/lib/express/logger.js.map +1 -1
- package/build/lib/express/middleware.js +82 -107
- package/build/lib/express/middleware.js.map +1 -1
- package/build/lib/express/server.d.ts +17 -5
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +259 -224
- package/build/lib/express/server.js.map +1 -1
- package/build/lib/express/static.js +64 -81
- package/build/lib/express/static.js.map +1 -1
- package/build/lib/express/websocket.js +115 -87
- package/build/lib/express/websocket.js.map +1 -1
- package/build/lib/helpers/capabilities.d.ts +1 -59
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +72 -69
- package/build/lib/helpers/capabilities.js.map +1 -1
- package/build/lib/index.js +64 -180
- package/build/lib/index.js.map +1 -1
- package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
- package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.js +355 -393
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
- package/build/lib/jsonwp-status/status.js +119 -130
- package/build/lib/jsonwp-status/status.js.map +1 -1
- package/build/lib/protocol/errors.d.ts +135 -32
- package/build/lib/protocol/errors.d.ts.map +1 -1
- package/build/lib/protocol/errors.js +871 -919
- package/build/lib/protocol/errors.js.map +1 -1
- package/build/lib/protocol/helpers.js +37 -37
- package/build/lib/protocol/helpers.js.map +1 -1
- package/build/lib/protocol/index.js +22 -109
- package/build/lib/protocol/index.js.map +1 -1
- package/build/lib/protocol/protocol.js +394 -350
- package/build/lib/protocol/protocol.js.map +1 -1
- package/build/lib/protocol/routes.d.ts +1238 -4
- package/build/lib/protocol/routes.d.ts.map +1 -1
- package/build/lib/protocol/routes.js +964 -1327
- package/build/lib/protocol/routes.js.map +1 -1
- package/build/lib/protocol/validators.js +32 -39
- package/build/lib/protocol/validators.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +80 -39
- package/lib/basedriver/commands/event.js +10 -5
- package/lib/basedriver/commands/execute.js +14 -9
- package/lib/basedriver/commands/find.js +18 -12
- package/lib/basedriver/commands/index.js +21 -16
- package/lib/basedriver/commands/log.js +24 -18
- package/lib/basedriver/commands/session.js +10 -5
- package/lib/basedriver/commands/settings.js +9 -6
- package/lib/basedriver/commands/timeout.js +10 -4
- package/lib/basedriver/core.js +2 -3
- package/lib/basedriver/driver.js +29 -18
- package/lib/express/server.js +6 -3
- package/lib/protocol/errors.js +155 -44
- package/lib/protocol/routes.js +11 -7
- package/package.json +14 -16
|
@@ -1,193 +1,141 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.handleIdempotency =
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
93
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
return responseStateListener.emit('ready', null);
|
|
106
|
+
cacheResponse(key, req, res);
|
|
107
|
+
return next();
|
|
103
108
|
}
|
|
104
|
-
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../lib/express/logger.js"],"names":[],"mappings":";AAEA
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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","
|
|
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"}
|