@polygonlabs/servercore 1.0.0-dev.15 → 1.0.0-dev.16
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.
@@ -80,7 +80,7 @@ class EventConsumer extends AbstractEventConsumer {
|
|
80
80
|
this.client?.watchEvent({
|
81
81
|
address: this.config.contractAddress,
|
82
82
|
events: this.config.events,
|
83
|
-
fromBlock: this.config.startBlock,
|
83
|
+
fromBlock: latestBlock - this.config.startBlock > this.config.pollBatchSize ? latestBlock : this.config.startBlock,
|
84
84
|
onLogs: (logs) => {
|
85
85
|
const transformedLogs = logs;
|
86
86
|
this.observer?.next(transformedLogs);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/consumers/event_consumer.ts"],"sourcesContent":["import { Logger } from \"../logger\";\nimport { 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<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 console.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 console.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 console.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 console.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 console.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 console.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":"AAAA,SAAS,cAAc;AACvB,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,OAAO;AAAA,QACX,MAAM;AAAA,QACN,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,MAAM,EAAE,EAAE;AAAA,QAC9C,gBAAgB,OAAO;AAAA,MAC3B;AAAA,MACA,WAAW,KAAK,OAAO,MAAM;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EAfQ,kBAA2B;AAAA,EACzB,SAA8B;AAAA,EAC9B,WAAkD;AAAA,EAe5D,MAAc,gBACV,WACA,SACA,MACa;AACb,YAAQ,KAAK;AAAA,MACT,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQ,2CAA2C,SAAS,OAAO,OAAO;AAAA,IAC9E,CAAC;AAED,aAAS,QAAQ,WAAW,SAAS,SAAS,SAAS,MAAM;AACzD,YAAM,MACF,QAAQ,OAAO,KAAK,UAAU,UAAU,QAAQ,OAAO;AAC3D,cAAQ,MAAM;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ,uCAAuC,KAAK,OAAO,GAAG;AAAA,MAClE,CAAC;AACD,YAAM,gBAAqB;AAAA,QACvB,SAAS,KAAK,OAAO;AAAA,QACrB,WAAW;AAAA,QACX,SAAS;AAAA,MACb;AACA,UAAI,KAAK,OAAO,OAAO,SAAS,GAAG;AAC/B,sBAAc,QAAQ,KAAK,OAAO,OAAO,CAAC;AAAA,MAC9C,OAAO;AACH,sBAAc,SAAS,KAAK,OAAO;AAAA,MACvC;AACA,YAAM,OAAO,MAAM,KAAK,QAAQ,QAAQ,aAAa;AACrD,cAAQ,MAAM;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ,cAAc,MAAM,MAAM,oBAAoB,KAAK,OAAO,GAAG;AAAA,MACzE,CAAC;AACD,YAAM,KAAK,UAAU,KAAK,IAAS;AAAA,IACvC;AAAA,EACJ;AAAA,EAEA,MAAa,MACT,UACa;AACb,QAAI;AACA,WAAK,WAAW;AAChB,YAAM,cACD,MAAM,KAAK,QAAQ,eAAe,KAAM,OAAO,CAAC;AACrD,cAAQ,MAAM;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,UACF;AAAA,UACA,YAAY,KAAK,OAAO;AAAA,UACxB,eAAe,KAAK,OAAO;AAAA,QAC/B;AAAA,MACJ,CAAC;AACD,UACI,cAAc,KAAK,OAAO,aAC1B,KAAK,OAAO,eACd;AACE,cAAM,KAAK;AAAA,UACP,KAAK,OAAO;AAAA,UACZ;AAAA,UACA,KAAK,OAAO;AAAA,QAChB;AAAA,MACJ;AAEA,cAAQ,MAAM;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,MACZ,CAAC;AAED,WAAK,QAAQ,WAAW;AAAA,QACpB,SAAS,KAAK,OAAO;AAAA,QACrB,QAAQ,KAAK,OAAO;AAAA,QACpB,
|
1
|
+
{"version":3,"sources":["../../src/consumers/event_consumer.ts"],"sourcesContent":["import { Logger } from \"../logger\";\nimport { 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<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 console.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 console.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 console.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 console.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 console.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:\n latestBlock - this.config.startBlock >\n this.config.pollBatchSize\n ? latestBlock\n : 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 console.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":[]}
|