snyk-broker 5.22.14 → 5.23.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/dist/lib/hybrid-sdk/LegacyStreamResponseHandler.js +92 -30
- package/dist/lib/hybrid-sdk/LegacyStreamResponseHandler.js.map +1 -1
- package/dist/lib/hybrid-sdk/client/metrics/otelClient.js +21 -27
- package/dist/lib/hybrid-sdk/client/metrics/otelClient.js.map +1 -1
- package/dist/lib/hybrid-sdk/clientRequestHelpers.js +9 -15
- package/dist/lib/hybrid-sdk/clientRequestHelpers.js.map +1 -1
- package/dist/lib/hybrid-sdk/common/metrics/otel.js +43 -1
- package/dist/lib/hybrid-sdk/common/metrics/otel.js.map +1 -1
- package/dist/lib/hybrid-sdk/http/response-frame-decoder.js +144 -0
- package/dist/lib/hybrid-sdk/http/response-frame-decoder.js.map +1 -0
- package/dist/lib/hybrid-sdk/http/server-post-stream-handler.js +186 -44
- package/dist/lib/hybrid-sdk/http/server-post-stream-handler.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/index.js +6 -1
- package/dist/lib/hybrid-sdk/server/index.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/metrics/otelClient.js +23 -0
- package/dist/lib/hybrid-sdk/server/metrics/otelClient.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/routesHandlers/postResponseHandler.js +64 -125
- package/dist/lib/hybrid-sdk/server/routesHandlers/postResponseHandler.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/socketHandlers/connectionHandler.js +17 -1
- package/dist/lib/hybrid-sdk/server/socketHandlers/connectionHandler.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/socketHandlers/identifyHandler.js +5 -4
- package/dist/lib/hybrid-sdk/server/socketHandlers/identifyHandler.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,43 +1,105 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.legacyStreamResponseHandler = void 0;
|
|
4
|
-
const
|
|
4
|
+
const stream_1 = require("stream");
|
|
5
|
+
const promises_1 = require("stream/promises");
|
|
5
6
|
const logger_1 = require("../logs/logger");
|
|
6
|
-
const
|
|
7
|
+
const server_post_stream_handler_1 = require("./http/server-post-stream-handler");
|
|
8
|
+
const token_1 = require("./server/utils/token");
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
10
|
+
* Adapts the callback-based websocket chunk protocol to a claimed response.
|
|
11
|
+
*
|
|
12
|
+
* The PassThrough is a source owned only by this legacy delivery. The actual
|
|
13
|
+
* HTTP response remains in pipeline(), so its backpressure, errors and final
|
|
14
|
+
* completion are included in the delivery lifecycle.
|
|
15
|
+
*/
|
|
16
|
+
class LegacyResponseDelivery {
|
|
17
|
+
constructor(pending, logContext, onSettled) {
|
|
18
|
+
this.pending = pending;
|
|
19
|
+
this.logContext = logContext;
|
|
20
|
+
this.source = new stream_1.PassThrough({ highWaterMark: 1024 * 1024 });
|
|
21
|
+
this.bodyBytes = 0;
|
|
22
|
+
this.ended = false;
|
|
23
|
+
void (0, promises_1.pipeline)(this.source, pending.destination)
|
|
24
|
+
.then(() => pending.complete(this.bodyBytes))
|
|
25
|
+
.catch((error) => {
|
|
26
|
+
pending.cancel(error);
|
|
27
|
+
logger_1.log.error({ ...this.logContext, error }, 'Failed forwarding legacy websocket response stream.');
|
|
28
|
+
})
|
|
29
|
+
.finally(onSettled);
|
|
30
|
+
}
|
|
31
|
+
write(chunk, finished, metadata) {
|
|
32
|
+
if (this.ended) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
if (metadata) {
|
|
37
|
+
this.pending.applyMetadata(metadata);
|
|
32
38
|
}
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
if (chunk) {
|
|
40
|
+
// Preserve the legacy receiver metric semantics for string chunks.
|
|
41
|
+
this.bodyBytes += chunk.length;
|
|
42
|
+
// The legacy event contract has no acknowledgement with which to
|
|
43
|
+
// propagate drain. PassThrough preserves its buffering boundary while
|
|
44
|
+
// pipeline coordinates the readable side and the real destination.
|
|
45
|
+
this.source.write(chunk);
|
|
35
46
|
}
|
|
47
|
+
if (finished) {
|
|
48
|
+
this.ended = true;
|
|
49
|
+
this.source.end();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
this.ended = true;
|
|
54
|
+
this.source.destroy(error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
cancel(error) {
|
|
58
|
+
if (this.ended) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.ended = true;
|
|
62
|
+
this.source.destroy(error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const legacyStreamResponseHandler = (token, registry = server_post_stream_handler_1.pendingResponseRegistry) => {
|
|
66
|
+
const deliveries = new Map();
|
|
67
|
+
let disposed = false;
|
|
68
|
+
const handleChunk = (streamingID, chunk, finished, metadata) => {
|
|
69
|
+
if (disposed) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
let delivery = deliveries.get(streamingID);
|
|
73
|
+
if (!delivery) {
|
|
74
|
+
const claim = registry.claim(streamingID, {
|
|
75
|
+
legacyConnectionIdentifier: token,
|
|
76
|
+
enforceLegacyOwnership: true,
|
|
77
|
+
});
|
|
78
|
+
if (claim.status !== 'claimed') {
|
|
79
|
+
const { maskedToken, hashedToken } = (0, token_1.getDesensitizedToken)(token);
|
|
80
|
+
logger_1.log.warn({
|
|
81
|
+
streamingID,
|
|
82
|
+
claimStatus: claim.status,
|
|
83
|
+
maskedToken,
|
|
84
|
+
hashedToken,
|
|
85
|
+
}, 'Trying to write into a closed or claimed stream.');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
delivery = new LegacyResponseDelivery(claim.pending, { streamingID }, () => deliveries.delete(streamingID));
|
|
89
|
+
deliveries.set(streamingID, delivery);
|
|
90
|
+
}
|
|
91
|
+
delivery.write(chunk, finished, metadata);
|
|
92
|
+
};
|
|
93
|
+
handleChunk.dispose = (error) => {
|
|
94
|
+
if (disposed) {
|
|
95
|
+
return;
|
|
36
96
|
}
|
|
37
|
-
|
|
38
|
-
|
|
97
|
+
disposed = true;
|
|
98
|
+
for (const delivery of deliveries.values()) {
|
|
99
|
+
delivery.cancel(error);
|
|
39
100
|
}
|
|
40
101
|
};
|
|
102
|
+
return handleChunk;
|
|
41
103
|
};
|
|
42
104
|
exports.legacyStreamResponseHandler = legacyStreamResponseHandler;
|
|
43
105
|
//# sourceMappingURL=LegacyStreamResponseHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegacyStreamResponseHandler.js","sourceRoot":"","sources":["../../../lib/hybrid-sdk/LegacyStreamResponseHandler.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"LegacyStreamResponseHandler.js","sourceRoot":"","sources":["../../../lib/hybrid-sdk/LegacyStreamResponseHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,16 +4,17 @@ exports.OtelClient = void 0;
|
|
|
4
4
|
const api_1 = require("@opentelemetry/api");
|
|
5
5
|
const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
6
6
|
const instrumentation_runtime_node_1 = require("@opentelemetry/instrumentation-runtime-node");
|
|
7
|
-
const sdk_metrics_1 = require("@opentelemetry/sdk-metrics");
|
|
8
7
|
const otel_1 = require("../../common/metrics/otel");
|
|
8
|
+
const logger_1 = require("../../../logs/logger");
|
|
9
9
|
const telemetry_1 = require("../../common/types/telemetry");
|
|
10
10
|
/**
|
|
11
11
|
* Client implementation backed by OpenTelemetry.
|
|
12
12
|
* Exports metrics to an OTLP/gRPC endpoint using delta temporality.
|
|
13
13
|
*
|
|
14
|
-
* Automatically registers
|
|
15
|
-
* RuntimeNodeInstrumentation
|
|
16
|
-
*
|
|
14
|
+
* Automatically registers a selected subset of Node.js runtime metrics via
|
|
15
|
+
* RuntimeNodeInstrumentation — event loop delay (max and p99), event loop
|
|
16
|
+
* utilization, and GC duration — each renamed under the 'broker.' prefix for
|
|
17
|
+
* pipeline compatibility. Other runtime metrics are filtered out.
|
|
17
18
|
*
|
|
18
19
|
* For non-Kubernetes environments, container metrics (CPU, memory, network I/O)
|
|
19
20
|
* are already provided by the infrastructure via cAdvisor.
|
|
@@ -27,28 +28,21 @@ class OtelClient {
|
|
|
27
28
|
otelExportIntervalMs: config.exportIntervalMs,
|
|
28
29
|
}, {
|
|
29
30
|
reader: config.reader,
|
|
30
|
-
views:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
],
|
|
46
|
-
});
|
|
47
|
-
this.runtimeInstrumentation = new instrumentation_runtime_node_1.RuntimeNodeInstrumentation();
|
|
48
|
-
(0, instrumentation_1.registerInstrumentations)({
|
|
49
|
-
meterProvider: this.meterProvider,
|
|
50
|
-
instrumentations: [this.runtimeInstrumentation],
|
|
51
|
-
});
|
|
31
|
+
views: otel_1.RUNTIME_NODE_VIEWS,
|
|
32
|
+
});
|
|
33
|
+
// Guarded because a throw here propagates to index.ts, which exits the
|
|
34
|
+
// process: RuntimeNodeInstrumentation reaches into perf_hooks and v8, so a
|
|
35
|
+
// failure must cost the diagnostic metrics rather than the broker.
|
|
36
|
+
try {
|
|
37
|
+
this.runtimeInstrumentation = new instrumentation_runtime_node_1.RuntimeNodeInstrumentation();
|
|
38
|
+
(0, instrumentation_1.registerInstrumentations)({
|
|
39
|
+
meterProvider: this.meterProvider,
|
|
40
|
+
instrumentations: [this.runtimeInstrumentation],
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
logger_1.log.warn({ err }, 'Failed to register Node.js runtime instrumentation; runtime metrics will not be reported.');
|
|
45
|
+
}
|
|
52
46
|
const meter = this.meterProvider.getMeter('broker-client');
|
|
53
47
|
// --- Process Health ---
|
|
54
48
|
this.brokerClientInitializedCounter = meter.createCounter('broker.client.initialized', {
|
|
@@ -149,7 +143,7 @@ class OtelClient {
|
|
|
149
143
|
await this.meterProvider.forceFlush();
|
|
150
144
|
}
|
|
151
145
|
async shutdown() {
|
|
152
|
-
this.runtimeInstrumentation
|
|
146
|
+
this.runtimeInstrumentation?.disable();
|
|
153
147
|
await this.meterProvider.shutdown();
|
|
154
148
|
}
|
|
155
149
|
// --- Process Health ---
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otelClient.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/client/metrics/otelClient.ts"],"names":[],"mappings":";;;AAAA,4CAM4B;AAC5B,oEAA0E;AAC1E,8FAAyF;
|
|
1
|
+
{"version":3,"file":"otelClient.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/client/metrics/otelClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,6 @@ const config_1 = require("./common/config/config");
|
|
|
9
9
|
const metrics_1 = require("./common/utils/metrics");
|
|
10
10
|
const undefsafe_1 = __importDefault(require("undefsafe"));
|
|
11
11
|
const uuid_1 = require("./common/utils/uuid");
|
|
12
|
-
const stream_1 = __importDefault(require("stream"));
|
|
13
12
|
const server_post_stream_handler_1 = require("./http/server-post-stream-handler");
|
|
14
13
|
const token_1 = require("./common/utils/token");
|
|
15
14
|
const request_1 = require("./http/request");
|
|
@@ -42,26 +41,21 @@ class HybridClientRequestHandler {
|
|
|
42
41
|
}
|
|
43
42
|
makeWebsocketRequestWithStreamingResponse() {
|
|
44
43
|
const streamingID = (0, uuid_1.uuidv4)();
|
|
45
|
-
const streamBuffer = new stream_1.default.PassThrough({ highWaterMark: 1048576 });
|
|
46
|
-
streamBuffer.on('error', (error) => {
|
|
47
|
-
// This may be a duplicate error, as the most likely cause of this is the POST handler calling destroy.
|
|
48
|
-
logger_1.log.error({
|
|
49
|
-
...this.logContext,
|
|
50
|
-
error,
|
|
51
|
-
stackTrace: new Error('stacktrace generator').stack,
|
|
52
|
-
}, '[HTTP Flow][Relay] Error piping POST response stream through to HTTP response');
|
|
53
|
-
this.res.destroy(error);
|
|
54
|
-
});
|
|
55
44
|
this.logContext.streamingID = streamingID;
|
|
56
45
|
logger_1.log.debug(this.logContext, '[HTTP Flow][Relay] Sending request over websocket connection expecting POST stream response');
|
|
57
|
-
server_post_stream_handler_1.
|
|
46
|
+
const registration = server_post_stream_handler_1.pendingResponseRegistry.register(streamingID, {
|
|
58
47
|
response: this.res,
|
|
59
|
-
streamBuffer,
|
|
60
|
-
streamSize: 0,
|
|
61
48
|
brokerAppClientId: this.res.locals.brokerAppClientId ?? null,
|
|
49
|
+
legacyConnectionIdentifier: this.req.params?.token ??
|
|
50
|
+
(this.options.universalBrokerEnabled
|
|
51
|
+
? this.res.locals.websocket.identifier
|
|
52
|
+
: this.options.brokerToken),
|
|
62
53
|
});
|
|
54
|
+
if (registration.status === 'destination-unavailable') {
|
|
55
|
+
logger_1.log.debug(this.logContext, '[HTTP Flow][Relay] Requester disconnected before POST stream registration.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
63
58
|
this.res.setHeader('snyk-request-id', this.req.requestId);
|
|
64
|
-
streamBuffer.pipe(this.res);
|
|
65
59
|
const simplifiedContextWithStreamingID = this.simplifiedContext;
|
|
66
60
|
simplifiedContextWithStreamingID['streamingID'] = streamingID;
|
|
67
61
|
logger_1.log.debug(simplifiedContextWithStreamingID, '[HTTP Flow] Brokering request through Websocket.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientRequestHelpers.js","sourceRoot":"","sources":["../../../lib/hybrid-sdk/clientRequestHelpers.ts"],"names":[],"mappings":";;;;;;AACA,2CAA+C;AAC/C,mDAAmD;AAEnD,oDAIgC;AAChC,0DAAkC;AAElC,8CAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"clientRequestHelpers.js","sourceRoot":"","sources":["../../../lib/hybrid-sdk/clientRequestHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createOtelBackedClient = exports.createMeterProvider = exports.parseOtelConfig = void 0;
|
|
3
|
+
exports.createOtelBackedClient = exports.createMeterProvider = exports.RUNTIME_NODE_VIEWS = exports.parseOtelConfig = void 0;
|
|
4
4
|
const exporter_metrics_otlp_grpc_1 = require("@opentelemetry/exporter-metrics-otlp-grpc");
|
|
5
5
|
const sdk_metrics_1 = require("@opentelemetry/sdk-metrics");
|
|
6
6
|
const logger_1 = require("../../../logs/logger");
|
|
@@ -36,6 +36,48 @@ function parseOtelConfig(raw) {
|
|
|
36
36
|
return { otelEndpoint, otelExportIntervalMs };
|
|
37
37
|
}
|
|
38
38
|
exports.parseOtelConfig = parseOtelConfig;
|
|
39
|
+
const RUNTIME_NODE_METER_NAME = '@opentelemetry/instrumentation-runtime-node';
|
|
40
|
+
/**
|
|
41
|
+
* Views applied by every mode that registers RuntimeNodeInstrumentation.
|
|
42
|
+
* Shared so instrument names cannot drift between client and server mode and
|
|
43
|
+
* silently split a dashboard.
|
|
44
|
+
*
|
|
45
|
+
* The renames are required because the metrics pipeline filters the upstream
|
|
46
|
+
* `nodejs.*` and `v8js.*` namespaces out. Views match independently, so each
|
|
47
|
+
* rename survives the trailing wildcard drop.
|
|
48
|
+
*
|
|
49
|
+
* Dropping happens at export, not at collection: the instrumentation runs
|
|
50
|
+
* every collector regardless of these views.
|
|
51
|
+
*/
|
|
52
|
+
exports.RUNTIME_NODE_VIEWS = [
|
|
53
|
+
{
|
|
54
|
+
instrumentName: 'nodejs.eventloop.delay.max',
|
|
55
|
+
meterName: RUNTIME_NODE_METER_NAME,
|
|
56
|
+
name: 'broker.nodejs.eventloop.delay.max',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
instrumentName: 'nodejs.eventloop.delay.p99',
|
|
60
|
+
meterName: RUNTIME_NODE_METER_NAME,
|
|
61
|
+
name: 'broker.nodejs.eventloop.delay.p99',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
instrumentName: 'nodejs.eventloop.utilization',
|
|
65
|
+
meterName: RUNTIME_NODE_METER_NAME,
|
|
66
|
+
name: 'broker.nodejs.eventloop.utilization',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
instrumentName: 'v8js.gc.duration',
|
|
70
|
+
meterName: RUNTIME_NODE_METER_NAME,
|
|
71
|
+
name: 'broker.v8js.gc.duration',
|
|
72
|
+
},
|
|
73
|
+
// Drop all other runtime metrics. Infra automatically filter these runtime
|
|
74
|
+
// metrics out due to the large volume emitted, so we want to be selective.
|
|
75
|
+
{
|
|
76
|
+
instrumentName: '*',
|
|
77
|
+
meterName: RUNTIME_NODE_METER_NAME,
|
|
78
|
+
aggregation: { type: sdk_metrics_1.AggregationType.DROP },
|
|
79
|
+
},
|
|
80
|
+
];
|
|
39
81
|
/**
|
|
40
82
|
* Build a MeterProvider exporting to an OTLP/gRPC endpoint using delta
|
|
41
83
|
* temporality, on a periodic export interval.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/common/metrics/otel.ts"],"names":[],"mappings":";;;AAAA,0FAA+E;AAC/E,
|
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/common/metrics/otel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResponseFrameDecoder = exports.ResponseFrameError = void 0;
|
|
4
|
+
const node_stream_1 = require("node:stream");
|
|
5
|
+
/** A decoder-owned failure with safe context suitable for structured logs. */
|
|
6
|
+
class ResponseFrameError extends Error {
|
|
7
|
+
constructor(message, diagnostics, options) {
|
|
8
|
+
super(message, options);
|
|
9
|
+
this.diagnostics = diagnostics;
|
|
10
|
+
this.name = 'ResponseFrameError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.ResponseFrameError = ResponseFrameError;
|
|
14
|
+
const PREFIX_BYTES = 4;
|
|
15
|
+
// Defensive implementation bound only. Choosing a protocol-level limit needs
|
|
16
|
+
// a separate compatibility decision across deployed Broker versions.
|
|
17
|
+
// TODO: replace this with an explicitly versioned protocol limit.
|
|
18
|
+
const DEFAULT_MAX_METADATA_BYTES = 1024 * 1024;
|
|
19
|
+
/**
|
|
20
|
+
* Decodes one Broker POST response frame:
|
|
21
|
+
*
|
|
22
|
+
* 4-byte little-endian metadata byte length | JSON metadata | body bytes
|
|
23
|
+
*
|
|
24
|
+
* Only body bytes are emitted from the readable side. Metadata is delivered
|
|
25
|
+
* synchronously before the first body byte through the callback/event.
|
|
26
|
+
*/
|
|
27
|
+
class ResponseFrameDecoder extends node_stream_1.Transform {
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
super();
|
|
30
|
+
this.bodyBytes = 0;
|
|
31
|
+
this.prefix = Buffer.alloc(PREFIX_BYTES);
|
|
32
|
+
this.prefixBytes = 0;
|
|
33
|
+
this.metadataBytesExpected = null;
|
|
34
|
+
this.metadataBytes = 0;
|
|
35
|
+
this.metadataChunks = [];
|
|
36
|
+
this.metadataDecoded = false;
|
|
37
|
+
this.maxMetadataBytes =
|
|
38
|
+
options.maxMetadataBytes ?? DEFAULT_MAX_METADATA_BYTES;
|
|
39
|
+
this.onMetadata = options.onMetadata;
|
|
40
|
+
}
|
|
41
|
+
_transform(chunk, encoding, callback) {
|
|
42
|
+
try {
|
|
43
|
+
const data = Buffer.isBuffer(chunk)
|
|
44
|
+
? chunk
|
|
45
|
+
: Buffer.from(chunk, encoding);
|
|
46
|
+
let offset = 0;
|
|
47
|
+
if (this.metadataBytesExpected === null) {
|
|
48
|
+
const prefixBytesToCopy = Math.min(PREFIX_BYTES - this.prefixBytes, data.length);
|
|
49
|
+
data.copy(this.prefix, this.prefixBytes, offset, offset + prefixBytesToCopy);
|
|
50
|
+
this.prefixBytes += prefixBytesToCopy;
|
|
51
|
+
offset += prefixBytesToCopy;
|
|
52
|
+
if (this.prefixBytes < PREFIX_BYTES) {
|
|
53
|
+
callback();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.metadataBytesExpected = this.prefix.readUInt32LE(0);
|
|
57
|
+
if (this.metadataBytesExpected === 0) {
|
|
58
|
+
throw new ResponseFrameError('Response metadata must not be empty.', {
|
|
59
|
+
failureReason: 'invalid-metadata',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (this.metadataBytesExpected > this.maxMetadataBytes) {
|
|
63
|
+
throw new ResponseFrameError(`Response metadata length ${this.metadataBytesExpected} exceeds the ${this.maxMetadataBytes}-byte limit.`, { failureReason: 'metadata-too-large' });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (!this.metadataDecoded && offset < data.length) {
|
|
67
|
+
const metadataBytesToCopy = Math.min(this.metadataBytesExpected - this.metadataBytes, data.length - offset);
|
|
68
|
+
if (metadataBytesToCopy > 0) {
|
|
69
|
+
this.metadataChunks.push(data.subarray(offset, offset + metadataBytesToCopy));
|
|
70
|
+
this.metadataBytes += metadataBytesToCopy;
|
|
71
|
+
offset += metadataBytesToCopy;
|
|
72
|
+
}
|
|
73
|
+
if (this.metadataBytes === this.metadataBytesExpected) {
|
|
74
|
+
const metadata = this.decodeMetadata();
|
|
75
|
+
this.metadataDecoded = true;
|
|
76
|
+
this.onMetadata?.(metadata);
|
|
77
|
+
this.emit('metadata', metadata);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (this.metadataDecoded && offset < data.length) {
|
|
81
|
+
const body = data.subarray(offset);
|
|
82
|
+
this.bodyBytes += body.length;
|
|
83
|
+
this.push(body);
|
|
84
|
+
}
|
|
85
|
+
callback();
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
callback(error);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
_flush(callback) {
|
|
92
|
+
if (this.prefixBytes < PREFIX_BYTES) {
|
|
93
|
+
callback(new ResponseFrameError(`Incomplete metadata-length prefix: received ${this.prefixBytes} of ${PREFIX_BYTES} bytes.`, {
|
|
94
|
+
failureReason: 'incomplete-prefix',
|
|
95
|
+
receivedPrefixBytes: this.prefixBytes,
|
|
96
|
+
expectedPrefixBytes: PREFIX_BYTES,
|
|
97
|
+
}));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (!this.metadataDecoded) {
|
|
101
|
+
callback(new ResponseFrameError(`Incomplete response metadata: received ${this.metadataBytes} of ${this.metadataBytesExpected} bytes.`, {
|
|
102
|
+
failureReason: 'incomplete-metadata',
|
|
103
|
+
receivedMetadataBytes: this.metadataBytes,
|
|
104
|
+
expectedMetadataBytes: this.metadataBytesExpected,
|
|
105
|
+
}));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
callback();
|
|
109
|
+
}
|
|
110
|
+
decodeMetadata() {
|
|
111
|
+
const encoded = Buffer.concat(this.metadataChunks, this.metadataBytesExpected).toString('utf8');
|
|
112
|
+
let value;
|
|
113
|
+
try {
|
|
114
|
+
value = JSON.parse(encoded);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new ResponseFrameError('Malformed response metadata JSON.', { failureReason: 'malformed-metadata' }, { cause: error });
|
|
118
|
+
}
|
|
119
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
120
|
+
throw new ResponseFrameError('Response metadata must be a JSON object.', {
|
|
121
|
+
failureReason: 'invalid-metadata',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const metadata = value;
|
|
125
|
+
if (!Number.isInteger(metadata.status) ||
|
|
126
|
+
metadata.status < 100 ||
|
|
127
|
+
metadata.status > 999) {
|
|
128
|
+
throw new ResponseFrameError('Response metadata must contain a valid status.', { failureReason: 'invalid-metadata' });
|
|
129
|
+
}
|
|
130
|
+
if (metadata.headers !== undefined &&
|
|
131
|
+
(typeof metadata.headers !== 'object' ||
|
|
132
|
+
metadata.headers === null ||
|
|
133
|
+
Array.isArray(metadata.headers))) {
|
|
134
|
+
throw new ResponseFrameError('Response metadata headers must be an object.', { failureReason: 'invalid-metadata' });
|
|
135
|
+
}
|
|
136
|
+
if (metadata.errorType !== undefined &&
|
|
137
|
+
typeof metadata.errorType !== 'string') {
|
|
138
|
+
throw new ResponseFrameError('Response metadata errorType must be a string.', { failureReason: 'invalid-metadata' });
|
|
139
|
+
}
|
|
140
|
+
return metadata;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.ResponseFrameDecoder = ResponseFrameDecoder;
|
|
144
|
+
//# sourceMappingURL=response-frame-decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-frame-decoder.js","sourceRoot":"","sources":["../../../../lib/hybrid-sdk/http/response-frame-decoder.ts"],"names":[],"mappings":"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"}
|