@burdenoff/be-sdk 2026.716.2 → 2026.717.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/EventQueueFactory-ELT7NDXK.js +7 -0
  2. package/dist/{EventQueueFactory-BDOT45WD.js.map → EventQueueFactory-ELT7NDXK.js.map} +1 -1
  3. package/dist/auth/index.d.ts +2 -2
  4. package/dist/cache/index.d.ts +2 -1
  5. package/dist/cache/index.js +2 -1
  6. package/dist/{chunk-M5JYRRI6.js → chunk-BWKRHVRX.js} +4 -4
  7. package/dist/{chunk-M5JYRRI6.js.map → chunk-BWKRHVRX.js.map} +1 -1
  8. package/dist/{chunk-IMMJMVP7.js → chunk-EQHHYSOE.js} +17 -4
  9. package/dist/chunk-EQHHYSOE.js.map +1 -0
  10. package/dist/{chunk-X5FPXATC.js → chunk-JAZ473V3.js} +3 -3
  11. package/dist/{chunk-X5FPXATC.js.map → chunk-JAZ473V3.js.map} +1 -1
  12. package/dist/{chunk-5ORHPLOA.js → chunk-JNJSSBKO.js} +19 -2
  13. package/dist/chunk-JNJSSBKO.js.map +1 -0
  14. package/dist/{chunk-CJCO3OWF.js → chunk-L4S54SIX.js} +53 -18
  15. package/dist/chunk-L4S54SIX.js.map +1 -0
  16. package/dist/{chunk-5A5GGMWK.js → chunk-NJ5GTICM.js} +71 -4
  17. package/dist/chunk-NJ5GTICM.js.map +1 -0
  18. package/dist/{chunk-DBIWNA72.js → chunk-Q3SO65JD.js} +2 -2
  19. package/dist/{chunk-DBIWNA72.js.map → chunk-Q3SO65JD.js.map} +1 -1
  20. package/dist/{chunk-A4TGVW5V.js → chunk-SBZ3UZ5J.js} +3 -3
  21. package/dist/{chunk-A4TGVW5V.js.map → chunk-SBZ3UZ5J.js.map} +1 -1
  22. package/dist/{chunk-OQ62HA7Z.js → chunk-URDYOM2L.js} +3 -3
  23. package/dist/{chunk-OQ62HA7Z.js.map → chunk-URDYOM2L.js.map} +1 -1
  24. package/dist/{chunk-YKY24YLZ.js → chunk-V4QNOY4E.js} +4 -4
  25. package/dist/{chunk-YKY24YLZ.js.map → chunk-V4QNOY4E.js.map} +1 -1
  26. package/dist/chunk-VBXPFYZ5.js +61 -0
  27. package/dist/chunk-VBXPFYZ5.js.map +1 -0
  28. package/dist/{chunk-A6WNRJZF.js → chunk-WFVLQELZ.js} +4 -4
  29. package/dist/{chunk-A6WNRJZF.js.map → chunk-WFVLQELZ.js.map} +1 -1
  30. package/dist/{client-u23M69Qt.d.ts → client-Dhi02YAf.d.ts} +5 -1
  31. package/dist/event-queue/index.d.ts +2 -1
  32. package/dist/event-queue/index.js +4 -3
  33. package/dist/export/index.js +3 -3
  34. package/dist/gateway/index.js +2 -2
  35. package/dist/gateway/security/index.js +1 -1
  36. package/dist/graph/index.d.ts +2 -2
  37. package/dist/graph/index.js +6 -5
  38. package/dist/{index-qg-t-NT2.d.ts → index-BfvCLSmh.d.ts} +4 -2
  39. package/dist/{index-2jyc-oTr.d.ts → index-CGTwU6CR.d.ts} +1 -1
  40. package/dist/{index-5QTY_V54.d.ts → index-CQGCVFmI.d.ts} +7 -2
  41. package/dist/{index-Zh4KQBM1.d.ts → index-CgTMsars.d.ts} +6 -1
  42. package/dist/index-CoMKgL-p.d.ts +12 -0
  43. package/dist/index.d.ts +10 -8
  44. package/dist/index.js +20 -16
  45. package/dist/index.js.map +1 -1
  46. package/dist/init/index.js +3 -3
  47. package/dist/lifecycle/index.d.ts +1 -0
  48. package/dist/lifecycle/index.js +5 -0
  49. package/dist/lifecycle/index.js.map +1 -0
  50. package/dist/prisma/index.d.ts +2 -2
  51. package/dist/prisma/index.js +5 -4
  52. package/dist/server/index.d.ts +3 -3
  53. package/dist/shutdown-registry-CW9LryO8.d.ts +10 -0
  54. package/dist/{types-De9M0Yin.d.ts → types-DYE90pls.d.ts} +1 -1
  55. package/package.json +3 -3
  56. package/dist/EventQueueFactory-BDOT45WD.js +0 -6
  57. package/dist/chunk-5A5GGMWK.js.map +0 -1
  58. package/dist/chunk-5ORHPLOA.js.map +0 -1
  59. package/dist/chunk-CJCO3OWF.js.map +0 -1
  60. package/dist/chunk-IMMJMVP7.js.map +0 -1
@@ -1,6 +1,6 @@
1
- export { getSDKState, initializeBurdenoffSDK, isSDKInitialized, resetSDK } from '../chunk-M5JYRRI6.js';
2
- import '../chunk-A4TGVW5V.js';
3
- import '../chunk-DBIWNA72.js';
1
+ export { getSDKState, initializeBurdenoffSDK, isSDKInitialized, resetSDK } from '../chunk-BWKRHVRX.js';
2
+ import '../chunk-SBZ3UZ5J.js';
3
+ import '../chunk-Q3SO65JD.js';
4
4
  import '../chunk-7UJXIX4I.js';
5
5
  import '../chunk-VFCMR5GX.js';
6
6
  import '../chunk-RZOFS2BQ.js';
@@ -0,0 +1 @@
1
+ export { S as ShutdownDisposable, d as disposeAll, g as getRegisteredDisposableCount, r as registerDisposable, u as unregisterDisposable } from '../shutdown-registry-CW9LryO8.js';
@@ -0,0 +1,5 @@
1
+ export { disposeAll, getRegisteredDisposableCount, registerDisposable, unregisterDisposable } from '../chunk-VBXPFYZ5.js';
2
+ import '../chunk-CBZNP6RF.js';
3
+ import '../chunk-XE4OXN2W.js';
4
+ //# sourceMappingURL=index.js.map
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -1,5 +1,5 @@
1
- export { C as ContextFilterInput, D as DatabaseClient, a as DatabaseClientConfig, F as FieldExtractionOptions, b as FieldExtractionResult, I as InputJsonValue, J as JsonValue, M as ModelFieldsMap, O as OperationContext, P as PoolTuningEnv, c as PrismaJsonFilter, d as buildContextWhereClause, e as buildContextWhereConditions, f as checkDatabaseHealth, g as contextMatches, h as createContextFromSDK, j as createDatabaseClient, k as createDatabaseClientFromEnv, l as extractFieldsFromModel, m as getAllModelNames, n as getDatabaseManager, o as getDatabaseProductName, p as getDatabaseStats, q as getDatabaseVersion, r as getDb, s as getModelFields, t as hasModel, u as initializeDatabase, v as initializeDatabaseWithConfig, w as isDatabaseInitialized, x as loadGeneratedFields, y as mergeContext, z as parseContext, A as resetDatabaseManager, B as resolvePoolTuningFromEnv, E as testConnection, G as toContextJson } from '../index-qg-t-NT2.js';
2
- export { C as ConnectionState, d as DatabaseHealth, D as DatabaseReturnType, P as PrismaClientBase, c as PrismaClientConfig, a as PrismaClientConstructorOptions, b as PrismaClientWrapper, e as PrismaEvent, f as PrismaLogDefinition, g as PrismaLogEvent, h as PrismaLogLevel, i as PrismaQueryEvent, j as PrismaTransactionOptions, k as configurePrismaLogging, l as createConnectionPool, m as createPrismaAdapter, n as createPrismaClient, o as ensureServiceApplicationName } from '../client-u23M69Qt.js';
1
+ export { C as ContextFilterInput, D as DatabaseClient, a as DatabaseClientConfig, F as FieldExtractionOptions, b as FieldExtractionResult, I as InputJsonValue, J as JsonValue, M as ModelFieldsMap, O as OperationContext, P as PoolTuningEnv, c as PrismaJsonFilter, d as buildContextWhereClause, e as buildContextWhereConditions, f as checkDatabaseHealth, g as contextMatches, h as createContextFromSDK, j as createDatabaseClient, k as createDatabaseClientFromEnv, l as extractFieldsFromModel, m as getAllModelNames, n as getDatabaseManager, o as getDatabaseProductName, p as getDatabaseStats, q as getDatabaseVersion, r as getDb, s as getModelFields, t as hasModel, u as initializeDatabase, v as initializeDatabaseWithConfig, w as isDatabaseInitialized, x as loadGeneratedFields, y as mergeContext, z as parseContext, A as resetDatabaseManager, B as resolvePoolTuningFromEnv, E as testConnection, G as toContextJson } from '../index-BfvCLSmh.js';
2
+ export { C as ConnectionState, d as DatabaseHealth, D as DatabaseReturnType, P as PrismaClientBase, c as PrismaClientConfig, a as PrismaClientConstructorOptions, b as PrismaClientWrapper, e as PrismaEvent, f as PrismaLogDefinition, g as PrismaLogEvent, h as PrismaLogLevel, i as PrismaQueryEvent, j as PrismaTransactionOptions, k as configurePrismaLogging, l as createConnectionPool, m as createPrismaAdapter, n as createPrismaClient, o as ensureServiceApplicationName, p as installAcquireRetry, q as isTransientAcquireError } from '../client-Dhi02YAf.js';
3
3
  export { a as WorkspaceContext, W as WorkspaceExtensionConfig, b as addWorkspaceExtension, g as getWorkspaceContext, i as injectWhereWorkspaceId, m as maybeSetRlsGuc, c as maybeTagConnection, s as setWorkspaceContext, w as withWorkspaceContext, d as withWorkspaceContextSync } from '../workspace-extension-TquhDEKU.js';
4
4
  import '../prisma-extension-krXnYnrN.js';
5
5
  import '@prisma/adapter-pg';
@@ -1,9 +1,10 @@
1
- export { buildContextWhereClause, buildContextWhereConditions, checkDatabaseHealth, contextMatches, createContextFromSDK, createDatabaseClient, createDatabaseClientFromEnv, extractFieldsFromModel, getAllModelNames, getDatabaseManager, getDatabaseProductName, getDatabaseStats, getDatabaseVersion, getDb, getModelFields, hasModel, initializeDatabase, initializeDatabaseWithConfig, isDatabaseInitialized, loadGeneratedFields, mergeContext, parseContext, resetDatabaseManager, resolvePoolTuningFromEnv, testConnection, toContextJson } from '../chunk-IMMJMVP7.js';
1
+ export { buildContextWhereClause, buildContextWhereConditions, checkDatabaseHealth, contextMatches, createContextFromSDK, createDatabaseClient, createDatabaseClientFromEnv, extractFieldsFromModel, getAllModelNames, getDatabaseManager, getDatabaseProductName, getDatabaseStats, getDatabaseVersion, getDb, getModelFields, hasModel, initializeDatabase, initializeDatabaseWithConfig, isDatabaseInitialized, loadGeneratedFields, mergeContext, parseContext, resetDatabaseManager, resolvePoolTuningFromEnv, testConnection, toContextJson } from '../chunk-EQHHYSOE.js';
2
2
  export { addWorkspaceExtension, getWorkspaceContext, injectWhereWorkspaceId, maybeSetRlsGuc, maybeTagConnection, setWorkspaceContext, withWorkspaceContext, withWorkspaceContextSync } from '../chunk-MXLCLLCI.js';
3
- export { PrismaClientWrapper, configurePrismaLogging, createConnectionPool, createPrismaAdapter, createPrismaClient, ensureServiceApplicationName } from '../chunk-5A5GGMWK.js';
4
- import '../chunk-OQ62HA7Z.js';
5
- import '../chunk-5ORHPLOA.js';
3
+ export { PrismaClientWrapper, configurePrismaLogging, createConnectionPool, createPrismaAdapter, createPrismaClient, ensureServiceApplicationName, installAcquireRetry, isTransientAcquireError } from '../chunk-NJ5GTICM.js';
4
+ import '../chunk-URDYOM2L.js';
5
+ import '../chunk-JNJSSBKO.js';
6
6
  import '../chunk-S7LWYERE.js';
7
+ import '../chunk-VBXPFYZ5.js';
7
8
  import '../chunk-CBZNP6RF.js';
8
9
  import '../chunk-XE4OXN2W.js';
9
10
  //# sourceMappingURL=index.js.map
@@ -1,11 +1,11 @@
1
- import { W as WorkspaceSecret, I as IActor, J as JWTPayload, S as ServerDefinition, a as ServerInstance, b as ITenant, G as GraphQLContext, Y as YogaPlugin } from '../types-De9M0Yin.js';
2
- export { C as ConsentContext, E as ElysiaApp, c as IContextFilterInput, d as IOperationContext, e as IOrganization, f as IProduct, g as IProject, h as ITracking, i as IWorkspace, M as ModuleGraphConfig, P as PrismaClientConstructor, R as RESTEndpoint, j as ServerConfig, k as ServerI18nConfig, l as ServerInfo, m as WspaceGraphQLContext } from '../types-De9M0Yin.js';
1
+ import { W as WorkspaceSecret, I as IActor, J as JWTPayload, S as ServerDefinition, a as ServerInstance, b as ITenant, G as GraphQLContext, Y as YogaPlugin } from '../types-DYE90pls.js';
2
+ export { C as ConsentContext, E as ElysiaApp, c as IContextFilterInput, d as IOperationContext, e as IOrganization, f as IProduct, g as IProject, h as ITracking, i as IWorkspace, M as ModuleGraphConfig, P as PrismaClientConstructor, R as RESTEndpoint, j as ServerConfig, k as ServerI18nConfig, l as ServerInfo, m as WspaceGraphQLContext } from '../types-DYE90pls.js';
3
3
  import * as jose from 'jose';
4
4
  import { VerifyOptions } from 'jsonwebtoken';
5
5
  import { I as I18n } from '../i18n-DrdPTann.js';
6
6
  import { GraphQLError } from 'graphql';
7
7
  export { I as I18nContext, L as LocaleCode } from '../types-C8TbSdEj.js';
8
- export { P as PrismaClientBase } from '../client-u23M69Qt.js';
8
+ export { P as PrismaClientBase } from '../client-Dhi02YAf.js';
9
9
  import 'graphql-yoga';
10
10
  import '../workspace-extension-TquhDEKU.js';
11
11
  import '@prisma/adapter-pg';
@@ -0,0 +1,10 @@
1
+ interface ShutdownDisposable {
2
+ readonly shutdownName: string;
3
+ dispose(): Promise<void> | void;
4
+ }
5
+ declare function registerDisposable(d: ShutdownDisposable): void;
6
+ declare function unregisterDisposable(d: ShutdownDisposable): void;
7
+ declare function getRegisteredDisposableCount(): number;
8
+ declare function disposeAll(timeoutMs?: number): Promise<void>;
9
+
10
+ export { type ShutdownDisposable as S, disposeAll as d, getRegisteredDisposableCount as g, registerDisposable as r, unregisterDisposable as u };
@@ -1,6 +1,6 @@
1
1
  import { GraphQLSchema } from 'graphql';
2
2
  import { PubSub } from 'graphql-yoga';
3
- import { P as PrismaClientBase, a as PrismaClientConstructorOptions } from './client-u23M69Qt.js';
3
+ import { P as PrismaClientBase, a as PrismaClientConstructorOptions } from './client-Dhi02YAf.js';
4
4
  import { W as WorkspaceExtensionConfig } from './workspace-extension-TquhDEKU.js';
5
5
  import { I as I18nContext, L as LocaleCode } from './types-C8TbSdEj.js';
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/be-sdk",
3
- "version": "2026.716.2",
3
+ "version": "2026.717.1",
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",
@@ -71,8 +71,8 @@
71
71
  "deps:status": "bun scripts/deps-mode.ts status",
72
72
  "deps:workspace": "bun scripts/deps-mode.ts workspace",
73
73
  "dev": "tsx watch ./src/index.ts",
74
- "build": "NODE_OPTIONS=--max-old-space-size=4096 tsup src/index.ts src/init/index.ts src/logger/index.ts src/cache/index.ts src/database/index.ts src/event-queue/index.ts src/graph/index.ts src/middleware/index.ts src/observability/index.ts src/graphql/index.ts src/graphql/services/index.ts src/prisma/index.ts src/utils/index.ts src/notifications/index.ts src/tracker/index.ts src/export/index.ts src/dataloader/index.ts src/prisma/generator/index.ts src/server/index.ts src/i18n/index.ts src/instrumentation/index.ts src/rbac/index.ts src/temporal/index.ts src/client/internal-client.ts src/layer/index.ts src/gateway/index.ts src/gateway/security/index.ts src/crypto/index.ts src/feature-flags/index.ts src/telemetry/index.ts src/auth/index.ts src/captcha/index.ts src/metrics/index.ts src/platform/index.ts src/resource-caps/index.ts src/sharding/index.ts src/sharing/index.ts --format esm --dts --clean --shims",
75
- "build:watch": "tsup src/index.ts src/init/index.ts src/logger/index.ts src/cache/index.ts src/database/index.ts src/event-queue/index.ts src/graph/index.ts src/middleware/index.ts src/observability/index.ts src/graphql/index.ts src/graphql/services/index.ts src/prisma/index.ts src/utils/index.ts src/notifications/index.ts src/tracker/index.ts src/export/index.ts src/dataloader/index.ts src/prisma/generator/index.ts src/server/index.ts src/i18n/index.ts src/instrumentation/index.ts src/rbac/index.ts src/temporal/index.ts src/client/internal-client.ts src/layer/index.ts src/gateway/index.ts src/gateway/security/index.ts src/crypto/index.ts src/feature-flags/index.ts src/telemetry/index.ts src/auth/index.ts src/captcha/index.ts src/metrics/index.ts src/platform/index.ts src/resource-caps/index.ts src/sharding/index.ts src/sharing/index.ts --format esm --dts --watch --shims",
74
+ "build": "NODE_OPTIONS=--max-old-space-size=4096 tsup src/index.ts src/init/index.ts src/logger/index.ts src/cache/index.ts src/database/index.ts src/event-queue/index.ts src/lifecycle/index.ts src/graph/index.ts src/middleware/index.ts src/observability/index.ts src/graphql/index.ts src/graphql/services/index.ts src/prisma/index.ts src/utils/index.ts src/notifications/index.ts src/tracker/index.ts src/export/index.ts src/dataloader/index.ts src/prisma/generator/index.ts src/server/index.ts src/i18n/index.ts src/instrumentation/index.ts src/rbac/index.ts src/temporal/index.ts src/client/internal-client.ts src/layer/index.ts src/gateway/index.ts src/gateway/security/index.ts src/crypto/index.ts src/feature-flags/index.ts src/telemetry/index.ts src/auth/index.ts src/captcha/index.ts src/metrics/index.ts src/platform/index.ts src/resource-caps/index.ts src/sharding/index.ts src/sharing/index.ts --format esm --dts --clean --shims",
75
+ "build:watch": "tsup src/index.ts src/init/index.ts src/logger/index.ts src/cache/index.ts src/database/index.ts src/event-queue/index.ts src/lifecycle/index.ts src/graph/index.ts src/middleware/index.ts src/observability/index.ts src/graphql/index.ts src/graphql/services/index.ts src/prisma/index.ts src/utils/index.ts src/notifications/index.ts src/tracker/index.ts src/export/index.ts src/dataloader/index.ts src/prisma/generator/index.ts src/server/index.ts src/i18n/index.ts src/instrumentation/index.ts src/rbac/index.ts src/temporal/index.ts src/client/internal-client.ts src/layer/index.ts src/gateway/index.ts src/gateway/security/index.ts src/crypto/index.ts src/feature-flags/index.ts src/telemetry/index.ts src/auth/index.ts src/captcha/index.ts src/metrics/index.ts src/platform/index.ts src/resource-caps/index.ts src/sharding/index.ts src/sharing/index.ts --format esm --dts --watch --shims",
76
76
  "typecheck": "tsc --noEmit",
77
77
  "lint": "eslint ./src",
78
78
  "lint:sanity": "if [ \"${CI:-}\" = \"true\" ]; then bun run lint; else bun run lint -- --cache --cache-location .eslintcache; fi",
@@ -1,6 +0,0 @@
1
- export { EventQueueFactory, resolveQueueType } from './chunk-5ORHPLOA.js';
2
- import './chunk-S7LWYERE.js';
3
- import './chunk-CBZNP6RF.js';
4
- import './chunk-XE4OXN2W.js';
5
- //# sourceMappingURL=EventQueueFactory-BDOT45WD.js.map
6
- //# sourceMappingURL=EventQueueFactory-BDOT45WD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graph/utils/registry.ts","../src/graph/utils/helpers.ts","../src/prisma/client.ts","../src/graph/middleware/prisma-extension.ts"],"names":["GraphRegistry","entityMappings","Map","relationshipMappings","registeredModules","Set","resolveFields","entityType","config","Array","isArray","fields","logger","warn","registerModule","moduleName","entities","relationships","has","info","entityCount","entityConfig","Object","entries","enabled","resolvedFields","resolvedConfig","set","relationshipCount","relationshipType","relationshipConfig","add","getEntityConfig","get","getRelationshipConfig","getAllEntityTypes","from","keys","getAllRelationshipTypes","getRegisteredModules","isEntityRegistered","isRelationshipRegistered","getOrganizationId","data","getOrgId","undefined","getWorkspaceId","getRbacConfig","rbac","resolveRbacMetadata","entityData","rbacConfig","name","extractName","identifier","extractIdentifier","parentResourceIdentifier","parentResourceField","resourceTypeName","createResource","getStats","collections","edgeTypes","values","collection","label","modules","size","clear","getRelationshipsForEntity","result","key","push","printStatus","stats","join","uuidv4","crypto","randomUUID","createEntityEvent","eventType","organizationId","entity","metadata","productSource","eventId","process","env","timestamp","Date","toISOString","userId","correlationId","createRelationshipEvent","relationship","id","to","type","extractMinimalFields","modelName","minimal","field","parseRelationship","String","fromField","extractMetadata","getCollectionForEntity","extractEntityTitle","extractTitle","shouldSyncEntity","shouldSyncRelationship","createConnectionPool","idleTimeoutMillis","poolConfig","connectionString","databaseUrl","max","maxConnections","connectionTimeoutMillis","keepAlive","keepAliveInitialDelayMillis","applicationName","application_name","statementTimeoutMillis","statement_timeout","idleInTransactionTimeoutMillis","idle_in_transaction_session_timeout","lockTimeoutMillis","lock_timeout","pool","Pool","startPoolWarmer","keepWarm","intervalMs","warmupIntervalMillis","timer","setInterval","query","catch","unref","originalEnd","end","bind","args","clearInterval","ensureServiceApplicationName","productName","createPrismaAdapter","PrismaPg","configurePrismaLogging","client","isDevelopment","slowQueryThreshold","enableQueryLogging","$on","e","duration","substring","length","params","debug","error","message","target","PrismaClientWrapper","connectionState","isConnected","attempts","isDisconnecting","getClient","getPool","getConnectionState","connect","retries","delay","attempt","$connect","lastConnectedAt","lastError","errorMessage","Error","waitTime","Math","pow","Promise","resolve","setTimeout","disconnect","$disconnect","includes","registerShutdownHandlers","shutdownHandler","signal","exit","on","createPrismaClient","PrismaClientConstructor","adapter","logLevels","emit","level","log","defaultConfig","monitoredOperations","extractEntityInfo","model","record","extractContext","actorId","workspaceId","emitEntityEvent","entityInfo","entityTypes","context","minimalData","orgId","rbacMetadata","hasName","eventEmitter","publishEntityEvent","emitRelationshipEvents","fromId","relationshipKey","foreignKeyValue","targetType","polymorphicTypeField","description","relationType","addGraphExtension","baseClient","fullConfig","prismaClient","$extends","$allModels","create","update","delete","updateMany","deleteMany"],"mappings":"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","file":"chunk-5A5GGMWK.js","sourcesContent":["/**\n * Graph Registry - Decentralized Graph Configuration System\n *\n * This registry allows each module to define its own graph configuration\n * without touching the central graph module. Modules register their entity\n * and relationship mappings, which are then used by the graph sync service.\n *\n * @module graph-registry\n * @category Graph\n */\nimport { logger } from '../../logger/index.js';\nimport type {\n EntityGraphConfig,\n ModuleGraphConfig,\n RelationshipGraphConfig,\n RegistryEntityRbacConfig,\n} from '../types.js';\n\n/**\n * Internal representation of entity config with resolved fields\n */\ninterface ResolvedEntityGraphConfig extends Omit<EntityGraphConfig, 'fields'> {\n fields: string[];\n getOrgId?: (data: Record<string, unknown>) => string | undefined;\n getWorkspaceId?: (data: Record<string, unknown>) => string | undefined;\n rbac?: RegistryEntityRbacConfig;\n}\n\n/**\n * Central registry for all graph configurations\n */\nexport class GraphRegistry {\n private static entityMappings: Map<string, ResolvedEntityGraphConfig> = new Map();\n private static relationshipMappings: Map<string, RelationshipGraphConfig> = new Map();\n private static registeredModules: Set<string> = new Set();\n\n /**\n * Resolve fields from entity configuration\n *\n * @param entityType - Name of the entity type\n * @param config - Entity configuration\n * @returns Resolved array of field names\n */\n private static resolveFields(entityType: string, config: EntityGraphConfig): string[] {\n if (Array.isArray(config.fields)) {\n return config.fields;\n }\n\n // Fallback: empty array if fields not configured\n logger.warn(`[GraphRegistry] No fields configuration for ${entityType}, using empty array`);\n return [];\n }\n\n /**\n * Register a module's graph configuration\n * @param config - Module graph configuration\n */\n static registerModule(config: ModuleGraphConfig): void {\n const { moduleName, entities, relationships } = config;\n\n if (this.registeredModules.has(moduleName)) {\n logger.warn(`[GraphRegistry] Module '${moduleName}' already registered, skipping`);\n return;\n }\n\n logger.info(`[GraphRegistry] Registering module: ${moduleName}`);\n\n // Register entities\n let entityCount = 0;\n for (const [entityType, entityConfig] of Object.entries(entities)) {\n if (entityConfig.enabled !== false) {\n // Resolve fields\n const resolvedFields = this.resolveFields(entityType, entityConfig);\n\n // Store resolved configuration\n const resolvedConfig: ResolvedEntityGraphConfig = {\n ...entityConfig,\n fields: resolvedFields,\n };\n\n this.entityMappings.set(entityType, resolvedConfig);\n entityCount++;\n }\n }\n\n // Register relationships\n let relationshipCount = 0;\n if (relationships) {\n for (const [relationshipType, relationshipConfig] of Object.entries(relationships)) {\n if (relationshipConfig.enabled !== false) {\n this.relationshipMappings.set(relationshipType, relationshipConfig);\n relationshipCount++;\n }\n }\n }\n\n this.registeredModules.add(moduleName);\n logger.info(\n `[GraphRegistry] ✅ Registered ${moduleName}: ${entityCount} entities, ${relationshipCount} relationships`\n );\n }\n\n /**\n * Get entity configuration by entity type\n * @param entityType - Entity type name (e.g., 'Calendar', 'Group')\n * @returns Entity configuration or undefined (with resolved fields)\n */\n static getEntityConfig(entityType: string): ResolvedEntityGraphConfig | undefined {\n return this.entityMappings.get(entityType);\n }\n\n /**\n * Get relationship configuration by relationship type\n * @param relationshipType - Relationship type name (e.g., 'EventAttendee', 'GroupMembership')\n * @returns Relationship configuration or undefined\n */\n static getRelationshipConfig(relationshipType: string): RelationshipGraphConfig | undefined {\n return this.relationshipMappings.get(relationshipType);\n }\n\n /**\n * Get all registered entity types\n * @returns Array of entity type names\n */\n static getAllEntityTypes(): string[] {\n return Array.from(this.entityMappings.keys());\n }\n\n /**\n * Get all registered relationship types\n * @returns Array of relationship type names\n */\n static getAllRelationshipTypes(): string[] {\n return Array.from(this.relationshipMappings.keys());\n }\n\n /**\n * Get all registered module names\n * @returns Array of module names\n */\n static getRegisteredModules(): string[] {\n return Array.from(this.registeredModules);\n }\n\n /**\n * Check if an entity type is registered\n * @param entityType - Entity type to check\n * @returns True if registered\n */\n static isEntityRegistered(entityType: string): boolean {\n return this.entityMappings.has(entityType);\n }\n\n /**\n * Check if a relationship type is registered\n * @param relationshipType - Relationship type to check\n * @returns True if registered\n */\n static isRelationshipRegistered(relationshipType: string): boolean {\n return this.relationshipMappings.has(relationshipType);\n }\n\n /**\n * Extract organization ID from entity data using configured mapping function\n * @param entityType - Entity type name\n * @param data - Entity data record\n * @returns Organization ID or undefined\n */\n static getOrganizationId(entityType: string, data: Record<string, unknown>): string | undefined {\n const config = this.entityMappings.get(entityType);\n if (!config || !config.getOrgId) {\n return undefined;\n }\n return config.getOrgId(data);\n }\n\n /**\n * Extract workspace ID from entity data using configured mapping function\n * @param entityType - Entity type name\n * @param data - Entity data record\n * @returns Workspace ID or undefined\n */\n static getWorkspaceId(entityType: string, data: Record<string, unknown>): string | undefined {\n const config = this.entityMappings.get(entityType);\n if (!config || !config.getWorkspaceId) {\n return undefined;\n }\n return config.getWorkspaceId(data);\n }\n\n /**\n * Get RBAC configuration for an entity type\n * Used by the Prisma graph extension to include RBAC metadata in entity events\n * @param entityType - Entity type name (e.g., 'Conversation', 'Agent')\n * @returns RBAC config or undefined if no RBAC is configured for this entity\n */\n static getRbacConfig(entityType: string): RegistryEntityRbacConfig | undefined {\n const config = this.entityMappings.get(entityType);\n return config?.rbac;\n }\n\n /**\n * Resolve RBAC event metadata from entity data\n * Converts the registry's function-based RBAC config into the flat metadata\n * structure expected by the RBAC consumer in the NATS event payload.\n * @param entityType - Entity type name\n * @param entityData - The entity data record\n * @returns RBAC metadata for the event or undefined\n */\n static resolveRbacMetadata(\n entityType: string,\n entityData: Record<string, unknown>\n ):\n | {\n resourceTypeName: string;\n name?: string;\n identifier?: string;\n parentResourceIdentifier?: string;\n createResource?: boolean;\n }\n | undefined {\n const rbacConfig = this.getRbacConfig(entityType);\n if (!rbacConfig) {\n return undefined;\n }\n\n const name = rbacConfig.extractName ? rbacConfig.extractName(entityData) : undefined;\n const identifier = rbacConfig.extractIdentifier ? rbacConfig.extractIdentifier(entityData) : undefined;\n const parentResourceIdentifier = rbacConfig.parentResourceField\n ? (entityData[rbacConfig.parentResourceField] as string | undefined)\n : undefined;\n\n return {\n resourceTypeName: rbacConfig.resourceTypeName,\n ...(name && { name }),\n ...(identifier && { identifier }),\n ...(parentResourceIdentifier && { parentResourceIdentifier }),\n ...(rbacConfig.createResource !== undefined && { createResource: rbacConfig.createResource }),\n };\n }\n\n /**\n * Get statistics about registered configurations\n * @returns Statistics object\n */\n static getStats(): {\n modules: number;\n entities: number;\n relationships: number;\n collections: Set<string>;\n edgeTypes: Set<string>;\n } {\n const collections = new Set<string>();\n const edgeTypes = new Set<string>();\n\n for (const config of this.entityMappings.values()) {\n collections.add(config.collection || 'product_entities');\n }\n\n for (const config of this.relationshipMappings.values()) {\n if (config.label) {\n edgeTypes.add(config.label);\n }\n }\n\n return {\n modules: this.registeredModules.size,\n entities: this.entityMappings.size,\n relationships: this.relationshipMappings.size,\n collections,\n edgeTypes,\n };\n }\n\n /**\n * Clear all registrations (for testing)\n */\n static clear(): void {\n this.entityMappings.clear();\n this.relationshipMappings.clear();\n this.registeredModules.clear();\n logger.info('[GraphRegistry] Cleared all registrations');\n }\n\n /**\n * Get all relationships where the given entity type is the \"from\" side\n * This is used for automatic relationship event emission when entities are created/updated\n * @param entityType - Entity type name (e.g., 'UniversalTag')\n * @returns Array of [relationshipKey, config] tuples\n */\n static getRelationshipsForEntity(entityType: string): Array<[string, RelationshipGraphConfig]> {\n const result: Array<[string, RelationshipGraphConfig]> = [];\n\n for (const [key, config] of this.relationshipMappings.entries()) {\n if (config.from === entityType) {\n result.push([key, config]);\n }\n }\n\n return result;\n }\n\n /**\n * Print registry status to console\n */\n static printStatus(): void {\n const stats = this.getStats();\n logger.info('');\n logger.info('📊 Graph Registry Status');\n logger.info('========================');\n logger.info(`Registered Modules: ${stats.modules}`);\n logger.info(`Total Entities: ${stats.entities}`);\n logger.info(`Total Relationships: ${stats.relationships}`);\n logger.info(`Vertex Collections: ${stats.collections.size}`);\n logger.info(`Edge Types: ${stats.edgeTypes.size}`);\n logger.info('');\n logger.info('Registered Modules:', this.getRegisteredModules().join(', '));\n logger.info('');\n }\n}\n","/**\n * Event Helpers - Registry-Based Graph Event Utilities\n *\n * This version uses the GraphRegistry to dynamically load entity and relationship\n * configurations from module-level graph.config.ts files.\n *\n * @module graph-helpers\n * @category Graph\n */\nimport { logger } from '../../logger/index.js';\nimport type { GraphEvent, GraphEventType } from '../types.js';\nimport { GraphRegistry } from './registry.js';\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Create an entity event for the graph\n */\nexport function createEntityEvent(\n eventType: GraphEventType,\n organizationId: string,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n metadata?: {\n userId?: string;\n correlationId?: string;\n workspaceId?: string;\n projectId?: string;\n },\n productSource?: string\n): GraphEvent {\n return {\n eventId: `evt_${uuidv4()}`,\n eventType,\n organizationId,\n productSource: productSource || process.env['PRODUCT_SOURCE'] || 'default',\n timestamp: new Date().toISOString(),\n entity,\n metadata: {\n userId: metadata?.userId,\n correlationId: metadata?.correlationId || `req_${uuidv4()}`,\n },\n };\n}\n\n/**\n * Create a relationship event for the graph\n */\nexport function createRelationshipEvent(\n eventType: GraphEventType,\n organizationId: string,\n relationship: {\n from: { id: string; type: string };\n to: { id: string; type: string };\n type: string;\n metadata: Record<string, unknown>;\n },\n metadata?: {\n userId?: string;\n correlationId?: string;\n },\n productSource?: string\n): GraphEvent {\n return {\n eventId: `evt_${uuidv4()}`,\n eventType,\n organizationId,\n productSource: productSource || process.env['PRODUCT_SOURCE'] || 'default',\n timestamp: new Date().toISOString(),\n entity: {\n id: `${relationship.from.id}_${relationship.to.id}`,\n type: relationship.type,\n data: {},\n },\n relationship,\n metadata: {\n userId: metadata?.userId,\n correlationId: metadata?.correlationId || `req_${uuidv4()}`,\n },\n };\n}\n\n/**\n * Extract minimal fields for syncing to graph (uses registry)\n *\n * @param modelName - Prisma model name (e.g., 'Calendar', 'Group')\n * @param entity - Full entity data from Prisma\n * @returns Minimal entity data for graph sync\n */\nexport function extractMinimalFields(modelName: string, entity: Record<string, unknown>): Record<string, unknown> {\n // Get entity config from registry\n const config = GraphRegistry.getEntityConfig(modelName);\n\n if (!config) {\n // Fallback: if entity not registered, just use id and workspaceID\n logger.warn(`[GraphHelpers] No graph config found for entity type: ${modelName}, using fallback`);\n const minimal: Record<string, unknown> = {};\n\n if (entity['id']) minimal['id'] = entity['id'];\n if (entity['workspaceID']) minimal['workspaceID'] = entity['workspaceID'];\n if (entity['workspaceId']) minimal['workspaceId'] = entity['workspaceId'];\n\n return minimal;\n }\n\n // Extract configured fields\n const minimal: Record<string, unknown> = {};\n\n for (const field of config.fields) {\n if (entity[field] !== undefined) {\n minimal[field] = entity[field];\n }\n }\n\n return minimal;\n}\n\n/**\n * Parse relationship from join table models (uses registry)\n *\n * @param modelName - Relationship model name (e.g., 'EventAttendee', 'GroupMembership')\n * @param relationship - Full relationship data from Prisma\n * @returns Parsed relationship with from/to/type/metadata\n */\nexport function parseRelationship(\n modelName: string,\n relationship: Record<string, unknown>\n): {\n from: { id: string; type: string };\n to: { id: string; type: string };\n relationshipType: string;\n metadata: Record<string, unknown>;\n} {\n // Get relationship config from registry\n const config = GraphRegistry.getRelationshipConfig(modelName);\n\n if (!config) {\n logger.warn(`[GraphHelpers] No graph config found for relationship type: ${modelName}, using fallback`);\n return {\n from: { id: 'unknown', type: 'Unknown' },\n to: { id: 'unknown', type: 'Unknown' },\n relationshipType: 'relates_to',\n metadata: {},\n };\n }\n\n // Extract relationship data using config\n return {\n from: {\n id: String(relationship[config.fromField] || 'unknown'),\n type: config.from,\n },\n to: {\n id: String(relationship[config.to] || 'unknown'),\n type: config.to,\n },\n relationshipType: config.label || 'relates_to',\n metadata: config.extractMetadata?.(relationship) ?? {},\n };\n}\n\n/**\n * Get the graph vertex label for an entity type (uses registry)\n *\n * @param entityType - Entity type name\n * @returns Collection name\n */\nexport function getCollectionForEntity(entityType: string): string {\n const config = GraphRegistry.getEntityConfig(entityType);\n\n if (!config) {\n // Default to product_entities if not registered\n return 'entity';\n }\n\n return config.collection || 'entity';\n}\n\n/**\n * Extract title from entity (uses registry or fallback)\n *\n * @param entityType - Entity type name\n * @param entity - Entity data\n * @returns Title string\n */\nexport function extractEntityTitle(entityType: string, entity: Record<string, unknown>): string {\n const config = GraphRegistry.getEntityConfig(entityType);\n\n // Use custom title extractor if provided\n if (config?.extractTitle) {\n return config.extractTitle(entity);\n }\n\n // Fallback: try common title fields\n return String(entity['name'] || entity['title'] || entity['email'] || entity['id'] || 'Untitled');\n}\n\n/**\n * Check if an entity type should be synced to the graph\n *\n * @param entityType - Entity type name\n * @returns True if entity should be synced\n */\nexport function shouldSyncEntity(entityType: string): boolean {\n const config = GraphRegistry.getEntityConfig(entityType);\n\n if (!config) {\n // If not registered, don't sync\n return false;\n }\n\n // Check if explicitly disabled\n return config.enabled !== false;\n}\n\n/**\n * Check if a relationship type should be synced to the graph\n *\n * @param relationshipType - Relationship type name\n * @returns True if relationship should be synced\n */\nexport function shouldSyncRelationship(relationshipType: string): boolean {\n const config = GraphRegistry.getRelationshipConfig(relationshipType);\n\n if (!config) {\n // If not registered, don't sync\n return false;\n }\n\n // Check if explicitly disabled\n return config.enabled !== false;\n}\n","/**\n * Prisma 7 Client Factory with PostgreSQL Adapter\n *\n * This module provides a generic factory for creating Prisma clients\n * configured with the PostgreSQL driver adapter as required by Prisma 7.\n *\n * Breaking Changes in Prisma 7:\n * - Must use database driver adapter (@prisma/adapter-pg for PostgreSQL)\n * - Datasource URL moved from schema.prisma to prisma.config.ts\n * - DMMF no longer available at runtime (use generator for build-time access)\n *\n * @module prisma/client\n */\n\nimport { PrismaPg } from '@prisma/adapter-pg';\nimport { Pool, type PoolConfig } from 'pg';\nimport { logger } from '../logger/index.js';\nimport type { PrismaClientConfig, ConnectionState } from './types.js';\n\n/**\n * Prisma event object types\n */\nexport interface PrismaQueryEvent {\n query: string;\n params: string;\n duration: number;\n target?: string;\n}\n\nexport interface PrismaLogEvent {\n message: string;\n target?: string;\n}\n\nexport type PrismaEvent = PrismaQueryEvent | PrismaLogEvent;\n\n/**\n * Transaction options for Prisma $transaction method\n */\nexport interface PrismaTransactionOptions {\n maxWait?: number;\n timeout?: number;\n isolationLevel?: string;\n}\n\n/**\n * Base Prisma client interface with required methods\n *\n * This interface defines the MINIMUM contract required for server bootstrapping.\n * It only includes methods actually used by the SDK's server module.\n *\n * Note: Service-specific model properties (e.g., universalTag, user, workspace, etc.)\n * and full method signatures should be accessed by casting to the service's\n * generated Prisma client type.\n *\n * @example\n * ```typescript\n * // In your service's context type:\n * import type { PrismaClient } from './generated/prisma/client.js';\n * import type { GraphQLContext } from '@burdenoff/be-sdk';\n *\n * export interface Context extends GraphQLContext {\n * db: PrismaClient;\n * }\n * ```\n */\nexport interface PrismaClientBase {\n /** Connect to the database */\n $connect(): Promise<void>;\n /** Disconnect from the database */\n $disconnect(): Promise<void>;\n /** Register event handlers for logging */\n $on(event: string, callback: (e: PrismaEvent) => void): void;\n /** Execute a raw SQL query */\n $queryRaw<T = unknown>(query: TemplateStringsArray, ...values: unknown[]): Promise<T>;\n}\n\n/**\n * Database client return type for getDb()\n *\n * Returns the service's PrismaClient type (T) with a `client` property\n * for backwards compatibility. All model access and typing comes from\n * the service's own generated Prisma types.\n *\n * @example\n * ```typescript\n * // In your service - import YOUR generated PrismaClient\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n *\n * // Pass your PrismaClient type for full type safety\n * const db = getDb<PrismaClient>();\n * const tags = await db.client.universalTag.findMany(); // Fully typed!\n * ```\n */\nexport type DatabaseReturnType<T extends PrismaClientBase = PrismaClientBase> = T & {\n /**\n * Client property for explicit model access.\n * This is the same as the db object itself, provided for API consistency.\n */\n client: T;\n};\n\n/**\n * Create a PostgreSQL connection pool.\n *\n * The base pool sizing (max / idle / connection timeout) is unchanged. The\n * optional tuning fields (`applicationName`, `statementTimeoutMillis`,\n * `idleInTransactionTimeoutMillis`, `lockTimeoutMillis`) are only attached to\n * the pool config when explicitly provided — when they are all unset, the\n * resulting pool is byte-for-byte identical to the previous behavior. This keeps\n * the change safe to roll out fleet-wide: `application_name` is pure diagnostic\n * metadata, and every DB-enforced timeout defaults to OFF (pg default).\n */\nexport function createConnectionPool(config: PrismaClientConfig): Pool {\n const idleTimeoutMillis = config.idleTimeoutMillis ?? 30000;\n const poolConfig: PoolConfig = {\n connectionString: config.databaseUrl,\n max: config.maxConnections ?? 20,\n idleTimeoutMillis,\n connectionTimeoutMillis: config.connectionTimeoutMillis ?? 10000,\n // Keep pooled TCP sockets alive so Azure's load balancer / Postgres does not\n // silently drop an idle connection out from under the pool. Without this the\n // first query after a quiet window re-establishes a socket — the slow cold\n // TLS handshake that intermittently exceeds connectionTimeoutMillis and 500s\n // the request (context-switcher bootstrap after ~30s idle). Pure transport\n // hygiene; no effect on query behavior.\n keepAlive: true,\n keepAliveInitialDelayMillis: 10000,\n };\n\n // Diagnostic metadata only — no effect on query behavior.\n if (config.applicationName) {\n poolConfig.application_name = config.applicationName;\n }\n\n // DB-enforced safety timeouts — only applied when explicitly opted in, so the\n // default (unset) preserves the current no-server-timeout behavior exactly.\n if (config.statementTimeoutMillis != null && config.statementTimeoutMillis > 0) {\n poolConfig.statement_timeout = config.statementTimeoutMillis;\n }\n if (config.idleInTransactionTimeoutMillis != null && config.idleInTransactionTimeoutMillis > 0) {\n poolConfig.idle_in_transaction_session_timeout = config.idleInTransactionTimeoutMillis;\n }\n if (config.lockTimeoutMillis != null && config.lockTimeoutMillis > 0) {\n poolConfig.lock_timeout = config.lockTimeoutMillis;\n }\n\n const pool = new Pool(poolConfig);\n startPoolWarmer(pool, config, idleTimeoutMillis);\n return pool;\n}\n\n/**\n * Keep at least one pooled connection live during quiet periods.\n *\n * `pg.Pool` closes every idle client after `idleTimeoutMillis`, so a service\n * that goes quiet for that long drains to zero connections and the next request\n * pays a full cold connect. On Azure ACA that cold TLS handshake occasionally\n * stalls past `connectionTimeoutMillis`, 500ing the request. A lightweight\n * `SELECT 1` on an interval shorter than the idle timeout keeps one connection\n * checked-out-and-released just often enough that its idle timer never expires,\n * so post-idle requests reuse a warm socket. The timer is `unref`'d (never keeps\n * the process alive) and cleared when the pool ends.\n */\nfunction startPoolWarmer(pool: Pool, config: PrismaClientConfig, idleTimeoutMillis: number): void {\n if (config.keepWarm === false) return;\n const intervalMs = config.warmupIntervalMillis ?? 20000;\n // A warmer at/above the idle timeout can't keep anything warm — skip it.\n if (intervalMs <= 0 || (idleTimeoutMillis > 0 && intervalMs >= idleTimeoutMillis)) return;\n\n const timer = setInterval(() => {\n // Swallow failures: this is best-effort hygiene, and a real outage will be\n // surfaced by the next actual query rather than by warmer noise.\n pool.query('SELECT 1').catch(() => undefined);\n }, intervalMs);\n if (typeof timer.unref === 'function') timer.unref();\n\n // Stop warming once the pool is torn down (graceful shutdown / disconnect).\n const originalEnd = pool.end.bind(pool);\n pool.end = ((...args: Parameters<typeof originalEnd>) => {\n clearInterval(timer);\n return originalEnd(...args);\n }) as typeof pool.end;\n}\n\n/**\n * Ensure a per-service Postgres `application_name` is set process-wide.\n *\n * node-postgres reads the libpq `PGAPPNAME` environment variable as the\n * `application_name` fallback for every Client/Pool it creates. Setting it here\n * guarantees per-service attribution in pg_stat_activity / pg_stat_statements for\n * ALL pools a service opens — including pools a service constructs itself (e.g.\n * via `createPrismaGraphIntegration`'s `createPrismaClient` closure) that bypass\n * `createConnectionPool`.\n *\n * Behavior-preserving: this is pure diagnostic metadata, it is only applied when\n * `PGAPPNAME` is not already set (so an explicit operator/env value wins), and an\n * explicit `application_name` in a pool config still takes precedence over the\n * env fallback.\n */\nexport function ensureServiceApplicationName(productName: string | undefined): void {\n if (productName && !process.env['PGAPPNAME']) {\n process.env['PGAPPNAME'] = `svc=${productName}`;\n }\n}\n\n/**\n * Create a Prisma PostgreSQL adapter\n */\nexport function createPrismaAdapter(pool: Pool): PrismaPg {\n return new PrismaPg(pool);\n}\n\n/**\n * Configure Prisma client logging\n */\nexport function configurePrismaLogging<T extends PrismaClientBase>(client: T, config: PrismaClientConfig): T {\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n const slowQueryThreshold = config.slowQueryThreshold ?? (isDevelopment ? 100 : 500);\n\n // Query logging\n if (config.enableQueryLogging ?? isDevelopment) {\n client.$on('query', (e: PrismaEvent) => {\n if ('query' in e && 'duration' in e) {\n if (e.duration > slowQueryThreshold) {\n logger.warn('[Prisma] Slow query detected', {\n query: e.query.substring(0, 200) + (e.query.length > 200 ? '...' : ''),\n params: e.params,\n duration: `${e.duration}ms`,\n });\n } else {\n logger.debug('[Prisma] Query', {\n query: e.query.substring(0, 100) + (e.query.length > 100 ? '...' : ''),\n duration: `${e.duration}ms`,\n });\n }\n }\n });\n }\n\n // Error logging\n client.$on('error', (e: PrismaEvent) => {\n if ('message' in e) {\n logger.error('[Prisma] Database error', {\n message: e.message,\n target: e.target,\n });\n }\n });\n\n // Warning logging\n client.$on('warn', (e: PrismaEvent) => {\n if ('message' in e) {\n logger.warn('[Prisma] Database warning', {\n message: e.message,\n target: e.target,\n });\n }\n });\n\n return client;\n}\n\n/**\n * Prisma Client Wrapper with connection management\n */\nexport class PrismaClientWrapper<T extends PrismaClientBase> {\n private client: T;\n private pool: Pool;\n private connectionState: ConnectionState = {\n isConnected: false,\n attempts: 0,\n };\n private isDisconnecting = false;\n\n constructor(client: T, pool: Pool, config: PrismaClientConfig) {\n this.client = client;\n this.pool = pool;\n\n // Configure logging\n configurePrismaLogging(this.client, config);\n }\n\n /**\n * Get the Prisma client instance\n */\n public getClient(): T {\n return this.client;\n }\n\n /**\n * Get the connection pool\n */\n public getPool(): Pool {\n return this.pool;\n }\n\n /**\n * Get connection state\n */\n public getConnectionState(): ConnectionState {\n return { ...this.connectionState };\n }\n\n /**\n * Connect to database with retry logic\n */\n public async connect(retries = 5, delay = 1000): Promise<void> {\n if (this.connectionState.isConnected) {\n logger.info('[Prisma] Already connected to database');\n return;\n }\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n this.connectionState.attempts = attempt;\n\n try {\n await this.client.$connect();\n this.connectionState.isConnected = true;\n this.connectionState.lastConnectedAt = new Date();\n this.connectionState.lastError = undefined;\n\n logger.info('[Prisma] Successfully connected to database');\n return;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.connectionState.lastError = errorMessage;\n\n logger.error(`[Prisma] Connection attempt ${attempt}/${retries} failed`, {\n error: errorMessage,\n });\n\n if (attempt === retries) {\n logger.error('[Prisma] Max connection retries reached');\n throw error;\n }\n\n // Exponential backoff\n const waitTime = delay * Math.pow(2, attempt - 1);\n logger.info(`[Prisma] Retrying in ${waitTime}ms...`);\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n }\n }\n\n /**\n * Gracefully disconnect from database\n */\n public async disconnect(): Promise<void> {\n // Guard against multiple disconnect calls\n if (this.isDisconnecting) {\n logger.debug('[Prisma] Disconnect already in progress, skipping');\n return;\n }\n\n if (!this.connectionState.isConnected) {\n logger.info('[Prisma] Database already disconnected');\n return;\n }\n\n // Mark as disconnecting to prevent concurrent disconnect calls\n this.isDisconnecting = true;\n\n try {\n await this.client.$disconnect();\n await this.pool.end();\n this.connectionState.isConnected = false;\n\n logger.info('[Prisma] Successfully disconnected from database');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Ignore \"Called end on pool more than once\" errors\n if (errorMessage.includes('Called end on pool more than once')) {\n logger.debug('[Prisma] Pool already ended, ignoring duplicate end call');\n this.connectionState.isConnected = false;\n return;\n }\n\n logger.error('[Prisma] Error disconnecting from database', {\n error: errorMessage,\n });\n throw error;\n } finally {\n this.isDisconnecting = false;\n }\n }\n\n /**\n * Register graceful shutdown handlers\n */\n public registerShutdownHandlers(): void {\n const shutdownHandler = async (signal: string): Promise<void> => {\n logger.info(`[Prisma] Received ${signal}, starting graceful shutdown...`);\n\n try {\n await this.disconnect();\n process.exit(0);\n } catch (error) {\n logger.error('[Prisma] Error during graceful shutdown', {\n error: error instanceof Error ? error.message : String(error),\n });\n process.exit(1);\n }\n };\n\n // Register shutdown handlers\n process.on('SIGINT', () => void shutdownHandler('SIGINT'));\n process.on('SIGTERM', () => void shutdownHandler('SIGTERM'));\n process.on('beforeExit', () => void this.disconnect());\n }\n}\n\n/**\n * Create a configured Prisma client wrapper\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createPrismaClient } from '@burdenoff/be-sdk';\n *\n * const wrapper = createPrismaClient(PrismaClient, {\n * databaseUrl: process.env.DATABASE_URL!,\n * });\n *\n * await wrapper.connect();\n * const prisma = wrapper.getClient();\n *\n * // Use prisma client\n * const users = await prisma.user.findMany();\n * ```\n */\n/**\n * Prisma log level options\n */\nexport type PrismaLogLevel = 'info' | 'query' | 'warn' | 'error';\n\n/**\n * Prisma log definition\n */\nexport interface PrismaLogDefinition {\n level: PrismaLogLevel;\n emit: 'stdout' | 'event';\n}\n\n/**\n * Prisma client constructor options\n */\nexport interface PrismaClientConstructorOptions {\n adapter: PrismaPg;\n log?: (PrismaLogLevel | PrismaLogDefinition)[];\n}\n\nexport function createPrismaClient<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: PrismaClientConfig\n): PrismaClientWrapper<T> {\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n\n // Create connection pool\n const pool = createConnectionPool(config);\n\n // Create adapter\n const adapter = createPrismaAdapter(pool);\n\n // Determine log levels\n const logLevels: PrismaLogDefinition[] =\n (config.logLevels as PrismaLogDefinition[] | undefined) ??\n (isDevelopment\n ? [\n { emit: 'event', level: 'query' },\n { emit: 'event', level: 'info' },\n { emit: 'event', level: 'warn' },\n { emit: 'event', level: 'error' },\n ]\n : [\n { emit: 'event', level: 'warn' },\n { emit: 'event', level: 'error' },\n ]);\n\n // Create Prisma client\n const client = new PrismaClientConstructor({\n adapter,\n log: logLevels,\n });\n\n // Create and return wrapper\n return new PrismaClientWrapper(client, pool, config);\n}\n","/**\n * Prisma Middleware for Graph Event Emission\n *\n * Automatically emits events to the graph event queue when entities are\n * created, updated, or deleted in PostgreSQL.\n *\n * This is a product-agnostic Prisma extension that can be used by any Burdenoff product.\n *\n * @module prisma-graph-extension\n * @category Graph\n */\nimport { logger } from '../../logger/index.js';\nimport { extractMinimalFields } from '../utils/helpers.js';\nimport { GraphRegistry } from '../utils/registry.js';\n\n/**\n * Event types for entity operations\n */\nexport type EntityEventType =\n | 'entity.created'\n | 'entity.updated'\n | 'entity.deleted'\n | 'relationship.created'\n | 'relationship.deleted';\n\n/**\n * RBAC metadata for entity events (resolved from graph config)\n */\nexport interface EntityEventRbacMetadata {\n resourceTypeName: string;\n name?: string;\n identifier?: string;\n parentResourceIdentifier?: string;\n createResource?: boolean;\n}\n\n/**\n * Event emitter interface - products must provide their own implementation\n */\nexport interface GraphEventEmitter {\n publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n actorId?: string;\n workspaceId?: string;\n },\n rbac?: EntityEventRbacMetadata\n ): Promise<void>;\n}\n\n/**\n * Configuration for graph middleware\n */\nexport interface GraphMiddlewareConfig {\n /** Whether middleware is enabled */\n enabled: boolean;\n /** Product name for event metadata */\n productName: string;\n /** Event emitter implementation */\n eventEmitter: GraphEventEmitter;\n /** Entity types to monitor (if empty, monitors all registered types) */\n entityTypes?: string[];\n /** Operations to monitor */\n monitoredOperations?: Array<'create' | 'update' | 'delete' | 'deleteMany' | 'updateMany'>;\n}\n\n/**\n * Default configuration\n */\nconst defaultConfig: {\n enabled: boolean;\n monitoredOperations: Array<'create' | 'update' | 'delete' | 'deleteMany' | 'updateMany'>;\n} = {\n enabled: true,\n monitoredOperations: ['create', 'update', 'delete', 'deleteMany', 'updateMany'],\n};\n\n/**\n * Extract entity information from Prisma result\n */\nfunction extractEntityInfo(\n model: string,\n result: unknown\n): { id: string; type: string; data: Record<string, unknown> } | null {\n if (!result || typeof result !== 'object') {\n return null;\n }\n\n const record = result as Record<string, unknown>;\n const id = record['id'] as string;\n\n if (!id) {\n return null;\n }\n\n return {\n id,\n type: model,\n data: record,\n };\n}\n\n/**\n * Extract organization and user context from Prisma arguments\n */\nfunction extractContext(args: unknown): {\n organizationId?: string;\n actorId?: string;\n workspaceId?: string;\n} {\n if (!args || typeof args !== 'object') {\n return {};\n }\n\n const data =\n (args as { data?: Record<string, unknown>; where?: Record<string, unknown> })['data'] ||\n (args as { where?: Record<string, unknown> })['where'];\n\n if (!data || typeof data !== 'object') {\n return {};\n }\n\n return {\n organizationId: data['organizationId'] as string | undefined,\n actorId:\n (data['actorId'] as string | undefined) ||\n (data['createdBy'] as string | undefined) ||\n (data['updatedBy'] as string | undefined) ||\n (data['userId'] as string | undefined),\n workspaceId: (data['workspaceId'] as string | undefined) || (data['workspaceID'] as string | undefined),\n };\n}\n\n/**\n * Emit event for entity operation\n */\nfunction emitEntityEvent(\n eventType: EntityEventType,\n model: string,\n result: unknown,\n args: unknown,\n config: GraphMiddlewareConfig\n): void {\n const entityInfo = extractEntityInfo(model, result);\n if (!entityInfo) {\n return;\n }\n\n // Check if this entity type is registered in the graph registry\n if (!GraphRegistry.isEntityRegistered(model)) {\n return;\n }\n\n // Check if we should monitor this entity type\n if (config.entityTypes && config.entityTypes.length > 0 && !config.entityTypes.includes(model)) {\n return;\n }\n\n const context = extractContext(args);\n const minimalData = extractMinimalFields(model, entityInfo.data);\n\n // Use GraphRegistry to extract organization and workspace IDs from entity data\n // This allows entity-specific field mappings (e.g., tenantId → organizationId)\n const orgId = GraphRegistry.getOrganizationId(model, entityInfo.data) || context.organizationId || 'unknown';\n const workspaceId = GraphRegistry.getWorkspaceId(model, entityInfo.data) || context.workspaceId;\n const actorId = context.actorId || 'unknown';\n\n // Resolve RBAC metadata from GraphRegistry (if entity has rbac config)\n const rbacMetadata = GraphRegistry.resolveRbacMetadata(model, entityInfo.data);\n\n if (rbacMetadata) {\n logger.debug(`[GraphMiddleware] Including RBAC metadata for ${model}`, {\n resourceTypeName: rbacMetadata.resourceTypeName,\n hasName: !!rbacMetadata.name,\n });\n }\n\n // Emit event (non-blocking) — includes RBAC metadata when configured\n config.eventEmitter\n .publishEntityEvent(\n eventType,\n {\n id: entityInfo.id,\n type: entityInfo.type,\n data: minimalData,\n },\n {\n productName: config.productName,\n organizationId: orgId,\n actorId,\n workspaceId,\n },\n rbacMetadata\n )\n .catch((error: unknown) => {\n logger.error('[GraphMiddleware] Failed to emit event:', error);\n });\n\n // After emitting entity event, check for relationship events\n // Only for create/update operations\n if (eventType === 'entity.created' || eventType === 'entity.updated') {\n emitRelationshipEvents(model, entityInfo.data, orgId, config);\n }\n}\n\n/**\n * Emit relationship events based on foreign key values\n * This automatically creates edges in the graph when entities with foreign keys are created/updated\n */\nfunction emitRelationshipEvents(\n entityType: string,\n entityData: Record<string, unknown>,\n organizationId: string,\n config: GraphMiddlewareConfig\n): void {\n // Get all relationships where this entity type is the \"from\" side\n const relationships = GraphRegistry.getRelationshipsForEntity(entityType);\n\n if (relationships.length === 0) {\n return;\n }\n\n const fromId = entityData['id'] as string;\n if (!fromId) {\n return;\n }\n\n // For each relationship, check if the foreign key field has a value\n for (const [relationshipKey, relationshipConfig] of relationships) {\n const foreignKeyValue = entityData[relationshipConfig.fromField] as string | null | undefined;\n\n // Skip if foreign key is null/undefined (no relationship)\n if (!foreignKeyValue) {\n continue;\n }\n\n // Handle polymorphic relationships\n let targetType = relationshipConfig.to;\n if (relationshipConfig.to === '*') {\n if (relationshipConfig.polymorphicTypeField) {\n targetType = entityData[relationshipConfig.polymorphicTypeField] as string;\n if (!targetType) {\n logger.warn(`[GraphMiddleware] Polymorphic relationship ${relationshipKey} has no type field value`);\n continue;\n }\n } else {\n logger.debug(`[GraphMiddleware] Skipping polymorphic relationship without type field: ${relationshipKey}`);\n continue;\n }\n }\n\n // Extract metadata if configured\n const metadata = relationshipConfig.extractMetadata\n ? relationshipConfig.extractMetadata(entityData)\n : { description: relationshipConfig.description };\n\n // Emit relationship.created event\n config.eventEmitter\n .publishEntityEvent(\n 'relationship.created',\n {\n id: `${fromId}_${foreignKeyValue}`,\n type: relationshipConfig.label,\n data: {\n from: {\n id: fromId,\n type: entityType,\n },\n to: {\n id: foreignKeyValue,\n type: targetType,\n },\n relationType: relationshipConfig.label,\n metadata,\n },\n },\n {\n productName: config.productName,\n organizationId,\n }\n )\n .catch((error: unknown) => {\n logger.error(`[GraphMiddleware] Failed to emit relationship event for ${relationshipKey}:`, error);\n });\n\n logger.debug(\n `[GraphMiddleware] Emitted relationship.created: ${relationshipConfig.label} (${entityType}:${fromId} -> ${targetType}:${foreignKeyValue})`\n );\n }\n}\n\n/**\n * Add graph extension to Prisma client for automatic event emission\n *\n * This function uses Prisma Client Extensions (Prisma 6+) to intercept\n * database operations and emit events to the graph event queue.\n *\n * @param baseClient - Base Prisma client instance\n * @param config - Configuration for the middleware\n * @returns Extended Prisma client with graph event emission\n *\n * @example\n * ```typescript\n * import { PrismaClient } from '@prisma/client';\n * import { addGraphExtension } from '@burdenoff/be-sdk/graph';\n * import { eventQueue } from './event-queue';\n *\n * const baseClient = new PrismaClient();\n * const client = addGraphExtension(baseClient, {\n * enabled: true,\n * productName: 'workspaces',\n * eventEmitter: eventQueue,\n * entityTypes: ['Project', 'Group', 'Workspace'], // Optional: monitor specific types\n * });\n * ```\n */\nexport function addGraphExtension<T>(baseClient: T, config: GraphMiddlewareConfig): T {\n const fullConfig = { ...defaultConfig, ...config };\n\n if (!fullConfig.enabled) {\n logger.info('[GraphMiddleware] Extension disabled by configuration');\n return baseClient;\n }\n\n // Type assertion for Prisma client\n const prismaClient = baseClient as { $extends: (args: unknown) => T };\n\n return prismaClient.$extends({\n query: {\n $allModels: {\n async create({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('create')) {\n emitEntityEvent('entity.created', model, result, args, fullConfig);\n }\n\n return result;\n },\n\n async update({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('update')) {\n emitEntityEvent('entity.updated', model, result, args, fullConfig);\n }\n\n return result;\n },\n\n async delete({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('delete')) {\n emitEntityEvent('entity.deleted', model, result, args, fullConfig);\n }\n\n return result;\n },\n\n async updateMany({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('updateMany')) {\n logger.info(`[GraphMiddleware] updateMany for ${model} (bulk operation not tracked individually)`);\n }\n\n return result;\n },\n\n async deleteMany({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('deleteMany')) {\n logger.info(`[GraphMiddleware] deleteMany for ${model} (bulk operation not tracked individually)`);\n }\n\n return result;\n },\n },\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/event-queue/implementations/redis-streams/trace-context.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventConsumer.ts","../src/event-queue/implementations/redis-streams/serialize.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventPublisher.ts","../src/event-queue/types/config.ts","../src/event-queue/factory/EventQueueFactory.ts"],"names":["otelApiPromise","loadOtelApi","mod","logger","debug","TRACE_KEYS","injectTraceFields","api","carrier","propagation","inject","context","active","set","c","k","v","err","error","Error","message","String","extractTraceContext","fields","undefined","key","value","extract","get","keys","Object","runWithConsumerSpan","subject","handler","parentCtx","tracer","trace","getTracer","Promise","resolve","reject","startActiveSpan","kind","attributes","span","result","setStatus","code","end","recordException","DEFAULT_BLOCK_MS","DEFAULT_BATCH","REGISTRY_REFRESH_MS","DEFAULT_ACK_WAIT_MS","DEFAULT_MAX_DELIVER","SWEEP_INTERVAL_MS","DELAYQ_INTERVAL_MS","RedisStreamsSubscription","id","randomUUID","receivedCount","processedCount","failedCount","lastActivity","Date","toISOString","unsubscribeFn","unsubscribe","isActive","getStats","messagesReceived","messagesProcessed","messagesFailed","recordReceived","recordProcessed","recordFailed","RedisStreamsEventConsumer","connection","subscriptions","subscriptionLoops","Set","keyPrefix","consumerName","group","maxDeliver","ackWaitMs","maxConcurrent","consumedCount","stopped","sweepTimer","delayqTimer","knownStreams","Map","config","RedisStreamsConnection","type","url","process","env","user","password","name","connectionTimeout","consumer","hostname","pid","ackWait","Math","max","round","connect","t","setInterval","sweepPending","catch","unref","drainDelayQueues","disconnect","clearInterval","unsubscribeAll","isConnected","healthCheck","t0","now","pong","ping","status","timestamp","connected","latencyMs","details","length","getStatistics","messagesConsumed","messagesPublished","activeConsumers","ensureStream","_config","ensureConsumer","subscribe","opts","sub","filter","s","push","startId","resolveStartId","options","deliverPolicy","wildcard","isWildcard","handlerFn","stream","streamKey","prefix","ensureGroup","subjectFilter","filteredHandler","evt","matchSubject","ack","spawnLoop","boundary","boundaryOf","refresh","client","getClient","subjects","smembers","registryKey","has","subscribeMultiple","out","pull","raw","xreadgroup","batch","timeout","streamName","entries","rawFields","parsed","parseEntry","toAcknowledgeable","clear","getSubscriptions","processDLQ","dlqGroup","dlq","dlqKey","xgroup","res","listSubjects","_stream","seen","values","members","m","add","policy","msg","includes","loop","makeBlockingClient","warn","setTimeout","nak","i","val","data","JSON","parse","metadata","correlationId","deliveryCount","acked","xack","xdel","delay","score","payload","stringify","zadd","delayQueueKey","term","flat","xadd","isRedelivered","getDeliveryAttempt","size","claimed","xautoclaim","pending","xpending","Array","isArray","lockKey","delayLockKey","got","due","zrangebyscore","member","split","indexOf","slice","zrem","del","safeStringify","_key","toString","RedisStreamsEventPublisher","publishCount","lastPublishTime","maxLen","dedupTtl","parseInt","dedupTtlSeconds","activePublishers","publish","publishInternal","msgId","messageId","enableDedup","enableDeduplication","ok","dedupKey","priority","defaultPriority","source","userId","workspaceId","tenantId","sadd","publishBatch","events","e","publishWithAck","reply","replyKey","replyTo","timeoutMs","xrange","last","payloadIdx","sendReply","expire","QueueType","resolveQueueType","REDIS_STREAMS","redactConnectionUrl","URL","rendered","authorityStart","authorityEnd","schemeEnd","EventQueueFactory","createPublisher","info","createConsumer","createPublisherFromEnv","createConsumerFromEnv","createPublisherForLayer","_layer","serviceName","createConsumerForLayer"],"mappings":"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","file":"chunk-5ORHPLOA.js","sourcesContent":["/**\n * W3C trace context propagation for Redis Streams entries.\n *\n * Stream entries carry trace context as ordinary fields (`traceparent`,\n * `tracestate`, `baggage`). When `@opentelemetry/api` isn't installed at the\n * consumer, these helpers degrade to no-ops.\n */\nimport { logger } from '../../../logger/index.js';\n\ntype OtelApi = {\n propagation: {\n inject: (\n ctx: unknown,\n carrier: Record<string, string>,\n setter: { set: (c: Record<string, string>, k: string, v: string) => void }\n ) => void;\n extract: (\n ctx: unknown,\n carrier: Record<string, string>,\n getter: {\n get: (c: Record<string, string>, k: string) => string | undefined;\n keys: (c: Record<string, string>) => string[];\n }\n ) => unknown;\n };\n context: { active: () => unknown; with: <T>(ctx: unknown, fn: () => T) => T };\n trace: { getTracer: (name: string, version?: string) => { startActiveSpan: (...args: unknown[]) => unknown } };\n};\n\nlet otelApiPromise: Promise<OtelApi | null> | null = null;\n\nasync function loadOtelApi(): Promise<OtelApi | null> {\n if (otelApiPromise) return otelApiPromise;\n otelApiPromise = (async () => {\n try {\n const mod = (await import('@opentelemetry/api')) as unknown as OtelApi;\n return mod;\n } catch {\n logger.debug('[redis-streams/trace-context] @opentelemetry/api not available; tracing disabled');\n return null;\n }\n })();\n return otelApiPromise;\n}\n\nconst TRACE_KEYS = ['traceparent', 'tracestate', 'baggage'] as const;\n\n/** Inject the active OTel context into a plain record of stream fields. */\nexport async function injectTraceFields(): Promise<Record<string, string>> {\n const api = await loadOtelApi();\n if (!api) return {};\n const carrier: Record<string, string> = {};\n try {\n api.propagation.inject(api.context.active(), carrier, {\n set(c, k, v) {\n c[k] = v;\n },\n });\n } catch (err) {\n logger.debug('[redis-streams/trace-context] inject failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return carrier;\n}\n\n/** Extract OTel context from stream-entry fields. */\nexport async function extractTraceContext(fields: Record<string, string>): Promise<unknown> {\n const api = await loadOtelApi();\n if (!api) return undefined;\n const carrier: Record<string, string> = {};\n for (const key of TRACE_KEYS) {\n const value = fields[key];\n if (value) carrier[key] = value;\n }\n try {\n return api.propagation.extract(api.context.active(), carrier, {\n get(c, k) {\n return c[k];\n },\n keys(c) {\n return Object.keys(c);\n },\n });\n } catch {\n return undefined;\n }\n}\n\n/** Wrap a consumer handler in a CONSUMER-kind span rooted at the carried trace. */\nexport async function runWithConsumerSpan<T>(\n subject: string,\n fields: Record<string, string>,\n handler: () => Promise<T>\n): Promise<T> {\n const api = await loadOtelApi();\n if (!api) return handler();\n try {\n const parentCtx = await extractTraceContext(fields);\n const tracer = api.trace.getTracer('@burdenoff/be-sdk/redis-streams');\n return await new Promise<T>((resolve, reject) => {\n tracer.startActiveSpan(\n `redis-streams.consume ${subject}`,\n {\n kind: 5,\n attributes: { 'messaging.system': 'redis', 'messaging.destination.name': subject },\n },\n parentCtx,\n async (span: {\n setStatus: (status: { code: number; message?: string }) => void;\n recordException: (err: Error) => void;\n end: () => void;\n }) => {\n try {\n const result = await handler();\n span.setStatus({ code: 1 });\n span.end();\n resolve(result);\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({ code: 2, message: err instanceof Error ? err.message : String(err) });\n span.end();\n reject(err);\n }\n }\n );\n });\n } catch {\n return handler();\n }\n}\n","/**\n * Redis Streams implementation of IEventConsumer.\n *\n * One ioredis client per active subscription handles `XREADGROUP BLOCK` in a\n * background loop, with periodic XAUTOCLAIM reclaiming abandoned pending\n * entries and a small ZSET-based delay queue draining NAK'd messages back\n * into the stream when their delay expires.\n */\nimport { randomUUID } from 'node:crypto';\nimport { hostname } from 'node:os';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type { ConsumerConfig, EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\nimport type {\n AcknowledgeableEvent,\n EventHandler,\n EventMetadata,\n StreamConfig,\n SubscriptionOptions,\n} from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport {\n boundaryOf,\n delayLockKey,\n delayQueueKey,\n dlqKey,\n isWildcard,\n matchSubject,\n registryKey,\n streamKey,\n} from './keyspace.js';\nimport { runWithConsumerSpan } from './trace-context.js';\n\ninterface ParsedEntry<T = unknown> {\n id: string;\n stream: string;\n subject: string;\n data: T;\n metadata: EventMetadata;\n timestamp: string;\n fields: Record<string, string>;\n deliveryCount: number;\n}\n\nconst DEFAULT_BLOCK_MS = 5000;\nconst DEFAULT_BATCH = 10;\nconst REGISTRY_REFRESH_MS = 10_000;\nconst DEFAULT_ACK_WAIT_MS = 30_000;\nconst DEFAULT_MAX_DELIVER = 3;\nconst SWEEP_INTERVAL_MS = 15_000;\nconst DELAYQ_INTERVAL_MS = 1_000;\n\nclass RedisStreamsSubscription implements ISubscription {\n readonly id = randomUUID();\n private active = true;\n private receivedCount = 0;\n private processedCount = 0;\n private failedCount = 0;\n private lastActivity = new Date().toISOString();\n\n constructor(\n readonly subject: string,\n private readonly unsubscribeFn: () => Promise<void>\n ) {}\n\n async unsubscribe(): Promise<void> {\n if (!this.active) return;\n this.active = false;\n await this.unsubscribeFn();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n getStats(): {\n messagesReceived: number;\n messagesProcessed: number;\n messagesFailed: number;\n lastActivity: string;\n } {\n return {\n messagesReceived: this.receivedCount,\n messagesProcessed: this.processedCount,\n messagesFailed: this.failedCount,\n lastActivity: this.lastActivity,\n };\n }\n\n recordReceived(): void {\n this.receivedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordProcessed(): void {\n this.processedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordFailed(): void {\n this.failedCount++;\n this.lastActivity = new Date().toISOString();\n }\n}\n\nexport interface RedisStreamsConsumerConfig extends ConsumerConfig {\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventConsumer implements IEventConsumer {\n private readonly connection: RedisStreamsConnection;\n private subscriptions: RedisStreamsSubscription[] = [];\n private readonly subscriptionLoops: Set<() => Promise<void>> = new Set();\n private readonly keyPrefix: string;\n private readonly consumerName: string;\n private readonly group: string;\n private readonly maxDeliver: number;\n private readonly ackWaitMs: number;\n private readonly maxConcurrent: number;\n private consumedCount = 0;\n private failedCount = 0;\n private lastActivity: Date | null = null;\n private stopped = false;\n private sweepTimer: ReturnType<typeof setInterval> | null = null;\n private delayqTimer: ReturnType<typeof setInterval> | null = null;\n private knownStreams: Map<string, string> = new Map(); // streamKey -> subject\n\n constructor(config: RedisStreamsConsumerConfig) {\n this.connection = new RedisStreamsConnection({\n type: 'redis-streams',\n url: config.url ?? process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n user: config.user,\n password: config.password,\n name: config.name,\n connectionTimeout: config.connectionTimeout,\n });\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n this.group = config.consumer || config.name || 'default-consumer';\n this.consumerName = `${this.group}:${hostname()}:${process.pid}`;\n this.maxDeliver = config.maxDeliver ?? DEFAULT_MAX_DELIVER;\n this.ackWaitMs = config.ackWait ? Math.max(1000, Math.round(config.ackWait / 1_000_000)) : DEFAULT_ACK_WAIT_MS;\n this.maxConcurrent = config.maxConcurrent ?? 5;\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n if (!this.sweepTimer) {\n const t = setInterval(() => {\n void this.sweepPending().catch((err) => {\n logger.debug('[RedisStreamsEventConsumer] sweep error', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }, SWEEP_INTERVAL_MS);\n t.unref?.();\n this.sweepTimer = t;\n }\n if (!this.delayqTimer) {\n const t = setInterval(() => {\n void this.drainDelayQueues().catch(() => undefined);\n }, DELAYQ_INTERVAL_MS);\n t.unref?.();\n this.delayqTimer = t;\n }\n }\n\n async disconnect(): Promise<void> {\n this.stopped = true;\n if (this.sweepTimer) clearInterval(this.sweepTimer);\n if (this.delayqTimer) clearInterval(this.delayqTimer);\n await this.unsubscribeAll();\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: {\n type: 'redis-streams',\n subscriptions: this.subscriptions.length,\n },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return Promise.resolve({\n messagesConsumed: this.consumedCount,\n messagesFailed: this.failedCount,\n messagesPublished: 0,\n activeConsumers: this.subscriptions.length,\n lastActivity: this.lastActivity?.toISOString() ?? null,\n details: { type: 'redis-streams', group: this.group },\n });\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async ensureConsumer(_config: ConsumerConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async subscribe<T = unknown>(opts: {\n subject: string;\n handler: EventHandler<T>;\n options?: SubscriptionOptions;\n }): Promise<ISubscription> {\n await this.connect();\n const sub = new RedisStreamsSubscription(opts.subject, async () => {\n this.subscriptions = this.subscriptions.filter((s) => s !== sub);\n });\n this.subscriptions.push(sub);\n\n const startId = this.resolveStartId(opts.options?.deliverPolicy);\n const wildcard = isWildcard(opts.subject);\n const handlerFn = opts.handler as EventHandler<unknown>;\n\n // When the caller provides an explicit stream name (e.g. 'WSPACE_GRAPH_EVENTS'),\n // pin the consumer to that single aggregated stream and filter by subject locally.\n // This mirrors the publisher's stream override logic so both sides use the same key.\n if (opts.options?.stream) {\n const stream = streamKey(opts.options.stream, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n const subjectFilter = wildcard ? opts.subject : null;\n const filteredHandler: EventHandler<unknown> = subjectFilter\n ? async (evt) => {\n if (matchSubject(subjectFilter, evt.subject)) {\n await handlerFn(evt);\n } else {\n await evt.ack();\n }\n }\n : handlerFn;\n this.spawnLoop(sub, stream, opts.subject, filteredHandler);\n return sub;\n }\n\n if (!wildcard) {\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n this.spawnLoop(sub, stream, opts.subject, handlerFn);\n } else {\n const boundary = boundaryOf(opts.subject);\n const refresh = async (): Promise<void> => {\n const client = this.connection.getClient();\n const subjects = await client.smembers(registryKey(boundary));\n for (const s of subjects) {\n if (!matchSubject(opts.subject, s)) continue;\n const stream = streamKey(s, { prefix: this.keyPrefix });\n if (this.knownStreams.has(stream)) continue;\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, s);\n this.spawnLoop(sub, stream, s, handlerFn);\n }\n };\n await refresh();\n const t = setInterval(() => {\n if (this.stopped || !sub.isActive()) {\n clearInterval(t);\n return;\n }\n void refresh().catch(() => undefined);\n }, REGISTRY_REFRESH_MS);\n t.unref?.();\n }\n\n return sub;\n }\n\n async subscribeMultiple<T = unknown>(\n subjects: string[],\n handler: EventHandler<T>,\n options?: SubscriptionOptions\n ): Promise<ISubscription[]> {\n const out: ISubscription[] = [];\n for (const subject of subjects) {\n out.push(await this.subscribe({ subject, handler, options }));\n }\n return out;\n }\n\n async pull<T = unknown>(opts: {\n subject: string;\n batch?: number;\n timeout?: number;\n }): Promise<AcknowledgeableEvent<T>[]> {\n await this.connect();\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, '$');\n const client = this.connection.getClient();\n const raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n opts.batch ?? DEFAULT_BATCH,\n 'BLOCK',\n opts.timeout ?? DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!raw) return [];\n const out: AcknowledgeableEvent<T>[] = [];\n for (const [streamName, entries] of raw) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(streamName, id, rawFields);\n out.push(this.toAcknowledgeable(streamName, id, parsed));\n }\n }\n return out;\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of [...this.subscriptions]) {\n await sub.unsubscribe();\n }\n this.subscriptions = [];\n this.subscriptionLoops.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return [...this.subscriptions];\n }\n\n async processDLQ<T = unknown>(handler: EventHandler<T>): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const dlqGroup = `${this.group}-dlq`;\n for (const [stream] of this.knownStreams) {\n const dlq = dlqKey(stream);\n try {\n await client.xgroup('CREATE', dlq, dlqGroup, '0', 'MKSTREAM');\n } catch {\n /* already exists */\n }\n const res = (await client.xreadgroup(\n 'GROUP',\n dlqGroup,\n this.consumerName,\n 'COUNT',\n 50,\n 'BLOCK',\n 100,\n 'STREAMS',\n dlq,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!res) continue;\n for (const [, entries] of res) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(dlq, id, rawFields);\n const evt = this.toAcknowledgeable<T>(dlq, id, parsed, dlqGroup);\n try {\n await handler(evt);\n } catch (err) {\n logger.error('[RedisStreamsEventConsumer] DLQ handler error', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n }\n }\n\n async listSubjects(_stream?: string): Promise<string[]> {\n await this.connect();\n const client = this.connection.getClient();\n const seen = new Set<string>();\n for (const subject of this.knownStreams.values()) {\n const members = await client.smembers(registryKey(boundaryOf(subject)));\n for (const m of members) seen.add(m);\n }\n return [...seen];\n }\n\n // ---- internals ----\n\n private resolveStartId(policy: SubscriptionOptions['deliverPolicy'] | undefined): string {\n switch (policy) {\n case 'all':\n return '0';\n case 'new':\n return '$';\n case 'last':\n return '$';\n default:\n return '$';\n }\n }\n\n private async ensureGroup(stream: string, startId: string): Promise<void> {\n const client = this.connection.getClient();\n try {\n await client.xgroup('CREATE', stream, this.group, startId, 'MKSTREAM');\n logger.debug('[RedisStreamsEventConsumer] group created', {\n stream,\n group: this.group,\n startId,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes('BUSYGROUP')) {\n throw err;\n }\n }\n }\n\n private spawnLoop(\n sub: RedisStreamsSubscription,\n stream: string,\n subject: string,\n handler: EventHandler<unknown>\n ): void {\n const loop = async (): Promise<void> => {\n const client = await this.connection.makeBlockingClient();\n try {\n while (!this.stopped && sub.isActive()) {\n let raw: Array<[string, Array<[string, string[]]>]> | null = null;\n try {\n raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n this.maxConcurrent,\n 'BLOCK',\n DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) {\n await this.ensureGroup(stream, '$');\n continue;\n }\n logger.warn('[RedisStreamsEventConsumer] read error', { stream, error: msg });\n await new Promise((res) => setTimeout(res, 1000));\n continue;\n }\n if (!raw) continue;\n for (const [, entries] of raw) {\n for (const [id, rawFields] of entries) {\n sub.recordReceived();\n this.consumedCount++;\n this.lastActivity = new Date();\n const parsed = this.parseEntry(stream, id, rawFields);\n const evt = this.toAcknowledgeable(stream, id, parsed);\n try {\n await runWithConsumerSpan(subject, parsed.fields, () => handler(evt));\n sub.recordProcessed();\n } catch (err) {\n sub.recordFailed();\n this.failedCount++;\n logger.error('[RedisStreamsEventConsumer] handler error', {\n subject,\n id,\n error: err instanceof Error ? err.message : String(err),\n });\n // Auto-nak on uncaught throw (re-deliver after ackWait).\n try {\n await evt.nak();\n } catch {\n /* ignore */\n }\n }\n }\n }\n }\n } finally {\n try {\n client.disconnect();\n } catch {\n /* ignore */\n }\n }\n };\n void loop().catch((err) => {\n logger.error('[RedisStreamsEventConsumer] loop crashed', {\n stream,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n private parseEntry<T>(stream: string, id: string, rawFields: string[]): ParsedEntry<T> {\n const fields: Record<string, string> = {};\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n const key = rawFields[i];\n const val = rawFields[i + 1];\n if (key === undefined || val === undefined) continue;\n fields[key] = val;\n }\n let data: T;\n try {\n data = JSON.parse(fields['payload'] ?? 'null') as T;\n } catch {\n data = fields['payload'] as unknown as T;\n }\n let metadata: EventMetadata;\n try {\n metadata = JSON.parse(fields['metadata'] ?? '{}') as EventMetadata;\n } catch {\n metadata = { correlationId: fields['correlation-id'] ?? '' };\n }\n if (!metadata.correlationId) metadata.correlationId = fields['correlation-id'] ?? '';\n return {\n id,\n stream,\n subject: fields['subject'] ?? '',\n data,\n metadata,\n timestamp: fields['timestamp'] ?? new Date().toISOString(),\n fields,\n deliveryCount: 1,\n };\n }\n\n private toAcknowledgeable<T>(\n stream: string,\n id: string,\n parsed: ParsedEntry<T>,\n group: string = this.group\n ): AcknowledgeableEvent<T> {\n const connection = this.connection;\n let acked = false;\n return {\n id,\n subject: parsed.subject,\n data: parsed.data,\n metadata: parsed.metadata,\n timestamp: parsed.timestamp,\n async ack(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n async nak(delay = 0): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n if (delay > 0) {\n // Park in delay queue; worker will re-XADD and ACK original.\n const score = Date.now() + delay;\n const payload = JSON.stringify(parsed.fields);\n await client.zadd(delayQueueKey(stream), score, `${id}|${payload}`);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n }\n // delay=0: do nothing — XAUTOCLAIM will reclaim after ackWait.\n },\n async term(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n const dlq = dlqKey(stream);\n const flat: string[] = [];\n for (const [k, v] of Object.entries(parsed.fields)) flat.push(k, v);\n await client.xadd(dlq, 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n isRedelivered(): boolean {\n return parsed.deliveryCount > 1;\n },\n getDeliveryAttempt(): number {\n return parsed.deliveryCount;\n },\n };\n }\n\n private async sweepPending(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n try {\n const claimed = (await client.xautoclaim(\n stream,\n this.group,\n this.consumerName,\n this.ackWaitMs,\n '0',\n 'COUNT',\n 50\n )) as [string, Array<[string, string[]]>, string[]] | null;\n if (!claimed) continue;\n const entries = claimed[1] ?? [];\n for (const [id, rawFields] of entries) {\n const pending = (await client.xpending(\n stream,\n this.group,\n 'IDLE',\n 0,\n '-',\n '+',\n 1,\n this.consumerName\n )) as Array<[string, string, number, number]>;\n const deliveryCount = Array.isArray(pending) && pending[0] ? pending[0][3] : 1;\n if (deliveryCount > this.maxDeliver) {\n const flat: string[] = [];\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n flat.push(rawFields[i]!, rawFields[i + 1]!);\n }\n flat.push('dlq-reason', 'max-deliver-exceeded');\n flat.push('dlq-deliveries', String(deliveryCount));\n await client.xadd(dlqKey(stream), 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, this.group, id);\n await client.xdel(stream, id).catch(() => undefined);\n logger.warn('[RedisStreamsEventConsumer] message moved to DLQ', {\n stream,\n id,\n deliveryCount,\n });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) continue;\n logger.debug('[RedisStreamsEventConsumer] sweep iteration error', { stream, error: msg });\n }\n }\n }\n\n private async drainDelayQueues(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n const lockKey = delayLockKey(stream);\n const got = await client.set(lockKey, this.consumerName, 'NX', 'EX', 30).catch(() => null);\n if (got !== 'OK') continue;\n try {\n const due = await client.zrangebyscore(delayQueueKey(stream), 0, Date.now(), 'LIMIT', 0, 50);\n for (const member of due) {\n const split = member.indexOf('|');\n if (split < 0) continue;\n const payload = member.slice(split + 1);\n let fields: Record<string, string> = {};\n try {\n fields = JSON.parse(payload) as Record<string, string>;\n } catch {\n continue;\n }\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) flat.push(k, v);\n await client.xadd(stream, 'MAXLEN', '~', 100_000, '*', ...flat);\n await client.zrem(delayQueueKey(stream), member);\n }\n } finally {\n await client.del(lockKey).catch(() => undefined);\n }\n }\n }\n}\n\nexport type { IoRedis };\n","/**\n * Serialization helpers for the Redis Streams backend.\n *\n * @module event-queue/implementations/redis-streams/serialize\n */\n\n/**\n * `JSON.stringify` that does not throw on BigInt values.\n *\n * Event payloads frequently originate from Prisma rows, which expose BigInt\n * columns (e.g. counters / durations) as native `bigint`. The standard\n * `JSON.stringify` throws `TypeError: Do not know how to serialize a BigInt`,\n * which would drop the entire event — an entity would then silently never reach\n * the graph / search index. We serialize BigInt as its decimal string so the\n * value is preserved and the event is published.\n */\nexport function safeStringify(value: unknown): string {\n return JSON.stringify(value ?? null, (_key, val) => (typeof val === 'bigint' ? val.toString() : val));\n}\n","/**\n * Redis Streams implementation of IEventPublisher.\n *\n * Each subject is its own stream (`boff:events:<subject-with-colons>`); MAXLEN\n * trimming keeps each stream bounded; dedup is enforced by `SET NX EX` on a\n * per-message-id key before XADD.\n */\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { PublisherConfig, EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\nimport type { EventMetadata, StreamConfig } from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport { boundaryOf, dedupKey, registryKey, replyKey, streamKey } from './keyspace.js';\nimport { safeStringify } from './serialize.js';\nimport { injectTraceFields } from './trace-context.js';\n\nexport interface RedisStreamsPublisherConfig extends PublisherConfig {\n /** Approximate MAXLEN trim threshold per stream. Default 100_000. */\n maxLen?: number;\n /** Dedup TTL window in seconds. Default 120. */\n dedupTtlSeconds?: number;\n /** Key namespace override. Default `boff:events`. */\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventPublisher implements IEventPublisher {\n private connection: RedisStreamsConnection;\n private publishCount = 0;\n private lastPublishTime: Date | null = null;\n private readonly maxLen: number;\n private readonly dedupTtl: number;\n private readonly keyPrefix: string;\n\n constructor(private config: RedisStreamsPublisherConfig) {\n this.connection = new RedisStreamsConnection(config);\n this.maxLen = config.maxLen ?? parseInt(process.env['REDIS_STREAMS_MAXLEN'] ?? '100000', 10);\n this.dedupTtl = config.dedupTtlSeconds ?? parseInt(process.env['REDIS_STREAMS_DEDUP_TTL'] ?? '120', 10);\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n }\n\n async disconnect(): Promise<void> {\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: { type: 'redis-streams', url: this.config.url },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesFailed: 0,\n activePublishers: 1,\n activeConsumers: 0,\n lastActivity: this.lastPublishTime?.toISOString() ?? null,\n details: { type: 'redis-streams' },\n };\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n // Streams are created lazily by XADD; no-op here.\n return Promise.resolve();\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<number | string> {\n return this.publishInternal(options);\n }\n\n private async publishInternal<T>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<string> {\n await this.connect();\n const client = this.connection.getClient();\n // When the caller provides an explicit stream name (e.g. 'WSPACE_GRAPH_EVENTS'),\n // use it as the Redis stream key so all events land in one aggregated stream that\n // a single consumer can read. Fall back to the per-subject stream when no override.\n const streamName = opts.options?.stream ?? opts.subject;\n const stream = streamKey(streamName, { prefix: this.keyPrefix });\n const msgId = opts.options?.messageId ?? randomUUID();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const enableDedup = this.config.enableDeduplication === true || opts.options?.messageId !== undefined;\n\n if (enableDedup) {\n const ok = await client.set(dedupKey(stream, msgId), '1', 'NX', 'EX', this.dedupTtl);\n if (ok !== 'OK') {\n logger.debug('[RedisStreamsEventPublisher] dedup hit; skipping publish', {\n subject: opts.subject,\n msgId,\n });\n return msgId;\n }\n }\n\n const trace = await injectTraceFields();\n const fields: Record<string, string> = {\n 'msg-id': msgId,\n subject: opts.subject,\n 'correlation-id': correlationId,\n timestamp: new Date().toISOString(),\n priority: opts.options?.priority ?? this.config.defaultPriority ?? 'normal',\n source: opts.metadata?.source ?? this.config.name ?? 'unknown',\n payload: safeStringify(opts.data ?? null),\n metadata: safeStringify(opts.metadata ?? {}),\n ...trace,\n };\n if (opts.metadata?.userId) fields['user-id'] = String(opts.metadata.userId);\n if (opts.metadata?.workspaceId) fields['workspace-id'] = String(opts.metadata.workspaceId);\n if (opts.metadata?.tenantId) fields['tenant-id'] = String(opts.metadata.tenantId);\n\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) {\n flat.push(k, v);\n }\n\n const id = await client.xadd(stream, 'MAXLEN', '~', this.maxLen, '*', ...flat);\n\n // Async fire-and-forget registry update\n void client.sadd(registryKey(boundaryOf(opts.subject)), opts.subject).catch(() => undefined);\n\n this.publishCount++;\n this.lastPublishTime = new Date();\n logger.debug('[RedisStreamsEventPublisher] published', {\n subject: opts.subject,\n stream,\n id,\n });\n return id;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }>\n ): Promise<Array<number | string>> {\n const out: string[] = [];\n for (const e of events) {\n out.push(await this.publishInternal(e));\n }\n return out;\n }\n\n /**\n * Emulated request/response: writer XADDs onto its own subject, then\n * blocks on a one-shot reply stream keyed by correlationId.\n */\n async publishWithAck<T = unknown, R = unknown>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n await this.connect();\n const client = this.connection.getClient();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const reply = replyKey(correlationId);\n await this.publishInternal({\n subject: opts.subject,\n data: opts.data,\n metadata: { ...opts.metadata, correlationId, replyTo: reply },\n });\n\n const timeoutMs = opts.timeout ?? 5000;\n const t0 = Date.now();\n while (Date.now() - t0 < timeoutMs) {\n const entries = (await client.xrange(reply, '-', '+')) as Array<[string, string[]]>;\n if (Array.isArray(entries) && entries.length > 0) {\n const last = entries[entries.length - 1];\n if (!last) break;\n const rawFields = last[1];\n const payloadIdx = rawFields.indexOf('payload');\n const payload = payloadIdx >= 0 ? rawFields[payloadIdx + 1] : '{}';\n await client.del(reply);\n return JSON.parse(payload ?? '{}') as R;\n }\n await new Promise((res) => setTimeout(res, 50));\n }\n await client.del(reply).catch(() => undefined);\n throw new Error(`[RedisStreamsEventPublisher] publishWithAck timed out for subject=${opts.subject}`);\n }\n\n /** Internal helper used by the consumer's reply path. */\n async sendReply(correlationId: string, data: unknown): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const key = replyKey(correlationId);\n await client.xadd(key, '*', 'payload', safeStringify(data ?? null));\n await client.expire(key, 60);\n }\n}\n\nexport type { IoRedis };\n","/**\n * Event Queue Configuration Types\n */\n\n/**\n * Queue type enum\n */\nexport enum QueueType {\n REDIS_STREAMS = 'redis-streams',\n RABBITMQ = 'rabbitmq',\n KAFKA = 'kafka',\n SQS = 'sqs',\n}\n\n/**\n * Base configuration for event queue\n */\nexport interface BaseQueueConfig {\n /** Queue type */\n type: QueueType | string;\n /** Connection URL */\n url: string;\n /** Optional username */\n user?: string;\n /** Optional password */\n password?: string;\n /** Optional auth token */\n token?: string;\n /** Optional credentials file contents (auth payload for the backend) */\n creds?: string;\n /** Optional path to a credentials file */\n credsFile?: string;\n /** Maximum reconnection attempts (-1 for infinite) */\n maxReconnectAttempts?: number;\n /** Time to wait between reconnection attempts (ms) */\n reconnectTimeWait?: number;\n /** Connection timeout (ms) */\n connectionTimeout?: number;\n /** Connection name/identifier */\n name?: string;\n}\n\n/**\n * Publisher-specific configuration\n */\nexport interface PublisherConfig extends BaseQueueConfig {\n /** Default message TTL (ms) */\n defaultTTL?: number;\n /** Enable message deduplication */\n enableDeduplication?: boolean;\n /** Default priority for messages */\n defaultPriority?: 'low' | 'normal' | 'high';\n}\n\n/**\n * Consumer-specific configuration\n */\nexport interface ConsumerConfig extends Partial<BaseQueueConfig> {\n /** Stream name to consume from */\n stream: string;\n /** Consumer name (durable) */\n consumer: string;\n /** Subject filter pattern */\n filterSubject?: string;\n /** Maximum concurrent message processing */\n maxConcurrent?: number;\n /** Maximum delivery attempts */\n maxDeliver?: number;\n /** Acknowledgment wait time (nanoseconds) */\n ackWait?: number;\n /** Acknowledgment policy */\n ackPolicy?: 'explicit' | 'all' | 'none';\n /** Delivery policy */\n deliverPolicy?: 'all' | 'last' | 'new' | 'byStartSequence' | 'byStartTime';\n /** Maximum pending acknowledgments */\n maxAckPending?: number;\n}\n\n/**\n * Health check result\n */\nexport interface EventQueueHealthCheckResult {\n /** Overall health status */\n status: 'healthy' | 'unhealthy' | 'degraded';\n /** Timestamp of health check */\n timestamp: string;\n /** Connection status */\n connected?: boolean;\n /** Latency in milliseconds */\n latencyMs?: number;\n /** Additional details */\n details?: Record<string, unknown>;\n /** Error message if unhealthy */\n error?: string;\n}\n\n/**\n * Statistics\n */\nexport interface QueueStatistics {\n /** Total messages published */\n messagesPublished?: number;\n /** Total messages consumed */\n messagesConsumed?: number;\n /** Messages currently pending */\n messagesPending?: number;\n /** Messages in queue */\n queueSize?: number;\n /** Failed message count */\n messagesFailed?: number;\n /** Active consumers count */\n activeConsumers?: number;\n /** Active publishers count */\n activePublishers?: number;\n /** Average processing time (ms) */\n avgProcessingTimeMs?: number;\n /** Last activity timestamp */\n lastActivity?: string | null;\n /** Custom metrics */\n details?: Record<string, unknown>;\n}\n","/**\n * Event Queue Factory\n *\n * Single-backend wrapper around the Redis Streams publisher/consumer.\n * NATS support was removed on 2026-05-16 — Redis is the canonical fleet\n * event-bus. Other backends (RabbitMQ, Kafka, SQS) are listed in\n * `QueueType` for future extension; today only `redis-streams` is wired.\n */\nimport { logger } from '../../logger/index.js';\nimport type { ServiceLayer } from '../../types/layer.js';\n\nimport { RedisStreamsEventConsumer } from '../implementations/redis-streams/RedisStreamsEventConsumer.js';\nimport { RedisStreamsEventPublisher } from '../implementations/redis-streams/RedisStreamsEventPublisher.js';\nimport type { IEventConsumer } from '../interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from '../interfaces/IEventPublisher.js';\nimport { type ConsumerConfig, type PublisherConfig, QueueType } from '../types/config.js';\n\nfunction resolveQueueType(): QueueType {\n // Kept for the API contract — always returns REDIS_STREAMS now.\n return QueueType.REDIS_STREAMS;\n}\n\nfunction redactConnectionUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n const rendered = parsed.toString();\n const authorityStart = rendered.indexOf('//') + 2;\n const authorityEnd = rendered.indexOf('@', authorityStart);\n if (authorityStart < 2 || authorityEnd < 0) return rendered;\n return `${rendered.slice(0, authorityStart)}:***@${rendered.slice(authorityEnd + 1)}`;\n } catch {\n const schemeEnd = url.indexOf('://');\n if (schemeEnd < 0) return url;\n const authorityStart = schemeEnd + 3;\n const authorityEnd = url.indexOf('@', authorityStart);\n if (authorityEnd < 0) return url;\n return `${url.slice(0, authorityStart)}:***@${url.slice(authorityEnd + 1)}`;\n }\n}\n\n/**\n * Factory for creating event queue instances\n */\nexport class EventQueueFactory {\n /**\n * Create an event publisher based on configuration\n */\n static createPublisher(config: PublisherConfig): IEventPublisher {\n logger.info('[EventQueueFactory] Creating event publisher', {\n type: config.type,\n url: redactConnectionUrl(config.url),\n });\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventPublisher(config);\n }\n\n throw new Error(`Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`);\n }\n\n /**\n * Create an event consumer based on configuration\n */\n static createConsumer(config: ConsumerConfig): IEventConsumer {\n logger.info('[EventQueueFactory] Creating event consumer', {\n type: config.type,\n url: redactConnectionUrl(config.url),\n stream: config.stream,\n consumer: config.consumer,\n });\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventConsumer(config);\n }\n\n throw new Error(`Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`);\n }\n\n /**\n * Create a publisher from environment variables.\n * Reads `REDIS_URL`, `REDIS_PASSWORD`, and standard queue options.\n */\n static createPublisherFromEnv(): IEventPublisher {\n return EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? 'be-sdk-publisher',\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') ?? 'normal',\n });\n }\n\n /**\n * Create a consumer from environment variables.\n */\n static createConsumerFromEnv(stream: string, consumer: string): IEventConsumer {\n return EventQueueFactory.createConsumer({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? consumer,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n\n // ========================================================================\n // Layer-Aware Factory Methods\n // ========================================================================\n\n /**\n * Create a publisher for a specific layer.\n * The layer is preserved on the publisher name; otherwise identical to\n * `createPublisherFromEnv()`.\n */\n static createPublisherForLayer(_layer: ServiceLayer, serviceName: string): IEventPublisher {\n return EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') ?? 'normal',\n });\n }\n\n /**\n * Create a consumer for a specific layer.\n */\n static createConsumerForLayer(\n _layer: ServiceLayer,\n serviceName: string,\n stream: string,\n consumer: string\n ): IEventConsumer {\n return EventQueueFactory.createConsumer({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n}\n\n// Internal helper kept exported for callers that imported it previously.\nexport { resolveQueueType };\n"]}