@conduitplatform/module-tools 0.17.0-alpha.3 → 0.17.0-alpha.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.15_typescript@6.0.3_yaml@2.9.0/node_modules/tsup/assets/esm_shims.js","../src/classes/ConduitActiveSchema.ts","../src/helpers/TypeHelpers.ts","../src/helpers/GrpcHelper.ts","../src/helpers/wrapGrpcFunctions.ts","../src/helpers/GrpcToParsedRouterRequest.ts","../src/classes/GrpcServer.ts","../src/classes/ConduitServiceModule.ts","../src/routing/RouteBuilder.ts","../src/routing/wrapRouterFunctions.ts","../src/routing/RoutingUtilities.ts","../src/routing/RoutingManager.ts","../src/classes/ConfigController.ts","../src/ManagedModule.ts","../src/interfaces/ModuleLifecycleStage.ts","../src/utilities/initializeSdk.ts","../src/logging/index.ts","../src/utilities/linearBackoffTimeout.ts","../src/metrics/index.ts","../src/metrics/MetricsServer.ts","../src/metrics/config/defaults.ts","../src/metrics/clientMiddleware.ts","../src/utilities/merge.ts","../src/utilities/exportHelpers.ts","../src/utilities/conduitPeers.ts","../src/utilities/convictConfigParser.ts","../src/routing/RoutingController.ts","../src/classes/ModuleError.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import {\n AuthzOptions,\n ConduitModel,\n ConduitSchema,\n ConduitSchemaOptions,\n CountDocumentsOptions,\n DatabaseProvider,\n FindManyOptions,\n FindOneOptions,\n PopulateAuthzOptions,\n Query,\n} from '@conduitplatform/grpc-sdk';\n\nexport class ConduitActiveSchema<T> extends ConduitSchema {\n private readonly dbInstance: DatabaseProvider;\n\n constructor(\n dbInstance: DatabaseProvider,\n name: string,\n fields?: ConduitModel,\n modelOptions?: ConduitSchemaOptions,\n collectionName?: string,\n ) {\n super(name, fields ?? {}, modelOptions, collectionName);\n this.dbInstance = dbInstance;\n }\n\n findOne(query: Query<T>, options?: FindOneOptions): Promise<T | null> {\n return this.dbInstance.findOne<T>(this.name, query, options);\n }\n\n findMany(query: Query<T>, options?: FindManyOptions): Promise<T[]> {\n return this.dbInstance.findMany<T>(this.name, query, options);\n }\n\n create(query: Query<T>, options?: AuthzOptions): Promise<T> {\n return this.dbInstance.create<T>(this.name, query, options);\n }\n\n createMany(query: Query<T>[], options?: AuthzOptions): Promise<T[]> {\n return this.dbInstance.createMany<T>(this.name, query, options);\n }\n\n findByIdAndUpdate(\n id: string,\n document: Query<T>,\n options?: PopulateAuthzOptions,\n ): Promise<T | null> {\n return this.dbInstance.findByIdAndUpdate<T>(this.name, id, document, options);\n }\n\n findByIdAndReplace(\n id: string,\n document: Query<T>,\n options?: PopulateAuthzOptions,\n ): Promise<T | null> {\n return this.dbInstance.findByIdAndReplace<T>(this.name, id, document, options);\n }\n\n replaceOne(filterQuery: Query<T>, query: Query<T>, options?: PopulateAuthzOptions) {\n return this.dbInstance.replaceOne(this.name, filterQuery, query, options);\n }\n\n updateOne(filterQuery: Query<T>, query: Query<T>, options?: PopulateAuthzOptions) {\n return this.dbInstance.updateOne(this.name, filterQuery, query, options);\n }\n\n updateMany(filterQuery: Query<T>, query: Query<T>, options?: PopulateAuthzOptions) {\n return this.dbInstance.updateMany(this.name, filterQuery, query, options);\n }\n\n deleteOne(query: Query<T>, options?: AuthzOptions) {\n return this.dbInstance.deleteOne(this.name, query, options);\n }\n\n deleteMany(query: Query<T>, options?: AuthzOptions) {\n return this.dbInstance.deleteMany(this.name, query, options);\n }\n\n countDocuments(query: Query<T>, options?: CountDocumentsOptions): Promise<number> {\n return this.dbInstance.countDocuments(this.name, query, options);\n }\n}\n","import {\n TYPE,\n ConduitNumberValidation,\n ConduitStringValidation,\n} from '@conduitplatform/grpc-sdk';\n\nclass ConduitStringConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.String {\n return TYPE.String;\n }\n\n static get Required(): { type: TYPE.String; required: true } {\n return { type: TYPE.String, required: true };\n }\n\n static RequiredWith(rules: ConduitStringValidation): {\n type: TYPE.String;\n required: true;\n validate: ConduitStringValidation;\n } {\n return { type: TYPE.String, required: true, validate: rules };\n }\n\n static OptionalWith(rules: ConduitStringValidation): {\n type: TYPE.String;\n required: false;\n validate: ConduitStringValidation;\n } {\n return { type: TYPE.String, required: false, validate: rules };\n }\n}\n\nexport const ConduitString = ConduitStringConstructor;\n\nclass ConduitNumberConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.Number {\n return TYPE.Number;\n }\n\n static get Required(): { type: TYPE.Number; required: true } {\n return { type: TYPE.Number, required: true };\n }\n\n static RequiredWith(rules: ConduitNumberValidation): {\n type: TYPE.Number;\n required: true;\n validate: ConduitNumberValidation;\n } {\n return { type: TYPE.Number, required: true, validate: rules };\n }\n\n static OptionalWith(rules: ConduitNumberValidation): {\n type: TYPE.Number;\n required: false;\n validate: ConduitNumberValidation;\n } {\n return { type: TYPE.Number, required: false, validate: rules };\n }\n}\n\nexport const ConduitNumber = ConduitNumberConstructor;\n\nclass ConduitBooleanConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.Boolean {\n return TYPE.Boolean;\n }\n\n static get Required(): { type: TYPE.Boolean; required: true } {\n return { type: TYPE.Boolean, required: true };\n }\n}\n\nexport const ConduitBoolean = ConduitBooleanConstructor;\n\nclass ConduitDateConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.Date {\n return TYPE.Date;\n }\n\n static get Required(): { type: TYPE.Date; required: true } {\n return { type: TYPE.Date, required: true };\n }\n}\n\nexport const ConduitDate = ConduitDateConstructor;\n\nclass ConduitObjectIdConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.ObjectId {\n return TYPE.ObjectId;\n }\n\n static get Required(): { type: TYPE.ObjectId; required: true } {\n return { type: TYPE.ObjectId, required: true };\n }\n}\n\nexport const ConduitObjectId = ConduitObjectIdConstructor;\n\nclass ConduitJSONConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.JSON {\n return TYPE.JSON;\n }\n\n static get Required(): { type: TYPE.JSON; required: true } {\n return { type: TYPE.JSON, required: true };\n }\n}\n\nexport const ConduitJson = ConduitJSONConstructor;\n\nclass ConduitRelationConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static Optional(model: string): {\n type: TYPE.Relation;\n model: string;\n required: false;\n } {\n return { type: TYPE.Relation, model, required: false };\n }\n\n static Required(model: string): { type: TYPE.Relation; model: string; required: true } {\n return { type: TYPE.Relation, model, required: true };\n }\n}\n\nexport const ConduitRelation = ConduitRelationConstructor;\n","import {\n loadPackageDefinition,\n Server,\n ServerCredentials,\n UntypedServiceImplementation,\n} from '@grpc/grpc-js';\n\nimport protoLoader from '@grpc/proto-loader';\n\nexport function createServer(port: string): Promise<{ server: Server; port: number }> {\n const grpcServer: Server = new Server({\n 'grpc.max_receive_message_length': 1024 * 1024 * 100,\n 'grpc.max_send_message_length': 1024 * 1024 * 100,\n });\n return new Promise((resolve, reject) => {\n grpcServer.bindAsync(port, ServerCredentials.createInsecure(), (err, port) => {\n if (err) {\n reject(err);\n } else {\n resolve({\n server: grpcServer,\n port,\n });\n }\n });\n });\n}\n\nexport function addServiceToServer(\n server: Server,\n protoPath: string,\n descriptorObject: string,\n functions: { [name: string]: Function },\n) {\n const packageDefinition = protoLoader.loadSync(protoPath, {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true,\n });\n const protoDescriptor = loadPackageDefinition(packageDefinition);\n const objs = descriptorObject.split('.');\n let descObj: any = protoDescriptor;\n objs.forEach((r: string) => {\n descObj = descObj[r] as any;\n });\n\n server.addService(descObj.service, functions as UntypedServiceImplementation);\n}\n","import { createVerifier } from 'fast-jwt';\nimport { status } from '@grpc/grpc-js';\nimport { ConduitGrpcSdk, GrpcCallback } from '@conduitplatform/grpc-sdk';\n\ninterface JWT {\n moduleName: string;\n iat: number;\n}\n\nexport function wrapGrpcFunctions(\n functions: { [name: string]: Function },\n postponeRestart: () => void,\n noAuth: boolean = false,\n) {\n const grpcKey = process.env.GRPC_KEY;\n const wrappedFunctions: { [name: string]: Function } = {};\n Object.keys(functions).forEach(name => {\n wrappedFunctions[name] = (call: any, callback: any) => {\n ConduitGrpcSdk.Metrics?.increment('internal_grpc_requests_total');\n postponeRestart();\n if (grpcKey && !noAuth) {\n const verify = createVerifier({ key: grpcKey });\n const grpcToken = call.metadata.get('grpc-token')[0];\n if (!grpcToken) {\n return throwError(\n callback,\n 'No gRPC protection token provided',\n status.PERMISSION_DENIED,\n );\n }\n try {\n const jwt: JWT = verify(grpcToken);\n call.metadata.set('module-name', jwt.moduleName);\n } catch {\n return throwError(\n callback,\n 'Failed to verify gRPC protection token. GRPC_KEY value differs',\n status.PERMISSION_DENIED,\n );\n }\n }\n let invoked: any | Promise<any>;\n try {\n invoked = functions[name](call, callback);\n } catch (error) {\n return throwError(callback, (error as Error).message);\n }\n if (typeof invoked?.then === 'function') {\n invoked.then().catch((error: Error) => {\n return throwError(callback, error.message);\n });\n }\n };\n });\n return wrappedFunctions;\n}\n\nfunction throwError(\n callback: GrpcCallback<any> | undefined,\n message: string,\n code: status = status.INTERNAL,\n) {\n // Aborting server streams is not yet implemented!\n if (callback) {\n callback({ code, message });\n }\n}\n","import { Context, Cookies, Params, ParsedRouterRequest } from '@conduitplatform/grpc-sdk';\n\nexport function createParsedRouterRequest(\n params: Params,\n urlParams?: Params,\n queryParams?: Params,\n bodyParams?: Params,\n path?: string,\n headers?: Headers,\n context?: Context,\n cookies?: Cookies,\n): ParsedRouterRequest {\n return <ParsedRouterRequest>{\n request: {\n params,\n urlParams: urlParams ?? {},\n queryParams: queryParams ?? {},\n bodyParams: bodyParams ?? {},\n path: path ?? '',\n headers: headers,\n context: context ?? {},\n cookies: cookies ?? {},\n },\n };\n}\n","import { addServiceToServer, createServer, wrapGrpcFunctions } from '../helpers/index.js';\nimport { Server } from '@grpc/grpc-js';\nimport { isNil } from 'lodash-es';\nimport { ConduitGrpcSdk } from '@conduitplatform/grpc-sdk';\n\nexport class GrpcServer {\n private grpcServer?: Server;\n private started: boolean = false;\n private startedOnce: boolean = false;\n private _serviceNames: string[] = [];\n private scheduledRestart: any;\n private _postponeRequests = 0;\n private _useForce?: boolean;\n private _services: {\n protoPath: string;\n protoDescription: string;\n functions: { [name: string]: Function };\n }[] = [];\n\n constructor(port?: string) {\n this._url = `0.0.0.0:${port ?? '5000'}`;\n }\n\n public async waitForReady() {\n while (!isNil(this.scheduledRestart)) {\n await this.wait(200);\n }\n }\n\n private _url: string;\n\n get url(): string {\n return this._url;\n }\n\n async createNewServer(useForce: boolean = false): Promise<number> {\n if (isNil(this._useForce)) {\n this._useForce = useForce;\n }\n const serverResult = await createServer(this._url);\n this.grpcServer = serverResult.server;\n this._url = this._url.split(':')[0] + ':' + serverResult.port.toString();\n return serverResult.port;\n }\n\n async addService(\n protoPath: string,\n protoDescription: string,\n functions: { [name: string]: Function },\n noAuth: boolean = false,\n ): Promise<GrpcServer> {\n functions = wrapGrpcFunctions(functions, this.postponeRestart.bind(this), noAuth);\n if (this._serviceNames.indexOf(protoDescription) !== -1) {\n ConduitGrpcSdk.Logger.log('Service already exists, performing replace');\n this._services[this._serviceNames.indexOf(protoDescription)] = {\n protoPath,\n protoDescription,\n functions,\n };\n this.scheduleRefresh();\n return this;\n } else {\n this._services.push({ protoPath, protoDescription, functions });\n this._serviceNames.push(protoDescription);\n if (this.started) {\n ConduitGrpcSdk.Logger.log('Server already started, scheduling refresh..');\n this.scheduleRefresh();\n return this;\n } else {\n if (!this.grpcServer) {\n await this.wait(1000);\n }\n addServiceToServer(this.grpcServer!, protoPath, protoDescription, functions);\n return this;\n }\n }\n }\n\n async wait(time: number) {\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n clearTimeout(timeout);\n resolve();\n }, time);\n });\n }\n\n async refresh(): Promise<void> {\n if (this.started) {\n this.started = false;\n if (this._useForce) {\n this.grpcServer!.forceShutdown();\n } else {\n //gracefully shutdown so that there are no service disruption\n await new Promise<void>(resolve => this.grpcServer!.tryShutdown(() => resolve()));\n }\n }\n await this.createNewServer();\n this._services.forEach(service => {\n addServiceToServer(\n this.grpcServer!,\n service.protoPath,\n service.protoDescription,\n service.functions,\n );\n });\n if (!this.started && this.startedOnce) {\n this.grpcServer!.start();\n this.started = true;\n }\n }\n\n scheduleRefresh() {\n if (this.scheduledRestart) {\n clearTimeout(this.scheduledRestart);\n }\n const self = this;\n this.scheduledRestart = setTimeout(async () => {\n ConduitGrpcSdk.Logger.log('Begin refresh');\n await self.refresh();\n ConduitGrpcSdk.Logger.log('Refresh complete');\n clearTimeout(self.scheduledRestart);\n self.scheduledRestart = undefined;\n self._postponeRequests = 0;\n }, 2000);\n }\n\n start(): void {\n if (this.started) {\n ConduitGrpcSdk.Logger.error('gRPC server is already running!');\n return;\n } else if (!this.started && this.startedOnce) {\n ConduitGrpcSdk.Logger.error('gRPC server is down for refresh!');\n }\n this.started = true;\n this.startedOnce = true;\n this.grpcServer?.start();\n }\n\n private postponeRestart() {\n if (!this.scheduledRestart || this._postponeRequests > 5) return;\n this._postponeRequests++;\n this.scheduleRefresh();\n }\n}\n","import path from 'path';\nimport { EventEmitter } from 'events';\nimport { camelCase } from 'lodash-es';\nimport { status } from '@grpc/grpc-js';\nimport { ServerWritableStream } from '@grpc/grpc-js';\nimport { GrpcServer } from './GrpcServer.js';\nimport {\n ConduitGrpcSdk,\n GrpcCallback,\n GrpcRequest,\n GrpcResponse,\n HealthCheckRequest,\n HealthCheckResponse,\n HealthCheckResponse_ServingStatus,\n HealthCheckStatus,\n SetConfigRequest,\n SetConfigResponse,\n GetExportableResourcesRequest,\n GetExportableResourcesResponse,\n ExportResourcesRequest,\n ExportResourcesResponse,\n ImportResourcesRequest,\n ImportResourcesResponse,\n} from '@conduitplatform/grpc-sdk';\nimport { RoutingManager } from '../routing/index.js';\nimport type {\n ExportableResource,\n ExportResult,\n ImportResult,\n} from '../interfaces/ResourceExporter.js';\n\nexport abstract class ConduitServiceModule {\n protected readonly _moduleName: string;\n protected _serviceName?: string;\n protected _address!: string; // external address:port of service (LoadBalancer)\n protected grpcServer!: GrpcServer;\n protected readonly events: EventEmitter = new EventEmitter();\n private _serviceHealthState: HealthCheckStatus = HealthCheckStatus.SERVING; // default for health-agnostic modules\n\n protected constructor(moduleName: string) {\n this._moduleName = camelCase(moduleName);\n }\n\n private _registered = false;\n set registered(registered: boolean) {\n this._registered = registered;\n }\n\n protected _port!: string; // port to bring up gRPC service\n\n get port(): string {\n return this._port;\n }\n\n private _grpcSdk: ConduitGrpcSdk | undefined;\n\n public get grpcSdk(): ConduitGrpcSdk {\n if (!this._grpcSdk) throw new Error('grpcSdk not defined yet');\n return this._grpcSdk;\n }\n\n public set grpcSdk(grpcSdk: ConduitGrpcSdk) {\n if (this._grpcSdk) throw new Error('grpcSdk already defined');\n this._grpcSdk = grpcSdk;\n }\n\n get healthState() {\n return this._serviceHealthState;\n }\n\n updateHealth(state: HealthCheckStatus, init = false) {\n if (\n (state === HealthCheckStatus.UNKNOWN && !init) ||\n state === HealthCheckStatus.SERVICE_UNKNOWN\n ) {\n throw new Error(\n `Cannot explicitly set gRPC health state to ${HealthCheckStatus[state]}`,\n );\n }\n if (!init) {\n ConduitGrpcSdk.Metrics?.set(\n 'module_health_state',\n state === HealthCheckStatus.SERVING ? 1 : 0,\n );\n }\n if (init) {\n this._serviceHealthState = state;\n return;\n }\n if (this._serviceHealthState !== state) {\n this._serviceHealthState = state;\n // do not emit health updates until registered\n if (this._registered) {\n this.events.emit(`grpc-health-change:${this._serviceName}`, state);\n this._grpcSdk?.config.moduleHealthProbe(this._moduleName, this._address);\n }\n }\n }\n\n healthCheck(\n call: GrpcRequest<HealthCheckRequest>,\n callback: GrpcCallback<HealthCheckResponse>,\n ) {\n const service = call.request.service.substring(call.request.service.indexOf('.') + 1);\n if (service && service !== this._serviceName) {\n callback(null, {\n status:\n HealthCheckStatus.SERVICE_UNKNOWN as unknown as HealthCheckResponse_ServingStatus,\n });\n } else {\n if (!this._registered) {\n return callback(null, {\n status: HealthCheckResponse_ServingStatus.UNKNOWN,\n });\n }\n callback(null, {\n status: this._serviceHealthState as unknown as HealthCheckResponse_ServingStatus,\n });\n }\n }\n\n healthWatch(call: ServerWritableStream<HealthCheckRequest, HealthCheckResponse>) {\n const service = call.request.service.substring(call.request.service.indexOf('.') + 1);\n if (service && service !== this._serviceName) {\n call.write({\n status:\n HealthCheckStatus.SERVICE_UNKNOWN as unknown as HealthCheckResponse_ServingStatus,\n });\n } else {\n this.events.on(\n `grpc-health-change:${this._serviceName}`,\n (status: HealthCheckStatus) => {\n call.write({\n status: status as unknown as HealthCheckResponse_ServingStatus,\n });\n },\n );\n }\n }\n\n abstract setConfig(\n call: GrpcRequest<SetConfigRequest>,\n callback: GrpcResponse<SetConfigResponse>,\n ): Promise<void>;\n\n /** Override to declare which resource types this module can export/import. Default: none. */\n protected getExportableResources(): ExportableResource[] {\n return [];\n }\n\n /** Override to export resources. resourceTypes empty = export all. Default: empty. */\n protected async exportResources(_resourceTypes: string[]): Promise<ExportResult> {\n return {};\n }\n\n /** Override to import resources. Default: no-op. */\n protected async importResources(_resources: ExportResult): Promise<ImportResult> {\n return {};\n }\n\n protected getExportableResourcesHandler(\n _call: GrpcRequest<GetExportableResourcesRequest>,\n callback: GrpcResponse<GetExportableResourcesResponse>,\n ): void {\n try {\n const resources = this.getExportableResources();\n callback(null, { resources: JSON.stringify(resources) });\n } catch (e) {\n callback({ code: status.INTERNAL, message: (e as Error).message });\n }\n }\n\n protected async exportResourcesHandler(\n call: GrpcRequest<ExportResourcesRequest>,\n callback: GrpcResponse<ExportResourcesResponse>,\n ): Promise<void> {\n try {\n const resourceTypes = call.request.resourceTypes ?? [];\n const data = await this.exportResources(resourceTypes);\n callback(null, { data: JSON.stringify(data) });\n } catch (e) {\n callback({ code: status.INTERNAL, message: (e as Error).message });\n }\n }\n\n protected async importResourcesHandler(\n call: GrpcRequest<ImportResourcesRequest>,\n callback: GrpcResponse<ImportResourcesResponse>,\n ): Promise<void> {\n try {\n const data = JSON.parse(call.request.data) as ExportResult;\n const result = await this.importResources(data);\n callback(null, { result: JSON.stringify(result) });\n } catch (e) {\n const err = e as Error;\n if (err instanceof SyntaxError) {\n callback({\n code: status.INVALID_ARGUMENT,\n message: 'Invalid JSON in import data',\n });\n } else {\n callback({ code: status.INTERNAL, message: err.message });\n }\n }\n }\n\n protected async addHealthCheckService() {\n await this.grpcServer.addService(\n path.resolve(__dirname, './grpc_health_check.proto'),\n 'grpc.health.v1.Health',\n {\n Check: this.healthCheck.bind(this),\n Watch: this.healthWatch.bind(this),\n },\n true,\n );\n }\n\n protected async addModuleService() {\n await this.grpcServer.addService(\n path.resolve(__dirname, './module.proto'),\n 'conduit.module.v1.ConduitModule',\n {\n SetConfig: this.setConfig.bind(this),\n GetExportableResources: this.getExportableResourcesHandler.bind(this),\n ExportResources: this.exportResourcesHandler.bind(this),\n ImportResources: this.importResourcesHandler.bind(this),\n },\n );\n await this.grpcServer.addService(\n path.resolve(__dirname, './module.proto'),\n 'conduit.module.v1.ClientRouter',\n {\n Route: RoutingManager.ClientController.handleRequest.bind(\n RoutingManager.ClientController,\n ),\n SocketRoute: RoutingManager.ClientController.handleRequest.bind(\n RoutingManager.ClientController,\n ),\n },\n );\n await this.grpcServer.addService(\n path.resolve(__dirname, './module.proto'),\n 'conduit.module.v1.AdminRouter',\n {\n Route: RoutingManager.AdminController.handleRequest.bind(\n RoutingManager.AdminController,\n ),\n SocketRoute: RoutingManager.AdminController.handleRequest.bind(\n RoutingManager.AdminController,\n ),\n },\n );\n }\n}\n","import {\n ConduitModel,\n ConduitQueryParams,\n ConduitReturn,\n ConduitRoute,\n ConduitRouteActions,\n ConduitRouteOptions,\n ConduitRouteReturnDefinition,\n ConduitUrlParams,\n} from '@conduitplatform/grpc-sdk';\nimport { RoutingManager } from './RoutingManager.js';\nimport { RequestHandlers } from './wrapRouterFunctions.js';\n\nexport class RouteBuilder {\n private readonly _options!: ConduitRouteOptions;\n private _returns!: ConduitRouteReturnDefinition;\n private _handler!: RequestHandlers;\n\n constructor(private readonly manager?: RoutingManager) {\n this._options = {} as any;\n }\n\n method(action: ConduitRouteActions): RouteBuilder {\n this._options.action = action;\n return this;\n }\n\n name(name: string): RouteBuilder {\n this._options.name = name;\n return this;\n }\n\n description(description: string): RouteBuilder {\n this._options.description = description;\n return this;\n }\n\n cacheControl(cache: string): RouteBuilder {\n this._options.cacheControl = cache;\n return this;\n }\n\n middleware(middleware: string | string[], allowDuplicates = false): RouteBuilder {\n if (!Array.isArray(middleware)) {\n middleware = [middleware];\n }\n if (\n this._options.middlewares !== undefined &&\n this._options.middlewares?.length !== 0\n ) {\n if (allowDuplicates) {\n this._options.middlewares = this._options.middlewares?.concat(middleware);\n } else {\n // add to existing middlewares and filter out potential duplicates\n this._options.middlewares = this._options.middlewares?.concat(\n middleware.filter(mid => this._options.middlewares?.indexOf(mid) === -1),\n );\n }\n } else {\n this._options.middlewares = middleware;\n }\n return this;\n }\n\n path(path: string): RouteBuilder {\n this._options.path = path;\n return this;\n }\n\n queryParams(params: ConduitQueryParams): RouteBuilder {\n this._options.queryParams = params;\n return this;\n }\n\n urlParams(params: ConduitUrlParams): RouteBuilder {\n this._options.urlParams = params;\n return this;\n }\n\n bodyParams(params: ConduitModel): RouteBuilder {\n this._options.bodyParams = params;\n return this;\n }\n\n strictParams(strict: boolean): RouteBuilder {\n this._options.strictParams = strict;\n return this;\n }\n\n rateLimit(maxRequests: number, resetInterval: number): RouteBuilder {\n this._options.rateLimit = { maxRequests, resetInterval };\n return this;\n }\n\n return(name: string, fields: ConduitReturn): RouteBuilder {\n this._returns = new ConduitRouteReturnDefinition(name, fields);\n return this;\n }\n\n handler(fn: RequestHandlers): RouteBuilder {\n this._handler = fn;\n return this;\n }\n\n add() {\n if (!this.manager) throw new Error('Builder not setup with manager');\n if (!this._options) throw new Error('Cannot build route without options');\n if (!this._options.action) throw new Error('Cannot build route without action');\n if (!this._options.path) throw new Error('Cannot build route without action');\n if (!this._returns) throw new Error('Cannot build route without return');\n if (!this._handler) throw new Error('Cannot build route without handler');\n this.manager.route(this._options, this._returns, this._handler);\n }\n\n build(): ConduitRoute {\n if (!this._options) throw new Error('Cannot build route without options');\n if (!this._options.action) throw new Error('Cannot build route without action');\n if (!this._options.path) throw new Error('Cannot build route without action');\n if (!this._returns) throw new Error('Cannot build route without return');\n if (!this._handler) throw new Error('Cannot build route without handler');\n return {\n input: this._options,\n returnType: this._returns,\n handler: this._handler,\n };\n }\n}\n","import {\n ConduitGrpcSdk,\n ConduitRouteReturnDefinition,\n ConduitSocketParamTypes,\n Indexable,\n ParsedRouterRequest,\n ParsedSocketRequest,\n UnparsedRouterResponse,\n UnparsedSocketResponse,\n} from '@conduitplatform/grpc-sdk';\nimport { status } from '@grpc/grpc-js';\nimport { Status } from '@grpc/grpc-js/build/src/constants.js';\n\nexport type RouterRequestHandler = (\n call: ParsedRouterRequest,\n) => Promise<UnparsedRouterResponse>;\nexport type RouterRequestHandlerCallback = (\n call: ParsedRouterRequest,\n callback: (response: UnparsedRouterResponse) => void,\n) => Promise<UnparsedRouterResponse | undefined | void>;\nexport type SocketRequestHandler = (\n call: ParsedSocketRequest,\n) => Promise<UnparsedSocketResponse>;\nexport type SocketRequestHandlerCallback = (\n call: ParsedSocketRequest,\n callback: (response: UnparsedSocketResponse) => void,\n) => Promise<UnparsedSocketResponse | undefined | void>;\nexport type RequestHandlers = RouterRequestHandler | RouterRequestHandlerCallback;\nexport type SocketRequestHandlers = SocketRequestHandler | SocketRequestHandlerCallback;\nexport interface SocketEventHandler {\n params?: ConduitSocketParamTypes;\n returnType?: ConduitRouteReturnDefinition;\n handler: SocketRequestHandlers;\n}\n\nconst mapGrpcStatusToHttp = (code?: number): string => {\n if (!code) return '200 (OK)';\n switch (code) {\n case status.OK:\n return `200 (OK)`;\n case status.CANCELLED:\n return `499 (Cancelled)`;\n case status.INVALID_ARGUMENT:\n return `400 (Invalid Argument)`;\n case status.DEADLINE_EXCEEDED:\n return `504 (Deadline Exceeded)`;\n case status.NOT_FOUND:\n return `404 (Not Found)`;\n case status.ALREADY_EXISTS:\n return `409 (Already Exists)`;\n case status.PERMISSION_DENIED:\n return `403 (Permission Denied)`;\n case status.UNAUTHENTICATED:\n return `401 (Unauthenticated)`;\n case status.OUT_OF_RANGE:\n return `416 (Out of Range)`;\n case status.FAILED_PRECONDITION:\n return `412 (Failed Precondition)`;\n case status.ABORTED:\n return `409 (Aborted)`;\n case status.INTERNAL:\n return `416 (Internal)`;\n case status.UNAVAILABLE:\n return `503 (Service Unavailable)`;\n case status.DATA_LOSS:\n return `500 (Data Loss)`;\n default:\n return `500 (Unknown)`;\n }\n};\n\nfunction generateLog(\n routerType: string,\n routerRequest: boolean,\n requestReceive: number,\n call: Indexable,\n status?: Status,\n) {\n let log = '';\n const latency = Date.now() - requestReceive;\n if (routerRequest) {\n log += `(${routerType}) Request: ${call.request.path}`;\n } else {\n const socketReq = call.request as {\n event: string;\n socketId?: string;\n socket?: string;\n };\n const socketLabel = socketReq.socketId ?? socketReq.socket;\n log += `(${routerType}) Socket: ${socketReq.event} socket: ${socketLabel}`;\n }\n log += ` ${mapGrpcStatusToHttp(status) ?? '200'} ${latency}ms`;\n\n ConduitGrpcSdk.Logger.log(log);\n ConduitGrpcSdk.Metrics?.set('grpc_request_latency_seconds', latency / 1000);\n ConduitGrpcSdk.Metrics?.set(\n `${routerType}_grpc_request_latency_seconds`,\n latency / 1000,\n );\n\n const successStatus = !status || status.toString().startsWith('2');\n ConduitGrpcSdk.Metrics?.increment(`${routerType}_grpc_response_statuses_total`, 1, {\n success: successStatus ? 'true' : 'false',\n });\n}\n\nfunction parseRequestData(data?: string) {\n if (data && data.length !== 0) {\n return JSON.parse(data);\n } else {\n return {};\n }\n}\n\nfunction parseResponseData(\n r: any,\n routerRequest: boolean,\n requestReceive: number,\n call: any,\n callback: any,\n responded: { did: boolean },\n routerType: string,\n) {\n if (responded.did) return;\n responded.did = true;\n if (!r) {\n callback({\n code: status.INTERNAL,\n message: 'Handler did not return a response',\n });\n }\n if (routerRequest) {\n if (typeof r === 'string') {\n callback(null, { result: r });\n } else {\n let respObject;\n if (r.removeCookies || r.setCookies) {\n respObject = {\n removeCookies: r.removeCookies,\n setCookies: r.setCookies,\n };\n }\n if (r.result || r.redirect) {\n callback(null, {\n ...respObject,\n redirect: r.redirect ?? undefined,\n result: r.result\n ? typeof r.result === 'string'\n ? r.result\n : JSON.stringify(r.result)\n : undefined,\n });\n } else {\n callback(null, { ...respObject, result: JSON.stringify(r) });\n }\n }\n } else {\n if (r.hasOwnProperty('data')) r.data = JSON.stringify(r.data);\n callback(null, r);\n }\n generateLog(routerType, routerRequest, requestReceive, call, undefined);\n}\n\nexport function wrapRouterGrpcFunction(\n fun: RequestHandlers | SocketRequestHandlers,\n routerType: string,\n): (call: Indexable, callback: any) => void {\n return (call: any, callback: any) => {\n const requestReceive = Date.now();\n let routerRequest = true;\n ConduitGrpcSdk.Metrics?.increment(`${routerType}_grpc_requests_total`);\n try {\n call.request.context = parseRequestData(call.request.context);\n call.request.params = parseRequestData(call.request.params);\n call.request.cookies = parseRequestData(call.request.cookies);\n call.request.urlParams = parseRequestData(call.request.urlParams);\n call.request.queryParams = parseRequestData(call.request.queryParams);\n call.request.bodyParams = parseRequestData(call.request.bodyParams);\n\n routerRequest = !call.request.hasOwnProperty('event');\n if (routerRequest) {\n call.request.headers = parseRequestData(call.request.headers);\n }\n } catch (e) {\n ConduitGrpcSdk.Metrics?.increment(`${routerType}_grpc_errors_total`);\n generateLog(routerType, routerRequest, requestReceive, call, status.INTERNAL);\n ConduitGrpcSdk.Logger.error((e as Error).message ?? 'Something went wrong');\n return callback({\n code: status.INTERNAL,\n message: (e as Error).message ?? 'Something went wrong',\n });\n }\n\n const responded = { did: false };\n fun(call, r => {\n parseResponseData(\n r,\n routerRequest,\n requestReceive,\n call,\n callback,\n responded,\n routerType,\n );\n })\n .then(r =>\n parseResponseData(\n r,\n routerRequest,\n requestReceive,\n call,\n callback,\n responded,\n routerType,\n ),\n )\n .catch(error => {\n ConduitGrpcSdk.Metrics?.increment(`${routerType}_grpc_errors_total`);\n generateLog(\n routerType,\n routerRequest,\n requestReceive,\n call,\n error.code ?? status.INTERNAL,\n );\n ConduitGrpcSdk.Logger.error(\n error.debugLogInfo ?? error.message ?? 'Something went wrong',\n );\n callback({\n code: error.code ?? status.INTERNAL,\n message: error.details ?? error.message ?? 'Something went wrong',\n });\n });\n };\n}\n","import { Indexable } from '@conduitplatform/grpc-sdk';\nimport {\n RequestHandlers,\n SocketRequestHandlers,\n wrapRouterGrpcFunction,\n} from './wrapRouterFunctions.js';\n\nexport function wrapFunctionsAsync(\n functions: { [name: string]: RequestHandlers | SocketRequestHandlers },\n routerType: 'admin' | 'client',\n): {\n [name: string]: (call: Indexable, callback?: Indexable) => void;\n} {\n const modifiedFunctions: {\n [name: string]: (call: Indexable, callback?: Indexable) => void;\n } = {};\n Object.keys(functions).forEach(key => {\n modifiedFunctions[key] = wrapRouterGrpcFunction(functions[key], routerType);\n });\n return modifiedFunctions;\n}\n","import { RouteBuilder } from './RouteBuilder.js';\nimport {\n RequestHandlers,\n SocketEventHandler,\n SocketRequestHandlers,\n} from './wrapRouterFunctions.js';\nimport { wrapFunctionsAsync } from './RoutingUtilities.js';\nimport {\n Admin,\n ConduitMiddlewareOptions,\n ConduitRouteActions,\n ConduitRouteObject,\n ConduitRouteOptions,\n ConduitRouteReturnDefinition,\n ConduitSocketOptions,\n EventsProtoDescription,\n Router,\n SocketProtoDescription,\n} from '@conduitplatform/grpc-sdk';\nimport { GrpcServer } from '../classes/index.js';\nimport { RoutingController } from './RoutingController.js';\n\nexport class RoutingManager {\n private _moduleRoutes: {\n [key: string]: ConduitRouteObject | SocketProtoDescription;\n } = {};\n static ClientController: RoutingController;\n static AdminController: RoutingController;\n\n private _routeHandlers: {\n [key: string]: RequestHandlers | SocketRequestHandlers;\n } = {};\n private readonly isAdmin: boolean = false;\n\n constructor(\n private readonly _router: Router | Admin,\n private readonly _server: GrpcServer,\n ) {\n if (_router instanceof Admin) {\n this.isAdmin = true;\n }\n }\n\n get(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.GET).path(path);\n }\n\n post(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.POST).path(path);\n }\n\n delete(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.DELETE).path(path);\n }\n\n update(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.UPDATE).path(path);\n }\n\n patch(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.PATCH).path(path);\n }\n\n clear() {\n this._moduleRoutes = {};\n this._routeHandlers = {};\n }\n\n middleware(input: ConduitMiddlewareOptions, handler: RequestHandlers) {\n const routeObject: ConduitRouteObject = this.parseRouteObject({\n options: input,\n grpcFunction: input.name,\n }) as ConduitRouteObject;\n this._moduleRoutes[routeObject.grpcFunction] = routeObject;\n this._routeHandlers[routeObject.grpcFunction] = handler;\n }\n\n route(\n input: ConduitRouteOptions,\n type: ConduitRouteReturnDefinition,\n handler: RequestHandlers,\n ) {\n const routeObject: ConduitRouteObject = this.parseRouteObject({\n options: input,\n returns: {\n name: type.name,\n fields: JSON.stringify(type.fields),\n },\n grpcFunction: this.generateGrpcName(input),\n }) as ConduitRouteObject;\n this._moduleRoutes[routeObject.grpcFunction] = routeObject;\n this._routeHandlers[routeObject.grpcFunction] = handler;\n }\n\n socket(input: ConduitSocketOptions, events: Record<string, SocketEventHandler>) {\n const eventsObj: EventsProtoDescription = {};\n const routeObject: SocketProtoDescription = this.parseRouteObject({\n options: input,\n events: '',\n }) as SocketProtoDescription;\n let primary: string;\n Object.keys(events).forEach((eventName: string) => {\n if (!primary) primary = eventName;\n const event = events[eventName];\n eventsObj[eventName] = {\n grpcFunction: eventName,\n params: JSON.stringify(event.params),\n returns: {\n name: event.returnType?.name ?? '',\n fields: JSON.stringify(event.returnType?.fields),\n },\n };\n this._routeHandlers[eventName] = event.handler;\n });\n routeObject.events = JSON.stringify(eventsObj);\n\n this._moduleRoutes[primary!] = routeObject;\n }\n\n async registerRoutes() {\n if (Object.keys(this._routeHandlers).length === 0) return;\n const modifiedFunctions: {\n [name: string]: (call: any, callback: any) => void;\n } = wrapFunctionsAsync(this._routeHandlers, this.isAdmin ? 'admin' : 'client');\n if (this.isAdmin) {\n RoutingManager.AdminController.setRoutes(modifiedFunctions);\n } else {\n RoutingManager.ClientController.setRoutes(modifiedFunctions);\n }\n const paths = Object.values(this._moduleRoutes);\n return this._router.register(paths as unknown as any);\n }\n\n private generateGrpcName(options: ConduitRouteOptions) {\n if (options.name) {\n return options.name.charAt(0).toUpperCase() + options.name.slice(1);\n } else {\n const name =\n options.action.charAt(0) +\n options.action.slice(1).toLowerCase() +\n this.extractNameFromPath(options.path);\n return name.charAt(0).toUpperCase() + name.slice(1);\n }\n }\n\n private extractNameFromPath(path: string) {\n path = path.replace(/[-:]/g, '/');\n return path\n .split('/')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n }\n\n private parseRouteObject(\n routeObject: any,\n ): ConduitRouteObject | SocketProtoDescription {\n if (!routeObject.options.middlewares) {\n routeObject.options.middlewares = [];\n }\n for (const option in routeObject.options) {\n if (!routeObject.options.hasOwnProperty(option)) continue;\n if (option === 'middlewares' || option === 'errors') continue;\n if (\n typeof routeObject.options[option] === 'string' ||\n routeObject.options[option] instanceof String\n )\n continue;\n if (\n typeof routeObject.options[option] === 'boolean' ||\n routeObject.options[option] instanceof Boolean\n )\n continue;\n routeObject.options[option] = JSON.stringify(routeObject.options[option]);\n }\n return routeObject;\n }\n}\n","export class ConfigController {\n private static instance: ConfigController;\n\n private _config: any;\n\n get config() {\n // return copy of config and not the original object;\n return Object.assign({}, this._config);\n }\n\n set config(config: any) {\n this._config = config;\n }\n\n static getInstance(): ConfigController {\n if (!ConfigController.instance) {\n ConfigController.instance = new ConfigController();\n }\n return ConfigController.instance;\n }\n}\n","import { ConduitServiceModule, ConfigController, GrpcServer } from './classes/index.js';\nimport { kebabCase } from 'lodash-es';\nimport { status } from '@grpc/grpc-js';\nimport convict from 'convict';\nimport { ConduitService, ModuleLifecycleStage } from './interfaces/index.js';\nimport {\n ConduitGrpcSdk,\n GrpcRequest,\n GrpcResponse,\n SetConfigRequest,\n SetConfigResponse,\n} from '@conduitplatform/grpc-sdk';\nimport { initializeSdk, merge, readConduitPeersManifest } from './utilities/index.js';\nimport type { ConduitPeersManifest } from './utilities/conduitPeers.js';\nimport { convictConfigParser } from './utilities/convictConfigParser.js';\nimport { RoutingManager } from './routing/index.js';\nimport { RoutingController } from './routing/RoutingController.js';\n\nexport abstract class ManagedModule<T> extends ConduitServiceModule {\n readonly config?: convict.Config<T>;\n configOverride: boolean = false;\n service?: ConduitService;\n protected abstract readonly configSchema?: object;\n protected abstract readonly metricsSchema?: object;\n private readonly serviceAddress: string;\n private readonly servicePort: string;\n private _moduleState: ModuleLifecycleStage;\n private _declaredPeerWatchDisposers: (() => void)[] = [];\n private _cachedPeersManifest: ConduitPeersManifest | null | undefined;\n private _lastPeerBatchStates: Record<string, boolean> = {};\n private readonly _peerManifestRoot?: string;\n private _configInitialized = false;\n private _pendingConfigUpdates: string[] = [];\n private _processingConfig = false;\n\n protected constructor(moduleName: string, peerManifestRoot?: string) {\n super(moduleName);\n this._peerManifestRoot = peerManifestRoot;\n this._moduleState = ModuleLifecycleStage.CREATE_GRPC;\n if (!process.env.CONDUIT_SERVER) {\n throw new Error('CONDUIT_SERVER is undefined, specify Conduit server URL');\n }\n this.servicePort = process.env.GRPC_PORT ?? '5000';\n this.serviceAddress =\n // @compat (v0.15): SERVICE_IP -> SERVICE_URL\n process.env.SERVICE_URL || process.env.SERVICE_IP || '0.0.0.0:' + this.servicePort;\n try {\n this.grpcSdk = initializeSdk(process.env.CONDUIT_SERVER, this.name, true, () => {\n return this.healthState;\n });\n } catch (e) {\n throw new Error('Failed to initialize grpcSdk');\n }\n }\n\n get name() {\n return this._moduleName;\n }\n\n get address() {\n return this._address;\n }\n\n async start() {\n await this.grpcSdk.initialize();\n this.initialize(this.serviceAddress, this.servicePort);\n try {\n await this.preRegisterLifecycle();\n await this.grpcSdk.config.registerModule(this.name, this.address, this.healthState);\n } catch (err) {\n ConduitGrpcSdk.Logger.error('Failed to initialize server');\n ConduitGrpcSdk.Logger.error(err as Error);\n process.exit(-1);\n }\n await this.postRegisterLifecycle().catch((err: Error) => {\n ConduitGrpcSdk.Logger.error('Failed to activate module');\n ConduitGrpcSdk.Logger.error(err);\n process.exit(-1);\n });\n }\n\n /**\n * This is the first function triggered on module spin up.\n * @param address {string} external address:port of service (LoadBalancer)\n * @param port {string} port to bring up gRPC service\n */\n initialize(address: string, port: string) {\n this._address = address;\n this._port = port;\n if (this.configSchema) {\n (this.config as unknown) = convict(this.configSchema);\n }\n }\n\n /**\n * This is triggered before spinning up the Grpc Server\n * of the module. On this stage, the redis bus and state have\n * not yet been initialized, and only communications with Conduit core\n * have been established.\n */\n async preServerStart() {}\n\n /**\n * This is triggered right after Grpc Server start.\n * At this stage the core module will communicate with your service\n * for health checks, and the Bus and State management mechanics\n * are online and available.\n */\n async onServerStart() {}\n\n /**\n * Triggers right before registering the module with Conduit Core.\n */\n async preRegister() {}\n\n /**\n * Triggers when module has been registered with Conduit Core\n * This is the step where you should initialize your\n * module's general routing (admin or client) and any other operation,\n * that would require other modules being able to reach you\n */\n async onRegister() {}\n\n /**\n * This is triggered when the module receives new configuration.\n * At this step the configuration has not been checked yet,\n * and has only been parsed.\n * @param config\n */\n async preConfig(config: T) {\n return config;\n }\n\n /**\n * This is triggered when new configuration has been applied.\n * This happens either when changes are being made on the configuration,\n * or on module start up, where the config is recovered from the database.\n * In either case the configuration is now available through the\n * Config Controller of the sdk.\n */\n async onConfig() {}\n\n /**\n * Registers common and module-specific metric types.\n */\n async registerMetrics() {\n if (ConduitGrpcSdk.Metrics) {\n ConduitGrpcSdk.Metrics.initializeDefaultMetrics();\n if (this.metricsSchema) {\n Object.values(this.metricsSchema).forEach(metric => {\n ConduitGrpcSdk.Metrics!.registerMetric(metric.type, metric.config);\n });\n }\n }\n }\n\n /**\n * Initializes metric startup values.\n * Implemented by individual modules.\n */\n async initializeMetrics() {}\n\n protected getPeerManifestRoot(): string {\n return this._peerManifestRoot ?? process.cwd();\n }\n\n protected loadConduitPeersManifest(): ConduitPeersManifest | null {\n if (this._cachedPeersManifest === undefined) {\n this._cachedPeersManifest = readConduitPeersManifest(this.getPeerManifestRoot());\n }\n return this._cachedPeersManifest;\n }\n\n private validateDeclaredPeerNames(names: string[]): void {\n const known = new Set(this.grpcSdk.getKnownModuleNames());\n for (const n of names) {\n if (!known.has(n)) {\n ConduitGrpcSdk.Logger.warn(\n `Declared Conduit peer \"${n}\" is not a known built-in module (see ConduitGrpcSdk.getKnownModuleNames).`,\n );\n }\n }\n }\n\n protected async awaitPeersFromManifest(): Promise<void> {\n const manifest = this.loadConduitPeersManifest();\n const peers = manifest?.peers?.await;\n if (!peers?.length) return;\n this.validateDeclaredPeerNames(peers);\n await Promise.all(peers.map(m => this.grpcSdk.awaitPeer(m)));\n }\n\n protected registerDeclaredPeerWatches(): void {\n this.disposeDeclaredPeerWatches();\n const manifest = this.loadConduitPeersManifest();\n const watch = manifest?.peers?.watch;\n if (!watch?.length) return;\n this.validateDeclaredPeerNames(watch.map(w => w.module));\n const specs = watch.map(entry => ({\n module: entry.module,\n edge: entry.edge ?? 'rising',\n }));\n const dispose = this.grpcSdk.watchPeers(\n specs,\n statuses => {\n for (const [mod, s] of Object.entries(statuses)) {\n if (this._lastPeerBatchStates[mod] !== s) {\n this.onDeclaredPeerConnectionUpdate(mod, s);\n this._lastPeerBatchStates[mod] = s;\n }\n }\n },\n { debounceMs: 100, syncInitialState: true },\n );\n this._declaredPeerWatchDisposers.push(dispose);\n }\n\n protected disposeDeclaredPeerWatches(): void {\n for (const d of this._declaredPeerWatchDisposers) {\n d();\n }\n this._declaredPeerWatchDisposers = [];\n this._lastPeerBatchStates = {};\n }\n\n protected onDeclaredPeerConnectionUpdate(\n _moduleName: string,\n _serving: boolean,\n ): void {}\n\n async createGrpcServer() {\n this.grpcServer = new GrpcServer(this._port);\n this._port = (await this.grpcServer.createNewServer()).toString();\n }\n\n async startGrpcServer() {\n if (this.service) {\n this._serviceName = this.service.protoDescription.substring(\n this.service.protoDescription.indexOf('.') + 1,\n );\n await this.grpcServer.addService(\n this.service.protoPath,\n this.service.protoDescription,\n this.service.functions,\n );\n }\n RoutingManager.ClientController = new RoutingController();\n RoutingManager.AdminController = new RoutingController();\n await this.addHealthCheckService();\n await this.addModuleService();\n await this.grpcServer.start();\n ConduitGrpcSdk.Logger.log('gRPC server listening on ' + this._port);\n }\n\n async setConfig(\n call: GrpcRequest<SetConfigRequest>,\n callback: GrpcResponse<SetConfigResponse>,\n ) {\n try {\n if (!this.config) {\n return callback({\n code: status.INVALID_ARGUMENT,\n message: 'Module is not configurable',\n });\n }\n let config = JSON.parse(call.request.newConfig);\n config = merge(this.config.getProperties(), config);\n config = await this.preConfig(config);\n const previousConfig = this.config.getProperties();\n try {\n this.config.load(config).validate({\n allowed: 'warn',\n });\n config = this.config.getProperties();\n callback(null, { updatedConfig: JSON.stringify(config) });\n } catch (e) {\n (this.config as unknown) = convict(this.configSchema!);\n this.config.load(previousConfig);\n return callback({\n code: status.INVALID_ARGUMENT,\n message: 'Invalid configuration values: ' + (e as Error).message,\n });\n }\n const configJson = JSON.stringify(config);\n this._pendingConfigUpdates.push(configJson);\n await this._drainConfigQueue();\n this.grpcSdk.bus?.publish(kebabCase(this.name) + ':config:update', configJson);\n } catch (e) {\n return callback({ code: status.INTERNAL, message: (e as Error).message });\n }\n }\n\n /** Used to update the module's configuration on initial Redis/DB reconciliation. */\n async handleConfigSyncUpdate() {\n if (!this.config) return;\n this.grpcSdk.bus!.subscribe(\n `${kebabCase(this.name)}:config:update`,\n async (message: string) => {\n this._pendingConfigUpdates.push(message);\n await this._drainConfigQueue();\n },\n );\n }\n\n /** Serializes config updates; waits for initial lifecycle before draining. */\n private async _drainConfigQueue() {\n if (!this._configInitialized || this._processingConfig) return;\n this._processingConfig = true;\n try {\n while (this._pendingConfigUpdates.length > 0) {\n const message = this._pendingConfigUpdates.shift()!;\n ConfigController.getInstance().config = await this.preConfig(JSON.parse(message));\n await this.onConfig();\n }\n } finally {\n this._processingConfig = false;\n }\n }\n\n private async preRegisterLifecycle(): Promise<void> {\n await this.createGrpcServer();\n this._moduleState = ModuleLifecycleStage.PRE_SERVER_START;\n await this.preServerStart();\n await this.grpcSdk.initializeEventBus();\n await this.handleConfigSyncUpdate();\n await this.registerMetrics();\n await this.startGrpcServer();\n this._moduleState = ModuleLifecycleStage.SERVER_STARTED;\n await this.onServerStart();\n await this.initializeMetrics();\n this._moduleState = ModuleLifecycleStage.PRE_REGISTER;\n await this.preRegister();\n }\n\n private async postRegisterLifecycle(): Promise<void> {\n this._moduleState = ModuleLifecycleStage.POST_REGISTER;\n this.registered = true;\n await this.onRegister();\n if (this.config) {\n const configSchema = this.config.getSchema();\n\n let config: any = this.config.getProperties();\n config = await this.preConfig(config);\n\n config = await this.grpcSdk.config.configure(\n config,\n convictConfigParser(configSchema),\n this.configOverride,\n );\n\n ConfigController.getInstance();\n if (config) ConfigController.getInstance().config = config;\n if (!config || config.active || !config.hasOwnProperty('active'))\n await this.onConfig();\n }\n this._configInitialized = true;\n await this._drainConfigQueue();\n }\n}\n","export enum ModuleLifecycleStage {\n CREATE_GRPC = 'creat-grpc-server',\n PRE_SERVER_START = 'pre-grpc-start',\n SERVER_STARTED = 'grpc-server-started',\n PRE_REGISTER = 'pre-register',\n POST_REGISTER = 'post-register',\n}\n","import {\n ConduitGrpcSdk,\n HealthCheckStatus,\n IConduitLogger,\n} from '@conduitplatform/grpc-sdk';\nimport { ConduitLogger, setupLoki } from '../logging/index.js';\nimport winston from 'winston';\nimport path from 'path';\nimport { ConduitMetrics } from '../metrics/index.js';\nimport { clientMiddleware } from '../metrics/clientMiddleware.js';\n\nexport const initializeSdk = (\n coreUrl: string,\n moduleName: string,\n watchModules: boolean = true,\n serviceHealthStatusGetter: () => HealthCheckStatus = () => HealthCheckStatus.SERVING,\n) => {\n let logger: IConduitLogger;\n try {\n logger = new ConduitLogger([\n new winston.transports.File({\n filename: path.join(__dirname, '.logs/combined.log'),\n level: 'info',\n }),\n new winston.transports.File({\n filename: path.join(__dirname, '.logs/errors.log'),\n level: 'error',\n }),\n ]);\n } catch (e) {\n logger = new ConduitLogger();\n }\n const grpcSdk = new ConduitGrpcSdk(\n coreUrl,\n moduleName,\n watchModules,\n logger,\n serviceHealthStatusGetter,\n );\n setupLoki(grpcSdk.name, grpcSdk.instance).then();\n if (process.env.METRICS_PORT) {\n ConduitGrpcSdk.Metrics = new ConduitMetrics(grpcSdk.name, grpcSdk.instance);\n grpcSdk.addMiddleware(clientMiddleware());\n }\n return grpcSdk;\n};\n","import {\n ConduitGrpcSdk,\n IConduitLogger,\n Indexable,\n UntypedArray,\n} from '@conduitplatform/grpc-sdk';\nimport winston, { format, Logger } from 'winston';\nimport { isEmpty } from 'lodash-es';\nimport { get } from 'http';\nimport LokiTransport from 'winston-loki';\nimport { linearBackoffTimeoutAsync } from '../utilities/linearBackoffTimeout.js';\n\nconst processMeta = (meta: Indexable) => {\n if (Array.isArray(meta)) {\n return meta.reduce(\n (message: string, meta: Indexable) =>\n `${message} \\n ${JSON.stringify(meta, null, 2)}`,\n '',\n );\n } else {\n return JSON.stringify(meta, null, 2);\n }\n};\n\nconst createFormat = (logMeta: boolean = true) => {\n return format.combine(\n format.printf(info => {\n // This will customize the Error Message\n if (info.stack) {\n return `[${info.timestamp}] [${info.level.toUpperCase()}]: ${info.message} ${\n info.stack\n }`;\n }\n if (logMeta) {\n return `[${info.timestamp}] [${info.level.toUpperCase()}]: ${info.message} ${\n !isEmpty(info.meta) ? processMeta(info.meta as any) : ''\n }`;\n } else {\n return `[${info.timestamp}] [${info.level.toUpperCase()}]: ${info.message}`;\n }\n }),\n );\n};\nconst defaultTransport = new winston.transports.Console({\n level: 'debug',\n format: format.combine(\n format.prettyPrint(),\n format.errors({ stack: true }),\n format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n createFormat(false),\n format.colorize({\n all: true,\n }),\n ),\n});\n\nexport class ConduitLogger implements IConduitLogger {\n private readonly _winston: Logger;\n\n constructor(transports?: winston.transport[]) {\n this._winston = winston.createLogger({\n format: format.combine(\n format.prettyPrint(),\n format.errors({ stack: true }),\n format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n createFormat(),\n ),\n transports: transports ? [...transports, defaultTransport] : [defaultTransport],\n });\n }\n\n get winston() {\n return this._winston;\n }\n\n addTransport(transport: winston.transport) {\n this._winston.add(transport);\n }\n\n log(message: string, level: string = 'info'): Logger {\n return this._winston.log(level, message);\n }\n\n logObject(object: Indexable, message: string = '', level: string = 'info'): Logger {\n return this._winston.log(level, message, object);\n }\n\n info(message: string): Logger {\n return this._winston.info(message);\n }\n\n warn(message: string): Logger {\n return this._winston.warn(message);\n }\n\n error(message: string | Error, error?: Error | unknown): Logger {\n if (typeof message === 'object') {\n return this._winston.error(message);\n }\n return this._winston.error(message, error);\n }\n\n http(message: string): Logger {\n return this._winston.http(message);\n }\n\n verbose(message: string): Logger {\n return this._winston.verbose(message);\n }\n}\n\nasync function lokiReadyCheck(lokiUrl: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const data: UntypedArray = [];\n get(`${lokiUrl}/ready`, r => {\n r.on('data', chunk => data.push(chunk));\n r.on('end', () => {\n if (Buffer.concat(data).toString() === 'ready\\n') resolve();\n else reject(false);\n });\n }).on('error', err => {\n reject(err.message);\n });\n });\n}\n\nexport async function setupLoki(module: string, instance: string) {\n let lokiUrl = process.env.LOKI_URL;\n if (lokiUrl && lokiUrl !== '') {\n if (lokiUrl.endsWith('/')) lokiUrl = lokiUrl.slice(0, -1);\n const onTry = async () => {\n return await lokiReadyCheck(lokiUrl!)\n .then(() => {\n (ConduitGrpcSdk.Logger as IConduitLogger).addTransport(\n new LokiTransport({\n level: 'debug',\n host: lokiUrl!,\n batching: false,\n replaceTimestamp: true,\n labels: {\n module,\n instance,\n ...(process.env.CONDUIT_NAMESPACE && {\n namespace: process.env.CONDUIT_NAMESPACE,\n }),\n },\n }),\n );\n return false;\n })\n .catch(() => true); // retry\n };\n const onFailure = () => {\n ConduitGrpcSdk.Logger.error(`Failed to connect to Loki on '${lokiUrl}'`);\n };\n await linearBackoffTimeoutAsync(onTry, 250, 15, onFailure, true);\n }\n}\n","/**\n * Registers a timeout with linear backoff.\n * onFailure() only runs on rep exhaustion.\n * Timeout can be cleared through returned clear() or inside onTry().\n */\nimport { clearTimeout } from 'timers';\n\nexport function linearBackoffTimeout(\n onTry: (stop: () => void) => void,\n delay: number,\n reps?: number,\n onFailure?: () => void,\n) {\n const nextRep = () => reps === undefined || --reps > 0;\n let stopSignal = false;\n const stop = () => {\n stopSignal = true;\n };\n let timeout: NodeJS.Timeout | null;\n const invoker = async () => {\n if (stopSignal) {\n return timeout ? clearTimeout(timeout) : null;\n }\n delay = Math.floor(delay * 2);\n if (delay > 0 && nextRep()) {\n timeout = setTimeout(invoker, delay);\n onTry(stop);\n } else {\n timeout = null;\n onFailure && onFailure();\n }\n };\n timeout = setTimeout(invoker, delay);\n return {\n clear: () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n },\n };\n}\n\n/**\n * Registers a timeout with linear backoff.\n * onFailure() only runs on rep exhaustion.\n * @param {() => Promise<boolean>} onTry - Async handler, returns 'continue' boolean flag\n */\nexport async function linearBackoffTimeoutAsync(\n onTry: () => Promise<boolean>,\n delay: number,\n reps?: number,\n onFailure?: () => void | Promise<void>,\n startNow = false,\n) {\n const nextRep = () => reps === undefined || --reps > 0;\n const invoker = async () => {\n delay = Math.floor(delay * 2);\n if (delay > 0 && nextRep()) {\n if (await onTry()) setTimeout(invoker, delay);\n } else {\n onFailure && (await onFailure());\n }\n };\n setTimeout(invoker, startNow ? 0 : delay);\n}\n","import {\n collectDefaultMetrics,\n Counter,\n CounterConfiguration,\n Gauge,\n GaugeConfiguration,\n Histogram,\n HistogramConfiguration,\n LabelValues,\n MetricConfiguration,\n Registry,\n Summary,\n SummaryConfiguration,\n} from 'prom-client';\nimport { MetricsServer } from './MetricsServer.js';\nimport defaultMetrics from './config/defaults.js';\nimport { IConduitMetrics, MetricType } from '@conduitplatform/grpc-sdk';\n\nconst METRICS_PREFIX = 'cnd_';\n\nexport class ConduitMetrics implements IConduitMetrics {\n private readonly moduleName: string;\n private readonly instance: string;\n private readonly _registry: Registry;\n private _httpServer: MetricsServer;\n\n constructor(moduleName: string, instance: string) {\n this.moduleName = moduleName;\n this.instance = instance;\n this._registry = new Registry();\n this._registry.setDefaultLabels({\n module_name: this.moduleName,\n module_instance: this.instance,\n });\n this.collectDefaultMetrics();\n this._httpServer = new MetricsServer(moduleName, instance, this._registry);\n this._httpServer.initialize();\n }\n\n get registry() {\n return this._registry;\n }\n\n initializeDefaultMetrics() {\n for (const metric of Object.values(defaultMetrics)) {\n this.registerMetric(metric.type as unknown as MetricType, metric.config);\n }\n }\n\n registerMetric(type: MetricType, config: MetricConfiguration<string>) {\n if (this.getMetric(config.name)) return;\n const metricConfig = JSON.parse(JSON.stringify(config));\n metricConfig.name = this.addPrefix(config.name);\n switch (type) {\n case MetricType.Counter:\n this.createCounter(metricConfig as CounterConfiguration<any>);\n break;\n case MetricType.Gauge:\n this.createGauge(metricConfig as GaugeConfiguration<any>);\n break;\n case MetricType.Histogram:\n this.createHistogram(metricConfig as HistogramConfiguration<any>);\n break;\n case MetricType.Summary:\n this.createSummary(metricConfig as SummaryConfiguration<any>);\n break;\n }\n }\n\n collectDefaultMetrics() {\n collectDefaultMetrics({\n register: this._registry,\n prefix: METRICS_PREFIX,\n // probably not needed\n labels: {\n module_name: this.moduleName,\n instance_instance: this.instance,\n },\n });\n }\n\n createCounter(config: CounterConfiguration<any>) {\n return new Counter({\n ...config,\n name: this.addPrefix(config.name),\n registers: [this._registry],\n });\n }\n\n createSummary(config: SummaryConfiguration<any>) {\n return new Summary({\n ...config,\n name: this.addPrefix(config.name),\n registers: [this._registry],\n });\n }\n\n createHistogram(config: HistogramConfiguration<any>) {\n return new Histogram({\n ...config,\n name: this.addPrefix(config.name),\n registers: [this._registry],\n });\n }\n\n createGauge(config: GaugeConfiguration<any>) {\n return new Gauge({\n ...config,\n name: this.addPrefix(config.name),\n registers: [this._registry],\n });\n }\n\n getMetric(name: string) {\n return this._registry.getSingleMetric(this.addPrefix(name));\n }\n\n increment(metric: string, increment: number = 1, labels?: LabelValues<any>) {\n const metricInstance = this.getMetric(metric);\n if (!(metricInstance instanceof Counter) && !(metricInstance instanceof Gauge)) {\n throw new Error(`Metric ${metric} is not an incrementable metric`);\n }\n return labels\n ? metricInstance.labels({ ...labels }).inc(increment)\n : metricInstance.inc(increment);\n }\n\n decrement(metric: string, decrement: number = 1, labels?: LabelValues<any>) {\n const metricInstance = this.getMetric(metric);\n if (!(metricInstance instanceof Gauge)) {\n throw new Error(`Metric ${metric} is not a decrementable metric`);\n }\n return labels\n ? metricInstance.labels({ ...labels }).dec(decrement)\n : metricInstance.dec(decrement);\n }\n\n set(metric: string, value: number, labels?: LabelValues<any>) {\n const metricInstance = this.getMetric(metric);\n if (!(metricInstance instanceof Gauge)) {\n throw new Error(`Metric ${metric} is not a Gauge`);\n }\n return labels\n ? metricInstance.labels({ ...labels }).set(value)\n : metricInstance.set(value);\n }\n\n observe(metric: string, value: number, labels?: LabelValues<any>) {\n const metricInstance = this.getMetric(metric);\n if (!(metricInstance instanceof Histogram) && !(metricInstance instanceof Summary)) {\n throw new Error(`Metric ${metric} is not a Histogram`);\n }\n return labels\n ? metricInstance.labels({ ...labels }).observe(value)\n : metricInstance.observe(value);\n }\n\n private addPrefix(metric: string) {\n if (!metric.includes(METRICS_PREFIX)) {\n return `${METRICS_PREFIX}${metric}`;\n }\n return metric;\n }\n}\n","import { createServer, IncomingMessage, ServerResponse } from 'http';\nimport { Registry } from 'prom-client';\nimport { isNaN } from 'lodash-es';\nimport { ConduitGrpcSdk } from '@conduitplatform/grpc-sdk';\n\nexport class MetricsServer {\n private readonly moduleName: string;\n private readonly instance: string;\n private readonly Registry: Registry;\n\n constructor(moduleName: string, instance: string, registry: Registry) {\n this.moduleName = moduleName;\n this.instance = instance;\n this.Registry = registry;\n }\n\n initialize() {\n const port = this.getHttpPort();\n const url = '0.0.0.0:' + port.toString();\n const server = createServer(this.requestHandler.bind(this));\n\n server.listen(port, () => {\n ConduitGrpcSdk.Logger.info(`Metrics server listening on: ${url}`);\n });\n\n return server;\n }\n\n private async requestHandler(req: IncomingMessage, res: ServerResponse) {\n if (req.url === '/' && req.method === 'GET') {\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end(\n `Conduit Metrics for module: ${this.moduleName}, instance: ${this.instance}`,\n );\n } else if (req.url === '/metrics' && req.method === 'GET') {\n const metrics = await this.Registry.metrics();\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end(metrics);\n } else {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not Found');\n }\n }\n\n private getHttpPort() {\n const value = process.env['METRICS_PORT'];\n if (!value) {\n ConduitGrpcSdk.Logger.error(`Metrics HTTP port not set`);\n process.exit(-1);\n }\n const port = parseInt(value, 10);\n if (isNaN(port) || port < 1 || port > 65535) {\n ConduitGrpcSdk.Logger.error(`Invalid HTTP port value: ${port}`);\n process.exit(-1);\n }\n return port;\n }\n}\n","import { MetricType } from '@conduitplatform/grpc-sdk';\n\nexport default {\n internalGrpcRequests: {\n type: MetricType.Counter,\n config: {\n name: 'internal_grpc_requests_total',\n help: \"Tracks the total number of Conduit's internal gRPC requests\",\n },\n },\n clientGrpcRequests: {\n type: MetricType.Counter,\n config: {\n name: 'client_grpc_requests_total',\n help: 'Tracks the total number of the client gRPC requests',\n },\n },\n adminGrpcRequests: {\n type: MetricType.Counter,\n config: {\n name: 'admin_grpc_requests_total',\n help: 'Tracks the total number of the admin gRPC requests',\n },\n },\n clientGrpcErrors: {\n type: MetricType.Counter,\n config: {\n name: 'client_grpc_errors_total',\n help: 'Tracks the total number of client grpc errors',\n },\n },\n adminGrpcErrors: {\n type: MetricType.Counter,\n config: {\n name: 'admin_grpc_errors_total',\n help: 'Tracks the total number of admin grpc errors',\n },\n },\n moduleHealthState: {\n type: MetricType.Gauge,\n config: {\n name: 'module_health_state',\n help: 'Tracks the health state of the module',\n },\n },\n grpcRequestLatency: {\n type: MetricType.Gauge,\n config: {\n name: 'grpc_request_latency_seconds',\n help: 'Tracks the latency of grpc requests in seconds',\n },\n },\n adminGrpcRequestLatency: {\n type: MetricType.Gauge,\n config: {\n name: 'admin_grpc_request_latency_seconds',\n help: 'Tracks the latency of admin grpc requests in seconds',\n },\n },\n clientGrpcRequestLatency: {\n type: MetricType.Gauge,\n config: {\n name: 'client_grpc_request_latency_seconds',\n help: 'Tracks the latency of client grpc requests in seconds',\n },\n },\n grpcResponseStatuses: {\n type: MetricType.Counter,\n config: {\n name: 'grpc_response_statuses_total',\n help: 'Tracks the total number of grpc response codes',\n labelNames: ['success'],\n },\n },\n adminGrpcResponseStatuses: {\n type: MetricType.Counter,\n config: {\n name: 'admin_grpc_response_statuses_total',\n help: 'Tracks the total number of admin grpc response codes',\n labelNames: ['success'],\n },\n },\n clientGrpcResponseStatuses: {\n type: MetricType.Counter,\n config: {\n name: 'client_grpc_response_statuses_total',\n help: 'Tracks the total number of client grpc response codes',\n labelNames: ['success'],\n },\n },\n};\n","// Forked from nice-grpc-prometheus\nimport { isAbortError } from 'abort-controller-x';\nimport {\n CallOptions,\n ClientError,\n ClientMiddleware,\n ClientMiddlewareCall,\n MethodDescriptor,\n Status,\n} from 'nice-grpc-common';\nimport { Counter, exponentialBuckets, Histogram, Registry } from 'prom-client';\n\nconst registry = new Registry();\n\nconst typeLabel = 'grpc_type';\nconst serviceLabel = 'grpc_service';\nconst methodLabel = 'grpc_method';\nconst pathLabel = 'grpc_path';\nconst codeLabel = 'grpc_code';\n/**\n * 1ms, 4ms, 16ms, ..., ~1 hour in seconds\n */\nconst latencySecondsBuckets = exponentialBuckets(0.001, 4, 12);\n\nfunction getLabels(method: MethodDescriptor) {\n const callType = method.requestStream\n ? method.responseStream\n ? 'bidi_stream'\n : 'client_stream'\n : method.responseStream\n ? 'server_stream'\n : 'unary';\n const { path } = method;\n const [serviceName, methodName] = path.split('/').slice(1);\n return {\n [typeLabel]: callType,\n [serviceLabel]: serviceName,\n [methodLabel]: methodName,\n [pathLabel]: path,\n };\n}\n\nasync function* incrementStreamMessagesCounter<T>(\n iterable: AsyncIterable<T>,\n counter: Counter.Internal,\n): AsyncIterable<T> {\n for await (const item of iterable) {\n counter.inc();\n yield item;\n }\n}\n\nconst clientStartedMetric = new Counter({\n registers: [registry],\n name: 'cnd_grpc_client_started_total',\n help: 'Total number of RPCs started on the client.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel],\n});\n\nconst clientHandledMetric = new Counter({\n registers: [registry],\n name: 'cnd_grpc_client_handled_total',\n help: 'Total number of RPCs completed on the client, regardless of success or failure.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel, codeLabel],\n});\n\nconst clientStreamMsgReceivedMetric = new Counter({\n registers: [registry],\n name: 'cnd_grpc_client_msg_received_total',\n help: 'Total number of RPC stream messages received by the client.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel],\n});\n\nconst clientStreamMsgSentMetric = new Counter({\n registers: [registry],\n name: 'cnd_grpc_client_msg_sent_total',\n help: 'Total number of gRPC stream messages sent by the client.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel],\n});\n\nconst clientHandlingSecondsMetric = new Histogram({\n registers: [registry],\n name: 'grpc_client_handling_seconds',\n help: 'Histogram of response latency (seconds) of the gRPC until it is finished by the application.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel, codeLabel],\n buckets: latencySecondsBuckets,\n});\n\nexport function clientMiddleware(): ClientMiddleware {\n return async function* prometheusClientMiddlewareGenerator<Request, Response>(\n call: ClientMiddlewareCall<Request, Response>,\n options: CallOptions,\n ): AsyncGenerator<Response, Response | void, undefined> {\n const labels = getLabels(call.method);\n clientStartedMetric.inc(labels);\n const stopTimer = clientHandlingSecondsMetric.startTimer(labels);\n let settled = false;\n let status: Status = Status.OK;\n try {\n let request;\n if (!call.requestStream) {\n request = call.request;\n } else {\n request = incrementStreamMessagesCounter(\n call.request,\n clientStreamMsgSentMetric.labels(labels),\n );\n }\n if (!call.responseStream) {\n const response = yield* call.next(request, options);\n settled = true;\n return response;\n } else {\n yield* incrementStreamMessagesCounter(\n call.next(request, options),\n clientStreamMsgReceivedMetric.labels(labels),\n );\n settled = true;\n return;\n }\n } catch (err: unknown) {\n settled = true;\n if (err instanceof ClientError) {\n status = err.code;\n } else if (isAbortError(err)) {\n status = Status.ABORTED;\n } else {\n status = Status.UNKNOWN;\n }\n throw err;\n } finally {\n if (!settled) {\n status = Status.CANCELLED;\n }\n stopTimer({ [codeLabel]: Status[status] });\n clientHandledMetric.inc({\n ...labels,\n [codeLabel]: Status[status],\n });\n }\n };\n}\n","import { mergeWith as _mergeWith } from 'lodash-es';\n\nexport function merge<T extends object>(objA: T, objB: T) {\n const customizer = (objValue: unknown, srcValue: unknown) => {\n if (Array.isArray(objValue)) {\n // don't merge arrays\n return srcValue;\n }\n };\n return _mergeWith({}, objA, objB, customizer);\n}\n","/**\n * Reusable helpers for module export/import (GitOps).\n * Standardizes stripping internal fields and optional export/import flows.\n */\n\nimport type { ImportResultEntry } from '../interfaces/ResourceExporter.js';\n\n/** Fields removed from documents when exporting (so they are not versioned). */\nexport const DEFAULT_STRIP_FIELDS = ['_id', 'createdAt', 'updatedAt', '__v'] as const;\n\n/**\n * Removes internal and optionally extra fields from a single document.\n * Does not mutate the original if the result would differ.\n */\nexport function stripInternalFields(\n obj: Record<string, unknown>,\n additionalFields: string[] = [],\n): Record<string, unknown> {\n const strip = new Set([...DEFAULT_STRIP_FIELDS, ...additionalFields]);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (!strip.has(k)) out[k] = v;\n }\n return out;\n}\n\nexport interface SanitizeForExportOptions {\n /** Extra field names to remove (in addition to DEFAULT_STRIP_FIELDS). */\n excludeFields?: string[];\n}\n\n/**\n * Returns a copy of each document with internal fields stripped.\n * Use after fetching from DB to produce export-safe arrays.\n */\nexport function sanitizeDocumentsForExport<T extends Record<string, unknown>>(\n documents: T[],\n options: SanitizeForExportOptions = {},\n): Record<string, unknown>[] {\n const exclude = options.excludeFields ?? [];\n return documents.map(doc => stripInternalFields(doc, exclude));\n}\n\n/**\n * Minimal model interface for export: can return all records.\n */\nexport interface ExportModelAdapter {\n findMany(\n query?: Record<string, unknown>,\n options?: { select?: string },\n ): Promise<Record<string, unknown>[]>;\n}\n\n/**\n * Fetches all documents from the adapter and returns them with internal fields stripped.\n */\nexport async function exportModel(\n adapter: ExportModelAdapter,\n options: SanitizeForExportOptions & {\n query?: Record<string, unknown>;\n select?: string;\n } = {},\n): Promise<Record<string, unknown>[]> {\n const { query, select, excludeFields, ...rest } =\n options as SanitizeForExportOptions & {\n query?: Record<string, unknown>;\n select?: string;\n };\n const docs = await adapter.findMany(query ?? {}, select ? { select } : {});\n return sanitizeDocumentsForExport(docs, { excludeFields, ...rest });\n}\n\n/**\n * Minimal model interface for import: find by key, create, update.\n */\nexport interface ImportModelAdapter {\n keyField: string;\n findOne(query: Record<string, unknown>): Promise<Record<string, unknown> | null>;\n create(doc: Record<string, unknown>): Promise<Record<string, unknown>>;\n updateOne(\n filter: Record<string, unknown>,\n doc: Record<string, unknown>,\n ): Promise<unknown>;\n}\n\n/**\n * Upserts records by keyField. Returns counts and errors for ImportResultEntry.\n */\nexport async function importModel(\n adapter: ImportModelAdapter,\n records: Record<string, unknown>[],\n options: SanitizeForExportOptions = {},\n): Promise<ImportResultEntry> {\n const entry: ImportResultEntry = { created: 0, updated: 0, failed: 0, errors: [] };\n const keyField = adapter.keyField;\n\n for (const record of records) {\n const key = record[keyField];\n if (key == null || key === '') {\n entry.failed += 1;\n entry.errors.push(`Missing or empty key \"${keyField}\" in record`);\n continue;\n }\n\n try {\n const existing = await adapter.findOne({ [keyField]: key });\n const sanitized = stripInternalFields(record, options.excludeFields ?? []);\n\n if (existing) {\n await adapter.updateOne({ [keyField]: key }, sanitized);\n entry.updated += 1;\n } else {\n await adapter.create(sanitized);\n entry.created += 1;\n }\n } catch (err) {\n entry.failed += 1;\n entry.errors.push(`${String(key)}: ${(err as Error).message}`);\n }\n }\n\n return entry;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport type { PeerWatchEdge } from '@conduitplatform/grpc-sdk';\n\nexport interface ConduitPeerWatchEntry {\n module: string;\n edge?: PeerWatchEdge;\n}\n\n/** Optional `conduit.peers` block in a module `package.json`. */\nexport interface ConduitPeersManifest {\n peers?: {\n await?: string[];\n watch?: ConduitPeerWatchEntry[];\n };\n}\n\nexport interface ConduitPackageJson {\n name?: string;\n conduit?: ConduitPeersManifest;\n}\n\nexport function readConduitPeersManifest(\n moduleRootDir: string = process.cwd(),\n): ConduitPeersManifest | null {\n const pkgPath = path.join(moduleRootDir, 'package.json');\n if (!existsSync(pkgPath)) return null;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as ConduitPackageJson;\n if (!pkg.conduit?.peers) return null;\n return pkg.conduit;\n } catch (e) {\n console.warn(`[conduitPeers] Failed to parse ${pkgPath}: ${(e as Error).message}`);\n return null;\n }\n}\n","import { Indexable } from '@conduitplatform/grpc-sdk';\n\nexport const convictConfigParser = (config: Indexable) => {\n if (typeof config === 'object') {\n Object.keys(config).forEach(key => {\n if (key === '_cvtProperties') {\n config = convictConfigParser(config._cvtProperties);\n } else {\n config[key] = convictConfigParser(config[key]);\n }\n });\n }\n return config;\n};\n","import { GrpcCallback, GrpcRequest } from '@conduitplatform/grpc-sdk';\nimport { status } from '@grpc/grpc-js';\n\nexport class RoutingController {\n private _routeHandlers: {\n [key: string]: (call: any, callback: any) => void;\n } = {};\n\n handleRequest(call: GrpcRequest<any>, callback: GrpcCallback<any>) {\n if (this._routeHandlers[call.request.functionName]) {\n this._routeHandlers[call.request.functionName](call, callback);\n } else {\n callback({\n code: status.NOT_FOUND,\n message: 'Not found',\n });\n }\n }\n\n setRoutes(routes: { [key: string]: (call: any, callback: any) => void }) {\n this._routeHandlers = routes;\n }\n}\n","import { GrpcError, ModuleErrorDefinition } from '@conduitplatform/grpc-sdk';\n\nexport class ModuleError extends GrpcError {\n debugLogInfo?: string;\n\n constructor(errorDefinition: ModuleErrorDefinition, debugLogInfo?: string) {\n const { grpcCode, conduitCode, message } = errorDefinition;\n super(\n grpcCode,\n JSON.stringify({\n message,\n conduitCode: conduitCode,\n }),\n );\n if (debugLogInfo) this.debugLogInfo = debugLogInfo;\n }\n}\n"],"mappings":"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","names":["port","path","ConduitGrpcSdk","path","status","ConduitGrpcSdk","path","ConduitGrpcSdk","status","ConduitRouteActions","path","ConduitGrpcSdk","status","path","status","ModuleLifecycleStage","ConduitGrpcSdk","ConduitGrpcSdk","HealthCheckStatus","ConduitGrpcSdk","clearTimeout","meta","ConduitGrpcSdk","winston","path","createServer","ConduitGrpcSdk","registry","MetricType","Counter","Histogram","Registry","path","status","HealthCheckStatus","winston","path","ConduitGrpcSdk","path","status","ConduitGrpcSdk","status"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.15_typescript@6.0.3_yaml@2.9.0/node_modules/tsup/assets/esm_shims.js","../src/classes/ConduitActiveSchema.ts","../src/helpers/TypeHelpers.ts","../src/helpers/GrpcHelper.ts","../src/helpers/wrapGrpcFunctions.ts","../src/helpers/GrpcToParsedRouterRequest.ts","../src/classes/GrpcServer.ts","../src/classes/ConduitServiceModule.ts","../src/routing/RouteBuilder.ts","../src/routing/wrapRouterFunctions.ts","../src/routing/RoutingUtilities.ts","../src/routing/RoutingManager.ts","../src/classes/ConfigController.ts","../src/ManagedModule.ts","../src/interfaces/ModuleLifecycleStage.ts","../src/utilities/initializeSdk.ts","../src/logging/index.ts","../src/utilities/linearBackoffTimeout.ts","../src/metrics/index.ts","../src/metrics/MetricsServer.ts","../src/metrics/config/defaults.ts","../src/metrics/clientMiddleware.ts","../src/utilities/merge.ts","../src/utilities/exportHelpers.ts","../src/utilities/conduitPeers.ts","../src/utilities/convictConfigParser.ts","../src/utilities/redactSensitiveConfig.ts","../src/utilities/reconcileModuleConfig.ts","../src/routing/RoutingController.ts","../src/classes/ModuleError.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import {\n AuthzOptions,\n ConduitModel,\n ConduitSchema,\n ConduitSchemaOptions,\n CountDocumentsOptions,\n DatabaseProvider,\n FindManyOptions,\n FindOneOptions,\n PopulateAuthzOptions,\n Query,\n} from '@conduitplatform/grpc-sdk';\n\nexport class ConduitActiveSchema<T> extends ConduitSchema {\n private readonly dbInstance: DatabaseProvider;\n\n constructor(\n dbInstance: DatabaseProvider,\n name: string,\n fields?: ConduitModel,\n modelOptions?: ConduitSchemaOptions,\n collectionName?: string,\n ) {\n super(name, fields ?? {}, modelOptions, collectionName);\n this.dbInstance = dbInstance;\n }\n\n findOne(query: Query<T>, options?: FindOneOptions): Promise<T | null> {\n return this.dbInstance.findOne<T>(this.name, query, options);\n }\n\n findMany(query: Query<T>, options?: FindManyOptions): Promise<T[]> {\n return this.dbInstance.findMany<T>(this.name, query, options);\n }\n\n create(query: Query<T>, options?: AuthzOptions): Promise<T> {\n return this.dbInstance.create<T>(this.name, query, options);\n }\n\n createMany(query: Query<T>[], options?: AuthzOptions): Promise<T[]> {\n return this.dbInstance.createMany<T>(this.name, query, options);\n }\n\n findByIdAndUpdate(\n id: string,\n document: Query<T>,\n options?: PopulateAuthzOptions,\n ): Promise<T | null> {\n return this.dbInstance.findByIdAndUpdate<T>(this.name, id, document, options);\n }\n\n findByIdAndReplace(\n id: string,\n document: Query<T>,\n options?: PopulateAuthzOptions,\n ): Promise<T | null> {\n return this.dbInstance.findByIdAndReplace<T>(this.name, id, document, options);\n }\n\n replaceOne(filterQuery: Query<T>, query: Query<T>, options?: PopulateAuthzOptions) {\n return this.dbInstance.replaceOne(this.name, filterQuery, query, options);\n }\n\n updateOne(filterQuery: Query<T>, query: Query<T>, options?: PopulateAuthzOptions) {\n return this.dbInstance.updateOne(this.name, filterQuery, query, options);\n }\n\n updateMany(filterQuery: Query<T>, query: Query<T>, options?: PopulateAuthzOptions) {\n return this.dbInstance.updateMany(this.name, filterQuery, query, options);\n }\n\n deleteOne(query: Query<T>, options?: AuthzOptions) {\n return this.dbInstance.deleteOne(this.name, query, options);\n }\n\n deleteMany(query: Query<T>, options?: AuthzOptions) {\n return this.dbInstance.deleteMany(this.name, query, options);\n }\n\n countDocuments(query: Query<T>, options?: CountDocumentsOptions): Promise<number> {\n return this.dbInstance.countDocuments(this.name, query, options);\n }\n}\n","import {\n TYPE,\n ConduitNumberValidation,\n ConduitStringValidation,\n} from '@conduitplatform/grpc-sdk';\n\nclass ConduitStringConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.String {\n return TYPE.String;\n }\n\n static get Required(): { type: TYPE.String; required: true } {\n return { type: TYPE.String, required: true };\n }\n\n static RequiredWith(rules: ConduitStringValidation): {\n type: TYPE.String;\n required: true;\n validate: ConduitStringValidation;\n } {\n return { type: TYPE.String, required: true, validate: rules };\n }\n\n static OptionalWith(rules: ConduitStringValidation): {\n type: TYPE.String;\n required: false;\n validate: ConduitStringValidation;\n } {\n return { type: TYPE.String, required: false, validate: rules };\n }\n}\n\nexport const ConduitString = ConduitStringConstructor;\n\nclass ConduitNumberConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.Number {\n return TYPE.Number;\n }\n\n static get Required(): { type: TYPE.Number; required: true } {\n return { type: TYPE.Number, required: true };\n }\n\n static RequiredWith(rules: ConduitNumberValidation): {\n type: TYPE.Number;\n required: true;\n validate: ConduitNumberValidation;\n } {\n return { type: TYPE.Number, required: true, validate: rules };\n }\n\n static OptionalWith(rules: ConduitNumberValidation): {\n type: TYPE.Number;\n required: false;\n validate: ConduitNumberValidation;\n } {\n return { type: TYPE.Number, required: false, validate: rules };\n }\n}\n\nexport const ConduitNumber = ConduitNumberConstructor;\n\nclass ConduitBooleanConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.Boolean {\n return TYPE.Boolean;\n }\n\n static get Required(): { type: TYPE.Boolean; required: true } {\n return { type: TYPE.Boolean, required: true };\n }\n}\n\nexport const ConduitBoolean = ConduitBooleanConstructor;\n\nclass ConduitDateConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.Date {\n return TYPE.Date;\n }\n\n static get Required(): { type: TYPE.Date; required: true } {\n return { type: TYPE.Date, required: true };\n }\n}\n\nexport const ConduitDate = ConduitDateConstructor;\n\nclass ConduitObjectIdConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.ObjectId {\n return TYPE.ObjectId;\n }\n\n static get Required(): { type: TYPE.ObjectId; required: true } {\n return { type: TYPE.ObjectId, required: true };\n }\n}\n\nexport const ConduitObjectId = ConduitObjectIdConstructor;\n\nclass ConduitJSONConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static get Optional(): TYPE.JSON {\n return TYPE.JSON;\n }\n\n static get Required(): { type: TYPE.JSON; required: true } {\n return { type: TYPE.JSON, required: true };\n }\n}\n\nexport const ConduitJson = ConduitJSONConstructor;\n\nclass ConduitRelationConstructor {\n // private to disallow creating other instances of this type\n private constructor() {}\n\n static Optional(model: string): {\n type: TYPE.Relation;\n model: string;\n required: false;\n } {\n return { type: TYPE.Relation, model, required: false };\n }\n\n static Required(model: string): { type: TYPE.Relation; model: string; required: true } {\n return { type: TYPE.Relation, model, required: true };\n }\n}\n\nexport const ConduitRelation = ConduitRelationConstructor;\n","import {\n loadPackageDefinition,\n Server,\n ServerCredentials,\n UntypedServiceImplementation,\n} from '@grpc/grpc-js';\n\nimport protoLoader from '@grpc/proto-loader';\n\nexport function createServer(port: string): Promise<{ server: Server; port: number }> {\n const grpcServer: Server = new Server({\n 'grpc.max_receive_message_length': 1024 * 1024 * 100,\n 'grpc.max_send_message_length': 1024 * 1024 * 100,\n });\n return new Promise((resolve, reject) => {\n grpcServer.bindAsync(port, ServerCredentials.createInsecure(), (err, port) => {\n if (err) {\n reject(err);\n } else {\n resolve({\n server: grpcServer,\n port,\n });\n }\n });\n });\n}\n\nexport function addServiceToServer(\n server: Server,\n protoPath: string,\n descriptorObject: string,\n functions: { [name: string]: Function },\n) {\n const packageDefinition = protoLoader.loadSync(protoPath, {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true,\n });\n const protoDescriptor = loadPackageDefinition(packageDefinition);\n const objs = descriptorObject.split('.');\n let descObj: any = protoDescriptor;\n objs.forEach((r: string) => {\n descObj = descObj[r] as any;\n });\n\n server.addService(descObj.service, functions as UntypedServiceImplementation);\n}\n","import { createVerifier } from 'fast-jwt';\nimport { status } from '@grpc/grpc-js';\nimport { ConduitGrpcSdk, GrpcCallback, GrpcError } from '@conduitplatform/grpc-sdk';\n\ninterface JWT {\n moduleName: string;\n iat: number;\n}\n\nexport function wrapGrpcFunctions(\n functions: { [name: string]: Function },\n postponeRestart: () => void,\n noAuth: boolean = false,\n) {\n const grpcKey = process.env.GRPC_KEY;\n const wrappedFunctions: { [name: string]: Function } = {};\n Object.keys(functions).forEach(name => {\n wrappedFunctions[name] = (call: any, callback: any) => {\n ConduitGrpcSdk.Metrics?.increment('internal_grpc_requests_total');\n postponeRestart();\n if (grpcKey && !noAuth) {\n const verify = createVerifier({ key: grpcKey });\n const grpcToken = call.metadata.get('grpc-token')[0];\n if (!grpcToken) {\n return throwError(\n callback,\n 'No gRPC protection token provided',\n status.PERMISSION_DENIED,\n );\n }\n try {\n const jwt: JWT = verify(grpcToken);\n call.metadata.set('module-name', jwt.moduleName);\n } catch {\n return throwError(\n callback,\n 'Failed to verify gRPC protection token. GRPC_KEY value differs',\n status.PERMISSION_DENIED,\n );\n }\n }\n let invoked: any | Promise<any>;\n try {\n invoked = functions[name](call, callback);\n } catch (error) {\n return throwError(\n callback,\n (error as Error).message,\n error instanceof GrpcError ? error.code : status.INTERNAL,\n );\n }\n if (typeof invoked?.then === 'function') {\n invoked.then().catch((error: Error) => {\n return throwError(\n callback,\n error.message,\n error instanceof GrpcError ? error.code : status.INTERNAL,\n );\n });\n }\n };\n });\n return wrappedFunctions;\n}\n\nfunction throwError(\n callback: GrpcCallback<any> | undefined,\n message: string,\n code: status = status.INTERNAL,\n) {\n // Aborting server streams is not yet implemented!\n if (callback) {\n callback({ code, message });\n }\n}\n","import { Context, Cookies, Params, ParsedRouterRequest } from '@conduitplatform/grpc-sdk';\n\nexport function createParsedRouterRequest(\n params: Params,\n urlParams?: Params,\n queryParams?: Params,\n bodyParams?: Params,\n path?: string,\n headers?: Headers,\n context?: Context,\n cookies?: Cookies,\n rawHeaders?: string[],\n rawBody?: Buffer,\n): ParsedRouterRequest {\n return <ParsedRouterRequest>{\n request: {\n params,\n urlParams: urlParams ?? {},\n queryParams: queryParams ?? {},\n bodyParams: bodyParams ?? {},\n path: path ?? '',\n headers: headers,\n rawHeaders: rawHeaders ?? [],\n rawBody: rawBody ?? Buffer.alloc(0),\n context: context ?? {},\n cookies: cookies ?? {},\n },\n };\n}\n","import { addServiceToServer, createServer, wrapGrpcFunctions } from '../helpers/index.js';\nimport { Server } from '@grpc/grpc-js';\nimport { isNil } from 'lodash-es';\nimport { ConduitGrpcSdk } from '@conduitplatform/grpc-sdk';\n\nexport class GrpcServer {\n private grpcServer?: Server;\n private started: boolean = false;\n private startedOnce: boolean = false;\n private _serviceNames: string[] = [];\n private scheduledRestart: any;\n private _postponeRequests = 0;\n private _useForce?: boolean;\n private _services: {\n protoPath: string;\n protoDescription: string;\n functions: { [name: string]: Function };\n }[] = [];\n\n constructor(port?: string) {\n this._url = `0.0.0.0:${port ?? '5000'}`;\n }\n\n public async waitForReady() {\n while (!isNil(this.scheduledRestart)) {\n await this.wait(200);\n }\n }\n\n private _url: string;\n\n get url(): string {\n return this._url;\n }\n\n async createNewServer(useForce: boolean = false): Promise<number> {\n if (isNil(this._useForce)) {\n this._useForce = useForce;\n }\n const serverResult = await createServer(this._url);\n this.grpcServer = serverResult.server;\n this._url = this._url.split(':')[0] + ':' + serverResult.port.toString();\n return serverResult.port;\n }\n\n async addService(\n protoPath: string,\n protoDescription: string,\n functions: { [name: string]: Function },\n noAuth: boolean = false,\n ): Promise<GrpcServer> {\n functions = wrapGrpcFunctions(functions, this.postponeRestart.bind(this), noAuth);\n if (this._serviceNames.indexOf(protoDescription) !== -1) {\n ConduitGrpcSdk.Logger.log('Service already exists, performing replace');\n this._services[this._serviceNames.indexOf(protoDescription)] = {\n protoPath,\n protoDescription,\n functions,\n };\n this.scheduleRefresh();\n return this;\n } else {\n this._services.push({ protoPath, protoDescription, functions });\n this._serviceNames.push(protoDescription);\n if (this.started) {\n ConduitGrpcSdk.Logger.log('Server already started, scheduling refresh..');\n this.scheduleRefresh();\n return this;\n } else {\n if (!this.grpcServer) {\n await this.wait(1000);\n }\n addServiceToServer(this.grpcServer!, protoPath, protoDescription, functions);\n return this;\n }\n }\n }\n\n async wait(time: number) {\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n clearTimeout(timeout);\n resolve();\n }, time);\n });\n }\n\n async refresh(): Promise<void> {\n if (this.started) {\n this.started = false;\n if (this._useForce) {\n this.grpcServer!.forceShutdown();\n } else {\n //gracefully shutdown so that there are no service disruption\n await new Promise<void>(resolve => this.grpcServer!.tryShutdown(() => resolve()));\n }\n }\n await this.createNewServer();\n this._services.forEach(service => {\n addServiceToServer(\n this.grpcServer!,\n service.protoPath,\n service.protoDescription,\n service.functions,\n );\n });\n if (!this.started && this.startedOnce) {\n this.grpcServer!.start();\n this.started = true;\n }\n }\n\n scheduleRefresh() {\n if (this.scheduledRestart) {\n clearTimeout(this.scheduledRestart);\n }\n const self = this;\n this.scheduledRestart = setTimeout(async () => {\n ConduitGrpcSdk.Logger.log('Begin refresh');\n await self.refresh();\n ConduitGrpcSdk.Logger.log('Refresh complete');\n clearTimeout(self.scheduledRestart);\n self.scheduledRestart = undefined;\n self._postponeRequests = 0;\n }, 2000);\n }\n\n start(): void {\n if (this.started) {\n ConduitGrpcSdk.Logger.error('gRPC server is already running!');\n return;\n } else if (!this.started && this.startedOnce) {\n ConduitGrpcSdk.Logger.error('gRPC server is down for refresh!');\n }\n this.started = true;\n this.startedOnce = true;\n this.grpcServer?.start();\n }\n\n private postponeRestart() {\n if (!this.scheduledRestart || this._postponeRequests > 5) return;\n this._postponeRequests++;\n this.scheduleRefresh();\n }\n}\n","import path from 'path';\nimport { EventEmitter } from 'events';\nimport { camelCase } from 'lodash-es';\nimport { status } from '@grpc/grpc-js';\nimport { ServerWritableStream } from '@grpc/grpc-js';\nimport { GrpcServer } from './GrpcServer.js';\nimport {\n ConduitGrpcSdk,\n GrpcCallback,\n GrpcRequest,\n GrpcResponse,\n HealthCheckRequest,\n HealthCheckResponse,\n HealthCheckResponse_ServingStatus,\n HealthCheckStatus,\n SetConfigRequest,\n SetConfigResponse,\n GetExportableResourcesRequest,\n GetExportableResourcesResponse,\n ExportResourcesRequest,\n ExportResourcesResponse,\n ImportResourcesRequest,\n ImportResourcesResponse,\n} from '@conduitplatform/grpc-sdk';\nimport { RoutingManager } from '../routing/index.js';\nimport type {\n ExportableResource,\n ExportResult,\n ImportResult,\n} from '../interfaces/ResourceExporter.js';\n\nexport abstract class ConduitServiceModule {\n protected readonly _moduleName: string;\n protected _serviceName?: string;\n protected _address!: string; // external address:port of service (LoadBalancer)\n protected grpcServer!: GrpcServer;\n protected readonly events: EventEmitter = new EventEmitter();\n private _serviceHealthState: HealthCheckStatus = HealthCheckStatus.SERVING; // default for health-agnostic modules\n\n protected constructor(moduleName: string) {\n this._moduleName = camelCase(moduleName);\n }\n\n private _registered = false;\n set registered(registered: boolean) {\n this._registered = registered;\n }\n\n protected _port!: string; // port to bring up gRPC service\n\n get port(): string {\n return this._port;\n }\n\n private _grpcSdk: ConduitGrpcSdk | undefined;\n\n public get grpcSdk(): ConduitGrpcSdk {\n if (!this._grpcSdk) throw new Error('grpcSdk not defined yet');\n return this._grpcSdk;\n }\n\n public set grpcSdk(grpcSdk: ConduitGrpcSdk) {\n if (this._grpcSdk) throw new Error('grpcSdk already defined');\n this._grpcSdk = grpcSdk;\n }\n\n get healthState() {\n return this._serviceHealthState;\n }\n\n updateHealth(state: HealthCheckStatus, init = false) {\n if (\n (state === HealthCheckStatus.UNKNOWN && !init) ||\n state === HealthCheckStatus.SERVICE_UNKNOWN\n ) {\n throw new Error(\n `Cannot explicitly set gRPC health state to ${HealthCheckStatus[state]}`,\n );\n }\n if (!init) {\n ConduitGrpcSdk.Metrics?.set(\n 'module_health_state',\n state === HealthCheckStatus.SERVING ? 1 : 0,\n );\n }\n if (init) {\n this._serviceHealthState = state;\n return;\n }\n if (this._serviceHealthState !== state) {\n this._serviceHealthState = state;\n // do not emit health updates until registered\n if (this._registered) {\n this.events.emit(`grpc-health-change:${this._serviceName}`, state);\n this._grpcSdk?.config.moduleHealthProbe(this._moduleName, this._address);\n }\n }\n }\n\n healthCheck(\n call: GrpcRequest<HealthCheckRequest>,\n callback: GrpcCallback<HealthCheckResponse>,\n ) {\n const service = call.request.service.substring(call.request.service.indexOf('.') + 1);\n if (service && service !== this._serviceName) {\n callback(null, {\n status:\n HealthCheckStatus.SERVICE_UNKNOWN as unknown as HealthCheckResponse_ServingStatus,\n });\n } else {\n if (!this._registered) {\n return callback(null, {\n status: HealthCheckResponse_ServingStatus.UNKNOWN,\n });\n }\n callback(null, {\n status: this._serviceHealthState as unknown as HealthCheckResponse_ServingStatus,\n });\n }\n }\n\n healthWatch(call: ServerWritableStream<HealthCheckRequest, HealthCheckResponse>) {\n const service = call.request.service.substring(call.request.service.indexOf('.') + 1);\n if (service && service !== this._serviceName) {\n call.write({\n status:\n HealthCheckStatus.SERVICE_UNKNOWN as unknown as HealthCheckResponse_ServingStatus,\n });\n } else {\n this.events.on(\n `grpc-health-change:${this._serviceName}`,\n (status: HealthCheckStatus) => {\n call.write({\n status: status as unknown as HealthCheckResponse_ServingStatus,\n });\n },\n );\n }\n }\n\n abstract setConfig(\n call: GrpcRequest<SetConfigRequest>,\n callback: GrpcResponse<SetConfigResponse>,\n ): Promise<void>;\n\n /** Override to declare which resource types this module can export/import. Default: none. */\n protected getExportableResources(): ExportableResource[] {\n return [];\n }\n\n /** Override to export resources. resourceTypes empty = export all. Default: empty. */\n protected async exportResources(_resourceTypes: string[]): Promise<ExportResult> {\n return {};\n }\n\n /** Override to import resources. Default: no-op. */\n protected async importResources(_resources: ExportResult): Promise<ImportResult> {\n return {};\n }\n\n protected getExportableResourcesHandler(\n _call: GrpcRequest<GetExportableResourcesRequest>,\n callback: GrpcResponse<GetExportableResourcesResponse>,\n ): void {\n try {\n const resources = this.getExportableResources();\n callback(null, { resources: JSON.stringify(resources) });\n } catch (e) {\n callback({ code: status.INTERNAL, message: (e as Error).message });\n }\n }\n\n protected async exportResourcesHandler(\n call: GrpcRequest<ExportResourcesRequest>,\n callback: GrpcResponse<ExportResourcesResponse>,\n ): Promise<void> {\n try {\n const resourceTypes = call.request.resourceTypes ?? [];\n const data = await this.exportResources(resourceTypes);\n callback(null, { data: JSON.stringify(data) });\n } catch (e) {\n callback({ code: status.INTERNAL, message: (e as Error).message });\n }\n }\n\n protected async importResourcesHandler(\n call: GrpcRequest<ImportResourcesRequest>,\n callback: GrpcResponse<ImportResourcesResponse>,\n ): Promise<void> {\n try {\n const data = JSON.parse(call.request.data) as ExportResult;\n const result = await this.importResources(data);\n callback(null, { result: JSON.stringify(result) });\n } catch (e) {\n const err = e as Error;\n if (err instanceof SyntaxError) {\n callback({\n code: status.INVALID_ARGUMENT,\n message: 'Invalid JSON in import data',\n });\n } else {\n callback({ code: status.INTERNAL, message: err.message });\n }\n }\n }\n\n protected async addHealthCheckService() {\n await this.grpcServer.addService(\n path.resolve(__dirname, './grpc_health_check.proto'),\n 'grpc.health.v1.Health',\n {\n Check: this.healthCheck.bind(this),\n Watch: this.healthWatch.bind(this),\n },\n true,\n );\n }\n\n protected async addModuleService() {\n await this.grpcServer.addService(\n path.resolve(__dirname, './module.proto'),\n 'conduit.module.v1.ConduitModule',\n {\n SetConfig: this.setConfig.bind(this),\n GetExportableResources: this.getExportableResourcesHandler.bind(this),\n ExportResources: this.exportResourcesHandler.bind(this),\n ImportResources: this.importResourcesHandler.bind(this),\n },\n );\n await this.grpcServer.addService(\n path.resolve(__dirname, './module.proto'),\n 'conduit.module.v1.ClientRouter',\n {\n Route: RoutingManager.ClientController.handleRequest.bind(\n RoutingManager.ClientController,\n ),\n SocketRoute: RoutingManager.ClientController.handleRequest.bind(\n RoutingManager.ClientController,\n ),\n },\n );\n await this.grpcServer.addService(\n path.resolve(__dirname, './module.proto'),\n 'conduit.module.v1.AdminRouter',\n {\n Route: RoutingManager.AdminController.handleRequest.bind(\n RoutingManager.AdminController,\n ),\n SocketRoute: RoutingManager.AdminController.handleRequest.bind(\n RoutingManager.AdminController,\n ),\n },\n );\n }\n}\n","import {\n ConduitModel,\n ConduitQueryParams,\n ConduitReturn,\n ConduitRoute,\n ConduitRouteActions,\n ConduitRouteOptions,\n ConduitRouteReturnDefinition,\n ConduitUrlParams,\n} from '@conduitplatform/grpc-sdk';\nimport { RoutingManager } from './RoutingManager.js';\nimport { RequestHandlers } from './wrapRouterFunctions.js';\n\nexport class RouteBuilder {\n private readonly _options!: ConduitRouteOptions;\n private _returns!: ConduitRouteReturnDefinition;\n private _handler!: RequestHandlers;\n\n constructor(private readonly manager?: RoutingManager) {\n this._options = {} as any;\n }\n\n method(action: ConduitRouteActions): RouteBuilder {\n this._options.action = action;\n return this;\n }\n\n name(name: string): RouteBuilder {\n this._options.name = name;\n return this;\n }\n\n description(description: string): RouteBuilder {\n this._options.description = description;\n return this;\n }\n\n cacheControl(cache: string): RouteBuilder {\n this._options.cacheControl = cache;\n return this;\n }\n\n middleware(middleware: string | string[], allowDuplicates = false): RouteBuilder {\n if (!Array.isArray(middleware)) {\n middleware = [middleware];\n }\n if (\n this._options.middlewares !== undefined &&\n this._options.middlewares?.length !== 0\n ) {\n if (allowDuplicates) {\n this._options.middlewares = this._options.middlewares?.concat(middleware);\n } else {\n // add to existing middlewares and filter out potential duplicates\n this._options.middlewares = this._options.middlewares?.concat(\n middleware.filter(mid => this._options.middlewares?.indexOf(mid) === -1),\n );\n }\n } else {\n this._options.middlewares = middleware;\n }\n return this;\n }\n\n path(path: string): RouteBuilder {\n this._options.path = path;\n return this;\n }\n\n queryParams(params: ConduitQueryParams): RouteBuilder {\n this._options.queryParams = params;\n return this;\n }\n\n urlParams(params: ConduitUrlParams): RouteBuilder {\n this._options.urlParams = params;\n return this;\n }\n\n bodyParams(params: ConduitModel): RouteBuilder {\n this._options.bodyParams = params;\n return this;\n }\n\n strictParams(strict: boolean): RouteBuilder {\n this._options.strictParams = strict;\n return this;\n }\n\n rateLimit(maxRequests: number, resetInterval: number): RouteBuilder {\n this._options.rateLimit = { maxRequests, resetInterval };\n return this;\n }\n\n captureRawBody(capture: boolean): RouteBuilder {\n this._options.captureRawBody = capture;\n return this;\n }\n\n captureRawHeaders(capture: boolean): RouteBuilder {\n this._options.captureRawHeaders = capture;\n return this;\n }\n\n return(name: string, fields: ConduitReturn): RouteBuilder {\n this._returns = new ConduitRouteReturnDefinition(name, fields);\n return this;\n }\n\n handler(fn: RequestHandlers): RouteBuilder {\n this._handler = fn;\n return this;\n }\n\n add() {\n if (!this.manager) throw new Error('Builder not setup with manager');\n if (!this._options) throw new Error('Cannot build route without options');\n if (!this._options.action) throw new Error('Cannot build route without action');\n if (!this._options.path) throw new Error('Cannot build route without action');\n if (!this._returns) throw new Error('Cannot build route without return');\n if (!this._handler) throw new Error('Cannot build route without handler');\n this.manager.route(this._options, this._returns, this._handler);\n }\n\n build(): ConduitRoute {\n if (!this._options) throw new Error('Cannot build route without options');\n if (!this._options.action) throw new Error('Cannot build route without action');\n if (!this._options.path) throw new Error('Cannot build route without action');\n if (!this._returns) throw new Error('Cannot build route without return');\n if (!this._handler) throw new Error('Cannot build route without handler');\n return {\n input: this._options,\n returnType: this._returns,\n handler: this._handler,\n };\n }\n}\n","import {\n ConduitGrpcSdk,\n ConduitRouteReturnDefinition,\n ConduitSocketParamTypes,\n Indexable,\n ParsedRouterRequest,\n ParsedSocketRequest,\n UnparsedRouterResponse,\n UnparsedSocketResponse,\n} from '@conduitplatform/grpc-sdk';\nimport { status } from '@grpc/grpc-js';\nimport { Status } from '@grpc/grpc-js/build/src/constants.js';\n\nexport type RouterRequestHandler = (\n call: ParsedRouterRequest,\n) => Promise<UnparsedRouterResponse>;\nexport type RouterRequestHandlerCallback = (\n call: ParsedRouterRequest,\n callback: (response: UnparsedRouterResponse) => void,\n) => Promise<UnparsedRouterResponse | undefined | void>;\nexport type SocketRequestHandler = (\n call: ParsedSocketRequest,\n) => Promise<UnparsedSocketResponse>;\nexport type SocketRequestHandlerCallback = (\n call: ParsedSocketRequest,\n callback: (response: UnparsedSocketResponse) => void,\n) => Promise<UnparsedSocketResponse | undefined | void>;\nexport type RequestHandlers = RouterRequestHandler | RouterRequestHandlerCallback;\nexport type SocketRequestHandlers = SocketRequestHandler | SocketRequestHandlerCallback;\nexport interface SocketEventHandler {\n params?: ConduitSocketParamTypes;\n returnType?: ConduitRouteReturnDefinition;\n handler: SocketRequestHandlers;\n}\n\nconst mapGrpcStatusToHttp = (code?: number): string => {\n if (!code) return '200 (OK)';\n switch (code) {\n case status.OK:\n return `200 (OK)`;\n case status.CANCELLED:\n return `499 (Cancelled)`;\n case status.INVALID_ARGUMENT:\n return `400 (Invalid Argument)`;\n case status.DEADLINE_EXCEEDED:\n return `504 (Deadline Exceeded)`;\n case status.NOT_FOUND:\n return `404 (Not Found)`;\n case status.ALREADY_EXISTS:\n return `409 (Already Exists)`;\n case status.PERMISSION_DENIED:\n return `403 (Permission Denied)`;\n case status.UNAUTHENTICATED:\n return `401 (Unauthenticated)`;\n case status.OUT_OF_RANGE:\n return `416 (Out of Range)`;\n case status.FAILED_PRECONDITION:\n return `412 (Failed Precondition)`;\n case status.ABORTED:\n return `409 (Aborted)`;\n case status.INTERNAL:\n return `416 (Internal)`;\n case status.UNAVAILABLE:\n return `503 (Service Unavailable)`;\n case status.DATA_LOSS:\n return `500 (Data Loss)`;\n default:\n return `500 (Unknown)`;\n }\n};\n\nfunction generateLog(\n routerType: string,\n routerRequest: boolean,\n requestReceive: number,\n call: Indexable,\n status?: Status,\n) {\n let log = '';\n const latency = Date.now() - requestReceive;\n if (routerRequest) {\n log += `(${routerType}) Request: ${call.request.path}`;\n } else {\n const socketReq = call.request as {\n event: string;\n socketId?: string;\n socket?: string;\n };\n const socketLabel = socketReq.socketId ?? socketReq.socket;\n log += `(${routerType}) Socket: ${socketReq.event} socket: ${socketLabel}`;\n }\n log += ` ${mapGrpcStatusToHttp(status) ?? '200'} ${latency}ms`;\n\n ConduitGrpcSdk.Logger.log(log);\n ConduitGrpcSdk.Metrics?.set('grpc_request_latency_seconds', latency / 1000);\n ConduitGrpcSdk.Metrics?.set(\n `${routerType}_grpc_request_latency_seconds`,\n latency / 1000,\n );\n\n const successStatus = !status || status.toString().startsWith('2');\n ConduitGrpcSdk.Metrics?.increment(`${routerType}_grpc_response_statuses_total`, 1, {\n success: successStatus ? 'true' : 'false',\n });\n}\n\nfunction parseRequestData(data?: string) {\n if (data && data.length !== 0) {\n return JSON.parse(data);\n } else {\n return {};\n }\n}\n\nfunction parseResponseData(\n r: any,\n routerRequest: boolean,\n requestReceive: number,\n call: any,\n callback: any,\n responded: { did: boolean },\n routerType: string,\n) {\n if (responded.did) return;\n responded.did = true;\n if (!r) {\n callback({\n code: status.INTERNAL,\n message: 'Handler did not return a response',\n });\n }\n if (routerRequest) {\n if (typeof r === 'string') {\n callback(null, { result: r });\n } else {\n let respObject;\n if (r.removeCookies || r.setCookies) {\n respObject = {\n removeCookies: r.removeCookies,\n setCookies: r.setCookies,\n };\n }\n if (r.result || r.redirect) {\n callback(null, {\n ...respObject,\n redirect: r.redirect ?? undefined,\n result: r.result\n ? typeof r.result === 'string'\n ? r.result\n : JSON.stringify(r.result)\n : undefined,\n });\n } else {\n callback(null, { ...respObject, result: JSON.stringify(r) });\n }\n }\n } else {\n if (r.hasOwnProperty('data')) r.data = JSON.stringify(r.data);\n callback(null, r);\n }\n generateLog(routerType, routerRequest, requestReceive, call, undefined);\n}\n\nexport function wrapRouterGrpcFunction(\n fun: RequestHandlers | SocketRequestHandlers,\n routerType: string,\n): (call: Indexable, callback: any) => void {\n return (call: any, callback: any) => {\n const requestReceive = Date.now();\n let routerRequest = true;\n ConduitGrpcSdk.Metrics?.increment(`${routerType}_grpc_requests_total`);\n try {\n call.request.context = parseRequestData(call.request.context);\n call.request.params = parseRequestData(call.request.params);\n call.request.cookies = parseRequestData(call.request.cookies);\n call.request.urlParams = parseRequestData(call.request.urlParams);\n call.request.queryParams = parseRequestData(call.request.queryParams);\n call.request.bodyParams = parseRequestData(call.request.bodyParams);\n\n routerRequest = !call.request.hasOwnProperty('event');\n if (routerRequest) {\n call.request.headers = parseRequestData(call.request.headers);\n call.request.rawHeaders = call.request.rawHeaders\n ? JSON.parse(call.request.rawHeaders)\n : [];\n if (call.request.rawBody && !Buffer.isBuffer(call.request.rawBody)) {\n call.request.rawBody = Buffer.from(call.request.rawBody);\n } else if (!call.request.rawBody) {\n call.request.rawBody = Buffer.alloc(0);\n }\n }\n } catch (e) {\n ConduitGrpcSdk.Metrics?.increment(`${routerType}_grpc_errors_total`);\n generateLog(routerType, routerRequest, requestReceive, call, status.INTERNAL);\n ConduitGrpcSdk.Logger.error((e as Error).message ?? 'Something went wrong');\n return callback({\n code: status.INTERNAL,\n message: (e as Error).message ?? 'Something went wrong',\n });\n }\n\n const responded = { did: false };\n fun(call, r => {\n parseResponseData(\n r,\n routerRequest,\n requestReceive,\n call,\n callback,\n responded,\n routerType,\n );\n })\n .then(r =>\n parseResponseData(\n r,\n routerRequest,\n requestReceive,\n call,\n callback,\n responded,\n routerType,\n ),\n )\n .catch(error => {\n ConduitGrpcSdk.Metrics?.increment(`${routerType}_grpc_errors_total`);\n generateLog(\n routerType,\n routerRequest,\n requestReceive,\n call,\n error.code ?? status.INTERNAL,\n );\n ConduitGrpcSdk.Logger.error(\n error.debugLogInfo ?? error.message ?? 'Something went wrong',\n );\n callback({\n code: error.code ?? status.INTERNAL,\n message: error.details ?? error.message ?? 'Something went wrong',\n });\n });\n };\n}\n","import { Indexable } from '@conduitplatform/grpc-sdk';\nimport {\n RequestHandlers,\n SocketRequestHandlers,\n wrapRouterGrpcFunction,\n} from './wrapRouterFunctions.js';\n\nexport function wrapFunctionsAsync(\n functions: { [name: string]: RequestHandlers | SocketRequestHandlers },\n routerType: 'admin' | 'client',\n): {\n [name: string]: (call: Indexable, callback?: Indexable) => void;\n} {\n const modifiedFunctions: {\n [name: string]: (call: Indexable, callback?: Indexable) => void;\n } = {};\n Object.keys(functions).forEach(key => {\n modifiedFunctions[key] = wrapRouterGrpcFunction(functions[key], routerType);\n });\n return modifiedFunctions;\n}\n","import { RouteBuilder } from './RouteBuilder.js';\nimport {\n RequestHandlers,\n SocketEventHandler,\n SocketRequestHandlers,\n} from './wrapRouterFunctions.js';\nimport { wrapFunctionsAsync } from './RoutingUtilities.js';\nimport {\n Admin,\n ConduitMiddlewareOptions,\n ConduitRouteActions,\n ConduitRouteObject,\n ConduitRouteOptions,\n ConduitRouteReturnDefinition,\n ConduitSocketOptions,\n EventsProtoDescription,\n Router,\n SocketProtoDescription,\n} from '@conduitplatform/grpc-sdk';\nimport { GrpcServer } from '../classes/index.js';\nimport { RoutingController } from './RoutingController.js';\n\nexport class RoutingManager {\n private _moduleRoutes: {\n [key: string]: ConduitRouteObject | SocketProtoDescription;\n } = {};\n static ClientController: RoutingController;\n static AdminController: RoutingController;\n\n private _routeHandlers: {\n [key: string]: RequestHandlers | SocketRequestHandlers;\n } = {};\n private readonly isAdmin: boolean = false;\n\n constructor(\n private readonly _router: Router | Admin,\n private readonly _server: GrpcServer,\n ) {\n if (_router instanceof Admin) {\n this.isAdmin = true;\n }\n }\n\n get(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.GET).path(path);\n }\n\n post(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.POST).path(path);\n }\n\n delete(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.DELETE).path(path);\n }\n\n update(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.UPDATE).path(path);\n }\n\n patch(path: string): RouteBuilder {\n return new RouteBuilder(this).method(ConduitRouteActions.PATCH).path(path);\n }\n\n clear() {\n this._moduleRoutes = {};\n this._routeHandlers = {};\n }\n\n middleware(input: ConduitMiddlewareOptions, handler: RequestHandlers) {\n const routeObject: ConduitRouteObject = this.parseRouteObject({\n options: input,\n grpcFunction: input.name,\n }) as ConduitRouteObject;\n this._moduleRoutes[routeObject.grpcFunction] = routeObject;\n this._routeHandlers[routeObject.grpcFunction] = handler;\n }\n\n route(\n input: ConduitRouteOptions,\n type: ConduitRouteReturnDefinition,\n handler: RequestHandlers,\n ) {\n const routeObject: ConduitRouteObject = this.parseRouteObject({\n options: input,\n returns: {\n name: type.name,\n fields: JSON.stringify(type.fields),\n },\n grpcFunction: this.generateGrpcName(input),\n }) as ConduitRouteObject;\n this._moduleRoutes[routeObject.grpcFunction] = routeObject;\n this._routeHandlers[routeObject.grpcFunction] = handler;\n }\n\n socket(input: ConduitSocketOptions, events: Record<string, SocketEventHandler>) {\n const eventsObj: EventsProtoDescription = {};\n const routeObject: SocketProtoDescription = this.parseRouteObject({\n options: input,\n events: '',\n }) as SocketProtoDescription;\n let primary: string;\n Object.keys(events).forEach((eventName: string) => {\n if (!primary) primary = eventName;\n const event = events[eventName];\n eventsObj[eventName] = {\n grpcFunction: eventName,\n params: JSON.stringify(event.params),\n returns: {\n name: event.returnType?.name ?? '',\n fields: JSON.stringify(event.returnType?.fields),\n },\n };\n this._routeHandlers[eventName] = event.handler;\n });\n routeObject.events = JSON.stringify(eventsObj);\n\n this._moduleRoutes[primary!] = routeObject;\n }\n\n async registerRoutes() {\n if (Object.keys(this._routeHandlers).length === 0) return;\n const modifiedFunctions: {\n [name: string]: (call: any, callback: any) => void;\n } = wrapFunctionsAsync(this._routeHandlers, this.isAdmin ? 'admin' : 'client');\n if (this.isAdmin) {\n RoutingManager.AdminController.setRoutes(modifiedFunctions);\n } else {\n RoutingManager.ClientController.setRoutes(modifiedFunctions);\n }\n const paths = Object.values(this._moduleRoutes);\n return this._router.register(paths as unknown as any);\n }\n\n private generateGrpcName(options: ConduitRouteOptions) {\n if (options.name) {\n return options.name.charAt(0).toUpperCase() + options.name.slice(1);\n } else {\n const name =\n options.action.charAt(0) +\n options.action.slice(1).toLowerCase() +\n this.extractNameFromPath(options.path);\n return name.charAt(0).toUpperCase() + name.slice(1);\n }\n }\n\n private extractNameFromPath(path: string) {\n path = path.replace(/[-:]/g, '/');\n return path\n .split('/')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n }\n\n private parseRouteObject(\n routeObject: any,\n ): ConduitRouteObject | SocketProtoDescription {\n if (!routeObject.options.middlewares) {\n routeObject.options.middlewares = [];\n }\n for (const option in routeObject.options) {\n if (!routeObject.options.hasOwnProperty(option)) continue;\n if (option === 'middlewares' || option === 'errors') continue;\n if (\n typeof routeObject.options[option] === 'string' ||\n routeObject.options[option] instanceof String\n )\n continue;\n if (\n typeof routeObject.options[option] === 'boolean' ||\n routeObject.options[option] instanceof Boolean\n )\n continue;\n routeObject.options[option] = JSON.stringify(routeObject.options[option]);\n }\n return routeObject;\n }\n}\n","export class ConfigController {\n private static instance: ConfigController;\n\n private _config: any;\n\n get config() {\n // return copy of config and not the original object;\n return Object.assign({}, this._config);\n }\n\n set config(config: any) {\n this._config = config;\n }\n\n static getInstance(): ConfigController {\n if (!ConfigController.instance) {\n ConfigController.instance = new ConfigController();\n }\n return ConfigController.instance;\n }\n}\n","import { ConduitServiceModule, ConfigController, GrpcServer } from './classes/index.js';\nimport { kebabCase } from 'lodash-es';\nimport { status } from '@grpc/grpc-js';\nimport convict from 'convict';\nimport { ConduitService, ModuleLifecycleStage } from './interfaces/index.js';\nimport {\n ConduitGrpcSdk,\n GrpcRequest,\n GrpcResponse,\n SetConfigRequest,\n SetConfigResponse,\n} from '@conduitplatform/grpc-sdk';\nimport { initializeSdk, merge, readConduitPeersManifest } from './utilities/index.js';\nimport type { ConduitPeersManifest } from './utilities/conduitPeers.js';\nimport { convictConfigParser } from './utilities/convictConfigParser.js';\nimport { reconcileStoredModuleConfig } from './utilities/reconcileModuleConfig.js';\nimport { restoreRedactedSecrets } from './utilities/redactSensitiveConfig.js';\nimport { RoutingManager } from './routing/index.js';\nimport { RoutingController } from './routing/RoutingController.js';\n\nexport abstract class ManagedModule<T> extends ConduitServiceModule {\n readonly config?: convict.Config<T>;\n configOverride: boolean = false;\n service?: ConduitService;\n protected abstract readonly configSchema?: object;\n protected abstract readonly metricsSchema?: object;\n private readonly serviceAddress: string;\n private readonly servicePort: string;\n private _moduleState: ModuleLifecycleStage;\n private _declaredPeerWatchDisposers: (() => void)[] = [];\n private _cachedPeersManifest: ConduitPeersManifest | null | undefined;\n private _lastPeerBatchStates: Record<string, boolean> = {};\n private readonly _peerManifestRoot?: string;\n private _configInitialized = false;\n private _pendingConfigUpdates: string[] = [];\n private _processingConfig = false;\n\n protected constructor(moduleName: string, peerManifestRoot?: string) {\n super(moduleName);\n this._peerManifestRoot = peerManifestRoot;\n this._moduleState = ModuleLifecycleStage.CREATE_GRPC;\n if (!process.env.CONDUIT_SERVER) {\n throw new Error('CONDUIT_SERVER is undefined, specify Conduit server URL');\n }\n this.servicePort = process.env.GRPC_PORT ?? '5000';\n this.serviceAddress =\n // @compat (v0.15): SERVICE_IP -> SERVICE_URL\n process.env.SERVICE_URL || process.env.SERVICE_IP || '0.0.0.0:' + this.servicePort;\n try {\n this.grpcSdk = initializeSdk(process.env.CONDUIT_SERVER, this.name, true, () => {\n return this.healthState;\n });\n } catch (e) {\n throw new Error('Failed to initialize grpcSdk');\n }\n }\n\n protected get configInitialized() {\n return this._configInitialized;\n }\n\n get name() {\n return this._moduleName;\n }\n\n get address() {\n return this._address;\n }\n\n async start() {\n await this.grpcSdk.initialize();\n this.initialize(this.serviceAddress, this.servicePort);\n try {\n await this.preRegisterLifecycle();\n await this.grpcSdk.config.registerModule(this.name, this.address, this.healthState);\n } catch (err) {\n ConduitGrpcSdk.Logger.error('Failed to initialize server');\n ConduitGrpcSdk.Logger.error(err as Error);\n process.exit(-1);\n }\n await this.postRegisterLifecycle().catch((err: Error) => {\n ConduitGrpcSdk.Logger.error('Failed to activate module');\n ConduitGrpcSdk.Logger.error(err);\n process.exit(-1);\n });\n }\n\n /**\n * This is the first function triggered on module spin up.\n * @param address {string} external address:port of service (LoadBalancer)\n * @param port {string} port to bring up gRPC service\n */\n initialize(address: string, port: string) {\n this._address = address;\n this._port = port;\n if (this.configSchema) {\n (this.config as unknown) = convict(this.configSchema);\n }\n }\n\n /**\n * This is triggered before spinning up the Grpc Server\n * of the module. On this stage, the redis bus and state have\n * not yet been initialized, and only communications with Conduit core\n * have been established.\n */\n async preServerStart() {}\n\n /**\n * This is triggered right after Grpc Server start.\n * At this stage the core module will communicate with your service\n * for health checks, and the Bus and State management mechanics\n * are online and available.\n */\n async onServerStart() {}\n\n /**\n * Triggers right before registering the module with Conduit Core.\n */\n async preRegister() {}\n\n /**\n * Triggers when module has been registered with Conduit Core\n * This is the step where you should initialize your\n * module's general routing (admin or client) and any other operation,\n * that would require other modules being able to reach you\n */\n async onRegister() {}\n\n /**\n * This is triggered when the module receives new configuration.\n * At this step the configuration has not been checked yet,\n * and has only been parsed.\n * @param config\n */\n async preConfig(config: T) {\n return config;\n }\n\n /**\n * This is triggered when new configuration has been applied.\n * This happens either when changes are being made on the configuration,\n * or on module start up, where the config is recovered from the database.\n * In either case the configuration is now available through the\n * Config Controller of the sdk.\n */\n async onConfig() {}\n\n /**\n * Registers common and module-specific metric types.\n */\n async registerMetrics() {\n if (ConduitGrpcSdk.Metrics) {\n ConduitGrpcSdk.Metrics.initializeDefaultMetrics();\n if (this.metricsSchema) {\n Object.values(this.metricsSchema).forEach(metric => {\n ConduitGrpcSdk.Metrics!.registerMetric(metric.type, metric.config);\n });\n }\n }\n }\n\n /**\n * Initializes metric startup values.\n * Implemented by individual modules.\n */\n async initializeMetrics() {}\n\n protected getPeerManifestRoot(): string {\n return this._peerManifestRoot ?? process.cwd();\n }\n\n protected loadConduitPeersManifest(): ConduitPeersManifest | null {\n if (this._cachedPeersManifest === undefined) {\n this._cachedPeersManifest = readConduitPeersManifest(this.getPeerManifestRoot());\n }\n return this._cachedPeersManifest;\n }\n\n private validateDeclaredPeerNames(names: string[]): void {\n const known = new Set(this.grpcSdk.getKnownModuleNames());\n for (const n of names) {\n if (!known.has(n)) {\n ConduitGrpcSdk.Logger.warn(\n `Declared Conduit peer \"${n}\" is not a known built-in module (see ConduitGrpcSdk.getKnownModuleNames).`,\n );\n }\n }\n }\n\n protected async awaitPeersFromManifest(): Promise<void> {\n const manifest = this.loadConduitPeersManifest();\n const peers = manifest?.peers?.await;\n if (!peers?.length) return;\n this.validateDeclaredPeerNames(peers);\n await Promise.all(peers.map(m => this.grpcSdk.awaitPeer(m)));\n }\n\n protected registerDeclaredPeerWatches(): void {\n this.disposeDeclaredPeerWatches();\n const manifest = this.loadConduitPeersManifest();\n const watch = manifest?.peers?.watch;\n if (!watch?.length) return;\n this.validateDeclaredPeerNames(watch.map(w => w.module));\n const specs = watch.map(entry => ({\n module: entry.module,\n edge: entry.edge ?? 'rising',\n }));\n const dispose = this.grpcSdk.watchPeers(\n specs,\n statuses => {\n for (const [mod, s] of Object.entries(statuses)) {\n if (this._lastPeerBatchStates[mod] !== s) {\n this.onDeclaredPeerConnectionUpdate(mod, s);\n this._lastPeerBatchStates[mod] = s;\n }\n }\n },\n { debounceMs: 100, syncInitialState: true },\n );\n this._declaredPeerWatchDisposers.push(dispose);\n }\n\n protected disposeDeclaredPeerWatches(): void {\n for (const d of this._declaredPeerWatchDisposers) {\n d();\n }\n this._declaredPeerWatchDisposers = [];\n this._lastPeerBatchStates = {};\n }\n\n protected onDeclaredPeerConnectionUpdate(\n _moduleName: string,\n _serving: boolean,\n ): void {}\n\n async createGrpcServer() {\n this.grpcServer = new GrpcServer(this._port);\n this._port = (await this.grpcServer.createNewServer()).toString();\n }\n\n async startGrpcServer() {\n if (this.service) {\n this._serviceName = this.service.protoDescription.substring(\n this.service.protoDescription.indexOf('.') + 1,\n );\n await this.grpcServer.addService(\n this.service.protoPath,\n this.service.protoDescription,\n this.service.functions,\n );\n }\n RoutingManager.ClientController = new RoutingController();\n RoutingManager.AdminController = new RoutingController();\n await this.addHealthCheckService();\n await this.addModuleService();\n await this.grpcServer.start();\n ConduitGrpcSdk.Logger.log('gRPC server listening on ' + this._port);\n }\n\n async setConfig(\n call: GrpcRequest<SetConfigRequest>,\n callback: GrpcResponse<SetConfigResponse>,\n ) {\n try {\n if (!this.config) {\n return callback({\n code: status.INVALID_ARGUMENT,\n message: 'Module is not configurable',\n });\n }\n let config = JSON.parse(call.request.newConfig);\n const previousConfig = this.config.getProperties();\n config = merge(previousConfig, config);\n config = restoreRedactedSecrets(config, previousConfig, this.configSchema);\n config = await this.preConfig(config);\n try {\n this.config.load(config).validate({\n allowed: 'warn',\n });\n config = this.config.getProperties();\n callback(null, { updatedConfig: JSON.stringify(config) });\n } catch (e) {\n (this.config as unknown) = convict(this.configSchema!);\n this.config.load(previousConfig);\n return callback({\n code: status.INVALID_ARGUMENT,\n message: 'Invalid configuration values: ' + (e as Error).message,\n });\n }\n const configJson = JSON.stringify(config);\n this._pendingConfigUpdates.push(configJson);\n await this._drainConfigQueue();\n this.grpcSdk.bus?.publish(kebabCase(this.name) + ':config:update', configJson);\n } catch (e) {\n return callback({ code: status.INTERNAL, message: (e as Error).message });\n }\n }\n\n /** Used to update the module's configuration on initial Redis/DB reconciliation. */\n async handleConfigSyncUpdate() {\n if (!this.config) return;\n this.grpcSdk.bus!.subscribe(\n `${kebabCase(this.name)}:config:update`,\n async (message: string) => {\n this._pendingConfigUpdates.push(message);\n await this._drainConfigQueue();\n },\n );\n }\n\n /** Serializes config updates; waits for initial lifecycle before draining. */\n private async _drainConfigQueue() {\n if (!this._configInitialized || this._processingConfig) return;\n this._processingConfig = true;\n try {\n while (this._pendingConfigUpdates.length > 0) {\n const message = this._pendingConfigUpdates.shift()!;\n ConfigController.getInstance().config = await this.preConfig(JSON.parse(message));\n await this.onConfig();\n }\n } finally {\n this._processingConfig = false;\n }\n }\n\n private async preRegisterLifecycle(): Promise<void> {\n await this.createGrpcServer();\n this._moduleState = ModuleLifecycleStage.PRE_SERVER_START;\n await this.preServerStart();\n await this.grpcSdk.initializeEventBus();\n await this.handleConfigSyncUpdate();\n await this.registerMetrics();\n await this.startGrpcServer();\n this._moduleState = ModuleLifecycleStage.SERVER_STARTED;\n await this.onServerStart();\n await this.initializeMetrics();\n this._moduleState = ModuleLifecycleStage.PRE_REGISTER;\n await this.preRegister();\n }\n\n private async postRegisterLifecycle(): Promise<void> {\n this._moduleState = ModuleLifecycleStage.POST_REGISTER;\n this.registered = true;\n await this.onRegister();\n if (this.config) {\n const configSchema = this.config.getSchema();\n\n let config: any = this.config.getProperties();\n config = await this.preConfig(config);\n\n config = await this.grpcSdk.config.configure(\n config,\n convictConfigParser(configSchema),\n this.configOverride,\n );\n\n ConfigController.getInstance();\n if (config) {\n const migrated = await this.preConfig(config);\n this.config.load(migrated).validate({\n allowed: 'warn',\n });\n const persistable = this.config.getProperties();\n const reconciled = await reconcileStoredModuleConfig({\n stored: config,\n migrated: persistable,\n configureOverride: next =>\n this.grpcSdk.config.configure(next, convictConfigParser(configSchema), true),\n });\n config = reconciled.config;\n this.config.load(config);\n ConfigController.getInstance().config = this.config.getProperties();\n }\n if (!config || config.active || !config.hasOwnProperty('active'))\n await this.onConfig();\n }\n this._configInitialized = true;\n await this._drainConfigQueue();\n }\n}\n","export enum ModuleLifecycleStage {\n CREATE_GRPC = 'creat-grpc-server',\n PRE_SERVER_START = 'pre-grpc-start',\n SERVER_STARTED = 'grpc-server-started',\n PRE_REGISTER = 'pre-register',\n POST_REGISTER = 'post-register',\n}\n","import {\n ConduitGrpcSdk,\n HealthCheckStatus,\n IConduitLogger,\n} from '@conduitplatform/grpc-sdk';\nimport { ConduitLogger, setupLoki } from '../logging/index.js';\nimport winston from 'winston';\nimport path from 'path';\nimport { ConduitMetrics } from '../metrics/index.js';\nimport { clientMiddleware } from '../metrics/clientMiddleware.js';\n\nexport const initializeSdk = (\n coreUrl: string,\n moduleName: string,\n watchModules: boolean = true,\n serviceHealthStatusGetter: () => HealthCheckStatus = () => HealthCheckStatus.SERVING,\n) => {\n let logger: IConduitLogger;\n try {\n logger = new ConduitLogger([\n new winston.transports.File({\n filename: path.join(__dirname, '.logs/combined.log'),\n level: 'info',\n }),\n new winston.transports.File({\n filename: path.join(__dirname, '.logs/errors.log'),\n level: 'error',\n }),\n ]);\n } catch (e) {\n logger = new ConduitLogger();\n }\n const grpcSdk = new ConduitGrpcSdk(\n coreUrl,\n moduleName,\n watchModules,\n logger,\n serviceHealthStatusGetter,\n );\n setupLoki(grpcSdk.name, grpcSdk.instance).then();\n if (process.env.METRICS_PORT) {\n ConduitGrpcSdk.Metrics = new ConduitMetrics(grpcSdk.name, grpcSdk.instance);\n grpcSdk.addMiddleware(clientMiddleware());\n }\n return grpcSdk;\n};\n","import {\n ConduitGrpcSdk,\n IConduitLogger,\n Indexable,\n UntypedArray,\n} from '@conduitplatform/grpc-sdk';\nimport winston, { format, Logger } from 'winston';\nimport { isEmpty } from 'lodash-es';\nimport { get } from 'http';\nimport LokiTransport from 'winston-loki';\nimport { linearBackoffTimeoutAsync } from '../utilities/linearBackoffTimeout.js';\n\nconst processMeta = (meta: Indexable) => {\n if (Array.isArray(meta)) {\n return meta.reduce(\n (message: string, meta: Indexable) =>\n `${message} \\n ${JSON.stringify(meta, null, 2)}`,\n '',\n );\n } else {\n return JSON.stringify(meta, null, 2);\n }\n};\n\nconst createFormat = (logMeta: boolean = true) => {\n return format.combine(\n format.printf(info => {\n // This will customize the Error Message\n if (info.stack) {\n return `[${info.timestamp}] [${info.level.toUpperCase()}]: ${info.message} ${\n info.stack\n }`;\n }\n if (logMeta) {\n return `[${info.timestamp}] [${info.level.toUpperCase()}]: ${info.message} ${\n !isEmpty(info.meta) ? processMeta(info.meta as any) : ''\n }`;\n } else {\n return `[${info.timestamp}] [${info.level.toUpperCase()}]: ${info.message}`;\n }\n }),\n );\n};\nconst defaultTransport = new winston.transports.Console({\n level: 'debug',\n format: format.combine(\n format.prettyPrint(),\n format.errors({ stack: true }),\n format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n createFormat(false),\n format.colorize({\n all: true,\n }),\n ),\n});\n\nexport class ConduitLogger implements IConduitLogger {\n private readonly _winston: Logger;\n\n constructor(transports?: winston.transport[]) {\n this._winston = winston.createLogger({\n format: format.combine(\n format.prettyPrint(),\n format.errors({ stack: true }),\n format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n createFormat(),\n ),\n transports: transports ? [...transports, defaultTransport] : [defaultTransport],\n });\n }\n\n get winston() {\n return this._winston;\n }\n\n addTransport(transport: winston.transport) {\n this._winston.add(transport);\n }\n\n log(message: string, level: string = 'info'): Logger {\n return this._winston.log(level, message);\n }\n\n logObject(object: Indexable, message: string = '', level: string = 'info'): Logger {\n return this._winston.log(level, message, object);\n }\n\n info(message: string): Logger {\n return this._winston.info(message);\n }\n\n warn(message: string): Logger {\n return this._winston.warn(message);\n }\n\n error(message: string | Error, error?: Error | unknown): Logger {\n if (typeof message === 'object') {\n return this._winston.error(message);\n }\n return this._winston.error(message, error);\n }\n\n http(message: string): Logger {\n return this._winston.http(message);\n }\n\n verbose(message: string): Logger {\n return this._winston.verbose(message);\n }\n}\n\nasync function lokiReadyCheck(lokiUrl: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const data: UntypedArray = [];\n get(`${lokiUrl}/ready`, r => {\n r.on('data', chunk => data.push(chunk));\n r.on('end', () => {\n if (Buffer.concat(data).toString() === 'ready\\n') resolve();\n else reject(false);\n });\n }).on('error', err => {\n reject(err.message);\n });\n });\n}\n\nexport async function setupLoki(module: string, instance: string) {\n let lokiUrl = process.env.LOKI_URL;\n if (lokiUrl && lokiUrl !== '') {\n if (lokiUrl.endsWith('/')) lokiUrl = lokiUrl.slice(0, -1);\n const onTry = async () => {\n return await lokiReadyCheck(lokiUrl!)\n .then(() => {\n (ConduitGrpcSdk.Logger as IConduitLogger).addTransport(\n new LokiTransport({\n level: 'debug',\n host: lokiUrl!,\n batching: false,\n replaceTimestamp: true,\n labels: {\n module,\n instance,\n ...(process.env.CONDUIT_NAMESPACE && {\n namespace: process.env.CONDUIT_NAMESPACE,\n }),\n },\n }),\n );\n return false;\n })\n .catch(() => true); // retry\n };\n const onFailure = () => {\n ConduitGrpcSdk.Logger.error(`Failed to connect to Loki on '${lokiUrl}'`);\n };\n await linearBackoffTimeoutAsync(onTry, 250, 15, onFailure, true);\n }\n}\n","/**\n * Registers a timeout with linear backoff.\n * onFailure() only runs on rep exhaustion.\n * Timeout can be cleared through returned clear() or inside onTry().\n */\nimport { clearTimeout } from 'timers';\n\nexport function linearBackoffTimeout(\n onTry: (stop: () => void) => void,\n delay: number,\n reps?: number,\n onFailure?: () => void,\n) {\n const nextRep = () => reps === undefined || --reps > 0;\n let stopSignal = false;\n const stop = () => {\n stopSignal = true;\n };\n let timeout: NodeJS.Timeout | null;\n const invoker = async () => {\n if (stopSignal) {\n return timeout ? clearTimeout(timeout) : null;\n }\n delay = Math.floor(delay * 2);\n if (delay > 0 && nextRep()) {\n timeout = setTimeout(invoker, delay);\n onTry(stop);\n } else {\n timeout = null;\n onFailure && onFailure();\n }\n };\n timeout = setTimeout(invoker, delay);\n return {\n clear: () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n },\n };\n}\n\n/**\n * Registers a timeout with linear backoff.\n * onFailure() only runs on rep exhaustion.\n * @param {() => Promise<boolean>} onTry - Async handler, returns 'continue' boolean flag\n */\nexport async function linearBackoffTimeoutAsync(\n onTry: () => Promise<boolean>,\n delay: number,\n reps?: number,\n onFailure?: () => void | Promise<void>,\n startNow = false,\n) {\n const nextRep = () => reps === undefined || --reps > 0;\n const invoker = async () => {\n delay = Math.floor(delay * 2);\n if (delay > 0 && nextRep()) {\n if (await onTry()) setTimeout(invoker, delay);\n } else {\n onFailure && (await onFailure());\n }\n };\n setTimeout(invoker, startNow ? 0 : delay);\n}\n","import {\n collectDefaultMetrics,\n Counter,\n CounterConfiguration,\n Gauge,\n GaugeConfiguration,\n Histogram,\n HistogramConfiguration,\n LabelValues,\n MetricConfiguration,\n Registry,\n Summary,\n SummaryConfiguration,\n} from 'prom-client';\nimport { MetricsServer } from './MetricsServer.js';\nimport defaultMetrics from './config/defaults.js';\nimport { IConduitMetrics, MetricType } from '@conduitplatform/grpc-sdk';\n\nconst METRICS_PREFIX = 'cnd_';\n\nexport class ConduitMetrics implements IConduitMetrics {\n private readonly moduleName: string;\n private readonly instance: string;\n private readonly _registry: Registry;\n private _httpServer: MetricsServer;\n\n constructor(moduleName: string, instance: string) {\n this.moduleName = moduleName;\n this.instance = instance;\n this._registry = new Registry();\n this._registry.setDefaultLabels({\n module_name: this.moduleName,\n module_instance: this.instance,\n });\n this.collectDefaultMetrics();\n this._httpServer = new MetricsServer(moduleName, instance, this._registry);\n this._httpServer.initialize();\n }\n\n get registry() {\n return this._registry;\n }\n\n initializeDefaultMetrics() {\n for (const metric of Object.values(defaultMetrics)) {\n this.registerMetric(metric.type as unknown as MetricType, metric.config);\n }\n }\n\n registerMetric(type: MetricType, config: MetricConfiguration<string>) {\n if (this.getMetric(config.name)) return;\n const metricConfig = JSON.parse(JSON.stringify(config));\n metricConfig.name = this.addPrefix(config.name);\n switch (type) {\n case MetricType.Counter:\n this.createCounter(metricConfig as CounterConfiguration<any>);\n break;\n case MetricType.Gauge:\n this.createGauge(metricConfig as GaugeConfiguration<any>);\n break;\n case MetricType.Histogram:\n this.createHistogram(metricConfig as HistogramConfiguration<any>);\n break;\n case MetricType.Summary:\n this.createSummary(metricConfig as SummaryConfiguration<any>);\n break;\n }\n }\n\n collectDefaultMetrics() {\n collectDefaultMetrics({\n register: this._registry,\n prefix: METRICS_PREFIX,\n // probably not needed\n labels: {\n module_name: this.moduleName,\n instance_instance: this.instance,\n },\n });\n }\n\n createCounter(config: CounterConfiguration<any>) {\n return new Counter({\n ...config,\n name: this.addPrefix(config.name),\n registers: [this._registry],\n });\n }\n\n createSummary(config: SummaryConfiguration<any>) {\n return new Summary({\n ...config,\n name: this.addPrefix(config.name),\n registers: [this._registry],\n });\n }\n\n createHistogram(config: HistogramConfiguration<any>) {\n return new Histogram({\n ...config,\n name: this.addPrefix(config.name),\n registers: [this._registry],\n });\n }\n\n createGauge(config: GaugeConfiguration<any>) {\n return new Gauge({\n ...config,\n name: this.addPrefix(config.name),\n registers: [this._registry],\n });\n }\n\n getMetric(name: string) {\n return this._registry.getSingleMetric(this.addPrefix(name));\n }\n\n increment(metric: string, increment: number = 1, labels?: LabelValues<any>) {\n const metricInstance = this.getMetric(metric);\n if (!(metricInstance instanceof Counter) && !(metricInstance instanceof Gauge)) {\n throw new Error(`Metric ${metric} is not an incrementable metric`);\n }\n return labels\n ? metricInstance.labels({ ...labels }).inc(increment)\n : metricInstance.inc(increment);\n }\n\n decrement(metric: string, decrement: number = 1, labels?: LabelValues<any>) {\n const metricInstance = this.getMetric(metric);\n if (!(metricInstance instanceof Gauge)) {\n throw new Error(`Metric ${metric} is not a decrementable metric`);\n }\n return labels\n ? metricInstance.labels({ ...labels }).dec(decrement)\n : metricInstance.dec(decrement);\n }\n\n set(metric: string, value: number, labels?: LabelValues<any>) {\n const metricInstance = this.getMetric(metric);\n if (!(metricInstance instanceof Gauge)) {\n throw new Error(`Metric ${metric} is not a Gauge`);\n }\n return labels\n ? metricInstance.labels({ ...labels }).set(value)\n : metricInstance.set(value);\n }\n\n observe(metric: string, value: number, labels?: LabelValues<any>) {\n const metricInstance = this.getMetric(metric);\n if (!(metricInstance instanceof Histogram) && !(metricInstance instanceof Summary)) {\n throw new Error(`Metric ${metric} is not a Histogram`);\n }\n return labels\n ? metricInstance.labels({ ...labels }).observe(value)\n : metricInstance.observe(value);\n }\n\n private addPrefix(metric: string) {\n if (!metric.includes(METRICS_PREFIX)) {\n return `${METRICS_PREFIX}${metric}`;\n }\n return metric;\n }\n}\n","import { createServer, IncomingMessage, ServerResponse } from 'http';\nimport { Registry } from 'prom-client';\nimport { isNaN } from 'lodash-es';\nimport { ConduitGrpcSdk } from '@conduitplatform/grpc-sdk';\n\nexport class MetricsServer {\n private readonly moduleName: string;\n private readonly instance: string;\n private readonly Registry: Registry;\n\n constructor(moduleName: string, instance: string, registry: Registry) {\n this.moduleName = moduleName;\n this.instance = instance;\n this.Registry = registry;\n }\n\n initialize() {\n const port = this.getHttpPort();\n const url = '0.0.0.0:' + port.toString();\n const server = createServer(this.requestHandler.bind(this));\n\n server.listen(port, () => {\n ConduitGrpcSdk.Logger.info(`Metrics server listening on: ${url}`);\n });\n\n return server;\n }\n\n private async requestHandler(req: IncomingMessage, res: ServerResponse) {\n if (req.url === '/' && req.method === 'GET') {\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end(\n `Conduit Metrics for module: ${this.moduleName}, instance: ${this.instance}`,\n );\n } else if (req.url === '/metrics' && req.method === 'GET') {\n const metrics = await this.Registry.metrics();\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end(metrics);\n } else {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not Found');\n }\n }\n\n private getHttpPort() {\n const value = process.env['METRICS_PORT'];\n if (!value) {\n ConduitGrpcSdk.Logger.error(`Metrics HTTP port not set`);\n process.exit(-1);\n }\n const port = parseInt(value, 10);\n if (isNaN(port) || port < 1 || port > 65535) {\n ConduitGrpcSdk.Logger.error(`Invalid HTTP port value: ${port}`);\n process.exit(-1);\n }\n return port;\n }\n}\n","import { MetricType } from '@conduitplatform/grpc-sdk';\n\nexport default {\n internalGrpcRequests: {\n type: MetricType.Counter,\n config: {\n name: 'internal_grpc_requests_total',\n help: \"Tracks the total number of Conduit's internal gRPC requests\",\n },\n },\n clientGrpcRequests: {\n type: MetricType.Counter,\n config: {\n name: 'client_grpc_requests_total',\n help: 'Tracks the total number of the client gRPC requests',\n },\n },\n adminGrpcRequests: {\n type: MetricType.Counter,\n config: {\n name: 'admin_grpc_requests_total',\n help: 'Tracks the total number of the admin gRPC requests',\n },\n },\n clientGrpcErrors: {\n type: MetricType.Counter,\n config: {\n name: 'client_grpc_errors_total',\n help: 'Tracks the total number of client grpc errors',\n },\n },\n adminGrpcErrors: {\n type: MetricType.Counter,\n config: {\n name: 'admin_grpc_errors_total',\n help: 'Tracks the total number of admin grpc errors',\n },\n },\n moduleHealthState: {\n type: MetricType.Gauge,\n config: {\n name: 'module_health_state',\n help: 'Tracks the health state of the module',\n },\n },\n grpcRequestLatency: {\n type: MetricType.Gauge,\n config: {\n name: 'grpc_request_latency_seconds',\n help: 'Tracks the latency of grpc requests in seconds',\n },\n },\n adminGrpcRequestLatency: {\n type: MetricType.Gauge,\n config: {\n name: 'admin_grpc_request_latency_seconds',\n help: 'Tracks the latency of admin grpc requests in seconds',\n },\n },\n clientGrpcRequestLatency: {\n type: MetricType.Gauge,\n config: {\n name: 'client_grpc_request_latency_seconds',\n help: 'Tracks the latency of client grpc requests in seconds',\n },\n },\n grpcResponseStatuses: {\n type: MetricType.Counter,\n config: {\n name: 'grpc_response_statuses_total',\n help: 'Tracks the total number of grpc response codes',\n labelNames: ['success'],\n },\n },\n adminGrpcResponseStatuses: {\n type: MetricType.Counter,\n config: {\n name: 'admin_grpc_response_statuses_total',\n help: 'Tracks the total number of admin grpc response codes',\n labelNames: ['success'],\n },\n },\n clientGrpcResponseStatuses: {\n type: MetricType.Counter,\n config: {\n name: 'client_grpc_response_statuses_total',\n help: 'Tracks the total number of client grpc response codes',\n labelNames: ['success'],\n },\n },\n};\n","// Forked from nice-grpc-prometheus\nimport { isAbortError } from 'abort-controller-x';\nimport {\n CallOptions,\n ClientError,\n ClientMiddleware,\n ClientMiddlewareCall,\n MethodDescriptor,\n Status,\n} from 'nice-grpc-common';\nimport { Counter, exponentialBuckets, Histogram, Registry } from 'prom-client';\n\nconst registry = new Registry();\n\nconst typeLabel = 'grpc_type';\nconst serviceLabel = 'grpc_service';\nconst methodLabel = 'grpc_method';\nconst pathLabel = 'grpc_path';\nconst codeLabel = 'grpc_code';\n/**\n * 1ms, 4ms, 16ms, ..., ~1 hour in seconds\n */\nconst latencySecondsBuckets = exponentialBuckets(0.001, 4, 12);\n\nfunction getLabels(method: MethodDescriptor) {\n const callType = method.requestStream\n ? method.responseStream\n ? 'bidi_stream'\n : 'client_stream'\n : method.responseStream\n ? 'server_stream'\n : 'unary';\n const { path } = method;\n const [serviceName, methodName] = path.split('/').slice(1);\n return {\n [typeLabel]: callType,\n [serviceLabel]: serviceName,\n [methodLabel]: methodName,\n [pathLabel]: path,\n };\n}\n\nasync function* incrementStreamMessagesCounter<T>(\n iterable: AsyncIterable<T>,\n counter: Counter.Internal,\n): AsyncIterable<T> {\n for await (const item of iterable) {\n counter.inc();\n yield item;\n }\n}\n\nconst clientStartedMetric = new Counter({\n registers: [registry],\n name: 'cnd_grpc_client_started_total',\n help: 'Total number of RPCs started on the client.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel],\n});\n\nconst clientHandledMetric = new Counter({\n registers: [registry],\n name: 'cnd_grpc_client_handled_total',\n help: 'Total number of RPCs completed on the client, regardless of success or failure.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel, codeLabel],\n});\n\nconst clientStreamMsgReceivedMetric = new Counter({\n registers: [registry],\n name: 'cnd_grpc_client_msg_received_total',\n help: 'Total number of RPC stream messages received by the client.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel],\n});\n\nconst clientStreamMsgSentMetric = new Counter({\n registers: [registry],\n name: 'cnd_grpc_client_msg_sent_total',\n help: 'Total number of gRPC stream messages sent by the client.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel],\n});\n\nconst clientHandlingSecondsMetric = new Histogram({\n registers: [registry],\n name: 'grpc_client_handling_seconds',\n help: 'Histogram of response latency (seconds) of the gRPC until it is finished by the application.',\n labelNames: [typeLabel, serviceLabel, methodLabel, pathLabel, codeLabel],\n buckets: latencySecondsBuckets,\n});\n\nexport function clientMiddleware(): ClientMiddleware {\n return async function* prometheusClientMiddlewareGenerator<Request, Response>(\n call: ClientMiddlewareCall<Request, Response>,\n options: CallOptions,\n ): AsyncGenerator<Response, Response | void, undefined> {\n const labels = getLabels(call.method);\n clientStartedMetric.inc(labels);\n const stopTimer = clientHandlingSecondsMetric.startTimer(labels);\n let settled = false;\n let status: Status = Status.OK;\n try {\n let request;\n if (!call.requestStream) {\n request = call.request;\n } else {\n request = incrementStreamMessagesCounter(\n call.request,\n clientStreamMsgSentMetric.labels(labels),\n );\n }\n if (!call.responseStream) {\n const response = yield* call.next(request, options);\n settled = true;\n return response;\n } else {\n yield* incrementStreamMessagesCounter(\n call.next(request, options),\n clientStreamMsgReceivedMetric.labels(labels),\n );\n settled = true;\n return;\n }\n } catch (err: unknown) {\n settled = true;\n if (err instanceof ClientError) {\n status = err.code;\n } else if (isAbortError(err)) {\n status = Status.ABORTED;\n } else {\n status = Status.UNKNOWN;\n }\n throw err;\n } finally {\n if (!settled) {\n status = Status.CANCELLED;\n }\n stopTimer({ [codeLabel]: Status[status] });\n clientHandledMetric.inc({\n ...labels,\n [codeLabel]: Status[status],\n });\n }\n };\n}\n","import { mergeWith as _mergeWith } from 'lodash-es';\n\nexport function merge<T extends object>(objA: T, objB: T) {\n const customizer = (objValue: unknown, srcValue: unknown) => {\n if (Array.isArray(objValue)) {\n // don't merge arrays\n return srcValue;\n }\n };\n return _mergeWith({}, objA, objB, customizer);\n}\n","/**\n * Reusable helpers for module export/import (GitOps).\n * Standardizes stripping internal fields and optional export/import flows.\n */\n\nimport type { ImportResultEntry } from '../interfaces/ResourceExporter.js';\n\n/** Fields removed from documents when exporting (so they are not versioned). */\nexport const DEFAULT_STRIP_FIELDS = ['_id', 'createdAt', 'updatedAt', '__v'] as const;\n\n/**\n * Removes internal and optionally extra fields from a single document.\n * Does not mutate the original if the result would differ.\n */\nexport function stripInternalFields(\n obj: Record<string, unknown>,\n additionalFields: string[] = [],\n): Record<string, unknown> {\n const strip = new Set([...DEFAULT_STRIP_FIELDS, ...additionalFields]);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (!strip.has(k)) out[k] = v;\n }\n return out;\n}\n\nexport interface SanitizeForExportOptions {\n /** Extra field names to remove (in addition to DEFAULT_STRIP_FIELDS). */\n excludeFields?: string[];\n}\n\n/**\n * Returns a copy of each document with internal fields stripped.\n * Use after fetching from DB to produce export-safe arrays.\n */\nexport function sanitizeDocumentsForExport<T extends Record<string, unknown>>(\n documents: T[],\n options: SanitizeForExportOptions = {},\n): Record<string, unknown>[] {\n const exclude = options.excludeFields ?? [];\n return documents.map(doc => stripInternalFields(doc, exclude));\n}\n\n/**\n * Minimal model interface for export: can return all records.\n */\nexport interface ExportModelAdapter {\n findMany(\n query?: Record<string, unknown>,\n options?: { select?: string },\n ): Promise<Record<string, unknown>[]>;\n}\n\n/**\n * Fetches all documents from the adapter and returns them with internal fields stripped.\n */\nexport async function exportModel(\n adapter: ExportModelAdapter,\n options: SanitizeForExportOptions & {\n query?: Record<string, unknown>;\n select?: string;\n } = {},\n): Promise<Record<string, unknown>[]> {\n const { query, select, excludeFields, ...rest } =\n options as SanitizeForExportOptions & {\n query?: Record<string, unknown>;\n select?: string;\n };\n const docs = await adapter.findMany(query ?? {}, select ? { select } : {});\n return sanitizeDocumentsForExport(docs, { excludeFields, ...rest });\n}\n\n/**\n * Minimal model interface for import: find by key, create, update.\n */\nexport interface ImportModelAdapter {\n keyField: string;\n findOne(query: Record<string, unknown>): Promise<Record<string, unknown> | null>;\n create(doc: Record<string, unknown>): Promise<Record<string, unknown>>;\n updateOne(\n filter: Record<string, unknown>,\n doc: Record<string, unknown>,\n ): Promise<unknown>;\n}\n\n/**\n * Upserts records by keyField. Returns counts and errors for ImportResultEntry.\n */\nexport async function importModel(\n adapter: ImportModelAdapter,\n records: Record<string, unknown>[],\n options: SanitizeForExportOptions = {},\n): Promise<ImportResultEntry> {\n const entry: ImportResultEntry = { created: 0, updated: 0, failed: 0, errors: [] };\n const keyField = adapter.keyField;\n\n for (const record of records) {\n const key = record[keyField];\n if (key == null || key === '') {\n entry.failed += 1;\n entry.errors.push(`Missing or empty key \"${keyField}\" in record`);\n continue;\n }\n\n try {\n const existing = await adapter.findOne({ [keyField]: key });\n const sanitized = stripInternalFields(record, options.excludeFields ?? []);\n\n if (existing) {\n await adapter.updateOne({ [keyField]: key }, sanitized);\n entry.updated += 1;\n } else {\n await adapter.create(sanitized);\n entry.created += 1;\n }\n } catch (err) {\n entry.failed += 1;\n entry.errors.push(`${String(key)}: ${(err as Error).message}`);\n }\n }\n\n return entry;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport type { PeerWatchEdge } from '@conduitplatform/grpc-sdk';\n\nexport interface ConduitPeerWatchEntry {\n module: string;\n edge?: PeerWatchEdge;\n}\n\n/** Optional `conduit.peers` block in a module `package.json`. */\nexport interface ConduitPeersManifest {\n peers?: {\n await?: string[];\n watch?: ConduitPeerWatchEntry[];\n };\n}\n\nexport interface ConduitPackageJson {\n name?: string;\n conduit?: ConduitPeersManifest;\n}\n\nexport function readConduitPeersManifest(\n moduleRootDir: string = process.cwd(),\n): ConduitPeersManifest | null {\n const pkgPath = path.join(moduleRootDir, 'package.json');\n if (!existsSync(pkgPath)) return null;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as ConduitPackageJson;\n if (!pkg.conduit?.peers) return null;\n return pkg.conduit;\n } catch (e) {\n console.warn(`[conduitPeers] Failed to parse ${pkgPath}: ${(e as Error).message}`);\n return null;\n }\n}\n","import { Indexable } from '@conduitplatform/grpc-sdk';\n\nexport const convictConfigParser = (config: Indexable) => {\n if (typeof config === 'object') {\n Object.keys(config).forEach(key => {\n if (key === '_cvtProperties') {\n config = convictConfigParser(config._cvtProperties);\n } else {\n config[key] = convictConfigParser(config[key]);\n }\n });\n }\n return config;\n};\n","const WELL_KNOWN_SECRET_KEYS =\n /^(apiKey|api_key|password|secret|privateKey|private_key)$/i;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSchemaLeaf(value: unknown): value is Record<string, unknown> {\n return (\n isRecord(value) &&\n ('default' in value || 'format' in value || 'type' in value) &&\n !isRecord(value._cvtProperties)\n );\n}\n\nfunction isSensitiveLeaf(value: unknown): boolean {\n return isSchemaLeaf(value) && value.sensitive === true;\n}\n\nfunction unwrapSchema(schema: unknown): unknown {\n if (isRecord(schema) && isRecord(schema._cvtProperties)) {\n return schema._cvtProperties;\n }\n return schema;\n}\n\nconst REDACTED_MARKER = '[REDACTED]';\n\nexport function containsRedactedMarker(value: unknown): boolean {\n if (value === REDACTED_MARKER) return true;\n if (Array.isArray(value)) {\n return value.some(containsRedactedMarker);\n }\n if (!isRecord(value)) return false;\n return Object.values(value).some(containsRedactedMarker);\n}\n\nexport function redactSensitiveConfig<T>(config: T, schema?: unknown): T {\n if (!isRecord(config)) return config;\n const redacted = Array.isArray(config) ? [...config] : { ...config };\n const node = unwrapSchema(schema);\n for (const [key, value] of Object.entries(redacted as Record<string, unknown>)) {\n const childSchema = isRecord(node) ? node[key] : undefined;\n if (isSensitiveLeaf(childSchema) || WELL_KNOWN_SECRET_KEYS.test(key)) {\n if (typeof value === 'string' && value.length > 0) {\n (redacted as Record<string, unknown>)[key] = REDACTED_MARKER;\n }\n continue;\n }\n if (isRecord(value) || Array.isArray(value)) {\n (redacted as Record<string, unknown>)[key] = redactSensitiveConfig(\n value,\n childSchema,\n );\n }\n }\n return redacted as T;\n}\n\nexport function restoreRedactedSecrets<T>(incoming: T, current: T, schema?: unknown): T {\n if (Array.isArray(incoming) && Array.isArray(current)) {\n return incoming.map((item, index) =>\n restoreRedactedSecrets(item, current[index], schema),\n ) as T;\n }\n if (!isRecord(incoming) || !isRecord(current)) return incoming;\n const restored: Record<string, unknown> = { ...incoming };\n const node = unwrapSchema(schema);\n for (const [key, value] of Object.entries(restored)) {\n const childSchema = isRecord(node) ? node[key] : undefined;\n const currentValue = current[key];\n if (isSensitiveLeaf(childSchema) || WELL_KNOWN_SECRET_KEYS.test(key)) {\n if (\n value === REDACTED_MARKER &&\n typeof currentValue === 'string' &&\n currentValue.length > 0 &&\n currentValue !== REDACTED_MARKER\n ) {\n restored[key] = currentValue;\n }\n continue;\n }\n if (\n (isRecord(value) || Array.isArray(value)) &&\n (isRecord(currentValue) || Array.isArray(currentValue))\n ) {\n restored[key] = restoreRedactedSecrets(value, currentValue, childSchema);\n }\n }\n return restored as T;\n}\n","import { containsRedactedMarker } from './redactSensitiveConfig.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortJson);\n }\n if (!isRecord(value)) {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortJson(nested)]),\n );\n}\n\nexport function stableConfigJson(value: unknown): string {\n return JSON.stringify(sortJson(value));\n}\n\nexport function storedConfigsEquivalent(left: unknown, right: unknown): boolean {\n return stableConfigJson(left) === stableConfigJson(right);\n}\n\nexport async function reconcileStoredModuleConfig<T>(args: {\n stored: T;\n migrated: T;\n configureOverride: (config: T) => Promise<T>;\n}): Promise<{ config: T; persisted: boolean }> {\n if (storedConfigsEquivalent(args.stored, args.migrated)) {\n return { config: args.migrated, persisted: false };\n }\n if (containsRedactedMarker(args.migrated)) {\n return { config: args.migrated, persisted: false };\n }\n const persisted = await args.configureOverride(args.migrated);\n return { config: persisted, persisted: true };\n}\n","import { GrpcCallback, GrpcRequest } from '@conduitplatform/grpc-sdk';\nimport { status } from '@grpc/grpc-js';\n\nexport class RoutingController {\n private _routeHandlers: {\n [key: string]: (call: any, callback: any) => void;\n } = {};\n\n handleRequest(call: GrpcRequest<any>, callback: GrpcCallback<any>) {\n if (this._routeHandlers[call.request.functionName]) {\n this._routeHandlers[call.request.functionName](call, callback);\n } else {\n callback({\n code: status.NOT_FOUND,\n message: 'Not found',\n });\n }\n }\n\n setRoutes(routes: { [key: string]: (call: any, callback: any) => void }) {\n this._routeHandlers = routes;\n }\n}\n","import { GrpcError, ModuleErrorDefinition } from '@conduitplatform/grpc-sdk';\n\nexport class ModuleError extends GrpcError {\n debugLogInfo?: string;\n\n constructor(errorDefinition: ModuleErrorDefinition, debugLogInfo?: string) {\n const { grpcCode, conduitCode, message } = errorDefinition;\n super(\n grpcCode,\n JSON.stringify({\n message,\n conduitCode: conduitCode,\n }),\n );\n if (debugLogInfo) this.debugLogInfo = debugLogInfo;\n }\n}\n"],"mappings":"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","names":["port","path","ConduitGrpcSdk","path","status","ConduitGrpcSdk","path","ConduitGrpcSdk","status","ConduitRouteActions","path","ConduitGrpcSdk","status","path","status","ModuleLifecycleStage","ConduitGrpcSdk","ConduitGrpcSdk","HealthCheckStatus","ConduitGrpcSdk","clearTimeout","meta","ConduitGrpcSdk","winston","path","createServer","ConduitGrpcSdk","registry","MetricType","Counter","Histogram","Registry","path","status","HealthCheckStatus","winston","path","ConduitGrpcSdk","path","isRecord","status","ConduitGrpcSdk","status","GrpcError"]}