@forklaunch/core 1.5.2 → 1.5.3
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/lib/cache/{index.d.mts → cacheKey.d.ts} +2 -6
- package/lib/cache/cacheKey.d.ts.map +1 -0
- package/lib/cache/index.d.ts +4 -15
- package/lib/cache/index.d.ts.map +1 -0
- package/lib/{ttlCache.interface-B3xaLT00.d.ts → cache/interfaces/ttlCache.interface.d.ts} +3 -5
- package/lib/cache/interfaces/ttlCache.interface.d.ts.map +1 -0
- package/lib/{ttlCacheRecord.types-oX0ti5SP.d.mts → cache/types/ttlCacheRecord.types.d.ts} +3 -4
- package/lib/cache/types/ttlCacheRecord.types.d.ts.map +1 -0
- package/lib/controllers/index.d.ts +2 -13
- package/lib/controllers/index.d.ts.map +1 -0
- package/lib/controllers/{index.d.mts → interfaces/controller.interface.d.ts} +2 -3
- package/lib/controllers/interfaces/controller.interface.d.ts.map +1 -0
- package/lib/environment/index.d.ts +2 -28
- package/lib/environment/index.d.ts.map +1 -0
- package/lib/environment/{index.d.mts → loadCascadingEnv.d.ts} +4 -5
- package/lib/environment/loadCascadingEnv.d.ts.map +1 -0
- package/lib/http/application/expressLikeApplication.d.ts +34 -0
- package/lib/http/application/expressLikeApplication.d.ts.map +1 -0
- package/lib/http/bootstrap/listen.d.ts +2 -0
- package/lib/http/bootstrap/listen.d.ts.map +1 -0
- package/lib/http/cluster/cluster.types.d.ts +17 -0
- package/lib/http/cluster/cluster.types.d.ts.map +1 -0
- package/lib/http/cluster/isPortBound.d.ts +2 -0
- package/lib/http/cluster/isPortBound.d.ts.map +1 -0
- package/lib/http/createHmacToken.d.ts +19 -0
- package/lib/http/createHmacToken.d.ts.map +1 -0
- package/lib/http/discriminateAuthMethod.d.ts +85 -0
- package/lib/http/discriminateAuthMethod.d.ts.map +1 -0
- package/lib/http/generateHmacAuthHeaders.d.ts +31 -0
- package/lib/http/generateHmacAuthHeaders.d.ts.map +1 -0
- package/lib/http/guards/hasFeatureChecks.d.ts +2 -0
- package/lib/http/guards/hasFeatureChecks.d.ts.map +1 -0
- package/lib/http/guards/hasPermissionChecks.d.ts +2 -0
- package/lib/http/guards/hasPermissionChecks.d.ts.map +1 -0
- package/lib/http/guards/hasRoleChecks.d.ts +2 -0
- package/lib/http/guards/hasRoleChecks.d.ts.map +1 -0
- package/lib/http/guards/hasScopeChecks.d.ts +2 -0
- package/lib/http/guards/hasScopeChecks.d.ts.map +1 -0
- package/lib/http/guards/hasSend.d.ts +17 -0
- package/lib/http/guards/hasSend.d.ts.map +1 -0
- package/lib/http/guards/hasSubscriptionChecks.d.ts +2 -0
- package/lib/http/guards/hasSubscriptionChecks.d.ts.map +1 -0
- package/lib/http/guards/hasVersionedSchema.d.ts +2 -0
- package/lib/http/guards/hasVersionedSchema.d.ts.map +1 -0
- package/lib/http/guards/isBasicAuthMethod.d.ts +3 -0
- package/lib/http/guards/isBasicAuthMethod.d.ts.map +1 -0
- package/lib/http/guards/isConstrainedForklaunchRouter.d.ts +21 -0
- package/lib/http/guards/isConstrainedForklaunchRouter.d.ts.map +1 -0
- package/lib/http/guards/isExpressLikeSchemaHandler.d.ts +32 -0
- package/lib/http/guards/isExpressLikeSchemaHandler.d.ts.map +1 -0
- package/lib/http/guards/isForklaunchExpressLikeRouter.d.ts +28 -0
- package/lib/http/guards/isForklaunchExpressLikeRouter.d.ts.map +1 -0
- package/lib/http/guards/isForklaunchRequest.d.ts +26 -0
- package/lib/http/guards/isForklaunchRequest.d.ts.map +1 -0
- package/lib/http/guards/isForklaunchResponse.d.ts +23 -0
- package/lib/http/guards/isForklaunchResponse.d.ts.map +1 -0
- package/lib/http/guards/isForklaunchRouter.d.ts +21 -0
- package/lib/http/guards/isForklaunchRouter.d.ts.map +1 -0
- package/lib/http/guards/isHmacMethod.d.ts +9 -0
- package/lib/http/guards/isHmacMethod.d.ts.map +1 -0
- package/lib/http/guards/isHttpContractDetails.d.ts +29 -0
- package/lib/http/guards/isHttpContractDetails.d.ts.map +1 -0
- package/lib/http/guards/isJwtAuthMethod.d.ts +3 -0
- package/lib/http/guards/isJwtAuthMethod.d.ts.map +1 -0
- package/lib/http/guards/isLoggerMeta.d.ts +3 -0
- package/lib/http/guards/isLoggerMeta.d.ts.map +1 -0
- package/lib/http/guards/isPath.d.ts +2 -0
- package/lib/http/guards/isPath.d.ts.map +1 -0
- package/lib/http/guards/isPathParamContractDetails.d.ts +4 -0
- package/lib/http/guards/isPathParamContractDetails.d.ts.map +1 -0
- package/lib/http/guards/isRequestShape.d.ts +3 -0
- package/lib/http/guards/isRequestShape.d.ts.map +1 -0
- package/lib/http/guards/isResponseCompiledSchema.d.ts +3 -0
- package/lib/http/guards/isResponseCompiledSchema.d.ts.map +1 -0
- package/lib/http/guards/isSdkHandler.d.ts +9 -0
- package/lib/http/guards/isSdkHandler.d.ts.map +1 -0
- package/lib/http/guards/isSdkRouter.d.ts +9 -0
- package/lib/http/guards/isSdkRouter.d.ts.map +1 -0
- package/lib/http/guards/isTypedHandler.d.ts +5 -0
- package/lib/http/guards/isTypedHandler.d.ts.map +1 -0
- package/lib/http/guards/isVersionedInputSchema.d.ts +3 -0
- package/lib/http/guards/isVersionedInputSchema.d.ts.map +1 -0
- package/lib/http/handlers/delete.d.ts +5 -0
- package/lib/http/handlers/delete.d.ts.map +1 -0
- package/lib/http/handlers/get.d.ts +5 -0
- package/lib/http/handlers/get.d.ts.map +1 -0
- package/lib/http/handlers/head.d.ts +5 -0
- package/lib/http/handlers/head.d.ts.map +1 -0
- package/lib/http/handlers/middleware.d.ts +10 -0
- package/lib/http/handlers/middleware.d.ts.map +1 -0
- package/lib/http/handlers/options.d.ts +5 -0
- package/lib/http/handlers/options.d.ts.map +1 -0
- package/lib/http/handlers/patch.d.ts +5 -0
- package/lib/http/handlers/patch.d.ts.map +1 -0
- package/lib/http/handlers/post.d.ts +5 -0
- package/lib/http/handlers/post.d.ts.map +1 -0
- package/lib/http/handlers/put.d.ts +5 -0
- package/lib/http/handlers/put.d.ts.map +1 -0
- package/lib/http/handlers/trace.d.ts +5 -0
- package/lib/http/handlers/trace.d.ts.map +1 -0
- package/lib/http/handlers/typedAuthHandler.d.ts +5 -0
- package/lib/http/handlers/typedAuthHandler.d.ts.map +1 -0
- package/lib/http/handlers/typedHandler.d.ts +14 -0
- package/lib/http/handlers/typedHandler.d.ts.map +1 -0
- package/lib/http/httpStatusCodes.d.ts +75 -0
- package/lib/http/httpStatusCodes.d.ts.map +1 -0
- package/lib/http/index.d.ts +47 -1244
- package/lib/http/index.d.ts.map +1 -0
- package/lib/http/index.js +445 -410
- package/lib/http/index.js.map +1 -1
- package/lib/http/index.mjs +439 -407
- package/lib/http/index.mjs.map +1 -1
- package/lib/http/interfaces/expressLikeRouter.interface.d.ts +25 -0
- package/lib/http/interfaces/expressLikeRouter.interface.d.ts.map +1 -0
- package/lib/http/mcpGenerator/mcpGenerator.d.ts +17 -0
- package/lib/http/mcpGenerator/mcpGenerator.d.ts.map +1 -0
- package/lib/http/middleware/request/auth.middleware.d.ts +16 -0
- package/lib/http/middleware/request/auth.middleware.d.ts.map +1 -0
- package/lib/http/middleware/request/cors.middleware.d.ts +13 -0
- package/lib/http/middleware/request/cors.middleware.d.ts.map +1 -0
- package/lib/http/middleware/request/createContext.middleware.d.ts +15 -0
- package/lib/http/middleware/request/createContext.middleware.d.ts.map +1 -0
- package/lib/http/middleware/request/enrichDetails.middleware.d.ts +18 -0
- package/lib/http/middleware/request/enrichDetails.middleware.d.ts.map +1 -0
- package/lib/http/middleware/request/parse.middleware.d.ts +17 -0
- package/lib/http/middleware/request/parse.middleware.d.ts.map +1 -0
- package/lib/http/middleware/request/tenantContext.middleware.d.ts +41 -0
- package/lib/http/middleware/request/tenantContext.middleware.d.ts.map +1 -0
- package/lib/http/middleware/response/enrichExpressLikeSend.middleware.d.ts +32 -0
- package/lib/http/middleware/response/enrichExpressLikeSend.middleware.d.ts.map +1 -0
- package/lib/http/middleware/response/parse.middleware.d.ts +31 -0
- package/lib/http/middleware/response/parse.middleware.d.ts.map +1 -0
- package/lib/http/openApiV3Generator/openApiV3Generator.d.ts +17 -0
- package/lib/http/openApiV3Generator/openApiV3Generator.d.ts.map +1 -0
- package/lib/http/rateLimit/index.d.ts +2 -0
- package/lib/http/rateLimit/index.d.ts.map +1 -0
- package/lib/http/rateLimit/rateLimiter.d.ts +66 -0
- package/lib/http/rateLimit/rateLimiter.d.ts.map +1 -0
- package/lib/http/router/discriminateBody.d.ts +43 -0
- package/lib/http/router/discriminateBody.d.ts.map +1 -0
- package/lib/http/router/expressLikeRouter.d.ts +240 -0
- package/lib/http/router/expressLikeRouter.d.ts.map +1 -0
- package/lib/http/router/routerSharedLogic.d.ts +50 -0
- package/lib/http/router/routerSharedLogic.d.ts.map +1 -0
- package/lib/http/router/unpackRouters.d.ts +7 -0
- package/lib/http/router/unpackRouters.d.ts.map +1 -0
- package/lib/http/telemetry/auditLogger.d.ts +21 -0
- package/lib/http/telemetry/auditLogger.d.ts.map +1 -0
- package/lib/http/telemetry/constants.d.ts +6 -0
- package/lib/http/telemetry/constants.d.ts.map +1 -0
- package/lib/http/telemetry/evaluateTelemetryOptions.d.ts +11 -0
- package/lib/http/telemetry/evaluateTelemetryOptions.d.ts.map +1 -0
- package/lib/http/telemetry/metricsDefinition.d.ts +3 -0
- package/lib/http/telemetry/metricsDefinition.d.ts.map +1 -0
- package/lib/http/telemetry/openTelemetryCollector.d.ts +53 -0
- package/lib/http/telemetry/openTelemetryCollector.d.ts.map +1 -0
- package/lib/http/telemetry/pinoLogger.d.ts +20 -0
- package/lib/http/telemetry/pinoLogger.d.ts.map +1 -0
- package/lib/http/telemetry/recordMetric.d.ts +5 -0
- package/lib/http/telemetry/recordMetric.d.ts.map +1 -0
- package/lib/http/types/apiDefinition.types.d.ts +471 -0
- package/lib/http/types/apiDefinition.types.d.ts.map +1 -0
- package/lib/http/types/contractDetails.types.d.ts +404 -0
- package/lib/http/types/contractDetails.types.d.ts.map +1 -0
- package/lib/http/types/docsConfiguration.types.d.ts +7 -0
- package/lib/http/types/docsConfiguration.types.d.ts.map +1 -0
- package/lib/http/types/expressLikeOptions.d.ts +224 -0
- package/lib/http/types/expressLikeOptions.d.ts.map +1 -0
- package/lib/http/types/expressLikeRouter.types.d.ts +127 -0
- package/lib/http/types/expressLikeRouter.types.d.ts.map +1 -0
- package/lib/http/types/openTelemetryCollector.types.d.ts +21 -0
- package/lib/http/types/openTelemetryCollector.types.d.ts.map +1 -0
- package/lib/http/types/router.types.d.ts +52 -0
- package/lib/http/types/router.types.d.ts.map +1 -0
- package/lib/http/types/sdk.types.d.ts +259 -0
- package/lib/http/types/sdk.types.d.ts.map +1 -0
- package/lib/http/types/typedHandler.types.d.ts +18 -0
- package/lib/http/types/typedHandler.types.d.ts.map +1 -0
- package/lib/mappers/guards/isSchemaResolutionFunction.d.ts +10 -0
- package/lib/mappers/guards/isSchemaResolutionFunction.d.ts.map +1 -0
- package/lib/mappers/index.d.ts +3 -68
- package/lib/mappers/index.d.ts.map +1 -0
- package/lib/mappers/mapServiceSchemas.d.ts +33 -0
- package/lib/mappers/mapServiceSchemas.d.ts.map +1 -0
- package/lib/mappers/mapper.d.ts +26 -0
- package/lib/mappers/mapper.d.ts.map +1 -0
- package/lib/mappers/types/schemaResolution.types.d.ts +9 -0
- package/lib/mappers/types/schemaResolution.types.d.ts.map +1 -0
- package/lib/objectstore/index.d.ts +3 -71
- package/lib/objectstore/index.d.ts.map +1 -0
- package/lib/objectstore/{index.d.mts → interfaces/objectstore.interface.d.ts} +3 -16
- package/lib/objectstore/interfaces/objectstore.interface.d.ts.map +1 -0
- package/lib/objectstore/objectstoreKey.d.ts +11 -0
- package/lib/objectstore/objectstoreKey.d.ts.map +1 -0
- package/lib/persistence/complianceEventSubscriber.d.ts +13 -0
- package/lib/persistence/complianceEventSubscriber.d.ts.map +1 -0
- package/lib/persistence/compliancePropertyBuilder.d.ts +26 -0
- package/lib/persistence/compliancePropertyBuilder.d.ts.map +1 -0
- package/lib/persistence/complianceTypes.d.ts +64 -0
- package/lib/persistence/complianceTypes.d.ts.map +1 -0
- package/lib/persistence/defineComplianceEntity.d.ts +19 -0
- package/lib/persistence/defineComplianceEntity.d.ts.map +1 -0
- package/lib/persistence/encryptedType.d.ts +85 -0
- package/lib/persistence/encryptedType.d.ts.map +1 -0
- package/lib/persistence/fieldEncryptor.d.ts +48 -0
- package/lib/persistence/fieldEncryptor.d.ts.map +1 -0
- package/lib/persistence/index.d.ts +10 -403
- package/lib/persistence/index.d.ts.map +1 -0
- package/lib/persistence/index.js.map +1 -1
- package/lib/persistence/index.mjs.map +1 -1
- package/lib/persistence/rls.d.ts +56 -0
- package/lib/persistence/rls.d.ts.map +1 -0
- package/lib/persistence/tenantEm.d.ts +60 -0
- package/lib/persistence/tenantEm.d.ts.map +1 -0
- package/lib/persistence/tenantFilter.d.ts +47 -0
- package/lib/persistence/tenantFilter.d.ts.map +1 -0
- package/lib/secrets/index.d.ts +2 -0
- package/lib/secrets/index.d.ts.map +1 -0
- package/lib/secrets/secretsAccessor.d.ts +17 -0
- package/lib/secrets/secretsAccessor.d.ts.map +1 -0
- package/lib/services/complianceDataService.d.ts +47 -0
- package/lib/services/complianceDataService.d.ts.map +1 -0
- package/lib/services/configInjector.d.ts +43 -0
- package/lib/services/configInjector.d.ts.map +1 -0
- package/lib/services/guards/isConstructed.d.ts +3 -0
- package/lib/services/guards/isConstructed.d.ts.map +1 -0
- package/lib/services/guards/isConstructedSingleton.d.ts +3 -0
- package/lib/services/guards/isConstructedSingleton.d.ts.map +1 -0
- package/lib/services/guards/isConstructor.d.ts +3 -0
- package/lib/services/guards/isConstructor.d.ts.map +1 -0
- package/lib/services/index.d.ts +10 -184
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/retentionService.d.ts +31 -0
- package/lib/services/retentionService.d.ts.map +1 -0
- package/lib/services/runRetentionEnforcement.d.ts +19 -0
- package/lib/services/runRetentionEnforcement.d.ts.map +1 -0
- package/lib/services/types/configInjector.types.d.ts +39 -0
- package/lib/services/types/configInjector.types.d.ts.map +1 -0
- package/lib/services/types/entityManager.types.d.ts +4 -0
- package/lib/services/types/entityManager.types.d.ts.map +1 -0
- package/lib/services/types/service.types.d.ts +5 -0
- package/lib/services/types/service.types.d.ts.map +1 -0
- package/lib/ws/asyncApiV3Generator/asyncApiV3Generator.d.ts +12 -0
- package/lib/ws/asyncApiV3Generator/asyncApiV3Generator.d.ts.map +1 -0
- package/lib/ws/index.d.ts +4 -67
- package/lib/ws/index.d.ts.map +1 -0
- package/lib/ws/index.js.map +1 -1
- package/lib/ws/index.mjs.map +1 -1
- package/lib/ws/types/eventSchema.types.d.ts +28 -0
- package/lib/ws/types/eventSchema.types.d.ts.map +1 -0
- package/lib/ws/webSocketLike.d.ts +18 -0
- package/lib/ws/webSocketLike.d.ts.map +1 -0
- package/package.json +45 -44
- package/LICENSE +0 -21
- package/lib/apiDefinition.types-DF_crhB0.d.mts +0 -1092
- package/lib/apiDefinition.types-DW4lfZqy.d.ts +0 -1092
- package/lib/http/index.d.mts +0 -1244
- package/lib/mappers/index.d.mts +0 -68
- package/lib/openTelemetryCollector-BS-ej09T.d.mts +0 -70
- package/lib/openTelemetryCollector-BS-ej09T.d.ts +0 -70
- package/lib/persistence/index.d.mts +0 -403
- package/lib/services/index.d.mts +0 -185
- package/lib/ttlCache.interface-CEOkrt8d.d.mts +0 -77
- package/lib/ttlCacheRecord.types-oX0ti5SP.d.ts +0 -25
- package/lib/ws/index.d.mts +0 -67
package/lib/http/index.js
CHANGED
|
@@ -61,6 +61,9 @@ __export(http_exports, {
|
|
|
61
61
|
getCachedJwks: () => getCachedJwks,
|
|
62
62
|
getCodeForStatus: () => getCodeForStatus,
|
|
63
63
|
head: () => head,
|
|
64
|
+
httpErrorsTotalCounter: () => httpErrorsTotalCounter,
|
|
65
|
+
httpRequestDurationMsHistogram: () => httpRequestDurationMsHistogram,
|
|
66
|
+
httpRequestsInFlightCounter: () => httpRequestsInFlightCounter,
|
|
64
67
|
httpRequestsTotalCounter: () => httpRequestsTotalCounter,
|
|
65
68
|
httpServerDurationHistogram: () => httpServerDurationHistogram,
|
|
66
69
|
isClientError: () => isClientError,
|
|
@@ -175,8 +178,9 @@ function isTypedHandler(maybeTypedHandler) {
|
|
|
175
178
|
}
|
|
176
179
|
|
|
177
180
|
// src/http/middleware/request/createContext.middleware.ts
|
|
178
|
-
var
|
|
179
|
-
var
|
|
181
|
+
var import_common4 = require("@forklaunch/common");
|
|
182
|
+
var import_api3 = require("@opentelemetry/api");
|
|
183
|
+
var import_semantic_conventions3 = require("@opentelemetry/semantic-conventions");
|
|
180
184
|
var import_uuid = require("uuid");
|
|
181
185
|
|
|
182
186
|
// src/http/telemetry/constants.ts
|
|
@@ -185,6 +189,327 @@ var ATTR_API_NAME = "api.name";
|
|
|
185
189
|
var ATTR_CORRELATION_ID = "correlation.id";
|
|
186
190
|
var ATTR_APPLICATION_ID = "application_id";
|
|
187
191
|
|
|
192
|
+
// src/http/telemetry/openTelemetryCollector.ts
|
|
193
|
+
var import_common3 = require("@forklaunch/common");
|
|
194
|
+
var import_opentelemetry_instrumentation_hyper_express = require("@forklaunch/opentelemetry-instrumentation-hyper-express");
|
|
195
|
+
var import_api2 = require("@opentelemetry/api");
|
|
196
|
+
var import_exporter_logs_otlp_http = require("@opentelemetry/exporter-logs-otlp-http");
|
|
197
|
+
var import_exporter_metrics_otlp_http = require("@opentelemetry/exporter-metrics-otlp-http");
|
|
198
|
+
var import_exporter_trace_otlp_http = require("@opentelemetry/exporter-trace-otlp-http");
|
|
199
|
+
var import_instrumentation_express = require("@opentelemetry/instrumentation-express");
|
|
200
|
+
var import_instrumentation_http = require("@opentelemetry/instrumentation-http");
|
|
201
|
+
var import_resources = require("@opentelemetry/resources");
|
|
202
|
+
var import_sdk_logs = require("@opentelemetry/sdk-logs");
|
|
203
|
+
var import_sdk_metrics = require("@opentelemetry/sdk-metrics");
|
|
204
|
+
var import_sdk_node = require("@opentelemetry/sdk-node");
|
|
205
|
+
var import_semantic_conventions2 = require("@opentelemetry/semantic-conventions");
|
|
206
|
+
var import_dotenv = __toESM(require("dotenv"));
|
|
207
|
+
|
|
208
|
+
// src/http/guards/isForklaunchRequest.ts
|
|
209
|
+
function isForklaunchRequest(request) {
|
|
210
|
+
return request != null && typeof request === "object" && "contractDetails" in request;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// src/http/telemetry/pinoLogger.ts
|
|
214
|
+
var import_common2 = require("@forklaunch/common");
|
|
215
|
+
var import_api = require("@opentelemetry/api");
|
|
216
|
+
var import_api_logs = require("@opentelemetry/api-logs");
|
|
217
|
+
var import_pino = __toESM(require("pino"));
|
|
218
|
+
|
|
219
|
+
// src/http/guards/isLoggerMeta.ts
|
|
220
|
+
function isLoggerMeta(arg) {
|
|
221
|
+
return typeof arg === "object" && arg !== null && "_meta" in arg;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// src/http/telemetry/pinoLogger.ts
|
|
225
|
+
function meta(meta2) {
|
|
226
|
+
return meta2;
|
|
227
|
+
}
|
|
228
|
+
function mapSeverity(level) {
|
|
229
|
+
switch (level) {
|
|
230
|
+
case "silent":
|
|
231
|
+
return 0;
|
|
232
|
+
case "trace":
|
|
233
|
+
return 1;
|
|
234
|
+
case "debug":
|
|
235
|
+
return 5;
|
|
236
|
+
case "info":
|
|
237
|
+
return 9;
|
|
238
|
+
case "warn":
|
|
239
|
+
return 13;
|
|
240
|
+
case "error":
|
|
241
|
+
return 17;
|
|
242
|
+
case "fatal":
|
|
243
|
+
return 21;
|
|
244
|
+
default:
|
|
245
|
+
(0, import_common2.isNever)(level);
|
|
246
|
+
return 0;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function normalizeLogArgs(args) {
|
|
250
|
+
let message = "";
|
|
251
|
+
const metaObjects = [];
|
|
252
|
+
for (const arg of args) {
|
|
253
|
+
if (typeof arg === "string" && message === "") {
|
|
254
|
+
message = arg;
|
|
255
|
+
} else if (arg instanceof Error) {
|
|
256
|
+
metaObjects.push({
|
|
257
|
+
err: {
|
|
258
|
+
message: arg.message,
|
|
259
|
+
name: arg.name,
|
|
260
|
+
stack: arg.stack,
|
|
261
|
+
...Object.keys(arg).length > 0 ? arg : {}
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
} else if (arg && typeof arg === "object" && !Array.isArray(arg)) {
|
|
265
|
+
metaObjects.push(arg);
|
|
266
|
+
} else {
|
|
267
|
+
message += ` ${String(arg)}`;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const metadata = Object.assign({}, ...metaObjects);
|
|
271
|
+
return [metadata, message.trim()];
|
|
272
|
+
}
|
|
273
|
+
function safePrettyFormat(level, args, timestamp) {
|
|
274
|
+
try {
|
|
275
|
+
const [metadata, message] = normalizeLogArgs(args);
|
|
276
|
+
const formattedTimestamp = timestamp || (/* @__PURE__ */ new Date()).toISOString();
|
|
277
|
+
return `[${formattedTimestamp}] ${level.toUpperCase()}: ${message}${Object.keys(metadata).length > 0 ? `
|
|
278
|
+
${JSON.stringify(metadata, null, 2)}` : ""}`;
|
|
279
|
+
} catch (error) {
|
|
280
|
+
const fallbackMessage = args.map((arg) => {
|
|
281
|
+
try {
|
|
282
|
+
if (typeof arg === "string") return arg;
|
|
283
|
+
if (arg === null) return "null";
|
|
284
|
+
if (arg === void 0) return "undefined";
|
|
285
|
+
return JSON.stringify(arg);
|
|
286
|
+
} catch {
|
|
287
|
+
return "[Circular/Non-serializable Object]";
|
|
288
|
+
}
|
|
289
|
+
}).join(" ");
|
|
290
|
+
return `[${(/* @__PURE__ */ new Date()).toISOString()}] ${level.toUpperCase()}: ${fallbackMessage} [Pretty Print Error: ${error instanceof Error ? error.message : "Unknown error"}]`;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
var PinoLogger = class _PinoLogger {
|
|
294
|
+
_pinoLogger;
|
|
295
|
+
_meta;
|
|
296
|
+
constructor(level, meta2 = {}) {
|
|
297
|
+
this._pinoLogger = (0, import_pino.default)({
|
|
298
|
+
level: level || "info",
|
|
299
|
+
formatters: {
|
|
300
|
+
level(label) {
|
|
301
|
+
return { level: label };
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
timestamp: import_pino.default.stdTimeFunctions.isoTime,
|
|
305
|
+
transport: {
|
|
306
|
+
target: "pino-pretty",
|
|
307
|
+
options: {
|
|
308
|
+
colorize: true,
|
|
309
|
+
errorLikeObjectKeys: ["err", "error"],
|
|
310
|
+
ignore: "pid,hostname",
|
|
311
|
+
translateTime: "SYS:standard"
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
this._meta = meta2;
|
|
316
|
+
}
|
|
317
|
+
log(level, ...args) {
|
|
318
|
+
let meta2 = {};
|
|
319
|
+
const filteredArgs = args.filter((arg) => {
|
|
320
|
+
if (isLoggerMeta(arg)) {
|
|
321
|
+
Object.assign(meta2, arg);
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
return true;
|
|
325
|
+
});
|
|
326
|
+
const [errorMetadata] = normalizeLogArgs(filteredArgs);
|
|
327
|
+
Object.assign(meta2, errorMetadata);
|
|
328
|
+
const activeSpan = import_api.trace.getActiveSpan();
|
|
329
|
+
if (activeSpan) {
|
|
330
|
+
const activeSpanContext = activeSpan.spanContext();
|
|
331
|
+
meta2.trace_id = activeSpanContext.traceId;
|
|
332
|
+
meta2.span_id = activeSpanContext.spanId;
|
|
333
|
+
meta2.trace_flags = activeSpanContext.traceFlags;
|
|
334
|
+
meta2 = {
|
|
335
|
+
// @ts-expect-error accessing private property
|
|
336
|
+
...activeSpan.attributes,
|
|
337
|
+
...meta2
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
meta2 = {
|
|
341
|
+
"api.name": "none",
|
|
342
|
+
"correlation.id": "none",
|
|
343
|
+
...meta2
|
|
344
|
+
};
|
|
345
|
+
this._pinoLogger[level](...normalizeLogArgs(filteredArgs));
|
|
346
|
+
const formattedBody = safePrettyFormat(level, filteredArgs);
|
|
347
|
+
try {
|
|
348
|
+
import_api_logs.logs.getLogger(process.env.OTEL_SERVICE_NAME ?? "unknown").emit({
|
|
349
|
+
severityText: level,
|
|
350
|
+
severityNumber: mapSeverity(level),
|
|
351
|
+
body: formattedBody,
|
|
352
|
+
attributes: { ...this._meta, ...meta2 }
|
|
353
|
+
});
|
|
354
|
+
} catch (error) {
|
|
355
|
+
console.error("Failed to emit OpenTelemetry log:", error);
|
|
356
|
+
console.log(
|
|
357
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] ${level.toUpperCase()}:`,
|
|
358
|
+
...filteredArgs
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
error = (msg, ...args) => this.log("error", msg, ...args);
|
|
363
|
+
info = (msg, ...args) => this.log("info", msg, ...args);
|
|
364
|
+
debug = (msg, ...args) => this.log("debug", msg, ...args);
|
|
365
|
+
warn = (msg, ...args) => this.log("warn", msg, ...args);
|
|
366
|
+
trace = (msg, ...args) => this.log("trace", msg, ...args);
|
|
367
|
+
child(meta2 = {}) {
|
|
368
|
+
return new _PinoLogger(this._pinoLogger.level, { ...this._meta, ...meta2 });
|
|
369
|
+
}
|
|
370
|
+
getBaseLogger() {
|
|
371
|
+
return this._pinoLogger;
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
function logger(level, meta2 = {}) {
|
|
375
|
+
return new PinoLogger(level, meta2);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// src/http/telemetry/openTelemetryCollector.ts
|
|
379
|
+
var OpenTelemetryCollector = class {
|
|
380
|
+
_logger;
|
|
381
|
+
_serviceName;
|
|
382
|
+
_metrics;
|
|
383
|
+
// scoped creation and create this in middleware when api execute. Also add correlation id
|
|
384
|
+
constructor(serviceName, level, metricDefinitions) {
|
|
385
|
+
this._serviceName = serviceName;
|
|
386
|
+
this._logger = logger(level || "info");
|
|
387
|
+
this._metrics = {};
|
|
388
|
+
for (const [metricId, metricType] of Object.entries(
|
|
389
|
+
metricDefinitions ?? {}
|
|
390
|
+
)) {
|
|
391
|
+
switch (metricType) {
|
|
392
|
+
case "counter":
|
|
393
|
+
this._metrics[metricId] = import_api2.metrics.getMeter(this._serviceName).createCounter(metricId);
|
|
394
|
+
break;
|
|
395
|
+
case "gauge":
|
|
396
|
+
this._metrics[metricId] = import_api2.metrics.getMeter(this._serviceName).createGauge(metricId);
|
|
397
|
+
break;
|
|
398
|
+
case "histogram":
|
|
399
|
+
this._metrics[metricId] = import_api2.metrics.getMeter(this._serviceName).createHistogram(metricId);
|
|
400
|
+
break;
|
|
401
|
+
case "upDownCounter":
|
|
402
|
+
this._metrics[metricId] = import_api2.metrics.getMeter(this._serviceName).createUpDownCounter(metricId);
|
|
403
|
+
break;
|
|
404
|
+
case "observableCounter":
|
|
405
|
+
this._metrics[metricId] = import_api2.metrics.getMeter(this._serviceName).createObservableCounter(metricId);
|
|
406
|
+
break;
|
|
407
|
+
case "observableGauge":
|
|
408
|
+
this._metrics[metricId] = import_api2.metrics.getMeter(this._serviceName).createObservableGauge(metricId);
|
|
409
|
+
break;
|
|
410
|
+
case "observableUpDownCounter":
|
|
411
|
+
this._metrics[metricId] = import_api2.metrics.getMeter(this._serviceName).createObservableUpDownCounter(metricId);
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
this.log(
|
|
416
|
+
"info",
|
|
417
|
+
"OpenTelemetry Collector (Traces + Logs + Metrics) started"
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
log(level, ...args) {
|
|
421
|
+
this._logger.log(level, ...args);
|
|
422
|
+
}
|
|
423
|
+
info = (msg, ...args) => {
|
|
424
|
+
this._logger.log("info", msg, ...args);
|
|
425
|
+
};
|
|
426
|
+
error = (msg, ...args) => {
|
|
427
|
+
this._logger.log("error", msg, ...args);
|
|
428
|
+
};
|
|
429
|
+
warn = (msg, ...args) => {
|
|
430
|
+
this._logger.log("warn", msg, ...args);
|
|
431
|
+
};
|
|
432
|
+
debug = (msg, ...args) => {
|
|
433
|
+
this._logger.log("debug", msg, ...args);
|
|
434
|
+
};
|
|
435
|
+
trace = (msg, ...args) => {
|
|
436
|
+
this._logger.log("trace", msg, ...args);
|
|
437
|
+
};
|
|
438
|
+
getMetric(metricId) {
|
|
439
|
+
return this._metrics[metricId];
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
import_dotenv.default.config({ path: (0, import_common3.getEnvVar)("DOTENV_FILE_PATH") });
|
|
443
|
+
function parseOtelHeaders() {
|
|
444
|
+
const headersEnv = (0, import_common3.getEnvVar)("OTEL_EXPORTER_OTLP_HEADERS");
|
|
445
|
+
if (!headersEnv) return void 0;
|
|
446
|
+
const headers = {};
|
|
447
|
+
for (const pair of headersEnv.split(",")) {
|
|
448
|
+
const [key, ...valueParts] = pair.split("=");
|
|
449
|
+
if (key && valueParts.length > 0) {
|
|
450
|
+
headers[key.trim()] = valueParts.join("=").trim();
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return Object.keys(headers).length > 0 ? headers : void 0;
|
|
454
|
+
}
|
|
455
|
+
var otelHeaders = parseOtelHeaders();
|
|
456
|
+
new import_sdk_node.NodeSDK({
|
|
457
|
+
resource: (0, import_resources.resourceFromAttributes)({
|
|
458
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: (0, import_common3.getEnvVar)("OTEL_SERVICE_NAME")
|
|
459
|
+
}),
|
|
460
|
+
traceExporter: new import_exporter_trace_otlp_http.OTLPTraceExporter({
|
|
461
|
+
url: `${(0, import_common3.getEnvVar)("OTEL_EXPORTER_OTLP_ENDPOINT") ?? "http://localhost:4318"}/v1/traces`,
|
|
462
|
+
headers: otelHeaders
|
|
463
|
+
}),
|
|
464
|
+
metricReader: new import_sdk_metrics.PeriodicExportingMetricReader({
|
|
465
|
+
exporter: new import_exporter_metrics_otlp_http.OTLPMetricExporter({
|
|
466
|
+
url: `${(0, import_common3.getEnvVar)("OTEL_EXPORTER_OTLP_ENDPOINT") ?? "http://localhost:4318"}/v1/metrics`,
|
|
467
|
+
headers: otelHeaders
|
|
468
|
+
}),
|
|
469
|
+
exportIntervalMillis: 5e3
|
|
470
|
+
}),
|
|
471
|
+
logRecordProcessors: [
|
|
472
|
+
new import_sdk_logs.BatchLogRecordProcessor({
|
|
473
|
+
exporter: new import_exporter_logs_otlp_http.OTLPLogExporter({
|
|
474
|
+
url: `${(0, import_common3.getEnvVar)("OTEL_EXPORTER_OTLP_ENDPOINT") ?? "http://localhost:4318"}/v1/logs`,
|
|
475
|
+
headers: otelHeaders
|
|
476
|
+
})
|
|
477
|
+
})
|
|
478
|
+
],
|
|
479
|
+
instrumentations: [
|
|
480
|
+
new import_instrumentation_http.HttpInstrumentation({
|
|
481
|
+
applyCustomAttributesOnSpan: (span, request) => {
|
|
482
|
+
span.setAttribute(
|
|
483
|
+
import_semantic_conventions2.ATTR_SERVICE_NAME,
|
|
484
|
+
(0, import_common3.getEnvVar)("OTEL_SERVICE_NAME") ?? "unknown"
|
|
485
|
+
);
|
|
486
|
+
if (isForklaunchRequest(request)) {
|
|
487
|
+
span.setAttribute(ATTR_API_NAME, request.contractDetails?.name);
|
|
488
|
+
span.setAttribute(ATTR_CORRELATION_ID, request.context.correlationId);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}),
|
|
492
|
+
new import_instrumentation_express.ExpressInstrumentation(),
|
|
493
|
+
new import_opentelemetry_instrumentation_hyper_express.HyperExpressInstrumentation()
|
|
494
|
+
]
|
|
495
|
+
}).start();
|
|
496
|
+
var httpRequestsTotalCounter = import_api2.metrics.getMeter((0, import_common3.getEnvVar)("OTEL_SERVICE_NAME") || "unknown").createCounter("http_requests_total", {
|
|
497
|
+
description: "Number of HTTP requests"
|
|
498
|
+
});
|
|
499
|
+
var httpServerDurationHistogram = import_api2.metrics.getMeter((0, import_common3.getEnvVar)("OTEL_SERVICE_NAME") || "unknown").createHistogram("http_server_duration", {
|
|
500
|
+
description: "Duration of HTTP server requests",
|
|
501
|
+
unit: "s"
|
|
502
|
+
});
|
|
503
|
+
var httpRequestDurationMsHistogram = import_api2.metrics.getMeter((0, import_common3.getEnvVar)("OTEL_SERVICE_NAME") || "unknown").createHistogram("http_request_duration_ms", {
|
|
504
|
+
description: "Duration of HTTP requests in milliseconds"
|
|
505
|
+
});
|
|
506
|
+
var httpErrorsTotalCounter = import_api2.metrics.getMeter((0, import_common3.getEnvVar)("OTEL_SERVICE_NAME") || "unknown").createCounter("http_errors_total", {
|
|
507
|
+
description: "Total number of HTTP errors (4xx/5xx)"
|
|
508
|
+
});
|
|
509
|
+
var httpRequestsInFlightCounter = import_api2.metrics.getMeter((0, import_common3.getEnvVar)("OTEL_SERVICE_NAME") || "unknown").createUpDownCounter("http_requests_in_flight", {
|
|
510
|
+
description: "Number of HTTP requests currently in flight"
|
|
511
|
+
});
|
|
512
|
+
|
|
188
513
|
// src/http/middleware/request/createContext.middleware.ts
|
|
189
514
|
function createContext(schemaValidator) {
|
|
190
515
|
return function setContext(req, res, next) {
|
|
@@ -195,16 +520,30 @@ function createContext(schemaValidator) {
|
|
|
195
520
|
}
|
|
196
521
|
res.setHeader("x-correlation-id", correlationId);
|
|
197
522
|
req.context = {
|
|
198
|
-
correlationId
|
|
523
|
+
correlationId,
|
|
524
|
+
requestStartTime: Date.now()
|
|
199
525
|
};
|
|
200
|
-
const
|
|
526
|
+
const serviceName = (0, import_common4.getEnvVar)("OTEL_SERVICE_NAME") || "unknown";
|
|
527
|
+
const inFlightAttrs = {
|
|
528
|
+
[import_semantic_conventions3.ATTR_SERVICE_NAME]: serviceName
|
|
529
|
+
};
|
|
530
|
+
let inFlightActive = true;
|
|
531
|
+
const decrementInFlight = () => {
|
|
532
|
+
if (!inFlightActive) {
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
httpRequestsInFlightCounter.add(-1, inFlightAttrs);
|
|
536
|
+
inFlightActive = false;
|
|
537
|
+
};
|
|
538
|
+
httpRequestsInFlightCounter.add(1, inFlightAttrs);
|
|
539
|
+
res.on("finish", decrementInFlight);
|
|
540
|
+
res.on("close", decrementInFlight);
|
|
541
|
+
res.on("error", decrementInFlight);
|
|
542
|
+
const span = import_api3.trace.getSpan(import_api3.context.active());
|
|
201
543
|
if (span != null) {
|
|
202
544
|
req.context.span = span;
|
|
203
545
|
req.context.span?.setAttribute(ATTR_CORRELATION_ID, correlationId);
|
|
204
|
-
req.context.span?.setAttribute(
|
|
205
|
-
import_semantic_conventions.ATTR_SERVICE_NAME,
|
|
206
|
-
(0, import_common2.getEnvVar)("OTEL_SERVICE_NAME")
|
|
207
|
-
);
|
|
546
|
+
req.context.span?.setAttribute(import_semantic_conventions.ATTR_SERVICE_NAME, serviceName);
|
|
208
547
|
}
|
|
209
548
|
next?.();
|
|
210
549
|
};
|
|
@@ -370,15 +709,15 @@ function isHttpContractDetails(maybeContractDetails) {
|
|
|
370
709
|
}
|
|
371
710
|
|
|
372
711
|
// src/http/middleware/request/auth.middleware.ts
|
|
373
|
-
var
|
|
712
|
+
var import_common7 = require("@forklaunch/common");
|
|
374
713
|
var import_validator = require("@forklaunch/validator");
|
|
375
714
|
|
|
376
715
|
// src/http/discriminateAuthMethod.ts
|
|
377
|
-
var
|
|
716
|
+
var import_common6 = require("@forklaunch/common");
|
|
378
717
|
var import_jose = require("jose");
|
|
379
718
|
|
|
380
719
|
// src/http/createHmacToken.ts
|
|
381
|
-
var
|
|
720
|
+
var import_common5 = require("@forklaunch/common");
|
|
382
721
|
var import_crypto = require("crypto");
|
|
383
722
|
function createHmacToken({
|
|
384
723
|
method,
|
|
@@ -389,7 +728,7 @@ function createHmacToken({
|
|
|
389
728
|
secretKey
|
|
390
729
|
}) {
|
|
391
730
|
const hmac = (0, import_crypto.createHmac)("sha256", secretKey);
|
|
392
|
-
const bodyString = body ? `${(0,
|
|
731
|
+
const bodyString = body ? `${(0, import_common5.safeStringify)(body)}
|
|
393
732
|
` : void 0;
|
|
394
733
|
hmac.update(
|
|
395
734
|
`${method}
|
|
@@ -464,253 +803,88 @@ async function discriminateAuthMethod(auth, openTelemetryCollector) {
|
|
|
464
803
|
} else {
|
|
465
804
|
let jwks;
|
|
466
805
|
if ("jwksPublicKeyUrl" in jwt) {
|
|
467
|
-
jwks = await getCachedJwks(jwt.jwksPublicKeyUrl);
|
|
468
|
-
} else if ("jwksPublicKey" in jwt) {
|
|
469
|
-
jwks = [jwt.jwksPublicKey];
|
|
470
|
-
}
|
|
471
|
-
verificationFunction = async (token) => {
|
|
472
|
-
for (const key of jwks) {
|
|
473
|
-
try {
|
|
474
|
-
const { payload } = await (0, import_jose.jwtVerify)(token, key);
|
|
475
|
-
return payload;
|
|
476
|
-
} catch {
|
|
477
|
-
cachedJwks.value = null;
|
|
478
|
-
cachedJwks.lastUpdated = null;
|
|
479
|
-
cachedJwks.ttl = DEFAULT_TTL;
|
|
480
|
-
continue;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
};
|
|
484
|
-
}
|
|
485
|
-
authMethod = {
|
|
486
|
-
type: "jwt",
|
|
487
|
-
auth: {
|
|
488
|
-
decodeResource: auth.decodeResource,
|
|
489
|
-
verificationFunction
|
|
490
|
-
}
|
|
491
|
-
};
|
|
492
|
-
} else if (isHmacMethod(auth)) {
|
|
493
|
-
authMethod = {
|
|
494
|
-
type: "hmac",
|
|
495
|
-
auth: {
|
|
496
|
-
secretKeys: auth.hmac.secretKeys,
|
|
497
|
-
verificationFunction: async ({
|
|
498
|
-
method,
|
|
499
|
-
path,
|
|
500
|
-
body,
|
|
501
|
-
timestamp,
|
|
502
|
-
nonce,
|
|
503
|
-
signature,
|
|
504
|
-
secretKey
|
|
505
|
-
}) => {
|
|
506
|
-
const computedSignature = createHmacToken({
|
|
507
|
-
method,
|
|
508
|
-
path,
|
|
509
|
-
body,
|
|
510
|
-
timestamp,
|
|
511
|
-
nonce,
|
|
512
|
-
secretKey
|
|
513
|
-
});
|
|
514
|
-
const isValid = computedSignature === signature;
|
|
515
|
-
if (!isValid) {
|
|
516
|
-
const errorInfo = {
|
|
517
|
-
method,
|
|
518
|
-
path,
|
|
519
|
-
timestamp: timestamp.toISOString(),
|
|
520
|
-
nonce,
|
|
521
|
-
receivedSignature: signature,
|
|
522
|
-
computedSignature
|
|
523
|
-
};
|
|
524
|
-
openTelemetryCollector?.debug("[HMAC Verification Failed]", {
|
|
525
|
-
...errorInfo,
|
|
526
|
-
bodyType: body ? typeof body : "undefined",
|
|
527
|
-
body: body ? (0, import_common4.safeStringify)(body) : "undefined"
|
|
528
|
-
});
|
|
529
|
-
}
|
|
530
|
-
return isValid;
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
};
|
|
534
|
-
}
|
|
535
|
-
if (authMethod == null) {
|
|
536
|
-
throw new Error("Invalid auth method");
|
|
537
|
-
}
|
|
538
|
-
return authMethod;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
// src/http/guards/hasFeatureChecks.ts
|
|
542
|
-
function hasFeatureChecks(maybeFeatureAuth) {
|
|
543
|
-
return typeof maybeFeatureAuth === "object" && maybeFeatureAuth !== null && "requiredFeatures" in maybeFeatureAuth && Array.isArray(maybeFeatureAuth.requiredFeatures) && maybeFeatureAuth.requiredFeatures.length > 0;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
// src/http/guards/hasSubscriptionChecks.ts
|
|
547
|
-
function hasSubscriptionChecks(maybeSubscriptionAuth) {
|
|
548
|
-
return typeof maybeSubscriptionAuth === "object" && maybeSubscriptionAuth !== null && "requireActiveSubscription" in maybeSubscriptionAuth && maybeSubscriptionAuth.requireActiveSubscription === true;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
// src/http/telemetry/pinoLogger.ts
|
|
552
|
-
var import_common5 = require("@forklaunch/common");
|
|
553
|
-
var import_api2 = require("@opentelemetry/api");
|
|
554
|
-
var import_api_logs = require("@opentelemetry/api-logs");
|
|
555
|
-
var import_pino = __toESM(require("pino"));
|
|
556
|
-
|
|
557
|
-
// src/http/guards/isLoggerMeta.ts
|
|
558
|
-
function isLoggerMeta(arg) {
|
|
559
|
-
return typeof arg === "object" && arg !== null && "_meta" in arg;
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
// src/http/telemetry/pinoLogger.ts
|
|
563
|
-
function meta(meta2) {
|
|
564
|
-
return meta2;
|
|
565
|
-
}
|
|
566
|
-
function mapSeverity(level) {
|
|
567
|
-
switch (level) {
|
|
568
|
-
case "silent":
|
|
569
|
-
return 0;
|
|
570
|
-
case "trace":
|
|
571
|
-
return 1;
|
|
572
|
-
case "debug":
|
|
573
|
-
return 5;
|
|
574
|
-
case "info":
|
|
575
|
-
return 9;
|
|
576
|
-
case "warn":
|
|
577
|
-
return 13;
|
|
578
|
-
case "error":
|
|
579
|
-
return 17;
|
|
580
|
-
case "fatal":
|
|
581
|
-
return 21;
|
|
582
|
-
default:
|
|
583
|
-
(0, import_common5.isNever)(level);
|
|
584
|
-
return 0;
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
function normalizeLogArgs(args) {
|
|
588
|
-
let message = "";
|
|
589
|
-
const metaObjects = [];
|
|
590
|
-
for (const arg of args) {
|
|
591
|
-
if (typeof arg === "string" && message === "") {
|
|
592
|
-
message = arg;
|
|
593
|
-
} else if (arg instanceof Error) {
|
|
594
|
-
metaObjects.push({
|
|
595
|
-
err: {
|
|
596
|
-
message: arg.message,
|
|
597
|
-
name: arg.name,
|
|
598
|
-
stack: arg.stack,
|
|
599
|
-
...Object.keys(arg).length > 0 ? arg : {}
|
|
600
|
-
}
|
|
601
|
-
});
|
|
602
|
-
} else if (arg && typeof arg === "object" && !Array.isArray(arg)) {
|
|
603
|
-
metaObjects.push(arg);
|
|
604
|
-
} else {
|
|
605
|
-
message += ` ${String(arg)}`;
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
const metadata = Object.assign({}, ...metaObjects);
|
|
609
|
-
return [metadata, message.trim()];
|
|
610
|
-
}
|
|
611
|
-
function safePrettyFormat(level, args, timestamp) {
|
|
612
|
-
try {
|
|
613
|
-
const [metadata, message] = normalizeLogArgs(args);
|
|
614
|
-
const formattedTimestamp = timestamp || (/* @__PURE__ */ new Date()).toISOString();
|
|
615
|
-
return `[${formattedTimestamp}] ${level.toUpperCase()}: ${message}${Object.keys(metadata).length > 0 ? `
|
|
616
|
-
${JSON.stringify(metadata, null, 2)}` : ""}`;
|
|
617
|
-
} catch (error) {
|
|
618
|
-
const fallbackMessage = args.map((arg) => {
|
|
619
|
-
try {
|
|
620
|
-
if (typeof arg === "string") return arg;
|
|
621
|
-
if (arg === null) return "null";
|
|
622
|
-
if (arg === void 0) return "undefined";
|
|
623
|
-
return JSON.stringify(arg);
|
|
624
|
-
} catch {
|
|
625
|
-
return "[Circular/Non-serializable Object]";
|
|
626
|
-
}
|
|
627
|
-
}).join(" ");
|
|
628
|
-
return `[${(/* @__PURE__ */ new Date()).toISOString()}] ${level.toUpperCase()}: ${fallbackMessage} [Pretty Print Error: ${error instanceof Error ? error.message : "Unknown error"}]`;
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
var PinoLogger = class _PinoLogger {
|
|
632
|
-
_pinoLogger;
|
|
633
|
-
_meta;
|
|
634
|
-
constructor(level, meta2 = {}) {
|
|
635
|
-
this._pinoLogger = (0, import_pino.default)({
|
|
636
|
-
level: level || "info",
|
|
637
|
-
formatters: {
|
|
638
|
-
level(label) {
|
|
639
|
-
return { level: label };
|
|
640
|
-
}
|
|
641
|
-
},
|
|
642
|
-
timestamp: import_pino.default.stdTimeFunctions.isoTime,
|
|
643
|
-
transport: {
|
|
644
|
-
target: "pino-pretty",
|
|
645
|
-
options: {
|
|
646
|
-
colorize: true,
|
|
647
|
-
errorLikeObjectKeys: ["err", "error"],
|
|
648
|
-
ignore: "pid,hostname",
|
|
649
|
-
translateTime: "SYS:standard"
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
});
|
|
653
|
-
this._meta = meta2;
|
|
654
|
-
}
|
|
655
|
-
log(level, ...args) {
|
|
656
|
-
let meta2 = {};
|
|
657
|
-
const filteredArgs = args.filter((arg) => {
|
|
658
|
-
if (isLoggerMeta(arg)) {
|
|
659
|
-
Object.assign(meta2, arg);
|
|
660
|
-
return false;
|
|
806
|
+
jwks = await getCachedJwks(jwt.jwksPublicKeyUrl);
|
|
807
|
+
} else if ("jwksPublicKey" in jwt) {
|
|
808
|
+
jwks = [jwt.jwksPublicKey];
|
|
661
809
|
}
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
...activeSpan.attributes,
|
|
675
|
-
...meta2
|
|
810
|
+
verificationFunction = async (token) => {
|
|
811
|
+
for (const key of jwks) {
|
|
812
|
+
try {
|
|
813
|
+
const { payload } = await (0, import_jose.jwtVerify)(token, key);
|
|
814
|
+
return payload;
|
|
815
|
+
} catch {
|
|
816
|
+
cachedJwks.value = null;
|
|
817
|
+
cachedJwks.lastUpdated = null;
|
|
818
|
+
cachedJwks.ttl = DEFAULT_TTL;
|
|
819
|
+
continue;
|
|
820
|
+
}
|
|
821
|
+
}
|
|
676
822
|
};
|
|
677
823
|
}
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
824
|
+
authMethod = {
|
|
825
|
+
type: "jwt",
|
|
826
|
+
auth: {
|
|
827
|
+
decodeResource: auth.decodeResource,
|
|
828
|
+
verificationFunction
|
|
829
|
+
}
|
|
830
|
+
};
|
|
831
|
+
} else if (isHmacMethod(auth)) {
|
|
832
|
+
authMethod = {
|
|
833
|
+
type: "hmac",
|
|
834
|
+
auth: {
|
|
835
|
+
secretKeys: auth.hmac.secretKeys,
|
|
836
|
+
verificationFunction: async ({
|
|
837
|
+
method,
|
|
838
|
+
path,
|
|
839
|
+
body,
|
|
840
|
+
timestamp,
|
|
841
|
+
nonce,
|
|
842
|
+
signature,
|
|
843
|
+
secretKey
|
|
844
|
+
}) => {
|
|
845
|
+
const computedSignature = createHmacToken({
|
|
846
|
+
method,
|
|
847
|
+
path,
|
|
848
|
+
body,
|
|
849
|
+
timestamp,
|
|
850
|
+
nonce,
|
|
851
|
+
secretKey
|
|
852
|
+
});
|
|
853
|
+
const isValid = computedSignature === signature;
|
|
854
|
+
if (!isValid) {
|
|
855
|
+
const errorInfo = {
|
|
856
|
+
method,
|
|
857
|
+
path,
|
|
858
|
+
timestamp: timestamp.toISOString(),
|
|
859
|
+
nonce,
|
|
860
|
+
receivedSignature: signature,
|
|
861
|
+
computedSignature
|
|
862
|
+
};
|
|
863
|
+
openTelemetryCollector?.debug("[HMAC Verification Failed]", {
|
|
864
|
+
...errorInfo,
|
|
865
|
+
bodyType: body ? typeof body : "undefined",
|
|
866
|
+
body: body ? (0, import_common6.safeStringify)(body) : "undefined"
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
return isValid;
|
|
870
|
+
}
|
|
871
|
+
}
|
|
682
872
|
};
|
|
683
|
-
this._pinoLogger[level](...normalizeLogArgs(filteredArgs));
|
|
684
|
-
const formattedBody = safePrettyFormat(level, filteredArgs);
|
|
685
|
-
try {
|
|
686
|
-
import_api_logs.logs.getLogger(process.env.OTEL_SERVICE_NAME ?? "unknown").emit({
|
|
687
|
-
severityText: level,
|
|
688
|
-
severityNumber: mapSeverity(level),
|
|
689
|
-
body: formattedBody,
|
|
690
|
-
attributes: { ...this._meta, ...meta2 }
|
|
691
|
-
});
|
|
692
|
-
} catch (error) {
|
|
693
|
-
console.error("Failed to emit OpenTelemetry log:", error);
|
|
694
|
-
console.log(
|
|
695
|
-
`[${(/* @__PURE__ */ new Date()).toISOString()}] ${level.toUpperCase()}:`,
|
|
696
|
-
...filteredArgs
|
|
697
|
-
);
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
error = (msg, ...args) => this.log("error", msg, ...args);
|
|
701
|
-
info = (msg, ...args) => this.log("info", msg, ...args);
|
|
702
|
-
debug = (msg, ...args) => this.log("debug", msg, ...args);
|
|
703
|
-
warn = (msg, ...args) => this.log("warn", msg, ...args);
|
|
704
|
-
trace = (msg, ...args) => this.log("trace", msg, ...args);
|
|
705
|
-
child(meta2 = {}) {
|
|
706
|
-
return new _PinoLogger(this._pinoLogger.level, { ...this._meta, ...meta2 });
|
|
707
873
|
}
|
|
708
|
-
|
|
709
|
-
|
|
874
|
+
if (authMethod == null) {
|
|
875
|
+
throw new Error("Invalid auth method");
|
|
710
876
|
}
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
877
|
+
return authMethod;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
// src/http/guards/hasFeatureChecks.ts
|
|
881
|
+
function hasFeatureChecks(maybeFeatureAuth) {
|
|
882
|
+
return typeof maybeFeatureAuth === "object" && maybeFeatureAuth !== null && "requiredFeatures" in maybeFeatureAuth && Array.isArray(maybeFeatureAuth.requiredFeatures) && maybeFeatureAuth.requiredFeatures.length > 0;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
// src/http/guards/hasSubscriptionChecks.ts
|
|
886
|
+
function hasSubscriptionChecks(maybeSubscriptionAuth) {
|
|
887
|
+
return typeof maybeSubscriptionAuth === "object" && maybeSubscriptionAuth !== null && "requireActiveSubscription" in maybeSubscriptionAuth && maybeSubscriptionAuth.requireActiveSubscription === true;
|
|
714
888
|
}
|
|
715
889
|
|
|
716
890
|
// src/http/middleware/request/auth.middleware.ts
|
|
@@ -863,7 +1037,7 @@ async function checkAuthorizationToken(req, authorizationMethod, authorizationTo
|
|
|
863
1037
|
break;
|
|
864
1038
|
}
|
|
865
1039
|
default:
|
|
866
|
-
(0,
|
|
1040
|
+
(0, import_common7.isNever)(type);
|
|
867
1041
|
return [401, "Invalid Authorization method."];
|
|
868
1042
|
}
|
|
869
1043
|
if (isHmacMethod(collapsedAuthorizationMethod) && sessionPayload == null) {
|
|
@@ -1003,155 +1177,6 @@ async function parseRequestAuth(req, res, next) {
|
|
|
1003
1177
|
|
|
1004
1178
|
// src/http/middleware/request/enrichDetails.middleware.ts
|
|
1005
1179
|
var import_common8 = require("@forklaunch/common");
|
|
1006
|
-
|
|
1007
|
-
// src/http/telemetry/openTelemetryCollector.ts
|
|
1008
|
-
var import_common7 = require("@forklaunch/common");
|
|
1009
|
-
var import_opentelemetry_instrumentation_hyper_express = require("@forklaunch/opentelemetry-instrumentation-hyper-express");
|
|
1010
|
-
var import_api3 = require("@opentelemetry/api");
|
|
1011
|
-
var import_exporter_logs_otlp_http = require("@opentelemetry/exporter-logs-otlp-http");
|
|
1012
|
-
var import_exporter_metrics_otlp_http = require("@opentelemetry/exporter-metrics-otlp-http");
|
|
1013
|
-
var import_exporter_trace_otlp_http = require("@opentelemetry/exporter-trace-otlp-http");
|
|
1014
|
-
var import_instrumentation_express = require("@opentelemetry/instrumentation-express");
|
|
1015
|
-
var import_instrumentation_http = require("@opentelemetry/instrumentation-http");
|
|
1016
|
-
var import_resources = require("@opentelemetry/resources");
|
|
1017
|
-
var import_sdk_logs = require("@opentelemetry/sdk-logs");
|
|
1018
|
-
var import_sdk_metrics = require("@opentelemetry/sdk-metrics");
|
|
1019
|
-
var import_sdk_node = require("@opentelemetry/sdk-node");
|
|
1020
|
-
var import_semantic_conventions2 = require("@opentelemetry/semantic-conventions");
|
|
1021
|
-
var import_dotenv = __toESM(require("dotenv"));
|
|
1022
|
-
|
|
1023
|
-
// src/http/guards/isForklaunchRequest.ts
|
|
1024
|
-
function isForklaunchRequest(request) {
|
|
1025
|
-
return request != null && typeof request === "object" && "contractDetails" in request;
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
// src/http/telemetry/openTelemetryCollector.ts
|
|
1029
|
-
var OpenTelemetryCollector = class {
|
|
1030
|
-
_logger;
|
|
1031
|
-
_serviceName;
|
|
1032
|
-
_metrics;
|
|
1033
|
-
// scoped creation and create this in middleware when api execute. Also add correlation id
|
|
1034
|
-
constructor(serviceName, level, metricDefinitions) {
|
|
1035
|
-
this._serviceName = serviceName;
|
|
1036
|
-
this._logger = logger(level || "info");
|
|
1037
|
-
this._metrics = {};
|
|
1038
|
-
for (const [metricId, metricType] of Object.entries(
|
|
1039
|
-
metricDefinitions ?? {}
|
|
1040
|
-
)) {
|
|
1041
|
-
switch (metricType) {
|
|
1042
|
-
case "counter":
|
|
1043
|
-
this._metrics[metricId] = import_api3.metrics.getMeter(this._serviceName).createCounter(metricId);
|
|
1044
|
-
break;
|
|
1045
|
-
case "gauge":
|
|
1046
|
-
this._metrics[metricId] = import_api3.metrics.getMeter(this._serviceName).createGauge(metricId);
|
|
1047
|
-
break;
|
|
1048
|
-
case "histogram":
|
|
1049
|
-
this._metrics[metricId] = import_api3.metrics.getMeter(this._serviceName).createHistogram(metricId);
|
|
1050
|
-
break;
|
|
1051
|
-
case "upDownCounter":
|
|
1052
|
-
this._metrics[metricId] = import_api3.metrics.getMeter(this._serviceName).createUpDownCounter(metricId);
|
|
1053
|
-
break;
|
|
1054
|
-
case "observableCounter":
|
|
1055
|
-
this._metrics[metricId] = import_api3.metrics.getMeter(this._serviceName).createObservableCounter(metricId);
|
|
1056
|
-
break;
|
|
1057
|
-
case "observableGauge":
|
|
1058
|
-
this._metrics[metricId] = import_api3.metrics.getMeter(this._serviceName).createObservableGauge(metricId);
|
|
1059
|
-
break;
|
|
1060
|
-
case "observableUpDownCounter":
|
|
1061
|
-
this._metrics[metricId] = import_api3.metrics.getMeter(this._serviceName).createObservableUpDownCounter(metricId);
|
|
1062
|
-
break;
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
this.log(
|
|
1066
|
-
"info",
|
|
1067
|
-
"OpenTelemetry Collector (Traces + Logs + Metrics) started"
|
|
1068
|
-
);
|
|
1069
|
-
}
|
|
1070
|
-
log(level, ...args) {
|
|
1071
|
-
this._logger.log(level, ...args);
|
|
1072
|
-
}
|
|
1073
|
-
info = (msg, ...args) => {
|
|
1074
|
-
this._logger.log("info", msg, ...args);
|
|
1075
|
-
};
|
|
1076
|
-
error = (msg, ...args) => {
|
|
1077
|
-
this._logger.log("error", msg, ...args);
|
|
1078
|
-
};
|
|
1079
|
-
warn = (msg, ...args) => {
|
|
1080
|
-
this._logger.log("warn", msg, ...args);
|
|
1081
|
-
};
|
|
1082
|
-
debug = (msg, ...args) => {
|
|
1083
|
-
this._logger.log("debug", msg, ...args);
|
|
1084
|
-
};
|
|
1085
|
-
trace = (msg, ...args) => {
|
|
1086
|
-
this._logger.log("trace", msg, ...args);
|
|
1087
|
-
};
|
|
1088
|
-
getMetric(metricId) {
|
|
1089
|
-
return this._metrics[metricId];
|
|
1090
|
-
}
|
|
1091
|
-
};
|
|
1092
|
-
import_dotenv.default.config({ path: (0, import_common7.getEnvVar)("DOTENV_FILE_PATH") });
|
|
1093
|
-
function parseOtelHeaders() {
|
|
1094
|
-
const headersEnv = (0, import_common7.getEnvVar)("OTEL_EXPORTER_OTLP_HEADERS");
|
|
1095
|
-
if (!headersEnv) return void 0;
|
|
1096
|
-
const headers = {};
|
|
1097
|
-
for (const pair of headersEnv.split(",")) {
|
|
1098
|
-
const [key, ...valueParts] = pair.split("=");
|
|
1099
|
-
if (key && valueParts.length > 0) {
|
|
1100
|
-
headers[key.trim()] = valueParts.join("=").trim();
|
|
1101
|
-
}
|
|
1102
|
-
}
|
|
1103
|
-
return Object.keys(headers).length > 0 ? headers : void 0;
|
|
1104
|
-
}
|
|
1105
|
-
var otelHeaders = parseOtelHeaders();
|
|
1106
|
-
new import_sdk_node.NodeSDK({
|
|
1107
|
-
resource: (0, import_resources.resourceFromAttributes)({
|
|
1108
|
-
[import_semantic_conventions2.ATTR_SERVICE_NAME]: (0, import_common7.getEnvVar)("OTEL_SERVICE_NAME")
|
|
1109
|
-
}),
|
|
1110
|
-
traceExporter: new import_exporter_trace_otlp_http.OTLPTraceExporter({
|
|
1111
|
-
url: `${(0, import_common7.getEnvVar)("OTEL_EXPORTER_OTLP_ENDPOINT") ?? "http://localhost:4318"}/v1/traces`,
|
|
1112
|
-
headers: otelHeaders
|
|
1113
|
-
}),
|
|
1114
|
-
metricReader: new import_sdk_metrics.PeriodicExportingMetricReader({
|
|
1115
|
-
exporter: new import_exporter_metrics_otlp_http.OTLPMetricExporter({
|
|
1116
|
-
url: `${(0, import_common7.getEnvVar)("OTEL_EXPORTER_OTLP_ENDPOINT") ?? "http://localhost:4318"}/v1/metrics`,
|
|
1117
|
-
headers: otelHeaders
|
|
1118
|
-
}),
|
|
1119
|
-
exportIntervalMillis: 5e3
|
|
1120
|
-
}),
|
|
1121
|
-
logRecordProcessors: [
|
|
1122
|
-
new import_sdk_logs.BatchLogRecordProcessor(
|
|
1123
|
-
new import_exporter_logs_otlp_http.OTLPLogExporter({
|
|
1124
|
-
url: `${(0, import_common7.getEnvVar)("OTEL_EXPORTER_OTLP_ENDPOINT") ?? "http://localhost:4318"}/v1/logs`,
|
|
1125
|
-
headers: otelHeaders
|
|
1126
|
-
})
|
|
1127
|
-
)
|
|
1128
|
-
],
|
|
1129
|
-
instrumentations: [
|
|
1130
|
-
new import_instrumentation_http.HttpInstrumentation({
|
|
1131
|
-
applyCustomAttributesOnSpan: (span, request) => {
|
|
1132
|
-
span.setAttribute(
|
|
1133
|
-
import_semantic_conventions2.ATTR_SERVICE_NAME,
|
|
1134
|
-
(0, import_common7.getEnvVar)("OTEL_SERVICE_NAME") ?? "unknown"
|
|
1135
|
-
);
|
|
1136
|
-
if (isForklaunchRequest(request)) {
|
|
1137
|
-
span.setAttribute(ATTR_API_NAME, request.contractDetails?.name);
|
|
1138
|
-
span.setAttribute(ATTR_CORRELATION_ID, request.context.correlationId);
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
}),
|
|
1142
|
-
new import_instrumentation_express.ExpressInstrumentation(),
|
|
1143
|
-
new import_opentelemetry_instrumentation_hyper_express.HyperExpressInstrumentation()
|
|
1144
|
-
]
|
|
1145
|
-
}).start();
|
|
1146
|
-
var httpRequestsTotalCounter = import_api3.metrics.getMeter((0, import_common7.getEnvVar)("OTEL_SERVICE_NAME") || "unknown").createCounter("http_requests_total", {
|
|
1147
|
-
description: "Number of HTTP requests"
|
|
1148
|
-
});
|
|
1149
|
-
var httpServerDurationHistogram = import_api3.metrics.getMeter((0, import_common7.getEnvVar)("OTEL_SERVICE_NAME") || "unknown").createHistogram("http_server_duration", {
|
|
1150
|
-
description: "Duration of HTTP server requests",
|
|
1151
|
-
unit: "s"
|
|
1152
|
-
});
|
|
1153
|
-
|
|
1154
|
-
// src/http/middleware/request/enrichDetails.middleware.ts
|
|
1155
1180
|
function enrichDetails(path, contractDetails, requestSchema, responseSchemas, openTelemetryCollector, globalOptions) {
|
|
1156
1181
|
return (req, res, next) => {
|
|
1157
1182
|
req.originalPath = path;
|
|
@@ -3840,19 +3865,26 @@ var import_stream = require("stream");
|
|
|
3840
3865
|
|
|
3841
3866
|
// src/http/telemetry/recordMetric.ts
|
|
3842
3867
|
var import_common13 = require("@forklaunch/common");
|
|
3843
|
-
var
|
|
3868
|
+
var import_semantic_conventions4 = require("@opentelemetry/semantic-conventions");
|
|
3844
3869
|
function recordMetric(req, res) {
|
|
3845
3870
|
if (res.metricRecorded) {
|
|
3846
3871
|
return;
|
|
3847
3872
|
}
|
|
3848
|
-
|
|
3849
|
-
|
|
3873
|
+
const serviceName = (0, import_common13.getEnvVar)("OTEL_SERVICE_NAME") || "unknown";
|
|
3874
|
+
const attrs = {
|
|
3875
|
+
[import_semantic_conventions4.ATTR_SERVICE_NAME]: serviceName,
|
|
3850
3876
|
[ATTR_APPLICATION_ID]: (0, import_common13.getEnvVar)("OTEL_APPLICATION_ID"),
|
|
3851
3877
|
[ATTR_API_NAME]: req.contractDetails?.name,
|
|
3852
|
-
[
|
|
3853
|
-
[
|
|
3854
|
-
[
|
|
3855
|
-
}
|
|
3878
|
+
[import_semantic_conventions4.ATTR_HTTP_REQUEST_METHOD]: req.method,
|
|
3879
|
+
[import_semantic_conventions4.ATTR_HTTP_ROUTE]: req.originalPath,
|
|
3880
|
+
[import_semantic_conventions4.ATTR_HTTP_RESPONSE_STATUS_CODE]: Number(res.statusCode) || 0
|
|
3881
|
+
};
|
|
3882
|
+
httpRequestsTotalCounter.add(1, attrs);
|
|
3883
|
+
const durationMs = req.context?.requestStartTime != null ? Date.now() - req.context.requestStartTime : 0;
|
|
3884
|
+
httpRequestDurationMsHistogram.record(durationMs, attrs);
|
|
3885
|
+
if (Number(res.statusCode) >= 400) {
|
|
3886
|
+
httpErrorsTotalCounter.add(1, attrs);
|
|
3887
|
+
}
|
|
3856
3888
|
res.metricRecorded = true;
|
|
3857
3889
|
}
|
|
3858
3890
|
|
|
@@ -4495,6 +4527,9 @@ var RateLimiter = class {
|
|
|
4495
4527
|
getCachedJwks,
|
|
4496
4528
|
getCodeForStatus,
|
|
4497
4529
|
head,
|
|
4530
|
+
httpErrorsTotalCounter,
|
|
4531
|
+
httpRequestDurationMsHistogram,
|
|
4532
|
+
httpRequestsInFlightCounter,
|
|
4498
4533
|
httpRequestsTotalCounter,
|
|
4499
4534
|
httpServerDurationHistogram,
|
|
4500
4535
|
isClientError,
|