@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.
Files changed (50) hide show
  1. package/dist/cli.js +12 -12
  2. package/dist/cli.js.map +1 -1
  3. package/dist/common_types.d.ts +39 -4
  4. package/dist/common_types.d.ts.map +1 -1
  5. package/dist/config.js +5 -5
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/browser-service.js +5 -5
  8. package/dist/core/browser-service.js.map +1 -1
  9. package/dist/core/gatherer.js +4 -4
  10. package/dist/core/gatherer.js.map +1 -1
  11. package/dist/core/index.js +2 -2
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/logger.js +2 -2
  14. package/dist/core/logger.js.map +1 -1
  15. package/dist/core/runner.js +33 -33
  16. package/dist/core/runner.js.map +1 -1
  17. package/dist/dsl/journey.js +2 -2
  18. package/dist/dsl/journey.js.map +1 -1
  19. package/dist/helpers.js +18 -18
  20. package/dist/helpers.js.map +1 -1
  21. package/dist/plugins/browser-console.js +2 -2
  22. package/dist/plugins/browser-console.js.map +1 -1
  23. package/dist/plugins/network.d.ts +4 -1
  24. package/dist/plugins/network.d.ts.map +1 -1
  25. package/dist/plugins/network.js +47 -24
  26. package/dist/plugins/network.js.map +1 -1
  27. package/dist/reporters/base.d.ts.map +1 -1
  28. package/dist/reporters/base.js +14 -11
  29. package/dist/reporters/base.js.map +1 -1
  30. package/dist/reporters/json.d.ts +4 -53
  31. package/dist/reporters/json.d.ts.map +1 -1
  32. package/dist/reporters/json.js +14 -42
  33. package/dist/reporters/json.js.map +1 -1
  34. package/dist/reporters/junit.d.ts.map +1 -1
  35. package/dist/reporters/junit.js +7 -7
  36. package/dist/reporters/junit.js.map +1 -1
  37. package/dist/sdk/lh-trace-processor.js +3 -3
  38. package/dist/sdk/lh-trace-processor.js.map +1 -1
  39. package/dist/sdk/trace-processor.d.ts.map +1 -1
  40. package/dist/sdk/trace-processor.js +1 -1
  41. package/dist/sdk/trace-processor.js.map +1 -1
  42. package/dist/tsconfig.tsbuildinfo +1 -1
  43. package/package.json +6 -6
  44. package/src/common_types.ts +46 -4
  45. package/src/core/gatherer.ts +1 -1
  46. package/src/plugins/network.ts +47 -24
  47. package/src/reporters/base.ts +6 -1
  48. package/src/reporters/json.ts +8 -39
  49. package/src/reporters/junit.ts +1 -1
  50. package/src/sdk/trace-processor.ts +1 -1
@@ -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: Protocol.Network.Request;
109
- response?: Protocol.Network.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?: {
@@ -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({ wsEndpoint });
46
+ Gatherer.browser = await chromium.connect(wsEndpoint);
47
47
  } else {
48
48
  Gatherer.browser = await chromium.launch({
49
49
  ...playwrightOptions,
@@ -64,14 +64,14 @@ export class NetworkManager {
64
64
  }
65
65
 
66
66
  _onRequestWillBeSent(event: Protocol.Network.requestWillBeSentPayload) {
67
- const { requestId, request, timestamp, type, loaderId } = event;
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
- method,
123
- requestSentTime: timestamp,
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
- status: 0,
126
- loadEndTime: -1,
135
+ requestSentTime: timestamp,
127
136
  responseReceivedTime: -1,
128
- response: null,
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
- Object.assign(record, {
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
- responseReceivedTime: timestamp,
172
- transferSize: response.encodedDataLength,
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;
@@ -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() {
@@ -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 | number;
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 | NetworkInfo;
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 formatRequest(request: Protocol.Network.Request) {
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: 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: formatRequest(request),
211
- response: formatResponse(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
@@ -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 ||