@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.
Files changed (265) hide show
  1. package/lib/cache/{index.d.mts → cacheKey.d.ts} +2 -6
  2. package/lib/cache/cacheKey.d.ts.map +1 -0
  3. package/lib/cache/index.d.ts +4 -15
  4. package/lib/cache/index.d.ts.map +1 -0
  5. package/lib/{ttlCache.interface-B3xaLT00.d.ts → cache/interfaces/ttlCache.interface.d.ts} +3 -5
  6. package/lib/cache/interfaces/ttlCache.interface.d.ts.map +1 -0
  7. package/lib/{ttlCacheRecord.types-oX0ti5SP.d.mts → cache/types/ttlCacheRecord.types.d.ts} +3 -4
  8. package/lib/cache/types/ttlCacheRecord.types.d.ts.map +1 -0
  9. package/lib/controllers/index.d.ts +2 -13
  10. package/lib/controllers/index.d.ts.map +1 -0
  11. package/lib/controllers/{index.d.mts → interfaces/controller.interface.d.ts} +2 -3
  12. package/lib/controllers/interfaces/controller.interface.d.ts.map +1 -0
  13. package/lib/environment/index.d.ts +2 -28
  14. package/lib/environment/index.d.ts.map +1 -0
  15. package/lib/environment/{index.d.mts → loadCascadingEnv.d.ts} +4 -5
  16. package/lib/environment/loadCascadingEnv.d.ts.map +1 -0
  17. package/lib/http/application/expressLikeApplication.d.ts +34 -0
  18. package/lib/http/application/expressLikeApplication.d.ts.map +1 -0
  19. package/lib/http/bootstrap/listen.d.ts +2 -0
  20. package/lib/http/bootstrap/listen.d.ts.map +1 -0
  21. package/lib/http/cluster/cluster.types.d.ts +17 -0
  22. package/lib/http/cluster/cluster.types.d.ts.map +1 -0
  23. package/lib/http/cluster/isPortBound.d.ts +2 -0
  24. package/lib/http/cluster/isPortBound.d.ts.map +1 -0
  25. package/lib/http/createHmacToken.d.ts +19 -0
  26. package/lib/http/createHmacToken.d.ts.map +1 -0
  27. package/lib/http/discriminateAuthMethod.d.ts +85 -0
  28. package/lib/http/discriminateAuthMethod.d.ts.map +1 -0
  29. package/lib/http/generateHmacAuthHeaders.d.ts +31 -0
  30. package/lib/http/generateHmacAuthHeaders.d.ts.map +1 -0
  31. package/lib/http/guards/hasFeatureChecks.d.ts +2 -0
  32. package/lib/http/guards/hasFeatureChecks.d.ts.map +1 -0
  33. package/lib/http/guards/hasPermissionChecks.d.ts +2 -0
  34. package/lib/http/guards/hasPermissionChecks.d.ts.map +1 -0
  35. package/lib/http/guards/hasRoleChecks.d.ts +2 -0
  36. package/lib/http/guards/hasRoleChecks.d.ts.map +1 -0
  37. package/lib/http/guards/hasScopeChecks.d.ts +2 -0
  38. package/lib/http/guards/hasScopeChecks.d.ts.map +1 -0
  39. package/lib/http/guards/hasSend.d.ts +17 -0
  40. package/lib/http/guards/hasSend.d.ts.map +1 -0
  41. package/lib/http/guards/hasSubscriptionChecks.d.ts +2 -0
  42. package/lib/http/guards/hasSubscriptionChecks.d.ts.map +1 -0
  43. package/lib/http/guards/hasVersionedSchema.d.ts +2 -0
  44. package/lib/http/guards/hasVersionedSchema.d.ts.map +1 -0
  45. package/lib/http/guards/isBasicAuthMethod.d.ts +3 -0
  46. package/lib/http/guards/isBasicAuthMethod.d.ts.map +1 -0
  47. package/lib/http/guards/isConstrainedForklaunchRouter.d.ts +21 -0
  48. package/lib/http/guards/isConstrainedForklaunchRouter.d.ts.map +1 -0
  49. package/lib/http/guards/isExpressLikeSchemaHandler.d.ts +32 -0
  50. package/lib/http/guards/isExpressLikeSchemaHandler.d.ts.map +1 -0
  51. package/lib/http/guards/isForklaunchExpressLikeRouter.d.ts +28 -0
  52. package/lib/http/guards/isForklaunchExpressLikeRouter.d.ts.map +1 -0
  53. package/lib/http/guards/isForklaunchRequest.d.ts +26 -0
  54. package/lib/http/guards/isForklaunchRequest.d.ts.map +1 -0
  55. package/lib/http/guards/isForklaunchResponse.d.ts +23 -0
  56. package/lib/http/guards/isForklaunchResponse.d.ts.map +1 -0
  57. package/lib/http/guards/isForklaunchRouter.d.ts +21 -0
  58. package/lib/http/guards/isForklaunchRouter.d.ts.map +1 -0
  59. package/lib/http/guards/isHmacMethod.d.ts +9 -0
  60. package/lib/http/guards/isHmacMethod.d.ts.map +1 -0
  61. package/lib/http/guards/isHttpContractDetails.d.ts +29 -0
  62. package/lib/http/guards/isHttpContractDetails.d.ts.map +1 -0
  63. package/lib/http/guards/isJwtAuthMethod.d.ts +3 -0
  64. package/lib/http/guards/isJwtAuthMethod.d.ts.map +1 -0
  65. package/lib/http/guards/isLoggerMeta.d.ts +3 -0
  66. package/lib/http/guards/isLoggerMeta.d.ts.map +1 -0
  67. package/lib/http/guards/isPath.d.ts +2 -0
  68. package/lib/http/guards/isPath.d.ts.map +1 -0
  69. package/lib/http/guards/isPathParamContractDetails.d.ts +4 -0
  70. package/lib/http/guards/isPathParamContractDetails.d.ts.map +1 -0
  71. package/lib/http/guards/isRequestShape.d.ts +3 -0
  72. package/lib/http/guards/isRequestShape.d.ts.map +1 -0
  73. package/lib/http/guards/isResponseCompiledSchema.d.ts +3 -0
  74. package/lib/http/guards/isResponseCompiledSchema.d.ts.map +1 -0
  75. package/lib/http/guards/isSdkHandler.d.ts +9 -0
  76. package/lib/http/guards/isSdkHandler.d.ts.map +1 -0
  77. package/lib/http/guards/isSdkRouter.d.ts +9 -0
  78. package/lib/http/guards/isSdkRouter.d.ts.map +1 -0
  79. package/lib/http/guards/isTypedHandler.d.ts +5 -0
  80. package/lib/http/guards/isTypedHandler.d.ts.map +1 -0
  81. package/lib/http/guards/isVersionedInputSchema.d.ts +3 -0
  82. package/lib/http/guards/isVersionedInputSchema.d.ts.map +1 -0
  83. package/lib/http/handlers/delete.d.ts +5 -0
  84. package/lib/http/handlers/delete.d.ts.map +1 -0
  85. package/lib/http/handlers/get.d.ts +5 -0
  86. package/lib/http/handlers/get.d.ts.map +1 -0
  87. package/lib/http/handlers/head.d.ts +5 -0
  88. package/lib/http/handlers/head.d.ts.map +1 -0
  89. package/lib/http/handlers/middleware.d.ts +10 -0
  90. package/lib/http/handlers/middleware.d.ts.map +1 -0
  91. package/lib/http/handlers/options.d.ts +5 -0
  92. package/lib/http/handlers/options.d.ts.map +1 -0
  93. package/lib/http/handlers/patch.d.ts +5 -0
  94. package/lib/http/handlers/patch.d.ts.map +1 -0
  95. package/lib/http/handlers/post.d.ts +5 -0
  96. package/lib/http/handlers/post.d.ts.map +1 -0
  97. package/lib/http/handlers/put.d.ts +5 -0
  98. package/lib/http/handlers/put.d.ts.map +1 -0
  99. package/lib/http/handlers/trace.d.ts +5 -0
  100. package/lib/http/handlers/trace.d.ts.map +1 -0
  101. package/lib/http/handlers/typedAuthHandler.d.ts +5 -0
  102. package/lib/http/handlers/typedAuthHandler.d.ts.map +1 -0
  103. package/lib/http/handlers/typedHandler.d.ts +14 -0
  104. package/lib/http/handlers/typedHandler.d.ts.map +1 -0
  105. package/lib/http/httpStatusCodes.d.ts +75 -0
  106. package/lib/http/httpStatusCodes.d.ts.map +1 -0
  107. package/lib/http/index.d.ts +47 -1244
  108. package/lib/http/index.d.ts.map +1 -0
  109. package/lib/http/index.js +445 -410
  110. package/lib/http/index.js.map +1 -1
  111. package/lib/http/index.mjs +439 -407
  112. package/lib/http/index.mjs.map +1 -1
  113. package/lib/http/interfaces/expressLikeRouter.interface.d.ts +25 -0
  114. package/lib/http/interfaces/expressLikeRouter.interface.d.ts.map +1 -0
  115. package/lib/http/mcpGenerator/mcpGenerator.d.ts +17 -0
  116. package/lib/http/mcpGenerator/mcpGenerator.d.ts.map +1 -0
  117. package/lib/http/middleware/request/auth.middleware.d.ts +16 -0
  118. package/lib/http/middleware/request/auth.middleware.d.ts.map +1 -0
  119. package/lib/http/middleware/request/cors.middleware.d.ts +13 -0
  120. package/lib/http/middleware/request/cors.middleware.d.ts.map +1 -0
  121. package/lib/http/middleware/request/createContext.middleware.d.ts +15 -0
  122. package/lib/http/middleware/request/createContext.middleware.d.ts.map +1 -0
  123. package/lib/http/middleware/request/enrichDetails.middleware.d.ts +18 -0
  124. package/lib/http/middleware/request/enrichDetails.middleware.d.ts.map +1 -0
  125. package/lib/http/middleware/request/parse.middleware.d.ts +17 -0
  126. package/lib/http/middleware/request/parse.middleware.d.ts.map +1 -0
  127. package/lib/http/middleware/request/tenantContext.middleware.d.ts +41 -0
  128. package/lib/http/middleware/request/tenantContext.middleware.d.ts.map +1 -0
  129. package/lib/http/middleware/response/enrichExpressLikeSend.middleware.d.ts +32 -0
  130. package/lib/http/middleware/response/enrichExpressLikeSend.middleware.d.ts.map +1 -0
  131. package/lib/http/middleware/response/parse.middleware.d.ts +31 -0
  132. package/lib/http/middleware/response/parse.middleware.d.ts.map +1 -0
  133. package/lib/http/openApiV3Generator/openApiV3Generator.d.ts +17 -0
  134. package/lib/http/openApiV3Generator/openApiV3Generator.d.ts.map +1 -0
  135. package/lib/http/rateLimit/index.d.ts +2 -0
  136. package/lib/http/rateLimit/index.d.ts.map +1 -0
  137. package/lib/http/rateLimit/rateLimiter.d.ts +66 -0
  138. package/lib/http/rateLimit/rateLimiter.d.ts.map +1 -0
  139. package/lib/http/router/discriminateBody.d.ts +43 -0
  140. package/lib/http/router/discriminateBody.d.ts.map +1 -0
  141. package/lib/http/router/expressLikeRouter.d.ts +240 -0
  142. package/lib/http/router/expressLikeRouter.d.ts.map +1 -0
  143. package/lib/http/router/routerSharedLogic.d.ts +50 -0
  144. package/lib/http/router/routerSharedLogic.d.ts.map +1 -0
  145. package/lib/http/router/unpackRouters.d.ts +7 -0
  146. package/lib/http/router/unpackRouters.d.ts.map +1 -0
  147. package/lib/http/telemetry/auditLogger.d.ts +21 -0
  148. package/lib/http/telemetry/auditLogger.d.ts.map +1 -0
  149. package/lib/http/telemetry/constants.d.ts +6 -0
  150. package/lib/http/telemetry/constants.d.ts.map +1 -0
  151. package/lib/http/telemetry/evaluateTelemetryOptions.d.ts +11 -0
  152. package/lib/http/telemetry/evaluateTelemetryOptions.d.ts.map +1 -0
  153. package/lib/http/telemetry/metricsDefinition.d.ts +3 -0
  154. package/lib/http/telemetry/metricsDefinition.d.ts.map +1 -0
  155. package/lib/http/telemetry/openTelemetryCollector.d.ts +53 -0
  156. package/lib/http/telemetry/openTelemetryCollector.d.ts.map +1 -0
  157. package/lib/http/telemetry/pinoLogger.d.ts +20 -0
  158. package/lib/http/telemetry/pinoLogger.d.ts.map +1 -0
  159. package/lib/http/telemetry/recordMetric.d.ts +5 -0
  160. package/lib/http/telemetry/recordMetric.d.ts.map +1 -0
  161. package/lib/http/types/apiDefinition.types.d.ts +471 -0
  162. package/lib/http/types/apiDefinition.types.d.ts.map +1 -0
  163. package/lib/http/types/contractDetails.types.d.ts +404 -0
  164. package/lib/http/types/contractDetails.types.d.ts.map +1 -0
  165. package/lib/http/types/docsConfiguration.types.d.ts +7 -0
  166. package/lib/http/types/docsConfiguration.types.d.ts.map +1 -0
  167. package/lib/http/types/expressLikeOptions.d.ts +224 -0
  168. package/lib/http/types/expressLikeOptions.d.ts.map +1 -0
  169. package/lib/http/types/expressLikeRouter.types.d.ts +127 -0
  170. package/lib/http/types/expressLikeRouter.types.d.ts.map +1 -0
  171. package/lib/http/types/openTelemetryCollector.types.d.ts +21 -0
  172. package/lib/http/types/openTelemetryCollector.types.d.ts.map +1 -0
  173. package/lib/http/types/router.types.d.ts +52 -0
  174. package/lib/http/types/router.types.d.ts.map +1 -0
  175. package/lib/http/types/sdk.types.d.ts +259 -0
  176. package/lib/http/types/sdk.types.d.ts.map +1 -0
  177. package/lib/http/types/typedHandler.types.d.ts +18 -0
  178. package/lib/http/types/typedHandler.types.d.ts.map +1 -0
  179. package/lib/mappers/guards/isSchemaResolutionFunction.d.ts +10 -0
  180. package/lib/mappers/guards/isSchemaResolutionFunction.d.ts.map +1 -0
  181. package/lib/mappers/index.d.ts +3 -68
  182. package/lib/mappers/index.d.ts.map +1 -0
  183. package/lib/mappers/mapServiceSchemas.d.ts +33 -0
  184. package/lib/mappers/mapServiceSchemas.d.ts.map +1 -0
  185. package/lib/mappers/mapper.d.ts +26 -0
  186. package/lib/mappers/mapper.d.ts.map +1 -0
  187. package/lib/mappers/types/schemaResolution.types.d.ts +9 -0
  188. package/lib/mappers/types/schemaResolution.types.d.ts.map +1 -0
  189. package/lib/objectstore/index.d.ts +3 -71
  190. package/lib/objectstore/index.d.ts.map +1 -0
  191. package/lib/objectstore/{index.d.mts → interfaces/objectstore.interface.d.ts} +3 -16
  192. package/lib/objectstore/interfaces/objectstore.interface.d.ts.map +1 -0
  193. package/lib/objectstore/objectstoreKey.d.ts +11 -0
  194. package/lib/objectstore/objectstoreKey.d.ts.map +1 -0
  195. package/lib/persistence/complianceEventSubscriber.d.ts +13 -0
  196. package/lib/persistence/complianceEventSubscriber.d.ts.map +1 -0
  197. package/lib/persistence/compliancePropertyBuilder.d.ts +26 -0
  198. package/lib/persistence/compliancePropertyBuilder.d.ts.map +1 -0
  199. package/lib/persistence/complianceTypes.d.ts +64 -0
  200. package/lib/persistence/complianceTypes.d.ts.map +1 -0
  201. package/lib/persistence/defineComplianceEntity.d.ts +19 -0
  202. package/lib/persistence/defineComplianceEntity.d.ts.map +1 -0
  203. package/lib/persistence/encryptedType.d.ts +85 -0
  204. package/lib/persistence/encryptedType.d.ts.map +1 -0
  205. package/lib/persistence/fieldEncryptor.d.ts +48 -0
  206. package/lib/persistence/fieldEncryptor.d.ts.map +1 -0
  207. package/lib/persistence/index.d.ts +10 -403
  208. package/lib/persistence/index.d.ts.map +1 -0
  209. package/lib/persistence/index.js.map +1 -1
  210. package/lib/persistence/index.mjs.map +1 -1
  211. package/lib/persistence/rls.d.ts +56 -0
  212. package/lib/persistence/rls.d.ts.map +1 -0
  213. package/lib/persistence/tenantEm.d.ts +60 -0
  214. package/lib/persistence/tenantEm.d.ts.map +1 -0
  215. package/lib/persistence/tenantFilter.d.ts +47 -0
  216. package/lib/persistence/tenantFilter.d.ts.map +1 -0
  217. package/lib/secrets/index.d.ts +2 -0
  218. package/lib/secrets/index.d.ts.map +1 -0
  219. package/lib/secrets/secretsAccessor.d.ts +17 -0
  220. package/lib/secrets/secretsAccessor.d.ts.map +1 -0
  221. package/lib/services/complianceDataService.d.ts +47 -0
  222. package/lib/services/complianceDataService.d.ts.map +1 -0
  223. package/lib/services/configInjector.d.ts +43 -0
  224. package/lib/services/configInjector.d.ts.map +1 -0
  225. package/lib/services/guards/isConstructed.d.ts +3 -0
  226. package/lib/services/guards/isConstructed.d.ts.map +1 -0
  227. package/lib/services/guards/isConstructedSingleton.d.ts +3 -0
  228. package/lib/services/guards/isConstructedSingleton.d.ts.map +1 -0
  229. package/lib/services/guards/isConstructor.d.ts +3 -0
  230. package/lib/services/guards/isConstructor.d.ts.map +1 -0
  231. package/lib/services/index.d.ts +10 -184
  232. package/lib/services/index.d.ts.map +1 -0
  233. package/lib/services/retentionService.d.ts +31 -0
  234. package/lib/services/retentionService.d.ts.map +1 -0
  235. package/lib/services/runRetentionEnforcement.d.ts +19 -0
  236. package/lib/services/runRetentionEnforcement.d.ts.map +1 -0
  237. package/lib/services/types/configInjector.types.d.ts +39 -0
  238. package/lib/services/types/configInjector.types.d.ts.map +1 -0
  239. package/lib/services/types/entityManager.types.d.ts +4 -0
  240. package/lib/services/types/entityManager.types.d.ts.map +1 -0
  241. package/lib/services/types/service.types.d.ts +5 -0
  242. package/lib/services/types/service.types.d.ts.map +1 -0
  243. package/lib/ws/asyncApiV3Generator/asyncApiV3Generator.d.ts +12 -0
  244. package/lib/ws/asyncApiV3Generator/asyncApiV3Generator.d.ts.map +1 -0
  245. package/lib/ws/index.d.ts +4 -67
  246. package/lib/ws/index.d.ts.map +1 -0
  247. package/lib/ws/index.js.map +1 -1
  248. package/lib/ws/index.mjs.map +1 -1
  249. package/lib/ws/types/eventSchema.types.d.ts +28 -0
  250. package/lib/ws/types/eventSchema.types.d.ts.map +1 -0
  251. package/lib/ws/webSocketLike.d.ts +18 -0
  252. package/lib/ws/webSocketLike.d.ts.map +1 -0
  253. package/package.json +45 -44
  254. package/LICENSE +0 -21
  255. package/lib/apiDefinition.types-DF_crhB0.d.mts +0 -1092
  256. package/lib/apiDefinition.types-DW4lfZqy.d.ts +0 -1092
  257. package/lib/http/index.d.mts +0 -1244
  258. package/lib/mappers/index.d.mts +0 -68
  259. package/lib/openTelemetryCollector-BS-ej09T.d.mts +0 -70
  260. package/lib/openTelemetryCollector-BS-ej09T.d.ts +0 -70
  261. package/lib/persistence/index.d.mts +0 -403
  262. package/lib/services/index.d.mts +0 -185
  263. package/lib/ttlCache.interface-CEOkrt8d.d.mts +0 -77
  264. package/lib/ttlCacheRecord.types-oX0ti5SP.d.ts +0 -25
  265. 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 import_common2 = require("@forklaunch/common");
179
- var import_api = require("@opentelemetry/api");
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 span = import_api.trace.getSpan(import_api.context.active());
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 import_common6 = require("@forklaunch/common");
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 import_common4 = require("@forklaunch/common");
716
+ var import_common6 = require("@forklaunch/common");
378
717
  var import_jose = require("jose");
379
718
 
380
719
  // src/http/createHmacToken.ts
381
- var import_common3 = require("@forklaunch/common");
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, import_common3.safeStringify)(body)}
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
- return true;
663
- });
664
- const [errorMetadata] = normalizeLogArgs(filteredArgs);
665
- Object.assign(meta2, errorMetadata);
666
- const activeSpan = import_api2.trace.getActiveSpan();
667
- if (activeSpan) {
668
- const activeSpanContext = activeSpan.spanContext();
669
- meta2.trace_id = activeSpanContext.traceId;
670
- meta2.span_id = activeSpanContext.spanId;
671
- meta2.trace_flags = activeSpanContext.traceFlags;
672
- meta2 = {
673
- // @ts-expect-error accessing private property
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
- meta2 = {
679
- "api.name": "none",
680
- "correlation.id": "none",
681
- ...meta2
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
- getBaseLogger() {
709
- return this._pinoLogger;
874
+ if (authMethod == null) {
875
+ throw new Error("Invalid auth method");
710
876
  }
711
- };
712
- function logger(level, meta2 = {}) {
713
- return new PinoLogger(level, meta2);
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, import_common6.isNever)(type);
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 import_semantic_conventions3 = require("@opentelemetry/semantic-conventions");
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
- httpRequestsTotalCounter.add(1, {
3849
- [import_semantic_conventions3.ATTR_SERVICE_NAME]: (0, import_common13.getEnvVar)("OTEL_SERVICE_NAME"),
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
- [import_semantic_conventions3.ATTR_HTTP_REQUEST_METHOD]: req.method,
3853
- [import_semantic_conventions3.ATTR_HTTP_ROUTE]: req.originalPath,
3854
- [import_semantic_conventions3.ATTR_HTTP_RESPONSE_STATUS_CODE]: Number(res.statusCode) || 0
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,