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.
Files changed (72) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.ja.md +22 -2
  3. package/README.md +21 -1
  4. package/package.json +25 -21
  5. package/build/main/adhoc.d.ts +0 -2
  6. package/build/main/adhoc.js +0 -48
  7. package/build/main/command.d.ts +0 -2
  8. package/build/main/command.js +0 -103
  9. package/build/main/common-types.d.ts +0 -41
  10. package/build/main/common-types.js +0 -3
  11. package/build/main/content-encoding.d.ts +0 -11
  12. package/build/main/content-encoding.js +0 -51
  13. package/build/main/encoding.d.ts +0 -11
  14. package/build/main/encoding.js +0 -51
  15. package/build/main/formatting.d.ts +0 -8
  16. package/build/main/formatting.js +0 -64
  17. package/build/main/http.d.ts +0 -27
  18. package/build/main/http.js +0 -106
  19. package/build/main/index.d.ts +0 -9
  20. package/build/main/index.js +0 -26
  21. package/build/main/inventory.d.ts +0 -39
  22. package/build/main/inventory.js +0 -171
  23. package/build/main/logger.d.ts +0 -20
  24. package/build/main/logger.js +0 -22
  25. package/build/main/playback/inventory.d.ts +0 -0
  26. package/build/main/playback/inventory.js +0 -47
  27. package/build/main/playback.d.ts +0 -22
  28. package/build/main/playback.js +0 -111
  29. package/build/main/proxy.d.ts +0 -40
  30. package/build/main/proxy.js +0 -111
  31. package/build/main/recording/proxy.d.ts +0 -28
  32. package/build/main/recording/proxy.js +0 -90
  33. package/build/main/recording.d.ts +0 -28
  34. package/build/main/recording.js +0 -95
  35. package/build/main/throttling.d.ts +0 -34
  36. package/build/main/throttling.js +0 -88
  37. package/build/main/url.d.ts +0 -3
  38. package/build/main/url.js +0 -67
  39. package/build/module/adhoc.d.ts +0 -2
  40. package/build/module/adhoc.js +0 -40
  41. package/build/module/command.d.ts +0 -2
  42. package/build/module/command.js +0 -98
  43. package/build/module/common-types.d.ts +0 -41
  44. package/build/module/common-types.js +0 -2
  45. package/build/module/content-encoding.d.ts +0 -11
  46. package/build/module/content-encoding.js +0 -43
  47. package/build/module/encoding.d.ts +0 -11
  48. package/build/module/encoding.js +0 -43
  49. package/build/module/formatting.d.ts +0 -8
  50. package/build/module/formatting.js +0 -55
  51. package/build/module/http.d.ts +0 -27
  52. package/build/module/http.js +0 -96
  53. package/build/module/index.d.ts +0 -9
  54. package/build/module/index.js +0 -10
  55. package/build/module/inventory.d.ts +0 -39
  56. package/build/module/inventory.js +0 -165
  57. package/build/module/logger.d.ts +0 -20
  58. package/build/module/logger.js +0 -15
  59. package/build/module/playback/inventory.d.ts +0 -0
  60. package/build/module/playback/inventory.js +0 -47
  61. package/build/module/playback.d.ts +0 -22
  62. package/build/module/playback.js +0 -102
  63. package/build/module/proxy.d.ts +0 -40
  64. package/build/module/proxy.js +0 -111
  65. package/build/module/recording/proxy.d.ts +0 -28
  66. package/build/module/recording/proxy.js +0 -85
  67. package/build/module/recording.d.ts +0 -28
  68. package/build/module/recording.js +0 -92
  69. package/build/module/throttling.d.ts +0 -34
  70. package/build/module/throttling.js +0 -89
  71. package/build/module/url.d.ts +0 -3
  72. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3JkaW5nL3Byb3h5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sYUFBYSxNQUFNLGlCQUFpQixDQUFBO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQWUsTUFBTSxjQUFjLENBQUE7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBZ0IsTUFBTSxVQUFVLENBQUE7QUFvQjdFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLElBQTRCO0lBRTVCLE1BQU0sS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFBO0lBQzdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRTNDLE1BQU0sT0FBTyxHQUFxQjtRQUNoQyxZQUFZLEVBQUUsRUFBRTtLQUNqQixDQUFBO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUU5QixNQUFNLFdBQVcsR0FBeUI7WUFDeEMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3JCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDO1lBQzNCLGFBQWEsRUFBRSxFQUFFO1NBQ2xCLENBQUE7UUFFRCxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM5QixXQUFXLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7WUFDeEMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7WUFDckIsV0FBVyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEVBQUU7WUFDdkMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7WUFDMUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFBO1lBQzdELFdBQVcsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFBO1lBQ25FLGtCQUFrQixFQUFFLENBQUE7UUFDdEIsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxFQUFFO1lBQ3RELFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3JDLHNCQUFzQixFQUFFLENBQUE7UUFDMUIsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLEVBQUU7WUFDN0MsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDdEMscUJBQXFCLEVBQUUsQ0FBQTtRQUN6QixDQUFDLENBQUMsQ0FBQTtRQUVGLGlCQUFpQixFQUFFLENBQUE7SUFDckIsQ0FBQyxDQUFDLENBQUE7SUFFRixNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRW5ILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUE7QUFDM0IsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQUMsT0FBeUIsRUFBRSxPQUFnQjtJQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUV4QyxLQUFLLE1BQU0sRUFBRSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7UUFDckMsTUFBTSxXQUFXLEdBQWdCO1lBQy9CLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtZQUNqQixHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUc7WUFDWCxNQUFNLEVBQUUsQ0FBQztTQUNWLENBQUE7UUFFRCxvQkFBb0I7UUFDcEIsSUFBSSxFQUFFLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUE7WUFFMUQsSUFBSSxFQUFFLENBQUMsZUFBZSxFQUFFO2dCQUN0QixXQUFXLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQTthQUNyRTtTQUNGO1FBRUQsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFO1lBQ1YsV0FBVyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQTtTQUN4QztRQUVELElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRTtZQUNqQixXQUFXLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUE7U0FDdkM7UUFFRCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRTtZQUMxQixXQUFXLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQTtZQUMzQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRTtnQkFDakUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUE7YUFDN0Q7U0FDRjtRQUVELE1BQU0sU0FBUyxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFBO0tBQ3JEO0lBRUQsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFdEIsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLEVBQW1DLEVBQ25DLElBQTRCO0lBRTVCLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMxRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFBO0lBRTNCLElBQUk7UUFDRixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNkLE1BQU0sU0FBUyxHQUFHLE1BQU0sc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdkQsT0FBTyxTQUFTLENBQUE7S0FDakI7WUFBUztRQUNSLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtLQUNkO0FBQ0gsQ0FBQyJ9
@@ -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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
@@ -1,3 +0,0 @@
1
- /// <reference types="node" />
2
- export declare function normalizeUrl(url: string | URL): URL;
3
- export declare function urlToContentFilePath(url: string | URL): string;
@@ -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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