@burdenoff/be-sdk 2026.516.2 → 2026.516.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/dist/auth/index.d.ts +2 -2
- package/dist/auth/index.js +3 -3
- package/dist/cache/index.d.ts +2 -2
- package/dist/cache/index.js +2 -2
- package/dist/{chunk-6U2P4ANJ.js → chunk-5M3YVBTH.js} +5 -5
- package/dist/{chunk-6U2P4ANJ.js.map → chunk-5M3YVBTH.js.map} +1 -1
- package/dist/{chunk-RVB5QFZ4.js → chunk-6WYNQ26B.js} +4 -4
- package/dist/{chunk-RVB5QFZ4.js.map → chunk-6WYNQ26B.js.map} +1 -1
- package/dist/{chunk-5CAA3JST.js → chunk-CPO7ZXUQ.js} +3 -3
- package/dist/{chunk-5CAA3JST.js.map → chunk-CPO7ZXUQ.js.map} +1 -1
- package/dist/{chunk-24VR7PF3.js → chunk-HF3EFD7G.js} +2 -2
- package/dist/{chunk-24VR7PF3.js.map → chunk-HF3EFD7G.js.map} +1 -1
- package/dist/{chunk-V4RLPTTT.js → chunk-IFES3AQS.js} +3 -3
- package/dist/{chunk-V4RLPTTT.js.map → chunk-IFES3AQS.js.map} +1 -1
- package/dist/{chunk-SNW4BLF2.js → chunk-IPKUQS7K.js} +3 -3
- package/dist/{chunk-SNW4BLF2.js.map → chunk-IPKUQS7K.js.map} +1 -1
- package/dist/{chunk-Q6N74R6S.js → chunk-JO6XUKZ5.js} +3 -3
- package/dist/{chunk-Q6N74R6S.js.map → chunk-JO6XUKZ5.js.map} +1 -1
- package/dist/{chunk-7Y3RNUS3.js → chunk-NGA6NTFG.js} +4 -4
- package/dist/{chunk-7Y3RNUS3.js.map → chunk-NGA6NTFG.js.map} +1 -1
- package/dist/{chunk-RTQIRGVB.js → chunk-O6RHB2YP.js} +2 -2
- package/dist/chunk-O6RHB2YP.js.map +1 -0
- package/dist/{chunk-Z4IRLBWO.js → chunk-R3XPCYHM.js} +3 -3
- package/dist/{chunk-Z4IRLBWO.js.map → chunk-R3XPCYHM.js.map} +1 -1
- package/dist/{chunk-AQTNM2EY.js → chunk-RMDKB5O7.js} +3 -3
- package/dist/{chunk-AQTNM2EY.js.map → chunk-RMDKB5O7.js.map} +1 -1
- package/dist/{chunk-VKSB2K5E.js → chunk-SO57HNXV.js} +3 -4
- package/dist/chunk-SO57HNXV.js.map +1 -0
- package/dist/{chunk-U455UF4O.js → chunk-TXW7ZKA2.js} +5 -5
- package/dist/{chunk-U455UF4O.js.map → chunk-TXW7ZKA2.js.map} +1 -1
- package/dist/{chunk-75VTKG4Q.js → chunk-U2GLUZAO.js} +4 -6
- package/dist/chunk-U2GLUZAO.js.map +1 -0
- package/dist/{chunk-HIWTWIGQ.js → chunk-UIJWXPOQ.js} +7 -7
- package/dist/chunk-UIJWXPOQ.js.map +1 -0
- package/dist/{chunk-WBWM7UY7.js → chunk-UNPJMENC.js} +3 -3
- package/dist/{chunk-WBWM7UY7.js.map → chunk-UNPJMENC.js.map} +1 -1
- package/dist/{chunk-MQ6OE5QR.js → chunk-WCBKW3CL.js} +6 -11
- package/dist/chunk-WCBKW3CL.js.map +1 -0
- package/dist/{chunk-NGMEI42S.js → chunk-ZA3IGCDJ.js} +4 -4
- package/dist/chunk-ZA3IGCDJ.js.map +1 -0
- package/dist/database/index.js +3 -3
- package/dist/event-queue/index.d.ts +5 -5
- package/dist/event-queue/index.js +2 -2
- package/dist/export/index.d.ts +2 -2
- package/dist/export/index.js +5 -5
- package/dist/gateway/index.d.ts +2 -2
- package/dist/gateway/index.js +4 -4
- package/dist/gateway/security/index.js +1 -1
- package/dist/graph/index.d.ts +4 -4
- package/dist/graph/index.js +5 -5
- package/dist/{graph-emitter-Dp7UE1Yd.d.ts → graph-emitter-r5TylDBm.d.ts} +1 -2
- package/dist/{graphql-0_hoaeUf.d.ts → graphql-DH3L5Hj7.d.ts} +1 -1
- package/dist/{index-DlFDFyWD.d.ts → index-BVjR9llq.d.ts} +2 -2
- package/dist/{index-DJq060D-.d.ts → index-BZPEyVOl.d.ts} +3 -3
- package/dist/{index-tJYziwMs.d.ts → index-BqSh1K8I.d.ts} +3 -23
- package/dist/{index-D_Nc4UHi.d.ts → index-C7T0Xx19.d.ts} +8 -9
- package/dist/{index-CSPbpywb.d.ts → index-Caqvetqq.d.ts} +5 -10
- package/dist/{index-Bo58dlMU.d.ts → index-CygU_fXS.d.ts} +3 -3
- package/dist/{index-DYEts1R8.d.ts → index-DLyc5o_K.d.ts} +1 -1
- package/dist/{index-BMq3lFjj.d.ts → index-Dg4kH1VJ.d.ts} +1 -1
- package/dist/{index-zzKCairW.d.ts → index-DohaJRZP.d.ts} +2 -2
- package/dist/{index-RU_M5c74.d.ts → index-KA3gg4es.d.ts} +1 -1
- package/dist/{index-B6IwtUb1.d.ts → index-cnFnfIjk.d.ts} +1 -1
- package/dist/{index-TKcu5LDR.d.ts → index-fhOvuvlv.d.ts} +1 -1
- package/dist/index.d.ts +27 -27
- package/dist/index.js +87 -87
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +2 -2
- package/dist/init/index.js +5 -5
- package/dist/instrumentation/index.d.ts +3 -3
- package/dist/layer/index.d.ts +2 -2
- package/dist/layer/index.js +2 -2
- package/dist/{layer-DDip18KY.d.ts → layer-CUu_cZ7d.d.ts} +1 -1
- package/dist/logger/index.d.ts +2 -2
- package/dist/notifications/index.d.ts +3 -3
- package/dist/notifications/index.js +3 -3
- package/dist/prisma/index.js +2 -2
- package/dist/rbac/index.d.ts +3 -3
- package/dist/rbac/index.js +3 -3
- package/dist/telemetry/index.d.ts +6 -6
- package/dist/telemetry/index.js.map +1 -1
- package/dist/temporal/index.d.ts +1 -1
- package/dist/temporal/index.js +2 -2
- package/dist/tracker/index.d.ts +4 -4
- package/dist/tracker/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-75VTKG4Q.js.map +0 -1
- package/dist/chunk-HIWTWIGQ.js.map +0 -1
- package/dist/chunk-MQ6OE5QR.js.map +0 -1
- package/dist/chunk-NGMEI42S.js.map +0 -1
- package/dist/chunk-RTQIRGVB.js.map +0 -1
- package/dist/chunk-VKSB2K5E.js.map +0 -1
package/dist/init/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { A as AnalyticsConfig, B as BurdenoffSDKInitConfig, C as ClickHouseConfig, D as DatabaseConfig, E as EventQueueConfig, G as GraphSyncConfig, I as InitializedSDKState, L as LayerInitConfig, a as LoggingConfig, M as MetricsConfig,
|
|
2
|
-
import '../layer-
|
|
1
|
+
export { A as AnalyticsConfig, B as BurdenoffSDKInitConfig, C as ClickHouseConfig, D as DatabaseConfig, E as EventQueueConfig, G as GraphSyncConfig, I as InitializedSDKState, L as LayerInitConfig, a as LoggingConfig, M as MetricsConfig, O as ObservabilityConfig, b as OpenTelemetryConfig, S as SDKCacheConfig, c as SDKValkeyCacheConfig, g as getSDKState, d as initializeBurdenoffSDK, e as isSDKInitialized, r as resetSDK } from '../index-BqSh1K8I.js';
|
|
2
|
+
import '../layer-CUu_cZ7d.js';
|
package/dist/init/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { getSDKState, initializeBurdenoffSDK, isSDKInitialized, resetSDK } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
1
|
+
export { getSDKState, initializeBurdenoffSDK, isSDKInitialized, resetSDK } from '../chunk-U2GLUZAO.js';
|
|
2
|
+
import '../chunk-TXW7ZKA2.js';
|
|
3
|
+
import '../chunk-HF3EFD7G.js';
|
|
4
|
+
import '../chunk-UIJWXPOQ.js';
|
|
5
|
+
import '../chunk-ZA3IGCDJ.js';
|
|
6
6
|
import '../chunk-CBZNP6RF.js';
|
|
7
7
|
import '../chunk-XE4OXN2W.js';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { A as ApolloInlineTraceOptions, C as CacheInstrumentationConfig, b as Counter, D as DEFAULT_CACHE_CONFIG, c as DEFAULT_DATABASE_CONFIG, d as DEFAULT_EVENT_QUEUE_CONFIG, e as DEFAULT_FEATURE_FLAGS, f as DEFAULT_GRAPHQL_CONFIG, g as DEFAULT_HTTP_CONFIG, h as DEFAULT_LOGGING_CONFIG, j as DEFAULT_METRICS_CONFIG, k as DEFAULT_TRACING_CONFIG, l as DatabaseInstrumentationConfig, E as ENV_VARS, m as EventQueueInstrumentationConfig, G as Gauge, n as GraphQLInstrumentationConfig, o as GraphQLOperationInfo, p as GraphQLOperationType, H as HTTPInstrumentationConfig, q as Histogram, r as InitializeInstrumentationOptions, t as Instrument, u as InstrumentationConfig, v as InstrumentationContextExtension, w as InstrumentationFeatureFlags, I as InstrumentationSetupResult, L as Log, x as LoggingConfig, M as Metric, y as MetricDefinition, z as MetricLabels, B as MetricsConfig, F as MetricsRegistry, O as OperationContext, P as PrometheusPluginOptions, J as STANDARD_METRICS, S as SetupInstrumentationOptions, K as Span, N as SpanAttributes, Q as SpanContext, R as SpanEvent, T as SpanKind, U as SpanStatus, V as Trace, W as TraceContext, X as Tracer, Y as TracingConfig, Z as UpDownCounter, _ as buildDatabaseConfig, $ as buildFeatureFlags, a0 as buildGraphQLConfig, a1 as buildInstrumentationConfig, a2 as buildMetricsConfig, a3 as buildTracingConfig, a4 as createApolloInlineTracePlugin, a5 as createCounter, a6 as createGauge, a7 as createGraphQLInstrumentationPlugin, a8 as createHistogram, a9 as createPrometheusPlugin, aa as createUpDownCounter, ab as extractOperationInfo, ac as extractTraceContext, ad as getGraphQLOperationFromContext, ae as getGraphQLSpanFromContext, af as getInstrumentationConfig, ag as getLogger, ah as getMetricsRegistry, ai as getTraceContext, aj as getTracer, i as initializeInstrumentation, ak as initializeInstrumentationConfig, al as initializeMetricsRegistry, am as initializeTracer, an as injectTraceContext, ao as instrumentResolver, ap as instrumentResolverMap, aq as instrumented, ar as isApolloInlineTraceAvailable, as as isFeatureEnabled, at as isInstrumentationConfigInitialized, au as isInstrumentationInitialized, av as isMetricsRegistryInitialized, aw as isPrometheusAvailable, ax as isTracerInitialized, ay as resetInstrumentation, az as resetInstrumentationConfig, aA as resetMetricsRegistry, s as setupInstrumentation, aB as startSpan, aC as traced, aD as updateInstrumentationConfig, aE as withSpan } from '../index-
|
|
2
|
-
export { l as logger } from '../index-
|
|
3
|
-
import '../index-
|
|
1
|
+
export { A as ApolloInlineTraceOptions, C as CacheInstrumentationConfig, b as Counter, D as DEFAULT_CACHE_CONFIG, c as DEFAULT_DATABASE_CONFIG, d as DEFAULT_EVENT_QUEUE_CONFIG, e as DEFAULT_FEATURE_FLAGS, f as DEFAULT_GRAPHQL_CONFIG, g as DEFAULT_HTTP_CONFIG, h as DEFAULT_LOGGING_CONFIG, j as DEFAULT_METRICS_CONFIG, k as DEFAULT_TRACING_CONFIG, l as DatabaseInstrumentationConfig, E as ENV_VARS, m as EventQueueInstrumentationConfig, G as Gauge, n as GraphQLInstrumentationConfig, o as GraphQLOperationInfo, p as GraphQLOperationType, H as HTTPInstrumentationConfig, q as Histogram, r as InitializeInstrumentationOptions, t as Instrument, u as InstrumentationConfig, v as InstrumentationContextExtension, w as InstrumentationFeatureFlags, I as InstrumentationSetupResult, L as Log, x as LoggingConfig, M as Metric, y as MetricDefinition, z as MetricLabels, B as MetricsConfig, F as MetricsRegistry, O as OperationContext, P as PrometheusPluginOptions, J as STANDARD_METRICS, S as SetupInstrumentationOptions, K as Span, N as SpanAttributes, Q as SpanContext, R as SpanEvent, T as SpanKind, U as SpanStatus, V as Trace, W as TraceContext, X as Tracer, Y as TracingConfig, Z as UpDownCounter, _ as buildDatabaseConfig, $ as buildFeatureFlags, a0 as buildGraphQLConfig, a1 as buildInstrumentationConfig, a2 as buildMetricsConfig, a3 as buildTracingConfig, a4 as createApolloInlineTracePlugin, a5 as createCounter, a6 as createGauge, a7 as createGraphQLInstrumentationPlugin, a8 as createHistogram, a9 as createPrometheusPlugin, aa as createUpDownCounter, ab as extractOperationInfo, ac as extractTraceContext, ad as getGraphQLOperationFromContext, ae as getGraphQLSpanFromContext, af as getInstrumentationConfig, ag as getLogger, ah as getMetricsRegistry, ai as getTraceContext, aj as getTracer, i as initializeInstrumentation, ak as initializeInstrumentationConfig, al as initializeMetricsRegistry, am as initializeTracer, an as injectTraceContext, ao as instrumentResolver, ap as instrumentResolverMap, aq as instrumented, ar as isApolloInlineTraceAvailable, as as isFeatureEnabled, at as isInstrumentationConfigInitialized, au as isInstrumentationInitialized, av as isMetricsRegistryInitialized, aw as isPrometheusAvailable, ax as isTracerInitialized, ay as resetInstrumentation, az as resetInstrumentationConfig, aA as resetMetricsRegistry, s as setupInstrumentation, aB as startSpan, aC as traced, aD as updateInstrumentationConfig, aE as withSpan } from '../index-fhOvuvlv.js';
|
|
2
|
+
export { l as logger } from '../index-DLyc5o_K.js';
|
|
3
|
+
import '../index-Caqvetqq.js';
|
package/dist/layer/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { D as DEFAULT_GATEWAY_ROUTING, b as DEFAULT_LAYER_RESOURCES, c as DEFAULT_LAYER_STREAMS, G as GatewayRoutingConfig, L as LayerConfig, a as LayerFullConfig, d as LayerGatewayConfig, e as LayerResourceUrls, S as ServiceLayer } from '../layer-
|
|
2
|
-
export { L as LayerManager, c as createLayerManagerFromEnv, d as detectLayerFromServiceName, g as getGatewayUrlForLayer, v as validateLayerConfig } from '../index-
|
|
1
|
+
export { D as DEFAULT_GATEWAY_ROUTING, b as DEFAULT_LAYER_RESOURCES, c as DEFAULT_LAYER_STREAMS, G as GatewayRoutingConfig, L as LayerConfig, a as LayerFullConfig, d as LayerGatewayConfig, e as LayerResourceUrls, S as ServiceLayer } from '../layer-CUu_cZ7d.js';
|
|
2
|
+
export { L as LayerManager, c as createLayerManagerFromEnv, d as detectLayerFromServiceName, g as getGatewayUrlForLayer, v as validateLayerConfig } from '../index-BVjR9llq.js';
|
package/dist/layer/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { LayerManager, createLayerManagerFromEnv, detectLayerFromServiceName, getGatewayUrlForLayer, validateLayerConfig } from '../chunk-
|
|
2
|
-
export { DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES, DEFAULT_LAYER_STREAMS } from '../chunk-
|
|
1
|
+
export { LayerManager, createLayerManagerFromEnv, detectLayerFromServiceName, getGatewayUrlForLayer, validateLayerConfig } from '../chunk-UIJWXPOQ.js';
|
|
2
|
+
export { DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES, DEFAULT_LAYER_STREAMS } from '../chunk-ZA3IGCDJ.js';
|
|
3
3
|
import '../chunk-CBZNP6RF.js';
|
|
4
4
|
import '../chunk-XE4OXN2W.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/logger/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import '../index-
|
|
2
|
-
export { a as LogLevel, b as LogMeta, L as Logger, c as LoggerConfig, d as LoggerTransport, e as debug, f as error, g as log, l as logger, r as redactSensitiveFields, w as warn } from '../index-
|
|
1
|
+
import '../index-Caqvetqq.js';
|
|
2
|
+
export { a as LogLevel, b as LogMeta, L as Logger, c as LoggerConfig, d as LoggerTransport, e as debug, f as error, g as log, l as logger, r as redactSensitiveFields, w as warn } from '../index-DLyc5o_K.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import '../graphql-
|
|
2
|
-
import '../index-
|
|
3
|
-
export { G as GetNotificationsOptions, b as Notification, c as NotificationChannel, d as NotificationPriority, e as NotificationResponse, N as NotificationType, a as NotificationsModule, R as RecipientInput, S as SendChannelNotificationOptions, f as SendNotificationOptions, g as SendTemplateNotificationOptions, T as TenantNotificationsModule } from '../index-
|
|
1
|
+
import '../graphql-DH3L5Hj7.js';
|
|
2
|
+
import '../index-Caqvetqq.js';
|
|
3
|
+
export { G as GetNotificationsOptions, b as Notification, c as NotificationChannel, d as NotificationPriority, e as NotificationResponse, N as NotificationType, a as NotificationsModule, R as RecipientInput, S as SendChannelNotificationOptions, f as SendNotificationOptions, g as SendTemplateNotificationOptions, T as TenantNotificationsModule } from '../index-DohaJRZP.js';
|
|
4
4
|
import 'graphql-request';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { NotificationChannel, NotificationPriority, NotificationType, NotificationsModule, TenantNotificationsModule } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { NotificationChannel, NotificationPriority, NotificationType, NotificationsModule, TenantNotificationsModule } from '../chunk-RMDKB5O7.js';
|
|
2
|
+
import '../chunk-O6RHB2YP.js';
|
|
3
|
+
import '../chunk-ZA3IGCDJ.js';
|
|
4
4
|
import '../chunk-CBZNP6RF.js';
|
|
5
5
|
import '../chunk-XE4OXN2W.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/prisma/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { PrismaClientWrapper, buildContextWhereClause, buildContextWhereConditions, checkDatabaseHealth, configurePrismaLogging, contextMatches, createConnectionPool, createContextFromSDK, createDatabaseClient, createDatabaseClientFromEnv, createPrismaAdapter, createPrismaClient, extractFieldsFromModel, getAllModelNames, getDatabaseManager, getDatabaseProductName, getDatabaseStats, getDatabaseVersion, getDb, getModelFields, hasModel, initializeDatabase, initializeDatabaseWithConfig, isDatabaseInitialized, loadGeneratedFields, mergeContext, parseContext, resetDatabaseManager, testConnection, toContextJson } from '../chunk-
|
|
1
|
+
export { PrismaClientWrapper, buildContextWhereClause, buildContextWhereConditions, checkDatabaseHealth, configurePrismaLogging, contextMatches, createConnectionPool, createContextFromSDK, createDatabaseClient, createDatabaseClientFromEnv, createPrismaAdapter, createPrismaClient, extractFieldsFromModel, getAllModelNames, getDatabaseManager, getDatabaseProductName, getDatabaseStats, getDatabaseVersion, getDb, getModelFields, hasModel, initializeDatabase, initializeDatabaseWithConfig, isDatabaseInitialized, loadGeneratedFields, mergeContext, parseContext, resetDatabaseManager, testConnection, toContextJson } from '../chunk-IFES3AQS.js';
|
|
2
2
|
export { addWorkspaceExtension, getWorkspaceContext, injectWhereWorkspaceId, setWorkspaceContext, withWorkspaceContext, withWorkspaceContextSync } from '../chunk-GTEMQXCA.js';
|
|
3
3
|
import '../chunk-TKBD2ONF.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-SO57HNXV.js';
|
|
5
5
|
import '../chunk-TM5RQ6P2.js';
|
|
6
6
|
import '../chunk-MVHOP4IG.js';
|
|
7
7
|
import '../chunk-CBZNP6RF.js';
|
package/dist/rbac/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { B as BurdenoffGraphQLClient } from '../graphql-
|
|
2
|
-
import { S as SDKContext } from '../index-
|
|
1
|
+
import { B as BurdenoffGraphQLClient } from '../graphql-DH3L5Hj7.js';
|
|
2
|
+
import { S as SDKContext } from '../index-Caqvetqq.js';
|
|
3
3
|
import { Plugin } from '@envelop/core';
|
|
4
|
-
import { S as ServiceLayer } from '../layer-
|
|
4
|
+
import { S as ServiceLayer } from '../layer-CUu_cZ7d.js';
|
|
5
5
|
import 'graphql-request';
|
|
6
6
|
|
|
7
7
|
type ActorType = 'USER' | 'BOT' | 'INTEGRATION' | 'DELEGATED_AGENT';
|
package/dist/rbac/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { RBACClient, RBACModule, createRBACClientFromEnv, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { RBACClient, RBACModule, createRBACClientFromEnv, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv } from '../chunk-6WYNQ26B.js';
|
|
2
|
+
import '../chunk-O6RHB2YP.js';
|
|
3
|
+
import '../chunk-ZA3IGCDJ.js';
|
|
4
4
|
import '../chunk-CBZNP6RF.js';
|
|
5
5
|
import '../chunk-XE4OXN2W.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { L as Logger } from '../index-
|
|
2
|
-
import { S as SetupInstrumentationOptions, I as InstrumentationSetupResult } from '../index-
|
|
3
|
-
export { i as initializeInstrumentation, s as setupInstrumentation } from '../index-
|
|
4
|
-
import '../index-
|
|
1
|
+
import { L as Logger } from '../index-DLyc5o_K.js';
|
|
2
|
+
import { S as SetupInstrumentationOptions, I as InstrumentationSetupResult } from '../index-fhOvuvlv.js';
|
|
3
|
+
export { i as initializeInstrumentation, s as setupInstrumentation } from '../index-fhOvuvlv.js';
|
|
4
|
+
import '../index-Caqvetqq.js';
|
|
5
5
|
|
|
6
6
|
interface PrismaLike {
|
|
7
7
|
$queryRaw: (strings: TemplateStringsArray) => Promise<unknown>;
|
|
8
8
|
}
|
|
9
|
-
interface
|
|
9
|
+
interface EventQueueLike {
|
|
10
10
|
isConnected?: () => boolean | Promise<boolean>;
|
|
11
11
|
healthCheck?: () => Promise<{
|
|
12
12
|
ok: boolean;
|
|
@@ -17,7 +17,7 @@ interface ValkeyLike {
|
|
|
17
17
|
}
|
|
18
18
|
interface HealthDeps {
|
|
19
19
|
prisma?: PrismaLike;
|
|
20
|
-
|
|
20
|
+
eventQueue?: EventQueueLike;
|
|
21
21
|
valkey?: ValkeyLike;
|
|
22
22
|
version?: string;
|
|
23
23
|
serviceName?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/telemetry/health.ts","../../src/telemetry/metrics-endpoint.ts","../../src/telemetry/prisma-logging.ts","../../src/telemetry/index.ts"],"names":["createHealthRoutes","_deps","Proxy","get","_target","prop","undefined","loadDefaultRegistry","mod","collectDefaultMetrics","register","createMetricsRoutesImpl","app","opts","path","ctx","registry","ctxWithSet","set","status","headers","contentType","metrics","createMetricsRoutes","createPrismaLoggingExtension","logger","name","query","$allOperations","model","operation","args","start","Date","now","result","debug","duration_ms","redactSensitiveFields","err","error","Error","message","String","resolveEnv","explicit","fromEnv","process","env","resolveVersion","resolveEndpoint","proto","resolveSampling","Number","isFinite","Math","min","max","parsed","resolveOtelSdkEnabled","sdkDisabled","otelEnabled","bootstrapTelemetry","cfg","serviceVersion","otlpEndpoint","sampleRatio","createPinoLogger","serviceName","version","setActiveTelemetryLogger","instrumentation","setupInstrumentation","tracing","samplingRate","otelSdk","createOtelSdk","boundary","module","info","metricsEnabled","metricsDropReason","warn","reason","shutdown","defaultLogger","setLevel","getLevel"],"mappings":";;;;;;;AAmFO,SAASA,kBAAAA,CAAmBC,KAAAA,GAAoB,EAAC,EAAC;AAEvD,EAAA,OAAO,IAAIC,KAAAA,CACT,EAAC,EACD;AACEC,IAAAA,GAAAA,CAAIC,SAASC,IAAAA,EAAI;AAIf,MAAA,IAAIA,IAAAA,KAAS,KAAA,IAASA,IAAAA,KAAS,MAAA,EAAQ,OAAOC,MAAAA;AAC9C,MAAA,OAAOA,MAAAA;AACT,IAAA;GACF,CAAA;AAEJ;AAdgBN,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;;;ACnEhB,eAAsBO,mBAAAA,GAAAA;AACpB,EAAA,IAAI;AACF,IAAA,MAAMC,GAAAA,GAAO,MAAM,OAAO,aAAA,CAAA;AAK1B,IAAA,IAAI;AACFA,MAAAA,GAAAA,CAAIC,qBAAAA,CAAsB;AAAEC,QAAAA,QAAAA,EAAUF,GAAAA,CAAIE;OAAS,CAAA;IACrD,CAAA,CAAA,MAAQ;AAER,IAAA;AACA,IAAA,OAAOF,GAAAA,CAAIE,QAAAA;EACb,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AACT,EAAA;AACF;AAhBsBH,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAkBf,SAASI,uBAAAA,CAIdC,GAAAA,EAAUC,IAAAA,GAA4B,EAAC,EAAC;AACxC,EAAA,MAAMC,IAAAA,GAAOD,KAAKC,IAAAA,IAAQ,UAAA;AAE1BF,EAAAA,GAAAA,CAAIT,GAAAA,CAAIW,IAAAA,EAAM,OAAOC,GAAAA,KAAAA;AACnB,IAAA,MAAMC,QAAAA,GAAWH,IAAAA,CAAKG,QAAAA,IAAa,MAAMT,mBAAAA,EAAAA;AACzC,IAAA,MAAMU,UAAAA,GAAaF,GAAAA;AACnB,IAAA,IAAI,CAACC,QAAAA,EAAU;AACb,MAAA,IAAIC,UAAAA,CAAWC,GAAAA,EAAKD,UAAAA,CAAWC,GAAAA,CAAIC,MAAAA,GAAS,GAAA;AAC5C,MAAA,OAAO,+BAAA;AACT,IAAA;AACA,IAAA,IAAIF,WAAWC,GAAAA,EAAK;AAClBD,MAAAA,UAAAA,CAAWC,IAAIC,MAAAA,GAAS,GAAA;AACxBF,MAAAA,UAAAA,CAAWC,IAAIE,OAAAA,GAAU;AACvB,QAAA,cAAA,EAAgBJ,SAASK,WAAAA,IAAe;AAC1C,OAAA;AACF,IAAA;AACA,IAAA,OAAOL,SAASM,OAAAA,EAAO;EACzB,CAAA,CAAA;AAEA,EAAA,OAAOV,GAAAA;AACT;AAxBgBD,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AA8BT,SAASY,mBAAAA,CAAoBV,IAAAA,GAA4B,EAAC,EAAC;AAChE,EAAA,OAAO,CAACD,GAAAA,KAAgED,uBAAAA,CAAwBC,GAAAA,EAAKC,IAAAA,CAAAA;AACvG;AAFgBU,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;;;ACtCT,SAASC,6BAA6BC,OAAAA,EAAc;AAMzD,EAAA,OAAO;IACLC,IAAAA,EAAM,wBAAA;IACNC,KAAAA,EAAO;AACL,MAAA,MAAMC,eAAe,EAAEC,KAAAA,EAAOC,SAAAA,EAAWC,IAAAA,EAAMJ,OAAK,EAAmB;AACrE,QAAA,MAAMK,KAAAA,GAAQC,KAAKC,GAAAA,EAAG;AACtB,QAAA,IAAI;AACF,UAAA,MAAMC,MAAAA,GAAS,MAAMR,KAAAA,CAAMI,IAAAA,CAAAA;AAC3BN,UAAAA,OAAAA,CAAOW,MAAM,cAAA,EAAgB;AAC3BP,YAAAA,KAAAA;AACAC,YAAAA,SAAAA;YACAO,WAAAA,EAAaJ,IAAAA,CAAKC,KAAG,GAAKF,KAAAA;AAC1BD,YAAAA,IAAAA,EAAMO,sBAAsBP,IAAAA;WAC9B,CAAA;AACA,UAAA,OAAOI,MAAAA;AACT,QAAA,CAAA,CAAA,OAASI,GAAAA,EAAK;AACZd,UAAAA,OAAAA,CAAOe,MAAM,cAAA,EAAgB;AAC3BX,YAAAA,KAAAA;AACAC,YAAAA,SAAAA;YACAO,WAAAA,EAAaJ,IAAAA,CAAKC,KAAG,GAAKF,KAAAA;AAC1BQ,YAAAA,KAAAA,EAAOD,GAAAA,YAAeE,KAAAA,GAAQF,GAAAA,CAAIG,OAAAA,GAAUC,OAAOJ,GAAAA;WACrD,CAAA;AACA,UAAA,MAAMA,GAAAA;AACR,QAAA;AACF,MAAA;AACF;AACF,GAAA;AACF;AAhCgBf,MAAAA,CAAAA,4BAAAA,EAAAA,8BAAAA,CAAAA;;;ACmDhB,SAASoB,WAAWC,QAAAA,EAAc;AAChC,EAAA,IAAIA,UAAU,OAAOA,QAAAA;AACrB,EAAA,MAAMC,OAAAA,GAAUC,QAAQC,GAAAA,CAAI,YAAA,KAAiBD,OAAAA,CAAQC,GAAAA,CAAI,UAAA,CAAA,IAAe,EAAA;AACxE,EAAA,IAAIF,OAAAA,KAAY,YAAA,IAAgBA,OAAAA,KAAY,MAAA,EAAQ,OAAO,MAAA;AAC3D,EAAA,IAAIA,OAAAA,KAAY,aAAA,IAAiBA,OAAAA,KAAY,KAAA,EAAO,OAAO,KAAA;AAC3D,EAAA,OAAO,OAAA;AACT;AANSF,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAQT,SAASK,eAAeJ,QAAAA,EAAiB;AACvC,EAAA,IAAIA,UAAU,OAAOA,QAAAA;AACrB,EAAA,OAAOE,QAAQC,GAAAA,CAAI,qBAAA,KAA0BD,OAAAA,CAAQC,GAAAA,CAAI,iBAAA,CAAA,IAAsB,OAAA;AACjF;AAHSC,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAKT,SAASC,gBAAgBL,QAAAA,EAAiB;AACxC,EAAA,IAAIA,UAAU,OAAOA,QAAAA;AACrB,EAAA,MAAMM,KAAAA,GAAQ,MAAA;AACd,EAAA,OAAOJ,OAAAA,CAAQC,GAAAA,CAAI,6BAAA,CAAA,IAAkC,GAAGG,KAAAA,CAAAA,mCAAAA,CAAAA;AAC1D;AAJSD,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAMT,SAASE,eAAAA,CAAgBP,UAA8BG,GAAAA,EAAQ;AAC7D,EAAA,IAAI,OAAOH,QAAAA,KAAa,QAAA,IAAYQ,MAAAA,CAAOC,SAAST,QAAAA,CAAAA,EAAW,OAAOU,IAAAA,CAAKC,IAAI,CAAA,EAAGD,IAAAA,CAAKE,GAAAA,CAAI,CAAA,EAAGZ,QAAAA,CAAAA,CAAAA;AAC9F,EAAA,MAAMC,OAAAA,GAAUC,OAAAA,CAAQC,GAAAA,CAAI,yBAAA,CAAA;AAC5B,EAAA,IAAIF,OAAAA,EAAS;AACX,IAAA,MAAMY,MAAAA,GAASL,OAAOP,OAAAA,CAAAA;AACtB,IAAA,IAAIO,MAAAA,CAAOC,QAAAA,CAASI,MAAAA,CAAAA,EAAS,OAAOH,IAAAA,CAAKC,GAAAA,CAAI,CAAA,EAAGD,IAAAA,CAAKE,GAAAA,CAAI,CAAA,EAAGC,MAAAA,CAAAA,CAAAA;AAC9D,EAAA;AACA,EAAA,IAAIV,GAAAA,KAAQ,QAAQ,OAAO,GAAA;AAC3B,EAAA,OAAO,CAAA;AACT;AATSI,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAWT,SAASO,qBAAAA,GAAAA;AACP,EAAA,MAAMC,WAAAA,GAAcb,OAAAA,CAAQC,GAAAA,CAAI,mBAAA,CAAA;AAChC,EAAA,IAAIY,WAAAA,KAAgB,MAAA,IAAUA,WAAAA,KAAgB,GAAA,EAAK,OAAO,KAAA;AAC1D,EAAA,MAAMC,WAAAA,GAAcd,OAAAA,CAAQC,GAAAA,CAAI,cAAA,CAAA;AAChC,EAAA,IAAIa,WAAAA,KAAgB,OAAA,IAAWA,WAAAA,KAAgB,GAAA,EAAK,OAAO,KAAA;AAC3D,EAAA,OAAO,IAAA;AACT;AANSF,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AA2BT,eAAsBG,mBAAmBC,GAAAA,EAAoB;AAC3D,EAAA,MAAMf,GAAAA,GAAMJ,UAAAA,CAAWmB,GAAAA,CAAIf,GAAG,CAAA;AAC9B,EAAA,MAAMgB,cAAAA,GAAiBf,cAAAA,CAAec,GAAAA,CAAIC,cAAc,CAAA;AACxD,EAAA,MAAMC,YAAAA,GAAef,eAAAA,CAAgBa,GAAAA,CAAIE,YAAY,CAAA;AACrD,EAAA,MAAMC,WAAAA,GAAcd,eAAAA,CAAgBW,GAAAA,CAAIG,WAAAA,EAAalB,GAAAA,CAAAA;AAOrD,EAAA,MAAM,EAAEmB,gBAAAA,EAAAA,iBAAAA,EAAgB,GAAK,MAAM,OAAO,4BAAA,CAAA;AAC1C,EAAA,MAAM1C,OAAAA,GAAS,MAAM0C,iBAAAA,CAAiB;AACpCC,IAAAA,WAAAA,EAAaL,GAAAA,CAAIK,WAAAA;AACjBpB,IAAAA,GAAAA;IACAqB,OAAAA,EAASL;GACX,CAAA;AACAM,EAAAA,wBAAAA,CAAyB7C,OAAAA,CAAAA;AAIzB,EAAA,MAAM8C,eAAAA,GAAkBC,oBAAAA,CAAqBT,GAAAA,CAAIK,WAAAA,EAAa;AAC5D,IAAA,GAAGL,GAAAA,CAAIQ,eAAAA;IACPE,OAAAA,EAAS;AACPL,MAAAA,WAAAA,EAAaL,GAAAA,CAAIK,WAAAA;MACjB,GAAIL,GAAAA,CAAIQ,eAAAA,EAAiBE,OAAAA,IAAW,EAAC;MACrCC,YAAAA,EAAcR;AAChB,KAAA;IACA5C,OAAAA,EAAS;AACP8C,MAAAA,WAAAA,EAAaL,GAAAA,CAAIK,WAAAA;MACjB,GAAIL,GAAAA,CAAIQ,eAAAA,EAAiBjD,OAAAA,IAAW;AACtC;GACF,CAAA;AAGA,EAAA,IAAIqD,OAAAA;AACJ,EAAA,IAAIhB,uBAAAA,EAAyB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,EAAEiB,aAAAA,EAAa,GAAK,MAAM,OAAO,oBAAA,CAAA;AACvCD,MAAAA,OAAAA,GAAU,MAAMC,aAAAA,CAAc;AAC5BR,QAAAA,WAAAA,EAAaL,GAAAA,CAAIK,WAAAA;AACjBJ,QAAAA,cAAAA;AACAa,QAAAA,QAAAA,EAAUd,GAAAA,CAAIc,QAAAA;AACdC,QAAAA,MAAAA,EAAQf,GAAAA,CAAIe,MAAAA;AACZ9B,QAAAA,GAAAA;AACAiB,QAAAA,YAAAA;AACAC,QAAAA;OACF,CAAA;AAGAzC,MAAAA,OAAAA,CAAOsD,KAAK,qDAAA,EAAuD;AACjEX,QAAAA,WAAAA,EAAaL,GAAAA,CAAIK,WAAAA;AACjBH,QAAAA,YAAAA,EAAcA,eAAe,cAAA,GAAiB,WAAA;AAC9CC,QAAAA,WAAAA;AACAc,QAAAA,cAAAA,EAAgBL,OAAAA,CAAQK;OAC1B,CAAA;AAEA,MAAA,IAAI,CAACL,OAAAA,CAAQK,cAAAA,IAAkBL,OAAAA,CAAQM,iBAAAA,EAAmB;AACxDxD,QAAAA,OAAAA,CAAOyD,KAAK,gFAAA,EAAkF;AAC5Fd,UAAAA,WAAAA,EAAaL,GAAAA,CAAIK,WAAAA;AACjBe,UAAAA,MAAAA,EAAQR,OAAAA,CAAQM;SAClB,CAAA;AACF,MAAA;AACF,IAAA,CAAA,CAAA,OAAS1C,GAAAA,EAAK;AACZd,MAAAA,OAAAA,CAAOyD,KAAK,wFAAA,EAA0F;AACpG1C,QAAAA,KAAAA,EAAOD,GAAAA,YAAeE,KAAAA,GAAQF,GAAAA,CAAIG,OAAAA,GAAUC,OAAOJ,GAAAA;OACrD,CAAA;AACF,IAAA;EACF,CAAA,MAAO;AACLd,IAAAA,OAAAA,CAAOsD,KAAK,+CAAA,CAAA;AACd,EAAA;AAEA,EAAA,MAAMK,2BAAW,MAAA,CAAA,YAAA;AACf,IAAA,IAAI;AACF,MAAA,IAAIT,OAAAA,EAASS,QAAAA,EAAU,MAAMT,OAAAA,CAAQS,QAAAA,EAAQ;AAC/C,IAAA,CAAA,CAAA,OAAS7C,GAAAA,EAAK;AACXd,MAAAA,OAAAA,CAAiCyD,KAAK,sCAAA,EAAwC;AAC7E1C,QAAAA,KAAAA,EAAOD,GAAAA,YAAeE,KAAAA,GAAQF,GAAAA,CAAIG,OAAAA,GAAUC,OAAOJ,GAAAA;OACrD,CAAA;AACF,IAAA;EACF,CAAA,EARiB,UAAA,CAAA;AAWjB8C,EAAAA,MAAAA,CAAcC,QAAAA,CAAS7D,OAAAA,CAAO8D,QAAAA,IAAQ,IAAQ,MAAA,CAAA;AAE9C,EAAA,OAAO;AACLnB,IAAAA,WAAAA,EAAaL,GAAAA,CAAIK,WAAAA;AACjBJ,IAAAA,cAAAA;AACAhB,IAAAA,GAAAA;IACAvB,MAAAA,EAAQA,OAAAA;AACR8C,IAAAA,eAAAA;AACAa,IAAAA;AACF,GAAA;AACF;AA7FsBtB,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA","file":"index.js","sourcesContent":["/**\n * `/health`, `/health/live`, `/health/ready` Elysia routes with a 1s\n * result cache so readiness checks can't stampede Postgres.\n *\n * Dependencies (prisma, nats, valkey) are optional — omit any client and\n * the readiness check simply skips it.\n */\n\ninterface PrismaLike {\n $queryRaw: (strings: TemplateStringsArray) => Promise<unknown>;\n}\ninterface NatsLike {\n isConnected?: () => boolean | Promise<boolean>;\n healthCheck?: () => Promise<{ ok: boolean }>;\n}\ninterface ValkeyLike {\n ping: () => Promise<unknown>;\n}\n\nexport interface HealthDeps {\n prisma?: PrismaLike;\n nats?: NatsLike;\n valkey?: ValkeyLike;\n /** Service version reported on /health. */\n version?: string;\n /** Service name reported on /health. */\n serviceName?: string;\n}\n\ninterface CachedStatus {\n ready: boolean;\n checked: Record<string, { ok: boolean; error?: string }>;\n at: number;\n}\n\nconst CACHE_TTL_MS = 1000;\n\nasync function probeReady(deps: HealthDeps): Promise<CachedStatus> {\n const checked: Record<string, { ok: boolean; error?: string }> = {};\n\n if (deps.prisma) {\n try {\n await deps.prisma.$queryRaw`SELECT 1`;\n checked['postgres'] = { ok: true };\n } catch (err) {\n checked['postgres'] = {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n if (deps.nats) {\n try {\n const connected =\n typeof deps.nats.isConnected === 'function'\n ? await Promise.resolve(deps.nats.isConnected())\n : ((await deps.nats.healthCheck?.())?.ok ?? true);\n checked['nats'] = { ok: Boolean(connected) };\n } catch (err) {\n checked['nats'] = {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n if (deps.valkey) {\n try {\n await deps.valkey.ping();\n checked['valkey'] = { ok: true };\n } catch (err) {\n checked['valkey'] = {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n const ready = Object.values(checked).every((c) => c.ok);\n return { ready, checked, at: Date.now() };\n}\n\nexport function createHealthRoutes(_deps: HealthDeps = {}): unknown {\n // Return an Elysia app lazily so be-sdk doesn't hard-require elysia.\n return new Proxy(\n {},\n {\n get(_target, prop): unknown {\n // Tell TypeScript consumers the returned object is an Elysia plugin;\n // the actual mount happens via `createHealthRoutesImpl`. Services\n // that prefer direct use can call `createHealthRoutesImpl(elysia, deps)`.\n if (prop === 'use' || prop === 'then') return undefined;\n return undefined;\n },\n }\n );\n}\n\n/**\n * Mount health routes on an existing Elysia app. Callers hold a reference\n * to Elysia themselves; be-sdk stays decoupled.\n */\nexport function createHealthRoutesImpl<\n App extends {\n get: (path: string, handler: (ctx: unknown) => unknown) => App;\n },\n>(app: App, deps: HealthDeps = {}): App {\n let cache: CachedStatus | null = null;\n\n const getStatus = async (): Promise<CachedStatus> => {\n if (cache && Date.now() - cache.at < CACHE_TTL_MS) return cache;\n cache = await probeReady(deps);\n return cache;\n };\n\n app.get('/health/live', () => ({\n status: 'ok',\n serviceName: deps.serviceName,\n version: deps.version,\n }));\n\n app.get('/health/ready', async (ctx: unknown): Promise<unknown> => {\n const status = await getStatus();\n const ctxWithSet = ctx as { set?: { status?: number } };\n if (!status.ready && ctxWithSet.set) ctxWithSet.set.status = 503;\n return {\n status: status.ready ? 'ok' : 'degraded',\n serviceName: deps.serviceName,\n version: deps.version,\n checks: status.checked,\n };\n });\n\n app.get('/health', async (ctx: unknown): Promise<unknown> => {\n const status = await getStatus();\n const ctxWithSet = ctx as { set?: { status?: number } };\n if (!status.ready && ctxWithSet.set) ctxWithSet.set.status = 503;\n return {\n status: status.ready ? 'ok' : 'degraded',\n serviceName: deps.serviceName,\n version: deps.version,\n checks: status.checked,\n uptime_s: Math.round(process.uptime()),\n };\n });\n\n return app;\n}\n","/**\n * Prometheus `/metrics` route mounter. Uses the shared `prom-client`\n * default registry so all instrumentation (GraphQL Envelop, Prisma,\n * runtime) shows up on a single endpoint.\n */\n\ninterface PromRegistryLike {\n metrics: () => Promise<string> | string;\n contentType?: string;\n}\n\nexport interface MetricsMountOptions {\n registry?: PromRegistryLike;\n path?: string;\n}\n\nexport async function loadDefaultRegistry(): Promise<PromRegistryLike | null> {\n try {\n const mod = (await import('prom-client')) as unknown as {\n register: PromRegistryLike;\n collectDefaultMetrics: (opts?: Record<string, unknown>) => void;\n };\n // Kick runtime metrics into the default registry if not already.\n try {\n mod.collectDefaultMetrics({ register: mod.register });\n } catch {\n // Already registered — ignore duplicate-metric errors.\n }\n return mod.register;\n } catch {\n return null;\n }\n}\n\nexport function createMetricsRoutesImpl<\n App extends {\n get: (path: string, handler: (ctx: unknown) => unknown) => App;\n },\n>(app: App, opts: MetricsMountOptions = {}): App {\n const path = opts.path ?? '/metrics';\n\n app.get(path, async (ctx: unknown): Promise<unknown> => {\n const registry = opts.registry ?? (await loadDefaultRegistry());\n const ctxWithSet = ctx as { set?: { status?: number; headers?: Record<string, string> } };\n if (!registry) {\n if (ctxWithSet.set) ctxWithSet.set.status = 503;\n return '# prom-client not installed\\n';\n }\n if (ctxWithSet.set) {\n ctxWithSet.set.status = 200;\n ctxWithSet.set.headers = {\n 'content-type': registry.contentType ?? 'text/plain; version=0.0.4; charset=utf-8',\n };\n }\n return registry.metrics();\n });\n\n return app;\n}\n\n/**\n * Legacy export name used by the service template. Composes the Elysia\n * plugin-style function that `new Elysia().use(...)` accepts.\n */\nexport function createMetricsRoutes(opts: MetricsMountOptions = {}): unknown {\n return (app: Parameters<typeof createMetricsRoutesImpl>[0]): unknown => createMetricsRoutesImpl(app, opts);\n}\n","/**\n * Prisma client extension that pipes query events through the SDK logger\n * with trace/span correlation fields auto-injected. The\n * `@prisma/instrumentation` peer provides the spans\n * themselves; this extension only adds structured log events on top.\n */\nimport type { Logger } from '../logger/index.js';\nimport { redactSensitiveFields } from '../logger/index.js';\n\ntype PrismaQueryArgs = {\n model?: string;\n operation: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n};\n\n/**\n * Returns a Prisma Client extension object compatible with the\n * `$extends()` API (Prisma v5+).\n *\n * ```ts\n * export const prisma = new PrismaClient().$extends(\n * createPrismaLoggingExtension(logger)\n * );\n * ```\n */\nexport function createPrismaLoggingExtension(logger: Logger): {\n name: string;\n query: {\n $allOperations: (args: PrismaQueryArgs) => Promise<unknown>;\n };\n} {\n return {\n name: 'burdenoff-pino-logging',\n query: {\n async $allOperations({ model, operation, args, query }: PrismaQueryArgs): Promise<unknown> {\n const start = Date.now();\n try {\n const result = await query(args);\n logger.debug('prisma.query', {\n model,\n operation,\n duration_ms: Date.now() - start,\n args: redactSensitiveFields(args),\n });\n return result;\n } catch (err) {\n logger.error('prisma.error', {\n model,\n operation,\n duration_ms: Date.now() - start,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n },\n },\n };\n}\n","/**\n * Unified telemetry bootstrap for Burdenoff services.\n *\n * Composes the existing `instrumentation/` + `observability/` + `logger/`\n * modules and adds:\n * - `bootstrapTelemetry({ serviceName, boundary, module, env })` — single\n * call that initializes OTel, wires Pino logger with trace fields,\n * exposes GraphQL Yoga plugins, registers process exit hooks.\n * - `createHealthRoutes({ prisma, nats, valkey, version })` — `/health`,\n * `/health/live`, `/health/ready` Elysia routes.\n * - `createMetricsRoutes(registry?)` — `/metrics` Prometheus exposition.\n * - `createPrismaLoggingExtension(logger)` — Prisma extension that pipes\n * query events through Pino with trace/span correlation ids.\n *\n * The module does not pull in `@opentelemetry/sdk-node` or `pino` as direct\n * deps — services install those as optional peers, and imports are lazy so\n * services that don't install them still load.\n */\n\nimport type { Logger as BaseLogger } from '../logger/index.js';\nimport { logger as defaultLogger } from '../logger/index.js';\nimport {\n initializeInstrumentation,\n setupInstrumentation,\n type SetupInstrumentationOptions,\n type InstrumentationSetupResult,\n} from '../instrumentation/index.js';\nimport { setActiveTelemetryLogger } from './logger-state.js';\nimport type { OtelSdkHandle } from './sdk.js';\n\nexport { createHealthRoutes } from './health.js';\nexport { createMetricsRoutes } from './metrics-endpoint.js';\nexport { createPrismaLoggingExtension } from './prisma-logging.js';\nexport { DEFAULT_REDACT_PATHS } from './pino-redaction.js';\nexport { createPinoLogger } from './pino-logger.js';\n\nexport type Boundary = 'wspace' | 'global' | 'gateway';\nexport type Env = 'alpha' | 'prod' | 'dev';\n\nexport interface TelemetryConfig {\n /** Full service name, e.g. \"wspace-auth-svc\". */\n serviceName: string;\n /** Semver of the service deployment; defaults to `process.env.npm_package_version`. */\n serviceVersion?: string;\n /** Monorepo boundary: `wspace`, `global`, or `gateway`. */\n boundary: Boundary;\n /** Module slug, e.g. `auth` (omit for gateways). */\n module?: string;\n /** Deployment environment; defaults to alpha for non-production NODE_ENV. */\n env?: Env;\n /**\n * OTLP endpoint for spans/metrics/logs. Defaults to\n * `$OTEL_EXPORTER_OTLP_ENDPOINT` or\n * `http://alloy.sre.svc.cluster.local:4318`.\n */\n otlpEndpoint?: string;\n /** Head-based sampling ratio. Default: alpha=1.0, prod=0.1. */\n sampleRatio?: number;\n /** Extra options forwarded to `setupInstrumentation`. */\n instrumentation?: SetupInstrumentationOptions;\n}\n\nexport interface TelemetryHandle {\n /** The configured service name (for use in health routes, etc.). */\n serviceName: string;\n /** The resolved service version. */\n serviceVersion: string;\n /** Environment. */\n env: Env;\n /** The Pino-backed logger. */\n logger: BaseLogger;\n /** Initialized instrumentation (tracer + metrics + plugins). */\n instrumentation: InstrumentationSetupResult;\n /** Cleanup hook; services call on SIGTERM. */\n shutdown: () => Promise<void>;\n}\n\nfunction resolveEnv(explicit?: Env): Env {\n if (explicit) return explicit;\n const fromEnv = process.env['DEPLOY_ENV'] ?? process.env['NODE_ENV'] ?? '';\n if (fromEnv === 'production' || fromEnv === 'prod') return 'prod';\n if (fromEnv === 'development' || fromEnv === 'dev') return 'dev';\n return 'alpha';\n}\n\nfunction resolveVersion(explicit?: string): string {\n if (explicit) return explicit;\n return process.env['npm_package_version'] ?? process.env['SERVICE_VERSION'] ?? '0.0.0';\n}\n\nfunction resolveEndpoint(explicit?: string): string {\n if (explicit) return explicit;\n const proto = 'http';\n return process.env['OTEL_EXPORTER_OTLP_ENDPOINT'] ?? `${proto}://alloy.sre.svc.cluster.local:4318`;\n}\n\nfunction resolveSampling(explicit: number | undefined, env: Env): number {\n if (typeof explicit === 'number' && Number.isFinite(explicit)) return Math.min(1, Math.max(0, explicit));\n const fromEnv = process.env['OTEL_TRACES_SAMPLER_ARG'];\n if (fromEnv) {\n const parsed = Number(fromEnv);\n if (Number.isFinite(parsed)) return Math.min(1, Math.max(0, parsed));\n }\n if (env === 'prod') return 0.1;\n return 1.0;\n}\n\nfunction resolveOtelSdkEnabled(): boolean {\n const sdkDisabled = process.env['OTEL_SDK_DISABLED'];\n if (sdkDisabled === 'true' || sdkDisabled === '1') return false;\n const otelEnabled = process.env['OTEL_ENABLED'];\n if (otelEnabled === 'false' || otelEnabled === '0') return false;\n return true;\n}\n\n/**\n * Bootstrap the full telemetry stack for a service.\n *\n * Services call this ONCE at startup **before** importing Prisma / GraphQL\n * Yoga / NATS so OTel can auto-instrument their dependencies.\n *\n * ```ts\n * // src/telemetry.ts\n * import { bootstrapTelemetry } from '@burdenoff/be-sdk/telemetry';\n * export const telemetry = await bootstrapTelemetry({\n * serviceName: 'wspace-auth-svc',\n * boundary: 'wspace',\n * module: 'auth',\n * });\n *\n * // src/index.ts — must be the FIRST import line.\n * import './telemetry.js';\n * ```\n */\nexport async function bootstrapTelemetry(cfg: TelemetryConfig): Promise<TelemetryHandle> {\n const env = resolveEnv(cfg.env);\n const serviceVersion = resolveVersion(cfg.serviceVersion);\n const otlpEndpoint = resolveEndpoint(cfg.otlpEndpoint);\n const sampleRatio = resolveSampling(cfg.sampleRatio, env);\n\n // Pino logger with trace/span correlation + redaction.\n // createPinoLogger is async (loads pino via dynamic import); awaiting it\n // is required — without await, `logger` is a Promise and calls like\n // logger.warn(...) crash with \"logger.warn is not a function\" during the\n // sdk-node fallback path.\n const { createPinoLogger } = await import('./pino-logger.js');\n const logger = await createPinoLogger({\n serviceName: cfg.serviceName,\n env,\n version: serviceVersion,\n });\n setActiveTelemetryLogger(logger);\n\n // Initialize core instrumentation (tracer, metrics registry, envelop plugins).\n // `setupInstrumentation` internally calls `initializeInstrumentation`.\n const instrumentation = setupInstrumentation(cfg.serviceName, {\n ...cfg.instrumentation,\n tracing: {\n serviceName: cfg.serviceName,\n ...(cfg.instrumentation?.tracing ?? {}),\n samplingRate: sampleRatio,\n },\n metrics: {\n serviceName: cfg.serviceName,\n ...(cfg.instrumentation?.metrics ?? {}),\n },\n });\n\n // Start the NodeSDK exporter pipeline if sdk-node is present (optional).\n let otelSdk: OtelSdkHandle | undefined;\n if (resolveOtelSdkEnabled()) {\n try {\n const { createOtelSdk } = await import('./sdk.js');\n otelSdk = await createOtelSdk({\n serviceName: cfg.serviceName,\n serviceVersion,\n boundary: cfg.boundary,\n module: cfg.module,\n env,\n otlpEndpoint,\n sampleRatio,\n });\n // Explicit success log includes metrics path status so an operator can\n // distinguish traces-only startup from full traces+metrics startup.\n logger.info('[telemetry] OpenTelemetry exporter pipeline started', {\n serviceName: cfg.serviceName,\n otlpEndpoint: otlpEndpoint ? '<configured>' : '<not set>',\n sampleRatio,\n metricsEnabled: otelSdk.metricsEnabled,\n });\n\n if (!otelSdk.metricsEnabled && otelSdk.metricsDropReason) {\n logger.warn('[telemetry] OpenTelemetry metrics reader disabled; continuing with traces only', {\n serviceName: cfg.serviceName,\n reason: otelSdk.metricsDropReason,\n });\n }\n } catch (err) {\n logger.warn('[telemetry] OpenTelemetry exporter pipeline failed to start; continuing with logs only', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n } else {\n logger.info('[telemetry] OTel SDK exporter disabled by env');\n }\n\n const shutdown = async (): Promise<void> => {\n try {\n if (otelSdk?.shutdown) await otelSdk.shutdown();\n } catch (err) {\n (logger as unknown as BaseLogger).warn('[telemetry] shutdown error (ignored)', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n };\n\n // Mirror defaultLogger so services that still use the singleton get trace-enriched output.\n defaultLogger.setLevel(logger.getLevel?.() ?? 'info');\n\n return {\n serviceName: cfg.serviceName,\n serviceVersion,\n env,\n logger: logger as unknown as BaseLogger,\n instrumentation,\n shutdown,\n };\n}\n\n// Re-export what services typically import.\nexport { initializeInstrumentation, setupInstrumentation };\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/telemetry/health.ts","../../src/telemetry/metrics-endpoint.ts","../../src/telemetry/prisma-logging.ts","../../src/telemetry/index.ts"],"names":["createHealthRoutes","_deps","Proxy","get","_target","prop","undefined","loadDefaultRegistry","mod","collectDefaultMetrics","register","createMetricsRoutesImpl","app","opts","path","ctx","registry","ctxWithSet","set","status","headers","contentType","metrics","createMetricsRoutes","createPrismaLoggingExtension","logger","name","query","$allOperations","model","operation","args","start","Date","now","result","debug","duration_ms","redactSensitiveFields","err","error","Error","message","String","resolveEnv","explicit","fromEnv","process","env","resolveVersion","resolveEndpoint","proto","resolveSampling","Number","isFinite","Math","min","max","parsed","resolveOtelSdkEnabled","sdkDisabled","otelEnabled","bootstrapTelemetry","cfg","serviceVersion","otlpEndpoint","sampleRatio","createPinoLogger","serviceName","version","setActiveTelemetryLogger","instrumentation","setupInstrumentation","tracing","samplingRate","otelSdk","createOtelSdk","boundary","module","info","metricsEnabled","metricsDropReason","warn","reason","shutdown","defaultLogger","setLevel","getLevel"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * `/health`, `/health/live`, `/health/ready` Elysia routes with a 1s\n * result cache so readiness checks can't stampede Postgres.\n *\n * Dependencies (prisma, eventQueue, valkey) are optional — omit any client and\n * the readiness check simply skips it.\n */\n\ninterface PrismaLike {\n $queryRaw: (strings: TemplateStringsArray) => Promise<unknown>;\n}\ninterface EventQueueLike {\n isConnected?: () => boolean | Promise<boolean>;\n healthCheck?: () => Promise<{ ok: boolean }>;\n}\ninterface ValkeyLike {\n ping: () => Promise<unknown>;\n}\n\nexport interface HealthDeps {\n prisma?: PrismaLike;\n eventQueue?: EventQueueLike;\n valkey?: ValkeyLike;\n /** Service version reported on /health. */\n version?: string;\n /** Service name reported on /health. */\n serviceName?: string;\n}\n\ninterface CachedStatus {\n ready: boolean;\n checked: Record<string, { ok: boolean; error?: string }>;\n at: number;\n}\n\nconst CACHE_TTL_MS = 1000;\n\nasync function probeReady(deps: HealthDeps): Promise<CachedStatus> {\n const checked: Record<string, { ok: boolean; error?: string }> = {};\n\n if (deps.prisma) {\n try {\n await deps.prisma.$queryRaw`SELECT 1`;\n checked['postgres'] = { ok: true };\n } catch (err) {\n checked['postgres'] = {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n if (deps.eventQueue) {\n try {\n const connected =\n typeof deps.eventQueue.isConnected === 'function'\n ? await Promise.resolve(deps.eventQueue.isConnected())\n : ((await deps.eventQueue.healthCheck?.())?.ok ?? true);\n checked['eventQueue'] = { ok: Boolean(connected) };\n } catch (err) {\n checked['eventQueue'] = {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n if (deps.valkey) {\n try {\n await deps.valkey.ping();\n checked['valkey'] = { ok: true };\n } catch (err) {\n checked['valkey'] = {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n const ready = Object.values(checked).every((c) => c.ok);\n return { ready, checked, at: Date.now() };\n}\n\nexport function createHealthRoutes(_deps: HealthDeps = {}): unknown {\n // Return an Elysia app lazily so be-sdk doesn't hard-require elysia.\n return new Proxy(\n {},\n {\n get(_target, prop): unknown {\n // Tell TypeScript consumers the returned object is an Elysia plugin;\n // the actual mount happens via `createHealthRoutesImpl`. Services\n // that prefer direct use can call `createHealthRoutesImpl(elysia, deps)`.\n if (prop === 'use' || prop === 'then') return undefined;\n return undefined;\n },\n }\n );\n}\n\n/**\n * Mount health routes on an existing Elysia app. Callers hold a reference\n * to Elysia themselves; be-sdk stays decoupled.\n */\nexport function createHealthRoutesImpl<\n App extends {\n get: (path: string, handler: (ctx: unknown) => unknown) => App;\n },\n>(app: App, deps: HealthDeps = {}): App {\n let cache: CachedStatus | null = null;\n\n const getStatus = async (): Promise<CachedStatus> => {\n if (cache && Date.now() - cache.at < CACHE_TTL_MS) return cache;\n cache = await probeReady(deps);\n return cache;\n };\n\n app.get('/health/live', () => ({\n status: 'ok',\n serviceName: deps.serviceName,\n version: deps.version,\n }));\n\n app.get('/health/ready', async (ctx: unknown): Promise<unknown> => {\n const status = await getStatus();\n const ctxWithSet = ctx as { set?: { status?: number } };\n if (!status.ready && ctxWithSet.set) ctxWithSet.set.status = 503;\n return {\n status: status.ready ? 'ok' : 'degraded',\n serviceName: deps.serviceName,\n version: deps.version,\n checks: status.checked,\n };\n });\n\n app.get('/health', async (ctx: unknown): Promise<unknown> => {\n const status = await getStatus();\n const ctxWithSet = ctx as { set?: { status?: number } };\n if (!status.ready && ctxWithSet.set) ctxWithSet.set.status = 503;\n return {\n status: status.ready ? 'ok' : 'degraded',\n serviceName: deps.serviceName,\n version: deps.version,\n checks: status.checked,\n uptime_s: Math.round(process.uptime()),\n };\n });\n\n return app;\n}\n","/**\n * Prometheus `/metrics` route mounter. Uses the shared `prom-client`\n * default registry so all instrumentation (GraphQL Envelop, Prisma,\n * runtime) shows up on a single endpoint.\n */\n\ninterface PromRegistryLike {\n metrics: () => Promise<string> | string;\n contentType?: string;\n}\n\nexport interface MetricsMountOptions {\n registry?: PromRegistryLike;\n path?: string;\n}\n\nexport async function loadDefaultRegistry(): Promise<PromRegistryLike | null> {\n try {\n const mod = (await import('prom-client')) as unknown as {\n register: PromRegistryLike;\n collectDefaultMetrics: (opts?: Record<string, unknown>) => void;\n };\n // Kick runtime metrics into the default registry if not already.\n try {\n mod.collectDefaultMetrics({ register: mod.register });\n } catch {\n // Already registered — ignore duplicate-metric errors.\n }\n return mod.register;\n } catch {\n return null;\n }\n}\n\nexport function createMetricsRoutesImpl<\n App extends {\n get: (path: string, handler: (ctx: unknown) => unknown) => App;\n },\n>(app: App, opts: MetricsMountOptions = {}): App {\n const path = opts.path ?? '/metrics';\n\n app.get(path, async (ctx: unknown): Promise<unknown> => {\n const registry = opts.registry ?? (await loadDefaultRegistry());\n const ctxWithSet = ctx as { set?: { status?: number; headers?: Record<string, string> } };\n if (!registry) {\n if (ctxWithSet.set) ctxWithSet.set.status = 503;\n return '# prom-client not installed\\n';\n }\n if (ctxWithSet.set) {\n ctxWithSet.set.status = 200;\n ctxWithSet.set.headers = {\n 'content-type': registry.contentType ?? 'text/plain; version=0.0.4; charset=utf-8',\n };\n }\n return registry.metrics();\n });\n\n return app;\n}\n\n/**\n * Legacy export name used by the service template. Composes the Elysia\n * plugin-style function that `new Elysia().use(...)` accepts.\n */\nexport function createMetricsRoutes(opts: MetricsMountOptions = {}): unknown {\n return (app: Parameters<typeof createMetricsRoutesImpl>[0]): unknown => createMetricsRoutesImpl(app, opts);\n}\n","/**\n * Prisma client extension that pipes query events through the SDK logger\n * with trace/span correlation fields auto-injected. The\n * `@prisma/instrumentation` peer provides the spans\n * themselves; this extension only adds structured log events on top.\n */\nimport type { Logger } from '../logger/index.js';\nimport { redactSensitiveFields } from '../logger/index.js';\n\ntype PrismaQueryArgs = {\n model?: string;\n operation: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n};\n\n/**\n * Returns a Prisma Client extension object compatible with the\n * `$extends()` API (Prisma v5+).\n *\n * ```ts\n * export const prisma = new PrismaClient().$extends(\n * createPrismaLoggingExtension(logger)\n * );\n * ```\n */\nexport function createPrismaLoggingExtension(logger: Logger): {\n name: string;\n query: {\n $allOperations: (args: PrismaQueryArgs) => Promise<unknown>;\n };\n} {\n return {\n name: 'burdenoff-pino-logging',\n query: {\n async $allOperations({ model, operation, args, query }: PrismaQueryArgs): Promise<unknown> {\n const start = Date.now();\n try {\n const result = await query(args);\n logger.debug('prisma.query', {\n model,\n operation,\n duration_ms: Date.now() - start,\n args: redactSensitiveFields(args),\n });\n return result;\n } catch (err) {\n logger.error('prisma.error', {\n model,\n operation,\n duration_ms: Date.now() - start,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n },\n },\n };\n}\n","/**\n * Unified telemetry bootstrap for Burdenoff services.\n *\n * Composes the existing `instrumentation/` + `observability/` + `logger/`\n * modules and adds:\n * - `bootstrapTelemetry({ serviceName, boundary, module, env })` — single\n * call that initializes OTel, wires Pino logger with trace fields,\n * exposes GraphQL Yoga plugins, registers process exit hooks.\n * - `createHealthRoutes({ prisma, nats, valkey, version })` — `/health`,\n * `/health/live`, `/health/ready` Elysia routes.\n * - `createMetricsRoutes(registry?)` — `/metrics` Prometheus exposition.\n * - `createPrismaLoggingExtension(logger)` — Prisma extension that pipes\n * query events through Pino with trace/span correlation ids.\n *\n * The module does not pull in `@opentelemetry/sdk-node` or `pino` as direct\n * deps — services install those as optional peers, and imports are lazy so\n * services that don't install them still load.\n */\n\nimport type { Logger as BaseLogger } from '../logger/index.js';\nimport { logger as defaultLogger } from '../logger/index.js';\nimport {\n initializeInstrumentation,\n setupInstrumentation,\n type SetupInstrumentationOptions,\n type InstrumentationSetupResult,\n} from '../instrumentation/index.js';\nimport { setActiveTelemetryLogger } from './logger-state.js';\nimport type { OtelSdkHandle } from './sdk.js';\n\nexport { createHealthRoutes } from './health.js';\nexport { createMetricsRoutes } from './metrics-endpoint.js';\nexport { createPrismaLoggingExtension } from './prisma-logging.js';\nexport { DEFAULT_REDACT_PATHS } from './pino-redaction.js';\nexport { createPinoLogger } from './pino-logger.js';\n\nexport type Boundary = 'wspace' | 'global' | 'gateway';\nexport type Env = 'alpha' | 'prod' | 'dev';\n\nexport interface TelemetryConfig {\n /** Full service name, e.g. \"wspace-auth-svc\". */\n serviceName: string;\n /** Semver of the service deployment; defaults to `process.env.npm_package_version`. */\n serviceVersion?: string;\n /** Monorepo boundary: `wspace`, `global`, or `gateway`. */\n boundary: Boundary;\n /** Module slug, e.g. `auth` (omit for gateways). */\n module?: string;\n /** Deployment environment; defaults to alpha for non-production NODE_ENV. */\n env?: Env;\n /**\n * OTLP endpoint for spans/metrics/logs. Defaults to\n * `$OTEL_EXPORTER_OTLP_ENDPOINT` or\n * `http://alloy.sre.svc.cluster.local:4318`.\n */\n otlpEndpoint?: string;\n /** Head-based sampling ratio. Default: alpha=1.0, prod=0.1. */\n sampleRatio?: number;\n /** Extra options forwarded to `setupInstrumentation`. */\n instrumentation?: SetupInstrumentationOptions;\n}\n\nexport interface TelemetryHandle {\n /** The configured service name (for use in health routes, etc.). */\n serviceName: string;\n /** The resolved service version. */\n serviceVersion: string;\n /** Environment. */\n env: Env;\n /** The Pino-backed logger. */\n logger: BaseLogger;\n /** Initialized instrumentation (tracer + metrics + plugins). */\n instrumentation: InstrumentationSetupResult;\n /** Cleanup hook; services call on SIGTERM. */\n shutdown: () => Promise<void>;\n}\n\nfunction resolveEnv(explicit?: Env): Env {\n if (explicit) return explicit;\n const fromEnv = process.env['DEPLOY_ENV'] ?? process.env['NODE_ENV'] ?? '';\n if (fromEnv === 'production' || fromEnv === 'prod') return 'prod';\n if (fromEnv === 'development' || fromEnv === 'dev') return 'dev';\n return 'alpha';\n}\n\nfunction resolveVersion(explicit?: string): string {\n if (explicit) return explicit;\n return process.env['npm_package_version'] ?? process.env['SERVICE_VERSION'] ?? '0.0.0';\n}\n\nfunction resolveEndpoint(explicit?: string): string {\n if (explicit) return explicit;\n const proto = 'http';\n return process.env['OTEL_EXPORTER_OTLP_ENDPOINT'] ?? `${proto}://alloy.sre.svc.cluster.local:4318`;\n}\n\nfunction resolveSampling(explicit: number | undefined, env: Env): number {\n if (typeof explicit === 'number' && Number.isFinite(explicit)) return Math.min(1, Math.max(0, explicit));\n const fromEnv = process.env['OTEL_TRACES_SAMPLER_ARG'];\n if (fromEnv) {\n const parsed = Number(fromEnv);\n if (Number.isFinite(parsed)) return Math.min(1, Math.max(0, parsed));\n }\n if (env === 'prod') return 0.1;\n return 1.0;\n}\n\nfunction resolveOtelSdkEnabled(): boolean {\n const sdkDisabled = process.env['OTEL_SDK_DISABLED'];\n if (sdkDisabled === 'true' || sdkDisabled === '1') return false;\n const otelEnabled = process.env['OTEL_ENABLED'];\n if (otelEnabled === 'false' || otelEnabled === '0') return false;\n return true;\n}\n\n/**\n * Bootstrap the full telemetry stack for a service.\n *\n * Services call this ONCE at startup **before** importing Prisma / GraphQL\n * Yoga / NATS so OTel can auto-instrument their dependencies.\n *\n * ```ts\n * // src/telemetry.ts\n * import { bootstrapTelemetry } from '@burdenoff/be-sdk/telemetry';\n * export const telemetry = await bootstrapTelemetry({\n * serviceName: 'wspace-auth-svc',\n * boundary: 'wspace',\n * module: 'auth',\n * });\n *\n * // src/index.ts — must be the FIRST import line.\n * import './telemetry.js';\n * ```\n */\nexport async function bootstrapTelemetry(cfg: TelemetryConfig): Promise<TelemetryHandle> {\n const env = resolveEnv(cfg.env);\n const serviceVersion = resolveVersion(cfg.serviceVersion);\n const otlpEndpoint = resolveEndpoint(cfg.otlpEndpoint);\n const sampleRatio = resolveSampling(cfg.sampleRatio, env);\n\n // Pino logger with trace/span correlation + redaction.\n // createPinoLogger is async (loads pino via dynamic import); awaiting it\n // is required — without await, `logger` is a Promise and calls like\n // logger.warn(...) crash with \"logger.warn is not a function\" during the\n // sdk-node fallback path.\n const { createPinoLogger } = await import('./pino-logger.js');\n const logger = await createPinoLogger({\n serviceName: cfg.serviceName,\n env,\n version: serviceVersion,\n });\n setActiveTelemetryLogger(logger);\n\n // Initialize core instrumentation (tracer, metrics registry, envelop plugins).\n // `setupInstrumentation` internally calls `initializeInstrumentation`.\n const instrumentation = setupInstrumentation(cfg.serviceName, {\n ...cfg.instrumentation,\n tracing: {\n serviceName: cfg.serviceName,\n ...(cfg.instrumentation?.tracing ?? {}),\n samplingRate: sampleRatio,\n },\n metrics: {\n serviceName: cfg.serviceName,\n ...(cfg.instrumentation?.metrics ?? {}),\n },\n });\n\n // Start the NodeSDK exporter pipeline if sdk-node is present (optional).\n let otelSdk: OtelSdkHandle | undefined;\n if (resolveOtelSdkEnabled()) {\n try {\n const { createOtelSdk } = await import('./sdk.js');\n otelSdk = await createOtelSdk({\n serviceName: cfg.serviceName,\n serviceVersion,\n boundary: cfg.boundary,\n module: cfg.module,\n env,\n otlpEndpoint,\n sampleRatio,\n });\n // Explicit success log includes metrics path status so an operator can\n // distinguish traces-only startup from full traces+metrics startup.\n logger.info('[telemetry] OpenTelemetry exporter pipeline started', {\n serviceName: cfg.serviceName,\n otlpEndpoint: otlpEndpoint ? '<configured>' : '<not set>',\n sampleRatio,\n metricsEnabled: otelSdk.metricsEnabled,\n });\n\n if (!otelSdk.metricsEnabled && otelSdk.metricsDropReason) {\n logger.warn('[telemetry] OpenTelemetry metrics reader disabled; continuing with traces only', {\n serviceName: cfg.serviceName,\n reason: otelSdk.metricsDropReason,\n });\n }\n } catch (err) {\n logger.warn('[telemetry] OpenTelemetry exporter pipeline failed to start; continuing with logs only', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n } else {\n logger.info('[telemetry] OTel SDK exporter disabled by env');\n }\n\n const shutdown = async (): Promise<void> => {\n try {\n if (otelSdk?.shutdown) await otelSdk.shutdown();\n } catch (err) {\n (logger as unknown as BaseLogger).warn('[telemetry] shutdown error (ignored)', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n };\n\n // Mirror defaultLogger so services that still use the singleton get trace-enriched output.\n defaultLogger.setLevel(logger.getLevel?.() ?? 'info');\n\n return {\n serviceName: cfg.serviceName,\n serviceVersion,\n env,\n logger: logger as unknown as BaseLogger,\n instrumentation,\n shutdown,\n };\n}\n\n// Re-export what services typically import.\nexport { initializeInstrumentation, setupInstrumentation };\n"]}
|
package/dist/temporal/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Client, WorkflowHandle } from '@temporalio/client';
|
|
2
2
|
import { Duration } from '@temporalio/common';
|
|
3
|
-
import { S as ServiceLayer } from '../layer-
|
|
3
|
+
import { S as ServiceLayer } from '../layer-CUu_cZ7d.js';
|
|
4
4
|
|
|
5
5
|
type WorkflowSearchAttributes = Record<string, unknown>;
|
|
6
6
|
interface TemporalClientConfig {
|
package/dist/temporal/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { TemporalClient, TemporalClientFactory, TemporalModule, TemporalWorker, TemporalWorkerFactory, TemporalWorkerManager } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { TemporalClient, TemporalClientFactory, TemporalModule, TemporalWorker, TemporalWorkerFactory, TemporalWorkerManager } from '../chunk-R3XPCYHM.js';
|
|
2
|
+
import '../chunk-ZA3IGCDJ.js';
|
|
3
3
|
import '../chunk-CBZNP6RF.js';
|
|
4
4
|
import '../chunk-XE4OXN2W.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/tracker/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import '../graphql-
|
|
2
|
-
import '../index-
|
|
3
|
-
export { a as ActivityTrackingOptions, P as ProductTracker, R as RbacCheckOptions, b as TrackOptions, c as TrackResult, T as TrackerModule, d as TrackingEvent, e as UNIFIED_TRACKER_CONSTANTS, f as UnifiedTrackerStub, g as UnifiedTrackingOptions, h as UsageMetricType, i as UsageTrackingOptions, j as createProductTracker, t as trackOperation, k as trackerStub } from '../index-
|
|
4
|
-
import '../index-
|
|
1
|
+
import '../graphql-DH3L5Hj7.js';
|
|
2
|
+
import '../index-Caqvetqq.js';
|
|
3
|
+
export { a as ActivityTrackingOptions, P as ProductTracker, R as RbacCheckOptions, b as TrackOptions, c as TrackResult, T as TrackerModule, d as TrackingEvent, e as UNIFIED_TRACKER_CONSTANTS, f as UnifiedTrackerStub, g as UnifiedTrackingOptions, h as UsageMetricType, i as UsageTrackingOptions, j as createProductTracker, t as trackOperation, k as trackerStub } from '../index-BZPEyVOl.js';
|
|
4
|
+
import '../index-DohaJRZP.js';
|
|
5
5
|
import 'graphql-request';
|
package/dist/tracker/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, createProductTracker, trackOperation, trackerStub } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
1
|
+
export { TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, createProductTracker, trackOperation, trackerStub } from '../chunk-5M3YVBTH.js';
|
|
2
|
+
import '../chunk-RMDKB5O7.js';
|
|
3
|
+
import '../chunk-6WYNQ26B.js';
|
|
4
|
+
import '../chunk-O6RHB2YP.js';
|
|
5
|
+
import '../chunk-ZA3IGCDJ.js';
|
|
6
6
|
import '../chunk-CBZNP6RF.js';
|
|
7
7
|
import '../chunk-XE4OXN2W.js';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/be-sdk",
|
|
3
|
-
"version": "2026.516.
|
|
3
|
+
"version": "2026.516.3",
|
|
4
4
|
"description": "Backend SDK for Burdenoff products providing unified access to notifications, RBAC, activity tracking, usage monitoring, and more",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init/index.ts"],"names":["sdkState","isInitialized","initializeBurdenoffSDK","config","logger","warn","info","startTime","Date","now","initializeLogging","layerManager","gatewayClient","initializeLayer","prisma","initializeDatabase","valkey","initializeCache","eventPublisher","initializeEventQueue","layer","autoCreateStreams","initializeLayerStreams","graphSync","initializeGraphSync","clickhouse","initializeAnalytics","initializeObservability","nats","graphSyncEnabled","graph","enabled","analyticsEnabled","analytics","observabilityEnabled","observability","metrics","layerAwareEnabled","duration","initializedState","type","serviceName","error","getSDKState","Error","isSDKInitialized","resetSDK","loggingConfig","logging","isDevelopment","app","nodeEnv","level","setLevel","console","setConsoleEnabled","format","database","url","maxConnections","enableQueryLogging","undefined","cacheConfig","cache","defaultTTL","_config","process","env","EventQueueFactory","publisher","createPublisherFromEnv","connect","message","String","note","eventsEnabled","productSource","streamName","syncInterval","batchSize","requestTimeout","openTelemetry","port","endpoint","samplingRate","LayerManager","serviceIdentity","GatewayClient","internalGatewayUrl","getInternalGatewayUrl","crossLayerGatewayUrl","getCrossLayerGatewayUrl","debug"],"mappings":"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","file":"chunk-75VTKG4Q.js","sourcesContent":["/**\n * Burdenoff SDK Initialization Module\n *\n * Provides a unified initialization function for all state services\n * including database, cache, analytics, event queue, and graph sync.\n *\n * @module init\n * @category Initialization\n */\n\nimport { logger } from '../logger/index.js';\nimport { LayerManager } from '../layer/index.js';\nimport { GatewayClient } from '../gateway/index.js';\nimport type { BurdenoffSDKInitConfig, InitializedSDKState } from './types.js';\n\n/**\n * Global SDK state\n */\nlet sdkState: InitializedSDKState | null = null;\nlet isInitialized = false;\n\n/**\n * Initialize Burdenoff SDK with unified configuration\n *\n * This function initializes all configured state services in the correct order:\n * 1. Logging configuration\n * 2. Database (Prisma with PostgreSQL)\n * 3. Cache (Valkey)\n * 4. Event Queue (Redis Streams)\n * 5. Graph Sync (Redis Streams-based — NebulaGraph writes happen inside wspace-graph-svc)\n * 6. Analytics (ClickHouse)\n * 7. Observability (Metrics, OpenTelemetry)\n *\n * @param config - SDK initialization configuration\n * @returns Initialized SDK state\n *\n * @example\n * ```typescript\n * import { initializeBurdenoffSDK } from '@burdenoff/be-sdk/init';\n *\n * const state = await initializeBurdenoffSDK({\n * database: {\n * url: process.env.DATABASE_URL!,\n * maxConnections: 20,\n * },\n * graph: {\n * enabled: true,\n * eventsEnabled: true,\n * },\n * cache: {\n * valkey: {\n * url: process.env.VALKEY_URL!,\n * },\n * },\n * });\n * ```\n */\nexport async function initializeBurdenoffSDK(config: BurdenoffSDKInitConfig): Promise<InitializedSDKState> {\n if (isInitialized && sdkState) {\n logger.warn('[SDK Init] SDK already initialized, returning existing state');\n return sdkState;\n }\n\n logger.info('[SDK Init] Starting SDK initialization...');\n const startTime = Date.now();\n\n try {\n // 1. Configure logging\n await initializeLogging(config);\n\n // 2. Initialize layer manager (if configured)\n const { layerManager, gatewayClient } = await initializeLayer(config);\n\n // 3. Initialize database (required)\n const prisma = await initializeDatabase(config);\n\n // 4. Initialize cache (optional)\n const valkey = await initializeCache(config);\n\n // 5. Initialize event queue (optional) — Redis Streams via REDIS_URL\n const eventPublisher = await initializeEventQueue(config);\n\n // 6. Initialize layer streams (if layer configured)\n if (config.layer?.autoCreateStreams !== false && config.layer) {\n await initializeLayerStreams(config);\n }\n\n // 7. Initialize graph sync (optional) — publisher emits to Redis Streams,\n // never opens a graph-DB connection\n const graphSync = await initializeGraphSync(config);\n\n // 8. Initialize analytics (optional)\n const clickhouse = await initializeAnalytics(config);\n\n // 9. Initialize observability (optional)\n await initializeObservability(config);\n\n // Create SDK state\n // graphSync is a publisher-side placeholder; services emit Redis Streams\n // events and wspace-graph-svc owns the sole NebulaGraph connection.\n void graphSync;\n sdkState = {\n prisma,\n valkey,\n clickhouse,\n eventPublisher,\n // Deprecated alias kept for one release; remove after svcs migrate to `eventPublisher`.\n nats: eventPublisher,\n layerManager,\n gatewayClient,\n graphSyncEnabled: config.graph?.enabled ?? false,\n analyticsEnabled: !!config.analytics?.clickhouse,\n observabilityEnabled: config.observability?.metrics?.enabled ?? false,\n layerAwareEnabled: !!config.layer,\n };\n\n isInitialized = true;\n\n const duration = Date.now() - startTime;\n // sdkState is guaranteed non-null here since we just assigned it above\n const initializedState = sdkState;\n logger.info(`[SDK Init] SDK initialized successfully in ${duration}ms`, {\n graphSyncEnabled: initializedState.graphSyncEnabled,\n analyticsEnabled: initializedState.analyticsEnabled,\n observabilityEnabled: initializedState.observabilityEnabled,\n layerAwareEnabled: initializedState.layerAwareEnabled,\n layer: config.layer?.type,\n serviceName: config.layer?.serviceName,\n });\n\n return initializedState;\n } catch (error) {\n logger.error('[SDK Init] Failed to initialize SDK:', error);\n throw error;\n }\n}\n\n/**\n * Get current SDK state\n * @throws Error if SDK is not initialized\n */\nexport function getSDKState(): InitializedSDKState {\n if (!isInitialized || !sdkState) {\n throw new Error('SDK not initialized. Call initializeBurdenoffSDK() first.');\n }\n return sdkState;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isSDKInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset SDK state (useful for testing)\n */\nexport async function resetSDK(): Promise<void> {\n logger.info('[SDK Init] Resetting SDK state...');\n\n if (sdkState) {\n // Cleanup resources\n // Note: Individual cleanup will be handled by service-specific shutdown handlers\n sdkState = null;\n }\n\n isInitialized = false;\n logger.info('[SDK Init] SDK state reset');\n}\n\n/**\n * Initialize logging configuration\n */\nasync function initializeLogging(config: BurdenoffSDKInitConfig): Promise<void> {\n logger.info('[SDK Init] Configuring logging...');\n\n const loggingConfig = config.logging ?? {};\n const isDevelopment = config.app?.nodeEnv === 'development';\n\n // Set log level\n const level = loggingConfig.level ?? 'info';\n logger.setLevel(level);\n\n // Set console logging\n const console = loggingConfig.console ?? true;\n logger.setConsoleEnabled(console);\n\n logger.info('[SDK Init] Logging configured', {\n level,\n console,\n format: loggingConfig.format ?? (isDevelopment ? 'pretty' : 'json'),\n });\n}\n\n/**\n * Initialize database (Prisma with PostgreSQL)\n */\nasync function initializeDatabase(config: BurdenoffSDKInitConfig): Promise<unknown> {\n logger.info('[SDK Init] Initializing database...');\n\n // Note: Database initialization is handled by createPrismaClient in prisma/client.ts\n // This is called by the application (e.g., workspaces-backend)\n // We just validate the config here\n if (!config.database?.url) {\n throw new Error('Database URL is required');\n }\n\n logger.info('[SDK Init] Database configuration validated', {\n maxConnections: config.database.maxConnections ?? 20,\n enableQueryLogging: config.database.enableQueryLogging ?? false,\n });\n\n // Return undefined as database client is created separately\n return undefined;\n}\n\n/**\n * Initialize cache (Valkey)\n */\nasync function initializeCache(config: BurdenoffSDKInitConfig): Promise<unknown> {\n const cacheConfig = config.cache?.valkey;\n\n if (!cacheConfig) {\n logger.info('[SDK Init] Cache not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing Valkey cache...');\n\n // Note: Valkey initialization is handled by cache module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] Valkey cache configuration validated', {\n url: cacheConfig.url ? '***' : undefined,\n defaultTTL: cacheConfig.defaultTTL ?? 3600,\n });\n\n return undefined;\n}\n\n/**\n * Initialize event queue (Redis Streams).\n *\n * NATS was retired on 2026-05-16. The publisher is created from\n * `REDIS_URL` (set platform-wide in KV). Legacy `config.eventQueue.nats`\n * values are ignored — kept on the type only as a back-compat shim.\n */\nasync function initializeEventQueue(_config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!process.env['REDIS_URL']) {\n logger.info('[SDK Init] REDIS_URL not set, skipping event queue init');\n return undefined;\n }\n\n try {\n const { EventQueueFactory } = await import('../event-queue/factory/EventQueueFactory.js');\n const publisher = EventQueueFactory.createPublisherFromEnv();\n await publisher.connect();\n\n logger.info('[SDK Init] Redis Streams event publisher connected');\n\n return publisher;\n } catch (error) {\n logger.warn('[SDK Init] Failed to connect Redis Streams event publisher (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n note: 'Service will continue without event publishing. Use direct API calls as fallback.',\n });\n return undefined;\n }\n}\n\n/**\n * Initialize graph sync (Redis Streams publisher side).\n *\n * Services publish entity events to Redis Streams; the `wspace-graph-svc`\n * consumer (and only it) persists them into NebulaGraph via its Python\n * sidecar. This SDK function does no DB work — it just validates that the\n * publisher-side config is sensible and logs it.\n */\nasync function initializeGraphSync(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.graph?.enabled) {\n logger.info('[SDK Init] Graph sync not enabled, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Graph sync enabled (publisher-only mode)', {\n eventsEnabled: config.graph.eventsEnabled ?? true,\n productSource: config.graph.productSource,\n streamName: config.graph.streamName ?? 'graph_events',\n syncInterval: config.graph.syncInterval ?? 1000,\n batchSize: config.graph.batchSize ?? 10,\n });\n\n return undefined;\n}\n\n/**\n * Initialize analytics (ClickHouse)\n */\nasync function initializeAnalytics(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.analytics?.clickhouse) {\n logger.info('[SDK Init] Analytics not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing ClickHouse for analytics...');\n\n // Note: ClickHouse initialization is handled by analytics module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] ClickHouse configuration validated', {\n url: config.analytics.clickhouse.url,\n database: config.analytics.clickhouse.database,\n requestTimeout: config.analytics.clickhouse.requestTimeout ?? 60000,\n });\n\n return undefined;\n}\n\n/**\n * Initialize observability (metrics, tracing)\n */\nasync function initializeObservability(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.observability?.metrics?.enabled && !config.observability?.openTelemetry?.enabled) {\n logger.info('[SDK Init] Observability not configured, skipping');\n return;\n }\n\n logger.info('[SDK Init] Initializing observability...');\n\n // Note: Observability initialization is handled by observability module\n // This is a placeholder for future implementation\n if (config.observability.metrics?.enabled) {\n logger.info('[SDK Init] Metrics configuration validated', {\n port: config.observability.metrics.port ?? 9090,\n endpoint: config.observability.metrics.endpoint ?? '/metrics',\n });\n }\n\n if (config.observability.openTelemetry?.enabled) {\n logger.info('[SDK Init] OpenTelemetry configuration validated', {\n serviceName: config.observability.openTelemetry.serviceName,\n samplingRate: config.observability.openTelemetry.samplingRate ?? 1.0,\n });\n }\n}\n\n/**\n * Initialize layer manager and gateway client\n */\nasync function initializeLayer(\n config: BurdenoffSDKInitConfig\n): Promise<{ layerManager?: LayerManager; gatewayClient?: GatewayClient }> {\n if (!config.layer) {\n logger.info('[SDK Init] Layer configuration not provided, skipping layer initialization');\n return {};\n }\n\n logger.info('[SDK Init] Initializing layer manager...', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n });\n\n // Create layer manager\n const layerManager = new LayerManager({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n });\n\n // Create gateway client\n const gatewayClient = new GatewayClient({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n logger.info('[SDK Init] Layer manager initialized', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n return { layerManager, gatewayClient };\n}\n\n/**\n * Initialize layer-specific Redis streams.\n *\n * No-op since the 2026-05-16 NATS retirement: Redis Streams are created\n * on demand by `XGROUP CREATE ... MKSTREAM` inside the consumer, so no\n * upfront connect-and-provision step is needed.\n */\nasync function initializeLayerStreams(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.layer) {\n return;\n }\n logger.debug('[SDK Init] Layer streams init is a no-op for Redis Streams (auto-created on first XADD/XGROUP)', {\n layer: config.layer.type,\n });\n}\n\n// Export types\nexport type * from './types.js';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/layer/index.ts"],"names":["LayerManager","config","gatewayConfig","resourceConfig","routingConfig","serviceIdentity","serviceName","DEFAULT_GATEWAY_ROUTING","layer","resolveGatewayConfig","resolveResourceConfig","logger","debug","envPrefix","toUpperCase","internalGatewayUrl","process","env","internalGateway","host","port","graphqlPath","crossLayerEnvPrefix","crossLayerGatewayUrl","crossLayerGateway","defaults","DEFAULT_LAYER_RESOURCES","natsUrl","valkeyUrl","temporalAddress","temporalNamespace","rbacGatewayUrl","getLayer","getServiceName","getServiceIdentity","getInternalGatewayUrl","getCrossLayerGatewayUrl","getNatsUrl","getValkeyUrl","getTemporalAddress","getTemporalNamespace","getRbacGatewayUrl","getDefaultStreams","DEFAULT_LAYER_STREAMS","getFullConfig","gateways","resources","isWspaceLayer","isGlobalLayer","getOppositeLayer","createLayerManagerFromEnv","Error","detectLayerFromServiceName","startsWith","undefined","getGatewayUrlForLayer","sourceLayer","targetLayer","sourceManager","routing","validateLayerConfig","expectedPrefix","warn"],"mappings":"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","file":"chunk-HIWTWIGQ.js","sourcesContent":["/**\n * Layer Detection and Configuration Module\n *\n * Provides layer-aware configuration and gateway URL resolution\n * for wspace (workspace) and global (tenant) service layers.\n *\n * @module layer\n * @category Configuration\n *\n * @example\n * ```typescript\n * import { LayerManager } from '@burdenoff/be-sdk/layer';\n *\n * // Create layer manager for a wspace service\n * const layer = new LayerManager({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Get gateway URLs\n * const internalUrl = layer.getInternalGatewayUrl(); // wspace-int-gateway\n * const crossLayerUrl = layer.getCrossLayerGatewayUrl(); // global-public-gateway\n * ```\n */\n\nimport {\n type ServiceLayer,\n type LayerConfig,\n type LayerGatewayConfig,\n type LayerResourceUrls,\n type LayerFullConfig,\n type GatewayRoutingConfig,\n DEFAULT_GATEWAY_ROUTING,\n DEFAULT_LAYER_RESOURCES,\n DEFAULT_LAYER_STREAMS,\n} from '../types/layer.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Layer Manager - Provides layer-aware configuration and URL resolution\n */\nexport class LayerManager {\n private config: LayerConfig;\n private gatewayConfig: LayerGatewayConfig;\n private resourceConfig: LayerResourceUrls;\n private routingConfig: GatewayRoutingConfig;\n\n constructor(config: LayerConfig) {\n this.config = {\n serviceIdentity: config.serviceName, // Default to service name\n ...config,\n };\n\n // Load routing config for layer\n this.routingConfig = DEFAULT_GATEWAY_ROUTING[config.layer];\n\n // Initialize gateway config\n this.gatewayConfig = this.resolveGatewayConfig();\n\n // Initialize resource config\n this.resourceConfig = this.resolveResourceConfig();\n\n logger.debug('[LayerManager] Initialized', {\n layer: this.config.layer,\n serviceName: this.config.serviceName,\n serviceIdentity: this.config.serviceIdentity,\n });\n }\n\n /**\n * Resolve gateway configuration from environment or defaults\n */\n private resolveGatewayConfig(): LayerGatewayConfig {\n const envPrefix = this.config.layer.toUpperCase();\n\n // Internal gateway URL\n const internalGatewayUrl =\n process.env[`${envPrefix}_INT_GATEWAY_URL`] ||\n `http://${this.routingConfig.internalGateway.host}:${this.routingConfig.internalGateway.port}${this.routingConfig.internalGateway.graphqlPath}`;\n\n // Cross-layer gateway URL\n const crossLayerEnvPrefix = this.config.layer === 'wspace' ? 'GLOBAL' : 'WSPACE';\n const crossLayerGatewayUrl =\n process.env[`${crossLayerEnvPrefix}_PUBLIC_GATEWAY_URL`] ||\n `http://${this.routingConfig.crossLayerGateway.host}:${this.routingConfig.crossLayerGateway.port}${this.routingConfig.crossLayerGateway.graphqlPath}`;\n\n return {\n internalGatewayUrl,\n crossLayerGatewayUrl,\n };\n }\n\n /**\n * Resolve resource configuration from environment or defaults\n */\n private resolveResourceConfig(): LayerResourceUrls {\n const envPrefix = this.config.layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[this.config.layer];\n\n return {\n natsUrl: process.env[`${envPrefix}_NATS_URL`] || defaults.natsUrl,\n valkeyUrl: process.env[`${envPrefix}_VALKEY_URL`] || defaults.valkeyUrl,\n temporalAddress: process.env[`${envPrefix}_TEMPORAL_ADDRESS`] || defaults.temporalAddress,\n temporalNamespace: process.env[`${envPrefix}_TEMPORAL_NAMESPACE`] || defaults.temporalNamespace,\n rbacGatewayUrl: process.env[`${envPrefix}_RBAC_GATEWAY_URL`] || defaults.rbacGatewayUrl,\n };\n }\n\n /**\n * Get the layer type\n */\n getLayer(): ServiceLayer {\n return this.config.layer;\n }\n\n /**\n * Get the service name\n */\n getServiceName(): string {\n return this.config.serviceName;\n }\n\n /**\n * Get the service identity (for bypass headers)\n */\n getServiceIdentity(): string {\n return this.config.serviceIdentity || this.config.serviceName;\n }\n\n /**\n * Get internal gateway URL (same layer M2M calls)\n */\n getInternalGatewayUrl(): string {\n return this.gatewayConfig.internalGatewayUrl;\n }\n\n /**\n * Get cross-layer gateway URL (cross layer calls via public gateway)\n */\n getCrossLayerGatewayUrl(): string {\n return this.gatewayConfig.crossLayerGatewayUrl;\n }\n\n /**\n * Get NATS URL for this layer\n */\n getNatsUrl(): string {\n return this.resourceConfig.natsUrl;\n }\n\n /**\n * Get Valkey URL for this layer\n */\n getValkeyUrl(): string {\n return this.resourceConfig.valkeyUrl;\n }\n\n /**\n * Get Temporal address for this layer\n */\n getTemporalAddress(): string {\n return this.resourceConfig.temporalAddress;\n }\n\n /**\n * Get Temporal namespace for this layer\n */\n getTemporalNamespace(): string {\n return this.resourceConfig.temporalNamespace;\n }\n\n /**\n * Get RBAC gateway URL for this layer\n */\n getRbacGatewayUrl(): string {\n return this.resourceConfig.rbacGatewayUrl;\n }\n\n /**\n * Get default streams for this layer\n */\n getDefaultStreams(): Array<{ name: string; subjects: string[]; description?: string }> {\n return DEFAULT_LAYER_STREAMS[this.config.layer];\n }\n\n /**\n * Get full configuration\n */\n getFullConfig(): LayerFullConfig {\n return {\n ...this.config,\n gateways: this.gatewayConfig,\n resources: this.resourceConfig,\n };\n }\n\n /**\n * Check if this is a wspace layer service\n */\n isWspaceLayer(): boolean {\n return this.config.layer === 'wspace';\n }\n\n /**\n * Check if this is a global layer service\n */\n isGlobalLayer(): boolean {\n return this.config.layer === 'global';\n }\n\n /**\n * Get the opposite layer\n */\n getOppositeLayer(): ServiceLayer {\n return this.config.layer === 'wspace' ? 'global' : 'wspace';\n }\n}\n\n/**\n * Create LayerManager from environment variables\n *\n * Environment variables:\n * - SERVICE_LAYER: 'wspace' | 'global'\n * - SERVICE_NAME: Service name (e.g., 'wspace-tags-svc')\n * - SERVICE_IDENTITY: Service identity for bypass headers (defaults to SERVICE_NAME)\n *\n * @throws Error if SERVICE_LAYER is not set or invalid\n */\nexport function createLayerManagerFromEnv(): LayerManager {\n const layer = process.env['SERVICE_LAYER'] as ServiceLayer;\n\n if (!layer || (layer !== 'wspace' && layer !== 'global')) {\n throw new Error(\n `[LayerManager] Invalid or missing SERVICE_LAYER environment variable. ` +\n `Expected 'wspace' or 'global', got '${layer}'`\n );\n }\n\n const serviceName = process.env['SERVICE_NAME'];\n if (!serviceName) {\n throw new Error('[LayerManager] SERVICE_NAME environment variable is required');\n }\n\n const serviceIdentity = process.env['SERVICE_IDENTITY'] || serviceName;\n\n return new LayerManager({\n layer,\n serviceName,\n serviceIdentity,\n });\n}\n\n/**\n * Detect layer from service name\n *\n * @param serviceName - Service name (e.g., 'wspace-tags-svc', 'global-auth-svc')\n * @returns Detected layer or undefined if unable to detect\n */\nexport function detectLayerFromServiceName(serviceName: string): ServiceLayer | undefined {\n if (serviceName.startsWith('wspace-')) {\n return 'wspace';\n }\n if (serviceName.startsWith('global-')) {\n return 'global';\n }\n return undefined;\n}\n\n/**\n * Get gateway URL for a target layer from a source layer\n *\n * @param sourceLayer - Layer making the call\n * @param targetLayer - Layer being called\n * @param sourceManager - LayerManager for the source layer (optional, for URL resolution)\n * @returns Gateway URL to use for the call\n */\nexport function getGatewayUrlForLayer(\n sourceLayer: ServiceLayer,\n targetLayer: ServiceLayer,\n sourceManager?: LayerManager\n): string {\n // Same layer = internal gateway\n if (sourceLayer === targetLayer) {\n if (sourceManager) {\n return sourceManager.getInternalGatewayUrl();\n }\n const routing = DEFAULT_GATEWAY_ROUTING[sourceLayer];\n return `http://${routing.internalGateway.host}:${routing.internalGateway.port}${routing.internalGateway.graphqlPath}`;\n }\n\n // Different layer = cross-layer public gateway\n if (sourceManager) {\n return sourceManager.getCrossLayerGatewayUrl();\n }\n const routing = DEFAULT_GATEWAY_ROUTING[sourceLayer];\n return `http://${routing.crossLayerGateway.host}:${routing.crossLayerGateway.port}${routing.crossLayerGateway.graphqlPath}`;\n}\n\n/**\n * Validate layer configuration\n *\n * @param config - Layer configuration to validate\n * @throws Error if configuration is invalid\n */\nexport function validateLayerConfig(config: LayerConfig): void {\n if (!config.layer) {\n throw new Error('[LayerManager] layer is required');\n }\n if (config.layer !== 'wspace' && config.layer !== 'global') {\n throw new Error(`[LayerManager] Invalid layer '${config.layer}'. Must be 'wspace' or 'global'`);\n }\n if (!config.serviceName) {\n throw new Error('[LayerManager] serviceName is required');\n }\n\n // Validate naming convention\n const expectedPrefix = `${config.layer}-`;\n if (!config.serviceName.startsWith(expectedPrefix)) {\n logger.warn('[LayerManager] Service name does not follow naming convention', {\n serviceName: config.serviceName,\n expectedPrefix,\n layer: config.layer,\n });\n }\n}\n\n// Re-export types for convenience\nexport type {\n ServiceLayer,\n LayerConfig,\n LayerGatewayConfig,\n LayerResourceUrls,\n LayerFullConfig,\n GatewayRoutingConfig,\n} from '../types/layer.js';\n\nexport { DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES, DEFAULT_LAYER_STREAMS } from '../types/layer.js';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event-queue/index.ts","../src/event-queue/module-events.ts","../src/event-queue/events.ts"],"names":["createGraphEventEmitter","ModuleEventsService","productSource","subjectPrefix","loggerLabel","publisher","connected","connecting","config","moduleName","charAt","toUpperCase","slice","natsServers","process","env","EventQueueFactory","createPublisherFromEnv","logger","info","MemoryEventPublisher","ensureConnected","connect","then","publish","subject","payload","data","buildPayload","type","action","id","userId","tenantId","workspaceId","correlationId","metadata","timestamp","Date","toISOString","buildSubject","entityType","normalizedType","replace","_match","p1","offset","toLowerCase","publishCreated","publishUpdated","publishDeleted","publishCustom","publishBulkCreated","_entityType","items","close","disconnect","healthCheck","result","isHealthy","status","healthy","message","error","createModuleEventsService","EventPriority","EventsModule","client","context","createStream","name","subjects","options","debug","mutation","variables","input","maxMessages","maxBytes","maxAge","storageType","replicas","response","query","getStreamInfo","deleteStream","purgeStream","sequence","purgedCount","createConsumer","streamName","consumerName","queueGroup","durableName","startPosition","ackMode","maxDeliver","ackWait","deleteConsumer","ackMessage","nakMessage","getConsumerInfo","createPublisher","stream","consumer","createConsumerFromEnv","MemoryEventConsumer"],"mappings":"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","file":"chunk-MQ6OE5QR.js","sourcesContent":["/**\n * Event Queue - Public API\n *\n * This module provides a complete abstraction over event queue systems (NATS, RabbitMQ, Kafka, SQS, etc.)\n * allowing the application to publish and consume events without direct dependency on any specific queue implementation.\n *\n * Usage:\n *\n * // Publishing events (workspaces-backend)\n * import { createPublisher } from './utils/event-queue';\n *\n * const publisher = createPublisher();\n * await publisher.connect();\n *\n * await publisher.publish({\n * subject: 'workspace.created',\n * data: { workspaceId: '123', name: 'My Workspace' },\n * metadata: { userId: 'user-123', source: 'api' }\n * });\n *\n * // Consuming events (workspaces-workers)\n * import { createConsumer } from './core/event-queue';\n *\n * const consumer = createConsumer('WORKSPACE_EVENTS', 'workspace-consumer');\n * await consumer.connect();\n *\n * await consumer.subscribe({\n * subject: 'workspace.*',\n * handler: async (event) => {\n * logger.log('Received event:', event.data);\n * await event.ack();\n * }\n * });\n */\n// Import factory for use in convenience functions\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n// Import implementations for use in convenience functions\nimport { MemoryEventPublisher, MemoryEventConsumer } from './implementations/memory/MemoryEventQueue.js';\n// Import interfaces for type annotations\nimport type { IEventConsumer } from './interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\n\n// Export interfaces\nexport type { IEventQueue } from './interfaces/IEventQueue.js';\nexport type { IEventPublisher, PublishOptions } from './interfaces/IEventPublisher.js';\nexport type { IEventConsumer, ISubscription } from './interfaces/IEventConsumer.js';\n\n// Export types\nexport type {\n EventMessage,\n EventMetadata,\n AcknowledgeableEvent,\n EventHandler,\n StreamConfig,\n SubscriptionOptions,\n NATSConsumerOptions,\n} from './types/events.js';\n\nexport { QueueType } from './types/config.js';\n\nexport type {\n BaseQueueConfig,\n PublisherConfig,\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from './types/config.js';\n\n// Backwards compatibility alias\nexport type { EventQueueHealthCheckResult as HealthCheckResult } from './types/config.js';\n\n// Export factory\nexport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n// Export Redis Streams implementations\nexport {\n RedisStreamsEventPublisher,\n RedisStreamsEventConsumer,\n RedisStreamsConnection,\n streamKey as redisStreamKey,\n dlqKey as redisDlqKey,\n} from './implementations/redis-streams/index.js';\n\n// Export Memory implementations (for development/testing or fallback)\nexport {\n MemoryEventBus,\n MemoryEventQueue,\n MemoryEventPublisher,\n MemoryEventConsumer,\n createMemoryPublisher,\n createMemoryConsumer,\n createGraphEventEmitter as createMemoryGraphEventEmitter,\n} from './implementations/memory/MemoryEventQueue.js';\n\n// Export Graph Event Emitter (Redis Streams-backed). `NatsGraphEventEmitter`\n// is a deprecated alias retained for one release while consumers migrate.\nexport {\n GraphEventEmitterImpl,\n NatsGraphEventEmitter,\n getGraphEventEmitter,\n createGraphEventEmitter,\n resetGraphEventEmitter,\n} from './graph-emitter.js';\nexport type { GraphEventEmitter, EntityEventType, EntityEventRbacMetadata } from './graph-emitter.js';\n\n// Export Module Events Service\nexport { ModuleEventsService, createModuleEventsService } from './module-events.js';\nexport type { ModuleEventPayload, BulkEventPayload, ModuleEventsConfig } from './module-events.js';\n\n// Export high-level Events Module (GraphQL-based event publishing)\nexport { EventsModule } from './events.js';\nexport {\n EventPriority,\n type PublishEventOptions,\n type SubscribeOptions,\n type EventMessage as GraphQLEventMessage,\n type PublishResult,\n type StreamInfo,\n} from './events.js';\n\n/**\n * Create an event publisher from environment configuration.\n *\n * Backend resolution:\n * - `REDIS_URL` set → Redis Streams (the only supported backend since\n * the NATS retirement on 2026-05-16).\n * - `REDIS_URL` unset → in-memory (dev/test fallback).\n */\nexport function createPublisher(): IEventPublisher {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createPublisherFromEnv();\n }\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an event consumer from environment configuration.\n */\nexport function createConsumer(stream: string, consumer: string): IEventConsumer {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createConsumerFromEnv(stream, consumer);\n }\n return new MemoryEventConsumer(stream, consumer);\n}\n","/**\n * Module Events Service\n *\n * Generic event publishing service that modules can configure to publish\n * domain-specific events to NATS JetStream.\n *\n * @module event-queue/module-events\n * @category Events\n *\n * @example\n * ```typescript\n * import { createModuleEventsService } from '@burdenoff/be-sdk/event-queue';\n *\n * // Create a configured event service for the tags module\n * const tagsEventsService = createModuleEventsService({\n * moduleName: 'tags',\n * entityTypes: ['Tag', 'Vocabulary', 'Assignment'],\n * });\n *\n * // Publish events\n * await tagsEventsService.publishCreated('Tag', tagId, tagData, userId);\n * await tagsEventsService.publishUpdated('Vocabulary', vocabId, vocabData, userId);\n * ```\n */\nimport { logger } from '../logger/index.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n/**\n * Event payload structure for module events\n */\nexport interface ModuleEventPayload {\n /** Entity ID */\n id: string;\n /** Entity type (e.g., 'UniversalTag', 'UniversalTagVocabulary') */\n type: string;\n /** Action performed */\n action: 'created' | 'updated' | 'deleted' | 'assigned' | 'removed' | string;\n /** Entity data */\n data: Record<string, unknown>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n correlationId?: string;\n };\n}\n\n/**\n * Bulk event payload structure\n */\nexport interface BulkEventPayload {\n /** Items in the bulk operation */\n items: Array<{ id: string; data: Record<string, unknown> }>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n };\n}\n\n/**\n * Configuration for module events service\n */\nexport interface ModuleEventsConfig {\n /** Module name (used as productSource and in subject prefixes) */\n moduleName: string;\n /** Subject prefix override (defaults to moduleName) */\n subjectPrefix?: string;\n /** Custom logger label */\n loggerLabel?: string;\n}\n\n/**\n * Generic Module Events Service\n *\n * Provides a consistent interface for publishing domain events across all modules.\n * Automatically falls back to in-memory publisher when NATS is not configured.\n */\nexport class ModuleEventsService {\n private readonly productSource: string;\n private readonly subjectPrefix: string;\n private readonly loggerLabel: string;\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor(config: ModuleEventsConfig) {\n this.productSource = config.moduleName;\n this.subjectPrefix = config.subjectPrefix || config.moduleName;\n this.loggerLabel =\n config.loggerLabel || `${config.moduleName.charAt(0).toUpperCase()}${config.moduleName.slice(1)}EventsService`;\n\n // Initialize publisher based on environment\n const natsServers = process.env['NATS_SERVERS'] || process.env['NATS_URL'];\n if (natsServers) {\n // Ensure NATS_SERVERS is set for downstream factory\n if (!process.env['NATS_SERVERS'] && process.env['NATS_URL']) {\n process.env['NATS_SERVERS'] = process.env['NATS_URL'];\n }\n this.publisher = EventQueueFactory.createPublisherFromEnv();\n logger.info(`[${this.loggerLabel}] Using NATS publisher`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info(`[${this.loggerLabel}] Using in-memory publisher (NATS_SERVERS not configured)`);\n }\n }\n\n /**\n * Ensure publisher is connected before publishing\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info(`[${this.loggerLabel}] Publisher connected`);\n });\n\n await this.connecting;\n }\n\n /**\n * Publish an event to the queue\n */\n private async publish(subject: string, payload: unknown): Promise<void> {\n await this.ensureConnected();\n await this.publisher.publish({\n subject,\n data: payload as Record<string, unknown>,\n });\n }\n\n /**\n * Build event payload\n */\n private buildPayload(\n type: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string,\n correlationId?: string\n ): ModuleEventPayload {\n return {\n id,\n type,\n action,\n data,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n ...(correlationId && { correlationId }),\n },\n };\n }\n\n /**\n * Build subject string\n */\n private buildSubject(entityType: string, action: string): string {\n // Convert entityType from PascalCase to lowercase (e.g., UniversalTag -> tag)\n const normalizedType = entityType\n .replace(/^Universal/, '')\n .replace(/([A-Z])/g, (_match, p1, offset) => (offset > 0 ? '_' : '') + (p1 as string).toLowerCase())\n .replace(/^_/, '');\n return `${this.subjectPrefix}.${normalizedType}.${action}`;\n }\n\n /**\n * Publish entity created event\n */\n async publishCreated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'created', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'created'), payload);\n }\n\n /**\n * Publish entity updated event\n */\n async publishUpdated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'updated', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'updated'), payload);\n }\n\n /**\n * Publish entity deleted event\n */\n async publishDeleted(\n entityType: string,\n id: string,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'deleted', id, {}, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'deleted'), payload);\n }\n\n /**\n * Publish custom action event\n */\n async publishCustom(\n entityType: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, action, id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, action), payload);\n }\n\n /**\n * Publish bulk created event\n */\n async publishBulkCreated(\n _entityType: string,\n items: Array<{ id: string; data: Record<string, unknown> }>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload: BulkEventPayload = {\n items,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n },\n };\n await this.publish(`${this.subjectPrefix}.bulk.created`, payload);\n }\n\n /**\n * Close event queue connection\n */\n async close(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info(`[${this.loggerLabel}] Publisher disconnected`);\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Create a module events service instance\n */\nexport function createModuleEventsService(config: ModuleEventsConfig): ModuleEventsService {\n return new ModuleEventsService(config);\n}\n","/**\n * Events Module\n * Helpers for sending events to NATS JetStream queue\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum EventPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface PublishEventOptions {\n /** Event subject/topic */\n subject: string;\n /** Event payload */\n data: Record<string, unknown>;\n /** Event priority */\n priority?: EventPriority;\n /** Event metadata */\n metadata?: Record<string, unknown>;\n /** Delay delivery by milliseconds */\n delay?: number;\n /** Message ID (for deduplication) */\n messageId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface SubscribeOptions {\n /** Subject pattern to subscribe to */\n subject: string;\n /** Queue group name */\n queueGroup?: string;\n /** Durable consumer name */\n durableName?: string;\n /** Start from specific position */\n startPosition?: 'first' | 'last' | 'new';\n /** Acknowledge mode */\n ackMode?: 'explicit' | 'auto';\n /** Max messages to deliver */\n maxDeliver?: number;\n /** Acknowledgment timeout in milliseconds */\n ackWait?: number;\n}\n\nexport interface EventMessage {\n id: string;\n subject: string;\n data: Record<string, unknown>;\n priority: EventPriority;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n publishedAt: string;\n publishedBy?: string;\n}\n\nexport interface PublishResult {\n messageId: string;\n subject: string;\n sequence: number;\n timestamp: string;\n}\n\nexport interface StreamInfo {\n name: string;\n subjects: string[];\n messageCount: number;\n byteCount: number;\n firstSequence: number;\n lastSequence: number;\n consumerCount: number;\n}\n\n/**\n * Events Module\n */\nexport class EventsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Create stream\n */\n public async createStream(\n name: string,\n subjects: string[],\n options?: {\n maxMessages?: number;\n maxBytes?: number;\n maxAge?: number;\n storageType?: 'file' | 'memory';\n replicas?: number;\n }\n ): Promise<StreamInfo> {\n logger.debug('[Events] Creating stream', { name, subjects });\n\n const mutation = `\n mutation CreateStream($input: CreateStreamInput!) {\n createStream(input: $input) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const variables = {\n input: {\n name,\n subjects,\n maxMessages: options?.maxMessages,\n maxBytes: options?.maxBytes,\n maxAge: options?.maxAge,\n storageType: options?.storageType || 'file',\n replicas: options?.replicas || 1,\n },\n };\n\n const response = await this.client.query<{ createStream: StreamInfo }>(mutation, variables, this.context);\n\n logger.info('[Events] Stream created', { name });\n\n return response.createStream;\n }\n\n /**\n * Get stream info\n */\n public async getStreamInfo(name: string): Promise<StreamInfo> {\n logger.debug('[Events] Getting stream info', { name });\n\n const query = `\n query GetStreamInfo($name: String!) {\n getStreamInfo(name: $name) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const response = await this.client.query<{ getStreamInfo: StreamInfo }>(query, { name }, this.context);\n\n return response.getStreamInfo;\n }\n\n /**\n * Delete stream\n */\n public async deleteStream(name: string): Promise<boolean> {\n logger.debug('[Events] Deleting stream', { name });\n\n const mutation = `\n mutation DeleteStream($name: String!) {\n deleteStream(name: $name) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { name }, this.context);\n\n logger.info('[Events] Stream deleted', { name });\n\n return true;\n }\n\n /**\n * Purge stream messages\n */\n public async purgeStream(name: string, options?: { subject?: string; sequence?: number }): Promise<number> {\n logger.debug('[Events] Purging stream', { name, options });\n\n const mutation = `\n mutation PurgeStream($name: String!, $subject: String, $sequence: Int) {\n purgeStream(name: $name, subject: $subject, sequence: $sequence) {\n purgedCount\n }\n }\n `;\n\n const response = await this.client.query<{ purgeStream: { purgedCount: number } }>(\n mutation,\n { name, subject: options?.subject, sequence: options?.sequence },\n this.context\n );\n\n logger.info('[Events] Stream purged', { name, purgedCount: response.purgeStream.purgedCount });\n\n return response.purgeStream.purgedCount;\n }\n\n /**\n * Create consumer\n */\n public async createConsumer(\n streamName: string,\n consumerName: string,\n options: SubscribeOptions\n ): Promise<{ name: string; pending: number }> {\n logger.debug('[Events] Creating consumer', { streamName, consumerName });\n\n const mutation = `\n mutation CreateConsumer($input: CreateConsumerInput!) {\n createConsumer(input: $input) {\n name\n pending\n }\n }\n `;\n\n const variables = {\n input: {\n streamName,\n consumerName,\n subject: options.subject,\n queueGroup: options.queueGroup,\n durableName: options.durableName,\n startPosition: options.startPosition || 'last',\n ackMode: options.ackMode || 'explicit',\n maxDeliver: options.maxDeliver || 5,\n ackWait: options.ackWait || 30000,\n },\n };\n\n const response = await this.client.query<{ createConsumer: { name: string; pending: number } }>(\n mutation,\n variables,\n this.context\n );\n\n logger.info('[Events] Consumer created', { consumerName });\n\n return response.createConsumer;\n }\n\n /**\n * Delete consumer\n */\n public async deleteConsumer(streamName: string, consumerName: string): Promise<boolean> {\n logger.debug('[Events] Deleting consumer', { streamName, consumerName });\n\n const mutation = `\n mutation DeleteConsumer($streamName: String!, $consumerName: String!) {\n deleteConsumer(streamName: $streamName, consumerName: $consumerName) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName }, this.context);\n\n logger.info('[Events] Consumer deleted', { consumerName });\n\n return true;\n }\n\n /**\n * Acknowledge message\n */\n public async ackMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation AckMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n ackMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Negative acknowledge message (requeue)\n */\n public async nakMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Negative acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation NakMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n nakMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Get consumer info\n */\n public async getConsumerInfo(\n streamName: string,\n consumerName: string\n ): Promise<{\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n }> {\n logger.debug('[Events] Getting consumer info', { streamName, consumerName });\n\n const query = `\n query GetConsumerInfo($streamName: String!, $consumerName: String!) {\n getConsumerInfo(streamName: $streamName, consumerName: $consumerName) {\n name\n pending\n redelivered\n numAckPending\n }\n }\n `;\n\n const response = await this.client.query<{\n getConsumerInfo: {\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n };\n }>(query, { streamName, consumerName }, this.context);\n\n return response.getConsumerInfo;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/layer.ts"],"names":["DEFAULT_GATEWAY_ROUTING","wspace","layer","internalGateway","host","port","graphqlPath","crossLayerGateway","global","DEFAULT_LAYER_STREAMS","name","subjects","description","buildInternalGatewayUrl","routing","protocol","DEFAULT_LAYER_RESOURCES","natsUrl","valkeyUrl","temporalAddress","temporalNamespace","rbacGatewayUrl","DEFAULT_CIRCUIT_BREAKER_CONFIG","failureThreshold","resetTimeout","failureWindow","DEFAULT_GATEWAY_RETRY_CONFIG","maxAttempts","initialDelay","maxDelay","backoffMultiplier"],"mappings":";;;AA8IO,IAAMA,uBAAAA,GAAsE;EACjFC,MAAAA,EAAQ;IACNC,KAAAA,EAAO,QAAA;IACPC,eAAAA,EAAiB;MACfC,IAAAA,EAAM,oBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf,KAAA;IACAC,iBAAAA,EAAmB;MACjBH,IAAAA,EAAM,uBAAA;MACNC,IAAAA,EAAM,GAAA;MACNC,WAAAA,EAAa;AACf;AACF,GAAA;EACAE,MAAAA,EAAQ;IACNN,KAAAA,EAAO,QAAA;IACPC,eAAAA,EAAiB;MACfC,IAAAA,EAAM,oBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf,KAAA;IACAC,iBAAAA,EAAmB;MACjBH,IAAAA,EAAM,uBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf;AACF;AACF;AAKO,IAAMG,qBAAAA,GAGT;EACFR,MAAAA,EAAQ;AACN,IAAA;MACES,IAAAA,EAAM,eAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf,KAAA;AACA,IAAA;MACEF,IAAAA,EAAM,qBAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf;;EAEFJ,MAAAA,EAAQ;AACN,IAAA;MACEE,IAAAA,EAAM,eAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf,KAAA;AACA,IAAA;MACEF,IAAAA,EAAM,qBAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf;;AAEJ;AAMA,SAASC,wBAAwBX,KAAAA,EAAmB;AAClD,EAAA,MAAMY,OAAAA,GAAUd,wBAAwBE,KAAAA,CAAAA;AACxC,EAAA,MAAM,EAAEE,IAAAA,EAAMC,IAAAA,EAAMC,WAAAA,KAAgBQ,OAAAA,CAAQX,eAAAA;AAE5C,EAAA,MAAMY,QAAAA,GAAW,MAAA;AACjB,EAAA,OAAO,GAAGA,QAAAA,CAAAA,GAAAA,EAAcX,IAAAA,CAAAA,CAAAA,EAAQC,IAAAA,GAAOC,WAAAA,CAAAA,CAAAA;AACzC;AANSO,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AAcF,IAAMG,uBAAAA,GAAmE;EAC9Ef,MAAAA,EAAQ;IACNgB,OAAAA,EAAS,yBAAA;IACTC,SAAAA,EAAW,6BAAA;IACXC,eAAAA,EAAiB,sBAAA;IACjBC,iBAAAA,EAAmB,gBAAA;AACnBC,IAAAA,cAAAA,EAAgBR,wBAAwB,QAAA;AAC1C,GAAA;EACAL,MAAAA,EAAQ;IACNS,OAAAA,EAAS,yBAAA;IACTC,SAAAA,EAAW,6BAAA;IACXC,eAAAA,EAAiB,sBAAA;IACjBC,iBAAAA,EAAmB,gBAAA;AACnBC,IAAAA,cAAAA,EAAgBR,wBAAwB,QAAA;AAC1C;AACF;AA4BO,IAAMS,8BAAAA,GAAuD;EAClEC,gBAAAA,EAAkB,CAAA;EAClBC,YAAAA,EAAc,GAAA;EACdC,aAAAA,EAAe;AACjB;AAkCO,IAAMC,4BAAAA,GAAmD;EAC9DC,WAAAA,EAAa,CAAA;EACbC,YAAAA,EAAc,GAAA;EACdC,QAAAA,EAAU,GAAA;EACVC,iBAAAA,EAAmB;AACrB","file":"chunk-NGMEI42S.js","sourcesContent":["/**\n * Layer Type Definitions for Burdenoff Backend SDK\n *\n * This module defines types for the layer-aware architecture,\n * supporting wspace (workspace) and global (tenant) service layers.\n *\n * @module types/layer\n * @category Configuration\n */\n\n/**\n * Service layer types\n * - wspace: Workspace layer services (product-specific operations)\n * - global: Global/tenant layer services (cross-product services)\n */\nexport type ServiceLayer = 'wspace' | 'global';\n\n/**\n * Layer configuration for a service\n */\nexport interface LayerConfig {\n /**\n * Layer type this service belongs to\n * @example 'wspace' or 'global'\n */\n layer: ServiceLayer;\n\n /**\n * Service name (e.g., 'wspace-tags-svc', 'global-auth-svc')\n */\n serviceName: string;\n\n /**\n * Service identity for bypass headers\n * Used for M2M authentication\n * @default serviceName\n */\n serviceIdentity?: string;\n}\n\n/**\n * Gateway configuration per layer\n */\nexport interface LayerGatewayConfig {\n /**\n * Internal gateway URL (same layer int-gateway)\n * - wspace services use: wspace-int-gateway\n * - global services use: global-int-gateway\n */\n internalGatewayUrl: string;\n\n /**\n * Cross-layer gateway URL (cross layer public-gateway)\n * - wspace services use: global-public-gateway\n * - global services use: wspace-public-gateway\n */\n crossLayerGatewayUrl: string;\n}\n\n/**\n * Resource URLs per layer\n */\nexport interface LayerResourceUrls {\n /**\n * NATS server URL for the layer\n */\n natsUrl: string;\n\n /**\n * Valkey/Redis URL for the layer\n */\n valkeyUrl: string;\n\n /**\n * Temporal server address for the layer\n */\n temporalAddress: string;\n\n /**\n * Temporal namespace for the layer\n */\n temporalNamespace: string;\n\n /**\n * RBAC gateway URL (for permission checks)\n */\n rbacGatewayUrl: string;\n}\n\n/**\n * Complete layer configuration including gateways and resources\n */\nexport interface LayerFullConfig extends LayerConfig {\n /**\n * Gateway configuration\n */\n gateways: LayerGatewayConfig;\n\n /**\n * Resource URLs\n */\n resources: LayerResourceUrls;\n}\n\n/**\n * Gateway routing rules by layer\n * Defines which gateway to use for same-layer vs cross-layer communication\n */\nexport interface GatewayRoutingConfig {\n /**\n * Layer this config applies to\n */\n layer: ServiceLayer;\n\n /**\n * Internal gateway for same-layer M2M calls\n */\n internalGateway: {\n /** Gateway host (without protocol) */\n host: string;\n /** Gateway port */\n port: number;\n /** GraphQL endpoint path */\n graphqlPath: string;\n };\n\n /**\n * Public gateway for cross-layer calls\n */\n crossLayerGateway: {\n /** Gateway host (without protocol) */\n host: string;\n /** Gateway port */\n port: number;\n /** GraphQL endpoint path */\n graphqlPath: string;\n };\n}\n\n/**\n * Default gateway routing configuration\n */\nexport const DEFAULT_GATEWAY_ROUTING: Record<ServiceLayer, GatewayRoutingConfig> = {\n wspace: {\n layer: 'wspace',\n internalGateway: {\n host: 'wspace-int-gateway',\n port: 4001,\n graphqlPath: '/workspaces/graphql',\n },\n crossLayerGateway: {\n host: 'global-public-gateway',\n port: 4000,\n graphqlPath: '/global/graphql',\n },\n },\n global: {\n layer: 'global',\n internalGateway: {\n host: 'global-int-gateway',\n port: 4002,\n graphqlPath: '/global/graphql',\n },\n crossLayerGateway: {\n host: 'wspace-public-gateway',\n port: 4003,\n graphqlPath: '/workspaces/graphql',\n },\n },\n};\n\n/**\n * Default stream configurations per layer\n */\nexport const DEFAULT_LAYER_STREAMS: Record<\n ServiceLayer,\n Array<{ name: string; subjects: string[]; description?: string }>\n> = {\n wspace: [\n {\n name: 'WSPACE_EVENTS',\n subjects: ['wspace.>'],\n description: 'Workspace layer events stream',\n },\n {\n name: 'WSPACE_GRAPH_EVENTS',\n subjects: ['graph.>'],\n description: 'Workspace layer graph events stream (captures all graph entity events)',\n },\n ],\n global: [\n {\n name: 'GLOBAL_EVENTS',\n subjects: ['global.>'],\n description: 'Global layer events stream',\n },\n {\n name: 'GLOBAL_GRAPH_EVENTS',\n subjects: ['graph.>'],\n description: 'Global layer graph events stream (captures all graph entity events)',\n },\n ],\n};\n\n/**\n * Build internal gateway URL for a layer\n * Uses HTTP for internal K8s communication (mTLS via Istio service mesh)\n */\nfunction buildInternalGatewayUrl(layer: ServiceLayer): string {\n const routing = DEFAULT_GATEWAY_ROUTING[layer];\n const { host, port, graphqlPath } = routing.internalGateway;\n // Internal K8s services use plain HTTP with mTLS handled by Istio\n const protocol = 'http';\n return `${protocol}://${host}:${port}${graphqlPath}`;\n}\n\n/**\n * Default resource URLs per layer\n *\n * Note: Internal K8s service communication uses plain HTTP with mTLS via Istio.\n * External traffic uses HTTPS via ingress gateway.\n */\nexport const DEFAULT_LAYER_RESOURCES: Record<ServiceLayer, LayerResourceUrls> = {\n wspace: {\n natsUrl: 'nats://wspace-nats:4222',\n valkeyUrl: 'valkey://wspace-valkey:6379',\n temporalAddress: 'wspace-temporal:7233',\n temporalNamespace: 'wspace-default',\n rbacGatewayUrl: buildInternalGatewayUrl('wspace'),\n },\n global: {\n natsUrl: 'nats://global-nats:4222',\n valkeyUrl: 'valkey://global-valkey:6379',\n temporalAddress: 'global-temporal:7233',\n temporalNamespace: 'global-default',\n rbacGatewayUrl: buildInternalGatewayUrl('global'),\n },\n};\n\n/**\n * Circuit breaker configuration for gateway client\n */\nexport interface CircuitBreakerConfig {\n /**\n * Number of failures before opening circuit\n * @default 5\n */\n failureThreshold: number;\n\n /**\n * Time in milliseconds to wait before attempting to close circuit\n * @default 30000 (30 seconds)\n */\n resetTimeout: number;\n\n /**\n * Time window in milliseconds for counting failures\n * @default 60000 (60 seconds)\n */\n failureWindow: number;\n}\n\n/**\n * Default circuit breaker configuration\n */\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n resetTimeout: 30000,\n failureWindow: 60000,\n};\n\n/**\n * Retry configuration for gateway client\n */\nexport interface GatewayRetryConfig {\n /**\n * Maximum number of retry attempts\n * @default 3\n */\n maxAttempts: number;\n\n /**\n * Initial delay in milliseconds before first retry\n * @default 1000 (1 second)\n */\n initialDelay: number;\n\n /**\n * Maximum delay in milliseconds between retries\n * @default 10000 (10 seconds)\n */\n maxDelay: number;\n\n /**\n * Backoff multiplier for exponential backoff\n * @default 2\n */\n backoffMultiplier: number;\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_GATEWAY_RETRY_CONFIG: GatewayRetryConfig = {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 10000,\n backoffMultiplier: 2,\n};\n\n/**\n * Headers automatically added by gateway client for M2M calls\n */\nexport interface GatewayRequestHeaders {\n /**\n * Actor ID making the request\n */\n 'x-actor-id'?: string;\n\n /**\n * Actor type\n */\n 'x-actor-type'?: 'user' | 'app' | 'service' | 'super_admin';\n\n /**\n * Workspace ID for the request context\n */\n 'x-workspace-id'?: string;\n\n /**\n * Service identity for bypass validation\n */\n 'x-service-identity'?: string;\n\n /**\n * Call type indicator\n */\n 'x-call-type'?: 'internal' | 'cross-layer';\n\n /**\n * Permission bypass flag\n */\n 'x-bypass-permission'?: string;\n\n /**\n * RBAC bypass flag (set by gateway)\n */\n 'x-rbac-bypass'?: 'true' | 'false';\n\n /**\n * Bypass source (set by gateway)\n */\n 'x-bypass-source'?: string;\n\n /**\n * Bypass timestamp (set by gateway)\n */\n 'x-bypass-timestamp'?: string;\n}\n"]}
|