@loadmill/executer 0.1.140 → 0.1.142

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 (259) hide show
  1. package/dist/asserter.d.ts +9 -0
  2. package/dist/asserter.js +158 -0
  3. package/dist/asserter.js.map +1 -0
  4. package/dist/constants.d.ts +7 -0
  5. package/dist/constants.js +13 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/cookies.d.ts +4 -0
  8. package/dist/cookies.js +79 -0
  9. package/dist/cookies.js.map +1 -0
  10. package/dist/errors.d.ts +5 -0
  11. package/dist/errors.js +38 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/extraction-combiner.d.ts +17 -0
  14. package/dist/extraction-combiner.js +182 -0
  15. package/dist/extraction-combiner.js.map +1 -0
  16. package/dist/failures.d.ts +24 -0
  17. package/dist/failures.js +67 -0
  18. package/dist/failures.js.map +1 -0
  19. package/dist/grpc.d.ts +34 -0
  20. package/dist/grpc.js +269 -0
  21. package/dist/grpc.js.map +1 -0
  22. package/dist/iteration-stats.d.ts +2 -0
  23. package/dist/iteration-stats.js +38 -0
  24. package/dist/iteration-stats.js.map +1 -0
  25. package/dist/message-creators.d.ts +31 -0
  26. package/dist/message-creators.js +90 -0
  27. package/dist/message-creators.js.map +1 -0
  28. package/dist/mill-info.d.ts +70 -0
  29. package/dist/mill-info.js +3 -0
  30. package/dist/mill-info.js.map +1 -0
  31. package/dist/mill-version.d.ts +6 -0
  32. package/dist/mill-version.js +10 -0
  33. package/dist/mill-version.js.map +1 -0
  34. package/dist/parameter-pools.d.ts +3 -0
  35. package/dist/parameter-pools.js +69 -0
  36. package/dist/parameter-pools.js.map +1 -0
  37. package/dist/performance.d.ts +1 -0
  38. package/dist/performance.js +10 -0
  39. package/dist/performance.js.map +1 -0
  40. package/dist/post-script/ast-walker/index.d.ts +18 -0
  41. package/dist/post-script/ast-walker/index.js +215 -0
  42. package/dist/post-script/ast-walker/index.js.map +1 -0
  43. package/dist/post-script/ast-walker/type-guard.d.ts +11 -0
  44. package/dist/post-script/ast-walker/type-guard.js +56 -0
  45. package/dist/post-script/ast-walker/type-guard.js.map +1 -0
  46. package/dist/post-script/ast-walker/types.d.ts +24 -0
  47. package/dist/post-script/ast-walker/types.js +25 -0
  48. package/dist/post-script/ast-walker/types.js.map +1 -0
  49. package/dist/post-script/console-log.d.ts +7 -0
  50. package/dist/post-script/console-log.js +31 -0
  51. package/dist/post-script/console-log.js.map +1 -0
  52. package/dist/post-script/constants.d.ts +4 -0
  53. package/dist/post-script/constants.js +9 -0
  54. package/dist/post-script/constants.js.map +1 -0
  55. package/dist/post-script/parser/acorn-js-parser.d.ts +5 -0
  56. package/dist/post-script/parser/acorn-js-parser.js +20 -0
  57. package/dist/post-script/parser/acorn-js-parser.js.map +1 -0
  58. package/dist/post-script/parser/js-parser.d.ts +16 -0
  59. package/dist/post-script/parser/js-parser.js +3 -0
  60. package/dist/post-script/parser/js-parser.js.map +1 -0
  61. package/dist/post-script/parser/parser.d.ts +6 -0
  62. package/dist/post-script/parser/parser.js +3 -0
  63. package/dist/post-script/parser/parser.js.map +1 -0
  64. package/dist/post-script/post-script-executor.d.ts +24 -0
  65. package/dist/post-script/post-script-executor.js +125 -0
  66. package/dist/post-script/post-script-executor.js.map +1 -0
  67. package/dist/post-script/virtual-machine/virtual-machine.d.ts +13 -0
  68. package/dist/post-script/virtual-machine/virtual-machine.js +3 -0
  69. package/dist/post-script/virtual-machine/virtual-machine.js.map +1 -0
  70. package/dist/post-script/virtual-machine/vm2-virtual-machine.d.ts +12 -0
  71. package/dist/post-script/virtual-machine/vm2-virtual-machine.js +81 -0
  72. package/dist/post-script/virtual-machine/vm2-virtual-machine.js.map +1 -0
  73. package/dist/post-sequence.d.ts +2 -0
  74. package/dist/post-sequence.js +192 -0
  75. package/dist/post-sequence.js.map +1 -0
  76. package/dist/redact-data.d.ts +2 -0
  77. package/dist/redact-data.js +60 -0
  78. package/dist/redact-data.js.map +1 -0
  79. package/dist/report-types.d.ts +102 -0
  80. package/dist/report-types.js +11 -0
  81. package/dist/report-types.js.map +1 -0
  82. package/dist/request-sequence-result.d.ts +37 -0
  83. package/dist/request-sequence-result.js +19 -0
  84. package/dist/request-sequence-result.js.map +1 -0
  85. package/dist/request-stats.d.ts +13 -0
  86. package/dist/request-stats.js +14 -0
  87. package/dist/request-stats.js.map +1 -0
  88. package/dist/res-keeper.d.ts +16 -0
  89. package/dist/res-keeper.js +104 -0
  90. package/dist/res-keeper.js.map +1 -0
  91. package/dist/sampler.d.ts +29 -0
  92. package/dist/sampler.js +276 -0
  93. package/dist/sampler.js.map +1 -0
  94. package/dist/sequence-executor-like.d.ts +23 -0
  95. package/dist/sequence-executor-like.js +3 -0
  96. package/dist/sequence-executor-like.js.map +1 -0
  97. package/dist/sequence.d.ts +16 -0
  98. package/dist/sequence.js +1738 -0
  99. package/dist/sequence.js.map +1 -0
  100. package/dist/single-runner.d.ts +29 -0
  101. package/dist/single-runner.js +147 -0
  102. package/dist/single-runner.js.map +1 -0
  103. package/dist/step-handlers/code-step-handler.d.ts +12 -0
  104. package/dist/step-handlers/code-step-handler.js +93 -0
  105. package/dist/step-handlers/code-step-handler.js.map +1 -0
  106. package/dist/step-handlers/extract-step-handler.d.ts +12 -0
  107. package/dist/step-handlers/extract-step-handler.js +101 -0
  108. package/dist/step-handlers/extract-step-handler.js.map +1 -0
  109. package/dist/step-handlers/request-step-handler.d.ts +13 -0
  110. package/dist/step-handlers/request-step-handler.js +94 -0
  111. package/dist/step-handlers/request-step-handler.js.map +1 -0
  112. package/dist/step-handlers/step-handler.d.ts +11 -0
  113. package/dist/step-handlers/step-handler.js +3 -0
  114. package/dist/step-handlers/step-handler.js.map +1 -0
  115. package/dist/test-run-event-emitter.d.ts +15 -0
  116. package/dist/test-run-event-emitter.js +36 -0
  117. package/dist/test-run-event-emitter.js.map +1 -0
  118. package/dist/types/grpc.d.ts +14 -0
  119. package/dist/types/grpc.js +3 -0
  120. package/dist/types/grpc.js.map +1 -0
  121. package/dist/utils.d.ts +3 -0
  122. package/dist/utils.js +32 -0
  123. package/dist/utils.js.map +1 -0
  124. package/dist/work.d.ts +15 -0
  125. package/dist/work.js +3 -0
  126. package/dist/work.js.map +1 -0
  127. package/dist/ws.d.ts +71 -0
  128. package/dist/ws.js +474 -0
  129. package/dist/ws.js.map +1 -0
  130. package/package/dist/asserter.d.ts +9 -0
  131. package/package/dist/asserter.js +158 -0
  132. package/package/dist/asserter.js.map +1 -0
  133. package/package/dist/constants.d.ts +7 -0
  134. package/package/dist/constants.js +13 -0
  135. package/package/dist/constants.js.map +1 -0
  136. package/package/dist/cookies.d.ts +4 -0
  137. package/package/dist/cookies.js +79 -0
  138. package/package/dist/cookies.js.map +1 -0
  139. package/package/dist/errors.d.ts +5 -0
  140. package/package/dist/errors.js +38 -0
  141. package/package/dist/errors.js.map +1 -0
  142. package/package/dist/extraction-combiner.d.ts +17 -0
  143. package/package/dist/extraction-combiner.js +182 -0
  144. package/package/dist/extraction-combiner.js.map +1 -0
  145. package/package/dist/failures.d.ts +24 -0
  146. package/package/dist/failures.js +67 -0
  147. package/package/dist/failures.js.map +1 -0
  148. package/package/dist/grpc.d.ts +34 -0
  149. package/package/dist/grpc.js +269 -0
  150. package/package/dist/grpc.js.map +1 -0
  151. package/package/dist/iteration-stats.d.ts +2 -0
  152. package/package/dist/iteration-stats.js +38 -0
  153. package/package/dist/iteration-stats.js.map +1 -0
  154. package/package/dist/message-creators.d.ts +31 -0
  155. package/package/dist/message-creators.js +90 -0
  156. package/package/dist/message-creators.js.map +1 -0
  157. package/package/dist/mill-info.d.ts +70 -0
  158. package/package/dist/mill-info.js +3 -0
  159. package/package/dist/mill-info.js.map +1 -0
  160. package/package/dist/mill-version.d.ts +6 -0
  161. package/package/dist/mill-version.js +10 -0
  162. package/package/dist/mill-version.js.map +1 -0
  163. package/package/dist/parameter-pools.d.ts +3 -0
  164. package/package/dist/parameter-pools.js +69 -0
  165. package/package/dist/parameter-pools.js.map +1 -0
  166. package/package/dist/performance.d.ts +1 -0
  167. package/package/dist/performance.js +10 -0
  168. package/package/dist/performance.js.map +1 -0
  169. package/package/dist/post-script/ast-walker/index.d.ts +18 -0
  170. package/package/dist/post-script/ast-walker/index.js +215 -0
  171. package/package/dist/post-script/ast-walker/index.js.map +1 -0
  172. package/package/dist/post-script/ast-walker/type-guard.d.ts +11 -0
  173. package/package/dist/post-script/ast-walker/type-guard.js +56 -0
  174. package/package/dist/post-script/ast-walker/type-guard.js.map +1 -0
  175. package/package/dist/post-script/ast-walker/types.d.ts +24 -0
  176. package/package/dist/post-script/ast-walker/types.js +25 -0
  177. package/package/dist/post-script/ast-walker/types.js.map +1 -0
  178. package/package/dist/post-script/console-log.d.ts +7 -0
  179. package/package/dist/post-script/console-log.js +31 -0
  180. package/package/dist/post-script/console-log.js.map +1 -0
  181. package/package/dist/post-script/constants.d.ts +4 -0
  182. package/package/dist/post-script/constants.js +9 -0
  183. package/package/dist/post-script/constants.js.map +1 -0
  184. package/package/dist/post-script/parser/acorn-js-parser.d.ts +5 -0
  185. package/package/dist/post-script/parser/acorn-js-parser.js +20 -0
  186. package/package/dist/post-script/parser/acorn-js-parser.js.map +1 -0
  187. package/package/dist/post-script/parser/js-parser.d.ts +16 -0
  188. package/package/dist/post-script/parser/js-parser.js +3 -0
  189. package/package/dist/post-script/parser/js-parser.js.map +1 -0
  190. package/package/dist/post-script/parser/parser.d.ts +6 -0
  191. package/package/dist/post-script/parser/parser.js +3 -0
  192. package/package/dist/post-script/parser/parser.js.map +1 -0
  193. package/package/dist/post-script/post-script-executor.d.ts +24 -0
  194. package/package/dist/post-script/post-script-executor.js +125 -0
  195. package/package/dist/post-script/post-script-executor.js.map +1 -0
  196. package/package/dist/post-script/virtual-machine/virtual-machine.d.ts +13 -0
  197. package/package/dist/post-script/virtual-machine/virtual-machine.js +3 -0
  198. package/package/dist/post-script/virtual-machine/virtual-machine.js.map +1 -0
  199. package/package/dist/post-script/virtual-machine/vm2-virtual-machine.d.ts +12 -0
  200. package/package/dist/post-script/virtual-machine/vm2-virtual-machine.js +81 -0
  201. package/package/dist/post-script/virtual-machine/vm2-virtual-machine.js.map +1 -0
  202. package/package/dist/post-sequence.d.ts +2 -0
  203. package/package/dist/post-sequence.js +192 -0
  204. package/package/dist/post-sequence.js.map +1 -0
  205. package/package/dist/redact-data.d.ts +2 -0
  206. package/package/dist/redact-data.js +60 -0
  207. package/package/dist/redact-data.js.map +1 -0
  208. package/package/dist/report-types.d.ts +102 -0
  209. package/package/dist/report-types.js +11 -0
  210. package/package/dist/report-types.js.map +1 -0
  211. package/package/dist/request-sequence-result.d.ts +37 -0
  212. package/package/dist/request-sequence-result.js +19 -0
  213. package/package/dist/request-sequence-result.js.map +1 -0
  214. package/package/dist/request-stats.d.ts +13 -0
  215. package/package/dist/request-stats.js +14 -0
  216. package/package/dist/request-stats.js.map +1 -0
  217. package/package/dist/res-keeper.d.ts +16 -0
  218. package/package/dist/res-keeper.js +104 -0
  219. package/package/dist/res-keeper.js.map +1 -0
  220. package/package/dist/sampler.d.ts +29 -0
  221. package/package/dist/sampler.js +276 -0
  222. package/package/dist/sampler.js.map +1 -0
  223. package/package/dist/sequence-executor-like.d.ts +23 -0
  224. package/package/dist/sequence-executor-like.js +3 -0
  225. package/package/dist/sequence-executor-like.js.map +1 -0
  226. package/package/dist/sequence.d.ts +16 -0
  227. package/package/dist/sequence.js +1738 -0
  228. package/package/dist/sequence.js.map +1 -0
  229. package/package/dist/single-runner.d.ts +29 -0
  230. package/package/dist/single-runner.js +147 -0
  231. package/package/dist/single-runner.js.map +1 -0
  232. package/package/dist/step-handlers/code-step-handler.d.ts +12 -0
  233. package/package/dist/step-handlers/code-step-handler.js +93 -0
  234. package/package/dist/step-handlers/code-step-handler.js.map +1 -0
  235. package/package/dist/step-handlers/extract-step-handler.d.ts +12 -0
  236. package/package/dist/step-handlers/extract-step-handler.js +101 -0
  237. package/package/dist/step-handlers/extract-step-handler.js.map +1 -0
  238. package/package/dist/step-handlers/request-step-handler.d.ts +13 -0
  239. package/package/dist/step-handlers/request-step-handler.js +94 -0
  240. package/package/dist/step-handlers/request-step-handler.js.map +1 -0
  241. package/package/dist/step-handlers/step-handler.d.ts +11 -0
  242. package/package/dist/step-handlers/step-handler.js +3 -0
  243. package/package/dist/step-handlers/step-handler.js.map +1 -0
  244. package/package/dist/test-run-event-emitter.d.ts +15 -0
  245. package/package/dist/test-run-event-emitter.js +36 -0
  246. package/package/dist/test-run-event-emitter.js.map +1 -0
  247. package/package/dist/types/grpc.d.ts +14 -0
  248. package/package/dist/types/grpc.js +3 -0
  249. package/package/dist/types/grpc.js.map +1 -0
  250. package/package/dist/utils.d.ts +3 -0
  251. package/package/dist/utils.js +32 -0
  252. package/package/dist/utils.js.map +1 -0
  253. package/package/dist/work.d.ts +15 -0
  254. package/package/dist/work.js +3 -0
  255. package/package/dist/work.js.map +1 -0
  256. package/package/dist/ws.d.ts +71 -0
  257. package/package/dist/ws.js +474 -0
  258. package/package/dist/ws.js.map +1 -0
  259. package/package.json +4 -3
@@ -0,0 +1,125 @@
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 __spreadArray = (this && this.__spreadArray) || function (to, from) {
14
+ for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
15
+ to[j] = from[i];
16
+ return to;
17
+ };
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.PostScriptRunner = void 0;
23
+ var assert_1 = require("assert");
24
+ var cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
25
+ var ast_walker_1 = require("./ast-walker");
26
+ var vm2_virtual_machine_1 = require("./virtual-machine/vm2-virtual-machine");
27
+ var console_log_1 = require("./console-log");
28
+ var PostScriptRunner = /** @class */ (function () {
29
+ function PostScriptRunner() {
30
+ var _this = this;
31
+ Object.defineProperty(this, "run", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: function (outerStaticContext, dynamicContext, userCode, responseBody) {
36
+ if (outerStaticContext === void 0) { outerStaticContext = { staticContext: { __: {} } }; }
37
+ if (dynamicContext === void 0) { dynamicContext = {}; }
38
+ if (userCode === void 0) { userCode = ''; }
39
+ if (responseBody === void 0) { responseBody = {}; }
40
+ var newVariables = new ast_walker_1.ASTWalker(userCode).detectDeclarations(Object.keys(outerStaticContext.staticContext));
41
+ var wrappedUserCode = _this.wrapUserCode(dynamicContext, userCode, newVariables);
42
+ var vm = new vm2_virtual_machine_1.VM2VirtualMachine();
43
+ vm.create({
44
+ globalObject: __assign(__assign({ assert: assert_1.strict }, dynamicContext), { console: cloneDeep_1.default(console_log_1.myConsole), $: responseBody }),
45
+ staticObject: outerStaticContext,
46
+ });
47
+ var modifiedDynamicContext = vm.run(wrappedUserCode);
48
+ _this.validateCircularDependency(modifiedDynamicContext);
49
+ _this.removeAssertModule(modifiedDynamicContext);
50
+ return { result: _this.unproxify(modifiedDynamicContext) };
51
+ }
52
+ });
53
+ Object.defineProperty(this, "wrapUserCode", {
54
+ enumerable: true,
55
+ configurable: true,
56
+ writable: true,
57
+ value: function (dynamicContext, userCode, newVariables) {
58
+ if (dynamicContext === void 0) { dynamicContext = {}; }
59
+ if (userCode === void 0) { userCode = ''; }
60
+ if (newVariables === void 0) { newVariables = []; }
61
+ var prefix = "\n Buffer = {};\n global = { assert: global.assert, console: global.console };\n $ = " + _this.unproxifyResponseBody() + ";\n ";
62
+ var suffix = "\n exports = {\n " + __spreadArray(__spreadArray([], Object.keys(dynamicContext)), newVariables).join() + "\n };\n ";
63
+ return prefix + userCode + suffix;
64
+ }
65
+ });
66
+ /**
67
+ * If the response JSON is an array, we need to unproxify it
68
+ * https://github.com/patriksimek/vm2/issues/437
69
+ */
70
+ Object.defineProperty(this, "unproxifyResponseBody", {
71
+ enumerable: true,
72
+ configurable: true,
73
+ writable: true,
74
+ value: function () { return 'JSON.parse(JSON.stringify($))'; }
75
+ });
76
+ Object.defineProperty(this, "validateCircularDependency", {
77
+ enumerable: true,
78
+ configurable: true,
79
+ writable: true,
80
+ value: function (obj) {
81
+ function circularError(propName) {
82
+ return new TypeError("Cyclic object value. Circular reference in property " + propName);
83
+ }
84
+ findCircular(obj);
85
+ function findCircular(obj, _refs) {
86
+ if (_refs === void 0) { _refs = new WeakSet(); }
87
+ if (typeof obj === 'object' && obj !== null) {
88
+ _refs.add(obj);
89
+ for (var key in obj) {
90
+ if (_refs.has(obj[key])) {
91
+ throw circularError(key);
92
+ }
93
+ findCircular(obj[key], _refs);
94
+ }
95
+ _refs.delete(obj);
96
+ }
97
+ }
98
+ }
99
+ });
100
+ }
101
+ Object.defineProperty(PostScriptRunner.prototype, "removeAssertModule", {
102
+ enumerable: false,
103
+ configurable: true,
104
+ writable: true,
105
+ value: function (context) {
106
+ Object.keys(context).forEach(function (key) {
107
+ var _a, _b;
108
+ if (((_b = (_a = context[key]) === null || _a === void 0 ? void 0 : _a.assert) === null || _b === void 0 ? void 0 : _b.name) === 'strict') {
109
+ context[key] = {};
110
+ }
111
+ });
112
+ }
113
+ });
114
+ Object.defineProperty(PostScriptRunner.prototype, "unproxify", {
115
+ enumerable: false,
116
+ configurable: true,
117
+ writable: true,
118
+ value: function (proxy) {
119
+ return cloneDeep_1.default(proxy);
120
+ }
121
+ });
122
+ return PostScriptRunner;
123
+ }());
124
+ exports.PostScriptRunner = PostScriptRunner;
125
+ //# sourceMappingURL=post-script-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-script-executor.js","sourceRoot":"","sources":["../../src/post-script/post-script-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface VirtualMachine {
2
+ engine: Engine;
3
+ create(options: VirtualMachineOptions): Engine;
4
+ run(code: string): object;
5
+ }
6
+ export interface VirtualMachineOptions {
7
+ globalObject?: object;
8
+ staticObject?: object;
9
+ timeout?: number;
10
+ memoryLimit?: number;
11
+ async?: boolean;
12
+ }
13
+ export declare type Engine = any;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=virtual-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-machine.js","sourceRoot":"","sources":["../../../src/post-script/virtual-machine/virtual-machine.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { VM } from 'vm2';
2
+ import { SequenceExecutorParameters } from '../../../../core/dist/parameters';
3
+ import { Engine, VirtualMachine, VirtualMachineOptions } from './virtual-machine';
4
+ export declare class VM2VirtualMachine implements VirtualMachine {
5
+ engine: VM;
6
+ private DEFAULT_TIMOUT_MS;
7
+ create(options: VirtualMachineOptions): Engine;
8
+ makeStatic(obj?: object): void;
9
+ deepFreeze: (obj: object) => any;
10
+ setGlobals: (globalObject?: SequenceExecutorParameters) => void;
11
+ run(code: string): SequenceExecutorParameters;
12
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VM2VirtualMachine = void 0;
4
+ var vm2_1 = require("vm2");
5
+ var VM2VirtualMachine = /** @class */ (function () {
6
+ function VM2VirtualMachine() {
7
+ var _this = this;
8
+ Object.defineProperty(this, "engine", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: void 0
13
+ });
14
+ Object.defineProperty(this, "DEFAULT_TIMOUT_MS", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: Number(process.env.POSTSCRIPT_TIMEOUT_MS) || 2000
19
+ });
20
+ Object.defineProperty(this, "deepFreeze", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: function (obj) {
25
+ for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
26
+ var key = _a[_i];
27
+ if (typeof obj[key] === 'object' && obj[key] !== null) {
28
+ _this.engine.freeze(obj[key], key); // freeze me
29
+ _this.deepFreeze(obj[key]); // freeze my childrens
30
+ }
31
+ }
32
+ return _this.engine.freeze(obj); // freeze root
33
+ }
34
+ });
35
+ Object.defineProperty(this, "setGlobals", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: function (globalObject) {
40
+ if (globalObject === void 0) { globalObject = {}; }
41
+ _this.engine.setGlobals(globalObject);
42
+ }
43
+ });
44
+ }
45
+ Object.defineProperty(VM2VirtualMachine.prototype, "create", {
46
+ enumerable: false,
47
+ configurable: true,
48
+ writable: true,
49
+ value: function (options) {
50
+ var timeout = options.timeout, globalObject = options.globalObject, async = options.async, staticObject = options.staticObject;
51
+ this.engine = new vm2_1.VM({
52
+ timeout: timeout || this.DEFAULT_TIMOUT_MS,
53
+ fixAsync: !async,
54
+ eval: false,
55
+ wasm: false,
56
+ });
57
+ this.makeStatic(staticObject);
58
+ this.setGlobals(globalObject);
59
+ }
60
+ });
61
+ Object.defineProperty(VM2VirtualMachine.prototype, "makeStatic", {
62
+ enumerable: false,
63
+ configurable: true,
64
+ writable: true,
65
+ value: function (obj) {
66
+ if (obj === void 0) { obj = {}; }
67
+ this.deepFreeze(obj);
68
+ }
69
+ });
70
+ Object.defineProperty(VM2VirtualMachine.prototype, "run", {
71
+ enumerable: false,
72
+ configurable: true,
73
+ writable: true,
74
+ value: function (code) {
75
+ return this.engine.run(code);
76
+ }
77
+ });
78
+ return VM2VirtualMachine;
79
+ }());
80
+ exports.VM2VirtualMachine = VM2VirtualMachine;
81
+ //# sourceMappingURL=vm2-virtual-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vm2-virtual-machine.js","sourceRoot":"","sources":["../../../src/post-script/virtual-machine/vm2-virtual-machine.ts"],"names":[],"mappings":";;;AAAA,2BAAyB;AAKzB;IAAA;QAAA,iBAuCC;QAtCC;;;;;WAAkB;QAClB;;;;mBAA4B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI;WAAC;QAoB9E;;;;mBAAa,UAAC,GAAW;gBACvB,KAAkB,UAAgB,EAAhB,KAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAhB,cAAgB,EAAhB,IAAgB,EAAE;oBAA/B,IAAM,GAAG,SAAA;oBACZ,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;wBACrD,KAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY;wBAC/C,KAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB;qBAClD;iBACF;gBACD,OAAO,KAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc;YAChD,CAAC;WAAC;QAEF;;;;mBAAa,UAAC,YAA6C;gBAA7C,6BAAA,EAAA,iBAA6C;gBACzD,KAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACvC,CAAC;WAAC;IAKJ,CAAC;;;;;eAnCC,UAAO,OAA8B;YAC3B,IAAA,OAAO,GAAwC,OAAO,QAA/C,EAAE,YAAY,GAA0B,OAAO,aAAjC,EAAE,KAAK,GAAmB,OAAO,MAA1B,EAAE,YAAY,GAAK,OAAO,aAAZ,CAAa;YAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,QAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,iBAAiB;gBAC1C,QAAQ,EAAE,CAAC,KAAK;gBAChB,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAE9B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;;;;;;eAED,UAAW,GAAgB;YAAhB,oBAAA,EAAA,QAAgB;YACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;;;;;;eAgBD,UAAI,IAAY;YACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;;IACH,wBAAC;AAAD,CAAC,AAvCD,IAuCC;AAvCY,8CAAiB"}
@@ -0,0 +1,2 @@
1
+ import { Parameters } from '@loadmill/core/dist/parameters';
2
+ export declare const publishMetrics: (postParameters: Parameters[] | undefined, parametersKeysToPublish: string[] | undefined) => Promise<void>;
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.publishMetrics = void 0;
43
+ var client_firehose_1 = require("@aws-sdk/client-firehose");
44
+ var client_cognito_identity_1 = require("@aws-sdk/client-cognito-identity");
45
+ var isEmpty_1 = __importDefault(require("lodash/isEmpty"));
46
+ var v4_1 = __importDefault(require("uuid/v4"));
47
+ var log_1 = __importDefault(require("@loadmill/universal/dist/log"));
48
+ var parameters_1 = require("@loadmill/core/dist/parameters");
49
+ var parameters_2 = require("@loadmill/core/dist/parameters");
50
+ var ONE_HOUR = 1000 * 60 * 60;
51
+ var FIREHOSE_API_VERSION = '2015-08-04'; //todo chek if need
52
+ var REGION = 'us-east-1';
53
+ var STREAM_NAME = process.env.AGENTS_PARAMS_METRICS_S3_BUCKET || 'agents-parameters-metrics';
54
+ var IdentityPoolId = 'us-east-1:79372411-2664-431b-aa0b-aad9f938f6e9';
55
+ var cognito = new client_cognito_identity_1.CognitoIdentity({ region: REGION });
56
+ var firehoseClient;
57
+ var lastFirehoseClientTimeCreation;
58
+ var clientIsOlderThanOneHour = function () {
59
+ return lastFirehoseClientTimeCreation &&
60
+ Date.now() - lastFirehoseClientTimeCreation > ONE_HOUR;
61
+ };
62
+ function createClient() {
63
+ return __awaiter(this, void 0, void 0, function () {
64
+ var identity, credentialResponse;
65
+ return __generator(this, function (_a) {
66
+ switch (_a.label) {
67
+ case 0:
68
+ log_1.default.debug('creating FirehoseClient');
69
+ return [4 /*yield*/, cognito.getId({ IdentityPoolId: IdentityPoolId })];
70
+ case 1:
71
+ identity = _a.sent();
72
+ return [4 /*yield*/, cognito.getCredentialsForIdentity({ IdentityId: identity.IdentityId })];
73
+ case 2:
74
+ credentialResponse = _a.sent();
75
+ firehoseClient = new client_firehose_1.FirehoseClient({
76
+ region: REGION,
77
+ apiVersion: FIREHOSE_API_VERSION,
78
+ credentials: {
79
+ accessKeyId: credentialResponse.Credentials.AccessKeyId,
80
+ secretAccessKey: credentialResponse.Credentials.SecretKey,
81
+ sessionToken: credentialResponse.Credentials.SessionToken,
82
+ expiration: credentialResponse.Credentials.Expiration
83
+ }
84
+ });
85
+ lastFirehoseClientTimeCreation = Date.now();
86
+ return [2 /*return*/, firehoseClient];
87
+ }
88
+ });
89
+ });
90
+ }
91
+ var getFirehoseClient = function () { return __awaiter(void 0, void 0, void 0, function () {
92
+ return __generator(this, function (_a) {
93
+ switch (_a.label) {
94
+ case 0:
95
+ if (firehoseClient && (!clientIsOlderThanOneHour())) {
96
+ return [2 /*return*/, firehoseClient];
97
+ }
98
+ return [4 /*yield*/, createClient()];
99
+ case 1: return [2 /*return*/, _a.sent()];
100
+ }
101
+ });
102
+ }); };
103
+ var sendMetrics = function (metrics) { return __awaiter(void 0, void 0, void 0, function () {
104
+ var command, client, err_1;
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ _a.trys.push([0, 3, , 4]);
109
+ if (!metrics || isEmpty_1.default(metrics)) {
110
+ return [2 /*return*/];
111
+ }
112
+ log_1.default.debug('Sending metrics to AWS Firhose');
113
+ command = new client_firehose_1.PutRecordBatchCommand({
114
+ Records: metrics,
115
+ DeliveryStreamName: STREAM_NAME
116
+ });
117
+ return [4 /*yield*/, getFirehoseClient()];
118
+ case 1:
119
+ client = _a.sent();
120
+ return [4 /*yield*/, client.send(command)];
121
+ case 2:
122
+ _a.sent();
123
+ return [3 /*break*/, 4];
124
+ case 3:
125
+ err_1 = _a.sent();
126
+ log_1.default.error(err_1);
127
+ return [3 /*break*/, 4];
128
+ case 4: return [2 /*return*/];
129
+ }
130
+ });
131
+ }); };
132
+ var prepareMetrics = function (testId, teamId, postParameters, parametersKeysToPublish) {
133
+ if (parametersKeysToPublish === void 0) { parametersKeysToPublish = []; }
134
+ var records = [];
135
+ parametersKeysToPublish.forEach(function (paramName) {
136
+ var value = parameters_1.parameterUtils.getValueByKeyFromArr(paramName, postParameters);
137
+ if (!value) {
138
+ return;
139
+ }
140
+ var record = {
141
+ key: paramName,
142
+ value: value,
143
+ };
144
+ records.push(record);
145
+ });
146
+ var recordsGroup = {
147
+ id: v4_1.default(),
148
+ testId: testId,
149
+ teamId: teamId,
150
+ publishedAt: Date.now(),
151
+ records: records,
152
+ };
153
+ if (isEmpty_1.default(records)) {
154
+ return;
155
+ }
156
+ var enc = new TextEncoder(); // always utf-8
157
+ var encodedRecords = enc.encode(JSON.stringify(recordsGroup) + "\n");
158
+ return [{ Data: encodedRecords }];
159
+ };
160
+ var publishMetrics = function (postParameters, parametersKeysToPublish) { return __awaiter(void 0, void 0, void 0, function () {
161
+ var testId, teamId, e_1;
162
+ return __generator(this, function (_a) {
163
+ switch (_a.label) {
164
+ case 0:
165
+ _a.trys.push([0, 2, , 3]);
166
+ if (isEmpty_1.default(postParameters) || isEmpty_1.default(parametersKeysToPublish)) {
167
+ return [2 /*return*/];
168
+ }
169
+ testId = parameters_1.parameterUtils.getValueByKeyFromArr(parameters_2.BUILT_IN_PARAMS.testRunId, postParameters);
170
+ if (!testId) { // very weird if happened
171
+ log_1.default.debug('Test has ended without a testId parameter');
172
+ return [2 /*return*/];
173
+ }
174
+ teamId = parameters_1.parameterUtils.getValueByKeyFromArr(parameters_2.BUILT_IN_PARAMS.launchedByTeamId, postParameters);
175
+ if (!teamId) { // very weird if happened
176
+ log_1.default.debug('Test has ended without a testId parameter');
177
+ return [2 /*return*/];
178
+ }
179
+ return [4 /*yield*/, sendMetrics(prepareMetrics(testId, teamId, postParameters, parametersKeysToPublish))];
180
+ case 1:
181
+ _a.sent();
182
+ return [3 /*break*/, 3];
183
+ case 2:
184
+ e_1 = _a.sent();
185
+ log_1.default.error('Failed publish metrics at the end of test', { postParameters: postParameters, parametersKeysToPublish: parametersKeysToPublish }, e_1);
186
+ return [3 /*break*/, 3];
187
+ case 3: return [2 /*return*/];
188
+ }
189
+ });
190
+ }); };
191
+ exports.publishMetrics = publishMetrics;
192
+ //# sourceMappingURL=post-sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-sequence.js","sourceRoot":"","sources":["../src/post-sequence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { ResolvedRequest } from './request-sequence-result';
2
+ export declare function redactSensitiveData(resolvedRequests: ResolvedRequest[], sensitiveKeys?: string[]): void;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.redactSensitiveData = void 0;
7
+ var parameters_1 = require("@loadmill/core/dist/parameters");
8
+ var log_1 = __importDefault(require("@loadmill/universal/dist/log"));
9
+ var jsonpath_1 = __importDefault(require("jsonpath"));
10
+ var lodash_1 = require("lodash");
11
+ var qs_1 = __importDefault(require("qs"));
12
+ var utils_1 = require("./utils");
13
+ var BODY_DATA_REDACTED = 'Body Data Redacted';
14
+ function redactSensitiveData(resolvedRequests, sensitiveKeys) {
15
+ if (sensitiveKeys === void 0) { sensitiveKeys = []; }
16
+ resolvedRequests.forEach(function (rr) {
17
+ var _a, _b;
18
+ if ((_a = rr.postData) === null || _a === void 0 ? void 0 : _a.text) {
19
+ rr.postData.text = !lodash_1.isEmpty(sensitiveKeys) ? redactKeysFromBody(sensitiveKeys, rr.postData.text, rr.postData.mimeType) : BODY_DATA_REDACTED;
20
+ }
21
+ if ((_b = rr.response) === null || _b === void 0 ? void 0 : _b.text) {
22
+ rr.response.text = !lodash_1.isEmpty(sensitiveKeys) ? redactKeysFromBody(sensitiveKeys, rr.response.text, rr.response.type) : BODY_DATA_REDACTED;
23
+ }
24
+ if (rr.postParameters) {
25
+ parameters_1.redactPostParameters(rr.postParameters, sensitiveKeys);
26
+ }
27
+ });
28
+ }
29
+ exports.redactSensitiveData = redactSensitiveData;
30
+ function redactKeysFromBody(sensitiveKeys, text, mimeType) {
31
+ try {
32
+ if (typeof text != 'string' || utils_1.hasBeenTrimmed(text)) {
33
+ return BODY_DATA_REDACTED;
34
+ }
35
+ if (mimeType === null || mimeType === void 0 ? void 0 : mimeType.startsWith('application/x-www-form-urlencoded')) {
36
+ var params = qs_1.default.parse(text);
37
+ redactKeysFromJson(params, sensitiveKeys);
38
+ return qs_1.default.stringify(params);
39
+ }
40
+ else if (mimeType === null || mimeType === void 0 ? void 0 : mimeType.includes('application/json')) {
41
+ var json = JSON.parse(text);
42
+ if (!json) {
43
+ return text;
44
+ }
45
+ redactKeysFromJson(json, sensitiveKeys);
46
+ return JSON.stringify(json);
47
+ }
48
+ return text;
49
+ }
50
+ catch (e) {
51
+ log_1.default.error('Failed to redact request / response body', e);
52
+ return BODY_DATA_REDACTED;
53
+ }
54
+ }
55
+ function redactKeysFromJson(json, sensitiveKeys) {
56
+ sensitiveKeys.forEach(function (key) {
57
+ jsonpath_1.default.apply(json, "$.." + key, function (_value) { return parameters_1.DATA_REDACTED; });
58
+ });
59
+ }
60
+ //# sourceMappingURL=redact-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-data.js","sourceRoot":"","sources":["../src/redact-data.ts"],"names":[],"mappings":";;;;;;AAAA,6DAAqF;AACrF,qEAA+C;AAC/C,sDAAgC;AAChC,iCAAiC;AACjC,0CAAoB;AAEpB,iCAAyC;AAEzC,IAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEhD,SAAgB,mBAAmB,CAAC,gBAAmC,EAAE,aAA4B;IAA5B,8BAAA,EAAA,kBAA4B;IACnG,gBAAgB,CAAC,OAAO,CAAC,UAAA,EAAE;;QACzB,IAAI,MAAA,EAAE,CAAC,QAAQ,0CAAE,IAAI,EAAE;YACrB,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,gBAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;SAC7I;QACD,IAAI,MAAA,EAAE,CAAC,QAAQ,0CAAE,IAAI,EAAE;YACrB,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,gBAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;SACzI;QACD,IAAI,EAAE,CAAC,cAAc,EAAE;YACrB,iCAAoB,CAAC,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;SACxD;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAZD,kDAYC;AAED,SAAS,kBAAkB,CAAC,aAAuB,EAAE,IAAa,EAAE,QAAiB;IACnF,IAAI;QAEF,IAAI,OAAO,IAAI,IAAI,QAAQ,IAAI,sBAAc,CAAC,IAAI,CAAC,EAAE;YACnD,OAAO,kBAAkB,CAAC;SAC3B;QAED,IAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAC,mCAAmC,CAAC,EAAE;YAC7D,IAAM,MAAM,GAAG,YAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAC1C,OAAO,YAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SAC7B;aAAM,IAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE;YACjD,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE;gBACT,OAAO,IAAI,CAAC;aACb;YACD,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC7B;QAED,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,CAAC,EAAE;QACV,aAAG,CAAC,KAAK,CAAC,0CAA0C,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,kBAAkB,CAAC;KAC3B;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAS,EAAE,aAAuB;IAC5D,aAAa,CAAC,OAAO,CAAC,UAAA,GAAG;QACvB,kBAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAM,GAAK,EAAE,UAAC,MAAM,IAAK,OAAA,0BAAa,EAAb,CAAa,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { Failures } from './failures';
2
+ import { MillInfo } from './mill-info';
3
+ import { PerRequestResTime, PerRequestStats } from './request-stats';
4
+ export declare type LoadResult = 'done' | 'aborted' | 'failed';
5
+ /**
6
+ * This report contains all the info that comes from Redis each time there is a status update.
7
+ */
8
+ export interface LoadStatusReport extends AggregatedStatsReport {
9
+ endTime?: number;
10
+ startTime?: number;
11
+ result?: LoadResult;
12
+ activeSessions?: number;
13
+ }
14
+ /**
15
+ * This report contains all the aggregated stats computed from individual mill reports.
16
+ */
17
+ export interface AggregatedStatsReport extends BasicStatsReport {
18
+ /**
19
+ * The number of separate sessions / mills that sent at least one report.
20
+ */
21
+ reportedSessions?: number;
22
+ append?: boolean;
23
+ failures?: Failures;
24
+ browserStatsMap?: StatsMap;
25
+ locationStatsMap?: StatsMap;
26
+ serverMetrics?: ServerMetrics;
27
+ avgResTimeSequence?: SequenceObj;
28
+ requestStats?: PerRequestResTime;
29
+ failureReportsMap?: HashKeysToReportIds;
30
+ avgIterationTimeSequence?: SequenceObj;
31
+ }
32
+ /**
33
+ * A mapping that aggregates stats according to a certain feature, e.g. stats per browser version.
34
+ */
35
+ export interface StatsMap {
36
+ [feature: string]: BasicStatsReport & {
37
+ sessions: number;
38
+ };
39
+ }
40
+ /**
41
+ * A sequence of stats (currently only the average response time) reported within a certain
42
+ * interval (between `firstTime` and `lastTime`).
43
+ */
44
+ export interface SequenceObj {
45
+ append?: boolean;
46
+ sequence: ClientMetrics;
47
+ }
48
+ export declare type ClientMetrics = ClientMetricsClump[];
49
+ export declare type ClientMetricsClump = {
50
+ s?: number;
51
+ f?: number;
52
+ avg: number;
53
+ time: number;
54
+ p50?: number;
55
+ p95?: number;
56
+ weight: number;
57
+ concurrency: number;
58
+ };
59
+ export declare type ServerMetrics = ServerMetricsClump[];
60
+ export declare type ServerMetricsClump = {
61
+ _t: number;
62
+ uc?: number;
63
+ tc?: number;
64
+ tm?: number;
65
+ hm?: number;
66
+ uhm?: number;
67
+ };
68
+ export declare type HashKeysToReportIds = {
69
+ [hashKey: string]: string;
70
+ };
71
+ /**
72
+ * This is the report sent to Redis every time a mill report is received.
73
+ */
74
+ export declare type ToStoreStatsReport = StatsReportWithMillInfo & {
75
+ timestamp: number;
76
+ firstReport: boolean;
77
+ };
78
+ /**
79
+ * This report includes a single mill stats report along with additional meta data.
80
+ */
81
+ export declare type StatsReportWithMillInfo = FromMillStatsReport & MillInfo & {
82
+ lordId: string;
83
+ };
84
+ /**
85
+ * The stats report sent by the mill.
86
+ */
87
+ export interface FromMillStatsReport extends BasicStatsReport {
88
+ failures?: Failures;
89
+ requestStats?: PerRequestStats;
90
+ iterationTimes?: number[];
91
+ }
92
+ /**
93
+ * The basic stats we are usually interested in.
94
+ */
95
+ export interface BasicStatsReport {
96
+ hits?: number;
97
+ avgResTime?: number;
98
+ failedIterations?: number;
99
+ successfulIterations?: number;
100
+ avgIterationTime?: number;
101
+ }
102
+ export declare function isInformative({ hits, avgResTime, failedIterations, successfulIterations, }: FromMillStatsReport): boolean | 0 | undefined;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isInformative = void 0;
4
+ function isInformative(_a) {
5
+ var hits = _a.hits, avgResTime = _a.avgResTime, failedIterations = _a.failedIterations, successfulIterations = _a.successfulIterations;
6
+ return ((hits && hits > 0 && avgResTime != null && avgResTime >= 0) ||
7
+ (failedIterations && failedIterations > 0) ||
8
+ (successfulIterations && successfulIterations > 0));
9
+ }
10
+ exports.isInformative = isInformative;
11
+ //# sourceMappingURL=report-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-types.js","sourceRoot":"","sources":["../src/report-types.ts"],"names":[],"mappings":";;;AAsHA,SAAgB,aAAa,CAAC,EAKR;QAJpB,IAAI,UAAA,EACJ,UAAU,gBAAA,EACV,gBAAgB,sBAAA,EAChB,oBAAoB,0BAAA;IAEpB,OAAO,CACL,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,IAAI,IAAI,IAAI,UAAU,IAAI,CAAC,CAAC;QAC3D,CAAC,gBAAgB,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAC1C,CAAC,oBAAoB,IAAI,oBAAoB,GAAG,CAAC,CAAC,CACnD,CAAC;AACJ,CAAC;AAXD,sCAWC"}