@opentelemetry/core
Version:
OpenTelemetry Core provides constants and utilities shared by all OpenTelemetry SDK packages.
93 lines (92 loc) • 3.3 kB
JavaScript
require("./constants.cjs");
let _opentelemetry_api = require("@opentelemetry/api");
//#region src/baggage/utils.ts
function serializeKeyPairs(keyPairs) {
return keyPairs.reduce((hValue, current) => {
const value = `${hValue}${hValue !== "" ? "," : ""}${current}`;
return value.length > 8192 ? hValue : value;
}, "");
}
function getKeyPairs(baggage) {
return baggage.getAllEntries().map(([key, value]) => {
let entry = `${encodeURIComponent(key)}=${encodeURIComponent(value.value)}`;
if (value.metadata !== void 0) entry += ";" + value.metadata.toString();
return entry;
});
}
function parsePairKeyValue(entry) {
if (!entry) return;
const metadataSeparatorIndex = entry.indexOf(";");
const keyPairPart = metadataSeparatorIndex === -1 ? entry : entry.substring(0, metadataSeparatorIndex);
const separatorIndex = keyPairPart.indexOf("=");
if (separatorIndex <= 0) return;
const rawKey = keyPairPart.substring(0, separatorIndex).trim();
const rawValue = keyPairPart.substring(separatorIndex + 1).trim();
if (!rawKey || !rawValue) return;
let key;
let value;
try {
key = decodeURIComponent(rawKey);
value = decodeURIComponent(rawValue);
} catch {
return;
}
let metadata;
if (metadataSeparatorIndex !== -1 && metadataSeparatorIndex < entry.length - 1) {
const metadataString = entry.substring(metadataSeparatorIndex + 1);
metadata = (0, _opentelemetry_api.baggageEntryMetadataFromString)(metadataString);
}
return {
key,
value,
metadata
};
}
/**
* Parses a single baggage header string into the provided record, applying limits defined in this package.
* Uses indexOf/substring in a while loop to avoid allocating a full array of split entries.
* Returns the updated pair count so callers can track totals across multiple header values.
*/
function parseBaggageHeaderString(value, baggage, count, totalSize) {
let start = 0;
while (start < value.length && count < 180) {
const end = value.indexOf(",", start);
const entryEnd = end === -1 ? value.length : end;
const entryLength = entryEnd - start;
if (entryLength <= 4096) {
const keyPair = parsePairKeyValue(value.substring(start, entryEnd));
if (keyPair) {
const entrySize = (count === 0 ? 0 : 1) + entryLength;
if (totalSize + entrySize > 8192) break;
baggage[keyPair.key] = keyPair.metadata ? {
value: keyPair.value,
metadata: keyPair.metadata
} : { value: keyPair.value };
count++;
totalSize += entrySize;
}
}
if (end === -1) break;
start = end + 1;
}
return [count, totalSize];
}
/**
* Parse a string serialized in the baggage HTTP Format (without metadata):
* https://github.com/w3c/baggage/blob/master/baggage/HTTP_HEADER_FORMAT.md
*/
function parseKeyPairsIntoRecord(value) {
const result = {};
if (typeof value === "string" && value.length > 0) value.split(",").forEach((entry) => {
const keyPair = parsePairKeyValue(entry);
if (keyPair !== void 0 && keyPair.value.length > 0) result[keyPair.key] = keyPair.value;
});
return result;
}
//#endregion
exports.getKeyPairs = getKeyPairs;
exports.parseBaggageHeaderString = parseBaggageHeaderString;
exports.parseKeyPairsIntoRecord = parseKeyPairsIntoRecord;
exports.parsePairKeyValue = parsePairKeyValue;
exports.serializeKeyPairs = serializeKeyPairs;
//# sourceMappingURL=utils.cjs.map