@elastic/synthetics 1.0.0-beta.21 → 1.0.0-beta.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +12 -12
- package/dist/cli.js.map +1 -1
- package/dist/common_types.d.ts +39 -4
- package/dist/common_types.d.ts.map +1 -1
- package/dist/config.js +5 -5
- package/dist/config.js.map +1 -1
- package/dist/core/browser-service.js +5 -5
- package/dist/core/browser-service.js.map +1 -1
- package/dist/core/gatherer.js +4 -4
- package/dist/core/gatherer.js.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/logger.js +2 -2
- package/dist/core/logger.js.map +1 -1
- package/dist/core/runner.js +33 -33
- package/dist/core/runner.js.map +1 -1
- package/dist/dsl/journey.js +2 -2
- package/dist/dsl/journey.js.map +1 -1
- package/dist/helpers.js +18 -18
- package/dist/helpers.js.map +1 -1
- package/dist/plugins/browser-console.js +2 -2
- package/dist/plugins/browser-console.js.map +1 -1
- package/dist/plugins/network.d.ts +4 -1
- package/dist/plugins/network.d.ts.map +1 -1
- package/dist/plugins/network.js +47 -24
- package/dist/plugins/network.js.map +1 -1
- package/dist/reporters/base.d.ts.map +1 -1
- package/dist/reporters/base.js +14 -11
- package/dist/reporters/base.js.map +1 -1
- package/dist/reporters/json.d.ts +4 -53
- package/dist/reporters/json.d.ts.map +1 -1
- package/dist/reporters/json.js +14 -42
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/junit.d.ts.map +1 -1
- package/dist/reporters/junit.js +7 -7
- package/dist/reporters/junit.js.map +1 -1
- package/dist/sdk/lh-trace-processor.js +3 -3
- package/dist/sdk/lh-trace-processor.js.map +1 -1
- package/dist/sdk/trace-processor.d.ts.map +1 -1
- package/dist/sdk/trace-processor.js +1 -1
- package/dist/sdk/trace-processor.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/src/common_types.ts +46 -4
- package/src/core/gatherer.ts +1 -1
- package/src/plugins/network.ts +47 -24
- package/src/reporters/base.ts +6 -1
- package/src/reporters/json.ts +8 -39
- package/src/reporters/junit.ts +1 -1
- package/src/sdk/trace-processor.ts +1 -1
package/src/common_types.ts
CHANGED
|
@@ -100,18 +100,60 @@ export type Screenshot = {
|
|
|
100
100
|
data: string;
|
|
101
101
|
};
|
|
102
102
|
|
|
103
|
+
export type SecurityDetails = {
|
|
104
|
+
issuer?: string;
|
|
105
|
+
protocol?: string;
|
|
106
|
+
subjectName?: string;
|
|
107
|
+
validFrom?: number;
|
|
108
|
+
validTo?: number;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export type Request = {
|
|
112
|
+
method: string;
|
|
113
|
+
url: string;
|
|
114
|
+
headers: Record<string, string>;
|
|
115
|
+
// Total size in bytes of the request (body and headers)
|
|
116
|
+
bytes?: number;
|
|
117
|
+
body?: {
|
|
118
|
+
// Size in bytes of the request body
|
|
119
|
+
bytes: number;
|
|
120
|
+
};
|
|
121
|
+
referrer?: string;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export type Response = {
|
|
125
|
+
url?: string;
|
|
126
|
+
protocol?: string;
|
|
127
|
+
status: number;
|
|
128
|
+
statusText?: string;
|
|
129
|
+
mimeType: string;
|
|
130
|
+
httpVersion?: string;
|
|
131
|
+
headers: Record<string, string>;
|
|
132
|
+
// Total size in bytes of the response (body and headers)
|
|
133
|
+
bytes?: number;
|
|
134
|
+
body?: {
|
|
135
|
+
// Size in bytes of the response body
|
|
136
|
+
bytes: number;
|
|
137
|
+
};
|
|
138
|
+
transferSize?: number;
|
|
139
|
+
redirectURL?: string;
|
|
140
|
+
securityDetails?: SecurityDetails;
|
|
141
|
+
remoteIPAddress?: string;
|
|
142
|
+
remotePort?: number;
|
|
143
|
+
fromServiceWorker?: boolean;
|
|
144
|
+
timing?: Protocol.Network.ResourceTiming;
|
|
145
|
+
};
|
|
146
|
+
|
|
103
147
|
export type NetworkInfo = {
|
|
104
148
|
url: string;
|
|
105
149
|
browser: BrowserInfo;
|
|
106
|
-
method: string;
|
|
107
150
|
type: string;
|
|
108
|
-
request:
|
|
109
|
-
response?:
|
|
151
|
+
request: Request;
|
|
152
|
+
response?: Response;
|
|
110
153
|
isNavigationRequest: boolean;
|
|
111
154
|
requestSentTime: number;
|
|
112
155
|
loadEndTime: number;
|
|
113
156
|
responseReceivedTime: number;
|
|
114
|
-
status: number;
|
|
115
157
|
resourceSize: number;
|
|
116
158
|
transferSize: number;
|
|
117
159
|
timings?: {
|
package/src/core/gatherer.ts
CHANGED
|
@@ -43,7 +43,7 @@ export class Gatherer {
|
|
|
43
43
|
if (Gatherer.browser == null) {
|
|
44
44
|
if (wsEndpoint) {
|
|
45
45
|
log(`Gatherer: connecting to WS endpoint: ${wsEndpoint}`);
|
|
46
|
-
Gatherer.browser = await chromium.connect(
|
|
46
|
+
Gatherer.browser = await chromium.connect(wsEndpoint);
|
|
47
47
|
} else {
|
|
48
48
|
Gatherer.browser = await chromium.launch({
|
|
49
49
|
...playwrightOptions,
|
package/src/plugins/network.ts
CHANGED
|
@@ -64,14 +64,14 @@ export class NetworkManager {
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
_onRequestWillBeSent(event: Protocol.Network.requestWillBeSentPayload) {
|
|
67
|
-
const {
|
|
68
|
-
const { url, method } = request;
|
|
67
|
+
const { url, method, postData, headers } = event.request;
|
|
69
68
|
/**
|
|
70
69
|
* Data URI should not show up as network requests
|
|
71
70
|
*/
|
|
72
71
|
if (url.startsWith('data:')) {
|
|
73
72
|
return;
|
|
74
73
|
}
|
|
74
|
+
const { requestId, timestamp, type, loaderId } = event;
|
|
75
75
|
const isNavigationRequest = requestId == loaderId && type === 'Document';
|
|
76
76
|
const record = this._findNetworkRecord(requestId);
|
|
77
77
|
/**
|
|
@@ -81,6 +81,7 @@ export class NetworkManager {
|
|
|
81
81
|
*/
|
|
82
82
|
if (record) {
|
|
83
83
|
if (event.redirectResponse) {
|
|
84
|
+
record.response.redirectURL = url;
|
|
84
85
|
const response = event.redirectResponse;
|
|
85
86
|
const data = Object.assign(event, {
|
|
86
87
|
type: event.type,
|
|
@@ -117,15 +118,23 @@ export class NetworkManager {
|
|
|
117
118
|
step: this._currentStep,
|
|
118
119
|
timestamp: getTimestamp(),
|
|
119
120
|
url,
|
|
120
|
-
request,
|
|
121
121
|
type,
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
request: {
|
|
123
|
+
url,
|
|
124
|
+
method,
|
|
125
|
+
headers,
|
|
126
|
+
bytes: postData?.length || 0,
|
|
127
|
+
},
|
|
128
|
+
response: {
|
|
129
|
+
status: -1,
|
|
130
|
+
mimeType: 'x-unknown',
|
|
131
|
+
headers: {},
|
|
132
|
+
timing: null,
|
|
133
|
+
},
|
|
124
134
|
isNavigationRequest,
|
|
125
|
-
|
|
126
|
-
loadEndTime: -1,
|
|
135
|
+
requestSentTime: timestamp,
|
|
127
136
|
responseReceivedTime: -1,
|
|
128
|
-
|
|
137
|
+
loadEndTime: -1,
|
|
129
138
|
resourceSize: 0,
|
|
130
139
|
transferSize: 0,
|
|
131
140
|
timings: null,
|
|
@@ -147,6 +156,7 @@ export class NetworkManager {
|
|
|
147
156
|
...record.request.headers,
|
|
148
157
|
...headers,
|
|
149
158
|
};
|
|
159
|
+
record.request.referrer = record.request.headers?.Referer;
|
|
150
160
|
}
|
|
151
161
|
|
|
152
162
|
_onDataReceived(event: Protocol.Network.dataReceivedPayload) {
|
|
@@ -165,12 +175,31 @@ export class NetworkManager {
|
|
|
165
175
|
if (!record) {
|
|
166
176
|
return;
|
|
167
177
|
}
|
|
168
|
-
|
|
178
|
+
|
|
179
|
+
record.responseReceivedTime = timestamp;
|
|
180
|
+
record.transferSize = response.encodedDataLength;
|
|
181
|
+
record.response = {
|
|
182
|
+
url: response.url,
|
|
169
183
|
status: response.status,
|
|
170
|
-
response,
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
184
|
+
protocol: response.protocol,
|
|
185
|
+
statusText: response.statusText,
|
|
186
|
+
headers: response.headers,
|
|
187
|
+
mimeType: response.mimeType,
|
|
188
|
+
remoteIPAddress: response.remoteIPAddress,
|
|
189
|
+
remotePort: response.remotePort,
|
|
190
|
+
fromServiceWorker: response.fromServiceWorker,
|
|
191
|
+
redirectURL: record.response.redirectURL,
|
|
192
|
+
timing: response.timing,
|
|
193
|
+
};
|
|
194
|
+
if (response.securityDetails) {
|
|
195
|
+
record.response.securityDetails = {
|
|
196
|
+
protocol: response.securityDetails.protocol,
|
|
197
|
+
subjectName: response.securityDetails.subjectName,
|
|
198
|
+
issuer: response.securityDetails.issuer,
|
|
199
|
+
validFrom: response.securityDetails.validFrom,
|
|
200
|
+
validTo: response.securityDetails.validTo,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
174
203
|
}
|
|
175
204
|
|
|
176
205
|
_onLoadingFinished(event: Protocol.Network.loadingFinishedPayload) {
|
|
@@ -194,6 +223,9 @@ export class NetworkManager {
|
|
|
194
223
|
}
|
|
195
224
|
if (encodedDataLength >= 0) {
|
|
196
225
|
record.transferSize = encodedDataLength;
|
|
226
|
+
record.response.body = {
|
|
227
|
+
bytes: encodedDataLength,
|
|
228
|
+
};
|
|
197
229
|
}
|
|
198
230
|
record.loadEndTime = endTime;
|
|
199
231
|
record.timings = calculateTimings(record);
|
|
@@ -250,17 +282,6 @@ export function calculateTimings(record: NetworkInfo) {
|
|
|
250
282
|
receive: -1,
|
|
251
283
|
total: -1,
|
|
252
284
|
};
|
|
253
|
-
const { requestSentTime, loadEndTime, responseReceivedTime } = record;
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Handle when request failed and no responseReceived event was
|
|
257
|
-
* fired for that particular request
|
|
258
|
-
* Eg: connection refused by remote host
|
|
259
|
-
*/
|
|
260
|
-
const response = record.response || {
|
|
261
|
-
timing: null,
|
|
262
|
-
fromServiceWorker: false,
|
|
263
|
-
};
|
|
264
285
|
|
|
265
286
|
const toMilliseconds = (time: number) => (time === -1 ? -1 : time * 1000);
|
|
266
287
|
const calculateDiffInMs = (
|
|
@@ -293,6 +314,8 @@ export function calculateTimings(record: NetworkInfo) {
|
|
|
293
314
|
calculateDiffInMs(name, startTime + start / 1000, startTime + end / 1000);
|
|
294
315
|
}
|
|
295
316
|
};
|
|
317
|
+
const { requestSentTime, loadEndTime, responseReceivedTime, response } =
|
|
318
|
+
record;
|
|
296
319
|
const timing = response.timing;
|
|
297
320
|
const actResRcvdTime = getResponseReceivedTime(timing, responseReceivedTime);
|
|
298
321
|
const issueTime = requestSentTime;
|
package/src/reporters/base.ts
CHANGED
|
@@ -70,8 +70,13 @@ export default class BaseReporter {
|
|
|
70
70
|
* before destroying the pipe with underlying file descriptor
|
|
71
71
|
*/
|
|
72
72
|
this.stream = new SonicBoom({ fd: this.fd, sync: true, minLength: 1 });
|
|
73
|
+
|
|
74
|
+
// flushSync is used here to make sure all the data from the underlying
|
|
75
|
+
// SonicBoom stream buffer is completely written to the fd before closing
|
|
76
|
+
// the process
|
|
77
|
+
this.runner.on('end', () => this.stream.flushSync());
|
|
78
|
+
|
|
73
79
|
this._registerListeners();
|
|
74
|
-
this.runner.on('end', () => this.stream.flush());
|
|
75
80
|
}
|
|
76
81
|
|
|
77
82
|
_registerListeners() {
|
package/src/reporters/json.ts
CHANGED
|
@@ -40,6 +40,7 @@ import { Journey, Step } from '../dsl';
|
|
|
40
40
|
import snakeCaseKeys from 'snakecase-keys';
|
|
41
41
|
import {
|
|
42
42
|
NetworkInfo,
|
|
43
|
+
SecurityDetails,
|
|
43
44
|
NetworkConditions,
|
|
44
45
|
TraceOutput,
|
|
45
46
|
StatusValue,
|
|
@@ -47,7 +48,6 @@ import {
|
|
|
47
48
|
Params,
|
|
48
49
|
Screenshot,
|
|
49
50
|
} from '../common_types';
|
|
50
|
-
import { Protocol } from 'playwright-chromium/types/protocol';
|
|
51
51
|
import { PageMetrics } from '../plugins';
|
|
52
52
|
|
|
53
53
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
@@ -72,7 +72,7 @@ type Payload = {
|
|
|
72
72
|
start?: number;
|
|
73
73
|
end?: number;
|
|
74
74
|
url?: string;
|
|
75
|
-
status?: StatusValue
|
|
75
|
+
status?: StatusValue;
|
|
76
76
|
pagemetrics?: PageMetrics;
|
|
77
77
|
params?: Params;
|
|
78
78
|
type?: OutputType;
|
|
@@ -94,7 +94,7 @@ type OutputFields = {
|
|
|
94
94
|
};
|
|
95
95
|
error?: Error;
|
|
96
96
|
root_fields?: Record<string, unknown>;
|
|
97
|
-
payload?: Payload
|
|
97
|
+
payload?: Payload;
|
|
98
98
|
blob?: string;
|
|
99
99
|
blob_mime?: string;
|
|
100
100
|
};
|
|
@@ -143,41 +143,12 @@ function formatVersion(protocol: string | undefined) {
|
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
function
|
|
147
|
-
const postData = request.postData ? request.postData : '';
|
|
148
|
-
return {
|
|
149
|
-
...request,
|
|
150
|
-
body: {
|
|
151
|
-
bytes: postData.length,
|
|
152
|
-
content: postData,
|
|
153
|
-
},
|
|
154
|
-
referrer: request.headers?.Referer,
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function formatResponse(response: Protocol.Network.Response) {
|
|
159
|
-
if (!response) {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
return {
|
|
163
|
-
...response,
|
|
164
|
-
body: {
|
|
165
|
-
bytes: response.encodedDataLength,
|
|
166
|
-
},
|
|
167
|
-
status_code: response.status,
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function formatTLS(tls: Protocol.Network.SecurityDetails) {
|
|
146
|
+
function formatTLS(tls: SecurityDetails) {
|
|
172
147
|
if (!tls) {
|
|
173
148
|
return;
|
|
174
149
|
}
|
|
175
|
-
const cipher = `${tls.keyExchange ? tls.keyExchange + '_' : ''}${
|
|
176
|
-
tls.cipher
|
|
177
|
-
}_${tls.keyExchangeGroup}`;
|
|
178
150
|
const [name, version] = tls.protocol.toLowerCase().split(' ');
|
|
179
151
|
return {
|
|
180
|
-
cipher,
|
|
181
152
|
server: {
|
|
182
153
|
x509: {
|
|
183
154
|
issuer: {
|
|
@@ -191,7 +162,7 @@ function formatTLS(tls: Protocol.Network.SecurityDetails) {
|
|
|
191
162
|
},
|
|
192
163
|
},
|
|
193
164
|
version_protocol: name,
|
|
194
|
-
version
|
|
165
|
+
version,
|
|
195
166
|
};
|
|
196
167
|
}
|
|
197
168
|
|
|
@@ -207,16 +178,14 @@ export function formatNetworkFields(network: NetworkInfo) {
|
|
|
207
178
|
},
|
|
208
179
|
http: {
|
|
209
180
|
version: formatVersion(response?.protocol),
|
|
210
|
-
request
|
|
211
|
-
response
|
|
181
|
+
request,
|
|
182
|
+
response,
|
|
212
183
|
},
|
|
213
184
|
tls: formatTLS(response?.securityDetails),
|
|
214
185
|
};
|
|
215
186
|
|
|
216
187
|
const pickItems: Array<keyof NetworkInfo> = [
|
|
217
188
|
'browser',
|
|
218
|
-
'status',
|
|
219
|
-
'method',
|
|
220
189
|
'type',
|
|
221
190
|
'isNavigationRequest',
|
|
222
191
|
'requestSentTime',
|
|
@@ -343,7 +312,7 @@ export async function gatherScreenshots(
|
|
|
343
312
|
}
|
|
344
313
|
|
|
345
314
|
export default class JSONReporter extends BaseReporter {
|
|
346
|
-
_registerListeners() {
|
|
315
|
+
override _registerListeners() {
|
|
347
316
|
/**
|
|
348
317
|
* report the number of journeys that exists on a suite which
|
|
349
318
|
* could be used for better sharding
|
package/src/reporters/junit.ts
CHANGED
|
@@ -52,7 +52,7 @@ export default class JUnitReporter extends BaseReporter {
|
|
|
52
52
|
private totalFailures = 0;
|
|
53
53
|
private totalSkipped = 0;
|
|
54
54
|
|
|
55
|
-
_registerListeners() {
|
|
55
|
+
override _registerListeners() {
|
|
56
56
|
const journeyMap = new Map<string, XMLEntry>();
|
|
57
57
|
|
|
58
58
|
this.runner.on('journey:start', ({ journey }) => {
|
|
@@ -111,7 +111,7 @@ export type LHProcessedTrace = {
|
|
|
111
111
|
* metrics based on multiple navigations instead of a single navigation.
|
|
112
112
|
*/
|
|
113
113
|
export class TraceProcessor extends LighthouseTraceProcessor {
|
|
114
|
-
static _isNavigationStartOfInterest(event) {
|
|
114
|
+
static override _isNavigationStartOfInterest(event) {
|
|
115
115
|
return (
|
|
116
116
|
event.name === 'navigationStart' &&
|
|
117
117
|
(!event.args.data ||
|