@polygonlabs/servercore 1.0.0-dev.2 → 1.0.0-dev.4
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/consumers/abstract_event_consumer.d.ts +33 -0
- package/dist/consumers/abstract_event_consumer.js +38 -0
- package/dist/consumers/abstract_event_consumer.js.map +1 -0
- package/dist/consumers/event_consumer.d.ts +24 -0
- package/dist/consumers/event_consumer.js +78 -0
- package/dist/consumers/event_consumer.js.map +1 -0
- package/dist/consumers/index.d.ts +8 -0
- package/dist/consumers/index.js +2 -0
- package/dist/consumers/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types/event_consumer_config.d.ts +18 -0
- package/dist/types/event_consumer_config.js +1 -0
- package/dist/types/event_consumer_config.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/observer.d.ts +8 -0
- package/dist/types/observer.js +1 -0
- package/dist/types/observer.js.map +1 -0
- package/package.json +2 -1
@@ -0,0 +1,33 @@
|
|
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
|
+
/**
|
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: "fatalError", listener: (error: Error | ConsumerError) => void): this;
|
18
|
+
/**
|
19
|
+
* @public
|
20
|
+
*
|
21
|
+
* Method to register listener for events that will be called only once. The Abstract Event Consumer emits fatalError
|
22
|
+
* event.
|
23
|
+
*
|
24
|
+
* @param {"fatalError"} eventName - Event name to register listener for.
|
25
|
+
* @param listener - Listener to be called when emitting the event.
|
26
|
+
*
|
27
|
+
* @returns {this} - Returns an instance of the class.
|
28
|
+
*/
|
29
|
+
once(eventName: "fatalError", listener: (error: Error | ConsumerError) => void): this;
|
30
|
+
protected onFatalError(error: Error | ConsumerError): void;
|
31
|
+
}
|
32
|
+
|
33
|
+
export { AbstractEventConsumer };
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import { EventEmitter } from "events";
|
2
|
+
class AbstractEventConsumer extends EventEmitter {
|
3
|
+
/**
|
4
|
+
* @public
|
5
|
+
*
|
6
|
+
* Method to register listener for events. The Abstract Event Consumer emits fatalError
|
7
|
+
* event.
|
8
|
+
*
|
9
|
+
* @param {"fatalError"} eventName - Event name to register listener for.
|
10
|
+
* @param listener - Listener to be called when emitting the event.
|
11
|
+
*
|
12
|
+
* @returns {this} - Returns an instance of the class.
|
13
|
+
*/
|
14
|
+
on(eventName, listener) {
|
15
|
+
return super.on(eventName, listener);
|
16
|
+
}
|
17
|
+
/**
|
18
|
+
* @public
|
19
|
+
*
|
20
|
+
* Method to register listener for events that will be called only once. The Abstract Event Consumer emits fatalError
|
21
|
+
* event.
|
22
|
+
*
|
23
|
+
* @param {"fatalError"} eventName - Event name to register listener for.
|
24
|
+
* @param listener - Listener to be called when emitting the event.
|
25
|
+
*
|
26
|
+
* @returns {this} - Returns an instance of the class.
|
27
|
+
*/
|
28
|
+
once(eventName, listener) {
|
29
|
+
return super.on(eventName, listener);
|
30
|
+
}
|
31
|
+
onFatalError(error) {
|
32
|
+
this.emit("fatalError", error);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
export {
|
36
|
+
AbstractEventConsumer
|
37
|
+
};
|
38
|
+
//# 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 /**\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYpD,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,24 @@
|
|
1
|
+
import { PublicClient } 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
|
+
private consumerRunning;
|
12
|
+
protected client: PublicClient | null;
|
13
|
+
protected observer: IObserver<object, ConsumerError, object> | null;
|
14
|
+
constructor(config: IEventConsumerConfig);
|
15
|
+
start(observer: IObserver<T, ConsumerError, U>): Promise<void>;
|
16
|
+
/**
|
17
|
+
* Private method which updates the connection status of consumer to disconnected, and removes all listeners.
|
18
|
+
*
|
19
|
+
* @returns {void}
|
20
|
+
*/
|
21
|
+
private onDisconnect;
|
22
|
+
}
|
23
|
+
|
24
|
+
export { EventConsumer };
|
@@ -0,0 +1,78 @@
|
|
1
|
+
import { createPublicClient, http } from "viem";
|
2
|
+
import { ConsumerError, ExternalDependencyError } from "../errors";
|
3
|
+
import { AbstractEventConsumer } from "./abstract_event_consumer";
|
4
|
+
import { errorCodes } from "../constants";
|
5
|
+
class EventConsumer extends AbstractEventConsumer {
|
6
|
+
constructor(config) {
|
7
|
+
super();
|
8
|
+
this.config = config;
|
9
|
+
this.client = createPublicClient({
|
10
|
+
chain: {
|
11
|
+
id: this.config.chainId,
|
12
|
+
name: "custom",
|
13
|
+
rpcUrls: { default: { http: [this.config.rpcUrl] } },
|
14
|
+
nativeCurrency: this.config.nativeCurrency
|
15
|
+
},
|
16
|
+
transport: http(this.config.rpcUrl)
|
17
|
+
});
|
18
|
+
}
|
19
|
+
consumerRunning = false;
|
20
|
+
client = null;
|
21
|
+
observer = null;
|
22
|
+
async start(observer) {
|
23
|
+
try {
|
24
|
+
this.client?.watchContractEvent({
|
25
|
+
address: this.config.contractAddress,
|
26
|
+
abi: this.config.abi,
|
27
|
+
eventName: this.config.eventName,
|
28
|
+
fromBlock: this.config.startBlock,
|
29
|
+
onLogs: (logs) => {
|
30
|
+
const transformedLogs = logs;
|
31
|
+
observer.next(transformedLogs);
|
32
|
+
},
|
33
|
+
onError: (error) => {
|
34
|
+
this.onDisconnect();
|
35
|
+
this.onFatalError(
|
36
|
+
new ConsumerError(error.name, {
|
37
|
+
name: "CONSUMER_ERROR",
|
38
|
+
code: 1001,
|
39
|
+
isFatal: true,
|
40
|
+
origin: "EventConsumer",
|
41
|
+
context: { eventName: this.config.eventName }
|
42
|
+
})
|
43
|
+
);
|
44
|
+
}
|
45
|
+
});
|
46
|
+
} catch (error) {
|
47
|
+
this.onDisconnect();
|
48
|
+
this.onFatalError(
|
49
|
+
new ExternalDependencyError(
|
50
|
+
this.config.rpcUrl,
|
51
|
+
"Failed to start the event consumer",
|
52
|
+
{
|
53
|
+
externalCode: errorCodes.external.UNKNOWN_EXTERNAL_DEPENDENCY_ERROR,
|
54
|
+
rawError: error,
|
55
|
+
origin: "EventConsumer",
|
56
|
+
context: { eventName: this.config.eventName }
|
57
|
+
}
|
58
|
+
)
|
59
|
+
);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
/**
|
63
|
+
* Private method which updates the connection status of consumer to disconnected, and removes all listeners.
|
64
|
+
*
|
65
|
+
* @returns {void}
|
66
|
+
*/
|
67
|
+
onDisconnect() {
|
68
|
+
if (this.consumerRunning) {
|
69
|
+
this.consumerRunning = false;
|
70
|
+
this.observer?.closed();
|
71
|
+
this.removeAllListeners();
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
export {
|
76
|
+
EventConsumer
|
77
|
+
};
|
78
|
+
//# sourceMappingURL=event_consumer.js.map
|
@@ -0,0 +1 @@
|
|
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\";\n\nexport class EventConsumer<T, U> extends AbstractEventConsumer {\n private consumerRunning: boolean = false;\n protected client: PublicClient | null = null;\n protected observer: IObserver<object, ConsumerError, object> | null = null;\n\n constructor(private config: IEventConsumerConfig) {\n super();\n this.client = createPublicClient({\n chain: {\n id: this.config.chainId,\n name: \"custom\",\n rpcUrls: { default: { http: [this.config.rpcUrl] } },\n nativeCurrency: this.config.nativeCurrency,\n },\n transport: http(this.config.rpcUrl),\n });\n }\n\n public async start(\n observer: IObserver<T, ConsumerError, U>\n ): Promise<void> {\n try {\n this.client?.watchContractEvent({\n address: this.config.contractAddress,\n abi: this.config.abi,\n eventName: this.config.eventName,\n fromBlock: this.config.startBlock,\n onLogs: (logs) => {\n const transformedLogs = logs as T;\n 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.eventName },\n })\n );\n },\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.eventName },\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":"AAAA,SAAS,oBAAoB,YAA+B;AAC5D,SAAS,eAAe,+BAA+B;AAEvD,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAEpB,MAAM,sBAA4B,sBAAsB;AAAA,EAK3D,YAAoB,QAA8B;AAC9C,UAAM;AADU;AAEhB,SAAK,SAAS,mBAAmB;AAAA,MAC7B,OAAO;AAAA,QACH,IAAI,KAAK,OAAO;AAAA,QAChB,MAAM;AAAA,QACN,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,OAAO,MAAM,EAAE,EAAE;AAAA,QACnD,gBAAgB,KAAK,OAAO;AAAA,MAChC;AAAA,MACA,WAAW,KAAK,KAAK,OAAO,MAAM;AAAA,IACtC,CAAC;AAAA,EACL;AAAA,EAfQ,kBAA2B;AAAA,EACzB,SAA8B;AAAA,EAC9B,WAA4D;AAAA,EAetE,MAAa,MACT,UACa;AACb,QAAI;AACA,WAAK,QAAQ,mBAAmB;AAAA,QAC5B,SAAS,KAAK,OAAO;AAAA,QACrB,KAAK,KAAK,OAAO;AAAA,QACjB,WAAW,KAAK,OAAO;AAAA,QACvB,WAAW,KAAK,OAAO;AAAA,QACvB,QAAQ,CAAC,SAAS;AACd,gBAAM,kBAAkB;AACxB,mBAAS,KAAK,eAAe;AAAA,QACjC;AAAA,QACA,SAAS,CAAC,UAAU;AAChB,eAAK,aAAa;AAClB,eAAK;AAAA,YACD,IAAI,cAAc,MAAM,MAAM;AAAA,cAC1B,MAAM;AAAA,cACN,MAAM;AAAA,cACN,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,SAAS,EAAE,WAAW,KAAK,OAAO,UAAU;AAAA,YAChD,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,WAAK,aAAa;AAClB,WAAK;AAAA,QACD,IAAI;AAAA,UACA,KAAK,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,YACI,cACI,WAAW,SACN;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,SAAS,EAAE,WAAW,KAAK,OAAO,UAAU;AAAA,UAChD;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAqB;AACzB,QAAI,KAAK,iBAAiB;AACtB,WAAK,kBAAkB;AACvB,WAAK,UAAU,OAAO;AACtB,WAAK,mBAAmB;AAAA,IAC5B;AAAA,EACJ;AACJ;","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 @@
|
|
1
|
+
{"version":3,"sources":["../../src/consumers/index.ts"],"sourcesContent":["export * from \"./event_consumer\";\n"],"mappings":"AAAA,cAAc;","names":[]}
|
package/dist/index.d.ts
CHANGED
@@ -5,11 +5,17 @@ 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';
|
8
10
|
export { ApiError, BadRequestError, ForbiddenError, NotFoundError, RateLimitError, TimeoutError, UnauthorizedError } from './errors/api_errors.js';
|
9
11
|
export { DatabaseError } from './errors/database_errors.js';
|
10
12
|
export { ExternalDependencyError } from './errors/external_dependency_error.js';
|
11
13
|
export { BaseError } from './errors/base_error.js';
|
12
14
|
export { ConsumerError } from './errors/consumer_errors.js';
|
13
15
|
export { Database } from './database/db_interface.js';
|
16
|
+
export { EventConsumer } from './consumers/event_consumer.js';
|
14
17
|
import 'zod';
|
15
18
|
import 'winston';
|
19
|
+
import 'viem';
|
20
|
+
import './consumers/abstract_event_consumer.js';
|
21
|
+
import 'events';
|
package/dist/index.js
CHANGED
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 \"./database\";\nexport * from \"./consumers\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { Abi } from 'viem';
|
2
|
+
|
3
|
+
type ChainNativeCurrency = {
|
4
|
+
name: string;
|
5
|
+
symbol: string;
|
6
|
+
decimals: number;
|
7
|
+
};
|
8
|
+
interface IEventConsumerConfig {
|
9
|
+
contractAddress: `0x${string}`;
|
10
|
+
eventName: string;
|
11
|
+
abi: Abi;
|
12
|
+
chainId: number;
|
13
|
+
rpcUrl: string;
|
14
|
+
nativeCurrency: ChainNativeCurrency;
|
15
|
+
startBlock: bigint;
|
16
|
+
}
|
17
|
+
|
18
|
+
export type { ChainNativeCurrency, IEventConsumerConfig };
|
@@ -0,0 +1 @@
|
|
1
|
+
//# sourceMappingURL=event_consumer_config.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/types/index.d.ts
CHANGED
@@ -1,3 +1,6 @@
|
|
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';
|
3
5
|
import 'winston';
|
6
|
+
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\";\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\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
@@ -0,0 +1 @@
|
|
1
|
+
//# sourceMappingURL=observer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@polygonlabs/servercore",
|
3
|
-
"version": "1.0.0-dev.
|
3
|
+
"version": "1.0.0-dev.4",
|
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"
|