chargebee
Version:
A library for integrating with Chargebee.
146 lines (145 loc) • 6.24 kB
JavaScript
;
/*
* This file is auto-generated by Chargebee.
* For more information on how to make changes to this file, please see the README.
* Reach out to dx@chargebee.com for any questions.
* Copyright 2026 Chargebee Inc.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.NO_OP_TELEMETRY_ADAPTER = exports.NoOpTelemetryAdapter = void 0;
exports.buildSpanName = buildSpanName;
exports.resolveChargebeeApiVersion = resolveChargebeeApiVersion;
exports.buildRequestHeaderSpanAttributes = buildRequestHeaderSpanAttributes;
exports.buildRequestStartSpanAttributes = buildRequestStartSpanAttributes;
exports.buildRequestEndSpanAttributes = buildRequestEndSpanAttributes;
exports.buildRequestTelemetryContext = buildRequestTelemetryContext;
exports.buildRequestTelemetryResult = buildRequestTelemetryResult;
exports.extractRequestTelemetryError = extractRequestTelemetryError;
exports.extractHttpStatusCode = extractHttpStatusCode;
const types_js_1 = require("./types.js");
class NoOpTelemetryAdapter {
onRequestStart() {
return;
}
onRequestEnd() {
return;
}
}
exports.NoOpTelemetryAdapter = NoOpTelemetryAdapter;
exports.NO_OP_TELEMETRY_ADAPTER = new NoOpTelemetryAdapter();
function buildSpanName(resource, operation) {
return `${types_js_1.TELEMETRY_SPAN_NAME_PREFIX}.${resource}.${operation}`;
}
function resolveChargebeeApiVersion(apiPath) {
return apiPath === '/api/v1' ? 'v1' : 'v2';
}
/**
* Captures Chargebee custom request headers as OTel span attributes.
*
* Headers whose (lowercased) name starts with `chargebee-` are recorded as
* `http.request.header.<name>` with string[] values, per the OpenTelemetry HTTP semantic
* conventions. The `chargebee-request-origin-*` family (origin IP, email, device) is skipped
* because it carries end-user PII. Matching by prefix means new `chargebee-*` headers are
* captured automatically without an SDK upgrade.
*/
function buildRequestHeaderSpanAttributes(requestHeaders) {
const attributes = {};
if (!requestHeaders) {
return attributes;
}
for (const [name, value] of Object.entries(requestHeaders)) {
if (value === undefined || value === null) {
continue;
}
const lowerName = name.toLowerCase();
if (!lowerName.startsWith(types_js_1.CHARGEBEE_TELEMETRY_HEADER_PREFIX) ||
lowerName.startsWith(types_js_1.CHARGEBEE_TELEMETRY_HEADER_EXCLUDE_PREFIX)) {
continue;
}
attributes[`${types_js_1.HTTP_REQUEST_HEADER_ATTRIBUTE_PREFIX}${lowerName}`] = [
String(value),
];
}
return attributes;
}
function buildRequestStartSpanAttributes(input) {
return Object.assign({ [types_js_1.TelemetryAttributeKeys.URL_FULL]: input.httpUrl, [types_js_1.TelemetryAttributeKeys.HTTP_REQUEST_METHOD]: input.httpMethod, [types_js_1.TelemetryAttributeKeys.SERVER_ADDRESS]: input.serverAddress, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_SITE]: input.chargebeeSite, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_API_VERSION]: input.chargebeeApiVersion, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_RESOURCE]: input.resource, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_OPERATION]: input.operation, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_SDK_NAME]: types_js_1.CHARGEBEE_SDK_NAME, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_SDK_VERSION]: input.sdkVersion }, buildRequestHeaderSpanAttributes(input.requestHeaders));
}
function buildRequestEndSpanAttributes(result) {
const attributes = {
[types_js_1.TelemetryAttributeKeys.HTTP_RESPONSE_STATUS_CODE]: result.httpStatusCode,
};
if (result.error) {
// error.type is the status code on failed requests
attributes[types_js_1.TelemetryAttributeKeys.ERROR_TYPE] = String(result.httpStatusCode);
if (result.error.chargebeeErrorCode) {
attributes[types_js_1.TelemetryAttributeKeys.CHARGEBEE_ERROR_CODE] =
result.error.chargebeeErrorCode;
}
if (result.error.chargebeeApiErrorType) {
attributes[types_js_1.TelemetryAttributeKeys.CHARGEBEE_ERROR_TYPE] =
result.error.chargebeeApiErrorType;
}
if (result.error.chargebeeErrorParam) {
attributes[types_js_1.TelemetryAttributeKeys.CHARGEBEE_ERROR_PARAM] =
result.error.chargebeeErrorParam;
}
}
return attributes;
}
function buildRequestTelemetryContext(input) {
return {
spanName: buildSpanName(input.resource, input.operation),
resource: input.resource,
operation: input.operation,
httpMethod: input.httpMethod,
httpUrl: input.httpUrl,
serverAddress: input.serverAddress,
chargebeeSite: input.chargebeeSite,
chargebeeApiVersion: input.chargebeeApiVersion,
sdkName: types_js_1.CHARGEBEE_SDK_NAME,
sdkVersion: input.sdkVersion,
startAttributes: buildRequestStartSpanAttributes(input),
};
}
function buildRequestTelemetryResult(result) {
return Object.assign(Object.assign({}, result), { endAttributes: buildRequestEndSpanAttributes(result) });
}
function extractRequestTelemetryError(err) {
if (err == null || typeof err !== 'object') {
return undefined;
}
const errorObj = err;
const message = typeof errorObj.message === 'string'
? errorObj.message
: 'Chargebee API request failed';
const result = { message };
if (typeof errorObj.api_error_code === 'string') {
result.chargebeeErrorCode = errorObj.api_error_code;
}
if (typeof errorObj.type === 'string') {
result.chargebeeApiErrorType = errorObj.type;
}
if (typeof errorObj.param === 'string') {
result.chargebeeErrorParam = errorObj.param;
}
return result;
}
function extractHttpStatusCode(err) {
if (err == null || typeof err !== 'object') {
return undefined;
}
const errorObj = err;
for (const key of [
'http_status_code',
'httpStatusCode',
'http_code',
'statusCode',
]) {
const value = errorObj[key];
if (typeof value === 'number') {
return value;
}
}
return undefined;
}