rust-http-playback-proxy 0.2.0 → 0.4.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/README.md +3 -3
- package/bin/darwin-amd64/http-playback-proxy +0 -0
- package/bin/darwin-arm64/http-playback-proxy +0 -0
- package/bin/linux-amd64/http-playback-proxy +0 -0
- package/bin/linux-arm64/http-playback-proxy +0 -0
- package/bin/windows-amd64/http-playback-proxy.exe +0 -0
- package/dist/proxy.d.ts +4 -12
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +39 -62
- package/dist/proxy.js.map +1 -1
- package/dist/types.d.ts +2 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -91,7 +91,7 @@ import { loadInventory, getResourceContentPath } from 'http-playback-proxy';
|
|
|
91
91
|
|
|
92
92
|
async function analyzeInventory() {
|
|
93
93
|
// Load inventory
|
|
94
|
-
const inventory = await loadInventory('./inventory/
|
|
94
|
+
const inventory = await loadInventory('./inventory/index.json');
|
|
95
95
|
|
|
96
96
|
// Iterate through resources
|
|
97
97
|
for (const [i, resource] of inventory.resources.entries()) {
|
|
@@ -155,7 +155,7 @@ interface Resource {
|
|
|
155
155
|
rawHeaders?: Record<string, string>;
|
|
156
156
|
contentEncoding?: ContentEncodingType;
|
|
157
157
|
contentTypeMime?: string;
|
|
158
|
-
|
|
158
|
+
contentCharset?: string;
|
|
159
159
|
contentFilePath?: string;
|
|
160
160
|
contentUtf8?: string;
|
|
161
161
|
contentBase64?: string;
|
|
@@ -193,7 +193,7 @@ Saves an inventory to a JSON file.
|
|
|
193
193
|
Returns the full path to a resource's content file.
|
|
194
194
|
|
|
195
195
|
#### `getInventoryPath(inventoryDir: string): string`
|
|
196
|
-
Returns the path to the
|
|
196
|
+
Returns the path to the index.json file.
|
|
197
197
|
|
|
198
198
|
#### `ensureBinary(): Promise<void>`
|
|
199
199
|
Ensures the binary is available, downloading if necessary.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/proxy.d.ts
CHANGED
|
@@ -9,32 +9,24 @@ export declare class Proxy {
|
|
|
9
9
|
readonly entryUrl?: string;
|
|
10
10
|
readonly deviceType?: string;
|
|
11
11
|
private _port;
|
|
12
|
-
private _controlPort?;
|
|
13
12
|
private process?;
|
|
14
|
-
constructor(mode: ProxyMode, port: number, inventoryDir: string,
|
|
13
|
+
constructor(mode: ProxyMode, port: number, inventoryDir: string, entryUrl?: string, deviceType?: string);
|
|
15
14
|
/**
|
|
16
15
|
* Get the actual port number (may differ from requested port if 0 was used)
|
|
17
16
|
*/
|
|
18
17
|
get port(): number;
|
|
19
|
-
/**
|
|
20
|
-
* Get the control API port number (if enabled)
|
|
21
|
-
*/
|
|
22
|
-
get controlPort(): number | undefined;
|
|
23
18
|
/**
|
|
24
19
|
* Update the port number (used internally when OS assigns a port)
|
|
25
20
|
*/
|
|
26
21
|
updatePort(port: number): void;
|
|
27
|
-
/**
|
|
28
|
-
* Update the control port number (used internally when OS assigns a port)
|
|
29
|
-
*/
|
|
30
|
-
updateControlPort(controlPort: number): void;
|
|
31
22
|
/**
|
|
32
23
|
* Set the child process
|
|
33
24
|
*/
|
|
34
25
|
setProcess(proc: ChildProcess): void;
|
|
35
26
|
/**
|
|
36
27
|
* Stop the proxy gracefully
|
|
37
|
-
* Sends
|
|
28
|
+
* Sends SIGTERM signal (cross-platform)
|
|
29
|
+
* Node.js automatically converts to appropriate signal on Windows (CTRL_BREAK)
|
|
38
30
|
*/
|
|
39
31
|
stop(): Promise<void>;
|
|
40
32
|
/**
|
|
@@ -74,7 +66,7 @@ export declare function getResourceContentPath(inventoryDir: string, resource: {
|
|
|
74
66
|
contentFilePath?: string;
|
|
75
67
|
}): string;
|
|
76
68
|
/**
|
|
77
|
-
* Get the path to the
|
|
69
|
+
* Get the path to the index.json file
|
|
78
70
|
*/
|
|
79
71
|
export declare function getInventoryPath(inventoryDir: string): string;
|
|
80
72
|
//# sourceMappingURL=proxy.d.ts.map
|
package/dist/proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEvF;;GAEG;AACH,qBAAa,KAAK;IAChB,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,YAAY,EAAE,MAAM,CAAC;IACrC,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEvF;;GAEG;AACH,qBAAa,KAAK;IAChB,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,YAAY,EAAE,MAAM,CAAC;IACrC,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAC,CAAe;gBAG7B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM;IASrB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIpC;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqE3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAcpB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;CAIzC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAyF9E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAoF5E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAG7E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAK3G;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
package/dist/proxy.js
CHANGED
|
@@ -48,10 +48,9 @@ const binary_1 = require("./binary");
|
|
|
48
48
|
* Represents a running proxy instance
|
|
49
49
|
*/
|
|
50
50
|
class Proxy {
|
|
51
|
-
constructor(mode, port, inventoryDir,
|
|
51
|
+
constructor(mode, port, inventoryDir, entryUrl, deviceType) {
|
|
52
52
|
this.mode = mode;
|
|
53
53
|
this._port = port;
|
|
54
|
-
this._controlPort = controlPort;
|
|
55
54
|
this.inventoryDir = inventoryDir;
|
|
56
55
|
this.entryUrl = entryUrl;
|
|
57
56
|
this.deviceType = deviceType;
|
|
@@ -62,24 +61,12 @@ class Proxy {
|
|
|
62
61
|
get port() {
|
|
63
62
|
return this._port;
|
|
64
63
|
}
|
|
65
|
-
/**
|
|
66
|
-
* Get the control API port number (if enabled)
|
|
67
|
-
*/
|
|
68
|
-
get controlPort() {
|
|
69
|
-
return this._controlPort;
|
|
70
|
-
}
|
|
71
64
|
/**
|
|
72
65
|
* Update the port number (used internally when OS assigns a port)
|
|
73
66
|
*/
|
|
74
67
|
updatePort(port) {
|
|
75
68
|
this._port = port;
|
|
76
69
|
}
|
|
77
|
-
/**
|
|
78
|
-
* Update the control port number (used internally when OS assigns a port)
|
|
79
|
-
*/
|
|
80
|
-
updateControlPort(controlPort) {
|
|
81
|
-
this._controlPort = controlPort;
|
|
82
|
-
}
|
|
83
70
|
/**
|
|
84
71
|
* Set the child process
|
|
85
72
|
*/
|
|
@@ -88,7 +75,8 @@ class Proxy {
|
|
|
88
75
|
}
|
|
89
76
|
/**
|
|
90
77
|
* Stop the proxy gracefully
|
|
91
|
-
* Sends
|
|
78
|
+
* Sends SIGTERM signal (cross-platform)
|
|
79
|
+
* Node.js automatically converts to appropriate signal on Windows (CTRL_BREAK)
|
|
92
80
|
*/
|
|
93
81
|
async stop() {
|
|
94
82
|
if (!this.process) {
|
|
@@ -99,7 +87,7 @@ class Proxy {
|
|
|
99
87
|
reject(new Error('Proxy is not running'));
|
|
100
88
|
return;
|
|
101
89
|
}
|
|
102
|
-
// Set up timeout
|
|
90
|
+
// Set up timeout for forceful termination
|
|
103
91
|
const timeout = setTimeout(() => {
|
|
104
92
|
if (this.process) {
|
|
105
93
|
this.process.kill('SIGKILL');
|
|
@@ -109,48 +97,46 @@ class Proxy {
|
|
|
109
97
|
// Listen for exit
|
|
110
98
|
this.process.once('exit', (code, signal) => {
|
|
111
99
|
clearTimeout(timeout);
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
if (code === 0 || code === null || signal === 'SIGINT') {
|
|
100
|
+
// Accept clean exits: code 0, SIGTERM, SIGINT
|
|
101
|
+
if (code === 0 || code === null || signal === 'SIGTERM' || signal === 'SIGINT') {
|
|
115
102
|
resolve();
|
|
116
103
|
}
|
|
117
104
|
else {
|
|
118
105
|
reject(new Error(`Proxy exited with code ${code} signal ${signal}`));
|
|
119
106
|
}
|
|
120
107
|
});
|
|
121
|
-
// Send
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
try {
|
|
137
|
-
this.process?.kill('SIGTERM');
|
|
108
|
+
// Send platform-appropriate signal:
|
|
109
|
+
// Unix: SIGTERM (standard kill signal)
|
|
110
|
+
// Windows: Use signal subcommand to send CTRL_BREAK via Windows API
|
|
111
|
+
try {
|
|
112
|
+
if (process.platform === 'win32') {
|
|
113
|
+
// On Windows, use the signal subcommand to send CTRL_BREAK
|
|
114
|
+
// The subcommand uses FreeConsole + AttachConsole + GenerateConsoleCtrlEvent
|
|
115
|
+
// to properly deliver console control events to the target process
|
|
116
|
+
const binaryPath = (0, binary_1.getFullBinaryPath)();
|
|
117
|
+
const { spawnSync } = require('child_process');
|
|
118
|
+
const result = spawnSync(binaryPath, ['signal', '--pid', this.process.pid.toString(), '--kind', 'ctrl-break'], { stdio: 'pipe' });
|
|
119
|
+
if (result.error) {
|
|
120
|
+
clearTimeout(timeout);
|
|
121
|
+
reject(new Error(`Failed to send signal: ${result.error.message}`));
|
|
122
|
+
return;
|
|
138
123
|
}
|
|
139
|
-
|
|
140
|
-
|
|
124
|
+
if (result.status !== 0) {
|
|
125
|
+
clearTimeout(timeout);
|
|
126
|
+
const stderr = result.stderr?.toString() || '';
|
|
127
|
+
reject(new Error(`Signal command failed with exit code ${result.status}: ${stderr}`));
|
|
128
|
+
return;
|
|
141
129
|
}
|
|
142
|
-
});
|
|
143
|
-
req.end();
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
// No control port, use SIGTERM directly
|
|
147
|
-
try {
|
|
148
|
-
this.process.kill('SIGTERM');
|
|
149
130
|
}
|
|
150
|
-
|
|
151
|
-
//
|
|
131
|
+
else {
|
|
132
|
+
// On Unix, use standard SIGTERM
|
|
133
|
+
this.process.kill('SIGTERM');
|
|
152
134
|
}
|
|
153
135
|
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
clearTimeout(timeout);
|
|
138
|
+
reject(err);
|
|
139
|
+
}
|
|
154
140
|
});
|
|
155
141
|
}
|
|
156
142
|
/**
|
|
@@ -192,7 +178,7 @@ class Proxy {
|
|
|
192
178
|
* This is useful after recording is complete
|
|
193
179
|
*/
|
|
194
180
|
async getInventory() {
|
|
195
|
-
const inventoryPath = path.join(this.inventoryDir, '
|
|
181
|
+
const inventoryPath = path.join(this.inventoryDir, 'index.json');
|
|
196
182
|
return loadInventory(inventoryPath);
|
|
197
183
|
}
|
|
198
184
|
}
|
|
@@ -221,11 +207,7 @@ async function startRecording(options) {
|
|
|
221
207
|
args.push('--device', deviceType);
|
|
222
208
|
// Add inventory directory
|
|
223
209
|
args.push('--inventory', inventoryDir);
|
|
224
|
-
//
|
|
225
|
-
const controlPort = options.controlPort;
|
|
226
|
-
if (controlPort !== undefined) {
|
|
227
|
-
args.push('--control-port', controlPort.toString());
|
|
228
|
-
}
|
|
210
|
+
// Note: control-port removed from recording mode - uses signal-based shutdown only
|
|
229
211
|
// Start the process with piped stdout to capture port info
|
|
230
212
|
const spawnOptions = {
|
|
231
213
|
stdio: ['ignore', 'pipe', 'inherit'],
|
|
@@ -235,7 +217,7 @@ async function startRecording(options) {
|
|
|
235
217
|
spawnOptions.windowsVerbatimArguments = false;
|
|
236
218
|
}
|
|
237
219
|
const proc = (0, child_process_1.spawn)(binaryPath, args, spawnOptions);
|
|
238
|
-
const proxy = new Proxy('recording', port, inventoryDir,
|
|
220
|
+
const proxy = new Proxy('recording', port, inventoryDir, options.entryUrl, deviceType);
|
|
239
221
|
proxy.setProcess(proc);
|
|
240
222
|
// Capture stdout to extract actual port number when using port 0
|
|
241
223
|
return new Promise((resolve, reject) => {
|
|
@@ -300,11 +282,6 @@ async function startPlayback(options) {
|
|
|
300
282
|
}
|
|
301
283
|
// Add inventory directory
|
|
302
284
|
args.push('--inventory', inventoryDir);
|
|
303
|
-
// Add control port if specified
|
|
304
|
-
const controlPort = options.controlPort;
|
|
305
|
-
if (controlPort !== undefined) {
|
|
306
|
-
args.push('--control-port', controlPort.toString());
|
|
307
|
-
}
|
|
308
285
|
// Start the process with piped stdout to capture port info
|
|
309
286
|
const spawnOptions = {
|
|
310
287
|
stdio: ['ignore', 'pipe', 'inherit'],
|
|
@@ -314,7 +291,7 @@ async function startPlayback(options) {
|
|
|
314
291
|
spawnOptions.windowsVerbatimArguments = false;
|
|
315
292
|
}
|
|
316
293
|
const proc = (0, child_process_1.spawn)(binaryPath, args, spawnOptions);
|
|
317
|
-
const proxy = new Proxy('playback', port, inventoryDir
|
|
294
|
+
const proxy = new Proxy('playback', port, inventoryDir);
|
|
318
295
|
proxy.setProcess(proc);
|
|
319
296
|
// Capture stdout to extract actual port number when using port 0
|
|
320
297
|
return new Promise((resolve, reject) => {
|
|
@@ -381,9 +358,9 @@ function getResourceContentPath(inventoryDir, resource) {
|
|
|
381
358
|
return path.join(inventoryDir, resource.contentFilePath);
|
|
382
359
|
}
|
|
383
360
|
/**
|
|
384
|
-
* Get the path to the
|
|
361
|
+
* Get the path to the index.json file
|
|
385
362
|
*/
|
|
386
363
|
function getInventoryPath(inventoryDir) {
|
|
387
|
-
return path.join(inventoryDir, '
|
|
364
|
+
return path.join(inventoryDir, 'index.json');
|
|
388
365
|
}
|
|
389
366
|
//# sourceMappingURL=proxy.js.map
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -17,13 +17,14 @@ export interface Resource {
|
|
|
17
17
|
method: string;
|
|
18
18
|
url: string;
|
|
19
19
|
ttfbMs: number;
|
|
20
|
+
durationMs?: number;
|
|
20
21
|
mbps?: number;
|
|
21
22
|
statusCode?: number;
|
|
22
23
|
errorMessage?: string;
|
|
23
24
|
rawHeaders?: HttpHeaders;
|
|
24
25
|
contentEncoding?: ContentEncodingType;
|
|
25
26
|
contentTypeMime?: string;
|
|
26
|
-
|
|
27
|
+
contentCharset?: string;
|
|
27
28
|
contentFilePath?: string;
|
|
28
29
|
contentUtf8?: string;
|
|
29
30
|
contentBase64?: string;
|
|
@@ -45,7 +46,6 @@ export interface RecordingOptions {
|
|
|
45
46
|
port?: number;
|
|
46
47
|
deviceType?: DeviceType;
|
|
47
48
|
inventoryDir?: string;
|
|
48
|
-
controlPort?: number;
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
51
|
* Options for starting a playback proxy
|
|
@@ -53,7 +53,6 @@ export interface RecordingOptions {
|
|
|
53
53
|
export interface PlaybackOptions {
|
|
54
54
|
port?: number;
|
|
55
55
|
inventoryDir?: string;
|
|
56
|
-
controlPort?: number;
|
|
57
56
|
}
|
|
58
57
|
/**
|
|
59
58
|
* Proxy mode
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,UAAU,CAAC;AAEtF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,UAAU,CAAC;AAEtF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rust-http-playback-proxy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "HTTP traffic recording and playback proxy with precise timing control for PageSpeed optimization and performance testing",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -39,12 +39,12 @@
|
|
|
39
39
|
"license": "MIT",
|
|
40
40
|
"repository": {
|
|
41
41
|
"type": "git",
|
|
42
|
-
"url": "https://github.com/
|
|
42
|
+
"url": "https://github.com/ideamans/rust-http-playback-proxy.git",
|
|
43
43
|
"directory": "typescript"
|
|
44
44
|
},
|
|
45
|
-
"homepage": "https://github.com/
|
|
45
|
+
"homepage": "https://github.com/ideamans/rust-http-playback-proxy#readme",
|
|
46
46
|
"bugs": {
|
|
47
|
-
"url": "https://github.com/
|
|
47
|
+
"url": "https://github.com/ideamans/rust-http-playback-proxy/issues"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"tar": "^7.0.0"
|