@polygonlabs/servercore 1.0.0-dev.5 → 1.0.0-dev.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +1 -0
- package/dist/api/response_handler.d.ts +1 -4
- package/dist/api/response_handler.js.map +1 -1
- package/dist/consumers/event_consumer.js +34 -11
- package/dist/consumers/event_consumer.js.map +1 -1
- package/dist/errors/database_errors.js +1 -1
- package/dist/errors/database_errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/response_context.d.ts +6 -0
- package/dist/types/response_context.js +1 -0
- package/dist/types/response_context.js.map +1 -0
- package/package.json +1 -1
package/dist/api/index.d.ts
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
import { ApiError } from '../errors/api_errors.js';
|
2
2
|
import { DatabaseError } from '../errors/database_errors.js';
|
3
3
|
import { ExternalDependencyError } from '../errors/external_dependency_error.js';
|
4
|
+
import { ResponseContext } from '../types/response_context.js';
|
4
5
|
import '../errors/base_error.js';
|
5
6
|
|
6
|
-
type ResponseContext = {
|
7
|
-
status: (statusCode: number) => ResponseContext;
|
8
|
-
json: (body: any) => any;
|
9
|
-
};
|
10
7
|
declare const handleResponse: (c: ResponseContext, data: any) => any;
|
11
8
|
declare const handleError: (c: ResponseContext, error: ApiError | ExternalDependencyError | DatabaseError) => any;
|
12
9
|
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/api/response_handler.ts"],"sourcesContent":["import { ApiError, DatabaseError, ExternalDependencyError } from \"../errors\"; // Define your error types\nimport { httpResposneCodes, errorCodes } from \"../constants\"; // Define your success codes\
|
1
|
+
{"version":3,"sources":["../../src/api/response_handler.ts"],"sourcesContent":["import { ApiError, DatabaseError, ExternalDependencyError } from \"../errors\"; // Define your error types\nimport { httpResposneCodes, errorCodes } from \"../constants\"; // Define your success codes\nimport type { ResponseContext } from \"../types\";\n\nexport const handleResponse = (c: ResponseContext, data: any) => {\n // This method returns a success response with the status and data.\n return c\n .status(httpResposneCodes.OK_RESPONSE) // Use success code from httpResposneCodes\n .json({\n status: \"success\",\n data: data,\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,CAAC,GAAoB,SAAc;AAE7D,SAAO,EACF,OAAO,kBAAkB,WAAW,EACpC,KAAK;AAAA,IACF,QAAQ;AAAA,IACR;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":[]}
|
@@ -1,7 +1,4 @@
|
|
1
|
-
import {
|
2
|
-
createPublicClient,
|
3
|
-
http
|
4
|
-
} from "viem";
|
1
|
+
import { createPublicClient, http } from "viem";
|
5
2
|
import { ConsumerError, ExternalDependencyError } from "../errors";
|
6
3
|
import { AbstractEventConsumer } from "./abstract_event_consumer";
|
7
4
|
import { errorCodes } from "../constants";
|
@@ -12,12 +9,12 @@ class EventConsumer extends AbstractEventConsumer {
|
|
12
9
|
this.config = config;
|
13
10
|
this.client = createPublicClient({
|
14
11
|
chain: {
|
15
|
-
id:
|
12
|
+
id: config.chainId,
|
16
13
|
name: "custom",
|
17
|
-
rpcUrls: { default: { http: [
|
18
|
-
nativeCurrency:
|
14
|
+
rpcUrls: { default: { http: [config.rpcUrl] } },
|
15
|
+
nativeCurrency: config.nativeCurrency
|
19
16
|
},
|
20
|
-
transport: http(
|
17
|
+
transport: http(config.rpcUrl)
|
21
18
|
});
|
22
19
|
}
|
23
20
|
consumerRunning = false;
|
@@ -31,9 +28,11 @@ class EventConsumer extends AbstractEventConsumer {
|
|
31
28
|
});
|
32
29
|
for (let start = fromBlock; start <= toBlock; start += step) {
|
33
30
|
const end = start + step - 1n > toBlock ? toBlock : start + step - 1n;
|
34
|
-
|
35
|
-
|
36
|
-
|
31
|
+
Logger.debug({
|
32
|
+
location: "event_consumer",
|
33
|
+
functon: "_backfillEvents",
|
34
|
+
status: `[Backfill] Fetching logs from block ${start} to ${end}`
|
35
|
+
});
|
37
36
|
const getLogsConfig = {
|
38
37
|
address: this.config.contractAddress,
|
39
38
|
fromBlock: start,
|
@@ -45,6 +44,11 @@ class EventConsumer extends AbstractEventConsumer {
|
|
45
44
|
getLogsConfig.events = this.config.events;
|
46
45
|
}
|
47
46
|
const logs = await this.client?.getLogs(getLogsConfig);
|
47
|
+
Logger.debug({
|
48
|
+
location: "event_consumer",
|
49
|
+
functon: "_backfillEvents",
|
50
|
+
status: `[Backfill] ${logs?.length} logs from block ${start} to ${end}`
|
51
|
+
});
|
48
52
|
await this.observer?.next(logs);
|
49
53
|
}
|
50
54
|
}
|
@@ -52,6 +56,15 @@ class EventConsumer extends AbstractEventConsumer {
|
|
52
56
|
try {
|
53
57
|
this.observer = observer;
|
54
58
|
const latestBlock = await this.client?.getBlockNumber() ?? BigInt(0);
|
59
|
+
Logger.debug({
|
60
|
+
location: "event_consumer",
|
61
|
+
functon: "start",
|
62
|
+
data: {
|
63
|
+
latestBlock,
|
64
|
+
startBlock: this.config.startBlock,
|
65
|
+
pollBatchSize: this.config.pollBatchSize
|
66
|
+
}
|
67
|
+
});
|
55
68
|
if (latestBlock - this.config.startBlock > this.config.pollBatchSize) {
|
56
69
|
await this._backfillEvents(
|
57
70
|
this.config.startBlock,
|
@@ -59,6 +72,11 @@ class EventConsumer extends AbstractEventConsumer {
|
|
59
72
|
this.config.pollBatchSize
|
60
73
|
);
|
61
74
|
}
|
75
|
+
Logger.debug({
|
76
|
+
location: "event_consumer",
|
77
|
+
functon: "start",
|
78
|
+
status: `Starting event subscription`
|
79
|
+
});
|
62
80
|
this.client?.watchEvent({
|
63
81
|
address: this.config.contractAddress,
|
64
82
|
events: this.config.events,
|
@@ -80,6 +98,11 @@ class EventConsumer extends AbstractEventConsumer {
|
|
80
98
|
);
|
81
99
|
}
|
82
100
|
});
|
101
|
+
Logger.debug({
|
102
|
+
location: "event_consumer",
|
103
|
+
functon: "start",
|
104
|
+
status: `Subscribed to event`
|
105
|
+
});
|
83
106
|
} catch (error) {
|
84
107
|
this.onDisconnect();
|
85
108
|
this.onFatalError(
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/consumers/event_consumer.ts"],"sourcesContent":["import {
|
1
|
+
{"version":3,"sources":["../../src/consumers/event_consumer.ts"],"sourcesContent":["import { createPublicClient, http, type PublicClient } from \"viem\";\nimport { ConsumerError, ExternalDependencyError } from \"../errors\";\nimport type { IEventConsumerConfig, IObserver } from \"../types\";\nimport { AbstractEventConsumer } from \"./abstract_event_consumer\";\nimport { errorCodes } from \"../constants\";\nimport { Logger } from \"../logger\";\n\nexport class EventConsumer<T, U> extends AbstractEventConsumer {\n private consumerRunning: boolean = false;\n protected client: PublicClient | null = null;\n protected observer: IObserver<T, ConsumerError, U> | null = null;\n\n constructor(private 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} to ${toBlock}`,\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} to ${end}`,\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.event = this.config.events[0];\n } else {\n getLogsConfig.events = this.config.events;\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} to ${end}`,\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.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,\n startBlock: this.config.startBlock,\n pollBatchSize: this.config.pollBatchSize,\n },\n });\n if (\n latestBlock - this.config.startBlock >\n this.config.pollBatchSize\n ) {\n await this._backfillEvents(\n this.config.startBlock,\n latestBlock,\n this.config.pollBatchSize\n );\n }\n\n Logger.debug({\n location: \"event_consumer\",\n functon: \"start\",\n status: `Starting event subscription`,\n });\n\n this.client?.watchEvent({\n address: this.config.contractAddress,\n events: this.config.events,\n fromBlock: this.config.startBlock,\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 private onDisconnect(): void {\n if (this.consumerRunning) {\n this.consumerRunning = false;\n this.observer?.closed();\n this.removeAllListeners();\n }\n }\n}\n"],"mappings":"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","names":[]}
|
@@ -2,7 +2,7 @@ import { BaseError } from "./base_error";
|
|
2
2
|
import { errorCodes } from "../constants";
|
3
3
|
class DatabaseError extends BaseError {
|
4
4
|
constructor(message, originalError, {
|
5
|
-
name = "
|
5
|
+
name = "DATABASE_ERROR",
|
6
6
|
code = errorCodes.consumer.UNKNOWN_CONSUMER_ERR,
|
7
7
|
isFatal = true,
|
8
8
|
origin = "databse_errors",
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/errors/database_errors.ts"],"sourcesContent":["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 = \"
|
1
|
+
{"version":3,"sources":["../../src/errors/database_errors.ts"],"sourcesContent":["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"],"mappings":"AAAA,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAEpB,MAAM,sBAAsB,UAAU;AAAA,EACzC,YACI,SACA,eACA;AAAA,IACI,OAAO;AAAA,IACP,OAAO,WAAW,SAAS;AAAA,IAC3B,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,EACf,IAMI,CAAC,GACP;AACE,UAAM,MAAM,MAAM,SAAS,SAAS,QAAQ,OAAO;AACnD,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,EAClD;AACJ;","names":[]}
|
package/dist/index.d.ts
CHANGED
@@ -7,6 +7,7 @@ export { ILoggerConfig } from './types/logger_config.js';
|
|
7
7
|
export { IDocumentConditionalModifications, IQueryFilterOperationParams, IQueryOrderOperationParams, OrderByDirection, WhereFilterOp } from './types/database.js';
|
8
8
|
export { IObserver } from './types/observer.js';
|
9
9
|
export { ChainNativeCurrency, IEventConsumerConfig } from './types/event_consumer_config.js';
|
10
|
+
export { ResponseContext } from './types/response_context.js';
|
10
11
|
export { ApiError, BadRequestError, ForbiddenError, NotFoundError, RateLimitError, TimeoutError, UnauthorizedError } from './errors/api_errors.js';
|
11
12
|
export { DatabaseError } from './errors/database_errors.js';
|
12
13
|
export { ExternalDependencyError } from './errors/external_dependency_error.js';
|
package/dist/types/index.d.ts
CHANGED
@@ -2,5 +2,6 @@ export { ILoggerConfig } from './logger_config.js';
|
|
2
2
|
export { IDocumentConditionalModifications, IQueryFilterOperationParams, IQueryOrderOperationParams, OrderByDirection, WhereFilterOp } from './database.js';
|
3
3
|
export { IObserver } from './observer.js';
|
4
4
|
export { ChainNativeCurrency, IEventConsumerConfig } from './event_consumer_config.js';
|
5
|
+
export { ResponseContext } from './response_context.js';
|
5
6
|
import 'winston';
|
6
7
|
import 'viem';
|
package/dist/types/index.js
CHANGED
package/dist/types/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["export * from \"./logger_config\";\nexport * from \"./database\";\nexport * from \"./observer\";\nexport * from \"./event_consumer_config\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
1
|
+
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["export * from \"./logger_config\";\nexport * from \"./database\";\nexport * from \"./observer\";\nexport * from \"./event_consumer_config\";\nexport * from \"./response_context\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
@@ -0,0 +1 @@
|
|
1
|
+
//# sourceMappingURL=response_context.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|