diff --git a/services/object-mapping-indexer/src/config.ts b/services/object-mapping-indexer/src/config.ts index 32c9135..410b7ee 100644 --- a/services/object-mapping-indexer/src/config.ts +++ b/services/object-mapping-indexer/src/config.ts @@ -11,4 +11,11 @@ export const config = { process.env.NODE_ENV === 'production' ? 'info' : 'debug', ), databaseUrl: env('DATABASE_URL'), + recoverObjectMappings: { + active: env('RECOVER_OBJECT_MAPPINGS', 'false'), + endpoint: + env('RECOVER_OBJECT_MAPPINGS', 'false') === 'true' + ? env('RECOVER_OBJECT_MAPPINGS_ENDPOINT') + : undefined, + }, } diff --git a/services/object-mapping-indexer/src/listeners.ts b/services/object-mapping-indexer/src/listeners.ts index 6c00644..14c0cf4 100644 --- a/services/object-mapping-indexer/src/listeners.ts +++ b/services/object-mapping-indexer/src/listeners.ts @@ -1,3 +1,5 @@ import { createObjectMappingListener } from './services/objectMappingListener/index.js' +import { createObjectMappingRetriever } from './services/objectMappingRetriever/index.js' createObjectMappingListener().start() +createObjectMappingRetriever().start() diff --git a/services/object-mapping-indexer/src/repositories/objectMapping.ts b/services/object-mapping-indexer/src/repositories/objectMapping.ts index 3d0263f..db3e49d 100644 --- a/services/object-mapping-indexer/src/repositories/objectMapping.ts +++ b/services/object-mapping-indexer/src/repositories/objectMapping.ts @@ -63,10 +63,19 @@ const getByHash = async (hash: string) => { return result.rows.at(0) } +const getLastPieceIndex = async () => { + const db = await getDatabase() + const result = await db.query( + 'SELECT MAX("pieceIndex") as "pieceIndex" FROM object_mappings', + ) + return result.rows[0]?.pieceIndex ?? 0 +} + export const objectMappingRepository = { saveObjectMappings, getByBlockNumber, getLatestBlockNumber, getByPieceIndex, getByHash, + getLastPieceIndex, } diff --git a/services/object-mapping-indexer/src/services/objectMappingRetriever/index.ts b/services/object-mapping-indexer/src/services/objectMappingRetriever/index.ts new file mode 100644 index 0000000..2930e53 --- /dev/null +++ b/services/object-mapping-indexer/src/services/objectMappingRetriever/index.ts @@ -0,0 +1,43 @@ +import { ObjectMappingIndexerRPCApi } from '@auto-files/rpc-apis' +import { config } from '../../config' +import { logger } from '../../drivers/logger' +import { objectMappingRepository } from '../../repositories/objectMapping' + +export const createObjectMappingRetriever = () => { + if ( + !config.recoverObjectMappings.active || + !config.recoverObjectMappings.endpoint + ) { + logger.warn('Recover object mappings are not active') + return + } + + const start = async () => { + const pieceIndex = await objectMappingRepository.getLastPieceIndex() + await objectMappingListener.api.subscribe_recover_object_mappings({ + pieceIndex, + }) + + objectMappingListener.onNotification('object_mapping_list', (params) => { + objectMappingRepository.saveObjectMappings( + params.map((e) => ({ + hash: e[0], + pieceIndex: e[1], + pieceOffset: e[2], + // TODO: get block number + blockNumber: 0, + })), + ) + }) + } + + const objectMappingListener = ObjectMappingIndexerRPCApi.createClient({ + endpoint: config.recoverObjectMappings.endpoint, + callbacks: { + onOpen: start, + onReconnection: start, + }, + }) + + return { start } +}