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