@polygonlabs/servercore 0.0.0 → 1.0.0-beta.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.
Files changed (54) hide show
  1. package/dist/api/index.d.ts +1 -0
  2. package/dist/api/response_handler.d.ts +1 -4
  3. package/dist/api/response_handler.js.map +1 -1
  4. package/dist/consumers/abstract_event_consumer.d.ts +34 -0
  5. package/dist/consumers/abstract_event_consumer.js +41 -0
  6. package/dist/consumers/abstract_event_consumer.js.map +1 -0
  7. package/dist/consumers/event_consumer.d.ts +26 -0
  8. package/dist/consumers/event_consumer.js +141 -0
  9. package/dist/consumers/event_consumer.js.map +1 -0
  10. package/dist/consumers/index.d.ts +8 -0
  11. package/dist/consumers/index.js +2 -0
  12. package/dist/consumers/index.js.map +1 -0
  13. package/dist/errors/database_errors.js +1 -1
  14. package/dist/errors/database_errors.js.map +1 -1
  15. package/dist/index.d.ts +11 -1
  16. package/dist/index.js +3 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/logger/logger.d.ts +2 -0
  19. package/dist/logger/logger.js +33 -30
  20. package/dist/logger/logger.js.map +1 -1
  21. package/dist/{database → storage}/db_interface.d.ts +1 -0
  22. package/dist/storage/index.d.ts +4 -0
  23. package/dist/storage/index.js +3 -0
  24. package/dist/storage/index.js.map +1 -0
  25. package/dist/storage/queue_interface.d.ts +11 -0
  26. package/dist/storage/queue_interface.js +1 -0
  27. package/dist/storage/queue_interface.js.map +1 -0
  28. package/dist/types/event_consumer_config.d.ts +19 -0
  29. package/dist/types/event_consumer_config.js +1 -0
  30. package/dist/types/event_consumer_config.js.map +1 -0
  31. package/dist/types/index.d.ts +5 -0
  32. package/dist/types/index.js +4 -0
  33. package/dist/types/index.js.map +1 -1
  34. package/dist/types/observer.d.ts +8 -0
  35. package/dist/types/observer.js +1 -0
  36. package/dist/types/observer.js.map +1 -0
  37. package/dist/types/queue_job_opts.d.ts +5 -0
  38. package/dist/types/queue_job_opts.js +1 -0
  39. package/dist/types/queue_job_opts.js.map +1 -0
  40. package/dist/types/response_context.d.ts +6 -0
  41. package/dist/types/response_context.js +1 -0
  42. package/dist/types/response_context.js.map +1 -0
  43. package/dist/utils/decoder.d.ts +6 -0
  44. package/dist/utils/decoder.js +8 -0
  45. package/dist/utils/decoder.js.map +1 -0
  46. package/dist/utils/index.d.ts +1 -0
  47. package/dist/utils/index.js +2 -0
  48. package/dist/utils/index.js.map +1 -0
  49. package/package.json +2 -1
  50. package/dist/database/index.d.ts +0 -2
  51. package/dist/database/index.js +0 -2
  52. package/dist/database/index.js.map +0 -1
  53. /package/dist/{database → storage}/db_interface.js +0 -0
  54. /package/dist/{database → storage}/db_interface.js.map +0 -0
@@ -4,4 +4,5 @@ import '../errors/api_errors.js';
4
4
  import '../errors/base_error.js';
5
5
  import '../errors/database_errors.js';
6
6
  import '../errors/external_dependency_error.js';
7
+ import '../types/response_context.js';
7
8
  import 'zod';
@@ -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\n\ntype ResponseContext = {\n // Here we allow the user of this utility to pass the response methods depending on the API framework.\n // For example, in Express, this would be `res` (response) object.\n status: (statusCode: number) => ResponseContext;\n json: (body: any) => any; // Define how to send JSON responses\n};\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;AASvC,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
+ {"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":[]}
@@ -0,0 +1,34 @@
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 };
@@ -0,0 +1,41 @@
1
+ import { EventEmitter } from "events";
2
+ class AbstractEventConsumer extends EventEmitter {
3
+ constructor() {
4
+ super();
5
+ }
6
+ /**
7
+ * @public
8
+ *
9
+ * Method to register listener for events. The Abstract Event Consumer emits fatalError
10
+ * event.
11
+ *
12
+ * @param {"fatalError"} eventName - Event name to register listener for.
13
+ * @param listener - Listener to be called when emitting the event.
14
+ *
15
+ * @returns {this} - Returns an instance of the class.
16
+ */
17
+ on(eventName, listener) {
18
+ return super.on(eventName, listener);
19
+ }
20
+ /**
21
+ * @public
22
+ *
23
+ * Method to register listener for events that will be called only once. The Abstract Event Consumer emits fatalError
24
+ * event.
25
+ *
26
+ * @param {"fatalError"} eventName - Event name to register listener for.
27
+ * @param listener - Listener to be called when emitting the event.
28
+ *
29
+ * @returns {this} - Returns an instance of the class.
30
+ */
31
+ once(eventName, listener) {
32
+ return super.on(eventName, listener);
33
+ }
34
+ onFatalError(error) {
35
+ this.emit("fatalError", error);
36
+ }
37
+ }
38
+ export {
39
+ AbstractEventConsumer
40
+ };
41
+ //# sourceMappingURL=abstract_event_consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/consumers/abstract_event_consumer.ts"],"sourcesContent":["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"],"mappings":"AACA,SAAS,oBAAoB;AAEtB,MAAM,8BAA8B,aAAa;AAAA,EACpD,cAAc;AACV,UAAM;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,GACI,WACA,UACI;AACJ,WAAO,MAAM,GAAG,WAAW,QAAQ;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KACI,WACA,UACI;AACJ,WAAO,MAAM,GAAG,WAAW,QAAQ;AAAA,EACvC;AAAA,EAEU,aAAa,OAAoC;AACvD,SAAK,KAAK,cAAc,KAAK;AAAA,EACjC;AACJ;","names":[]}
@@ -0,0 +1,26 @@
1
+ import { PublicClient, WatchEventReturnType } from 'viem';
2
+ import { ConsumerError } from '../errors/consumer_errors.js';
3
+ import { IObserver } from '../types/observer.js';
4
+ import { IEventConsumerConfig } from '../types/event_consumer_config.js';
5
+ import { AbstractEventConsumer } from './abstract_event_consumer.js';
6
+ import '../errors/base_error.js';
7
+ import 'events';
8
+
9
+ declare class EventConsumer<T, U> extends AbstractEventConsumer {
10
+ private config;
11
+ protected client: PublicClient | null;
12
+ protected observer: IObserver<T, ConsumerError, U> | null;
13
+ isBackfillingInProcess: boolean;
14
+ protected unWatchFunction: WatchEventReturnType | undefined;
15
+ constructor(config: IEventConsumerConfig);
16
+ private _backfillEvents;
17
+ start(observer: IObserver<T, ConsumerError, U>): Promise<void>;
18
+ /**
19
+ * Private method which updates the connection status of consumer to disconnected, and removes all listeners.
20
+ *
21
+ * @returns {void}
22
+ */
23
+ onDisconnect(): void;
24
+ }
25
+
26
+ export { EventConsumer };
@@ -0,0 +1,141 @@
1
+ import { Logger } from "../logger";
2
+ import { createPublicClient, http } from "viem";
3
+ import { ConsumerError, ExternalDependencyError } from "../errors";
4
+ import { AbstractEventConsumer } from "./abstract_event_consumer";
5
+ import { errorCodes } from "../constants";
6
+ class EventConsumer extends AbstractEventConsumer {
7
+ constructor(config) {
8
+ super();
9
+ this.config = config;
10
+ this.client = createPublicClient({
11
+ chain: {
12
+ id: config.chainId,
13
+ name: "custom",
14
+ rpcUrls: { default: { http: [config.rpcUrl] } },
15
+ nativeCurrency: config.nativeCurrency
16
+ },
17
+ transport: http(config.rpcUrl)
18
+ });
19
+ }
20
+ client = null;
21
+ observer = null;
22
+ isBackfillingInProcess = false;
23
+ unWatchFunction;
24
+ async _backfillEvents(fromBlock, toBlock, step) {
25
+ Logger.info({
26
+ location: "event_consumer",
27
+ functon: "_backfillEvents",
28
+ status: `[Backfill] Starting backfill from block ${fromBlock.toString()} to ${toBlock.toString()}`
29
+ });
30
+ for (let start = fromBlock; start <= toBlock; start += step) {
31
+ const end = start + step - 1n > toBlock ? toBlock : start + step - 1n;
32
+ Logger.debug({
33
+ location: "event_consumer",
34
+ functon: "_backfillEvents",
35
+ status: `[Backfill] Fetching logs from block ${start.toString()} to ${end.toString()}`
36
+ });
37
+ const getLogsConfig = {
38
+ address: this.config.contractAddress,
39
+ fromBlock: start,
40
+ toBlock: end
41
+ };
42
+ if (this.config.events.length > 1) {
43
+ getLogsConfig.event = this.config.events[0];
44
+ } else {
45
+ getLogsConfig.events = this.config.events;
46
+ }
47
+ const logs = await this.client?.getLogs(getLogsConfig);
48
+ Logger.debug({
49
+ location: "event_consumer",
50
+ functon: "_backfillEvents",
51
+ status: `[Backfill] ${logs?.length} logs from block ${start.toString()} to ${end.toString()}`
52
+ });
53
+ await this.observer?.next(logs);
54
+ }
55
+ }
56
+ async start(observer) {
57
+ try {
58
+ this.isBackfillingInProcess = true;
59
+ this.observer = observer;
60
+ const latestBlock = await this.client?.getBlockNumber() ?? BigInt(0);
61
+ Logger.debug({
62
+ location: "event_consumer",
63
+ functon: "start",
64
+ data: {
65
+ latestBlock: latestBlock.toString(),
66
+ startBlock: this.config.startBlock.toString(),
67
+ pollBatchSize: this.config.pollBatchSize.toString()
68
+ }
69
+ });
70
+ if (latestBlock - this.config.startBlock > BigInt(0)) {
71
+ await this._backfillEvents(
72
+ this.config.startBlock,
73
+ latestBlock,
74
+ this.config.pollBatchSize
75
+ );
76
+ }
77
+ this.isBackfillingInProcess = false;
78
+ Logger.debug({
79
+ location: "event_consumer",
80
+ functon: "start",
81
+ status: `Starting event subscription`
82
+ });
83
+ this.unWatchFunction = this.client?.watchEvent({
84
+ address: this.config.contractAddress,
85
+ events: this.config.events,
86
+ fromBlock: latestBlock,
87
+ onLogs: (logs) => {
88
+ const transformedLogs = logs;
89
+ this.observer?.next(transformedLogs);
90
+ },
91
+ onError: (error) => {
92
+ this.onDisconnect();
93
+ this.onFatalError(
94
+ new ConsumerError(error.name, {
95
+ name: "CONSUMER_ERROR",
96
+ code: 1001,
97
+ isFatal: true,
98
+ origin: "EventConsumer",
99
+ context: { eventName: this.config.events }
100
+ })
101
+ );
102
+ }
103
+ });
104
+ Logger.debug({
105
+ location: "event_consumer",
106
+ functon: "start",
107
+ status: `Subscribed to event`
108
+ });
109
+ } catch (error) {
110
+ this.onDisconnect();
111
+ this.onFatalError(
112
+ new ExternalDependencyError(
113
+ this.config.rpcUrl,
114
+ "Failed to start the event consumer",
115
+ {
116
+ externalCode: errorCodes.external.UNKNOWN_EXTERNAL_DEPENDENCY_ERROR,
117
+ rawError: error,
118
+ origin: "EventConsumer",
119
+ context: { eventName: this.config.events }
120
+ }
121
+ )
122
+ );
123
+ }
124
+ }
125
+ /**
126
+ * Private method which updates the connection status of consumer to disconnected, and removes all listeners.
127
+ *
128
+ * @returns {void}
129
+ */
130
+ onDisconnect() {
131
+ this.removeAllListeners();
132
+ if (this.unWatchFunction) {
133
+ this.unWatchFunction();
134
+ }
135
+ this.observer?.closed();
136
+ }
137
+ }
138
+ export {
139
+ EventConsumer
140
+ };
141
+ //# sourceMappingURL=event_consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/consumers/event_consumer.ts"],"sourcesContent":["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 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.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.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"],"mappings":"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","names":[]}
@@ -0,0 +1,8 @@
1
+ export { EventConsumer } from './event_consumer.js';
2
+ import 'viem';
3
+ import '../errors/consumer_errors.js';
4
+ import '../errors/base_error.js';
5
+ import '../types/observer.js';
6
+ import '../types/event_consumer_config.js';
7
+ import './abstract_event_consumer.js';
8
+ import 'events';
@@ -0,0 +1,2 @@
1
+ export * from "./event_consumer";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/consumers/index.ts"],"sourcesContent":["export * from \"./event_consumer\";\n"],"mappings":"AAAA,cAAc;","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 = "CONSUMER_ERROR",
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 = \"CONSUMER_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":[]}
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
@@ -5,11 +5,21 @@ export { errorCodes } from './constants/error_codes.js';
5
5
  export { httpResposneCodes } from './constants/http_success_codes.js';
6
6
  export { ILoggerConfig } from './types/logger_config.js';
7
7
  export { IDocumentConditionalModifications, IQueryFilterOperationParams, IQueryOrderOperationParams, OrderByDirection, WhereFilterOp } from './types/database.js';
8
+ export { IObserver } from './types/observer.js';
9
+ export { ChainNativeCurrency, IEventConsumerConfig } from './types/event_consumer_config.js';
10
+ export { ResponseContext } from './types/response_context.js';
11
+ export { JobOpts } from './types/queue_job_opts.js';
8
12
  export { ApiError, BadRequestError, ForbiddenError, NotFoundError, RateLimitError, TimeoutError, UnauthorizedError } from './errors/api_errors.js';
9
13
  export { DatabaseError } from './errors/database_errors.js';
10
14
  export { ExternalDependencyError } from './errors/external_dependency_error.js';
11
15
  export { BaseError } from './errors/base_error.js';
12
16
  export { ConsumerError } from './errors/consumer_errors.js';
13
- export { Database } from './database/db_interface.js';
17
+ export { Database } from './storage/db_interface.js';
18
+ export { IQueue } from './storage/queue_interface.js';
19
+ export { EventConsumer } from './consumers/event_consumer.js';
20
+ export { parseEventLog } from './utils/decoder.js';
14
21
  import 'zod';
15
22
  import 'winston';
23
+ import 'viem';
24
+ import './consumers/abstract_event_consumer.js';
25
+ import 'events';
package/dist/index.js CHANGED
@@ -3,5 +3,7 @@ export * from "./logger";
3
3
  export * from "./constants";
4
4
  export * from "./types";
5
5
  export * from "./errors";
6
- export * from "./database";
6
+ export * from "./storage";
7
+ export * from "./consumers";
8
+ export * from "./utils";
7
9
  //# sourceMappingURL=index.js.map
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 \"./database\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
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":[]}
@@ -2,12 +2,14 @@ import { ILoggerConfig } from '../types/logger_config.js';
2
2
  import 'winston';
3
3
 
4
4
  declare class Logger {
5
+ private static logger;
5
6
  /**
6
7
  * @static
7
8
  * Create method must first be called before using the logger. It creates a singleton, which will then
8
9
  * be referred to throughout the application.
9
10
  */
10
11
  static create(config: ILoggerConfig): void;
12
+ static ensureInitialized(): void;
11
13
  /**
12
14
  * @static
13
15
  * Method to log for level - "info", this should not be called if it has been custom levels are
@@ -1,35 +1,21 @@
1
1
  import winston from "winston";
2
2
  import * as SentryImport from "winston-transport-sentry-node";
3
+ import { BaseError } from "../errors";
4
+ import { errorCodes } from "../constants";
3
5
  const Sentry = SentryImport.default;
4
- let logger;
5
6
  class Logger {
7
+ static logger;
6
8
  /**
7
9
  * @static
8
10
  * Create method must first be called before using the logger. It creates a singleton, which will then
9
11
  * be referred to throughout the application.
10
12
  */
11
13
  static create(config) {
12
- if (!logger) {
13
- logger = winston.createLogger(
14
+ if (!this.logger) {
15
+ this.logger = winston.createLogger(
14
16
  Object.assign(
15
17
  {
16
- format: winston.format.combine(
17
- winston.format.timestamp({
18
- format: "YYYY-MM-DD HH:mm:ss:ms"
19
- }),
20
- winston.format.colorize({
21
- all: true,
22
- colors: {
23
- error: "red",
24
- warn: "yellow",
25
- info: "green",
26
- debug: "white"
27
- }
28
- }),
29
- winston.format.printf(
30
- (info) => `${info.timestamp} ${info.level}: ${info.message}`
31
- )
32
- ),
18
+ format: winston.format.json(),
33
19
  transports: [
34
20
  new winston.transports.Console({
35
21
  level: config.console?.level || "info"
@@ -47,6 +33,18 @@ class Logger {
47
33
  );
48
34
  }
49
35
  }
36
+ static ensureInitialized() {
37
+ if (!this.logger) {
38
+ throw new BaseError(
39
+ "LOGGER_ERROR",
40
+ errorCodes.base.BASE_ERROR,
41
+ "Logger not initialized. Please call Logger.create() first.",
42
+ true,
43
+ "Logger",
44
+ void 0
45
+ );
46
+ }
47
+ }
50
48
  /**
51
49
  * @static
52
50
  * Method to log for level - "info", this should not be called if it has been custom levels are
@@ -55,10 +53,11 @@ class Logger {
55
53
  * @param {string|object} message - String or object to log.
56
54
  */
57
55
  static info(message) {
56
+ this.ensureInitialized();
58
57
  if (typeof message === "string") {
59
- logger?.info(message);
58
+ this.logger.info(message);
60
59
  } else {
61
- logger?.info(JSON.stringify(message));
60
+ this.logger.info(JSON.stringify(message));
62
61
  }
63
62
  }
64
63
  /**
@@ -69,10 +68,11 @@ class Logger {
69
68
  * @param {string|object} message - String or object to log.
70
69
  */
71
70
  static debug(message) {
71
+ this.ensureInitialized();
72
72
  if (typeof message === "string") {
73
- logger?.debug(message);
73
+ this.logger?.debug(message);
74
74
  } else {
75
- logger?.debug(JSON.stringify(message));
75
+ this.logger?.debug(JSON.stringify(message));
76
76
  }
77
77
  }
78
78
  /**
@@ -83,10 +83,11 @@ class Logger {
83
83
  * @param {string|object} error - String or object to log.
84
84
  */
85
85
  static error(error) {
86
+ this.ensureInitialized();
86
87
  if (typeof error === "string") {
87
- logger?.error(error);
88
+ this.logger?.error(error);
88
89
  } else {
89
- logger?.error(
90
+ this.logger?.error(
90
91
  `${error.message ? `${error.message} : ` : ""}${JSON.stringify(error)}`
91
92
  );
92
93
  }
@@ -99,10 +100,11 @@ class Logger {
99
100
  * @param {string|object} message - String or object to log.
100
101
  */
101
102
  static warn(message) {
103
+ this.ensureInitialized();
102
104
  if (typeof message === "string") {
103
- logger?.warn(message);
105
+ this.logger?.warn(message);
104
106
  } else {
105
- logger?.warn(JSON.stringify(message));
107
+ this.logger?.warn(JSON.stringify(message));
106
108
  }
107
109
  }
108
110
  /**
@@ -112,10 +114,11 @@ class Logger {
112
114
  * @param {string|object} message - String or object to log.
113
115
  */
114
116
  static log(level, message) {
117
+ this.ensureInitialized();
115
118
  if (typeof message === "string") {
116
- logger?.log(level, message);
119
+ this.logger?.log(level, message);
117
120
  } else {
118
- logger?.log(level, JSON.stringify(message));
121
+ this.logger?.log(level, JSON.stringify(message));
119
122
  }
120
123
  }
121
124
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/logger/logger.ts"],"sourcesContent":["import winston from \"winston\";\nimport type { ILoggerConfig } from \"../types\";\nimport * as SentryImport from \"winston-transport-sentry-node\";\nconst Sentry = SentryImport.default;\n\nlet logger: winston.Logger;\n\nexport class Logger {\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 (!logger) {\n logger = winston.createLogger(\n Object.assign(\n {\n format: winston.format.combine(\n winston.format.timestamp({\n format: \"YYYY-MM-DD HH:mm:ss:ms\",\n }),\n winston.format.colorize({\n all: true,\n colors: {\n error: \"red\",\n warn: \"yellow\",\n info: \"green\",\n debug: \"white\",\n },\n }),\n winston.format.printf(\n (info) =>\n `${info.timestamp} ${info.level}: ${info.message}`\n )\n ),\n transports: [\n new winston.transports.Console({\n level: config.console?.level || \"info\",\n }),\n new Sentry({\n sentry: {\n dsn: config.sentry?.dsn,\n },\n level: config.sentry?.level || \"error\",\n }),\n ],\n },\n config.winston\n )\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 if (typeof message === \"string\") {\n logger?.info(message);\n } else {\n 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 if (typeof message === \"string\") {\n logger?.debug(message);\n } else {\n 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 if (typeof error === \"string\") {\n logger?.error(error);\n } else {\n logger?.error(\n `${\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 if (typeof message === \"string\") {\n logger?.warn(message);\n } else {\n 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 if (typeof message === \"string\") {\n logger?.log(level, message);\n } else {\n logger?.log(level, JSON.stringify(message));\n }\n }\n}\n"],"mappings":"AAAA,OAAO,aAAa;AAEpB,YAAY,kBAAkB;AAC9B,MAAM,SAAS,aAAa;AAE5B,IAAI;AAEG,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhB,OAAO,OAAO,QAAuB;AACjC,QAAI,CAAC,QAAQ;AACT,eAAS,QAAQ;AAAA,QACb,OAAO;AAAA,UACH;AAAA,YACI,QAAQ,QAAQ,OAAO;AAAA,cACnB,QAAQ,OAAO,UAAU;AAAA,gBACrB,QAAQ;AAAA,cACZ,CAAC;AAAA,cACD,QAAQ,OAAO,SAAS;AAAA,gBACpB,KAAK;AAAA,gBACL,QAAQ;AAAA,kBACJ,OAAO;AAAA,kBACP,MAAM;AAAA,kBACN,MAAM;AAAA,kBACN,OAAO;AAAA,gBACX;AAAA,cACJ,CAAC;AAAA,cACD,QAAQ,OAAO;AAAA,gBACX,CAAC,SACG,GAAG,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,cACxD;AAAA,YACJ;AAAA,YACA,YAAY;AAAA,cACR,IAAI,QAAQ,WAAW,QAAQ;AAAA,gBAC3B,OAAO,OAAO,SAAS,SAAS;AAAA,cACpC,CAAC;AAAA,cACD,IAAI,OAAO;AAAA,gBACP,QAAQ;AAAA,kBACJ,KAAK,OAAO,QAAQ;AAAA,gBACxB;AAAA,gBACA,OAAO,OAAO,QAAQ,SAAS;AAAA,cACnC,CAAC;AAAA,YACL;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,KAAK,SAA0B;AAClC,QAAI,OAAO,YAAY,UAAU;AAC7B,cAAQ,KAAK,OAAO;AAAA,IACxB,OAAO;AACH,cAAQ,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IACxC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MAAM,SAA0B;AACnC,QAAI,OAAO,YAAY,UAAU;AAC7B,cAAQ,MAAM,OAAO;AAAA,IACzB,OAAO;AACH,cAAQ,MAAM,KAAK,UAAU,OAAO,CAAC;AAAA,IACzC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MAAM,OAAwB;AACjC,QAAI,OAAO,UAAU,UAAU;AAC3B,cAAQ,MAAM,KAAK;AAAA,IACvB,OAAO;AACH,cAAQ;AAAA,QACJ,GACK,MAAgB,UACX,GAAI,MAAgB,OAAO,QAC3B,EACV,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,KAAK,SAA0B;AAClC,QAAI,OAAO,YAAY,UAAU;AAC7B,cAAQ,KAAK,OAAO;AAAA,IACxB,OAAO;AACH,cAAQ,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IACxC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,OAAe,SAA0B;AAChD,QAAI,OAAO,YAAY,UAAU;AAC7B,cAAQ,IAAI,OAAO,OAAO;AAAA,IAC9B,OAAO;AACH,cAAQ,IAAI,OAAO,KAAK,UAAU,OAAO,CAAC;AAAA,IAC9C;AAAA,EACJ;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../src/logger/logger.ts"],"sourcesContent":["import winston from \"winston\";\nimport type { ILoggerConfig } from \"../types\";\nimport * as SentryImport from \"winston-transport-sentry-node\";\nimport { BaseError } from \"../errors\";\nimport { errorCodes } from \"../constants\";\nconst Sentry = SentryImport.default;\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 Object.assign(\n {\n format: winston.format.json(),\n transports: [\n new winston.transports.Console({\n level: config.console?.level || \"info\",\n }),\n new Sentry({\n sentry: {\n dsn: config.sentry?.dsn,\n },\n level: config.sentry?.level || \"error\",\n }),\n ],\n },\n config.winston\n )\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"],"mappings":"AAAA,OAAO,aAAa;AAEpB,YAAY,kBAAkB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,MAAM,SAAS,aAAa;AAErB,MAAM,OAAO;AAAA,EAChB,OAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,OAAO,OAAO,QAAuB;AACjC,QAAI,CAAC,KAAK,QAAQ;AACd,WAAK,SAAS,QAAQ;AAAA,QAClB,OAAO;AAAA,UACH;AAAA,YACI,QAAQ,QAAQ,OAAO,KAAK;AAAA,YAC5B,YAAY;AAAA,cACR,IAAI,QAAQ,WAAW,QAAQ;AAAA,gBAC3B,OAAO,OAAO,SAAS,SAAS;AAAA,cACpC,CAAC;AAAA,cACD,IAAI,OAAO;AAAA,gBACP,QAAQ;AAAA,kBACJ,KAAK,OAAO,QAAQ;AAAA,gBACxB;AAAA,gBACA,OAAO,OAAO,QAAQ,SAAS;AAAA,cACnC,CAAC;AAAA,YACL;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAO,oBAA0B;AAC7B,QAAI,CAAC,KAAK,QAAQ;AACd,YAAM,IAAI;AAAA,QACN;AAAA,QACA,WAAW,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,KAAK,SAA0B;AAClC,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY,UAAU;AAC7B,WAAK,OAAO,KAAK,OAAO;AAAA,IAC5B,OAAO;AACH,WAAK,OAAO,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IAC5C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MAAM,SAA0B;AACnC,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY,UAAU;AAC7B,WAAK,QAAQ,MAAM,OAAO;AAAA,IAC9B,OAAO;AACH,WAAK,QAAQ,MAAM,KAAK,UAAU,OAAO,CAAC;AAAA,IAC9C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MAAM,OAAwB;AACjC,SAAK,kBAAkB;AACvB,QAAI,OAAO,UAAU,UAAU;AAC3B,WAAK,QAAQ,MAAM,KAAK;AAAA,IAC5B,OAAO;AACH,WAAK,QAAQ;AAAA,QACT,GAAI,MAAgB,UACd,GAAI,MAAgB,OAAO,QAC3B,EACN,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,KAAK,SAA0B;AAClC,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY,UAAU;AAC7B,WAAK,QAAQ,KAAK,OAAO;AAAA,IAC7B,OAAO;AACH,WAAK,QAAQ,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IAC7C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,OAAe,SAA0B;AAChD,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY,UAAU;AAC7B,WAAK,QAAQ,IAAI,OAAO,OAAO;AAAA,IACnC,OAAO;AACH,WAAK,QAAQ,IAAI,OAAO,KAAK,UAAU,OAAO,CAAC;AAAA,IACnD;AAAA,EACJ;AACJ;","names":[]}
@@ -8,6 +8,7 @@ interface Database {
8
8
  conditionalUpdateDocuments(collectionPaths: string[], docDatas: any[], docIds: string[], conditions: IQueryFilterOperationParams[], conditionModifications: IDocumentConditionalModifications[]): Promise<void>;
9
9
  getDocuments(collectionPath: string, filter?: IQueryFilterOperationParams[] | undefined, limit?: number | undefined, order?: IQueryOrderOperationParams[] | undefined, startAfterCursor?: string | number | undefined): Promise<any[]>;
10
10
  getDocument(collectionId: string, docId: string): Promise<any | null>;
11
+ getCollectionGroup(groupId: string, filter?: IQueryFilterOperationParams[]): Promise<any | null>;
11
12
  }
12
13
 
13
14
  export type { Database };
@@ -0,0 +1,4 @@
1
+ export { Database } from './db_interface.js';
2
+ export { IQueue } from './queue_interface.js';
3
+ import '../types/database.js';
4
+ import '../types/queue_job_opts.js';
@@ -0,0 +1,3 @@
1
+ export * from "./db_interface";
2
+ export * from "./queue_interface";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/index.ts"],"sourcesContent":["export * from \"./db_interface\";\nexport * from \"./queue_interface\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,11 @@
1
+ import { JobOpts } from '../types/queue_job_opts.js';
2
+
3
+ interface IQueue<JobData = any, JobResult = any> {
4
+ addJob(name: string, data: JobData, jobOpts?: JobOpts): Promise<void>;
5
+ pause(): Promise<void>;
6
+ resume(): Promise<void>;
7
+ clean(type: "completed" | "failed" | "wait" | "delayed"): Promise<void>;
8
+ getJobCounts(): Promise<Record<string, number>>;
9
+ }
10
+
11
+ export type { IQueue };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=queue_interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,19 @@
1
+ import { Address, AbiEvent } from 'viem';
2
+
3
+ type ChainNativeCurrency = {
4
+ name: string;
5
+ symbol: string;
6
+ decimals: number;
7
+ };
8
+ interface IEventConsumerConfig {
9
+ contractAddress: Address | Address[];
10
+ events: AbiEvent[];
11
+ chainId: number;
12
+ rpcUrl: string;
13
+ nativeCurrency: ChainNativeCurrency;
14
+ startBlock: bigint;
15
+ pollBatchSize: bigint;
16
+ pollInterval: number;
17
+ }
18
+
19
+ export type { ChainNativeCurrency, IEventConsumerConfig };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=event_consumer_config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,3 +1,8 @@
1
1
  export { ILoggerConfig } from './logger_config.js';
2
2
  export { IDocumentConditionalModifications, IQueryFilterOperationParams, IQueryOrderOperationParams, OrderByDirection, WhereFilterOp } from './database.js';
3
+ export { IObserver } from './observer.js';
4
+ export { ChainNativeCurrency, IEventConsumerConfig } from './event_consumer_config.js';
5
+ export { ResponseContext } from './response_context.js';
6
+ export { JobOpts } from './queue_job_opts.js';
3
7
  import 'winston';
8
+ import 'viem';
@@ -1,3 +1,7 @@
1
1
  export * from "./logger_config";
2
2
  export * from "./database";
3
+ export * from "./observer";
4
+ export * from "./event_consumer_config";
5
+ export * from "./response_context";
6
+ export * from "./queue_job_opts";
3
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["export * from \"./logger_config\";\nexport * from \"./database\";\n"],"mappings":"AAAA,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\";\nexport * from \"./queue_job_opts\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,8 @@
1
+ interface IObserver<T, E, U> {
2
+ next: (value: T) => Promise<void> | void;
3
+ summary: (value: U) => Promise<void> | void;
4
+ error: (value: E) => void;
5
+ closed: () => void;
6
+ }
7
+
8
+ export type { IObserver };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,5 @@
1
+ type JobOpts = {
2
+ replace?: boolean;
3
+ };
4
+
5
+ export type { JobOpts };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=queue_job_opts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,6 @@
1
+ type ResponseContext = {
2
+ status: (statusCode: number) => ResponseContext;
3
+ json: (body: any) => any;
4
+ };
5
+
6
+ export type { ResponseContext };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=response_context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,6 @@
1
+ declare const parseEventLog: (eventSignature: string[], data: `0x${string}`, topics: any) => {
2
+ eventName: undefined;
3
+ args: readonly unknown[] | undefined;
4
+ };
5
+
6
+ export { parseEventLog };
@@ -0,0 +1,8 @@
1
+ import { decodeEventLog, parseAbi } from "viem";
2
+ const parseEventLog = (eventSignature, data, topics) => {
3
+ return decodeEventLog({ abi: parseAbi(eventSignature), data, topics });
4
+ };
5
+ export {
6
+ parseEventLog
7
+ };
8
+ //# sourceMappingURL=decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/decoder.ts"],"sourcesContent":["import { decodeEventLog, parseAbi } 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"],"mappings":"AAAA,SAAS,gBAAgB,gBAAgB;AAElC,MAAM,gBAAgB,CACzB,gBACA,MACA,WACC;AACD,SAAO,eAAe,EAAE,KAAK,SAAS,cAAc,GAAG,MAAM,OAAO,CAAC;AACzE;","names":[]}
@@ -0,0 +1 @@
1
+ export { parseEventLog } from './decoder.js';
@@ -0,0 +1,2 @@
1
+ export * from "./decoder";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from \"./decoder\";\n"],"mappings":"AAAA,cAAc;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polygonlabs/servercore",
3
- "version": "0.0.0",
3
+ "version": "1.0.0-beta.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -37,6 +37,7 @@
37
37
  "typescript": "^5"
38
38
  },
39
39
  "dependencies": {
40
+ "viem": "^2.26.3",
40
41
  "winston": "^3.17.0",
41
42
  "winston-transport-sentry-node": "^3.0.0",
42
43
  "zod": "^3.24.2"
@@ -1,2 +0,0 @@
1
- export { Database } from './db_interface.js';
2
- import '../types/database.js';
@@ -1,2 +0,0 @@
1
- export * from "./db_interface";
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/index.ts"],"sourcesContent":["export * from \"./db_interface\";\n"],"mappings":"AAAA,cAAc;","names":[]}
File without changes
File without changes