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,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>;
@@ -1,111 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.withProxy = exports.Proxy = void 0;
7
- const crypto_1 = __importDefault(require("crypto"));
8
- const promises_1 = __importDefault(require("fs/promises"));
9
- const http_1 = __importDefault(require("http"));
10
- const https_1 = __importDefault(require("https"));
11
- const os_1 = __importDefault(require("os"));
12
- const path_1 = __importDefault(require("path"));
13
- const get_port_1 = __importDefault(require("get-port"));
14
- const http_mitm_proxy_1 = __importDefault(require("http-mitm-proxy"));
15
- const inventory_1 = require("./inventory");
16
- const logger_1 = require("./logger");
17
- const throttling_1 = require("./throttling");
18
- class Proxy {
19
- constructor(options) {
20
- var _a;
21
- options || (options = {});
22
- // Proxy
23
- this.proxyOptions = options;
24
- this.proxy = (0, http_mitm_proxy_1.default)();
25
- // Inventory repository
26
- this.inventoryRepository = (_a = options.inventoryRepository) !== null && _a !== void 0 ? _a : new inventory_1.InventoryRepository();
27
- // Throttle
28
- if (options.throttle)
29
- this.throttle = options.throttle;
30
- this.throttlingRetryIntervalMs = options.throttlingRetryIntervalMs || 10;
31
- // Entry URL
32
- this.entryUrl = options.entryUrl;
33
- }
34
- static contextRequest(ctx) {
35
- if (!ctx.clientToProxyRequest.headers.host)
36
- throw new Error('ctx.clientToProxyRequest.headers.host is empty');
37
- const url = [
38
- ctx.isSSL ? 'https://' : 'http://',
39
- ctx.clientToProxyRequest.headers.host,
40
- ctx.clientToProxyRequest.url,
41
- ].join('');
42
- const method = (ctx.clientToProxyRequest.method || 'get').toLowerCase();
43
- return {
44
- method,
45
- url,
46
- };
47
- }
48
- createThrottlingTransform() {
49
- if (this.throttle) {
50
- return new throttling_1.ThrottlingTransform(this.throttle, this.throttlingRetryIntervalMs);
51
- }
52
- }
53
- async start() {
54
- if (this.throttle)
55
- this.throttle.start();
56
- const sslCaDir = this.proxyOptions.sslCaDir || process.env.SSL_CA_DIR || path_1.default.join(os_1.default.homedir(), '.pagespeed-quest/ca');
57
- const port = Number(this.proxyOptions.port || process.env.PORT || (await (0, get_port_1.default)()));
58
- const options = {
59
- port,
60
- sslCaDir,
61
- httpAgent: new http_1.default.Agent({
62
- keepAlive: true,
63
- }),
64
- httpsAgent: new https_1.default.Agent({
65
- keepAlive: true,
66
- secureOptions: crypto_1.default.constants.SSL_OP_LEGACY_SERVER_CONNECT,
67
- }),
68
- };
69
- await this.setup();
70
- await promises_1.default.mkdir(options.sslCaDir, { recursive: true });
71
- await new Promise((resolve, reject) => this.proxy.listen(options, (error) => (error ? reject(error) : resolve())));
72
- }
73
- get port() {
74
- return this.proxy.httpPort;
75
- }
76
- get inventoryDirPath() {
77
- return this.inventoryRepository.dirPath;
78
- }
79
- async stop() {
80
- this.proxy.close();
81
- await this.shutdown();
82
- if (this.throttle)
83
- this.throttle.stop();
84
- }
85
- }
86
- exports.Proxy = Proxy;
87
- async function withProxy(cls, fn, options) {
88
- const proxyOptions = Object.assign(Object.assign({}, options), { inventoryRepository: new inventory_1.InventoryRepository(options === null || options === void 0 ? void 0 : options.dirPath) });
89
- if (options.throttling) {
90
- proxyOptions.throttle = throttling_1.Throttle.fromMbps(options.throttling.mbps, options.throttling.flushIntervalMs);
91
- proxyOptions.throttlingRetryIntervalMs = options.throttling.retryIntervalMs;
92
- }
93
- const proxy = new cls(proxyOptions);
94
- // start
95
- try {
96
- await proxy.start();
97
- (0, logger_1.logger)().info(`Proxy started to listening on port ${proxy.port}`);
98
- }
99
- catch (err) {
100
- (0, logger_1.logger)().fatal({ err }, `Failed to start the proxy: ${err.message}`);
101
- return;
102
- }
103
- // callback
104
- await fn(proxy);
105
- // stop
106
- await proxy.stop();
107
- (0, logger_1.logger)().info(`Proxy stopped`);
108
- return proxy;
109
- }
110
- exports.withProxy = withProxy;
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTJCO0FBQzNCLDJEQUE2QjtBQUM3QixnREFBdUI7QUFDdkIsa0RBQXlCO0FBQ3pCLDRDQUFtQjtBQUNuQixnREFBdUI7QUFFdkIsd0RBQThCO0FBQzlCLHNFQUEyQztBQUUzQywyQ0FBaUQ7QUFDakQscUNBQWlDO0FBQ2pDLDZDQUE0RDtBQVM1RCxNQUFzQixLQUFLO0lBUXpCLFlBQVksT0FBc0I7O1FBQ2hDLE9BQU8sS0FBUCxPQUFPLEdBQUssRUFBRSxFQUFBO1FBRWQsUUFBUTtRQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFBO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBQSx5QkFBYSxHQUFFLENBQUE7UUFFNUIsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFBLE9BQU8sQ0FBQyxtQkFBbUIsbUNBQUksSUFBSSwrQkFBbUIsRUFBRSxDQUFBO1FBRW5GLFdBQVc7UUFDWCxJQUFJLE9BQU8sQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFBO1FBQ3RELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxPQUFPLENBQUMseUJBQXlCLElBQUksRUFBRSxDQUFBO1FBRXhFLFlBQVk7UUFDWixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUE7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBMkI7UUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtRQUU3RyxNQUFNLEdBQUcsR0FBRztZQUNWLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUs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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>;
@@ -1,90 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.withRecordingProxy = exports.saveSessionAsInventory = exports.startRecordingProxy = void 0;
7
- const http_mitm_proxy_1 = __importDefault(require("http-mitm-proxy"));
8
- const inventory_1 = require("../inventory");
9
- const proxy_1 = require("../proxy");
10
- async function startRecordingProxy(opts) {
11
- const proxy = (0, http_mitm_proxy_1.default)();
12
- const options = await (0, proxy_1.getProxyOptions)(opts);
13
- const session = {
14
- transactions: [],
15
- };
16
- proxy.onRequest((ctx, onRequestComplete) => {
17
- session.startedAt = new Date();
18
- const transaction = Object.assign(Object.assign({ startedAt: new Date() }, (0, proxy_1.parseContextRequest)(ctx)), { contentChunks: [] });
19
- ctx.onError((_, err, errKind) => {
20
- transaction.responseEndedAt = new Date();
21
- transaction.err = err;
22
- transaction.errKind = errKind;
23
- });
24
- ctx.onResponse((_, onResponseComplete) => {
25
- transaction.responseStartedAt = new Date();
26
- transaction.statusCode = ctx.serverToProxyResponse.statusCode;
27
- transaction.incomingHttpHeaders = ctx.serverToProxyResponse.headers;
28
- onResponseComplete();
29
- });
30
- ctx.onResponseData((_, chunk, onResponseDataComplete) => {
31
- transaction.contentChunks.push(chunk);
32
- onResponseDataComplete();
33
- });
34
- ctx.onResponseEnd((_, onResponseEndComplete) => {
35
- session.transactions.push(transaction);
36
- onResponseEndComplete();
37
- });
38
- onRequestComplete();
39
- });
40
- await new Promise((resolve, reject) => proxy.listen(options, (error) => (error ? reject(error) : resolve())));
41
- return { proxy, session };
42
- }
43
- exports.startRecordingProxy = startRecordingProxy;
44
- async function saveSessionAsInventory(session, dirPath) {
45
- const inventory = new inventory_1.Inventory(dirPath);
46
- for (const rt of session.transactions) {
47
- const transaction = {
48
- method: rt.method,
49
- url: rt.url,
50
- ttfbMs: 0,
51
- };
52
- // ttfb and duration
53
- if (rt.responseStartedAt) {
54
- transaction.ttfbMs = +rt.responseStartedAt - +rt.startedAt;
55
- if (rt.responseEndedAt) {
56
- transaction.durationMs = +rt.responseEndedAt - +rt.responseStartedAt;
57
- }
58
- }
59
- if (rt.err) {
60
- transaction.errMessage = rt.err.message;
61
- }
62
- if (rt.statusCode) {
63
- transaction.statusCode = rt.statusCode;
64
- }
65
- if (rt.incomingHttpHeaders) {
66
- transaction.rawHeaders = {};
67
- for (const [key, value] of Object.entries(rt.incomingHttpHeaders)) {
68
- transaction.rawHeaders[key.toLowerCase()] = value.toString();
69
- }
70
- }
71
- await inventory.saveTransactionResource(transaction);
72
- }
73
- await inventory.save();
74
- return inventory;
75
- }
76
- exports.saveSessionAsInventory = saveSessionAsInventory;
77
- async function withRecordingProxy(fn, opts) {
78
- const { proxy, session } = await startRecordingProxy(opts);
79
- const port = proxy.httpPort;
80
- try {
81
- await fn(port);
82
- const inventory = await saveSessionAsInventory(session);
83
- return inventory;
84
- }
85
- finally {
86
- proxy.close();
87
- }
88
- }
89
- exports.withRecordingProxy = withRecordingProxy;
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3JkaW5nL3Byb3h5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLHNFQUEyQztBQUUzQyw0Q0FBcUQ7QUFDckQsb0NBQTZFO0FBb0J0RSxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLElBQTRCO0lBRTVCLE1BQU0sS0FBSyxHQUFHLElBQUEseUJBQWEsR0FBRSxDQUFBO0lBQzdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSx1QkFBZSxFQUFDLElBQUksQ0FBQyxDQUFBO0lBRTNDLE1BQU0sT0FBTyxHQUFxQjtRQUNoQyxZQUFZLEVBQUUsRUFBRTtLQUNqQixDQUFBO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUU5QixNQUFNLFdBQVcsaUNBQ2YsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLElBQ2xCLElBQUEsMkJBQW1CLEVBQUMsR0FBRyxDQUFDLEtBQzNCLGFBQWEsRUFBRSxFQUFFLEdBQ2xCLENBQUE7UUFFRCxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM5QixXQUFXLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7WUFDeEMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7WUFDckIsV0FBVyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEVBQUU7WUFDdkMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7WUFDMUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxH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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,95 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.withRecordingProxy = exports.RecordingProxy = void 0;
4
- const logger_1 = require("./logger");
5
- const proxy_1 = require("./proxy");
6
- class RecordingProxy extends proxy_1.Proxy {
7
- constructor() {
8
- super(...arguments);
9
- this.transactions = [];
10
- }
11
- async setup() {
12
- this.startedAt = new Date();
13
- let requestNumber = 1;
14
- this.proxy.onRequest((ctx, onRequestComplete) => {
15
- const number = requestNumber++;
16
- // Throttling
17
- const filter = this.createThrottlingTransform();
18
- if (filter)
19
- ctx.addResponseFilter(filter);
20
- const identifier = proxy_1.Proxy.contextRequest(ctx);
21
- const transaction = Object.assign(Object.assign({ startedAt: new Date() }, identifier), { contentChunks: [] });
22
- (0, logger_1.logger)().debug({ number, identifier }, `Request #${number} ${transaction.url} started`);
23
- ctx.onError((_, err, errKind) => {
24
- transaction.responseStartedAt = new Date();
25
- transaction.err = err;
26
- transaction.errKind = errKind;
27
- (0, logger_1.logger)().warn({ number, identifier, err }, `Request #${number} ${transaction.url} failed: ${err.message}`);
28
- });
29
- ctx.onResponse((_, onResponseComplete) => {
30
- transaction.responseStartedAt = new Date();
31
- transaction.statusCode = ctx.serverToProxyResponse.statusCode;
32
- transaction.incomingHttpHeaders = ctx.serverToProxyResponse.headers;
33
- (0, logger_1.logger)().debug({ number, identifier }, `Request #${number} ${transaction.url} responded`);
34
- onResponseComplete();
35
- });
36
- ctx.onResponseData((_, chunk, onResponseDataComplete) => {
37
- transaction.contentChunks.push(chunk);
38
- onResponseDataComplete(null, chunk);
39
- });
40
- ctx.onResponseEnd((_, onResponseEndComplete) => {
41
- transaction.responseEndedAt = new Date();
42
- this.transactions.push(transaction);
43
- (0, logger_1.logger)().debug({ number, identifier }, `Request #${number} ${transaction.url} completed`);
44
- onResponseEndComplete();
45
- });
46
- onRequestComplete();
47
- });
48
- }
49
- async saveInventory() {
50
- const transactions = [];
51
- for (const requestTransaction of this.transactions) {
52
- const transaction = {
53
- method: requestTransaction.method,
54
- url: requestTransaction.url,
55
- ttfbMs: 0,
56
- content: Buffer.concat(requestTransaction.contentChunks),
57
- };
58
- // ttfb and duration
59
- if (requestTransaction.responseStartedAt) {
60
- transaction.ttfbMs = +requestTransaction.responseStartedAt - +requestTransaction.startedAt;
61
- if (requestTransaction.responseEndedAt) {
62
- transaction.durationMs = +requestTransaction.responseEndedAt - +requestTransaction.responseStartedAt;
63
- }
64
- }
65
- // error
66
- if (requestTransaction.err) {
67
- transaction.errorMessage = requestTransaction.err.message;
68
- }
69
- // status code
70
- if (requestTransaction.statusCode) {
71
- transaction.statusCode = requestTransaction.statusCode;
72
- }
73
- // headers
74
- if (requestTransaction.incomingHttpHeaders) {
75
- transaction.rawHeaders = {};
76
- for (const [key, value] of Object.entries(requestTransaction.incomingHttpHeaders)) {
77
- transaction.rawHeaders[key.toLowerCase()] = value.toString();
78
- }
79
- }
80
- transactions.push(transaction);
81
- }
82
- const resources = await this.inventoryRepository.saveTransactions(transactions);
83
- const inventory = { entryUrl: this.entryUrl, resources };
84
- await this.inventoryRepository.saveInventory(inventory);
85
- }
86
- async shutdown() {
87
- await this.saveInventory();
88
- }
89
- }
90
- exports.RecordingProxy = RecordingProxy;
91
- async function withRecordingProxy(fn, options) {
92
- return await (0, proxy_1.withProxy)(RecordingProxy, fn, options || {});
93
- }
94
- exports.withRecordingProxy = withRecordingProxy;
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlY29yZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxxQ0FBaUM7QUFDakMsbUNBQTREO0FBb0I1RCxNQUFhLGNBQWUsU0FBUSxhQUFLO0lBQXpDOztRQUVFLGlCQUFZLEdBQTJCLEVBQUUsQ0FBQTtJQXNHM0MsQ0FBQztJQXBHQyxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUUzQixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsRUFBRTtZQUM5QyxNQUFNLE1BQU0sR0FBRyxhQUFhLEVBQUUsQ0FBQTtZQUU5QixhQUFhO1lBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUE7WUFDL0MsSUFBSSxNQUFNO2dCQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUV6QyxNQUFNLFVBQVUsR0FBRyxhQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sV0FBVyxpQ0FDZixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFDbEIsVUFBVSxLQUNiLGFBQWEsRUFBRSxFQUFFLEdBQ2xCLENBQUE7WUFFRCxJQUFBLGVBQU0sR0FBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxZQUFZLE1BQU0sSUFBSSxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQTtZQUV2RixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDOUIsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7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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,88 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ThrottlingTransform = exports.Throttle = exports.ThrottlingLog = void 0;
4
- const stream_1 = require("stream");
5
- class ThrottlingLog {
6
- }
7
- exports.ThrottlingLog = ThrottlingLog;
8
- class Throttle {
9
- constructor(limitBytes, flushIntervalMs) {
10
- this.currentBytes = 0;
11
- this.logs = [];
12
- this.limitBytes = limitBytes;
13
- this.flushIntervalMs = flushIntervalMs !== null && flushIntervalMs !== void 0 ? flushIntervalMs : 100;
14
- }
15
- static fromMbps(mbps, flushIntervalMs) {
16
- const bytesPerSec = (mbps * 1024 * 1024) / 8;
17
- const limitBytes = Math.floor((bytesPerSec * flushIntervalMs) / 1000);
18
- return new Throttle(limitBytes, flushIntervalMs);
19
- }
20
- computeCapacity() {
21
- const consumed = Math.min(this.currentBytes, this.limitBytes);
22
- const carryover = this.currentBytes - consumed;
23
- return { consumed, carryover };
24
- }
25
- start() {
26
- this.interval = setInterval(() => {
27
- const c = this.computeCapacity();
28
- this.logs.push({
29
- ms: Date.now(),
30
- bytes: c.consumed,
31
- });
32
- this.currentBytes = c.carryover;
33
- }, this.flushIntervalMs);
34
- }
35
- stop() {
36
- if (this.interval)
37
- clearInterval(this.interval);
38
- }
39
- checkAndStack(bytes) {
40
- if (!this.interval)
41
- throw new Error('Throttle is not started');
42
- if (this.currentBytes >= this.limitBytes) {
43
- return false;
44
- }
45
- this.currentBytes += bytes;
46
- return true;
47
- }
48
- simpleReport(unitMs = 1000) {
49
- const bySec = new Map();
50
- for (const log of this.logs) {
51
- const unit = Math.floor(log.ms / unitMs);
52
- if (!bySec.has(unit))
53
- bySec.set(unit, 0);
54
- bySec.set(unit, bySec.get(unit) + log.bytes);
55
- }
56
- const values = Array.from(bySec.values());
57
- const maxBytesPerUnit = Math.max(...values);
58
- const avgBytesPerUnit = Math.floor(values.reduce((a, b) => a + b, 0) / bySec.size) / 1024 / 1024;
59
- return {
60
- maxBytesPerUnit,
61
- avgBytesPerUnit,
62
- };
63
- }
64
- }
65
- exports.Throttle = Throttle;
66
- class ThrottlingTransform extends stream_1.Transform {
67
- constructor(throttle, retryIntervalMs) {
68
- super();
69
- this.throttle = throttle;
70
- this.retryIntervalMs = retryIntervalMs;
71
- }
72
- _transform(chunk, _, done) {
73
- if (this.throttle.checkAndStack(chunk.length)) {
74
- this.push(chunk);
75
- done();
76
- return;
77
- }
78
- const interval = setInterval(() => {
79
- if (this.throttle.checkAndStack(chunk.length)) {
80
- clearInterval(interval);
81
- this.push(chunk);
82
- done();
83
- }
84
- });
85
- }
86
- }
87
- exports.ThrottlingTransform = ThrottlingTransform;
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3R0bGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90aHJvdHRsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFxRDtBQUVyRCxNQUFhLGFBQWE7Q0FHekI7QUFIRCxzQ0FHQztBQUVELE1BQWEsUUFBUTtJQU9uQixZQUFZLFVBQWtCLEVBQUUsZUFBd0I7UUFKeEQsaUJBQVksR0FBRyxDQUFDLENBQUE7UUFFaEIsU0FBSSxHQUFvQixFQUFFLENBQUE7UUFHeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLGFBQWYsZUFBZSxjQUFmLGVBQWUsR0FBSSxHQUFHLENBQUE7SUFDL0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBWSxFQUFFLGVBQXdCO1FBQ3BELE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUNyRSxPQUFPLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUE7UUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLENBQUMs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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;
package/build/main/url.js DELETED
@@ -1,67 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.urlToContentFilePath = exports.normalizeUrl = void 0;
7
- const crypto_1 = __importDefault(require("crypto"));
8
- const path_1 = __importDefault(require("path"));
9
- const DirectoryIndex = 'index.html';
10
- const BasenameMaxLength = 196;
11
- const HashLength = 8;
12
- const IgnoreParams = process.env.IGNORE_PARAMS || 'ts';
13
- const IgnoreParamsRegex = IgnoreParams.split(/\s*,\s*/).map((p) => new RegExp(`(?<=[?&]${p}=)[^&]*`, 'g'));
14
- function normalizeUrl(url) {
15
- const urlObj = typeof url === 'string' ? new URL(url) : url;
16
- // Remove dynamic params
17
- if (urlObj.search !== '') {
18
- urlObj.search = IgnoreParamsRegex.reduce((search, re) => {
19
- return search.replace(re, '');
20
- }, urlObj.search);
21
- }
22
- return urlObj;
23
- }
24
- exports.normalizeUrl = normalizeUrl;
25
- function urlToContentFilePath(url) {
26
- const urlObj = normalizeUrl(url);
27
- const protocol = urlObj.protocol.replace(/:/g, '');
28
- const host = urlObj.host.replace(/:/g, '~');
29
- // Directory Index
30
- let pathname = urlObj.pathname;
31
- if (pathname.endsWith('/')) {
32
- pathname += DirectoryIndex;
33
- }
34
- else {
35
- const ext = path_1.default.extname(pathname);
36
- if (ext === '') {
37
- pathname = path_1.default.join(pathname, DirectoryIndex);
38
- }
39
- }
40
- const dir = path_1.default.dirname(pathname);
41
- const ext = path_1.default.extname(pathname);
42
- const base = path_1.default.basename(pathname, ext);
43
- let filename = base;
44
- // Search params
45
- if (urlObj.search !== '') {
46
- // Remove dynamic params
47
- const search = IgnoreParamsRegex.reduce((search, re) => {
48
- return search.replace(re, '');
49
- }, urlObj.search);
50
- filename = [filename, search.slice(1)].join('~');
51
- }
52
- // Too long basename
53
- if (filename.length > BasenameMaxLength) {
54
- const trunk = filename.slice(0, BasenameMaxLength);
55
- const hash = crypto_1.default.createHash('sha1');
56
- hash.update(filename);
57
- const digest = hash.digest('hex').slice(0, HashLength);
58
- filename = [trunk, digest].join('_');
59
- }
60
- // Extension
61
- filename += ext;
62
- // Content file relative path
63
- const relPath = path_1.default.join(dir, filename);
64
- return path_1.default.join(protocol, host, relPath);
65
- }
66
- exports.urlToContentFilePath = urlToContentFilePath;
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFDM0IsZ0RBQXVCO0FBRXZCLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQTtBQUNuQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQTtBQUM3QixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUE7QUFDcEIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFBO0FBQ3RELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUUxRyxTQUFnQixZQUFZLENBQUMsR0FBaUI7SUFDNUMsTUFBTSxNQUFNLEdBQUcsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO0lBRTNELHdCQUF3QjtJQUN4QixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ3hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQzlELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDL0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtLQUNsQjtJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQVhELG9DQVdDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsR0FBaUI7SUFDcEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxD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
@@ -1,2 +0,0 @@
1
- export declare function recording(): Promise<void>;
2
- export declare function playback(): Promise<void>;