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.
@@ -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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
@@ -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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pagespeed-quest",
3
- "version": "0.3.2",
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"