pagespeed-quest 0.3.2 → 0.3.3
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/adhoc.d.ts +2 -0
- package/build/adhoc.js +31 -0
- package/build/command.d.ts +2 -0
- package/build/command.js +121 -0
- package/build/dependency.d.ts +9 -0
- package/build/dependency.js +31 -0
- package/build/encoding.d.ts +11 -0
- package/build/encoding.js +43 -0
- package/build/formatting.d.ts +8 -0
- package/build/formatting.js +55 -0
- package/build/http.d.ts +26 -0
- package/build/http.js +96 -0
- package/build/index.d.ts +8 -0
- package/build/index.js +9 -0
- package/build/inventory.d.ts +46 -0
- package/build/inventory.js +175 -0
- package/build/lighthouse.d.ts +12 -0
- package/build/lighthouse.js +28 -0
- package/build/loadshow.d.ts +19 -0
- package/build/loadshow.js +65 -0
- package/build/playback.d.ts +22 -0
- package/build/playback.js +104 -0
- package/build/proxy.d.ts +35 -0
- package/build/proxy.js +96 -0
- package/build/recording.d.ts +28 -0
- package/build/recording.js +94 -0
- package/build/throttling.d.ts +33 -0
- package/build/throttling.js +89 -0
- package/build/types.d.ts +8 -0
- package/build/types.js +2 -0
- package/package.json +3 -2
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Proxy } from './proxy.js';
|
|
2
|
+
export class RecordingProxy extends Proxy {
|
|
3
|
+
startedAt;
|
|
4
|
+
transactions = [];
|
|
5
|
+
async setup() {
|
|
6
|
+
this.startedAt = new Date();
|
|
7
|
+
let requestNumber = 1;
|
|
8
|
+
this.proxy.onRequest((ctx, onRequestComplete) => {
|
|
9
|
+
const number = requestNumber++;
|
|
10
|
+
// Throttling
|
|
11
|
+
const filter = this.createThrottlingTransform();
|
|
12
|
+
if (filter)
|
|
13
|
+
ctx.addResponseFilter(filter);
|
|
14
|
+
const identifier = Proxy.contextRequest(ctx);
|
|
15
|
+
const transaction = {
|
|
16
|
+
startedAt: new Date(),
|
|
17
|
+
...identifier,
|
|
18
|
+
contentChunks: [],
|
|
19
|
+
};
|
|
20
|
+
this.dependency.logger?.debug({ number, identifier }, `Request #${number} ${transaction.url} started`);
|
|
21
|
+
ctx.onError((_, err, errKind) => {
|
|
22
|
+
transaction.responseStartedAt = new Date();
|
|
23
|
+
transaction.err = err;
|
|
24
|
+
transaction.errKind = errKind;
|
|
25
|
+
this.dependency.logger?.warn({ number, identifier, err }, `Request #${number} ${transaction.url} failed: ${err.message}`);
|
|
26
|
+
});
|
|
27
|
+
ctx.onResponse((_, onResponseComplete) => {
|
|
28
|
+
transaction.responseStartedAt = new Date();
|
|
29
|
+
transaction.statusCode = ctx.serverToProxyResponse.statusCode;
|
|
30
|
+
transaction.incomingHttpHeaders = ctx.serverToProxyResponse.headers;
|
|
31
|
+
this.dependency.logger?.debug({ number, identifier }, `Request #${number} ${transaction.url} responded`);
|
|
32
|
+
onResponseComplete();
|
|
33
|
+
});
|
|
34
|
+
ctx.onResponseData((_, chunk, onResponseDataComplete) => {
|
|
35
|
+
transaction.contentChunks.push(chunk);
|
|
36
|
+
onResponseDataComplete(null, chunk);
|
|
37
|
+
});
|
|
38
|
+
ctx.onResponseEnd((_, onResponseEndComplete) => {
|
|
39
|
+
transaction.responseEndedAt = new Date();
|
|
40
|
+
this.transactions.push(transaction);
|
|
41
|
+
this.dependency.logger?.debug({ number, identifier }, `Request #${number} ${transaction.url} completed`);
|
|
42
|
+
onResponseEndComplete();
|
|
43
|
+
});
|
|
44
|
+
onRequestComplete();
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async saveInventory() {
|
|
48
|
+
const transactions = [];
|
|
49
|
+
for (const requestTransaction of this.transactions) {
|
|
50
|
+
const transaction = {
|
|
51
|
+
method: requestTransaction.method,
|
|
52
|
+
url: requestTransaction.url,
|
|
53
|
+
ttfbMs: 0,
|
|
54
|
+
content: Buffer.concat(requestTransaction.contentChunks),
|
|
55
|
+
};
|
|
56
|
+
// ttfb and duration
|
|
57
|
+
if (requestTransaction.responseStartedAt) {
|
|
58
|
+
transaction.ttfbMs = +requestTransaction.responseStartedAt - +requestTransaction.startedAt;
|
|
59
|
+
if (requestTransaction.responseEndedAt) {
|
|
60
|
+
transaction.durationMs = +requestTransaction.responseEndedAt - +requestTransaction.responseStartedAt;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// error
|
|
64
|
+
if (requestTransaction.err) {
|
|
65
|
+
transaction.errorMessage = requestTransaction.err.message;
|
|
66
|
+
}
|
|
67
|
+
// status code
|
|
68
|
+
if (requestTransaction.statusCode) {
|
|
69
|
+
transaction.statusCode = requestTransaction.statusCode;
|
|
70
|
+
}
|
|
71
|
+
// headers
|
|
72
|
+
if (requestTransaction.incomingHttpHeaders) {
|
|
73
|
+
transaction.rawHeaders = {};
|
|
74
|
+
for (const [key, value] of Object.entries(requestTransaction.incomingHttpHeaders)) {
|
|
75
|
+
transaction.rawHeaders[key.toLowerCase()] = value.toString();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
transactions.push(transaction);
|
|
79
|
+
}
|
|
80
|
+
const resources = await this.inventoryRepository.saveTransactions(transactions);
|
|
81
|
+
const inventory = { entryUrl: this.entryUrl, deviceType: this.deviceType, resources };
|
|
82
|
+
await this.inventoryRepository.saveInventory(inventory);
|
|
83
|
+
}
|
|
84
|
+
async shutdown() {
|
|
85
|
+
await this.saveInventory();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export async function withRecordingProxy(options, dependency, cb) {
|
|
89
|
+
const proxy = new RecordingProxy(options, dependency);
|
|
90
|
+
await proxy.start();
|
|
91
|
+
await cb(proxy);
|
|
92
|
+
await proxy.stop();
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlY29yZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsS0FBSyxFQUFpQyxNQUFNLFlBQVksQ0FBQTtBQW9CakUsTUFBTSxPQUFPLGNBQWUsU0FBUSxLQUFLO0lBQ3ZDLFNBQVMsQ0FBTztJQUNoQixZQUFZLEdBQTJCLEVBQUUsQ0FBQTtJQUV6QyxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUUzQixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsRUFBRTtZQUM5QyxNQUFNLE1BQU0sR0FBRyxhQUFhLEVBQUUsQ0FBQTtZQUU5QixhQUFhO1lBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUE7WUFDL0MsSUFBSSxNQUFNO2dCQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUV6QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sV0FBVyxHQUF5QjtnQkFDeEMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNyQixHQUFHLFVBQVU7Z0JBQ2IsYUFBYSxFQUFFLEVBQUU7YUFDbEIsQ0FBQTtZQUVELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxZQUFZLE1BQU0sSUFBSSxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQTtZQUV0RyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDOUIsV0FBVyxD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
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { Transform, TransformCallback } from 'stream';
|
|
4
|
+
export declare class ThrottlingLog {
|
|
5
|
+
ms: number;
|
|
6
|
+
bytes: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class Throttle {
|
|
9
|
+
flushIntervalMs: number;
|
|
10
|
+
limitBytes: number;
|
|
11
|
+
currentBytes: number;
|
|
12
|
+
interval?: ReturnType<typeof setInterval>;
|
|
13
|
+
logs: ThrottlingLog[];
|
|
14
|
+
constructor(limitBytes: number, flushIntervalMs?: number);
|
|
15
|
+
static fromMbps(mbps: number, flushIntervalMs?: number): Throttle;
|
|
16
|
+
computeCapacity(): {
|
|
17
|
+
consumed: number;
|
|
18
|
+
carryover: number;
|
|
19
|
+
};
|
|
20
|
+
start(): void;
|
|
21
|
+
stop(): void;
|
|
22
|
+
checkAndStack(bytes: number): boolean;
|
|
23
|
+
simpleReport(unitMs?: number): {
|
|
24
|
+
maxBytesPerUnit: number;
|
|
25
|
+
avgBytesPerUnit: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare class ThrottlingTransform extends Transform {
|
|
29
|
+
throttle: Throttle;
|
|
30
|
+
retryIntervalMs: number;
|
|
31
|
+
constructor(throttle: Throttle, retryIntervalMs: number);
|
|
32
|
+
_transform(chunk: string | Buffer, _: string, done: TransformCallback): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Transform } from 'stream';
|
|
2
|
+
export class ThrottlingLog {
|
|
3
|
+
ms;
|
|
4
|
+
bytes;
|
|
5
|
+
}
|
|
6
|
+
export class Throttle {
|
|
7
|
+
flushIntervalMs;
|
|
8
|
+
limitBytes;
|
|
9
|
+
currentBytes = 0;
|
|
10
|
+
interval;
|
|
11
|
+
logs = [];
|
|
12
|
+
constructor(limitBytes, flushIntervalMs) {
|
|
13
|
+
this.limitBytes = limitBytes;
|
|
14
|
+
this.flushIntervalMs = flushIntervalMs ?? 100;
|
|
15
|
+
}
|
|
16
|
+
static fromMbps(mbps, flushIntervalMs) {
|
|
17
|
+
const bytesPerSec = (mbps * 1024 * 1024) / 8;
|
|
18
|
+
const limitBytes = Math.floor((bytesPerSec * flushIntervalMs) / 1000);
|
|
19
|
+
return new Throttle(limitBytes, flushIntervalMs);
|
|
20
|
+
}
|
|
21
|
+
computeCapacity() {
|
|
22
|
+
const consumed = Math.min(this.currentBytes, this.limitBytes);
|
|
23
|
+
const carryover = this.currentBytes - consumed;
|
|
24
|
+
return { consumed, carryover };
|
|
25
|
+
}
|
|
26
|
+
start() {
|
|
27
|
+
this.interval = setInterval(() => {
|
|
28
|
+
const c = this.computeCapacity();
|
|
29
|
+
this.logs.push({
|
|
30
|
+
ms: Date.now(),
|
|
31
|
+
bytes: c.consumed,
|
|
32
|
+
});
|
|
33
|
+
this.currentBytes = c.carryover;
|
|
34
|
+
}, this.flushIntervalMs);
|
|
35
|
+
}
|
|
36
|
+
stop() {
|
|
37
|
+
if (this.interval)
|
|
38
|
+
clearInterval(this.interval);
|
|
39
|
+
}
|
|
40
|
+
checkAndStack(bytes) {
|
|
41
|
+
if (!this.interval)
|
|
42
|
+
throw new Error('Throttle is not started');
|
|
43
|
+
if (this.currentBytes >= this.limitBytes) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
this.currentBytes += bytes;
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
simpleReport(unitMs = 1000) {
|
|
50
|
+
const bySec = new Map();
|
|
51
|
+
for (const log of this.logs) {
|
|
52
|
+
const unit = Math.floor(log.ms / unitMs);
|
|
53
|
+
if (!bySec.has(unit))
|
|
54
|
+
bySec.set(unit, 0);
|
|
55
|
+
bySec.set(unit, bySec.get(unit) + log.bytes);
|
|
56
|
+
}
|
|
57
|
+
const values = Array.from(bySec.values());
|
|
58
|
+
const maxBytesPerUnit = Math.max(...values);
|
|
59
|
+
const avgBytesPerUnit = Math.floor(values.reduce((a, b) => a + b, 0) / bySec.size) / 1024 / 1024;
|
|
60
|
+
return {
|
|
61
|
+
maxBytesPerUnit,
|
|
62
|
+
avgBytesPerUnit,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export class ThrottlingTransform extends Transform {
|
|
67
|
+
throttle;
|
|
68
|
+
retryIntervalMs;
|
|
69
|
+
constructor(throttle, retryIntervalMs) {
|
|
70
|
+
super();
|
|
71
|
+
this.throttle = throttle;
|
|
72
|
+
this.retryIntervalMs = retryIntervalMs;
|
|
73
|
+
}
|
|
74
|
+
_transform(chunk, _, done) {
|
|
75
|
+
if (this.throttle.checkAndStack(chunk.length)) {
|
|
76
|
+
this.push(chunk);
|
|
77
|
+
done();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const interval = setInterval(() => {
|
|
81
|
+
if (this.throttle.checkAndStack(chunk.length)) {
|
|
82
|
+
clearInterval(interval);
|
|
83
|
+
this.push(chunk);
|
|
84
|
+
done();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3R0bGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90aHJvdHRsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sUUFBUSxDQUFBO0FBRXJELE1BQU0sT0FBTyxhQUFhO0lBQ3hCLEVBQUUsQ0FBUTtJQUNWLEtBQUssQ0FBUTtDQUNkO0FBRUQsTUFBTSxPQUFPLFFBQVE7SUFDbkIsZUFBZSxDQUFTO0lBQ3hCLFVBQVUsQ0FBUztJQUNuQixZQUFZLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLFFBQVEsQ0FBaUM7SUFDekMsSUFBSSxHQUFvQixFQUFFLENBQUE7SUFFMUIsWUFBWSxVQUFrQixFQUFFLGVBQXdCO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxJQUFJLEdBQUcsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFZLEVBQUUsZUFBd0I7UUFDcEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO1FBQ3JFLE9BQU8sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFBO0lBQ2xELENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQTtRQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFBO0lB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
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Pino from 'pino';
|
|
2
|
+
export type DeviceType = 'desktop' | 'mobile';
|
|
3
|
+
export interface DependencyInterface {
|
|
4
|
+
logger?: Pino.Logger;
|
|
5
|
+
mkdirp(dirPath: string): Promise<void>;
|
|
6
|
+
executeLighthouse(args: string[]): Promise<void>;
|
|
7
|
+
executeLoadshow(args: string[]): Promise<void>;
|
|
8
|
+
}
|
package/build/types.js
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pagespeed-quest",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A framework for efficient web front-end speed improvement",
|
|
6
6
|
"main": "build/index.js",
|
|
@@ -45,7 +45,8 @@
|
|
|
45
45
|
"reset-hard": "git clean -dfx && git reset --hard && yarn",
|
|
46
46
|
"prepare-release": "run-s reset-hard test cov:check doc:html version doc:publish",
|
|
47
47
|
"adhoc": "yarn build && node build/adhoc.js",
|
|
48
|
-
"command": "yarn build && node build/command.js"
|
|
48
|
+
"command": "yarn build && node build/command.js",
|
|
49
|
+
"prepublishOnly": "yarn build"
|
|
49
50
|
},
|
|
50
51
|
"engines": {
|
|
51
52
|
"node": ">=18"
|