pagespeed-quest 0.1.2 → 0.3.0
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/README.ja.md +22 -2
- package/README.md +21 -1
- package/package.json +25 -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,85 +0,0 @@
|
|
|
1
|
-
import HttpMitmProxy from 'http-mitm-proxy';
|
|
2
|
-
import { Inventory } from '../inventory';
|
|
3
|
-
import { getProxyOptions, parseContextRequest } from '../proxy';
|
|
4
|
-
export async function startRecordingProxy(opts) {
|
|
5
|
-
const proxy = HttpMitmProxy();
|
|
6
|
-
const options = await getProxyOptions(opts);
|
|
7
|
-
const session = {
|
|
8
|
-
transactions: [],
|
|
9
|
-
};
|
|
10
|
-
proxy.onRequest((ctx, onRequestComplete) => {
|
|
11
|
-
session.startedAt = new Date();
|
|
12
|
-
const transaction = {
|
|
13
|
-
startedAt: new Date(),
|
|
14
|
-
...parseContextRequest(ctx),
|
|
15
|
-
contentChunks: [],
|
|
16
|
-
};
|
|
17
|
-
ctx.onError((_, err, errKind) => {
|
|
18
|
-
transaction.responseEndedAt = new Date();
|
|
19
|
-
transaction.err = err;
|
|
20
|
-
transaction.errKind = errKind;
|
|
21
|
-
});
|
|
22
|
-
ctx.onResponse((_, onResponseComplete) => {
|
|
23
|
-
transaction.responseStartedAt = new Date();
|
|
24
|
-
transaction.statusCode = ctx.serverToProxyResponse.statusCode;
|
|
25
|
-
transaction.incomingHttpHeaders = ctx.serverToProxyResponse.headers;
|
|
26
|
-
onResponseComplete();
|
|
27
|
-
});
|
|
28
|
-
ctx.onResponseData((_, chunk, onResponseDataComplete) => {
|
|
29
|
-
transaction.contentChunks.push(chunk);
|
|
30
|
-
onResponseDataComplete();
|
|
31
|
-
});
|
|
32
|
-
ctx.onResponseEnd((_, onResponseEndComplete) => {
|
|
33
|
-
session.transactions.push(transaction);
|
|
34
|
-
onResponseEndComplete();
|
|
35
|
-
});
|
|
36
|
-
onRequestComplete();
|
|
37
|
-
});
|
|
38
|
-
await new Promise((resolve, reject) => proxy.listen(options, (error) => (error ? reject(error) : resolve())));
|
|
39
|
-
return { proxy, session };
|
|
40
|
-
}
|
|
41
|
-
export async function saveSessionAsInventory(session, dirPath) {
|
|
42
|
-
const inventory = new Inventory(dirPath);
|
|
43
|
-
for (const rt of session.transactions) {
|
|
44
|
-
const transaction = {
|
|
45
|
-
method: rt.method,
|
|
46
|
-
url: rt.url,
|
|
47
|
-
ttfbMs: 0,
|
|
48
|
-
};
|
|
49
|
-
// ttfb and duration
|
|
50
|
-
if (rt.responseStartedAt) {
|
|
51
|
-
transaction.ttfbMs = +rt.responseStartedAt - +rt.startedAt;
|
|
52
|
-
if (rt.responseEndedAt) {
|
|
53
|
-
transaction.durationMs = +rt.responseEndedAt - +rt.responseStartedAt;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
if (rt.err) {
|
|
57
|
-
transaction.errMessage = rt.err.message;
|
|
58
|
-
}
|
|
59
|
-
if (rt.statusCode) {
|
|
60
|
-
transaction.statusCode = rt.statusCode;
|
|
61
|
-
}
|
|
62
|
-
if (rt.incomingHttpHeaders) {
|
|
63
|
-
transaction.rawHeaders = {};
|
|
64
|
-
for (const [key, value] of Object.entries(rt.incomingHttpHeaders)) {
|
|
65
|
-
transaction.rawHeaders[key.toLowerCase()] = value.toString();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
await inventory.saveTransactionResource(transaction);
|
|
69
|
-
}
|
|
70
|
-
await inventory.save();
|
|
71
|
-
return inventory;
|
|
72
|
-
}
|
|
73
|
-
export async function withRecordingProxy(fn, opts) {
|
|
74
|
-
const { proxy, session } = await startRecordingProxy(opts);
|
|
75
|
-
const port = proxy.httpPort;
|
|
76
|
-
try {
|
|
77
|
-
await fn(port);
|
|
78
|
-
const inventory = await saveSessionAsInventory(session);
|
|
79
|
-
return inventory;
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
proxy.close();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3JkaW5nL3Byb3h5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sYUFBYSxNQUFNLGlCQUFpQixDQUFBO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQWUsTUFBTSxjQUFjLENBQUE7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBZ0IsTUFBTSxVQUFVLENBQUE7QUFvQjdFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLElBQTRCO0lBRTVCLE1BQU0sS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFBO0lBQzdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRTNDLE1BQU0sT0FBTyxHQUFxQjtRQUNoQyxZQUFZLEVBQUUsRUFBRTtLQUNqQixDQUFBO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUU5QixNQUFNLFdBQVcsR0FBeUI7WUFDeEMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3JCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDO1lBQzNCLGFBQWEsRUFBRSxFQUFFO1NBQ2xCLENBQUE7UUFFRCxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM5QixXQUFXLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7WUFDeEMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7WUFDckIsV0FBVyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFr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
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import { IncomingHttpHeaders } from 'http';
|
|
4
|
-
import { Proxy, WithProxyOptions } from './proxy';
|
|
5
|
-
export interface RecordingTransaction {
|
|
6
|
-
startedAt?: Date;
|
|
7
|
-
responseStartedAt?: Date;
|
|
8
|
-
responseEndedAt?: Date;
|
|
9
|
-
method: string;
|
|
10
|
-
url: string;
|
|
11
|
-
statusCode?: number;
|
|
12
|
-
incomingHttpHeaders?: IncomingHttpHeaders;
|
|
13
|
-
contentChunks: Buffer[];
|
|
14
|
-
err?: Error;
|
|
15
|
-
errKind?: string;
|
|
16
|
-
}
|
|
17
|
-
export interface RecordingSession {
|
|
18
|
-
startedAt?: Date;
|
|
19
|
-
transactions: RecordingTransaction[];
|
|
20
|
-
}
|
|
21
|
-
export declare class RecordingProxy extends Proxy {
|
|
22
|
-
startedAt?: Date;
|
|
23
|
-
transactions: RecordingTransaction[];
|
|
24
|
-
setup(): Promise<void>;
|
|
25
|
-
saveInventory(): Promise<void>;
|
|
26
|
-
shutdown(): Promise<void>;
|
|
27
|
-
}
|
|
28
|
-
export declare function withRecordingProxy(fn: (proxy: RecordingProxy) => Promise<void>, options?: WithProxyOptions): Promise<void | RecordingProxy>;
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { logger } from './logger';
|
|
2
|
-
import { Proxy, withProxy } from './proxy';
|
|
3
|
-
export class RecordingProxy extends Proxy {
|
|
4
|
-
startedAt;
|
|
5
|
-
transactions = [];
|
|
6
|
-
async setup() {
|
|
7
|
-
this.startedAt = new Date();
|
|
8
|
-
let requestNumber = 1;
|
|
9
|
-
this.proxy.onRequest((ctx, onRequestComplete) => {
|
|
10
|
-
const number = requestNumber++;
|
|
11
|
-
// Throttling
|
|
12
|
-
const filter = this.createThrottlingTransform();
|
|
13
|
-
if (filter)
|
|
14
|
-
ctx.addResponseFilter(filter);
|
|
15
|
-
const identifier = Proxy.contextRequest(ctx);
|
|
16
|
-
const transaction = {
|
|
17
|
-
startedAt: new Date(),
|
|
18
|
-
...identifier,
|
|
19
|
-
contentChunks: [],
|
|
20
|
-
};
|
|
21
|
-
logger().debug({ number, identifier }, `Request #${number} ${transaction.url} started`);
|
|
22
|
-
ctx.onError((_, err, errKind) => {
|
|
23
|
-
transaction.responseStartedAt = new Date();
|
|
24
|
-
transaction.err = err;
|
|
25
|
-
transaction.errKind = errKind;
|
|
26
|
-
logger().warn({ number, identifier, err }, `Request #${number} ${transaction.url} failed: ${err.message}`);
|
|
27
|
-
});
|
|
28
|
-
ctx.onResponse((_, onResponseComplete) => {
|
|
29
|
-
transaction.responseStartedAt = new Date();
|
|
30
|
-
transaction.statusCode = ctx.serverToProxyResponse.statusCode;
|
|
31
|
-
transaction.incomingHttpHeaders = ctx.serverToProxyResponse.headers;
|
|
32
|
-
logger().debug({ number, identifier }, `Request #${number} ${transaction.url} responded`);
|
|
33
|
-
onResponseComplete();
|
|
34
|
-
});
|
|
35
|
-
ctx.onResponseData((_, chunk, onResponseDataComplete) => {
|
|
36
|
-
transaction.contentChunks.push(chunk);
|
|
37
|
-
onResponseDataComplete(null, chunk);
|
|
38
|
-
});
|
|
39
|
-
ctx.onResponseEnd((_, onResponseEndComplete) => {
|
|
40
|
-
transaction.responseEndedAt = new Date();
|
|
41
|
-
this.transactions.push(transaction);
|
|
42
|
-
logger().debug({ number, identifier }, `Request #${number} ${transaction.url} completed`);
|
|
43
|
-
onResponseEndComplete();
|
|
44
|
-
});
|
|
45
|
-
onRequestComplete();
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
async saveInventory() {
|
|
49
|
-
const transactions = [];
|
|
50
|
-
for (const requestTransaction of this.transactions) {
|
|
51
|
-
const transaction = {
|
|
52
|
-
method: requestTransaction.method,
|
|
53
|
-
url: requestTransaction.url,
|
|
54
|
-
ttfbMs: 0,
|
|
55
|
-
content: Buffer.concat(requestTransaction.contentChunks),
|
|
56
|
-
};
|
|
57
|
-
// ttfb and duration
|
|
58
|
-
if (requestTransaction.responseStartedAt) {
|
|
59
|
-
transaction.ttfbMs = +requestTransaction.responseStartedAt - +requestTransaction.startedAt;
|
|
60
|
-
if (requestTransaction.responseEndedAt) {
|
|
61
|
-
transaction.durationMs = +requestTransaction.responseEndedAt - +requestTransaction.responseStartedAt;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// error
|
|
65
|
-
if (requestTransaction.err) {
|
|
66
|
-
transaction.errorMessage = requestTransaction.err.message;
|
|
67
|
-
}
|
|
68
|
-
// status code
|
|
69
|
-
if (requestTransaction.statusCode) {
|
|
70
|
-
transaction.statusCode = requestTransaction.statusCode;
|
|
71
|
-
}
|
|
72
|
-
// headers
|
|
73
|
-
if (requestTransaction.incomingHttpHeaders) {
|
|
74
|
-
transaction.rawHeaders = {};
|
|
75
|
-
for (const [key, value] of Object.entries(requestTransaction.incomingHttpHeaders)) {
|
|
76
|
-
transaction.rawHeaders[key.toLowerCase()] = value.toString();
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
transactions.push(transaction);
|
|
80
|
-
}
|
|
81
|
-
const resources = await this.inventoryRepository.saveTransactions(transactions);
|
|
82
|
-
const inventory = { entryUrl: this.entryUrl, resources };
|
|
83
|
-
await this.inventoryRepository.saveInventory(inventory);
|
|
84
|
-
}
|
|
85
|
-
async shutdown() {
|
|
86
|
-
await this.saveInventory();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
export async function withRecordingProxy(fn, options) {
|
|
90
|
-
return await withProxy(RecordingProxy, fn, options || {});
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlY29yZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFvQixNQUFNLFNBQVMsQ0FBQTtBQW9CNUQsTUFBTSxPQUFPLGNBQWUsU0FBUSxLQUFLO0lBQ3ZDLFNBQVMsQ0FBTztJQUNoQixZQUFZLEdBQTJCLEVBQUUsQ0FBQTtJQUV6QyxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUUzQixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsRUFBRTtZQUM5QyxNQUFNLE1BQU0sR0FBRyxhQUFhLEVBQUUsQ0FBQTtZQUU5QixhQUFhO1lBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUE7WUFDL0MsSUFBSSxNQUFNO2dCQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUV6QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sV0FBVyxHQUF5QjtnQkFDeEMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNyQixHQUFHLFVBQVU7Z0JBQ2IsYUFBYSxFQUFFLEVBQUU7YUFDbEIsQ0FBQTtZQUVELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxZQUFZLE1BQU0sSUFBSSxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQTtZQUV2RixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFF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
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
/// <reference types="node" />
|
|
4
|
-
import { Transform, TransformCallback } from 'stream';
|
|
5
|
-
export declare class ThrottlingLog {
|
|
6
|
-
ms: number;
|
|
7
|
-
bytes: number;
|
|
8
|
-
}
|
|
9
|
-
export declare class Throttle {
|
|
10
|
-
flushIntervalMs: number;
|
|
11
|
-
limitBytes: number;
|
|
12
|
-
currentBytes: number;
|
|
13
|
-
interval?: ReturnType<typeof setInterval>;
|
|
14
|
-
logs: ThrottlingLog[];
|
|
15
|
-
constructor(limitBytes: number, flushIntervalMs?: number);
|
|
16
|
-
static fromMbps(mbps: number, flushIntervalMs?: number): Throttle;
|
|
17
|
-
computeCapacity(): {
|
|
18
|
-
consumed: number;
|
|
19
|
-
carryover: number;
|
|
20
|
-
};
|
|
21
|
-
start(): void;
|
|
22
|
-
stop(): void;
|
|
23
|
-
checkAndStack(bytes: number): boolean;
|
|
24
|
-
simpleReport(unitMs?: number): {
|
|
25
|
-
maxBytesPerUnit: number;
|
|
26
|
-
avgBytesPerUnit: number;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
export declare class ThrottlingTransform extends Transform {
|
|
30
|
-
throttle: Throttle;
|
|
31
|
-
retryIntervalMs: number;
|
|
32
|
-
constructor(throttle: Throttle, retryIntervalMs: number);
|
|
33
|
-
_transform(chunk: string | Buffer, _: string, done: TransformCallback): void;
|
|
34
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3R0bGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90aHJvdHRsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sUUFBUSxDQUFBO0FBRXJELE1BQU0sT0FBTyxhQUFhO0lBQ3hCLEVBQUUsQ0FBUTtJQUNWLEtBQUssQ0FBUTtDQUNkO0FBRUQsTUFBTSxPQUFPLFFBQVE7SUFDbkIsZUFBZSxDQUFTO0lBQ3hCLFVBQVUsQ0FBUztJQUNuQixZQUFZLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLFFBQVEsQ0FBaUM7SUFDekMsSUFBSSxHQUFvQixFQUFFLENBQUE7SUFFMUIsWUFBWSxVQUFrQixFQUFFLGVBQXdCO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxJQUFJLEdBQUcsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFZLEVBQUUsZUFBd0I7UUFDcEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO1FBQ3JFLE9BQU8sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFBO0lBQ2xELENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQTtRQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFB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
|
package/build/module/url.d.ts
DELETED
package/build/module/url.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import Crypto from 'crypto';
|
|
2
|
-
import Path from 'path';
|
|
3
|
-
const DirectoryIndex = 'index.html';
|
|
4
|
-
const BasenameMaxLength = 196;
|
|
5
|
-
const HashLength = 8;
|
|
6
|
-
const IgnoreParams = process.env.IGNORE_PARAMS || 'ts';
|
|
7
|
-
const IgnoreParamsRegex = IgnoreParams.split(/\s*,\s*/).map((p) => new RegExp(`(?<=[?&]${p}=)[^&]*`, 'g'));
|
|
8
|
-
export function normalizeUrl(url) {
|
|
9
|
-
const urlObj = typeof url === 'string' ? new URL(url) : url;
|
|
10
|
-
// Remove dynamic params
|
|
11
|
-
if (urlObj.search !== '') {
|
|
12
|
-
urlObj.search = IgnoreParamsRegex.reduce((search, re) => {
|
|
13
|
-
return search.replace(re, '');
|
|
14
|
-
}, urlObj.search);
|
|
15
|
-
}
|
|
16
|
-
return urlObj;
|
|
17
|
-
}
|
|
18
|
-
export function urlToContentFilePath(url) {
|
|
19
|
-
const urlObj = normalizeUrl(url);
|
|
20
|
-
const protocol = urlObj.protocol.replace(/:/g, '');
|
|
21
|
-
const host = urlObj.host.replace(/:/g, '~');
|
|
22
|
-
// Directory Index
|
|
23
|
-
let pathname = urlObj.pathname;
|
|
24
|
-
if (pathname.endsWith('/')) {
|
|
25
|
-
pathname += DirectoryIndex;
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
const ext = Path.extname(pathname);
|
|
29
|
-
if (ext === '') {
|
|
30
|
-
pathname = Path.join(pathname, DirectoryIndex);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
const dir = Path.dirname(pathname);
|
|
34
|
-
const ext = Path.extname(pathname);
|
|
35
|
-
const base = Path.basename(pathname, ext);
|
|
36
|
-
let filename = base;
|
|
37
|
-
// Search params
|
|
38
|
-
if (urlObj.search !== '') {
|
|
39
|
-
// Remove dynamic params
|
|
40
|
-
const search = IgnoreParamsRegex.reduce((search, re) => {
|
|
41
|
-
return search.replace(re, '');
|
|
42
|
-
}, urlObj.search);
|
|
43
|
-
filename = [filename, search.slice(1)].join('~');
|
|
44
|
-
}
|
|
45
|
-
// Too long basename
|
|
46
|
-
if (filename.length > BasenameMaxLength) {
|
|
47
|
-
const trunk = filename.slice(0, BasenameMaxLength);
|
|
48
|
-
const hash = Crypto.createHash('sha1');
|
|
49
|
-
hash.update(filename);
|
|
50
|
-
const digest = hash.digest('hex').slice(0, HashLength);
|
|
51
|
-
filename = [trunk, digest].join('_');
|
|
52
|
-
}
|
|
53
|
-
// Extension
|
|
54
|
-
filename += ext;
|
|
55
|
-
// Content file relative path
|
|
56
|
-
const relPath = Path.join(dir, filename);
|
|
57
|
-
return Path.join(protocol, host, relPath);
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBRXZCLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQTtBQUNuQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQTtBQUM3QixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUE7QUFDcEIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFBO0FBQ3RELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUUxRyxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQWlCO0lBQzVDLE1BQU0sTUFBTSxHQUFHLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQTtJQUUzRCx3QkFBd0I7SUFDeEIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUN4QixNQUFNLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM5RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQy9CLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7S0FDbEI7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBaUI7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
|