@loadmill/executer 0.1.141 → 0.1.143

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 (136) hide show
  1. package/dist/sequence-executor-like.d.ts +1 -0
  2. package/dist/sequence.js +31 -11
  3. package/dist/sequence.js.map +1 -1
  4. package/dist/step-handlers/wait-step-handler.d.ts +12 -0
  5. package/dist/step-handlers/wait-step-handler.js +98 -0
  6. package/dist/step-handlers/wait-step-handler.js.map +1 -0
  7. package/package/dist/asserter.d.ts +9 -0
  8. package/package/dist/asserter.js +158 -0
  9. package/package/dist/asserter.js.map +1 -0
  10. package/package/dist/constants.d.ts +7 -0
  11. package/package/dist/constants.js +13 -0
  12. package/package/dist/constants.js.map +1 -0
  13. package/package/dist/cookies.d.ts +4 -0
  14. package/package/dist/cookies.js +79 -0
  15. package/package/dist/cookies.js.map +1 -0
  16. package/package/dist/errors.d.ts +5 -0
  17. package/package/dist/errors.js +38 -0
  18. package/package/dist/errors.js.map +1 -0
  19. package/package/dist/extraction-combiner.d.ts +17 -0
  20. package/package/dist/extraction-combiner.js +182 -0
  21. package/package/dist/extraction-combiner.js.map +1 -0
  22. package/package/dist/failures.d.ts +24 -0
  23. package/package/dist/failures.js +67 -0
  24. package/package/dist/failures.js.map +1 -0
  25. package/package/dist/grpc.d.ts +34 -0
  26. package/package/dist/grpc.js +269 -0
  27. package/package/dist/grpc.js.map +1 -0
  28. package/package/dist/iteration-stats.d.ts +2 -0
  29. package/package/dist/iteration-stats.js +38 -0
  30. package/package/dist/iteration-stats.js.map +1 -0
  31. package/package/dist/message-creators.d.ts +31 -0
  32. package/package/dist/message-creators.js +90 -0
  33. package/package/dist/message-creators.js.map +1 -0
  34. package/package/dist/mill-info.d.ts +70 -0
  35. package/package/dist/mill-info.js +3 -0
  36. package/package/dist/mill-info.js.map +1 -0
  37. package/package/dist/mill-version.d.ts +6 -0
  38. package/package/dist/mill-version.js +10 -0
  39. package/package/dist/mill-version.js.map +1 -0
  40. package/package/dist/parameter-pools.d.ts +3 -0
  41. package/package/dist/parameter-pools.js +69 -0
  42. package/package/dist/parameter-pools.js.map +1 -0
  43. package/package/dist/performance.d.ts +1 -0
  44. package/package/dist/performance.js +10 -0
  45. package/package/dist/performance.js.map +1 -0
  46. package/package/dist/post-script/ast-walker/index.d.ts +18 -0
  47. package/package/dist/post-script/ast-walker/index.js +215 -0
  48. package/package/dist/post-script/ast-walker/index.js.map +1 -0
  49. package/package/dist/post-script/ast-walker/type-guard.d.ts +11 -0
  50. package/package/dist/post-script/ast-walker/type-guard.js +56 -0
  51. package/package/dist/post-script/ast-walker/type-guard.js.map +1 -0
  52. package/package/dist/post-script/ast-walker/types.d.ts +24 -0
  53. package/package/dist/post-script/ast-walker/types.js +25 -0
  54. package/package/dist/post-script/ast-walker/types.js.map +1 -0
  55. package/package/dist/post-script/console-log.d.ts +7 -0
  56. package/package/dist/post-script/console-log.js +31 -0
  57. package/package/dist/post-script/console-log.js.map +1 -0
  58. package/package/dist/post-script/constants.d.ts +4 -0
  59. package/package/dist/post-script/constants.js +9 -0
  60. package/package/dist/post-script/constants.js.map +1 -0
  61. package/package/dist/post-script/parser/acorn-js-parser.d.ts +5 -0
  62. package/package/dist/post-script/parser/acorn-js-parser.js +20 -0
  63. package/package/dist/post-script/parser/acorn-js-parser.js.map +1 -0
  64. package/package/dist/post-script/parser/js-parser.d.ts +16 -0
  65. package/package/dist/post-script/parser/js-parser.js +3 -0
  66. package/package/dist/post-script/parser/js-parser.js.map +1 -0
  67. package/package/dist/post-script/parser/parser.d.ts +6 -0
  68. package/package/dist/post-script/parser/parser.js +3 -0
  69. package/package/dist/post-script/parser/parser.js.map +1 -0
  70. package/package/dist/post-script/post-script-executor.d.ts +24 -0
  71. package/package/dist/post-script/post-script-executor.js +125 -0
  72. package/package/dist/post-script/post-script-executor.js.map +1 -0
  73. package/package/dist/post-script/virtual-machine/virtual-machine.d.ts +13 -0
  74. package/package/dist/post-script/virtual-machine/virtual-machine.js +3 -0
  75. package/package/dist/post-script/virtual-machine/virtual-machine.js.map +1 -0
  76. package/package/dist/post-script/virtual-machine/vm2-virtual-machine.d.ts +12 -0
  77. package/package/dist/post-script/virtual-machine/vm2-virtual-machine.js +81 -0
  78. package/package/dist/post-script/virtual-machine/vm2-virtual-machine.js.map +1 -0
  79. package/package/dist/post-sequence.d.ts +2 -0
  80. package/package/dist/post-sequence.js +192 -0
  81. package/package/dist/post-sequence.js.map +1 -0
  82. package/package/dist/redact-data.d.ts +2 -0
  83. package/package/dist/redact-data.js +60 -0
  84. package/package/dist/redact-data.js.map +1 -0
  85. package/package/dist/report-types.d.ts +102 -0
  86. package/package/dist/report-types.js +11 -0
  87. package/package/dist/report-types.js.map +1 -0
  88. package/package/dist/request-sequence-result.d.ts +37 -0
  89. package/package/dist/request-sequence-result.js +19 -0
  90. package/package/dist/request-sequence-result.js.map +1 -0
  91. package/package/dist/request-stats.d.ts +13 -0
  92. package/package/dist/request-stats.js +14 -0
  93. package/package/dist/request-stats.js.map +1 -0
  94. package/package/dist/res-keeper.d.ts +16 -0
  95. package/package/dist/res-keeper.js +104 -0
  96. package/package/dist/res-keeper.js.map +1 -0
  97. package/package/dist/sampler.d.ts +29 -0
  98. package/package/dist/sampler.js +276 -0
  99. package/package/dist/sampler.js.map +1 -0
  100. package/package/dist/sequence-executor-like.d.ts +23 -0
  101. package/package/dist/sequence-executor-like.js +3 -0
  102. package/package/dist/sequence-executor-like.js.map +1 -0
  103. package/package/dist/sequence.d.ts +16 -0
  104. package/package/dist/sequence.js +1738 -0
  105. package/package/dist/sequence.js.map +1 -0
  106. package/package/dist/single-runner.d.ts +29 -0
  107. package/package/dist/single-runner.js +147 -0
  108. package/package/dist/single-runner.js.map +1 -0
  109. package/package/dist/step-handlers/code-step-handler.d.ts +12 -0
  110. package/package/dist/step-handlers/code-step-handler.js +93 -0
  111. package/package/dist/step-handlers/code-step-handler.js.map +1 -0
  112. package/package/dist/step-handlers/extract-step-handler.d.ts +12 -0
  113. package/package/dist/step-handlers/extract-step-handler.js +101 -0
  114. package/package/dist/step-handlers/extract-step-handler.js.map +1 -0
  115. package/package/dist/step-handlers/request-step-handler.d.ts +13 -0
  116. package/package/dist/step-handlers/request-step-handler.js +94 -0
  117. package/package/dist/step-handlers/request-step-handler.js.map +1 -0
  118. package/package/dist/step-handlers/step-handler.d.ts +11 -0
  119. package/package/dist/step-handlers/step-handler.js +3 -0
  120. package/package/dist/step-handlers/step-handler.js.map +1 -0
  121. package/package/dist/test-run-event-emitter.d.ts +15 -0
  122. package/package/dist/test-run-event-emitter.js +36 -0
  123. package/package/dist/test-run-event-emitter.js.map +1 -0
  124. package/package/dist/types/grpc.d.ts +14 -0
  125. package/package/dist/types/grpc.js +3 -0
  126. package/package/dist/types/grpc.js.map +1 -0
  127. package/package/dist/utils.d.ts +3 -0
  128. package/package/dist/utils.js +32 -0
  129. package/package/dist/utils.js.map +1 -0
  130. package/package/dist/work.d.ts +15 -0
  131. package/package/dist/work.js +3 -0
  132. package/package/dist/work.js.map +1 -0
  133. package/package/dist/ws.d.ts +71 -0
  134. package/package/dist/ws.js +474 -0
  135. package/package/dist/ws.js.map +1 -0
  136. package/package.json +4 -3
@@ -0,0 +1,1738 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || function (mod) {
26
+ if (mod && mod.__esModule) return mod;
27
+ var result = {};
28
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
+ __setModuleDefault(result, mod);
30
+ return result;
31
+ };
32
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
33
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
34
+ return new (P || (P = Promise))(function (resolve, reject) {
35
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
36
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
37
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
38
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
39
+ });
40
+ };
41
+ var __generator = (this && this.__generator) || function (thisArg, body) {
42
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
43
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
44
+ function verb(n) { return function (v) { return step([n, v]); }; }
45
+ function step(op) {
46
+ if (f) throw new TypeError("Generator is already executing.");
47
+ while (_) try {
48
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
49
+ if (y = 0, t) op = [op[0] & 2, t.value];
50
+ switch (op[0]) {
51
+ case 0: case 1: t = op; break;
52
+ case 4: _.label++; return { value: op[1], done: false };
53
+ case 5: _.label++; y = op[1]; op = [0]; continue;
54
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
55
+ default:
56
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
57
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
58
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
59
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
60
+ if (t[2]) _.ops.pop();
61
+ _.trys.pop(); continue;
62
+ }
63
+ op = body.call(thisArg, _);
64
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
65
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
66
+ }
67
+ };
68
+ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
69
+ for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
70
+ to[j] = from[i];
71
+ return to;
72
+ };
73
+ var __importDefault = (this && this.__importDefault) || function (mod) {
74
+ return (mod && mod.__esModule) ? mod : { "default": mod };
75
+ };
76
+ Object.defineProperty(exports, "__esModule", { value: true });
77
+ exports.sequence = exports.reqIdParamName = void 0;
78
+ var urijs_1 = __importDefault(require("urijs"));
79
+ var HTTPSAgent = require('agentkeepalive').HttpsAgent;
80
+ var HTTPAgent = require('agentkeepalive');
81
+ var randomstring_1 = __importDefault(require("randomstring"));
82
+ var isEmpty_1 = __importDefault(require("lodash/isEmpty"));
83
+ var flatMap_1 = __importDefault(require("lodash/flatMap"));
84
+ var clamp_1 = __importDefault(require("lodash/clamp"));
85
+ var find_1 = __importDefault(require("lodash/find"));
86
+ var map_1 = __importDefault(require("lodash/map"));
87
+ var filter_1 = __importDefault(require("lodash/filter"));
88
+ var cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
89
+ var isFunction_1 = __importDefault(require("lodash/isFunction"));
90
+ var asserter_1 = require("./asserter");
91
+ var failures_1 = require("./failures");
92
+ var request_stats_1 = require("./request-stats");
93
+ var mill_version_1 = require("./mill-version");
94
+ var extraction_combiner_1 = require("./extraction-combiner");
95
+ var post_script_executor_1 = require("./post-script/post-script-executor");
96
+ var log_1 = __importDefault(require("@loadmill/universal/dist/log"));
97
+ var envUtils = __importStar(require("@loadmill/universal/dist/env-utils"));
98
+ var mathUtils = __importStar(require("@loadmill/universal/dist/math-utils"));
99
+ var uriUtils = __importStar(require("@loadmill/universal/dist/uri-utils"));
100
+ var promiseUtils = __importStar(require("@loadmill/universal/dist/promise-utils"));
101
+ var manipulationUtils = __importStar(require("@loadmill/universal/dist/manipulation-utils"));
102
+ var errors_1 = require("@loadmill/universal/dist/errors");
103
+ var parameters_1 = require("@loadmill/core/dist/parameters");
104
+ var conf_1 = require("@loadmill/core/dist/conf");
105
+ var DEFAULT_CACHE_CONTROL = conf_1.confDefaults.DEFAULT_CACHE_CONTROL, DEFAULT_REQUEST_DELAY = conf_1.confDefaults.DEFAULT_REQUEST_DELAY;
106
+ var MAX_RESPONSE_BYTES = conf_1.confExtrema.MAX_RESPONSE_BYTES, MAX_RESPONSE_COLLECT = conf_1.confExtrema.MAX_RESPONSE_COLLECT, DOUBLE_MAX_RESPONSE_COLLECT = conf_1.confExtrema.DOUBLE_MAX_RESPONSE_COLLECT, MIN_REQUEST_DELAY = conf_1.confExtrema.MIN_REQUEST_DELAY, MAX_REQUEST_LOOPS_ITERATIONS = conf_1.confExtrema.MAX_REQUEST_LOOPS_ITERATIONS, DEFAULT_LOOP_WAIT = conf_1.confExtrema.DEFAULT_LOOP_WAIT, DEFAULT_SOCKET_TIMEOUT = conf_1.confExtrema.DEFAULT_SOCKET_TIMEOUT;
107
+ var request_1 = require("@loadmill/core/dist/request");
108
+ var step_1 = require("@loadmill/core/dist/step");
109
+ var type_guards_1 = require("@loadmill/core/dist/step/type-guards");
110
+ var test_run_event_emitter_1 = require("./test-run-event-emitter");
111
+ var ws_1 = require("./ws");
112
+ var errors_2 = require("./errors");
113
+ var utils_1 = require("./utils");
114
+ var decode_1 = require("@loadmill/core/dist/xml/decode");
115
+ var encode_1 = require("@loadmill/core/dist/xml/encode");
116
+ var is_xml_1 = require("@loadmill/core/dist/xml/is-xml");
117
+ var parameter_pools_1 = require("./parameter-pools");
118
+ var cookies_1 = require("./cookies");
119
+ var console_log_1 = require("./post-script/console-log");
120
+ var redact_data_1 = require("./redact-data");
121
+ var post_sequence_1 = require("./post-sequence");
122
+ var grpc_1 = require("./grpc");
123
+ var constants_1 = require("./constants");
124
+ var code_step_handler_1 = require("./step-handlers/code-step-handler");
125
+ var request_step_handler_1 = require("./step-handlers/request-step-handler");
126
+ var performance_1 = require("./performance");
127
+ var extract_step_handler_1 = require("./step-handlers/extract-step-handler");
128
+ exports.reqIdParamName = 'loadmill-request-id';
129
+ var SOCKET_TIMEOUT = DEFAULT_SOCKET_TIMEOUT;
130
+ exports.sequence = {
131
+ execute: function (httpAgent, requests, parameters, domainsWhiteList, sequenceOptions, protoFileRootPath) {
132
+ var sequenceExecutor = new SequenceExecutor(httpAgent, parameters, domainsWhiteList, sequenceOptions, protoFileRootPath);
133
+ return sequenceExecutor.startAndPass(requests);
134
+ },
135
+ };
136
+ var SequenceExecutor = /** @class */ (function () {
137
+ function SequenceExecutor(httpAgent, parameters, domainsWhiteList, _a, protoFileRootPath) {
138
+ var _this = this;
139
+ var increaseResSize = _a.increaseResSize, sequentialParameterPools = _a.sequentialParameterPools, sensitiveData = _a.sensitiveData, sensitiveKeys = _a.sensitiveKeys, metricsKeys = _a.metricsKeys, xmlDecode = _a.xmlDecode;
140
+ Object.defineProperty(this, "httpAgent", {
141
+ enumerable: true,
142
+ configurable: true,
143
+ writable: true,
144
+ value: httpAgent
145
+ });
146
+ Object.defineProperty(this, "domainsWhiteList", {
147
+ enumerable: true,
148
+ configurable: true,
149
+ writable: true,
150
+ value: domainsWhiteList
151
+ });
152
+ Object.defineProperty(this, "handlers", {
153
+ enumerable: true,
154
+ configurable: true,
155
+ writable: true,
156
+ value: void 0
157
+ });
158
+ Object.defineProperty(this, "lastResponseBody", {
159
+ enumerable: true,
160
+ configurable: true,
161
+ writable: true,
162
+ value: ''
163
+ });
164
+ Object.defineProperty(this, "parameters", {
165
+ enumerable: true,
166
+ configurable: true,
167
+ writable: true,
168
+ value: void 0
169
+ });
170
+ Object.defineProperty(this, "postScriptRunner", {
171
+ enumerable: true,
172
+ configurable: true,
173
+ writable: true,
174
+ value: void 0
175
+ });
176
+ Object.defineProperty(this, "avgResTime", {
177
+ enumerable: true,
178
+ configurable: true,
179
+ writable: true,
180
+ value: 0
181
+ });
182
+ Object.defineProperty(this, "successfulHits", {
183
+ enumerable: true,
184
+ configurable: true,
185
+ writable: true,
186
+ value: 0
187
+ });
188
+ Object.defineProperty(this, "lastStartedIndex", {
189
+ enumerable: true,
190
+ configurable: true,
191
+ writable: true,
192
+ value: 0
193
+ });
194
+ Object.defineProperty(this, "failures", {
195
+ enumerable: true,
196
+ configurable: true,
197
+ writable: true,
198
+ value: {}
199
+ });
200
+ Object.defineProperty(this, "evaluatingFailures", {
201
+ enumerable: true,
202
+ configurable: true,
203
+ writable: true,
204
+ value: {}
205
+ });
206
+ Object.defineProperty(this, "requestStats", {
207
+ enumerable: true,
208
+ configurable: true,
209
+ writable: true,
210
+ value: {}
211
+ });
212
+ Object.defineProperty(this, "resolvedRequests", {
213
+ enumerable: true,
214
+ configurable: true,
215
+ writable: true,
216
+ value: []
217
+ });
218
+ Object.defineProperty(this, "keepaliveHTTPSAgent", {
219
+ enumerable: true,
220
+ configurable: true,
221
+ writable: true,
222
+ value: void 0
223
+ });
224
+ Object.defineProperty(this, "keepaliveHTTPAgent", {
225
+ enumerable: true,
226
+ configurable: true,
227
+ writable: true,
228
+ value: void 0
229
+ });
230
+ Object.defineProperty(this, "wsHandler", {
231
+ enumerable: true,
232
+ configurable: true,
233
+ writable: true,
234
+ value: void 0
235
+ });
236
+ Object.defineProperty(this, "MAX_RES_SIZE", {
237
+ enumerable: true,
238
+ configurable: true,
239
+ writable: true,
240
+ value: MAX_RESPONSE_COLLECT
241
+ });
242
+ Object.defineProperty(this, "sequentialParameterPools", {
243
+ enumerable: true,
244
+ configurable: true,
245
+ writable: true,
246
+ value: void 0
247
+ });
248
+ Object.defineProperty(this, "sensitiveData", {
249
+ enumerable: true,
250
+ configurable: true,
251
+ writable: true,
252
+ value: void 0
253
+ });
254
+ Object.defineProperty(this, "sensitiveKeys", {
255
+ enumerable: true,
256
+ configurable: true,
257
+ writable: true,
258
+ value: void 0
259
+ });
260
+ Object.defineProperty(this, "metricsKeys", {
261
+ enumerable: true,
262
+ configurable: true,
263
+ writable: true,
264
+ value: void 0
265
+ });
266
+ Object.defineProperty(this, "protoFileRootPath", {
267
+ enumerable: true,
268
+ configurable: true,
269
+ writable: true,
270
+ value: void 0
271
+ });
272
+ Object.defineProperty(this, "xmlDecode", {
273
+ enumerable: true,
274
+ configurable: true,
275
+ writable: true,
276
+ value: void 0
277
+ });
278
+ Object.defineProperty(this, "passStats", {
279
+ enumerable: true,
280
+ configurable: true,
281
+ writable: true,
282
+ value: function () { return ({
283
+ failures: _this.failures,
284
+ evaluatingFailures: _this.evaluatingFailures,
285
+ avgResTime: _this.avgResTime,
286
+ requestStats: _this.requestStats,
287
+ successfulHits: _this.successfulHits,
288
+ resolvedRequests: _this.resolvedRequests,
289
+ lastStartedIndex: _this.lastStartedIndex,
290
+ cookies: _this.httpAgent.jar ? cookies_1.getCookies(_this.httpAgent, _this.resolvedRequests) : {},
291
+ }); }
292
+ });
293
+ Object.defineProperty(this, "resolveAndSetWSReqData", {
294
+ enumerable: true,
295
+ configurable: true,
296
+ writable: true,
297
+ value: function (_a, reqIndex) {
298
+ var url = _a.url, headers = _a.headers, postData = _a.postData, _b = _a.timeout, timeout = _b === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _b, _c = _a.expectedStatus, expectedStatus = _c === void 0 ? 'SUCCESS' : _c;
299
+ var preparedUrl = _this.prepareUrl(url, reqIndex);
300
+ // order matters. headers should be set after the message so we can use the message in headers
301
+ var _d = _this.prepareWsMessage(postData, reqIndex), preparedMessage = _d.resolvedMessage, mimeType = _d.mimeType;
302
+ var preparedHeaders = _this.prepareHeaders(headers, reqIndex);
303
+ return {
304
+ expectedStatus: expectedStatus,
305
+ headers: preparedHeaders,
306
+ message: preparedMessage,
307
+ mimeType: mimeType,
308
+ timeout: timeout,
309
+ url: preparedUrl,
310
+ };
311
+ }
312
+ });
313
+ Object.defineProperty(this, "prepareUrl", {
314
+ enumerable: true,
315
+ configurable: true,
316
+ writable: true,
317
+ value: function (url, reqIndex) {
318
+ var resolvedUrl = _this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
319
+ _this.resolvedRequests[reqIndex].url = resolvedUrl;
320
+ return resolvedUrl;
321
+ }
322
+ });
323
+ Object.defineProperty(this, "prepareHeaders", {
324
+ enumerable: true,
325
+ configurable: true,
326
+ writable: true,
327
+ value: function (headers, reqIndex) {
328
+ var resolvedHeadersObj = {};
329
+ if (headers && !isEmpty_1.default(headers)) {
330
+ _this.resolveHeaders(headers)
331
+ .forEach(function (_a) {
332
+ var name = _a.name, value = _a.value;
333
+ return resolvedHeadersObj[name] = value;
334
+ });
335
+ }
336
+ _this.resolvedRequests[reqIndex].headers = manipulationUtils.objToSingletonArray(resolvedHeadersObj);
337
+ return resolvedHeadersObj;
338
+ }
339
+ });
340
+ Object.defineProperty(this, "prepareWsMessage", {
341
+ enumerable: true,
342
+ configurable: true,
343
+ writable: true,
344
+ value: function (postData, reqIndex) {
345
+ var resolvedMessage = '';
346
+ var mimeType = (postData === null || postData === void 0 ? void 0 : postData.mimeType) === request_1.WsMessageType.BINARY ? request_1.WsMessageType.BINARY : request_1.WsMessageType.TEXT;
347
+ if (postData) {
348
+ resolvedMessage = _this.resolve(postData.text, function (err) {
349
+ return setParameterErrorHistogram(err, 'Failed to compute Websocket message - ');
350
+ });
351
+ if (resolvedMessage && resolvedMessage.length > utils_1.getMaxRequestBodySize()) {
352
+ throw new errors_2.RequestFailuresError('Websocket message size is too large');
353
+ }
354
+ _this.resolvedRequests[reqIndex].postData = {
355
+ mimeType: mimeType,
356
+ text: resolvedMessage,
357
+ };
358
+ }
359
+ _this.setVolatileParameters(parameters_1.BUILT_IN_VOLATILE_PARAMS.requestBody, resolvedMessage);
360
+ return { resolvedMessage: resolvedMessage, mimeType: mimeType };
361
+ }
362
+ });
363
+ Object.defineProperty(this, "resolveAndSetGRPCReqData", {
364
+ enumerable: true,
365
+ configurable: true,
366
+ writable: true,
367
+ value: function (_a, reqIndex) {
368
+ var url = _a.url, _b = _a.headers, headers = _b === void 0 ? [] : _b, grpc = _a.grpc, _c = _a.timeout, timeout = _c === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _c, _d = _a.expectedStatus, expectedStatus = _d === void 0 ? 'SUCCESS' : _d, auth = _a.auth;
369
+ var preparedUrl = _this.prepareUrl(url, reqIndex);
370
+ _this.setVolatileParameters(parameters_1.BUILT_IN_VOLATILE_PARAMS.requestURL, url);
371
+ var domain = uriUtils.getDomain(preparedUrl);
372
+ _this.validateDomain(domain, constants_1.RequestType.GRPC);
373
+ var method = (grpc === null || grpc === void 0 ? void 0 : grpc.method) || '';
374
+ _this.setVolatileParameters(parameters_1.BUILT_IN_VOLATILE_PARAMS.requestMethod, method);
375
+ var service = (grpc === null || grpc === void 0 ? void 0 : grpc.service) || '';
376
+ _this.validateGrpcService(service);
377
+ if (auth) {
378
+ var user = auth.user, password = auth.password;
379
+ if (user && password) {
380
+ headers.push({
381
+ name: 'authorization',
382
+ value: 'Basic ' + Buffer.from(user + ":" + password).toString('base64'),
383
+ });
384
+ }
385
+ }
386
+ var preparedMessage = _this.prepareGRPCMessage(grpc, reqIndex).resolvedMessage;
387
+ var preparedHeaders = _this.prepareHeaders(headers, reqIndex);
388
+ return {
389
+ expectedStatus: expectedStatus,
390
+ headers: preparedHeaders,
391
+ message: preparedMessage,
392
+ timeout: timeout,
393
+ domain: domain,
394
+ service: service,
395
+ method: method,
396
+ url: preparedUrl,
397
+ };
398
+ }
399
+ });
400
+ Object.defineProperty(this, "prepareGRPCMessage", {
401
+ enumerable: true,
402
+ configurable: true,
403
+ writable: true,
404
+ value: function (grpc, reqIndex) {
405
+ var resolvedMessage = '';
406
+ if (grpc) {
407
+ resolvedMessage = _this.resolve(grpc.message, function (err) {
408
+ return setParameterErrorHistogram(err, 'Failed to compute gRPC message - ');
409
+ });
410
+ if (resolvedMessage && resolvedMessage.length > utils_1.getMaxRequestBodySize()) {
411
+ throw new errors_2.RequestFailuresError('gRPC message size is too large');
412
+ }
413
+ _this.resolvedRequests[reqIndex].grpc = __assign(__assign({}, grpc), { message: resolvedMessage });
414
+ }
415
+ _this.setVolatileParameters(parameters_1.BUILT_IN_VOLATILE_PARAMS.requestBody, resolvedMessage);
416
+ return { resolvedMessage: resolvedMessage };
417
+ }
418
+ });
419
+ Object.defineProperty(this, "checkProgressEvent", {
420
+ enumerable: true,
421
+ configurable: true,
422
+ writable: true,
423
+ value: function (requestIndex, request, _a) {
424
+ var _b = _a.total, total = _b === void 0 ? 0 : _b, loaded = _a.loaded;
425
+ log_1.default.trace('Progress:', { total: total, loaded: loaded });
426
+ if ((total || loaded) >= MAX_RESPONSE_BYTES) {
427
+ _this.setSingleFailure(requestIndex, 'Response size is too large');
428
+ request.abort();
429
+ }
430
+ }
431
+ });
432
+ Object.defineProperty(this, "collectExtractionHeaders", {
433
+ enumerable: true,
434
+ configurable: true,
435
+ writable: true,
436
+ value: function (extractions) {
437
+ return filter_1.default(extractions, function (extraction) { return extraction.header != null; }).map(function (extraction) {
438
+ return _this.resolve(extraction.header, function (err) {
439
+ return setParameterErrorHistogram(err, "Failed to compute extraction header " + extraction.header + " - ");
440
+ });
441
+ });
442
+ }
443
+ });
444
+ this.handlers = [
445
+ new request_step_handler_1.RequestStepHandler(this),
446
+ new code_step_handler_1.CodeStepHandler(this),
447
+ new extract_step_handler_1.ExtractStepHandler(this),
448
+ ];
449
+ this.parameters = parameters_1.parameterUtils.resolveAllExpressions(parameters);
450
+ this.keepaliveHTTPSAgent = new HTTPSAgent({
451
+ timeout: SOCKET_TIMEOUT,
452
+ freeSocketTimeout: SOCKET_TIMEOUT / 2
453
+ });
454
+ this.keepaliveHTTPAgent = new HTTPAgent({
455
+ timeout: SOCKET_TIMEOUT,
456
+ freeSocketTimeout: SOCKET_TIMEOUT / 2
457
+ });
458
+ this.postScriptRunner = new post_script_executor_1.PostScriptRunner();
459
+ this.wsHandler = new ws_1.WSSequenceHandler();
460
+ increaseResSize && (this.MAX_RES_SIZE = DOUBLE_MAX_RESPONSE_COLLECT); // = 10 * MAX_RESPONSE_COLLECT
461
+ this.sequentialParameterPools = sequentialParameterPools;
462
+ this.sensitiveData = !envUtils.isBrowser() ? process.env.LOADMILL_AGENT_SENSITIVE_DATA === 'true' || sensitiveData : sensitiveData;
463
+ this.sensitiveKeys = sensitiveKeys;
464
+ this.metricsKeys = metricsKeys;
465
+ this.protoFileRootPath = protoFileRootPath;
466
+ this.xmlDecode = xmlDecode;
467
+ }
468
+ Object.defineProperty(SequenceExecutor.prototype, "startAndPass", {
469
+ enumerable: false,
470
+ configurable: true,
471
+ writable: true,
472
+ value: function (steps) {
473
+ return this.start(steps).then(this.passStats, this.passStats);
474
+ }
475
+ });
476
+ Object.defineProperty(SequenceExecutor.prototype, "start", {
477
+ enumerable: false,
478
+ configurable: true,
479
+ writable: true,
480
+ value: function (steps) {
481
+ return __awaiter(this, void 0, void 0, function () {
482
+ var stepIndex, step, skipIndex, isLastStep, isPrevStepALoadmillRequest, error_1, reason, stack, message, unexpectedError;
483
+ return __generator(this, function (_a) {
484
+ switch (_a.label) {
485
+ case 0: return [4 /*yield*/, this.handleParameterPools()];
486
+ case 1:
487
+ _a.sent();
488
+ stepIndex = 0;
489
+ _a.label = 2;
490
+ case 2:
491
+ if (!(stepIndex < steps.length)) return [3 /*break*/, 8];
492
+ step = steps[stepIndex];
493
+ this.resolvedRequests[stepIndex] = {};
494
+ _a.label = 3;
495
+ case 3:
496
+ _a.trys.push([3, 6, , 7]);
497
+ skipIndex = this.getSkipIndexIfShould(step, stepIndex, steps);
498
+ if (skipIndex != null) {
499
+ isLastStep = stepIndex === steps.length - 1;
500
+ if (isLastStep && this.hasNoResolvedParameters(stepIndex)) {
501
+ this.setPostParameters(stepIndex);
502
+ }
503
+ stepIndex = skipIndex - 1;
504
+ return [3 /*break*/, 7];
505
+ }
506
+ if (this.shouldStop(step)) {
507
+ return [2 /*return*/];
508
+ }
509
+ return [4 /*yield*/, this.waitBeforeStep(step)];
510
+ case 4:
511
+ _a.sent();
512
+ this.lastStartedIndex = stepIndex;
513
+ isPrevStepALoadmillRequest = stepIndex > 0 && type_guards_1.isLoadmillRequest(steps[stepIndex - 1]);
514
+ return [4 /*yield*/, this.executeStep(step, stepIndex, isPrevStepALoadmillRequest)];
515
+ case 5:
516
+ _a.sent();
517
+ return [3 /*break*/, 7];
518
+ case 6:
519
+ error_1 = _a.sent();
520
+ if (error_1.histogram) {
521
+ this.setStepFailure(stepIndex, error_1.histogram);
522
+ }
523
+ // Failures could be set before error was thrown,
524
+ // i.e. !error.histogram && !_.isEmpty(this.failures[reqIndex])
525
+ // CAN be true:
526
+ if (isEmpty_1.default(this.failures[stepIndex])) {
527
+ reason = 'Unexpected sampler error';
528
+ this.setSingleFailure(stepIndex, reason);
529
+ stack = error_1.stack, message = error_1.message;
530
+ unexpectedError = {
531
+ message: message,
532
+ stack: '' + stack,
533
+ properties: JSON.stringify(error_1),
534
+ };
535
+ this.resolvedRequests[stepIndex].unexpectedError = unexpectedError;
536
+ log_1.default.info(reason, error_1);
537
+ log_1.default.info('Unexpected error info:', unexpectedError);
538
+ }
539
+ this.postSequence(stepIndex);
540
+ throw error_1;
541
+ case 7:
542
+ ++stepIndex;
543
+ return [3 /*break*/, 2];
544
+ case 8:
545
+ this.postSequence();
546
+ return [2 /*return*/];
547
+ }
548
+ });
549
+ });
550
+ }
551
+ });
552
+ Object.defineProperty(SequenceExecutor.prototype, "postSequence", {
553
+ enumerable: false,
554
+ configurable: true,
555
+ writable: true,
556
+ value: function (stepIndex) {
557
+ this.postSequenceMetrics();
558
+ this.cleanup(stepIndex);
559
+ }
560
+ });
561
+ Object.defineProperty(SequenceExecutor.prototype, "postSequenceMetrics", {
562
+ enumerable: false,
563
+ configurable: true,
564
+ writable: true,
565
+ value: function () {
566
+ var postParameters = parameters_1.parameterUtils.getRunPostParameters(this.resolvedRequests);
567
+ post_sequence_1.publishMetrics(cloneDeep_1.default(postParameters), this.metricsKeys);
568
+ }
569
+ });
570
+ Object.defineProperty(SequenceExecutor.prototype, "cleanup", {
571
+ enumerable: false,
572
+ configurable: true,
573
+ writable: true,
574
+ value: function (stepIndex) {
575
+ this.wsHandler.closeAllConnections();
576
+ if (this.sensitiveData) {
577
+ redact_data_1.redactSensitiveData(this.resolvedRequests, this.sensitiveKeys);
578
+ }
579
+ if (stepIndex != null) {
580
+ this.removeVolatilePostParameters(stepIndex);
581
+ }
582
+ }
583
+ });
584
+ Object.defineProperty(SequenceExecutor.prototype, "handleParameterPools", {
585
+ enumerable: false,
586
+ configurable: true,
587
+ writable: true,
588
+ value: function () {
589
+ return __awaiter(this, void 0, void 0, function () {
590
+ var newValues;
591
+ return __generator(this, function (_a) {
592
+ switch (_a.label) {
593
+ case 0:
594
+ if (!this.sequentialParameterPools) return [3 /*break*/, 2];
595
+ return [4 /*yield*/, parameter_pools_1.generateValuesForParameterPools(this.parameters.__testRunId)];
596
+ case 1:
597
+ newValues = _a.sent();
598
+ Object.assign(this.parameters, newValues);
599
+ _a.label = 2;
600
+ case 2: return [2 /*return*/];
601
+ }
602
+ });
603
+ });
604
+ }
605
+ });
606
+ Object.defineProperty(SequenceExecutor.prototype, "hasNoResolvedParameters", {
607
+ enumerable: false,
608
+ configurable: true,
609
+ writable: true,
610
+ value: function (upToStepIndex) {
611
+ var _a;
612
+ for (var i = 0; i <= upToStepIndex; ++i) {
613
+ if ((_a = this.resolvedRequests[i]) === null || _a === void 0 ? void 0 : _a.postParameters) {
614
+ return false;
615
+ }
616
+ }
617
+ return true;
618
+ }
619
+ });
620
+ Object.defineProperty(SequenceExecutor.prototype, "shouldStop", {
621
+ enumerable: false,
622
+ configurable: true,
623
+ writable: true,
624
+ value: function (step) {
625
+ return this.isTruthyParameter('stop', step.stopBefore);
626
+ }
627
+ });
628
+ Object.defineProperty(SequenceExecutor.prototype, "shouldStopLooping", {
629
+ enumerable: false,
630
+ configurable: true,
631
+ writable: true,
632
+ value: function (index, loop) {
633
+ var asserter = new asserter_1.Asserter(this.parameters);
634
+ return this.evaluateAssertion(asserter, index, loop === null || loop === void 0 ? void 0 : loop.assert);
635
+ }
636
+ });
637
+ Object.defineProperty(SequenceExecutor.prototype, "hasLoopingFailed", {
638
+ enumerable: false,
639
+ configurable: true,
640
+ writable: true,
641
+ value: function (index, loop) {
642
+ var asserter = new asserter_1.Asserter(this.parameters);
643
+ return loop && loop.assert && !this.evaluateAssertion(asserter, index, loop === null || loop === void 0 ? void 0 : loop.assert);
644
+ }
645
+ });
646
+ Object.defineProperty(SequenceExecutor.prototype, "isTruthyParameter", {
647
+ enumerable: false,
648
+ configurable: true,
649
+ writable: true,
650
+ value: function (conditionType, parameterName) {
651
+ var value = parameterName &&
652
+ parameters_1.parameterUtils.resolveParameter(parameterName, this.parameters, function (err) {
653
+ return setParameterErrorHistogram(err, "Failed to compute " + conditionType + " condition - ");
654
+ });
655
+ return parameters_1.valueUtils.isTruthyParameterValue(value);
656
+ }
657
+ });
658
+ Object.defineProperty(SequenceExecutor.prototype, "getSkipIndexIfShould", {
659
+ enumerable: false,
660
+ configurable: true,
661
+ writable: true,
662
+ value: function (step, reqIndex, steps) {
663
+ var skipBefore = step.skipBefore, disabled = step.disabled;
664
+ if (disabled) {
665
+ return reqIndex + 1;
666
+ }
667
+ if (skipBefore) {
668
+ var goTo = skipBefore.goTo, negate = skipBefore.negate, condition = skipBefore.condition;
669
+ var shouldSkip = this.isTruthyParameter('skip', condition);
670
+ if ((shouldSkip && !negate) || (!shouldSkip && negate)) {
671
+ if (goTo) {
672
+ return step_1.findStepIndex(steps, goTo);
673
+ }
674
+ else {
675
+ return reqIndex + 1;
676
+ }
677
+ }
678
+ }
679
+ }
680
+ });
681
+ Object.defineProperty(SequenceExecutor.prototype, "waitBeforeStep", {
682
+ enumerable: false,
683
+ configurable: true,
684
+ writable: true,
685
+ value: function (step) {
686
+ return __awaiter(this, void 0, void 0, function () {
687
+ var rawDelay, delay, problem;
688
+ return __generator(this, function (_a) {
689
+ switch (_a.label) {
690
+ case 0:
691
+ rawDelay = step.delay || DEFAULT_REQUEST_DELAY;
692
+ delay = clamp_1.default(Math.round(Number(conf_1.isParameterCandidate(rawDelay)
693
+ ? parameters_1.parameterUtils.resolveParameter(rawDelay, this.parameters, function (err) {
694
+ return setParameterErrorHistogram(err, 'Failed to compute request delay - ');
695
+ })
696
+ : rawDelay)), MIN_REQUEST_DELAY, Infinity);
697
+ problem = conf_1.validateIntegerDelay(delay, false);
698
+ if (problem) {
699
+ throw new errors_2.RequestFailuresError("Invalid Request Delay: " + problem);
700
+ }
701
+ return [4 /*yield*/, promiseUtils.delay(delay)];
702
+ case 1:
703
+ _a.sent();
704
+ return [2 /*return*/];
705
+ }
706
+ });
707
+ });
708
+ }
709
+ });
710
+ Object.defineProperty(SequenceExecutor.prototype, "setStepFailure", {
711
+ enumerable: false,
712
+ configurable: true,
713
+ writable: true,
714
+ value: function (index, histogram) {
715
+ this.failures[index] = failures_1.OneFailure(histogram);
716
+ }
717
+ });
718
+ Object.defineProperty(SequenceExecutor.prototype, "executeStep", {
719
+ enumerable: false,
720
+ configurable: true,
721
+ writable: true,
722
+ value: function (step, index, shouldOverrideLastResponseBody) {
723
+ var _a;
724
+ return __awaiter(this, void 0, void 0, function () {
725
+ var failedAssertionsHistogram, resTime, res, loopIteration, maxIterations, handler, _b, timeout, message;
726
+ return __generator(this, function (_c) {
727
+ switch (_c.label) {
728
+ case 0:
729
+ resTime = 0;
730
+ loopIteration = 0;
731
+ maxIterations = getLoopIterations(step.loop);
732
+ _c.label = 1;
733
+ case 1:
734
+ if (!(loopIteration < maxIterations)) return [3 /*break*/, 9];
735
+ loopIteration++;
736
+ if (shouldOverrideLastResponseBody) {
737
+ this.lastResponseBody = this.parameters[parameters_1.BUILT_IN_VOLATILE_PARAMS.responseBody] || '';
738
+ }
739
+ this.initVolatileParameters();
740
+ handler = this.handlers.find(function (h) { return h.canHandle(step); });
741
+ if (!handler) {
742
+ throw new Error("No handler found for step type: " + step.type);
743
+ }
744
+ return [4 /*yield*/, handler.execute(step, index)];
745
+ case 2:
746
+ res = _c.sent();
747
+ // Setting now to avoid possible user overwrite:
748
+ resTime = Number(this.parameters.__responseTime);
749
+ _b = step.timeout, timeout = _b === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _b;
750
+ if (resTime > timeout) {
751
+ if (step.expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ANY) {
752
+ log_1.default.warn("Response received after timeout of " + timeout + "ms exceeded, but expectedStatus is ANY");
753
+ }
754
+ else {
755
+ throw new errors_2.RequestFailuresError("Response received after timeout of " + timeout + "ms exceeded");
756
+ }
757
+ }
758
+ res.wsExtractionData = { messages: this.wsHandler.messages, timeLimit: timeout - resTime };
759
+ return [4 /*yield*/, handler.processSuccessfulResponse(step, index, res)];
760
+ case 3:
761
+ failedAssertionsHistogram = _c.sent();
762
+ this.resolvedRequests[index].retried = loopIteration > 1 ? loopIteration - 1 : undefined;
763
+ if (!(loopIteration < maxIterations)) return [3 /*break*/, 7];
764
+ if (!this.shouldStopLooping(index, step.loop)) return [3 /*break*/, 4];
765
+ return [3 /*break*/, 9];
766
+ case 4: return [4 /*yield*/, promiseUtils.delay(((_a = step.loop) === null || _a === void 0 ? void 0 : _a.wait) || DEFAULT_LOOP_WAIT)];
767
+ case 5:
768
+ _c.sent();
769
+ _c.label = 6;
770
+ case 6: return [3 /*break*/, 8];
771
+ case 7:
772
+ if (this.hasLoopingFailed(index, step.loop)) {
773
+ throw new errors_2.RequestFailuresError(errors_1.createLoopErrorMessage(maxIterations));
774
+ }
775
+ _c.label = 8;
776
+ case 8: return [3 /*break*/, 1];
777
+ case 9:
778
+ if (!isEmpty_1.default(failedAssertionsHistogram)) {
779
+ message = 'Request failed due to assertions.';
780
+ log_1.default.debug(message, {
781
+ failedAssertionsHistogram: failedAssertionsHistogram,
782
+ parameters: this.parameters,
783
+ });
784
+ throw new errors_2.RequestFailuresError(message, failedAssertionsHistogram);
785
+ }
786
+ this.onRequestSuccess(index, resTime);
787
+ this.removeVolatilePostParameters(index);
788
+ return [2 /*return*/];
789
+ }
790
+ });
791
+ });
792
+ }
793
+ });
794
+ Object.defineProperty(SequenceExecutor.prototype, "onRequestSuccess", {
795
+ enumerable: false,
796
+ configurable: true,
797
+ writable: true,
798
+ value: function (index, resTime) {
799
+ this.avgResTime = mathUtils.calcAvg(this.avgResTime, this.successfulHits, resTime, 1);
800
+ ++this.successfulHits;
801
+ request_stats_1.setReqStats(this.requestStats, index, resTime);
802
+ }
803
+ });
804
+ Object.defineProperty(SequenceExecutor.prototype, "initVolatileParameters", {
805
+ enumerable: false,
806
+ configurable: true,
807
+ writable: true,
808
+ value: function () {
809
+ var _this = this;
810
+ Object.values(parameters_1.BUILT_IN_VOLATILE_PARAMS)
811
+ .forEach(function (param) { return _this.parameters[param] = ''; });
812
+ }
813
+ });
814
+ Object.defineProperty(SequenceExecutor.prototype, "setVolatileParameters", {
815
+ enumerable: false,
816
+ configurable: true,
817
+ writable: true,
818
+ value: function (param, val) {
819
+ this.parameters[param] = val;
820
+ }
821
+ });
822
+ Object.defineProperty(SequenceExecutor.prototype, "removeVolatilePostParameters", {
823
+ enumerable: false,
824
+ configurable: true,
825
+ writable: true,
826
+ value: function (idx) {
827
+ var _this = this;
828
+ Object.values(parameters_1.BUILT_IN_VOLATILE_PARAMS).forEach(function (parameterName) {
829
+ var _a;
830
+ var postParams = (_a = _this.resolvedRequests[idx]) === null || _a === void 0 ? void 0 : _a.postParameters;
831
+ if (postParams) {
832
+ var toRemove = postParams.findIndex(function (param) { return !isEmpty_1.default(param[parameterName]); });
833
+ toRemove >= 0 && postParams.splice(toRemove, 1);
834
+ }
835
+ });
836
+ }
837
+ });
838
+ Object.defineProperty(SequenceExecutor.prototype, "sendRequest", {
839
+ enumerable: false,
840
+ configurable: true,
841
+ writable: true,
842
+ value: function (request, reqIndex) {
843
+ var _a;
844
+ return __awaiter(this, void 0, void 0, function () {
845
+ var res, reqId, redirectHeaders, requestStartTime, beforeTime, setResolvedResponse, error_2, status_1, message, code, prefix, reportedReason, response, failure;
846
+ var _b, _c;
847
+ var _this = this;
848
+ return __generator(this, function (_d) {
849
+ switch (_d.label) {
850
+ case 0:
851
+ redirectHeaders = [];
852
+ requestStartTime = Date.now();
853
+ beforeTime = performance_1.isPerformance ? performance.now() : requestStartTime;
854
+ if (!(typeof loadmillClearResponses === 'function')) return [3 /*break*/, 2];
855
+ return [4 /*yield*/, loadmillClearResponses()];
856
+ case 1:
857
+ _d.sent();
858
+ reqId = randomstring_1.default.generate(30);
859
+ request.query((_b = {}, _b[exports.reqIdParamName] = reqId, _b));
860
+ _d.label = 2;
861
+ case 2:
862
+ setResolvedResponse = function (_a) {
863
+ var text = _a.text, type = _a.type, status = _a.status, headers = _a.headers, _b = _a.statusText, statusText = _b === void 0 ? '' : _b, resRequest = _a.resRequest;
864
+ text = text || '';
865
+ type = type || '';
866
+ statusText = statusText || '';
867
+ _this.parameters.__status = '' + status;
868
+ _this.parameters.__statusText = statusText;
869
+ if (text.length > _this.MAX_RES_SIZE) {
870
+ text = text.slice(0, MAX_RESPONSE_COLLECT - 1) + utils_1.TRIMMED_TEXT;
871
+ }
872
+ _this.resolvedRequests[reqIndex].response = {
873
+ type: type,
874
+ text: text,
875
+ status: status,
876
+ statusText: statusText,
877
+ headers: manipulationUtils.objToSingletonArray(headers),
878
+ };
879
+ _this.setRequestCookies(reqIndex, resRequest === null || resRequest === void 0 ? void 0 : resRequest._headers);
880
+ // May be reset after extractions.
881
+ // This way it is set for failed statuses as well:
882
+ _this.setPostParameters(reqIndex);
883
+ };
884
+ request.on('redirect', function (res) {
885
+ redirectHeaders.push(res.headers.location);
886
+ });
887
+ _d.label = 3;
888
+ case 3:
889
+ _d.trys.push([3, 5, , 9]);
890
+ return [4 /*yield*/, request.ok(function (res, isExpectedStatus) {
891
+ if (isExpectedStatus === void 0) { isExpectedStatus = isExpectedHttpStatus; }
892
+ var status = res.status;
893
+ if (_this.xmlDecode && is_xml_1.isXML(res.type) && res.text) {
894
+ res.text = decode_1.decodePriorityResponse(res.text);
895
+ }
896
+ _this.setTimeParams(requestStartTime, beforeTime);
897
+ setResolvedResponse({
898
+ status: status,
899
+ type: res.type,
900
+ text: res.text,
901
+ headers: extendResponseHeaders(res.header, redirectHeaders),
902
+ statusText: res.xhr ? res.xhr.statusText : res.res.statusMessage,
903
+ resRequest: res.req
904
+ });
905
+ return isExpectedStatus(request, status);
906
+ })];
907
+ case 4:
908
+ res = _d.sent();
909
+ return [3 /*break*/, 9];
910
+ case 5:
911
+ error_2 = _d.sent();
912
+ log_1.default.debug('Request failed:', error_2);
913
+ status_1 = error_2.status, message = error_2.message, code = error_2.code;
914
+ prefix = status_1 ? "HTTP status " + status_1 + " - " : '';
915
+ reportedReason = prefix + message;
916
+ if (!(message === errors_1.superagentCorsError)) return [3 /*break*/, 8];
917
+ if (!(typeof loadmillGetResponse === 'function')) return [3 /*break*/, 7];
918
+ this.setTimeParams(requestStartTime, beforeTime);
919
+ return [4 /*yield*/, loadmillGetResponse(reqId)];
920
+ case 6:
921
+ response = _d.sent();
922
+ log_1.default.debug('Got response from oracle:', JSON.stringify({ reqId: reqId, response: response }));
923
+ reportedReason =
924
+ (response.preFlight
925
+ ? errors_1.corsPreFlightErrorStatusPrefix
926
+ : errors_1.corsErrorStatusPrefix) + response.status;
927
+ this.resolvedRequests[reqIndex].headers = manipulationUtils.objToSingletonArray(response.requestHeaders);
928
+ setResolvedResponse(__assign(__assign({}, response), { type: response.headers['content-type'] }));
929
+ return [3 /*break*/, 8];
930
+ case 7:
931
+ reportedReason = errors_1.unknownStatusCorsError;
932
+ _d.label = 8;
933
+ case 8:
934
+ if (!request.response) {
935
+ delete this.parameters.__status;
936
+ delete this.parameters.__statusText;
937
+ this.setRequestCookies(reqIndex, (_a = request.req) === null || _a === void 0 ? void 0 : _a._headers);
938
+ this.setPostParameters(reqIndex);
939
+ }
940
+ if (error_2.timeout && request.expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ANY) {
941
+ log_1.default.warn('Request failed due to timeout, but expectedStatus is ANY');
942
+ this.setTimeParams(requestStartTime, beforeTime);
943
+ return [2 /*return*/, {}];
944
+ }
945
+ if (code === constants_1.ExceptionCodes.ENOTFOUND && request.expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ANY) {
946
+ log_1.default.warn('Request failed due to ENOTFOUND, but expectedStatus is ANY');
947
+ this.setTimeParams(requestStartTime, beforeTime);
948
+ return [2 /*return*/, {}];
949
+ }
950
+ throw new errors_2.RequestFailuresError(message, (_c = {}, _c[reportedReason] = 1, _c));
951
+ case 9:
952
+ failure = this.failures[reqIndex];
953
+ if (failure) {
954
+ log_1.default.debug('Request aborted due to failures:', failure.histogram);
955
+ throw Error('Request aborted');
956
+ }
957
+ return [2 /*return*/, res];
958
+ }
959
+ });
960
+ });
961
+ }
962
+ });
963
+ Object.defineProperty(SequenceExecutor.prototype, "setTimeParams", {
964
+ enumerable: false,
965
+ configurable: true,
966
+ writable: true,
967
+ value: function (stepStartTime, beforeTime) {
968
+ var responseEndTime = Date.now();
969
+ var afterTime = performance_1.isPerformance ? performance.now() : responseEndTime;
970
+ this.parameters.__requestStartTime = '' + stepStartTime;
971
+ this.parameters.__responseEndTime = '' + responseEndTime;
972
+ this.parameters.__responseTime = '' + Math.round(afterTime - beforeTime);
973
+ }
974
+ });
975
+ Object.defineProperty(SequenceExecutor.prototype, "prepareRequest", {
976
+ enumerable: false,
977
+ configurable: true,
978
+ writable: true,
979
+ value: function (requestConf, reqIndex) {
980
+ if (this.isWSRequest(requestConf) && !envUtils.isBrowser()) {
981
+ return this.prepareWSRequest(requestConf, reqIndex);
982
+ }
983
+ else if (this.isGRPCRequest(requestConf) && !envUtils.isBrowser()) {
984
+ return this.prepareGRPCRequest(requestConf, reqIndex);
985
+ }
986
+ return this.prepareHttpRequest(requestConf, reqIndex);
987
+ }
988
+ });
989
+ Object.defineProperty(SequenceExecutor.prototype, "isWSRequest", {
990
+ enumerable: false,
991
+ configurable: true,
992
+ writable: true,
993
+ value: function (_a) {
994
+ var url = _a.url;
995
+ var resolvedUrl = this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
996
+ return resolvedUrl.startsWith('ws://') || resolvedUrl.startsWith('wss://');
997
+ }
998
+ });
999
+ Object.defineProperty(SequenceExecutor.prototype, "isGRPCRequest", {
1000
+ enumerable: false,
1001
+ configurable: true,
1002
+ writable: true,
1003
+ value: function (_a) {
1004
+ var url = _a.url;
1005
+ var resolvedUrl = this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
1006
+ return resolvedUrl.startsWith('grpc://');
1007
+ }
1008
+ });
1009
+ Object.defineProperty(SequenceExecutor.prototype, "prepareHttpRequest", {
1010
+ enumerable: false,
1011
+ configurable: true,
1012
+ writable: true,
1013
+ value: function (requestConf, reqIndex) {
1014
+ var _this = this;
1015
+ var urlObj = new urijs_1.default(request_1.resolveUrl(requestConf.url, this.parameters, function (err) {
1016
+ return setParameterErrorHistogram(err, 'Failed to compute URL - ');
1017
+ }));
1018
+ // these are empty strings when missing!
1019
+ var user = urlObj.username();
1020
+ var password = urlObj.password();
1021
+ if (user || password) {
1022
+ // null to make sure they won't be part of the URL no more:
1023
+ urlObj.username(null);
1024
+ urlObj.password(null);
1025
+ requestConf.auth = { user: user, password: password };
1026
+ }
1027
+ var url = urlObj.toString();
1028
+ this.setVolatileParameters(parameters_1.BUILT_IN_VOLATILE_PARAMS.requestURL, url);
1029
+ this.resolvedRequests[reqIndex].url = url;
1030
+ this.validateDomain(uriUtils.getDomain(url));
1031
+ var method = requestConf.method.toLowerCase();
1032
+ this.setVolatileParameters(parameters_1.BUILT_IN_VOLATILE_PARAMS.requestMethod, method === null || method === void 0 ? void 0 : method.toUpperCase());
1033
+ var request = this.httpAgent[method](url);
1034
+ if (!envUtils.isBrowser()) {
1035
+ setTCPReuse(request, this.keepaliveHTTPAgent, this.keepaliveHTTPSAgent);
1036
+ }
1037
+ request.timeout(requestConf.timeout);
1038
+ requestConf.noRedirects && request.redirects(0);
1039
+ var auth = requestConf.auth;
1040
+ if (auth != null && request._header['authorization'] == null) {
1041
+ request.auth(auth.user || '', auth.password || '');
1042
+ }
1043
+ this.preparePostData(requestConf, request, reqIndex);
1044
+ // todo itay: instead we should collect from all extractions but some kind of `defer` flag to header extractors:
1045
+ var extractionHeaders = flatMap_1.default(requestConf.extract, this.collectExtractionHeaders).filter(isNonSimpleResponseHeader);
1046
+ if (!isEmpty_1.default(extractionHeaders)) {
1047
+ // this is not required in a node environment but also does not matter
1048
+ // thus we prefer to keep it in order to reduce dissimilarities:
1049
+ //todo itay: allow users to overwrite / disable this headers?
1050
+ request.set('Loadmill-Request-Expose-Headers', extractionHeaders.join(','));
1051
+ }
1052
+ // Prevent large downloads:
1053
+ var progressHandler = function (event) {
1054
+ return _this.checkProgressEvent(reqIndex, request, event);
1055
+ };
1056
+ if (envUtils.isBrowser()) {
1057
+ // Because superagent adds upload handlers which cause
1058
+ // requests to be non-simple (in Firefox) we use the XHR object directly:
1059
+ request.on('request', function (_a) {
1060
+ var xhr = _a.xhr;
1061
+ return (xhr.onprogress = progressHandler);
1062
+ });
1063
+ // Disable parsing:
1064
+ request.parse(function () { return null; });
1065
+ if (requestConf.useCookies) {
1066
+ log_1.default.trace('Enabling cookies for CORS client.');
1067
+ request.withCredentials();
1068
+ }
1069
+ // Penetrate browser cache:
1070
+ if (method === 'get') {
1071
+ var simpleRequest = isSimpleRequest(request._header);
1072
+ var cachePenetration = requestConf.cachePenetration || {};
1073
+ var mode = cachePenetration.mode || request_1.CachePenetrationModes.def;
1074
+ if (mode === request_1.CachePenetrationModes.alwaysQuery ||
1075
+ (mode === request_1.CachePenetrationModes.def && simpleRequest)) {
1076
+ // Avoid pre-flight:
1077
+ request.query({ 'loadmill-cache-key': randomstring_1.default.generate(15) });
1078
+ }
1079
+ else if (request._header['cache-control'] == null &&
1080
+ (mode === request_1.CachePenetrationModes.alwaysHeader ||
1081
+ (mode === request_1.CachePenetrationModes.def && !simpleRequest))) {
1082
+ // Since request is pre-flighted anyway, adding this header shouldn't hurt.
1083
+ // It is better in this case because pre-flight response can be cached:
1084
+ request.set('Cache-Control', cachePenetration.cacheControl || DEFAULT_CACHE_CONTROL);
1085
+ }
1086
+ }
1087
+ }
1088
+ else {
1089
+ // todo itay: consider using `_maxResponseSize` in node:
1090
+ request.on('progress', progressHandler);
1091
+ // This makes superagent populate res.text regardless of the response's content type:
1092
+ request.buffer();
1093
+ // Otherwise we expose superagent and its version -
1094
+ // better have something more general (in case the user didnt set one):
1095
+ var uaHeader = request.get('User-Agent');
1096
+ if (!uaHeader || uaHeader.startsWith('node-superagent')) {
1097
+ request.set('User-Agent', 'loadmill/v' + mill_version_1.millVersionString);
1098
+ }
1099
+ }
1100
+ this.resolvedRequests[reqIndex].headers = manipulationUtils.objToSingletonArray(request.header);
1101
+ request.expectedStatus = requestConf.expectedStatus || request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS;
1102
+ return request;
1103
+ }
1104
+ });
1105
+ Object.defineProperty(SequenceExecutor.prototype, "setHeaders", {
1106
+ enumerable: false,
1107
+ configurable: true,
1108
+ writable: true,
1109
+ value: function (headers, request, filter) {
1110
+ if (filter === void 0) { filter = function (_h) { return true; }; }
1111
+ if (headers && !isEmpty_1.default(headers)) {
1112
+ this.resolveHeaders(headers)
1113
+ .filter(filter)
1114
+ .forEach(function (_a) {
1115
+ var name = _a.name, value = _a.value;
1116
+ return request.set(name, value);
1117
+ });
1118
+ }
1119
+ }
1120
+ });
1121
+ Object.defineProperty(SequenceExecutor.prototype, "preparePostData", {
1122
+ enumerable: false,
1123
+ configurable: true,
1124
+ writable: true,
1125
+ value: function (requestConf, request, reqIndex) {
1126
+ // Order matters! It is CRUCIAL that the type is set before the body.
1127
+ // So first, set only the content-type header, after set the body, then volatiles and then the rest of the headers
1128
+ // Rest of the headers should be set after the postData so we can use the body in headers
1129
+ var headers = requestConf.headers;
1130
+ this.setHeaders(headers, request, function (h) { return h.name.toLowerCase() === 'content-type'; });
1131
+ var postData = requestConf.postData, postFormData = requestConf.postFormData, graphqlPostData = requestConf.graphqlPostData;
1132
+ var data;
1133
+ if (postFormData) {
1134
+ data = this.preparePostFormData(postFormData, request, reqIndex);
1135
+ }
1136
+ else if (postData) {
1137
+ data = this.prepareRawPostData(postData, request, data, reqIndex);
1138
+ }
1139
+ else if (graphqlPostData) {
1140
+ data = this.prepareGraphqlPostData(graphqlPostData, request, reqIndex);
1141
+ }
1142
+ this.setVolatileParameters(parameters_1.BUILT_IN_VOLATILE_PARAMS.requestBody, data);
1143
+ this.setHeaders(headers, request, function (h) { return h.name.toLowerCase() !== 'content-type'; });
1144
+ }
1145
+ });
1146
+ Object.defineProperty(SequenceExecutor.prototype, "prepareRawPostData", {
1147
+ enumerable: false,
1148
+ configurable: true,
1149
+ writable: true,
1150
+ value: function (postData, request, data, reqIndex) {
1151
+ // It is CRUCIAL that the type is set before the body:
1152
+ var mimeType = postData.mimeType;
1153
+ if (mimeType && request._header['content-type'] == null) {
1154
+ // set Content-Type header if not already present:
1155
+ request.type(mimeType);
1156
+ }
1157
+ if ((mimeType === null || mimeType === void 0 ? void 0 : mimeType.startsWith(request_1.ConfMimeTypes.APPLICATION_URLENCODED)) && postData.params) {
1158
+ data = this.prepareUrlEncoded(postData.params);
1159
+ }
1160
+ else {
1161
+ data = this.resolve(postData.text, function (err) { return setParameterErrorHistogram(err, 'Failed to compute request body - '); });
1162
+ }
1163
+ if (data && data.length > utils_1.getMaxRequestBodySize()) {
1164
+ throw new errors_2.RequestFailuresError('Request body size is too large');
1165
+ }
1166
+ if (this.xmlDecode && is_xml_1.isXML(mimeType)) {
1167
+ data = encode_1.encodeXMLRequestBody(data);
1168
+ }
1169
+ // This invocation will behave differently according to different types set on the request:
1170
+ request.send(data);
1171
+ this.resolvedRequests[reqIndex].postData = {
1172
+ mimeType: mimeType,
1173
+ text: data,
1174
+ };
1175
+ return data;
1176
+ }
1177
+ });
1178
+ Object.defineProperty(SequenceExecutor.prototype, "preparePostFormData", {
1179
+ enumerable: false,
1180
+ configurable: true,
1181
+ writable: true,
1182
+ value: function (postFormData, request, reqIndex) {
1183
+ var resolvedPostFormData = [];
1184
+ var size = 0;
1185
+ var MAX_BODY_SIZE = utils_1.getMaxRequestBodySize();
1186
+ for (var _i = 0, postFormData_1 = postFormData; _i < postFormData_1.length; _i++) {
1187
+ var entry = postFormData_1[_i];
1188
+ var name_1 = entry.name, value = entry.value, fileName = entry.fileName;
1189
+ var resolvedName = this.resolve(name_1, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve form-data key - '); });
1190
+ size += resolvedName.length;
1191
+ if (fileName) {
1192
+ var resolvedFileName = this.resolve(fileName, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve form-data fileName - '); });
1193
+ size += (resolvedFileName.length + value.length);
1194
+ var buffer = Buffer.from(value, 'binary');
1195
+ request.attach(resolvedName, buffer, resolvedFileName);
1196
+ resolvedPostFormData.push({ name: resolvedName, value: value, fileName: resolvedFileName });
1197
+ }
1198
+ else {
1199
+ var resolvedValue = this.resolve(value, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve form-data value - '); });
1200
+ size += resolvedValue.length;
1201
+ request.field(resolvedName, resolvedValue);
1202
+ resolvedPostFormData.push({ name: resolvedName, value: resolvedValue });
1203
+ }
1204
+ if (size > MAX_BODY_SIZE) {
1205
+ throw new errors_2.RequestFailuresError('Form Data size is too large');
1206
+ }
1207
+ }
1208
+ this.resolvedRequests[reqIndex].postFormData = resolvedPostFormData;
1209
+ return resolvedPostFormData;
1210
+ }
1211
+ });
1212
+ Object.defineProperty(SequenceExecutor.prototype, "prepareUrlEncoded", {
1213
+ enumerable: false,
1214
+ configurable: true,
1215
+ writable: true,
1216
+ value: function (params) {
1217
+ var resolvedParams = [];
1218
+ for (var _i = 0, params_1 = params; _i < params_1.length; _i++) {
1219
+ var param = params_1[_i];
1220
+ var name_2 = param.name, value = param.value;
1221
+ var resolvedName = this.resolve(name_2, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve params key - '); });
1222
+ var resolvedValue = this.resolve(value, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve params value - '); });
1223
+ resolvedParams.push(resolvedName + "=" + resolvedValue);
1224
+ }
1225
+ return resolvedParams.join('&');
1226
+ }
1227
+ });
1228
+ Object.defineProperty(SequenceExecutor.prototype, "prepareGraphqlPostData", {
1229
+ enumerable: false,
1230
+ configurable: true,
1231
+ writable: true,
1232
+ value: function (_a, request, reqIndex) {
1233
+ var query = _a.query, operationName = _a.operationName, variables = _a.variables;
1234
+ var mimeType = request_1.ConfMimeTypes.APPLICATION_JSON;
1235
+ request.type(mimeType);
1236
+ var data = JSON.stringify(__assign(__assign(__assign({}, (query && { query: this.resolve(query, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve graphql query - '); }) })), (operationName && { operationName: this.resolve(operationName, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve graphql operationName - '); }) })), (variables && { variables: this.prepareGraphqlVariables(variables) })));
1237
+ if (data.length > utils_1.getMaxRequestBodySize()) {
1238
+ throw new errors_2.RequestFailuresError('Request body size is too large');
1239
+ }
1240
+ request.send(data);
1241
+ this.resolvedRequests[reqIndex].postData = {
1242
+ mimeType: mimeType,
1243
+ text: data,
1244
+ };
1245
+ return data;
1246
+ }
1247
+ });
1248
+ Object.defineProperty(SequenceExecutor.prototype, "prepareGraphqlVariables", {
1249
+ enumerable: false,
1250
+ configurable: true,
1251
+ writable: true,
1252
+ value: function (variables) {
1253
+ var resolvedVariables = this.resolve(variables, function (err) { return setParameterErrorHistogram(err, 'Failed to resolve graphql variables - '); });
1254
+ try {
1255
+ resolvedVariables = JSON.parse(resolvedVariables);
1256
+ }
1257
+ catch (_a) { }
1258
+ return resolvedVariables;
1259
+ }
1260
+ });
1261
+ Object.defineProperty(SequenceExecutor.prototype, "prepareWSRequest", {
1262
+ enumerable: false,
1263
+ configurable: true,
1264
+ writable: true,
1265
+ value: function (requestConf, reqIndex) {
1266
+ var _this = this;
1267
+ var wsRequestArgs = this.resolveAndSetWSReqData(requestConf, reqIndex);
1268
+ return new ws_1.WSRequest(wsRequestArgs, this.wsHandler, function (e) { return _this.setSingleFailure(reqIndex, 'Websocket error: ' + e.message); });
1269
+ }
1270
+ });
1271
+ Object.defineProperty(SequenceExecutor.prototype, "prepareGRPCRequest", {
1272
+ enumerable: false,
1273
+ configurable: true,
1274
+ writable: true,
1275
+ value: function (requestConf, reqIndex) {
1276
+ var _this = this;
1277
+ if (!this.protoFileRootPath) {
1278
+ throw new errors_2.RequestFailuresError('gRPC requests are only supported with a proto file');
1279
+ }
1280
+ var grpcRequestArgs = this.resolveAndSetGRPCReqData(requestConf, reqIndex);
1281
+ return new grpc_1.GRPCRequest(grpcRequestArgs, function (e) { return _this.setSingleFailure(reqIndex, 'gRPC error: ' + e.message); }, this.protoFileRootPath);
1282
+ }
1283
+ });
1284
+ Object.defineProperty(SequenceExecutor.prototype, "validateDomain", {
1285
+ enumerable: false,
1286
+ configurable: true,
1287
+ writable: true,
1288
+ value: function (domain, requestType) {
1289
+ var _a, _b, _c;
1290
+ if (requestType === void 0) { requestType = constants_1.RequestType.HTTP; }
1291
+ if (isEmpty_1.default(domain)) {
1292
+ var message = requestType + " request domain name is empty";
1293
+ throw new errors_2.RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
1294
+ }
1295
+ if (conf_1.validate.isUrl(domain)) {
1296
+ var message = requestType + " request domain name [" + domain + "] is not valid";
1297
+ throw new errors_2.RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
1298
+ }
1299
+ else if (!uriUtils.isVerified(domain, this.domainsWhiteList)) {
1300
+ var message = requestType + " request domain name [" + domain + "] is not on white list";
1301
+ throw new errors_2.RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
1302
+ }
1303
+ }
1304
+ });
1305
+ Object.defineProperty(SequenceExecutor.prototype, "validateGrpcService", {
1306
+ enumerable: false,
1307
+ configurable: true,
1308
+ writable: true,
1309
+ value: function (service) {
1310
+ var _a;
1311
+ if (isEmpty_1.default(service)) {
1312
+ var message = 'gRPC request service name is empty';
1313
+ throw new errors_2.RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
1314
+ }
1315
+ }
1316
+ });
1317
+ Object.defineProperty(SequenceExecutor.prototype, "setSingleFailure", {
1318
+ enumerable: false,
1319
+ configurable: true,
1320
+ writable: true,
1321
+ value: function (stepIndex, reason) {
1322
+ var _a;
1323
+ return this.setStepFailure(stepIndex, (_a = {}, _a[reason] = 1, _a));
1324
+ }
1325
+ });
1326
+ Object.defineProperty(SequenceExecutor.prototype, "resolveHeaders", {
1327
+ enumerable: false,
1328
+ configurable: true,
1329
+ writable: true,
1330
+ value: function (headers) {
1331
+ var _this = this;
1332
+ return flatMap_1.default(headers, function (aHeaders) {
1333
+ return map_1.default(aHeaders, function (value, name) { return ({
1334
+ name: name,
1335
+ value: _this.resolve(value, function (err) {
1336
+ return setParameterErrorHistogram(err, "Failed to compute " + name + " header value - ");
1337
+ }),
1338
+ }); });
1339
+ });
1340
+ }
1341
+ });
1342
+ Object.defineProperty(SequenceExecutor.prototype, "processSuccessfulResponse", {
1343
+ enumerable: false,
1344
+ configurable: true,
1345
+ writable: true,
1346
+ value: function (reqIndex, requestConf, res) {
1347
+ return __awaiter(this, void 0, void 0, function () {
1348
+ return __generator(this, function (_a) {
1349
+ switch (_a.label) {
1350
+ case 0:
1351
+ this.setVolatileParameters(parameters_1.BUILT_IN_VOLATILE_PARAMS.responseBody, res.text);
1352
+ // modifies parameters:
1353
+ return [4 /*yield*/, this.handleExtractions(requestConf, res)];
1354
+ case 1:
1355
+ // modifies parameters:
1356
+ _a.sent();
1357
+ if (!envUtils.isBrowser()) {
1358
+ this.handlePostScript(requestConf, res, reqIndex);
1359
+ }
1360
+ this.setPostParameters(reqIndex);
1361
+ return [2 /*return*/, this.handleAssertions(reqIndex, requestConf)];
1362
+ }
1363
+ });
1364
+ });
1365
+ }
1366
+ });
1367
+ Object.defineProperty(SequenceExecutor.prototype, "handleAssertions", {
1368
+ enumerable: false,
1369
+ configurable: true,
1370
+ writable: true,
1371
+ value: function (reqIndex, step) {
1372
+ var _a = this.evaluateAssertions(step), evaluatedAssertions = _a.evaluatedAssertions, evaluatedDisabledAssertions = _a.evaluatedDisabledAssertions;
1373
+ this.handleDisabledAssertions(reqIndex, evaluatedDisabledAssertions);
1374
+ log_1.default.trace('Assertion results: ', evaluatedAssertions);
1375
+ return _evaluatedAssertionsToFailuresHistogram(evaluatedAssertions);
1376
+ }
1377
+ });
1378
+ Object.defineProperty(SequenceExecutor.prototype, "setPostParameters", {
1379
+ enumerable: false,
1380
+ configurable: true,
1381
+ writable: true,
1382
+ value: function (reqIndex) {
1383
+ this.resolvedRequests[reqIndex].postParameters =
1384
+ manipulationUtils.objToSingletonArray(this.parameters)
1385
+ .filter(function (p) { return !isEmpty_1.default(p); })
1386
+ .filter(function (p) { return !isFunction_1.default(parameters_1.parameterUtils.getParameterValue(p)); });
1387
+ }
1388
+ });
1389
+ Object.defineProperty(SequenceExecutor.prototype, "handleExtractions", {
1390
+ enumerable: false,
1391
+ configurable: true,
1392
+ writable: true,
1393
+ value: function (requestConf, res) {
1394
+ return __awaiter(this, void 0, void 0, function () {
1395
+ var _i, _a, extractions;
1396
+ return __generator(this, function (_b) {
1397
+ switch (_b.label) {
1398
+ case 0:
1399
+ _i = 0, _a = (requestConf.extract || []);
1400
+ _b.label = 1;
1401
+ case 1:
1402
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
1403
+ extractions = _a[_i];
1404
+ return [4 /*yield*/, this.extractInScope(res, extractions)];
1405
+ case 2:
1406
+ _b.sent();
1407
+ _b.label = 3;
1408
+ case 3:
1409
+ _i++;
1410
+ return [3 /*break*/, 1];
1411
+ case 4: return [2 /*return*/];
1412
+ }
1413
+ });
1414
+ });
1415
+ }
1416
+ });
1417
+ Object.defineProperty(SequenceExecutor.prototype, "extractInScope", {
1418
+ enumerable: false,
1419
+ configurable: true,
1420
+ writable: true,
1421
+ value: function (res, extractions) {
1422
+ return __awaiter(this, void 0, void 0, function () {
1423
+ var contextParameters, extractionCombiner, _i, _a, _b, name_3, extraction;
1424
+ return __generator(this, function (_c) {
1425
+ switch (_c.label) {
1426
+ case 0:
1427
+ contextParameters = Object.assign({}, this.parameters);
1428
+ extractionCombiner = new extraction_combiner_1.ExtractionCombiner(contextParameters, res, res.wsExtractionData);
1429
+ _i = 0, _a = Object.entries(extractions);
1430
+ _c.label = 1;
1431
+ case 1:
1432
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
1433
+ _b = _a[_i], name_3 = _b[0], extraction = _b[1];
1434
+ return [4 /*yield*/, this.extract(name_3, extraction, extractionCombiner)];
1435
+ case 2:
1436
+ _c.sent();
1437
+ _c.label = 3;
1438
+ case 3:
1439
+ _i++;
1440
+ return [3 /*break*/, 1];
1441
+ case 4: return [2 /*return*/];
1442
+ }
1443
+ });
1444
+ });
1445
+ }
1446
+ });
1447
+ Object.defineProperty(SequenceExecutor.prototype, "extract", {
1448
+ enumerable: false,
1449
+ configurable: true,
1450
+ writable: true,
1451
+ value: function (parameterName, extraction, extractionCombiner) {
1452
+ return __awaiter(this, void 0, void 0, function () {
1453
+ var result, combinedExtractor, error_3, genericMessage, prettyMessage, publicMessage, reqIndex;
1454
+ return __generator(this, function (_a) {
1455
+ switch (_a.label) {
1456
+ case 0:
1457
+ log_1.default.trace('Parameter extraction start: ', { parameterName: parameterName, extraction: extraction });
1458
+ _a.label = 1;
1459
+ case 1:
1460
+ _a.trys.push([1, 4, , 5]);
1461
+ return [4 /*yield*/, extractionCombiner.combine(extraction)];
1462
+ case 2:
1463
+ combinedExtractor = _a.sent();
1464
+ return [4 /*yield*/, combinedExtractor()];
1465
+ case 3:
1466
+ result = _a.sent();
1467
+ return [3 /*break*/, 5];
1468
+ case 4:
1469
+ error_3 = _a.sent();
1470
+ genericMessage = "Failed to extract value for parameter \"" + parameterName + "\"";
1471
+ log_1.default.debug(genericMessage, error_3);
1472
+ prettyMessage = error_3.prettyMessage;
1473
+ publicMessage = prettyMessage
1474
+ ? genericMessage + " - " + prettyMessage
1475
+ : genericMessage;
1476
+ if (error_3 instanceof errors_1.WebsocketError) {
1477
+ reqIndex = this.resolvedRequests.length - 1;
1478
+ this.resolvedRequests[reqIndex].wsMessages = this.wsHandler.messages.slice(-10).map(function (m) { return m === null || m === void 0 ? void 0 : m.toString(); });
1479
+ }
1480
+ throw new errors_2.RequestFailuresError(publicMessage);
1481
+ case 5:
1482
+ if (result != null) {
1483
+ this.parameters[parameterName] = result;
1484
+ }
1485
+ else if (this.parameters[parameterName] == null) {
1486
+ // Existing parameter value acts as default. If no such value exists,
1487
+ // we set the value to be an empty string to differentiate it from undefined parameters.
1488
+ // Otherwise, this parameter's usages would stay untouched, e.g. "${paramName}".
1489
+ this.parameters[parameterName] = '';
1490
+ }
1491
+ log_1.default.trace('Parameter value:', this.parameters[parameterName]);
1492
+ return [2 /*return*/];
1493
+ }
1494
+ });
1495
+ });
1496
+ }
1497
+ });
1498
+ Object.defineProperty(SequenceExecutor.prototype, "resolve", {
1499
+ enumerable: false,
1500
+ configurable: true,
1501
+ writable: true,
1502
+ value: function (parametrized, onError) {
1503
+ return parameters_1.parameterUtils.resolveExpression(parametrized, this.parameters, onError);
1504
+ }
1505
+ });
1506
+ Object.defineProperty(SequenceExecutor.prototype, "handlePostScript", {
1507
+ enumerable: false,
1508
+ configurable: true,
1509
+ writable: true,
1510
+ value: function (_a, _b, reqIndex) {
1511
+ var postScript = _a.postScript;
1512
+ var _c = _b.text, text = _c === void 0 ? '' : _c;
1513
+ if (postScript) {
1514
+ test_run_event_emitter_1.testRunEventsEmitter.postScript.started();
1515
+ var stdout = [];
1516
+ console_log_1.myConsole.setStdout(stdout);
1517
+ try {
1518
+ var result = this.runPostScript(postScript, text).result;
1519
+ Object.assign(this.parameters, result);
1520
+ this.saveStdout(reqIndex);
1521
+ }
1522
+ catch (e) {
1523
+ this.saveStdout(reqIndex);
1524
+ var message = ['Post Script', e.name + ':', e.message].join(' ');
1525
+ throw new errors_2.RequestFailuresError(message);
1526
+ }
1527
+ test_run_event_emitter_1.testRunEventsEmitter.postScript.finished();
1528
+ }
1529
+ }
1530
+ });
1531
+ Object.defineProperty(SequenceExecutor.prototype, "runPostScript", {
1532
+ enumerable: false,
1533
+ configurable: true,
1534
+ writable: true,
1535
+ value: function (postScript, text) {
1536
+ var staticContext = this.getStaticContext();
1537
+ return this.postScriptRunner.run({ staticContext: staticContext }, this.parameters, postScript, this.getResponseTextAsObject(text));
1538
+ }
1539
+ });
1540
+ Object.defineProperty(SequenceExecutor.prototype, "getStaticContext", {
1541
+ enumerable: false,
1542
+ configurable: true,
1543
+ writable: true,
1544
+ value: function () {
1545
+ return { __: parameters_1.parameterFunctionOperations };
1546
+ }
1547
+ });
1548
+ Object.defineProperty(SequenceExecutor.prototype, "saveStdout", {
1549
+ enumerable: false,
1550
+ configurable: true,
1551
+ writable: true,
1552
+ value: function (reqIndex) {
1553
+ if (!isEmpty_1.default(console_log_1.myConsole.stdout)) {
1554
+ (this.resolvedRequests[reqIndex].stdout = console_log_1.myConsole.stdout);
1555
+ }
1556
+ }
1557
+ });
1558
+ Object.defineProperty(SequenceExecutor.prototype, "getResponseTextAsObject", {
1559
+ enumerable: false,
1560
+ configurable: true,
1561
+ writable: true,
1562
+ value: function (text) {
1563
+ try {
1564
+ return JSON.parse(text);
1565
+ }
1566
+ catch (e) {
1567
+ log_1.default.debug('res text (body) cannot be JSON parsed', e.name, e.message);
1568
+ return {};
1569
+ }
1570
+ }
1571
+ });
1572
+ Object.defineProperty(SequenceExecutor.prototype, "evaluateAssertions", {
1573
+ enumerable: false,
1574
+ configurable: true,
1575
+ writable: true,
1576
+ value: function (step) {
1577
+ var _this = this;
1578
+ var asserter = new asserter_1.Asserter(this.parameters);
1579
+ var evaluatedAssertions = [], evaluatedDisabledAssertions = [];
1580
+ if (step.assert) {
1581
+ step.assert.map(function (assertion, index) {
1582
+ evaluatedAssertions.push(assertion.disabled || _this.evaluateAssertion(asserter, index, assertion));
1583
+ evaluatedDisabledAssertions.push(!assertion.disabled || _this.evaluateDisabledAssertion(asserter, assertion));
1584
+ });
1585
+ }
1586
+ return { evaluatedAssertions: evaluatedAssertions, evaluatedDisabledAssertions: evaluatedDisabledAssertions };
1587
+ }
1588
+ });
1589
+ Object.defineProperty(SequenceExecutor.prototype, "evaluateAssertion", {
1590
+ enumerable: false,
1591
+ configurable: true,
1592
+ writable: true,
1593
+ value: function (asserter, reqIndex, assertion) {
1594
+ try {
1595
+ return !!assertion && asserter.assert(assertion);
1596
+ }
1597
+ catch (e) {
1598
+ setParameterErrorHistogram(e, "Failed to compute ${" + (assertion === null || assertion === void 0 ? void 0 : assertion.check) + "} (assertion #" + (reqIndex + 1) + ") - ");
1599
+ throw e;
1600
+ }
1601
+ }
1602
+ });
1603
+ Object.defineProperty(SequenceExecutor.prototype, "evaluateDisabledAssertion", {
1604
+ enumerable: false,
1605
+ configurable: true,
1606
+ writable: true,
1607
+ value: function (asserter, assertion) {
1608
+ try {
1609
+ return asserter.assert(assertion);
1610
+ }
1611
+ catch (_a) {
1612
+ return false;
1613
+ }
1614
+ }
1615
+ });
1616
+ Object.defineProperty(SequenceExecutor.prototype, "setRequestCookies", {
1617
+ enumerable: false,
1618
+ configurable: true,
1619
+ writable: true,
1620
+ value: function (reqIndex, resRequestHeaders) {
1621
+ var _a;
1622
+ if (resRequestHeaders === void 0) { resRequestHeaders = {}; }
1623
+ // add the request! cookies in case we have any
1624
+ var requestHeaders = (_a = this.resolvedRequests[reqIndex]) === null || _a === void 0 ? void 0 : _a.headers;
1625
+ if (requestHeaders) {
1626
+ if (resRequestHeaders.cookie) {
1627
+ var cookie = { 'cookie': resRequestHeaders.cookie };
1628
+ var idx = requestHeaders.findIndex(function (item) { return Object.keys(item).includes('cookie'); });
1629
+ requestHeaders[idx > 0 ? idx : requestHeaders.length] = cookie;
1630
+ }
1631
+ }
1632
+ }
1633
+ });
1634
+ Object.defineProperty(SequenceExecutor.prototype, "handleDisabledAssertions", {
1635
+ enumerable: false,
1636
+ configurable: true,
1637
+ writable: true,
1638
+ value: function (reqIndex, evaluatedAssertions) {
1639
+ var failuresHistogram = _evaluatedAssertionsToFailuresHistogram(evaluatedAssertions);
1640
+ if (!isEmpty_1.default(failuresHistogram)) {
1641
+ this.evaluatingFailures[reqIndex] = failures_1.OneFailure(failuresHistogram);
1642
+ }
1643
+ }
1644
+ });
1645
+ return SequenceExecutor;
1646
+ }());
1647
+ function _evaluatedAssertionsToFailuresHistogram(evaluatedAssertions) {
1648
+ var failuresHistogram = {};
1649
+ evaluatedAssertions.forEach(function (result, index) {
1650
+ if (!result) {
1651
+ failuresHistogram[index] = 1;
1652
+ }
1653
+ });
1654
+ return failuresHistogram;
1655
+ }
1656
+ function setParameterErrorHistogram(err, prefix) {
1657
+ var _a;
1658
+ err.histogram = (_a = {}, _a[prefix + (err.prettyMessage || 'Parameter error')] = 1, _a);
1659
+ }
1660
+ function isNonSimpleResponseHeader(headerName) {
1661
+ var normalized = headerName.toLowerCase();
1662
+ return (normalized !== 'cache-control' &&
1663
+ normalized !== 'content-language' &&
1664
+ normalized !== 'content-type' &&
1665
+ normalized !== 'expires' &&
1666
+ normalized !== 'last-modified' &&
1667
+ normalized !== 'pragma');
1668
+ }
1669
+ function isSimpleRequest(headers) {
1670
+ var contentType = headers['content-type'];
1671
+ if (contentType) {
1672
+ var type = contentType.split(';')[0];
1673
+ if (type !== 'text/plain' &&
1674
+ type !== 'multipart/form-data' &&
1675
+ type !== 'application/x-www-form-urlencoded') {
1676
+ return false;
1677
+ }
1678
+ }
1679
+ return !find_1.default(headers, function (_, key) {
1680
+ return key !== 'accept' &&
1681
+ key !== 'accept-language' &&
1682
+ key !== 'content-language' &&
1683
+ key !== 'content-type';
1684
+ });
1685
+ }
1686
+ var getLoopIterations = function (LoopConf) {
1687
+ var declared = (LoopConf && LoopConf.iterations) || 1;
1688
+ return Math.min(MAX_REQUEST_LOOPS_ITERATIONS, declared);
1689
+ };
1690
+ var extendResponseHeaders = function (headers, redirectHeaders) {
1691
+ if (!isEmpty_1.default(redirectHeaders) && headers) {
1692
+ redirectHeaders.forEach(function (loc, idx) {
1693
+ headers["location_" + (idx + 1)] = loc;
1694
+ });
1695
+ headers.location = redirectHeaders[redirectHeaders.length - 1]; // stroe the last one as location
1696
+ }
1697
+ return headers;
1698
+ };
1699
+ var isExpectedHttpStatus = function (_a, status) {
1700
+ var expectedStatus = _a.expectedStatus, url = _a.url;
1701
+ if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS) {
1702
+ return (200 <= status && status < 400) || status === 101;
1703
+ }
1704
+ else if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ERROR) {
1705
+ log_1.default.debug('user asked to fail this request', url);
1706
+ return 400 <= status && status < 600;
1707
+ }
1708
+ else if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ANY) {
1709
+ return true;
1710
+ }
1711
+ log_1.default.warn('Expected status is not valid, expectedStatus');
1712
+ return false;
1713
+ };
1714
+ /**
1715
+ * Superagent reuse the same request when redirecting and they are overiding the URL
1716
+ * So, we are setting the agent after the URL is overrided because there might be a change of protocols
1717
+ * Well done Omril
1718
+ */
1719
+ var setTCPReuse = function (request, agent, sslAgent) {
1720
+ var _oldRequest = request.request;
1721
+ request.request = function () {
1722
+ var args = [];
1723
+ for (var _i = 0; _i < arguments.length; _i++) {
1724
+ args[_i] = arguments[_i];
1725
+ }
1726
+ // first intercept the request and do our stuff
1727
+ var url = this.url;
1728
+ if (url.startsWith('https:')) {
1729
+ this.agent(sslAgent);
1730
+ }
1731
+ else {
1732
+ this.agent(agent);
1733
+ }
1734
+ // then continue with superagent logic
1735
+ _oldRequest.apply.apply(_oldRequest, __spreadArray([this], args));
1736
+ };
1737
+ };
1738
+ //# sourceMappingURL=sequence.js.map