@burdenoff/be-sdk 2026.705.4 → 2026.706.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.
- package/dist/{chunk-HIH4SVR3.js → chunk-3EGNCMUX.js} +3 -3
- package/dist/{chunk-HIH4SVR3.js.map → chunk-3EGNCMUX.js.map} +1 -1
- package/dist/{chunk-OHEPNJ2X.js → chunk-4ALVWJTM.js} +3 -3
- package/dist/chunk-4ALVWJTM.js.map +1 -0
- package/dist/{chunk-H3AXO5SY.js → chunk-4FJR2BZ7.js} +3 -3
- package/dist/{chunk-H3AXO5SY.js.map → chunk-4FJR2BZ7.js.map} +1 -1
- package/dist/{chunk-STLDHYPB.js → chunk-QPL6BOLH.js} +3 -3
- package/dist/{chunk-STLDHYPB.js.map → chunk-QPL6BOLH.js.map} +1 -1
- package/dist/event-queue/index.js +2 -2
- package/dist/graph/index.js +3 -3
- package/dist/index.js +9 -9
- package/dist/prisma/generator/index.js +1 -8
- package/dist/prisma/generator/index.js.map +1 -1
- package/dist/prisma/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-OHEPNJ2X.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { EventPriority, EventsModule, ModuleEventsService, createConsumer, createModuleEventsService, createPublisher } from '../chunk-
|
|
2
|
-
export { GraphEventEmitterImpl, MemoryEventBus, MemoryEventConsumer, MemoryEventPublisher, MemoryEventQueue, createGraphEventEmitter2 as createGraphEventEmitter, createMemoryConsumer, createGraphEventEmitter as createMemoryGraphEventEmitter, createMemoryPublisher, getGraphEventEmitter, resetGraphEventEmitter } from '../chunk-
|
|
1
|
+
export { EventPriority, EventsModule, ModuleEventsService, createConsumer, createModuleEventsService, createPublisher } from '../chunk-4FJR2BZ7.js';
|
|
2
|
+
export { GraphEventEmitterImpl, MemoryEventBus, MemoryEventConsumer, MemoryEventPublisher, MemoryEventQueue, createGraphEventEmitter2 as createGraphEventEmitter, createMemoryConsumer, createGraphEventEmitter as createMemoryGraphEventEmitter, createMemoryPublisher, getGraphEventEmitter, resetGraphEventEmitter } from '../chunk-4ALVWJTM.js';
|
|
3
3
|
export { EventQueueFactory, QueueType, RedisStreamsEventConsumer, RedisStreamsEventPublisher } from '../chunk-MQCVQCFA.js';
|
|
4
4
|
export { RedisStreamsConnection, dlqKey as redisDlqKey, streamKey as redisStreamKey } from '../chunk-MHNA7IS7.js';
|
|
5
5
|
import '../chunk-CBZNP6RF.js';
|
package/dist/graph/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { AUDIT_FIELDS, GraphEventsPublisher, GraphExportService, GraphModule, SOFT_DELETE_FIELDS, STANDARD_FIELDS, TENANT_FIELDS, createGraphEventsHelper, createGraphExportService, createPrismaGraphIntegration, createRelationshipFromEntity, defineEntity, defineGraphConfig, defineModuleGraph, defineRelationship, getGraphEventsPublisher, getGraphStats, initializeGraph, isGraphInitialized } from '../chunk-
|
|
1
|
+
export { AUDIT_FIELDS, GraphEventsPublisher, GraphExportService, GraphModule, SOFT_DELETE_FIELDS, STANDARD_FIELDS, TENANT_FIELDS, createGraphEventsHelper, createGraphExportService, createPrismaGraphIntegration, createRelationshipFromEntity, defineEntity, defineGraphConfig, defineModuleGraph, defineRelationship, getGraphEventsPublisher, getGraphStats, initializeGraph, isGraphInitialized } from '../chunk-QPL6BOLH.js';
|
|
2
2
|
export { GraphRegistry, addGraphExtension, createEntityEvent, createRelationshipEvent, extractEntityTitle, extractMinimalFields, getCollectionForEntity, parseRelationship, shouldSyncEntity, shouldSyncRelationship } from '../chunk-Q23NPVWQ.js';
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-4FJR2BZ7.js';
|
|
4
|
+
import '../chunk-4ALVWJTM.js';
|
|
5
5
|
import '../chunk-MQCVQCFA.js';
|
|
6
6
|
import '../chunk-MHNA7IS7.js';
|
|
7
7
|
import '../chunk-QGBXVNRM.js';
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ActivityModule, UsageModule, TrackerModule } from './chunk-XN3DNXXV.js';
|
|
2
2
|
export { ActivityModule, TrackerModule, UsageModule } from './chunk-XN3DNXXV.js';
|
|
3
|
-
export { prisma_exports as Prisma } from './chunk-
|
|
4
|
-
export { RESOURCE_CAP_DEFAULTS, ResourceCapExceededError, ResourceCapsModule, getResourceCaps } from './chunk-VDDOGIWY.js';
|
|
3
|
+
export { prisma_exports as Prisma } from './chunk-3EGNCMUX.js';
|
|
5
4
|
import { RBACModule } from './chunk-S32JOMMW.js';
|
|
6
5
|
export { RBACModule, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv } from './chunk-S32JOMMW.js';
|
|
6
|
+
export { RESOURCE_CAP_DEFAULTS, ResourceCapExceededError, ResourceCapsModule, getResourceCaps } from './chunk-VDDOGIWY.js';
|
|
7
7
|
import './chunk-MXLCLLCI.js';
|
|
8
8
|
export { sharing_exports as Sharing } from './chunk-XD5ZK727.js';
|
|
9
9
|
export { TemporalClient, TemporalClientFactory, TemporalModule, TemporalWorker, TemporalWorkerFactory, TemporalWorkerManager } from './chunk-IC7YDBGE.js';
|
|
@@ -16,12 +16,12 @@ export { observability_exports as Observability } from './chunk-5LXDPGDH.js';
|
|
|
16
16
|
export { platform_exports as Platform } from './chunk-YCKM7FS7.js';
|
|
17
17
|
export { export_exports as Export } from './chunk-5BCCI2FV.js';
|
|
18
18
|
export { feature_flags_exports as FeatureFlags } from './chunk-MNKU7I2G.js';
|
|
19
|
-
import { GraphModule } from './chunk-
|
|
20
|
-
export { graph_exports as Graph, GraphModule } from './chunk-
|
|
19
|
+
import { GraphModule } from './chunk-QPL6BOLH.js';
|
|
20
|
+
export { graph_exports as Graph, GraphModule } from './chunk-QPL6BOLH.js';
|
|
21
21
|
import './chunk-Q23NPVWQ.js';
|
|
22
|
-
import { EventsModule } from './chunk-
|
|
23
|
-
export { event_queue_exports as EventQueue, EventsModule } from './chunk-
|
|
24
|
-
import './chunk-
|
|
22
|
+
import { EventsModule } from './chunk-4FJR2BZ7.js';
|
|
23
|
+
export { event_queue_exports as EventQueue, EventsModule } from './chunk-4FJR2BZ7.js';
|
|
24
|
+
import './chunk-4ALVWJTM.js';
|
|
25
25
|
import { QueueType, EventQueueFactory } from './chunk-MQCVQCFA.js';
|
|
26
26
|
export { graphql_exports as GraphQL } from './chunk-X4NELQLV.js';
|
|
27
27
|
import './chunk-QLVKMWFA.js';
|
|
@@ -35,19 +35,19 @@ export { layer_exports as Layer } from './chunk-UIMPJNWC.js';
|
|
|
35
35
|
import './chunk-VFCMR5GX.js';
|
|
36
36
|
import { ContextManager } from './chunk-RZOFS2BQ.js';
|
|
37
37
|
export { ContextManager } from './chunk-RZOFS2BQ.js';
|
|
38
|
-
export { cache_exports as Cache } from './chunk-UYE4IEPT.js';
|
|
39
38
|
import { AuthModule } from './chunk-RXMOV3YE.js';
|
|
40
39
|
export { AuthModule } from './chunk-RXMOV3YE.js';
|
|
41
40
|
export { utils_exports as Utils } from './chunk-B7I4TABG.js';
|
|
41
|
+
export { cache_exports as Cache } from './chunk-UYE4IEPT.js';
|
|
42
42
|
export { captcha_exports as Captcha, isCaptchaEnabled, verifyCaptcha, verifyCaptchaIfEnabled } from './chunk-YMZEUTD2.js';
|
|
43
43
|
export { createInternalClient, createInternalClientForTenant, createInternalClientForWorkspaces } from './chunk-VI4VSNTI.js';
|
|
44
|
+
export { crypto_exports as Crypto } from './chunk-SBS4S2PJ.js';
|
|
44
45
|
import { DatabaseModule } from './chunk-A6DGEZJ4.js';
|
|
45
46
|
export { DatabaseModule } from './chunk-A6DGEZJ4.js';
|
|
46
47
|
import { APIError, NetworkError, TimeoutError, ValidationError } from './chunk-QGBXVNRM.js';
|
|
47
48
|
export { DEFAULT_CIRCUIT_BREAKER_CONFIG, DEFAULT_GATEWAY_RETRY_CONFIG, DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES, DEFAULT_LAYER_STREAMS } from './chunk-YFOHAHZE.js';
|
|
48
49
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
49
50
|
export { logger_exports as Logger } from './chunk-CBZNP6RF.js';
|
|
50
|
-
export { crypto_exports as Crypto } from './chunk-SBS4S2PJ.js';
|
|
51
51
|
export { dataloader_exports as DataLoader } from './chunk-NUB5GQTU.js';
|
|
52
52
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
53
53
|
import { GraphQLClient } from 'graphql-request';
|
|
@@ -57,10 +57,7 @@ generatorHandler({
|
|
|
57
57
|
onManifest() {
|
|
58
58
|
return {
|
|
59
59
|
defaultOutput: "./src/generated/prisma-fields.ts",
|
|
60
|
-
prettyName: "Burdenoff Prisma Field Generator"
|
|
61
|
-
requiresGenerators: [
|
|
62
|
-
"prisma-client-js"
|
|
63
|
-
]
|
|
60
|
+
prettyName: "Burdenoff Prisma Field Generator"
|
|
64
61
|
};
|
|
65
62
|
},
|
|
66
63
|
async onGenerate(options) {
|
|
@@ -87,10 +84,6 @@ generatorHandler({
|
|
|
87
84
|
const outputDir = dirname(outputPath);
|
|
88
85
|
safeMkdirSync(outputDir);
|
|
89
86
|
safeWriteFileSync(outputPath, fileContent);
|
|
90
|
-
console.info(`\u2705 [Burdenoff] Generated Prisma fields mapping at: ${outputPath}`);
|
|
91
|
-
console.info(` Found ${Object.keys(modelFieldsMap).length} models`);
|
|
92
|
-
console.info(` Total fields: ${Object.values(modelFieldsMap).reduce((sum, m) => sum + m.fields.length, 0)}`);
|
|
93
|
-
console.info(` Total relations: ${Object.values(modelFieldsMap).reduce((sum, m) => sum + m.relations.length, 0)}`);
|
|
94
87
|
}
|
|
95
88
|
});
|
|
96
89
|
function generateTypeScriptFile(modelFieldsMap) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/prisma/generator/index.ts"],"names":["generatorHandler","generatorHelperPkg","validateOutputPath","outputPath","resolvedPath","resolve","endsWith","Error","dangerousPaths","some","dangerous","startsWith","safeMkdirSync","dirPath","mkdirSync","recursive","safeWriteFileSync","filePath","content","validatedPath","writeFileSync","onManifest","defaultOutput","prettyName","requiresGenerators","onGenerate","options","dmmf","generator","configuredPath","output","value","modelFieldsMap","model","datamodel","models","scalarFields","relationFields","field","fields","kind","push","name","relations","fileContent","generateTypeScriptFile","outputDir","dirname","console","info","Object","keys","length","values","reduce","sum","m","modelCount","totalFields","totalRelations","Date","toISOString","JSON","stringify"],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\n/**\n * Prisma Field Generator\n *\n * Generates a TypeScript file containing all model fields from Prisma schema.\n * This generator extracts DMMF information at build time and creates a static\n * mapping of model names to their fields, which can be used at runtime.\n *\n * Usage in schema.prisma:\n * ```prisma\n * generator fieldGenerator {\n * provider = \"burdenoff-prisma-field-generator\"\n * output = \"./src/generated/prisma-fields.ts\"\n * }\n * ```\n */\n\nimport generatorHelperPkg from '@prisma/generator-helper';\nimport { writeFileSync, mkdirSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { GeneratorOptions } from '@prisma/generator-helper';\n\nconst { generatorHandler } = generatorHelperPkg;\n\n/**\n * Validate and resolve output path from generator config\n * Ensures the path is safe and within expected boundaries\n *\n * @param outputPath The output path from generator config\n * @returns Resolved absolute path\n */\nfunction validateOutputPath(outputPath: string): string {\n // Resolve to absolute path\n const resolvedPath = resolve(outputPath);\n\n // Basic validation: ensure it's a TypeScript file\n if (!resolvedPath.endsWith('.ts')) {\n throw new Error(`Invalid output path: ${outputPath} must be a .ts file`);\n }\n\n // Ensure it doesn't try to write to system directories\n const dangerousPaths = ['/etc/', '/usr/', '/bin/', '/sbin/', '/var/', '/root/', '/boot/', '/sys/', '/proc/'];\n if (dangerousPaths.some((dangerous) => resolvedPath.startsWith(dangerous))) {\n throw new Error(`Invalid output path: ${outputPath} cannot write to system directories`);\n }\n\n return resolvedPath;\n}\n\n/**\n * Safely create directory with validated path\n * Path validation prevents directory traversal attacks\n */\nfunction safeMkdirSync(dirPath: string): void {\n const resolvedPath = resolve(dirPath);\n // Validate it's not a system directory\n const dangerousPaths = ['/etc/', '/usr/', '/bin/', '/sbin/', '/var/', '/root/', '/boot/', '/sys/', '/proc/'];\n if (dangerousPaths.some((dangerous) => resolvedPath.startsWith(dangerous))) {\n throw new Error(`Cannot create directory in system path: ${dirPath}`);\n }\n mkdirSync(resolvedPath, { recursive: true });\n}\n\n/**\n * Safely write file with validated path\n * Path validation prevents directory traversal attacks\n */\nfunction safeWriteFileSync(filePath: string, content: string): void {\n const validatedPath = validateOutputPath(filePath);\n writeFileSync(validatedPath, content, 'utf-8');\n}\n\ngeneratorHandler({\n onManifest() {\n return {\n defaultOutput: './src/generated/prisma-fields.ts',\n prettyName: 'Burdenoff Prisma Field Generator',\n requiresGenerators: ['prisma-client-js'],\n };\n },\n\n async onGenerate(options: GeneratorOptions) {\n const { dmmf, generator } = options;\n const configuredPath = generator.output?.value || './src/generated/prisma-fields.ts';\n const outputPath = validateOutputPath(configuredPath);\n\n // Extract models and their fields\n const modelFieldsMap: Record<string, { fields: string[]; relations: string[] }> = {};\n\n for (const model of dmmf.datamodel.models) {\n const scalarFields: string[] = [];\n const relationFields: string[] = [];\n\n for (const field of model.fields) {\n if (field.kind === 'object') {\n // Relation field\n relationFields.push(field.name);\n } else {\n // Scalar field (string, int, DateTime, etc.)\n scalarFields.push(field.name);\n }\n }\n\n modelFieldsMap[model.name] = {\n fields: scalarFields,\n relations: relationFields,\n };\n }\n\n // Generate TypeScript file content\n const fileContent = generateTypeScriptFile(modelFieldsMap);\n\n // Ensure output directory exists (use validated path)\n const outputDir = dirname(outputPath);\n safeMkdirSync(outputDir);\n\n // Write file (use validated path)\n safeWriteFileSync(outputPath, fileContent);\n\n console.info(`✅ [Burdenoff] Generated Prisma fields mapping at: ${outputPath}`);\n console.info(` Found ${Object.keys(modelFieldsMap).length} models`);\n console.info(` Total fields: ${Object.values(modelFieldsMap).reduce((sum, m) => sum + m.fields.length, 0)}`);\n console.info(\n ` Total relations: ${Object.values(modelFieldsMap).reduce((sum, m) => sum + m.relations.length, 0)}`\n );\n },\n});\n\n/**\n * Generate TypeScript file content\n */\nfunction generateTypeScriptFile(modelFieldsMap: Record<string, { fields: string[]; relations: string[] }>): string {\n const modelCount = Object.keys(modelFieldsMap).length;\n const totalFields = Object.values(modelFieldsMap).reduce((sum, m) => sum + m.fields.length, 0);\n const totalRelations = Object.values(modelFieldsMap).reduce((sum, m) => sum + m.relations.length, 0);\n\n return `/**\n * Auto-generated Prisma Model Fields\n *\n * This file is automatically generated by @burdenoff/be-sdk Prisma Field Generator\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n *\n * Generated at: ${new Date().toISOString()}\n * Total models: ${modelCount}\n * Total scalar fields: ${totalFields}\n * Total relation fields: ${totalRelations}\n *\n * @packageDocumentation\n */\n\n/**\n * Type definition for model fields mapping\n */\nexport type ModelFieldsMap = Record<\n string,\n {\n /** Scalar fields (string, number, Date, etc.) */\n fields: string[];\n /** Relation fields (references to other models) */\n relations: string[];\n }\n>;\n\n/**\n * Mapping of all Prisma models to their fields\n *\n * This mapping is generated at build time from your Prisma schema\n * and contains all models with their scalar and relation fields.\n */\nexport const modelFields: ModelFieldsMap = ${JSON.stringify(modelFieldsMap, null, 2)} as const;\n\n/**\n * Get all scalar fields for a model\n *\n * @param modelName - Name of the Prisma model\n * @param includeRelations - Whether to include relation fields (default: false)\n * @returns Array of field names\n * @throws Error if model is not found\n *\n * @example\n * \\`\\`\\`typescript\n * const userFields = getModelFields('User');\n * // Returns: ['id', 'email', 'name', 'createdAt', 'updatedAt']\n *\n * const userFieldsWithRelations = getModelFields('User', true);\n * // Returns: ['id', 'email', 'name', 'createdAt', 'updatedAt', 'posts', 'profile']\n * \\`\\`\\`\n */\nexport function getModelFields(modelName: string, includeRelations = false): string[] {\n const model = modelFields[modelName];\n if (!model) {\n const available = Object.keys(modelFields).join(', ');\n throw new Error(\n \\`Model \"\\${modelName}\" not found in generated fields. Available models: \\${available}\\`\n );\n }\n\n return includeRelations ? [...model.fields, ...model.relations] : model.fields;\n}\n\n/**\n * Get all model names\n *\n * @returns Array of all available model names\n *\n * @example\n * \\`\\`\\`typescript\n * const models = getAllModelNames();\n * // Returns: ['User', 'Post', 'Comment', 'Tag', ...]\n * \\`\\`\\`\n */\nexport function getAllModelNames(): string[] {\n return Object.keys(modelFields);\n}\n\n/**\n * Check if a model exists in the schema\n *\n * @param modelName - Name of the model to check\n * @returns True if model exists, false otherwise\n *\n * @example\n * \\`\\`\\`typescript\n * if (hasModel('User')) {\n * const fields = getModelFields('User');\n * }\n * \\`\\`\\`\n */\nexport function hasModel(modelName: string): boolean {\n return modelName in modelFields;\n}\n\n/**\n * Get only scalar fields (excludes relations)\n *\n * @param modelName - Name of the Prisma model\n * @returns Array of scalar field names\n */\nexport function getScalarFields(modelName: string): string[] {\n return getModelFields(modelName, false);\n}\n\n/**\n * Get only relation fields\n *\n * @param modelName - Name of the Prisma model\n * @returns Array of relation field names\n */\nexport function getRelationFields(modelName: string): string[] {\n const model = modelFields[modelName];\n if (!model) {\n throw new Error(\\`Model \"\\${modelName}\" not found\\`);\n }\n return model.relations;\n}\n\n/**\n * Default export for convenience\n */\nexport default modelFields;\n`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/prisma/generator/index.ts"],"names":["generatorHandler","generatorHelperPkg","validateOutputPath","outputPath","resolvedPath","resolve","endsWith","Error","dangerousPaths","some","dangerous","startsWith","safeMkdirSync","dirPath","mkdirSync","recursive","safeWriteFileSync","filePath","content","validatedPath","writeFileSync","onManifest","defaultOutput","prettyName","onGenerate","options","dmmf","generator","configuredPath","output","value","modelFieldsMap","model","datamodel","models","scalarFields","relationFields","field","fields","kind","push","name","relations","fileContent","generateTypeScriptFile","outputDir","dirname","modelCount","Object","keys","length","totalFields","values","reduce","sum","m","totalRelations","Date","toISOString","JSON","stringify"],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\n/**\n * Prisma Field Generator\n *\n * Generates a TypeScript file containing all model fields from Prisma schema.\n * This generator extracts DMMF information at build time and creates a static\n * mapping of model names to their fields, which can be used at runtime.\n *\n * Usage in schema.prisma:\n * ```prisma\n * generator fieldGenerator {\n * provider = \"burdenoff-prisma-field-generator\"\n * output = \"./src/generated/prisma-fields.ts\"\n * }\n * ```\n */\n\nimport generatorHelperPkg from '@prisma/generator-helper';\nimport { writeFileSync, mkdirSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { GeneratorOptions } from '@prisma/generator-helper';\n\nconst { generatorHandler } = generatorHelperPkg;\n\n/**\n * Validate and resolve output path from generator config\n * Ensures the path is safe and within expected boundaries\n *\n * @param outputPath The output path from generator config\n * @returns Resolved absolute path\n */\nfunction validateOutputPath(outputPath: string): string {\n // Resolve to absolute path\n const resolvedPath = resolve(outputPath);\n\n // Basic validation: ensure it's a TypeScript file\n if (!resolvedPath.endsWith('.ts')) {\n throw new Error(`Invalid output path: ${outputPath} must be a .ts file`);\n }\n\n // Ensure it doesn't try to write to system directories\n const dangerousPaths = ['/etc/', '/usr/', '/bin/', '/sbin/', '/var/', '/root/', '/boot/', '/sys/', '/proc/'];\n if (dangerousPaths.some((dangerous) => resolvedPath.startsWith(dangerous))) {\n throw new Error(`Invalid output path: ${outputPath} cannot write to system directories`);\n }\n\n return resolvedPath;\n}\n\n/**\n * Safely create directory with validated path\n * Path validation prevents directory traversal attacks\n */\nfunction safeMkdirSync(dirPath: string): void {\n const resolvedPath = resolve(dirPath);\n // Validate it's not a system directory\n const dangerousPaths = ['/etc/', '/usr/', '/bin/', '/sbin/', '/var/', '/root/', '/boot/', '/sys/', '/proc/'];\n if (dangerousPaths.some((dangerous) => resolvedPath.startsWith(dangerous))) {\n throw new Error(`Cannot create directory in system path: ${dirPath}`);\n }\n mkdirSync(resolvedPath, { recursive: true });\n}\n\n/**\n * Safely write file with validated path\n * Path validation prevents directory traversal attacks\n */\nfunction safeWriteFileSync(filePath: string, content: string): void {\n const validatedPath = validateOutputPath(filePath);\n writeFileSync(validatedPath, content, 'utf-8');\n}\n\ngeneratorHandler({\n onManifest() {\n return {\n defaultOutput: './src/generated/prisma-fields.ts',\n prettyName: 'Burdenoff Prisma Field Generator',\n };\n },\n\n async onGenerate(options: GeneratorOptions) {\n const { dmmf, generator } = options;\n const configuredPath = generator.output?.value || './src/generated/prisma-fields.ts';\n const outputPath = validateOutputPath(configuredPath);\n\n // Extract models and their fields\n const modelFieldsMap: Record<string, { fields: string[]; relations: string[] }> = {};\n\n for (const model of dmmf.datamodel.models) {\n const scalarFields: string[] = [];\n const relationFields: string[] = [];\n\n for (const field of model.fields) {\n if (field.kind === 'object') {\n // Relation field\n relationFields.push(field.name);\n } else {\n // Scalar field (string, int, DateTime, etc.)\n scalarFields.push(field.name);\n }\n }\n\n modelFieldsMap[model.name] = {\n fields: scalarFields,\n relations: relationFields,\n };\n }\n\n // Generate TypeScript file content\n const fileContent = generateTypeScriptFile(modelFieldsMap);\n\n // Ensure output directory exists (use validated path)\n const outputDir = dirname(outputPath);\n safeMkdirSync(outputDir);\n\n // Write file (use validated path)\n safeWriteFileSync(outputPath, fileContent);\n\n },\n});\n\n/**\n * Generate TypeScript file content\n */\nfunction generateTypeScriptFile(modelFieldsMap: Record<string, { fields: string[]; relations: string[] }>): string {\n const modelCount = Object.keys(modelFieldsMap).length;\n const totalFields = Object.values(modelFieldsMap).reduce((sum, m) => sum + m.fields.length, 0);\n const totalRelations = Object.values(modelFieldsMap).reduce((sum, m) => sum + m.relations.length, 0);\n\n return `/**\n * Auto-generated Prisma Model Fields\n *\n * This file is automatically generated by @burdenoff/be-sdk Prisma Field Generator\n * DO NOT EDIT MANUALLY - Changes will be overwritten on next generation\n *\n * Generated at: ${new Date().toISOString()}\n * Total models: ${modelCount}\n * Total scalar fields: ${totalFields}\n * Total relation fields: ${totalRelations}\n *\n * @packageDocumentation\n */\n\n/**\n * Type definition for model fields mapping\n */\nexport type ModelFieldsMap = Record<\n string,\n {\n /** Scalar fields (string, number, Date, etc.) */\n fields: string[];\n /** Relation fields (references to other models) */\n relations: string[];\n }\n>;\n\n/**\n * Mapping of all Prisma models to their fields\n *\n * This mapping is generated at build time from your Prisma schema\n * and contains all models with their scalar and relation fields.\n */\nexport const modelFields: ModelFieldsMap = ${JSON.stringify(modelFieldsMap, null, 2)} as const;\n\n/**\n * Get all scalar fields for a model\n *\n * @param modelName - Name of the Prisma model\n * @param includeRelations - Whether to include relation fields (default: false)\n * @returns Array of field names\n * @throws Error if model is not found\n *\n * @example\n * \\`\\`\\`typescript\n * const userFields = getModelFields('User');\n * // Returns: ['id', 'email', 'name', 'createdAt', 'updatedAt']\n *\n * const userFieldsWithRelations = getModelFields('User', true);\n * // Returns: ['id', 'email', 'name', 'createdAt', 'updatedAt', 'posts', 'profile']\n * \\`\\`\\`\n */\nexport function getModelFields(modelName: string, includeRelations = false): string[] {\n const model = modelFields[modelName];\n if (!model) {\n const available = Object.keys(modelFields).join(', ');\n throw new Error(\n \\`Model \"\\${modelName}\" not found in generated fields. Available models: \\${available}\\`\n );\n }\n\n return includeRelations ? [...model.fields, ...model.relations] : model.fields;\n}\n\n/**\n * Get all model names\n *\n * @returns Array of all available model names\n *\n * @example\n * \\`\\`\\`typescript\n * const models = getAllModelNames();\n * // Returns: ['User', 'Post', 'Comment', 'Tag', ...]\n * \\`\\`\\`\n */\nexport function getAllModelNames(): string[] {\n return Object.keys(modelFields);\n}\n\n/**\n * Check if a model exists in the schema\n *\n * @param modelName - Name of the model to check\n * @returns True if model exists, false otherwise\n *\n * @example\n * \\`\\`\\`typescript\n * if (hasModel('User')) {\n * const fields = getModelFields('User');\n * }\n * \\`\\`\\`\n */\nexport function hasModel(modelName: string): boolean {\n return modelName in modelFields;\n}\n\n/**\n * Get only scalar fields (excludes relations)\n *\n * @param modelName - Name of the Prisma model\n * @returns Array of scalar field names\n */\nexport function getScalarFields(modelName: string): string[] {\n return getModelFields(modelName, false);\n}\n\n/**\n * Get only relation fields\n *\n * @param modelName - Name of the Prisma model\n * @returns Array of relation field names\n */\nexport function getRelationFields(modelName: string): string[] {\n const model = modelFields[modelName];\n if (!model) {\n throw new Error(\\`Model \"\\${modelName}\" not found\\`);\n }\n return model.relations;\n}\n\n/**\n * Default export for convenience\n */\nexport default modelFields;\n`;\n}\n"]}
|
package/dist/prisma/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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-
|
|
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-3EGNCMUX.js';
|
|
2
2
|
export { addWorkspaceExtension, getWorkspaceContext, injectWhereWorkspaceId, maybeSetRlsGuc, maybeTagConnection, setWorkspaceContext, withWorkspaceContext, withWorkspaceContextSync } from '../chunk-MXLCLLCI.js';
|
|
3
3
|
export { PrismaClientWrapper, configurePrismaLogging, createConnectionPool, createPrismaAdapter, createPrismaClient, ensureServiceApplicationName } from '../chunk-Q23NPVWQ.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-4ALVWJTM.js';
|
|
5
5
|
import '../chunk-MQCVQCFA.js';
|
|
6
6
|
import '../chunk-MHNA7IS7.js';
|
|
7
7
|
import '../chunk-CBZNP6RF.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/be-sdk",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.706.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",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event-queue/implementations/memory/MemoryEventQueue.ts","../src/event-queue/graph-emitter.ts"],"names":["MemoryEventBus","handlers","Map","emit","event","data","eventHandlers","get","forEach","handler","Promise","resolve","pattern","matchesPattern","on","has","set","Set","add","off","delete","endsWith","prefix","slice","startsWith","clear","MemoryEventQueue","queue","processing","maxRetries","retryDelay","options","publishEntityEvent","eventType","entity","context","subject","productName","type","split","logger","debug","entityId","id","entityType","enqueue","metadata","Date","now","randomUUID","timestamp","retries","push","processQueue","registerHandler","length","shift","ackEvent","correlationId","toISOString","ack","nak","term","isRedelivered","getDeliveryAttempt","setTimeout","publish","close","MemoryEventPublisher","_connected","publishCount","connect","info","disconnect","isConnected","ensureStream","Error","messageId","publishBatch","events","messageIds","publishWithAck","healthCheck","status","connected","latencyMs","getStatistics","messagesPublished","messagesConsumed","messagesPending","messagesFailed","getQueue","MemoryEventConsumer","bus","_subscriptions","consumeCount","subIdCounter","streamName","consumerName","stream","consumer","sub","values","unsubscribe","ensureConsumer","subscribe","subId","messagesReceived","messagesProcessed","lastActivity","active","subscription","isActive","getStats","subscriptionId","subscribeMultiple","subjects","subscriptions","pull","unsubscribeAll","getSubscriptions","Array","from","processDLQ","_handler","getBus","createMemoryPublisher","createMemoryConsumer","createGraphEventEmitter","uuidv4","crypto","GraphEventEmitterImpl","publisher","connecting","graphRedisUrl","process","env","EventQueueFactory","createPublisher","QueueType","REDIS_STREAMS","url","name","src","ensureConnected","then","rbac","eventId","action","hasRbac","streamSubjects","productSource","organizationId","actorId","workspaceId","result","isHealthy","healthy","message","error","_graphEventEmitter","getGraphEventEmitter","resetGraphEventEmitter"],"mappings":"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","file":"chunk-OHEPNJ2X.js","sourcesContent":["/**\n * In-Memory Event Queue Implementation\n *\n * A simple in-memory event bus and queue for development/testing environments\n * or when NATS is not available. Implements the same interfaces as the NATS\n * implementation for seamless swapping.\n *\n * @module event-queue/memory\n * @category Events\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type { EventHandler, AcknowledgeableEvent, EventMetadata } from '../../types/events.js';\nimport type { EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\n\n/**\n * Entity event type for graph events\n */\nexport type EntityEventType = 'entity.created' | 'entity.updated' | 'entity.deleted';\n\n/**\n * Graph event emitter interface - compatible with Prisma extension\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 userId?: string;\n workspaceId?: string;\n }\n ): Promise<void>;\n}\n\n/**\n * Simple event bus for in-memory pub/sub\n */\nexport class MemoryEventBus {\n private handlers: Map<string, Set<EventHandler<unknown>>> = new Map();\n\n /**\n * Emit an event to all handlers\n */\n emit<T>(event: string, data: T): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.forEach((handler) => {\n void Promise.resolve(handler(data as AcknowledgeableEvent));\n });\n }\n\n // Also emit to wildcard handlers\n for (const [pattern, handlers] of this.handlers) {\n if (this.matchesPattern(event, pattern)) {\n handlers.forEach((handler) => {\n void Promise.resolve(handler(data as AcknowledgeableEvent));\n });\n }\n }\n }\n\n /**\n * Register a handler for an event\n */\n on<T>(event: string, handler: EventHandler<T>): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as EventHandler<unknown>);\n }\n\n /**\n * Remove a handler for an event\n */\n off<T>(event: string, handler: EventHandler<T>): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.delete(handler as EventHandler<unknown>);\n }\n }\n\n /**\n * Check if pattern matches event (supports wildcards)\n */\n private matchesPattern(event: string, pattern: string): boolean {\n if (pattern === event) return false; // Already handled exact match\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return event.startsWith(prefix + '.');\n }\n if (pattern.endsWith('.>')) {\n const prefix = pattern.slice(0, -2);\n return event.startsWith(prefix + '.');\n }\n return false;\n }\n\n /**\n * Clear all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Queued event structure\n */\ninterface QueuedEvent<T = unknown> {\n id: string;\n subject: string;\n data: T;\n metadata: Record<string, unknown>;\n timestamp: Date;\n retries: number;\n maxRetries: number;\n}\n\n/**\n * In-memory event queue with retry support\n */\nexport class MemoryEventQueue implements GraphEventEmitter {\n private queue: QueuedEvent[] = [];\n private processing = false;\n private handlers: Map<string, EventHandler<unknown>> = new Map();\n private maxRetries: number;\n private retryDelay: number;\n\n constructor(options?: { maxRetries?: number; retryDelay?: number }) {\n this.maxRetries = options?.maxRetries ?? 3;\n this.retryDelay = options?.retryDelay ?? 1000;\n }\n\n /**\n * Publish entity event (implements GraphEventEmitter)\n */\n async 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 userId?: string;\n workspaceId?: string;\n }\n ): Promise<void> {\n const subject = `graph.${context.productName}.${entity.type}.${eventType.split('.')[1]}`;\n\n logger.debug('[MemoryEventQueue] Publishing entity event', {\n eventType,\n entityId: entity.id,\n entityType: entity.type,\n subject,\n });\n\n this.enqueue(subject, {\n eventType,\n entity,\n context,\n });\n }\n\n /**\n * Add an event to the queue\n */\n enqueue<T>(subject: string, data: T, metadata: Record<string, unknown> = {}): string {\n const id = `evt_${Date.now()}_${randomUUID().slice(0, 8)}`;\n const event: QueuedEvent<T> = {\n id,\n subject,\n data,\n metadata,\n timestamp: new Date(),\n retries: 0,\n maxRetries: this.maxRetries,\n };\n this.queue.push(event);\n void this.processQueue();\n return id;\n }\n\n /**\n * Register a handler for a subject\n */\n registerHandler<T>(subject: string, handler: EventHandler<T>): void {\n this.handlers.set(subject, handler as EventHandler<unknown>);\n }\n\n /**\n * Process the queue\n */\n private async processQueue(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n\n this.processing = true;\n\n while (this.queue.length > 0) {\n const event = this.queue.shift();\n if (!event) continue;\n\n const handler = this.handlers.get(event.subject);\n if (handler) {\n try {\n const ackEvent: AcknowledgeableEvent = {\n id: event.id,\n subject: event.subject,\n data: event.data,\n metadata: {\n correlationId: event.id,\n ...event.metadata,\n },\n timestamp: event.timestamp.toISOString(),\n ack: async () => {\n logger.debug('[MemoryEventQueue] Event acknowledged', { id: event.id });\n },\n nak: async () => {\n logger.debug('[MemoryEventQueue] Event negatively acknowledged', { id: event.id });\n if (event.retries < event.maxRetries) {\n event.retries++;\n this.queue.push(event);\n }\n },\n term: async () => {\n logger.debug('[MemoryEventQueue] Event terminated', { id: event.id });\n },\n isRedelivered: () => event.retries > 0,\n getDeliveryAttempt: () => event.retries + 1,\n };\n await handler(ackEvent);\n } catch {\n if (event.retries < event.maxRetries) {\n event.retries++;\n await new Promise((resolve) => setTimeout(resolve, this.retryDelay));\n this.queue.push(event);\n }\n }\n }\n }\n\n this.processing = false;\n }\n\n /**\n * Get queue length\n */\n get length(): number {\n return this.queue.length;\n }\n\n /**\n * Clear the queue\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * Publish an event (fire-and-forget)\n */\n async publish<T>(subject: string, data: T, metadata: Record<string, unknown> = {}): Promise<void> {\n this.enqueue(subject, data, metadata);\n logger.debug('[MemoryEventQueue] Published event', { subject });\n }\n\n /**\n * Close the event queue\n */\n async close(): Promise<void> {\n this.clear();\n this.handlers.clear();\n logger.debug('[MemoryEventQueue] Event queue closed');\n }\n}\n\n/**\n * In-memory event publisher implementation\n */\nexport class MemoryEventPublisher implements IEventPublisher {\n private queue: MemoryEventQueue;\n private _connected = false;\n private publishCount = 0;\n\n constructor() {\n this.queue = new MemoryEventQueue();\n }\n\n async connect(): Promise<void> {\n this._connected = true;\n logger.info('[MemoryEventPublisher] Connected (in-memory mode)');\n }\n\n async disconnect(): Promise<void> {\n await this.queue.close();\n this._connected = false;\n logger.info('[MemoryEventPublisher] Disconnected');\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n async ensureStream(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventPublisher] ensureStream called (no-op for in-memory)');\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Record<string, unknown>;\n options?: PublishOptions;\n }): Promise<string> {\n if (!this._connected) {\n throw new Error('Publisher not connected');\n }\n\n const messageId = this.queue.enqueue(options.subject, options.data, options.metadata);\n this.publishCount++;\n\n logger.debug('[MemoryEventPublisher] Published', {\n subject: options.subject,\n messageId,\n });\n\n return messageId;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Record<string, unknown>;\n options?: PublishOptions;\n }>\n ): Promise<string[]> {\n const messageIds: string[] = [];\n for (const event of events) {\n const id = await this.publish(event);\n messageIds.push(id);\n }\n return messageIds;\n }\n\n async publishWithAck<T = unknown, R = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n // For in-memory, just publish and return empty response\n await this.publish({\n subject: options.subject,\n data: options.data,\n metadata: options.metadata,\n });\n return {} as R;\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n return {\n status: this._connected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: this._connected,\n latencyMs: 0,\n };\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesPending: this.queue.length,\n messagesFailed: 0,\n };\n }\n\n /**\n * Get the underlying queue (for testing/debugging)\n */\n getQueue(): MemoryEventQueue {\n return this.queue;\n }\n}\n\n/**\n * In-memory event consumer implementation\n */\nexport class MemoryEventConsumer implements IEventConsumer {\n private queue: MemoryEventQueue;\n private bus: MemoryEventBus;\n private _connected = false;\n private _subscriptions: Map<string, ISubscription> = new Map();\n private consumeCount = 0;\n private subIdCounter = 0;\n\n constructor(\n private streamName: string,\n private consumerName: string\n ) {\n this.queue = new MemoryEventQueue();\n this.bus = new MemoryEventBus();\n }\n\n async connect(): Promise<void> {\n this._connected = true;\n logger.info('[MemoryEventConsumer] Connected (in-memory mode)', {\n stream: this.streamName,\n consumer: this.consumerName,\n });\n }\n\n async disconnect(): Promise<void> {\n for (const sub of this._subscriptions.values()) {\n await sub.unsubscribe();\n }\n this._subscriptions.clear();\n await this.queue.close();\n this.bus.clear();\n this._connected = false;\n logger.info('[MemoryEventConsumer] Disconnected');\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n async ensureStream(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventConsumer] ensureStream called (no-op for in-memory)');\n }\n\n async ensureConsumer(): Promise<void> {\n // No-op for in-memory implementation\n logger.debug('[MemoryEventConsumer] ensureConsumer called (no-op for in-memory)');\n }\n\n async subscribe<T = unknown>(options: {\n subject: string;\n handler: EventHandler<T>;\n queueGroup?: string;\n }): Promise<ISubscription> {\n if (!this._connected) {\n throw new Error('Consumer not connected');\n }\n\n const { subject, handler } = options;\n const subId = `sub_${++this.subIdCounter}`;\n let messagesReceived = 0;\n let messagesProcessed = 0;\n let messagesFailed = 0;\n let lastActivity = new Date().toISOString();\n let active = true;\n\n // Register with both queue and bus\n this.queue.registerHandler(subject, async (event) => {\n messagesReceived++;\n lastActivity = new Date().toISOString();\n try {\n this.consumeCount++;\n await handler(event as AcknowledgeableEvent<T>);\n messagesProcessed++;\n } catch {\n messagesFailed++;\n }\n });\n\n this.bus.on(subject, async (data) => {\n messagesReceived++;\n lastActivity = new Date().toISOString();\n try {\n this.consumeCount++;\n await handler(data as AcknowledgeableEvent<T>);\n messagesProcessed++;\n } catch {\n messagesFailed++;\n }\n });\n\n const subscription: ISubscription = {\n id: subId,\n subject,\n unsubscribe: async () => {\n active = false;\n this._subscriptions.delete(subId);\n logger.debug('[MemoryEventConsumer] Unsubscribed', { subject });\n },\n isActive: () => active,\n getStats: () => ({\n messagesReceived,\n messagesProcessed,\n messagesFailed,\n lastActivity,\n }),\n };\n\n this._subscriptions.set(subId, subscription);\n logger.info('[MemoryEventConsumer] Subscribed', { subject, subscriptionId: subId });\n\n return subscription;\n }\n\n async subscribeMultiple<T = unknown>(subjects: string[], handler: EventHandler<T>): Promise<ISubscription[]> {\n const subscriptions: ISubscription[] = [];\n for (const subject of subjects) {\n const sub = await this.subscribe<T>({ subject, handler });\n subscriptions.push(sub);\n }\n return subscriptions;\n }\n\n async pull<T = unknown>(): Promise<AcknowledgeableEvent<T>[]> {\n // In-memory doesn't support pull-based consumption in a meaningful way\n logger.debug('[MemoryEventConsumer] pull called (returning empty for in-memory)');\n return [];\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of this._subscriptions.values()) {\n await sub.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return Array.from(this._subscriptions.values());\n }\n\n async processDLQ<T = unknown>(_handler: EventHandler<T>): Promise<void> {\n // No-op for in-memory (no DLQ)\n logger.debug('[MemoryEventConsumer] processDLQ called (no-op for in-memory)');\n }\n\n // eslint-disable-next-line sonarjs/no-identical-functions -- Same implementation needed for both Publisher and Consumer\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n return {\n status: this._connected ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: this._connected,\n latencyMs: 0,\n };\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: 0,\n messagesConsumed: this.consumeCount,\n messagesPending: this.queue.length,\n messagesFailed: 0,\n };\n }\n\n /**\n * Get the underlying bus (for testing/debugging)\n */\n getBus(): MemoryEventBus {\n return this.bus;\n }\n\n /**\n * Get the underlying queue (for testing/debugging)\n */\n getQueue(): MemoryEventQueue {\n return this.queue;\n }\n}\n\n/**\n * Create an in-memory event publisher\n */\nexport function createMemoryPublisher(): IEventPublisher {\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an in-memory event consumer\n */\nexport function createMemoryConsumer(stream: string, consumer: string): IEventConsumer {\n return new MemoryEventConsumer(stream, consumer);\n}\n\n/**\n * Create a GraphEventEmitter instance (in-memory)\n */\nexport function createGraphEventEmitter(): GraphEventEmitter {\n return new MemoryEventQueue();\n}\n","/**\n * Graph Event Emitter\n *\n * Provides a GraphEventEmitter implementation that works with the event queue system.\n * Uses Redis Streams when REDIS_URL is set, in-memory otherwise.\n *\n * @module event-queue/graph-emitter\n * @category Events\n */\nimport { logger } from '../logger/index.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\nimport { QueueType } from './types/config.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Entity event type for graph events\n */\nexport type EntityEventType = 'entity.created' | 'entity.updated' | 'entity.deleted';\n\n/**\n * RBAC metadata included in entity lifecycle events.\n * When present, the RBAC consumer will create/update/delete resources accordingly.\n * When absent, only the graph consumer processes the event (strict mode).\n */\nexport interface EntityEventRbacMetadata {\n /** RBAC resource type name (e.g., 'tag', 'conversation', 'bot') */\n resourceTypeName: string;\n /** Human-readable resource name */\n name?: string;\n /** Resource identifier (defaults to entity.id if not provided) */\n identifier?: string;\n /** Parent resource identifier for hierarchy */\n parentResourceIdentifier?: string;\n /** Whether to create a resource in RBAC (default: true) */\n createResource?: boolean;\n}\n\n/**\n * Graph event emitter interface - compatible with Prisma extension\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 * Graph Event Emitter (Redis Streams-backed in production).\n *\n * Publishes graph entity events to the Redis Streams event bus for\n * processing by graph sync workers. Falls back to in-memory when\n * neither `GRAPH_REDIS_URL` nor `REDIS_URL` is set.\n *\n * `GRAPH_REDIS_URL` takes priority over `REDIS_URL` so that services\n * whose own cache Redis runs on a different db index (e.g. /14) can\n * still publish to the graph-svc's db index (e.g. /16) without\n * touching their primary Redis config.\n */\nexport class GraphEventEmitterImpl implements GraphEventEmitter {\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor() {\n const graphRedisUrl = process.env['GRAPH_REDIS_URL'] ?? process.env['REDIS_URL'];\n if (graphRedisUrl) {\n this.publisher = EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: graphRedisUrl,\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? 'graph-emitter',\n });\n const src = process.env['GRAPH_REDIS_URL'] ? 'GRAPH_REDIS_URL' : 'REDIS_URL';\n logger.info(`[GraphEventEmitter] Using Redis Streams publisher (${src})`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info('[GraphEventEmitter] Using in-memory publisher (GRAPH_REDIS_URL / REDIS_URL not configured)');\n }\n }\n\n /**\n * Ensure publisher is connected\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info('[GraphEventEmitterImpl] Publisher connected');\n });\n\n await this.connecting;\n }\n\n /**\n * Publish entity event to graph queue\n *\n * @param eventType - The lifecycle event type\n * @param entity - Entity data (id, type, data)\n * @param context - Event context (product, org, user, workspace)\n * @param rbac - Optional RBAC metadata. When present, the RBAC consumer will\n * create/update/delete resources. When absent, only graph consumer processes.\n */\n async 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 await this.ensureConnected();\n\n const eventId = uuidv4();\n const action = eventType.split('.')[1]; // 'created', 'updated', 'deleted'\n const subject = `graph.${context.productName}.${entity.type}.${action}`;\n\n logger.debug('[GraphEventEmitterImpl] Publishing entity event', {\n eventId,\n eventType,\n entityId: entity.id,\n entityType: entity.type,\n subject,\n hasRbac: !!rbac,\n });\n\n // All graph events go to WSPACE_GRAPH_EVENTS stream (where graph-sync-consumer\n // and rbac-entity-consumer listen).\n const streamName = 'WSPACE_GRAPH_EVENTS';\n const streamSubjects = ['graph.>'];\n\n await this.publisher.publish({\n subject,\n data: {\n eventId,\n eventType,\n productSource: context.productName,\n organizationId: context.organizationId,\n entity,\n context: {\n actorId: context.actorId,\n workspaceId: context.workspaceId,\n },\n // Include RBAC metadata when configured (consumed by rbac-entity-consumer)\n ...(rbac && { rbac }),\n timestamp: new Date().toISOString(),\n },\n metadata: {\n eventId,\n productName: context.productName,\n organizationId: context.organizationId,\n actorId: context.actorId,\n workspaceId: context.workspaceId,\n entityType: entity.type,\n entityId: entity.id,\n },\n options: {\n stream: streamName,\n streamSubjects,\n },\n });\n }\n\n /**\n * Disconnect the publisher\n */\n async disconnect(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info('[GraphEventEmitterImpl] Publisher disconnected');\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Singleton instance\n */\nlet _graphEventEmitter: GraphEventEmitterImpl | null = null;\n\n/**\n * Get or create the graph event emitter singleton\n *\n * @returns Graph event emitter instance\n */\nexport function getGraphEventEmitter(): GraphEventEmitter {\n if (!_graphEventEmitter) {\n _graphEventEmitter = new GraphEventEmitterImpl();\n }\n return _graphEventEmitter;\n}\n\n/**\n * Create a new graph event emitter instance (non-singleton)\n *\n * @returns New graph event emitter instance\n */\nexport function createGraphEventEmitter(): GraphEventEmitter {\n return new GraphEventEmitterImpl();\n}\n\n/**\n * Reset the singleton (for testing)\n */\nexport async function resetGraphEventEmitter(): Promise<void> {\n if (_graphEventEmitter) {\n await _graphEventEmitter.disconnect();\n _graphEventEmitter = null;\n }\n}\n"]}
|