@api-client/core 0.3.4 → 0.3.7

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 (109) hide show
  1. package/build/browser.d.ts +6 -0
  2. package/build/browser.js +15 -0
  3. package/build/browser.js.map +1 -1
  4. package/build/index.d.ts +14 -2
  5. package/build/index.js +26 -2
  6. package/build/index.js.map +1 -1
  7. package/build/src/lib/calculators/DataCalculator.d.ts +27 -0
  8. package/build/src/lib/calculators/DataCalculator.js +88 -0
  9. package/build/src/lib/calculators/DataCalculator.js.map +1 -0
  10. package/build/src/lib/fs/Fs.d.ts +52 -0
  11. package/build/src/lib/fs/Fs.js +245 -0
  12. package/build/src/lib/fs/Fs.js.map +1 -0
  13. package/build/src/lib/parsers/UrlEncoder.d.ts +51 -0
  14. package/build/src/lib/parsers/UrlEncoder.js +74 -0
  15. package/build/src/lib/parsers/UrlEncoder.js.map +1 -0
  16. package/build/src/lib/parsers/UrlParser.d.ts +104 -0
  17. package/build/src/lib/parsers/UrlParser.js +189 -0
  18. package/build/src/lib/parsers/UrlParser.js.map +1 -0
  19. package/build/src/lib/parsers/UrlValueParser.d.ts +92 -0
  20. package/build/src/lib/parsers/UrlValueParser.js +172 -0
  21. package/build/src/lib/parsers/UrlValueParser.js.map +1 -0
  22. package/build/src/lib/timers/Timers.d.ts +5 -0
  23. package/build/src/lib/timers/Timers.js +10 -0
  24. package/build/src/lib/timers/Timers.js.map +1 -0
  25. package/build/src/mocking/ProjectMock.d.ts +13 -0
  26. package/build/src/mocking/ProjectMock.js +16 -0
  27. package/build/src/mocking/ProjectMock.js.map +1 -0
  28. package/build/src/mocking/lib/Request.d.ts +32 -0
  29. package/build/src/mocking/lib/Request.js +63 -0
  30. package/build/src/mocking/lib/Request.js.map +1 -0
  31. package/build/src/mocking/lib/Response.d.ts +33 -0
  32. package/build/src/mocking/lib/Response.js +79 -0
  33. package/build/src/mocking/lib/Response.js.map +1 -0
  34. package/build/src/models/ErrorResponse.d.ts +5 -4
  35. package/build/src/models/ErrorResponse.js +18 -5
  36. package/build/src/models/ErrorResponse.js.map +1 -1
  37. package/build/src/models/SerializableError.d.ts +30 -0
  38. package/build/src/models/SerializableError.js +63 -0
  39. package/build/src/models/SerializableError.js.map +1 -0
  40. package/build/src/runtime/http-engine/ArcEngine.js +8 -4
  41. package/build/src/runtime/http-engine/ArcEngine.js.map +1 -1
  42. package/build/src/runtime/http-engine/HttpEngine.d.ts +3 -3
  43. package/build/src/runtime/http-engine/HttpEngine.js +3 -3
  44. package/build/src/runtime/http-engine/HttpEngine.js.map +1 -1
  45. package/build/src/runtime/http-engine/NodeEngine.js +9 -4
  46. package/build/src/runtime/http-engine/NodeEngine.js.map +1 -1
  47. package/build/src/runtime/http-engine/NodeEngineDirect.js +8 -2
  48. package/build/src/runtime/http-engine/NodeEngineDirect.js.map +1 -1
  49. package/build/src/runtime/node/BaseRunner.d.ts +21 -0
  50. package/build/src/runtime/node/BaseRunner.js +27 -0
  51. package/build/src/runtime/node/BaseRunner.js.map +1 -0
  52. package/build/src/runtime/node/ProjectParallelRunner.d.ts +81 -0
  53. package/build/src/runtime/node/ProjectParallelRunner.js +173 -0
  54. package/build/src/runtime/node/ProjectParallelRunner.js.map +1 -0
  55. package/build/src/runtime/node/ProjectRequestRunner.d.ts +125 -0
  56. package/build/src/runtime/node/ProjectRequestRunner.js +185 -0
  57. package/build/src/runtime/node/ProjectRequestRunner.js.map +1 -0
  58. package/build/src/runtime/node/ProjectRunner.d.ts +166 -64
  59. package/build/src/runtime/node/ProjectRunner.js +191 -139
  60. package/build/src/runtime/node/ProjectRunner.js.map +1 -1
  61. package/build/src/runtime/node/ProjectRunnerWorker.d.ts +1 -0
  62. package/build/src/runtime/node/ProjectRunnerWorker.js +58 -0
  63. package/build/src/runtime/node/ProjectRunnerWorker.js.map +1 -0
  64. package/build/src/runtime/node/ProjectSerialRunner.d.ts +11 -0
  65. package/build/src/runtime/node/ProjectSerialRunner.js +34 -0
  66. package/build/src/runtime/node/ProjectSerialRunner.js.map +1 -0
  67. package/build/src/runtime/reporters/ProjectRunCliReporter.d.ts +7 -0
  68. package/build/src/runtime/reporters/ProjectRunCliReporter.js +73 -0
  69. package/build/src/runtime/reporters/ProjectRunCliReporter.js.map +1 -0
  70. package/build/src/runtime/reporters/Reporter.d.ts +62 -0
  71. package/build/src/runtime/reporters/Reporter.js +98 -0
  72. package/build/src/runtime/reporters/Reporter.js.map +1 -0
  73. package/build/src/testing/TestCliHelper.d.ts +29 -0
  74. package/build/src/testing/TestCliHelper.js +80 -0
  75. package/build/src/testing/TestCliHelper.js.map +1 -0
  76. package/build/src/testing/getPort.d.ts +52 -0
  77. package/build/src/testing/getPort.js +169 -0
  78. package/build/src/testing/getPort.js.map +1 -0
  79. package/package.json +2 -1
  80. package/src/lib/calculators/DataCalculator.ts +91 -0
  81. package/src/lib/fs/Fs.ts +258 -0
  82. package/src/lib/parsers/UrlEncoder.ts +74 -0
  83. package/src/lib/parsers/UrlParser.ts +201 -0
  84. package/src/lib/parsers/UrlValueParser.ts +211 -0
  85. package/src/lib/timers/Timers.ts +9 -0
  86. package/src/mocking/LegacyInterfaces.ts +1 -1
  87. package/src/mocking/ProjectMock.ts +20 -0
  88. package/src/mocking/lib/Request.ts +85 -0
  89. package/src/mocking/lib/Response.ts +101 -0
  90. package/src/models/ErrorResponse.ts +20 -8
  91. package/src/models/SerializableError.ts +80 -0
  92. package/src/runtime/http-engine/ArcEngine.ts +8 -4
  93. package/src/runtime/http-engine/HttpEngine.ts +5 -5
  94. package/src/runtime/http-engine/NodeEngine.ts +10 -5
  95. package/src/runtime/http-engine/NodeEngineDirect.ts +9 -3
  96. package/src/runtime/node/BaseRunner.ts +29 -0
  97. package/src/runtime/node/ProjectParallelRunner.ts +234 -0
  98. package/src/runtime/node/ProjectRequestRunner.ts +281 -0
  99. package/src/runtime/node/ProjectRunner.ts +281 -182
  100. package/src/runtime/node/ProjectRunnerWorker.ts +62 -0
  101. package/src/runtime/node/ProjectSerialRunner.ts +36 -0
  102. package/src/runtime/reporters/ProjectRunCliReporter.ts +79 -0
  103. package/src/runtime/reporters/Reporter.ts +142 -0
  104. package/src/testing/TestCliHelper.ts +87 -0
  105. package/src/testing/getPort.ts +212 -0
  106. package/build/src/runtime/http-engine/Errors.d.ts +0 -10
  107. package/build/src/runtime/http-engine/Errors.js +0 -14
  108. package/build/src/runtime/http-engine/Errors.js.map +0 -1
  109. package/src/runtime/http-engine/Errors.ts +0 -13
@@ -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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"}
@@ -0,0 +1,125 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'events';
3
+ import { Environment } from '../../models/Environment.js';
4
+ import { Logger } from '../../lib/logging/Logger.js';
5
+ import { IRequestLog } from '../../models/RequestLog.js';
6
+ import { ProjectFolder } from '../../models/ProjectFolder.js';
7
+ import { ProjectRequest } from '../../models/ProjectRequest.js';
8
+ import { IHttpRequest } from '../../models/HttpRequest.js';
9
+ import { HttpProject, IProjectRequestIterator } from '../../models/HttpProject.js';
10
+ import { VariablesProcessor } from '../variables/VariablesProcessor.js';
11
+ export interface ProjectRunnerOptions {
12
+ /**
13
+ * When provided it overrides any project / folder defined environment.
14
+ */
15
+ environment?: Environment;
16
+ /**
17
+ * Additional variables to pass to the selected environment.
18
+ * This can be use to pass system variables, when needed.
19
+ *
20
+ * To use system variables tou can use `init.variables = process.env`;
21
+ */
22
+ variables?: Record<string, string>;
23
+ /**
24
+ * Overrides the default logger (console).
25
+ */
26
+ logger?: Logger;
27
+ /**
28
+ * The event target to use.
29
+ * By default it creates its own target.
30
+ */
31
+ eventTarget?: EventTarget;
32
+ }
33
+ export interface ProjectRunnerRunOptions extends IProjectRequestIterator {
34
+ }
35
+ export interface RunResult {
36
+ /**
37
+ * The key of the request from the HttpProject that was executed.
38
+ */
39
+ key: string;
40
+ /**
41
+ * The key of parent folder of the executed request.
42
+ */
43
+ parent?: string;
44
+ /**
45
+ * Set when a fatal error occurred so the request couldn't be executed.
46
+ * This is not the same as error reported during a request. The log's response can still be IResponseError.
47
+ */
48
+ error?: boolean;
49
+ /**
50
+ * The error message. Always set when the `error` is `true`.
51
+ */
52
+ errorMessage?: string;
53
+ /**
54
+ * The request log.
55
+ * Always set when the `error` is `false`.
56
+ */
57
+ log?: IRequestLog;
58
+ }
59
+ export interface ProjectRequestRunner {
60
+ /**
61
+ * The request object is prepared and about to be sent to the HTTP engine
62
+ */
63
+ on(event: 'request', listener: (key: string, request: IHttpRequest) => void): this;
64
+ /**
65
+ * The response is ready.
66
+ */
67
+ on(event: 'response', listener: (key: string, log: IRequestLog) => void): this;
68
+ /**
69
+ * There was a general error during the request
70
+ */
71
+ on(event: 'error', listener: (key: string, log: IRequestLog, message: string) => void): this;
72
+ /**
73
+ * The request object is prepared and about to be sent to the HTTP engine
74
+ */
75
+ once(event: 'request', listener: (key: string, request: IHttpRequest) => void): this;
76
+ /**
77
+ * The response is ready.
78
+ */
79
+ once(event: 'response', listener: (key: string, log: IRequestLog) => void): this;
80
+ /**
81
+ * There was a general error during the request
82
+ */
83
+ once(event: 'error', listener: (key: string, log: IRequestLog, message: string) => void): this;
84
+ }
85
+ /**
86
+ * Runs requests in a project.
87
+ * Developers can run the entire project with the `recursive` flag set. They can also
88
+ * set the starting point with the `parent` options.
89
+ *
90
+ * Requests are executed in order defined in the folder.
91
+ */
92
+ export declare class ProjectRequestRunner extends EventEmitter {
93
+ eventTarget: EventTarget;
94
+ logger?: Logger;
95
+ project: HttpProject;
96
+ protected masterEnvironment?: Environment;
97
+ protected extraVariables?: Record<string, string>;
98
+ /**
99
+ * The variables processor instance.
100
+ */
101
+ protected variablesProcessor: VariablesProcessor;
102
+ constructor(project: HttpProject, opts?: ProjectRunnerOptions);
103
+ /**
104
+ * Runs the request from the project root or a specified folder.
105
+ * @param options Run options.
106
+ * @returns A promise with the run result.
107
+ */
108
+ run(options?: ProjectRunnerRunOptions): Promise<RunResult[]>;
109
+ protected execute(request: ProjectRequest, variables: Record<string, string>): Promise<RunResult>;
110
+ protected getVariables(parent: HttpProject | ProjectFolder): Promise<Record<string, string>>;
111
+ protected createEnvironment(parent: HttpProject | ProjectFolder): Promise<Record<string, string>>;
112
+ /**
113
+ * Reads the list of the environments to apply to this runtime.
114
+ */
115
+ protected readEnvironments(parent: HttpProject | ProjectFolder): Promise<Environment[]>;
116
+ /**
117
+ * Reads the variables and the base URI from the passed environments.
118
+ */
119
+ protected applyVariables(environments: Environment[]): Promise<Record<string, string>>;
120
+ /**
121
+ * When defined it applies the serve's base URI to relative URLs.
122
+ * @param currentUrl The URL to process.
123
+ */
124
+ protected prepareRequestUrl(currentUrl: string, variables: Record<string, string>): string;
125
+ }
@@ -0,0 +1,185 @@
1
+ import { EventEmitter } from 'events';
2
+ import { RequestLog } from '../../models/RequestLog.js';
3
+ import { Kind as ProjectFolderKind } from '../../models/ProjectFolder.js';
4
+ import { SentRequest } from '../../models/SentRequest.js';
5
+ import { ErrorResponse } from '../../models/ErrorResponse.js';
6
+ import { VariablesStore } from './VariablesStore.js';
7
+ import { VariablesProcessor } from '../variables/VariablesProcessor.js';
8
+ import { RequestFactory } from './RequestFactory.js';
9
+ import { EventTypes } from '../../events/EventTypes.js';
10
+ /**
11
+ * Runs requests in a project.
12
+ * Developers can run the entire project with the `recursive` flag set. They can also
13
+ * set the starting point with the `parent` options.
14
+ *
15
+ * Requests are executed in order defined in the folder.
16
+ */
17
+ export class ProjectRequestRunner extends EventEmitter {
18
+ eventTarget;
19
+ logger;
20
+ project;
21
+ masterEnvironment;
22
+ extraVariables;
23
+ /**
24
+ * The variables processor instance.
25
+ */
26
+ variablesProcessor = new VariablesProcessor();
27
+ constructor(project, opts = {}) {
28
+ super();
29
+ this.project = project;
30
+ this.logger = opts.logger;
31
+ this.eventTarget = opts.eventTarget || new EventTarget();
32
+ this.masterEnvironment = opts.environment;
33
+ this.extraVariables = opts.variables;
34
+ }
35
+ /**
36
+ * Runs the request from the project root or a specified folder.
37
+ * @param options Run options.
38
+ * @returns A promise with the run result.
39
+ */
40
+ async run(options) {
41
+ const { project } = this;
42
+ const executed = [];
43
+ for (const request of project.requestIterator(options)) {
44
+ const parent = request.getParent() || project;
45
+ let variables;
46
+ if (VariablesStore.has(parent)) {
47
+ variables = VariablesStore.get(parent);
48
+ }
49
+ else {
50
+ variables = await this.getVariables(parent);
51
+ VariablesStore.set(parent, variables);
52
+ }
53
+ const info = await this.execute(request, variables);
54
+ executed.push(info);
55
+ }
56
+ return executed;
57
+ }
58
+ async execute(request, variables) {
59
+ const config = request.getConfig();
60
+ const factory = new RequestFactory(this.eventTarget);
61
+ factory.variables = variables;
62
+ if (request.authorization) {
63
+ factory.authorization = request.authorization.map(i => i.toJSON());
64
+ }
65
+ if (request.actions) {
66
+ factory.actions = request.actions.toJSON();
67
+ }
68
+ if (request.clientCertificate) {
69
+ factory.certificates = [request.clientCertificate];
70
+ }
71
+ if (config.enabled !== false) {
72
+ factory.config = config.toJSON();
73
+ }
74
+ if (this.logger) {
75
+ factory.logger = this.logger;
76
+ }
77
+ const info = {
78
+ key: request.key,
79
+ };
80
+ const requestData = request.expects.toJSON();
81
+ requestData.url = this.prepareRequestUrl(requestData.url, variables);
82
+ function variableHandler(e) {
83
+ if (e.defaultPrevented) {
84
+ return;
85
+ }
86
+ const { name, value } = e.detail;
87
+ variables[name] = value;
88
+ e.preventDefault();
89
+ e.detail.result = Promise.resolve();
90
+ }
91
+ this.eventTarget.addEventListener(EventTypes.Environment.set, variableHandler);
92
+ try {
93
+ // Below replaces the single call to the `run()` function of the factory to
94
+ // report via the events a request object that has evaluated with the Jexl library.
95
+ const requestCopy = await factory.processRequestVariables(requestData);
96
+ this.emit('request', request.key, { ...requestCopy });
97
+ await factory.processRequestLogic(requestCopy);
98
+ const result = await factory.executeRequest(requestCopy);
99
+ await factory.processResponse(result);
100
+ request.setLog(result);
101
+ info.log = result;
102
+ this.emit('response', request.key, { ...result });
103
+ }
104
+ catch (e) {
105
+ const cause = e;
106
+ info.error = true;
107
+ info.errorMessage = cause.message;
108
+ const sent = new SentRequest({ ...requestData, startTime: 0, endTime: 0, });
109
+ const response = ErrorResponse.fromError(info.errorMessage);
110
+ const log = RequestLog.fromRequestResponse(sent.toJSON(), response.toJSON()).toJSON();
111
+ this.emit('error', request.key, log, info.errorMessage);
112
+ }
113
+ this.eventTarget.removeEventListener(EventTypes.Environment.set, variableHandler);
114
+ return info;
115
+ }
116
+ async getVariables(parent) {
117
+ if (this.masterEnvironment) {
118
+ return this.applyVariables([this.masterEnvironment]);
119
+ }
120
+ return this.createEnvironment(parent);
121
+ }
122
+ async createEnvironment(parent) {
123
+ const envs = await this.readEnvironments(parent);
124
+ return this.applyVariables(envs);
125
+ }
126
+ /**
127
+ * Reads the list of the environments to apply to this runtime.
128
+ */
129
+ async readEnvironments(parent) {
130
+ const folderKey = parent.kind === ProjectFolderKind ? parent.key : undefined;
131
+ return this.project.readEnvironments({ folderKey });
132
+ }
133
+ /**
134
+ * Reads the variables and the base URI from the passed environments.
135
+ */
136
+ async applyVariables(environments) {
137
+ let baseUri = '';
138
+ const variables = [];
139
+ environments.forEach((environment) => {
140
+ const { server, variables: envVariables } = environment;
141
+ if (server) {
142
+ baseUri = server.readUri();
143
+ }
144
+ if (envVariables.length) {
145
+ envVariables.forEach((item) => {
146
+ const defined = variables.findIndex(i => i.name === item.name);
147
+ if (defined >= 0) {
148
+ variables[defined] = item;
149
+ }
150
+ else {
151
+ variables.push(item);
152
+ }
153
+ });
154
+ }
155
+ });
156
+ const { extraVariables } = this;
157
+ const ctx = VariablesProcessor.createContextFromProperties(variables);
158
+ if (extraVariables) {
159
+ Object.keys(extraVariables).forEach((key) => {
160
+ ctx[key] = extraVariables[key];
161
+ });
162
+ }
163
+ // the `baseUri` is reserved and always set to the environment's `baseUri`.
164
+ ctx.baseUri = baseUri || '';
165
+ return this.variablesProcessor.buildContext(ctx);
166
+ }
167
+ /**
168
+ * When defined it applies the serve's base URI to relative URLs.
169
+ * @param currentUrl The URL to process.
170
+ */
171
+ prepareRequestUrl(currentUrl, variables) {
172
+ const { baseUri } = variables;
173
+ if (!baseUri) {
174
+ return currentUrl;
175
+ }
176
+ if (currentUrl.startsWith('http:') || currentUrl.startsWith('https:')) {
177
+ return currentUrl;
178
+ }
179
+ if (currentUrl.startsWith('/')) {
180
+ return `${baseUri}${currentUrl}`;
181
+ }
182
+ return `${baseUri}/${currentUrl}`;
183
+ }
184
+ }
185
+ //# sourceMappingURL=ProjectRequestRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectRequestRunner.js","sourceRoot":"","sources":["../../../../src/runtime/node/ProjectRequestRunner.ts"],"names":[],"mappings":"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"}