@loadmill/executer 0.1.34 → 0.1.38

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/dist/sequence.js CHANGED
@@ -1,19 +1,4 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
2
  var __assign = (this && this.__assign) || function () {
18
3
  __assign = Object.assign || function(t) {
19
4
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -100,7 +85,6 @@ var clamp_1 = __importDefault(require("lodash/clamp"));
100
85
  var find_1 = __importDefault(require("lodash/find"));
101
86
  var map_1 = __importDefault(require("lodash/map"));
102
87
  var filter_1 = __importDefault(require("lodash/filter"));
103
- var forEach_1 = __importDefault(require("lodash/forEach"));
104
88
  var asserter_1 = require("./asserter");
105
89
  var failures_1 = require("./failures");
106
90
  var request_stats_1 = require("./request-stats");
@@ -117,8 +101,12 @@ var errors_1 = require("@loadmill/universal/dist/errors");
117
101
  var parameters_1 = require("@loadmill/core/dist/parameters");
118
102
  var conf_1 = require("@loadmill/core/dist/conf");
119
103
  var DEFAULT_CACHE_CONTROL = conf_1.confDefaults.DEFAULT_CACHE_CONTROL, DEFAULT_REQUEST_DELAY = conf_1.confDefaults.DEFAULT_REQUEST_DELAY;
120
- var MAX_API_REQUEST_BODY_LENGTH = conf_1.confExtrema.MAX_API_REQUEST_BODY_LENGTH, MAX_LOAD_REQUEST_BODY_LENGTH = conf_1.confExtrema.MAX_LOAD_REQUEST_BODY_LENGTH, MAX_RESPONSE_BYTES = conf_1.confExtrema.MAX_RESPONSE_BYTES, MAX_RESPONSE_COLLECT = conf_1.confExtrema.MAX_RESPONSE_COLLECT, MIN_REQUEST_DELAY = conf_1.confExtrema.MIN_REQUEST_DELAY, MAX_REQUEST_LOOPS_ITERATIONS = conf_1.confExtrema.MAX_REQUEST_LOOPS_ITERATIONS;
104
+ var MAX_RESPONSE_BYTES = conf_1.confExtrema.MAX_RESPONSE_BYTES, MAX_RESPONSE_COLLECT = conf_1.confExtrema.MAX_RESPONSE_COLLECT, MIN_REQUEST_DELAY = conf_1.confExtrema.MIN_REQUEST_DELAY, MAX_REQUEST_LOOPS_ITERATIONS = conf_1.confExtrema.MAX_REQUEST_LOOPS_ITERATIONS;
121
105
  var request_1 = require("@loadmill/core/dist/request");
106
+ var test_run_event_emitter_1 = require("./test-run-event-emitter");
107
+ var ws_1 = require("./ws");
108
+ var errors_2 = require("./errors");
109
+ var utils_1 = require("./utils");
122
110
  exports.reqIdParamName = 'loadmill-request-id';
123
111
  var SOCKET_TIMEOUT = request_1.DEFAULT_REQUEST_TIMEOUT + 5000; // deafult + some extra
124
112
  var isPerformance = typeof performance !== 'undefined';
@@ -150,6 +138,12 @@ var SequenceExecutor = /** @class */ (function () {
150
138
  writable: true,
151
139
  value: void 0
152
140
  });
141
+ Object.defineProperty(this, "postScriptRunner", {
142
+ enumerable: true,
143
+ configurable: true,
144
+ writable: true,
145
+ value: void 0
146
+ });
153
147
  Object.defineProperty(this, "avgResTime", {
154
148
  enumerable: true,
155
149
  configurable: true,
@@ -198,6 +192,12 @@ var SequenceExecutor = /** @class */ (function () {
198
192
  writable: true,
199
193
  value: void 0
200
194
  });
195
+ Object.defineProperty(this, "wsHandler", {
196
+ enumerable: true,
197
+ configurable: true,
198
+ writable: true,
199
+ value: void 0
200
+ });
201
201
  Object.defineProperty(this, "passStats", {
202
202
  enumerable: true,
203
203
  configurable: true,
@@ -211,6 +211,73 @@ var SequenceExecutor = /** @class */ (function () {
211
211
  lastStartedIndex: _this.lastStartedIndex,
212
212
  }); }
213
213
  });
214
+ Object.defineProperty(this, "resolveAndSetWSReqData", {
215
+ enumerable: true,
216
+ configurable: true,
217
+ writable: true,
218
+ value: function (_a, reqIndex) {
219
+ 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;
220
+ var preparedUrl = _this.prepareWsUrl(url, reqIndex);
221
+ var preparedHeaders = _this.prepareWsHeaders(headers, reqIndex);
222
+ var preparedMessage = _this.prepareWsMessage(postData, reqIndex);
223
+ return {
224
+ expectedStatus: expectedStatus,
225
+ headers: preparedHeaders,
226
+ message: preparedMessage,
227
+ timeout: timeout,
228
+ url: preparedUrl,
229
+ };
230
+ }
231
+ });
232
+ Object.defineProperty(this, "prepareWsUrl", {
233
+ enumerable: true,
234
+ configurable: true,
235
+ writable: true,
236
+ value: function (url, reqIndex) {
237
+ var resolvedUrl = _this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
238
+ _this.resolvedRequests[reqIndex].url = resolvedUrl;
239
+ return resolvedUrl;
240
+ }
241
+ });
242
+ Object.defineProperty(this, "prepareWsHeaders", {
243
+ enumerable: true,
244
+ configurable: true,
245
+ writable: true,
246
+ value: function (headers, reqIndex) {
247
+ var resolvedHeadersObj = {};
248
+ var resolvedHeaders = [];
249
+ if (headers && !isEmpty_1.default(headers)) {
250
+ resolvedHeaders.push.apply(resolvedHeaders, _this.resolveHeaders(headers));
251
+ resolvedHeaders.forEach(function (_a) {
252
+ var name = _a.name, value = _a.value;
253
+ return resolvedHeadersObj[name] = value;
254
+ });
255
+ }
256
+ _this.resolvedRequests[reqIndex].headers = resolvedHeaders;
257
+ return resolvedHeadersObj;
258
+ }
259
+ });
260
+ Object.defineProperty(this, "prepareWsMessage", {
261
+ enumerable: true,
262
+ configurable: true,
263
+ writable: true,
264
+ value: function (postData, reqIndex) {
265
+ var resolvedMessage = '';
266
+ if (postData) {
267
+ resolvedMessage = _this.resolve(postData.text, function (err) {
268
+ return setParameterErrorHistogram(err, 'Failed to compute Websocket message - ');
269
+ });
270
+ if (resolvedMessage && resolvedMessage.length > utils_1.getMaxRequestBodySize()) {
271
+ throw new errors_2.RequestFailuresError('Websocket message size is too large');
272
+ }
273
+ _this.resolvedRequests[reqIndex].postData = {
274
+ mimeType: postData.mimeType,
275
+ text: resolvedMessage,
276
+ };
277
+ }
278
+ return resolvedMessage;
279
+ }
280
+ });
214
281
  Object.defineProperty(this, "checkProgressEvent", {
215
282
  enumerable: true,
216
283
  configurable: true,
@@ -245,6 +312,8 @@ var SequenceExecutor = /** @class */ (function () {
245
312
  timeout: SOCKET_TIMEOUT,
246
313
  freeSocketTimeout: SOCKET_TIMEOUT / 2
247
314
  });
315
+ this.postScriptRunner = new post_script_executor_1.PostScriptRunner();
316
+ this.wsHandler = new ws_1.WSSequenceHandler();
248
317
  }
249
318
  Object.defineProperty(SequenceExecutor.prototype, "startAndPass", {
250
319
  enumerable: false,
@@ -310,11 +379,14 @@ var SequenceExecutor = /** @class */ (function () {
310
379
  log_1.default.info(reason, error_1);
311
380
  log_1.default.info('Unexpected error info:', unexpectedError);
312
381
  }
382
+ this.wsHandler.closeAllConnections();
313
383
  throw error_1;
314
384
  case 6:
315
385
  ++reqIndex;
316
386
  return [3 /*break*/, 1];
317
- case 7: return [2 /*return*/];
387
+ case 7:
388
+ this.wsHandler.closeAllConnections();
389
+ return [2 /*return*/];
318
390
  }
319
391
  });
320
392
  });
@@ -363,7 +435,10 @@ var SequenceExecutor = /** @class */ (function () {
363
435
  configurable: true,
364
436
  writable: true,
365
437
  value: function (request, reqIndex, requests) {
366
- var skipBefore = request.skipBefore;
438
+ var skipBefore = request.skipBefore, disabled = request.disabled;
439
+ if (disabled) {
440
+ return reqIndex + 1;
441
+ }
367
442
  if (skipBefore) {
368
443
  var goTo = skipBefore.goTo, negate = skipBefore.negate, condition = skipBefore.condition;
369
444
  var shouldSkip = this.isTruthyParameter('skip', condition);
@@ -396,7 +471,7 @@ var SequenceExecutor = /** @class */ (function () {
396
471
  : rawDelay)), MIN_REQUEST_DELAY, Infinity);
397
472
  problem = conf_1.validateIntegerDelay(delay, false);
398
473
  if (problem) {
399
- throw new RequestFailuresError("Invalid Request Delay: " + problem);
474
+ throw new errors_2.RequestFailuresError("Invalid Request Delay: " + problem);
400
475
  }
401
476
  return [4 /*yield*/, promiseUtils.delay(delay)];
402
477
  case 1:
@@ -421,50 +496,54 @@ var SequenceExecutor = /** @class */ (function () {
421
496
  writable: true,
422
497
  value: function (requestConf, index) {
423
498
  return __awaiter(this, void 0, void 0, function () {
424
- var failedAssertionsHistogram, resTime, loopIteration, maxIterations, request, res, timeout, message;
425
- return __generator(this, function (_a) {
426
- switch (_a.label) {
499
+ var failedAssertionsHistogram, resTime, loopIteration, maxIterations, request, res, _a, timeout, message;
500
+ return __generator(this, function (_b) {
501
+ switch (_b.label) {
427
502
  case 0:
428
503
  loopIteration = 0;
429
504
  maxIterations = getLoopIterations(requestConf.loop);
430
- _a.label = 1;
505
+ this.wsHandler.clearMessages();
506
+ _b.label = 1;
431
507
  case 1:
432
- if (!(loopIteration < maxIterations)) return [3 /*break*/, 8];
508
+ if (!(loopIteration < maxIterations)) return [3 /*break*/, 9];
433
509
  loopIteration++;
434
510
  request = this.prepareRequest(requestConf, index);
435
511
  return [4 /*yield*/, this.sendRequest(request, index)];
436
512
  case 2:
437
- res = _a.sent();
513
+ res = _b.sent();
438
514
  // Setting now to avoid possible user overwrite:
439
515
  resTime = Number(this.parameters.__responseTime);
440
- timeout = requestConf.timeout;
516
+ _a = requestConf.timeout, timeout = _a === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _a;
441
517
  if (resTime > timeout) {
442
- throw new RequestFailuresError("Response received after timeout of " + timeout + "ms exceeded");
518
+ throw new errors_2.RequestFailuresError("Response received after timeout of " + timeout + "ms exceeded");
443
519
  }
444
- failedAssertionsHistogram = this.processSuccessfulResponse(index, requestConf, res);
520
+ res.wsExtractionData = { messages: this.wsHandler.messages, timeLimit: timeout - resTime };
521
+ return [4 /*yield*/, this.processSuccessfulResponse(index, requestConf, res)];
522
+ case 3:
523
+ failedAssertionsHistogram = _b.sent();
445
524
  this.resolvedRequests[index].retried = loopIteration > 1 ? loopIteration - 1 : undefined;
446
- if (!(loopIteration < maxIterations)) return [3 /*break*/, 6];
447
- if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/, 3];
448
- return [3 /*break*/, 8];
449
- case 3: return [4 /*yield*/, promiseUtils.delay(1000)];
450
- case 4:
451
- _a.sent(); // todo yigal - make this configrable?
452
- _a.label = 5;
453
- case 5: return [3 /*break*/, 7];
454
- case 6:
525
+ if (!(loopIteration < maxIterations)) return [3 /*break*/, 7];
526
+ if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/, 4];
527
+ return [3 /*break*/, 9];
528
+ case 4: return [4 /*yield*/, promiseUtils.delay(1000)];
529
+ case 5:
530
+ _b.sent(); // todo yigal - make this configrable?
531
+ _b.label = 6;
532
+ case 6: return [3 /*break*/, 8];
533
+ case 7:
455
534
  if (this.hasLoopingFailed(requestConf.loop)) {
456
- throw new RequestFailuresError("Request failed to meet loop condition for " + maxIterations + " iterations");
535
+ throw new errors_2.RequestFailuresError("Request failed to meet loop condition for " + maxIterations + " iterations");
457
536
  }
458
- _a.label = 7;
459
- case 7: return [3 /*break*/, 1];
460
- case 8:
537
+ _b.label = 8;
538
+ case 8: return [3 /*break*/, 1];
539
+ case 9:
461
540
  if (!isEmpty_1.default(failedAssertionsHistogram)) {
462
541
  message = 'Request failed due to assertions.';
463
542
  log_1.default.debug(message, {
464
543
  failedAssertionsHistogram: failedAssertionsHistogram,
465
544
  parameters: this.parameters,
466
545
  });
467
- throw new RequestFailuresError(message, failedAssertionsHistogram);
546
+ throw new errors_2.RequestFailuresError(message, failedAssertionsHistogram);
468
547
  }
469
548
  this.onRequestSuccess(index, resTime);
470
549
  return [2 /*return*/];
@@ -589,7 +668,7 @@ var SequenceExecutor = /** @class */ (function () {
589
668
  case 7:
590
669
  reportedReason = errors_1.unknownStatusCorsError;
591
670
  _c.label = 8;
592
- case 8: throw new RequestFailuresError(message, (_b = {}, _b[reportedReason] = 1, _b));
671
+ case 8: throw new errors_2.RequestFailuresError(message, (_b = {}, _b[reportedReason] = 1, _b));
593
672
  case 9:
594
673
  failure = this.failures[reqIndex];
595
674
  if (failure) {
@@ -603,6 +682,27 @@ var SequenceExecutor = /** @class */ (function () {
603
682
  }
604
683
  });
605
684
  Object.defineProperty(SequenceExecutor.prototype, "prepareRequest", {
685
+ enumerable: false,
686
+ configurable: true,
687
+ writable: true,
688
+ value: function (requestConf, reqIndex) {
689
+ if (this.isWSRequest(requestConf) && !envUtils.isBrowser()) {
690
+ return this.prepareWSRequest(requestConf, reqIndex);
691
+ }
692
+ return this.prepareHttpRequest(requestConf, reqIndex);
693
+ }
694
+ });
695
+ Object.defineProperty(SequenceExecutor.prototype, "isWSRequest", {
696
+ enumerable: false,
697
+ configurable: true,
698
+ writable: true,
699
+ value: function (_a) {
700
+ var url = _a.url;
701
+ var resolvedUrl = this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
702
+ return resolvedUrl.startsWith('ws://') || resolvedUrl.startsWith('wss://');
703
+ }
704
+ });
705
+ Object.defineProperty(SequenceExecutor.prototype, "prepareHttpRequest", {
606
706
  enumerable: false,
607
707
  configurable: true,
608
708
  writable: true,
@@ -651,8 +751,8 @@ var SequenceExecutor = /** @class */ (function () {
651
751
  var data = this.resolve(postData.text, function (err) {
652
752
  return setParameterErrorHistogram(err, 'Failed to compute request body - ');
653
753
  });
654
- if (data && data.length > getMaxRequestBodySize()) {
655
- throw new RequestFailuresError('Request body size is too large');
754
+ if (data && data.length > utils_1.getMaxRequestBodySize()) {
755
+ throw new errors_2.RequestFailuresError('Request body size is too large');
656
756
  }
657
757
  // This invocation will behave differently according to different types set on the request:
658
758
  request.send(data);
@@ -710,7 +810,7 @@ var SequenceExecutor = /** @class */ (function () {
710
810
  request.on('progress', progressHandler);
711
811
  // This makes superagent populate res.text regardless of the response's content type:
712
812
  request.buffer();
713
- // Otherwise we expose superagent and its version -
813
+ // Otherwise we expose superagent and its version -
714
814
  // better have something more general (in case the user didnt set one):
715
815
  var uaHeader = request.get('User-Agent');
716
816
  if (!uaHeader || uaHeader.startsWith('node-superagent')) {
@@ -718,10 +818,20 @@ var SequenceExecutor = /** @class */ (function () {
718
818
  }
719
819
  }
720
820
  this.resolvedRequests[reqIndex].headers = manipulationUtils.objToSingletonArray(request.header);
721
- request.expectedStatus = requestConf.expectedStatus;
821
+ request.expectedStatus = requestConf.expectedStatus || request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS;
722
822
  return request;
723
823
  }
724
824
  });
825
+ Object.defineProperty(SequenceExecutor.prototype, "prepareWSRequest", {
826
+ enumerable: false,
827
+ configurable: true,
828
+ writable: true,
829
+ value: function (requestConf, reqIndex) {
830
+ var _this = this;
831
+ var wsRequestArgs = this.resolveAndSetWSReqData(requestConf, reqIndex);
832
+ return new ws_1.WSRequest(wsRequestArgs, this.wsHandler, function (e) { return _this.setSingleFailure(reqIndex, 'Websocket error ' + e.message); });
833
+ }
834
+ });
725
835
  Object.defineProperty(SequenceExecutor.prototype, "validateDomain", {
726
836
  enumerable: false,
727
837
  configurable: true,
@@ -730,15 +840,15 @@ var SequenceExecutor = /** @class */ (function () {
730
840
  var _a, _b, _c;
731
841
  if (isEmpty_1.default(domain)) {
732
842
  var message = 'HTTP request domain name is empty';
733
- throw new RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
843
+ throw new errors_2.RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
734
844
  }
735
845
  if (conf_1.validate.isUrl(domain)) {
736
846
  var message = "HTTP request domain name [" + domain + "] is not valid";
737
- throw new RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
847
+ throw new errors_2.RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
738
848
  }
739
849
  else if (!uriUtils.isVerified(domain, this.domainsWhiteList)) {
740
850
  var message = "HTTP request domain name [" + domain + "] is not on white list";
741
- throw new RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
851
+ throw new errors_2.RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
742
852
  }
743
853
  }
744
854
  });
@@ -772,21 +882,32 @@ var SequenceExecutor = /** @class */ (function () {
772
882
  configurable: true,
773
883
  writable: true,
774
884
  value: function (reqIndex, requestConf, res) {
775
- // modifies parameters:
776
- this.handleExtractions(requestConf, res);
777
- if (!envUtils.isBrowser()) {
778
- this.handlePostScript(requestConf, res);
779
- }
780
- this.setPostParameters(reqIndex);
781
- var assertionResults = this.handleAssertions(requestConf) || [];
782
- log_1.default.trace('Assertion results: ', assertionResults);
783
- var failuresHistogram = {};
784
- assertionResults.forEach(function (result, index) {
785
- if (!result) {
786
- failuresHistogram[index] = 1;
787
- }
885
+ return __awaiter(this, void 0, void 0, function () {
886
+ var assertionResults, failuresHistogram;
887
+ return __generator(this, function (_a) {
888
+ switch (_a.label) {
889
+ case 0:
890
+ // modifies parameters:
891
+ return [4 /*yield*/, this.handleExtractions(requestConf, res)];
892
+ case 1:
893
+ // modifies parameters:
894
+ _a.sent();
895
+ if (!envUtils.isBrowser()) {
896
+ this.handlePostScript(requestConf, res);
897
+ }
898
+ this.setPostParameters(reqIndex);
899
+ assertionResults = this.handleAssertions(requestConf) || [];
900
+ log_1.default.trace('Assertion results: ', assertionResults);
901
+ failuresHistogram = {};
902
+ assertionResults.forEach(function (result, index) {
903
+ if (!result) {
904
+ failuresHistogram[index] = 1;
905
+ }
906
+ });
907
+ return [2 /*return*/, failuresHistogram];
908
+ }
909
+ });
788
910
  });
789
- return failuresHistogram;
790
911
  }
791
912
  });
792
913
  Object.defineProperty(SequenceExecutor.prototype, "setPostParameters", {
@@ -802,10 +923,26 @@ var SequenceExecutor = /** @class */ (function () {
802
923
  configurable: true,
803
924
  writable: true,
804
925
  value: function (requestConf, res) {
805
- var _this = this;
806
- var _a;
807
- (_a = requestConf.extract) === null || _a === void 0 ? void 0 : _a.forEach(function (extractions) {
808
- return _this.extractInScope(res, extractions);
926
+ return __awaiter(this, void 0, void 0, function () {
927
+ var _i, _a, extractions;
928
+ return __generator(this, function (_b) {
929
+ switch (_b.label) {
930
+ case 0:
931
+ _i = 0, _a = (requestConf.extract || []);
932
+ _b.label = 1;
933
+ case 1:
934
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
935
+ extractions = _a[_i];
936
+ return [4 /*yield*/, this.extractInScope(res, extractions)];
937
+ case 2:
938
+ _b.sent();
939
+ _b.label = 3;
940
+ case 3:
941
+ _i++;
942
+ return [3 /*break*/, 1];
943
+ case 4: return [2 /*return*/];
944
+ }
945
+ });
809
946
  });
810
947
  }
811
948
  });
@@ -814,11 +951,28 @@ var SequenceExecutor = /** @class */ (function () {
814
951
  configurable: true,
815
952
  writable: true,
816
953
  value: function (res, extractions) {
817
- var _this = this;
818
- var contextParameters = Object.assign({}, this.parameters);
819
- var extractionCombiner = new extraction_combiner_1.ExtractionCombiner(contextParameters, res);
820
- forEach_1.default(extractions, function (extraction, name) {
821
- return _this.extract(name, extraction, extractionCombiner);
954
+ return __awaiter(this, void 0, void 0, function () {
955
+ var contextParameters, extractionCombiner, _i, _a, _b, name_1, extraction;
956
+ return __generator(this, function (_c) {
957
+ switch (_c.label) {
958
+ case 0:
959
+ contextParameters = Object.assign({}, this.parameters);
960
+ extractionCombiner = new extraction_combiner_1.ExtractionCombiner(contextParameters, res, res.wsExtractionData);
961
+ _i = 0, _a = Object.entries(extractions);
962
+ _c.label = 1;
963
+ case 1:
964
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
965
+ _b = _a[_i], name_1 = _b[0], extraction = _b[1];
966
+ return [4 /*yield*/, this.extract(name_1, extraction, extractionCombiner)];
967
+ case 2:
968
+ _c.sent();
969
+ _c.label = 3;
970
+ case 3:
971
+ _i++;
972
+ return [3 /*break*/, 1];
973
+ case 4: return [2 /*return*/];
974
+ }
975
+ });
822
976
  });
823
977
  }
824
978
  });
@@ -827,31 +981,46 @@ var SequenceExecutor = /** @class */ (function () {
827
981
  configurable: true,
828
982
  writable: true,
829
983
  value: function (parameterName, extraction, extractionCombiner) {
830
- log_1.default.trace('Parameter extraction start: ', { parameterName: parameterName, extraction: extraction });
831
- var combinedExtractor = extractionCombiner.combine(extraction);
832
- var result;
833
- try {
834
- result = combinedExtractor();
835
- }
836
- catch (error) {
837
- var genericMessage = "Failed to extract value for parameter \"" + parameterName + "\"";
838
- log_1.default.debug(genericMessage, error);
839
- var prettyMessage = error.prettyMessage;
840
- var publicMessage = prettyMessage
841
- ? genericMessage + " - " + prettyMessage
842
- : genericMessage;
843
- throw new RequestFailuresError(publicMessage);
844
- }
845
- if (result != null) {
846
- this.parameters[parameterName] = result;
847
- }
848
- else if (this.parameters[parameterName] == null) {
849
- // Existing parameter value acts as default. If no such value exists,
850
- // we set the value to be an empty string to differentiate it from undefined parameters.
851
- // Otherwise, this parameter's usages would stay untouched, e.g. "${paramName}".
852
- this.parameters[parameterName] = '';
853
- }
854
- log_1.default.trace('Parameter value:', this.parameters[parameterName]);
984
+ return __awaiter(this, void 0, void 0, function () {
985
+ var combinedExtractor, result, error_3, genericMessage, prettyMessage, publicMessage;
986
+ return __generator(this, function (_a) {
987
+ switch (_a.label) {
988
+ case 0:
989
+ log_1.default.trace('Parameter extraction start: ', { parameterName: parameterName, extraction: extraction });
990
+ return [4 /*yield*/, extractionCombiner.combine(extraction)];
991
+ case 1:
992
+ combinedExtractor = _a.sent();
993
+ _a.label = 2;
994
+ case 2:
995
+ _a.trys.push([2, 4, , 5]);
996
+ return [4 /*yield*/, combinedExtractor()];
997
+ case 3:
998
+ result = _a.sent();
999
+ return [3 /*break*/, 5];
1000
+ case 4:
1001
+ error_3 = _a.sent();
1002
+ genericMessage = "Failed to extract value for parameter \"" + parameterName + "\"";
1003
+ log_1.default.debug(genericMessage, error_3);
1004
+ prettyMessage = error_3.prettyMessage;
1005
+ publicMessage = prettyMessage
1006
+ ? genericMessage + " - " + prettyMessage
1007
+ : genericMessage;
1008
+ throw new errors_2.RequestFailuresError(publicMessage);
1009
+ case 5:
1010
+ if (result != null) {
1011
+ this.parameters[parameterName] = result;
1012
+ }
1013
+ else if (this.parameters[parameterName] == null) {
1014
+ // Existing parameter value acts as default. If no such value exists,
1015
+ // we set the value to be an empty string to differentiate it from undefined parameters.
1016
+ // Otherwise, this parameter's usages would stay untouched, e.g. "${paramName}".
1017
+ this.parameters[parameterName] = '';
1018
+ }
1019
+ log_1.default.trace('Parameter value:', this.parameters[parameterName]);
1020
+ return [2 /*return*/];
1021
+ }
1022
+ });
1023
+ });
855
1024
  }
856
1025
  });
857
1026
  Object.defineProperty(SequenceExecutor.prototype, "resolve", {
@@ -869,23 +1038,42 @@ var SequenceExecutor = /** @class */ (function () {
869
1038
  value: function (_a, _b) {
870
1039
  var postScript = _a.postScript;
871
1040
  var _c = _b.text, text = _c === void 0 ? '' : _c;
872
- try {
873
- if (postScript) {
874
- var $_1 = {};
875
- try {
876
- $_1 = JSON.parse(text);
877
- }
878
- catch (e) {
879
- log_1.default.debug('res text (body) cannot be JSON parsed', e.name, e.message);
880
- }
881
- var staticContext = { $: $_1, __: parameters_1.parameterFunctionOperations };
882
- Object.assign(this.parameters, new post_script_executor_1.PostScriptRunner().run({ staticContext: staticContext }, this.parameters, postScript));
1041
+ if (postScript) {
1042
+ test_run_event_emitter_1.testRunEventsEmitter.postScript.started();
1043
+ try {
1044
+ var result = this.runPostScript(postScript, text);
1045
+ Object.assign(this.parameters, result);
1046
+ }
1047
+ catch (e) {
1048
+ var message = ['Post Script', e.name + ':', e.message].join(' ');
1049
+ throw new errors_2.RequestFailuresError(message);
883
1050
  }
1051
+ test_run_event_emitter_1.testRunEventsEmitter.postScript.finished();
1052
+ }
1053
+ }
1054
+ });
1055
+ Object.defineProperty(SequenceExecutor.prototype, "runPostScript", {
1056
+ enumerable: false,
1057
+ configurable: true,
1058
+ writable: true,
1059
+ value: function (postScript, text) {
1060
+ var staticContext = this.getStaticContext(text);
1061
+ return this.postScriptRunner.run({ staticContext: staticContext }, this.parameters, postScript);
1062
+ }
1063
+ });
1064
+ Object.defineProperty(SequenceExecutor.prototype, "getStaticContext", {
1065
+ enumerable: false,
1066
+ configurable: true,
1067
+ writable: true,
1068
+ value: function (text) {
1069
+ var $ = {};
1070
+ try {
1071
+ $ = JSON.parse(text);
884
1072
  }
885
1073
  catch (e) {
886
- var message = ['Post Script', e.name + ':', e.message].join(' ');
887
- throw new RequestFailuresError(message);
1074
+ log_1.default.debug('res text (body) cannot be JSON parsed', e.name, e.message);
888
1075
  }
1076
+ return { $: $, __: parameters_1.parameterFunctionOperations };
889
1077
  }
890
1078
  });
891
1079
  Object.defineProperty(SequenceExecutor.prototype, "handleAssertions", {
@@ -938,9 +1126,6 @@ function isSimpleRequest(headers) {
938
1126
  key !== 'content-type';
939
1127
  });
940
1128
  }
941
- var getMaxRequestBodySize = function () {
942
- return envUtils.isBrowser() ? MAX_LOAD_REQUEST_BODY_LENGTH : MAX_API_REQUEST_BODY_LENGTH;
943
- };
944
1129
  var getLoopIterations = function (LoopConf) {
945
1130
  var declared = (LoopConf && LoopConf.iterations) || 1;
946
1131
  return Math.min(MAX_REQUEST_LOOPS_ITERATIONS, declared);
@@ -957,7 +1142,7 @@ var extendResponseHeaders = function (headers, redirectHeaders) {
957
1142
  var isExpectedStatus = function (_a, status) {
958
1143
  var expectedStatus = _a.expectedStatus, url = _a.url;
959
1144
  if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS) {
960
- return 200 <= status && status < 400;
1145
+ return (200 <= status && status < 400) || status === 101;
961
1146
  }
962
1147
  else if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ERROR) {
963
1148
  log_1.default.debug('user asked to fail this request', url);
@@ -993,22 +1178,4 @@ var setTCPReuse = function (request, agent, sslAgent) {
993
1178
  _oldRequest.apply.apply(_oldRequest, __spreadArray([this], args));
994
1179
  };
995
1180
  };
996
- var RequestFailuresError = /** @class */ (function (_super) {
997
- __extends(RequestFailuresError, _super);
998
- function RequestFailuresError(message, histogram) {
999
- var _a;
1000
- if (histogram === void 0) { histogram = (_a = {}, _a[message] = 1, _a); }
1001
- var _this = _super.call(this, message) || this;
1002
- Object.defineProperty(_this, "histogram", {
1003
- enumerable: true,
1004
- configurable: true,
1005
- writable: true,
1006
- value: histogram
1007
- });
1008
- // Workaround suggested in: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
1009
- Object.setPrototypeOf(_this, RequestFailuresError.prototype);
1010
- return _this;
1011
- }
1012
- return RequestFailuresError;
1013
- }(Error));
1014
1181
  //# sourceMappingURL=sequence.js.map