@stuntman/server 0.1.7 → 0.1.8

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 (56) hide show
  1. package/dist/api/api.d.ts +25 -0
  2. package/dist/api/api.d.ts.map +1 -0
  3. package/dist/api/api.js +212 -0
  4. package/dist/api/api.js.map +1 -0
  5. package/dist/api/utils.d.ts +5 -0
  6. package/dist/api/utils.d.ts.map +1 -0
  7. package/dist/api/utils.js +61 -0
  8. package/dist/api/utils.js.map +1 -0
  9. package/dist/api/validators.d.ts +4 -0
  10. package/dist/api/validators.d.ts.map +1 -0
  11. package/dist/api/validators.js +125 -0
  12. package/dist/api/validators.js.map +1 -0
  13. package/dist/api/webgui/rules.pug +147 -0
  14. package/dist/api/webgui/style.css +28 -0
  15. package/dist/api/webgui/traffic.pug +38 -0
  16. package/dist/bin/stuntman.d.ts +3 -0
  17. package/dist/bin/stuntman.d.ts.map +1 -0
  18. package/dist/bin/stuntman.js +8 -0
  19. package/dist/bin/stuntman.js.map +1 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +6 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/ipUtils.d.ts +18 -0
  25. package/dist/ipUtils.d.ts.map +1 -0
  26. package/dist/ipUtils.js +102 -0
  27. package/dist/ipUtils.js.map +1 -0
  28. package/dist/mock.d.ts +32 -0
  29. package/dist/mock.d.ts.map +1 -0
  30. package/dist/mock.js +306 -0
  31. package/dist/mock.js.map +1 -0
  32. package/dist/requestContext.d.ts +10 -0
  33. package/dist/requestContext.d.ts.map +1 -0
  34. package/dist/requestContext.js +19 -0
  35. package/dist/requestContext.js.map +1 -0
  36. package/dist/ruleExecutor.d.ts +23 -0
  37. package/dist/ruleExecutor.d.ts.map +1 -0
  38. package/dist/ruleExecutor.js +189 -0
  39. package/dist/ruleExecutor.js.map +1 -0
  40. package/dist/rules/catchAll.d.ts +3 -0
  41. package/dist/rules/catchAll.d.ts.map +1 -0
  42. package/dist/rules/catchAll.js +16 -0
  43. package/dist/rules/catchAll.js.map +1 -0
  44. package/dist/rules/echo.d.ts +3 -0
  45. package/dist/rules/echo.d.ts.map +1 -0
  46. package/dist/rules/echo.js +16 -0
  47. package/dist/rules/echo.js.map +1 -0
  48. package/dist/rules/index.d.ts +4 -0
  49. package/dist/rules/index.d.ts.map +1 -0
  50. package/dist/rules/index.js +71 -0
  51. package/dist/rules/index.js.map +1 -0
  52. package/dist/storage.d.ts +5 -0
  53. package/dist/storage.d.ts.map +1 -0
  54. package/dist/storage.js +43 -0
  55. package/dist/storage.js.map +1 -0
  56. package/package.json +2 -2
@@ -0,0 +1,23 @@
1
+ import type * as Stuntman from '@stuntman/shared';
2
+ declare class RuleExecutor implements Stuntman.RuleExecutorInterface {
3
+ private _rules;
4
+ private rulesLock;
5
+ private get enabledRules();
6
+ constructor(rules?: Stuntman.Rule[]);
7
+ private hasExpired;
8
+ private cleanUpExpired;
9
+ addRule(rule: Stuntman.Rule, overwrite?: boolean): Promise<Stuntman.LiveRule>;
10
+ private _removeRule;
11
+ removeRule(id: string): Promise<void>;
12
+ removeRule(rule: Stuntman.Rule): Promise<void>;
13
+ enableRule(id: string): void;
14
+ enableRule(rule: Stuntman.Rule): void;
15
+ disableRule(id: string): void;
16
+ disableRule(rule: Stuntman.Rule): void;
17
+ findMatchingRule(request: Stuntman.Request): Promise<Stuntman.LiveRule | null>;
18
+ getRules(): Promise<readonly Stuntman.LiveRule[]>;
19
+ getRule(id: string): Promise<Stuntman.LiveRule | undefined>;
20
+ }
21
+ export declare const getRuleExecutor: (mockUuid: string) => RuleExecutor;
22
+ export {};
23
+ //# sourceMappingURL=ruleExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleExecutor.d.ts","sourceRoot":"","sources":["../src/ruleExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAclD,cAAM,YAAa,YAAW,QAAQ,CAAC,qBAAqB;IAExD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAmB;IAEpC,OAAO,KAAK,YAAY,GAQvB;gBAEW,KAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE;IAInC,OAAO,CAAC,UAAU;YAKJ,cAAc;IAmBtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAmBnF,OAAO,CAAC,WAAW;IAUb,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACrC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAC5B,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;IAWrC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAC7B,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;IAUhC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;IAsE9E,QAAQ,IAAI,OAAO,CAAC,SAAS,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAKjD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;CAIpE;AAED,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG,YAOlD,CAAC"}
@@ -0,0 +1,189 @@
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.getRuleExecutor = void 0;
7
+ const await_lock_1 = __importDefault(require("await-lock"));
8
+ const shared_1 = require("@stuntman/shared");
9
+ const rules_1 = require("./rules");
10
+ const ruleExecutors = {};
11
+ const transformMockRuleToLive = (rule) => {
12
+ var _a;
13
+ return {
14
+ ...rule,
15
+ counter: 0,
16
+ isEnabled: (_a = rule.isEnabled) !== null && _a !== void 0 ? _a : true,
17
+ createdTimestamp: Date.now(),
18
+ };
19
+ };
20
+ class RuleExecutor {
21
+ get enabledRules() {
22
+ if (!this._rules) {
23
+ return new Array();
24
+ }
25
+ const now = Date.now();
26
+ return this._rules
27
+ .filter((r) => (r.isEnabled && !Number.isFinite(r.ttlSeconds)) || r.createdTimestamp + r.ttlSeconds * 1000 > now)
28
+ .sort((a, b) => { var _a, _b; return ((_a = a.priority) !== null && _a !== void 0 ? _a : shared_1.DEFAULT_RULE_PRIORITY) - ((_b = b.priority) !== null && _b !== void 0 ? _b : shared_1.DEFAULT_RULE_PRIORITY); });
29
+ }
30
+ constructor(rules) {
31
+ this.rulesLock = new await_lock_1.default();
32
+ this._rules = (rules || []).map(transformMockRuleToLive);
33
+ }
34
+ hasExpired() {
35
+ const now = Date.now();
36
+ return this._rules.some((r) => Number.isFinite(r.ttlSeconds) && r.createdTimestamp + r.ttlSeconds * 1000 < now);
37
+ }
38
+ async cleanUpExpired() {
39
+ if (!this.hasExpired()) {
40
+ return;
41
+ }
42
+ await this.rulesLock.acquireAsync();
43
+ const now = Date.now();
44
+ try {
45
+ this._rules = this._rules.filter((r) => {
46
+ const shouldKeep = !Number.isFinite(r.ttlSeconds) || r.createdTimestamp + r.ttlSeconds * 1000 > now;
47
+ if (!shouldKeep) {
48
+ shared_1.logger.debug({ ruleId: r.id }, 'removing expired rule');
49
+ }
50
+ return shouldKeep;
51
+ });
52
+ }
53
+ finally {
54
+ await this.rulesLock.release();
55
+ }
56
+ }
57
+ async addRule(rule, overwrite) {
58
+ await this.cleanUpExpired();
59
+ await this.rulesLock.acquireAsync();
60
+ try {
61
+ if (this._rules.some((r) => r.id === rule.id)) {
62
+ if (!overwrite) {
63
+ throw new shared_1.AppError({ httpCode: shared_1.HttpCode.CONFLICT, message: 'rule with given ID already exists' });
64
+ }
65
+ this._removeRule(rule.id);
66
+ }
67
+ const liveRule = transformMockRuleToLive(rule);
68
+ this._rules.push(liveRule);
69
+ shared_1.logger.debug(liveRule, 'rule added');
70
+ return liveRule;
71
+ }
72
+ finally {
73
+ await this.rulesLock.release();
74
+ }
75
+ }
76
+ _removeRule(ruleOrId) {
77
+ this._rules = this._rules.filter((r) => {
78
+ const notFound = r.id !== (typeof ruleOrId === 'string' ? ruleOrId : ruleOrId.id);
79
+ if (!notFound) {
80
+ shared_1.logger.debug({ ruleId: r.id }, 'rule removed');
81
+ }
82
+ return notFound;
83
+ });
84
+ }
85
+ async removeRule(ruleOrId) {
86
+ await this.cleanUpExpired();
87
+ await this.rulesLock.acquireAsync();
88
+ try {
89
+ this._removeRule(ruleOrId);
90
+ }
91
+ finally {
92
+ await this.rulesLock.release();
93
+ }
94
+ }
95
+ enableRule(ruleOrId) {
96
+ this._rules.forEach((r) => {
97
+ if (r.id === (typeof ruleOrId === 'string' ? ruleOrId : ruleOrId.id)) {
98
+ r.counter = 0;
99
+ r.isEnabled = true;
100
+ shared_1.logger.debug({ ruleId: r.id }, 'rule enabled');
101
+ }
102
+ });
103
+ }
104
+ disableRule(ruleOrId) {
105
+ this._rules.forEach((r) => {
106
+ if (r.id === (typeof ruleOrId === 'string' ? ruleOrId : ruleOrId.id)) {
107
+ r.isEnabled = false;
108
+ shared_1.logger.debug({ ruleId: r.id }, 'rule disabled');
109
+ }
110
+ });
111
+ }
112
+ async findMatchingRule(request) {
113
+ const logContext = {
114
+ requestId: request.id,
115
+ };
116
+ const matchingRule = this.enabledRules.find((rule) => {
117
+ try {
118
+ const matchResult = rule.matches(request);
119
+ shared_1.logger.trace({ ...logContext, matchResult }, `rule match attempt for ${rule.id}`);
120
+ if (typeof matchResult === 'boolean') {
121
+ return matchResult;
122
+ }
123
+ return matchResult.result;
124
+ }
125
+ catch (error) {
126
+ shared_1.logger.error({ ...logContext, ruleId: rule === null || rule === void 0 ? void 0 : rule.id, error }, 'error in rule match function');
127
+ }
128
+ return undefined;
129
+ });
130
+ if (!matchingRule) {
131
+ shared_1.logger.debug(logContext, 'no matching rule found');
132
+ return null;
133
+ }
134
+ const matchResult = matchingRule.matches(request);
135
+ logContext.ruleId = matchingRule.id;
136
+ shared_1.logger.debug({ ...logContext, matchResultMessage: typeof matchResult !== 'boolean' ? matchResult.description : null }, 'found matching rule');
137
+ const matchingRuleClone = Object.freeze(Object.assign({}, matchingRule));
138
+ ++matchingRule.counter;
139
+ logContext.ruleCounter = matchingRule.counter;
140
+ if (Number.isNaN(matchingRule.counter) || !Number.isFinite(matchingRule.counter)) {
141
+ matchingRule.counter = 0;
142
+ shared_1.logger.warn(logContext, "it's over 9000!!!");
143
+ }
144
+ // TODO check if that works
145
+ if (matchingRule.disableAfterUse) {
146
+ if (typeof matchingRule.disableAfterUse === 'boolean' || matchingRule.disableAfterUse <= matchingRule.counter) {
147
+ shared_1.logger.debug(logContext, 'disabling rule for future requests');
148
+ this.disableRule(matchingRule);
149
+ }
150
+ }
151
+ if (matchingRule.removeAfterUse) {
152
+ if (typeof matchingRule.removeAfterUse === 'boolean' || matchingRule.removeAfterUse <= matchingRule.counter) {
153
+ shared_1.logger.debug(logContext, 'removing rule for future requests');
154
+ await this.removeRule(matchingRule);
155
+ }
156
+ }
157
+ if (typeof matchResult !== 'boolean') {
158
+ if (matchResult.disableRuleIds && matchResult.disableRuleIds.length > 0) {
159
+ shared_1.logger.debug({ ...logContext, disableRuleIds: matchResult.disableRuleIds }, 'disabling rules based on matchResult');
160
+ for (const ruleId of matchResult.disableRuleIds) {
161
+ this.disableRule(ruleId);
162
+ }
163
+ }
164
+ if (matchResult.enableRuleIds && matchResult.enableRuleIds.length > 0) {
165
+ shared_1.logger.debug({ ...logContext, disableRuleIds: matchResult.disableRuleIds }, 'enabling rules based on matchResult');
166
+ for (const ruleId of matchResult.enableRuleIds) {
167
+ this.enableRule(ruleId);
168
+ }
169
+ }
170
+ }
171
+ return matchingRuleClone;
172
+ }
173
+ async getRules() {
174
+ await this.cleanUpExpired();
175
+ return this._rules;
176
+ }
177
+ async getRule(id) {
178
+ await this.cleanUpExpired();
179
+ return this._rules.find((r) => r.id === id);
180
+ }
181
+ }
182
+ const getRuleExecutor = (mockUuid) => {
183
+ if (!ruleExecutors[mockUuid]) {
184
+ ruleExecutors[mockUuid] = new RuleExecutor([...rules_1.DEFAULT_RULES, ...rules_1.CUSTOM_RULES].map((r) => ({ ...r, ttlSeconds: Infinity })));
185
+ }
186
+ return ruleExecutors[mockUuid];
187
+ };
188
+ exports.getRuleExecutor = getRuleExecutor;
189
+ //# sourceMappingURL=ruleExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleExecutor.js","sourceRoot":"","sources":["../src/ruleExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type * as Stuntman from '@stuntman/shared';
2
+ export declare const catchAllRule: Stuntman.DeployedRule;
3
+ //# sourceMappingURL=catchAll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catchAll.d.ts","sourceRoot":"","sources":["../../src/rules/catchAll.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,YAUnC,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.catchAllRule = void 0;
4
+ const shared_1 = require("@stuntman/shared");
5
+ exports.catchAllRule = {
6
+ id: shared_1.CATCH_RULE_NAME,
7
+ matches: () => true,
8
+ priority: shared_1.CATCH_ALL_RULE_PRIORITY,
9
+ actions: {
10
+ mockResponse: (req) => ({
11
+ body: `Request received by Stuntman mock <pre>${JSON.stringify(req, null, 4)}</pre>`,
12
+ status: 200,
13
+ }),
14
+ },
15
+ };
16
+ //# sourceMappingURL=catchAll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catchAll.js","sourceRoot":"","sources":["../../src/rules/catchAll.ts"],"names":[],"mappings":";;;AAAA,6CAA4E;AAG/D,QAAA,YAAY,GAA0B;IAC/C,EAAE,EAAE,wBAAe;IACnB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;IACnB,QAAQ,EAAE,gCAAuB;IACjC,OAAO,EAAE;QACL,YAAY,EAAE,CAAC,GAAqB,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,0CAA0C,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ;YACpF,MAAM,EAAE,GAAG;SACd,CAAC;KACL;CACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type * as Stuntman from '@stuntman/shared';
2
+ export declare const echoRule: Stuntman.DeployedRule;
3
+ //# sourceMappingURL=echo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echo.d.ts","sourceRoot":"","sources":["../../src/rules/echo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,YAU/B,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.echoRule = void 0;
4
+ const shared_1 = require("@stuntman/shared");
5
+ exports.echoRule = {
6
+ id: 'internal/echo',
7
+ priority: shared_1.DEFAULT_RULE_PRIORITY + 1,
8
+ matches: (req) => /https?:\/\/echo\/.*/.test(req.url),
9
+ actions: {
10
+ mockResponse: (req) => ({
11
+ body: req,
12
+ status: 200,
13
+ }),
14
+ },
15
+ };
16
+ //# sourceMappingURL=echo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echo.js","sourceRoot":"","sources":["../../src/rules/echo.ts"],"names":[],"mappings":";;;AAAA,6CAAyD;AAG5C,QAAA,QAAQ,GAA0B;IAC3C,EAAE,EAAE,eAAe;IACnB,QAAQ,EAAE,8BAAqB,GAAG,CAAC;IACnC,OAAO,EAAE,CAAC,GAAqB,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,OAAO,EAAE;QACL,YAAY,EAAE,CAAC,GAAqB,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,GAAG;SACd,CAAC;KACL;CACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type * as Stuntman from '@stuntman/shared';
2
+ export declare const DEFAULT_RULES: Stuntman.DeployedRule[];
3
+ export declare const CUSTOM_RULES: Stuntman.DeployedRule[];
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,YAAY,EAA6B,CAAC;AAC/E,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAO,CAAC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.CUSTOM_RULES = exports.DEFAULT_RULES = void 0;
30
+ const fs_1 = __importDefault(require("fs"));
31
+ const glob_1 = __importDefault(require("glob"));
32
+ const tsImport = __importStar(require("ts-import"));
33
+ const catchAll_1 = require("./catchAll");
34
+ const echo_1 = require("./echo");
35
+ const shared_1 = require("@stuntman/shared");
36
+ exports.DEFAULT_RULES = [catchAll_1.catchAllRule, echo_1.echoRule];
37
+ exports.CUSTOM_RULES = [];
38
+ const loadAdditionalRules = () => {
39
+ if (!shared_1.stuntmanConfig.mock.rulesPath || !fs_1.default.existsSync(shared_1.stuntmanConfig.mock.rulesPath)) {
40
+ shared_1.logger.debug({ rulesPath: shared_1.stuntmanConfig.mock.rulesPath }, `additional rules directory not found`);
41
+ return;
42
+ }
43
+ shared_1.logger.debug({ rulesPath: shared_1.stuntmanConfig.mock.rulesPath }, `loading additional rules`);
44
+ const filePaths = glob_1.default.sync('*.[tj]s', { absolute: true, cwd: shared_1.stuntmanConfig.mock.rulesPath });
45
+ for (const filePath of filePaths) {
46
+ // TODO add .ts rule support
47
+ try {
48
+ const loadedFile = /\.js$/.test(filePath) ? require(filePath) : tsImport.loadSync(filePath);
49
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
50
+ const exportedRules = Object.values(loadedFile).filter((rule) => {
51
+ if (!rule || !rule.id || typeof rule.matches !== 'function') {
52
+ shared_1.logger.error({ filePath, rule }, 'invalid exported rule');
53
+ return false;
54
+ }
55
+ return true;
56
+ });
57
+ exports.CUSTOM_RULES.push(...exportedRules);
58
+ }
59
+ catch (error) {
60
+ shared_1.logger.error({ filePath, error }, 'error importing rule');
61
+ }
62
+ }
63
+ const ruleIds = [...exports.DEFAULT_RULES, ...exports.CUSTOM_RULES].map((rule) => rule.id);
64
+ const duplicatedRuleIds = ruleIds.filter((currentValue, currentIndex) => ruleIds.indexOf(currentValue) !== currentIndex);
65
+ if (duplicatedRuleIds.length > 0) {
66
+ shared_1.logger.error({ duplicatedRuleIds }, 'duplicated rule ids');
67
+ throw new Error('duplicated rule ids');
68
+ }
69
+ };
70
+ loadAdditionalRules();
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,oDAAsC;AACtC,yCAA0C;AAC1C,iCAAkC;AAClC,6CAA0D;AAG7C,QAAA,aAAa,GAA4B,CAAC,uBAAY,EAAE,eAAQ,CAAC,CAAC;AAClE,QAAA,YAAY,GAA4B,EAAE,CAAC;AAExD,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC7B,IAAI,CAAC,uBAAc,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,uBAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QACjF,eAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,uBAAc,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,sCAAsC,CAAC,CAAC;QACnG,OAAO;KACV;IACD,eAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,uBAAc,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,0BAA0B,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,uBAAc,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/F,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;QAC9B,4BAA4B;QAC5B,IAAI;YACA,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5F,8DAA8D;YAC9D,MAAM,aAAa,GAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAA6B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzF,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE;oBACzD,eAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,uBAAuB,CAAC,CAAC;oBAC1D,OAAO,KAAK,CAAC;iBAChB;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,oBAAY,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;SACvC;QAAC,OAAO,KAAK,EAAE;YACZ,eAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,sBAAsB,CAAC,CAAC;SAC7D;KACJ;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,qBAAa,EAAE,GAAG,oBAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,YAAY,CAAC,CAAC;IACzH,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;QAC9B,eAAM,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,EAAE,qBAAqB,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;KAC1C;AACL,CAAC,CAAC;AAEF,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import LRUCache from 'lru-cache';
2
+ import type * as Stuntman from '@stuntman/shared';
3
+ export declare const getTrafficStore: (key: string, options?: Stuntman.StorageConfig) => LRUCache<string, Stuntman.LogEntry>;
4
+ export declare const getDnsResolutionCache: (key: string) => LRUCache<string, string>;
5
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAclD,eAAO,MAAM,eAAe,QAAS,MAAM,YAAY,SAAS,aAAa,wCAgB5E,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAS,MAAM,6BAKhD,CAAC"}
@@ -0,0 +1,43 @@
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.getDnsResolutionCache = exports.getTrafficStore = void 0;
7
+ const lru_cache_1 = __importDefault(require("lru-cache"));
8
+ const object_sizeof_1 = __importDefault(require("object-sizeof"));
9
+ const DNS_CACHE_OPTIONS = {
10
+ max: 1000,
11
+ ttl: 1000 * 60 * 15,
12
+ allowStale: false,
13
+ updateAgeOnGet: false,
14
+ updateAgeOnHas: false,
15
+ };
16
+ const trafficStoreInstances = {};
17
+ const dnsResolutionCacheInstances = {};
18
+ const getTrafficStore = (key, options) => {
19
+ if (!(key in trafficStoreInstances)) {
20
+ if (!options) {
21
+ throw new Error('initialize with options first');
22
+ }
23
+ trafficStoreInstances[key] = new lru_cache_1.default({
24
+ max: options.limitCount,
25
+ maxSize: options.limitSize,
26
+ ttl: options.ttl,
27
+ allowStale: false,
28
+ updateAgeOnGet: false,
29
+ updateAgeOnHas: false,
30
+ sizeCalculation: (value) => (0, object_sizeof_1.default)(value),
31
+ });
32
+ }
33
+ return trafficStoreInstances[key];
34
+ };
35
+ exports.getTrafficStore = getTrafficStore;
36
+ const getDnsResolutionCache = (key) => {
37
+ if (!(key in dnsResolutionCacheInstances)) {
38
+ dnsResolutionCacheInstances[key] = new lru_cache_1.default(DNS_CACHE_OPTIONS);
39
+ }
40
+ return dnsResolutionCacheInstances[key];
41
+ };
42
+ exports.getDnsResolutionCache = getDnsResolutionCache;
43
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAiC;AAEjC,kEAAmC;AAEnC,MAAM,iBAAiB,GAAqC;IACxD,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE;IACnB,UAAU,EAAE,KAAK;IACjB,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,KAAK;CACxB,CAAC;AAEF,MAAM,qBAAqB,GAAwD,EAAE,CAAC;AACtF,MAAM,2BAA2B,GAA6C,EAAE,CAAC;AAE1E,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,OAAgC,EAAE,EAAE;IAC7E,IAAI,CAAC,CAAC,GAAG,IAAI,qBAAqB,CAAC,EAAE;QACjC,IAAI,CAAC,OAAO,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QACD,qBAAqB,CAAC,GAAG,CAAC,GAAG,IAAI,mBAAQ,CAA4B;YACjE,GAAG,EAAE,OAAO,CAAC,UAAU;YACvB,OAAO,EAAE,OAAO,CAAC,SAAS;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,uBAAM,EAAC,KAAK,CAAC;SAC5C,CAAC,CAAC;KACN;IACD,OAAO,qBAAqB,CAAC,GAAG,CAAE,CAAC;AACvC,CAAC,CAAC;AAhBW,QAAA,eAAe,mBAgB1B;AAEK,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;IACjD,IAAI,CAAC,CAAC,GAAG,IAAI,2BAA2B,CAAC,EAAE;QACvC,2BAA2B,CAAC,GAAG,CAAC,GAAG,IAAI,mBAAQ,CAAiB,iBAAiB,CAAC,CAAC;KACtF;IACD,OAAO,2BAA2B,CAAC,GAAG,CAAE,CAAC;AAC7C,CAAC,CAAC;AALW,QAAA,qBAAqB,yBAKhC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stuntman/server",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Stuntman - HTTP proxy / mock server with API",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
@@ -66,7 +66,7 @@
66
66
  "CHANGELOG.md"
67
67
  ],
68
68
  "scripts": {
69
- "test": "SUPPRESS_NO_CONFIG_WARNING=1 jest",
69
+ "test": "SUPPRESS_NO_CONFIG_WARNING=1 jest --coverage",
70
70
  "clean": "rm -fr dist",
71
71
  "build": "tsc && cp -rv src/api/webgui dist/api",
72
72
  "lint": "prettier --check \"./{src,test}/**/*\" && eslint \"./{src,test}/**/*\"",