@conduitplatform/module-tools 0.17.0-alpha.7 → 0.17.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.mdx +13 -0
- package/dist/index.cjs +678 -127
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +185 -4
- package/dist/index.d.ts +185 -4
- package/dist/index.esm.js +639 -96
- package/dist/index.esm.js.map +1 -1
- package/package.json +9 -8
package/dist/index.esm.js.map
CHANGED
|
@@ -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/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"]}
|
|
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/hydrateUser.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/logging/fileTransports.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/utilities/accessTokenVerifier.ts","../src/utilities/accessTokenVerifier.logic.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 /**\n * Whether module-tools hydrates `context.user` from `context.userId` on routes with\n * `authMiddleware` / `authMiddleware?` (default true).\n * @deprecated The default flips to false in the next major; call\n * `grpcSdk.authentication.getUser(userId)` explicitly instead.\n */\n hydrateUser(hydrate: boolean): RouteBuilder {\n this._options.hydrateUser = hydrate;\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 { hydrateContextUser, shouldHydrateUser, UserHydrator } from './hydrateUser.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 hydration?: { options: Indexable; hydrator: UserHydrator },\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 const invoke = () =>\n fun(call, r => {\n parseResponseData(\n r,\n routerRequest,\n requestReceive,\n call,\n callback,\n responded,\n routerType,\n );\n });\n // Session-mode requests already carry context.user, so this is a no-op for them.\n const needsHydration =\n hydration && shouldHydrateUser(hydration.options, call.request.context);\n (needsHydration\n ? hydrateContextUser(\n hydration!.options,\n call.request.context,\n hydration!.hydrator,\n ).then(invoke)\n : invoke()\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 { ConduitGrpcSdk, GrpcError, Indexable } from '@conduitplatform/grpc-sdk';\nimport { status } from '@grpc/grpc-js';\n\n/**\n * User hydration.\n *\n * Client routes guarded by `authMiddleware` / `authMiddleware?` receive `context.user`.\n * In \"session\" mode the authentication middleware already sets it. In \"jwt\" mode the\n * router only knows the user id (`context.userId`, from a verified access token), so\n * module-tools fetches the user (through grpcSdk.authentication.getUser, which reads\n * through a 5s Redis cache) before invoking the handler.\n *\n * Opt out per route with `hydrateUser: false` (RouteBuilder.hydrateUser(false)).\n *\n * @deprecated The default flips to off in the next major version. Modules are then\n * expected to call `grpcSdk.authentication.getUser(context.userId)` explicitly.\n */\n\nexport interface UserHydrator {\n /** True for `authMiddleware?`: a failed lookup leaves the context untouched. */\n optional: boolean;\n getUser: (userId: string) => Promise<Indexable>;\n}\n\nfunction middlewareList(routeOptions: Indexable): string[] {\n const m = routeOptions?.middlewares;\n if (Array.isArray(m)) return m.filter((x): x is string => typeof x === 'string');\n if (typeof m === 'string') return [m];\n return [];\n}\n\n/** Whether the route is guarded by an auth middleware, and if so whether it is the optional form. */\nexport function getAuthMiddlewareKind(\n routeOptions: Indexable,\n): 'required' | 'optional' | undefined {\n const list = middlewareList(routeOptions);\n if (list.includes('authMiddleware')) return 'required';\n if (list.includes('authMiddleware?')) return 'optional';\n return undefined;\n}\n\n/**\n * Pure hydration decision: the route has an auth middleware, `hydrateUser` is not false,\n * and the context carries a `userId` but no `user`. Admin routes must not call this.\n */\nexport function shouldHydrateUser(\n routeOptions: Indexable | undefined,\n context: Indexable | undefined,\n): boolean {\n if (!routeOptions || !context) return false;\n if (routeOptions.hydrateUser === false) return false;\n if (!getAuthMiddlewareKind(routeOptions)) return false;\n return typeof context.userId === 'string' && !!context.userId && !context.user;\n}\n\nexport type UserResolver = (userId: string) => Promise<Indexable>;\n\n/**\n * Builds the per-route hydrator for client routes, or undefined when the route never hydrates.\n * `resolve` is consulted per request (so a resolver registered after route registration still\n * applies) and returns the lookup function to use, if any.\n */\nexport function createUserHydrator(\n routeOptions: Indexable | undefined,\n resolve: () => UserResolver | undefined,\n): UserHydrator | undefined {\n if (!routeOptions) return undefined;\n const kind = getAuthMiddlewareKind(routeOptions);\n if (!kind || routeOptions.hydrateUser === false) return undefined;\n return {\n optional: kind === 'optional',\n getUser: async (userId: string) => {\n const resolver = resolve();\n if (!resolver) throw new GrpcError(status.UNAVAILABLE, 'User lookup unavailable');\n return resolver(userId);\n },\n };\n}\n\n/** Maps a failed user lookup to the gRPC code returned to the caller. */\nexport function mapHydrationErrorCode(error: unknown): number {\n const code = (error as { code?: unknown } | undefined)?.code;\n if (typeof code !== 'number' || code === status.OK) return status.INTERNAL;\n if (code === status.NOT_FOUND) return status.UNAUTHENTICATED;\n return code;\n}\n\n/**\n * Sets context.user when needed. For the mandatory form a failed lookup throws a GrpcError:\n * NOT_FOUND becomes UNAUTHENTICATED; PERMISSION_DENIED and every other gRPC code\n * (UNAVAILABLE, DEADLINE_EXCEEDED, INTERNAL, ...) pass through. The optional form\n * swallows the failure and leaves the context untouched. Failures are logged at warn level.\n */\nexport async function hydrateContextUser(\n routeOptions: Indexable,\n context: Indexable,\n hydrator: UserHydrator,\n): Promise<void> {\n if (!shouldHydrateUser(routeOptions, context)) return;\n try {\n context.user = await hydrator.getUser(context.userId);\n } catch (e) {\n ConduitGrpcSdk.Logger.warn(\n `User hydration failed: ${(e as Error)?.message ?? String(e)}`,\n );\n if (!hydrator.optional) {\n const code = mapHydrationErrorCode(e);\n throw new GrpcError(\n code,\n code === status.UNAUTHENTICATED ? 'Unauthorized' : 'User lookup failed',\n );\n }\n }\n}\n","import { Indexable } from '@conduitplatform/grpc-sdk';\nimport { UserHydrator } from './hydrateUser.js';\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 hydrations: { [name: string]: { options: Indexable; hydrator: UserHydrator } } = {},\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(\n functions[key],\n routerType,\n hydrations[key],\n );\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 ConduitGrpcSdk,\n GrpcError,\n ConduitRouteReturnDefinition,\n ConduitSocketOptions,\n Indexable,\n EventsProtoDescription,\n Router,\n SocketProtoDescription,\n} from '@conduitplatform/grpc-sdk';\nimport { status } from '@grpc/grpc-js';\nimport { GrpcServer } from '../classes/index.js';\nimport { createUserHydrator, UserHydrator, UserResolver } from './hydrateUser.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 /** Set by ManagedModule; used to hydrate context.user on client routes. */\n static grpcSdk?: ConduitGrpcSdk;\n private static userResolver?: UserResolver;\n private static warnedNoResolver = false;\n\n /**\n * Overrides how users are fetched for hydration (default: grpcSdk.authentication.getUser).\n * Intended for the module that owns the users: the authentication module has no gRPC\n * client to itself and will register a local resolver here.\n */\n static setUserResolver(resolver: UserResolver | undefined) {\n RoutingManager.userResolver = resolver;\n }\n\n private static resolveUser(): UserResolver | undefined {\n if (RoutingManager.userResolver) return RoutingManager.userResolver;\n const sdk = RoutingManager.grpcSdk;\n if (!sdk) return undefined;\n return async (userId: string) => {\n const auth = sdk.authentication;\n if (!auth) {\n throw new GrpcError(status.UNAVAILABLE, 'authentication module unavailable');\n }\n return auth.getUser(userId);\n };\n }\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 hydrations: { [name: string]: { options: Indexable; hydrator: UserHydrator } } =\n {};\n if (!this.isAdmin) {\n for (const [name, route] of Object.entries(this._moduleRoutes)) {\n const options = (route as ConduitRouteObject).options as Indexable;\n const hydrator = createUserHydrator(options, RoutingManager.resolveUser);\n if (!hydrator) continue;\n // A socket route is keyed by its first event; every event handler hydrates.\n const names =\n 'events' in route\n ? Object.keys(JSON.parse((route as SocketProtoDescription).events || '{}'))\n : [name];\n for (const n of names) hydrations[n] = { options, hydrator };\n if (\n !RoutingManager.grpcSdk &&\n !RoutingManager.userResolver &&\n !RoutingManager.warnedNoResolver\n ) {\n RoutingManager.warnedNoResolver = true;\n ConduitGrpcSdk.Logger.warn(\n 'User hydration is needed but RoutingManager.grpcSdk is not set; hydration will fail',\n );\n }\n }\n }\n const modifiedFunctions: {\n [name: string]: (call: any, callback: any) => void;\n } = wrapFunctionsAsync(\n this._routeHandlers,\n this.isAdmin ? 'admin' : 'client',\n hydrations,\n );\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.grpcSdk = this.grpcSdk;\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 { createFileLogTransports } from '../logging/fileTransports.js';\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 const fileTransports = createFileLogTransports();\n logger =\n fileTransports.length > 0 ? new ConduitLogger(fileTransports) : new ConduitLogger();\n } catch {\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 fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport winston from 'winston';\nimport DailyRotateFile from 'winston-daily-rotate-file';\n\nconst DEFAULT_RETENTION_DAYS = 3;\nconst DEFAULT_MAX_SIZE = '20m';\nconst SIZE_STRING = /^(?:0\\.)?\\d+[kmg]$/i;\n\nfunction positiveIntFromEnv(raw: string | undefined, fallback: number): number {\n if (raw === undefined) return fallback;\n const trimmed = raw.trim();\n if (!/^[0-9]+$/.test(trimmed)) return fallback;\n const value = Number(trimmed);\n if (!Number.isSafeInteger(value) || value <= 0) return fallback;\n return value;\n}\n\nfunction logFileMaxSize(): string | number {\n const raw = process.env.LOG_FILE_MAX_SIZE?.trim();\n if (!raw) return DEFAULT_MAX_SIZE;\n if (SIZE_STRING.test(raw)) return raw.toLowerCase();\n if (/^[0-9]+$/.test(raw)) {\n const bytes = Number(raw);\n if (Number.isSafeInteger(bytes) && bytes > 0) return bytes;\n }\n return DEFAULT_MAX_SIZE;\n}\n\nfunction formatMeta(meta: unknown): string {\n if (Array.isArray(meta)) {\n if (meta.length === 0) return '';\n return meta.map(item => JSON.stringify(item)).join(' ');\n }\n if (meta !== null && typeof meta === 'object') {\n if (Object.keys(meta).length === 0) return '';\n return JSON.stringify(meta);\n }\n return '';\n}\n\nfunction createFileFormat(): winston.Logform.Format {\n return winston.format.combine(\n winston.format.errors({ stack: true }),\n winston.format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n winston.format.printf(info => {\n const metaText = formatMeta(info.meta);\n const line = `[${info.timestamp}] [${info.level.toUpperCase()}]: ${info.message}`;\n if (info.stack) {\n return `${line} ${info.stack}`;\n }\n return metaText ? `${line} ${metaText}` : line;\n }),\n );\n}\n\nfunction rotateTransport(\n logDir: string,\n name: 'combined' | 'errors',\n level: string,\n): DailyRotateFile {\n return new DailyRotateFile({\n dirname: logDir,\n filename: `${name}-%DATE%.log`,\n datePattern: 'YYYY-MM-DD',\n level,\n maxFiles: `${positiveIntFromEnv(process.env.LOG_RETENTION_DAYS, DEFAULT_RETENTION_DAYS)}d`,\n maxSize: logFileMaxSize(),\n zippedArchive: false,\n auditFile: path.join(logDir, `.${name}-audit.json`),\n format: createFileFormat(),\n });\n}\n\nexport function createFileLogTransports(): winston.transport[] {\n if (process.env.LOG_TO_FILE?.trim() === 'false') {\n return [];\n }\n\n const logDir =\n process.env.LOG_FILE_DIR?.trim() || path.join(os.tmpdir(), 'conduit-logs');\n fs.mkdirSync(logDir, { recursive: true });\n\n return [\n rotateTransport(logDir, 'combined', 'info'),\n rotateTransport(logDir, 'errors', 'error'),\n ];\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 { AccessTokenClaims, ConduitGrpcSdk, GrpcError } from '@conduitplatform/grpc-sdk';\nimport { status } from '@grpc/grpc-js';\nimport { createPublicKey } from 'node:crypto';\nimport {\n AccessTokenSigningKeys,\n AccessTokenVerifyOptions,\n verifyAccessToken,\n} from './accessTokenVerifier.logic.js';\n\nexport type AccessTokenMode = 'session' | 'jwt';\n\nexport interface AccessTokenVerifierSnapshot {\n mode: AccessTokenMode;\n strictRevocation: boolean;\n ready: boolean;\n tokenVersion: number;\n /** Current signing key id, if keys are loaded. */\n kid?: string;\n}\n\nexport const AUTHENTICATION_CONFIG_UPDATE_CHANNEL = 'authentication:config:update';\n\nconst INITIAL_RETRY_MS = 1000;\nconst MAX_RETRY_MS = 30000;\nconst REFRESH_INTERVAL_MS = 5 * 60 * 1000;\nconst UNKNOWN_KID_REFETCH_MIN_MS = 10 * 1000;\nconst SUBSCRIBER_ID = 'access-token-verifier';\n\n/**\n * In-process verifier for \"jwt\" session mode access tokens. Holds the authentication\n * module's public signing keys, kept fresh through the config bus channel.\n */\nfunction isConfigWithAccessTokens(\n config: unknown,\n): config is { accessTokens: Record<string, any> } {\n return (\n typeof config === 'object' &&\n config !== null &&\n typeof (config as { accessTokens?: unknown }).accessTokens === 'object' &&\n (config as { accessTokens?: unknown }).accessTokens !== null\n );\n}\n\nexport class AccessTokenVerifier {\n private static instance?: AccessTokenVerifier;\n\n private _mode: AccessTokenMode = 'session';\n private _strictRevocation = false;\n private _tokenVersion = 0;\n private _signing?: AccessTokenSigningKeys;\n private _loaded = false;\n private _subscribed = false;\n private _generation = 0;\n private _running = false;\n private _retryTimer?: NodeJS.Timeout;\n private _refreshTimer?: NodeJS.Timeout;\n private _lastRefetch = 0;\n private _refetching = false;\n private _warned = new Set<string>();\n private _listeners = new Set<(state: AccessTokenVerifierSnapshot) => void>();\n\n private constructor(private readonly grpcSdk: ConduitGrpcSdk) {}\n\n static getInstance(grpcSdk: ConduitGrpcSdk): AccessTokenVerifier {\n if (!AccessTokenVerifier.instance) {\n AccessTokenVerifier.instance = new AccessTokenVerifier(grpcSdk);\n }\n return AccessTokenVerifier.instance;\n }\n\n /**\n * Internal, for tests only: stops the verifier, clears all state and drops the singleton.\n */\n static resetForTests(): void {\n AccessTokenVerifier.instance?.stop();\n AccessTokenVerifier.instance?.resetState();\n AccessTokenVerifier.instance = undefined;\n }\n\n private resetState() {\n this._mode = 'session';\n this._strictRevocation = false;\n this._tokenVersion = 0;\n this._signing = undefined;\n this._loaded = false;\n this._lastRefetch = 0;\n this._warned.clear();\n this._listeners.clear();\n }\n\n /** Snapshot of the verifier's observable state. */\n get state(): AccessTokenVerifierSnapshot {\n return {\n mode: this._mode,\n strictRevocation: this._strictRevocation,\n ready: this.ready,\n tokenVersion: this._tokenVersion,\n kid: this._signing?.kid,\n };\n }\n\n /**\n * Registers a listener fired synchronously at the end of every applyConfig that changed\n * anything (including the first successful load). Returns an unsubscribe function.\n */\n onChange(listener: (state: AccessTokenVerifierSnapshot) => void): () => void {\n this._listeners.add(listener);\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n private fingerprint(): string {\n return JSON.stringify([this._loaded, this._signing, this.state]);\n }\n\n get mode(): AccessTokenMode {\n return this._mode;\n }\n\n get strictRevocation(): boolean {\n return this._strictRevocation;\n }\n\n /** True once signing keys have been loaded. */\n get ready(): boolean {\n return !!this._signing?.publicKey;\n }\n\n get tokenVersion(): number {\n return this._tokenVersion;\n }\n\n /**\n * Loads the authentication config, subscribes to its updates and starts a slow periodic\n * refresh. The first attempt is awaited; if it fails, retries continue in the background\n * with capped backoff until the config is loaded and the subscription is acknowledged.\n * Idempotent while running; never throws.\n */\n async start(): Promise<void> {\n if (this._running) return;\n this._running = true;\n const generation = ++this._generation;\n await this.attempt(generation, INITIAL_RETRY_MS);\n if (generation !== this._generation) return;\n this._refreshTimer = setInterval(() => void this.refetch(true), REFRESH_INTERVAL_MS);\n this._refreshTimer.unref?.();\n }\n\n stop(): void {\n this._running = false;\n this._generation++;\n if (this._retryTimer) clearTimeout(this._retryTimer);\n if (this._refreshTimer) clearInterval(this._refreshTimer);\n this._retryTimer = undefined;\n this._refreshTimer = undefined;\n if (this._subscribed) {\n try {\n this.grpcSdk.bus?.unsubscribe(SUBSCRIBER_ID);\n } catch {\n // ignore\n }\n this._subscribed = false;\n }\n }\n\n private async attempt(generation: number, delay: number): Promise<void> {\n if (generation !== this._generation) return;\n try {\n await this.subscribe(generation);\n if (!this._loaded) {\n this.applyConfig(await this.grpcSdk.config.get('authentication'));\n }\n } catch {\n // authentication or the bus may not be up yet; retry below\n }\n if (generation !== this._generation) return;\n if (this._subscribed && this._loaded) return;\n this._retryTimer = setTimeout(\n () => void this.attempt(generation, Math.min(delay * 2, MAX_RETRY_MS)),\n delay,\n );\n this._retryTimer.unref?.();\n }\n\n private async subscribe(generation: number) {\n if (this._subscribed) return;\n const bus = this.grpcSdk.bus;\n if (!bus) return;\n await bus.subscribeAck(\n AUTHENTICATION_CONFIG_UPDATE_CHANNEL,\n (message: string) => {\n try {\n this.applyConfig(JSON.parse(message));\n } catch {\n // ignore malformed update, keep previous state\n }\n },\n SUBSCRIBER_ID,\n );\n if (generation !== this._generation) {\n bus.unsubscribe(SUBSCRIBER_ID);\n return;\n }\n this._subscribed = true;\n }\n\n /** Refetches the config from the authentication module; failures keep the previous state. */\n private async refetch(force = false): Promise<void> {\n const now = Date.now();\n if (this._refetching) return;\n if (!force && now - this._lastRefetch < UNKNOWN_KID_REFETCH_MIN_MS) return;\n this._lastRefetch = now;\n this._refetching = true;\n try {\n this.applyConfig(await this.grpcSdk.config.get('authentication'));\n } catch {\n // keep previous state\n } finally {\n this._refetching = false;\n }\n }\n\n private warnOnce(key: string, message: string) {\n if (this._warned.has(key)) return;\n this._warned.add(key);\n ConduitGrpcSdk.Logger.warn(`AccessTokenVerifier: ${message}`);\n }\n\n private static validPem(pem: unknown): pem is string {\n if (typeof pem !== 'string' || !pem) return false;\n try {\n createPublicKey(pem);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Validates and normalizes the signing keys. Returns undefined when no signing block is\n * configured, null when the public key is invalid (the caller keeps the previous state).\n */\n private normalizeSigning(\n s: AccessTokenSigningKeys | undefined,\n ): AccessTokenSigningKeys | undefined | null {\n if (!(s && typeof s.kid === 'string' && s.kid && s.publicKey)) return undefined;\n if (!AccessTokenVerifier.validPem(s.publicKey)) {\n this.warnOnce('publicKey', 'invalid signing public key, keeping previous state');\n return null;\n }\n const previousPublicKey = this.validPreviousKey(s.previousPublicKey);\n return {\n kid: s.kid,\n publicKey: s.publicKey,\n previousKid: previousPublicKey ? s.previousKid || undefined : undefined,\n previousPublicKey,\n previousRetiredAt: Number(s.previousRetiredAt ?? 0),\n };\n }\n\n private validPreviousKey(pem: string | undefined): string | undefined {\n if (!pem) return undefined;\n if (AccessTokenVerifier.validPem(pem)) return pem;\n this.warnOnce('previousPublicKey', 'invalid previous public key, ignoring it');\n return undefined;\n }\n\n private parseTokenVersion(raw: unknown): number {\n const version = Number(raw ?? 0);\n if (Number.isNaN(version)) {\n this.warnOnce('tokenVersion', 'invalid tokenVersion, all tokens will be rejected');\n }\n return version;\n }\n\n private notifyListeners(): void {\n const state = this.state;\n for (const listener of [...this._listeners]) {\n try {\n listener(state);\n } catch (e) {\n ConduitGrpcSdk.Logger.warn(\n `AccessTokenVerifier: change listener failed: ${(e as Error)?.message}`,\n );\n }\n }\n }\n\n /**\n * Applies an authentication module config object (full config). Invalid input is ignored\n * and the previous state is kept; invalid keys are logged once.\n */\n applyConfig(config: unknown): void {\n if (!isConfigWithAccessTokens(config)) return;\n const tokens = config.accessTokens;\n const before = this.fingerprint();\n const signing = this.normalizeSigning(tokens.signing);\n if (signing === null) return;\n const version = this.parseTokenVersion(tokens.tokenVersion);\n this._mode = tokens.mode === 'jwt' ? 'jwt' : 'session';\n this._tokenVersion = version; // NaN never equals a claim's tv: fails closed\n this._strictRevocation = tokens.strictRevocation === true;\n this._signing = signing;\n this._loaded = true;\n if (this.fingerprint() !== before) this.notifyListeners();\n }\n\n /**\n * Verifies an access token, throwing GrpcError(UNAUTHENTICATED) with a short reason on failure.\n * `options.now` is epoch milliseconds. An `unknown kid` triggers a throttled (at most once\n * per 10 s) background refetch of the config, to pick up a rotation sooner.\n */\n verify(token: string, options?: AccessTokenVerifyOptions): AccessTokenClaims {\n if (!this._signing) {\n throw new GrpcError(status.UNAUTHENTICATED, 'verifier not ready');\n }\n try {\n return verifyAccessToken(\n token,\n { tokenVersion: this._tokenVersion, signing: this._signing },\n options,\n );\n } catch (e) {\n if ((e as Error).message === 'unknown kid') void this.refetch();\n throw e;\n }\n }\n}\n","import { createDecoder, createVerifier } from 'fast-jwt';\nimport { status } from '@grpc/grpc-js';\nimport { AccessTokenClaims, GrpcError } from '@conduitplatform/grpc-sdk';\n\nexport interface AccessTokenSigningKeys {\n kid: string;\n /** PEM (SPKI) Ed25519 public key. */\n publicKey: string;\n previousKid?: string;\n previousPublicKey?: string;\n /** Epoch ms until which the previous key is still accepted. 0 (or unset) means no previous key. */\n previousRetiredAt?: number;\n}\n\nexport interface AccessTokenVerifierState {\n tokenVersion: number;\n signing: AccessTokenSigningKeys;\n}\n\nexport interface AccessTokenVerifyOptions {\n /** Client id of the request. When set, it must equal the token's `cid`. */\n clientId?: string;\n /** Current time in epoch milliseconds. Defaults to Date.now(). */\n now?: number;\n /** Clock skew tolerance for `exp`. Defaults to 5 seconds. */\n leewaySeconds?: number;\n}\n\nexport const DEFAULT_LEEWAY_SECONDS = 5;\n\nconst verifiers = new Map<string, ReturnType<typeof createVerifier>>();\nconst decode = createDecoder({ complete: true });\n\nfunction fail(reason: string): never {\n throw new GrpcError(status.UNAUTHENTICATED, reason);\n}\n\nfunction getVerifier(publicKey: string) {\n let verifier = verifiers.get(publicKey);\n if (!verifier) {\n // Expiry is checked here (with leeway and an injectable clock), not by fast-jwt.\n verifier = createVerifier({\n key: publicKey,\n algorithms: ['EdDSA'],\n ignoreExpiration: true,\n ignoreNotBefore: true,\n cache: false,\n });\n verifiers.set(publicKey, verifier);\n }\n return verifier;\n}\n\n/** Picks the public key for `kid`: the current key, or the previous one while its retirement is in the future. */\nexport function selectVerificationKey(\n kid: string | undefined,\n signing: AccessTokenSigningKeys,\n now: number,\n): string | undefined {\n if (!kid) return undefined;\n if (signing.publicKey && kid === signing.kid) return signing.publicKey;\n if (\n signing.previousKid &&\n signing.previousPublicKey &&\n kid === signing.previousKid &&\n (signing.previousRetiredAt ?? 0) > now\n ) {\n return signing.previousPublicKey;\n }\n return undefined;\n}\n\n/**\n * Verifies an Ed25519 access token. Throws GrpcError(UNAUTHENTICATED) with a short,\n * key-material-free reason on any failure.\n */\nexport function verifyAccessToken(\n token: string,\n state: AccessTokenVerifierState,\n options: AccessTokenVerifyOptions = {},\n): AccessTokenClaims {\n const now = options.now ?? Date.now();\n const leeway = options.leewaySeconds ?? DEFAULT_LEEWAY_SECONDS;\n if (typeof token !== 'string' || token.length === 0) fail('malformed token');\n\n let kid: string | undefined;\n try {\n const decoded = decode(token);\n if (decoded.header.alg !== 'EdDSA') fail('unsupported algorithm');\n kid = decoded.header.kid;\n } catch (e) {\n if (e instanceof GrpcError) throw e;\n fail('malformed token');\n }\n\n const key = selectVerificationKey(kid, state.signing, now);\n if (!key) fail('unknown kid');\n\n let claims: AccessTokenClaims;\n try {\n claims = getVerifier(key)(token) as unknown as AccessTokenClaims;\n } catch {\n fail('bad signature');\n }\n\n if (\n typeof claims.sub !== 'string' ||\n typeof claims.sid !== 'string' ||\n typeof claims.exp !== 'number'\n ) {\n fail('malformed token');\n }\n if (now / 1000 >= claims.exp + leeway) fail('expired');\n if (claims.tv !== state.tokenVersion) fail('version mismatch');\n if (options.clientId !== undefined && claims.cid !== options.clientId) {\n fail('client mismatch');\n }\n return claims;\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","ConduitGrpcSdk","GrpcError","status","status","ConduitGrpcSdk","ConduitRouteActions","ConduitGrpcSdk","GrpcError","status","GrpcError","status","path","ConduitRouteActions","ConduitGrpcSdk","ConduitGrpcSdk","status","path","status","ModuleLifecycleStage","ConduitGrpcSdk","ConduitGrpcSdk","HealthCheckStatus","ConduitGrpcSdk","clearTimeout","meta","ConduitGrpcSdk","path","winston","createServer","ConduitGrpcSdk","registry","MetricType","Counter","Histogram","Registry","path","status","HealthCheckStatus","ConduitGrpcSdk","path","isRecord","ConduitGrpcSdk","GrpcError","status","createVerifier","status","GrpcError","ConduitGrpcSdk","GrpcError","status","status","ConduitGrpcSdk","status","GrpcError"]}
|