@polygonlabs/servercore 1.5.1-dev.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +443 -31
- package/dist/index.js +951 -8
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
- package/dist/api/health-check.d.ts +0 -8
- package/dist/api/health-check.js +0 -89
- package/dist/api/health-check.js.map +0 -1
- package/dist/api/index.d.ts +0 -9
- package/dist/api/index.js +0 -4
- package/dist/api/index.js.map +0 -1
- package/dist/api/response_handler.d.ts +0 -15
- package/dist/api/response_handler.js +0 -23
- package/dist/api/response_handler.js.map +0 -1
- package/dist/api/zod_utils.d.ts +0 -7
- package/dist/api/zod_utils.js +0 -42
- package/dist/api/zod_utils.js.map +0 -1
- package/dist/constants/error_codes.d.ts +0 -29
- package/dist/constants/error_codes.js +0 -34
- package/dist/constants/error_codes.js.map +0 -1
- package/dist/constants/http_success_codes.d.ts +0 -5
- package/dist/constants/http_success_codes.js +0 -7
- package/dist/constants/http_success_codes.js.map +0 -1
- package/dist/constants/index.d.ts +0 -2
- package/dist/constants/index.js +0 -3
- package/dist/constants/index.js.map +0 -1
- package/dist/consumers/abstract_cron_event_consumer.d.ts +0 -23
- package/dist/consumers/abstract_cron_event_consumer.js +0 -30
- package/dist/consumers/abstract_cron_event_consumer.js.map +0 -1
- package/dist/consumers/abstract_event_consumer.d.ts +0 -34
- package/dist/consumers/abstract_event_consumer.js +0 -41
- package/dist/consumers/abstract_event_consumer.js.map +0 -1
- package/dist/consumers/event_consumer.d.ts +0 -26
- package/dist/consumers/event_consumer.js +0 -141
- package/dist/consumers/event_consumer.js.map +0 -1
- package/dist/consumers/index.d.ts +0 -11
- package/dist/consumers/index.js +0 -4
- package/dist/consumers/index.js.map +0 -1
- package/dist/consumers/rest_api_consumer.d.ts +0 -30
- package/dist/consumers/rest_api_consumer.js +0 -131
- package/dist/consumers/rest_api_consumer.js.map +0 -1
- package/dist/errors/api_errors.d.ts +0 -32
- package/dist/errors/api_errors.js +0 -96
- package/dist/errors/api_errors.js.map +0 -1
- package/dist/errors/base_error.d.ts +0 -22
- package/dist/errors/base_error.js +0 -30
- package/dist/errors/base_error.js.map +0 -1
- package/dist/errors/consumer_errors.d.ts +0 -13
- package/dist/errors/consumer_errors.js +0 -18
- package/dist/errors/consumer_errors.js.map +0 -1
- package/dist/errors/database_errors.d.ts +0 -13
- package/dist/errors/database_errors.js +0 -18
- package/dist/errors/database_errors.js.map +0 -1
- package/dist/errors/external_dependency_error.d.ts +0 -15
- package/dist/errors/external_dependency_error.js +0 -29
- package/dist/errors/external_dependency_error.js.map +0 -1
- package/dist/errors/index.d.ts +0 -5
- package/dist/errors/index.js +0 -6
- package/dist/errors/index.js.map +0 -1
- package/dist/logger/index.d.ts +0 -3
- package/dist/logger/index.js +0 -2
- package/dist/logger/index.js.map +0 -1
- package/dist/logger/logger.d.ts +0 -54
- package/dist/logger/logger.js +0 -124
- package/dist/logger/logger.js.map +0 -1
- package/dist/storage/cache_interface.d.ts +0 -13
- package/dist/storage/cache_interface.js +0 -1
- package/dist/storage/cache_interface.js.map +0 -1
- package/dist/storage/db_interface.d.ts +0 -18
- package/dist/storage/db_interface.js +0 -1
- package/dist/storage/db_interface.js.map +0 -1
- package/dist/storage/index.d.ts +0 -5
- package/dist/storage/index.js +0 -4
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/queue_interface.d.ts +0 -11
- package/dist/storage/queue_interface.js +0 -1
- package/dist/storage/queue_interface.js.map +0 -1
- package/dist/types/database.d.ts +0 -62
- package/dist/types/database.js +0 -1
- package/dist/types/database.js.map +0 -1
- package/dist/types/event_consumer_config.d.ts +0 -19
- package/dist/types/event_consumer_config.js +0 -1
- package/dist/types/event_consumer_config.js.map +0 -1
- package/dist/types/index.d.ts +0 -9
- package/dist/types/index.js +0 -8
- package/dist/types/index.js.map +0 -1
- package/dist/types/logger_config.d.ts +0 -18
- package/dist/types/logger_config.js +0 -2
- package/dist/types/logger_config.js.map +0 -1
- package/dist/types/observer.d.ts +0 -8
- package/dist/types/observer.js +0 -1
- package/dist/types/observer.js.map +0 -1
- package/dist/types/queue_job_opts.d.ts +0 -5
- package/dist/types/queue_job_opts.js +0 -1
- package/dist/types/queue_job_opts.js.map +0 -1
- package/dist/types/response_context.d.ts +0 -6
- package/dist/types/response_context.js +0 -1
- package/dist/types/response_context.js.map +0 -1
- package/dist/types/rest_api_consumer_config.d.ts +0 -17
- package/dist/types/rest_api_consumer_config.js +0 -1
- package/dist/types/rest_api_consumer_config.js.map +0 -1
- package/dist/utils/decoder.d.ts +0 -10
- package/dist/utils/decoder.js +0 -12
- package/dist/utils/decoder.js.map +0 -1
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.js +0 -3
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/ulid.d.ts +0 -3
- package/dist/utils/ulid.js +0 -24
- package/dist/utils/ulid.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./api\";\nexport * from \"./logger\";\nexport * from \"./constants\";\nexport * from \"./types\";\nexport * from \"./errors\";\nexport * from \"./storage\";\nexport * from \"./consumers\";\nexport * from \"./utils\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/constants/error_codes.ts","../src/constants/http_success_codes.ts","../src/errors/base_error.ts","../src/errors/api_errors.ts","../src/errors/database_errors.ts","../src/errors/external_dependency_error.ts","../src/errors/consumer_errors.ts","../src/api/response_handler.ts","../src/api/zod_utils.ts","../src/api/health-check.ts","../src/logger/logger.ts","../src/logger/sentry_transport.ts","../src/types/logger_config.ts","../src/consumers/event_consumer.ts","../src/consumers/abstract_event_consumer.ts","../src/consumers/abstract_cron_event_consumer.ts","../src/consumers/rest_api_consumer.ts","../src/utils/decoder.ts","../src/utils/ulid.ts"],"sourcesContent":["export const errorCodes = {\n // Base error identifier\n base: { BASE_ERROR: 100 },\n\n // Consumer related error codes\n consumer: {\n UNKNOWN_CONSUMER_ERR: 1000,\n },\n\n // Datastore related error codes\n datastore: {\n UNKNOWN_DATASTORE_ERR: 2000,\n DATASTORE_AUTH_ERR: 2001,\n DATASTORE_READ_ERROR: 2002,\n DATASTORE_WRITE_ERROR: 2003,\n },\n\n // External dependencies errors codes\n external: {\n UNKNOWN_EXTERNAL_DEPENDENCY_ERROR: 3000,\n },\n\n // API related error codes\n api: {\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TOO_MANY_REQUESTS: 429,\n INTERNAL_SERVER_ERROR: 500,\n GATEWAY_ERROR: 502,\n TIMEOUT_ERROR: 504,\n },\n};\n","export const httpResponseCodes = {\n OK_RESPONSE: 200,\n};\n","import { errorCodes } from \"../constants\";\n\n/**\n * BaseError used within the micro services that guarantees we don't loose the stack trace.\n */\nexport class BaseError extends Error {\n public readonly name: string;\n public readonly code: number;\n public readonly isFatal: boolean;\n public readonly origin: string;\n public readonly context: Record<string, any>;\n /**\n * @param name {string} - The error name\n * @param code {number} - The error code\n * @param isFatal {boolean} - Flag to know if it is a fatal error\n * @param message {string} - The actual error message\n * @param origin {string} - The point this error originated\n * @param context Record<string, any> - The stack trace\n */\n constructor(\n name: string,\n code: number,\n message: string = \"Unknown error\",\n isFatal?: boolean,\n origin?: string,\n context?: Record<string, any>\n ) {\n super(message);\n this.name = name;\n this.code = code;\n this.isFatal = isFatal ?? true;\n this.origin = origin ?? \"base_error\";\n this.context = context ?? {};\n Object.setPrototypeOf(this, new.target.prototype);\n }\n identifier: number = errorCodes.base.BASE_ERROR;\n}\n","import { BaseError } from \"./base_error\";\nimport { errorCodes } from \"../constants\";\n\nexport class ApiError extends BaseError {\n constructor(\n message: string,\n {\n name = \"INTERNAL_SERVER_ERROR\",\n code = errorCodes.api.INTERNAL_SERVER_ERROR,\n isFatal = false,\n origin = \"api_errors\",\n context = {},\n }: {\n name?: string;\n code?: number;\n isFatal?: boolean;\n origin?: string;\n context?: Record<string, any>;\n } = {}\n ) {\n super(name, code, message, isFatal, origin, context);\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class UnauthorizedError extends ApiError {\n constructor(\n message: string = \"Invalid auth credentials\",\n context: Record<string, any> = {},\n origin: string = \"api_errors\"\n ) {\n super(message, {\n name: \"UNAUTHORIZED\",\n code: errorCodes.api.UNAUTHORIZED,\n isFatal: false,\n origin,\n context,\n });\n }\n}\n\nexport class ForbiddenError extends ApiError {\n constructor(\n message: string = \"You do not have permission to perform this action\",\n context: Record<string, any> = {},\n origin: string = \"api_errors\"\n ) {\n super(message, {\n name: \"FORBIDDEN\",\n code: errorCodes.api.FORBIDDEN,\n isFatal: false,\n origin,\n context,\n });\n }\n}\n\nexport class BadRequestError extends ApiError {\n public readonly validationErrors: Record<string, string[]>;\n\n constructor(\n message: string = \"Malformed or invalid request\",\n validationErrors: Record<string, any> = {},\n context: Record<string, any> = {},\n origin: string = \"api_errors\"\n ) {\n super(message, {\n name: \"BAD_REQUEST\",\n code: errorCodes.api.BAD_REQUEST,\n isFatal: false,\n origin,\n context,\n });\n this.validationErrors = validationErrors;\n }\n}\n\nexport class NotFoundError extends ApiError {\n constructor(\n message: string,\n entity: string = \"Path\",\n identifier?: string | number,\n context: Record<string, any> = {},\n origin: string = \"api_errors\"\n ) {\n if (!message) {\n message = identifier\n ? `${entity} with identifier ${identifier} not found`\n : `${entity} not found`;\n }\n\n super(message, {\n name: \"NOT_FOUND\",\n code: errorCodes.api.NOT_FOUND,\n isFatal: false,\n origin,\n context: { entity, identifier, ...context },\n });\n }\n}\n\nexport class RateLimitError extends ApiError {\n constructor(\n message: string = \"Rate limit exceeded\",\n context: Record<string, any> = {},\n origin: string = \"api_errors\"\n ) {\n super(message, {\n name: \"RATE_LIMIT\",\n code: errorCodes.api.TOO_MANY_REQUESTS,\n isFatal: false,\n origin,\n context,\n });\n }\n}\n\nexport class TimeoutError extends ApiError {\n constructor(\n operation: string,\n timeoutMs: number,\n context: Record<string, any> = {},\n origin: string = \"api_errors\"\n ) {\n super(`Operation '${operation}' timed out after ${timeoutMs}ms`, {\n name: \"TIMEOUT\",\n code: errorCodes.api.TIMEOUT_ERROR, // Gateway Timeout\n isFatal: false,\n origin,\n context: { operation, timeoutMs, ...context },\n });\n }\n}\n","import { BaseError } from \"./base_error\";\nimport { errorCodes } from \"../constants\";\n\nexport class DatabaseError extends BaseError {\n constructor(\n message: string,\n originalError?: Error,\n {\n name = \"DATABASE_ERROR\",\n code = errorCodes.consumer.UNKNOWN_CONSUMER_ERR,\n isFatal = true,\n origin = \"databse_errors\",\n context = {},\n }: {\n name?: string;\n code?: number;\n isFatal?: boolean;\n origin?: string;\n context?: Record<string, any>;\n } = {}\n ) {\n super(name, code, message, isFatal, origin, context);\n Error.captureStackTrace(this, this.constructor);\n }\n}\n","import { BaseError } from \"./base_error\";\nimport { errorCodes } from \"../constants\";\n\nexport class ExternalDependencyError extends BaseError {\n public readonly apiName: string;\n\n public readonly externalCode?: string | number;\n\n public readonly rawError?: any;\n\n constructor(\n apiName: string,\n message: string,\n {\n externalCode,\n rawError,\n context = {},\n origin = \"external_dependency_error\",\n }: {\n externalCode?: string | number;\n rawError?: any;\n context?: Record<string, any>;\n origin?: string;\n } = {}\n ) {\n super(\n \"EXTERNAL_DEPENDENCY_ERROR\",\n errorCodes.external.UNKNOWN_EXTERNAL_DEPENDENCY_ERROR,\n `${apiName} API error: ${message}`,\n false,\n origin,\n { apiName, externalCode, ...context }\n );\n\n this.apiName = apiName;\n this.externalCode = externalCode;\n this.rawError = rawError;\n }\n}\n","import { BaseError } from \"./base_error\";\nimport { errorCodes } from \"../constants\";\n\nexport class ConsumerError extends BaseError {\n constructor(\n message: string,\n {\n name = \"CONSUMER_ERROR\",\n code = errorCodes.consumer.UNKNOWN_CONSUMER_ERR,\n isFatal = true,\n origin = \"consumer_errors\",\n context = {},\n }: {\n name?: string;\n code?: number;\n isFatal?: boolean;\n origin?: string;\n context?: Record<string, any>;\n } = {}\n ) {\n super(name, code, message, isFatal, origin, context);\n Error.captureStackTrace(this, this.constructor);\n }\n}\n","import { ApiError, DatabaseError, ExternalDependencyError } from \"../errors\"; // Define your error types\nimport { httpResponseCodes, errorCodes } from \"../constants\"; // Define your success codes\nimport type { ResponseContext } from \"../types\";\n\nexport const handleResponse = (\n c: ResponseContext,\n data: any,\n pagination?: {\n total: number;\n limit: number;\n offset?: number;\n nextStartAfterCursor?: string | number;\n }\n) => {\n // This method returns a success response with the status and data.\n return c\n .status(httpResponseCodes.OK_RESPONSE) // Use success code from httpResponseCodes\n .json({\n status: \"success\",\n data: data,\n pagination,\n });\n};\n\nexport const handleError = (\n c: ResponseContext,\n error: ApiError | ExternalDependencyError | DatabaseError\n) => {\n // This method returns an error response with the error details.\n return c\n .status(error.code ?? errorCodes.api.INTERNAL_SERVER_ERROR) // Use error code or default to internal server error\n .json({\n status: \"error\",\n message: error.message,\n name: error.name,\n code: error.code,\n details: error.context,\n });\n};\n","import { z } from \"zod\";\n\n// Utility function for validating the request body\nexport const validateBody = <T extends z.ZodTypeAny>(\n schema: T,\n data: unknown\n): z.infer<T> => {\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new Error(\n `Invalid body: ${JSON.stringify(result.error.format(), null, 2)}`\n );\n }\n return result.data;\n};\n\n// Utility function for validating query parameters\nexport const validateQuery = <T extends z.ZodTypeAny>(\n schema: T,\n query: Record<string, unknown>\n): z.infer<T> => {\n const result = schema.safeParse(query);\n if (!result.success) {\n throw new Error(\n `Invalid query params: ${JSON.stringify(\n result.error.format(),\n null,\n 2\n )}`\n );\n }\n return result.data;\n};\n\n// Utility function for validating path parameters\nexport const validateParams = <T extends z.ZodTypeAny>(\n schema: T,\n params: Record<string, string>\n): z.infer<T> => {\n const result = schema.safeParse(params);\n if (!result.success) {\n throw new Error(\n `Invalid path params: ${JSON.stringify(\n result.error.format(),\n null,\n 2\n )}`\n );\n }\n return result.data;\n};\n","import { handleResponse, handleError } from \"./response_handler\";\nimport type { ResponseContext } from \"../types\";\nimport { ApiError } from \"../errors\";\n\nexport class HealthCheck {\n constructor(private readonly urls: string[]) { }\n\n async checkHealth(): Promise<string> {\n try {\n const results = await Promise.all(\n this.urls.map(async (url) => {\n const response = await fetch(`${url}`);\n if (!response.ok) {\n throw new Error(`Health check failed for ${url}`);\n }\n return response;\n })\n );\n\n if (results.every((res) => res.ok)) {\n return \"ok\";\n }\n throw new Error(\"One or more URLs failed the health check.\");\n } catch (error) {\n const failedUrlChecks = await Promise.all(\n this.urls.map(async (url) => {\n try {\n const response = await fetch(`${url}`);\n return { url, failed: !response.ok };\n } catch {\n return { url, failed: true };\n }\n })\n );\n const failedUrls = failedUrlChecks\n .filter(check => check.failed)\n .map(check => check.url);\n\n throw new ApiError(\n `Health check failed for the following URLs: ${failedUrls.join(\n \", \"\n )}. Original error: ${(error as Error).message}`\n );\n }\n }\n}\n\n// Utility to convert Bun context to ResponseContext\nfunction createResponseContext(c: any): ResponseContext {\n c.status = c.status || 200; // Default status to 200 if undefined\n return {\n status: (statusCode: number) => {\n c.status = statusCode;\n return createResponseContext(c); // Return the updated context\n },\n json: (body: any) => {\n return new Response(JSON.stringify(body), {\n status: c.status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n },\n };\n}\n\n// Setup Bun server with health check route\nexport function setupHealthCheckServer(\n urls: string[],\n serverPort: number,\n func?: Function\n): void {\n const healthCheck = new HealthCheck(urls);\n\n Bun.serve({\n port: serverPort,\n routes: {\n \"/health-check\": {\n GET: async (c: any) => {\n try {\n if (func) {\n await func();\n } else {\n await healthCheck.checkHealth();\n }\n return handleResponse(createResponseContext(c), \"ok\");\n } catch (error) {\n return handleError(\n createResponseContext(c),\n error as ApiError\n );\n }\n },\n },\n },\n });\n\n console.log(\n `Health check server running on http://localhost:${serverPort}/health-check`\n );\n}\n","import winston from \"winston\";\nimport type { ILoggerConfig } from \"../types\";\nimport SentryTransport from \"./sentry_transport\";\nimport { BaseError } from \"../errors\";\nimport { errorCodes } from \"../constants\";\n\nexport class Logger {\n private static logger: winston.Logger;\n\n /**\n * @static\n * Create method must first be called before using the logger. It creates a singleton, which will then\n * be referred to throughout the application.\n */\n static create(config: ILoggerConfig) {\n if (!this.logger) {\n this.logger = winston.createLogger({\n format: winston.format.json(),\n transports: [\n new winston.transports.Console({\n level: config.console?.level || \"info\",\n }),\n new SentryTransport({\n sentry: {\n dsn: config.sentry?.dsn,\n },\n level: config.sentry?.level || \"error\",\n }),\n ],\n ...config.winston\n });\n }\n }\n\n static ensureInitialized(): void {\n if (!this.logger) {\n throw new BaseError(\n \"LOGGER_ERROR\",\n errorCodes.base.BASE_ERROR,\n \"Logger not initialized. Please call Logger.create() first.\",\n true,\n \"Logger\",\n undefined\n );\n }\n }\n\n /**\n * @static\n * Method to log for level - \"info\", this should not be called if it has been custom levels are\n * set which does not include \"info\"\n *\n * @param {string|object} message - String or object to log.\n */\n static info(message: string | object) {\n this.ensureInitialized();\n if (typeof message === \"string\") {\n this.logger.info(message);\n } else {\n this.logger.info(JSON.stringify(message));\n }\n }\n\n /**\n * @static\n * Method to log for level - \"debug\", this should not be called if it has been custom levels are\n * set which does not include \"debug\"\n *\n * @param {string|object} message - String or object to log.\n */\n static debug(message: string | object) {\n this.ensureInitialized();\n if (typeof message === \"string\") {\n this.logger?.debug(message);\n } else {\n this.logger?.debug(JSON.stringify(message));\n }\n }\n\n /**\n * @static\n * Method to log for level - \"error\", this should not be called if it has been custom levels are\n * set which does not include \"error\"\n *\n * @param {string|object} error - String or object to log.\n */\n static error(error: string | object) {\n this.ensureInitialized();\n if (typeof error === \"string\") {\n this.logger?.error(error);\n } else {\n this.logger?.error(\n `${(error as Error).message\n ? `${(error as Error).message} : `\n : \"\"\n }${JSON.stringify(error)}`\n );\n }\n }\n\n /**\n * @static\n * Method to log for level - \"warn\", this should not be called if it has been custom levels are\n * set which does not include \"warn\"\n *\n * @param {string|object} message - String or object to log.\n */\n static warn(message: string | object) {\n this.ensureInitialized();\n if (typeof message === \"string\") {\n this.logger?.warn(message);\n } else {\n this.logger?.warn(JSON.stringify(message));\n }\n }\n\n /**\n * @static\n * Method to log for any level, which should be used to log all custom levels that may be added.\n *\n * @param {string|object} message - String or object to log.\n */\n static log(level: string, message: string | object) {\n this.ensureInitialized();\n if (typeof message === \"string\") {\n this.logger?.log(level, message);\n } else {\n this.logger?.log(level, JSON.stringify(message));\n }\n }\n}\n","// Inlined from winston-transport-sentry-node@3.0.0\n// Removed because its CJS dist caused ESM interop failures when bundled.\nimport * as Sentry from \"@sentry/node\";\nimport Transport from \"winston-transport\";\nimport { LEVEL } from \"triple-beam\";\n\nenum SentrySeverity {\n Debug = \"debug\",\n Log = \"log\",\n Info = \"info\",\n Warning = \"warning\",\n Error = \"error\",\n Fatal = \"fatal\",\n}\n\nconst DEFAULT_LEVELS_MAP: SeverityOptions = {\n silly: SentrySeverity.Debug,\n verbose: SentrySeverity.Debug,\n info: SentrySeverity.Info,\n debug: SentrySeverity.Debug,\n warn: SentrySeverity.Warning,\n error: SentrySeverity.Error,\n};\n\nexport interface SentryTransportOptions extends Transport.TransportStreamOptions {\n sentry?: Sentry.NodeOptions;\n levelsMap?: SeverityOptions;\n skipSentryInit?: boolean;\n}\n\ninterface SeverityOptions {\n [key: string]: Sentry.SeverityLevel;\n}\n\nclass ExtendedError extends Error {\n constructor(info: any) {\n super(info.message);\n this.name = info.name || \"Error\";\n if (info.stack && typeof info.stack === \"string\") {\n this.stack = info.stack;\n }\n }\n}\n\nexport default class SentryTransport extends Transport {\n public silent = false;\n private levelsMap: SeverityOptions = {};\n\n public constructor(opts?: SentryTransportOptions) {\n super(opts);\n this.levelsMap = this.setLevelsMap(opts && opts.levelsMap);\n this.silent = (opts && opts.silent) || false;\n if (!opts || !opts.skipSentryInit) {\n Sentry.init(SentryTransport.withDefaults((opts && opts.sentry) || {}));\n }\n }\n\n public log(info: any, callback: () => void) {\n setImmediate(() => {\n this.emit(\"logged\", info);\n });\n if (this.silent) return callback();\n const { message, tags, user, ...meta } = info;\n const winstonLevel = info[LEVEL];\n const sentryLevel = this.levelsMap[winstonLevel];\n const scope = Sentry.getCurrentScope();\n scope.clear();\n if (tags !== undefined && SentryTransport.isObject(tags)) {\n scope.setTags(tags);\n }\n scope.setExtras(meta);\n if (user !== undefined && SentryTransport.isObject(user)) {\n scope.setUser(user);\n }\n if (SentryTransport.shouldLogException(sentryLevel)) {\n const error =\n Object.values(info).find((value) => value instanceof Error) ??\n new ExtendedError(info);\n Sentry.captureException(error, { tags, level: sentryLevel });\n return callback();\n }\n Sentry.captureMessage(message, sentryLevel);\n return callback();\n }\n\n end(...args: any[]) {\n Sentry.flush().then(() => {\n super.end(...args);\n });\n return this;\n }\n\n public get sentry() {\n return Sentry;\n }\n\n private setLevelsMap = (options?: SeverityOptions): SeverityOptions => {\n if (!options) return DEFAULT_LEVELS_MAP;\n const customLevelsMap = Object.keys(options).reduce<SeverityOptions>(\n (acc: { [key: string]: any }, winstonSeverity: string) => {\n acc[winstonSeverity] = options[winstonSeverity];\n return acc;\n },\n {},\n );\n return { ...DEFAULT_LEVELS_MAP, ...customLevelsMap };\n };\n\n private static withDefaults(options: Sentry.NodeOptions) {\n return {\n ...options,\n dsn: (options && options.dsn) || process.env.SENTRY_DSN || \"\",\n serverName: (options && options.serverName) || \"winston-transport-sentry-node\",\n environment:\n (options && options.environment) ||\n process.env.SENTRY_ENVIRONMENT ||\n process.env.NODE_ENV ||\n \"production\",\n debug: (options && options.debug) || !!process.env.SENTRY_DEBUG || false,\n sampleRate: (options && options.sampleRate) || 1.0,\n maxBreadcrumbs: (options && options.maxBreadcrumbs) || 100,\n };\n }\n\n private static isObject(obj: any) {\n const type = typeof obj;\n return type === \"function\" || (type === \"object\" && !!obj);\n }\n\n private static shouldLogException(level: Sentry.SeverityLevel) {\n return level === SentrySeverity.Fatal || level === SentrySeverity.Error;\n }\n}\n","import winston from \"winston\";\n\n/**\n * Logger configuration interface\n */\nexport interface ILoggerConfig {\n sentry?: {\n dsn?: string;\n level?: string;\n environment?: string;\n };\n console?: {\n level?: string;\n };\n winston?: winston.LoggerOptions;\n}\n","import { Logger } from \"../logger\";\nimport { createPublicClient, http, type PublicClient, type WatchEventReturnType } from \"viem\";\nimport { ConsumerError, ExternalDependencyError } from \"../errors\";\nimport type { IEventConsumerConfig, IObserver } from \"../types\";\nimport { AbstractEventConsumer } from \"./abstract_event_consumer\";\nimport { errorCodes } from \"../constants\";\n\nexport class EventConsumer<T, U> extends AbstractEventConsumer {\n protected client: PublicClient | null = null;\n protected observer: IObserver<T, ConsumerError, U> | null = null;\n public isBackfillingInProcess: boolean = false;\n protected unWatchFunction: WatchEventReturnType | undefined;\n\n constructor(private readonly config: IEventConsumerConfig) {\n super();\n this.client = createPublicClient({\n chain: {\n id: config.chainId,\n name: \"custom\",\n rpcUrls: { default: { http: [config.rpcUrl] } },\n nativeCurrency: config.nativeCurrency,\n },\n transport: http(config.rpcUrl),\n });\n }\n\n private async _backfillEvents(\n fromBlock: bigint,\n toBlock: bigint,\n step: bigint\n ): Promise<void> {\n Logger.info({\n location: \"event_consumer\",\n functon: \"_backfillEvents\",\n status: `[Backfill] Starting backfill from block ${fromBlock.toString()} to ${toBlock.toString()}`,\n });\n\n for (let start = fromBlock; start <= toBlock; start += step) {\n const end =\n start + step - 1n > toBlock ? toBlock : start + step - 1n;\n Logger.debug({\n location: \"event_consumer\",\n functon: \"_backfillEvents\",\n status: `[Backfill] Fetching logs from block ${start.toString()} to ${end.toString()}`,\n });\n const getLogsConfig: any = {\n address: this.config.contractAddress,\n fromBlock: start,\n toBlock: end,\n };\n if (this.config.events.length > 1) {\n getLogsConfig.events = this.config.events;\n } else {\n getLogsConfig.event = this.config.events[0];\n }\n const logs = await this.client?.getLogs(getLogsConfig);\n Logger.debug({\n location: \"event_consumer\",\n functon: \"_backfillEvents\",\n status: `[Backfill] ${logs?.length} logs from block ${start.toString()} to ${end.toString()}`,\n });\n await this.observer?.next(logs as T);\n }\n }\n\n public async start(\n observer: IObserver<T, ConsumerError, U>\n ): Promise<void> {\n try {\n this.isBackfillingInProcess = true\n this.observer = observer;\n const latestBlock: bigint =\n (await this.client?.getBlockNumber()) ?? BigInt(0);\n Logger.debug({\n location: \"event_consumer\",\n functon: \"start\",\n data: {\n latestBlock: latestBlock.toString(),\n startBlock: this.config.startBlock.toString(),\n pollBatchSize: this.config.pollBatchSize.toString(),\n },\n });\n if (latestBlock - this.config.startBlock > BigInt(0)) {\n await this._backfillEvents(\n this.config.startBlock,\n latestBlock,\n this.config.pollBatchSize\n );\n }\n this.isBackfillingInProcess = false\n\n Logger.debug({\n location: \"event_consumer\",\n functon: \"start\",\n status: `Starting event subscription`,\n });\n\n this.unWatchFunction = this.client?.watchEvent({\n address: this.config.contractAddress,\n events: this.config.events,\n fromBlock: latestBlock,\n onLogs: (logs) => {\n const transformedLogs = logs as T;\n this.observer?.next(transformedLogs);\n },\n onError: (error) => {\n this.onDisconnect();\n this.onFatalError(\n new ConsumerError(error.name, {\n name: \"CONSUMER_ERROR\",\n code: 1001,\n isFatal: true,\n origin: \"EventConsumer\",\n context: { eventName: this.config.events },\n })\n );\n },\n });\n\n Logger.debug({\n location: \"event_consumer\",\n functon: \"start\",\n status: `Subscribed to event`,\n });\n } catch (error) {\n this.onDisconnect();\n this.onFatalError(\n new ExternalDependencyError(\n this.config.rpcUrl,\n \"Failed to start the event consumer\",\n {\n externalCode:\n errorCodes.external\n .UNKNOWN_EXTERNAL_DEPENDENCY_ERROR,\n rawError: error as Error,\n origin: \"EventConsumer\",\n context: { eventName: this.config.events },\n }\n )\n );\n }\n }\n\n /**\n * Private method which updates the connection status of consumer to disconnected, and removes all listeners.\n *\n * @returns {void}\n */\n public onDisconnect(): void {\n this.removeAllListeners();\n if (this.unWatchFunction) {\n this.unWatchFunction();\n }\n this.observer?.closed();\n }\n}\n","import type { ConsumerError } from \"../errors\";\nimport { EventEmitter } from \"events\";\n\nexport class AbstractEventConsumer extends EventEmitter {\n constructor() {\n super();\n }\n\n /**\n * @public\n *\n * Method to register listener for events. The Abstract Event Consumer emits fatalError\n * event.\n *\n * @param {\"fatalError\"} eventName - Event name to register listener for.\n * @param listener - Listener to be called when emitting the event.\n *\n * @returns {this} - Returns an instance of the class.\n */\n on(\n eventName: \"fatalError\",\n listener: (error: Error | ConsumerError) => void\n ): this {\n return super.on(eventName, listener);\n }\n /**\n * @public\n *\n * Method to register listener for events that will be called only once. The Abstract Event Consumer emits fatalError\n * event.\n *\n * @param {\"fatalError\"} eventName - Event name to register listener for.\n * @param listener - Listener to be called when emitting the event.\n *\n * @returns {this} - Returns an instance of the class.\n */\n once(\n eventName: \"fatalError\",\n listener: (error: Error | ConsumerError) => void\n ): this {\n return super.on(eventName, listener);\n }\n\n protected onFatalError(error: Error | ConsumerError): void {\n this.emit(\"fatalError\", error);\n }\n}\n","import { Cron } from \"croner\";\nimport { AbstractEventConsumer } from \"./abstract_event_consumer\";\n\nexport abstract class AbstractCronEventConsumer extends AbstractEventConsumer {\n private cronJob: Cron | null = null;\n\n /**\n * Start the cron job with the given cron expression.\n * @param cronExpr Cron expression string\n */\n public startCron(cronExpr: string): void {\n if (this.cronJob) {\n this.cronJob.stop();\n }\n this.cronJob = new Cron(cronExpr, { protect: true }, async () => {\n await this.onTick();\n });\n }\n\n /**\n * Stop the cron job.\n */\n public stopCron(): void {\n if (this.cronJob) {\n this.cronJob.stop();\n this.cronJob = null;\n }\n }\n\n /**\n * Implement this in subclasses to define what happens on each cron tick.\n */\n protected abstract onTick(): Promise<void>;\n}\n","import { errorCodes } from \"../constants\";\nimport { ConsumerError } from \"../errors\";\nimport type { IObserver, IRestAPIConsumerConfig } from \"../types\";\nimport { AbstractCronEventConsumer } from \"./abstract_cron_event_consumer\";\n\nexport class RestAPIConsumer<T, U> extends AbstractCronEventConsumer {\n protected observer: IObserver<T, ConsumerError, U> | null = null;\n private currentPage = 0;\n private highestValueSeen = 0;\n\n constructor(private readonly config: IRestAPIConsumerConfig) {\n super();\n this.highestValueSeen = this.config.startCount.value;\n }\n\n public async start(\n observer: IObserver<T, ConsumerError, U>\n ): Promise<void> {\n this.observer = observer;\n this.currentPage = 1;\n if (this.config.cronExpr) {\n this.startCron(this.config.cronExpr);\n } else {\n // fallback: run once if no cron\n await this.onTick();\n }\n }\n\n public stop(): void {\n this.stopCron();\n }\n\n protected async onTick(): Promise<void> {\n // Reset page counter at the start of each cron run\n this.currentPage = 1;\n\n // Keep fetching pages until we've caught up\n let shouldFetchNextPage = true;\n\n while (shouldFetchNextPage) {\n shouldFetchNextPage = await this.fetchPage();\n }\n\n // Update config with the highest value we've seen\n // This prevents fetching the same data in the next cron run\n this.config.startCount.value = this.highestValueSeen;\n this.observer?.summary({\n [`${this.config.startCount.key}`]: this.config.startCount.value,\n } as U);\n }\n\n private async fetchPage(): Promise<boolean> {\n try {\n // Use paginationParam from config or default to \"page\"\n const paginationParam = this.config.paginationParam || \"page\";\n const params = {\n ...(this.config.params || {}),\n [paginationParam]: this.currentPage.toString(),\n };\n\n let url = this.config.apiUrl.toString();\n if (Object.keys(params).length > 0) {\n const queryString = new URLSearchParams(params).toString();\n url += (url.includes(\"?\") ? \"&\" : \"?\") + queryString;\n }\n\n const response = await fetch(url, {\n method: this.config.method || \"GET\",\n headers: this.config.headers,\n body: this.config.body\n ? JSON.stringify(this.config.body)\n : undefined,\n });\n\n if (!response.ok) {\n throw new ConsumerError(\n `Failed to fetch from API: ${response.statusText}`,\n {\n code: errorCodes.external\n .UNKNOWN_EXTERNAL_DEPENDENCY_ERROR,\n isFatal: true,\n origin: \"rest_api_consumer\",\n }\n );\n }\n\n let data = await response.json();\n if (this.config.resultPath) {\n data = this.getValueByPath(data, this.config.resultPath);\n }\n\n // Extract the value we're tracking\n const countKey = this.config.startCount.key;\n let currentValue: number | undefined = undefined;\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return false;\n }\n for (const elem of data) {\n currentValue = this.processDataForCurrentCountValue(\n elem,\n countKey\n );\n }\n } else {\n currentValue = this.processDataForCurrentCountValue(\n data,\n countKey\n );\n }\n\n // Send data to observer\n this.observer?.next(data);\n\n // Increment page for next potential fetch\n this.currentPage++;\n\n // Continue fetching if the current value is <= our threshold\n if (currentValue === undefined) {\n // If currentValue was never set, stop fetching\n return false;\n }\n return currentValue >= this.config.startCount.value;\n } catch (error) {\n this.onFatalError(error as ConsumerError);\n return false; // Stop fetching on error\n }\n }\n\n // Utility to get nested values using dot notation (e.g., \"response.data.count\")\n private getValueByPath(obj: any, path: string): any {\n return path.split(\".\").reduce((prev, curr) => {\n return prev && prev[curr] !== undefined ? prev[curr] : undefined;\n }, obj);\n }\n\n private processDataForCurrentCountValue(\n item: any,\n countKey: string\n ): number {\n const value = this.getValueByPath(item, countKey);\n if (value === undefined) {\n throw new ConsumerError(\n `Count key '${countKey}' not found in API response`,\n {\n code: errorCodes.external.UNKNOWN_EXTERNAL_DEPENDENCY_ERROR,\n isFatal: false,\n origin: \"rest_api_consumer\",\n }\n );\n }\n this.highestValueSeen = Math.max(this.highestValueSeen, value);\n return value;\n }\n\n /**\n * Updates the start count value to a specific value.\n * This allows reprocessing data from a specified point.\n *\n * @param value The value to set as the new start count\n */\n public setStartValue(value: number): void {\n this.config.startCount.value = value;\n this.highestValueSeen = value;\n }\n}\n","import { decodeEventLog, parseAbi, decodeAbiParameters } from \"viem\";\n\nexport const parseEventLog = (\n eventSignature: string[],\n data: `0x${string}`,\n topics: any\n) => {\n return decodeEventLog({ abi: parseAbi(eventSignature), data, topics });\n};\n\nexport const decodeAbiParams = (\n params: Array<{ name?: string; type: string }>,\n data: `0x${string}`\n) => {\n return decodeAbiParameters(params, data);\n};","import { monotonicFactory, ulid } from \"ulid\";\n\nfunction deterministicPRNG(seed: number): () => number {\n let t = seed;\n return () => {\n t += 0x6d2b79f5; // Increment the seed with a large prime\n t = Math.imul(t ^ (t >>> 15), t | 1); // XOR and multiply\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61); // More XOR and shifts\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296; // Normalize to [0, 1]\n };\n}\n\nexport function generateDeterministicULID(\n dataToEncode: string[],\n timeSeed?: number,\n separator?: string\n): string {\n if (\n !Array.isArray(dataToEncode) ||\n !dataToEncode.every((item) => typeof item === \"string\")\n ) {\n throw new Error(\"dataToEncode must be an array of strings\");\n }\n const monotonicULID = monotonicFactory();\n const timestampPart = timeSeed\n ? ulid(timeSeed, deterministicPRNG(timeSeed))\n : monotonicULID();\n return [timestampPart, ...dataToEncode.filter(Boolean)].join(\n separator || \"-\"\n );\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polygonlabs/servercore",
|
|
3
|
-
"version": "1.5.1
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -30,16 +30,18 @@
|
|
|
30
30
|
"typescript": "^5"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
+
"@sentry/node": "^10.46.0",
|
|
33
34
|
"croner": "^9.0.0",
|
|
35
|
+
"triple-beam": "^1.4.1",
|
|
34
36
|
"ulid": "^3.0.1",
|
|
35
37
|
"viem": "^2.26.3",
|
|
36
38
|
"winston": "^3.17.0",
|
|
37
|
-
"winston-transport
|
|
39
|
+
"winston-transport": "^4.9.0",
|
|
38
40
|
"zod": "^3.24.2"
|
|
39
41
|
},
|
|
40
42
|
"devDependencies": {
|
|
41
43
|
"@types/bun": "latest",
|
|
42
44
|
"bun-types": "latest"
|
|
43
45
|
},
|
|
44
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "4396c53ba6836f214554fb4b96722a2705f001ef"
|
|
45
47
|
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
declare class HealthCheck {
|
|
2
|
-
private readonly urls;
|
|
3
|
-
constructor(urls: string[]);
|
|
4
|
-
checkHealth(): Promise<string>;
|
|
5
|
-
}
|
|
6
|
-
declare function setupHealthCheckServer(urls: string[], serverPort: number, func?: Function): void;
|
|
7
|
-
|
|
8
|
-
export { HealthCheck, setupHealthCheckServer };
|
package/dist/api/health-check.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { handleResponse, handleError } from "./response_handler";
|
|
2
|
-
import { ApiError } from "../errors";
|
|
3
|
-
class HealthCheck {
|
|
4
|
-
constructor(urls) {
|
|
5
|
-
this.urls = urls;
|
|
6
|
-
}
|
|
7
|
-
async checkHealth() {
|
|
8
|
-
try {
|
|
9
|
-
const results = await Promise.all(
|
|
10
|
-
this.urls.map(async (url) => {
|
|
11
|
-
const response = await fetch(`${url}`);
|
|
12
|
-
if (!response.ok) {
|
|
13
|
-
throw new Error(`Health check failed for ${url}`);
|
|
14
|
-
}
|
|
15
|
-
return response;
|
|
16
|
-
})
|
|
17
|
-
);
|
|
18
|
-
if (results.every((res) => res.ok)) {
|
|
19
|
-
return "ok";
|
|
20
|
-
}
|
|
21
|
-
throw new Error("One or more URLs failed the health check.");
|
|
22
|
-
} catch (error) {
|
|
23
|
-
const failedUrlChecks = await Promise.all(
|
|
24
|
-
this.urls.map(async (url) => {
|
|
25
|
-
try {
|
|
26
|
-
const response = await fetch(`${url}`);
|
|
27
|
-
return { url, failed: !response.ok };
|
|
28
|
-
} catch {
|
|
29
|
-
return { url, failed: true };
|
|
30
|
-
}
|
|
31
|
-
})
|
|
32
|
-
);
|
|
33
|
-
const failedUrls = failedUrlChecks.filter((check) => check.failed).map((check) => check.url);
|
|
34
|
-
throw new ApiError(
|
|
35
|
-
`Health check failed for the following URLs: ${failedUrls.join(
|
|
36
|
-
", "
|
|
37
|
-
)}. Original error: ${error.message}`
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function createResponseContext(c) {
|
|
43
|
-
c.status = c.status || 200;
|
|
44
|
-
return {
|
|
45
|
-
status: (statusCode) => {
|
|
46
|
-
c.status = statusCode;
|
|
47
|
-
return createResponseContext(c);
|
|
48
|
-
},
|
|
49
|
-
json: (body) => {
|
|
50
|
-
return new Response(JSON.stringify(body), {
|
|
51
|
-
status: c.status,
|
|
52
|
-
headers: { "Content-Type": "application/json" }
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
function setupHealthCheckServer(urls, serverPort, func) {
|
|
58
|
-
const healthCheck = new HealthCheck(urls);
|
|
59
|
-
Bun.serve({
|
|
60
|
-
port: serverPort,
|
|
61
|
-
routes: {
|
|
62
|
-
"/health-check": {
|
|
63
|
-
GET: async (c) => {
|
|
64
|
-
try {
|
|
65
|
-
if (func) {
|
|
66
|
-
await func();
|
|
67
|
-
} else {
|
|
68
|
-
await healthCheck.checkHealth();
|
|
69
|
-
}
|
|
70
|
-
return handleResponse(createResponseContext(c), "ok");
|
|
71
|
-
} catch (error) {
|
|
72
|
-
return handleError(
|
|
73
|
-
createResponseContext(c),
|
|
74
|
-
error
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
console.log(
|
|
82
|
-
`Health check server running on http://localhost:${serverPort}/health-check`
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
export {
|
|
86
|
-
HealthCheck,
|
|
87
|
-
setupHealthCheckServer
|
|
88
|
-
};
|
|
89
|
-
//# sourceMappingURL=health-check.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/health-check.ts"],"sourcesContent":["import { handleResponse, handleError } from \"./response_handler\";\nimport type { ResponseContext } from \"../types\";\nimport { ApiError } from \"../errors\";\n\nexport class HealthCheck {\n constructor(private readonly urls: string[]) { }\n\n async checkHealth(): Promise<string> {\n try {\n const results = await Promise.all(\n this.urls.map(async (url) => {\n const response = await fetch(`${url}`);\n if (!response.ok) {\n throw new Error(`Health check failed for ${url}`);\n }\n return response;\n })\n );\n\n if (results.every((res) => res.ok)) {\n return \"ok\";\n }\n throw new Error(\"One or more URLs failed the health check.\");\n } catch (error) {\n const failedUrlChecks = await Promise.all(\n this.urls.map(async (url) => {\n try {\n const response = await fetch(`${url}`);\n return { url, failed: !response.ok };\n } catch {\n return { url, failed: true };\n }\n })\n );\n const failedUrls = failedUrlChecks\n .filter(check => check.failed)\n .map(check => check.url);\n\n throw new ApiError(\n `Health check failed for the following URLs: ${failedUrls.join(\n \", \"\n )}. Original error: ${(error as Error).message}`\n );\n }\n }\n}\n\n// Utility to convert Bun context to ResponseContext\nfunction createResponseContext(c: any): ResponseContext {\n c.status = c.status || 200; // Default status to 200 if undefined\n return {\n status: (statusCode: number) => {\n c.status = statusCode;\n return createResponseContext(c); // Return the updated context\n },\n json: (body: any) => {\n return new Response(JSON.stringify(body), {\n status: c.status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n },\n };\n}\n\n// Setup Bun server with health check route\nexport function setupHealthCheckServer(\n urls: string[],\n serverPort: number,\n func?: Function\n): void {\n const healthCheck = new HealthCheck(urls);\n\n Bun.serve({\n port: serverPort,\n routes: {\n \"/health-check\": {\n GET: async (c: any) => {\n try {\n if (func) {\n await func();\n } else {\n await healthCheck.checkHealth();\n }\n return handleResponse(createResponseContext(c), \"ok\");\n } catch (error) {\n return handleError(\n createResponseContext(c),\n error as ApiError\n );\n }\n },\n },\n },\n });\n\n console.log(\n `Health check server running on http://localhost:${serverPort}/health-check`\n );\n}\n"],"mappings":"AAAA,SAAS,gBAAgB,mBAAmB;AAE5C,SAAS,gBAAgB;AAElB,MAAM,YAAY;AAAA,EACrB,YAA6B,MAAgB;AAAhB;AAAA,EAAkB;AAAA,EAE/C,MAAM,cAA+B;AACjC,QAAI;AACA,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC1B,KAAK,KAAK,IAAI,OAAO,QAAQ;AACzB,gBAAM,WAAW,MAAM,MAAM,GAAG,GAAG,EAAE;AACrC,cAAI,CAAC,SAAS,IAAI;AACd,kBAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,UACpD;AACA,iBAAO;AAAA,QACX,CAAC;AAAA,MACL;AAEA,UAAI,QAAQ,MAAM,CAAC,QAAQ,IAAI,EAAE,GAAG;AAChC,eAAO;AAAA,MACX;AACA,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC/D,SAAS,OAAO;AACZ,YAAM,kBAAkB,MAAM,QAAQ;AAAA,QAClC,KAAK,KAAK,IAAI,OAAO,QAAQ;AACzB,cAAI;AACA,kBAAM,WAAW,MAAM,MAAM,GAAG,GAAG,EAAE;AACrC,mBAAO,EAAE,KAAK,QAAQ,CAAC,SAAS,GAAG;AAAA,UACvC,QAAQ;AACJ,mBAAO,EAAE,KAAK,QAAQ,KAAK;AAAA,UAC/B;AAAA,QACJ,CAAC;AAAA,MACL;AACA,YAAM,aAAa,gBACd,OAAO,WAAS,MAAM,MAAM,EAC5B,IAAI,WAAS,MAAM,GAAG;AAE3B,YAAM,IAAI;AAAA,QACN,+CAA+C,WAAW;AAAA,UACtD;AAAA,QACJ,CAAC,qBAAsB,MAAgB,OAAO;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AACJ;AAGA,SAAS,sBAAsB,GAAyB;AACpD,IAAE,SAAS,EAAE,UAAU;AACvB,SAAO;AAAA,IACH,QAAQ,CAAC,eAAuB;AAC5B,QAAE,SAAS;AACX,aAAO,sBAAsB,CAAC;AAAA,IAClC;AAAA,IACA,MAAM,CAAC,SAAc;AACjB,aAAO,IAAI,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,QACtC,QAAQ,EAAE;AAAA,QACV,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAClD,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;AAGO,SAAS,uBACZ,MACA,YACA,MACI;AACJ,QAAM,cAAc,IAAI,YAAY,IAAI;AAExC,MAAI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACJ,iBAAiB;AAAA,QACb,KAAK,OAAO,MAAW;AACnB,cAAI;AACA,gBAAI,MAAM;AACN,oBAAM,KAAK;AAAA,YACf,OAAO;AACH,oBAAM,YAAY,YAAY;AAAA,YAClC;AACA,mBAAO,eAAe,sBAAsB,CAAC,GAAG,IAAI;AAAA,UACxD,SAAS,OAAO;AACZ,mBAAO;AAAA,cACH,sBAAsB,CAAC;AAAA,cACvB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,UAAQ;AAAA,IACJ,mDAAmD,UAAU;AAAA,EACjE;AACJ;","names":[]}
|
package/dist/api/index.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export { handleError, handleResponse } from './response_handler.js';
|
|
2
|
-
export { validateBody, validateParams, validateQuery } from './zod_utils.js';
|
|
3
|
-
export { HealthCheck, setupHealthCheckServer } from './health-check.js';
|
|
4
|
-
import '../errors/api_errors.js';
|
|
5
|
-
import '../errors/base_error.js';
|
|
6
|
-
import '../errors/database_errors.js';
|
|
7
|
-
import '../errors/external_dependency_error.js';
|
|
8
|
-
import '../types/response_context.js';
|
|
9
|
-
import 'zod';
|
package/dist/api/index.js
DELETED
package/dist/api/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/index.ts"],"sourcesContent":["export * from \"./response_handler\";\nexport * from \"./zod_utils\";\nexport * from \"./health-check\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { ApiError } from '../errors/api_errors.js';
|
|
2
|
-
import { DatabaseError } from '../errors/database_errors.js';
|
|
3
|
-
import { ExternalDependencyError } from '../errors/external_dependency_error.js';
|
|
4
|
-
import { ResponseContext } from '../types/response_context.js';
|
|
5
|
-
import '../errors/base_error.js';
|
|
6
|
-
|
|
7
|
-
declare const handleResponse: (c: ResponseContext, data: any, pagination?: {
|
|
8
|
-
total: number;
|
|
9
|
-
limit: number;
|
|
10
|
-
offset?: number;
|
|
11
|
-
nextStartAfterCursor?: string | number;
|
|
12
|
-
}) => any;
|
|
13
|
-
declare const handleError: (c: ResponseContext, error: ApiError | ExternalDependencyError | DatabaseError) => any;
|
|
14
|
-
|
|
15
|
-
export { handleError, handleResponse };
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { ApiError, DatabaseError, ExternalDependencyError } from "../errors";
|
|
2
|
-
import { httpResponseCodes, errorCodes } from "../constants";
|
|
3
|
-
const handleResponse = (c, data, pagination) => {
|
|
4
|
-
return c.status(httpResponseCodes.OK_RESPONSE).json({
|
|
5
|
-
status: "success",
|
|
6
|
-
data,
|
|
7
|
-
pagination
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
const handleError = (c, error) => {
|
|
11
|
-
return c.status(error.code ?? errorCodes.api.INTERNAL_SERVER_ERROR).json({
|
|
12
|
-
status: "error",
|
|
13
|
-
message: error.message,
|
|
14
|
-
name: error.name,
|
|
15
|
-
code: error.code,
|
|
16
|
-
details: error.context
|
|
17
|
-
});
|
|
18
|
-
};
|
|
19
|
-
export {
|
|
20
|
-
handleError,
|
|
21
|
-
handleResponse
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=response_handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/response_handler.ts"],"sourcesContent":["import { ApiError, DatabaseError, ExternalDependencyError } from \"../errors\"; // Define your error types\nimport { httpResponseCodes, errorCodes } from \"../constants\"; // Define your success codes\nimport type { ResponseContext } from \"../types\";\n\nexport const handleResponse = (\n c: ResponseContext,\n data: any,\n pagination?: {\n total: number;\n limit: number;\n offset?: number;\n nextStartAfterCursor?: string | number;\n }\n) => {\n // This method returns a success response with the status and data.\n return c\n .status(httpResponseCodes.OK_RESPONSE) // Use success code from httpResponseCodes\n .json({\n status: \"success\",\n data: data,\n pagination,\n });\n};\n\nexport const handleError = (\n c: ResponseContext,\n error: ApiError | ExternalDependencyError | DatabaseError\n) => {\n // This method returns an error response with the error details.\n return c\n .status(error.code ?? errorCodes.api.INTERNAL_SERVER_ERROR) // Use error code or default to internal server error\n .json({\n status: \"error\",\n message: error.message,\n name: error.name,\n code: error.code,\n details: error.context,\n });\n};\n"],"mappings":"AAAA,SAAS,UAAU,eAAe,+BAA+B;AACjE,SAAS,mBAAmB,kBAAkB;AAGvC,MAAM,iBAAiB,CAC1B,GACA,MACA,eAMC;AAED,SAAO,EACF,OAAO,kBAAkB,WAAW,EACpC,KAAK;AAAA,IACF,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACJ,CAAC;AACT;AAEO,MAAM,cAAc,CACvB,GACA,UACC;AAED,SAAO,EACF,OAAO,MAAM,QAAQ,WAAW,IAAI,qBAAqB,EACzD,KAAK;AAAA,IACF,QAAQ;AAAA,IACR,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,EACnB,CAAC;AACT;","names":[]}
|
package/dist/api/zod_utils.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
declare const validateBody: <T extends z.ZodTypeAny>(schema: T, data: unknown) => z.infer<T>;
|
|
4
|
-
declare const validateQuery: <T extends z.ZodTypeAny>(schema: T, query: Record<string, unknown>) => z.infer<T>;
|
|
5
|
-
declare const validateParams: <T extends z.ZodTypeAny>(schema: T, params: Record<string, string>) => z.infer<T>;
|
|
6
|
-
|
|
7
|
-
export { validateBody, validateParams, validateQuery };
|
package/dist/api/zod_utils.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
const validateBody = (schema, data) => {
|
|
3
|
-
const result = schema.safeParse(data);
|
|
4
|
-
if (!result.success) {
|
|
5
|
-
throw new Error(
|
|
6
|
-
`Invalid body: ${JSON.stringify(result.error.format(), null, 2)}`
|
|
7
|
-
);
|
|
8
|
-
}
|
|
9
|
-
return result.data;
|
|
10
|
-
};
|
|
11
|
-
const validateQuery = (schema, query) => {
|
|
12
|
-
const result = schema.safeParse(query);
|
|
13
|
-
if (!result.success) {
|
|
14
|
-
throw new Error(
|
|
15
|
-
`Invalid query params: ${JSON.stringify(
|
|
16
|
-
result.error.format(),
|
|
17
|
-
null,
|
|
18
|
-
2
|
|
19
|
-
)}`
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
return result.data;
|
|
23
|
-
};
|
|
24
|
-
const validateParams = (schema, params) => {
|
|
25
|
-
const result = schema.safeParse(params);
|
|
26
|
-
if (!result.success) {
|
|
27
|
-
throw new Error(
|
|
28
|
-
`Invalid path params: ${JSON.stringify(
|
|
29
|
-
result.error.format(),
|
|
30
|
-
null,
|
|
31
|
-
2
|
|
32
|
-
)}`
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
return result.data;
|
|
36
|
-
};
|
|
37
|
-
export {
|
|
38
|
-
validateBody,
|
|
39
|
-
validateParams,
|
|
40
|
-
validateQuery
|
|
41
|
-
};
|
|
42
|
-
//# sourceMappingURL=zod_utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/zod_utils.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// Utility function for validating the request body\nexport const validateBody = <T extends z.ZodTypeAny>(\n schema: T,\n data: unknown\n): z.infer<T> => {\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new Error(\n `Invalid body: ${JSON.stringify(result.error.format(), null, 2)}`\n );\n }\n return result.data;\n};\n\n// Utility function for validating query parameters\nexport const validateQuery = <T extends z.ZodTypeAny>(\n schema: T,\n query: Record<string, unknown>\n): z.infer<T> => {\n const result = schema.safeParse(query);\n if (!result.success) {\n throw new Error(\n `Invalid query params: ${JSON.stringify(\n result.error.format(),\n null,\n 2\n )}`\n );\n }\n return result.data;\n};\n\n// Utility function for validating path parameters\nexport const validateParams = <T extends z.ZodTypeAny>(\n schema: T,\n params: Record<string, string>\n): z.infer<T> => {\n const result = schema.safeParse(params);\n if (!result.success) {\n throw new Error(\n `Invalid path params: ${JSON.stringify(\n result.error.format(),\n null,\n 2\n )}`\n );\n }\n return result.data;\n};\n"],"mappings":"AAAA,SAAS,SAAS;AAGX,MAAM,eAAe,CACxB,QACA,SACa;AACb,QAAM,SAAS,OAAO,UAAU,IAAI;AACpC,MAAI,CAAC,OAAO,SAAS;AACjB,UAAM,IAAI;AAAA,MACN,iBAAiB,KAAK,UAAU,OAAO,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,IACnE;AAAA,EACJ;AACA,SAAO,OAAO;AAClB;AAGO,MAAM,gBAAgB,CACzB,QACA,UACa;AACb,QAAM,SAAS,OAAO,UAAU,KAAK;AACrC,MAAI,CAAC,OAAO,SAAS;AACjB,UAAM,IAAI;AAAA,MACN,yBAAyB,KAAK;AAAA,QAC1B,OAAO,MAAM,OAAO;AAAA,QACpB;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACA,SAAO,OAAO;AAClB;AAGO,MAAM,iBAAiB,CAC1B,QACA,WACa;AACb,QAAM,SAAS,OAAO,UAAU,MAAM;AACtC,MAAI,CAAC,OAAO,SAAS;AACjB,UAAM,IAAI;AAAA,MACN,wBAAwB,KAAK;AAAA,QACzB,OAAO,MAAM,OAAO;AAAA,QACpB;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACA,SAAO,OAAO;AAClB;","names":[]}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
declare const errorCodes: {
|
|
2
|
-
base: {
|
|
3
|
-
BASE_ERROR: number;
|
|
4
|
-
};
|
|
5
|
-
consumer: {
|
|
6
|
-
UNKNOWN_CONSUMER_ERR: number;
|
|
7
|
-
};
|
|
8
|
-
datastore: {
|
|
9
|
-
UNKNOWN_DATASTORE_ERR: number;
|
|
10
|
-
DATASTORE_AUTH_ERR: number;
|
|
11
|
-
DATASTORE_READ_ERROR: number;
|
|
12
|
-
DATASTORE_WRITE_ERROR: number;
|
|
13
|
-
};
|
|
14
|
-
external: {
|
|
15
|
-
UNKNOWN_EXTERNAL_DEPENDENCY_ERROR: number;
|
|
16
|
-
};
|
|
17
|
-
api: {
|
|
18
|
-
BAD_REQUEST: number;
|
|
19
|
-
UNAUTHORIZED: number;
|
|
20
|
-
FORBIDDEN: number;
|
|
21
|
-
NOT_FOUND: number;
|
|
22
|
-
TOO_MANY_REQUESTS: number;
|
|
23
|
-
INTERNAL_SERVER_ERROR: number;
|
|
24
|
-
GATEWAY_ERROR: number;
|
|
25
|
-
TIMEOUT_ERROR: number;
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export { errorCodes };
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
const errorCodes = {
|
|
2
|
-
// Base error identifier
|
|
3
|
-
base: { BASE_ERROR: 100 },
|
|
4
|
-
// Consumer related error codes
|
|
5
|
-
consumer: {
|
|
6
|
-
UNKNOWN_CONSUMER_ERR: 1e3
|
|
7
|
-
},
|
|
8
|
-
// Datastore related error codes
|
|
9
|
-
datastore: {
|
|
10
|
-
UNKNOWN_DATASTORE_ERR: 2e3,
|
|
11
|
-
DATASTORE_AUTH_ERR: 2001,
|
|
12
|
-
DATASTORE_READ_ERROR: 2002,
|
|
13
|
-
DATASTORE_WRITE_ERROR: 2003
|
|
14
|
-
},
|
|
15
|
-
// External dependencies errors codes
|
|
16
|
-
external: {
|
|
17
|
-
UNKNOWN_EXTERNAL_DEPENDENCY_ERROR: 3e3
|
|
18
|
-
},
|
|
19
|
-
// API related error codes
|
|
20
|
-
api: {
|
|
21
|
-
BAD_REQUEST: 400,
|
|
22
|
-
UNAUTHORIZED: 401,
|
|
23
|
-
FORBIDDEN: 403,
|
|
24
|
-
NOT_FOUND: 404,
|
|
25
|
-
TOO_MANY_REQUESTS: 429,
|
|
26
|
-
INTERNAL_SERVER_ERROR: 500,
|
|
27
|
-
GATEWAY_ERROR: 502,
|
|
28
|
-
TIMEOUT_ERROR: 504
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
export {
|
|
32
|
-
errorCodes
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=error_codes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/constants/error_codes.ts"],"sourcesContent":["export const errorCodes = {\n // Base error identifier\n base: { BASE_ERROR: 100 },\n\n // Consumer related error codes\n consumer: {\n UNKNOWN_CONSUMER_ERR: 1000,\n },\n\n // Datastore related error codes\n datastore: {\n UNKNOWN_DATASTORE_ERR: 2000,\n DATASTORE_AUTH_ERR: 2001,\n DATASTORE_READ_ERROR: 2002,\n DATASTORE_WRITE_ERROR: 2003,\n },\n\n // External dependencies errors codes\n external: {\n UNKNOWN_EXTERNAL_DEPENDENCY_ERROR: 3000,\n },\n\n // API related error codes\n api: {\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TOO_MANY_REQUESTS: 429,\n INTERNAL_SERVER_ERROR: 500,\n GATEWAY_ERROR: 502,\n TIMEOUT_ERROR: 504,\n },\n};\n"],"mappings":"AAAO,MAAM,aAAa;AAAA;AAAA,EAEtB,MAAM,EAAE,YAAY,IAAI;AAAA;AAAA,EAGxB,UAAU;AAAA,IACN,sBAAsB;AAAA,EAC1B;AAAA;AAAA,EAGA,WAAW;AAAA,IACP,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,EAC3B;AAAA;AAAA,EAGA,UAAU;AAAA,IACN,mCAAmC;AAAA,EACvC;AAAA;AAAA,EAGA,KAAK;AAAA,IACD,aAAa;AAAA,IACb,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,eAAe;AAAA,IACf,eAAe;AAAA,EACnB;AACJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/constants/http_success_codes.ts"],"sourcesContent":["export const httpResponseCodes = {\n OK_RESPONSE: 200,\n};\n"],"mappings":"AAAO,MAAM,oBAAoB;AAAA,EAC7B,aAAa;AACjB;","names":[]}
|
package/dist/constants/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/constants/index.ts"],"sourcesContent":["export * from \"./error_codes\";\nexport * from \"./http_success_codes\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { AbstractEventConsumer } from './abstract_event_consumer.js';
|
|
2
|
-
import '../errors/consumer_errors.js';
|
|
3
|
-
import '../errors/base_error.js';
|
|
4
|
-
import 'events';
|
|
5
|
-
|
|
6
|
-
declare abstract class AbstractCronEventConsumer extends AbstractEventConsumer {
|
|
7
|
-
private cronJob;
|
|
8
|
-
/**
|
|
9
|
-
* Start the cron job with the given cron expression.
|
|
10
|
-
* @param cronExpr Cron expression string
|
|
11
|
-
*/
|
|
12
|
-
startCron(cronExpr: string): void;
|
|
13
|
-
/**
|
|
14
|
-
* Stop the cron job.
|
|
15
|
-
*/
|
|
16
|
-
stopCron(): void;
|
|
17
|
-
/**
|
|
18
|
-
* Implement this in subclasses to define what happens on each cron tick.
|
|
19
|
-
*/
|
|
20
|
-
protected abstract onTick(): Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export { AbstractCronEventConsumer };
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Cron } from "croner";
|
|
2
|
-
import { AbstractEventConsumer } from "./abstract_event_consumer";
|
|
3
|
-
class AbstractCronEventConsumer extends AbstractEventConsumer {
|
|
4
|
-
cronJob = null;
|
|
5
|
-
/**
|
|
6
|
-
* Start the cron job with the given cron expression.
|
|
7
|
-
* @param cronExpr Cron expression string
|
|
8
|
-
*/
|
|
9
|
-
startCron(cronExpr) {
|
|
10
|
-
if (this.cronJob) {
|
|
11
|
-
this.cronJob.stop();
|
|
12
|
-
}
|
|
13
|
-
this.cronJob = new Cron(cronExpr, { protect: true }, async () => {
|
|
14
|
-
await this.onTick();
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Stop the cron job.
|
|
19
|
-
*/
|
|
20
|
-
stopCron() {
|
|
21
|
-
if (this.cronJob) {
|
|
22
|
-
this.cronJob.stop();
|
|
23
|
-
this.cronJob = null;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
export {
|
|
28
|
-
AbstractCronEventConsumer
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=abstract_cron_event_consumer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/consumers/abstract_cron_event_consumer.ts"],"sourcesContent":["import { Cron } from \"croner\";\nimport { AbstractEventConsumer } from \"./abstract_event_consumer\";\n\nexport abstract class AbstractCronEventConsumer extends AbstractEventConsumer {\n private cronJob: Cron | null = null;\n\n /**\n * Start the cron job with the given cron expression.\n * @param cronExpr Cron expression string\n */\n public startCron(cronExpr: string): void {\n if (this.cronJob) {\n this.cronJob.stop();\n }\n this.cronJob = new Cron(cronExpr, { protect: true }, async () => {\n await this.onTick();\n });\n }\n\n /**\n * Stop the cron job.\n */\n public stopCron(): void {\n if (this.cronJob) {\n this.cronJob.stop();\n this.cronJob = null;\n }\n }\n\n /**\n * Implement this in subclasses to define what happens on each cron tick.\n */\n protected abstract onTick(): Promise<void>;\n}\n"],"mappings":"AAAA,SAAS,YAAY;AACrB,SAAS,6BAA6B;AAE/B,MAAe,kCAAkC,sBAAsB;AAAA,EAClE,UAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,UAAU,UAAwB;AACrC,QAAI,KAAK,SAAS;AACd,WAAK,QAAQ,KAAK;AAAA,IACtB;AACA,SAAK,UAAU,IAAI,KAAK,UAAU,EAAE,SAAS,KAAK,GAAG,YAAY;AAC7D,YAAM,KAAK,OAAO;AAAA,IACtB,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKO,WAAiB;AACpB,QAAI,KAAK,SAAS;AACd,WAAK,QAAQ,KAAK;AAClB,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAMJ;","names":[]}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { ConsumerError } from '../errors/consumer_errors.js';
|
|
2
|
-
import { EventEmitter } from 'events';
|
|
3
|
-
import '../errors/base_error.js';
|
|
4
|
-
|
|
5
|
-
declare class AbstractEventConsumer extends EventEmitter {
|
|
6
|
-
constructor();
|
|
7
|
-
/**
|
|
8
|
-
* @public
|
|
9
|
-
*
|
|
10
|
-
* Method to register listener for events. The Abstract Event Consumer emits fatalError
|
|
11
|
-
* event.
|
|
12
|
-
*
|
|
13
|
-
* @param {"fatalError"} eventName - Event name to register listener for.
|
|
14
|
-
* @param listener - Listener to be called when emitting the event.
|
|
15
|
-
*
|
|
16
|
-
* @returns {this} - Returns an instance of the class.
|
|
17
|
-
*/
|
|
18
|
-
on(eventName: "fatalError", listener: (error: Error | ConsumerError) => void): this;
|
|
19
|
-
/**
|
|
20
|
-
* @public
|
|
21
|
-
*
|
|
22
|
-
* Method to register listener for events that will be called only once. The Abstract Event Consumer emits fatalError
|
|
23
|
-
* event.
|
|
24
|
-
*
|
|
25
|
-
* @param {"fatalError"} eventName - Event name to register listener for.
|
|
26
|
-
* @param listener - Listener to be called when emitting the event.
|
|
27
|
-
*
|
|
28
|
-
* @returns {this} - Returns an instance of the class.
|
|
29
|
-
*/
|
|
30
|
-
once(eventName: "fatalError", listener: (error: Error | ConsumerError) => void): this;
|
|
31
|
-
protected onFatalError(error: Error | ConsumerError): void;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export { AbstractEventConsumer };
|