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
package/build/main/proxy.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import HttpMitmProxy from 'http-mitm-proxy';
|
|
2
|
-
import { InventoryRepository } from './inventory';
|
|
3
|
-
import { Throttle, ThrottlingTransform } from './throttling';
|
|
4
|
-
export interface ProxyOptions extends HttpMitmProxy.IProxyOptions {
|
|
5
|
-
inventoryRepository?: InventoryRepository;
|
|
6
|
-
throttle?: Throttle;
|
|
7
|
-
throttlingRetryIntervalMs?: number;
|
|
8
|
-
entryUrl?: string;
|
|
9
|
-
}
|
|
10
|
-
export declare abstract class Proxy {
|
|
11
|
-
proxyOptions: HttpMitmProxy.IProxyOptions;
|
|
12
|
-
proxy: HttpMitmProxy.IProxy;
|
|
13
|
-
inventoryRepository: InventoryRepository;
|
|
14
|
-
throttle?: Throttle;
|
|
15
|
-
throttlingRetryIntervalMs: number;
|
|
16
|
-
entryUrl?: string;
|
|
17
|
-
constructor(options?: ProxyOptions);
|
|
18
|
-
static contextRequest(ctx: HttpMitmProxy.IContext): {
|
|
19
|
-
method: string;
|
|
20
|
-
url: string;
|
|
21
|
-
};
|
|
22
|
-
createThrottlingTransform(): ThrottlingTransform | void;
|
|
23
|
-
abstract setup(): Promise<void>;
|
|
24
|
-
abstract shutdown(): Promise<void>;
|
|
25
|
-
start(): Promise<void>;
|
|
26
|
-
get port(): number;
|
|
27
|
-
get inventoryDirPath(): string;
|
|
28
|
-
stop(): Promise<void>;
|
|
29
|
-
}
|
|
30
|
-
export interface WithProxyOptions extends HttpMitmProxy.IProxyOptions {
|
|
31
|
-
port?: number;
|
|
32
|
-
dirPath?: string;
|
|
33
|
-
entryUrl?: string;
|
|
34
|
-
throttling?: {
|
|
35
|
-
mbps: number;
|
|
36
|
-
flushIntervalMs?: number;
|
|
37
|
-
retryIntervalMs?: number;
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
export declare function withProxy<ProxyType extends Proxy, OptionsType extends WithProxyOptions = WithProxyOptions>(cls: new (options: ProxyOptions) => ProxyType, fn: (proxy: ProxyType) => Promise<void>, options: OptionsType): Promise<ProxyType | void>;
|
package/build/main/proxy.js
DELETED
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3JkaW5nL3Byb3h5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLHNFQUEyQztBQUUzQyw0Q0FBcUQ7QUFDckQsb0NBQTZFO0FBb0J0RSxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLElBQTRCO0lBRTVCLE1BQU0sS0FBSyxHQUFHLElBQUEseUJBQWEsR0FBRSxDQUFBO0lBQzdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSx1QkFBZSxFQUFDLElBQUksQ0FBQyxDQUFBO0lBRTNDLE1BQU0sT0FBTyxHQUFxQjtRQUNoQyxZQUFZLEVBQUUsRUFBRTtLQUNqQixDQUFBO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUU5QixNQUFNLFdBQVcsaUNBQ2YsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLElBQ2xCLElBQUEsMkJBQW1CLEVBQUMsR0FBRyxDQUFDLEtBQzNCLGFBQWEsRUFBRSxFQUFFLEdBQ2xCLENBQUE7UUFFRCxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM5QixXQUFXLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7WUFDeEMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7WUFDckIsV0FBVyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEVBQUU7WUFDdkMsV0FBVyxDQUFDLGlCQUFpQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7WUFDMUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFBO1lBQzdELFdBQVcsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFBO1lBQ25FLGtCQUFrQixFQUFFLENBQUE7UUFDdEIsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxFQUFFO1lBQ3RELFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3JDLHNCQUFzQixFQUFFLENBQUE7UUFDMUIsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLEVBQUU7WUFDN0MsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDdEMscUJBQXFCLEVBQUUsQ0FBQTtRQUN6QixDQUFDLENBQUMsQ0FBQTtRQUVGLGlCQUFpQixFQUFFLENBQUE7SUFDckIsQ0FBQyxDQUFDLENBQUE7SUFFRixNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRW5ILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUE7QUFDM0IsQ0FBQztBQWhERCxrREFnREM7QUFFTSxLQUFLLFVBQVUsc0JBQXNCLENBQUMsT0FBeUIsRUFBRSxPQUFnQjtJQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFeEMsS0FBSyxNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO1FBQ3JDLE1BQU0sV0FBVyxHQUFnQjtZQUMvQixNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU07WUFDakIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1lBQ1gsTUFBTSxFQUFFLENBQUM7U0FDVixDQUFBO1FBRUQsb0JBQW9CO1FBQ3BCLElBQUksRUFBRSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFBO1lBRTFELElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRTtnQkFDdEIsV0FBVyxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUE7YUFDckU7U0FDRjtRQUVELElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUNWLFdBQVcsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUE7U0FDeEM7UUFFRCxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUU7WUFDakIsV0FBVyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFBO1NBQ3ZDO1FBRUQsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUU7WUFDMUIsV0FBVyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUE7WUFDM0IsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7Z0JBQ2pFLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFBO2FBQzdEO1NBQ0Y7UUFFRCxNQUFNLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtLQUNyRDtJQUVELE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFBO0lBRXRCLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUF4Q0Qsd0RBd0NDO0FBRU0sS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxFQUFtQyxFQUNuQyxJQUE0QjtJQUU1QixNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDMUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQTtJQUUzQixJQUFJO1FBQ0YsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDZCxNQUFNLFNBQVMsR0FBRyxNQUFNLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3ZELE9BQU8sU0FBUyxDQUFBO0tBQ2pCO1lBQVM7UUFDUixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7S0FDZDtBQUNILENBQUM7QUFkRCxnREFjQyJ9
|
|
@@ -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>;
|
package/build/main/recording.js
DELETED
|
@@ -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
|
-
}
|
package/build/main/throttling.js
DELETED
|
@@ -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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
|
package/build/main/url.d.ts
DELETED
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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
|
package/build/module/adhoc.d.ts
DELETED