@api-client/core 0.3.5 → 0.3.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.
- package/build/browser.d.ts +5 -0
- package/build/browser.js +14 -0
- package/build/browser.js.map +1 -1
- package/build/index.d.ts +13 -1
- package/build/index.js +25 -1
- package/build/index.js.map +1 -1
- package/build/src/lib/calculators/DataCalculator.d.ts +27 -0
- package/build/src/lib/calculators/DataCalculator.js +88 -0
- package/build/src/lib/calculators/DataCalculator.js.map +1 -0
- package/build/src/lib/fs/Fs.d.ts +52 -0
- package/build/src/lib/fs/Fs.js +245 -0
- package/build/src/lib/fs/Fs.js.map +1 -0
- package/build/src/lib/parsers/UrlEncoder.d.ts +51 -0
- package/build/src/lib/parsers/UrlEncoder.js +74 -0
- package/build/src/lib/parsers/UrlEncoder.js.map +1 -0
- package/build/src/lib/parsers/UrlParser.d.ts +104 -0
- package/build/src/lib/parsers/UrlParser.js +189 -0
- package/build/src/lib/parsers/UrlParser.js.map +1 -0
- package/build/src/lib/parsers/UrlValueParser.d.ts +92 -0
- package/build/src/lib/parsers/UrlValueParser.js +172 -0
- package/build/src/lib/parsers/UrlValueParser.js.map +1 -0
- package/build/src/lib/timers/Timers.d.ts +5 -0
- package/build/src/lib/timers/Timers.js +10 -0
- package/build/src/lib/timers/Timers.js.map +1 -0
- package/build/src/mocking/ProjectMock.d.ts +13 -0
- package/build/src/mocking/ProjectMock.js +16 -0
- package/build/src/mocking/ProjectMock.js.map +1 -0
- package/build/src/mocking/lib/Request.d.ts +32 -0
- package/build/src/mocking/lib/Request.js +63 -0
- package/build/src/mocking/lib/Request.js.map +1 -0
- package/build/src/mocking/lib/Response.d.ts +33 -0
- package/build/src/mocking/lib/Response.js +79 -0
- package/build/src/mocking/lib/Response.js.map +1 -0
- package/build/src/runtime/node/BaseRunner.d.ts +21 -0
- package/build/src/runtime/node/BaseRunner.js +27 -0
- package/build/src/runtime/node/BaseRunner.js.map +1 -0
- package/build/src/runtime/node/ProjectParallelRunner.d.ts +81 -0
- package/build/src/runtime/node/ProjectParallelRunner.js +173 -0
- package/build/src/runtime/node/ProjectParallelRunner.js.map +1 -0
- package/build/src/runtime/node/ProjectRequestRunner.d.ts +125 -0
- package/build/src/runtime/node/ProjectRequestRunner.js +185 -0
- package/build/src/runtime/node/ProjectRequestRunner.js.map +1 -0
- package/build/src/runtime/node/ProjectRunner.d.ts +164 -62
- package/build/src/runtime/node/ProjectRunner.js +191 -146
- package/build/src/runtime/node/ProjectRunner.js.map +1 -1
- package/build/src/runtime/node/ProjectRunnerWorker.d.ts +1 -0
- package/build/src/runtime/node/ProjectRunnerWorker.js +58 -0
- package/build/src/runtime/node/ProjectRunnerWorker.js.map +1 -0
- package/build/src/runtime/node/ProjectSerialRunner.d.ts +11 -0
- package/build/src/runtime/node/ProjectSerialRunner.js +34 -0
- package/build/src/runtime/node/ProjectSerialRunner.js.map +1 -0
- package/build/src/runtime/reporters/ProjectRunCliReporter.d.ts +7 -0
- package/build/src/runtime/reporters/ProjectRunCliReporter.js +73 -0
- package/build/src/runtime/reporters/ProjectRunCliReporter.js.map +1 -0
- package/build/src/runtime/reporters/Reporter.d.ts +62 -0
- package/build/src/runtime/reporters/Reporter.js +98 -0
- package/build/src/runtime/reporters/Reporter.js.map +1 -0
- package/build/src/testing/TestCliHelper.d.ts +29 -0
- package/build/src/testing/TestCliHelper.js +80 -0
- package/build/src/testing/TestCliHelper.js.map +1 -0
- package/build/src/testing/getPort.d.ts +52 -0
- package/build/src/testing/getPort.js +169 -0
- package/build/src/testing/getPort.js.map +1 -0
- package/package.json +3 -2
- package/src/lib/calculators/DataCalculator.ts +91 -0
- package/src/lib/fs/Fs.ts +258 -0
- package/src/lib/parsers/UrlEncoder.ts +74 -0
- package/src/lib/parsers/UrlParser.ts +201 -0
- package/src/lib/parsers/UrlValueParser.ts +211 -0
- package/src/lib/timers/Timers.ts +9 -0
- package/src/mocking/LegacyInterfaces.ts +1 -1
- package/src/mocking/ProjectMock.ts +20 -0
- package/src/mocking/lib/Request.ts +85 -0
- package/src/mocking/lib/Response.ts +101 -0
- package/src/runtime/node/BaseRunner.ts +29 -0
- package/src/runtime/node/ProjectParallelRunner.ts +234 -0
- package/src/runtime/node/ProjectRequestRunner.ts +281 -0
- package/src/runtime/node/ProjectRunner.ts +279 -186
- package/src/runtime/node/ProjectRunnerWorker.ts +62 -0
- package/src/runtime/node/ProjectSerialRunner.ts +36 -0
- package/src/runtime/reporters/ProjectRunCliReporter.ts +79 -0
- package/src/runtime/reporters/Reporter.ts +142 -0
- package/src/testing/TestCliHelper.ts +87 -0
- package/src/testing/getPort.ts +212 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DataMock } from '@pawel-up/data-mock';
|
|
2
|
+
import { Request } from './lib/Request.js';
|
|
3
|
+
import { Response } from './lib/Response.js';
|
|
4
|
+
export class ProjectMock extends DataMock {
|
|
5
|
+
projectRequest;
|
|
6
|
+
response;
|
|
7
|
+
/**
|
|
8
|
+
* @param init The library init options.
|
|
9
|
+
*/
|
|
10
|
+
constructor(init) {
|
|
11
|
+
super(init);
|
|
12
|
+
this.projectRequest = new Request(init);
|
|
13
|
+
this.response = new Response(init);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ProjectMock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectMock.js","sourceRoot":"","sources":["../../../src/mocking/ProjectMock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAgB,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACvC,cAAc,CAAU;IACxB,QAAQ,CAAW;IAEnB;;OAEG;IACH,YAAY,IAAmB;QAC7B,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,cAAc,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Http, Types, Lorem, Time, DataMockInit, HttpRequestInit } from '@pawel-up/data-mock';
|
|
2
|
+
import { IHttpRequest } from '../../models/HttpRequest.js';
|
|
3
|
+
import { IRequest } from '../../models/Request.js';
|
|
4
|
+
import { ISentRequest } from '../../models/SentRequest.js';
|
|
5
|
+
import { IRequestLog } from '../../models/RequestLog.js';
|
|
6
|
+
import { IArcResponseInit, Response } from './Response.js';
|
|
7
|
+
export interface IRequestLogInit {
|
|
8
|
+
request?: HttpRequestInit;
|
|
9
|
+
response?: IArcResponseInit;
|
|
10
|
+
/**
|
|
11
|
+
* When set it ignores size information
|
|
12
|
+
*/
|
|
13
|
+
noSize?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Adds redirects to the request
|
|
16
|
+
*/
|
|
17
|
+
redirects?: boolean;
|
|
18
|
+
noResponse?: boolean;
|
|
19
|
+
noRequest?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class Request {
|
|
22
|
+
types: Types;
|
|
23
|
+
lorem: Lorem;
|
|
24
|
+
time: Time;
|
|
25
|
+
http: Http;
|
|
26
|
+
response: Response;
|
|
27
|
+
constructor(init?: DataMockInit);
|
|
28
|
+
request(init?: HttpRequestInit): IRequest;
|
|
29
|
+
httpRequest(init?: HttpRequestInit): IHttpRequest;
|
|
30
|
+
sentRequest(init?: HttpRequestInit): ISentRequest;
|
|
31
|
+
log(init?: IRequestLogInit): IRequestLog;
|
|
32
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Http, Types, Lorem, Time } from '@pawel-up/data-mock';
|
|
2
|
+
// import { randomValue } from '@pawel-up/data-mock/src/lib/Http.js';
|
|
3
|
+
import { Kind as HttpRequestKind } from '../../models/HttpRequest.js';
|
|
4
|
+
import { Kind as RequestKind } from '../../models/Request.js';
|
|
5
|
+
import { Response } from './Response.js';
|
|
6
|
+
export class Request {
|
|
7
|
+
types;
|
|
8
|
+
lorem;
|
|
9
|
+
time;
|
|
10
|
+
http;
|
|
11
|
+
response;
|
|
12
|
+
constructor(init = {}) {
|
|
13
|
+
this.types = new Types(init.seed);
|
|
14
|
+
this.lorem = new Lorem(init);
|
|
15
|
+
this.time = new Time(init);
|
|
16
|
+
this.http = new Http(init);
|
|
17
|
+
this.response = new Response(init);
|
|
18
|
+
}
|
|
19
|
+
request(init) {
|
|
20
|
+
return {
|
|
21
|
+
kind: RequestKind,
|
|
22
|
+
expects: this.httpRequest(init),
|
|
23
|
+
info: {
|
|
24
|
+
name: this.lorem.words(2),
|
|
25
|
+
description: this.lorem.paragraph(),
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
httpRequest(init) {
|
|
30
|
+
const request = this.http.request(init);
|
|
31
|
+
return {
|
|
32
|
+
kind: HttpRequestKind,
|
|
33
|
+
...request,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
sentRequest(init) {
|
|
37
|
+
const start = this.time.timestamp();
|
|
38
|
+
return {
|
|
39
|
+
startTime: start,
|
|
40
|
+
endTime: this.time.timestamp({ min: start + 1 }),
|
|
41
|
+
...this.httpRequest(init),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
log(init = {}) {
|
|
45
|
+
const result = {
|
|
46
|
+
kind: 'ARC#ResponseLog',
|
|
47
|
+
};
|
|
48
|
+
if (!init.noRequest) {
|
|
49
|
+
result.request = this.sentRequest(init.request);
|
|
50
|
+
}
|
|
51
|
+
if (!init.noResponse) {
|
|
52
|
+
result.response = this.response.arcResponse(init.response);
|
|
53
|
+
}
|
|
54
|
+
if (init.redirects) {
|
|
55
|
+
result.redirects = this.response.redirects();
|
|
56
|
+
}
|
|
57
|
+
if (!init.noSize) {
|
|
58
|
+
result.size = this.response.size();
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=Request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Request.js","sourceRoot":"","sources":["../../../../src/mocking/lib/Request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAiC,MAAM,qBAAqB,CAAC;AAC9F,qEAAqE;AACrE,OAAO,EAAgB,IAAI,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAY,IAAI,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGxE,OAAO,EAAoB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAiB3D,MAAM,OAAO,OAAO;IAClB,KAAK,CAAQ;IACb,KAAK,CAAQ;IACb,IAAI,CAAO;IACX,IAAI,CAAO;IACX,QAAQ,CAAW;IAEnB,YAAY,OAAmB,EAAE;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,IAAsB;QAC5B,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC/B,IAAI,EAAE;gBACJ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACzB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;aACpC;SACF,CAAA;IACH,CAAC;IAED,WAAW,CAAC,IAAsB;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,GAAG,OAAO;SACX,CAAA;IACH,CAAC;IAED,WAAW,CAAC,IAAsB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpC,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;YAChD,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;SAC1B,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,OAAwB,EAAE;QAC5B,MAAM,MAAM,GAAgB;YAC1B,IAAI,EAAE,iBAAiB;SACxB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACjD;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC5D;QACD,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;SAC9C;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;SACpC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Http, Har, Types, Lorem, Time, DataMockInit, HttpResponseInit, HarTimingInit, Internet } from '@pawel-up/data-mock';
|
|
2
|
+
import { IHttpResponse } from '../../models/HttpResponse.js';
|
|
3
|
+
import { IArcResponse } from '../../models/ArcResponse.js';
|
|
4
|
+
import { IRequestsSize } from '../../models/RequestsSize.js';
|
|
5
|
+
import { IResponseRedirect } from '../../models/ResponseRedirect.js';
|
|
6
|
+
export interface IArcResponseInit extends HttpResponseInit, HarTimingInit {
|
|
7
|
+
/**
|
|
8
|
+
* When set it does not generate a response payload.
|
|
9
|
+
*/
|
|
10
|
+
noBody?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* The first number of the status group. Other 2 are auto generated
|
|
13
|
+
*/
|
|
14
|
+
statusGroup?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Whether to generate timings object
|
|
17
|
+
*/
|
|
18
|
+
timings?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare class Response {
|
|
21
|
+
types: Types;
|
|
22
|
+
lorem: Lorem;
|
|
23
|
+
time: Time;
|
|
24
|
+
http: Http;
|
|
25
|
+
har: Har;
|
|
26
|
+
internet: Internet;
|
|
27
|
+
constructor(init?: DataMockInit);
|
|
28
|
+
response(init?: IArcResponseInit): IHttpResponse;
|
|
29
|
+
arcResponse(init?: IArcResponseInit): IArcResponse;
|
|
30
|
+
size(): IRequestsSize;
|
|
31
|
+
redirect(init?: IArcResponseInit): IResponseRedirect;
|
|
32
|
+
redirects(size?: number, init?: IArcResponseInit): IResponseRedirect[];
|
|
33
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Http, Har, Types, Lorem, Time, Internet } from '@pawel-up/data-mock';
|
|
2
|
+
import { Kind as HttpResponseKind } from '../../models/HttpResponse.js';
|
|
3
|
+
import { Kind as ArcResponseKind } from '../../models/ArcResponse.js';
|
|
4
|
+
import { Kind as ResponseRedirectKind } from '../../models/ResponseRedirect.js';
|
|
5
|
+
export class Response {
|
|
6
|
+
types;
|
|
7
|
+
lorem;
|
|
8
|
+
time;
|
|
9
|
+
http;
|
|
10
|
+
har;
|
|
11
|
+
internet;
|
|
12
|
+
constructor(init = {}) {
|
|
13
|
+
this.types = new Types(init.seed);
|
|
14
|
+
this.lorem = new Lorem(init);
|
|
15
|
+
this.time = new Time(init);
|
|
16
|
+
this.http = new Http(init);
|
|
17
|
+
this.har = new Har(init);
|
|
18
|
+
this.internet = new Internet(init);
|
|
19
|
+
}
|
|
20
|
+
response(init = {}) {
|
|
21
|
+
const ct = init.noBody ? undefined : this.http.headers.contentType();
|
|
22
|
+
const body = init.noBody ? undefined : this.http.payload.payload(ct);
|
|
23
|
+
const headers = this.http.headers.headers('response', { mime: ct });
|
|
24
|
+
const statusGroup = init.statusGroup ? init.statusGroup : this.types.number({ min: 2, max: 5 });
|
|
25
|
+
const sCode = this.types.number({ min: 0, max: 99 }).toString();
|
|
26
|
+
const code = Number(`${statusGroup}${sCode.padStart(2, '0')}`);
|
|
27
|
+
const status = this.lorem.word();
|
|
28
|
+
const result = {
|
|
29
|
+
kind: HttpResponseKind,
|
|
30
|
+
status: code,
|
|
31
|
+
statusText: status,
|
|
32
|
+
headers,
|
|
33
|
+
};
|
|
34
|
+
if (!init.noBody) {
|
|
35
|
+
result.payload = body;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
arcResponse(init = {}) {
|
|
40
|
+
const base = this.response(init);
|
|
41
|
+
const length = this.types.number({ min: 10, max: 4000 });
|
|
42
|
+
const result = {
|
|
43
|
+
...base,
|
|
44
|
+
kind: ArcResponseKind,
|
|
45
|
+
loadingTime: length,
|
|
46
|
+
};
|
|
47
|
+
if (init.timings) {
|
|
48
|
+
result.timings = this.har.timing(init);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
size() {
|
|
53
|
+
const result = {
|
|
54
|
+
request: this.types.number({ min: 10 }),
|
|
55
|
+
response: this.types.number({ min: 10 }),
|
|
56
|
+
};
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
redirect(init) {
|
|
60
|
+
const start = this.time.timestamp();
|
|
61
|
+
const end = this.time.timestamp({ min: start + 1 });
|
|
62
|
+
const info = {
|
|
63
|
+
kind: ResponseRedirectKind,
|
|
64
|
+
startTime: start,
|
|
65
|
+
endTime: end,
|
|
66
|
+
url: this.internet.uri(),
|
|
67
|
+
response: this.response({ ...init, statusGroup: 3 }),
|
|
68
|
+
};
|
|
69
|
+
return info;
|
|
70
|
+
}
|
|
71
|
+
redirects(size = 1, init) {
|
|
72
|
+
const result = [];
|
|
73
|
+
for (let i = 0; i < size; i++) {
|
|
74
|
+
result.push(this.redirect(init));
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=Response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Response.js","sourceRoot":"","sources":["../../../../src/mocking/lib/Response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { IProjectExecutionIteration, IProjectExecutionLog } from '../reporters/Reporter.js';
|
|
4
|
+
export declare abstract class BaseRunner extends EventEmitter {
|
|
5
|
+
/**
|
|
6
|
+
* Iteration start time.
|
|
7
|
+
*/
|
|
8
|
+
protected startTime?: number;
|
|
9
|
+
/**
|
|
10
|
+
* Iteration end time.
|
|
11
|
+
*/
|
|
12
|
+
protected endTime?: number;
|
|
13
|
+
/**
|
|
14
|
+
* A list of already executed iterations.
|
|
15
|
+
*/
|
|
16
|
+
protected executed: IProjectExecutionIteration[];
|
|
17
|
+
/**
|
|
18
|
+
* Creates the report of the execution.
|
|
19
|
+
*/
|
|
20
|
+
protected createReport(): Promise<IProjectExecutionLog>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export class BaseRunner extends EventEmitter {
|
|
3
|
+
/**
|
|
4
|
+
* Iteration start time.
|
|
5
|
+
*/
|
|
6
|
+
startTime;
|
|
7
|
+
/**
|
|
8
|
+
* Iteration end time.
|
|
9
|
+
*/
|
|
10
|
+
endTime;
|
|
11
|
+
/**
|
|
12
|
+
* A list of already executed iterations.
|
|
13
|
+
*/
|
|
14
|
+
executed = [];
|
|
15
|
+
/**
|
|
16
|
+
* Creates the report of the execution.
|
|
17
|
+
*/
|
|
18
|
+
async createReport() {
|
|
19
|
+
const log = {
|
|
20
|
+
started: this.startTime,
|
|
21
|
+
ended: this.endTime,
|
|
22
|
+
iterations: this.executed,
|
|
23
|
+
};
|
|
24
|
+
return log;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=BaseRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseRunner.js","sourceRoot":"","sources":["../../../../src/runtime/node/BaseRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,OAAgB,UAAW,SAAQ,YAAY;IACnD;;OAEG;IACO,SAAS,CAAU;IAC7B;;OAEG;IACO,OAAO,CAAU;IAC3B;;OAEG;IACO,QAAQ,GAAiC,EAAE,CAAC;IAEtD;;OAEG;IACO,KAAK,CAAC,YAAY;QAC1B,MAAM,GAAG,GAAyB;YAChC,OAAO,EAAE,IAAI,CAAC,SAAmB;YACjC,KAAK,EAAE,IAAI,CAAC,OAAiB;YAC7B,UAAU,EAAE,IAAI,CAAC,QAAQ;SAC1B,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Worker } from 'cluster';
|
|
3
|
+
import { HttpProject, IHttpProject } from '../../models/HttpProject.js';
|
|
4
|
+
import { IProjectRunnerOptions } from './ProjectRunner.js';
|
|
5
|
+
import { IProjectExecutionLog } from '../reporters/Reporter.js';
|
|
6
|
+
import { BaseRunner } from './BaseRunner.js';
|
|
7
|
+
export declare type WorkerStatus = 'initializing' | 'ready' | 'running' | 'finished' | 'error';
|
|
8
|
+
export interface IWorkerInfo {
|
|
9
|
+
/**
|
|
10
|
+
* Whether the worker is online.
|
|
11
|
+
*/
|
|
12
|
+
online: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* The number of iterations the worker is performing.
|
|
15
|
+
*/
|
|
16
|
+
iterations: number;
|
|
17
|
+
/**
|
|
18
|
+
* The current status of the worker.
|
|
19
|
+
*/
|
|
20
|
+
status: WorkerStatus;
|
|
21
|
+
/**
|
|
22
|
+
* Optional error message received from the worker.
|
|
23
|
+
*/
|
|
24
|
+
message?: string;
|
|
25
|
+
}
|
|
26
|
+
interface WorkerInfoInternal extends IWorkerInfo {
|
|
27
|
+
worker: Worker;
|
|
28
|
+
}
|
|
29
|
+
export interface IWorkerMessage {
|
|
30
|
+
cmd: string;
|
|
31
|
+
data?: unknown;
|
|
32
|
+
}
|
|
33
|
+
export interface IProjectParallelRunnerOptions extends IProjectRunnerOptions {
|
|
34
|
+
}
|
|
35
|
+
export interface IProjectParallelWorkerOptions extends IProjectRunnerOptions {
|
|
36
|
+
project: IHttpProject;
|
|
37
|
+
}
|
|
38
|
+
export interface ProjectParallelRunner {
|
|
39
|
+
/**
|
|
40
|
+
* Dispatched when a status of a worker change.
|
|
41
|
+
* This can be used to render the current status.
|
|
42
|
+
*/
|
|
43
|
+
on(event: 'status', listener: (info: IWorkerInfo[]) => void): this;
|
|
44
|
+
/**
|
|
45
|
+
* Dispatched when a status of a worker change.
|
|
46
|
+
* This can be used to render the current status.
|
|
47
|
+
*/
|
|
48
|
+
once(event: 'status', listener: (info: IWorkerInfo[]) => void): this;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Runs a project in parallel.
|
|
52
|
+
* It creates a number of workers determined by the number of CPUs available on the current machine
|
|
53
|
+
* and the number of iterations defined in the configuration options.
|
|
54
|
+
*
|
|
55
|
+
* When the number of iterations is greater then the number of CPUs then
|
|
56
|
+
* the program distributes the remaining iterations among created workers.
|
|
57
|
+
*
|
|
58
|
+
* The program dispatched the `status` event. It is dispatched each time when the worker status
|
|
59
|
+
* change. This event can be user to refresh the UI to reflect the newest state.
|
|
60
|
+
*/
|
|
61
|
+
export declare class ProjectParallelRunner extends BaseRunner {
|
|
62
|
+
project: HttpProject;
|
|
63
|
+
options: IProjectParallelRunnerOptions;
|
|
64
|
+
workers: WorkerInfoInternal[];
|
|
65
|
+
private mainResolver?;
|
|
66
|
+
private mainRejecter?;
|
|
67
|
+
constructor(project: HttpProject, opts?: IProjectParallelRunnerOptions);
|
|
68
|
+
execute(): Promise<IProjectExecutionLog>;
|
|
69
|
+
private _execute;
|
|
70
|
+
private getStatusWorkers;
|
|
71
|
+
private distributeIterations;
|
|
72
|
+
private setupWorker;
|
|
73
|
+
private _messageHandler;
|
|
74
|
+
private _exitHandler;
|
|
75
|
+
private setOnline;
|
|
76
|
+
private setRunResult;
|
|
77
|
+
private runWhenReady;
|
|
78
|
+
private finishWhenReady;
|
|
79
|
+
private setRunError;
|
|
80
|
+
}
|
|
81
|
+
export {};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import cluster from 'cluster';
|
|
2
|
+
import { cpus } from 'os';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { BaseRunner } from './BaseRunner.js';
|
|
6
|
+
const numCPUs = cpus().length;
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
/**
|
|
9
|
+
* Runs a project in parallel.
|
|
10
|
+
* It creates a number of workers determined by the number of CPUs available on the current machine
|
|
11
|
+
* and the number of iterations defined in the configuration options.
|
|
12
|
+
*
|
|
13
|
+
* When the number of iterations is greater then the number of CPUs then
|
|
14
|
+
* the program distributes the remaining iterations among created workers.
|
|
15
|
+
*
|
|
16
|
+
* The program dispatched the `status` event. It is dispatched each time when the worker status
|
|
17
|
+
* change. This event can be user to refresh the UI to reflect the newest state.
|
|
18
|
+
*/
|
|
19
|
+
export class ProjectParallelRunner extends BaseRunner {
|
|
20
|
+
project;
|
|
21
|
+
options;
|
|
22
|
+
workers = [];
|
|
23
|
+
mainResolver;
|
|
24
|
+
mainRejecter;
|
|
25
|
+
constructor(project, opts = {}) {
|
|
26
|
+
super();
|
|
27
|
+
this.project = project;
|
|
28
|
+
this.options = opts || {};
|
|
29
|
+
this._exitHandler = this._exitHandler.bind(this);
|
|
30
|
+
}
|
|
31
|
+
execute() {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
this.mainResolver = resolve;
|
|
34
|
+
this.mainRejecter = reject;
|
|
35
|
+
this._execute();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
_execute() {
|
|
39
|
+
try {
|
|
40
|
+
cluster.setupPrimary({
|
|
41
|
+
exec: join(__dirname, 'ProjectRunnerWorker.js'),
|
|
42
|
+
silent: true,
|
|
43
|
+
});
|
|
44
|
+
const { iterations = 1 } = this.options;
|
|
45
|
+
const poolSize = Math.min(iterations, numCPUs);
|
|
46
|
+
for (let i = 0; i < poolSize; i++) {
|
|
47
|
+
const worker = cluster.fork();
|
|
48
|
+
this.setupWorker(worker);
|
|
49
|
+
}
|
|
50
|
+
this.distributeIterations();
|
|
51
|
+
this.emit('status', this.getStatusWorkers());
|
|
52
|
+
cluster.on('exit', this._exitHandler);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
const cause = e;
|
|
56
|
+
this.mainRejecter(cause);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
getStatusWorkers() {
|
|
60
|
+
const { workers } = this;
|
|
61
|
+
const result = [];
|
|
62
|
+
workers.forEach((info) => {
|
|
63
|
+
const cp = { ...info };
|
|
64
|
+
delete cp.worker;
|
|
65
|
+
result.push(cp);
|
|
66
|
+
});
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
distributeIterations() {
|
|
70
|
+
const workers = this.workers.length;
|
|
71
|
+
const { iterations = 1 } = this.options;
|
|
72
|
+
let iterationsRemaining = iterations - workers;
|
|
73
|
+
let currentIndex = 0;
|
|
74
|
+
while (iterationsRemaining > 0) {
|
|
75
|
+
this.workers[currentIndex].iterations += 1;
|
|
76
|
+
iterationsRemaining--;
|
|
77
|
+
currentIndex++;
|
|
78
|
+
if (currentIndex + 1 === workers) {
|
|
79
|
+
currentIndex = 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
setupWorker(worker) {
|
|
84
|
+
this.workers.push({
|
|
85
|
+
worker,
|
|
86
|
+
online: false,
|
|
87
|
+
iterations: 1,
|
|
88
|
+
status: 'initializing',
|
|
89
|
+
});
|
|
90
|
+
worker.on('message', this._messageHandler.bind(this, worker));
|
|
91
|
+
}
|
|
92
|
+
_messageHandler(worker, message) {
|
|
93
|
+
switch (message.cmd) {
|
|
94
|
+
case 'online':
|
|
95
|
+
this.setOnline(worker);
|
|
96
|
+
break;
|
|
97
|
+
case 'result':
|
|
98
|
+
this.setRunResult(worker, message);
|
|
99
|
+
break;
|
|
100
|
+
case 'error':
|
|
101
|
+
this.setRunError(worker, message);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
_exitHandler(worker) {
|
|
106
|
+
const info = this.workers.find(i => i.worker === worker);
|
|
107
|
+
if (!info) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.finishWhenReady();
|
|
111
|
+
}
|
|
112
|
+
setOnline(worker) {
|
|
113
|
+
const info = this.workers.find(i => i.worker === worker);
|
|
114
|
+
if (!info) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
info.online = true;
|
|
118
|
+
info.status = 'ready';
|
|
119
|
+
this.runWhenReady();
|
|
120
|
+
this.emit('status', this.getStatusWorkers());
|
|
121
|
+
}
|
|
122
|
+
setRunResult(worker, message) {
|
|
123
|
+
const reports = message.data;
|
|
124
|
+
this.executed = this.executed.concat(reports);
|
|
125
|
+
worker.destroy();
|
|
126
|
+
const info = this.workers.find(i => i.worker === worker);
|
|
127
|
+
if (!info) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
info.status = 'finished';
|
|
131
|
+
this.emit('status', this.getStatusWorkers());
|
|
132
|
+
}
|
|
133
|
+
runWhenReady() {
|
|
134
|
+
const waiting = this.workers.some(i => !i.online);
|
|
135
|
+
if (waiting) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.startTime = Date.now();
|
|
139
|
+
this.workers.forEach((info) => {
|
|
140
|
+
const opts = { ...this.options, project: this.project.toJSON() };
|
|
141
|
+
opts.iterations = info.iterations;
|
|
142
|
+
info.status = 'running';
|
|
143
|
+
info.worker.send({
|
|
144
|
+
cmd: 'run',
|
|
145
|
+
data: opts,
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
async finishWhenReady() {
|
|
150
|
+
if (this.endTime) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const working = this.workers.some(i => !['finished', 'error'].includes(i.status));
|
|
154
|
+
if (working || !this.mainResolver) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
this.endTime = Date.now();
|
|
158
|
+
const report = await this.createReport();
|
|
159
|
+
this.mainResolver(report);
|
|
160
|
+
cluster.off('exit', this._exitHandler);
|
|
161
|
+
}
|
|
162
|
+
setRunError(worker, message) {
|
|
163
|
+
worker.destroy();
|
|
164
|
+
const info = this.workers.find(i => i.worker === worker);
|
|
165
|
+
if (!info) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
info.status = 'error';
|
|
169
|
+
info.message = message.data;
|
|
170
|
+
this.emit('status', this.getStatusWorkers());
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=ProjectParallelRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectParallelRunner.js","sourceRoot":"","sources":["../../../../src/runtime/node/ProjectParallelRunner.ts"],"names":[],"mappings":"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"}
|