pagespeed-quest 0.1.2 → 0.2.1
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/CHANGELOG.md +5 -0
- package/package.json +24 -21
- package/build/main/adhoc.d.ts +0 -2
- package/build/main/adhoc.js +0 -48
- package/build/main/command.d.ts +0 -2
- package/build/main/command.js +0 -103
- package/build/main/common-types.d.ts +0 -41
- package/build/main/common-types.js +0 -3
- package/build/main/content-encoding.d.ts +0 -11
- package/build/main/content-encoding.js +0 -51
- package/build/main/encoding.d.ts +0 -11
- package/build/main/encoding.js +0 -51
- package/build/main/formatting.d.ts +0 -8
- package/build/main/formatting.js +0 -64
- package/build/main/http.d.ts +0 -27
- package/build/main/http.js +0 -106
- package/build/main/index.d.ts +0 -9
- package/build/main/index.js +0 -26
- package/build/main/inventory.d.ts +0 -39
- package/build/main/inventory.js +0 -171
- package/build/main/logger.d.ts +0 -20
- package/build/main/logger.js +0 -22
- package/build/main/playback/inventory.d.ts +0 -0
- package/build/main/playback/inventory.js +0 -47
- package/build/main/playback.d.ts +0 -22
- package/build/main/playback.js +0 -111
- package/build/main/proxy.d.ts +0 -40
- package/build/main/proxy.js +0 -111
- package/build/main/recording/proxy.d.ts +0 -28
- package/build/main/recording/proxy.js +0 -90
- package/build/main/recording.d.ts +0 -28
- package/build/main/recording.js +0 -95
- package/build/main/throttling.d.ts +0 -34
- package/build/main/throttling.js +0 -88
- package/build/main/url.d.ts +0 -3
- package/build/main/url.js +0 -67
- package/build/module/adhoc.d.ts +0 -2
- package/build/module/adhoc.js +0 -40
- package/build/module/command.d.ts +0 -2
- package/build/module/command.js +0 -98
- package/build/module/common-types.d.ts +0 -41
- package/build/module/common-types.js +0 -2
- package/build/module/content-encoding.d.ts +0 -11
- package/build/module/content-encoding.js +0 -43
- package/build/module/encoding.d.ts +0 -11
- package/build/module/encoding.js +0 -43
- package/build/module/formatting.d.ts +0 -8
- package/build/module/formatting.js +0 -55
- package/build/module/http.d.ts +0 -27
- package/build/module/http.js +0 -96
- package/build/module/index.d.ts +0 -9
- package/build/module/index.js +0 -10
- package/build/module/inventory.d.ts +0 -39
- package/build/module/inventory.js +0 -165
- package/build/module/logger.d.ts +0 -20
- package/build/module/logger.js +0 -15
- package/build/module/playback/inventory.d.ts +0 -0
- package/build/module/playback/inventory.js +0 -47
- package/build/module/playback.d.ts +0 -22
- package/build/module/playback.js +0 -102
- package/build/module/proxy.d.ts +0 -40
- package/build/module/proxy.js +0 -111
- package/build/module/recording/proxy.d.ts +0 -28
- package/build/module/recording/proxy.js +0 -85
- package/build/module/recording.d.ts +0 -28
- package/build/module/recording.js +0 -92
- package/build/module/throttling.d.ts +0 -34
- package/build/module/throttling.js +0 -89
- package/build/module/url.d.ts +0 -3
- package/build/module/url.js +0 -59
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import Fs from 'fs';
|
|
2
|
-
import Fsp from 'fs/promises';
|
|
3
|
-
import Path from 'path';
|
|
4
|
-
import { compress, decompress } from './encoding';
|
|
5
|
-
import { convertEditableText, isText } from './formatting';
|
|
6
|
-
import { parseContentTypeHeader, requestContentFilePath, stringifyContentTypeHeader } from './http';
|
|
7
|
-
import { logger } from './logger';
|
|
8
|
-
const InventoryDir = 'inventory';
|
|
9
|
-
const IndexFile = 'index.json';
|
|
10
|
-
export class InventoryRepository {
|
|
11
|
-
dirPath;
|
|
12
|
-
constructor(dirPath) {
|
|
13
|
-
this.dirPath = dirPath || Path.join(process.cwd(), InventoryDir);
|
|
14
|
-
}
|
|
15
|
-
async saveInventory(inventory) {
|
|
16
|
-
const inventoryJson = JSON.stringify(inventory, null, 2);
|
|
17
|
-
await Fsp.mkdir(this.dirPath, { recursive: true });
|
|
18
|
-
await Fsp.writeFile(Path.join(this.dirPath, IndexFile), inventoryJson);
|
|
19
|
-
}
|
|
20
|
-
async loadInventory() {
|
|
21
|
-
const inventoryJson = await Fsp.readFile(Path.join(this.dirPath, IndexFile), 'utf8');
|
|
22
|
-
const inventory = JSON.parse(inventoryJson);
|
|
23
|
-
return inventory;
|
|
24
|
-
}
|
|
25
|
-
async saveTransactions(transactions) {
|
|
26
|
-
// To keep transactions order in Promise.all,
|
|
27
|
-
// store transactions and resources in a map.
|
|
28
|
-
const map = new Map();
|
|
29
|
-
await Fsp.mkdir(this.dirPath, { recursive: true });
|
|
30
|
-
const saveTransaction = async (transaction) => {
|
|
31
|
-
const resource = {
|
|
32
|
-
method: transaction.method,
|
|
33
|
-
url: transaction.url,
|
|
34
|
-
ttfbMs: transaction.ttfbMs,
|
|
35
|
-
statusCode: transaction.statusCode,
|
|
36
|
-
errorMessage: transaction.errorMessage,
|
|
37
|
-
rawHeaders: transaction.rawHeaders,
|
|
38
|
-
};
|
|
39
|
-
// Headers
|
|
40
|
-
if (transaction.rawHeaders) {
|
|
41
|
-
if (transaction.rawHeaders['content-type']) {
|
|
42
|
-
const { mime, charset } = parseContentTypeHeader(transaction.rawHeaders['content-type']);
|
|
43
|
-
if (mime)
|
|
44
|
-
resource.contentTypeMime = mime;
|
|
45
|
-
if (charset)
|
|
46
|
-
resource.contentTypeCharset = charset;
|
|
47
|
-
}
|
|
48
|
-
if (transaction.rawHeaders['content-encoding']) {
|
|
49
|
-
const contentEncoding = transaction.rawHeaders['content-encoding'];
|
|
50
|
-
if (contentEncoding)
|
|
51
|
-
resource.contentEncoding = contentEncoding;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Mbps
|
|
55
|
-
if (transaction.durationMs && transaction.content) {
|
|
56
|
-
const contentBits = transaction.content.length * 8;
|
|
57
|
-
const seconds = transaction.durationMs / 1000;
|
|
58
|
-
const mega = 1024 * 1024;
|
|
59
|
-
resource.mbps = contentBits / seconds / mega;
|
|
60
|
-
}
|
|
61
|
-
// Content
|
|
62
|
-
if (transaction.content) {
|
|
63
|
-
const steps = {};
|
|
64
|
-
const contentFilePath = requestContentFilePath(resource.method, resource.url);
|
|
65
|
-
const fullPath = Path.join(this.dirPath, contentFilePath);
|
|
66
|
-
// Content-Encoding
|
|
67
|
-
steps.decoded = resource.contentEncoding
|
|
68
|
-
? await decompress(resource.contentEncoding, transaction.content)
|
|
69
|
-
: transaction.content;
|
|
70
|
-
// Try to make editable (utf8, beautify)
|
|
71
|
-
steps.editable = steps.decoded;
|
|
72
|
-
if (isText(resource.contentTypeMime)) {
|
|
73
|
-
try {
|
|
74
|
-
steps.editable = await convertEditableText(steps.decoded, resource.contentTypeMime, resource.contentTypeCharset);
|
|
75
|
-
resource.contentTypeCharset = 'utf-8';
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
logger().error({ err, resource }, `Formatting failed ${transaction.url}: ${err.message}`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
await Fsp.mkdir(Path.dirname(fullPath), { recursive: true });
|
|
82
|
-
await Fsp.writeFile(fullPath, steps.editable);
|
|
83
|
-
resource.contentFilePath = contentFilePath;
|
|
84
|
-
}
|
|
85
|
-
map.set(transaction, resource);
|
|
86
|
-
};
|
|
87
|
-
const tryToSaveTransaction = async (transaction) => {
|
|
88
|
-
try {
|
|
89
|
-
await saveTransaction(transaction);
|
|
90
|
-
}
|
|
91
|
-
catch (err) {
|
|
92
|
-
logger().error({ err, method: transaction.method, url: transaction.url }, `Failed to save transaction ${transaction.url}: ${err.message}`);
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
await Promise.all(transactions.map(tryToSaveTransaction));
|
|
96
|
-
// Restore transactions order after Promise.all
|
|
97
|
-
const resources = transactions.reduce((resources, transaction) => {
|
|
98
|
-
const resource = map.get(transaction);
|
|
99
|
-
if (resource)
|
|
100
|
-
resources.push(resource);
|
|
101
|
-
return resources;
|
|
102
|
-
}, []);
|
|
103
|
-
return resources;
|
|
104
|
-
}
|
|
105
|
-
async loadTransactions(resources) {
|
|
106
|
-
const map = new Map();
|
|
107
|
-
const loadTransaction = async (resource) => {
|
|
108
|
-
const transaction = {
|
|
109
|
-
method: resource.method,
|
|
110
|
-
url: resource.url,
|
|
111
|
-
ttfbMs: resource.ttfbMs,
|
|
112
|
-
statusCode: resource.statusCode,
|
|
113
|
-
errorMessage: resource.errorMessage,
|
|
114
|
-
rawHeaders: { ...(resource.rawHeaders || {}) },
|
|
115
|
-
};
|
|
116
|
-
// content
|
|
117
|
-
if (resource.contentFilePath) {
|
|
118
|
-
const fullPath = Path.join(this.dirPath, resource.contentFilePath);
|
|
119
|
-
if (Fs.existsSync(fullPath)) {
|
|
120
|
-
const content = await Fsp.readFile(fullPath);
|
|
121
|
-
// encoding
|
|
122
|
-
if (resource.contentEncoding) {
|
|
123
|
-
transaction.content = await compress(resource.contentEncoding, content);
|
|
124
|
-
transaction.rawHeaders['content-encoding'] = resource.contentEncoding;
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
transaction.content = content;
|
|
128
|
-
delete transaction.rawHeaders['content-encoding'];
|
|
129
|
-
}
|
|
130
|
-
// length
|
|
131
|
-
transaction.rawHeaders['content-length'] = `${transaction.content.length}`;
|
|
132
|
-
// duration
|
|
133
|
-
const bytesPerMs = resource.mbps ? (resource.mbps * 1024 * 1024) / 8 / 1000 : 0;
|
|
134
|
-
transaction.durationMs = bytesPerMs ? content.length / bytesPerMs : 0;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
transaction.rawHeaders['content-length'] = '0';
|
|
139
|
-
transaction.durationMs = 0;
|
|
140
|
-
}
|
|
141
|
-
// Content-Type
|
|
142
|
-
if (resource.contentTypeMime) {
|
|
143
|
-
transaction.rawHeaders['content-type'] = stringifyContentTypeHeader(resource.contentTypeMime, resource.contentTypeCharset);
|
|
144
|
-
}
|
|
145
|
-
map.set(resource, transaction);
|
|
146
|
-
};
|
|
147
|
-
const tryToLoadTransaction = async (resource) => {
|
|
148
|
-
try {
|
|
149
|
-
await loadTransaction(resource);
|
|
150
|
-
}
|
|
151
|
-
catch (err) {
|
|
152
|
-
logger().error({ err, resource }, `Loading transaction failed ${resource.url}: ${err.message}`);
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
await Promise.all(resources.map(tryToLoadTransaction));
|
|
156
|
-
const transactions = resources.reduce((transactions, resource) => {
|
|
157
|
-
const transaction = map.get(resource);
|
|
158
|
-
if (transaction)
|
|
159
|
-
transactions.push(transaction);
|
|
160
|
-
return transactions;
|
|
161
|
-
}, []);
|
|
162
|
-
return transactions;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52ZW50b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludmVudG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDbkIsT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBQzdCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUV2QixPQUFPLEVBQUUsUUFBUSxFQUF1QixVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMxRCxPQUFPLEVBQWUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDaEgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUVqQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUE7QUFDaEMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFBO0FBaUM5QixNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLE9BQU8sQ0FBUztJQUVoQixZQUFZLE9BQWdCO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQW9CO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUN4RCxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFP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
|
package/build/module/logger.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export declare const singleton: import("pino").Logger<{
|
|
2
|
-
transport: {
|
|
3
|
-
target: string;
|
|
4
|
-
options: {
|
|
5
|
-
levelFirst: boolean;
|
|
6
|
-
hideObject: boolean;
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
level: string;
|
|
10
|
-
}>;
|
|
11
|
-
export declare function logger(): import("pino").Logger<{
|
|
12
|
-
transport: {
|
|
13
|
-
target: string;
|
|
14
|
-
options: {
|
|
15
|
-
levelFirst: boolean;
|
|
16
|
-
hideObject: boolean;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
level: string;
|
|
20
|
-
}>;
|
package/build/module/logger.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import Pino from 'pino';
|
|
2
|
-
export const singleton = Pino({
|
|
3
|
-
transport: {
|
|
4
|
-
target: 'pino-pretty',
|
|
5
|
-
options: {
|
|
6
|
-
levelFirst: true,
|
|
7
|
-
hideObject: Boolean(!process.env.LOG_OBJECTS),
|
|
8
|
-
},
|
|
9
|
-
},
|
|
10
|
-
level: process.env.LOG_LEVEL || 'info',
|
|
11
|
-
});
|
|
12
|
-
export function logger() {
|
|
13
|
-
return singleton;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFFdkIsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQztJQUM1QixTQUFTLEVBQUU7UUFDVCxNQUFNLEVBQUUsYUFBYTtRQUNyQixPQUFPLEVBQUU7WUFDUCxVQUFVLEVBQUUsSUFBSTtZQUNoQixVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7U0FDOUM7S0FDRjtJQUNELEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxNQUFNO0NBQ3ZDLENBQUMsQ0FBQTtBQUVGLE1BQU0sVUFBVSxNQUFNO0lBQ3BCLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUMifQ==
|
|
File without changes
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
// import Fsp from 'fs/promises'
|
|
2
|
-
// import Path from 'path'
|
|
3
|
-
// import { Inventory, PlaybackResource } from '../common'
|
|
4
|
-
// import { compress } from '../encoding'
|
|
5
|
-
// type ResourceIndex = Map<string, Map<string, PlaybackResource>>
|
|
6
|
-
// const ContentChunkSize = 16 * 1024
|
|
7
|
-
// export class PlaybackInventory {
|
|
8
|
-
// playbackResources: PlaybackResource[] = []
|
|
9
|
-
// playbackResourcesIndex: ResourceIndex = new Map()
|
|
10
|
-
// async load(dirPath: string) {
|
|
11
|
-
// const inventoryPath = Path.join(dirPath, 'inventory.json')
|
|
12
|
-
// const inventoryJson = await Fsp.readFile(inventoryPath, 'utf8')
|
|
13
|
-
// const inventory: Inventory = JSON.parse(inventoryJson)
|
|
14
|
-
// for (const resource of inventory.resources) {
|
|
15
|
-
// try {
|
|
16
|
-
// const playbackResource: PlaybackResource = {
|
|
17
|
-
// method: resource.method,
|
|
18
|
-
// url: resource.url,
|
|
19
|
-
// ttfbMs: resource.ttfbMs,
|
|
20
|
-
// statusCode: resource.statusCode,
|
|
21
|
-
// contentTypeMime: resource.contentTypeMime,
|
|
22
|
-
// contentEncoding: resource.contentEncoding,
|
|
23
|
-
// headers: resource.headers,
|
|
24
|
-
// contentChunks: [],
|
|
25
|
-
// contentLength: 0,
|
|
26
|
-
// durationMs: 0,
|
|
27
|
-
// }
|
|
28
|
-
// const content = await Fsp.readFile(Path.join(dirPath, resource.contentFilePath))
|
|
29
|
-
// const encoded = await compress(resource.contentEncoding, content)
|
|
30
|
-
// for (let i = 0; i < encoded.length; i += ContentChunkSize) {
|
|
31
|
-
// playbackResource.contentChunks.push(encoded.subarray(i, i + ContentChunkSize))
|
|
32
|
-
// }
|
|
33
|
-
// playbackResource.contentLength = encoded.length
|
|
34
|
-
// this.playbackResources.push(playbackResource)
|
|
35
|
-
// const urlIndex = (this.playbackResourcesIndex[resource.method] ??= new Map())
|
|
36
|
-
// urlIndex[resource.url] = playbackResource
|
|
37
|
-
// } catch (err) {
|
|
38
|
-
// // TODO error handling
|
|
39
|
-
// console.error(err)
|
|
40
|
-
// }
|
|
41
|
-
// }
|
|
42
|
-
// }
|
|
43
|
-
// find(method: string, url: string) {
|
|
44
|
-
// return this.playbackResourcesIndex.get(method)?.get(url)
|
|
45
|
-
// }
|
|
46
|
-
// }
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52ZW50b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BsYXliYWNrL2ludmVudG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQ0FBZ0M7QUFDaEMsMEJBQTBCO0FBRTFCLDBEQUEwRDtBQUMxRCx5Q0FBeUM7QUFFekMsa0VBQWtFO0FBQ2xFLHFDQUFxQztBQUVyQyxtQ0FBbUM7QUFDbkMsK0NBQStDO0FBRS9DLHNEQUFzRDtBQUV0RCxrQ0FBa0M7QUFDbEMsaUVBQWlFO0FBQ2pFLHNFQUFzRTtBQUN0RSw2REFBNkQ7QUFFN0Qsb0RBQW9EO0FBQ3BELGNBQWM7QUFDZCx1REFBdUQ7QUFDdkQscUNBQXFDO0FBQ3JDLCtCQUErQjtBQUMvQixxQ0FBcUM7QUFDckMsNkNBQTZDO0FBQzdDLHVEQUF1RDtBQUN2RCx1REFBdUQ7QUFDdkQsdUNBQXVDO0FBQ3ZDLCtCQUErQjtBQUMvQiw4QkFBOEI7QUFDOUIsMkJBQTJCO0FBQzNCLFlBQVk7QUFFWiwyRkFBMkY7QUFDM0YsNEVBQTRFO0FBQzVFLHVFQUF1RTtBQUN2RSwyRkFBMkY7QUFDM0YsWUFBWTtBQUNaLDBEQUEwRDtBQUUxRCx3REFBd0Q7QUFDeEQsd0ZBQXdGO0FBQ3hGLG9EQUFvRDtBQUNwRCx3QkFBd0I7QUFDeEIsaUNBQWlDO0FBQ2pDLDZCQUE2QjtBQUM3QixVQUFVO0FBQ1YsUUFBUTtBQUNSLE1BQU07QUFFTix3Q0FBd0M7QUFDeEMsK0RBQStEO0FBQy9ELE1BQU07QUFDTixJQUFJIn0=
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { HttpHeaders } from './http';
|
|
3
|
-
import { Inventory } from './inventory';
|
|
4
|
-
import { Proxy, WithProxyOptions } from './proxy';
|
|
5
|
-
export interface PlaybackTransaction {
|
|
6
|
-
method: string;
|
|
7
|
-
url: string;
|
|
8
|
-
ttfbMs: number;
|
|
9
|
-
statusCode?: number;
|
|
10
|
-
err?: Error;
|
|
11
|
-
rawHeaders?: HttpHeaders;
|
|
12
|
-
contentChunks: Buffer[];
|
|
13
|
-
contentLength: number;
|
|
14
|
-
durationMs: number;
|
|
15
|
-
}
|
|
16
|
-
export declare class PlaybackProxy extends Proxy {
|
|
17
|
-
transactionsMap: Map<string, Map<string, PlaybackTransaction>>;
|
|
18
|
-
loadTransactions(inventory: Inventory): Promise<void>;
|
|
19
|
-
setup(): Promise<void>;
|
|
20
|
-
shutdown(): Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
export declare function withPlaybackProxy(fn: (proxy: PlaybackProxy) => Promise<void>, options?: WithProxyOptions): Promise<void | PlaybackProxy>;
|
package/build/module/playback.js
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { logger } from './logger';
|
|
2
|
-
import { Proxy, withProxy } from './proxy';
|
|
3
|
-
const ChunkSize = 1024 * 16;
|
|
4
|
-
export class PlaybackProxy extends Proxy {
|
|
5
|
-
transactionsMap = new Map();
|
|
6
|
-
async loadTransactions(inventory) {
|
|
7
|
-
const transactions = await this.inventoryRepository.loadTransactions(inventory.resources);
|
|
8
|
-
for (const transaction of transactions) {
|
|
9
|
-
const playbackTransaction = {
|
|
10
|
-
method: transaction.method,
|
|
11
|
-
url: transaction.url,
|
|
12
|
-
ttfbMs: transaction.ttfbMs,
|
|
13
|
-
statusCode: transaction.statusCode,
|
|
14
|
-
err: transaction.errorMessage ? new Error(transaction.errorMessage) : undefined,
|
|
15
|
-
rawHeaders: transaction.rawHeaders || {},
|
|
16
|
-
contentChunks: [],
|
|
17
|
-
contentLength: 0,
|
|
18
|
-
durationMs: transaction.durationMs || 0,
|
|
19
|
-
};
|
|
20
|
-
if (transaction.content) {
|
|
21
|
-
const maxChunks = 10;
|
|
22
|
-
const minInterval = 10;
|
|
23
|
-
const chunks = Math.min(maxChunks, Math.floor(playbackTransaction.durationMs / minInterval));
|
|
24
|
-
playbackTransaction.contentChunks = [];
|
|
25
|
-
const chunkSize = Math.max(ChunkSize, Math.ceil(transaction.content.length / chunks));
|
|
26
|
-
for (let i = 0; i <= transaction.content.length; i += chunkSize) {
|
|
27
|
-
playbackTransaction.contentChunks.push(transaction.content.subarray(i, i + chunkSize));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
if (!this.transactionsMap.has(transaction.method)) {
|
|
31
|
-
this.transactionsMap.set(transaction.method, new Map());
|
|
32
|
-
}
|
|
33
|
-
this.transactionsMap.get(transaction.method).set(transaction.url, playbackTransaction);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
async setup() {
|
|
37
|
-
const inventory = await this.inventoryRepository.loadInventory();
|
|
38
|
-
await this.loadTransactions(inventory);
|
|
39
|
-
if (inventory.entryUrl)
|
|
40
|
-
this.entryUrl = inventory.entryUrl;
|
|
41
|
-
let requestNumber = 1;
|
|
42
|
-
this.proxy.onRequest((ctx, onRequestComplete) => {
|
|
43
|
-
const number = requestNumber++;
|
|
44
|
-
const identifier = Proxy.contextRequest(ctx);
|
|
45
|
-
const transaction = this.transactionsMap.get(identifier.method)?.get(identifier.url);
|
|
46
|
-
if (!transaction) {
|
|
47
|
-
logger().warn({ number, identifier }, `Request #${number} ${identifier.url} (${identifier.method}) not found in inventory`);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const contentStream = this.createThrottlingTransform() || ctx.proxyToClientResponse;
|
|
51
|
-
if (contentStream !== ctx.proxyToClientResponse) {
|
|
52
|
-
contentStream.pipe(ctx.proxyToClientResponse);
|
|
53
|
-
}
|
|
54
|
-
logger().debug({ number, identifier }, `Request #${number} ${transaction.url} started`);
|
|
55
|
-
ctx.onError((_, err) => {
|
|
56
|
-
logger().warn({ number, identifier, err }, `Request #${number} ${transaction.url} failed: ${err.message}`);
|
|
57
|
-
});
|
|
58
|
-
setTimeout(() => {
|
|
59
|
-
// Error
|
|
60
|
-
if (transaction.err) {
|
|
61
|
-
return onRequestComplete(transaction.err);
|
|
62
|
-
}
|
|
63
|
-
// Status code
|
|
64
|
-
ctx.proxyToClientResponse.statusCode = transaction.statusCode || 500;
|
|
65
|
-
// Headers
|
|
66
|
-
if (transaction.rawHeaders) {
|
|
67
|
-
for (const [key, value] of Object.entries(transaction.rawHeaders)) {
|
|
68
|
-
if (ctx.proxyToClientResponse.headersSent)
|
|
69
|
-
break;
|
|
70
|
-
ctx.proxyToClientResponse.setHeader(key, value);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// Empty content body
|
|
74
|
-
if (!transaction.contentChunks || transaction.contentChunks.length === 0) {
|
|
75
|
-
contentStream.end();
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
// Content body
|
|
79
|
-
const chunks = [...transaction.contentChunks];
|
|
80
|
-
const intervalMs = transaction.durationMs / transaction.contentChunks.length;
|
|
81
|
-
const interval = setInterval(() => {
|
|
82
|
-
const chunk = chunks.shift();
|
|
83
|
-
if (chunk) {
|
|
84
|
-
contentStream.write(chunk);
|
|
85
|
-
}
|
|
86
|
-
if (chunks.length === 0) {
|
|
87
|
-
clearInterval(interval);
|
|
88
|
-
contentStream.end();
|
|
89
|
-
logger().debug({ number, identifier }, `Request #${number} ${transaction.url} completed`);
|
|
90
|
-
}
|
|
91
|
-
}, intervalMs);
|
|
92
|
-
}, transaction.ttfbMs);
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
async shutdown() {
|
|
96
|
-
// nothing to do
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
export async function withPlaybackProxy(fn, options) {
|
|
100
|
-
return await withProxy(PlaybackProxy, fn, options || {});
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWJhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGxheWJhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxTQUFTLENBQUE7QUFFNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQWMzQixNQUFNLE9BQU8sYUFBYyxTQUFRLEtBQUs7SUFDdEMsZUFBZSxHQUFrRCxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRTFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFvQjtRQUN6QyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFekYsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUU7WUFDdEMsTUFBTSxtQkFBbUIsR0FBd0I7Z0JBQy9DLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTTtnQkFDMUIsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUNwQixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07Z0JBQzFCLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtnQkFDbEMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDL0UsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVLElBQUksRUFBRTtnQkFDeEMsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixVQUFVLEVBQUUsV0FBVyxDQUFDLFVBQVUsSUFBSSxDQUFDO2FBQ3hDLENBQUE7WUFFRCxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZCLE1BQU0s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
|
package/build/module/proxy.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import HttpMitmProxy from 'http-mitm-proxy';
|
|
2
|
-
import { InventoryRepository } from './inventory';
|
|
3
|
-
import { Throttle, ThrottlingTransform } from './throttling';
|
|
4
|
-
export interface ProxyOptions extends HttpMitmProxy.IProxyOptions {
|
|
5
|
-
inventoryRepository?: InventoryRepository;
|
|
6
|
-
throttle?: Throttle;
|
|
7
|
-
throttlingRetryIntervalMs?: number;
|
|
8
|
-
entryUrl?: string;
|
|
9
|
-
}
|
|
10
|
-
export declare abstract class Proxy {
|
|
11
|
-
proxyOptions: HttpMitmProxy.IProxyOptions;
|
|
12
|
-
proxy: HttpMitmProxy.IProxy;
|
|
13
|
-
inventoryRepository: InventoryRepository;
|
|
14
|
-
throttle?: Throttle;
|
|
15
|
-
throttlingRetryIntervalMs: number;
|
|
16
|
-
entryUrl?: string;
|
|
17
|
-
constructor(options?: ProxyOptions);
|
|
18
|
-
static contextRequest(ctx: HttpMitmProxy.IContext): {
|
|
19
|
-
method: string;
|
|
20
|
-
url: string;
|
|
21
|
-
};
|
|
22
|
-
createThrottlingTransform(): ThrottlingTransform | void;
|
|
23
|
-
abstract setup(): Promise<void>;
|
|
24
|
-
abstract shutdown(): Promise<void>;
|
|
25
|
-
start(): Promise<void>;
|
|
26
|
-
get port(): number;
|
|
27
|
-
get inventoryDirPath(): string;
|
|
28
|
-
stop(): Promise<void>;
|
|
29
|
-
}
|
|
30
|
-
export interface WithProxyOptions extends HttpMitmProxy.IProxyOptions {
|
|
31
|
-
port?: number;
|
|
32
|
-
dirPath?: string;
|
|
33
|
-
entryUrl?: string;
|
|
34
|
-
throttling?: {
|
|
35
|
-
mbps: number;
|
|
36
|
-
flushIntervalMs?: number;
|
|
37
|
-
retryIntervalMs?: number;
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
export declare function withProxy<ProxyType extends Proxy, OptionsType extends WithProxyOptions = WithProxyOptions>(cls: new (options: ProxyOptions) => ProxyType, fn: (proxy: ProxyType) => Promise<void>, options: OptionsType): Promise<ProxyType | void>;
|
package/build/module/proxy.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import Crypto from 'crypto';
|
|
2
|
-
import Fsp from 'fs/promises';
|
|
3
|
-
import Http from 'http';
|
|
4
|
-
import Https from 'https';
|
|
5
|
-
import Os from 'os';
|
|
6
|
-
import Path from 'path';
|
|
7
|
-
import GetPort from 'get-port';
|
|
8
|
-
import HttpMitmProxy from 'http-mitm-proxy';
|
|
9
|
-
import { InventoryRepository } from './inventory';
|
|
10
|
-
import { logger } from './logger';
|
|
11
|
-
import { Throttle, ThrottlingTransform } from './throttling';
|
|
12
|
-
export class Proxy {
|
|
13
|
-
proxyOptions;
|
|
14
|
-
proxy;
|
|
15
|
-
inventoryRepository;
|
|
16
|
-
throttle;
|
|
17
|
-
throttlingRetryIntervalMs;
|
|
18
|
-
entryUrl;
|
|
19
|
-
constructor(options) {
|
|
20
|
-
options ||= {};
|
|
21
|
-
// Proxy
|
|
22
|
-
this.proxyOptions = options;
|
|
23
|
-
this.proxy = HttpMitmProxy();
|
|
24
|
-
// Inventory repository
|
|
25
|
-
this.inventoryRepository = options.inventoryRepository ?? new InventoryRepository();
|
|
26
|
-
// Throttle
|
|
27
|
-
if (options.throttle)
|
|
28
|
-
this.throttle = options.throttle;
|
|
29
|
-
this.throttlingRetryIntervalMs = options.throttlingRetryIntervalMs || 10;
|
|
30
|
-
// Entry URL
|
|
31
|
-
this.entryUrl = options.entryUrl;
|
|
32
|
-
}
|
|
33
|
-
static contextRequest(ctx) {
|
|
34
|
-
if (!ctx.clientToProxyRequest.headers.host)
|
|
35
|
-
throw new Error('ctx.clientToProxyRequest.headers.host is empty');
|
|
36
|
-
const url = [
|
|
37
|
-
ctx.isSSL ? 'https://' : 'http://',
|
|
38
|
-
ctx.clientToProxyRequest.headers.host,
|
|
39
|
-
ctx.clientToProxyRequest.url,
|
|
40
|
-
].join('');
|
|
41
|
-
const method = (ctx.clientToProxyRequest.method || 'get').toLowerCase();
|
|
42
|
-
return {
|
|
43
|
-
method,
|
|
44
|
-
url,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
createThrottlingTransform() {
|
|
48
|
-
if (this.throttle) {
|
|
49
|
-
return new ThrottlingTransform(this.throttle, this.throttlingRetryIntervalMs);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
async start() {
|
|
53
|
-
if (this.throttle)
|
|
54
|
-
this.throttle.start();
|
|
55
|
-
const sslCaDir = this.proxyOptions.sslCaDir || process.env.SSL_CA_DIR || Path.join(Os.homedir(), '.pagespeed-quest/ca');
|
|
56
|
-
const port = Number(this.proxyOptions.port || process.env.PORT || (await GetPort()));
|
|
57
|
-
const options = {
|
|
58
|
-
port,
|
|
59
|
-
sslCaDir,
|
|
60
|
-
httpAgent: new Http.Agent({
|
|
61
|
-
keepAlive: true,
|
|
62
|
-
}),
|
|
63
|
-
httpsAgent: new Https.Agent({
|
|
64
|
-
keepAlive: true,
|
|
65
|
-
secureOptions: Crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT,
|
|
66
|
-
}),
|
|
67
|
-
};
|
|
68
|
-
await this.setup();
|
|
69
|
-
await Fsp.mkdir(options.sslCaDir, { recursive: true });
|
|
70
|
-
await new Promise((resolve, reject) => this.proxy.listen(options, (error) => (error ? reject(error) : resolve())));
|
|
71
|
-
}
|
|
72
|
-
get port() {
|
|
73
|
-
return this.proxy.httpPort;
|
|
74
|
-
}
|
|
75
|
-
get inventoryDirPath() {
|
|
76
|
-
return this.inventoryRepository.dirPath;
|
|
77
|
-
}
|
|
78
|
-
async stop() {
|
|
79
|
-
this.proxy.close();
|
|
80
|
-
await this.shutdown();
|
|
81
|
-
if (this.throttle)
|
|
82
|
-
this.throttle.stop();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
export async function withProxy(cls, fn, options) {
|
|
86
|
-
const proxyOptions = {
|
|
87
|
-
...options,
|
|
88
|
-
inventoryRepository: new InventoryRepository(options?.dirPath),
|
|
89
|
-
};
|
|
90
|
-
if (options.throttling) {
|
|
91
|
-
proxyOptions.throttle = Throttle.fromMbps(options.throttling.mbps, options.throttling.flushIntervalMs);
|
|
92
|
-
proxyOptions.throttlingRetryIntervalMs = options.throttling.retryIntervalMs;
|
|
93
|
-
}
|
|
94
|
-
const proxy = new cls(proxyOptions);
|
|
95
|
-
// start
|
|
96
|
-
try {
|
|
97
|
-
await proxy.start();
|
|
98
|
-
logger().info(`Proxy started to listening on port ${proxy.port}`);
|
|
99
|
-
}
|
|
100
|
-
catch (err) {
|
|
101
|
-
logger().fatal({ err }, `Failed to start the proxy: ${err.message}`);
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
// callback
|
|
105
|
-
await fn(proxy);
|
|
106
|
-
// stop
|
|
107
|
-
await proxy.stop();
|
|
108
|
-
logger().info(`Proxy stopped`);
|
|
109
|
-
return proxy;
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQTtBQUM3QixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFDdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQTtBQUNuQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFFdkIsT0FBTyxPQUFPLE1BQU0sVUFBVSxDQUFBO0FBQzlCLE9BQU8sYUFBYSxNQUFNLGlCQUFpQixDQUFBO0FBRTNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFTNUQsTUFBTSxPQUFnQixLQUFLO0lBQ3pCLFlBQVksQ0FBOEI7SUFDMUMsS0FBSyxDQUF1QjtJQUM1QixtQkFBbUIsQ0FBc0I7SUFDekMsUUFBUSxDQUFXO0lBQ25CLHlCQUF5QixDQUFTO0lBQ2xDLFFBQVEsQ0FBUztJQUVqQixZQUFZLE9BQXNCO1FBQ2hDLE9BQU8sS0FBSyxFQUFFLENBQUE7UUFFZCxRQUFRO1FBQ1IsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUE7UUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLEVBQUUsQ0FBQTtRQUU1Qix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUE7UUFFbkYsV0FBVztRQUNYLElBQUksT0FBTyxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxR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
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import { IncomingHttpHeaders } from 'http';
|
|
4
|
-
import HttpMitmProxy from 'http-mitm-proxy';
|
|
5
|
-
import { Inventory } from '../inventory';
|
|
6
|
-
import { ProxyOptions } from '../proxy';
|
|
7
|
-
export interface RecordingTransaction {
|
|
8
|
-
startedAt?: Date;
|
|
9
|
-
responseStartedAt?: Date;
|
|
10
|
-
responseEndedAt?: Date;
|
|
11
|
-
method: string;
|
|
12
|
-
url: string;
|
|
13
|
-
statusCode?: number;
|
|
14
|
-
incomingHttpHeaders?: IncomingHttpHeaders;
|
|
15
|
-
contentChunks: Buffer[];
|
|
16
|
-
err?: Error;
|
|
17
|
-
errKind?: string;
|
|
18
|
-
}
|
|
19
|
-
export interface RecordingSession {
|
|
20
|
-
startedAt?: Date;
|
|
21
|
-
transactions: RecordingTransaction[];
|
|
22
|
-
}
|
|
23
|
-
export declare function startRecordingProxy(opts?: Partial<ProxyOptions>): Promise<{
|
|
24
|
-
proxy: HttpMitmProxy.IProxy;
|
|
25
|
-
session: RecordingSession;
|
|
26
|
-
}>;
|
|
27
|
-
export declare function saveSessionAsInventory(session: RecordingSession, dirPath?: string): Promise<Inventory>;
|
|
28
|
-
export declare function withRecordingProxy(fn: (port: number) => Promise<void>, opts?: Partial<ProxyOptions>): Promise<Inventory>;
|