@limrun/api 0.58.0 → 0.58.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.
- package/CHANGELOG.md +13 -0
- package/destination-tunnel-har.d.mts.map +1 -1
- package/destination-tunnel-har.d.ts.map +1 -1
- package/destination-tunnel-har.js +92 -11
- package/destination-tunnel-har.js.map +1 -1
- package/destination-tunnel-har.mjs +91 -11
- package/destination-tunnel-har.mjs.map +1 -1
- package/package.json +1 -1
- package/src/destination-tunnel-har.ts +106 -11
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.58.1](https://github.com/limrun-inc/typescript-sdk/compare/v0.58.0...v0.58.1) (2026-10-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **tunnel:** decode Content-Encoding before writing HAR bodies ([2a203a0](https://github.com/limrun-inc/typescript-sdk/commit/2a203a0797a8efdc7061c02933ad71372321d317))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Chores
|
|
12
|
+
|
|
13
|
+
* **cli:** pin published SDK 0.58.0 for release ([2497158](https://github.com/limrun-inc/typescript-sdk/commit/249715841fa09129871e820b4df17536062544c1))
|
|
14
|
+
* **cli:** pin SDK 0.58.0 for CLI 0.38.0 release ([c1b1d8a](https://github.com/limrun-inc/typescript-sdk/commit/c1b1d8a8c47401bcc8e9887197bf04f100a1baec))
|
|
15
|
+
|
|
3
16
|
## [0.58.0](https://github.com/limrun-inc/typescript-sdk/compare/v0.57.0...v0.58.0) (2026-10-01)
|
|
4
17
|
|
|
5
18
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destination-tunnel-har.d.mts","sourceRoot":"","sources":["src/destination-tunnel-har.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAkD,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"destination-tunnel-har.d.mts","sourceRoot":"","sources":["src/destination-tunnel-har.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAkD,MAAM,YAAY,CAAC;AAGpG,OAAO,KAAK,EAEV,gCAAgC,EAChC,oCAAoC,EACrC,4CAAwC;AAWzC,MAAM,MAAM,6BAA6B,GAAG,oCAAoC,GAAG;IACjF,mBAAmB,CAAC,EAAE,QAAQ,CAAC;IAC/B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,qBAAqB,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG;IACjD,OAAO,EAAE,6BAA6B,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,qBAAa,6BAA6B;IAG5B,QAAQ,CAAC,SAAS,EAAE,MAAM;IAFtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;gBAExC,SAAS,GAAE,MAAkD;IAMlF,GAAG,CAAC,KAAK,EAAE,gCAAgC,GAAG,yBAAyB,GAAG,SAAS;IA4BnF,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,QAAQ;CAejB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destination-tunnel-har.d.ts","sourceRoot":"","sources":["src/destination-tunnel-har.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAkD,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"destination-tunnel-har.d.ts","sourceRoot":"","sources":["src/destination-tunnel-har.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAkD,MAAM,YAAY,CAAC;AAGpG,OAAO,KAAK,EAEV,gCAAgC,EAChC,oCAAoC,EACrC,2CAAwC;AAWzC,MAAM,MAAM,6BAA6B,GAAG,oCAAoC,GAAG;IACjF,mBAAmB,CAAC,EAAE,QAAQ,CAAC;IAC/B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,qBAAqB,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG;IACjD,OAAO,EAAE,6BAA6B,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,qBAAa,6BAA6B;IAG5B,QAAQ,CAAC,SAAS,EAAE,MAAM;IAFtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;gBAExC,SAAS,GAAE,MAAkD;IAMlF,GAAG,CAAC,KAAK,EAAE,gCAAgC,GAAG,yBAAyB,GAAG,SAAS;IA4BnF,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,QAAQ;CAejB"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DestinationTunnelHARAssembler = void 0;
|
|
4
|
+
const tslib_1 = require("./internal/tslib.js");
|
|
5
|
+
const zlib = tslib_1.__importStar(require("zlib"));
|
|
4
6
|
const destination_tunnel_1 = require("./destination-tunnel.js");
|
|
5
7
|
/**
|
|
6
8
|
* Correlates filesystem-neutral inspection body chunks with completion
|
|
@@ -66,8 +68,10 @@ exports.DestinationTunnelHARAssembler = DestinationTunnelHARAssembler;
|
|
|
66
68
|
function makeDestinationTunnelHAREntry(complete, capture) {
|
|
67
69
|
const requestBody = concatBytes(capture.requestBody, capture.requestBytes);
|
|
68
70
|
const responseBody = concatBytes(capture.responseBody, capture.responseBytes);
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
+
const requestTruncated = complete._limrun.requestBodyTruncated === true || capture.requestTruncated;
|
|
72
|
+
const responseTruncated = complete._limrun.responseBodyTruncated === true || capture.responseTruncated;
|
|
73
|
+
const { request, encoding: requestBodyEncoding } = addRequestBody(complete.request, requestBody, requestTruncated);
|
|
74
|
+
const response = addResponseBody(complete.response, responseBody, responseTruncated);
|
|
71
75
|
return {
|
|
72
76
|
...(complete.pageref === undefined ? {} : { pageref: complete.pageref }),
|
|
73
77
|
startedDateTime: complete.startedDateTime,
|
|
@@ -82,16 +86,16 @@ function makeDestinationTunnelHAREntry(complete, capture) {
|
|
|
82
86
|
_limrun: {
|
|
83
87
|
...complete._limrun,
|
|
84
88
|
...(requestBodyEncoding ? { requestBodyEncoding } : {}),
|
|
85
|
-
requestBodyTruncated:
|
|
86
|
-
responseBodyTruncated:
|
|
89
|
+
requestBodyTruncated: requestTruncated,
|
|
90
|
+
responseBodyTruncated: responseTruncated,
|
|
87
91
|
},
|
|
88
92
|
};
|
|
89
93
|
}
|
|
90
|
-
function addRequestBody(request, body) {
|
|
94
|
+
function addRequestBody(request, body, truncated) {
|
|
91
95
|
if (body.byteLength === 0)
|
|
92
96
|
return { request };
|
|
93
97
|
const mimeType = request.postData?.mimeType ?? headerValue(request.headers, 'content-type');
|
|
94
|
-
const encoded = encodedBody(body, mimeType);
|
|
98
|
+
const encoded = encodedBody(body, mimeType, headerValue(request.headers, 'content-encoding'), truncated);
|
|
95
99
|
return {
|
|
96
100
|
request: {
|
|
97
101
|
...request,
|
|
@@ -103,25 +107,102 @@ function addRequestBody(request, body) {
|
|
|
103
107
|
...(encoded.encoding ? { encoding: encoded.encoding } : {}),
|
|
104
108
|
};
|
|
105
109
|
}
|
|
106
|
-
function addResponseBody(response, body) {
|
|
110
|
+
function addResponseBody(response, body, truncated) {
|
|
107
111
|
if (body.byteLength === 0)
|
|
108
112
|
return response;
|
|
109
113
|
const content = { ...response.content };
|
|
110
114
|
delete content.text;
|
|
111
115
|
delete content.encoding;
|
|
116
|
+
const { decodedSize, ...encoded } = encodedBody(body, response.content.mimeType, headerValue(response.headers, 'content-encoding'), truncated);
|
|
112
117
|
return {
|
|
113
118
|
...response,
|
|
114
119
|
content: {
|
|
115
120
|
...content,
|
|
116
|
-
...
|
|
121
|
+
...(decodedSize === undefined ? {} : { size: decodedSize, compression: decodedSize - body.byteLength }),
|
|
122
|
+
...encoded,
|
|
117
123
|
},
|
|
118
124
|
};
|
|
119
125
|
}
|
|
120
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Renders a captured body as HAR text. Content-Encoding is undone first so
|
|
128
|
+
* the HAR holds the decoded body, as HAR 1.2 and browser exports do. Anything
|
|
129
|
+
* that cannot be represented losslessly as UTF-8 text (unknown or corrupt
|
|
130
|
+
* encodings, truncated compressed bodies, non-UTF-8 bytes under a textual
|
|
131
|
+
* type) falls back to base64 of the bytes rather than lossy text.
|
|
132
|
+
*
|
|
133
|
+
* `decodedSize` is set only when a Content-Encoding was successfully removed.
|
|
134
|
+
*/
|
|
135
|
+
function encodedBody(body, contentType, contentEncoding, truncated) {
|
|
136
|
+
let decoded = body;
|
|
137
|
+
let decodedSize;
|
|
138
|
+
const codings = parseContentEncoding(contentEncoding);
|
|
139
|
+
if (codings.length > 0) {
|
|
140
|
+
// A truncated stream cannot be decoded reliably (zstd, for one, returns
|
|
141
|
+
// partial output without an error), so keep the raw bytes.
|
|
142
|
+
if (truncated)
|
|
143
|
+
return { text: bytesToBase64(body), encoding: 'base64' };
|
|
144
|
+
try {
|
|
145
|
+
decoded = decodeContentCodings(body, codings);
|
|
146
|
+
decodedSize = decoded.byteLength;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return { text: bytesToBase64(body), encoding: 'base64' };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const sized = decodedSize === undefined ? {} : { decodedSize };
|
|
121
153
|
if (isTextualContentType(contentType)) {
|
|
122
|
-
|
|
154
|
+
try {
|
|
155
|
+
return { text: new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(decoded), ...sized };
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Not valid UTF-8; fall through to base64.
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return { text: bytesToBase64(decoded), encoding: 'base64', ...sized };
|
|
162
|
+
}
|
|
163
|
+
// Guards against decompression bombs; larger bodies fall back to base64 of the raw bytes.
|
|
164
|
+
const MAX_DECODED_BODY_BYTES = 64 * 1024 * 1024;
|
|
165
|
+
function parseContentEncoding(contentEncoding) {
|
|
166
|
+
return (contentEncoding ?? '')
|
|
167
|
+
.split(',')
|
|
168
|
+
.map((coding) => coding.trim().toLowerCase())
|
|
169
|
+
.filter((coding) => coding !== '' && coding !== 'identity');
|
|
170
|
+
}
|
|
171
|
+
/** Undoes codings in reverse of the order they were applied. Throws on unknown or corrupt input. */
|
|
172
|
+
function decodeContentCodings(body, codings) {
|
|
173
|
+
const options = { maxOutputLength: MAX_DECODED_BODY_BYTES };
|
|
174
|
+
let data = body;
|
|
175
|
+
for (const coding of [...codings].reverse()) {
|
|
176
|
+
switch (coding) {
|
|
177
|
+
case 'gzip':
|
|
178
|
+
case 'x-gzip':
|
|
179
|
+
data = zlib.gunzipSync(data, options);
|
|
180
|
+
break;
|
|
181
|
+
case 'deflate':
|
|
182
|
+
// Servers send both zlib-wrapped (per spec) and raw deflate streams.
|
|
183
|
+
try {
|
|
184
|
+
data = zlib.inflateSync(data, options);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
data = zlib.inflateRawSync(data, options);
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
case 'br':
|
|
191
|
+
data = zlib.brotliDecompressSync(data, options);
|
|
192
|
+
break;
|
|
193
|
+
case 'zstd': {
|
|
194
|
+
// Available from Node 22.15 / 23.8.
|
|
195
|
+
const zstdDecompressSync = zlib.zstdDecompressSync;
|
|
196
|
+
if (!zstdDecompressSync)
|
|
197
|
+
throw new Error('zstd decompression is not supported by this Node.js');
|
|
198
|
+
data = zstdDecompressSync(data, options);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
default:
|
|
202
|
+
throw new Error(`Unsupported content encoding: ${coding}`);
|
|
203
|
+
}
|
|
123
204
|
}
|
|
124
|
-
return
|
|
205
|
+
return data;
|
|
125
206
|
}
|
|
126
207
|
function isTextualContentType(contentType) {
|
|
127
208
|
const mimeType = contentType?.split(';', 1)[0]?.trim().toLowerCase() ?? '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destination-tunnel-har.js","sourceRoot":"","sources":["src/destination-tunnel-har.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"destination-tunnel-har.js","sourceRoot":"","sources":["src/destination-tunnel-har.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as zlib from 'zlib';
|
|
1
2
|
import { DESTINATION_TUNNEL_DEFAULT_MAX_BODY_BYTES } from "./destination-tunnel.mjs";
|
|
2
3
|
/**
|
|
3
4
|
* Correlates filesystem-neutral inspection body chunks with completion
|
|
@@ -62,8 +63,10 @@ export class DestinationTunnelHARAssembler {
|
|
|
62
63
|
function makeDestinationTunnelHAREntry(complete, capture) {
|
|
63
64
|
const requestBody = concatBytes(capture.requestBody, capture.requestBytes);
|
|
64
65
|
const responseBody = concatBytes(capture.responseBody, capture.responseBytes);
|
|
65
|
-
const
|
|
66
|
-
const
|
|
66
|
+
const requestTruncated = complete._limrun.requestBodyTruncated === true || capture.requestTruncated;
|
|
67
|
+
const responseTruncated = complete._limrun.responseBodyTruncated === true || capture.responseTruncated;
|
|
68
|
+
const { request, encoding: requestBodyEncoding } = addRequestBody(complete.request, requestBody, requestTruncated);
|
|
69
|
+
const response = addResponseBody(complete.response, responseBody, responseTruncated);
|
|
67
70
|
return {
|
|
68
71
|
...(complete.pageref === undefined ? {} : { pageref: complete.pageref }),
|
|
69
72
|
startedDateTime: complete.startedDateTime,
|
|
@@ -78,16 +81,16 @@ function makeDestinationTunnelHAREntry(complete, capture) {
|
|
|
78
81
|
_limrun: {
|
|
79
82
|
...complete._limrun,
|
|
80
83
|
...(requestBodyEncoding ? { requestBodyEncoding } : {}),
|
|
81
|
-
requestBodyTruncated:
|
|
82
|
-
responseBodyTruncated:
|
|
84
|
+
requestBodyTruncated: requestTruncated,
|
|
85
|
+
responseBodyTruncated: responseTruncated,
|
|
83
86
|
},
|
|
84
87
|
};
|
|
85
88
|
}
|
|
86
|
-
function addRequestBody(request, body) {
|
|
89
|
+
function addRequestBody(request, body, truncated) {
|
|
87
90
|
if (body.byteLength === 0)
|
|
88
91
|
return { request };
|
|
89
92
|
const mimeType = request.postData?.mimeType ?? headerValue(request.headers, 'content-type');
|
|
90
|
-
const encoded = encodedBody(body, mimeType);
|
|
93
|
+
const encoded = encodedBody(body, mimeType, headerValue(request.headers, 'content-encoding'), truncated);
|
|
91
94
|
return {
|
|
92
95
|
request: {
|
|
93
96
|
...request,
|
|
@@ -99,25 +102,102 @@ function addRequestBody(request, body) {
|
|
|
99
102
|
...(encoded.encoding ? { encoding: encoded.encoding } : {}),
|
|
100
103
|
};
|
|
101
104
|
}
|
|
102
|
-
function addResponseBody(response, body) {
|
|
105
|
+
function addResponseBody(response, body, truncated) {
|
|
103
106
|
if (body.byteLength === 0)
|
|
104
107
|
return response;
|
|
105
108
|
const content = { ...response.content };
|
|
106
109
|
delete content.text;
|
|
107
110
|
delete content.encoding;
|
|
111
|
+
const { decodedSize, ...encoded } = encodedBody(body, response.content.mimeType, headerValue(response.headers, 'content-encoding'), truncated);
|
|
108
112
|
return {
|
|
109
113
|
...response,
|
|
110
114
|
content: {
|
|
111
115
|
...content,
|
|
112
|
-
...
|
|
116
|
+
...(decodedSize === undefined ? {} : { size: decodedSize, compression: decodedSize - body.byteLength }),
|
|
117
|
+
...encoded,
|
|
113
118
|
},
|
|
114
119
|
};
|
|
115
120
|
}
|
|
116
|
-
|
|
121
|
+
/**
|
|
122
|
+
* Renders a captured body as HAR text. Content-Encoding is undone first so
|
|
123
|
+
* the HAR holds the decoded body, as HAR 1.2 and browser exports do. Anything
|
|
124
|
+
* that cannot be represented losslessly as UTF-8 text (unknown or corrupt
|
|
125
|
+
* encodings, truncated compressed bodies, non-UTF-8 bytes under a textual
|
|
126
|
+
* type) falls back to base64 of the bytes rather than lossy text.
|
|
127
|
+
*
|
|
128
|
+
* `decodedSize` is set only when a Content-Encoding was successfully removed.
|
|
129
|
+
*/
|
|
130
|
+
function encodedBody(body, contentType, contentEncoding, truncated) {
|
|
131
|
+
let decoded = body;
|
|
132
|
+
let decodedSize;
|
|
133
|
+
const codings = parseContentEncoding(contentEncoding);
|
|
134
|
+
if (codings.length > 0) {
|
|
135
|
+
// A truncated stream cannot be decoded reliably (zstd, for one, returns
|
|
136
|
+
// partial output without an error), so keep the raw bytes.
|
|
137
|
+
if (truncated)
|
|
138
|
+
return { text: bytesToBase64(body), encoding: 'base64' };
|
|
139
|
+
try {
|
|
140
|
+
decoded = decodeContentCodings(body, codings);
|
|
141
|
+
decodedSize = decoded.byteLength;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return { text: bytesToBase64(body), encoding: 'base64' };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const sized = decodedSize === undefined ? {} : { decodedSize };
|
|
117
148
|
if (isTextualContentType(contentType)) {
|
|
118
|
-
|
|
149
|
+
try {
|
|
150
|
+
return { text: new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(decoded), ...sized };
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Not valid UTF-8; fall through to base64.
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return { text: bytesToBase64(decoded), encoding: 'base64', ...sized };
|
|
157
|
+
}
|
|
158
|
+
// Guards against decompression bombs; larger bodies fall back to base64 of the raw bytes.
|
|
159
|
+
const MAX_DECODED_BODY_BYTES = 64 * 1024 * 1024;
|
|
160
|
+
function parseContentEncoding(contentEncoding) {
|
|
161
|
+
return (contentEncoding ?? '')
|
|
162
|
+
.split(',')
|
|
163
|
+
.map((coding) => coding.trim().toLowerCase())
|
|
164
|
+
.filter((coding) => coding !== '' && coding !== 'identity');
|
|
165
|
+
}
|
|
166
|
+
/** Undoes codings in reverse of the order they were applied. Throws on unknown or corrupt input. */
|
|
167
|
+
function decodeContentCodings(body, codings) {
|
|
168
|
+
const options = { maxOutputLength: MAX_DECODED_BODY_BYTES };
|
|
169
|
+
let data = body;
|
|
170
|
+
for (const coding of [...codings].reverse()) {
|
|
171
|
+
switch (coding) {
|
|
172
|
+
case 'gzip':
|
|
173
|
+
case 'x-gzip':
|
|
174
|
+
data = zlib.gunzipSync(data, options);
|
|
175
|
+
break;
|
|
176
|
+
case 'deflate':
|
|
177
|
+
// Servers send both zlib-wrapped (per spec) and raw deflate streams.
|
|
178
|
+
try {
|
|
179
|
+
data = zlib.inflateSync(data, options);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
data = zlib.inflateRawSync(data, options);
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
case 'br':
|
|
186
|
+
data = zlib.brotliDecompressSync(data, options);
|
|
187
|
+
break;
|
|
188
|
+
case 'zstd': {
|
|
189
|
+
// Available from Node 22.15 / 23.8.
|
|
190
|
+
const zstdDecompressSync = zlib.zstdDecompressSync;
|
|
191
|
+
if (!zstdDecompressSync)
|
|
192
|
+
throw new Error('zstd decompression is not supported by this Node.js');
|
|
193
|
+
data = zstdDecompressSync(data, options);
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
default:
|
|
197
|
+
throw new Error(`Unsupported content encoding: ${coding}`);
|
|
198
|
+
}
|
|
119
199
|
}
|
|
120
|
-
return
|
|
200
|
+
return data;
|
|
121
201
|
}
|
|
122
202
|
function isTextualContentType(contentType) {
|
|
123
203
|
const mimeType = contentType?.split(';', 1)[0]?.trim().toLowerCase() ?? '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destination-tunnel-har.mjs","sourceRoot":"","sources":["src/destination-tunnel-har.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"destination-tunnel-har.mjs","sourceRoot":"","sources":["src/destination-tunnel-har.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Entry as HAREntry, Request as HARRequest, Response as HARResponse } from 'har-format';
|
|
2
|
+
import * as zlib from 'zlib';
|
|
2
3
|
import { DESTINATION_TUNNEL_DEFAULT_MAX_BODY_BYTES } from './destination-tunnel';
|
|
3
4
|
import type {
|
|
4
5
|
DestinationTunnelInspectionComplete,
|
|
@@ -93,8 +94,14 @@ function makeDestinationTunnelHAREntry(
|
|
|
93
94
|
): DestinationTunnelHAREntry {
|
|
94
95
|
const requestBody = concatBytes(capture.requestBody, capture.requestBytes);
|
|
95
96
|
const responseBody = concatBytes(capture.responseBody, capture.responseBytes);
|
|
96
|
-
const
|
|
97
|
-
const
|
|
97
|
+
const requestTruncated = complete._limrun.requestBodyTruncated === true || capture.requestTruncated;
|
|
98
|
+
const responseTruncated = complete._limrun.responseBodyTruncated === true || capture.responseTruncated;
|
|
99
|
+
const { request, encoding: requestBodyEncoding } = addRequestBody(
|
|
100
|
+
complete.request,
|
|
101
|
+
requestBody,
|
|
102
|
+
requestTruncated,
|
|
103
|
+
);
|
|
104
|
+
const response = addResponseBody(complete.response, responseBody, responseTruncated);
|
|
98
105
|
return {
|
|
99
106
|
...(complete.pageref === undefined ? {} : { pageref: complete.pageref }),
|
|
100
107
|
startedDateTime: complete.startedDateTime,
|
|
@@ -109,16 +116,20 @@ function makeDestinationTunnelHAREntry(
|
|
|
109
116
|
_limrun: {
|
|
110
117
|
...complete._limrun,
|
|
111
118
|
...(requestBodyEncoding ? { requestBodyEncoding } : {}),
|
|
112
|
-
requestBodyTruncated:
|
|
113
|
-
responseBodyTruncated:
|
|
119
|
+
requestBodyTruncated: requestTruncated,
|
|
120
|
+
responseBodyTruncated: responseTruncated,
|
|
114
121
|
},
|
|
115
122
|
};
|
|
116
123
|
}
|
|
117
124
|
|
|
118
|
-
function addRequestBody(
|
|
125
|
+
function addRequestBody(
|
|
126
|
+
request: HARRequest,
|
|
127
|
+
body: Uint8Array,
|
|
128
|
+
truncated: boolean,
|
|
129
|
+
): { request: HARRequest; encoding?: 'base64' } {
|
|
119
130
|
if (body.byteLength === 0) return { request };
|
|
120
131
|
const mimeType = request.postData?.mimeType ?? headerValue(request.headers, 'content-type');
|
|
121
|
-
const encoded = encodedBody(body, mimeType);
|
|
132
|
+
const encoded = encodedBody(body, mimeType, headerValue(request.headers, 'content-encoding'), truncated);
|
|
122
133
|
return {
|
|
123
134
|
request: {
|
|
124
135
|
...request,
|
|
@@ -131,28 +142,112 @@ function addRequestBody(request: HARRequest, body: Uint8Array): { request: HARRe
|
|
|
131
142
|
};
|
|
132
143
|
}
|
|
133
144
|
|
|
134
|
-
function addResponseBody(response: HARResponse, body: Uint8Array): HARResponse {
|
|
145
|
+
function addResponseBody(response: HARResponse, body: Uint8Array, truncated: boolean): HARResponse {
|
|
135
146
|
if (body.byteLength === 0) return response;
|
|
136
147
|
const content = { ...response.content };
|
|
137
148
|
delete content.text;
|
|
138
149
|
delete content.encoding;
|
|
150
|
+
const { decodedSize, ...encoded } = encodedBody(
|
|
151
|
+
body,
|
|
152
|
+
response.content.mimeType,
|
|
153
|
+
headerValue(response.headers, 'content-encoding'),
|
|
154
|
+
truncated,
|
|
155
|
+
);
|
|
139
156
|
return {
|
|
140
157
|
...response,
|
|
141
158
|
content: {
|
|
142
159
|
...content,
|
|
143
|
-
...
|
|
160
|
+
...(decodedSize === undefined ? {} : { size: decodedSize, compression: decodedSize - body.byteLength }),
|
|
161
|
+
...encoded,
|
|
144
162
|
},
|
|
145
163
|
};
|
|
146
164
|
}
|
|
147
165
|
|
|
166
|
+
/**
|
|
167
|
+
* Renders a captured body as HAR text. Content-Encoding is undone first so
|
|
168
|
+
* the HAR holds the decoded body, as HAR 1.2 and browser exports do. Anything
|
|
169
|
+
* that cannot be represented losslessly as UTF-8 text (unknown or corrupt
|
|
170
|
+
* encodings, truncated compressed bodies, non-UTF-8 bytes under a textual
|
|
171
|
+
* type) falls back to base64 of the bytes rather than lossy text.
|
|
172
|
+
*
|
|
173
|
+
* `decodedSize` is set only when a Content-Encoding was successfully removed.
|
|
174
|
+
*/
|
|
148
175
|
function encodedBody(
|
|
149
176
|
body: Uint8Array,
|
|
150
177
|
contentType: string | undefined,
|
|
151
|
-
|
|
178
|
+
contentEncoding: string | undefined,
|
|
179
|
+
truncated: boolean,
|
|
180
|
+
): { text: string; encoding?: 'base64'; decodedSize?: number } {
|
|
181
|
+
let decoded = body;
|
|
182
|
+
let decodedSize: number | undefined;
|
|
183
|
+
const codings = parseContentEncoding(contentEncoding);
|
|
184
|
+
if (codings.length > 0) {
|
|
185
|
+
// A truncated stream cannot be decoded reliably (zstd, for one, returns
|
|
186
|
+
// partial output without an error), so keep the raw bytes.
|
|
187
|
+
if (truncated) return { text: bytesToBase64(body), encoding: 'base64' };
|
|
188
|
+
try {
|
|
189
|
+
decoded = decodeContentCodings(body, codings);
|
|
190
|
+
decodedSize = decoded.byteLength;
|
|
191
|
+
} catch {
|
|
192
|
+
return { text: bytesToBase64(body), encoding: 'base64' };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const sized = decodedSize === undefined ? {} : { decodedSize };
|
|
152
196
|
if (isTextualContentType(contentType)) {
|
|
153
|
-
|
|
197
|
+
try {
|
|
198
|
+
return { text: new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(decoded), ...sized };
|
|
199
|
+
} catch {
|
|
200
|
+
// Not valid UTF-8; fall through to base64.
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return { text: bytesToBase64(decoded), encoding: 'base64', ...sized };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Guards against decompression bombs; larger bodies fall back to base64 of the raw bytes.
|
|
207
|
+
const MAX_DECODED_BODY_BYTES = 64 * 1024 * 1024;
|
|
208
|
+
|
|
209
|
+
function parseContentEncoding(contentEncoding: string | undefined): string[] {
|
|
210
|
+
return (contentEncoding ?? '')
|
|
211
|
+
.split(',')
|
|
212
|
+
.map((coding) => coding.trim().toLowerCase())
|
|
213
|
+
.filter((coding) => coding !== '' && coding !== 'identity');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** Undoes codings in reverse of the order they were applied. Throws on unknown or corrupt input. */
|
|
217
|
+
function decodeContentCodings(body: Uint8Array, codings: string[]): Uint8Array {
|
|
218
|
+
const options = { maxOutputLength: MAX_DECODED_BODY_BYTES };
|
|
219
|
+
let data: Uint8Array = body;
|
|
220
|
+
for (const coding of [...codings].reverse()) {
|
|
221
|
+
switch (coding) {
|
|
222
|
+
case 'gzip':
|
|
223
|
+
case 'x-gzip':
|
|
224
|
+
data = zlib.gunzipSync(data, options);
|
|
225
|
+
break;
|
|
226
|
+
case 'deflate':
|
|
227
|
+
// Servers send both zlib-wrapped (per spec) and raw deflate streams.
|
|
228
|
+
try {
|
|
229
|
+
data = zlib.inflateSync(data, options);
|
|
230
|
+
} catch {
|
|
231
|
+
data = zlib.inflateRawSync(data, options);
|
|
232
|
+
}
|
|
233
|
+
break;
|
|
234
|
+
case 'br':
|
|
235
|
+
data = zlib.brotliDecompressSync(data, options);
|
|
236
|
+
break;
|
|
237
|
+
case 'zstd': {
|
|
238
|
+
// Available from Node 22.15 / 23.8.
|
|
239
|
+
const zstdDecompressSync = (zlib as any).zstdDecompressSync as
|
|
240
|
+
| ((buffer: Uint8Array, options?: object) => Buffer)
|
|
241
|
+
| undefined;
|
|
242
|
+
if (!zstdDecompressSync) throw new Error('zstd decompression is not supported by this Node.js');
|
|
243
|
+
data = zstdDecompressSync(data, options);
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
default:
|
|
247
|
+
throw new Error(`Unsupported content encoding: ${coding}`);
|
|
248
|
+
}
|
|
154
249
|
}
|
|
155
|
-
return
|
|
250
|
+
return data;
|
|
156
251
|
}
|
|
157
252
|
|
|
158
253
|
function isTextualContentType(contentType: string | undefined): boolean {
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = '0.58.
|
|
1
|
+
export const VERSION = '0.58.1'; // x-release-please-version
|
package/version.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.58.
|
|
1
|
+
export declare const VERSION = "0.58.1";
|
|
2
2
|
//# sourceMappingURL=version.d.mts.map
|
package/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.58.
|
|
1
|
+
export declare const VERSION = "0.58.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/version.js
CHANGED
package/version.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = '0.58.
|
|
1
|
+
export const VERSION = '0.58.1'; // x-release-please-version
|
|
2
2
|
//# sourceMappingURL=version.mjs.map
|