diff --git a/.changeset/honest-news-own.md b/.changeset/honest-news-own.md new file mode 100644 index 0000000000..89fa10413f --- /dev/null +++ b/.changeset/honest-news-own.md @@ -0,0 +1,10 @@ +--- +'@farcaster/protobufs': minor +'@farcaster/hub-web': minor +'@farcaster/utils': minor +'@farcaster/hub-nodejs': patch +'@farcaster/hubble': patch +--- + +remove grpc-js dependency from protobufs, refactor hubble to use hub-nodejs +hub-web to use @farcaster/protobufs and utils diff --git a/apps/hubble/package.json b/apps/hubble/package.json index 5430ba77b6..1cf0e5fbb9 100644 --- a/apps/hubble/package.json +++ b/apps/hubble/package.json @@ -47,8 +47,7 @@ "dependencies": { "@chainsafe/libp2p-gossipsub": "6.1.0", "@chainsafe/libp2p-noise": "^11.0.0 ", - "@farcaster/protobufs": "0.1.11", - "@farcaster/utils": "0.4.0", + "@farcaster/hub-nodejs": "^0.6.0", "@grpc/grpc-js": "~1.8.7", "@libp2p/interface-connection": "^3.0.2", "@libp2p/interface-peer-id": "^2.0.0", diff --git a/apps/hubble/src/cli.ts b/apps/hubble/src/cli.ts index a45562cba6..f5ea17b952 100644 --- a/apps/hubble/src/cli.ts +++ b/apps/hubble/src/cli.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -import { FarcasterNetwork } from '@farcaster/protobufs'; +import { FarcasterNetwork } from '@farcaster/hub-nodejs'; import { PeerId } from '@libp2p/interface-peer-id'; import { createEd25519PeerId, createFromProtobuf, exportToProtobuf } from '@libp2p/peer-id-factory'; import { Command } from 'commander'; diff --git a/apps/hubble/src/console/adminCommand.ts b/apps/hubble/src/console/adminCommand.ts index bedb67f25c..4e8fc58146 100644 --- a/apps/hubble/src/console/adminCommand.ts +++ b/apps/hubble/src/console/adminCommand.ts @@ -1,5 +1,4 @@ -import * as protobufs from '@farcaster/protobufs'; -import { AdminRpcClient } from '@farcaster/utils'; +import { AdminRpcClient, Empty } from '@farcaster/hub-nodejs'; import { ConsoleCommandInterface } from './console'; export class AdminCommand implements ConsoleCommandInterface { @@ -21,7 +20,7 @@ export class AdminCommand implements ConsoleCommandInterface { object() { return { rebuildSyncTrie: async () => { - const result = await this.adminClient.rebuildSyncTrie(protobufs.Empty.create()); + const result = await this.adminClient.rebuildSyncTrie(Empty.create()); return result.match( () => '', (e) => `Error: ${e}` @@ -29,7 +28,7 @@ export class AdminCommand implements ConsoleCommandInterface { }, deleteAllMessagesFromDb: async () => { - const result = await this.adminClient.deleteAllMessagesFromDb(protobufs.Empty.create()); + const result = await this.adminClient.deleteAllMessagesFromDb(Empty.create()); return result.match( () => '', (e) => `Error: ${e}` diff --git a/apps/hubble/src/console/console.ts b/apps/hubble/src/console/console.ts index a27c340ae4..ccc8ee50be 100644 --- a/apps/hubble/src/console/console.ts +++ b/apps/hubble/src/console/console.ts @@ -1,5 +1,11 @@ -import { Empty, Metadata } from '@farcaster/protobufs'; -import { getAdminRpcClient, getAuthMetadata, getInsecureHubRpcClient, getSSLHubRpcClient } from '@farcaster/utils'; +import { + Empty, + Metadata, + getAdminRpcClient, + getAuthMetadata, + getInsecureHubRpcClient, + getSSLHubRpcClient, +} from '@farcaster/hub-nodejs'; import path from 'path'; import * as repl from 'repl'; import { ADMIN_SERVER_PORT } from '~/rpc/adminServer'; diff --git a/apps/hubble/src/console/genCommand.ts b/apps/hubble/src/console/genCommand.ts index 016d880ba0..72c94fa5c8 100644 --- a/apps/hubble/src/console/genCommand.ts +++ b/apps/hubble/src/console/genCommand.ts @@ -1,5 +1,12 @@ -import * as protobufs from '@farcaster/protobufs'; -import { AdminRpcClient, Factories, getAuthMetadata, HubRpcClient } from '@farcaster/utils'; +import { + AdminRpcClient, + Factories, + getAuthMetadata, + HubRpcClient, + Metadata, + FarcasterNetwork, + Message, +} from '@farcaster/hub-nodejs'; import { ConsoleCommandInterface } from './console'; // We use console.log() in this file, so we disable the eslint rule. This is the REPL console, after all! @@ -37,12 +44,12 @@ export class GenCommand implements ConsoleCommandInterface { return { submitMessages: async ( numMessages = 100, - network = protobufs.FarcasterNetwork.DEVNET, - username?: string | protobufs.Metadata, + network = FarcasterNetwork.DEVNET, + username?: string | Metadata, password?: string ): Promise => { // Submit messages might need a username/password - let metadata = new protobufs.Metadata(); + let metadata = new Metadata(); if (username && typeof username !== 'string') { metadata = username; } else if (username && password) { @@ -83,7 +90,7 @@ export class GenCommand implements ConsoleCommandInterface { return `Failed to submit signer add message for fid ${fid}: ${signerResult.error}`; } - const submitBatch = async (batch: protobufs.Message[]) => { + const submitBatch = async (batch: Message[]) => { const promises = []; for (const castAdd of batch) { promises.push(this.rpcClient.submitMessage(castAdd, metadata)); diff --git a/apps/hubble/src/console/protobufCommand.ts b/apps/hubble/src/console/protobufCommand.ts index 7a13a7470a..378c7c89c7 100644 --- a/apps/hubble/src/console/protobufCommand.ts +++ b/apps/hubble/src/console/protobufCommand.ts @@ -1,5 +1,5 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories } from '@farcaster/utils'; +import * as hubNodejs from '@farcaster/hub-nodejs'; +import { Factories } from '@farcaster/hub-nodejs'; import { ConsoleCommandInterface } from './console'; export class ProtobufCommand implements ConsoleCommandInterface { @@ -18,7 +18,7 @@ export class ProtobufCommand implements ConsoleCommandInterface { `; } object() { - return protobufs; + return hubNodejs; } } diff --git a/apps/hubble/src/console/rpcClientCommand.ts b/apps/hubble/src/console/rpcClientCommand.ts index aab578357f..16238b3f18 100644 --- a/apps/hubble/src/console/rpcClientCommand.ts +++ b/apps/hubble/src/console/rpcClientCommand.ts @@ -1,4 +1,4 @@ -import { HubRpcClient } from '@farcaster/utils'; +import { HubRpcClient } from '@farcaster/hub-nodejs'; import { ConsoleCommandInterface } from './console'; export class RpcClientCommand implements ConsoleCommandInterface { diff --git a/apps/hubble/src/console/warpcastTestCommand.ts b/apps/hubble/src/console/warpcastTestCommand.ts index bdb74d6c22..477fe840b9 100644 --- a/apps/hubble/src/console/warpcastTestCommand.ts +++ b/apps/hubble/src/console/warpcastTestCommand.ts @@ -1,6 +1,13 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import * as protobufs from '@farcaster/protobufs'; -import { AdminRpcClient, Factories, HubRpcClient, toFarcasterTime } from '@farcaster/utils'; +import { + Factories, + toFarcasterTime, + AdminRpcClient, + HubRpcClient, + Metadata, + FarcasterNetwork, + UserDataType, +} from '@farcaster/hub-nodejs'; import { ConsoleCommandInterface } from './console'; export class WarpcastTestCommand implements ConsoleCommandInterface { @@ -39,7 +46,7 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { const custodySignerKey = (await custodySigner.getSignerKey())._unsafeUnwrap(); const custodyEvent = Factories.IdRegistryEvent.build({ fid, to: custodySignerKey }); - const _idResult = await this.adminClient.submitIdRegistryEvent(custodyEvent, new protobufs.Metadata()); + const _idResult = await this.adminClient.submitIdRegistryEvent(custodyEvent, new Metadata()); const signerAdd = await Factories.SignerAddMessage.create( { @@ -47,14 +54,14 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { }, { transient: { signer: custodySigner } } ); - const _msgResult = await this.rpcClient.submitMessage(signerAdd, new protobufs.Metadata()); + const _msgResult = await this.rpcClient.submitMessage(signerAdd, new Metadata()); return { fid, signer, custodySigner }; } private async revokeSignerWithData() { const nextFid = 300_000; - const network = protobufs.FarcasterNetwork.MAINNET; + const network = FarcasterNetwork.MAINNET; const { fid, signer, custodySigner } = await this.getSigners(nextFid, network); const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -64,19 +71,19 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { data: { fid, network } }, { transient: { signer: signer } } ); - const _castAddResult = await this.rpcClient.submitMessage(castAdd, new protobufs.Metadata()); + const _castAddResult = await this.rpcClient.submitMessage(castAdd, new Metadata()); const castAddReaction = await Factories.ReactionAddMessage.create( { data: { fid, network, reactionBody: { targetCastId: { fid, hash: castAdd.hash } } } }, { transient: { signer: signer } } ); - const _castAddReactionResult = await this.rpcClient.submitMessage(castAddReaction, new protobufs.Metadata()); + const _castAddReactionResult = await this.rpcClient.submitMessage(castAddReaction, new Metadata()); const userDataAdd = await Factories.UserDataAddMessage.create( { data: { fid, network } }, { transient: { signer: signer } } ); - const _userDataAddResult = await this.rpcClient.submitMessage(userDataAdd, new protobufs.Metadata()); + const _userDataAddResult = await this.rpcClient.submitMessage(userDataAdd, new Metadata()); } // Add 100 verifications @@ -90,13 +97,13 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { }, { transient: { signer: custodySigner } } ); - const _msgResult = await this.rpcClient.submitMessage(signerAdd, new protobufs.Metadata()); + const _msgResult = await this.rpcClient.submitMessage(signerAdd, new Metadata()); const verification = await Factories.VerificationAddEthAddressMessage.create( { data: { fid, network } }, { transient: { signer: signer } } ); - const _verificationResult = await this.rpcClient.submitMessage(verification, new protobufs.Metadata()); + const _verificationResult = await this.rpcClient.submitMessage(verification, new Metadata()); } // And then revoke the signer @@ -104,12 +111,12 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { data: { fid, network, signerAddBody: { signer: signerKey } } }, { transient: { signer: custodySigner } } ); - const _msgResult = await this.rpcClient.submitMessage(signerRevoke, new protobufs.Metadata()); + const _msgResult = await this.rpcClient.submitMessage(signerRevoke, new Metadata()); } private async highVolumeActions() { const nextFid = 200_000; - const network = protobufs.FarcasterNetwork.MAINNET; + const network = FarcasterNetwork.MAINNET; const { fid, signer, custodySigner } = await this.getSigners(nextFid, network); const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -120,13 +127,13 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { data: { fid, network } }, { transient: { signer: signer } } ); - const _castAddResult = await this.rpcClient.submitMessage(castAdd, new protobufs.Metadata()); + const _castAddResult = await this.rpcClient.submitMessage(castAdd, new Metadata()); const castAddReaction = await Factories.ReactionAddMessage.create( { data: { fid, network, reactionBody: { targetCastId: { fid, hash: castAdd.hash } } } }, { transient: { signer: signer } } ); - const _castAddReactionResult = await this.rpcClient.submitMessage(castAddReaction, new protobufs.Metadata()); + const _castAddReactionResult = await this.rpcClient.submitMessage(castAddReaction, new Metadata()); } } @@ -141,13 +148,13 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { }, { transient: { signer: custodySigner } } ); - const _msgResult = await this.rpcClient.submitMessage(signerAdd, new protobufs.Metadata()); + const _msgResult = await this.rpcClient.submitMessage(signerAdd, new Metadata()); const verification = await Factories.VerificationAddEthAddressMessage.create( { data: { fid, network } }, { transient: { signer: signer } } ); - const _verificationResult = await this.rpcClient.submitMessage(verification, new protobufs.Metadata()); + const _verificationResult = await this.rpcClient.submitMessage(verification, new Metadata()); } } @@ -158,7 +165,7 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { data: { fid, network } }, { transient: { signer: signer } } ); - const _userDataResult = await this.rpcClient.submitMessage(userData, new protobufs.Metadata()); + const _userDataResult = await this.rpcClient.submitMessage(userData, new Metadata()); } } } @@ -171,7 +178,7 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { */ private async messageOrderingActions() { let nextFid = 100_000; - const network = protobufs.FarcasterNetwork.MAINNET; + const network = FarcasterNetwork.MAINNET; // Message Ordering // 1. A CastAdd arrives followed by a CastRemove @@ -182,13 +189,13 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { data: { fid, network } }, { transient: { signer: signer } } ); - const _castAddResult = await this.rpcClient.submitMessage(castAdd, new protobufs.Metadata()); + const _castAddResult = await this.rpcClient.submitMessage(castAdd, new Metadata()); const castRemove = await Factories.CastRemoveMessage.create( { data: { fid, network, castRemoveBody: { targetHash: castAdd.hash } } }, { transient: { signer: signer } } ); - const _castRemoveResult = await this.rpcClient.submitMessage(castRemove, new protobufs.Metadata()); + const _castRemoveResult = await this.rpcClient.submitMessage(castRemove, new Metadata()); } // 2. A CastRemove arrives before the CastAdd. The castAdd will never be added @@ -206,8 +213,8 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { ); // remove first - const _castRemoveResult = await this.rpcClient.submitMessage(castRemove, new protobufs.Metadata()); - const _castAddResult = await this.rpcClient.submitMessage(castAdd, new protobufs.Metadata()); + const _castRemoveResult = await this.rpcClient.submitMessage(castRemove, new Metadata()); + const _castAddResult = await this.rpcClient.submitMessage(castAdd, new Metadata()); } // 3. A CastAdd for a child is seen without the parent CastAdd @@ -223,7 +230,7 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { transient: { signer: signer } } ); - const _castChildResult = await this.rpcClient.submitMessage(castChild, new protobufs.Metadata()); + const _castChildResult = await this.rpcClient.submitMessage(castChild, new Metadata()); } // 4. A CastAdd for a child is seen before the parent CastAdd @@ -240,8 +247,8 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { transient: { signer: signer } } ); - const _castChildResult = await this.rpcClient.submitMessage(castChild, new protobufs.Metadata()); - const _castParentResult = await this.rpcClient.submitMessage(castParent, new protobufs.Metadata()); + const _castChildResult = await this.rpcClient.submitMessage(castChild, new Metadata()); + const _castParentResult = await this.rpcClient.submitMessage(castParent, new Metadata()); } // 5. A CastAdd for a child is seen after the parent CastAdd recieved a CastRemove @@ -263,9 +270,9 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { transient: { signer: signer } } ); - const _castAddResult = await this.rpcClient.submitMessage(castParent, new protobufs.Metadata()); - const _castRemoveResult = await this.rpcClient.submitMessage(castRemove, new protobufs.Metadata()); - const _castChildResult = await this.rpcClient.submitMessage(castChild, new protobufs.Metadata()); + const _castAddResult = await this.rpcClient.submitMessage(castParent, new Metadata()); + const _castRemoveResult = await this.rpcClient.submitMessage(castRemove, new Metadata()); + const _castChildResult = await this.rpcClient.submitMessage(castChild, new Metadata()); } // 6. A reactionAdd arrives followed by a reactionRemove @@ -287,9 +294,9 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { transient: { signer: signer } } ); - const _castAddResult = await this.rpcClient.submitMessage(castAdd, new protobufs.Metadata()); - const _reactionAddResult = await this.rpcClient.submitMessage(reactionAdd, new protobufs.Metadata()); - const _reactionRemoveResult = await this.rpcClient.submitMessage(reactionRemove, new protobufs.Metadata()); + const _castAddResult = await this.rpcClient.submitMessage(castAdd, new Metadata()); + const _reactionAddResult = await this.rpcClient.submitMessage(reactionAdd, new Metadata()); + const _reactionRemoveResult = await this.rpcClient.submitMessage(reactionRemove, new Metadata()); } // 7. A reactionRemove arrives before the reactionAdd @@ -311,9 +318,9 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { transient: { signer: signer } } ); - const _castAddResult = await this.rpcClient.submitMessage(castAdd, new protobufs.Metadata()); - const _reactionRemoveResult = await this.rpcClient.submitMessage(reactionRemove, new protobufs.Metadata()); - const _reactionAddResult = await this.rpcClient.submitMessage(reactionAdd, new protobufs.Metadata()); + const _castAddResult = await this.rpcClient.submitMessage(castAdd, new Metadata()); + const _reactionRemoveResult = await this.rpcClient.submitMessage(reactionRemove, new Metadata()); + const _reactionAddResult = await this.rpcClient.submitMessage(reactionAdd, new Metadata()); } // 8. A reactionAdd arrives after the reactionRemove. The reactionAdd will error because it has already been removed @@ -335,10 +342,10 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { transient: { signer: signer } } ); - const _castAddResult = await this.rpcClient.submitMessage(castAdd, new protobufs.Metadata()); + const _castAddResult = await this.rpcClient.submitMessage(castAdd, new Metadata()); - const _reactionRemoveResult = await this.rpcClient.submitMessage(reactionRemove, new protobufs.Metadata()); - const _reactionAddResult = await this.rpcClient.submitMessage(reactionAdd, new protobufs.Metadata()); + const _reactionRemoveResult = await this.rpcClient.submitMessage(reactionRemove, new Metadata()); + const _reactionAddResult = await this.rpcClient.submitMessage(reactionAdd, new Metadata()); } // 9. A UserDataAdd for time t+1 arrives before a UserDataAdd for time t. Note: The UserDataAdd for time t will error because it conflicts with T+1 @@ -348,7 +355,7 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { const timestamp = toFarcasterTime(Date.now())._unsafeUnwrap(); const userDataT = await Factories.UserDataAddMessage.create( - { data: { timestamp, fid, network, userDataBody: { type: protobufs.UserDataType.BIO } } }, + { data: { timestamp, fid, network, userDataBody: { type: UserDataType.BIO } } }, { transient: { signer: signer } } ); const userDataT1 = await Factories.UserDataAddMessage.create( @@ -357,14 +364,14 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { timestamp: timestamp + 1, fid, network, - userDataBody: { type: protobufs.UserDataType.BIO }, + userDataBody: { type: UserDataType.BIO }, }, }, { transient: { signer: signer } } ); - const _userDataT1Result = await this.rpcClient.submitMessage(userDataT1, new protobufs.Metadata()); - const _userDataTResult = await this.rpcClient.submitMessage(userDataT, new protobufs.Metadata()); + const _userDataT1Result = await this.rpcClient.submitMessage(userDataT1, new Metadata()); + const _userDataTResult = await this.rpcClient.submitMessage(userDataT, new Metadata()); } // 10. A VerificationRemove arrives without a VerificationAdd. @@ -377,10 +384,7 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { transient: { signer } } ); - const _verificationRemoveResult = await this.rpcClient.submitMessage( - verificationRemove, - new protobufs.Metadata() - ); + const _verificationRemoveResult = await this.rpcClient.submitMessage(verificationRemove, new Metadata()); } // 11. A VerificationAdd arrives after a VerificationRemove. This will fail because the VerificationAdd is not valid @@ -402,11 +406,8 @@ export class WarpcastTestCommand implements ConsoleCommandInterface { { transient: { signer } } ); - const _verificationRemoveResult = await this.rpcClient.submitMessage( - verificationRemove, - new protobufs.Metadata() - ); - const _verificationAddResult = await this.rpcClient.submitMessage(verificationAdd, new protobufs.Metadata()); + const _verificationRemoveResult = await this.rpcClient.submitMessage(verificationRemove, new Metadata()); + const _verificationAddResult = await this.rpcClient.submitMessage(verificationAdd, new Metadata()); } } } diff --git a/apps/hubble/src/eth/ethEventsProvider.test.ts b/apps/hubble/src/eth/ethEventsProvider.test.ts index 505148ac42..9d863b3cc7 100644 --- a/apps/hubble/src/eth/ethEventsProvider.test.ts +++ b/apps/hubble/src/eth/ethEventsProvider.test.ts @@ -1,5 +1,11 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, bytesToHexString, hexStringToBytes } from '@farcaster/utils'; +import { + Factories, + bytesToHexString, + hexStringToBytes, + FarcasterNetwork, + IdRegistryEventType, + NameRegistryEventType, +} from '@farcaster/hub-nodejs'; import { AbstractProvider, Block, Contract, Log, Provider, TransactionReceipt, TransactionResponse } from 'ethers'; import { OrphanFilter } from 'ethers/types/providers'; import { IdRegistry, NameRegistry } from '~/eth/abis'; @@ -12,7 +18,7 @@ import Engine from '~/storage/engine'; import { MockHub } from '~/test/mocks'; const db = jestRocksDB('flatbuffers.ethEventsProvider.test'); -const engine = new Engine(db, protobufs.FarcasterNetwork.TESTNET); +const engine = new Engine(db, FarcasterNetwork.TESTNET); const hub = new MockHub(db, engine); const fid = Factories.Fid.build(); @@ -164,7 +170,7 @@ describe('process events', () => { }); // The event is not immediately available, since it has to wait for confirmations. We should still get the Register event const existingIdRegistryEvent = await getIdRegistryEvent(db, fid); - expect(existingIdRegistryEvent.type).toEqual(protobufs.IdRegistryEventType.REGISTER); + expect(existingIdRegistryEvent.type).toEqual(IdRegistryEventType.REGISTER); expect(existingIdRegistryEvent.to).toEqual(hexStringToBytes(address1)._unsafeUnwrap()); // Add 6 confirmations @@ -173,7 +179,7 @@ describe('process events', () => { // The transfer event is now available const newIdRegistryEvent = await getIdRegistryEvent(db, fid); expect(newIdRegistryEvent.fid).toEqual(fid); - expect(newIdRegistryEvent.type).toEqual(protobufs.IdRegistryEventType.TRANSFER); + expect(newIdRegistryEvent.type).toEqual(IdRegistryEventType.TRANSFER); expect(newIdRegistryEvent.to).toEqual(hexStringToBytes(address2)._unsafeUnwrap()); }); @@ -201,7 +207,7 @@ describe('process events', () => { }); // The event is not immediately available, since it has to wait for confirmations. We should still get the Transfer event expect(await getNameRegistryEvent(db, fname)).toMatchObject({ - type: protobufs.NameRegistryEventType.TRANSFER, + type: NameRegistryEventType.TRANSFER, }); // Add 6 confirmations @@ -210,7 +216,7 @@ describe('process events', () => { // The renew event is now available expect(await getNameRegistryEvent(db, fname)).toMatchObject({ fname, - type: protobufs.NameRegistryEventType.RENEW, + type: NameRegistryEventType.RENEW, }); }); }); diff --git a/apps/hubble/src/eth/ethEventsProvider.ts b/apps/hubble/src/eth/ethEventsProvider.ts index 91e5c47851..b89450edf6 100644 --- a/apps/hubble/src/eth/ethEventsProvider.ts +++ b/apps/hubble/src/eth/ethEventsProvider.ts @@ -1,5 +1,15 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesToUtf8String, hexStringToBytes, HubAsyncResult, HubError, toFarcasterTime } from '@farcaster/utils'; +import { + bytesToUtf8String, + hexStringToBytes, + HubAsyncResult, + HubError, + HubState, + IdRegistryEvent, + IdRegistryEventType, + NameRegistryEvent, + NameRegistryEventType, + toFarcasterTime, +} from '@farcaster/hub-nodejs'; import { AbstractProvider, BaseContractMethod, @@ -25,7 +35,7 @@ export class GoerliEthConstants { public static ChunkSize = 10000; } -type NameRegistryRenewEvent = Omit; +type NameRegistryRenewEvent = Omit; /** * Class that follows the Ethereum chain to handle on-chain events from the ID Registry and Name Registry contracts. @@ -41,8 +51,8 @@ export class EthEventsProvider { private _numConfirmations: number; - private _idEventsByBlock: Map>; - private _nameEventsByBlock: Map>; + private _idEventsByBlock: Map>; + private _nameEventsByBlock: Map>; private _renewEventsByBlock: Map>; private _lastBlockNumber: number; @@ -80,10 +90,10 @@ export class EthEventsProvider { // Setup IdRegistry contract this._idRegistryContract.on('Register', (to: string, id: bigint, _recovery, _url, event: ContractEventPayload) => { - this.cacheIdRegistryEvent(null, to, id, protobufs.IdRegistryEventType.REGISTER, event.log); + this.cacheIdRegistryEvent(null, to, id, IdRegistryEventType.REGISTER, event.log); }); this._idRegistryContract.on('Transfer', (from: string, to: string, id: bigint, event: ContractEventPayload) => { - this.cacheIdRegistryEvent(from, to, id, protobufs.IdRegistryEventType.TRANSFER, event.log); + this.cacheIdRegistryEvent(from, to, id, IdRegistryEventType.TRANSFER, event.log); }); // Setup NameRegistry contract @@ -207,26 +217,11 @@ export class EthEventsProvider { const toBlock = latestBlock.number; // Sync old Id events - await this.syncHistoricalIdEvents( - protobufs.IdRegistryEventType.REGISTER, - lastSyncedBlock, - toBlock, - this._chunkSize - ); - await this.syncHistoricalIdEvents( - protobufs.IdRegistryEventType.TRANSFER, - lastSyncedBlock, - toBlock, - this._chunkSize - ); + await this.syncHistoricalIdEvents(IdRegistryEventType.REGISTER, lastSyncedBlock, toBlock, this._chunkSize); + await this.syncHistoricalIdEvents(IdRegistryEventType.TRANSFER, lastSyncedBlock, toBlock, this._chunkSize); // Sync old Name Transfer events - await this.syncHistoricalNameEvents( - protobufs.NameRegistryEventType.TRANSFER, - lastSyncedBlock, - toBlock, - this._chunkSize - ); + await this.syncHistoricalNameEvents(NameRegistryEventType.TRANSFER, lastSyncedBlock, toBlock, this._chunkSize); // We don't need to sync historical Renew events because the expiry // is pulled when NameRegistryEvents are merged @@ -240,26 +235,11 @@ export class EthEventsProvider { * @param blockNumber */ public async retryEventsFromBlock(blockNumber: number) { - await this.syncHistoricalIdEvents( - protobufs.IdRegistryEventType.REGISTER, - blockNumber, - blockNumber, - this._chunkSize - ); - await this.syncHistoricalIdEvents( - protobufs.IdRegistryEventType.TRANSFER, - blockNumber, - blockNumber, - this._chunkSize - ); + await this.syncHistoricalIdEvents(IdRegistryEventType.REGISTER, blockNumber, blockNumber, this._chunkSize); + await this.syncHistoricalIdEvents(IdRegistryEventType.TRANSFER, blockNumber, blockNumber, this._chunkSize); // Sync old Name Transfer events - await this.syncHistoricalNameEvents( - protobufs.NameRegistryEventType.TRANSFER, - blockNumber, - blockNumber, - this._chunkSize - ); + await this.syncHistoricalNameEvents(NameRegistryEventType.TRANSFER, blockNumber, blockNumber, this._chunkSize); } /** @@ -267,12 +247,12 @@ export class EthEventsProvider { * in the sync queue to be processed later, to make sure we don't process any unconfirmed events. */ private async syncHistoricalIdEvents( - type: protobufs.IdRegistryEventType, + type: IdRegistryEventType, fromBlock: number, toBlock: number, batchSize: number ) { - const typeString = type === protobufs.IdRegistryEventType.REGISTER ? 'Register' : 'Transfer'; + const typeString = type === IdRegistryEventType.REGISTER ? 'Register' : 'Transfer'; /* * How querying blocks in batches works @@ -327,14 +307,14 @@ export class EthEventsProvider { // Loop through each event, get the right values, and cache it for (const event of batchIdEvents.value) { - const toIndex = type === protobufs.IdRegistryEventType.REGISTER ? 0 : 1; - const idIndex = type === protobufs.IdRegistryEventType.REGISTER ? 1 : 2; + const toIndex = type === IdRegistryEventType.REGISTER ? 0 : 1; + const idIndex = type === IdRegistryEventType.REGISTER ? 1 : 2; // Parsing can throw errors, so we'll just log them and continue try { const to: string = event.args.at(toIndex); const id = BigInt(event.args.at(idIndex)); - const from: string = type === protobufs.IdRegistryEventType.REGISTER ? null : event.args.at(0); + const from: string = type === IdRegistryEventType.REGISTER ? null : event.args.at(0); await this.cacheIdRegistryEvent(from, to, id, type, event); } catch (e) { @@ -349,12 +329,12 @@ export class EthEventsProvider { * in the sync queue to be processed later, to make sure we don't process any unconfirmed events. */ private async syncHistoricalNameEvents( - type: protobufs.NameRegistryEventType, + type: NameRegistryEventType, fromBlock: number, toBlock: number, batchSize: number ) { - const typeString = type === protobufs.NameRegistryEventType.TRANSFER ? 'Transfer' : 'Renew'; + const typeString = type === NameRegistryEventType.TRANSFER ? 'Transfer' : 'Renew'; /* * Querying Blocks in Batches @@ -414,7 +394,7 @@ export class EthEventsProvider { } for (const event of oldNameBatchEvents.value) { - if (type === protobufs.NameRegistryEventType.TRANSFER) { + if (type === NameRegistryEventType.TRANSFER) { // Handling: use try-catch + log since errors are expected and not important to surface try { const from: string = event.args.at(0); @@ -478,7 +458,7 @@ export class EthEventsProvider { continue; } - const updatedEvent: protobufs.NameRegistryEvent = { + const updatedEvent: NameRegistryEvent = { ...nameRegistryEvent.value, ...renewEvent, }; @@ -491,7 +471,7 @@ export class EthEventsProvider { // Update the last synced block if all the historical events have been synced if (this._isHistoricalSyncDone) { - const hubState = protobufs.HubState.create({ lastEthBlock: blockNumber }); + const hubState = HubState.create({ lastEthBlock: blockNumber }); await this._hub.putHubState(hubState); } @@ -502,7 +482,7 @@ export class EthEventsProvider { from: string | null, to: string, id: bigint, - type: protobufs.IdRegistryEventType, + type: IdRegistryEventType, eventLog: EventLog ): HubAsyncResult { const { blockNumber, blockHash, transactionHash, index } = eventLog; @@ -524,7 +504,7 @@ export class EthEventsProvider { const [fromBytes, blockHashBytes, transactionHashBytes, toBytes] = serialized.value; // Construct the protobuf - const idRegistryEvent = protobufs.IdRegistryEvent.create({ + const idRegistryEvent = IdRegistryEvent.create({ blockNumber, blockHash: blockHashBytes, logIndex: index, @@ -579,7 +559,7 @@ export class EthEventsProvider { const [blockHashBytes, transactionHashBytes, fromBytes, toBytes, fnameBytes] = serialized.value; - const nameRegistryEvent = protobufs.NameRegistryEvent.create({ + const nameRegistryEvent = NameRegistryEvent.create({ blockNumber, blockHash: blockHashBytes, transactionHash: transactionHashBytes, @@ -587,7 +567,7 @@ export class EthEventsProvider { fname: fnameBytes, from: fromBytes, to: toBytes, - type: protobufs.NameRegistryEventType.TRANSFER, + type: NameRegistryEventType.TRANSFER, }); // Add it to the cache @@ -628,7 +608,7 @@ export class EthEventsProvider { transactionHash: transactionHashBytes, logIndex: index, fname: fnameBytes, - type: protobufs.NameRegistryEventType.RENEW, + type: NameRegistryEventType.RENEW, expiry: farcasterTimeExpiry, }; diff --git a/apps/hubble/src/eth/utils.ts b/apps/hubble/src/eth/utils.ts index 938730fa34..7ffa2dd540 100644 --- a/apps/hubble/src/eth/utils.ts +++ b/apps/hubble/src/eth/utils.ts @@ -1,4 +1,4 @@ -import { bytesToBigInt, hexStringToBytes, HubResult } from '@farcaster/utils'; +import { bytesToBigInt, hexStringToBytes, HubResult } from '@farcaster/hub-nodejs'; export const bytes32ToBytes = (value: bigint): HubResult => { // Remove right padding diff --git a/apps/hubble/src/hubble.ts b/apps/hubble/src/hubble.ts index e48b05d8b5..7dd940ddeb 100644 --- a/apps/hubble/src/hubble.ts +++ b/apps/hubble/src/hubble.ts @@ -1,4 +1,3 @@ -import * as protobufs from '@farcaster/protobufs'; import { ContactInfoContent, FarcasterNetwork, @@ -8,16 +7,15 @@ import { IdRegistryEvent, Message, NameRegistryEvent, -} from '@farcaster/protobufs'; -import { + UpdateNameRegistryEventExpiryJobPayload, HubAsyncResult, HubError, - HubRpcClient, bytesToHexString, bytesToUtf8String, + HubRpcClient, getSSLHubRpcClient, getInsecureHubRpcClient, -} from '@farcaster/utils'; +} from '@farcaster/hub-nodejs'; import { PeerId } from '@libp2p/interface-peer-id'; import { peerIdFromBytes } from '@libp2p/peer-id'; import { publicAddressesFirst } from '@libp2p/utils/address-sort'; @@ -66,11 +64,11 @@ export const FARCASTER_VERSIONS_SCHEDULE: VersionSchedule[] = [ export interface HubInterface { engine: Engine; - submitMessage(message: protobufs.Message, source?: HubSubmitSource): HubAsyncResult; - submitIdRegistryEvent(event: protobufs.IdRegistryEvent, source?: HubSubmitSource): HubAsyncResult; - submitNameRegistryEvent(event: protobufs.NameRegistryEvent, source?: HubSubmitSource): HubAsyncResult; - getHubState(): HubAsyncResult; - putHubState(hubState: protobufs.HubState): HubAsyncResult; + submitMessage(message: Message, source?: HubSubmitSource): HubAsyncResult; + submitIdRegistryEvent(event: IdRegistryEvent, source?: HubSubmitSource): HubAsyncResult; + submitNameRegistryEvent(event: NameRegistryEvent, source?: HubSubmitSource): HubAsyncResult; + getHubState(): HubAsyncResult; + putHubState(hubState: HubState): HubAsyncResult; } export interface HubOptions { @@ -747,7 +745,7 @@ export class Hub implements HubInterface { ); if (!event.expiry) { - const payload = protobufs.UpdateNameRegistryEventExpiryJobPayload.create({ fname: event.fname }); + const payload = UpdateNameRegistryEventExpiryJobPayload.create({ fname: event.fname }); await this.updateNameRegistryEventExpiryJobQueue.enqueueJob(payload); } diff --git a/apps/hubble/src/network/p2p/gossipNode.test.ts b/apps/hubble/src/network/p2p/gossipNode.test.ts index 672c9f7bfb..22687c596b 100644 --- a/apps/hubble/src/network/p2p/gossipNode.test.ts +++ b/apps/hubble/src/network/p2p/gossipNode.test.ts @@ -1,5 +1,12 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, getInsecureHubRpcClient, HubRpcClient } from '@farcaster/utils'; +import { + Factories, + getInsecureHubRpcClient, + HubRpcClient, + FarcasterNetwork, + IdRegistryEvent, + SignerAddMessage, + Message, +} from '@farcaster/hub-nodejs'; import { multiaddr } from '@multiformats/multiaddr/'; import { GossipNode } from '~/network/p2p/gossipNode'; import Server from '~/rpc/server'; @@ -87,7 +94,7 @@ describe('GossipNode', () => { describe('gossip messages', () => { const db = jestRocksDB('protobufs.rpc.gossipMessageTest.test'); - const network = protobufs.FarcasterNetwork.TESTNET; + const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); const fid = Factories.Fid.build(); @@ -96,9 +103,9 @@ describe('GossipNode', () => { let server: Server; let client: HubRpcClient; - let custodyEvent: protobufs.IdRegistryEvent; - let signerAdd: protobufs.SignerAddMessage; - let castAdd: protobufs.Message; + let custodyEvent: IdRegistryEvent; + let signerAdd: SignerAddMessage; + let castAdd: Message; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -120,7 +127,7 @@ describe('GossipNode', () => { test('gossip messages only from rpc', async () => { let numMessagesGossiped = 0; const mockGossipNode = { - gossipMessage: (_msg: protobufs.Message) => { + gossipMessage: (_msg: Message) => { numMessagesGossiped += 1; }, } as unknown as GossipNode; diff --git a/apps/hubble/src/network/p2p/gossipNode.ts b/apps/hubble/src/network/p2p/gossipNode.ts index d5218a05cf..a02d73aac0 100644 --- a/apps/hubble/src/network/p2p/gossipNode.ts +++ b/apps/hubble/src/network/p2p/gossipNode.ts @@ -1,7 +1,6 @@ import { gossipsub, GossipSub } from '@chainsafe/libp2p-gossipsub'; import { noise } from '@chainsafe/libp2p-noise'; -import * as protobufs from '@farcaster/protobufs'; -import { HubAsyncResult, HubError, HubResult } from '@farcaster/utils'; +import { ContactInfoContent, GossipMessage, HubAsyncResult, HubError, HubResult, Message } from '@farcaster/hub-nodejs'; import { Connection } from '@libp2p/interface-connection'; import { PeerId } from '@libp2p/interface-peer-id'; import { mplex } from '@libp2p/mplex'; @@ -27,7 +26,7 @@ const log = logger.child({ component: 'Node' }); /** Events emitted by a Farcaster Gossip Node */ interface NodeEvents { /** Triggers on receipt of a new message and includes the topic and message contents */ - message: (topic: string, message: HubResult) => void; + message: (topic: string, message: HubResult) => void; /** Triggers when a peer connects and includes the libp2p Connection object*/ peerConnect: (connection: Connection) => void; /** Triggers when a peer disconnects and includes the libp2p Connection object */ @@ -139,8 +138,8 @@ export class GossipNode extends TypedEmitter { } /** Serializes and publishes a Farcaster Message to the network */ - async gossipMessage(message: protobufs.Message) { - const gossipMessage = protobufs.GossipMessage.create({ + async gossipMessage(message: Message) { + const gossipMessage = GossipMessage.create({ message, topics: [NETWORK_TOPIC_PRIMARY], peerId: this.peerId?.toBytes() ?? new Uint8Array(), @@ -149,8 +148,8 @@ export class GossipNode extends TypedEmitter { } /** Serializes and publishes this node's ContactInfo to the network */ - async gossipContactInfo(contactInfo: protobufs.ContactInfoContent) { - const gossipMessage = protobufs.GossipMessage.create({ + async gossipContactInfo(contactInfo: ContactInfoContent) { + const gossipMessage = GossipMessage.create({ contactInfoContent: contactInfo, topics: [NETWORK_TOPIC_PRIMARY], peerId: this.peerId?.toBytes() ?? new Uint8Array(), @@ -159,7 +158,7 @@ export class GossipNode extends TypedEmitter { } /** Publishes a Gossip Message to the network */ - async publish(message: protobufs.GossipMessage) { + async publish(message: GossipMessage) { const topics = message.topics; const encodedMessage = GossipNode.encodeMessage(message); @@ -249,14 +248,14 @@ export class GossipNode extends TypedEmitter { } //TODO: Needs better typesafety - static encodeMessage(message: protobufs.GossipMessage): HubResult { - return ok(protobufs.GossipMessage.encode(message).finish()); + static encodeMessage(message: GossipMessage): HubResult { + return ok(GossipMessage.encode(message).finish()); } //TODO: Needs better typesafety - static decodeMessage(message: Uint8Array): HubResult { + static decodeMessage(message: Uint8Array): HubResult { // Convert GossipMessage to Uint8Array or decode will return nested Uint8Arrays as Buffers - return ok(protobufs.GossipMessage.decode(Uint8Array.from(message))); + return ok(GossipMessage.decode(Uint8Array.from(message))); } /* -------------------------------------------------------------------------- */ diff --git a/apps/hubble/src/network/p2p/protocol.ts b/apps/hubble/src/network/p2p/protocol.ts index 6e53927a57..d9acf52493 100644 --- a/apps/hubble/src/network/p2p/protocol.ts +++ b/apps/hubble/src/network/p2p/protocol.ts @@ -1,4 +1,4 @@ -import { GossipVersion } from '@farcaster/protobufs'; +import { GossipVersion } from '@farcaster/hub-nodejs'; // Network topic for Farcaster Messages export const NETWORK_TOPIC_PRIMARY = 'f_network_topic_primary'; diff --git a/apps/hubble/src/network/sync/merkleTrie.test.ts b/apps/hubble/src/network/sync/merkleTrie.test.ts index 957aa580b5..14448af3b4 100644 --- a/apps/hubble/src/network/sync/merkleTrie.test.ts +++ b/apps/hubble/src/network/sync/merkleTrie.test.ts @@ -1,6 +1,7 @@ // eslint-disable-file security/detect-non-literal-fs-filename -import * as protobufs from '@farcaster/protobufs'; + import { blake3 } from '@noble/hashes/blake3'; +import { DbTrieNode } from '@farcaster/hub-nodejs'; import { MerkleTrie } from '~/network/sync/merkleTrie'; import { NetworkFactories } from '~/network/utils/factories'; import { jestRocksDB } from '~/storage/db/jestUtils'; @@ -141,7 +142,7 @@ describe('MerkleTrie', () => { expect(key.slice(1).toString('hex')).toEqual(syncIdStr.slice(0, i * 2)); // Parse the value as a DbTriNode - const node = protobufs.DbTrieNode.decode(value); + const node = DbTrieNode.decode(value); // The last key should be the leaf node, so it's value should match the entire syncID if (i === TIMESTAMP_LENGTH) { @@ -168,7 +169,7 @@ describe('MerkleTrie', () => { //eslint-disable-next-line @typescript-eslint/no-unused-vars count = await forEachDbItem(db, async (i, key, value) => { // Parse the value as a DbTriNode - const node = protobufs.DbTrieNode.decode(value); + const node = DbTrieNode.decode(value); if (node.key.length > 0) { leafs += 1; } diff --git a/apps/hubble/src/network/sync/mock.ts b/apps/hubble/src/network/sync/mock.ts index 1587091e3a..a65c429b47 100644 --- a/apps/hubble/src/network/sync/mock.ts +++ b/apps/hubble/src/network/sync/mock.ts @@ -1,7 +1,6 @@ import { ok } from 'neverthrow'; -import * as protobufs from '@farcaster/protobufs'; -import { HubResult } from '@farcaster/utils'; +import { HubResult, MessagesResponse, SyncIds, TrieNodeMetadataResponse, TrieNodePrefix } from '@farcaster/hub-nodejs'; import Engine from '~/storage/engine'; import { NodeMetadata } from './merkleTrie'; @@ -21,21 +20,19 @@ export class MockRpcClient { this.syncEngine = syncEngine; } - async getSyncMetadataByPrefix( - request: protobufs.TrieNodePrefix - ): Promise> { + async getSyncMetadataByPrefix(request: TrieNodePrefix): Promise> { this.getSyncMetadataByPrefixCalls.push(request); - const toTrieNodeMetadataResponse = (metadata?: NodeMetadata): protobufs.TrieNodeMetadataResponse => { + const toTrieNodeMetadataResponse = (metadata?: NodeMetadata): TrieNodeMetadataResponse => { const childrenTrie = []; if (!metadata) { - return protobufs.TrieNodeMetadataResponse.create({}); + return TrieNodeMetadataResponse.create({}); } if (metadata.children) { for (const [, child] of metadata.children) { childrenTrie.push( - protobufs.TrieNodeMetadataResponse.create({ + TrieNodeMetadataResponse.create({ prefix: child.prefix, numMessages: child.numMessages, hash: child.hash, @@ -45,7 +42,7 @@ export class MockRpcClient { } } - const metadataResponse = protobufs.TrieNodeMetadataResponse.create({ + const metadataResponse = TrieNodeMetadataResponse.create({ prefix: metadata.prefix, numMessages: metadata.numMessages, hash: metadata.hash, @@ -59,22 +56,22 @@ export class MockRpcClient { return ok(toTrieNodeMetadataResponse(metadata)); } - async getAllSyncIdsByPrefix(request: protobufs.TrieNodePrefix): Promise> { + async getAllSyncIdsByPrefix(request: TrieNodePrefix): Promise> { this.getAllSyncIdsByPrefixCalls.push(request); const syncIds = await this.syncEngine.getAllSyncIdsByPrefix(request.prefix); return ok( - protobufs.SyncIds.create({ + SyncIds.create({ syncIds, }) ); } - async getAllMessagesBySyncIds(request: protobufs.SyncIds): Promise> { + async getAllMessagesBySyncIds(request: SyncIds): Promise> { this.getAllMessagesBySyncIdsCalls.push(request); const messagesResult = await this.engine.getAllMessagesBySyncIds(request.syncIds); return messagesResult.map((messages) => { this.getAllMessagesBySyncIdsReturns += messages.length; - return protobufs.MessagesResponse.create({ messages: messages ?? [] }); + return MessagesResponse.create({ messages: messages ?? [] }); }); } diff --git a/apps/hubble/src/network/sync/multiPeerSyncEngine.test.ts b/apps/hubble/src/network/sync/multiPeerSyncEngine.test.ts index 34207dcdf7..d815f35f6e 100644 --- a/apps/hubble/src/network/sync/multiPeerSyncEngine.test.ts +++ b/apps/hubble/src/network/sync/multiPeerSyncEngine.test.ts @@ -1,5 +1,16 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Ed25519Signer, Factories, getInsecureHubRpcClient, HubRpcClient } from '@farcaster/utils'; +import { + Ed25519Signer, + Factories, + getInsecureHubRpcClient, + HubRpcClient, + FarcasterNetwork, + IdRegistryEvent, + SignerAddMessage, + CastAddMessage, + Message, + TrieNodePrefix, + Empty, +} from '@farcaster/hub-nodejs'; import { APP_NICKNAME, APP_VERSION } from '~/hubble'; import SyncEngine from '~/network/sync/syncEngine'; import { SyncId } from '~/network/sync/syncId'; @@ -16,14 +27,14 @@ const TEST_TIMEOUT_LONG = 60 * 1000; const testDb1 = jestRocksDB(`engine1.peersyncEngine.test`); const testDb2 = jestRocksDB(`engine2.peersyncEngine.test`); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const fid = Factories.Fid.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; beforeAll(async () => { const custodySignerKey = (await custodySigner.getSignerKey())._unsafeUnwrap(); @@ -53,7 +64,7 @@ describe('Multi peer sync engine', () => { ); }; - const removeMessagesWithTsHashes = async (engine: Engine, addMessages: protobufs.Message[]) => { + const removeMessagesWithTsHashes = async (engine: Engine, addMessages: Message[]) => { return await Promise.all( addMessages.map(async (addMessage) => { const castRemove = await Factories.CastRemoveMessage.create( @@ -108,7 +119,7 @@ describe('Multi peer sync engine', () => { await engine1.mergeMessage(signerAdd); // Get info first - const info = await clientForServer1.getInfo(protobufs.Empty.create()); + const info = await clientForServer1.getInfo(Empty.create()); expect(info.isOk()).toBeTruthy(); const infoResult = info._unsafeUnwrap(); expect(infoResult.version).toEqual(APP_VERSION); @@ -118,9 +129,9 @@ describe('Multi peer sync engine', () => { const rpcResult = await clientForServer1.getAllSignerMessagesByFid({ fid }); expect(rpcResult.isOk()).toBeTruthy(); expect(rpcResult._unsafeUnwrap().messages.length).toEqual(1); - const rpcSignerAdd = rpcResult._unsafeUnwrap().messages[0] as protobufs.SignerAddMessage; + const rpcSignerAdd = rpcResult._unsafeUnwrap().messages[0] as SignerAddMessage; - expect(protobufs.Message.toJSON(signerAdd)).toEqual(protobufs.Message.toJSON(rpcSignerAdd)); + expect(Message.toJSON(signerAdd)).toEqual(Message.toJSON(rpcSignerAdd)); expect(signerAdd.data?.fid).toEqual(rpcSignerAdd.data?.fid); // Create a new sync engine from the existing engine, and see if all the messages from the engine @@ -172,7 +183,7 @@ describe('Multi peer sync engine', () => { await sleepWhile(() => syncEngine1.syncTrieQSize > 0, 1000); // grab a new snapshot from the RPC for engine1 - const newSnapshotResult = await clientForServer1.getSyncSnapshotByPrefix(protobufs.TrieNodePrefix.create()); + const newSnapshotResult = await clientForServer1.getSyncSnapshotByPrefix(TrieNodePrefix.create()); expect(newSnapshotResult.isOk()).toBeTruthy(); const newSnapshot = newSnapshotResult._unsafeUnwrap(); @@ -203,7 +214,7 @@ describe('Multi peer sync engine', () => { await engine1.mergeMessage(signerAdd); // Add a cast to engine1 - const castAdd = (await addMessagesWithTimestamps(engine1, [30662167]))[0] as protobufs.Message; + const castAdd = (await addMessagesWithTimestamps(engine1, [30662167]))[0] as Message; await sleepWhile(() => syncEngine1.syncTrieQSize > 0, 1000); const engine2 = new Engine(testDb2, network); @@ -303,7 +314,7 @@ describe('Multi peer sync engine', () => { ); // Create 2 messages for each signer - const castAdds: protobufs.CastAddMessage[] = []; + const castAdds: CastAddMessage[] = []; for (const signer of signers) { for (let i = 0; i < 2; i++) { const castAdd = await Factories.CastAddMessage.create({ data: { fid, network } }, { transient: { signer } }); @@ -459,7 +470,7 @@ describe('Multi peer sync engine', () => { const numBatches = 20; // Remove a few messages from the previous batch - let castMessagesToRemove: protobufs.Message[] = []; + let castMessagesToRemove: Message[] = []; let totalMessages = 0; diff --git a/apps/hubble/src/network/sync/syncEngine.test.ts b/apps/hubble/src/network/sync/syncEngine.test.ts index 3576f2c1d0..f1a4c7ae80 100644 --- a/apps/hubble/src/network/sync/syncEngine.test.ts +++ b/apps/hubble/src/network/sync/syncEngine.test.ts @@ -1,8 +1,17 @@ /* eslint-disable security/detect-non-literal-fs-filename */ -import * as protobufs from '@farcaster/protobufs'; -import { FarcasterNetwork } from '@farcaster/protobufs'; -import { Factories, getFarcasterTime, HubRpcClient } from '@farcaster/utils'; +import { + FarcasterNetwork, + Factories, + getFarcasterTime, + HubRpcClient, + IdRegistryEvent, + MessageType, + SignerAddMessage, + Message, + ReactionType, + TrieNodeMetadataResponse, +} from '@farcaster/hub-nodejs'; import { ok } from 'neverthrow'; import { anything, instance, mock, when } from 'ts-mockito'; import SyncEngine from '~/network/sync/syncEngine'; @@ -15,14 +24,14 @@ import { NetworkFactories } from '../utils/factories'; const testDb = jestRocksDB(`engine.syncEngine.test`); const testDb2 = jestRocksDB(`engine2.syncEngine.test`); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const fid = Factories.Fid.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; -let castAdd: protobufs.Message; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; +let castAdd: Message; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -131,7 +140,7 @@ describe('SyncEngine', () => { const allMessages = await engine.getAllMessagesBySyncIds([id.syncId()]); expect(allMessages.isOk()).toBeTruthy(); - expect(allMessages._unsafeUnwrap()[0]?.data?.type).toEqual(protobufs.MessageType.CAST_REMOVE); + expect(allMessages._unsafeUnwrap()[0]?.data?.type).toEqual(MessageType.CAST_REMOVE); // The trie should contain the message remove expect(await syncEngine.trie.exists(id)).toBeTruthy(); @@ -158,7 +167,7 @@ describe('SyncEngine', () => { // Reaction const reactionBody = { targetCastId: { fid, hash: castAdd.hash }, - type: protobufs.ReactionType.LIKE, + type: ReactionType.LIKE, }; const reaction1 = await Factories.ReactionAddMessage.create( { data: { fid, network, timestamp: 30662167, reactionBody } }, @@ -231,7 +240,7 @@ describe('SyncEngine', () => { called = true; // Return an empty child map so sync will finish with a noop - const emptyMetadata = protobufs.TrieNodeMetadataResponse.create({ + const emptyMetadata = TrieNodeMetadataResponse.create({ prefix: new Uint8Array(), numMessages: 1000, hash: '', @@ -283,9 +292,9 @@ describe('SyncEngine', () => { // Make sure all messages exist expect(await syncEngine2.trie.items()).toEqual(4); expect(await syncEngine2.trie.rootHash()).toEqual(await syncEngine.trie.rootHash()); - expect(await syncEngine2.trie.exists(new SyncId(messages[0] as protobufs.Message))).toBeTruthy(); - expect(await syncEngine2.trie.exists(new SyncId(messages[1] as protobufs.Message))).toBeTruthy(); - expect(await syncEngine2.trie.exists(new SyncId(messages[2] as protobufs.Message))).toBeTruthy(); + expect(await syncEngine2.trie.exists(new SyncId(messages[0] as Message))).toBeTruthy(); + expect(await syncEngine2.trie.exists(new SyncId(messages[1] as Message))).toBeTruthy(); + expect(await syncEngine2.trie.exists(new SyncId(messages[2] as Message))).toBeTruthy(); await syncEngine2.stop(); }); @@ -304,9 +313,9 @@ describe('SyncEngine', () => { // Make sure all messages exist expect(await syncEngine2.trie.items()).toEqual(4); expect(await syncEngine2.trie.rootHash()).toEqual(await syncEngine.trie.rootHash()); - expect(await syncEngine2.trie.exists(new SyncId(messages[0] as protobufs.Message))).toBeTruthy(); - expect(await syncEngine2.trie.exists(new SyncId(messages[1] as protobufs.Message))).toBeTruthy(); - expect(await syncEngine2.trie.exists(new SyncId(messages[2] as protobufs.Message))).toBeTruthy(); + expect(await syncEngine2.trie.exists(new SyncId(messages[0] as Message))).toBeTruthy(); + expect(await syncEngine2.trie.exists(new SyncId(messages[1] as Message))).toBeTruthy(); + expect(await syncEngine2.trie.exists(new SyncId(messages[2] as Message))).toBeTruthy(); await syncEngine2.stop(); }); diff --git a/apps/hubble/src/network/sync/syncEngine.ts b/apps/hubble/src/network/sync/syncEngine.ts index 8e204f84b0..3a1cf11ae1 100644 --- a/apps/hubble/src/network/sync/syncEngine.ts +++ b/apps/hubble/src/network/sync/syncEngine.ts @@ -1,5 +1,20 @@ -import * as protobufs from '@farcaster/protobufs'; -import { getFarcasterTime, HubAsyncResult, HubError, HubResult, HubRpcClient } from '@farcaster/utils'; +import { + getFarcasterTime, + HubAsyncResult, + HubError, + HubResult, + HubRpcClient, + Metadata, + ContactInfoContent, + MergeMessageHubEvent, + PruneMessageHubEvent, + RevokeMessageHubEvent, + TrieNodePrefix, + SyncIds, + Message, + FidRequest, + TrieNodeMetadataResponse, +} from '@farcaster/hub-nodejs'; import { PeerId } from '@libp2p/interface-peer-id'; import { err, ok, Result } from 'neverthrow'; import { TypedEmitter } from 'tiny-typed-emitter'; @@ -32,7 +47,7 @@ interface SyncEvents { } type PeerContact = { - contactInfo: protobufs.ContactInfoContent; + contactInfo: ContactInfoContent; peerId: PeerId; }; @@ -60,7 +75,7 @@ class SyncEngine extends TypedEmitter { this.engine = engine; - this.engine.eventHandler.on('mergeMessage', async (event: protobufs.MergeMessageHubEvent) => { + this.engine.eventHandler.on('mergeMessage', async (event: MergeMessageHubEvent) => { const { message, deletedMessages } = event.mergeMessageBody; const totalMessages = 1 + (deletedMessages?.length ?? 0); this._syncTrieQ += totalMessages; @@ -77,12 +92,12 @@ class SyncEngine extends TypedEmitter { // This is fine, because we'll just end up syncing the message again. It's much worse to miss a removal and cause // the trie to diverge in a way that's not recoverable without reconstructing it from the db. // Order of events does not matter. The trie will always converge to the same state. - this.engine.eventHandler.on('pruneMessage', async (event: protobufs.PruneMessageHubEvent) => { + this.engine.eventHandler.on('pruneMessage', async (event: PruneMessageHubEvent) => { this._syncTrieQ += 1; await this.removeMessage(event.pruneMessageBody.message); this._syncTrieQ -= 1; }); - this.engine.eventHandler.on('revokeMessage', async (event: protobufs.RevokeMessageHubEvent) => { + this.engine.eventHandler.on('revokeMessage', async (event: RevokeMessageHubEvent) => { this._syncTrieQ += 1; await this.removeMessage(event.revokeMessageBody.message); this._syncTrieQ -= 1; @@ -153,7 +168,7 @@ class SyncEngine extends TypedEmitter { return this.currentHubPeerContacts.get(peerId); } - public addContactInfoForPeerId(peerId: PeerId, contactInfo: protobufs.ContactInfoContent) { + public addContactInfoForPeerId(peerId: PeerId, contactInfo: ContactInfoContent) { this.currentHubPeerContacts.set(peerId.toString(), { peerId, contactInfo }); } @@ -214,8 +229,8 @@ class SyncEngine extends TypedEmitter { try { // First, get the latest state from the peer const peerStateResult = await rpcClient.getSyncSnapshotByPrefix( - protobufs.TrieNodePrefix.create({ prefix: new Uint8Array() }), - new protobufs.Metadata(), + TrieNodePrefix.create({ prefix: new Uint8Array() }), + new Metadata(), rpcDeadline() ); if (peerStateResult.isErr()) { @@ -336,8 +351,8 @@ class SyncEngine extends TypedEmitter { let result = true; const messagesResult = await rpcClient.getAllMessagesBySyncIds( - protobufs.SyncIds.create({ syncIds }), - new protobufs.Metadata(), + SyncIds.create({ syncIds }), + new Metadata(), rpcDeadline() ); await messagesResult.match( @@ -353,7 +368,7 @@ class SyncEngine extends TypedEmitter { return result; } - public async mergeMessages(messages: protobufs.Message[], rpcClient: HubRpcClient): Promise[]> { + public async mergeMessages(messages: Message[], rpcClient: HubRpcClient): Promise[]> { const mergeResults: HubResult[] = []; // First, sort the messages by timestamp to reduce thrashing and refetching messages.sort((a, b) => (a.data?.timestamp || 0) - (b.data?.timestamp || 0)); @@ -430,8 +445,8 @@ class SyncEngine extends TypedEmitter { const ourNode = await this._trie.getTrieNodeMetadata(prefix); const theirNodeResult = await rpcClient.getSyncMetadataByPrefix( - protobufs.TrieNodePrefix.create({ prefix }), - new protobufs.Metadata(), + TrieNodePrefix.create({ prefix }), + new Metadata(), rpcDeadline() ); @@ -477,8 +492,8 @@ class SyncEngine extends TypedEmitter { // the node's children and fetch them in batches. if (theirNode.numMessages <= fetchMessagesThreshold) { const result = await rpcClient.getAllSyncIdsByPrefix( - protobufs.TrieNodePrefix.create({ prefix: theirNode.prefix }), - new protobufs.Metadata(), + TrieNodePrefix.create({ prefix: theirNode.prefix }), + new Metadata(), rpcDeadline() ); @@ -505,11 +520,11 @@ class SyncEngine extends TypedEmitter { /** ---------------------------------------------------------------------------------- */ /** Trie Methods */ /** ---------------------------------------------------------------------------------- */ - public async addMessage(message: protobufs.Message): Promise { + public async addMessage(message: Message): Promise { await this._trie.insert(new SyncId(message)); } - public async removeMessage(message: protobufs.Message): Promise { + public async removeMessage(message: Message): Promise { await this._trie.deleteBySyncId(new SyncId(message)); } @@ -550,7 +565,7 @@ class SyncEngine extends TypedEmitter { }); } - private async retryIdRegistryEvent(message: protobufs.Message, rpcClient: HubRpcClient) { + private async retryIdRegistryEvent(message: Message, rpcClient: HubRpcClient) { const fid = message.data?.fid; if (!fid) { log.error({ fid }, 'Invalid fid while fetching custody event'); @@ -558,8 +573,8 @@ class SyncEngine extends TypedEmitter { } const custodyEventResult = await rpcClient.getIdRegistryEvent( - protobufs.FidRequest.create({ fid }), - new protobufs.Metadata(), + FidRequest.create({ fid }), + new Metadata(), rpcDeadline() ); if (custodyEventResult.isErr()) { @@ -574,10 +589,7 @@ class SyncEngine extends TypedEmitter { await this._ethEventsProvider?.retryEventsFromBlock(custodyEventBlockNumber); } - private async syncUserAndRetryMessage( - message: protobufs.Message, - rpcClient: HubRpcClient - ): Promise> { + private async syncUserAndRetryMessage(message: Message, rpcClient: HubRpcClient): Promise> { const fid = message.data?.fid; if (!fid) { return err(new HubError('bad_request.invalid_param', 'Invalid fid while retrying message')); @@ -587,8 +599,8 @@ class SyncEngine extends TypedEmitter { // sync will complete in one round (prevents messages failing to merge due to missed or out of // order signer message) const signerMessagesResult = await rpcClient.getAllSignerMessagesByFid( - protobufs.FidRequest.create({ fid }), - new protobufs.Metadata(), + FidRequest.create({ fid }), + new Metadata(), rpcDeadline() ); if (signerMessagesResult.isErr()) { @@ -613,7 +625,7 @@ const rpcDeadline = () => { return { deadline: Date.now() + 1000 * 5 }; }; -const fromNodeMetadataResponse = (response: protobufs.TrieNodeMetadataResponse): NodeMetadata => { +const fromNodeMetadataResponse = (response: TrieNodeMetadataResponse): NodeMetadata => { const children = new Map(); for (let i = 0; i < response.children.length; i++) { // Safety: i is controlled by the loop diff --git a/apps/hubble/src/network/sync/syncEnginePerf.test.ts b/apps/hubble/src/network/sync/syncEnginePerf.test.ts index 33dae09452..74bef91c5f 100644 --- a/apps/hubble/src/network/sync/syncEnginePerf.test.ts +++ b/apps/hubble/src/network/sync/syncEnginePerf.test.ts @@ -1,8 +1,6 @@ // eslint-disable-file security/detect-non-literal-fs-filename -import * as protobufs from '@farcaster/protobufs'; -import { FarcasterNetwork } from '@farcaster/protobufs'; -import { Factories, HubRpcClient } from '@farcaster/utils'; +import { FarcasterNetwork, Factories, HubRpcClient, IdRegistryEvent, SignerAddMessage } from '@farcaster/hub-nodejs'; import SyncEngine from '~/network/sync/syncEngine'; import { jestRocksDB } from '~/storage/db/jestUtils'; import Engine from '~/storage/engine'; @@ -12,13 +10,13 @@ import { EMPTY_HASH } from './trieNode'; const testDb = jestRocksDB(`engine.syncEnginePerf.test`); const testDb2 = jestRocksDB(`engine2.syncEnginePerf.test`); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const fid = Factories.Fid.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); diff --git a/apps/hubble/src/network/sync/syncId.test.ts b/apps/hubble/src/network/sync/syncId.test.ts index da1fdbb11e..414f6d06c1 100644 --- a/apps/hubble/src/network/sync/syncId.test.ts +++ b/apps/hubble/src/network/sync/syncId.test.ts @@ -1,8 +1,7 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories } from '@farcaster/utils'; +import { Factories, Message } from '@farcaster/hub-nodejs'; import { SyncId } from './syncId'; -let message: protobufs.Message; +let message: Message; beforeAll(async () => { message = await Factories.CastAddMessage.create(); diff --git a/apps/hubble/src/network/sync/syncId.ts b/apps/hubble/src/network/sync/syncId.ts index b6545d3101..7ad4b2efef 100644 --- a/apps/hubble/src/network/sync/syncId.ts +++ b/apps/hubble/src/network/sync/syncId.ts @@ -1,6 +1,6 @@ -import * as protobufs from '@farcaster/protobufs'; import { makeMessagePrimaryKey, typeToSetPostfix } from '~/storage/db/message'; import { FID_BYTES, HASH_LENGTH } from '~/storage/db/types'; +import { Message } from '@farcaster/hub-nodejs'; const TIMESTAMP_LENGTH = 10; // Used to represent a decimal timestamp @@ -18,7 +18,7 @@ class SyncId { private readonly _timestamp: number; private readonly _type: number; - constructor(message: protobufs.Message) { + constructor(message: Message) { this._fid = message.data?.fid || 0; this._hash = message.hash; this._timestamp = message.data?.timestamp || 0; diff --git a/apps/hubble/src/network/sync/trieNode.test.ts b/apps/hubble/src/network/sync/trieNode.test.ts index ab67415f98..d0fff7aa3c 100644 --- a/apps/hubble/src/network/sync/trieNode.test.ts +++ b/apps/hubble/src/network/sync/trieNode.test.ts @@ -1,4 +1,4 @@ -import { Factories, hexStringToBytes, utf8StringToBytes } from '@farcaster/utils'; +import { Factories, hexStringToBytes, utf8StringToBytes } from '@farcaster/hub-nodejs'; import { TIMESTAMP_LENGTH } from '~/network/sync/syncId'; import { EMPTY_HASH, TrieNode } from '~/network/sync/trieNode'; import { NetworkFactories } from '~/network/utils/factories'; diff --git a/apps/hubble/src/network/sync/trieNode.ts b/apps/hubble/src/network/sync/trieNode.ts index b43c45393e..27832ce6c2 100644 --- a/apps/hubble/src/network/sync/trieNode.ts +++ b/apps/hubble/src/network/sync/trieNode.ts @@ -1,5 +1,4 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesCompare, HubError } from '@farcaster/utils'; +import { bytesCompare, DbTrieNode, HubError } from '@farcaster/hub-nodejs'; import { blake3 } from '@noble/hashes/blake3'; import { ResultAsync } from 'neverthrow'; import { TIMESTAMP_LENGTH } from '~/network/sync/syncId'; @@ -359,7 +358,7 @@ class TrieNode { } static deserialize(serialized: Uint8Array): TrieNode { - const dbtrieNode = protobufs.DbTrieNode.decode(serialized); + const dbtrieNode = DbTrieNode.decode(serialized); const trieNode = new TrieNode(); trieNode._key = dbtrieNode.key.length === 0 ? undefined : dbtrieNode.key; @@ -377,14 +376,14 @@ class TrieNode { /* Private methods */ private serialize(): Buffer { - const dbtrieNode = protobufs.DbTrieNode.create({ + const dbtrieNode = DbTrieNode.create({ key: this._key ?? new Uint8Array(), childChars: Array.from(this._children.keys()), items: this._items, hash: this._hash, }); - return Buffer.from(protobufs.DbTrieNode.encode(dbtrieNode).finish()); + return Buffer.from(DbTrieNode.encode(dbtrieNode).finish()); } private saveToDBTx(dbUpdatesMap: Map, prefix: Uint8Array): Map { diff --git a/apps/hubble/src/network/utils/factories.test.ts b/apps/hubble/src/network/utils/factories.test.ts index ed0e88eb1d..0af20e3dfc 100644 --- a/apps/hubble/src/network/utils/factories.test.ts +++ b/apps/hubble/src/network/utils/factories.test.ts @@ -1,13 +1,12 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories } from '@farcaster/utils'; +import { Factories, GossipMessage, Message, GossipAddressInfo } from '@farcaster/hub-nodejs'; import { isPeerId } from '@libp2p/interface-peer-id'; import { peerIdFromBytes } from '@libp2p/peer-id'; import { GOSSIP_PROTOCOL_VERSION } from '~/network/p2p/protocol'; import { NetworkFactories } from '~/network/utils/factories'; describe('GossipMessageFactory', () => { - let message: protobufs.Message; - let gossipMessage: protobufs.GossipMessage; + let message: Message; + let gossipMessage: GossipMessage; beforeAll(async () => { message = await Factories.Message.create(); @@ -44,8 +43,8 @@ describe('AddressInfoFactory', () => { }); describe('ContactInfoFactory', () => { - let gossipAddress: protobufs.GossipAddressInfo; - let rpcAddress: protobufs.GossipAddressInfo; + let gossipAddress: GossipAddressInfo; + let rpcAddress: GossipAddressInfo; beforeAll(() => { gossipAddress = NetworkFactories.GossipAddressInfo.build(); diff --git a/apps/hubble/src/network/utils/factories.ts b/apps/hubble/src/network/utils/factories.ts index 46012e4486..da8f60f600 100644 --- a/apps/hubble/src/network/utils/factories.ts +++ b/apps/hubble/src/network/utils/factories.ts @@ -1,22 +1,28 @@ import { faker } from '@faker-js/faker'; -import * as protobufs from '@farcaster/protobufs'; -import { Factories, hexStringToBytes } from '@farcaster/utils'; +import { + ContactInfoContent, + Factories, + GossipAddressInfo, + GossipMessage, + GossipVersion, + hexStringToBytes, +} from '@farcaster/hub-nodejs'; import { PeerId } from '@libp2p/interface-peer-id'; import { createEd25519PeerId } from '@libp2p/peer-id-factory'; import { Factory } from 'fishery'; import { NETWORK_TOPIC_PRIMARY } from '~/network/p2p/protocol'; import { HASH_LENGTH, SyncId } from '~/network/sync/syncId'; -const GossipAddressInfoFactory = Factory.define(() => { - return protobufs.GossipAddressInfo.create({ +const GossipAddressInfoFactory = Factory.define(() => { + return GossipAddressInfo.create({ address: '0.0.0.0', port: faker.datatype.number({ min: 1, max: 65535 }), family: 4, }); }); -const ContactInfoContentFactory = Factory.define(() => { - return protobufs.ContactInfoContent.create({ +const ContactInfoContentFactory = Factory.define(() => { + return ContactInfoContent.create({ gossipAddress: GossipAddressInfoFactory.build(), rpcAddress: GossipAddressInfoFactory.build(), excludedHashes: [], @@ -24,7 +30,7 @@ const ContactInfoContentFactory = Factory.define(( }); }); -const GossipMessageFactory = Factory.define( +const GossipMessageFactory = Factory.define( ({ onCreate, transientParams }) => { onCreate(async (gossipMessage) => { if (gossipMessage.peerId.length === 0) { @@ -33,11 +39,11 @@ const GossipMessageFactory = Factory.define { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -44,15 +63,13 @@ beforeAll(async () => { ); }); -const assertMessagesMatchResult = (result: HubResult, messages: protobufs.Message[]) => { - expect(result._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - messages.map((m) => protobufs.Message.toJSON(m)) - ); +const assertMessagesMatchResult = (result: HubResult, messages: Message[]) => { + expect(result._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual(messages.map((m) => Message.toJSON(m))); }; describe('getAllCastMessagesByFid', () => { - let castAdd: protobufs.CastAddMessage; - let castRemove: protobufs.CastRemoveMessage; + let castAdd: CastAddMessage; + let castRemove: CastRemoveMessage; beforeAll(async () => { castAdd = await Factories.CastAddMessage.create({ data: { fid, network } }, { transient: { signer } }); @@ -71,19 +88,19 @@ describe('getAllCastMessagesByFid', () => { test('succeeds', async () => { await engine.mergeMessage(castAdd); await engine.mergeMessage(castRemove); - const result = await client.getAllCastMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllCastMessagesByFid(FidRequest.create({ fid })); assertMessagesMatchResult(result, [castAdd, castRemove]); }); test('returns empty array without messages', async () => { - const result = await client.getAllCastMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllCastMessagesByFid(FidRequest.create({ fid })); expect(result._unsafeUnwrap().messages.length).toEqual(0); }); }); describe('getAllReactionMessagesByFid', () => { - let reactionAdd: protobufs.ReactionAddMessage; - let reactionRemove: protobufs.ReactionRemoveMessage; + let reactionAdd: ReactionAddMessage; + let reactionRemove: ReactionRemoveMessage; beforeAll(async () => { reactionAdd = await Factories.ReactionAddMessage.create({ data: { fid, network } }, { transient: { signer } }); @@ -102,19 +119,19 @@ describe('getAllReactionMessagesByFid', () => { test('succeeds', async () => { await engine.mergeMessage(reactionAdd); await engine.mergeMessage(reactionRemove); - const result = await client.getAllReactionMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllReactionMessagesByFid(FidRequest.create({ fid })); assertMessagesMatchResult(result, [reactionAdd, reactionRemove]); }); test('returns empty array without messages', async () => { - const result = await client.getAllReactionMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllReactionMessagesByFid(FidRequest.create({ fid })); expect(result._unsafeUnwrap().messages.length).toEqual(0); }); }); describe('getAllVerificationMessagesByFid', () => { - let verificationAdd: protobufs.VerificationAddEthAddressMessage; - let verificationRemove: protobufs.VerificationRemoveMessage; + let verificationAdd: VerificationAddEthAddressMessage; + let verificationRemove: VerificationRemoveMessage; beforeAll(async () => { verificationAdd = await Factories.VerificationAddEthAddressMessage.create( @@ -136,18 +153,18 @@ describe('getAllVerificationMessagesByFid', () => { test('succeeds', async () => { await engine.mergeMessage(verificationAdd); await engine.mergeMessage(verificationRemove); - const result = await client.getAllVerificationMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllVerificationMessagesByFid(FidRequest.create({ fid })); assertMessagesMatchResult(result, [verificationAdd, verificationRemove]); }); test('returns empty array without messages', async () => { - const result = await client.getAllVerificationMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllVerificationMessagesByFid(FidRequest.create({ fid })); expect(result._unsafeUnwrap().messages.length).toEqual(0); }); }); describe('getAllSignerMessagesByFid', () => { - let signerRemove: protobufs.SignerRemoveMessage; + let signerRemove: SignerRemoveMessage; beforeAll(async () => { signerRemove = await Factories.SignerRemoveMessage.create( @@ -163,46 +180,46 @@ describe('getAllSignerMessagesByFid', () => { test('succeeds', async () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(signerRemove); - const result = await client.getAllSignerMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllSignerMessagesByFid(FidRequest.create({ fid })); assertMessagesMatchResult(result, [signerAdd, signerRemove]); }); test('returns pageSize results', async () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(signerRemove); - const result = await client.getAllSignerMessagesByFid(protobufs.FidRequest.create({ fid, pageSize: 1 })); + const result = await client.getAllSignerMessagesByFid(FidRequest.create({ fid, pageSize: 1 })); assertMessagesMatchResult(result, [signerAdd]); }); test('returns all signer messages when pageSize > events', async () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(signerRemove); - const result = await client.getAllSignerMessagesByFid(protobufs.FidRequest.create({ fid, pageSize: 3 })); + const result = await client.getAllSignerMessagesByFid(FidRequest.create({ fid, pageSize: 3 })); assertMessagesMatchResult(result, [signerAdd, signerRemove]); }); test('returns results after pageToken', async () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(signerRemove); - const page1Result = await client.getAllSignerMessagesByFid(protobufs.FidRequest.create({ fid, pageSize: 1 })); + const page1Result = await client.getAllSignerMessagesByFid(FidRequest.create({ fid, pageSize: 1 })); const page2Result = await client.getAllSignerMessagesByFid( - protobufs.FidRequest.create({ fid, pageSize: 1, pageToken: page1Result._unsafeUnwrap().nextPageToken }) + FidRequest.create({ fid, pageSize: 1, pageToken: page1Result._unsafeUnwrap().nextPageToken }) ); assertMessagesMatchResult(page2Result, [signerRemove]); }); test('returns empty array without messages', async () => { - const result = await client.getAllSignerMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllSignerMessagesByFid(FidRequest.create({ fid })); assertMessagesMatchResult(result, []); }); }); describe('getAllUserDataMessagesByFid', () => { - let userDataAdd: protobufs.UserDataAddMessage; + let userDataAdd: UserDataAddMessage; beforeAll(async () => { userDataAdd = await Factories.UserDataAddMessage.create( - { data: { fid, network, userDataBody: { type: protobufs.UserDataType.BIO } } }, + { data: { fid, network, userDataBody: { type: UserDataType.BIO } } }, { transient: { signer } } ); }); @@ -214,12 +231,12 @@ describe('getAllUserDataMessagesByFid', () => { test('succeeds', async () => { await engine.mergeMessage(userDataAdd); - const result = await client.getAllUserDataMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllUserDataMessagesByFid(FidRequest.create({ fid })); assertMessagesMatchResult(result, [userDataAdd]); }); test('returns empty array without messages', async () => { - const result = await client.getAllUserDataMessagesByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getAllUserDataMessagesByFid(FidRequest.create({ fid })); expect(result._unsafeUnwrap().messages.length).toEqual(0); }); }); diff --git a/apps/hubble/src/rpc/test/castService.test.ts b/apps/hubble/src/rpc/test/castService.test.ts index 0218388c87..550d2beae4 100644 --- a/apps/hubble/src/rpc/test/castService.test.ts +++ b/apps/hubble/src/rpc/test/castService.test.ts @@ -1,5 +1,17 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, getInsecureHubRpcClient, HubError, HubRpcClient } from '@farcaster/utils'; +import { + Message, + FarcasterNetwork, + IdRegistryEvent, + SignerAddMessage, + CastAddMessage, + CastId, + FidRequest, + CastsByParentRequest, + Factories, + HubError, + getInsecureHubRpcClient, + HubRpcClient, +} from '@farcaster/hub-nodejs'; import SyncEngine from '~/network/sync/syncEngine'; import Server from '~/rpc/server'; import { jestRocksDB } from '~/storage/db/jestUtils'; @@ -7,7 +19,7 @@ import Engine from '~/storage/engine'; import { MockHub } from '~/test/mocks'; const db = jestRocksDB('protobufs.rpc.castService.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); @@ -30,9 +42,9 @@ const fid = Factories.Fid.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; -let castAdd: protobufs.CastAddMessage; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; +let castAdd: CastAddMessage; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -53,30 +65,30 @@ describe('getCast', () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(castAdd); - const result = await client.getCast(protobufs.CastId.create({ fid, hash: castAdd.hash })); + const result = await client.getCast(CastId.create({ fid, hash: castAdd.hash })); expect(result.isOk()).toBeTruthy(); - expect(protobufs.Message.toJSON(result._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(castAdd)); + expect(Message.toJSON(result._unsafeUnwrap())).toEqual(Message.toJSON(castAdd)); }); test('fails if cast is missing', async () => { await engine.mergeIdRegistryEvent(custodyEvent); await engine.mergeMessage(signerAdd); - const result = await client.getCast(protobufs.CastId.create({ fid, hash: castAdd.hash })); + const result = await client.getCast(CastId.create({ fid, hash: castAdd.hash })); expect(result._unsafeUnwrapErr().errCode).toEqual('not_found'); }); test('fails without fid or tsHash', async () => { - const result = await client.getCast(protobufs.CastId.create({ fid: 0, hash: new Uint8Array() })); + const result = await client.getCast(CastId.create({ fid: 0, hash: new Uint8Array() })); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'fid is missing')); }); test('fails without tsHash', async () => { - const result = await client.getCast(protobufs.CastId.create({ fid, hash: new Uint8Array() })); + const result = await client.getCast(CastId.create({ fid, hash: new Uint8Array() })); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'NotFound: ')); }); test('fails without fid', async () => { - const result = await client.getCast(protobufs.CastId.create({ fid: 0, hash: castAdd.hash })); + const result = await client.getCast(CastId.create({ fid: 0, hash: castAdd.hash })); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'fid is missing')); }); @@ -88,10 +100,8 @@ describe('getCast', () => { test('succeeds', async () => { await engine.mergeMessage(castAdd); - const casts = await client.getCastsByFid(protobufs.FidRequest.create({ fid })); - expect(protobufs.Message.toJSON(casts._unsafeUnwrap().messages.at(0) as protobufs.Message)).toEqual( - protobufs.Message.toJSON(castAdd) - ); + const casts = await client.getCastsByFid(FidRequest.create({ fid })); + expect(Message.toJSON(casts._unsafeUnwrap().messages.at(0) as Message)).toEqual(Message.toJSON(castAdd)); }); test('returns casts in chronological order', async () => { @@ -105,11 +115,11 @@ describe('getCast', () => { { transient: { signer } } ); await engine.mergeMessage(latestCast); - castsAsJson.push(protobufs.Message.toJSON(latestCast)); + castsAsJson.push(Message.toJSON(latestCast)); } - const clientRetrievedCasts = await client.getCastsByFid(protobufs.FidRequest.create({ fid })); - const clientRetrievedCastsAsJson = clientRetrievedCasts._unsafeUnwrap().messages.map(protobufs.Message.toJSON); + const clientRetrievedCasts = await client.getCastsByFid(FidRequest.create({ fid })); + const clientRetrievedCastsAsJson = clientRetrievedCasts._unsafeUnwrap().messages.map(Message.toJSON); expect(castsAsJson.length).toEqual(4); expect(clientRetrievedCastsAsJson.length).toEqual(4); @@ -118,7 +128,7 @@ describe('getCast', () => { }); test('returns empty array without casts', async () => { - const casts = await client.getCastsByFid(protobufs.FidRequest.create({ fid })); + const casts = await client.getCastsByFid(FidRequest.create({ fid })); expect(casts._unsafeUnwrap().messages).toEqual([]); }); }); @@ -131,15 +141,13 @@ describe('getCast', () => { test('succeeds', async () => { await engine.mergeMessage(castAdd); - const request = protobufs.CastsByParentRequest.create({ castId: castAdd.data.castAddBody.parentCastId }); + const request = CastsByParentRequest.create({ castId: castAdd.data.castAddBody.parentCastId }); const casts = await client.getCastsByParent(request); - expect(protobufs.Message.toJSON(casts._unsafeUnwrap().messages.at(0) as protobufs.Message)).toEqual( - protobufs.Message.toJSON(castAdd) - ); + expect(Message.toJSON(casts._unsafeUnwrap().messages.at(0) as Message)).toEqual(Message.toJSON(castAdd)); }); test('returns empty array without casts', async () => { - const request = protobufs.CastsByParentRequest.create({ castId: castAdd.data.castAddBody.parentCastId }); + const request = CastsByParentRequest.create({ castId: castAdd.data.castAddBody.parentCastId }); const casts = await client.getCastsByParent(request); expect(casts._unsafeUnwrap().messages).toEqual([]); }); @@ -157,11 +165,9 @@ describe('getCast', () => { const casts = await client.getCastsByMention( // Safety: i is controlled by the loop and cannot be used to inject // eslint-disable-next-line security/detect-object-injection - protobufs.FidRequest.create({ fid: castAdd.data?.castAddBody?.mentions[i] as number }) - ); - expect(protobufs.Message.toJSON(casts._unsafeUnwrap().messages.at(0) as protobufs.Message)).toEqual( - protobufs.Message.toJSON(castAdd) + FidRequest.create({ fid: castAdd.data?.castAddBody?.mentions[i] as number }) ); + expect(Message.toJSON(casts._unsafeUnwrap().messages.at(0) as Message)).toEqual(Message.toJSON(castAdd)); } }); @@ -170,7 +176,7 @@ describe('getCast', () => { const casts = await client.getCastsByMention( // Safety: i is controlled by the loop and cannot be used to inject // eslint-disable-next-line security/detect-object-injection - protobufs.FidRequest.create({ fid: castAdd.data?.castAddBody?.mentions[i] as number }) + FidRequest.create({ fid: castAdd.data?.castAddBody?.mentions[i] as number }) ); expect(casts._unsafeUnwrap().messages).toEqual([]); } diff --git a/apps/hubble/src/rpc/test/concurrency.test.ts b/apps/hubble/src/rpc/test/concurrency.test.ts index 22ae5a6fed..f4bd099d5a 100644 --- a/apps/hubble/src/rpc/test/concurrency.test.ts +++ b/apps/hubble/src/rpc/test/concurrency.test.ts @@ -1,5 +1,12 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, getInsecureHubRpcClient, HubResult, HubRpcClient } from '@farcaster/utils'; +import { + Factories, + HubResult, + getInsecureHubRpcClient, + HubRpcClient, + FarcasterNetwork, + Message, + ReactionType, +} from '@farcaster/hub-nodejs'; import SyncEngine from '~/network/sync/syncEngine'; import Server from '~/rpc/server'; import { jestRocksDB } from '~/storage/db/jestUtils'; @@ -8,7 +15,7 @@ import { seedSigner } from '~/storage/engine/seed'; import { MockHub } from '~/test/mocks'; const db = jestRocksDB('protobufs.rpc.concurrency.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); @@ -37,7 +44,7 @@ const fid = Factories.Fid.build(); const signer1 = Factories.Ed25519Signer.build(); const signer2 = Factories.Ed25519Signer.build(); -const assertNoTimeouts = (results: HubResult[]) => { +const assertNoTimeouts = (results: HubResult[]) => { expect( results.every( (result) => result.isOk() || (result.isErr() && result.error.errCode !== 'unavailable.storage_failure') @@ -56,17 +63,17 @@ describe('submitMessage', () => { test('succeeds with concurrent, conflicting reaction messages', async () => { const castId = Factories.CastId.build(); const like1 = await Factories.ReactionAddMessage.create( - { data: { fid, reactionBody: { type: protobufs.ReactionType.LIKE, targetCastId: castId } } }, + { data: { fid, reactionBody: { type: ReactionType.LIKE, targetCastId: castId } } }, { transient: { signer: signer1 } } ); const like2 = await Factories.ReactionAddMessage.create( - { data: { fid, reactionBody: { type: protobufs.ReactionType.LIKE, targetCastId: castId } } }, + { data: { fid, reactionBody: { type: ReactionType.LIKE, targetCastId: castId } } }, { transient: { signer: signer2 } } ); const removeLike2 = await Factories.ReactionRemoveMessage.create( - { data: { fid, reactionBody: { type: protobufs.ReactionType.LIKE, targetCastId: castId } } }, + { data: { fid, reactionBody: { type: ReactionType.LIKE, targetCastId: castId } } }, { transient: { signer: signer2 } } ); @@ -136,13 +143,11 @@ describe('submitMessage', () => { // We are expecting 2 messages. cast1add and cast2remove expect(response._unsafeUnwrap().messages.length).toEqual(2); - expect( - protobufs.Message.toJSON(response._unsafeUnwrap().messages.find((m) => m.data.castAddBody) as protobufs.Message) - ).toEqual(protobufs.Message.toJSON(cast2)); - expect( - protobufs.Message.toJSON( - response._unsafeUnwrap().messages.find((m) => m.data.castRemoveBody) as protobufs.Message - ) - ).toEqual(protobufs.Message.toJSON(removeCast1)); + expect(Message.toJSON(response._unsafeUnwrap().messages.find((m) => m.data.castAddBody) as Message)).toEqual( + Message.toJSON(cast2) + ); + expect(Message.toJSON(response._unsafeUnwrap().messages.find((m) => m.data.castRemoveBody) as Message)).toEqual( + Message.toJSON(removeCast1) + ); }); }); diff --git a/apps/hubble/src/rpc/test/eventService.test.ts b/apps/hubble/src/rpc/test/eventService.test.ts index 86c34ae3cd..c1099e024e 100644 --- a/apps/hubble/src/rpc/test/eventService.test.ts +++ b/apps/hubble/src/rpc/test/eventService.test.ts @@ -1,6 +1,25 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, getInsecureHubRpcClient, HubRpcClient } from '@farcaster/utils'; +import { + Message, + FarcasterNetwork, + IdRegistryEvent, + NameRegistryEvent, + SignerAddMessage, + CastAddMessage, + ReactionAddMessage, + HubEventType, + HubEvent, + SubscribeRequest, + isMergeMessageHubEvent, + isPruneMessageHubEvent, + isRevokeMessageHubEvent, + isMergeIdRegistryEventHubEvent, + isMergeNameRegistryEventHubEvent, + Factories, + getInsecureHubRpcClient, + HubRpcClient, + ClientReadableStream, +} from '@farcaster/hub-nodejs'; import Server from '~/rpc/server'; import { jestRocksDB } from '~/storage/db/jestUtils'; import Engine from '~/storage/engine'; @@ -8,7 +27,7 @@ import { MockHub } from '~/test/mocks'; import { sleep } from '~/utils/crypto'; const db = jestRocksDB('rpc.eventService.test'); -const engine = new Engine(db, protobufs.FarcasterNetwork.TESTNET); +const engine = new Engine(db, FarcasterNetwork.TESTNET); const hub = new MockHub(db, engine); let server: Server; @@ -29,13 +48,13 @@ const fid = Factories.Fid.build(); const fname = Factories.Fname.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let nameRegistryEvent: protobufs.NameRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; -let castAdd: protobufs.CastAddMessage; -let reactionAdd: protobufs.ReactionAddMessage; -let events: [protobufs.HubEventType, any][]; -let stream: protobufs.ClientReadableStream; +let custodyEvent: IdRegistryEvent; +let nameRegistryEvent: NameRegistryEvent; +let signerAdd: SignerAddMessage; +let castAdd: CastAddMessage; +let reactionAdd: ReactionAddMessage; +let events: [HubEventType, any][]; +let stream: ClientReadableStream; beforeEach(async () => { events = []; @@ -61,29 +80,26 @@ beforeAll(async () => { }); const setupSubscription = async ( - events: [protobufs.HubEventType, any][], - options: { eventTypes?: protobufs.HubEventType[]; fromId?: number } = {} -): Promise> => { - const request = protobufs.SubscribeRequest.create(options); + events: [HubEventType, any][], + options: { eventTypes?: HubEventType[]; fromId?: number } = {} +): Promise> => { + const request = SubscribeRequest.create(options); const streamResult = await client.subscribe(request); expect(streamResult.isOk()).toBeTruthy(); const stream = streamResult._unsafeUnwrap(); - stream.on('data', (event: protobufs.HubEvent) => { - if (protobufs.isMergeMessageHubEvent(event)) { - events.push([event.type, protobufs.Message.toJSON(event.mergeMessageBody.message!)]); - } else if (protobufs.isPruneMessageHubEvent(event)) { - events.push([event.type, protobufs.Message.toJSON(event.pruneMessageBody.message!)]); - } else if (protobufs.isRevokeMessageHubEvent(event)) { - events.push([event.type, protobufs.Message.toJSON(event.revokeMessageBody.message!)]); - } else if (protobufs.isMergeIdRegistryEventHubEvent(event)) { - events.push([event.type, protobufs.IdRegistryEvent.toJSON(event.mergeIdRegistryEventBody.idRegistryEvent!)]); - } else if (protobufs.isMergeNameRegistryEventHubEvent(event)) { - events.push([ - event.type, - protobufs.NameRegistryEvent.toJSON(event.mergeNameRegistryEventBody.nameRegistryEvent!), - ]); + stream.on('data', (event: HubEvent) => { + if (isMergeMessageHubEvent(event)) { + events.push([event.type, Message.toJSON(event.mergeMessageBody.message!)]); + } else if (isPruneMessageHubEvent(event)) { + events.push([event.type, Message.toJSON(event.pruneMessageBody.message!)]); + } else if (isRevokeMessageHubEvent(event)) { + events.push([event.type, Message.toJSON(event.revokeMessageBody.message!)]); + } else if (isMergeIdRegistryEventHubEvent(event)) { + events.push([event.type, IdRegistryEvent.toJSON(event.mergeIdRegistryEventBody.idRegistryEvent!)]); + } else if (isMergeNameRegistryEventHubEvent(event)) { + events.push([event.type, NameRegistryEvent.toJSON(event.mergeNameRegistryEventBody.nameRegistryEvent!)]); } }); @@ -101,9 +117,9 @@ describe('subscribe', () => { await engine.mergeMessage(castAdd); await sleep(100); // Wait for server to send events over stream expect(events).toEqual([ - [protobufs.HubEventType.MERGE_ID_REGISTRY_EVENT, protobufs.IdRegistryEvent.toJSON(custodyEvent)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(signerAdd)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(castAdd)], + [HubEventType.MERGE_ID_REGISTRY_EVENT, IdRegistryEvent.toJSON(custodyEvent)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(signerAdd)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(castAdd)], ]); }); }); @@ -111,7 +127,7 @@ describe('subscribe', () => { describe('with one type filter', () => { test('emits events', async () => { stream = await setupSubscription(events, { - eventTypes: [protobufs.HubEventType.MERGE_MESSAGE], + eventTypes: [HubEventType.MERGE_MESSAGE], }); await engine.mergeIdRegistryEvent(custodyEvent); @@ -120,8 +136,8 @@ describe('subscribe', () => { await engine.mergeMessage(castAdd); await sleep(100); // Wait for server to send events over stream expect(events).toEqual([ - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(signerAdd)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(castAdd)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(signerAdd)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(castAdd)], ]); }); }); @@ -130,9 +146,9 @@ describe('subscribe', () => { test('emits events', async () => { stream = await setupSubscription(events, { eventTypes: [ - protobufs.HubEventType.MERGE_MESSAGE, - protobufs.HubEventType.MERGE_NAME_REGISTRY_EVENT, - protobufs.HubEventType.MERGE_ID_REGISTRY_EVENT, + HubEventType.MERGE_MESSAGE, + HubEventType.MERGE_NAME_REGISTRY_EVENT, + HubEventType.MERGE_ID_REGISTRY_EVENT, ], }); @@ -142,10 +158,10 @@ describe('subscribe', () => { await engine.mergeMessage(castAdd); await sleep(100); // Wait for server to send events over stream expect(events).toEqual([ - [protobufs.HubEventType.MERGE_ID_REGISTRY_EVENT, protobufs.IdRegistryEvent.toJSON(custodyEvent)], - [protobufs.HubEventType.MERGE_NAME_REGISTRY_EVENT, protobufs.NameRegistryEvent.toJSON(nameRegistryEvent)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(signerAdd)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(castAdd)], + [HubEventType.MERGE_ID_REGISTRY_EVENT, IdRegistryEvent.toJSON(custodyEvent)], + [HubEventType.MERGE_NAME_REGISTRY_EVENT, NameRegistryEvent.toJSON(nameRegistryEvent)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(signerAdd)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(castAdd)], ]); }); }); @@ -160,10 +176,10 @@ describe('subscribe', () => { await engine.mergeMessage(reactionAdd); await sleep(100); expect(events).toEqual([ - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(signerAdd)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(castAdd)], - [protobufs.HubEventType.MERGE_NAME_REGISTRY_EVENT, protobufs.NameRegistryEvent.toJSON(nameRegistryEvent)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(reactionAdd)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(signerAdd)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(castAdd)], + [HubEventType.MERGE_NAME_REGISTRY_EVENT, NameRegistryEvent.toJSON(nameRegistryEvent)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(reactionAdd)], ]); }); @@ -174,8 +190,8 @@ describe('subscribe', () => { stream = await setupSubscription(events, { fromId: 1 }); expect(events).toEqual([ - [protobufs.HubEventType.MERGE_ID_REGISTRY_EVENT, protobufs.IdRegistryEvent.toJSON(custodyEvent)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(signerAdd)], + [HubEventType.MERGE_ID_REGISTRY_EVENT, IdRegistryEvent.toJSON(custodyEvent)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(signerAdd)], ]); }); }); @@ -186,17 +202,17 @@ describe('subscribe', () => { await engine.mergeIdRegistryEvent(custodyEvent); stream = await setupSubscription(events, { fromId: idResult._unsafeUnwrap(), - eventTypes: [protobufs.HubEventType.MERGE_MESSAGE, protobufs.HubEventType.MERGE_ID_REGISTRY_EVENT], + eventTypes: [HubEventType.MERGE_MESSAGE, HubEventType.MERGE_ID_REGISTRY_EVENT], }); await engine.mergeMessage(signerAdd); await engine.mergeMessage(castAdd); await engine.mergeMessage(reactionAdd); await sleep(100); expect(events).toEqual([ - [protobufs.HubEventType.MERGE_ID_REGISTRY_EVENT, protobufs.IdRegistryEvent.toJSON(custodyEvent)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(signerAdd)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(castAdd)], - [protobufs.HubEventType.MERGE_MESSAGE, protobufs.Message.toJSON(reactionAdd)], + [HubEventType.MERGE_ID_REGISTRY_EVENT, IdRegistryEvent.toJSON(custodyEvent)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(signerAdd)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(castAdd)], + [HubEventType.MERGE_MESSAGE, Message.toJSON(reactionAdd)], ]); }); }); diff --git a/apps/hubble/src/rpc/test/reactionService.test.ts b/apps/hubble/src/rpc/test/reactionService.test.ts index a4b555f446..41a0dae985 100644 --- a/apps/hubble/src/rpc/test/reactionService.test.ts +++ b/apps/hubble/src/rpc/test/reactionService.test.ts @@ -1,5 +1,19 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, getInsecureHubRpcClient, HubError, HubRpcClient } from '@farcaster/utils'; +import { + Message, + FarcasterNetwork, + IdRegistryEvent, + SignerAddMessage, + CastId, + ReactionAddMessage, + ReactionType, + ReactionRequest, + ReactionsByFidRequest, + ReactionsByCastRequest, + Factories, + HubError, + getInsecureHubRpcClient, + HubRpcClient, +} from '@farcaster/hub-nodejs'; import SyncEngine from '~/network/sync/syncEngine'; import Server from '~/rpc/server'; import { jestRocksDB } from '~/storage/db/jestUtils'; @@ -7,7 +21,7 @@ import Engine from '~/storage/engine'; import { MockHub } from '~/test/mocks'; const db = jestRocksDB('protobufs.rpc.reactionService.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); @@ -30,12 +44,12 @@ const fid = Factories.Fid.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; -let castId: protobufs.CastId; -let reactionAddLike: protobufs.ReactionAddMessage; -let reactionAddRecast: protobufs.ReactionAddMessage; +let castId: CastId; +let reactionAddLike: ReactionAddMessage; +let reactionAddRecast: ReactionAddMessage; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -50,7 +64,7 @@ beforeAll(async () => { castId = Factories.CastId.build(); reactionAddLike = await Factories.ReactionAddMessage.create( - { data: { fid, reactionBody: { type: protobufs.ReactionType.LIKE, targetCastId: castId } } }, + { data: { fid, reactionBody: { type: ReactionType.LIKE, targetCastId: castId } } }, { transient: { signer } } ); @@ -58,7 +72,7 @@ beforeAll(async () => { { data: { fid, - reactionBody: { type: protobufs.ReactionType.RECAST, targetCastId: castId }, + reactionBody: { type: ReactionType.RECAST, targetCastId: castId }, timestamp: reactionAddLike.data.timestamp + 1, }, }, @@ -76,32 +90,32 @@ describe('getReaction', () => { await engine.mergeMessage(reactionAddLike); const result = await client.getReaction( - protobufs.ReactionRequest.create({ fid, reactionType: reactionAddLike.data.reactionBody.type, castId }) + ReactionRequest.create({ fid, reactionType: reactionAddLike.data.reactionBody.type, castId }) ); - expect(protobufs.Message.toJSON(result._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(reactionAddLike)); + expect(Message.toJSON(result._unsafeUnwrap())).toEqual(Message.toJSON(reactionAddLike)); }); test('succeeds with recast', async () => { await engine.mergeMessage(reactionAddRecast); const result = await client.getReaction( - protobufs.ReactionRequest.create({ fid, reactionType: reactionAddRecast.data.reactionBody.type, castId }) + ReactionRequest.create({ fid, reactionType: reactionAddRecast.data.reactionBody.type, castId }) ); - expect(protobufs.Message.toJSON(result._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(reactionAddRecast)); + expect(Message.toJSON(result._unsafeUnwrap())).toEqual(Message.toJSON(reactionAddRecast)); }); test('fails if reaction is missing', async () => { const result = await client.getReaction( - protobufs.ReactionRequest.create({ fid, reactionType: reactionAddRecast.data.reactionBody.type, castId }) + ReactionRequest.create({ fid, reactionType: reactionAddRecast.data.reactionBody.type, castId }) ); expect(result._unsafeUnwrapErr().errCode).toEqual('not_found'); }); test('fails with invalid reaction type', async () => { const result = await client.getReaction( - protobufs.ReactionRequest.create({ + ReactionRequest.create({ fid, castId, }) @@ -115,7 +129,7 @@ describe('getReaction', () => { test('fails without cast', async () => { const castId = Factories.CastId.build({ fid: 0, hash: new Uint8Array() }); const result = await client.getReaction( - protobufs.ReactionRequest.create({ fid, castId: castId, reactionType: protobufs.ReactionType.LIKE }) + ReactionRequest.create({ fid, castId: castId, reactionType: ReactionType.LIKE }) ); expect(result._unsafeUnwrapErr()).toEqual( new HubError('bad_request.validation_failure', 'fid is missing, hash is missing') @@ -124,9 +138,7 @@ describe('getReaction', () => { test('fails without fid', async () => { const castId = Factories.CastId.build(); - const result = await client.getReaction( - protobufs.ReactionRequest.create({ castId, reactionType: protobufs.ReactionType.LIKE }) - ); + const result = await client.getReaction(ReactionRequest.create({ castId, reactionType: ReactionType.LIKE })); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'fid is missing')); }); @@ -143,34 +155,34 @@ describe('getReaction', () => { }); test('succeeds without type', async () => { - const reactions = await client.getReactionsByFid(protobufs.ReactionsByFidRequest.create({ fid })); - expect(reactions._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - [reactionAddLike, reactionAddRecast].map((m) => protobufs.Message.toJSON(m)) + const reactions = await client.getReactionsByFid(ReactionsByFidRequest.create({ fid })); + expect(reactions._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual( + [reactionAddLike, reactionAddRecast].map((m) => Message.toJSON(m)) ); }); test('succeeds with type Like', async () => { const reactions = await client.getReactionsByFid( - protobufs.ReactionsByFidRequest.create({ fid, reactionType: protobufs.ReactionType.LIKE }) + ReactionsByFidRequest.create({ fid, reactionType: ReactionType.LIKE }) ); - expect(reactions._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - [reactionAddLike].map((m) => protobufs.Message.toJSON(m)) + expect(reactions._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual( + [reactionAddLike].map((m) => Message.toJSON(m)) ); }); test('succeeds with type Recast', async () => { const reactions = await client.getReactionsByFid( - protobufs.ReactionsByFidRequest.create({ fid, reactionType: protobufs.ReactionType.RECAST }) + ReactionsByFidRequest.create({ fid, reactionType: ReactionType.RECAST }) ); - expect(reactions._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - [reactionAddRecast].map((m) => protobufs.Message.toJSON(m)) + expect(reactions._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual( + [reactionAddRecast].map((m) => Message.toJSON(m)) ); }); }); test('returns empty array without messages', async () => { - const reactions = await client.getReactionsByFid(protobufs.ReactionsByFidRequest.create({ fid })); + const reactions = await client.getReactionsByFid(ReactionsByFidRequest.create({ fid })); expect(reactions._unsafeUnwrap().messages).toEqual([]); }); }); @@ -188,33 +200,33 @@ describe('getReaction', () => { }); test('succeeds without type', async () => { - const reactions = await client.getReactionsByCast(protobufs.ReactionsByCastRequest.create({ castId })); - expect(reactions._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - [reactionAddLike, reactionAddRecast].map((m) => protobufs.Message.toJSON(m)) + const reactions = await client.getReactionsByCast(ReactionsByCastRequest.create({ castId })); + expect(reactions._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual( + [reactionAddLike, reactionAddRecast].map((m) => Message.toJSON(m)) ); }); test('succeeds with type Like', async () => { const reactions = await client.getReactionsByCast( - protobufs.ReactionsByCastRequest.create({ castId, reactionType: protobufs.ReactionType.LIKE }) + ReactionsByCastRequest.create({ castId, reactionType: ReactionType.LIKE }) ); - expect(reactions._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - [reactionAddLike].map((m) => protobufs.Message.toJSON(m)) + expect(reactions._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual( + [reactionAddLike].map((m) => Message.toJSON(m)) ); }); test('succeeds with type Recast', async () => { const reactions = await client.getReactionsByCast( - protobufs.ReactionsByCastRequest.create({ castId, reactionType: protobufs.ReactionType.RECAST }) + ReactionsByCastRequest.create({ castId, reactionType: ReactionType.RECAST }) ); - expect(reactions._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - [reactionAddRecast].map((m) => protobufs.Message.toJSON(m)) + expect(reactions._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual( + [reactionAddRecast].map((m) => Message.toJSON(m)) ); }); }); test('returns empty array without messages', async () => { - const reactions = await client.getReactionsByCast(protobufs.ReactionsByCastRequest.create({ castId })); + const reactions = await client.getReactionsByCast(ReactionsByCastRequest.create({ castId })); expect(reactions._unsafeUnwrap().messages).toEqual([]); }); }); diff --git a/apps/hubble/src/rpc/test/rpcAuth.test.ts b/apps/hubble/src/rpc/test/rpcAuth.test.ts index 7fd6240af6..de0d239c75 100644 --- a/apps/hubble/src/rpc/test/rpcAuth.test.ts +++ b/apps/hubble/src/rpc/test/rpcAuth.test.ts @@ -1,6 +1,14 @@ -import * as protobufs from '@farcaster/protobufs'; import { RateLimiterMemory } from 'rate-limiter-flexible'; -import { Factories, getInsecureHubRpcClient, HubError } from '@farcaster/utils'; +import { + Factories, + HubError, + getInsecureHubRpcClient, + Metadata, + FarcasterNetwork, + IdRegistryEvent, + SignerAddMessage, + Empty, +} from '@farcaster/hub-nodejs'; import SyncEngine from '~/network/sync/syncEngine'; import Server, { rateLimitByIp } from '~/rpc/server'; @@ -10,7 +18,7 @@ import { MockHub } from '~/test/mocks'; import { sleep } from '~/utils/crypto'; const db = jestRocksDB('protobufs.rpcAuth.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); @@ -18,8 +26,8 @@ const fid = Factories.Fid.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -51,7 +59,7 @@ describe('auth tests', () => { ); // Wrong password - const metadata = new protobufs.Metadata(); + const metadata = new Metadata(); metadata.set('authorization', `Basic ${Buffer.from(`admin:wrongpassword`).toString('base64')}`); const result2 = await authClient.submitMessage(signerAdd, metadata); expect(result2._unsafeUnwrapErr()).toEqual( @@ -59,7 +67,7 @@ describe('auth tests', () => { ); // Wrong username - const metadata2 = new protobufs.Metadata(); + const metadata2 = new Metadata(); metadata2.set('authorization', `Basic ${Buffer.from(`wronguser:password`).toString('base64')}`); const result3 = await authClient.submitMessage(signerAdd, metadata2); expect(result3._unsafeUnwrapErr()).toEqual( @@ -67,13 +75,13 @@ describe('auth tests', () => { ); // Right password - const metadata3 = new protobufs.Metadata(); + const metadata3 = new Metadata(); metadata3.set('authorization', `Basic ${Buffer.from(`admin:password`).toString('base64')}`); const result4 = await authClient.submitMessage(signerAdd, metadata3); expect(result4.isOk()).toBeTruthy(); // Non submit methods work without auth - const result5 = await authClient.getInfo(protobufs.Empty.create()); + const result5 = await authClient.getInfo(Empty.create()); expect(result5.isOk()).toBeTruthy(); await authServer.stop(); @@ -94,7 +102,7 @@ describe('auth tests', () => { ); // Works with auth - const metadata = new protobufs.Metadata(); + const metadata = new Metadata(); metadata.set('authorization', `Basic ${Buffer.from(`admin:password`).toString('base64')}`); const result2 = await authClient.submitMessage(signerAdd, metadata); diff --git a/apps/hubble/src/rpc/test/signerService.test.ts b/apps/hubble/src/rpc/test/signerService.test.ts index 0844bd1ef8..b79670441a 100644 --- a/apps/hubble/src/rpc/test/signerService.test.ts +++ b/apps/hubble/src/rpc/test/signerService.test.ts @@ -1,5 +1,18 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, getInsecureHubRpcClient, HubError, HubResult, HubRpcClient } from '@farcaster/utils'; +import { + Factories, + HubError, + HubResult, + getInsecureHubRpcClient, + HubRpcClient, + FarcasterNetwork, + MessagesResponse, + Message, + IdRegistryEvent, + SignerAddMessage, + SignerRequest, + FidRequest, + FidsRequest, +} from '@farcaster/hub-nodejs'; import { ok } from 'neverthrow'; import SyncEngine from '~/network/sync/syncEngine'; import Server from '~/rpc/server'; @@ -8,7 +21,7 @@ import Engine from '~/storage/engine'; import { MockHub } from '~/test/mocks'; const db = jestRocksDB('protobufs.rpc.signerService.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); @@ -27,10 +40,8 @@ afterAll(async () => { await engine.stop(); }); -const assertMessagesMatchResult = (result: HubResult, messages: protobufs.Message[]) => { - expect(result._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - messages.map((m) => protobufs.Message.toJSON(m)) - ); +const assertMessagesMatchResult = (result: HubResult, messages: Message[]) => { + expect(result._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual(messages.map((m) => Message.toJSON(m))); }; const fid = Factories.Fid.build(); @@ -38,9 +49,9 @@ const fid2 = fid + 1; const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); const custodySigner2 = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let custodyEvent2: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; +let custodyEvent: IdRegistryEvent; +let custodyEvent2: IdRegistryEvent; +let signerAdd: SignerAddMessage; let signerKey: Uint8Array; beforeAll(async () => { @@ -63,22 +74,22 @@ describe('getSigner', () => { test('succeeds', async () => { await engine.mergeMessage(signerAdd); - const result = await client.getSigner(protobufs.SignerRequest.create({ fid, signer: signerKey })); - expect(protobufs.Message.toJSON(result._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(signerAdd)); + const result = await client.getSigner(SignerRequest.create({ fid, signer: signerKey })); + expect(Message.toJSON(result._unsafeUnwrap())).toEqual(Message.toJSON(signerAdd)); }); test('fails if signer is missing', async () => { - const result = await client.getSigner(protobufs.SignerRequest.create({ fid, signer: signerKey })); + const result = await client.getSigner(SignerRequest.create({ fid, signer: signerKey })); expect(result._unsafeUnwrapErr().errCode).toEqual('not_found'); }); test('fails without signer key', async () => { - const result = await client.getSigner(protobufs.SignerRequest.create({ fid, signer: new Uint8Array() })); + const result = await client.getSigner(SignerRequest.create({ fid, signer: new Uint8Array() })); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'publicKey is missing')); }); test('fails without fid', async () => { - const result = await client.getSigner(protobufs.SignerRequest.create({ fid: 0, signer: signerKey })); + const result = await client.getSigner(SignerRequest.create({ fid: 0, signer: signerKey })); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'fid is missing')); }); }); @@ -86,7 +97,7 @@ describe('getSigner', () => { describe('getSignersByFid', () => { const signer2 = Factories.Ed25519Signer.build(); let signer2Key: Uint8Array; - let signerAdd2: protobufs.Message; + let signerAdd2: Message; beforeAll(async () => { signer2Key = (await signer2.getSignerKey())._unsafeUnwrap(); @@ -110,42 +121,42 @@ describe('getSignersByFid', () => { test('succeeds', async () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(signerAdd2); - const result = await client.getSignersByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getSignersByFid(FidRequest.create({ fid })); assertMessagesMatchResult(result, [signerAdd, signerAdd2]); }); test('returns pageSize messages', async () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(signerAdd2); - const result = await client.getSignersByFid(protobufs.FidRequest.create({ fid, pageSize: 1 })); + const result = await client.getSignersByFid(FidRequest.create({ fid, pageSize: 1 })); assertMessagesMatchResult(result, [signerAdd]); }); test('returns all messages when pageSize > messages count', async () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(signerAdd2); - const result = await client.getSignersByFid(protobufs.FidRequest.create({ fid, pageSize: 3 })); + const result = await client.getSignersByFid(FidRequest.create({ fid, pageSize: 3 })); assertMessagesMatchResult(result, [signerAdd, signerAdd2]); }); test('returns results after pageToken', async () => { await engine.mergeMessage(signerAdd); await engine.mergeMessage(signerAdd2); - const page1Result = await client.getSignersByFid(protobufs.FidRequest.create({ fid, pageSize: 1 })); + const page1Result = await client.getSignersByFid(FidRequest.create({ fid, pageSize: 1 })); const page2Result = await client.getSignersByFid( - protobufs.FidRequest.create({ fid, pageToken: page1Result._unsafeUnwrap().nextPageToken }) + FidRequest.create({ fid, pageToken: page1Result._unsafeUnwrap().nextPageToken }) ); assertMessagesMatchResult(page2Result, [signerAdd2]); }); test('returns empty array with invalid page token', async () => { await engine.mergeMessage(signerAdd); - const result = await client.getSignersByFid(protobufs.FidRequest.create({ fid, pageToken: new Uint8Array([255]) })); + const result = await client.getSignersByFid(FidRequest.create({ fid, pageToken: new Uint8Array([255]) })); expect(result._unsafeUnwrap().messages).toEqual([]); }); test('returns empty array without messages', async () => { - const result = await client.getSignersByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getSignersByFid(FidRequest.create({ fid })); expect(result._unsafeUnwrap().messages).toEqual([]); }); }); @@ -153,14 +164,12 @@ describe('getSignersByFid', () => { describe('getIdRegistryEvent', () => { test('succeeds', async () => { await engine.mergeIdRegistryEvent(custodyEvent); - const result = await client.getIdRegistryEvent(protobufs.FidRequest.create({ fid })); - expect(protobufs.IdRegistryEvent.toJSON(result._unsafeUnwrap())).toEqual( - protobufs.IdRegistryEvent.toJSON(custodyEvent) - ); + const result = await client.getIdRegistryEvent(FidRequest.create({ fid })); + expect(IdRegistryEvent.toJSON(result._unsafeUnwrap())).toEqual(IdRegistryEvent.toJSON(custodyEvent)); }); test('fails when event is missing', async () => { - const result = await client.getIdRegistryEvent(protobufs.FidRequest.create({ fid })); + const result = await client.getIdRegistryEvent(FidRequest.create({ fid })); expect(result._unsafeUnwrapErr().errCode).toEqual('not_found'); }); }); @@ -169,36 +178,36 @@ describe('getFids', () => { test('succeeds', async () => { await engine.mergeIdRegistryEvent(custodyEvent); await engine.mergeIdRegistryEvent(custodyEvent2); - const result = await client.getFids(protobufs.FidsRequest.create()); + const result = await client.getFids(FidsRequest.create()); expect(result).toEqual(ok({ fids: [custodyEvent.fid, custodyEvent2.fid], nextPageToken: undefined })); }); test('returns pageSize results', async () => { await engine.mergeIdRegistryEvent(custodyEvent); await engine.mergeIdRegistryEvent(custodyEvent2); - const result = await client.getFids(protobufs.FidsRequest.create({ pageSize: 1 })); + const result = await client.getFids(FidsRequest.create({ pageSize: 1 })); expect(result._unsafeUnwrap().fids).toEqual([custodyEvent.fid]); }); test('returns all fids when pageSize > events', async () => { await engine.mergeIdRegistryEvent(custodyEvent); await engine.mergeIdRegistryEvent(custodyEvent2); - const result = await client.getFids(protobufs.FidsRequest.create({ pageSize: 3 })); + const result = await client.getFids(FidsRequest.create({ pageSize: 3 })); expect(result._unsafeUnwrap().fids).toEqual([custodyEvent.fid, custodyEvent2.fid]); }); test('returns results after pageToken', async () => { await engine.mergeIdRegistryEvent(custodyEvent); await engine.mergeIdRegistryEvent(custodyEvent2); - const page1Result = await client.getFids(protobufs.FidsRequest.create({ pageSize: 1 })); + const page1Result = await client.getFids(FidsRequest.create({ pageSize: 1 })); const page2Result = await client.getFids( - protobufs.FidsRequest.create({ pageSize: 1, pageToken: page1Result._unsafeUnwrap().nextPageToken }) + FidsRequest.create({ pageSize: 1, pageToken: page1Result._unsafeUnwrap().nextPageToken }) ); expect(page2Result._unsafeUnwrap().fids).toEqual([custodyEvent2.fid]); }); test('returns empty array without events', async () => { - const result = await client.getFids(protobufs.FidsRequest.create()); + const result = await client.getFids(FidsRequest.create()); expect(result._unsafeUnwrap().fids).toEqual([]); }); }); diff --git a/apps/hubble/src/rpc/test/submitService.test.ts b/apps/hubble/src/rpc/test/submitService.test.ts index fe22f37b63..84f751cd37 100644 --- a/apps/hubble/src/rpc/test/submitService.test.ts +++ b/apps/hubble/src/rpc/test/submitService.test.ts @@ -1,5 +1,14 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, getInsecureHubRpcClient, HubError, HubRpcClient } from '@farcaster/utils'; +import { + Factories, + HubError, + getInsecureHubRpcClient, + HubRpcClient, + FarcasterNetwork, + IdRegistryEvent, + SignerAddMessage, + Message, + CastId, +} from '@farcaster/hub-nodejs'; import { err } from 'neverthrow'; import SyncEngine from '~/network/sync/syncEngine'; @@ -9,7 +18,7 @@ import Engine from '~/storage/engine'; import { MockHub } from '~/test/mocks'; const db = jestRocksDB('protobufs.rpc.submitService.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); @@ -32,10 +41,10 @@ const fid = Factories.Fid.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; -let castAdd: protobufs.Message; -let castRemove: protobufs.Message; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; +let castAdd: Message; +let castRemove: Message; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -64,11 +73,9 @@ describe('submitMessage', () => { test('succeeds', async () => { const result = await client.submitMessage(castAdd); - expect(protobufs.Message.toJSON(result._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(castAdd)); - const getCast = await client.getCast( - protobufs.CastId.create({ fid: castAdd.data?.fid ?? 0, hash: castAdd.hash }) - ); - expect(protobufs.Message.toJSON(getCast._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(castAdd)); + expect(Message.toJSON(result._unsafeUnwrap())).toEqual(Message.toJSON(castAdd)); + const getCast = await client.getCast(CastId.create({ fid: castAdd.data?.fid ?? 0, hash: castAdd.hash })); + expect(Message.toJSON(getCast._unsafeUnwrap())).toEqual(Message.toJSON(castAdd)); }); test('fails with conflict', async () => { diff --git a/apps/hubble/src/rpc/test/userDataService.test.ts b/apps/hubble/src/rpc/test/userDataService.test.ts index c80cc933b9..c852dad639 100644 --- a/apps/hubble/src/rpc/test/userDataService.test.ts +++ b/apps/hubble/src/rpc/test/userDataService.test.ts @@ -1,5 +1,18 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesToUtf8String, Factories, getInsecureHubRpcClient, HubError, HubRpcClient } from '@farcaster/utils'; +import { + Message, + FarcasterNetwork, + IdRegistryEvent, + SignerAddMessage, + UserDataAddMessage, + UserDataType, + UserDataRequest, + FidRequest, + bytesToUtf8String, + Factories, + HubError, + getInsecureHubRpcClient, + HubRpcClient, +} from '@farcaster/hub-nodejs'; import { Ok } from 'neverthrow'; import SyncEngine from '~/network/sync/syncEngine'; import Server from '~/rpc/server'; @@ -8,7 +21,7 @@ import Engine from '~/storage/engine'; import { MockHub } from '~/test/mocks'; const db = jestRocksDB('protobufs.rpc.userdataservice.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); @@ -33,12 +46,12 @@ const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); let custodySignerKey: Uint8Array; -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; -let pfpAdd: protobufs.UserDataAddMessage; -let displayAdd: protobufs.UserDataAddMessage; -let addFname: protobufs.UserDataAddMessage; +let pfpAdd: UserDataAddMessage; +let displayAdd: UserDataAddMessage; +let addFname: UserDataAddMessage; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -51,12 +64,12 @@ beforeAll(async () => { ); pfpAdd = await Factories.UserDataAddMessage.create( - { data: { fid, userDataBody: { type: protobufs.UserDataType.PFP } } }, + { data: { fid, userDataBody: { type: UserDataType.PFP } } }, { transient: { signer } } ); displayAdd = await Factories.UserDataAddMessage.create( - { data: { fid, userDataBody: { type: protobufs.UserDataType.DISPLAY }, timestamp: pfpAdd.data.timestamp + 1 } }, + { data: { fid, userDataBody: { type: UserDataType.DISPLAY }, timestamp: pfpAdd.data.timestamp + 1 } }, { transient: { signer } } ); @@ -65,7 +78,7 @@ beforeAll(async () => { data: { fid, userDataBody: { - type: protobufs.UserDataType.FNAME, + type: UserDataType.FNAME, value: bytesToUtf8String(fname)._unsafeUnwrap(), }, timestamp: pfpAdd.data.timestamp + 2, @@ -85,41 +98,29 @@ describe('getUserData', () => { expect(await engine.mergeMessage(pfpAdd)).toBeInstanceOf(Ok); expect(await engine.mergeMessage(displayAdd)).toBeInstanceOf(Ok); - const pfp = await client.getUserData( - protobufs.UserDataRequest.create({ fid, userDataType: protobufs.UserDataType.PFP }) - ); - expect(protobufs.Message.toJSON(pfp._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(pfpAdd)); + const pfp = await client.getUserData(UserDataRequest.create({ fid, userDataType: UserDataType.PFP })); + expect(Message.toJSON(pfp._unsafeUnwrap())).toEqual(Message.toJSON(pfpAdd)); - const display = await client.getUserData( - protobufs.UserDataRequest.create({ fid, userDataType: protobufs.UserDataType.DISPLAY }) - ); - expect(protobufs.Message.toJSON(display._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(displayAdd)); + const display = await client.getUserData(UserDataRequest.create({ fid, userDataType: UserDataType.DISPLAY })); + expect(Message.toJSON(display._unsafeUnwrap())).toEqual(Message.toJSON(displayAdd)); const nameRegistryEvent = Factories.NameRegistryEvent.build({ fname, to: custodySignerKey }); await engine.mergeNameRegistryEvent(nameRegistryEvent); expect(await engine.mergeMessage(addFname)).toBeInstanceOf(Ok); - const fnameData = await client.getUserData( - protobufs.UserDataRequest.create({ fid, userDataType: protobufs.UserDataType.FNAME }) - ); - expect(protobufs.Message.toJSON(fnameData._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(addFname)); + const fnameData = await client.getUserData(UserDataRequest.create({ fid, userDataType: UserDataType.FNAME })); + expect(Message.toJSON(fnameData._unsafeUnwrap())).toEqual(Message.toJSON(addFname)); }); test('fails when user data is missing', async () => { - const pfp = await client.getUserData( - protobufs.UserDataRequest.create({ fid, userDataType: protobufs.UserDataType.PFP }) - ); + const pfp = await client.getUserData(UserDataRequest.create({ fid, userDataType: UserDataType.PFP })); expect(pfp._unsafeUnwrapErr().errCode).toEqual('not_found'); - const fname = await client.getUserData( - protobufs.UserDataRequest.create({ fid, userDataType: protobufs.UserDataType.FNAME }) - ); + const fname = await client.getUserData(UserDataRequest.create({ fid, userDataType: UserDataType.FNAME })); expect(fname._unsafeUnwrapErr().errCode).toEqual('not_found'); }); test('fails without fid', async () => { - const result = await client.getUserData( - protobufs.UserDataRequest.create({ fid: 0, userDataType: protobufs.UserDataType.PFP }) - ); + const result = await client.getUserData(UserDataRequest.create({ fid: 0, userDataType: UserDataType.PFP })); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'fid is missing')); }); }); @@ -133,14 +134,14 @@ describe('getUserDataByFid', () => { test('succeeds', async () => { await engine.mergeMessage(pfpAdd); await engine.mergeMessage(displayAdd); - const result = await client.getUserDataByFid(protobufs.FidRequest.create({ fid })); - expect(result._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - [pfpAdd, displayAdd].map((m) => protobufs.Message.toJSON(m)) + const result = await client.getUserDataByFid(FidRequest.create({ fid })); + expect(result._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual( + [pfpAdd, displayAdd].map((m) => Message.toJSON(m)) ); }); test('returns empty array without messages', async () => { - const result = await client.getUserDataByFid(protobufs.FidRequest.create({ fid })); + const result = await client.getUserDataByFid(FidRequest.create({ fid })); expect(result._unsafeUnwrap().messages.length).toEqual(0); }); }); diff --git a/apps/hubble/src/rpc/test/verificationService.test.ts b/apps/hubble/src/rpc/test/verificationService.test.ts index 83b9f12aaa..275028b0a2 100644 --- a/apps/hubble/src/rpc/test/verificationService.test.ts +++ b/apps/hubble/src/rpc/test/verificationService.test.ts @@ -1,5 +1,16 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, getInsecureHubRpcClient, HubError, HubRpcClient } from '@farcaster/utils'; +import { + Factories, + HubError, + getInsecureHubRpcClient, + HubRpcClient, + Message, + FarcasterNetwork, + IdRegistryEvent, + SignerAddMessage, + VerificationAddEthAddressMessage, + VerificationRequest, + FidRequest, +} from '@farcaster/hub-nodejs'; import SyncEngine from '~/network/sync/syncEngine'; import Server from '~/rpc/server'; import { jestRocksDB } from '~/storage/db/jestUtils'; @@ -7,7 +18,7 @@ import Engine from '~/storage/engine'; import { MockHub } from '~/test/mocks'; const db = jestRocksDB('protobufs.rpc.verificationService.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); const hub = new MockHub(db, engine); @@ -30,10 +41,10 @@ const fid = Factories.Fid.build(); const signer = Factories.Ed25519Signer.build(); const custodySigner = Factories.Eip712Signer.build(); -let custodyEvent: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; +let custodyEvent: IdRegistryEvent; +let signerAdd: SignerAddMessage; -let verificationAdd: protobufs.VerificationAddEthAddressMessage; +let verificationAdd: VerificationAddEthAddressMessage; beforeAll(async () => { const signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -62,17 +73,17 @@ describe('getVerification', () => { expect(r.isOk()).toBeTruthy(); const result = await client.getVerification( - protobufs.VerificationRequest.create({ + VerificationRequest.create({ fid, address: verificationAdd.data.verificationAddEthAddressBody.address ?? new Uint8Array(), }) ); - expect(protobufs.Message.toJSON(result._unsafeUnwrap())).toEqual(protobufs.Message.toJSON(verificationAdd)); + expect(Message.toJSON(result._unsafeUnwrap())).toEqual(Message.toJSON(verificationAdd)); }); test('fails if verification is missing', async () => { const result = await client.getVerification( - protobufs.VerificationRequest.create({ + VerificationRequest.create({ fid, address: verificationAdd.data.verificationAddEthAddressBody.address ?? new Uint8Array(), }) @@ -82,7 +93,7 @@ describe('getVerification', () => { test('fails without address', async () => { const result = await client.getVerification( - protobufs.VerificationRequest.create({ + VerificationRequest.create({ fid, address: new Uint8Array(), }) @@ -92,7 +103,7 @@ describe('getVerification', () => { test('fails without fid', async () => { const result = await client.getVerification( - protobufs.VerificationRequest.create({ + VerificationRequest.create({ address: verificationAdd.data.verificationAddEthAddressBody.address ?? new Uint8Array(), }) ); @@ -110,14 +121,14 @@ describe('getVerificationsByFid', () => { const result = await engine.mergeMessage(verificationAdd); expect(result.isOk()).toBeTruthy(); - const verifications = await client.getVerificationsByFid(protobufs.FidRequest.create({ fid })); - expect(verifications._unsafeUnwrap().messages.map((m) => protobufs.Message.toJSON(m))).toEqual( - [verificationAdd].map((m) => protobufs.Message.toJSON(m)) + const verifications = await client.getVerificationsByFid(FidRequest.create({ fid })); + expect(verifications._unsafeUnwrap().messages.map((m) => Message.toJSON(m))).toEqual( + [verificationAdd].map((m) => Message.toJSON(m)) ); }); test('returns empty array without messages', async () => { - const verifications = await client.getVerificationsByFid(protobufs.FidRequest.create({ fid })); + const verifications = await client.getVerificationsByFid(FidRequest.create({ fid })); expect(verifications._unsafeUnwrap().messages).toEqual([]); }); }); diff --git a/apps/hubble/src/storage/db/hubState.ts b/apps/hubble/src/storage/db/hubState.ts index bbd5291bbd..352ed57b68 100644 --- a/apps/hubble/src/storage/db/hubState.ts +++ b/apps/hubble/src/storage/db/hubState.ts @@ -1,4 +1,4 @@ -import { HubState } from '@farcaster/protobufs'; +import { HubState } from '@farcaster/hub-nodejs'; import RocksDB, { Transaction } from '~/storage/db/rocksdb'; import { RootPrefix } from '~/storage/db/types'; diff --git a/apps/hubble/src/storage/db/idRegistryEvent.test.ts b/apps/hubble/src/storage/db/idRegistryEvent.test.ts index 89ae35501b..8fc18fd7b3 100644 --- a/apps/hubble/src/storage/db/idRegistryEvent.test.ts +++ b/apps/hubble/src/storage/db/idRegistryEvent.test.ts @@ -1,5 +1,4 @@ -import { bytesCompare, Factories, HubError } from '@farcaster/utils'; -import { IdRegistryEvent } from '~/../../../packages/protobufs/dist'; +import { IdRegistryEvent, bytesCompare, Factories, HubError } from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import { getIdRegistryEvent, diff --git a/apps/hubble/src/storage/db/idRegistryEvent.ts b/apps/hubble/src/storage/db/idRegistryEvent.ts index 54da14cced..429060a21e 100644 --- a/apps/hubble/src/storage/db/idRegistryEvent.ts +++ b/apps/hubble/src/storage/db/idRegistryEvent.ts @@ -1,4 +1,4 @@ -import { IdRegistryEvent } from '@farcaster/protobufs'; +import { IdRegistryEvent } from '@farcaster/hub-nodejs'; import RocksDB, { Transaction } from '~/storage/db/rocksdb'; import { FID_BYTES, RootPrefix } from '~/storage/db/types'; diff --git a/apps/hubble/src/storage/db/message.test.ts b/apps/hubble/src/storage/db/message.test.ts index af9555cccb..610d79984c 100644 --- a/apps/hubble/src/storage/db/message.test.ts +++ b/apps/hubble/src/storage/db/message.test.ts @@ -1,5 +1,4 @@ -import { MessageType } from '@farcaster/protobufs'; -import { bytesCompare, Factories, HubError } from '@farcaster/utils'; +import { MessageType, bytesCompare, Factories, HubError } from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import { TRUE_VALUE, UserPostfix } from '~/storage/db/types'; import { diff --git a/apps/hubble/src/storage/db/message.ts b/apps/hubble/src/storage/db/message.ts index 97410c13d5..87dc1c3e9f 100644 --- a/apps/hubble/src/storage/db/message.ts +++ b/apps/hubble/src/storage/db/message.ts @@ -1,5 +1,4 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesIncrement, HubError, HubResult } from '@farcaster/utils'; +import { bytesIncrement, CastId, HubError, HubResult, Message, MessageType } from '@farcaster/hub-nodejs'; import { err, ok, ResultAsync } from 'neverthrow'; import RocksDB, { Iterator, Transaction } from '~/storage/db/rocksdb'; import { @@ -28,7 +27,7 @@ export const makeUserKey = (fid: number): Buffer => { /** * Generates a key for referencing a CastId. Packed as . */ -export const makeCastIdKey = (castId: protobufs.CastId): Buffer => { +export const makeCastIdKey = (castId: CastId): Buffer => { return Buffer.concat([makeFidKey(castId.fid), Buffer.from(castId.hash)]); }; @@ -37,7 +36,7 @@ export const makeMessagePrimaryKey = (fid: number, set: UserMessagePostfix, tsHa return Buffer.concat([makeUserKey(fid), Buffer.from([set]), Buffer.from(tsHash ?? '')]); }; -export const makeMessagePrimaryKeyFromMessage = (message: protobufs.Message): Buffer => { +export const makeMessagePrimaryKeyFromMessage = (message: Message): Buffer => { if (!message.data) { throw new HubError('bad_request.invalid_param', 'message data is missing'); } @@ -52,7 +51,7 @@ export const makeMessagePrimaryKeyFromMessage = (message: protobufs.Message): Bu export const makeMessageBySignerKey = ( fid: number, signer: Uint8Array, - type?: protobufs.MessageType, + type?: MessageType, tsHash?: Uint8Array ): Buffer => { return Buffer.concat([ @@ -78,62 +77,56 @@ export const makeTsHash = (timestamp: number, hash: Uint8Array): HubResult { - if (type === protobufs.MessageType.CAST_ADD || type === protobufs.MessageType.CAST_REMOVE) { +export const typeToSetPostfix = (type: MessageType): UserMessagePostfix => { + if (type === MessageType.CAST_ADD || type === MessageType.CAST_REMOVE) { return UserPostfix.CastMessage; } - if (type === protobufs.MessageType.REACTION_ADD || type === protobufs.MessageType.REACTION_REMOVE) { + if (type === MessageType.REACTION_ADD || type === MessageType.REACTION_REMOVE) { return UserPostfix.ReactionMessage; } - if ( - type === protobufs.MessageType.VERIFICATION_ADD_ETH_ADDRESS || - type === protobufs.MessageType.VERIFICATION_REMOVE - ) { + if (type === MessageType.VERIFICATION_ADD_ETH_ADDRESS || type === MessageType.VERIFICATION_REMOVE) { return UserPostfix.VerificationMessage; } - if (type === protobufs.MessageType.SIGNER_ADD || type === protobufs.MessageType.SIGNER_REMOVE) { + if (type === MessageType.SIGNER_ADD || type === MessageType.SIGNER_REMOVE) { return UserPostfix.SignerMessage; } - if (type === protobufs.MessageType.USER_DATA_ADD) { + if (type === MessageType.USER_DATA_ADD) { return UserPostfix.UserDataMessage; } throw new Error('invalid type'); }; -export const putMessage = (db: RocksDB, message: protobufs.Message): Promise => { +export const putMessage = (db: RocksDB, message: Message): Promise => { const txn = putMessageTransaction(db.transaction(), message); return db.commit(txn); }; -export const getMessage = async ( +export const getMessage = async ( db: RocksDB, fid: number, set: UserMessagePostfix, tsHash: Uint8Array ): Promise => { const buffer = await db.get(makeMessagePrimaryKey(fid, set, tsHash)); - return protobufs.Message.decode(new Uint8Array(buffer)) as T; + return Message.decode(new Uint8Array(buffer)) as T; }; -export const deleteMessage = (db: RocksDB, message: protobufs.Message): Promise => { +export const deleteMessage = (db: RocksDB, message: Message): Promise => { const txn = deleteMessageTransaction(db.transaction(), message); return db.commit(txn); }; -export const getManyMessages = async ( - db: RocksDB, - primaryKeys: Buffer[] -): Promise => { +export const getManyMessages = async (db: RocksDB, primaryKeys: Buffer[]): Promise => { const buffers = await db.getMany(primaryKeys); - return buffers.map((buffer) => protobufs.Message.decode(new Uint8Array(buffer)) as T); + return buffers.map((buffer) => Message.decode(new Uint8Array(buffer)) as T); }; -export const getManyMessagesByFid = async ( +export const getManyMessagesByFid = async ( db: RocksDB, fid: number, set: UserMessagePostfix, @@ -145,7 +138,7 @@ export const getManyMessagesByFid = async ( ); }; -export const getAllMessagesByFid = async (db: RocksDB, fid: number): Promise => { +export const getAllMessagesByFid = async (db: RocksDB, fid: number): Promise => { const userPrefix = makeUserKey(fid); const maxPrefix = Buffer.concat([userPrefix, Buffer.from([UserMessagePostfixMax + 1])]); const iteratorOptions = { @@ -156,7 +149,7 @@ export const getAllMessagesByFid = async (db: RocksDB, fid: number): Promise( +export const getMessagesPageByPrefix = async ( db: RocksDB, prefix: Buffer, - filter: (message: protobufs.Message) => message is T, + filter: (message: Message) => message is T, pageOptions: PageOptions = {} ): Promise> => { const iterator = getPageIteratorByPrefix(db, prefix, pageOptions); @@ -202,9 +195,9 @@ export const getMessagesPageByPrefix = async ( const messages: T[] = []; - const getNextIteratorRecord = async (iterator: Iterator): Promise<[Buffer, protobufs.Message]> => { + const getNextIteratorRecord = async (iterator: Iterator): Promise<[Buffer, Message]> => { const [key, value] = await iterator.next(); - return [key as Buffer, protobufs.Message.decode(new Uint8Array(value as Buffer))]; + return [key as Buffer, Message.decode(new Uint8Array(value as Buffer))]; }; let iteratorFinished = false; @@ -235,18 +228,18 @@ export const getMessagesBySignerIterator = ( db: RocksDB, fid: number, signer: Uint8Array, - type?: protobufs.MessageType + type?: MessageType ): Iterator => { const prefix = makeMessageBySignerKey(fid, signer, type); return db.iteratorByPrefix(prefix, { values: false }); }; /** Get an array of messages for a given fid and signer */ -export const getAllMessagesBySigner = async ( +export const getAllMessagesBySigner = async ( db: RocksDB, fid: number, signer: Uint8Array, - type?: protobufs.MessageType + type?: MessageType ): Promise => { // Generate prefix by excluding tsHash from the bySignerKey // Format of bySignerKey: @@ -264,8 +257,7 @@ export const getAllMessagesBySigner = async ( // Get the type for the message, either from the predefined type variable or by looking at the byte // prior to the tsHash in the key - const messageType = - type ?? (new Uint8Array(key as Buffer).slice(tsHashOffset - 1, tsHashOffset)[0] as protobufs.MessageType); + const messageType = type ?? (new Uint8Array(key as Buffer).slice(tsHashOffset - 1, tsHashOffset)[0] as MessageType); // Convert the message type to a set postfix const setPostfix = typeToSetPostfix(messageType); @@ -283,12 +275,12 @@ export const getMessagesPruneIterator = (db: RocksDB, fid: number, setPostfix: U return db.iteratorByPrefix(prefix, { keys: false, valueAsBuffer: true }); }; -export const getNextMessageFromIterator = async (iterator: Iterator): Promise => { +export const getNextMessageFromIterator = async (iterator: Iterator): Promise => { const [, value] = await iterator.next(); - return protobufs.Message.decode(new Uint8Array(value as Buffer)); + return Message.decode(new Uint8Array(value as Buffer)); }; -export const putMessageTransaction = (txn: Transaction, message: protobufs.Message): Transaction => { +export const putMessageTransaction = (txn: Transaction, message: Message): Transaction => { if (!message.data) { throw new HubError('bad_request.invalid_param', 'message data is missing'); } @@ -297,12 +289,12 @@ export const putMessageTransaction = (txn: Transaction, message: protobufs.Messa throw tsHash.error; // TODO: use result pattern } const primaryKey = makeMessagePrimaryKey(message.data.fid, typeToSetPostfix(message.data.type), tsHash.value); - const messageBuffer = Buffer.from(protobufs.Message.encode(message).finish()); + const messageBuffer = Buffer.from(Message.encode(message).finish()); const bySignerKey = makeMessageBySignerKey(message.data.fid, message.signer, message.data.type, tsHash.value); return txn.put(primaryKey, messageBuffer).put(bySignerKey, TRUE_VALUE); }; -export const deleteMessageTransaction = (txn: Transaction, message: protobufs.Message): Transaction => { +export const deleteMessageTransaction = (txn: Transaction, message: Message): Transaction => { if (!message.data) { throw new HubError('bad_request.invalid_param', 'message data is missing'); } diff --git a/apps/hubble/src/storage/db/nameRegistryEvent.test.ts b/apps/hubble/src/storage/db/nameRegistryEvent.test.ts index 900bc6a07f..a20fde971d 100644 --- a/apps/hubble/src/storage/db/nameRegistryEvent.test.ts +++ b/apps/hubble/src/storage/db/nameRegistryEvent.test.ts @@ -1,4 +1,4 @@ -import { bytesToUtf8String, Factories, HubError, utf8StringToBytes } from '@farcaster/utils'; +import { bytesToUtf8String, Factories, HubError, utf8StringToBytes } from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import { deleteNameRegistryEvent, diff --git a/apps/hubble/src/storage/db/nameRegistryEvent.ts b/apps/hubble/src/storage/db/nameRegistryEvent.ts index 300c9402f7..c265dc5484 100644 --- a/apps/hubble/src/storage/db/nameRegistryEvent.ts +++ b/apps/hubble/src/storage/db/nameRegistryEvent.ts @@ -1,4 +1,4 @@ -import { NameRegistryEvent } from '@farcaster/protobufs'; +import { NameRegistryEvent } from '@farcaster/hub-nodejs'; import RocksDB, { Iterator, Transaction } from '~/storage/db/rocksdb'; import { RootPrefix } from '~/storage/db/types'; diff --git a/apps/hubble/src/storage/db/rocksdb.test.ts b/apps/hubble/src/storage/db/rocksdb.test.ts index bffe967de6..6d926e4204 100644 --- a/apps/hubble/src/storage/db/rocksdb.test.ts +++ b/apps/hubble/src/storage/db/rocksdb.test.ts @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker'; -import { HubError } from '@farcaster/utils'; +import { HubError } from '@farcaster/hub-nodejs'; import { existsSync, mkdirSync, rmdirSync } from 'fs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import RocksDB from '~/storage/db/rocksdb'; diff --git a/apps/hubble/src/storage/db/rocksdb.ts b/apps/hubble/src/storage/db/rocksdb.ts index a2e19fb35c..6f6d44a67f 100644 --- a/apps/hubble/src/storage/db/rocksdb.ts +++ b/apps/hubble/src/storage/db/rocksdb.ts @@ -1,4 +1,4 @@ -import { bytesIncrement, HubError, isHubError } from '@farcaster/utils'; +import { bytesIncrement, HubError, isHubError } from '@farcaster/hub-nodejs'; import { AbstractBatch, AbstractChainedBatch, AbstractIterator } from 'abstract-leveldown'; import { mkdir } from 'fs'; import AbstractRocksDB from 'rocksdb'; diff --git a/apps/hubble/src/storage/engine/index.test.ts b/apps/hubble/src/storage/engine/index.test.ts index 00eebc1de5..bfdaf2d8fe 100644 --- a/apps/hubble/src/storage/engine/index.test.ts +++ b/apps/hubble/src/storage/engine/index.test.ts @@ -1,5 +1,30 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesToUtf8String, Factories, HubError } from '@farcaster/utils'; +import { + bytesToUtf8String, + CastAddMessage, + CastId, + CastRemoveMessage, + Factories, + FarcasterNetwork, + HubError, + HubEvent, + HubEventType, + IdRegistryEvent, + IdRegistryEventType, + MergeMessageHubEvent, + Message, + MessageData, + NameRegistryEvent, + NameRegistryEventType, + PruneMessageHubEvent, + ReactionAddMessage, + ReactionType, + RevokeMessageHubEvent, + SignerAddMessage, + SignerRemoveMessage, + UserDataAddMessage, + UserDataType, + VerificationAddEthAddressMessage, +} from '@farcaster/hub-nodejs'; import { err, Ok, ok } from 'neverthrow'; import { jestRocksDB } from '~/storage/db/jestUtils'; import Engine from '~/storage/engine'; @@ -9,7 +34,7 @@ import { getMessage, makeTsHash, typeToSetPostfix } from '~/storage/db/message'; import { StoreEvents } from '~/storage/stores/storeEventHandler'; const db = jestRocksDB('protobufs.engine.test'); -const network = protobufs.FarcasterNetwork.TESTNET; +const network = FarcasterNetwork.TESTNET; const engine = new Engine(db, network); // init signer store for checking state changes from engine @@ -22,14 +47,14 @@ const custodySigner = Factories.Eip712Signer.build(); let custodySignerKey: Uint8Array; let signerKey: Uint8Array; -let custodyEvent: protobufs.IdRegistryEvent; -let fnameTransfer: protobufs.NameRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; -let signerRemove: protobufs.SignerRemoveMessage; -let castAdd: protobufs.CastAddMessage; -let reactionAdd: protobufs.ReactionAddMessage; -let verificationAdd: protobufs.VerificationAddEthAddressMessage; -let userDataAdd: protobufs.UserDataAddMessage; +let custodyEvent: IdRegistryEvent; +let fnameTransfer: NameRegistryEvent; +let signerAdd: SignerAddMessage; +let signerRemove: SignerRemoveMessage; +let castAdd: CastAddMessage; +let reactionAdd: ReactionAddMessage; +let verificationAdd: VerificationAddEthAddressMessage; +let userDataAdd: UserDataAddMessage; beforeAll(async () => { signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -54,7 +79,7 @@ beforeAll(async () => { { transient: { signer } } ); userDataAdd = await Factories.UserDataAddMessage.create( - { data: { fid, network, userDataBody: { type: protobufs.UserDataType.PFP } } }, + { data: { fid, network, userDataBody: { type: UserDataType.PFP } } }, { transient: { signer } } ); }); @@ -66,7 +91,7 @@ describe('mergeIdRegistryEvent', () => { }); test('fails with invalid event type', async () => { - const invalidEvent = Factories.IdRegistryEvent.build({ type: 10 as unknown as protobufs.IdRegistryEventType }); + const invalidEvent = Factories.IdRegistryEvent.build({ type: 10 as unknown as IdRegistryEventType }); const result = await engine.mergeIdRegistryEvent(invalidEvent); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'invalid event type')); }); @@ -79,16 +104,16 @@ describe('mergeNameRegistryEvent', () => { }); test('fails with invalid event type', async () => { - const invalidEvent = Factories.NameRegistryEvent.build({ type: 10 as unknown as protobufs.NameRegistryEventType }); + const invalidEvent = Factories.NameRegistryEvent.build({ type: 10 as unknown as NameRegistryEventType }); const result = await engine.mergeNameRegistryEvent(invalidEvent); expect(result._unsafeUnwrapErr()).toEqual(new HubError('bad_request.validation_failure', 'invalid event type')); }); }); describe('mergeMessage', () => { - let mergedMessages: protobufs.Message[]; + let mergedMessages: Message[]; - const handleMergeMessage = (event: protobufs.MergeMessageHubEvent) => { + const handleMergeMessage = (event: MergeMessageHubEvent) => { mergedMessages.push(event.mergeMessageBody.message); }; @@ -125,7 +150,7 @@ describe('mergeMessage', () => { engine.getReaction( fid, reactionAdd.data.reactionBody.type, - reactionAdd.data.reactionBody.targetCastId as protobufs.CastId + reactionAdd.data.reactionBody.targetCastId as CastId ) ).resolves.toEqual(ok(reactionAdd)); expect(mergedMessages).toEqual([signerAdd, reactionAdd]); @@ -150,7 +175,7 @@ describe('mergeMessage', () => { }); describe('with fname', () => { - let fnameAdd: protobufs.UserDataAddMessage; + let fnameAdd: UserDataAddMessage; beforeAll(async () => { const fnameString = bytesToUtf8String(fnameTransfer.fname)._unsafeUnwrap(); @@ -159,7 +184,7 @@ describe('mergeMessage', () => { data: { fid, network, - userDataBody: { type: protobufs.UserDataType.FNAME, value: fnameString }, + userDataBody: { type: UserDataType.FNAME, value: fnameString }, }, }, { transient: { signer } } @@ -201,7 +226,7 @@ describe('mergeMessage', () => { test('succeeds with concurrent, conflicting cast messages', async () => { const castAdd = await Factories.CastAddMessage.create({ data: { fid } }, { transient: { signer } }); - const generateCastRemove = async (): Promise => { + const generateCastRemove = async (): Promise => { return Factories.CastRemoveMessage.create( { data: { fid, castRemoveBody: { targetHash: castAdd.hash } } }, { transient: { signer } } @@ -209,7 +234,7 @@ describe('mergeMessage', () => { }; // Generate 100 cast removes with different timestamps - const castRemoves: protobufs.CastRemoveMessage[] = []; + const castRemoves: CastRemoveMessage[] = []; for (let i = 0; i < 100; i++) { const castRemove = await generateCastRemove(); castRemoves.push(castRemove); @@ -231,11 +256,11 @@ describe('mergeMessage', () => { test('succeeds with concurrent, conflicting reaction messages', async () => { const castId = Factories.CastId.build(); const body = Factories.ReactionBody.build({ - type: protobufs.ReactionType.LIKE, + type: ReactionType.LIKE, targetCastId: castId, }); - const messages: protobufs.Message[] = []; + const messages: Message[] = []; for (let i = 0; i < 10; i++) { if (Math.random() < 0.5) { messages.push( @@ -283,7 +308,7 @@ describe('mergeMessage', () => { }); describe('fails when missing both custody address and signer', () => { - let message: protobufs.Message; + let message: Message; afterEach(async () => { const result = await engine.mergeMessage(message); @@ -298,13 +323,13 @@ describe('mergeMessage', () => { }); test('fails with mismatched farcaster network', async () => { - const mainnetEngine = new Engine(db, protobufs.FarcasterNetwork.MAINNET); + const mainnetEngine = new Engine(db, FarcasterNetwork.MAINNET); const result = await mainnetEngine.mergeMessage(reactionAdd); expect(result).toEqual( err( new HubError( 'bad_request.validation_failure', - `incorrect network: ${protobufs.FarcasterNetwork.TESTNET} (expected: ${protobufs.FarcasterNetwork.MAINNET})` + `incorrect network: ${FarcasterNetwork.TESTNET} (expected: ${FarcasterNetwork.MAINNET})` ) ) ); @@ -313,8 +338,8 @@ describe('mergeMessage', () => { }); describe('mergeMessages', () => { - let mergedMessages: protobufs.Message[]; - const handleMergeMessage = (event: protobufs.MergeMessageHubEvent) => { + let mergedMessages: Message[]; + const handleMergeMessage = (event: MergeMessageHubEvent) => { mergedMessages.push(event.mergeMessageBody.message); }; @@ -344,8 +369,8 @@ describe('mergeMessages', () => { }); describe('revokeMessagesBySigner', () => { - let revokedMessages: protobufs.Message[]; - const handleRevokedMessage = (event: protobufs.RevokeMessageHubEvent) => { + let revokedMessages: Message[]; + const handleRevokedMessage = (event: RevokeMessageHubEvent) => { revokedMessages.push(event.revokeMessageBody.message); }; @@ -367,8 +392,8 @@ describe('revokeMessagesBySigner', () => { await engine.mergeMessage(userDataAdd); }); - const checkMessage = (message: protobufs.Message): Promise => { - const data = message.data as protobufs.MessageData; + const checkMessage = (message: Message): Promise => { + const data = message.data as MessageData; const tsHash = makeTsHash(data.timestamp, message.hash)._unsafeUnwrap(); return getMessage(db, data.fid, typeToSetPostfix(data.type), tsHash); }; @@ -399,11 +424,11 @@ describe('revokeMessagesBySigner', () => { }); describe('with listeners and workers', () => { - const liveEngine = new Engine(db, protobufs.FarcasterNetwork.TESTNET); + const liveEngine = new Engine(db, FarcasterNetwork.TESTNET); - let revokedMessages: protobufs.Message[]; + let revokedMessages: Message[]; - const handleRevokeMessage = (event: protobufs.RevokeMessageHubEvent) => { + const handleRevokeMessage = (event: RevokeMessageHubEvent) => { revokedMessages.push(event.revokeMessageBody.message); }; @@ -434,7 +459,7 @@ describe('with listeners and workers', () => { await liveEngine.getReaction( fid, reactionAdd.data.reactionBody.type, - reactionAdd.data.reactionBody.targetCastId as protobufs.CastId + reactionAdd.data.reactionBody.targetCastId as CastId ) ).toEqual(ok(reactionAdd)); }); @@ -459,22 +484,22 @@ describe('with listeners and workers', () => { }); test('revokes messages when SignerAdd is pruned', async () => { - const event = protobufs.HubEvent.create({ - type: protobufs.HubEventType.PRUNE_MESSAGE, + const event = HubEvent.create({ + type: HubEventType.PRUNE_MESSAGE, pruneMessageBody: { message: signerAdd }, }); - liveEngine.eventHandler.emit('pruneMessage', event as protobufs.PruneMessageHubEvent); // Hack to force prune + liveEngine.eventHandler.emit('pruneMessage', event as PruneMessageHubEvent); // Hack to force prune expect(revokedMessages).toEqual([]); await sleep(200); // Wait for engine to revoke messages expect(revokedMessages).toEqual([castAdd, reactionAdd]); }); test('revokes messages when SignerAdd is revoked', async () => { - const event = protobufs.HubEvent.create({ - type: protobufs.HubEventType.REVOKE_MESSAGE, + const event = HubEvent.create({ + type: HubEventType.REVOKE_MESSAGE, revokeMessageBody: { message: signerAdd }, }); - liveEngine.eventHandler.emit('revokeMessage', event as protobufs.RevokeMessageHubEvent); // Hack to force revoke + liveEngine.eventHandler.emit('revokeMessage', event as RevokeMessageHubEvent); // Hack to force revoke expect(revokedMessages).toEqual([signerAdd]); await sleep(200); // Wait for engine to revoke messages expect(revokedMessages).toEqual([signerAdd, castAdd, reactionAdd]); @@ -485,13 +510,13 @@ describe('with listeners and workers', () => { const nameEvent = Factories.NameRegistryEvent.build({ fname, to: custodyEvent.to, - type: protobufs.NameRegistryEventType.TRANSFER, + type: NameRegistryEventType.TRANSFER, }); await expect(liveEngine.mergeNameRegistryEvent(nameEvent)).resolves.toBeInstanceOf(Ok); const fnameAdd = await Factories.UserDataAddMessage.create( { data: { - userDataBody: { type: protobufs.UserDataType.FNAME, value: bytesToUtf8String(fname)._unsafeUnwrap() }, + userDataBody: { type: UserDataType.FNAME, value: bytesToUtf8String(fname)._unsafeUnwrap() }, fid, }, }, @@ -501,7 +526,7 @@ describe('with listeners and workers', () => { const nameTransfer = Factories.NameRegistryEvent.build({ fname, from: custodySignerKey, - type: protobufs.NameRegistryEventType.TRANSFER, + type: NameRegistryEventType.TRANSFER, blockNumber: nameEvent.blockNumber + 1, }); await expect(liveEngine.mergeNameRegistryEvent(nameTransfer)).resolves.toBeInstanceOf(Ok); @@ -515,13 +540,13 @@ describe('with listeners and workers', () => { const nameEvent = Factories.NameRegistryEvent.build({ fname, to: custodyEvent.to, - type: protobufs.NameRegistryEventType.TRANSFER, + type: NameRegistryEventType.TRANSFER, }); await expect(liveEngine.mergeNameRegistryEvent(nameEvent)).resolves.toBeInstanceOf(Ok); const fnameAdd = await Factories.UserDataAddMessage.create( { data: { - userDataBody: { type: protobufs.UserDataType.FNAME, value: bytesToUtf8String(fname)._unsafeUnwrap() }, + userDataBody: { type: UserDataType.FNAME, value: bytesToUtf8String(fname)._unsafeUnwrap() }, fid, }, }, @@ -544,7 +569,7 @@ describe('with listeners and workers', () => { describe('stop', () => { test('removes all event listeners', async () => { const eventNames: (keyof StoreEvents)[] = ['mergeMessage', 'mergeIdRegistryEvent', 'pruneMessage', 'revokeMessage']; - const scopedEngine = new Engine(db, protobufs.FarcasterNetwork.TESTNET); + const scopedEngine = new Engine(db, FarcasterNetwork.TESTNET); for (const eventName of eventNames) { expect(scopedEngine.eventHandler.listenerCount(eventName)).toEqual(0); } diff --git a/apps/hubble/src/storage/engine/index.ts b/apps/hubble/src/storage/engine/index.ts index 833a696a0d..4481c18b1a 100644 --- a/apps/hubble/src/storage/engine/index.ts +++ b/apps/hubble/src/storage/engine/index.ts @@ -1,15 +1,42 @@ -import * as protobufs from '@farcaster/protobufs'; import { bytesCompare, bytesToHexString, + CastAddMessage, + CastId, + CastRemoveMessage, + FarcasterNetwork, HubAsyncResult, HubError, + HubEvent, HubResult, + IdRegistryEvent, + IdRegistryEventType, + isSignerAddMessage, + isSignerRemoveMessage, + isUserDataAddMessage, + MergeIdRegistryEventHubEvent, + MergeMessageHubEvent, + MergeNameRegistryEventHubEvent, + Message, + NameRegistryEvent, + NameRegistryEventType, + PruneMessageHubEvent, + ReactionAddMessage, + ReactionRemoveMessage, + ReactionType, + RevokeMessageHubEvent, + RevokeMessagesBySignerJobPayload, + SignerAddMessage, + SignerRemoveMessage, + UserDataAddMessage, + UserDataType, utf8StringToBytes, validations, -} from '@farcaster/utils'; -import fs from 'fs'; + VerificationAddEthAddressMessage, + VerificationRemoveMessage, +} from '@farcaster/hub-nodejs'; import { err, ok, Result, ResultAsync } from 'neverthrow'; +import fs from 'fs'; import { Worker } from 'worker_threads'; import { SyncId } from '~/network/sync/syncId'; import { getManyMessages, getMessage, getMessagesBySignerIterator, typeToSetPostfix } from '~/storage/db/message'; @@ -38,7 +65,7 @@ class Engine { public eventHandler: StoreEventHandler; private _db: RocksDB; - private _network: protobufs.FarcasterNetwork; + private _network: FarcasterNetwork; private _reactionStore: ReactionStore; private _signerStore: SignerStore; @@ -48,13 +75,13 @@ class Engine { private _validationWorker: Worker | undefined; private _validationWorkerJobId = 0; - private _validationWorkerPromiseMap = new Map) => void>(); + private _validationWorkerPromiseMap = new Map) => void>(); private _storageCache: StorageCache; private _revokeSignerQueue: RevokeMessagesBySignerJobQueue; private _revokeSignerWorker: RevokeMessagesBySignerJobWorker; - constructor(db: RocksDB, network: protobufs.FarcasterNetwork) { + constructor(db: RocksDB, network: FarcasterNetwork) { this._db = db; this._network = network; @@ -140,11 +167,11 @@ class Engine { log.info('engine stopped'); } - async mergeMessages(messages: protobufs.Message[]): Promise>> { + async mergeMessages(messages: Message[]): Promise>> { return Promise.all(messages.map((message) => this.mergeMessage(message))); } - async mergeMessage(message: protobufs.Message): HubAsyncResult { + async mergeMessage(message: Message): HubAsyncResult { const validatedMessage = await this.validateMessage(message); if (validatedMessage.isErr()) { return err(validatedMessage.error); @@ -175,22 +202,16 @@ class Engine { } } - async mergeIdRegistryEvent(event: protobufs.IdRegistryEvent): HubAsyncResult { - if ( - event.type === protobufs.IdRegistryEventType.REGISTER || - event.type === protobufs.IdRegistryEventType.TRANSFER - ) { + async mergeIdRegistryEvent(event: IdRegistryEvent): HubAsyncResult { + if (event.type === IdRegistryEventType.REGISTER || event.type === IdRegistryEventType.TRANSFER) { return ResultAsync.fromPromise(this._signerStore.mergeIdRegistryEvent(event), (e) => e as HubError); } return err(new HubError('bad_request.validation_failure', 'invalid event type')); } - async mergeNameRegistryEvent(event: protobufs.NameRegistryEvent): HubAsyncResult { - if ( - event.type === protobufs.NameRegistryEventType.TRANSFER || - event.type === protobufs.NameRegistryEventType.RENEW - ) { + async mergeNameRegistryEvent(event: NameRegistryEvent): HubAsyncResult { + if (event.type === NameRegistryEventType.TRANSFER || event.type === NameRegistryEventType.RENEW) { return ResultAsync.fromPromise(this._userDataStore.mergeNameRegistryEvent(event), (e) => e as HubError); } @@ -297,7 +318,7 @@ class Engine { } /** revoke message if it is not valid */ - async validateOrRevokeMessage(message: protobufs.Message): HubAsyncResult { + async validateOrRevokeMessage(message: Message): HubAsyncResult { const isValid = await this.validateMessage(message); if (isValid.isErr() && message.data) { @@ -332,7 +353,7 @@ class Engine { /* Event Methods */ /* -------------------------------------------------------------------------- */ - async getEvent(id: number): HubAsyncResult { + async getEvent(id: number): HubAsyncResult { return this.eventHandler.getEvent(id); } @@ -340,7 +361,7 @@ class Engine { /* Sync Methods */ /* -------------------------------------------------------------------------- */ - async forEachMessage(callback: (message: protobufs.Message, key: Buffer) => Promise): Promise { + async forEachMessage(callback: (message: Message, key: Buffer) => Promise): Promise { const allUserPrefix = Buffer.from([RootPrefix.User]); const iterator = this._db.iteratorByPrefix(allUserPrefix, { keys: true }); @@ -370,7 +391,7 @@ class Engine { } const message = Result.fromThrowable( - () => protobufs.Message.decode(new Uint8Array(value)), + () => Message.decode(new Uint8Array(value)), (e) => e as HubError )(); @@ -384,7 +405,7 @@ class Engine { } } - async getAllMessagesBySyncIds(syncIds: Uint8Array[]): HubAsyncResult { + async getAllMessagesBySyncIds(syncIds: Uint8Array[]): HubAsyncResult { const hashesBuf = syncIds.map((syncIdHash) => SyncId.pkFromSyncId(syncIdHash)); const messages = await ResultAsync.fromPromise(getManyMessages(this._db, hashesBuf), (e) => e as HubError); @@ -395,7 +416,7 @@ class Engine { /* Cast Store Methods */ /* -------------------------------------------------------------------------- */ - async getCast(fid: number, hash: Uint8Array): HubAsyncResult { + async getCast(fid: number, hash: Uint8Array): HubAsyncResult { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -404,10 +425,7 @@ class Engine { return ResultAsync.fromPromise(this._castStore.getCastAdd(fid, hash), (e) => e as HubError); } - async getCastsByFid( - fid: number, - pageOptions: PageOptions = {} - ): HubAsyncResult> { + async getCastsByFid(fid: number, pageOptions: PageOptions = {}): HubAsyncResult> { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -417,9 +435,9 @@ class Engine { } async getCastsByParent( - parentId: protobufs.CastId, + parentId: CastId, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { const validatedCastId = validations.validateCastId(parentId); if (validatedCastId.isErr()) { return err(validatedCastId.error); @@ -431,7 +449,7 @@ class Engine { async getCastsByMention( mentionFid: number, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { const validatedFid = validations.validateFid(mentionFid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -443,7 +461,7 @@ class Engine { async getAllCastMessagesByFid( fid: number, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { return ResultAsync.fromPromise(this._castStore.getAllCastMessagesByFid(fid, pageOptions), (e) => e as HubError); } @@ -451,11 +469,7 @@ class Engine { /* Reaction Store Methods */ /* -------------------------------------------------------------------------- */ - async getReaction( - fid: number, - type: protobufs.ReactionType, - cast: protobufs.CastId - ): HubAsyncResult { + async getReaction(fid: number, type: ReactionType, cast: CastId): HubAsyncResult { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -471,9 +485,9 @@ class Engine { async getReactionsByFid( fid: number, - type?: protobufs.ReactionType, + type?: ReactionType, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -486,10 +500,10 @@ class Engine { } async getReactionsByCast( - castId: protobufs.CastId, - type?: protobufs.ReactionType, + castId: CastId, + type?: ReactionType, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { const validatedCastId = validations.validateCastId(castId); if (validatedCastId.isErr()) { return err(validatedCastId.error); @@ -504,7 +518,7 @@ class Engine { async getAllReactionMessagesByFid( fid: number, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -520,7 +534,7 @@ class Engine { /* Verification Store Methods */ /* -------------------------------------------------------------------------- */ - async getVerification(fid: number, address: Uint8Array): HubAsyncResult { + async getVerification(fid: number, address: Uint8Array): HubAsyncResult { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -537,7 +551,7 @@ class Engine { async getVerificationsByFid( fid: number, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -552,7 +566,7 @@ class Engine { async getAllVerificationMessagesByFid( fid: number, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -568,7 +582,7 @@ class Engine { /* Signer Store Methods */ /* -------------------------------------------------------------------------- */ - async getSigner(fid: number, signerPubKey: Uint8Array): HubAsyncResult { + async getSigner(fid: number, signerPubKey: Uint8Array): HubAsyncResult { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -582,10 +596,7 @@ class Engine { return ResultAsync.fromPromise(this._signerStore.getSignerAdd(fid, signerPubKey), (e) => e as HubError); } - async getSignersByFid( - fid: number, - pageOptions: PageOptions = {} - ): HubAsyncResult> { + async getSignersByFid(fid: number, pageOptions: PageOptions = {}): HubAsyncResult> { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -594,11 +605,11 @@ class Engine { return ResultAsync.fromPromise(this._signerStore.getSignerAddsByFid(fid, pageOptions), (e) => e as HubError); } - async getIdRegistryEvent(fid: number): HubAsyncResult { + async getIdRegistryEvent(fid: number): HubAsyncResult { return ResultAsync.fromPromise(this._signerStore.getIdRegistryEvent(fid), (e) => e as HubError); } - async getIdRegistryEventByAddress(address: Uint8Array): HubAsyncResult { + async getIdRegistryEventByAddress(address: Uint8Array): HubAsyncResult { return ResultAsync.fromPromise(this._signerStore.getIdRegistryEventByAddress(address), (e) => e as HubError); } @@ -612,7 +623,7 @@ class Engine { async getAllSignerMessagesByFid( fid: number, pageOptions: PageOptions = {} - ): HubAsyncResult> { + ): HubAsyncResult> { return ResultAsync.fromPromise(this._signerStore.getAllSignerMessagesByFid(fid, pageOptions), (e) => e as HubError); } @@ -620,7 +631,7 @@ class Engine { /* User Data Store Methods */ /* -------------------------------------------------------------------------- */ - async getUserData(fid: number, type: protobufs.UserDataType): HubAsyncResult { + async getUserData(fid: number, type: UserDataType): HubAsyncResult { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -629,10 +640,7 @@ class Engine { return ResultAsync.fromPromise(this._userDataStore.getUserDataAdd(fid, type), (e) => e as HubError); } - async getUserDataByFid( - fid: number, - pageOptions: PageOptions = {} - ): HubAsyncResult> { + async getUserDataByFid(fid: number, pageOptions: PageOptions = {}): HubAsyncResult> { const validatedFid = validations.validateFid(fid); if (validatedFid.isErr()) { return err(validatedFid.error); @@ -641,7 +649,7 @@ class Engine { return ResultAsync.fromPromise(this._userDataStore.getUserDataAddsByFid(fid, pageOptions), (e) => e as HubError); } - async getNameRegistryEvent(fname: Uint8Array): HubAsyncResult { + async getNameRegistryEvent(fname: Uint8Array): HubAsyncResult { const validatedFname = validations.validateFname(fname); if (validatedFname.isErr()) { return err(validatedFname.error); @@ -654,7 +662,7 @@ class Engine { /* Private Methods */ /* -------------------------------------------------------------------------- */ - private async validateMessage(message: protobufs.Message): HubAsyncResult { + private async validateMessage(message: Message): HubAsyncResult { // 1. Ensure message data is present if (!message || !message.data) { return err(new HubError('bad_request.validation_failure', 'message data is missing')); @@ -678,7 +686,7 @@ class Engine { } // 4. Check that the signer is valid - if (protobufs.isSignerAddMessage(message) || protobufs.isSignerRemoveMessage(message)) { + if (isSignerAddMessage(message) || isSignerRemoveMessage(message)) { if (bytesCompare(message.signer, custodyEvent.value.to) !== 0) { const hex = Result.combine([bytesToHexString(message.signer), bytesToHexString(custodyEvent.value.to)]); return hex.andThen(([signerHex, custodyHex]) => { @@ -709,7 +717,7 @@ class Engine { } // 5. For fname add UserDataAdd messages, check that the user actually owns the fname - if (protobufs.isUserDataAddMessage(message) && message.data.userDataBody.type === protobufs.UserDataType.FNAME) { + if (isUserDataAddMessage(message) && message.data.userDataBody.type === UserDataType.FNAME) { // For fname messages, check if the user actually owns the fname. const fnameBytes = utf8StringToBytes(message.data.userDataBody.value); if (fnameBytes.isErr()) { @@ -749,7 +757,7 @@ class Engine { // 6. Check message body and envelope if (this._validationWorker) { - return new Promise>((resolve) => { + return new Promise>((resolve) => { const id = this._validationWorkerJobId++; this._validationWorkerPromiseMap.set(id, resolve); @@ -760,12 +768,12 @@ class Engine { } } - private async handleMergeIdRegistryEvent(event: protobufs.MergeIdRegistryEventHubEvent): HubAsyncResult { + private async handleMergeIdRegistryEvent(event: MergeIdRegistryEventHubEvent): HubAsyncResult { const { idRegistryEvent } = event.mergeIdRegistryEventBody; const fromAddress = idRegistryEvent.from; if (fromAddress && fromAddress.length > 0) { // Revoke signer messages - const payload = protobufs.RevokeMessagesBySignerJobPayload.create({ + const payload = RevokeMessagesBySignerJobPayload.create({ fid: idRegistryEvent.fid, signer: fromAddress, }); @@ -779,7 +787,7 @@ class Engine { // Revoke UserDataAdd fname messages const fnameAdd = await ResultAsync.fromPromise( - this._userDataStore.getUserDataAdd(idRegistryEvent.fid, protobufs.UserDataType.FNAME), + this._userDataStore.getUserDataAdd(idRegistryEvent.fid, UserDataType.FNAME), () => undefined ); if (fnameAdd.isOk()) { @@ -806,12 +814,12 @@ class Engine { return ok(undefined); } - private async handleMergeNameRegistryEvent(event: protobufs.MergeNameRegistryEventHubEvent): HubAsyncResult { + private async handleMergeNameRegistryEvent(event: MergeNameRegistryEventHubEvent): HubAsyncResult { const { nameRegistryEvent } = event.mergeNameRegistryEventBody; // When there is a NameRegistryEvent, we need to check if we need to revoke UserDataAdd messages from the // previous owner of the name. - if (nameRegistryEvent.type === protobufs.NameRegistryEventType.TRANSFER && nameRegistryEvent.from.length > 0) { + if (nameRegistryEvent.type === NameRegistryEventType.TRANSFER && nameRegistryEvent.from.length > 0) { // Check to see if the from address has an fid const idRegistryEvent = await ResultAsync.fromPromise( getIdRegistryEventByCustodyAddress(this._db, nameRegistryEvent.from), @@ -823,7 +831,7 @@ class Engine { // Check if this fid assigned the fname with a UserDataAdd message const fnameAdd = await ResultAsync.fromPromise( - this._userDataStore.getUserDataAdd(fid, protobufs.UserDataType.FNAME), + this._userDataStore.getUserDataAdd(fid, UserDataType.FNAME), () => undefined ); if (fnameAdd.isOk()) { @@ -849,11 +857,11 @@ class Engine { return ok(undefined); } - private async handleMergeMessageEvent(event: protobufs.MergeMessageHubEvent): HubAsyncResult { + private async handleMergeMessageEvent(event: MergeMessageHubEvent): HubAsyncResult { const { message } = event.mergeMessageBody; - if (protobufs.isSignerRemoveMessage(message)) { - const payload = protobufs.RevokeMessagesBySignerJobPayload.create({ + if (isSignerRemoveMessage(message)) { + const payload = RevokeMessagesBySignerJobPayload.create({ fid: message.data.fid, signer: message.data.signerRemoveBody.signer, }); @@ -869,11 +877,11 @@ class Engine { return ok(undefined); } - private async handlePruneMessageEvent(event: protobufs.PruneMessageHubEvent): HubAsyncResult { + private async handlePruneMessageEvent(event: PruneMessageHubEvent): HubAsyncResult { const { message } = event.pruneMessageBody; - if (protobufs.isSignerAddMessage(message)) { - const payload = protobufs.RevokeMessagesBySignerJobPayload.create({ + if (isSignerAddMessage(message)) { + const payload = RevokeMessagesBySignerJobPayload.create({ fid: message.data.fid, signer: message.data.signerAddBody.signer, }); @@ -889,11 +897,11 @@ class Engine { return ok(undefined); } - private async handleRevokeMessageEvent(event: protobufs.RevokeMessageHubEvent): HubAsyncResult { + private async handleRevokeMessageEvent(event: RevokeMessageHubEvent): HubAsyncResult { const { message } = event.revokeMessageBody; - if (protobufs.isSignerAddMessage(message)) { - const payload = protobufs.RevokeMessagesBySignerJobPayload.create({ + if (isSignerAddMessage(message)) { + const payload = RevokeMessagesBySignerJobPayload.create({ fid: message.data.fid, signer: message.data.signerAddBody.signer, }); diff --git a/apps/hubble/src/storage/engine/seed.ts b/apps/hubble/src/storage/engine/seed.ts index 5810f1e112..f0385fffb6 100644 --- a/apps/hubble/src/storage/engine/seed.ts +++ b/apps/hubble/src/storage/engine/seed.ts @@ -1,4 +1,4 @@ -import { Eip712Signer, Factories } from '@farcaster/utils'; +import { Eip712Signer, Factories } from '@farcaster/hub-nodejs'; import Engine from '~/storage/engine'; /** Util to seed engine with all the data needed to make a signer valid for an fid */ diff --git a/apps/hubble/src/storage/engine/storageCache.test.ts b/apps/hubble/src/storage/engine/storageCache.test.ts index 6f681eaf24..9f6cad8081 100644 --- a/apps/hubble/src/storage/engine/storageCache.test.ts +++ b/apps/hubble/src/storage/engine/storageCache.test.ts @@ -1,6 +1,5 @@ import { ok, err } from 'neverthrow'; -import { HubEvent, HubEventType } from '@farcaster/protobufs'; -import { Factories, HubError } from '@farcaster/utils'; +import { HubEvent, HubEventType, Factories, HubError } from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import { putMessage } from '~/storage/db/message'; import { UserPostfix } from '~/storage/db/types'; diff --git a/apps/hubble/src/storage/engine/storageCache.ts b/apps/hubble/src/storage/engine/storageCache.ts index 315413a467..b0afa4d743 100644 --- a/apps/hubble/src/storage/engine/storageCache.ts +++ b/apps/hubble/src/storage/engine/storageCache.ts @@ -4,9 +4,10 @@ import { isPruneMessageHubEvent, isRevokeMessageHubEvent, Message, -} from '@farcaster/protobufs'; + HubError, + HubResult, +} from '@farcaster/hub-nodejs'; import { ok, err } from 'neverthrow'; -import { HubError, HubResult } from '@farcaster/utils'; import RocksDB from '~/storage/db/rocksdb'; import { FID_BYTES, RootPrefix, UserMessagePostfix, UserMessagePostfixMax } from '~/storage/db/types'; import { logger } from '~/utils/logger'; diff --git a/apps/hubble/src/storage/engine/validation.worker.ts b/apps/hubble/src/storage/engine/validation.worker.ts index e49d3094d4..09692de08e 100644 --- a/apps/hubble/src/storage/engine/validation.worker.ts +++ b/apps/hubble/src/storage/engine/validation.worker.ts @@ -1,4 +1,4 @@ -import { validations } from '@farcaster/utils'; +import { validations } from '@farcaster/hub-nodejs'; import { parentPort } from 'worker_threads'; // Wait for messages from the main thread and validate them, posting the result back diff --git a/apps/hubble/src/storage/jobs/pruneEventsJob.ts b/apps/hubble/src/storage/jobs/pruneEventsJob.ts index 119837573a..2e257f7796 100644 --- a/apps/hubble/src/storage/jobs/pruneEventsJob.ts +++ b/apps/hubble/src/storage/jobs/pruneEventsJob.ts @@ -1,4 +1,4 @@ -import { HubAsyncResult } from '@farcaster/utils'; +import { HubAsyncResult } from '@farcaster/hub-nodejs'; import { ok } from 'neverthrow'; import cron from 'node-cron'; import Engine from '~/storage/engine'; diff --git a/apps/hubble/src/storage/jobs/pruneMessagesJob.test.ts b/apps/hubble/src/storage/jobs/pruneMessagesJob.test.ts index fd9bb7f150..52aeb2fdb8 100644 --- a/apps/hubble/src/storage/jobs/pruneMessagesJob.test.ts +++ b/apps/hubble/src/storage/jobs/pruneMessagesJob.test.ts @@ -1,5 +1,4 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Ed25519Signer, Factories } from '@farcaster/utils'; +import { Ed25519Signer, Factories, FarcasterNetwork, Message, PruneMessageHubEvent } from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import Engine from '~/storage/engine'; import { seedSigner } from '~/storage/engine/seed'; @@ -7,7 +6,7 @@ import { PruneMessagesJobScheduler } from '~/storage/jobs/pruneMessagesJob'; const db = jestRocksDB('jobs.pruneMessagesJob.test'); -const engine = new Engine(db, protobufs.FarcasterNetwork.TESTNET); +const engine = new Engine(db, FarcasterNetwork.TESTNET); const scheduler = new PruneMessagesJobScheduler(engine); // Use farcaster timestamp @@ -20,9 +19,9 @@ const seedMessagesFromTimestamp = async (engine: Engine, fid: number, signer: Ed return engine.mergeMessages([castAdd, reactionAdd]); }; -let prunedMessages: protobufs.Message[] = []; +let prunedMessages: Message[] = []; -const pruneMessageListener = (event: protobufs.PruneMessageHubEvent) => { +const pruneMessageListener = (event: PruneMessageHubEvent) => { prunedMessages.push(event.pruneMessageBody.message); }; diff --git a/apps/hubble/src/storage/jobs/pruneMessagesJob.ts b/apps/hubble/src/storage/jobs/pruneMessagesJob.ts index d59a91db8b..904b452cab 100644 --- a/apps/hubble/src/storage/jobs/pruneMessagesJob.ts +++ b/apps/hubble/src/storage/jobs/pruneMessagesJob.ts @@ -1,4 +1,4 @@ -import { HubAsyncResult } from '@farcaster/utils'; +import { HubAsyncResult } from '@farcaster/hub-nodejs'; import { err, ok } from 'neverthrow'; import cron from 'node-cron'; import Engine from '~/storage/engine'; diff --git a/apps/hubble/src/storage/jobs/revokeMessagesBySignerJob.ts b/apps/hubble/src/storage/jobs/revokeMessagesBySignerJob.ts index 30891ec744..8a6f068027 100644 --- a/apps/hubble/src/storage/jobs/revokeMessagesBySignerJob.ts +++ b/apps/hubble/src/storage/jobs/revokeMessagesBySignerJob.ts @@ -1,5 +1,10 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesIncrement, HubAsyncResult, HubError, HubResult } from '@farcaster/utils'; +import { + bytesIncrement, + HubAsyncResult, + HubError, + HubResult, + RevokeMessagesBySignerJobPayload, +} from '@farcaster/hub-nodejs'; import { blake3 } from '@noble/hashes/blake3'; import { err, ok, Result, ResultAsync } from 'neverthrow'; import { TypedEmitter } from 'tiny-typed-emitter'; @@ -57,7 +62,7 @@ export class RevokeMessagesBySignerJobWorker { return ok(undefined); } - private async processJob(payload: protobufs.RevokeMessagesBySignerJobPayload): HubAsyncResult { + private async processJob(payload: RevokeMessagesBySignerJobPayload): HubAsyncResult { return this._engine.revokeMessagesBySigner(payload.fid, payload.signer); } } @@ -112,13 +117,13 @@ export class RevokeMessagesBySignerJobQueue extends TypedEmitter return ok(this._db.iterator({ gte, lt })); } - async enqueueJob(payload: protobufs.RevokeMessagesBySignerJobPayload, doAt?: number): HubAsyncResult { + async enqueueJob(payload: RevokeMessagesBySignerJobPayload, doAt?: number): HubAsyncResult { // If doAt timestamp is missing, use current timestamp if (!doAt) { doAt = Date.now(); } - const payloadBytes = protobufs.RevokeMessagesBySignerJobPayload.encode(payload).finish(); + const payloadBytes = RevokeMessagesBySignerJobPayload.encode(payload).finish(); // Create payload hash const hash = blake3(Uint8Array.from(payloadBytes), { dkLen: 4 }); @@ -144,7 +149,7 @@ export class RevokeMessagesBySignerJobQueue extends TypedEmitter return ok(key.value); } - async popNextJob(doBefore?: number): HubAsyncResult { + async popNextJob(doBefore?: number): HubAsyncResult { const iterator = this.iterator(doBefore); if (iterator.isErr()) { return err(iterator.error); @@ -158,7 +163,7 @@ export class RevokeMessagesBySignerJobQueue extends TypedEmitter const [key, value] = result.value; const payload = Result.fromThrowable( - () => protobufs.RevokeMessagesBySignerJobPayload.decode(Uint8Array.from(value as Buffer)), + () => RevokeMessagesBySignerJobPayload.decode(Uint8Array.from(value as Buffer)), (err) => new HubError('bad_request.parse_failure', { cause: err as Error, diff --git a/apps/hubble/src/storage/jobs/updateNameRegistryEventExpiryJob.ts b/apps/hubble/src/storage/jobs/updateNameRegistryEventExpiryJob.ts index e3fb260b71..93e4fcbaf2 100644 --- a/apps/hubble/src/storage/jobs/updateNameRegistryEventExpiryJob.ts +++ b/apps/hubble/src/storage/jobs/updateNameRegistryEventExpiryJob.ts @@ -1,4 +1,3 @@ -import * as protobufs from '@farcaster/protobufs'; import { bytesIncrement, bytesToUtf8String, @@ -6,9 +5,11 @@ import { HubAsyncResult, HubError, HubResult, + NameRegistryEvent, toFarcasterTime, + UpdateNameRegistryEventExpiryJobPayload, validations, -} from '@farcaster/utils'; +} from '@farcaster/hub-nodejs'; import { blake3 } from '@noble/hashes/blake3'; import { err, ok, Result, ResultAsync } from 'neverthrow'; import { TypedEmitter } from 'tiny-typed-emitter'; @@ -75,9 +76,7 @@ export class UpdateNameRegistryEventExpiryJobWorker { return ok(undefined); } - private async processJob( - payload: protobufs.UpdateNameRegistryEventExpiryJobPayload - ): HubAsyncResult { + private async processJob(payload: UpdateNameRegistryEventExpiryJobPayload): HubAsyncResult { const eventResult = await ResultAsync.fromPromise( getNameRegistryEvent(this._db, payload.fname), (e) => e as HubError @@ -96,7 +95,7 @@ export class UpdateNameRegistryEventExpiryJobWorker { return err(farcasterTimeExpiry.error); } - const updatedEvent: protobufs.NameRegistryEvent = { ...eventResult.value, expiry: farcasterTimeExpiry.value }; + const updatedEvent: NameRegistryEvent = { ...eventResult.value, expiry: farcasterTimeExpiry.value }; const result = await ResultAsync.fromPromise(putNameRegistryEvent(this._db, updatedEvent), (e) => e as HubError); if (result.isErr()) { return err(result.error); @@ -123,8 +122,8 @@ export class UpdateNameRegistryEventExpiryJobQueue extends TypedEmitter { + payload: UpdateNameRegistryEventExpiryJobPayload + ): HubResult { const fnameResult = validations.validateFname(payload.fname); if (fnameResult.isErr()) { return err(fnameResult.error); @@ -133,8 +132,8 @@ export class UpdateNameRegistryEventExpiryJobQueue extends TypedEmitter { - const payload = protobufs.UpdateNameRegistryEventExpiryJobPayload.create({ fname }); + static makePayload(fname: Uint8Array): HubResult { + const payload = UpdateNameRegistryEventExpiryJobPayload.create({ fname }); return UpdateNameRegistryEventExpiryJobQueue.validatePayload(payload); } @@ -178,13 +177,13 @@ export class UpdateNameRegistryEventExpiryJobQueue extends TypedEmitter { + async enqueueJob(payload: UpdateNameRegistryEventExpiryJobPayload, doAt?: number): HubAsyncResult { // If doAt timestamp is missing, use current timestamp if (!doAt) { doAt = Date.now(); } - const payloadBytes = protobufs.UpdateNameRegistryEventExpiryJobPayload.encode(payload).finish(); + const payloadBytes = UpdateNameRegistryEventExpiryJobPayload.encode(payload).finish(); // Create payload hash const hash = blake3(Uint8Array.from(payloadBytes), { dkLen: 4 }); @@ -210,7 +209,7 @@ export class UpdateNameRegistryEventExpiryJobQueue extends TypedEmitter { + async popNextJob(doBefore?: number): HubAsyncResult { const iterator = this.iterator(doBefore); if (iterator.isErr()) { return err(iterator.error); @@ -224,7 +223,7 @@ export class UpdateNameRegistryEventExpiryJobQueue extends TypedEmitter protobufs.UpdateNameRegistryEventExpiryJobPayload.decode(Uint8Array.from(value as Buffer)), + () => UpdateNameRegistryEventExpiryJobPayload.decode(Uint8Array.from(value as Buffer)), (err) => new HubError('bad_request.parse_failure', { cause: err as Error, @@ -240,15 +239,15 @@ export class UpdateNameRegistryEventExpiryJobQueue extends TypedEmitter { - const jobs: [number, protobufs.UpdateNameRegistryEventExpiryJobPayload][] = []; + async getAllJobs(doBefore?: number): HubAsyncResult<[number, UpdateNameRegistryEventExpiryJobPayload][]> { + const jobs: [number, UpdateNameRegistryEventExpiryJobPayload][] = []; const iterator = this.iterator(doBefore); if (iterator.isErr()) { return err(iterator.error); } for await (const [key, value] of iterator.value) { const timestamp = UpdateNameRegistryEventExpiryJobQueue.jobKeyToTimestamp(key as Buffer); - const payload = protobufs.UpdateNameRegistryEventExpiryJobPayload.decode(Uint8Array.from(value as Buffer)); + const payload = UpdateNameRegistryEventExpiryJobPayload.decode(Uint8Array.from(value as Buffer)); if (timestamp.isOk()) { jobs.push([timestamp.value, payload]); } diff --git a/apps/hubble/src/storage/stores/castStore.test.ts b/apps/hubble/src/storage/stores/castStore.test.ts index bb786d4976..9e481f7a9e 100644 --- a/apps/hubble/src/storage/stores/castStore.test.ts +++ b/apps/hubble/src/storage/stores/castStore.test.ts @@ -1,5 +1,17 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesDecrement, bytesIncrement, Factories, getFarcasterTime, HubError } from '@farcaster/utils'; +import { + bytesDecrement, + bytesIncrement, + CastAddMessage, + CastId, + CastRemoveMessage, + Factories, + getFarcasterTime, + HubError, + MergeMessageHubEvent, + Message, + PruneMessageHubEvent, + RevokeMessageHubEvent, +} from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import { getMessage, makeTsHash } from '~/storage/db/message'; import { UserPostfix } from '~/storage/db/types'; @@ -15,9 +27,9 @@ const eventHandler = new StoreEventHandler(db, cache); const store = new CastStore(db, eventHandler); const fid = Factories.Fid.build(); -let castAdd: protobufs.CastAddMessage; -let castRemove: protobufs.CastRemoveMessage; -let parentCastId: protobufs.CastId; +let castAdd: CastAddMessage; +let castRemove: CastRemoveMessage; +let parentCastId: CastId; beforeAll(async () => { parentCastId = Factories.CastId.build(); @@ -211,9 +223,9 @@ describe('getCastsByMention', () => { }); describe('merge', () => { - let mergeEvents: [protobufs.Message | undefined, protobufs.Message[]][] = []; + let mergeEvents: [Message | undefined, Message[]][] = []; - const mergeMessageHandler = (event: protobufs.MergeMessageHubEvent) => { + const mergeMessageHandler = (event: MergeMessageHubEvent) => { const { message, deletedMessages } = event.mergeMessageBody; mergeEvents.push([message, deletedMessages ?? []]); }; @@ -230,17 +242,17 @@ describe('merge', () => { eventHandler.off('mergeMessage', mergeMessageHandler); }); - const assetMessageExists = async (message: protobufs.CastAddMessage | protobufs.CastRemoveMessage) => { + const assetMessageExists = async (message: CastAddMessage | CastRemoveMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.CastMessage, tsHash)).resolves.toEqual(message); }; - const assertMessageDoesNotExist = async (message: protobufs.CastAddMessage | protobufs.CastRemoveMessage) => { + const assertMessageDoesNotExist = async (message: CastAddMessage | CastRemoveMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.CastMessage, tsHash)).rejects.toThrow(HubError); }; - const assertCastAddWins = async (message: protobufs.CastAddMessage, removeMessage?: protobufs.CastRemoveMessage) => { + const assertCastAddWins = async (message: CastAddMessage, removeMessage?: CastRemoveMessage) => { await assetMessageExists(message); await expect(store.getCastAdd(fid, message.hash)).resolves.toEqual(message); for (const mentionFid of message.data.castAddBody.mentions) { @@ -262,7 +274,7 @@ describe('merge', () => { } }; - const assertCastRemoveWins = async (message: protobufs.CastRemoveMessage) => { + const assertCastRemoveWins = async (message: CastRemoveMessage) => { const castHash = message.data.castRemoveBody.targetHash; await assetMessageExists(message); @@ -379,7 +391,7 @@ describe('merge', () => { }); describe('with a conflicting CastRemove with different timestamps', () => { - let castRemoveLater: protobufs.CastRemoveMessage; + let castRemoveLater: CastRemoveMessage; beforeAll(async () => { castRemoveLater = await Factories.CastRemoveMessage.create({ @@ -412,7 +424,7 @@ describe('merge', () => { }); describe('with a conflicting CastRemove with identical timestamps', () => { - let castRemoveLater: protobufs.CastRemoveMessage; + let castRemoveLater: CastRemoveMessage; beforeAll(async () => { castRemoveLater = await Factories.CastRemoveMessage.create({ @@ -522,9 +534,9 @@ describe('merge', () => { }); describe('revoke', () => { - let revokedMessages: protobufs.Message[] = []; + let revokedMessages: Message[] = []; - const revokeMessageHandler = (event: protobufs.RevokeMessageHubEvent) => { + const revokeMessageHandler = (event: RevokeMessageHubEvent) => { revokedMessages.push(event.revokeMessageBody.message); }; @@ -575,8 +587,8 @@ describe('revoke', () => { }); describe('pruneMessages', () => { - let prunedMessages: protobufs.Message[]; - const pruneMessageListener = (event: protobufs.PruneMessageHubEvent) => { + let prunedMessages: Message[]; + const pruneMessageListener = (event: PruneMessageHubEvent) => { prunedMessages.push(event.pruneMessageBody.message); }; @@ -592,22 +604,22 @@ describe('pruneMessages', () => { eventHandler.off('pruneMessage', pruneMessageListener); }); - let add1: protobufs.CastAddMessage; - let add2: protobufs.CastAddMessage; - let add3: protobufs.CastAddMessage; - let add4: protobufs.CastAddMessage; - let add5: protobufs.CastAddMessage; - let addOld1: protobufs.CastAddMessage; - let addOld2: protobufs.CastAddMessage; + let add1: CastAddMessage; + let add2: CastAddMessage; + let add3: CastAddMessage; + let add4: CastAddMessage; + let add5: CastAddMessage; + let addOld1: CastAddMessage; + let addOld2: CastAddMessage; - let remove1: protobufs.CastRemoveMessage; - let remove2: protobufs.CastRemoveMessage; - let remove3: protobufs.CastRemoveMessage; - let remove4: protobufs.CastRemoveMessage; - let remove5: protobufs.CastRemoveMessage; - let removeOld3: protobufs.CastRemoveMessage; + let remove1: CastRemoveMessage; + let remove2: CastRemoveMessage; + let remove3: CastRemoveMessage; + let remove4: CastRemoveMessage; + let remove5: CastRemoveMessage; + let removeOld3: CastRemoveMessage; - const generateAddWithTimestamp = async (fid: number, timestamp: number): Promise => { + const generateAddWithTimestamp = async (fid: number, timestamp: number): Promise => { return Factories.CastAddMessage.create({ data: { fid, timestamp }, }); @@ -616,8 +628,8 @@ describe('pruneMessages', () => { const generateRemoveWithTimestamp = async ( fid: number, timestamp: number, - target?: protobufs.CastAddMessage - ): Promise => { + target?: CastAddMessage + ): Promise => { return Factories.CastRemoveMessage.create({ data: { fid, timestamp, castRemoveBody: { targetHash: target ? target.hash : Factories.MessageHash.build() } }, }); @@ -665,7 +677,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([add1, add2]); - for (const message of prunedMessages as protobufs.CastAddMessage[]) { + for (const message of prunedMessages as CastAddMessage[]) { const getAdd = () => sizePrunedStore.getCastAdd(fid, message.hash); await expect(getAdd()).rejects.toThrow(HubError); } @@ -682,7 +694,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([remove1, remove2]); - for (const message of prunedMessages as protobufs.CastRemoveMessage[]) { + for (const message of prunedMessages as CastRemoveMessage[]) { const getRemove = () => sizePrunedStore.getCastRemove(fid, message.data.castRemoveBody.targetHash); await expect(getRemove()).rejects.toThrow(HubError); } diff --git a/apps/hubble/src/storage/stores/castStore.ts b/apps/hubble/src/storage/stores/castStore.ts index 0ebe5983df..f9b8f81ca6 100644 --- a/apps/hubble/src/storage/stores/castStore.ts +++ b/apps/hubble/src/storage/stores/castStore.ts @@ -1,5 +1,17 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesCompare, getFarcasterTime, HubAsyncResult, HubError, isHubError } from '@farcaster/utils'; +import { + bytesCompare, + CastAddMessage, + CastId, + CastRemoveMessage, + getFarcasterTime, + HubAsyncResult, + HubError, + HubEventType, + isCastAddMessage, + isCastRemoveMessage, + isHubError, + Message, +} from '@farcaster/hub-nodejs'; import AsyncLock from 'async-lock'; import { ok, err, ResultAsync } from 'neverthrow'; import { @@ -64,7 +76,7 @@ const makeCastRemovesKey = (fid: number, hash?: Uint8Array): Buffer => { * @param tsHash the timestamp hash of the cast message * @returns RocksDB index key of the form :::: */ -const makeCastsByParentKey = (parentId: protobufs.CastId, fid?: number, tsHash?: Uint8Array): Buffer => { +const makeCastsByParentKey = (parentId: CastId, fid?: number, tsHash?: Uint8Array): Buffer => { return Buffer.concat([ Buffer.from([RootPrefix.CastsByParent]), makeCastIdKey(parentId), @@ -134,52 +146,44 @@ class CastStore { } /** Looks up CastAdd message by cast tsHash */ - async getCastAdd(fid: number, hash: Uint8Array): Promise { + async getCastAdd(fid: number, hash: Uint8Array): Promise { const addsKey = makeCastAddsKey(fid, hash); const messageTsHash = await this._db.get(addsKey); return getMessage(this._db, fid, UserPostfix.CastMessage, messageTsHash); } /** Looks up CastRemove message by cast tsHash */ - async getCastRemove(fid: number, hash: Uint8Array): Promise { + async getCastRemove(fid: number, hash: Uint8Array): Promise { const removesKey = makeCastRemovesKey(fid, hash); const messageTsHash = await this._db.get(removesKey); return getMessage(this._db, fid, UserPostfix.CastMessage, messageTsHash); } /** Gets all CastAdd messages for an fid */ - async getCastAddsByFid(fid: number, pageOptions: PageOptions = {}): Promise> { + async getCastAddsByFid(fid: number, pageOptions: PageOptions = {}): Promise> { const castMessagesPrefix = makeMessagePrimaryKey(fid, UserPostfix.CastMessage); - return getMessagesPageByPrefix(this._db, castMessagesPrefix, protobufs.isCastAddMessage, pageOptions); + return getMessagesPageByPrefix(this._db, castMessagesPrefix, isCastAddMessage, pageOptions); } /** Gets all CastRemove messages for an fid */ - async getCastRemovesByFid( - fid: number, - pageOptions: PageOptions = {} - ): Promise> { + async getCastRemovesByFid(fid: number, pageOptions: PageOptions = {}): Promise> { const castMessagesPrefix = makeMessagePrimaryKey(fid, UserPostfix.CastMessage); - return getMessagesPageByPrefix(this._db, castMessagesPrefix, protobufs.isCastRemoveMessage, pageOptions); + return getMessagesPageByPrefix(this._db, castMessagesPrefix, isCastRemoveMessage, pageOptions); } async getAllCastMessagesByFid( fid: number, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const castMessagesPrefix = makeMessagePrimaryKey(fid, UserPostfix.CastMessage); - const isCastMessage = ( - message: protobufs.Message - ): message is protobufs.CastAddMessage | protobufs.CastRemoveMessage => { - return protobufs.isCastAddMessage(message) || protobufs.isCastRemoveMessage(message); + const isCastMessage = (message: Message): message is CastAddMessage | CastRemoveMessage => { + return isCastAddMessage(message) || isCastRemoveMessage(message); }; return getMessagesPageByPrefix(this._db, castMessagesPrefix, isCastMessage, pageOptions); } /** Gets all CastAdd messages for a parent cast (fid and tsHash) */ - async getCastsByParent( - parentId: protobufs.CastId, - pageOptions: PageOptions = {} - ): Promise> { + async getCastsByParent(parentId: CastId, pageOptions: PageOptions = {}): Promise> { const prefix = makeCastsByParentKey(parentId); const iterator = getPageIteratorByPrefix(this._db, prefix, pageOptions); @@ -211,7 +215,7 @@ class CastStore { messageKeys.push(messageKey); } while (messageKeys.length < limit); - const messages = await getManyMessages(this._db, messageKeys); + const messages = await getManyMessages(this._db, messageKeys); if (!iteratorFinished) { await iterator.end(); // clear iterator if it has not finished @@ -222,10 +226,7 @@ class CastStore { } /** Gets all CastAdd messages for a mention (fid) */ - async getCastsByMention( - mentionFid: number, - pageOptions: PageOptions = {} - ): Promise> { + async getCastsByMention(mentionFid: number, pageOptions: PageOptions = {}): Promise> { const prefix = makeCastsByMentionKey(mentionFid); const iterator = getPageIteratorByPrefix(this._db, prefix, pageOptions); @@ -257,7 +258,7 @@ class CastStore { messageKeys.push(messageKey); } while (messageKeys.length < limit); - const messages = await getManyMessages(this._db, messageKeys); + const messages = await getManyMessages(this._db, messageKeys); if (!iteratorFinished) { await iterator.end(); // clear iterator if it has not finished @@ -268,8 +269,8 @@ class CastStore { } /** Merges a CastAdd or CastRemove message into the set */ - async merge(message: protobufs.Message): Promise { - if (!protobufs.isCastAddMessage(message) && !protobufs.isCastRemoveMessage(message)) { + async merge(message: Message): Promise { + if (!isCastAddMessage(message) && !isCastRemoveMessage(message)) { throw new HubError('bad_request.validation_failure', 'invalid message type'); } @@ -277,9 +278,9 @@ class CastStore { .acquire( message.data.fid.toString(), async () => { - if (protobufs.isCastAddMessage(message)) { + if (isCastAddMessage(message)) { return this.mergeAdd(message); - } else if (protobufs.isCastRemoveMessage(message)) { + } else if (isCastRemoveMessage(message)) { return this.mergeRemove(message); } else { throw new HubError('bad_request.validation_failure', 'invalid message type'); @@ -292,18 +293,18 @@ class CastStore { }); } - async revoke(message: protobufs.Message): HubAsyncResult { + async revoke(message: Message): HubAsyncResult { let txn = this._db.transaction(); - if (protobufs.isCastAddMessage(message)) { + if (isCastAddMessage(message)) { txn = this.deleteCastAddTransaction(txn, message); - } else if (protobufs.isCastRemoveMessage(message)) { + } else if (isCastRemoveMessage(message)) { txn = this.deleteCastRemoveTransaction(txn, message); } else { return err(new HubError('bad_request.invalid_param', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.REVOKE_MESSAGE, + type: HubEventType.REVOKE_MESSAGE, revokeMessageBody: { message }, }); } @@ -355,16 +356,16 @@ class CastStore { let txn = this._db.transaction(); - if (protobufs.isCastAddMessage(nextMessage.value)) { + if (isCastAddMessage(nextMessage.value)) { txn = this.deleteCastAddTransaction(txn, nextMessage.value); - } else if (protobufs.isCastRemoveMessage(nextMessage.value)) { + } else if (isCastRemoveMessage(nextMessage.value)) { txn = this.deleteCastRemoveTransaction(txn, nextMessage.value); } else { return err(new HubError('unknown', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.PRUNE_MESSAGE, + type: HubEventType.PRUNE_MESSAGE, pruneMessageBody: { message: nextMessage.value }, }); }; @@ -394,7 +395,7 @@ class CastStore { /* Private Methods */ /* -------------------------------------------------------------------------- */ - private async mergeAdd(message: protobufs.CastAddMessage): Promise { + private async mergeAdd(message: CastAddMessage): Promise { // Start RocksDB transaction let txn = this._db.transaction(); @@ -424,7 +425,7 @@ class CastStore { txn = this.putCastAddTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: [] }, }; @@ -436,7 +437,7 @@ class CastStore { return result.value; } - private async mergeRemove(message: protobufs.CastRemoveMessage): Promise { + private async mergeRemove(message: CastRemoveMessage): Promise { // Define cast hash for lookups const removeTargetHash = message.data.castRemoveBody.targetHash; @@ -445,7 +446,7 @@ class CastStore { throw tsHash.error; } - const mergeConflicts: (protobufs.CastAddMessage | protobufs.CastRemoveMessage)[] = []; + const mergeConflicts: (CastAddMessage | CastRemoveMessage)[] = []; // Start RocksDB transaction let txn = this._db.transaction(); @@ -467,7 +468,7 @@ class CastStore { // If the remove tsHash exists but with a lower order than the new CastRemove // tsHash, retrieve the full CastRemove message and delete it as part of the // RocksDB transaction - const existingRemove = await getMessage( + const existingRemove = await getMessage( this._db, message.data.fid, UserPostfix.CastMessage, @@ -487,7 +488,7 @@ class CastStore { // If the add tsHash exists, retrieve the full CastAdd message and delete it as // part of the RocksDB transaction if (castAddTsHash.isOk()) { - const existingAdd = await getMessage( + const existingAdd = await getMessage( this._db, message.data.fid, UserPostfix.CastMessage, @@ -501,7 +502,7 @@ class CastStore { txn = this.putCastRemoveTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: mergeConflicts }, }; @@ -514,7 +515,7 @@ class CastStore { } /* Builds a RocksDB transaction to insert a CastAdd message and construct its indices */ - private putCastAddTransaction(txn: Transaction, message: protobufs.CastAddMessage): Transaction { + private putCastAddTransaction(txn: Transaction, message: CastAddMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -543,7 +544,7 @@ class CastStore { } /* Builds a RocksDB transaction to remove a CastAdd message and delete its indices */ - private deleteCastAddTransaction(txn: Transaction, message: protobufs.CastAddMessage): Transaction { + private deleteCastAddTransaction(txn: Transaction, message: CastAddMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -567,7 +568,7 @@ class CastStore { } /* Builds a RocksDB transaction to insert a CastRemove message and construct its indices */ - private putCastRemoveTransaction(txn: Transaction, message: protobufs.CastRemoveMessage): Transaction { + private putCastRemoveTransaction(txn: Transaction, message: CastRemoveMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -584,7 +585,7 @@ class CastStore { } /* Builds a RocksDB transaction to remove a CastRemove message and delete its indices */ - private deleteCastRemoveTransaction(txn: Transaction, message: protobufs.CastRemoveMessage): Transaction { + private deleteCastRemoveTransaction(txn: Transaction, message: CastRemoveMessage): Transaction { // Deletes the message key from the CastRemoves set index const removesKey = makeCastRemovesKey(message.data.fid, message.data.castRemoveBody.targetHash); txn = txn.del(removesKey); diff --git a/apps/hubble/src/storage/stores/reactionStore.test.ts b/apps/hubble/src/storage/stores/reactionStore.test.ts index 6b72368e6b..4f477e2b42 100644 --- a/apps/hubble/src/storage/stores/reactionStore.test.ts +++ b/apps/hubble/src/storage/stores/reactionStore.test.ts @@ -1,5 +1,20 @@ -import * as protobufs from '@farcaster/protobufs'; -import { Factories, HubError, bytesDecrement, bytesIncrement, getFarcasterTime } from '@farcaster/utils'; +import { + Factories, + HubError, + bytesDecrement, + bytesIncrement, + getFarcasterTime, + ReactionAddMessage, + CastId, + MergeMessageHubEvent, + Message, + MessageType, + PruneMessageHubEvent, + ReactionBody, + ReactionRemoveMessage, + ReactionType, + RevokeMessageHubEvent, +} from '@farcaster/hub-nodejs'; import { err, ok } from 'neverthrow'; import { jestRocksDB } from '~/storage/db/jestUtils'; import { getMessage, makeTsHash } from '~/storage/db/message'; @@ -15,14 +30,14 @@ const set = new ReactionStore(db, eventHandler); const fid = Factories.Fid.build(); const castId = Factories.CastId.build(); -let reactionAdd: protobufs.ReactionAddMessage; -let reactionRemove: protobufs.ReactionRemoveMessage; -let reactionAddRecast: protobufs.ReactionAddMessage; -let reactionRemoveRecast: protobufs.ReactionRemoveMessage; +let reactionAdd: ReactionAddMessage; +let reactionRemove: ReactionRemoveMessage; +let reactionAddRecast: ReactionAddMessage; +let reactionRemoveRecast: ReactionRemoveMessage; beforeAll(async () => { const likeBody = Factories.ReactionBody.build({ - type: protobufs.ReactionType.LIKE, + type: ReactionType.LIKE, targetCastId: castId, }); @@ -35,7 +50,7 @@ beforeAll(async () => { }); const recastBody = Factories.ReactionBody.build({ - type: protobufs.ReactionType.RECAST, + type: ReactionType.RECAST, targetCastId: castId, }); @@ -66,7 +81,7 @@ describe('getReactionAdd', () => { test('fails if the wrong reaction type is provided', async () => { await set.merge(reactionAdd); - await expect(set.getReactionAdd(fid, protobufs.ReactionType.RECAST, castId)).rejects.toThrow(HubError); + await expect(set.getReactionAdd(fid, ReactionType.RECAST, castId)).rejects.toThrow(HubError); }); test('fails if the wrong target is provided', async () => { @@ -101,7 +116,7 @@ describe('getReactionRemove', () => { test('fails if the wrong reaction type is provided', async () => { await set.merge(reactionRemove); - await expect(set.getReactionRemove(fid, protobufs.ReactionType.RECAST, castId)).rejects.toThrow(HubError); + await expect(set.getReactionRemove(fid, ReactionType.RECAST, castId)).rejects.toThrow(HubError); }); test('fails if the wrong target is provided', async () => { @@ -143,11 +158,11 @@ describe('getReactionAddsByFid', () => { test('returns ReactionAdd messages by type', async () => { await set.merge(reactionAdd); await set.merge(reactionAddRecast); - await expect(set.getReactionAddsByFid(fid, protobufs.ReactionType.LIKE)).resolves.toEqual({ + await expect(set.getReactionAddsByFid(fid, ReactionType.LIKE)).resolves.toEqual({ messages: [reactionAdd], nextPageToken: undefined, }); - await expect(set.getReactionAddsByFid(fid, protobufs.ReactionType.RECAST)).resolves.toEqual({ + await expect(set.getReactionAddsByFid(fid, ReactionType.RECAST)).resolves.toEqual({ messages: [reactionAddRecast], nextPageToken: undefined, }); @@ -241,20 +256,20 @@ describe('getReactionsByTargetCast', () => { describe('with type', () => { test('returns empty array if no reactions exist', async () => { - const byCast = await set.getReactionsByTargetCast(castId, protobufs.ReactionType.LIKE); + const byCast = await set.getReactionsByTargetCast(castId, ReactionType.LIKE); expect(byCast).toEqual({ messages: [], nextPageToken: undefined }); }); test('returns empty array if reactions exist for the target with different type', async () => { await set.merge(reactionAddRecast); - const byCast = await set.getReactionsByTargetCast(castId, protobufs.ReactionType.LIKE); + const byCast = await set.getReactionsByTargetCast(castId, ReactionType.LIKE); expect(byCast).toEqual({ messages: [], nextPageToken: undefined }); }); test('returns empty array if reactions exist for the type with different target', async () => { await set.merge(reactionAdd); const unknownCastId = Factories.CastId.build(); - const byCast = await set.getReactionsByTargetCast(unknownCastId, protobufs.ReactionType.LIKE); + const byCast = await set.getReactionsByTargetCast(unknownCastId, ReactionType.LIKE); expect(byCast).toEqual({ messages: [], nextPageToken: undefined }); }); @@ -262,37 +277,37 @@ describe('getReactionsByTargetCast', () => { const reactionLike2 = await Factories.ReactionAddMessage.create({ data: { timestamp: reactionAddRecast.data.timestamp + 1, - reactionBody: { type: protobufs.ReactionType.LIKE, targetCastId: castId }, + reactionBody: { type: ReactionType.LIKE, targetCastId: castId }, }, }); await set.merge(reactionLike2); await set.merge(reactionAdd); await set.merge(reactionAddRecast); - const results1 = await set.getReactionsByTargetCast(castId, protobufs.ReactionType.LIKE); + const results1 = await set.getReactionsByTargetCast(castId, ReactionType.LIKE); expect(results1).toEqual({ messages: [reactionAdd, reactionLike2], nextPageToken: undefined }); - const results2 = await set.getReactionsByTargetCast(castId, protobufs.ReactionType.LIKE, { + const results2 = await set.getReactionsByTargetCast(castId, ReactionType.LIKE, { reverse: true, pageSize: 1, }); expect(results2.messages).toEqual([reactionLike2]); - const results3 = await set.getReactionsByTargetCast(castId, protobufs.ReactionType.LIKE, { + const results3 = await set.getReactionsByTargetCast(castId, ReactionType.LIKE, { reverse: true, pageToken: results2.nextPageToken, }); expect(results3).toEqual({ messages: [reactionAdd], nextPageToken: undefined }); - const results4 = await set.getReactionsByTargetCast(castId, protobufs.ReactionType.RECAST); + const results4 = await set.getReactionsByTargetCast(castId, ReactionType.RECAST); expect(results4).toEqual({ messages: [reactionAddRecast], nextPageToken: undefined }); }); }); }); describe('merge', () => { - let mergeEvents: [protobufs.Message | undefined, protobufs.Message[]][] = []; + let mergeEvents: [Message | undefined, Message[]][] = []; - const mergeMessageHandler = (event: protobufs.MergeMessageHubEvent) => { + const mergeMessageHandler = (event: MergeMessageHubEvent) => { const { message, deletedMessages } = event.mergeMessageBody; mergeEvents.push([message, deletedMessages ?? []]); }; @@ -309,57 +324,41 @@ describe('merge', () => { eventHandler.off('mergeMessage', mergeMessageHandler); }); - const assertReactionExists = async (message: protobufs.ReactionAddMessage | protobufs.ReactionRemoveMessage) => { + const assertReactionExists = async (message: ReactionAddMessage | ReactionRemoveMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.ReactionMessage, tsHash)).resolves.toEqual(message); }; - const assertReactionDoesNotExist = async ( - message: protobufs.ReactionAddMessage | protobufs.ReactionRemoveMessage - ) => { + const assertReactionDoesNotExist = async (message: ReactionAddMessage | ReactionRemoveMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.ReactionMessage, tsHash)).rejects.toThrow(HubError); }; - const assertReactionAddWins = async (message: protobufs.ReactionAddMessage) => { + const assertReactionAddWins = async (message: ReactionAddMessage) => { await assertReactionExists(message); await expect( - set.getReactionAdd( - fid, - message.data.reactionBody.type, - message.data.reactionBody.targetCastId as protobufs.CastId - ) + set.getReactionAdd(fid, message.data.reactionBody.type, message.data.reactionBody.targetCastId as CastId) ).resolves.toEqual(message); + await expect(set.getReactionsByTargetCast(message.data.reactionBody.targetCastId as CastId)).resolves.toEqual({ + messages: [message], + nextPageToken: undefined, + }); await expect( - set.getReactionsByTargetCast(message.data.reactionBody.targetCastId as protobufs.CastId) - ).resolves.toEqual({ messages: [message], nextPageToken: undefined }); - await expect( - set.getReactionRemove( - fid, - message.data.reactionBody.type, - message.data.reactionBody.targetCastId as protobufs.CastId - ) + set.getReactionRemove(fid, message.data.reactionBody.type, message.data.reactionBody.targetCastId as CastId) ).rejects.toThrow(HubError); }; - const assertReactionRemoveWins = async (message: protobufs.ReactionRemoveMessage) => { + const assertReactionRemoveWins = async (message: ReactionRemoveMessage) => { await assertReactionExists(message); await expect( - set.getReactionRemove( - fid, - message.data.reactionBody.type, - message.data.reactionBody.targetCastId as protobufs.CastId - ) + set.getReactionRemove(fid, message.data.reactionBody.type, message.data.reactionBody.targetCastId as CastId) ).resolves.toEqual(message); + await expect(set.getReactionsByTargetCast(message.data.reactionBody.targetCastId as CastId)).resolves.toEqual({ + messages: [], + nextPageToken: undefined, + }); await expect( - set.getReactionsByTargetCast(message.data.reactionBody.targetCastId as protobufs.CastId) - ).resolves.toEqual({ messages: [], nextPageToken: undefined }); - await expect( - set.getReactionAdd( - fid, - reactionAdd.data.reactionBody.type, - message.data.reactionBody.targetCastId as protobufs.CastId - ) + set.getReactionAdd(fid, reactionAdd.data.reactionBody.type, message.data.reactionBody.targetCastId as CastId) ).rejects.toThrow(HubError); }; @@ -389,7 +388,7 @@ describe('merge', () => { }); describe('with a conflicting ReactionAdd with different timestamps', () => { - let reactionAddLater: protobufs.ReactionAddMessage; + let reactionAddLater: ReactionAddMessage; beforeAll(async () => { reactionAddLater = await Factories.ReactionAddMessage.create({ @@ -422,7 +421,7 @@ describe('merge', () => { }); describe('with a conflicting ReactionAdd with identical timestamps', () => { - let reactionAddLater: protobufs.ReactionAddMessage; + let reactionAddLater: ReactionAddMessage; beforeAll(async () => { reactionAddLater = await Factories.ReactionAddMessage.create({ @@ -542,7 +541,7 @@ describe('merge', () => { }); describe('with a conflicting ReactionRemove with different timestamps', () => { - let reactionRemoveLater: protobufs.ReactionRemoveMessage; + let reactionRemoveLater: ReactionRemoveMessage; beforeAll(async () => { reactionRemoveLater = await Factories.ReactionRemoveMessage.create({ @@ -575,7 +574,7 @@ describe('merge', () => { }); describe('with a conflicting ReactionRemove with identical timestamps', () => { - let reactionRemoveLater: protobufs.ReactionRemoveMessage; + let reactionRemoveLater: ReactionRemoveMessage; beforeAll(async () => { reactionRemoveLater = await Factories.ReactionRemoveMessage.create({ @@ -626,7 +625,7 @@ describe('merge', () => { data: { ...reactionRemove.data, timestamp: reactionRemove.data.timestamp + 1, - type: protobufs.MessageType.REACTION_ADD, + type: MessageType.REACTION_ADD, }, }); @@ -642,7 +641,7 @@ describe('merge', () => { describe('with conflicting ReactionAdd with identical timestamps', () => { test('succeeds with a lower hash', async () => { const reactionAddLater = await Factories.ReactionAddMessage.create({ - data: { ...reactionRemove.data, type: protobufs.MessageType.REACTION_ADD }, + data: { ...reactionRemove.data, type: MessageType.REACTION_ADD }, hash: bytesIncrement(reactionRemove.hash)._unsafeUnwrap(), }); @@ -660,7 +659,7 @@ describe('merge', () => { test('succeeds with a higher hash', async () => { const reactionAddEarlier = await Factories.ReactionAddMessage.create({ - data: { ...reactionRemove.data, type: protobufs.MessageType.REACTION_ADD }, + data: { ...reactionRemove.data, type: MessageType.REACTION_ADD }, hash: bytesDecrement(reactionRemove.hash)._unsafeUnwrap(), }); @@ -680,9 +679,9 @@ describe('merge', () => { }); describe('revoke', () => { - let revokedMessages: protobufs.Message[] = []; + let revokedMessages: Message[] = []; - const revokeMessageHandler = (event: protobufs.RevokeMessageHubEvent) => { + const revokeMessageHandler = (event: RevokeMessageHubEvent) => { revokedMessages.push(event.revokeMessageBody.message); }; @@ -711,11 +710,7 @@ describe('revoke', () => { expect(result.isOk()).toBeTruthy(); expect(result._unsafeUnwrap()).toBeGreaterThan(0); await expect( - set.getReactionAdd( - fid, - reactionAdd.data.reactionBody.type, - reactionAdd.data.reactionBody.targetCastId as protobufs.CastId - ) + set.getReactionAdd(fid, reactionAdd.data.reactionBody.type, reactionAdd.data.reactionBody.targetCastId as CastId) ).rejects.toThrow(); expect(revokedMessages).toEqual([reactionAdd]); }); @@ -729,7 +724,7 @@ describe('revoke', () => { set.getReactionRemove( fid, reactionRemove.data.reactionBody.type, - reactionRemove.data.reactionBody.targetCastId as protobufs.CastId + reactionRemove.data.reactionBody.targetCastId as CastId ) ).rejects.toThrow(); expect(revokedMessages).toEqual([reactionRemove]); @@ -740,20 +735,16 @@ describe('revoke', () => { expect(result.isOk()).toBeTruthy(); expect(result._unsafeUnwrap()).toBeGreaterThan(0); await expect( - set.getReactionAdd( - fid, - reactionAdd.data.reactionBody.type, - reactionAdd.data.reactionBody.targetCastId as protobufs.CastId - ) + set.getReactionAdd(fid, reactionAdd.data.reactionBody.type, reactionAdd.data.reactionBody.targetCastId as CastId) ).rejects.toThrow(); expect(revokedMessages).toEqual([reactionAdd]); }); }); describe('pruneMessages', () => { - let prunedMessages: protobufs.Message[]; + let prunedMessages: Message[]; - const pruneMessageListener = (event: protobufs.PruneMessageHubEvent) => { + const pruneMessageListener = (event: PruneMessageHubEvent) => { prunedMessages.push(event.pruneMessageBody.message); }; @@ -769,30 +760,30 @@ describe('pruneMessages', () => { eventHandler.off('pruneMessage', pruneMessageListener); }); - let add1: protobufs.ReactionAddMessage; - let add2: protobufs.ReactionAddMessage; - let add3: protobufs.ReactionAddMessage; - let add4: protobufs.ReactionAddMessage; - let add5: protobufs.ReactionAddMessage; - let addOld1: protobufs.ReactionAddMessage; - let addOld2: protobufs.ReactionAddMessage; + let add1: ReactionAddMessage; + let add2: ReactionAddMessage; + let add3: ReactionAddMessage; + let add4: ReactionAddMessage; + let add5: ReactionAddMessage; + let addOld1: ReactionAddMessage; + let addOld2: ReactionAddMessage; - let remove1: protobufs.ReactionRemoveMessage; - let remove2: protobufs.ReactionRemoveMessage; - let remove3: protobufs.ReactionRemoveMessage; - let remove4: protobufs.ReactionRemoveMessage; - let remove5: protobufs.ReactionRemoveMessage; - let removeOld3: protobufs.ReactionRemoveMessage; + let remove1: ReactionRemoveMessage; + let remove2: ReactionRemoveMessage; + let remove3: ReactionRemoveMessage; + let remove4: ReactionRemoveMessage; + let remove5: ReactionRemoveMessage; + let removeOld3: ReactionRemoveMessage; - const generateAddWithTimestamp = async (fid: number, timestamp: number): Promise => { + const generateAddWithTimestamp = async (fid: number, timestamp: number): Promise => { return Factories.ReactionAddMessage.create({ data: { fid, timestamp } }); }; const generateRemoveWithTimestamp = async ( fid: number, timestamp: number, - addBody?: protobufs.ReactionBody - ): Promise => { + addBody?: ReactionBody + ): Promise => { return Factories.ReactionRemoveMessage.create({ data: { fid, @@ -845,7 +836,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([add1, add2]); - for (const message of prunedMessages as protobufs.ReactionAddMessage[]) { + for (const message of prunedMessages as ReactionAddMessage[]) { const getAdd = () => sizePrunedStore.getReactionAdd( fid, @@ -868,7 +859,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([remove1, remove2]); - for (const message of prunedMessages as protobufs.ReactionRemoveMessage[]) { + for (const message of prunedMessages as ReactionRemoveMessage[]) { const getRemove = () => sizePrunedStore.getReactionRemove( fid, diff --git a/apps/hubble/src/storage/stores/reactionStore.ts b/apps/hubble/src/storage/stores/reactionStore.ts index 392092f65c..206f7c0df4 100644 --- a/apps/hubble/src/storage/stores/reactionStore.ts +++ b/apps/hubble/src/storage/stores/reactionStore.ts @@ -1,5 +1,19 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesCompare, getFarcasterTime, HubAsyncResult, HubError, isHubError } from '@farcaster/utils'; +import { + bytesCompare, + CastId, + getFarcasterTime, + HubAsyncResult, + HubError, + HubEventType, + isHubError, + isReactionAddMessage, + isReactionRemoveMessage, + Message, + MessageType, + ReactionAddMessage, + ReactionRemoveMessage, + ReactionType, +} from '@farcaster/hub-nodejs'; import AsyncLock from 'async-lock'; import { err, ok, ResultAsync } from 'neverthrow'; import { @@ -41,7 +55,7 @@ const PRUNE_TIME_LIMIT_DEFAULT = 60 * 60 * 24 * 90; // 90 days * * @returns RocksDB key of the form :::: */ -const makeReactionAddsKey = (fid: number, type?: protobufs.ReactionType, targetId?: protobufs.CastId): Buffer => { +const makeReactionAddsKey = (fid: number, type?: ReactionType, targetId?: CastId): Buffer => { if (targetId && !type) { throw new HubError('bad_request.validation_failure', 'targetId provided without type'); } @@ -63,7 +77,7 @@ const makeReactionAddsKey = (fid: number, type?: protobufs.ReactionType, targetI * * @returns RocksDB key of the form :::: */ -const makeReactionRemovesKey = (fid: number, type?: protobufs.ReactionType, targetId?: protobufs.CastId): Buffer => { +const makeReactionRemovesKey = (fid: number, type?: ReactionType, targetId?: CastId): Buffer => { if (targetId && !type) { throw new HubError('bad_request.validation_failure', 'targetId provided without type'); } @@ -85,7 +99,7 @@ const makeReactionRemovesKey = (fid: number, type?: protobufs.ReactionType, targ * * @returns RocksDB index key of the form ::: */ -const makeReactionsByTargetKey = (targetId: protobufs.CastId, fid?: number, tsHash?: Uint8Array): Buffer => { +const makeReactionsByTargetKey = (targetId: CastId, fid?: number, tsHash?: Uint8Array): Buffer => { if (fid && !tsHash) { throw new HubError('bad_request.validation_failure', 'fid provided without tsHash'); } @@ -152,11 +166,7 @@ class ReactionStore { * * @returns the ReactionAdd Model if it exists, undefined otherwise */ - async getReactionAdd( - fid: number, - type: protobufs.ReactionType, - castId: protobufs.CastId - ): Promise { + async getReactionAdd(fid: number, type: ReactionType, castId: CastId): Promise { const reactionAddsSetKey = makeReactionAddsKey(fid, type, castId); const reactionMessageKey = await this._db.get(reactionAddsSetKey); @@ -171,11 +181,7 @@ class ReactionStore { * @param castId id of the cast being reacted to * @returns the ReactionRemove message if it exists, undefined otherwise */ - async getReactionRemove( - fid: number, - type: protobufs.ReactionType, - castId: protobufs.CastId - ): Promise { + async getReactionRemove(fid: number, type: ReactionType, castId: CastId): Promise { const reactionRemovesKey = makeReactionRemovesKey(fid, type, castId); const reactionMessageKey = await this._db.get(reactionRemovesKey); @@ -185,12 +191,12 @@ class ReactionStore { /** Finds all ReactionAdd Messages by iterating through the prefixes */ async getReactionAddsByFid( fid: number, - type?: protobufs.ReactionType, + type?: ReactionType, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const prefix = makeMessagePrimaryKey(fid, UserPostfix.ReactionMessage); - const filter = (message: protobufs.Message): message is protobufs.ReactionAddMessage => { - return protobufs.isReactionAddMessage(message) && (type ? message.data.reactionBody.type === type : true); + const filter = (message: Message): message is ReactionAddMessage => { + return isReactionAddMessage(message) && (type ? message.data.reactionBody.type === type : true); }; return getMessagesPageByPrefix(this._db, prefix, filter, pageOptions); } @@ -198,12 +204,12 @@ class ReactionStore { /** Finds all ReactionRemove Messages by iterating through the prefixes */ async getReactionRemovesByFid( fid: number, - type?: protobufs.ReactionType, + type?: ReactionType, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const prefix = makeMessagePrimaryKey(fid, UserPostfix.ReactionMessage); - const filter = (message: protobufs.Message): message is protobufs.ReactionRemoveMessage => { - return protobufs.isReactionRemoveMessage(message) && (type ? message.data.reactionBody.type === type : true); + const filter = (message: Message): message is ReactionRemoveMessage => { + return isReactionRemoveMessage(message) && (type ? message.data.reactionBody.type === type : true); }; return getMessagesPageByPrefix(this._db, prefix, filter, pageOptions); } @@ -211,22 +217,20 @@ class ReactionStore { async getAllReactionMessagesByFid( fid: number, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const prefix = makeMessagePrimaryKey(fid, UserPostfix.ReactionMessage); - const filter = ( - message: protobufs.Message - ): message is protobufs.ReactionAddMessage | protobufs.ReactionRemoveMessage => { - return protobufs.isReactionAddMessage(message) || protobufs.isReactionRemoveMessage(message); + const filter = (message: Message): message is ReactionAddMessage | ReactionRemoveMessage => { + return isReactionAddMessage(message) || isReactionRemoveMessage(message); }; return getMessagesPageByPrefix(this._db, prefix, filter, pageOptions); } /** Finds all ReactionAdds that point to a specific target by iterating through the prefixes */ async getReactionsByTargetCast( - castId: protobufs.CastId, - type?: protobufs.ReactionType, + castId: CastId, + type?: ReactionType, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const prefix = makeReactionsByTargetKey(castId); const iterator = getPageIteratorByPrefix(this._db, prefix, pageOptions); @@ -261,7 +265,7 @@ class ReactionStore { } } while (messageKeys.length < limit); - const messages = await getManyMessages(this._db, messageKeys); + const messages = await getManyMessages(this._db, messageKeys); if (!iteratorFinished) { await iterator.end(); // clear iterator if it has not finished @@ -272,8 +276,8 @@ class ReactionStore { } /** Merges a ReactionAdd or ReactionRemove message into the ReactionStore */ - async merge(message: protobufs.Message): Promise { - if (!protobufs.isReactionAddMessage(message) && !protobufs.isReactionRemoveMessage(message)) { + async merge(message: Message): Promise { + if (!isReactionAddMessage(message) && !isReactionRemoveMessage(message)) { throw new HubError('bad_request.validation_failure', 'invalid message type'); } @@ -281,9 +285,9 @@ class ReactionStore { .acquire( message.data.fid.toString(), async () => { - if (protobufs.isReactionAddMessage(message)) { + if (isReactionAddMessage(message)) { return this.mergeAdd(message); - } else if (protobufs.isReactionRemoveMessage(message)) { + } else if (isReactionRemoveMessage(message)) { return this.mergeRemove(message); } else { throw new HubError('bad_request.validation_failure', 'invalid message type'); @@ -296,18 +300,18 @@ class ReactionStore { }); } - async revoke(message: protobufs.Message): HubAsyncResult { + async revoke(message: Message): HubAsyncResult { let txn = this._db.transaction(); - if (protobufs.isReactionAddMessage(message)) { + if (isReactionAddMessage(message)) { txn = this.deleteReactionAddTransaction(txn, message); - } else if (protobufs.isReactionRemoveMessage(message)) { + } else if (isReactionRemoveMessage(message)) { txn = this.deleteReactionRemoveTransaction(txn, message); } else { return err(new HubError('bad_request.invalid_param', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.REVOKE_MESSAGE, + type: HubEventType.REVOKE_MESSAGE, revokeMessageBody: { message }, }); } @@ -359,16 +363,16 @@ class ReactionStore { let txn = this._db.transaction(); - if (protobufs.isReactionAddMessage(nextMessage.value)) { + if (isReactionAddMessage(nextMessage.value)) { txn = this.deleteReactionAddTransaction(txn, nextMessage.value); - } else if (protobufs.isReactionRemoveMessage(nextMessage.value)) { + } else if (isReactionRemoveMessage(nextMessage.value)) { txn = this.deleteReactionRemoveTransaction(txn, nextMessage.value); } else { return err(new HubError('unknown', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.PRUNE_MESSAGE, + type: HubEventType.PRUNE_MESSAGE, pruneMessageBody: { message: nextMessage.value }, }); }; @@ -398,7 +402,7 @@ class ReactionStore { /* Private Methods */ /* -------------------------------------------------------------------------- */ - private async mergeAdd(message: protobufs.ReactionAddMessage): Promise { + private async mergeAdd(message: ReactionAddMessage): Promise { const mergeConflicts = await this.getMergeConflicts(message); if (mergeConflicts.isErr()) { throw mergeConflicts.error; @@ -411,7 +415,7 @@ class ReactionStore { txn = this.putReactionAddTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: mergeConflicts.value }, }; @@ -423,7 +427,7 @@ class ReactionStore { return result.value; } - private async mergeRemove(message: protobufs.ReactionRemoveMessage): Promise { + private async mergeRemove(message: ReactionRemoveMessage): Promise { const mergeConflicts = await this.getMergeConflicts(message); if (mergeConflicts.isErr()) { @@ -437,7 +441,7 @@ class ReactionStore { txn = this.putReactionRemoveTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: mergeConflicts.value }, }; @@ -450,9 +454,9 @@ class ReactionStore { } private reactionMessageCompare( - aType: protobufs.MessageType.REACTION_ADD | protobufs.MessageType.REACTION_REMOVE, + aType: MessageType.REACTION_ADD | MessageType.REACTION_REMOVE, aTsHash: Uint8Array, - bType: protobufs.MessageType.REACTION_ADD | protobufs.MessageType.REACTION_REMOVE, + bType: MessageType.REACTION_ADD | MessageType.REACTION_REMOVE, bTsHash: Uint8Array ): number { // Compare timestamps (first 4 bytes of tsHash) to enforce Last-Write-Wins @@ -462,9 +466,9 @@ class ReactionStore { } // Compare message types to enforce that RemoveWins in case of LWW ties. - if (aType === protobufs.MessageType.REACTION_REMOVE && bType === protobufs.MessageType.REACTION_ADD) { + if (aType === MessageType.REACTION_REMOVE && bType === MessageType.REACTION_ADD) { return 1; - } else if (aType === protobufs.MessageType.REACTION_ADD && bType === protobufs.MessageType.REACTION_REMOVE) { + } else if (aType === MessageType.REACTION_ADD && bType === MessageType.REACTION_REMOVE) { return -1; } @@ -479,8 +483,8 @@ class ReactionStore { * @returns a RocksDB transaction if keys must be added or removed, undefined otherwise */ private async getMergeConflicts( - message: protobufs.ReactionAddMessage | protobufs.ReactionRemoveMessage - ): HubAsyncResult<(protobufs.ReactionAddMessage | protobufs.ReactionRemoveMessage)[]> { + message: ReactionAddMessage | ReactionRemoveMessage + ): HubAsyncResult<(ReactionAddMessage | ReactionRemoveMessage)[]> { const castId = message.data.reactionBody.targetCastId; if (!castId) { throw new HubError('bad_request.validation_failure', 'targetCastId is missing'); @@ -491,7 +495,7 @@ class ReactionStore { throw tsHash.error; } - const conflicts: (protobufs.ReactionAddMessage | protobufs.ReactionRemoveMessage)[] = []; + const conflicts: (ReactionAddMessage | ReactionRemoveMessage)[] = []; // Checks if there is a remove timestamp hash for this reaction const reactionRemoveKey = makeReactionRemovesKey(message.data.fid, message.data.reactionBody.type, castId); @@ -499,7 +503,7 @@ class ReactionStore { if (reactionRemoveTsHash.isOk()) { const removeCompare = this.reactionMessageCompare( - protobufs.MessageType.REACTION_REMOVE, + MessageType.REACTION_REMOVE, new Uint8Array(reactionRemoveTsHash.value), message.data.type, tsHash.value @@ -511,7 +515,7 @@ class ReactionStore { } else { // If the existing remove has a lower order than the new message, retrieve the full // ReactionRemove message and delete it as part of the RocksDB transaction - const existingRemove = await getMessage( + const existingRemove = await getMessage( this._db, message.data.fid, UserPostfix.ReactionMessage, @@ -527,7 +531,7 @@ class ReactionStore { if (reactionAddTsHash.isOk()) { const addCompare = this.reactionMessageCompare( - protobufs.MessageType.REACTION_ADD, + MessageType.REACTION_ADD, new Uint8Array(reactionAddTsHash.value), message.data.type, tsHash.value @@ -539,7 +543,7 @@ class ReactionStore { } else { // If the existing add has a lower order than the new message, retrieve the full // ReactionAdd message and delete it as part of the RocksDB transaction - const existingAdd = await getMessage( + const existingAdd = await getMessage( this._db, message.data.fid, UserPostfix.ReactionMessage, @@ -554,12 +558,12 @@ class ReactionStore { private deleteManyTransaction( txn: Transaction, - messages: (protobufs.ReactionAddMessage | protobufs.ReactionRemoveMessage)[] + messages: (ReactionAddMessage | ReactionRemoveMessage)[] ): Transaction { for (const message of messages) { - if (protobufs.isReactionAddMessage(message)) { + if (isReactionAddMessage(message)) { txn = this.deleteReactionAddTransaction(txn, message); - } else if (protobufs.isReactionRemoveMessage(message)) { + } else if (isReactionRemoveMessage(message)) { txn = this.deleteReactionRemoveTransaction(txn, message); } } @@ -567,7 +571,7 @@ class ReactionStore { } /* Builds a RocksDB transaction to insert a ReactionAdd message and construct its indices */ - private putReactionAddTransaction(txn: Transaction, message: protobufs.ReactionAddMessage): Transaction { + private putReactionAddTransaction(txn: Transaction, message: ReactionAddMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -597,7 +601,7 @@ class ReactionStore { } /* Builds a RocksDB transaction to remove a ReactionAdd message and delete its indices */ - private deleteReactionAddTransaction(txn: Transaction, message: protobufs.ReactionAddMessage): Transaction { + private deleteReactionAddTransaction(txn: Transaction, message: ReactionAddMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -621,7 +625,7 @@ class ReactionStore { } /* Builds a RocksDB transaction to insert a ReactionRemove message and construct its indices */ - private putReactionRemoveTransaction(txn: Transaction, message: protobufs.ReactionRemoveMessage): Transaction { + private putReactionRemoveTransaction(txn: Transaction, message: ReactionRemoveMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -643,7 +647,7 @@ class ReactionStore { } /* Builds a RocksDB transaction to remove a ReactionRemove message and delete its indices */ - private deleteReactionRemoveTransaction(txn: Transaction, message: protobufs.ReactionRemoveMessage): Transaction { + private deleteReactionRemoveTransaction(txn: Transaction, message: ReactionRemoveMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; diff --git a/apps/hubble/src/storage/stores/signerStore.test.ts b/apps/hubble/src/storage/stores/signerStore.test.ts index 559269c68c..f574f1f854 100644 --- a/apps/hubble/src/storage/stores/signerStore.test.ts +++ b/apps/hubble/src/storage/stores/signerStore.test.ts @@ -1,5 +1,19 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesDecrement, bytesIncrement, Eip712Signer, Factories, getFarcasterTime, HubError } from '@farcaster/utils'; +import { + bytesDecrement, + bytesIncrement, + Eip712Signer, + Factories, + getFarcasterTime, + HubError, + IdRegistryEvent, + MergeIdRegistryEventHubEvent, + MergeMessageHubEvent, + Message, + PruneMessageHubEvent, + RevokeMessageHubEvent, + SignerAddMessage, + SignerRemoveMessage, +} from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import { getMessage, makeFidKey, makeTsHash } from '~/storage/db/message'; import { UserPostfix } from '~/storage/db/types'; @@ -22,10 +36,10 @@ let custody1Address: Uint8Array; let custody2: Eip712Signer; let custody2Address: Uint8Array; -let custody1Event: protobufs.IdRegistryEvent; -let custody2Event: protobufs.IdRegistryEvent; -let signerAdd: protobufs.SignerAddMessage; -let signerRemove: protobufs.SignerRemoveMessage; +let custody1Event: IdRegistryEvent; +let custody2Event: IdRegistryEvent; +let signerAdd: SignerAddMessage; +let signerRemove: SignerRemoveMessage; beforeAll(async () => { signerKey = (await signer.getSignerKey())._unsafeUnwrap(); @@ -104,9 +118,9 @@ describe('getSignerAddsByFid', () => { }); describe('with messages', () => { - let signerAdd2: protobufs.SignerAddMessage; - let signerAdd3: protobufs.SignerAddMessage; - let signerRemove4: protobufs.SignerRemoveMessage; + let signerAdd2: SignerAddMessage; + let signerAdd3: SignerAddMessage; + let signerRemove4: SignerRemoveMessage; beforeAll(async () => { signerAdd2 = await Factories.SignerAddMessage.create( @@ -217,8 +231,8 @@ describe('getSignerRemovesByFid', () => { }); describe('with messages', () => { - let signerRemove2: protobufs.SignerRemoveMessage; - let signerAdd3: protobufs.SignerAddMessage; + let signerRemove2: SignerRemoveMessage; + let signerAdd3: SignerAddMessage; beforeAll(async () => { signerRemove2 = await Factories.SignerRemoveMessage.create( @@ -279,8 +293,8 @@ describe('getAllSignerMessagesByFid', () => { }); describe('with messages', () => { - let signerRemove2: protobufs.SignerRemoveMessage; - let signerAdd3: protobufs.SignerAddMessage; + let signerRemove2: SignerRemoveMessage; + let signerAdd3: SignerAddMessage; beforeAll(async () => { signerRemove2 = await Factories.SignerRemoveMessage.create( @@ -337,9 +351,9 @@ describe('getAllSignerMessagesByFid', () => { // TODO: write test cases for cyclical custody event transfers describe('mergeIdRegistryEvent', () => { - let mergedContractEvents: protobufs.IdRegistryEvent[]; + let mergedContractEvents: IdRegistryEvent[]; - const handleMergeEvent = (event: protobufs.MergeIdRegistryEventHubEvent) => { + const handleMergeEvent = (event: MergeIdRegistryEventHubEvent) => { mergedContractEvents.push(event.mergeIdRegistryEventBody.idRegistryEvent); }; @@ -389,7 +403,7 @@ describe('mergeIdRegistryEvent', () => { }); describe('overwrites existing event', () => { - let newEvent: protobufs.IdRegistryEvent; + let newEvent: IdRegistryEvent; beforeEach(async () => { await set.mergeIdRegistryEvent(custody1Event); @@ -425,7 +439,7 @@ describe('mergeIdRegistryEvent', () => { }); describe('does not overwrite existing event', () => { - let newEvent: protobufs.IdRegistryEvent; + let newEvent: IdRegistryEvent; beforeEach(async () => { await set.mergeIdRegistryEvent(custody1Event); @@ -467,9 +481,9 @@ describe('mergeIdRegistryEvent', () => { }); describe('merge', () => { - let mergeEvents: [protobufs.Message | undefined, protobufs.Message[]][] = []; + let mergeEvents: [Message | undefined, Message[]][] = []; - const mergeMessageHandler = (event: protobufs.MergeMessageHubEvent) => { + const mergeMessageHandler = (event: MergeMessageHubEvent) => { const { message, deletedMessages } = event.mergeMessageBody; mergeEvents.push([message, deletedMessages ?? []]); }; @@ -486,23 +500,23 @@ describe('merge', () => { eventHandler.off('mergeMessage', mergeMessageHandler); }); - const assertSignerExists = async (message: protobufs.SignerAddMessage | protobufs.SignerRemoveMessage) => { + const assertSignerExists = async (message: SignerAddMessage | SignerRemoveMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.SignerMessage, tsHash)).resolves.toEqual(message); }; - const assertSignerDoesNotExist = async (message: protobufs.SignerAddMessage | protobufs.SignerRemoveMessage) => { + const assertSignerDoesNotExist = async (message: SignerAddMessage | SignerRemoveMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.SignerMessage, tsHash)).rejects.toThrow(HubError); }; - const assertSignerAddWins = async (message: protobufs.SignerAddMessage) => { + const assertSignerAddWins = async (message: SignerAddMessage) => { await assertSignerExists(message); await expect(set.getSignerAdd(fid, signerKey)).resolves.toEqual(message); await expect(set.getSignerRemove(fid, signerKey)).rejects.toThrow(HubError); }; - const assertSignerRemoveWins = async (message: protobufs.SignerRemoveMessage) => { + const assertSignerRemoveWins = async (message: SignerRemoveMessage) => { await assertSignerExists(message); await expect(set.getSignerRemove(fid, signerKey)).resolves.toEqual(message); await expect(set.getSignerAdd(fid, signerKey)).rejects.toThrow(HubError); @@ -535,7 +549,7 @@ describe('merge', () => { }); describe('with a conflicting SignerAdd with different timestamps', () => { - let signerAddLater: protobufs.SignerAddMessage; + let signerAddLater: SignerAddMessage; beforeAll(async () => { signerAddLater = await Factories.SignerAddMessage.create( @@ -576,7 +590,7 @@ describe('merge', () => { }); describe('with a conflicting SignerAdd with identical timestamps', () => { - let signerAddLater: protobufs.SignerAddMessage; + let signerAddLater: SignerAddMessage; beforeAll(async () => { signerAddLater = await Factories.SignerAddMessage.create( @@ -700,7 +714,7 @@ describe('merge', () => { }); describe('with a conflicting SignerRemove with different timestamps', () => { - let signerRemoveLater: protobufs.SignerRemoveMessage; + let signerRemoveLater: SignerRemoveMessage; beforeAll(async () => { signerRemoveLater = await Factories.SignerRemoveMessage.create( @@ -736,7 +750,7 @@ describe('merge', () => { }); describe('with a conflicting SignerRemove with identical timestamps', () => { - let signerRemoveLater: protobufs.SignerRemoveMessage; + let signerRemoveLater: SignerRemoveMessage; beforeAll(async () => { signerRemoveLater = await Factories.SignerRemoveMessage.create( @@ -922,9 +936,9 @@ describe('getFids', () => { }); describe('revoke', () => { - let revokedMessages: protobufs.Message[] = []; + let revokedMessages: Message[] = []; - const revokeMessageHandler = (event: protobufs.RevokeMessageHubEvent) => { + const revokeMessageHandler = (event: RevokeMessageHubEvent) => { revokedMessages.push(event.revokeMessageBody.message); }; @@ -975,8 +989,8 @@ describe('revoke', () => { }); describe('pruneMessages', () => { - let prunedMessages: protobufs.Message[]; - const pruneMessageListener = (event: protobufs.PruneMessageHubEvent) => { + let prunedMessages: Message[]; + const pruneMessageListener = (event: PruneMessageHubEvent) => { prunedMessages.push(event.pruneMessageBody.message); }; @@ -992,19 +1006,19 @@ describe('pruneMessages', () => { eventHandler.off('pruneMessage', pruneMessageListener); }); - let add1: protobufs.SignerAddMessage; - let add2: protobufs.SignerAddMessage; - let add3: protobufs.SignerAddMessage; - let add4: protobufs.SignerAddMessage; - let add5: protobufs.SignerAddMessage; + let add1: SignerAddMessage; + let add2: SignerAddMessage; + let add3: SignerAddMessage; + let add4: SignerAddMessage; + let add5: SignerAddMessage; - let remove1: protobufs.SignerRemoveMessage; - let remove2: protobufs.SignerRemoveMessage; - let remove3: protobufs.SignerRemoveMessage; - let remove4: protobufs.SignerRemoveMessage; - let remove5: protobufs.SignerRemoveMessage; + let remove1: SignerRemoveMessage; + let remove2: SignerRemoveMessage; + let remove3: SignerRemoveMessage; + let remove4: SignerRemoveMessage; + let remove5: SignerRemoveMessage; - const generateAddWithTimestamp = async (fid: number, timestamp: number): Promise => { + const generateAddWithTimestamp = async (fid: number, timestamp: number): Promise => { return Factories.SignerAddMessage.create({ data: { fid, timestamp }, }); @@ -1014,7 +1028,7 @@ describe('pruneMessages', () => { fid: number, timestamp: number, signer?: Uint8Array | null - ): Promise => { + ): Promise => { return Factories.SignerRemoveMessage.create({ data: { fid, timestamp, signerRemoveBody: { signer: signer ?? Factories.Ed25519PPublicKey.build() } }, }); @@ -1060,7 +1074,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([add1, add2]); - for (const message of prunedMessages as protobufs.SignerAddMessage[]) { + for (const message of prunedMessages as SignerAddMessage[]) { const getAdd = () => sizePrunedStore.getSignerAdd(fid, message.data.signerAddBody.signer); await expect(getAdd()).rejects.toThrow(HubError); } @@ -1077,7 +1091,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([remove1, remove2]); - for (const message of prunedMessages as protobufs.SignerRemoveMessage[]) { + for (const message of prunedMessages as SignerRemoveMessage[]) { const getRemove = () => sizePrunedStore.getSignerRemove(fid, message.data.signerRemoveBody.signer); await expect(getRemove()).rejects.toThrow(HubError); } diff --git a/apps/hubble/src/storage/stores/signerStore.ts b/apps/hubble/src/storage/stores/signerStore.ts index b8ef4c818c..d4dd84a487 100644 --- a/apps/hubble/src/storage/stores/signerStore.ts +++ b/apps/hubble/src/storage/stores/signerStore.ts @@ -1,5 +1,17 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesCompare, HubAsyncResult, HubError, isHubError } from '@farcaster/utils'; +import { + bytesCompare, + HubAsyncResult, + HubError, + HubEventType, + IdRegistryEvent, + isHubError, + isSignerAddMessage, + isSignerRemoveMessage, + Message, + MessageType, + SignerAddMessage, + SignerRemoveMessage, +} from '@farcaster/hub-nodejs'; import AsyncLock from 'async-lock'; import { err, ok, ResultAsync } from 'neverthrow'; import { @@ -106,11 +118,11 @@ class SignerStore { } /** Returns the most recent event from the IdRegistry contract that affected the fid */ - async getIdRegistryEvent(fid: number): Promise { + async getIdRegistryEvent(fid: number): Promise { return getIdRegistryEvent(this._db, fid); } - async getIdRegistryEventByAddress(address: Uint8Array): Promise { + async getIdRegistryEventByAddress(address: Uint8Array): Promise { return getIdRegistryEventByCustodyAddress(this._db, address); } @@ -121,7 +133,7 @@ class SignerStore { * @param signerPubKey the EdDSA public key of the signer * @returns the SignerAdd Model if it exists, throws Error otherwise */ - async getSignerAdd(fid: number, signer: Uint8Array): Promise { + async getSignerAdd(fid: number, signer: Uint8Array): Promise { const addKey = makeSignerAddsKey(fid, signer); const messageTsHash = await this._db.get(addKey); return getMessage(this._db, fid, UserPostfix.SignerMessage, messageTsHash); @@ -134,7 +146,7 @@ class SignerStore { * @param signer the EdDSA public key of the signer * @returns the SignerRemove message if it exists, throws HubError otherwise */ - async getSignerRemove(fid: number, signer: Uint8Array): Promise { + async getSignerRemove(fid: number, signer: Uint8Array): Promise { const removeKey = makeSignerRemovesKey(fid, signer); const messageTsHash = await this._db.get(removeKey); return getMessage(this._db, fid, UserPostfix.SignerMessage, messageTsHash); @@ -146,12 +158,9 @@ class SignerStore { * @param fid fid of the user who created the signers * @returns the SignerAdd messages if it exists, throws HubError otherwise */ - async getSignerAddsByFid( - fid: number, - pageOptions: PageOptions = {} - ): Promise> { + async getSignerAddsByFid(fid: number, pageOptions: PageOptions = {}): Promise> { const signerMessagesPrefix = makeMessagePrimaryKey(fid, UserPostfix.SignerMessage); - return getMessagesPageByPrefix(this._db, signerMessagesPrefix, protobufs.isSignerAddMessage, pageOptions); + return getMessagesPageByPrefix(this._db, signerMessagesPrefix, isSignerAddMessage, pageOptions); } /** @@ -160,23 +169,18 @@ class SignerStore { * @param fid fid of the user who created the signers * @returns the SignerRemove messages if it exists, throws HubError otherwise */ - async getSignerRemovesByFid( - fid: number, - pageOptions: PageOptions = {} - ): Promise> { + async getSignerRemovesByFid(fid: number, pageOptions: PageOptions = {}): Promise> { const signerMessagesPrefix = makeMessagePrimaryKey(fid, UserPostfix.SignerMessage); - return getMessagesPageByPrefix(this._db, signerMessagesPrefix, protobufs.isSignerRemoveMessage, pageOptions); + return getMessagesPageByPrefix(this._db, signerMessagesPrefix, isSignerRemoveMessage, pageOptions); } async getAllSignerMessagesByFid( fid: number, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const signerMessagesPrefix = makeMessagePrimaryKey(fid, UserPostfix.SignerMessage); - const filter = ( - message: protobufs.Message - ): message is protobufs.SignerAddMessage | protobufs.SignerRemoveMessage => { - return protobufs.isSignerAddMessage(message) || protobufs.isSignerRemoveMessage(message); + const filter = (message: Message): message is SignerAddMessage | SignerRemoveMessage => { + return isSignerAddMessage(message) || isSignerRemoveMessage(message); }; return getMessagesPageByPrefix(this._db, signerMessagesPrefix, filter, pageOptions); } @@ -225,7 +229,7 @@ class SignerStore { * Merges a ContractEvent into the SignerStore, storing the causally latest event at the key: * */ - async mergeIdRegistryEvent(event: protobufs.IdRegistryEvent): Promise { + async mergeIdRegistryEvent(event: IdRegistryEvent): Promise { const existingEvent = await ResultAsync.fromPromise(this.getIdRegistryEvent(event.fid), () => undefined); if (existingEvent.isOk() && eventCompare(existingEvent.value, event) >= 0) { throw new HubError('bad_request.conflict', 'event conflicts with a more recent IdRegistryEvent'); @@ -234,7 +238,7 @@ class SignerStore { const txn = putIdRegistryEventTransaction(this._db.transaction(), event); const result = await this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.MERGE_ID_REGISTRY_EVENT, + type: HubEventType.MERGE_ID_REGISTRY_EVENT, mergeIdRegistryEventBody: { idRegistryEvent: event }, }); if (result.isErr()) { @@ -244,8 +248,8 @@ class SignerStore { } /** Merges a SignerAdd or SignerRemove message into the SignerStore */ - async merge(message: protobufs.Message): Promise { - if (!protobufs.isSignerAddMessage(message) && !protobufs.isSignerRemoveMessage(message)) { + async merge(message: Message): Promise { + if (!isSignerAddMessage(message) && !isSignerRemoveMessage(message)) { throw new HubError('bad_request.validation_failure', 'invalid message type'); } @@ -253,9 +257,9 @@ class SignerStore { .acquire( message.data.fid.toString(), async () => { - if (protobufs.isSignerAddMessage(message)) { + if (isSignerAddMessage(message)) { return this.mergeAdd(message); - } else if (protobufs.isSignerRemoveMessage(message)) { + } else if (isSignerRemoveMessage(message)) { return this.mergeRemove(message); } else { throw new HubError('bad_request.validation_failure', 'invalid message type'); @@ -268,18 +272,18 @@ class SignerStore { }); } - async revoke(message: protobufs.Message): HubAsyncResult { + async revoke(message: Message): HubAsyncResult { let txn = this._db.transaction(); - if (protobufs.isSignerAddMessage(message)) { + if (isSignerAddMessage(message)) { txn = this.deleteSignerAddTransaction(txn, message); - } else if (protobufs.isSignerRemoveMessage(message)) { + } else if (isSignerRemoveMessage(message)) { txn = this.deleteSignerRemoveTransaction(txn, message); } else { return err(new HubError('bad_request.invalid_param', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.REVOKE_MESSAGE, + type: HubEventType.REVOKE_MESSAGE, revokeMessageBody: { message }, }); } @@ -319,16 +323,16 @@ class SignerStore { let txn = this._db.transaction(); - if (protobufs.isSignerAddMessage(nextMessage.value)) { + if (isSignerAddMessage(nextMessage.value)) { txn = this.deleteSignerAddTransaction(txn, nextMessage.value); - } else if (protobufs.isSignerRemoveMessage(nextMessage.value)) { + } else if (isSignerRemoveMessage(nextMessage.value)) { txn = this.deleteSignerRemoveTransaction(txn, nextMessage.value); } else { return err(new HubError('unknown', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.PRUNE_MESSAGE, + type: HubEventType.PRUNE_MESSAGE, pruneMessageBody: { message: nextMessage.value }, }); }; @@ -358,7 +362,7 @@ class SignerStore { /* Private Methods */ /* -------------------------------------------------------------------------- */ - private async mergeAdd(message: protobufs.SignerAddMessage): Promise { + private async mergeAdd(message: SignerAddMessage): Promise { const mergeConflicts = await this.getMergeConflicts(message); if (mergeConflicts.isErr()) { @@ -372,7 +376,7 @@ class SignerStore { txn = this.putSignerAddTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: mergeConflicts.value }, }; @@ -384,7 +388,7 @@ class SignerStore { return result.value; } - private async mergeRemove(message: protobufs.SignerRemoveMessage): Promise { + private async mergeRemove(message: SignerRemoveMessage): Promise { const mergeConflicts = await this.getMergeConflicts(message); if (mergeConflicts.isErr()) { @@ -398,7 +402,7 @@ class SignerStore { txn = this.putSignerRemoveTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: mergeConflicts.value }, }; @@ -411,9 +415,9 @@ class SignerStore { } private signerMessageCompare( - aType: protobufs.MessageType.SIGNER_ADD | protobufs.MessageType.SIGNER_REMOVE, + aType: MessageType.SIGNER_ADD | MessageType.SIGNER_REMOVE, aTsHash: Uint8Array, - bType: protobufs.MessageType.SIGNER_ADD | protobufs.MessageType.SIGNER_REMOVE, + bType: MessageType.SIGNER_ADD | MessageType.SIGNER_REMOVE, bTsHash: Uint8Array ): number { // Compare timestamps (first 4 bytes of tsHash) to enforce Last-Write-Wins @@ -422,9 +426,9 @@ class SignerStore { return timestampOrder; } - if (aType === protobufs.MessageType.SIGNER_REMOVE && bType === protobufs.MessageType.SIGNER_ADD) { + if (aType === MessageType.SIGNER_REMOVE && bType === MessageType.SIGNER_ADD) { return 1; - } else if (aType === protobufs.MessageType.SIGNER_ADD && bType === protobufs.MessageType.SIGNER_REMOVE) { + } else if (aType === MessageType.SIGNER_ADD && bType === MessageType.SIGNER_REMOVE) { return -1; } @@ -438,9 +442,9 @@ class SignerStore { * @returns a RocksDB transaction if keys must be added or removed, undefined otherwise */ private async getMergeConflicts( - message: protobufs.SignerAddMessage | protobufs.SignerRemoveMessage - ): HubAsyncResult<(protobufs.SignerAddMessage | protobufs.SignerRemoveMessage)[]> { - const conflicts: (protobufs.SignerAddMessage | protobufs.SignerRemoveMessage)[] = []; + message: SignerAddMessage | SignerRemoveMessage + ): HubAsyncResult<(SignerAddMessage | SignerRemoveMessage)[]> { + const conflicts: (SignerAddMessage | SignerRemoveMessage)[] = []; const signer = (message.data.signerAddBody ?? message.data.signerRemoveBody)?.signer; if (!signer) { @@ -460,7 +464,7 @@ class SignerStore { if (removeTsHash.isOk()) { const removeCompare = this.signerMessageCompare( - protobufs.MessageType.SIGNER_REMOVE, + MessageType.SIGNER_REMOVE, removeTsHash.value, message.data.type, tsHash.value @@ -472,7 +476,7 @@ class SignerStore { } else { // If the existing remove has a lower order than the new message, retrieve the full // SignerRemove message and delete it as part of the RocksDB transaction - const existingRemove = await getMessage( + const existingRemove = await getMessage( this._db, message.data.fid, UserPostfix.SignerMessage, @@ -490,7 +494,7 @@ class SignerStore { if (addTsHash.isOk()) { const addCompare = this.signerMessageCompare( - protobufs.MessageType.SIGNER_ADD, + MessageType.SIGNER_ADD, addTsHash.value, message.data.type, tsHash.value @@ -502,7 +506,7 @@ class SignerStore { } else { // If the existing add has a lower order than the new message, retrieve the full // SignerAdd message and delete it as part of the RocksDB transaction - const existingAdd = await getMessage( + const existingAdd = await getMessage( this._db, message.data.fid, UserPostfix.SignerMessage, @@ -515,14 +519,11 @@ class SignerStore { return ok(conflicts); } - private deleteManyTransaction( - txn: Transaction, - messages: (protobufs.SignerAddMessage | protobufs.SignerRemoveMessage)[] - ): Transaction { + private deleteManyTransaction(txn: Transaction, messages: (SignerAddMessage | SignerRemoveMessage)[]): Transaction { for (const message of messages) { - if (protobufs.isSignerAddMessage(message)) { + if (isSignerAddMessage(message)) { txn = this.deleteSignerAddTransaction(txn, message); - } else if (protobufs.isSignerRemoveMessage(message)) { + } else if (isSignerRemoveMessage(message)) { txn = this.deleteSignerRemoveTransaction(txn, message); } } @@ -530,7 +531,7 @@ class SignerStore { } /* Builds a RocksDB transaction to insert a SignerAdd message and construct its indices */ - private putSignerAddTransaction(txn: Transaction, message: protobufs.SignerAddMessage): Transaction { + private putSignerAddTransaction(txn: Transaction, message: SignerAddMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -546,7 +547,7 @@ class SignerStore { } /* Builds a RocksDB transaction to remove a SignerAdd message and delete its indices */ - private deleteSignerAddTransaction(txn: Transaction, message: protobufs.SignerAddMessage): Transaction { + private deleteSignerAddTransaction(txn: Transaction, message: SignerAddMessage): Transaction { // Delete from signerAdds txn = txn.del(makeSignerAddsKey(message.data.fid, message.data.signerAddBody.signer)); @@ -555,7 +556,7 @@ class SignerStore { } /* Builds a RocksDB transaction to insert a SignerRemove message and construct its indices */ - private putSignerRemoveTransaction(txn: Transaction, message: protobufs.SignerRemoveMessage): Transaction { + private putSignerRemoveTransaction(txn: Transaction, message: SignerRemoveMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -574,7 +575,7 @@ class SignerStore { } /* Builds a RocksDB transaction to remove a SignerRemove message and delete its indices */ - private deleteSignerRemoveTransaction(txn: Transaction, message: protobufs.SignerRemoveMessage): Transaction { + private deleteSignerRemoveTransaction(txn: Transaction, message: SignerRemoveMessage): Transaction { // Delete from signerRemoves txn = txn.del(makeSignerRemovesKey(message.data.fid, message.data.signerRemoveBody.signer)); diff --git a/apps/hubble/src/storage/stores/storeEventHandler.test.ts b/apps/hubble/src/storage/stores/storeEventHandler.test.ts index 1ff2417adb..40a302e3b3 100644 --- a/apps/hubble/src/storage/stores/storeEventHandler.test.ts +++ b/apps/hubble/src/storage/stores/storeEventHandler.test.ts @@ -1,5 +1,4 @@ -import { CastAddMessage, HubEvent, HubEventType } from '@farcaster/protobufs'; -import { Factories } from '@farcaster/utils'; +import { CastAddMessage, HubEvent, HubEventType, Factories } from '@farcaster/hub-nodejs'; import { ok, Result } from 'neverthrow'; import { jestRocksDB } from '~/storage/db/jestUtils'; import { getMessage, makeTsHash, putMessageTransaction } from '~/storage/db/message'; diff --git a/apps/hubble/src/storage/stores/storeEventHandler.ts b/apps/hubble/src/storage/stores/storeEventHandler.ts index 31b669abcc..92f0e3c3b4 100644 --- a/apps/hubble/src/storage/stores/storeEventHandler.ts +++ b/apps/hubble/src/storage/stores/storeEventHandler.ts @@ -1,4 +1,10 @@ import { + bytesIncrement, + FARCASTER_EPOCH, + HubAsyncResult, + HubError, + HubResult, + isHubError, HubEvent, isMergeIdRegistryEventHubEvent, isMergeMessageHubEvent, @@ -10,8 +16,7 @@ import { MergeNameRegistryEventHubEvent, PruneMessageHubEvent, RevokeMessageHubEvent, -} from '@farcaster/protobufs'; -import { bytesIncrement, FARCASTER_EPOCH, HubAsyncResult, HubError, HubResult, isHubError } from '@farcaster/utils'; +} from '@farcaster/hub-nodejs'; import AsyncLock from 'async-lock'; import { err, ok, ResultAsync } from 'neverthrow'; import { TypedEmitter } from 'tiny-typed-emitter'; diff --git a/apps/hubble/src/storage/stores/types.ts b/apps/hubble/src/storage/stores/types.ts index 2adf303f59..953ac35b70 100644 --- a/apps/hubble/src/storage/stores/types.ts +++ b/apps/hubble/src/storage/stores/types.ts @@ -1,5 +1,4 @@ -import * as protobufs from '@farcaster/protobufs'; - +import { Message } from '@farcaster/hub-nodejs'; export const MERGE_TIMEOUT_DEFAULT = 10_000; // 10 seconds export type StorePruneOptions = { @@ -15,7 +14,7 @@ export type PageOptions = { reverse?: boolean | undefined; }; -export type MessagesPage = { +export type MessagesPage = { messages: T[]; nextPageToken?: Uint8Array | undefined; }; diff --git a/apps/hubble/src/storage/stores/userDataStore.test.ts b/apps/hubble/src/storage/stores/userDataStore.test.ts index 0b6aec3ab4..cb902d4edb 100644 --- a/apps/hubble/src/storage/stores/userDataStore.test.ts +++ b/apps/hubble/src/storage/stores/userDataStore.test.ts @@ -1,5 +1,15 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesIncrement, Factories, getFarcasterTime, HubError } from '@farcaster/utils'; +import { + bytesIncrement, + Factories, + getFarcasterTime, + HubError, + MergeMessageHubEvent, + Message, + PruneMessageHubEvent, + RevokeMessageHubEvent, + UserDataAddMessage, + UserDataType, +} from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import StoreEventHandler from '~/storage/stores/storeEventHandler'; import UserDataStore from '~/storage/stores/userDataStore'; @@ -14,35 +24,35 @@ const eventHandler = new StoreEventHandler(db, cache); const set = new UserDataStore(db, eventHandler); const fid = Factories.Fid.build(); -let addPfp: protobufs.UserDataAddMessage; -let addBio: protobufs.UserDataAddMessage; +let addPfp: UserDataAddMessage; +let addBio: UserDataAddMessage; beforeAll(async () => { addPfp = await Factories.UserDataAddMessage.create({ - data: { fid, userDataBody: { type: protobufs.UserDataType.PFP } }, + data: { fid, userDataBody: { type: UserDataType.PFP } }, }); addBio = await Factories.UserDataAddMessage.create({ - data: { fid, userDataBody: { type: protobufs.UserDataType.BIO }, timestamp: addPfp.data.timestamp + 1 }, + data: { fid, userDataBody: { type: UserDataType.BIO }, timestamp: addPfp.data.timestamp + 1 }, }); }); describe('getUserDataAdd', () => { test('fails if missing', async () => { - await expect(set.getUserDataAdd(fid, protobufs.UserDataType.PFP)).rejects.toThrow(HubError); - await expect(set.getUserDataAdd(fid, protobufs.UserDataType.FNAME)).rejects.toThrow(HubError); + await expect(set.getUserDataAdd(fid, UserDataType.PFP)).rejects.toThrow(HubError); + await expect(set.getUserDataAdd(fid, UserDataType.FNAME)).rejects.toThrow(HubError); }); test('fails if the wrong fid or datatype is provided', async () => { const unknownFid = Factories.Fid.build(); await set.merge(addPfp); - await expect(set.getUserDataAdd(unknownFid, protobufs.UserDataType.PFP)).rejects.toThrow(HubError); - await expect(set.getUserDataAdd(fid, protobufs.UserDataType.BIO)).rejects.toThrow(HubError); + await expect(set.getUserDataAdd(unknownFid, UserDataType.PFP)).rejects.toThrow(HubError); + await expect(set.getUserDataAdd(fid, UserDataType.BIO)).rejects.toThrow(HubError); }); test('returns message', async () => { await set.merge(addPfp); - await expect(set.getUserDataAdd(fid, protobufs.UserDataType.PFP)).resolves.toEqual(addPfp); + await expect(set.getUserDataAdd(fid, UserDataType.PFP)).resolves.toEqual(addPfp); }); }); @@ -66,9 +76,9 @@ describe('getUserDataAddsByFid', () => { }); describe('merge', () => { - let mergeEvents: [protobufs.Message | undefined, protobufs.Message[]][] = []; + let mergeEvents: [Message | undefined, Message[]][] = []; - const mergeMessageHandler = (event: protobufs.MergeMessageHubEvent) => { + const mergeMessageHandler = (event: MergeMessageHubEvent) => { const { message, deletedMessages } = event.mergeMessageBody; mergeEvents.push([message, deletedMessages ?? []]); }; @@ -84,17 +94,17 @@ describe('merge', () => { eventHandler.off('mergeMessage', mergeMessageHandler); }); - const assertUserDataExists = async (message: protobufs.UserDataAddMessage) => { + const assertUserDataExists = async (message: UserDataAddMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.UserDataMessage, tsHash)).resolves.toEqual(message); }; - const assertUserDataDoesNotExist = async (message: protobufs.UserDataAddMessage) => { + const assertUserDataDoesNotExist = async (message: UserDataAddMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.UserDataMessage, tsHash)).rejects.toThrow(HubError); }; - const assertUserDataAddWins = async (message: protobufs.UserDataAddMessage) => { + const assertUserDataAddWins = async (message: UserDataAddMessage) => { await assertUserDataExists(message); await expect(set.getUserDataAdd(fid, message.data.userDataBody.type)).resolves.toEqual(message); }; @@ -133,7 +143,7 @@ describe('merge', () => { }); describe('with a conflicting UserDataAdd with different timestamps', () => { - let addPfpLater: protobufs.UserDataAddMessage; + let addPfpLater: UserDataAddMessage; beforeAll(async () => { addPfpLater = await Factories.UserDataAddMessage.create({ @@ -166,7 +176,7 @@ describe('merge', () => { }); describe('with a conflicting UserDataAdd with identical timestamps', () => { - let addPfpLater: protobufs.UserDataAddMessage; + let addPfpLater: UserDataAddMessage; beforeAll(async () => { addPfpLater = await Factories.UserDataAddMessage.create({ @@ -202,9 +212,9 @@ describe('merge', () => { }); describe('revoke', () => { - let revokedMessages: protobufs.Message[] = []; + let revokedMessages: Message[] = []; - const revokeMessageHandler = (event: protobufs.RevokeMessageHubEvent) => { + const revokeMessageHandler = (event: RevokeMessageHubEvent) => { revokedMessages.push(event.revokeMessageBody.message); }; @@ -232,7 +242,7 @@ describe('revoke', () => { const result = await set.revoke(addBio); expect(result.isOk()).toBeTruthy(); expect(result._unsafeUnwrap()).toBeGreaterThan(0); - await expect(set.getUserDataAdd(fid, protobufs.UserDataType.BIO)).rejects.toThrow(); + await expect(set.getUserDataAdd(fid, UserDataType.BIO)).rejects.toThrow(); expect(revokedMessages).toEqual([addBio]); }); @@ -240,14 +250,14 @@ describe('revoke', () => { const result = await set.revoke(addPfp); expect(result.isOk()).toBeTruthy(); expect(result._unsafeUnwrap()).toBeGreaterThan(0); - await expect(set.getUserDataAdd(fid, protobufs.UserDataType.PFP)).rejects.toThrow(); + await expect(set.getUserDataAdd(fid, UserDataType.PFP)).rejects.toThrow(); expect(revokedMessages).toEqual([addPfp]); }); }); describe('pruneMessages', () => { - let prunedMessages: protobufs.Message[]; - const pruneMessageListener = (event: protobufs.PruneMessageHubEvent) => { + let prunedMessages: Message[]; + const pruneMessageListener = (event: PruneMessageHubEvent) => { prunedMessages.push(event.pruneMessageBody.message); }; @@ -263,25 +273,25 @@ describe('pruneMessages', () => { eventHandler.off('pruneMessage', pruneMessageListener); }); - let add1: protobufs.UserDataAddMessage; - let add2: protobufs.UserDataAddMessage; - let add3: protobufs.UserDataAddMessage; - let add4: protobufs.UserDataAddMessage; + let add1: UserDataAddMessage; + let add2: UserDataAddMessage; + let add3: UserDataAddMessage; + let add4: UserDataAddMessage; const generateAddWithTimestamp = async ( fid: number, timestamp: number, - type: protobufs.UserDataType - ): Promise => { + type: UserDataType + ): Promise => { return Factories.UserDataAddMessage.create({ data: { fid, timestamp, userDataBody: { type } } }); }; beforeAll(async () => { const time = getFarcasterTime()._unsafeUnwrap() - 10; - add1 = await generateAddWithTimestamp(fid, time + 1, protobufs.UserDataType.PFP); - add2 = await generateAddWithTimestamp(fid, time + 2, protobufs.UserDataType.DISPLAY); - add3 = await generateAddWithTimestamp(fid, time + 3, protobufs.UserDataType.BIO); - add4 = await generateAddWithTimestamp(fid, time + 5, protobufs.UserDataType.URL); + add1 = await generateAddWithTimestamp(fid, time + 1, UserDataType.PFP); + add2 = await generateAddWithTimestamp(fid, time + 2, UserDataType.DISPLAY); + add3 = await generateAddWithTimestamp(fid, time + 3, UserDataType.BIO); + add4 = await generateAddWithTimestamp(fid, time + 5, UserDataType.URL); }); beforeEach(async () => { @@ -308,7 +318,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([add1, add2]); - for (const message of prunedMessages as protobufs.UserDataAddMessage[]) { + for (const message of prunedMessages as UserDataAddMessage[]) { const getAdd = () => sizePrunedStore.getUserDataAdd(fid, message.data.userDataBody.type); await expect(getAdd()).rejects.toThrow(HubError); } diff --git a/apps/hubble/src/storage/stores/userDataStore.ts b/apps/hubble/src/storage/stores/userDataStore.ts index 042c172f9b..87c5ce0dd3 100644 --- a/apps/hubble/src/storage/stores/userDataStore.ts +++ b/apps/hubble/src/storage/stores/userDataStore.ts @@ -1,5 +1,15 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesCompare, HubAsyncResult, HubError, isHubError } from '@farcaster/utils'; +import { + bytesCompare, + HubAsyncResult, + HubError, + HubEventType, + isHubError, + isUserDataAddMessage, + Message, + NameRegistryEvent, + UserDataAddMessage, + UserDataType, +} from '@farcaster/hub-nodejs'; import AsyncLock from 'async-lock'; import { err, ok, ResultAsync } from 'neverthrow'; import { @@ -30,7 +40,7 @@ const PRUNE_SIZE_LIMIT_DEFAULT = 100; * @param dataType type of data being added * @returns RocksDB key of the form ::: */ -const makeUserDataAddsKey = (fid: number, dataType?: protobufs.UserDataType): Buffer => { +const makeUserDataAddsKey = (fid: number, dataType?: UserDataType): Buffer => { return Buffer.concat([ makeUserKey(fid), Buffer.from([UserPostfix.UserDataAdds]), @@ -77,23 +87,20 @@ class UserDataStore { * @param dataType type of UserData that was added * @returns the UserDataAdd Model if it exists, undefined otherwise */ - async getUserDataAdd(fid: number, dataType: protobufs.UserDataType): Promise { + async getUserDataAdd(fid: number, dataType: UserDataType): Promise { const addsKey = makeUserDataAddsKey(fid, dataType); const messageTsHash = await this._db.get(addsKey); return getMessage(this._db, fid, UserPostfix.UserDataMessage, messageTsHash); } /** Finds all UserDataAdd messages for an fid */ - async getUserDataAddsByFid( - fid: number, - pageOptions: PageOptions = {} - ): Promise> { + async getUserDataAddsByFid(fid: number, pageOptions: PageOptions = {}): Promise> { const prefix = makeMessagePrimaryKey(fid, UserPostfix.UserDataMessage); - return getMessagesPageByPrefix(this._db, prefix, protobufs.isUserDataAddMessage, pageOptions); + return getMessagesPageByPrefix(this._db, prefix, isUserDataAddMessage, pageOptions); } /** Returns the most recent event from the NameEventRegistry contract for an fname */ - async getNameRegistryEvent(fname: Uint8Array): Promise { + async getNameRegistryEvent(fname: Uint8Array): Promise { return getNameRegistryEvent(this._db, fname); } @@ -101,7 +108,7 @@ class UserDataStore { * Merges a NameRegistryEvent storing the causally latest event at the key: * */ - async mergeNameRegistryEvent(event: protobufs.NameRegistryEvent): Promise { + async mergeNameRegistryEvent(event: NameRegistryEvent): Promise { const existingEvent = await ResultAsync.fromPromise(this.getNameRegistryEvent(event.fname), () => undefined); if (existingEvent.isOk() && eventCompare(existingEvent.value, event) >= 0) { throw new HubError('bad_request.conflict', 'event conflicts with a more recent NameRegistryEvent'); @@ -110,7 +117,7 @@ class UserDataStore { const txn = putNameRegistryEventTransaction(this._db.transaction(), event); const result = await this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.MERGE_NAME_REGISTRY_EVENT, + type: HubEventType.MERGE_NAME_REGISTRY_EVENT, mergeNameRegistryEventBody: { nameRegistryEvent: event }, }); @@ -122,8 +129,8 @@ class UserDataStore { } /** Merges a UserDataAdd message into the set */ - async merge(message: protobufs.Message): Promise { - if (!protobufs.isUserDataAddMessage(message)) { + async merge(message: Message): Promise { + if (!isUserDataAddMessage(message)) { throw new HubError('bad_request.validation_failure', 'invalid message type'); } @@ -140,16 +147,16 @@ class UserDataStore { }); } - async revoke(message: protobufs.Message): HubAsyncResult { + async revoke(message: Message): HubAsyncResult { let txn = this._db.transaction(); - if (protobufs.isUserDataAddMessage(message)) { + if (isUserDataAddMessage(message)) { txn = this.deleteUserDataAddTransaction(txn, message); } else { return err(new HubError('bad_request.invalid_param', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.REVOKE_MESSAGE, + type: HubEventType.REVOKE_MESSAGE, revokeMessageBody: { message }, }); } @@ -189,14 +196,14 @@ class UserDataStore { let txn = this._db.transaction(); - if (protobufs.isUserDataAddMessage(nextMessage.value)) { + if (isUserDataAddMessage(nextMessage.value)) { txn = this.deleteUserDataAddTransaction(txn, nextMessage.value); } else { return err(new HubError('unknown', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.PRUNE_MESSAGE, + type: HubEventType.PRUNE_MESSAGE, pruneMessageBody: { message: nextMessage.value }, }); }; @@ -226,7 +233,7 @@ class UserDataStore { /* Private Methods */ /* -------------------------------------------------------------------------- */ - private async mergeDataAdd(message: protobufs.UserDataAddMessage): Promise { + private async mergeDataAdd(message: UserDataAddMessage): Promise { const mergeConflicts = await this.getMergeConflicts(message); if (mergeConflicts.isErr()) { throw mergeConflicts.error; @@ -239,7 +246,7 @@ class UserDataStore { txn = this.putUserDataAddTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: mergeConflicts.value }, }; @@ -255,10 +262,8 @@ class UserDataStore { return bytesCompare(aTimestampHash, bTimestampHash); } - private async getMergeConflicts( - message: protobufs.UserDataAddMessage - ): HubAsyncResult { - const conflicts: protobufs.UserDataAddMessage[] = []; + private async getMergeConflicts(message: UserDataAddMessage): HubAsyncResult { + const conflicts: UserDataAddMessage[] = []; const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { @@ -280,7 +285,7 @@ class UserDataStore { } else { // If the existing add has a lower order than the new message, retrieve the full // UserDataAdd message and delete it as part of the RocksDB transaction - const existingAdd = await getMessage( + const existingAdd = await getMessage( this._db, message.data.fid, UserPostfix.UserDataMessage, @@ -293,9 +298,9 @@ class UserDataStore { return ok(conflicts); } - private deleteManyTransaction(txn: Transaction, messages: protobufs.UserDataAddMessage[]): Transaction { + private deleteManyTransaction(txn: Transaction, messages: UserDataAddMessage[]): Transaction { for (const message of messages) { - if (protobufs.isUserDataAddMessage(message)) { + if (isUserDataAddMessage(message)) { txn = this.deleteUserDataAddTransaction(txn, message); } } @@ -303,7 +308,7 @@ class UserDataStore { } /* Builds a RocksDB transaction to insert a UserDataAdd message and construct its indices */ - private putUserDataAddTransaction(txn: Transaction, message: protobufs.UserDataAddMessage): Transaction { + private putUserDataAddTransaction(txn: Transaction, message: UserDataAddMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -319,7 +324,7 @@ class UserDataStore { } /* Builds a RocksDB transaction to remove a UserDataAdd message and delete its indices */ - private deleteUserDataAddTransaction(txn: Transaction, message: protobufs.UserDataAddMessage): Transaction { + private deleteUserDataAddTransaction(txn: Transaction, message: UserDataAddMessage): Transaction { // Delete message key from userData adds set index txn = txn.del(makeUserDataAddsKey(message.data.fid, message.data.userDataBody.type)); diff --git a/apps/hubble/src/storage/stores/utils.ts b/apps/hubble/src/storage/stores/utils.ts index bdba237091..5d033ae1b9 100644 --- a/apps/hubble/src/storage/stores/utils.ts +++ b/apps/hubble/src/storage/stores/utils.ts @@ -1,5 +1,4 @@ -import { IdRegistryEvent, NameRegistryEvent } from '@farcaster/protobufs'; -import { HubError, bytesCompare, bytesIncrement } from '@farcaster/utils'; +import { IdRegistryEvent, NameRegistryEvent, HubError, bytesCompare, bytesIncrement } from '@farcaster/hub-nodejs'; type Event = IdRegistryEvent | NameRegistryEvent; diff --git a/apps/hubble/src/storage/stores/verificationStore.test.ts b/apps/hubble/src/storage/stores/verificationStore.test.ts index bf61f3c55b..fa7c589caa 100644 --- a/apps/hubble/src/storage/stores/verificationStore.test.ts +++ b/apps/hubble/src/storage/stores/verificationStore.test.ts @@ -1,5 +1,17 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesDecrement, bytesIncrement, Eip712Signer, Factories, getFarcasterTime, HubError } from '@farcaster/utils'; +import { + bytesDecrement, + bytesIncrement, + Eip712Signer, + Factories, + getFarcasterTime, + HubError, + MergeMessageHubEvent, + Message, + PruneMessageHubEvent, + RevokeMessageHubEvent, + VerificationAddEthAddressMessage, + VerificationRemoveMessage, +} from '@farcaster/hub-nodejs'; import { jestRocksDB } from '~/storage/db/jestUtils'; import StoreEventHandler from '~/storage/stores/storeEventHandler'; import VerificationStore from '~/storage/stores/verificationStore'; @@ -8,7 +20,7 @@ import { UserPostfix } from '../db/types'; import { StorageCache } from '~/storage/engine/storageCache'; import { err } from 'neverthrow'; -const db = jestRocksDB('protobufs.verificationStore.test'); +const db = jestRocksDB('verificationStore.test'); const cache = new StorageCache(); const eventHandler = new StoreEventHandler(db, cache); const set = new VerificationStore(db, eventHandler); @@ -16,8 +28,8 @@ const fid = Factories.Fid.build(); let ethSigner: Eip712Signer; let ethSignerKey: Uint8Array; -let verificationAdd: protobufs.VerificationAddEthAddressMessage; -let verificationRemove: protobufs.VerificationRemoveMessage; +let verificationAdd: VerificationAddEthAddressMessage; +let verificationRemove: VerificationRemoveMessage; beforeAll(async () => { ethSigner = Factories.Eip712Signer.build(); @@ -91,9 +103,9 @@ describe('getVerificationRemovesByFid', () => { // TODO: getAllVerificationMessagesByFid describe('merge', () => { - let mergeEvents: [protobufs.Message | undefined, protobufs.Message[]][] = []; + let mergeEvents: [Message | undefined, Message[]][] = []; - const mergeMessageHandler = (event: protobufs.MergeMessageHubEvent) => { + const mergeMessageHandler = (event: MergeMessageHubEvent) => { const { message, deletedMessages } = event.mergeMessageBody; mergeEvents.push([message, deletedMessages ?? []]); }; @@ -110,27 +122,25 @@ describe('merge', () => { eventHandler.off('mergeMessage', mergeMessageHandler); }); - const assertVerificationExists = async ( - message: protobufs.VerificationAddEthAddressMessage | protobufs.VerificationRemoveMessage - ) => { + const assertVerificationExists = async (message: VerificationAddEthAddressMessage | VerificationRemoveMessage) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.VerificationMessage, tsHash)).resolves.toEqual(message); }; const assertVerificationDoesNotExist = async ( - message: protobufs.VerificationAddEthAddressMessage | protobufs.VerificationRemoveMessage + message: VerificationAddEthAddressMessage | VerificationRemoveMessage ) => { const tsHash = makeTsHash(message.data.timestamp, message.hash)._unsafeUnwrap(); await expect(getMessage(db, fid, UserPostfix.VerificationMessage, tsHash)).rejects.toThrow(HubError); }; - const assertVerificationAddWins = async (message: protobufs.VerificationAddEthAddressMessage) => { + const assertVerificationAddWins = async (message: VerificationAddEthAddressMessage) => { await assertVerificationExists(message); await expect(set.getVerificationAdd(fid, ethSignerKey)).resolves.toEqual(message); await expect(set.getVerificationRemove(fid, ethSignerKey)).rejects.toThrow(HubError); }; - const assertVerificationRemoveWins = async (message: protobufs.VerificationRemoveMessage) => { + const assertVerificationRemoveWins = async (message: VerificationRemoveMessage) => { await assertVerificationExists(message); await expect(set.getVerificationRemove(fid, ethSignerKey)).resolves.toEqual(message); await expect(set.getVerificationAdd(fid, ethSignerKey)).rejects.toThrow(HubError); @@ -158,7 +168,7 @@ describe('merge', () => { }); describe('with a conflicting VerificationAddEthAddress with different timestamps', () => { - let verificationAddLater: protobufs.VerificationAddEthAddressMessage; + let verificationAddLater: VerificationAddEthAddressMessage; beforeAll(async () => { verificationAddLater = await Factories.VerificationAddEthAddressMessage.create({ @@ -189,7 +199,7 @@ describe('merge', () => { }); describe('with a conflicting VerificationAddEthAddress with identical timestamps', () => { - let verificationAddLater: protobufs.VerificationAddEthAddressMessage; + let verificationAddLater: VerificationAddEthAddressMessage; beforeAll(async () => { verificationAddLater = await Factories.VerificationAddEthAddressMessage.create({ @@ -295,7 +305,7 @@ describe('merge', () => { }); describe('with a conflicting VerificationRemove with different timestamps', () => { - let verificationRemoveLater: protobufs.VerificationRemoveMessage; + let verificationRemoveLater: VerificationRemoveMessage; beforeAll(async () => { verificationRemoveLater = await Factories.VerificationRemoveMessage.create({ @@ -326,7 +336,7 @@ describe('merge', () => { }); describe('with a conflicting VerificationRemove with identical timestamps', () => { - let verificationRemoveLater: protobufs.VerificationRemoveMessage; + let verificationRemoveLater: VerificationRemoveMessage; beforeAll(async () => { verificationRemoveLater = await Factories.VerificationRemoveMessage.create({ @@ -404,9 +414,9 @@ describe('merge', () => { }); describe('revoke', () => { - let revokedMessages: protobufs.Message[] = []; + let revokedMessages: Message[] = []; - const revokeMessageHandler = (event: protobufs.RevokeMessageHubEvent) => { + const revokeMessageHandler = (event: RevokeMessageHubEvent) => { revokedMessages.push(event.revokeMessageBody.message); }; @@ -463,8 +473,8 @@ describe('revoke', () => { }); describe('pruneMessages', () => { - let prunedMessages: protobufs.Message[]; - const pruneMessageListener = (event: protobufs.PruneMessageHubEvent) => { + let prunedMessages: Message[]; + const pruneMessageListener = (event: PruneMessageHubEvent) => { prunedMessages.push(event.pruneMessageBody.message); }; @@ -480,22 +490,22 @@ describe('pruneMessages', () => { eventHandler.off('pruneMessage', pruneMessageListener); }); - let add1: protobufs.VerificationAddEthAddressMessage; - let add2: protobufs.VerificationAddEthAddressMessage; - let add3: protobufs.VerificationAddEthAddressMessage; - let add4: protobufs.VerificationAddEthAddressMessage; - let add5: protobufs.VerificationAddEthAddressMessage; + let add1: VerificationAddEthAddressMessage; + let add2: VerificationAddEthAddressMessage; + let add3: VerificationAddEthAddressMessage; + let add4: VerificationAddEthAddressMessage; + let add5: VerificationAddEthAddressMessage; - let remove1: protobufs.VerificationRemoveMessage; - let remove2: protobufs.VerificationRemoveMessage; - let remove3: protobufs.VerificationRemoveMessage; - let remove4: protobufs.VerificationRemoveMessage; - let remove5: protobufs.VerificationRemoveMessage; + let remove1: VerificationRemoveMessage; + let remove2: VerificationRemoveMessage; + let remove3: VerificationRemoveMessage; + let remove4: VerificationRemoveMessage; + let remove5: VerificationRemoveMessage; const generateAddWithTimestamp = async ( fid: number, timestamp: number - ): Promise => { + ): Promise => { return Factories.VerificationAddEthAddressMessage.create({ data: { fid, timestamp } }); }; @@ -503,7 +513,7 @@ describe('pruneMessages', () => { fid: number, timestamp: number, address?: Uint8Array | null - ): Promise => { + ): Promise => { return Factories.VerificationRemoveMessage.create({ data: { fid, timestamp, verificationRemoveBody: { address: address ?? Factories.EthAddress.build() } }, }); @@ -548,7 +558,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([add1, add2]); - for (const message of prunedMessages as protobufs.VerificationAddEthAddressMessage[]) { + for (const message of prunedMessages as VerificationAddEthAddressMessage[]) { const getAdd = () => sizePrunedStore.getVerificationAdd(fid, message.data.verificationAddEthAddressBody.address); await expect(getAdd()).rejects.toThrow(HubError); @@ -566,7 +576,7 @@ describe('pruneMessages', () => { expect(prunedMessages).toEqual([remove1, remove2]); - for (const message of prunedMessages as protobufs.VerificationRemoveMessage[]) { + for (const message of prunedMessages as VerificationRemoveMessage[]) { const getRemove = () => sizePrunedStore.getVerificationRemove(fid, message.data.verificationRemoveBody.address); await expect(getRemove()).rejects.toThrow(HubError); } diff --git a/apps/hubble/src/storage/stores/verificationStore.ts b/apps/hubble/src/storage/stores/verificationStore.ts index e6e9853381..9fa58a5e3c 100644 --- a/apps/hubble/src/storage/stores/verificationStore.ts +++ b/apps/hubble/src/storage/stores/verificationStore.ts @@ -1,5 +1,16 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesCompare, HubAsyncResult, HubError, isHubError } from '@farcaster/utils'; +import { + bytesCompare, + HubAsyncResult, + HubError, + HubEventType, + isHubError, + isVerificationAddEthAddressMessage, + isVerificationRemoveMessage, + Message, + MessageType, + VerificationAddEthAddressMessage, + VerificationRemoveMessage, +} from '@farcaster/hub-nodejs'; import AsyncLock from 'async-lock'; import { err, ok, ResultAsync } from 'neverthrow'; import { @@ -91,15 +102,10 @@ class VerificationStore { * * @returns the VerificationAddEthAddressModel if it exists, throws HubError otherwise */ - async getVerificationAdd(fid: number, address: Uint8Array): Promise { + async getVerificationAdd(fid: number, address: Uint8Array): Promise { const addsKey = makeVerificationAddsKey(fid, address); const messageTsHash = await this._db.get(addsKey); - return getMessage( - this._db, - fid, - UserPostfix.VerificationMessage, - messageTsHash - ); + return getMessage(this._db, fid, UserPostfix.VerificationMessage, messageTsHash); } /** @@ -109,15 +115,10 @@ class VerificationStore { * @param address the address being verified * @returns the VerificationRemoveEthAddress if it exists, throws HubError otherwise */ - async getVerificationRemove(fid: number, address: Uint8Array): Promise { + async getVerificationRemove(fid: number, address: Uint8Array): Promise { const removesKey = makeVerificationRemovesKey(fid, address); const messageTsHash = await this._db.get(removesKey); - return getMessage( - this._db, - fid, - UserPostfix.VerificationMessage, - messageTsHash - ); + return getMessage(this._db, fid, UserPostfix.VerificationMessage, messageTsHash); } /** @@ -129,9 +130,9 @@ class VerificationStore { async getVerificationAddsByFid( fid: number, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const prefix = makeMessagePrimaryKey(fid, UserPostfix.VerificationMessage); - return getMessagesPageByPrefix(this._db, prefix, protobufs.isVerificationAddEthAddressMessage, pageOptions); + return getMessagesPageByPrefix(this._db, prefix, isVerificationAddEthAddressMessage, pageOptions); } /** @@ -143,27 +144,25 @@ class VerificationStore { async getVerificationRemovesByFid( fid: number, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const prefix = makeMessagePrimaryKey(fid, UserPostfix.VerificationMessage); - return getMessagesPageByPrefix(this._db, prefix, protobufs.isVerificationRemoveMessage, pageOptions); + return getMessagesPageByPrefix(this._db, prefix, isVerificationRemoveMessage, pageOptions); } async getAllVerificationMessagesByFid( fid: number, pageOptions: PageOptions = {} - ): Promise> { + ): Promise> { const prefix = makeMessagePrimaryKey(fid, UserPostfix.VerificationMessage); - const filter = ( - message: protobufs.Message - ): message is protobufs.VerificationAddEthAddressMessage | protobufs.VerificationRemoveMessage => { - return protobufs.isVerificationAddEthAddressMessage(message) || protobufs.isVerificationRemoveMessage(message); + const filter = (message: Message): message is VerificationAddEthAddressMessage | VerificationRemoveMessage => { + return isVerificationAddEthAddressMessage(message) || isVerificationRemoveMessage(message); }; return getMessagesPageByPrefix(this._db, prefix, filter, pageOptions); } /** Merge a VerificationAdd or VerificationRemove message into the VerificationStore */ - async merge(message: protobufs.Message): Promise { - if (!protobufs.isVerificationRemoveMessage(message) && !protobufs.isVerificationAddEthAddressMessage(message)) { + async merge(message: Message): Promise { + if (!isVerificationRemoveMessage(message) && !isVerificationAddEthAddressMessage(message)) { throw new HubError('bad_request.validation_failure', 'invalid message type'); } @@ -171,9 +170,9 @@ class VerificationStore { .acquire( message.data.fid.toString(), async () => { - if (protobufs.isVerificationAddEthAddressMessage(message)) { + if (isVerificationAddEthAddressMessage(message)) { return this.mergeAdd(message); - } else if (protobufs.isVerificationRemoveMessage(message)) { + } else if (isVerificationRemoveMessage(message)) { return this.mergeRemove(message); } else { throw new HubError('bad_request.validation_failure', 'invalid message type'); @@ -186,18 +185,18 @@ class VerificationStore { }); } - async revoke(message: protobufs.Message): HubAsyncResult { + async revoke(message: Message): HubAsyncResult { let txn = this._db.transaction(); - if (protobufs.isVerificationAddEthAddressMessage(message)) { + if (isVerificationAddEthAddressMessage(message)) { txn = this.deleteVerificationAddTransaction(txn, message); - } else if (protobufs.isVerificationRemoveMessage(message)) { + } else if (isVerificationRemoveMessage(message)) { txn = this.deleteVerificationRemoveTransaction(txn, message); } else { return err(new HubError('bad_request.invalid_param', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.REVOKE_MESSAGE, + type: HubEventType.REVOKE_MESSAGE, revokeMessageBody: { message }, }); } @@ -237,16 +236,16 @@ class VerificationStore { let txn = this._db.transaction(); - if (protobufs.isVerificationAddEthAddressMessage(nextMessage.value)) { + if (isVerificationAddEthAddressMessage(nextMessage.value)) { txn = this.deleteVerificationAddTransaction(txn, nextMessage.value); - } else if (protobufs.isVerificationRemoveMessage(nextMessage.value)) { + } else if (isVerificationRemoveMessage(nextMessage.value)) { txn = this.deleteVerificationRemoveTransaction(txn, nextMessage.value); } else { return err(new HubError('unknown', 'invalid message type')); } return this._eventHandler.commitTransaction(txn, { - type: protobufs.HubEventType.PRUNE_MESSAGE, + type: HubEventType.PRUNE_MESSAGE, pruneMessageBody: { message: nextMessage.value }, }); }; @@ -276,7 +275,7 @@ class VerificationStore { /* Private Methods */ /* -------------------------------------------------------------------------- */ - private async mergeAdd(message: protobufs.VerificationAddEthAddressMessage): Promise { + private async mergeAdd(message: VerificationAddEthAddressMessage): Promise { // Define address for lookups const address = message.data.verificationAddEthAddressBody.address; if (!address) { @@ -295,7 +294,7 @@ class VerificationStore { txn = this.putVerificationAddTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: mergeConflicts.value }, }; @@ -307,7 +306,7 @@ class VerificationStore { return result.value; } - private async mergeRemove(message: protobufs.VerificationRemoveMessage): Promise { + private async mergeRemove(message: VerificationRemoveMessage): Promise { // Define address for lookups const address = message.data.verificationRemoveBody.address; if (!address) { @@ -326,7 +325,7 @@ class VerificationStore { txn = this.putVerificationRemoveTransaction(txn, message); const hubEvent: HubEventArgs = { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: mergeConflicts.value }, }; @@ -339,9 +338,9 @@ class VerificationStore { } private verificationMessageCompare( - aType: protobufs.MessageType.VERIFICATION_ADD_ETH_ADDRESS | protobufs.MessageType.VERIFICATION_REMOVE, + aType: MessageType.VERIFICATION_ADD_ETH_ADDRESS | MessageType.VERIFICATION_REMOVE, aTsHash: Uint8Array, - bType: protobufs.MessageType.VERIFICATION_ADD_ETH_ADDRESS | protobufs.MessageType.VERIFICATION_REMOVE, + bType: MessageType.VERIFICATION_ADD_ETH_ADDRESS | MessageType.VERIFICATION_REMOVE, bTsHash: Uint8Array ): number { // Compare timestamps (first 4 bytes of tsHash) to enforce Last-Write-Wins @@ -350,15 +349,9 @@ class VerificationStore { return timestampOrder; } - if ( - aType === protobufs.MessageType.VERIFICATION_REMOVE && - bType === protobufs.MessageType.VERIFICATION_ADD_ETH_ADDRESS - ) { + if (aType === MessageType.VERIFICATION_REMOVE && bType === MessageType.VERIFICATION_ADD_ETH_ADDRESS) { return 1; - } else if ( - aType === protobufs.MessageType.VERIFICATION_ADD_ETH_ADDRESS && - bType === protobufs.MessageType.VERIFICATION_REMOVE - ) { + } else if (aType === MessageType.VERIFICATION_ADD_ETH_ADDRESS && bType === MessageType.VERIFICATION_REMOVE) { return -1; } @@ -368,9 +361,9 @@ class VerificationStore { private async getMergeConflicts( address: Uint8Array, - message: protobufs.VerificationAddEthAddressMessage | protobufs.VerificationRemoveMessage - ): HubAsyncResult<(protobufs.VerificationAddEthAddressMessage | protobufs.VerificationRemoveMessage)[]> { - const conflicts: (protobufs.VerificationAddEthAddressMessage | protobufs.VerificationRemoveMessage)[] = []; + message: VerificationAddEthAddressMessage | VerificationRemoveMessage + ): HubAsyncResult<(VerificationAddEthAddressMessage | VerificationRemoveMessage)[]> { + const conflicts: (VerificationAddEthAddressMessage | VerificationRemoveMessage)[] = []; const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { @@ -385,7 +378,7 @@ class VerificationStore { if (removeTsHash.isOk()) { const removeCompare = this.verificationMessageCompare( - protobufs.MessageType.VERIFICATION_REMOVE, + MessageType.VERIFICATION_REMOVE, removeTsHash.value, message.data.type, tsHash.value @@ -397,7 +390,7 @@ class VerificationStore { } else { // If the existing remove has a lower order than the new message, retrieve the full // VerificationRemove message and delete it as part of the RocksDB transaction - const existingRemove = await getMessage( + const existingRemove = await getMessage( this._db, message.data.fid, UserPostfix.VerificationMessage, @@ -415,7 +408,7 @@ class VerificationStore { if (addTsHash.isOk()) { const addCompare = this.verificationMessageCompare( - protobufs.MessageType.VERIFICATION_ADD_ETH_ADDRESS, + MessageType.VERIFICATION_ADD_ETH_ADDRESS, addTsHash.value, message.data.type, tsHash.value @@ -429,7 +422,7 @@ class VerificationStore { } else { // If the existing add has a lower order than the new message, retrieve the full // VerificationAdd* message and delete it as part of the RocksDB transaction - const existingAdd = await getMessage( + const existingAdd = await getMessage( this._db, message.data.fid, UserPostfix.VerificationMessage, @@ -444,22 +437,19 @@ class VerificationStore { private deleteManyTransaction( txn: Transaction, - messages: (protobufs.VerificationAddEthAddressMessage | protobufs.VerificationRemoveMessage)[] + messages: (VerificationAddEthAddressMessage | VerificationRemoveMessage)[] ): Transaction { for (const message of messages) { - if (protobufs.isVerificationAddEthAddressMessage(message)) { + if (isVerificationAddEthAddressMessage(message)) { txn = this.deleteVerificationAddTransaction(txn, message); - } else if (protobufs.isVerificationRemoveMessage(message)) { + } else if (isVerificationRemoveMessage(message)) { txn = this.deleteVerificationRemoveTransaction(txn, message); } } return txn; } - private putVerificationAddTransaction( - txn: Transaction, - message: protobufs.VerificationAddEthAddressMessage - ): Transaction { + private putVerificationAddTransaction(txn: Transaction, message: VerificationAddEthAddressMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -477,10 +467,7 @@ class VerificationStore { return txn; } - private deleteVerificationAddTransaction( - txn: Transaction, - message: protobufs.VerificationAddEthAddressMessage - ): Transaction { + private deleteVerificationAddTransaction(txn: Transaction, message: VerificationAddEthAddressMessage): Transaction { // Delete from verificationAdds txn = txn.del(makeVerificationAddsKey(message.data.fid, message.data.verificationAddEthAddressBody.address)); @@ -488,10 +475,7 @@ class VerificationStore { return deleteMessageTransaction(txn, message); } - private putVerificationRemoveTransaction( - txn: Transaction, - message: protobufs.VerificationRemoveMessage - ): Transaction { + private putVerificationRemoveTransaction(txn: Transaction, message: VerificationRemoveMessage): Transaction { const tsHash = makeTsHash(message.data.timestamp, message.hash); if (tsHash.isErr()) { throw tsHash.error; @@ -509,10 +493,7 @@ class VerificationStore { return txn; } - private deleteVerificationRemoveTransaction( - txn: Transaction, - message: protobufs.VerificationRemoveMessage - ): Transaction { + private deleteVerificationRemoveTransaction(txn: Transaction, message: VerificationRemoveMessage): Transaction { // Delete from verificationRemoves txn = txn.del(makeVerificationRemovesKey(message.data.fid, message.data.verificationRemoveBody.address)); diff --git a/apps/hubble/src/test/bench/helpers.ts b/apps/hubble/src/test/bench/helpers.ts index d0f6f6c2c7..d3f59ad4c2 100644 --- a/apps/hubble/src/test/bench/helpers.ts +++ b/apps/hubble/src/test/bench/helpers.ts @@ -1,7 +1,7 @@ /* eslint-disable security/detect-object-injection */ import Chance from 'chance'; -import { Message } from '@farcaster/protobufs'; +import { Message } from '@farcaster/hub-nodejs'; import { SyncId } from '~/network/sync/syncId'; /** diff --git a/apps/hubble/src/test/bench/syncEngine.ts b/apps/hubble/src/test/bench/syncEngine.ts index 25a416c1fc..8c4e4dbc89 100644 --- a/apps/hubble/src/test/bench/syncEngine.ts +++ b/apps/hubble/src/test/bench/syncEngine.ts @@ -5,8 +5,17 @@ import { Writable } from 'node:stream'; import Chance from 'chance'; import { ok } from 'neverthrow'; -import * as protobufs from '@farcaster/protobufs'; -import { FARCASTER_EPOCH, HubResult, HubRpcClient } from '@farcaster/utils'; +import { + CastAddBody, + FarcasterNetwork, + FARCASTER_EPOCH, + HubEventType, + HubResult, + HubRpcClient, + Message, + MessageData, + MessageType, +} from '@farcaster/hub-nodejs'; import { MockRpcClient } from '~/network/sync/mock'; import SyncEngine from '~/network/sync/syncEngine'; import { SyncId } from '~/network/sync/syncId'; @@ -21,7 +30,7 @@ import { StorageCache } from '~/storage/engine/storageCache'; const INITIAL_MESSAGES_COUNT = 10_000; const FID_COUNT = 10_000; -const messages: protobufs.Message[] = []; +const messages: Message[] = []; const peers: SyncEngine[] = []; class MockEngine { @@ -33,16 +42,16 @@ class MockEngine { this.eventHandler = new StoreEventHandler(db, new StorageCache()); } - async mergeMessage(message: protobufs.Message): Promise> { + async mergeMessage(message: Message): Promise> { await this.eventHandler.commitTransaction(this.db.transaction(), { - type: protobufs.HubEventType.MERGE_MESSAGE, + type: HubEventType.MERGE_MESSAGE, mergeMessageBody: { message, deletedMessages: [] }, }); return ok(undefined); } - async getAllMessagesBySyncIds(syncIds: Uint8Array[]): Promise> { + async getAllMessagesBySyncIds(syncIds: Uint8Array[]): Promise> { return ok( syncIds.map((syncId) => { // The index is embeded in the last 10 bytes of the hash @@ -74,13 +83,13 @@ const makeMessage = (fid: number, messageId: number, timestamp: number) => { const hash = Buffer.from(blake3Truncate160(Buffer.from(messageId.toString()))); hash.fill(' ', 10); hash.write(messageId.toString(), 10); - return protobufs.Message.create({ - data: protobufs.MessageData.create({ - type: protobufs.MessageType.CAST_ADD, + return Message.create({ + data: MessageData.create({ + type: MessageType.CAST_ADD, fid, timestamp, - network: protobufs.FarcasterNetwork.DEVNET, - castAddBody: protobufs.CastAddBody.create({ + network: FarcasterNetwork.DEVNET, + castAddBody: CastAddBody.create({ text: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam pharetra dolor leo, vitae tincidunt justo scelerisque vel. Praesent ac leo at nibh rutrum aliquet. Fusce rhoncus ligula a ipsum porta, nec.', }), }), @@ -88,7 +97,7 @@ const makeMessage = (fid: number, messageId: number, timestamp: number) => { }); }; -const messageGenerator = function* (chance: Chance.Chance): Generator { +const messageGenerator = function* (chance: Chance.Chance): Generator { const fids: number[] = []; for (let i = 1; i <= FID_COUNT; i++) { fids.push(i); diff --git a/apps/hubble/src/test/e2e/gossipNetwork.test.ts b/apps/hubble/src/test/e2e/gossipNetwork.test.ts index 695cd2cb61..871ad15b38 100644 --- a/apps/hubble/src/test/e2e/gossipNetwork.test.ts +++ b/apps/hubble/src/test/e2e/gossipNetwork.test.ts @@ -1,9 +1,8 @@ -import * as protobufs from '@farcaster/protobufs'; import { GossipNode } from '~/network/p2p/gossipNode'; import { NETWORK_TOPIC_PRIMARY } from '~/network/p2p/protocol'; import { sleep } from '~/utils/crypto'; import { NetworkFactories } from '../../network/utils/factories'; - +import { GossipMessage } from '@farcaster/hub-nodejs'; const NUM_NODES = 10; const PROPAGATION_DELAY = 3 * 1000; // between 2 and 3 full heartbeat ticks @@ -15,7 +14,7 @@ describe('gossip network tests', () => { * MessageStore keeps track of every message in every topic received by a peer. It maps the * peerId -> topic -> GossipMessage[] */ - let messageStore: Map>; + let messageStore: Map>; let nodes: GossipNode[]; beforeAll(async () => { diff --git a/apps/hubble/src/test/mocks.ts b/apps/hubble/src/test/mocks.ts index c8a6f68b28..a548ec0f02 100644 --- a/apps/hubble/src/test/mocks.ts +++ b/apps/hubble/src/test/mocks.ts @@ -1,5 +1,4 @@ -import * as protobufs from '@farcaster/protobufs'; -import { HubAsyncResult, HubError } from '@farcaster/utils'; +import { HubAsyncResult, HubError, HubState, IdRegistryEvent, Message, NameRegistryEvent } from '@farcaster/hub-nodejs'; import { err } from 'neverthrow'; import { HubInterface } from '~/hubble'; import RocksDB from '~/storage/db/rocksdb'; @@ -14,24 +13,24 @@ export class MockHub implements HubInterface { this.engine = engine; } - async submitMessage(message: protobufs.Message): HubAsyncResult { + async submitMessage(message: Message): HubAsyncResult { return this.engine.mergeMessage(message); } - async submitIdRegistryEvent(event: protobufs.IdRegistryEvent): HubAsyncResult { + async submitIdRegistryEvent(event: IdRegistryEvent): HubAsyncResult { return this.engine.mergeIdRegistryEvent(event); } - async submitNameRegistryEvent(event: protobufs.NameRegistryEvent): HubAsyncResult { + async submitNameRegistryEvent(event: NameRegistryEvent): HubAsyncResult { return this.engine.mergeNameRegistryEvent(event); } - async getHubState(): HubAsyncResult { + async getHubState(): HubAsyncResult { // return ResultAsync.fromPromise(HubState.get(this.db), (e) => e as HubError); return err(new HubError('unavailable', 'Not implemented')); } - async putHubState(_hubState: protobufs.HubState): HubAsyncResult { + async putHubState(_hubState: HubState): HubAsyncResult { // const txn = this.db.transaction(); // HubStateModel.putTransaction(txn, hubState); // return await ResultAsync.fromPromise(this.db.commit(txn), (e) => e as HubError); diff --git a/apps/hubble/src/utils/command.ts b/apps/hubble/src/utils/command.ts index 84750771fa..05bc14e990 100644 --- a/apps/hubble/src/utils/command.ts +++ b/apps/hubble/src/utils/command.ts @@ -1,5 +1,4 @@ -import { FarcasterNetwork } from '@farcaster/protobufs'; -import { HubError, validations } from '@farcaster/utils'; +import { HubError, validations, FarcasterNetwork } from '@farcaster/hub-nodejs'; export const parseNetwork = (network: string): FarcasterNetwork => { const networkId = Number(network); diff --git a/apps/hubble/src/utils/logger.ts b/apps/hubble/src/utils/logger.ts index 844006a498..08c00b0b85 100644 --- a/apps/hubble/src/utils/logger.ts +++ b/apps/hubble/src/utils/logger.ts @@ -1,5 +1,11 @@ -import * as protobufs from '@farcaster/protobufs'; -import { bytesToHexString, fromFarcasterTime } from '@farcaster/utils'; +import { + bytesToHexString, + fromFarcasterTime, + IdRegistryEvent, + Message, + MessageType, + NameRegistryEvent, +} from '@farcaster/hub-nodejs'; import { default as Pino } from 'pino'; /** @@ -41,13 +47,13 @@ if (process.env['NODE_ENV'] === 'test' || process.env['CI']) { export const logger = Pino(defaultOptions); -export const messageTypeToName = (type?: protobufs.MessageType) => { +export const messageTypeToName = (type?: MessageType) => { if (!type) return ''; // eslint-disable-next-line security/detect-object-injection - return (protobufs.MessageType[type] as string).replace('MESSAGE_TYPE_', ''); + return (MessageType[type] as string).replace('MESSAGE_TYPE_', ''); }; -export const messageToLog = (message: protobufs.Message) => { +export const messageToLog = (message: Message) => { return { timestamp: fromFarcasterTime(message.data?.timestamp || 0)._unsafeUnwrap(), hash: bytesToHexString(message.hash)._unsafeUnwrap(), @@ -56,7 +62,7 @@ export const messageToLog = (message: protobufs.Message) => { }; }; -export const idRegistryEventToLog = (event: protobufs.IdRegistryEvent) => { +export const idRegistryEventToLog = (event: IdRegistryEvent) => { return { blockNumber: event.blockNumber, fid: event.fid, @@ -64,7 +70,7 @@ export const idRegistryEventToLog = (event: protobufs.IdRegistryEvent) => { }; }; -export const nameRegistryEventToLog = (event: protobufs.NameRegistryEvent) => { +export const nameRegistryEventToLog = (event: NameRegistryEvent) => { return { blockNumber: event.blockNumber, fname: Buffer.from(event.fname).toString('utf-8').replace(/\0/g, ''), diff --git a/apps/hubble/src/utils/p2p.ts b/apps/hubble/src/utils/p2p.ts index a8e9949bd5..b2f4f7665c 100644 --- a/apps/hubble/src/utils/p2p.ts +++ b/apps/hubble/src/utils/p2p.ts @@ -1,5 +1,4 @@ -import { GossipAddressInfo } from '@farcaster/protobufs'; -import { HubAsyncResult, HubError, HubResult } from '@farcaster/utils'; +import { GossipAddressInfo, HubAsyncResult, HubError, HubResult } from '@farcaster/hub-nodejs'; import { Multiaddr, NodeAddress, multiaddr } from '@multiformats/multiaddr'; import { get } from 'http'; import { AddressInfo, isIP } from 'net'; diff --git a/apps/hubble/src/utils/periodicTestDataJob.ts b/apps/hubble/src/utils/periodicTestDataJob.ts index ec976689c6..9c34dd1357 100644 --- a/apps/hubble/src/utils/periodicTestDataJob.ts +++ b/apps/hubble/src/utils/periodicTestDataJob.ts @@ -2,18 +2,19 @@ import { Wallet } from 'ethers'; import cron from 'node-cron'; import { EthersEip712Signer, - getAuthMetadata, - getInsecureHubRpcClient, - HubRpcClient, makeCastAdd, makeReactionAdd, makeSignerAdd, NobleEd25519Signer, toFarcasterTime, -} from '@farcaster/utils'; + getAuthMetadata, + getInsecureHubRpcClient, + HubRpcClient, + FarcasterNetwork, + ReactionType, +} from '@farcaster/hub-nodejs'; import { logger } from '~/utils/logger'; import * as ed from '@noble/ed25519'; -import { FarcasterNetwork, ReactionType } from '@farcaster/protobufs'; import { faker } from '@faker-js/faker'; import Server from '~/rpc/server'; import { Result } from 'neverthrow'; diff --git a/codecov.yml b/codecov.yml index ea38918fed..08479cf54a 100644 --- a/codecov.yml +++ b/codecov.yml @@ -12,4 +12,4 @@ coverage: base: auto if_ci_failed: success ignore: - - "packages/**/src/generated/**.ts" + - "**/generated" diff --git a/packages/hub-nodejs/package.json b/packages/hub-nodejs/package.json index 8c66522c28..110e903618 100644 --- a/packages/hub-nodejs/package.json +++ b/packages/hub-nodejs/package.json @@ -18,6 +18,7 @@ "dependencies": { "@farcaster/protobufs": "0.1.11", "@farcaster/utils": "0.4.0", + "@grpc/grpc-js": "^1.8.13", "@noble/hashes": "^1.3.0", "ethers": "~6.2.1", "neverthrow": "^6.0.0" @@ -25,6 +26,7 @@ "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts --clean", "clean": "rimraf ./dist", + "protoc": "protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./src/generated/ --ts_proto_opt=esModuleInterop=true,exportCommonSymbols=false,outputServices=grpc-js,useOptionals=none,unrecognizedEnum=false,removeEnumPrefix=true --proto_path=../protobufs/src/schemas ../protobufs/src/schemas/rpc.proto", "lint": "eslint src/ --color --ext .ts", "test": "NODE_OPTIONS=--experimental-vm-modules jest", "test:ci": "ENVIRONMENT=test NODE_OPTIONS=--experimental-vm-modules jest --ci --forceExit --coverage", @@ -33,7 +35,8 @@ "devDependencies": { "@faker-js/faker": "^7.6.0", "eslint-config-custom": "*", - "prettier-config-custom": "*" + "prettier-config-custom": "*", + "ts-proto": "^1.146.0" }, "publishConfig": { "access": "public" diff --git a/packages/utils/src/client.ts b/packages/hub-nodejs/src/client.ts similarity index 80% rename from packages/utils/src/client.ts rename to packages/hub-nodejs/src/client.ts index e358f1ea97..23bf77c597 100644 --- a/packages/utils/src/client.ts +++ b/packages/hub-nodejs/src/client.ts @@ -1,18 +1,9 @@ -import { - AdminServiceClient, - CallOptions, - Client, - ClientReadableStream, - ClientUnaryCall, - getAdminClient, - getInsecureClient, - getSSLClient, - HubServiceClient, - Metadata, - ServiceError, -} from '@farcaster/protobufs'; +import { AdminServiceClient, HubServiceClient } from './generated/rpc'; +import * as grpc from '@grpc/grpc-js'; +import { Metadata } from '@grpc/grpc-js'; +import type { CallOptions, Client, ClientReadableStream, ClientUnaryCall, ServiceError } from '@grpc/grpc-js'; import { err, ok } from 'neverthrow'; -import { HubError, HubErrorCode, HubResult } from './errors'; +import { HubError, HubErrorCode, HubResult } from '@farcaster/utils'; const fromServiceError = (err: ServiceError): HubError => { let context = err.details; @@ -127,3 +118,21 @@ export const getAuthMetadata = (username: string, password: string): Metadata => metadata.set('authorization', `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`); return metadata; }; + +export const getServer = (): grpc.Server => { + const server = new grpc.Server(); + + return server; +}; + +export const getSSLClient = (address: string): HubServiceClient => { + return new HubServiceClient(address, grpc.credentials.createSsl()); +}; + +export const getInsecureClient = (address: string): HubServiceClient => { + return new HubServiceClient(address, grpc.credentials.createInsecure()); +}; + +export const getAdminClient = (address: string): AdminServiceClient => { + return new AdminServiceClient(address, grpc.credentials.createInsecure()); +}; diff --git a/packages/hub-nodejs/src/generated/hub_event.ts b/packages/hub-nodejs/src/generated/hub_event.ts new file mode 100644 index 0000000000..03fe40f876 --- /dev/null +++ b/packages/hub-nodejs/src/generated/hub_event.ts @@ -0,0 +1,638 @@ +/* eslint-disable */ +import Long from 'long'; +import _m0 from 'protobufjs/minimal'; +import { IdRegistryEvent } from './id_registry_event'; +import { Message } from './message'; +import { NameRegistryEvent } from './name_registry_event'; + +export enum HubEventType { + NONE = 0, + MERGE_MESSAGE = 1, + PRUNE_MESSAGE = 2, + REVOKE_MESSAGE = 3, + MERGE_ID_REGISTRY_EVENT = 4, + MERGE_NAME_REGISTRY_EVENT = 5, +} + +export function hubEventTypeFromJSON(object: any): HubEventType { + switch (object) { + case 0: + case 'HUB_EVENT_TYPE_NONE': + return HubEventType.NONE; + case 1: + case 'HUB_EVENT_TYPE_MERGE_MESSAGE': + return HubEventType.MERGE_MESSAGE; + case 2: + case 'HUB_EVENT_TYPE_PRUNE_MESSAGE': + return HubEventType.PRUNE_MESSAGE; + case 3: + case 'HUB_EVENT_TYPE_REVOKE_MESSAGE': + return HubEventType.REVOKE_MESSAGE; + case 4: + case 'HUB_EVENT_TYPE_MERGE_ID_REGISTRY_EVENT': + return HubEventType.MERGE_ID_REGISTRY_EVENT; + case 5: + case 'HUB_EVENT_TYPE_MERGE_NAME_REGISTRY_EVENT': + return HubEventType.MERGE_NAME_REGISTRY_EVENT; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum HubEventType'); + } +} + +export function hubEventTypeToJSON(object: HubEventType): string { + switch (object) { + case HubEventType.NONE: + return 'HUB_EVENT_TYPE_NONE'; + case HubEventType.MERGE_MESSAGE: + return 'HUB_EVENT_TYPE_MERGE_MESSAGE'; + case HubEventType.PRUNE_MESSAGE: + return 'HUB_EVENT_TYPE_PRUNE_MESSAGE'; + case HubEventType.REVOKE_MESSAGE: + return 'HUB_EVENT_TYPE_REVOKE_MESSAGE'; + case HubEventType.MERGE_ID_REGISTRY_EVENT: + return 'HUB_EVENT_TYPE_MERGE_ID_REGISTRY_EVENT'; + case HubEventType.MERGE_NAME_REGISTRY_EVENT: + return 'HUB_EVENT_TYPE_MERGE_NAME_REGISTRY_EVENT'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum HubEventType'); + } +} + +export interface MergeMessageBody { + message: Message | undefined; + deletedMessages: Message[]; +} + +export interface PruneMessageBody { + message: Message | undefined; +} + +export interface RevokeMessageBody { + message: Message | undefined; +} + +export interface MergeIdRegistryEventBody { + idRegistryEvent: IdRegistryEvent | undefined; +} + +export interface MergeNameRegistryEventBody { + nameRegistryEvent: NameRegistryEvent | undefined; +} + +export interface HubEvent { + type: HubEventType; + id: number; + mergeMessageBody?: MergeMessageBody | undefined; + pruneMessageBody?: PruneMessageBody | undefined; + revokeMessageBody?: RevokeMessageBody | undefined; + mergeIdRegistryEventBody?: MergeIdRegistryEventBody | undefined; + mergeNameRegistryEventBody?: MergeNameRegistryEventBody | undefined; +} + +function createBaseMergeMessageBody(): MergeMessageBody { + return { message: undefined, deletedMessages: [] }; +} + +export const MergeMessageBody = { + encode(message: MergeMessageBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.message !== undefined) { + Message.encode(message.message, writer.uint32(10).fork()).ldelim(); + } + for (const v of message.deletedMessages) { + Message.encode(v!, writer.uint32(18).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MergeMessageBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMergeMessageBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.message = Message.decode(reader, reader.uint32()); + continue; + case 2: + if (tag != 18) { + break; + } + + message.deletedMessages.push(Message.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MergeMessageBody { + return { + message: isSet(object.message) ? Message.fromJSON(object.message) : undefined, + deletedMessages: Array.isArray(object?.deletedMessages) + ? object.deletedMessages.map((e: any) => Message.fromJSON(e)) + : [], + }; + }, + + toJSON(message: MergeMessageBody): unknown { + const obj: any = {}; + message.message !== undefined && (obj.message = message.message ? Message.toJSON(message.message) : undefined); + if (message.deletedMessages) { + obj.deletedMessages = message.deletedMessages.map((e) => (e ? Message.toJSON(e) : undefined)); + } else { + obj.deletedMessages = []; + } + return obj; + }, + + create, I>>(base?: I): MergeMessageBody { + return MergeMessageBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): MergeMessageBody { + const message = createBaseMergeMessageBody(); + message.message = + object.message !== undefined && object.message !== null ? Message.fromPartial(object.message) : undefined; + message.deletedMessages = object.deletedMessages?.map((e) => Message.fromPartial(e)) || []; + return message; + }, +}; + +function createBasePruneMessageBody(): PruneMessageBody { + return { message: undefined }; +} + +export const PruneMessageBody = { + encode(message: PruneMessageBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.message !== undefined) { + Message.encode(message.message, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): PruneMessageBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePruneMessageBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.message = Message.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): PruneMessageBody { + return { message: isSet(object.message) ? Message.fromJSON(object.message) : undefined }; + }, + + toJSON(message: PruneMessageBody): unknown { + const obj: any = {}; + message.message !== undefined && (obj.message = message.message ? Message.toJSON(message.message) : undefined); + return obj; + }, + + create, I>>(base?: I): PruneMessageBody { + return PruneMessageBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): PruneMessageBody { + const message = createBasePruneMessageBody(); + message.message = + object.message !== undefined && object.message !== null ? Message.fromPartial(object.message) : undefined; + return message; + }, +}; + +function createBaseRevokeMessageBody(): RevokeMessageBody { + return { message: undefined }; +} + +export const RevokeMessageBody = { + encode(message: RevokeMessageBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.message !== undefined) { + Message.encode(message.message, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): RevokeMessageBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseRevokeMessageBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.message = Message.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): RevokeMessageBody { + return { message: isSet(object.message) ? Message.fromJSON(object.message) : undefined }; + }, + + toJSON(message: RevokeMessageBody): unknown { + const obj: any = {}; + message.message !== undefined && (obj.message = message.message ? Message.toJSON(message.message) : undefined); + return obj; + }, + + create, I>>(base?: I): RevokeMessageBody { + return RevokeMessageBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): RevokeMessageBody { + const message = createBaseRevokeMessageBody(); + message.message = + object.message !== undefined && object.message !== null ? Message.fromPartial(object.message) : undefined; + return message; + }, +}; + +function createBaseMergeIdRegistryEventBody(): MergeIdRegistryEventBody { + return { idRegistryEvent: undefined }; +} + +export const MergeIdRegistryEventBody = { + encode(message: MergeIdRegistryEventBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.idRegistryEvent !== undefined) { + IdRegistryEvent.encode(message.idRegistryEvent, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MergeIdRegistryEventBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMergeIdRegistryEventBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.idRegistryEvent = IdRegistryEvent.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MergeIdRegistryEventBody { + return { + idRegistryEvent: isSet(object.idRegistryEvent) ? IdRegistryEvent.fromJSON(object.idRegistryEvent) : undefined, + }; + }, + + toJSON(message: MergeIdRegistryEventBody): unknown { + const obj: any = {}; + message.idRegistryEvent !== undefined && + (obj.idRegistryEvent = message.idRegistryEvent ? IdRegistryEvent.toJSON(message.idRegistryEvent) : undefined); + return obj; + }, + + create, I>>(base?: I): MergeIdRegistryEventBody { + return MergeIdRegistryEventBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): MergeIdRegistryEventBody { + const message = createBaseMergeIdRegistryEventBody(); + message.idRegistryEvent = + object.idRegistryEvent !== undefined && object.idRegistryEvent !== null + ? IdRegistryEvent.fromPartial(object.idRegistryEvent) + : undefined; + return message; + }, +}; + +function createBaseMergeNameRegistryEventBody(): MergeNameRegistryEventBody { + return { nameRegistryEvent: undefined }; +} + +export const MergeNameRegistryEventBody = { + encode(message: MergeNameRegistryEventBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.nameRegistryEvent !== undefined) { + NameRegistryEvent.encode(message.nameRegistryEvent, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MergeNameRegistryEventBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMergeNameRegistryEventBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.nameRegistryEvent = NameRegistryEvent.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MergeNameRegistryEventBody { + return { + nameRegistryEvent: isSet(object.nameRegistryEvent) + ? NameRegistryEvent.fromJSON(object.nameRegistryEvent) + : undefined, + }; + }, + + toJSON(message: MergeNameRegistryEventBody): unknown { + const obj: any = {}; + message.nameRegistryEvent !== undefined && + (obj.nameRegistryEvent = message.nameRegistryEvent + ? NameRegistryEvent.toJSON(message.nameRegistryEvent) + : undefined); + return obj; + }, + + create, I>>(base?: I): MergeNameRegistryEventBody { + return MergeNameRegistryEventBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): MergeNameRegistryEventBody { + const message = createBaseMergeNameRegistryEventBody(); + message.nameRegistryEvent = + object.nameRegistryEvent !== undefined && object.nameRegistryEvent !== null + ? NameRegistryEvent.fromPartial(object.nameRegistryEvent) + : undefined; + return message; + }, +}; + +function createBaseHubEvent(): HubEvent { + return { + type: 0, + id: 0, + mergeMessageBody: undefined, + pruneMessageBody: undefined, + revokeMessageBody: undefined, + mergeIdRegistryEventBody: undefined, + mergeNameRegistryEventBody: undefined, + }; +} + +export const HubEvent = { + encode(message: HubEvent, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.type !== 0) { + writer.uint32(8).int32(message.type); + } + if (message.id !== 0) { + writer.uint32(16).uint64(message.id); + } + if (message.mergeMessageBody !== undefined) { + MergeMessageBody.encode(message.mergeMessageBody, writer.uint32(26).fork()).ldelim(); + } + if (message.pruneMessageBody !== undefined) { + PruneMessageBody.encode(message.pruneMessageBody, writer.uint32(34).fork()).ldelim(); + } + if (message.revokeMessageBody !== undefined) { + RevokeMessageBody.encode(message.revokeMessageBody, writer.uint32(42).fork()).ldelim(); + } + if (message.mergeIdRegistryEventBody !== undefined) { + MergeIdRegistryEventBody.encode(message.mergeIdRegistryEventBody, writer.uint32(50).fork()).ldelim(); + } + if (message.mergeNameRegistryEventBody !== undefined) { + MergeNameRegistryEventBody.encode(message.mergeNameRegistryEventBody, writer.uint32(58).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HubEvent { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHubEvent(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.type = reader.int32() as any; + continue; + case 2: + if (tag != 16) { + break; + } + + message.id = longToNumber(reader.uint64() as Long); + continue; + case 3: + if (tag != 26) { + break; + } + + message.mergeMessageBody = MergeMessageBody.decode(reader, reader.uint32()); + continue; + case 4: + if (tag != 34) { + break; + } + + message.pruneMessageBody = PruneMessageBody.decode(reader, reader.uint32()); + continue; + case 5: + if (tag != 42) { + break; + } + + message.revokeMessageBody = RevokeMessageBody.decode(reader, reader.uint32()); + continue; + case 6: + if (tag != 50) { + break; + } + + message.mergeIdRegistryEventBody = MergeIdRegistryEventBody.decode(reader, reader.uint32()); + continue; + case 7: + if (tag != 58) { + break; + } + + message.mergeNameRegistryEventBody = MergeNameRegistryEventBody.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): HubEvent { + return { + type: isSet(object.type) ? hubEventTypeFromJSON(object.type) : 0, + id: isSet(object.id) ? Number(object.id) : 0, + mergeMessageBody: isSet(object.mergeMessageBody) ? MergeMessageBody.fromJSON(object.mergeMessageBody) : undefined, + pruneMessageBody: isSet(object.pruneMessageBody) ? PruneMessageBody.fromJSON(object.pruneMessageBody) : undefined, + revokeMessageBody: isSet(object.revokeMessageBody) + ? RevokeMessageBody.fromJSON(object.revokeMessageBody) + : undefined, + mergeIdRegistryEventBody: isSet(object.mergeIdRegistryEventBody) + ? MergeIdRegistryEventBody.fromJSON(object.mergeIdRegistryEventBody) + : undefined, + mergeNameRegistryEventBody: isSet(object.mergeNameRegistryEventBody) + ? MergeNameRegistryEventBody.fromJSON(object.mergeNameRegistryEventBody) + : undefined, + }; + }, + + toJSON(message: HubEvent): unknown { + const obj: any = {}; + message.type !== undefined && (obj.type = hubEventTypeToJSON(message.type)); + message.id !== undefined && (obj.id = Math.round(message.id)); + message.mergeMessageBody !== undefined && + (obj.mergeMessageBody = message.mergeMessageBody ? MergeMessageBody.toJSON(message.mergeMessageBody) : undefined); + message.pruneMessageBody !== undefined && + (obj.pruneMessageBody = message.pruneMessageBody ? PruneMessageBody.toJSON(message.pruneMessageBody) : undefined); + message.revokeMessageBody !== undefined && + (obj.revokeMessageBody = message.revokeMessageBody + ? RevokeMessageBody.toJSON(message.revokeMessageBody) + : undefined); + message.mergeIdRegistryEventBody !== undefined && + (obj.mergeIdRegistryEventBody = message.mergeIdRegistryEventBody + ? MergeIdRegistryEventBody.toJSON(message.mergeIdRegistryEventBody) + : undefined); + message.mergeNameRegistryEventBody !== undefined && + (obj.mergeNameRegistryEventBody = message.mergeNameRegistryEventBody + ? MergeNameRegistryEventBody.toJSON(message.mergeNameRegistryEventBody) + : undefined); + return obj; + }, + + create, I>>(base?: I): HubEvent { + return HubEvent.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): HubEvent { + const message = createBaseHubEvent(); + message.type = object.type ?? 0; + message.id = object.id ?? 0; + message.mergeMessageBody = + object.mergeMessageBody !== undefined && object.mergeMessageBody !== null + ? MergeMessageBody.fromPartial(object.mergeMessageBody) + : undefined; + message.pruneMessageBody = + object.pruneMessageBody !== undefined && object.pruneMessageBody !== null + ? PruneMessageBody.fromPartial(object.pruneMessageBody) + : undefined; + message.revokeMessageBody = + object.revokeMessageBody !== undefined && object.revokeMessageBody !== null + ? RevokeMessageBody.fromPartial(object.revokeMessageBody) + : undefined; + message.mergeIdRegistryEventBody = + object.mergeIdRegistryEventBody !== undefined && object.mergeIdRegistryEventBody !== null + ? MergeIdRegistryEventBody.fromPartial(object.mergeIdRegistryEventBody) + : undefined; + message.mergeNameRegistryEventBody = + object.mergeNameRegistryEventBody !== undefined && object.mergeNameRegistryEventBody !== null + ? MergeNameRegistryEventBody.fromPartial(object.mergeNameRegistryEventBody) + : undefined; + return message; + }, +}; + +declare var self: any | undefined; +declare var window: any | undefined; +declare var global: any | undefined; +var tsProtoGlobalThis: any = (() => { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof global !== 'undefined') { + return global; + } + throw 'Unable to locate global object'; +})(); + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(long: Long): number { + if (long.gt(Number.MAX_SAFE_INTEGER)) { + throw new tsProtoGlobalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); + } + return long.toNumber(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/packages/hub-nodejs/src/generated/id_registry_event.ts b/packages/hub-nodejs/src/generated/id_registry_event.ts new file mode 100644 index 0000000000..35d192b2cb --- /dev/null +++ b/packages/hub-nodejs/src/generated/id_registry_event.ts @@ -0,0 +1,289 @@ +/* eslint-disable */ +import Long from 'long'; +import _m0 from 'protobufjs/minimal'; + +export enum IdRegistryEventType { + NONE = 0, + REGISTER = 1, + TRANSFER = 2, +} + +export function idRegistryEventTypeFromJSON(object: any): IdRegistryEventType { + switch (object) { + case 0: + case 'ID_REGISTRY_EVENT_TYPE_NONE': + return IdRegistryEventType.NONE; + case 1: + case 'ID_REGISTRY_EVENT_TYPE_REGISTER': + return IdRegistryEventType.REGISTER; + case 2: + case 'ID_REGISTRY_EVENT_TYPE_TRANSFER': + return IdRegistryEventType.TRANSFER; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum IdRegistryEventType'); + } +} + +export function idRegistryEventTypeToJSON(object: IdRegistryEventType): string { + switch (object) { + case IdRegistryEventType.NONE: + return 'ID_REGISTRY_EVENT_TYPE_NONE'; + case IdRegistryEventType.REGISTER: + return 'ID_REGISTRY_EVENT_TYPE_REGISTER'; + case IdRegistryEventType.TRANSFER: + return 'ID_REGISTRY_EVENT_TYPE_TRANSFER'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum IdRegistryEventType'); + } +} + +export interface IdRegistryEvent { + blockNumber: number; + blockHash: Uint8Array; + transactionHash: Uint8Array; + logIndex: number; + fid: number; + to: Uint8Array; + type: IdRegistryEventType; + from: Uint8Array; +} + +function createBaseIdRegistryEvent(): IdRegistryEvent { + return { + blockNumber: 0, + blockHash: new Uint8Array(), + transactionHash: new Uint8Array(), + logIndex: 0, + fid: 0, + to: new Uint8Array(), + type: 0, + from: new Uint8Array(), + }; +} + +export const IdRegistryEvent = { + encode(message: IdRegistryEvent, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.blockNumber !== 0) { + writer.uint32(8).uint32(message.blockNumber); + } + if (message.blockHash.length !== 0) { + writer.uint32(18).bytes(message.blockHash); + } + if (message.transactionHash.length !== 0) { + writer.uint32(26).bytes(message.transactionHash); + } + if (message.logIndex !== 0) { + writer.uint32(32).uint32(message.logIndex); + } + if (message.fid !== 0) { + writer.uint32(40).uint64(message.fid); + } + if (message.to.length !== 0) { + writer.uint32(50).bytes(message.to); + } + if (message.type !== 0) { + writer.uint32(56).int32(message.type); + } + if (message.from.length !== 0) { + writer.uint32(66).bytes(message.from); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEvent { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIdRegistryEvent(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.blockNumber = reader.uint32(); + continue; + case 2: + if (tag != 18) { + break; + } + + message.blockHash = reader.bytes(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.transactionHash = reader.bytes(); + continue; + case 4: + if (tag != 32) { + break; + } + + message.logIndex = reader.uint32(); + continue; + case 5: + if (tag != 40) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 6: + if (tag != 50) { + break; + } + + message.to = reader.bytes(); + continue; + case 7: + if (tag != 56) { + break; + } + + message.type = reader.int32() as any; + continue; + case 8: + if (tag != 66) { + break; + } + + message.from = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): IdRegistryEvent { + return { + blockNumber: isSet(object.blockNumber) ? Number(object.blockNumber) : 0, + blockHash: isSet(object.blockHash) ? bytesFromBase64(object.blockHash) : new Uint8Array(), + transactionHash: isSet(object.transactionHash) ? bytesFromBase64(object.transactionHash) : new Uint8Array(), + logIndex: isSet(object.logIndex) ? Number(object.logIndex) : 0, + fid: isSet(object.fid) ? Number(object.fid) : 0, + to: isSet(object.to) ? bytesFromBase64(object.to) : new Uint8Array(), + type: isSet(object.type) ? idRegistryEventTypeFromJSON(object.type) : 0, + from: isSet(object.from) ? bytesFromBase64(object.from) : new Uint8Array(), + }; + }, + + toJSON(message: IdRegistryEvent): unknown { + const obj: any = {}; + message.blockNumber !== undefined && (obj.blockNumber = Math.round(message.blockNumber)); + message.blockHash !== undefined && + (obj.blockHash = base64FromBytes(message.blockHash !== undefined ? message.blockHash : new Uint8Array())); + message.transactionHash !== undefined && + (obj.transactionHash = base64FromBytes( + message.transactionHash !== undefined ? message.transactionHash : new Uint8Array() + )); + message.logIndex !== undefined && (obj.logIndex = Math.round(message.logIndex)); + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.to !== undefined && (obj.to = base64FromBytes(message.to !== undefined ? message.to : new Uint8Array())); + message.type !== undefined && (obj.type = idRegistryEventTypeToJSON(message.type)); + message.from !== undefined && + (obj.from = base64FromBytes(message.from !== undefined ? message.from : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): IdRegistryEvent { + return IdRegistryEvent.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): IdRegistryEvent { + const message = createBaseIdRegistryEvent(); + message.blockNumber = object.blockNumber ?? 0; + message.blockHash = object.blockHash ?? new Uint8Array(); + message.transactionHash = object.transactionHash ?? new Uint8Array(); + message.logIndex = object.logIndex ?? 0; + message.fid = object.fid ?? 0; + message.to = object.to ?? new Uint8Array(); + message.type = object.type ?? 0; + message.from = object.from ?? new Uint8Array(); + return message; + }, +}; + +declare var self: any | undefined; +declare var window: any | undefined; +declare var global: any | undefined; +var tsProtoGlobalThis: any = (() => { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof global !== 'undefined') { + return global; + } + throw 'Unable to locate global object'; +})(); + +function bytesFromBase64(b64: string): Uint8Array { + if (tsProtoGlobalThis.Buffer) { + return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, 'base64')); + } else { + const bin = tsProtoGlobalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if (tsProtoGlobalThis.Buffer) { + return tsProtoGlobalThis.Buffer.from(arr).toString('base64'); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(String.fromCharCode(byte)); + }); + return tsProtoGlobalThis.btoa(bin.join('')); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(long: Long): number { + if (long.gt(Number.MAX_SAFE_INTEGER)) { + throw new tsProtoGlobalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); + } + return long.toNumber(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/packages/hub-nodejs/src/generated/message.ts b/packages/hub-nodejs/src/generated/message.ts new file mode 100644 index 0000000000..21b8568de3 --- /dev/null +++ b/packages/hub-nodejs/src/generated/message.ts @@ -0,0 +1,1583 @@ +/* eslint-disable */ +import Long from 'long'; +import _m0 from 'protobufjs/minimal'; + +/** Type of hashing scheme used to produce a digest of MessageData */ +export enum HashScheme { + NONE = 0, + /** BLAKE3 - Default scheme for hashing MessageData */ + BLAKE3 = 1, +} + +export function hashSchemeFromJSON(object: any): HashScheme { + switch (object) { + case 0: + case 'HASH_SCHEME_NONE': + return HashScheme.NONE; + case 1: + case 'HASH_SCHEME_BLAKE3': + return HashScheme.BLAKE3; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum HashScheme'); + } +} + +export function hashSchemeToJSON(object: HashScheme): string { + switch (object) { + case HashScheme.NONE: + return 'HASH_SCHEME_NONE'; + case HashScheme.BLAKE3: + return 'HASH_SCHEME_BLAKE3'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum HashScheme'); + } +} + +/** Type of signature scheme used to sign the Message hash */ +export enum SignatureScheme { + NONE = 0, + /** ED25519 - Ed25519 signature (default) */ + ED25519 = 1, + /** EIP712 - ECDSA signature using EIP-712 scheme */ + EIP712 = 2, +} + +export function signatureSchemeFromJSON(object: any): SignatureScheme { + switch (object) { + case 0: + case 'SIGNATURE_SCHEME_NONE': + return SignatureScheme.NONE; + case 1: + case 'SIGNATURE_SCHEME_ED25519': + return SignatureScheme.ED25519; + case 2: + case 'SIGNATURE_SCHEME_EIP712': + return SignatureScheme.EIP712; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum SignatureScheme'); + } +} + +export function signatureSchemeToJSON(object: SignatureScheme): string { + switch (object) { + case SignatureScheme.NONE: + return 'SIGNATURE_SCHEME_NONE'; + case SignatureScheme.ED25519: + return 'SIGNATURE_SCHEME_ED25519'; + case SignatureScheme.EIP712: + return 'SIGNATURE_SCHEME_EIP712'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum SignatureScheme'); + } +} + +/** Type of the MessageBody */ +export enum MessageType { + NONE = 0, + /** CAST_ADD - Add a new Cast */ + CAST_ADD = 1, + /** CAST_REMOVE - Remove an existing Cast */ + CAST_REMOVE = 2, + /** REACTION_ADD - Add a Reaction to a Cast */ + REACTION_ADD = 3, + /** REACTION_REMOVE - Remove a Reaction from a Cast */ + REACTION_REMOVE = 4, + /** VERIFICATION_ADD_ETH_ADDRESS - Add a Verification of an Ethereum Address */ + VERIFICATION_ADD_ETH_ADDRESS = 7, + /** VERIFICATION_REMOVE - Remove a Verification */ + VERIFICATION_REMOVE = 8, + /** SIGNER_ADD - Add a new Ed25519 key pair that signs messages for a user */ + SIGNER_ADD = 9, + /** SIGNER_REMOVE - Remove an Ed25519 key pair that signs messages for a user */ + SIGNER_REMOVE = 10, + /** USER_DATA_ADD - Add metadata about a user */ + USER_DATA_ADD = 11, +} + +export function messageTypeFromJSON(object: any): MessageType { + switch (object) { + case 0: + case 'MESSAGE_TYPE_NONE': + return MessageType.NONE; + case 1: + case 'MESSAGE_TYPE_CAST_ADD': + return MessageType.CAST_ADD; + case 2: + case 'MESSAGE_TYPE_CAST_REMOVE': + return MessageType.CAST_REMOVE; + case 3: + case 'MESSAGE_TYPE_REACTION_ADD': + return MessageType.REACTION_ADD; + case 4: + case 'MESSAGE_TYPE_REACTION_REMOVE': + return MessageType.REACTION_REMOVE; + case 7: + case 'MESSAGE_TYPE_VERIFICATION_ADD_ETH_ADDRESS': + return MessageType.VERIFICATION_ADD_ETH_ADDRESS; + case 8: + case 'MESSAGE_TYPE_VERIFICATION_REMOVE': + return MessageType.VERIFICATION_REMOVE; + case 9: + case 'MESSAGE_TYPE_SIGNER_ADD': + return MessageType.SIGNER_ADD; + case 10: + case 'MESSAGE_TYPE_SIGNER_REMOVE': + return MessageType.SIGNER_REMOVE; + case 11: + case 'MESSAGE_TYPE_USER_DATA_ADD': + return MessageType.USER_DATA_ADD; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum MessageType'); + } +} + +export function messageTypeToJSON(object: MessageType): string { + switch (object) { + case MessageType.NONE: + return 'MESSAGE_TYPE_NONE'; + case MessageType.CAST_ADD: + return 'MESSAGE_TYPE_CAST_ADD'; + case MessageType.CAST_REMOVE: + return 'MESSAGE_TYPE_CAST_REMOVE'; + case MessageType.REACTION_ADD: + return 'MESSAGE_TYPE_REACTION_ADD'; + case MessageType.REACTION_REMOVE: + return 'MESSAGE_TYPE_REACTION_REMOVE'; + case MessageType.VERIFICATION_ADD_ETH_ADDRESS: + return 'MESSAGE_TYPE_VERIFICATION_ADD_ETH_ADDRESS'; + case MessageType.VERIFICATION_REMOVE: + return 'MESSAGE_TYPE_VERIFICATION_REMOVE'; + case MessageType.SIGNER_ADD: + return 'MESSAGE_TYPE_SIGNER_ADD'; + case MessageType.SIGNER_REMOVE: + return 'MESSAGE_TYPE_SIGNER_REMOVE'; + case MessageType.USER_DATA_ADD: + return 'MESSAGE_TYPE_USER_DATA_ADD'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum MessageType'); + } +} + +/** Farcaster network the message is intended for */ +export enum FarcasterNetwork { + NONE = 0, + /** MAINNET - Public primary network */ + MAINNET = 1, + /** TESTNET - Public test network */ + TESTNET = 2, + /** DEVNET - Private test network */ + DEVNET = 3, +} + +export function farcasterNetworkFromJSON(object: any): FarcasterNetwork { + switch (object) { + case 0: + case 'FARCASTER_NETWORK_NONE': + return FarcasterNetwork.NONE; + case 1: + case 'FARCASTER_NETWORK_MAINNET': + return FarcasterNetwork.MAINNET; + case 2: + case 'FARCASTER_NETWORK_TESTNET': + return FarcasterNetwork.TESTNET; + case 3: + case 'FARCASTER_NETWORK_DEVNET': + return FarcasterNetwork.DEVNET; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum FarcasterNetwork'); + } +} + +export function farcasterNetworkToJSON(object: FarcasterNetwork): string { + switch (object) { + case FarcasterNetwork.NONE: + return 'FARCASTER_NETWORK_NONE'; + case FarcasterNetwork.MAINNET: + return 'FARCASTER_NETWORK_MAINNET'; + case FarcasterNetwork.TESTNET: + return 'FARCASTER_NETWORK_TESTNET'; + case FarcasterNetwork.DEVNET: + return 'FARCASTER_NETWORK_DEVNET'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum FarcasterNetwork'); + } +} + +/** Type of UserData */ +export enum UserDataType { + NONE = 0, + /** PFP - Profile Picture for the user */ + PFP = 1, + /** DISPLAY - Display Name for the user */ + DISPLAY = 2, + /** BIO - Bio for the user */ + BIO = 3, + /** URL - URL of the user */ + URL = 5, + /** FNAME - Preferred Farcaster Name for the user */ + FNAME = 6, +} + +export function userDataTypeFromJSON(object: any): UserDataType { + switch (object) { + case 0: + case 'USER_DATA_TYPE_NONE': + return UserDataType.NONE; + case 1: + case 'USER_DATA_TYPE_PFP': + return UserDataType.PFP; + case 2: + case 'USER_DATA_TYPE_DISPLAY': + return UserDataType.DISPLAY; + case 3: + case 'USER_DATA_TYPE_BIO': + return UserDataType.BIO; + case 5: + case 'USER_DATA_TYPE_URL': + return UserDataType.URL; + case 6: + case 'USER_DATA_TYPE_FNAME': + return UserDataType.FNAME; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum UserDataType'); + } +} + +export function userDataTypeToJSON(object: UserDataType): string { + switch (object) { + case UserDataType.NONE: + return 'USER_DATA_TYPE_NONE'; + case UserDataType.PFP: + return 'USER_DATA_TYPE_PFP'; + case UserDataType.DISPLAY: + return 'USER_DATA_TYPE_DISPLAY'; + case UserDataType.BIO: + return 'USER_DATA_TYPE_BIO'; + case UserDataType.URL: + return 'USER_DATA_TYPE_URL'; + case UserDataType.FNAME: + return 'USER_DATA_TYPE_FNAME'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum UserDataType'); + } +} + +/** Type of Reaction */ +export enum ReactionType { + NONE = 0, + /** LIKE - Like the target cast */ + LIKE = 1, + /** RECAST - Share target cast to the user's audience */ + RECAST = 2, +} + +export function reactionTypeFromJSON(object: any): ReactionType { + switch (object) { + case 0: + case 'REACTION_TYPE_NONE': + return ReactionType.NONE; + case 1: + case 'REACTION_TYPE_LIKE': + return ReactionType.LIKE; + case 2: + case 'REACTION_TYPE_RECAST': + return ReactionType.RECAST; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum ReactionType'); + } +} + +export function reactionTypeToJSON(object: ReactionType): string { + switch (object) { + case ReactionType.NONE: + return 'REACTION_TYPE_NONE'; + case ReactionType.LIKE: + return 'REACTION_TYPE_LIKE'; + case ReactionType.RECAST: + return 'REACTION_TYPE_RECAST'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum ReactionType'); + } +} + +/** + * A Message is a delta operation on the Farcaster network. The message protobuf is an envelope + * that wraps a MessageData object and contains a hash and signature which can verify its authenticity. + */ +export interface Message { + /** Contents of the message */ + data: MessageData | undefined; + /** Hash digest of data */ + hash: Uint8Array; + /** Hash scheme that produced the hash digest */ + hashScheme: HashScheme; + /** Signature of the hash digest */ + signature: Uint8Array; + /** Signature scheme that produced the signature */ + signatureScheme: SignatureScheme; + /** Public key or address of the key pair that produced the signature */ + signer: Uint8Array; +} + +/** + * A MessageData object contains properties common to all messages and wraps a body object which + * contains properties specific to the MessageType. + */ +export interface MessageData { + /** Type of message contained in the body */ + type: MessageType; + /** Farcaster ID of the user producing the message */ + fid: number; + /** Farcaster epoch timestamp in seconds */ + timestamp: number; + /** Farcaster network the message is intended for */ + network: FarcasterNetwork; + castAddBody?: CastAddBody | undefined; + castRemoveBody?: CastRemoveBody | undefined; + reactionBody?: ReactionBody | undefined; + verificationAddEthAddressBody?: VerificationAddEthAddressBody | undefined; + verificationRemoveBody?: VerificationRemoveBody | undefined; + signerAddBody?: SignerAddBody | undefined; + userDataBody?: UserDataBody | undefined; + signerRemoveBody?: SignerRemoveBody | undefined; +} + +/** Adds an Ed25519 key pair that signs messages for a user */ +export interface SignerAddBody { + /** Public key of the Ed25519 key pair */ + signer: Uint8Array; + /** Name of the key pair */ + name?: string | undefined; +} + +/** Removes an Ed25519 key pair that signs messages for a user */ +export interface SignerRemoveBody { + /** Public key of the Ed25519 key pair */ + signer: Uint8Array; +} + +/** Adds metadata about a user */ +export interface UserDataBody { + /** Type of metadata */ + type: UserDataType; + /** Value of the metadata */ + value: string; +} + +/** Adds a new Cast */ +export interface CastAddBody { + /** URLs to be embedded in the cast */ + embeds: string[]; + /** Fids mentioned in the cast */ + mentions: number[]; + /** Parent cast of the cast */ + parentCastId?: CastId | undefined; + /** Text of the cast */ + text: string; + /** Positions of the mentions in the text */ + mentionsPositions: number[]; +} + +/** Removes an existing Cast */ +export interface CastRemoveBody { + /** Hash of the cast to remove */ + targetHash: Uint8Array; +} + +/** Identifier used to look up a Cast */ +export interface CastId { + /** Fid of the user who created the cast */ + fid: number; + /** Hash of the cast */ + hash: Uint8Array; +} + +/** Adds or removes a Reaction from a Cast */ +export interface ReactionBody { + /** Type of reaction */ + type: ReactionType; + /** CastId of the Cast to react to */ + targetCastId?: CastId | undefined; +} + +/** Adds a Verification of ownership of an Ethereum Address */ +export interface VerificationAddEthAddressBody { + /** Ethereum address being verified */ + address: Uint8Array; + /** Signature produced by the user's Ethereum address */ + ethSignature: Uint8Array; + /** Hash of the latest Ethereum block when the signature was produced */ + blockHash: Uint8Array; +} + +/** Removes a Verification of any type */ +export interface VerificationRemoveBody { + /** Address of the Verification to remove */ + address: Uint8Array; +} + +function createBaseMessage(): Message { + return { + data: undefined, + hash: new Uint8Array(), + hashScheme: 0, + signature: new Uint8Array(), + signatureScheme: 0, + signer: new Uint8Array(), + }; +} + +export const Message = { + encode(message: Message, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.data !== undefined) { + MessageData.encode(message.data, writer.uint32(10).fork()).ldelim(); + } + if (message.hash.length !== 0) { + writer.uint32(18).bytes(message.hash); + } + if (message.hashScheme !== 0) { + writer.uint32(24).int32(message.hashScheme); + } + if (message.signature.length !== 0) { + writer.uint32(34).bytes(message.signature); + } + if (message.signatureScheme !== 0) { + writer.uint32(40).int32(message.signatureScheme); + } + if (message.signer.length !== 0) { + writer.uint32(50).bytes(message.signer); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Message { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMessage(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.data = MessageData.decode(reader, reader.uint32()); + continue; + case 2: + if (tag != 18) { + break; + } + + message.hash = reader.bytes(); + continue; + case 3: + if (tag != 24) { + break; + } + + message.hashScheme = reader.int32() as any; + continue; + case 4: + if (tag != 34) { + break; + } + + message.signature = reader.bytes(); + continue; + case 5: + if (tag != 40) { + break; + } + + message.signatureScheme = reader.int32() as any; + continue; + case 6: + if (tag != 50) { + break; + } + + message.signer = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Message { + return { + data: isSet(object.data) ? MessageData.fromJSON(object.data) : undefined, + hash: isSet(object.hash) ? bytesFromBase64(object.hash) : new Uint8Array(), + hashScheme: isSet(object.hashScheme) ? hashSchemeFromJSON(object.hashScheme) : 0, + signature: isSet(object.signature) ? bytesFromBase64(object.signature) : new Uint8Array(), + signatureScheme: isSet(object.signatureScheme) ? signatureSchemeFromJSON(object.signatureScheme) : 0, + signer: isSet(object.signer) ? bytesFromBase64(object.signer) : new Uint8Array(), + }; + }, + + toJSON(message: Message): unknown { + const obj: any = {}; + message.data !== undefined && (obj.data = message.data ? MessageData.toJSON(message.data) : undefined); + message.hash !== undefined && + (obj.hash = base64FromBytes(message.hash !== undefined ? message.hash : new Uint8Array())); + message.hashScheme !== undefined && (obj.hashScheme = hashSchemeToJSON(message.hashScheme)); + message.signature !== undefined && + (obj.signature = base64FromBytes(message.signature !== undefined ? message.signature : new Uint8Array())); + message.signatureScheme !== undefined && (obj.signatureScheme = signatureSchemeToJSON(message.signatureScheme)); + message.signer !== undefined && + (obj.signer = base64FromBytes(message.signer !== undefined ? message.signer : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): Message { + return Message.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): Message { + const message = createBaseMessage(); + message.data = object.data !== undefined && object.data !== null ? MessageData.fromPartial(object.data) : undefined; + message.hash = object.hash ?? new Uint8Array(); + message.hashScheme = object.hashScheme ?? 0; + message.signature = object.signature ?? new Uint8Array(); + message.signatureScheme = object.signatureScheme ?? 0; + message.signer = object.signer ?? new Uint8Array(); + return message; + }, +}; + +function createBaseMessageData(): MessageData { + return { + type: 0, + fid: 0, + timestamp: 0, + network: 0, + castAddBody: undefined, + castRemoveBody: undefined, + reactionBody: undefined, + verificationAddEthAddressBody: undefined, + verificationRemoveBody: undefined, + signerAddBody: undefined, + userDataBody: undefined, + signerRemoveBody: undefined, + }; +} + +export const MessageData = { + encode(message: MessageData, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.type !== 0) { + writer.uint32(8).int32(message.type); + } + if (message.fid !== 0) { + writer.uint32(16).uint64(message.fid); + } + if (message.timestamp !== 0) { + writer.uint32(24).uint32(message.timestamp); + } + if (message.network !== 0) { + writer.uint32(32).int32(message.network); + } + if (message.castAddBody !== undefined) { + CastAddBody.encode(message.castAddBody, writer.uint32(42).fork()).ldelim(); + } + if (message.castRemoveBody !== undefined) { + CastRemoveBody.encode(message.castRemoveBody, writer.uint32(50).fork()).ldelim(); + } + if (message.reactionBody !== undefined) { + ReactionBody.encode(message.reactionBody, writer.uint32(58).fork()).ldelim(); + } + if (message.verificationAddEthAddressBody !== undefined) { + VerificationAddEthAddressBody.encode(message.verificationAddEthAddressBody, writer.uint32(74).fork()).ldelim(); + } + if (message.verificationRemoveBody !== undefined) { + VerificationRemoveBody.encode(message.verificationRemoveBody, writer.uint32(82).fork()).ldelim(); + } + if (message.signerAddBody !== undefined) { + SignerAddBody.encode(message.signerAddBody, writer.uint32(90).fork()).ldelim(); + } + if (message.userDataBody !== undefined) { + UserDataBody.encode(message.userDataBody, writer.uint32(98).fork()).ldelim(); + } + if (message.signerRemoveBody !== undefined) { + SignerRemoveBody.encode(message.signerRemoveBody, writer.uint32(106).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MessageData { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMessageData(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.type = reader.int32() as any; + continue; + case 2: + if (tag != 16) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 3: + if (tag != 24) { + break; + } + + message.timestamp = reader.uint32(); + continue; + case 4: + if (tag != 32) { + break; + } + + message.network = reader.int32() as any; + continue; + case 5: + if (tag != 42) { + break; + } + + message.castAddBody = CastAddBody.decode(reader, reader.uint32()); + continue; + case 6: + if (tag != 50) { + break; + } + + message.castRemoveBody = CastRemoveBody.decode(reader, reader.uint32()); + continue; + case 7: + if (tag != 58) { + break; + } + + message.reactionBody = ReactionBody.decode(reader, reader.uint32()); + continue; + case 9: + if (tag != 74) { + break; + } + + message.verificationAddEthAddressBody = VerificationAddEthAddressBody.decode(reader, reader.uint32()); + continue; + case 10: + if (tag != 82) { + break; + } + + message.verificationRemoveBody = VerificationRemoveBody.decode(reader, reader.uint32()); + continue; + case 11: + if (tag != 90) { + break; + } + + message.signerAddBody = SignerAddBody.decode(reader, reader.uint32()); + continue; + case 12: + if (tag != 98) { + break; + } + + message.userDataBody = UserDataBody.decode(reader, reader.uint32()); + continue; + case 13: + if (tag != 106) { + break; + } + + message.signerRemoveBody = SignerRemoveBody.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MessageData { + return { + type: isSet(object.type) ? messageTypeFromJSON(object.type) : 0, + fid: isSet(object.fid) ? Number(object.fid) : 0, + timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0, + network: isSet(object.network) ? farcasterNetworkFromJSON(object.network) : 0, + castAddBody: isSet(object.castAddBody) ? CastAddBody.fromJSON(object.castAddBody) : undefined, + castRemoveBody: isSet(object.castRemoveBody) ? CastRemoveBody.fromJSON(object.castRemoveBody) : undefined, + reactionBody: isSet(object.reactionBody) ? ReactionBody.fromJSON(object.reactionBody) : undefined, + verificationAddEthAddressBody: isSet(object.verificationAddEthAddressBody) + ? VerificationAddEthAddressBody.fromJSON(object.verificationAddEthAddressBody) + : undefined, + verificationRemoveBody: isSet(object.verificationRemoveBody) + ? VerificationRemoveBody.fromJSON(object.verificationRemoveBody) + : undefined, + signerAddBody: isSet(object.signerAddBody) ? SignerAddBody.fromJSON(object.signerAddBody) : undefined, + userDataBody: isSet(object.userDataBody) ? UserDataBody.fromJSON(object.userDataBody) : undefined, + signerRemoveBody: isSet(object.signerRemoveBody) ? SignerRemoveBody.fromJSON(object.signerRemoveBody) : undefined, + }; + }, + + toJSON(message: MessageData): unknown { + const obj: any = {}; + message.type !== undefined && (obj.type = messageTypeToJSON(message.type)); + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp)); + message.network !== undefined && (obj.network = farcasterNetworkToJSON(message.network)); + message.castAddBody !== undefined && + (obj.castAddBody = message.castAddBody ? CastAddBody.toJSON(message.castAddBody) : undefined); + message.castRemoveBody !== undefined && + (obj.castRemoveBody = message.castRemoveBody ? CastRemoveBody.toJSON(message.castRemoveBody) : undefined); + message.reactionBody !== undefined && + (obj.reactionBody = message.reactionBody ? ReactionBody.toJSON(message.reactionBody) : undefined); + message.verificationAddEthAddressBody !== undefined && + (obj.verificationAddEthAddressBody = message.verificationAddEthAddressBody + ? VerificationAddEthAddressBody.toJSON(message.verificationAddEthAddressBody) + : undefined); + message.verificationRemoveBody !== undefined && + (obj.verificationRemoveBody = message.verificationRemoveBody + ? VerificationRemoveBody.toJSON(message.verificationRemoveBody) + : undefined); + message.signerAddBody !== undefined && + (obj.signerAddBody = message.signerAddBody ? SignerAddBody.toJSON(message.signerAddBody) : undefined); + message.userDataBody !== undefined && + (obj.userDataBody = message.userDataBody ? UserDataBody.toJSON(message.userDataBody) : undefined); + message.signerRemoveBody !== undefined && + (obj.signerRemoveBody = message.signerRemoveBody ? SignerRemoveBody.toJSON(message.signerRemoveBody) : undefined); + return obj; + }, + + create, I>>(base?: I): MessageData { + return MessageData.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): MessageData { + const message = createBaseMessageData(); + message.type = object.type ?? 0; + message.fid = object.fid ?? 0; + message.timestamp = object.timestamp ?? 0; + message.network = object.network ?? 0; + message.castAddBody = + object.castAddBody !== undefined && object.castAddBody !== null + ? CastAddBody.fromPartial(object.castAddBody) + : undefined; + message.castRemoveBody = + object.castRemoveBody !== undefined && object.castRemoveBody !== null + ? CastRemoveBody.fromPartial(object.castRemoveBody) + : undefined; + message.reactionBody = + object.reactionBody !== undefined && object.reactionBody !== null + ? ReactionBody.fromPartial(object.reactionBody) + : undefined; + message.verificationAddEthAddressBody = + object.verificationAddEthAddressBody !== undefined && object.verificationAddEthAddressBody !== null + ? VerificationAddEthAddressBody.fromPartial(object.verificationAddEthAddressBody) + : undefined; + message.verificationRemoveBody = + object.verificationRemoveBody !== undefined && object.verificationRemoveBody !== null + ? VerificationRemoveBody.fromPartial(object.verificationRemoveBody) + : undefined; + message.signerAddBody = + object.signerAddBody !== undefined && object.signerAddBody !== null + ? SignerAddBody.fromPartial(object.signerAddBody) + : undefined; + message.userDataBody = + object.userDataBody !== undefined && object.userDataBody !== null + ? UserDataBody.fromPartial(object.userDataBody) + : undefined; + message.signerRemoveBody = + object.signerRemoveBody !== undefined && object.signerRemoveBody !== null + ? SignerRemoveBody.fromPartial(object.signerRemoveBody) + : undefined; + return message; + }, +}; + +function createBaseSignerAddBody(): SignerAddBody { + return { signer: new Uint8Array(), name: undefined }; +} + +export const SignerAddBody = { + encode(message: SignerAddBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.signer.length !== 0) { + writer.uint32(10).bytes(message.signer); + } + if (message.name !== undefined) { + writer.uint32(18).string(message.name); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SignerAddBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSignerAddBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.signer = reader.bytes(); + continue; + case 2: + if (tag != 18) { + break; + } + + message.name = reader.string(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SignerAddBody { + return { + signer: isSet(object.signer) ? bytesFromBase64(object.signer) : new Uint8Array(), + name: isSet(object.name) ? String(object.name) : undefined, + }; + }, + + toJSON(message: SignerAddBody): unknown { + const obj: any = {}; + message.signer !== undefined && + (obj.signer = base64FromBytes(message.signer !== undefined ? message.signer : new Uint8Array())); + message.name !== undefined && (obj.name = message.name); + return obj; + }, + + create, I>>(base?: I): SignerAddBody { + return SignerAddBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SignerAddBody { + const message = createBaseSignerAddBody(); + message.signer = object.signer ?? new Uint8Array(); + message.name = object.name ?? undefined; + return message; + }, +}; + +function createBaseSignerRemoveBody(): SignerRemoveBody { + return { signer: new Uint8Array() }; +} + +export const SignerRemoveBody = { + encode(message: SignerRemoveBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.signer.length !== 0) { + writer.uint32(10).bytes(message.signer); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SignerRemoveBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSignerRemoveBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.signer = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SignerRemoveBody { + return { signer: isSet(object.signer) ? bytesFromBase64(object.signer) : new Uint8Array() }; + }, + + toJSON(message: SignerRemoveBody): unknown { + const obj: any = {}; + message.signer !== undefined && + (obj.signer = base64FromBytes(message.signer !== undefined ? message.signer : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): SignerRemoveBody { + return SignerRemoveBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SignerRemoveBody { + const message = createBaseSignerRemoveBody(); + message.signer = object.signer ?? new Uint8Array(); + return message; + }, +}; + +function createBaseUserDataBody(): UserDataBody { + return { type: 0, value: '' }; +} + +export const UserDataBody = { + encode(message: UserDataBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.type !== 0) { + writer.uint32(8).int32(message.type); + } + if (message.value !== '') { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UserDataBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUserDataBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.type = reader.int32() as any; + continue; + case 2: + if (tag != 18) { + break; + } + + message.value = reader.string(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): UserDataBody { + return { + type: isSet(object.type) ? userDataTypeFromJSON(object.type) : 0, + value: isSet(object.value) ? String(object.value) : '', + }; + }, + + toJSON(message: UserDataBody): unknown { + const obj: any = {}; + message.type !== undefined && (obj.type = userDataTypeToJSON(message.type)); + message.value !== undefined && (obj.value = message.value); + return obj; + }, + + create, I>>(base?: I): UserDataBody { + return UserDataBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): UserDataBody { + const message = createBaseUserDataBody(); + message.type = object.type ?? 0; + message.value = object.value ?? ''; + return message; + }, +}; + +function createBaseCastAddBody(): CastAddBody { + return { embeds: [], mentions: [], parentCastId: undefined, text: '', mentionsPositions: [] }; +} + +export const CastAddBody = { + encode(message: CastAddBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.embeds) { + writer.uint32(10).string(v!); + } + writer.uint32(18).fork(); + for (const v of message.mentions) { + writer.uint64(v); + } + writer.ldelim(); + if (message.parentCastId !== undefined) { + CastId.encode(message.parentCastId, writer.uint32(26).fork()).ldelim(); + } + if (message.text !== '') { + writer.uint32(34).string(message.text); + } + writer.uint32(42).fork(); + for (const v of message.mentionsPositions) { + writer.uint32(v); + } + writer.ldelim(); + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): CastAddBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCastAddBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.embeds.push(reader.string()); + continue; + case 2: + if (tag == 16) { + message.mentions.push(longToNumber(reader.uint64() as Long)); + continue; + } + + if (tag == 18) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.mentions.push(longToNumber(reader.uint64() as Long)); + } + + continue; + } + + break; + case 3: + if (tag != 26) { + break; + } + + message.parentCastId = CastId.decode(reader, reader.uint32()); + continue; + case 4: + if (tag != 34) { + break; + } + + message.text = reader.string(); + continue; + case 5: + if (tag == 40) { + message.mentionsPositions.push(reader.uint32()); + continue; + } + + if (tag == 42) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.mentionsPositions.push(reader.uint32()); + } + + continue; + } + + break; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): CastAddBody { + return { + embeds: Array.isArray(object?.embeds) ? object.embeds.map((e: any) => String(e)) : [], + mentions: Array.isArray(object?.mentions) ? object.mentions.map((e: any) => Number(e)) : [], + parentCastId: isSet(object.parentCastId) ? CastId.fromJSON(object.parentCastId) : undefined, + text: isSet(object.text) ? String(object.text) : '', + mentionsPositions: Array.isArray(object?.mentionsPositions) + ? object.mentionsPositions.map((e: any) => Number(e)) + : [], + }; + }, + + toJSON(message: CastAddBody): unknown { + const obj: any = {}; + if (message.embeds) { + obj.embeds = message.embeds.map((e) => e); + } else { + obj.embeds = []; + } + if (message.mentions) { + obj.mentions = message.mentions.map((e) => Math.round(e)); + } else { + obj.mentions = []; + } + message.parentCastId !== undefined && + (obj.parentCastId = message.parentCastId ? CastId.toJSON(message.parentCastId) : undefined); + message.text !== undefined && (obj.text = message.text); + if (message.mentionsPositions) { + obj.mentionsPositions = message.mentionsPositions.map((e) => Math.round(e)); + } else { + obj.mentionsPositions = []; + } + return obj; + }, + + create, I>>(base?: I): CastAddBody { + return CastAddBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): CastAddBody { + const message = createBaseCastAddBody(); + message.embeds = object.embeds?.map((e) => e) || []; + message.mentions = object.mentions?.map((e) => e) || []; + message.parentCastId = + object.parentCastId !== undefined && object.parentCastId !== null + ? CastId.fromPartial(object.parentCastId) + : undefined; + message.text = object.text ?? ''; + message.mentionsPositions = object.mentionsPositions?.map((e) => e) || []; + return message; + }, +}; + +function createBaseCastRemoveBody(): CastRemoveBody { + return { targetHash: new Uint8Array() }; +} + +export const CastRemoveBody = { + encode(message: CastRemoveBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.targetHash.length !== 0) { + writer.uint32(10).bytes(message.targetHash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): CastRemoveBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCastRemoveBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.targetHash = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): CastRemoveBody { + return { targetHash: isSet(object.targetHash) ? bytesFromBase64(object.targetHash) : new Uint8Array() }; + }, + + toJSON(message: CastRemoveBody): unknown { + const obj: any = {}; + message.targetHash !== undefined && + (obj.targetHash = base64FromBytes(message.targetHash !== undefined ? message.targetHash : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): CastRemoveBody { + return CastRemoveBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): CastRemoveBody { + const message = createBaseCastRemoveBody(); + message.targetHash = object.targetHash ?? new Uint8Array(); + return message; + }, +}; + +function createBaseCastId(): CastId { + return { fid: 0, hash: new Uint8Array() }; +} + +export const CastId = { + encode(message: CastId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.hash.length !== 0) { + writer.uint32(18).bytes(message.hash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): CastId { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCastId(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 18) { + break; + } + + message.hash = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): CastId { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + hash: isSet(object.hash) ? bytesFromBase64(object.hash) : new Uint8Array(), + }; + }, + + toJSON(message: CastId): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.hash !== undefined && + (obj.hash = base64FromBytes(message.hash !== undefined ? message.hash : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): CastId { + return CastId.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): CastId { + const message = createBaseCastId(); + message.fid = object.fid ?? 0; + message.hash = object.hash ?? new Uint8Array(); + return message; + }, +}; + +function createBaseReactionBody(): ReactionBody { + return { type: 0, targetCastId: undefined }; +} + +export const ReactionBody = { + encode(message: ReactionBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.type !== 0) { + writer.uint32(8).int32(message.type); + } + if (message.targetCastId !== undefined) { + CastId.encode(message.targetCastId, writer.uint32(18).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.type = reader.int32() as any; + continue; + case 2: + if (tag != 18) { + break; + } + + message.targetCastId = CastId.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReactionBody { + return { + type: isSet(object.type) ? reactionTypeFromJSON(object.type) : 0, + targetCastId: isSet(object.targetCastId) ? CastId.fromJSON(object.targetCastId) : undefined, + }; + }, + + toJSON(message: ReactionBody): unknown { + const obj: any = {}; + message.type !== undefined && (obj.type = reactionTypeToJSON(message.type)); + message.targetCastId !== undefined && + (obj.targetCastId = message.targetCastId ? CastId.toJSON(message.targetCastId) : undefined); + return obj; + }, + + create, I>>(base?: I): ReactionBody { + return ReactionBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionBody { + const message = createBaseReactionBody(); + message.type = object.type ?? 0; + message.targetCastId = + object.targetCastId !== undefined && object.targetCastId !== null + ? CastId.fromPartial(object.targetCastId) + : undefined; + return message; + }, +}; + +function createBaseVerificationAddEthAddressBody(): VerificationAddEthAddressBody { + return { address: new Uint8Array(), ethSignature: new Uint8Array(), blockHash: new Uint8Array() }; +} + +export const VerificationAddEthAddressBody = { + encode(message: VerificationAddEthAddressBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.address.length !== 0) { + writer.uint32(10).bytes(message.address); + } + if (message.ethSignature.length !== 0) { + writer.uint32(18).bytes(message.ethSignature); + } + if (message.blockHash.length !== 0) { + writer.uint32(26).bytes(message.blockHash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): VerificationAddEthAddressBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVerificationAddEthAddressBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.address = reader.bytes(); + continue; + case 2: + if (tag != 18) { + break; + } + + message.ethSignature = reader.bytes(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.blockHash = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): VerificationAddEthAddressBody { + return { + address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array(), + ethSignature: isSet(object.ethSignature) ? bytesFromBase64(object.ethSignature) : new Uint8Array(), + blockHash: isSet(object.blockHash) ? bytesFromBase64(object.blockHash) : new Uint8Array(), + }; + }, + + toJSON(message: VerificationAddEthAddressBody): unknown { + const obj: any = {}; + message.address !== undefined && + (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); + message.ethSignature !== undefined && + (obj.ethSignature = base64FromBytes( + message.ethSignature !== undefined ? message.ethSignature : new Uint8Array() + )); + message.blockHash !== undefined && + (obj.blockHash = base64FromBytes(message.blockHash !== undefined ? message.blockHash : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): VerificationAddEthAddressBody { + return VerificationAddEthAddressBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>( + object: I + ): VerificationAddEthAddressBody { + const message = createBaseVerificationAddEthAddressBody(); + message.address = object.address ?? new Uint8Array(); + message.ethSignature = object.ethSignature ?? new Uint8Array(); + message.blockHash = object.blockHash ?? new Uint8Array(); + return message; + }, +}; + +function createBaseVerificationRemoveBody(): VerificationRemoveBody { + return { address: new Uint8Array() }; +} + +export const VerificationRemoveBody = { + encode(message: VerificationRemoveBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.address.length !== 0) { + writer.uint32(10).bytes(message.address); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): VerificationRemoveBody { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVerificationRemoveBody(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.address = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): VerificationRemoveBody { + return { address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array() }; + }, + + toJSON(message: VerificationRemoveBody): unknown { + const obj: any = {}; + message.address !== undefined && + (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): VerificationRemoveBody { + return VerificationRemoveBody.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): VerificationRemoveBody { + const message = createBaseVerificationRemoveBody(); + message.address = object.address ?? new Uint8Array(); + return message; + }, +}; + +declare var self: any | undefined; +declare var window: any | undefined; +declare var global: any | undefined; +var tsProtoGlobalThis: any = (() => { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof global !== 'undefined') { + return global; + } + throw 'Unable to locate global object'; +})(); + +function bytesFromBase64(b64: string): Uint8Array { + if (tsProtoGlobalThis.Buffer) { + return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, 'base64')); + } else { + const bin = tsProtoGlobalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if (tsProtoGlobalThis.Buffer) { + return tsProtoGlobalThis.Buffer.from(arr).toString('base64'); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(String.fromCharCode(byte)); + }); + return tsProtoGlobalThis.btoa(bin.join('')); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(long: Long): number { + if (long.gt(Number.MAX_SAFE_INTEGER)) { + throw new tsProtoGlobalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); + } + return long.toNumber(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/packages/hub-nodejs/src/generated/name_registry_event.ts b/packages/hub-nodejs/src/generated/name_registry_event.ts new file mode 100644 index 0000000000..b0a83e8ab3 --- /dev/null +++ b/packages/hub-nodejs/src/generated/name_registry_event.ts @@ -0,0 +1,292 @@ +/* eslint-disable */ +import _m0 from 'protobufjs/minimal'; + +export enum NameRegistryEventType { + NONE = 0, + TRANSFER = 1, + RENEW = 2, +} + +export function nameRegistryEventTypeFromJSON(object: any): NameRegistryEventType { + switch (object) { + case 0: + case 'NAME_REGISTRY_EVENT_TYPE_NONE': + return NameRegistryEventType.NONE; + case 1: + case 'NAME_REGISTRY_EVENT_TYPE_TRANSFER': + return NameRegistryEventType.TRANSFER; + case 2: + case 'NAME_REGISTRY_EVENT_TYPE_RENEW': + return NameRegistryEventType.RENEW; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum NameRegistryEventType'); + } +} + +export function nameRegistryEventTypeToJSON(object: NameRegistryEventType): string { + switch (object) { + case NameRegistryEventType.NONE: + return 'NAME_REGISTRY_EVENT_TYPE_NONE'; + case NameRegistryEventType.TRANSFER: + return 'NAME_REGISTRY_EVENT_TYPE_TRANSFER'; + case NameRegistryEventType.RENEW: + return 'NAME_REGISTRY_EVENT_TYPE_RENEW'; + default: + throw new tsProtoGlobalThis.Error('Unrecognized enum value ' + object + ' for enum NameRegistryEventType'); + } +} + +export interface NameRegistryEvent { + blockNumber: number; + blockHash: Uint8Array; + transactionHash: Uint8Array; + logIndex: number; + fname: Uint8Array; + from: Uint8Array; + to: Uint8Array; + type: NameRegistryEventType; + expiry: number; +} + +function createBaseNameRegistryEvent(): NameRegistryEvent { + return { + blockNumber: 0, + blockHash: new Uint8Array(), + transactionHash: new Uint8Array(), + logIndex: 0, + fname: new Uint8Array(), + from: new Uint8Array(), + to: new Uint8Array(), + type: 0, + expiry: 0, + }; +} + +export const NameRegistryEvent = { + encode(message: NameRegistryEvent, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.blockNumber !== 0) { + writer.uint32(8).uint32(message.blockNumber); + } + if (message.blockHash.length !== 0) { + writer.uint32(18).bytes(message.blockHash); + } + if (message.transactionHash.length !== 0) { + writer.uint32(26).bytes(message.transactionHash); + } + if (message.logIndex !== 0) { + writer.uint32(32).uint32(message.logIndex); + } + if (message.fname.length !== 0) { + writer.uint32(42).bytes(message.fname); + } + if (message.from.length !== 0) { + writer.uint32(50).bytes(message.from); + } + if (message.to.length !== 0) { + writer.uint32(58).bytes(message.to); + } + if (message.type !== 0) { + writer.uint32(64).int32(message.type); + } + if (message.expiry !== 0) { + writer.uint32(72).uint32(message.expiry); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): NameRegistryEvent { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseNameRegistryEvent(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.blockNumber = reader.uint32(); + continue; + case 2: + if (tag != 18) { + break; + } + + message.blockHash = reader.bytes(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.transactionHash = reader.bytes(); + continue; + case 4: + if (tag != 32) { + break; + } + + message.logIndex = reader.uint32(); + continue; + case 5: + if (tag != 42) { + break; + } + + message.fname = reader.bytes(); + continue; + case 6: + if (tag != 50) { + break; + } + + message.from = reader.bytes(); + continue; + case 7: + if (tag != 58) { + break; + } + + message.to = reader.bytes(); + continue; + case 8: + if (tag != 64) { + break; + } + + message.type = reader.int32() as any; + continue; + case 9: + if (tag != 72) { + break; + } + + message.expiry = reader.uint32(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): NameRegistryEvent { + return { + blockNumber: isSet(object.blockNumber) ? Number(object.blockNumber) : 0, + blockHash: isSet(object.blockHash) ? bytesFromBase64(object.blockHash) : new Uint8Array(), + transactionHash: isSet(object.transactionHash) ? bytesFromBase64(object.transactionHash) : new Uint8Array(), + logIndex: isSet(object.logIndex) ? Number(object.logIndex) : 0, + fname: isSet(object.fname) ? bytesFromBase64(object.fname) : new Uint8Array(), + from: isSet(object.from) ? bytesFromBase64(object.from) : new Uint8Array(), + to: isSet(object.to) ? bytesFromBase64(object.to) : new Uint8Array(), + type: isSet(object.type) ? nameRegistryEventTypeFromJSON(object.type) : 0, + expiry: isSet(object.expiry) ? Number(object.expiry) : 0, + }; + }, + + toJSON(message: NameRegistryEvent): unknown { + const obj: any = {}; + message.blockNumber !== undefined && (obj.blockNumber = Math.round(message.blockNumber)); + message.blockHash !== undefined && + (obj.blockHash = base64FromBytes(message.blockHash !== undefined ? message.blockHash : new Uint8Array())); + message.transactionHash !== undefined && + (obj.transactionHash = base64FromBytes( + message.transactionHash !== undefined ? message.transactionHash : new Uint8Array() + )); + message.logIndex !== undefined && (obj.logIndex = Math.round(message.logIndex)); + message.fname !== undefined && + (obj.fname = base64FromBytes(message.fname !== undefined ? message.fname : new Uint8Array())); + message.from !== undefined && + (obj.from = base64FromBytes(message.from !== undefined ? message.from : new Uint8Array())); + message.to !== undefined && (obj.to = base64FromBytes(message.to !== undefined ? message.to : new Uint8Array())); + message.type !== undefined && (obj.type = nameRegistryEventTypeToJSON(message.type)); + message.expiry !== undefined && (obj.expiry = Math.round(message.expiry)); + return obj; + }, + + create, I>>(base?: I): NameRegistryEvent { + return NameRegistryEvent.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): NameRegistryEvent { + const message = createBaseNameRegistryEvent(); + message.blockNumber = object.blockNumber ?? 0; + message.blockHash = object.blockHash ?? new Uint8Array(); + message.transactionHash = object.transactionHash ?? new Uint8Array(); + message.logIndex = object.logIndex ?? 0; + message.fname = object.fname ?? new Uint8Array(); + message.from = object.from ?? new Uint8Array(); + message.to = object.to ?? new Uint8Array(); + message.type = object.type ?? 0; + message.expiry = object.expiry ?? 0; + return message; + }, +}; + +declare var self: any | undefined; +declare var window: any | undefined; +declare var global: any | undefined; +var tsProtoGlobalThis: any = (() => { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof global !== 'undefined') { + return global; + } + throw 'Unable to locate global object'; +})(); + +function bytesFromBase64(b64: string): Uint8Array { + if (tsProtoGlobalThis.Buffer) { + return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, 'base64')); + } else { + const bin = tsProtoGlobalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if (tsProtoGlobalThis.Buffer) { + return tsProtoGlobalThis.Buffer.from(arr).toString('base64'); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(String.fromCharCode(byte)); + }); + return tsProtoGlobalThis.btoa(bin.join('')); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/packages/hub-nodejs/src/generated/request_response.ts b/packages/hub-nodejs/src/generated/request_response.ts new file mode 100644 index 0000000000..6ac8757ed7 --- /dev/null +++ b/packages/hub-nodejs/src/generated/request_response.ts @@ -0,0 +1,1959 @@ +/* eslint-disable */ +import Long from 'long'; +import _m0 from 'protobufjs/minimal'; +import { HubEventType, hubEventTypeFromJSON, hubEventTypeToJSON } from './hub_event'; +import { + CastId, + Message, + ReactionType, + reactionTypeFromJSON, + reactionTypeToJSON, + UserDataType, + userDataTypeFromJSON, + userDataTypeToJSON, +} from './message'; + +export interface Empty {} + +export interface SubscribeRequest { + eventTypes: HubEventType[]; + fromId?: number | undefined; +} + +export interface EventRequest { + id: number; +} + +/** Response Types for the Sync RPC Methods */ +export interface HubInfoResponse { + version: string; + isSynced: boolean; + nickname: string; + rootHash: string; +} + +export interface TrieNodeMetadataResponse { + prefix: Uint8Array; + numMessages: number; + hash: string; + children: TrieNodeMetadataResponse[]; +} + +export interface TrieNodeSnapshotResponse { + prefix: Uint8Array; + excludedHashes: string[]; + numMessages: number; + rootHash: string; +} + +export interface TrieNodePrefix { + prefix: Uint8Array; +} + +export interface SyncIds { + syncIds: Uint8Array[]; +} + +export interface FidRequest { + fid: number; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface FidsRequest { + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface FidsResponse { + fids: number[]; + nextPageToken?: Uint8Array | undefined; +} + +export interface MessagesResponse { + messages: Message[]; + nextPageToken?: Uint8Array | undefined; +} + +export interface CastsByParentRequest { + castId: CastId | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface ReactionRequest { + fid: number; + reactionType: ReactionType; + castId: CastId | undefined; +} + +export interface ReactionsByFidRequest { + fid: number; + reactionType?: ReactionType | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface ReactionsByCastRequest { + castId: CastId | undefined; + reactionType?: ReactionType | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface UserDataRequest { + fid: number; + userDataType: UserDataType; +} + +export interface NameRegistryEventRequest { + name: Uint8Array; +} + +export interface VerificationRequest { + fid: number; + address: Uint8Array; +} + +export interface SignerRequest { + fid: number; + signer: Uint8Array; +} + +export interface IdRegistryEventRequest { + fid: number; +} + +export interface IdRegistryEventByAddressRequest { + address: Uint8Array; +} + +function createBaseEmpty(): Empty { + return {}; +} + +export const Empty = { + encode(_: Empty, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Empty { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEmpty(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): Empty { + return {}; + }, + + toJSON(_: Empty): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): Empty { + return Empty.fromPartial(base ?? {}); + }, + + fromPartial, I>>(_: I): Empty { + const message = createBaseEmpty(); + return message; + }, +}; + +function createBaseSubscribeRequest(): SubscribeRequest { + return { eventTypes: [], fromId: undefined }; +} + +export const SubscribeRequest = { + encode(message: SubscribeRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.eventTypes) { + writer.int32(v); + } + writer.ldelim(); + if (message.fromId !== undefined) { + writer.uint32(16).uint64(message.fromId); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSubscribeRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag == 8) { + message.eventTypes.push(reader.int32() as any); + continue; + } + + if (tag == 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.eventTypes.push(reader.int32() as any); + } + + continue; + } + + break; + case 2: + if (tag != 16) { + break; + } + + message.fromId = longToNumber(reader.uint64() as Long); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SubscribeRequest { + return { + eventTypes: Array.isArray(object?.eventTypes) ? object.eventTypes.map((e: any) => hubEventTypeFromJSON(e)) : [], + fromId: isSet(object.fromId) ? Number(object.fromId) : undefined, + }; + }, + + toJSON(message: SubscribeRequest): unknown { + const obj: any = {}; + if (message.eventTypes) { + obj.eventTypes = message.eventTypes.map((e) => hubEventTypeToJSON(e)); + } else { + obj.eventTypes = []; + } + message.fromId !== undefined && (obj.fromId = Math.round(message.fromId)); + return obj; + }, + + create, I>>(base?: I): SubscribeRequest { + return SubscribeRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SubscribeRequest { + const message = createBaseSubscribeRequest(); + message.eventTypes = object.eventTypes?.map((e) => e) || []; + message.fromId = object.fromId ?? undefined; + return message; + }, +}; + +function createBaseEventRequest(): EventRequest { + return { id: 0 }; +} + +export const EventRequest = { + encode(message: EventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== 0) { + writer.uint32(8).uint64(message.id); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.id = longToNumber(reader.uint64() as Long); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventRequest { + return { id: isSet(object.id) ? Number(object.id) : 0 }; + }, + + toJSON(message: EventRequest): unknown { + const obj: any = {}; + message.id !== undefined && (obj.id = Math.round(message.id)); + return obj; + }, + + create, I>>(base?: I): EventRequest { + return EventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): EventRequest { + const message = createBaseEventRequest(); + message.id = object.id ?? 0; + return message; + }, +}; + +function createBaseHubInfoResponse(): HubInfoResponse { + return { version: '', isSynced: false, nickname: '', rootHash: '' }; +} + +export const HubInfoResponse = { + encode(message: HubInfoResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.version !== '') { + writer.uint32(10).string(message.version); + } + if (message.isSynced === true) { + writer.uint32(16).bool(message.isSynced); + } + if (message.nickname !== '') { + writer.uint32(26).string(message.nickname); + } + if (message.rootHash !== '') { + writer.uint32(34).string(message.rootHash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HubInfoResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHubInfoResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.version = reader.string(); + continue; + case 2: + if (tag != 16) { + break; + } + + message.isSynced = reader.bool(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.nickname = reader.string(); + continue; + case 4: + if (tag != 34) { + break; + } + + message.rootHash = reader.string(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): HubInfoResponse { + return { + version: isSet(object.version) ? String(object.version) : '', + isSynced: isSet(object.isSynced) ? Boolean(object.isSynced) : false, + nickname: isSet(object.nickname) ? String(object.nickname) : '', + rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', + }; + }, + + toJSON(message: HubInfoResponse): unknown { + const obj: any = {}; + message.version !== undefined && (obj.version = message.version); + message.isSynced !== undefined && (obj.isSynced = message.isSynced); + message.nickname !== undefined && (obj.nickname = message.nickname); + message.rootHash !== undefined && (obj.rootHash = message.rootHash); + return obj; + }, + + create, I>>(base?: I): HubInfoResponse { + return HubInfoResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): HubInfoResponse { + const message = createBaseHubInfoResponse(); + message.version = object.version ?? ''; + message.isSynced = object.isSynced ?? false; + message.nickname = object.nickname ?? ''; + message.rootHash = object.rootHash ?? ''; + return message; + }, +}; + +function createBaseTrieNodeMetadataResponse(): TrieNodeMetadataResponse { + return { prefix: new Uint8Array(), numMessages: 0, hash: '', children: [] }; +} + +export const TrieNodeMetadataResponse = { + encode(message: TrieNodeMetadataResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + if (message.numMessages !== 0) { + writer.uint32(16).uint64(message.numMessages); + } + if (message.hash !== '') { + writer.uint32(26).string(message.hash); + } + for (const v of message.children) { + TrieNodeMetadataResponse.encode(v!, writer.uint32(34).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeMetadataResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodeMetadataResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.prefix = reader.bytes(); + continue; + case 2: + if (tag != 16) { + break; + } + + message.numMessages = longToNumber(reader.uint64() as Long); + continue; + case 3: + if (tag != 26) { + break; + } + + message.hash = reader.string(); + continue; + case 4: + if (tag != 34) { + break; + } + + message.children.push(TrieNodeMetadataResponse.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TrieNodeMetadataResponse { + return { + prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), + numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, + hash: isSet(object.hash) ? String(object.hash) : '', + children: Array.isArray(object?.children) + ? object.children.map((e: any) => TrieNodeMetadataResponse.fromJSON(e)) + : [], + }; + }, + + toJSON(message: TrieNodeMetadataResponse): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); + message.hash !== undefined && (obj.hash = message.hash); + if (message.children) { + obj.children = message.children.map((e) => (e ? TrieNodeMetadataResponse.toJSON(e) : undefined)); + } else { + obj.children = []; + } + return obj; + }, + + create, I>>(base?: I): TrieNodeMetadataResponse { + return TrieNodeMetadataResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodeMetadataResponse { + const message = createBaseTrieNodeMetadataResponse(); + message.prefix = object.prefix ?? new Uint8Array(); + message.numMessages = object.numMessages ?? 0; + message.hash = object.hash ?? ''; + message.children = object.children?.map((e) => TrieNodeMetadataResponse.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseTrieNodeSnapshotResponse(): TrieNodeSnapshotResponse { + return { prefix: new Uint8Array(), excludedHashes: [], numMessages: 0, rootHash: '' }; +} + +export const TrieNodeSnapshotResponse = { + encode(message: TrieNodeSnapshotResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + for (const v of message.excludedHashes) { + writer.uint32(18).string(v!); + } + if (message.numMessages !== 0) { + writer.uint32(24).uint64(message.numMessages); + } + if (message.rootHash !== '') { + writer.uint32(34).string(message.rootHash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeSnapshotResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodeSnapshotResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.prefix = reader.bytes(); + continue; + case 2: + if (tag != 18) { + break; + } + + message.excludedHashes.push(reader.string()); + continue; + case 3: + if (tag != 24) { + break; + } + + message.numMessages = longToNumber(reader.uint64() as Long); + continue; + case 4: + if (tag != 34) { + break; + } + + message.rootHash = reader.string(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TrieNodeSnapshotResponse { + return { + prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), + excludedHashes: Array.isArray(object?.excludedHashes) ? object.excludedHashes.map((e: any) => String(e)) : [], + numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, + rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', + }; + }, + + toJSON(message: TrieNodeSnapshotResponse): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + if (message.excludedHashes) { + obj.excludedHashes = message.excludedHashes.map((e) => e); + } else { + obj.excludedHashes = []; + } + message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); + message.rootHash !== undefined && (obj.rootHash = message.rootHash); + return obj; + }, + + create, I>>(base?: I): TrieNodeSnapshotResponse { + return TrieNodeSnapshotResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodeSnapshotResponse { + const message = createBaseTrieNodeSnapshotResponse(); + message.prefix = object.prefix ?? new Uint8Array(); + message.excludedHashes = object.excludedHashes?.map((e) => e) || []; + message.numMessages = object.numMessages ?? 0; + message.rootHash = object.rootHash ?? ''; + return message; + }, +}; + +function createBaseTrieNodePrefix(): TrieNodePrefix { + return { prefix: new Uint8Array() }; +} + +export const TrieNodePrefix = { + encode(message: TrieNodePrefix, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodePrefix { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodePrefix(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.prefix = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TrieNodePrefix { + return { prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array() }; + }, + + toJSON(message: TrieNodePrefix): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): TrieNodePrefix { + return TrieNodePrefix.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodePrefix { + const message = createBaseTrieNodePrefix(); + message.prefix = object.prefix ?? new Uint8Array(); + return message; + }, +}; + +function createBaseSyncIds(): SyncIds { + return { syncIds: [] }; +} + +export const SyncIds = { + encode(message: SyncIds, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.syncIds) { + writer.uint32(10).bytes(v!); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SyncIds { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSyncIds(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.syncIds.push(reader.bytes()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SyncIds { + return { syncIds: Array.isArray(object?.syncIds) ? object.syncIds.map((e: any) => bytesFromBase64(e)) : [] }; + }, + + toJSON(message: SyncIds): unknown { + const obj: any = {}; + if (message.syncIds) { + obj.syncIds = message.syncIds.map((e) => base64FromBytes(e !== undefined ? e : new Uint8Array())); + } else { + obj.syncIds = []; + } + return obj; + }, + + create, I>>(base?: I): SyncIds { + return SyncIds.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SyncIds { + const message = createBaseSyncIds(); + message.syncIds = object.syncIds?.map((e) => e) || []; + return message; + }, +}; + +function createBaseFidRequest(): FidRequest { + return { fid: 0, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const FidRequest = { + encode(message: FidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.pageSize !== undefined) { + writer.uint32(16).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(26).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(32).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 16) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 4: + if (tag != 32) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): FidRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: FidRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): FidRequest { + return FidRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidRequest { + const message = createBaseFidRequest(); + message.fid = object.fid ?? 0; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseFidsRequest(): FidsRequest { + return { pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const FidsRequest = { + encode(message: FidsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.pageSize !== undefined) { + writer.uint32(8).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(18).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(24).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidsRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 2: + if (tag != 18) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 3: + if (tag != 24) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): FidsRequest { + return { + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: FidsRequest): unknown { + const obj: any = {}; + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): FidsRequest { + return FidsRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidsRequest { + const message = createBaseFidsRequest(); + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseFidsResponse(): FidsResponse { + return { fids: [], nextPageToken: undefined }; +} + +export const FidsResponse = { + encode(message: FidsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.fids) { + writer.uint64(v); + } + writer.ldelim(); + if (message.nextPageToken !== undefined) { + writer.uint32(18).bytes(message.nextPageToken); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidsResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidsResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag == 8) { + message.fids.push(longToNumber(reader.uint64() as Long)); + continue; + } + + if (tag == 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.fids.push(longToNumber(reader.uint64() as Long)); + } + + continue; + } + + break; + case 2: + if (tag != 18) { + break; + } + + message.nextPageToken = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): FidsResponse { + return { + fids: Array.isArray(object?.fids) ? object.fids.map((e: any) => Number(e)) : [], + nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, + }; + }, + + toJSON(message: FidsResponse): unknown { + const obj: any = {}; + if (message.fids) { + obj.fids = message.fids.map((e) => Math.round(e)); + } else { + obj.fids = []; + } + message.nextPageToken !== undefined && + (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); + return obj; + }, + + create, I>>(base?: I): FidsResponse { + return FidsResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidsResponse { + const message = createBaseFidsResponse(); + message.fids = object.fids?.map((e) => e) || []; + message.nextPageToken = object.nextPageToken ?? undefined; + return message; + }, +}; + +function createBaseMessagesResponse(): MessagesResponse { + return { messages: [], nextPageToken: undefined }; +} + +export const MessagesResponse = { + encode(message: MessagesResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.messages) { + Message.encode(v!, writer.uint32(10).fork()).ldelim(); + } + if (message.nextPageToken !== undefined) { + writer.uint32(18).bytes(message.nextPageToken); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MessagesResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMessagesResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.messages.push(Message.decode(reader, reader.uint32())); + continue; + case 2: + if (tag != 18) { + break; + } + + message.nextPageToken = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MessagesResponse { + return { + messages: Array.isArray(object?.messages) ? object.messages.map((e: any) => Message.fromJSON(e)) : [], + nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, + }; + }, + + toJSON(message: MessagesResponse): unknown { + const obj: any = {}; + if (message.messages) { + obj.messages = message.messages.map((e) => (e ? Message.toJSON(e) : undefined)); + } else { + obj.messages = []; + } + message.nextPageToken !== undefined && + (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); + return obj; + }, + + create, I>>(base?: I): MessagesResponse { + return MessagesResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): MessagesResponse { + const message = createBaseMessagesResponse(); + message.messages = object.messages?.map((e) => Message.fromPartial(e)) || []; + message.nextPageToken = object.nextPageToken ?? undefined; + return message; + }, +}; + +function createBaseCastsByParentRequest(): CastsByParentRequest { + return { castId: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const CastsByParentRequest = { + encode(message: CastsByParentRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); + } + if (message.pageSize !== undefined) { + writer.uint32(16).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(26).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(32).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): CastsByParentRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCastsByParentRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.castId = CastId.decode(reader, reader.uint32()); + continue; + case 2: + if (tag != 16) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 4: + if (tag != 32) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): CastsByParentRequest { + return { + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: CastsByParentRequest): unknown { + const obj: any = {}; + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): CastsByParentRequest { + return CastsByParentRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): CastsByParentRequest { + const message = createBaseCastsByParentRequest(); + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseReactionRequest(): ReactionRequest { + return { fid: 0, reactionType: 0, castId: undefined }; +} + +export const ReactionRequest = { + encode(message: ReactionRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.reactionType !== 0) { + writer.uint32(16).int32(message.reactionType); + } + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(26).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 16) { + break; + } + + message.reactionType = reader.int32() as any; + continue; + case 3: + if (tag != 26) { + break; + } + + message.castId = CastId.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReactionRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : 0, + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + }; + }, + + toJSON(message: ReactionRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.reactionType !== undefined && (obj.reactionType = reactionTypeToJSON(message.reactionType)); + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + return obj; + }, + + create, I>>(base?: I): ReactionRequest { + return ReactionRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionRequest { + const message = createBaseReactionRequest(); + message.fid = object.fid ?? 0; + message.reactionType = object.reactionType ?? 0; + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + return message; + }, +}; + +function createBaseReactionsByFidRequest(): ReactionsByFidRequest { + return { fid: 0, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const ReactionsByFidRequest = { + encode(message: ReactionsByFidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.reactionType !== undefined) { + writer.uint32(16).int32(message.reactionType); + } + if (message.pageSize !== undefined) { + writer.uint32(24).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(34).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(40).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByFidRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionsByFidRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 16) { + break; + } + + message.reactionType = reader.int32() as any; + continue; + case 3: + if (tag != 24) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 4: + if (tag != 34) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 5: + if (tag != 40) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReactionsByFidRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: ReactionsByFidRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.reactionType !== undefined && + (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): ReactionsByFidRequest { + return ReactionsByFidRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionsByFidRequest { + const message = createBaseReactionsByFidRequest(); + message.fid = object.fid ?? 0; + message.reactionType = object.reactionType ?? undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseReactionsByCastRequest(): ReactionsByCastRequest { + return { castId: undefined, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const ReactionsByCastRequest = { + encode(message: ReactionsByCastRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); + } + if (message.reactionType !== undefined) { + writer.uint32(16).int32(message.reactionType); + } + if (message.pageSize !== undefined) { + writer.uint32(24).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(34).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(40).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByCastRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionsByCastRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.castId = CastId.decode(reader, reader.uint32()); + continue; + case 2: + if (tag != 16) { + break; + } + + message.reactionType = reader.int32() as any; + continue; + case 3: + if (tag != 24) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 4: + if (tag != 34) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 5: + if (tag != 40) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReactionsByCastRequest { + return { + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: ReactionsByCastRequest): unknown { + const obj: any = {}; + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + message.reactionType !== undefined && + (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): ReactionsByCastRequest { + return ReactionsByCastRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionsByCastRequest { + const message = createBaseReactionsByCastRequest(); + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + message.reactionType = object.reactionType ?? undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseUserDataRequest(): UserDataRequest { + return { fid: 0, userDataType: 0 }; +} + +export const UserDataRequest = { + encode(message: UserDataRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.userDataType !== 0) { + writer.uint32(16).int32(message.userDataType); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UserDataRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUserDataRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 16) { + break; + } + + message.userDataType = reader.int32() as any; + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): UserDataRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + userDataType: isSet(object.userDataType) ? userDataTypeFromJSON(object.userDataType) : 0, + }; + }, + + toJSON(message: UserDataRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.userDataType !== undefined && (obj.userDataType = userDataTypeToJSON(message.userDataType)); + return obj; + }, + + create, I>>(base?: I): UserDataRequest { + return UserDataRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): UserDataRequest { + const message = createBaseUserDataRequest(); + message.fid = object.fid ?? 0; + message.userDataType = object.userDataType ?? 0; + return message; + }, +}; + +function createBaseNameRegistryEventRequest(): NameRegistryEventRequest { + return { name: new Uint8Array() }; +} + +export const NameRegistryEventRequest = { + encode(message: NameRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.name.length !== 0) { + writer.uint32(10).bytes(message.name); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): NameRegistryEventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseNameRegistryEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.name = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): NameRegistryEventRequest { + return { name: isSet(object.name) ? bytesFromBase64(object.name) : new Uint8Array() }; + }, + + toJSON(message: NameRegistryEventRequest): unknown { + const obj: any = {}; + message.name !== undefined && + (obj.name = base64FromBytes(message.name !== undefined ? message.name : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): NameRegistryEventRequest { + return NameRegistryEventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): NameRegistryEventRequest { + const message = createBaseNameRegistryEventRequest(); + message.name = object.name ?? new Uint8Array(); + return message; + }, +}; + +function createBaseVerificationRequest(): VerificationRequest { + return { fid: 0, address: new Uint8Array() }; +} + +export const VerificationRequest = { + encode(message: VerificationRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.address.length !== 0) { + writer.uint32(18).bytes(message.address); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): VerificationRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVerificationRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 18) { + break; + } + + message.address = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): VerificationRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array(), + }; + }, + + toJSON(message: VerificationRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.address !== undefined && + (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): VerificationRequest { + return VerificationRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): VerificationRequest { + const message = createBaseVerificationRequest(); + message.fid = object.fid ?? 0; + message.address = object.address ?? new Uint8Array(); + return message; + }, +}; + +function createBaseSignerRequest(): SignerRequest { + return { fid: 0, signer: new Uint8Array() }; +} + +export const SignerRequest = { + encode(message: SignerRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.signer.length !== 0) { + writer.uint32(18).bytes(message.signer); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SignerRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSignerRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 18) { + break; + } + + message.signer = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SignerRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + signer: isSet(object.signer) ? bytesFromBase64(object.signer) : new Uint8Array(), + }; + }, + + toJSON(message: SignerRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.signer !== undefined && + (obj.signer = base64FromBytes(message.signer !== undefined ? message.signer : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): SignerRequest { + return SignerRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SignerRequest { + const message = createBaseSignerRequest(); + message.fid = object.fid ?? 0; + message.signer = object.signer ?? new Uint8Array(); + return message; + }, +}; + +function createBaseIdRegistryEventRequest(): IdRegistryEventRequest { + return { fid: 0 }; +} + +export const IdRegistryEventRequest = { + encode(message: IdRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIdRegistryEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): IdRegistryEventRequest { + return { fid: isSet(object.fid) ? Number(object.fid) : 0 }; + }, + + toJSON(message: IdRegistryEventRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + return obj; + }, + + create, I>>(base?: I): IdRegistryEventRequest { + return IdRegistryEventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): IdRegistryEventRequest { + const message = createBaseIdRegistryEventRequest(); + message.fid = object.fid ?? 0; + return message; + }, +}; + +function createBaseIdRegistryEventByAddressRequest(): IdRegistryEventByAddressRequest { + return { address: new Uint8Array() }; +} + +export const IdRegistryEventByAddressRequest = { + encode(message: IdRegistryEventByAddressRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.address.length !== 0) { + writer.uint32(10).bytes(message.address); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventByAddressRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIdRegistryEventByAddressRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.address = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): IdRegistryEventByAddressRequest { + return { address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array() }; + }, + + toJSON(message: IdRegistryEventByAddressRequest): unknown { + const obj: any = {}; + message.address !== undefined && + (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): IdRegistryEventByAddressRequest { + return IdRegistryEventByAddressRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>( + object: I + ): IdRegistryEventByAddressRequest { + const message = createBaseIdRegistryEventByAddressRequest(); + message.address = object.address ?? new Uint8Array(); + return message; + }, +}; + +declare var self: any | undefined; +declare var window: any | undefined; +declare var global: any | undefined; +var tsProtoGlobalThis: any = (() => { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof global !== 'undefined') { + return global; + } + throw 'Unable to locate global object'; +})(); + +function bytesFromBase64(b64: string): Uint8Array { + if (tsProtoGlobalThis.Buffer) { + return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, 'base64')); + } else { + const bin = tsProtoGlobalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if (tsProtoGlobalThis.Buffer) { + return tsProtoGlobalThis.Buffer.from(arr).toString('base64'); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(String.fromCharCode(byte)); + }); + return tsProtoGlobalThis.btoa(bin.join('')); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(long: Long): number { + if (long.gt(Number.MAX_SAFE_INTEGER)) { + throw new tsProtoGlobalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); + } + return long.toNumber(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/packages/hub-nodejs/src/generated/rpc.ts b/packages/hub-nodejs/src/generated/rpc.ts new file mode 100644 index 0000000000..754ccba54f --- /dev/null +++ b/packages/hub-nodejs/src/generated/rpc.ts @@ -0,0 +1,926 @@ +/* eslint-disable */ +import { + CallOptions, + ChannelCredentials, + Client, + ClientOptions, + ClientReadableStream, + ClientUnaryCall, + handleServerStreamingCall, + handleUnaryCall, + makeGenericClientConstructor, + Metadata, + ServiceError, + UntypedServiceImplementation, +} from '@grpc/grpc-js'; +import { HubEvent } from './hub_event'; +import { IdRegistryEvent } from './id_registry_event'; +import { CastId, Message } from './message'; +import { NameRegistryEvent } from './name_registry_event'; +import { + CastsByParentRequest, + Empty, + EventRequest, + FidRequest, + FidsRequest, + FidsResponse, + HubInfoResponse, + IdRegistryEventByAddressRequest, + IdRegistryEventRequest, + MessagesResponse, + NameRegistryEventRequest, + ReactionRequest, + ReactionsByCastRequest, + ReactionsByFidRequest, + SignerRequest, + SubscribeRequest, + SyncIds, + TrieNodeMetadataResponse, + TrieNodePrefix, + TrieNodeSnapshotResponse, + UserDataRequest, + VerificationRequest, +} from './request_response'; + +export type HubServiceService = typeof HubServiceService; +export const HubServiceService = { + /** Submit Methods */ + submitMessage: { + path: '/HubService/SubmitMessage', + requestStream: false, + responseStream: false, + requestSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), + requestDeserialize: (value: Buffer) => Message.decode(value), + responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), + responseDeserialize: (value: Buffer) => Message.decode(value), + }, + /** Event Methods */ + subscribe: { + path: '/HubService/Subscribe', + requestStream: false, + responseStream: true, + requestSerialize: (value: SubscribeRequest) => Buffer.from(SubscribeRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => SubscribeRequest.decode(value), + responseSerialize: (value: HubEvent) => Buffer.from(HubEvent.encode(value).finish()), + responseDeserialize: (value: Buffer) => HubEvent.decode(value), + }, + getEvent: { + path: '/HubService/GetEvent', + requestStream: false, + responseStream: false, + requestSerialize: (value: EventRequest) => Buffer.from(EventRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => EventRequest.decode(value), + responseSerialize: (value: HubEvent) => Buffer.from(HubEvent.encode(value).finish()), + responseDeserialize: (value: Buffer) => HubEvent.decode(value), + }, + /** Casts */ + getCast: { + path: '/HubService/GetCast', + requestStream: false, + responseStream: false, + requestSerialize: (value: CastId) => Buffer.from(CastId.encode(value).finish()), + requestDeserialize: (value: Buffer) => CastId.decode(value), + responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), + responseDeserialize: (value: Buffer) => Message.decode(value), + }, + getCastsByFid: { + path: '/HubService/GetCastsByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getCastsByParent: { + path: '/HubService/GetCastsByParent', + requestStream: false, + responseStream: false, + requestSerialize: (value: CastsByParentRequest) => Buffer.from(CastsByParentRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => CastsByParentRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getCastsByMention: { + path: '/HubService/GetCastsByMention', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + /** Reactions */ + getReaction: { + path: '/HubService/GetReaction', + requestStream: false, + responseStream: false, + requestSerialize: (value: ReactionRequest) => Buffer.from(ReactionRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => ReactionRequest.decode(value), + responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), + responseDeserialize: (value: Buffer) => Message.decode(value), + }, + getReactionsByFid: { + path: '/HubService/GetReactionsByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: ReactionsByFidRequest) => Buffer.from(ReactionsByFidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => ReactionsByFidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getReactionsByCast: { + path: '/HubService/GetReactionsByCast', + requestStream: false, + responseStream: false, + requestSerialize: (value: ReactionsByCastRequest) => Buffer.from(ReactionsByCastRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => ReactionsByCastRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + /** User Data */ + getUserData: { + path: '/HubService/GetUserData', + requestStream: false, + responseStream: false, + requestSerialize: (value: UserDataRequest) => Buffer.from(UserDataRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => UserDataRequest.decode(value), + responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), + responseDeserialize: (value: Buffer) => Message.decode(value), + }, + getUserDataByFid: { + path: '/HubService/GetUserDataByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getNameRegistryEvent: { + path: '/HubService/GetNameRegistryEvent', + requestStream: false, + responseStream: false, + requestSerialize: (value: NameRegistryEventRequest) => Buffer.from(NameRegistryEventRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => NameRegistryEventRequest.decode(value), + responseSerialize: (value: NameRegistryEvent) => Buffer.from(NameRegistryEvent.encode(value).finish()), + responseDeserialize: (value: Buffer) => NameRegistryEvent.decode(value), + }, + /** Verifications */ + getVerification: { + path: '/HubService/GetVerification', + requestStream: false, + responseStream: false, + requestSerialize: (value: VerificationRequest) => Buffer.from(VerificationRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => VerificationRequest.decode(value), + responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), + responseDeserialize: (value: Buffer) => Message.decode(value), + }, + getVerificationsByFid: { + path: '/HubService/GetVerificationsByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + /** Signer */ + getSigner: { + path: '/HubService/GetSigner', + requestStream: false, + responseStream: false, + requestSerialize: (value: SignerRequest) => Buffer.from(SignerRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => SignerRequest.decode(value), + responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), + responseDeserialize: (value: Buffer) => Message.decode(value), + }, + getSignersByFid: { + path: '/HubService/GetSignersByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getIdRegistryEvent: { + path: '/HubService/GetIdRegistryEvent', + requestStream: false, + responseStream: false, + requestSerialize: (value: IdRegistryEventRequest) => Buffer.from(IdRegistryEventRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => IdRegistryEventRequest.decode(value), + responseSerialize: (value: IdRegistryEvent) => Buffer.from(IdRegistryEvent.encode(value).finish()), + responseDeserialize: (value: Buffer) => IdRegistryEvent.decode(value), + }, + getIdRegistryEventByAddress: { + path: '/HubService/GetIdRegistryEventByAddress', + requestStream: false, + responseStream: false, + requestSerialize: (value: IdRegistryEventByAddressRequest) => + Buffer.from(IdRegistryEventByAddressRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => IdRegistryEventByAddressRequest.decode(value), + responseSerialize: (value: IdRegistryEvent) => Buffer.from(IdRegistryEvent.encode(value).finish()), + responseDeserialize: (value: Buffer) => IdRegistryEvent.decode(value), + }, + getFids: { + path: '/HubService/GetFids', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidsRequest) => Buffer.from(FidsRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidsRequest.decode(value), + responseSerialize: (value: FidsResponse) => Buffer.from(FidsResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => FidsResponse.decode(value), + }, + /** Bulk Methods */ + getAllCastMessagesByFid: { + path: '/HubService/GetAllCastMessagesByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getAllReactionMessagesByFid: { + path: '/HubService/GetAllReactionMessagesByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getAllVerificationMessagesByFid: { + path: '/HubService/GetAllVerificationMessagesByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getAllSignerMessagesByFid: { + path: '/HubService/GetAllSignerMessagesByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getAllUserDataMessagesByFid: { + path: '/HubService/GetAllUserDataMessagesByFid', + requestStream: false, + responseStream: false, + requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => FidRequest.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + /** Sync Methods */ + getInfo: { + path: '/HubService/GetInfo', + requestStream: false, + responseStream: false, + requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), + requestDeserialize: (value: Buffer) => Empty.decode(value), + responseSerialize: (value: HubInfoResponse) => Buffer.from(HubInfoResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => HubInfoResponse.decode(value), + }, + getAllSyncIdsByPrefix: { + path: '/HubService/GetAllSyncIdsByPrefix', + requestStream: false, + responseStream: false, + requestSerialize: (value: TrieNodePrefix) => Buffer.from(TrieNodePrefix.encode(value).finish()), + requestDeserialize: (value: Buffer) => TrieNodePrefix.decode(value), + responseSerialize: (value: SyncIds) => Buffer.from(SyncIds.encode(value).finish()), + responseDeserialize: (value: Buffer) => SyncIds.decode(value), + }, + getAllMessagesBySyncIds: { + path: '/HubService/GetAllMessagesBySyncIds', + requestStream: false, + responseStream: false, + requestSerialize: (value: SyncIds) => Buffer.from(SyncIds.encode(value).finish()), + requestDeserialize: (value: Buffer) => SyncIds.decode(value), + responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), + }, + getSyncMetadataByPrefix: { + path: '/HubService/GetSyncMetadataByPrefix', + requestStream: false, + responseStream: false, + requestSerialize: (value: TrieNodePrefix) => Buffer.from(TrieNodePrefix.encode(value).finish()), + requestDeserialize: (value: Buffer) => TrieNodePrefix.decode(value), + responseSerialize: (value: TrieNodeMetadataResponse) => + Buffer.from(TrieNodeMetadataResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => TrieNodeMetadataResponse.decode(value), + }, + getSyncSnapshotByPrefix: { + path: '/HubService/GetSyncSnapshotByPrefix', + requestStream: false, + responseStream: false, + requestSerialize: (value: TrieNodePrefix) => Buffer.from(TrieNodePrefix.encode(value).finish()), + requestDeserialize: (value: Buffer) => TrieNodePrefix.decode(value), + responseSerialize: (value: TrieNodeSnapshotResponse) => + Buffer.from(TrieNodeSnapshotResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => TrieNodeSnapshotResponse.decode(value), + }, +} as const; + +export interface HubServiceServer extends UntypedServiceImplementation { + /** Submit Methods */ + submitMessage: handleUnaryCall; + /** Event Methods */ + subscribe: handleServerStreamingCall; + getEvent: handleUnaryCall; + /** Casts */ + getCast: handleUnaryCall; + getCastsByFid: handleUnaryCall; + getCastsByParent: handleUnaryCall; + getCastsByMention: handleUnaryCall; + /** Reactions */ + getReaction: handleUnaryCall; + getReactionsByFid: handleUnaryCall; + getReactionsByCast: handleUnaryCall; + /** User Data */ + getUserData: handleUnaryCall; + getUserDataByFid: handleUnaryCall; + getNameRegistryEvent: handleUnaryCall; + /** Verifications */ + getVerification: handleUnaryCall; + getVerificationsByFid: handleUnaryCall; + /** Signer */ + getSigner: handleUnaryCall; + getSignersByFid: handleUnaryCall; + getIdRegistryEvent: handleUnaryCall; + getIdRegistryEventByAddress: handleUnaryCall; + getFids: handleUnaryCall; + /** Bulk Methods */ + getAllCastMessagesByFid: handleUnaryCall; + getAllReactionMessagesByFid: handleUnaryCall; + getAllVerificationMessagesByFid: handleUnaryCall; + getAllSignerMessagesByFid: handleUnaryCall; + getAllUserDataMessagesByFid: handleUnaryCall; + /** Sync Methods */ + getInfo: handleUnaryCall; + getAllSyncIdsByPrefix: handleUnaryCall; + getAllMessagesBySyncIds: handleUnaryCall; + getSyncMetadataByPrefix: handleUnaryCall; + getSyncSnapshotByPrefix: handleUnaryCall; +} + +export interface HubServiceClient extends Client { + /** Submit Methods */ + submitMessage(request: Message, callback: (error: ServiceError | null, response: Message) => void): ClientUnaryCall; + submitMessage( + request: Message, + metadata: Metadata, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + submitMessage( + request: Message, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + /** Event Methods */ + subscribe(request: SubscribeRequest, options?: Partial): ClientReadableStream; + subscribe( + request: SubscribeRequest, + metadata?: Metadata, + options?: Partial + ): ClientReadableStream; + getEvent(request: EventRequest, callback: (error: ServiceError | null, response: HubEvent) => void): ClientUnaryCall; + getEvent( + request: EventRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: HubEvent) => void + ): ClientUnaryCall; + getEvent( + request: EventRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: HubEvent) => void + ): ClientUnaryCall; + /** Casts */ + getCast(request: CastId, callback: (error: ServiceError | null, response: Message) => void): ClientUnaryCall; + getCast( + request: CastId, + metadata: Metadata, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getCast( + request: CastId, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getCastsByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getCastsByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getCastsByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getCastsByParent( + request: CastsByParentRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getCastsByParent( + request: CastsByParentRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getCastsByParent( + request: CastsByParentRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getCastsByMention( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getCastsByMention( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getCastsByMention( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + /** Reactions */ + getReaction( + request: ReactionRequest, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getReaction( + request: ReactionRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getReaction( + request: ReactionRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getReactionsByFid( + request: ReactionsByFidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getReactionsByFid( + request: ReactionsByFidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getReactionsByFid( + request: ReactionsByFidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getReactionsByCast( + request: ReactionsByCastRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getReactionsByCast( + request: ReactionsByCastRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getReactionsByCast( + request: ReactionsByCastRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + /** User Data */ + getUserData( + request: UserDataRequest, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getUserData( + request: UserDataRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getUserData( + request: UserDataRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getUserDataByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getUserDataByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getUserDataByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getNameRegistryEvent( + request: NameRegistryEventRequest, + callback: (error: ServiceError | null, response: NameRegistryEvent) => void + ): ClientUnaryCall; + getNameRegistryEvent( + request: NameRegistryEventRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: NameRegistryEvent) => void + ): ClientUnaryCall; + getNameRegistryEvent( + request: NameRegistryEventRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: NameRegistryEvent) => void + ): ClientUnaryCall; + /** Verifications */ + getVerification( + request: VerificationRequest, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getVerification( + request: VerificationRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getVerification( + request: VerificationRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getVerificationsByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getVerificationsByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getVerificationsByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + /** Signer */ + getSigner(request: SignerRequest, callback: (error: ServiceError | null, response: Message) => void): ClientUnaryCall; + getSigner( + request: SignerRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getSigner( + request: SignerRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Message) => void + ): ClientUnaryCall; + getSignersByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getSignersByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getSignersByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getIdRegistryEvent( + request: IdRegistryEventRequest, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + getIdRegistryEvent( + request: IdRegistryEventRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + getIdRegistryEvent( + request: IdRegistryEventRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + getIdRegistryEventByAddress( + request: IdRegistryEventByAddressRequest, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + getIdRegistryEventByAddress( + request: IdRegistryEventByAddressRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + getIdRegistryEventByAddress( + request: IdRegistryEventByAddressRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + getFids( + request: FidsRequest, + callback: (error: ServiceError | null, response: FidsResponse) => void + ): ClientUnaryCall; + getFids( + request: FidsRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: FidsResponse) => void + ): ClientUnaryCall; + getFids( + request: FidsRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: FidsResponse) => void + ): ClientUnaryCall; + /** Bulk Methods */ + getAllCastMessagesByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllCastMessagesByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllCastMessagesByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllReactionMessagesByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllReactionMessagesByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllReactionMessagesByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllVerificationMessagesByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllVerificationMessagesByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllVerificationMessagesByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllSignerMessagesByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllSignerMessagesByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllSignerMessagesByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllUserDataMessagesByFid( + request: FidRequest, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllUserDataMessagesByFid( + request: FidRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllUserDataMessagesByFid( + request: FidRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + /** Sync Methods */ + getInfo(request: Empty, callback: (error: ServiceError | null, response: HubInfoResponse) => void): ClientUnaryCall; + getInfo( + request: Empty, + metadata: Metadata, + callback: (error: ServiceError | null, response: HubInfoResponse) => void + ): ClientUnaryCall; + getInfo( + request: Empty, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: HubInfoResponse) => void + ): ClientUnaryCall; + getAllSyncIdsByPrefix( + request: TrieNodePrefix, + callback: (error: ServiceError | null, response: SyncIds) => void + ): ClientUnaryCall; + getAllSyncIdsByPrefix( + request: TrieNodePrefix, + metadata: Metadata, + callback: (error: ServiceError | null, response: SyncIds) => void + ): ClientUnaryCall; + getAllSyncIdsByPrefix( + request: TrieNodePrefix, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: SyncIds) => void + ): ClientUnaryCall; + getAllMessagesBySyncIds( + request: SyncIds, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllMessagesBySyncIds( + request: SyncIds, + metadata: Metadata, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getAllMessagesBySyncIds( + request: SyncIds, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: MessagesResponse) => void + ): ClientUnaryCall; + getSyncMetadataByPrefix( + request: TrieNodePrefix, + callback: (error: ServiceError | null, response: TrieNodeMetadataResponse) => void + ): ClientUnaryCall; + getSyncMetadataByPrefix( + request: TrieNodePrefix, + metadata: Metadata, + callback: (error: ServiceError | null, response: TrieNodeMetadataResponse) => void + ): ClientUnaryCall; + getSyncMetadataByPrefix( + request: TrieNodePrefix, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: TrieNodeMetadataResponse) => void + ): ClientUnaryCall; + getSyncSnapshotByPrefix( + request: TrieNodePrefix, + callback: (error: ServiceError | null, response: TrieNodeSnapshotResponse) => void + ): ClientUnaryCall; + getSyncSnapshotByPrefix( + request: TrieNodePrefix, + metadata: Metadata, + callback: (error: ServiceError | null, response: TrieNodeSnapshotResponse) => void + ): ClientUnaryCall; + getSyncSnapshotByPrefix( + request: TrieNodePrefix, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: TrieNodeSnapshotResponse) => void + ): ClientUnaryCall; +} + +export const HubServiceClient = makeGenericClientConstructor(HubServiceService, 'HubService') as unknown as { + new (address: string, credentials: ChannelCredentials, options?: Partial): HubServiceClient; + service: typeof HubServiceService; +}; + +export type AdminServiceService = typeof AdminServiceService; +export const AdminServiceService = { + rebuildSyncTrie: { + path: '/AdminService/RebuildSyncTrie', + requestStream: false, + responseStream: false, + requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), + requestDeserialize: (value: Buffer) => Empty.decode(value), + responseSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), + responseDeserialize: (value: Buffer) => Empty.decode(value), + }, + deleteAllMessagesFromDb: { + path: '/AdminService/DeleteAllMessagesFromDb', + requestStream: false, + responseStream: false, + requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), + requestDeserialize: (value: Buffer) => Empty.decode(value), + responseSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), + responseDeserialize: (value: Buffer) => Empty.decode(value), + }, + submitIdRegistryEvent: { + path: '/AdminService/SubmitIdRegistryEvent', + requestStream: false, + responseStream: false, + requestSerialize: (value: IdRegistryEvent) => Buffer.from(IdRegistryEvent.encode(value).finish()), + requestDeserialize: (value: Buffer) => IdRegistryEvent.decode(value), + responseSerialize: (value: IdRegistryEvent) => Buffer.from(IdRegistryEvent.encode(value).finish()), + responseDeserialize: (value: Buffer) => IdRegistryEvent.decode(value), + }, + submitNameRegistryEvent: { + path: '/AdminService/SubmitNameRegistryEvent', + requestStream: false, + responseStream: false, + requestSerialize: (value: NameRegistryEvent) => Buffer.from(NameRegistryEvent.encode(value).finish()), + requestDeserialize: (value: Buffer) => NameRegistryEvent.decode(value), + responseSerialize: (value: NameRegistryEvent) => Buffer.from(NameRegistryEvent.encode(value).finish()), + responseDeserialize: (value: Buffer) => NameRegistryEvent.decode(value), + }, +} as const; + +export interface AdminServiceServer extends UntypedServiceImplementation { + rebuildSyncTrie: handleUnaryCall; + deleteAllMessagesFromDb: handleUnaryCall; + submitIdRegistryEvent: handleUnaryCall; + submitNameRegistryEvent: handleUnaryCall; +} + +export interface AdminServiceClient extends Client { + rebuildSyncTrie(request: Empty, callback: (error: ServiceError | null, response: Empty) => void): ClientUnaryCall; + rebuildSyncTrie( + request: Empty, + metadata: Metadata, + callback: (error: ServiceError | null, response: Empty) => void + ): ClientUnaryCall; + rebuildSyncTrie( + request: Empty, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Empty) => void + ): ClientUnaryCall; + deleteAllMessagesFromDb( + request: Empty, + callback: (error: ServiceError | null, response: Empty) => void + ): ClientUnaryCall; + deleteAllMessagesFromDb( + request: Empty, + metadata: Metadata, + callback: (error: ServiceError | null, response: Empty) => void + ): ClientUnaryCall; + deleteAllMessagesFromDb( + request: Empty, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Empty) => void + ): ClientUnaryCall; + submitIdRegistryEvent( + request: IdRegistryEvent, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + submitIdRegistryEvent( + request: IdRegistryEvent, + metadata: Metadata, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + submitIdRegistryEvent( + request: IdRegistryEvent, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: IdRegistryEvent) => void + ): ClientUnaryCall; + submitNameRegistryEvent( + request: NameRegistryEvent, + callback: (error: ServiceError | null, response: NameRegistryEvent) => void + ): ClientUnaryCall; + submitNameRegistryEvent( + request: NameRegistryEvent, + metadata: Metadata, + callback: (error: ServiceError | null, response: NameRegistryEvent) => void + ): ClientUnaryCall; + submitNameRegistryEvent( + request: NameRegistryEvent, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: NameRegistryEvent) => void + ): ClientUnaryCall; +} + +export const AdminServiceClient = makeGenericClientConstructor(AdminServiceService, 'AdminService') as unknown as { + new (address: string, credentials: ChannelCredentials, options?: Partial): AdminServiceClient; + service: typeof AdminServiceService; +}; diff --git a/packages/hub-nodejs/src/index.ts b/packages/hub-nodejs/src/index.ts index 2ba2acc2e3..329487d788 100644 --- a/packages/hub-nodejs/src/index.ts +++ b/packages/hub-nodejs/src/index.ts @@ -1,2 +1,8 @@ +export { Metadata, Server, ServerCredentials, status } from '@grpc/grpc-js'; +export type { CallOptions, Client, ClientReadableStream, ClientUnaryCall, ServiceError } from '@grpc/grpc-js'; + export * from '@farcaster/protobufs'; export * from '@farcaster/utils'; + +export * from './generated/rpc'; +export * from './client'; diff --git a/packages/hub-web/README.md b/packages/hub-web/README.md index 607d980f48..ebe6ef4c77 100644 --- a/packages/hub-web/README.md +++ b/packages/hub-web/README.md @@ -4,7 +4,7 @@ A lightweight, fast Typescript interface for Farcaster Hubs. Designed to work wi ## Features -- Call any Hub endpoint from browser environment. +- Call any Hub endpoint from browser environment (or node environemnt using grpc-web). - Serializes and deserializes Farcaster protobufs into Javascript objects. - Has helpers to create and sign Farcaster messages. - Written entirely in TypeScript, with strict types for safety. diff --git a/packages/hub-web/package.json b/packages/hub-web/package.json index af1c6f6e52..d45ba6fe3b 100644 --- a/packages/hub-web/package.json +++ b/packages/hub-web/package.json @@ -29,6 +29,8 @@ "ts-proto": "^1.146.0" }, "dependencies": { + "@farcaster/protobufs": "^0.1.11", + "@farcaster/utils": "^0.4.0", "@improbable-eng/grpc-web": "^0.15.0", "@improbable-eng/grpc-web-node-http-transport": "^0.15.0" } diff --git a/packages/hub-web/src/generated/request_response.ts b/packages/hub-web/src/generated/request_response.ts new file mode 100644 index 0000000000..6ac8757ed7 --- /dev/null +++ b/packages/hub-web/src/generated/request_response.ts @@ -0,0 +1,1959 @@ +/* eslint-disable */ +import Long from 'long'; +import _m0 from 'protobufjs/minimal'; +import { HubEventType, hubEventTypeFromJSON, hubEventTypeToJSON } from './hub_event'; +import { + CastId, + Message, + ReactionType, + reactionTypeFromJSON, + reactionTypeToJSON, + UserDataType, + userDataTypeFromJSON, + userDataTypeToJSON, +} from './message'; + +export interface Empty {} + +export interface SubscribeRequest { + eventTypes: HubEventType[]; + fromId?: number | undefined; +} + +export interface EventRequest { + id: number; +} + +/** Response Types for the Sync RPC Methods */ +export interface HubInfoResponse { + version: string; + isSynced: boolean; + nickname: string; + rootHash: string; +} + +export interface TrieNodeMetadataResponse { + prefix: Uint8Array; + numMessages: number; + hash: string; + children: TrieNodeMetadataResponse[]; +} + +export interface TrieNodeSnapshotResponse { + prefix: Uint8Array; + excludedHashes: string[]; + numMessages: number; + rootHash: string; +} + +export interface TrieNodePrefix { + prefix: Uint8Array; +} + +export interface SyncIds { + syncIds: Uint8Array[]; +} + +export interface FidRequest { + fid: number; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface FidsRequest { + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface FidsResponse { + fids: number[]; + nextPageToken?: Uint8Array | undefined; +} + +export interface MessagesResponse { + messages: Message[]; + nextPageToken?: Uint8Array | undefined; +} + +export interface CastsByParentRequest { + castId: CastId | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface ReactionRequest { + fid: number; + reactionType: ReactionType; + castId: CastId | undefined; +} + +export interface ReactionsByFidRequest { + fid: number; + reactionType?: ReactionType | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface ReactionsByCastRequest { + castId: CastId | undefined; + reactionType?: ReactionType | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface UserDataRequest { + fid: number; + userDataType: UserDataType; +} + +export interface NameRegistryEventRequest { + name: Uint8Array; +} + +export interface VerificationRequest { + fid: number; + address: Uint8Array; +} + +export interface SignerRequest { + fid: number; + signer: Uint8Array; +} + +export interface IdRegistryEventRequest { + fid: number; +} + +export interface IdRegistryEventByAddressRequest { + address: Uint8Array; +} + +function createBaseEmpty(): Empty { + return {}; +} + +export const Empty = { + encode(_: Empty, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Empty { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEmpty(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): Empty { + return {}; + }, + + toJSON(_: Empty): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): Empty { + return Empty.fromPartial(base ?? {}); + }, + + fromPartial, I>>(_: I): Empty { + const message = createBaseEmpty(); + return message; + }, +}; + +function createBaseSubscribeRequest(): SubscribeRequest { + return { eventTypes: [], fromId: undefined }; +} + +export const SubscribeRequest = { + encode(message: SubscribeRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.eventTypes) { + writer.int32(v); + } + writer.ldelim(); + if (message.fromId !== undefined) { + writer.uint32(16).uint64(message.fromId); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSubscribeRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag == 8) { + message.eventTypes.push(reader.int32() as any); + continue; + } + + if (tag == 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.eventTypes.push(reader.int32() as any); + } + + continue; + } + + break; + case 2: + if (tag != 16) { + break; + } + + message.fromId = longToNumber(reader.uint64() as Long); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SubscribeRequest { + return { + eventTypes: Array.isArray(object?.eventTypes) ? object.eventTypes.map((e: any) => hubEventTypeFromJSON(e)) : [], + fromId: isSet(object.fromId) ? Number(object.fromId) : undefined, + }; + }, + + toJSON(message: SubscribeRequest): unknown { + const obj: any = {}; + if (message.eventTypes) { + obj.eventTypes = message.eventTypes.map((e) => hubEventTypeToJSON(e)); + } else { + obj.eventTypes = []; + } + message.fromId !== undefined && (obj.fromId = Math.round(message.fromId)); + return obj; + }, + + create, I>>(base?: I): SubscribeRequest { + return SubscribeRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SubscribeRequest { + const message = createBaseSubscribeRequest(); + message.eventTypes = object.eventTypes?.map((e) => e) || []; + message.fromId = object.fromId ?? undefined; + return message; + }, +}; + +function createBaseEventRequest(): EventRequest { + return { id: 0 }; +} + +export const EventRequest = { + encode(message: EventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== 0) { + writer.uint32(8).uint64(message.id); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.id = longToNumber(reader.uint64() as Long); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventRequest { + return { id: isSet(object.id) ? Number(object.id) : 0 }; + }, + + toJSON(message: EventRequest): unknown { + const obj: any = {}; + message.id !== undefined && (obj.id = Math.round(message.id)); + return obj; + }, + + create, I>>(base?: I): EventRequest { + return EventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): EventRequest { + const message = createBaseEventRequest(); + message.id = object.id ?? 0; + return message; + }, +}; + +function createBaseHubInfoResponse(): HubInfoResponse { + return { version: '', isSynced: false, nickname: '', rootHash: '' }; +} + +export const HubInfoResponse = { + encode(message: HubInfoResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.version !== '') { + writer.uint32(10).string(message.version); + } + if (message.isSynced === true) { + writer.uint32(16).bool(message.isSynced); + } + if (message.nickname !== '') { + writer.uint32(26).string(message.nickname); + } + if (message.rootHash !== '') { + writer.uint32(34).string(message.rootHash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HubInfoResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHubInfoResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.version = reader.string(); + continue; + case 2: + if (tag != 16) { + break; + } + + message.isSynced = reader.bool(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.nickname = reader.string(); + continue; + case 4: + if (tag != 34) { + break; + } + + message.rootHash = reader.string(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): HubInfoResponse { + return { + version: isSet(object.version) ? String(object.version) : '', + isSynced: isSet(object.isSynced) ? Boolean(object.isSynced) : false, + nickname: isSet(object.nickname) ? String(object.nickname) : '', + rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', + }; + }, + + toJSON(message: HubInfoResponse): unknown { + const obj: any = {}; + message.version !== undefined && (obj.version = message.version); + message.isSynced !== undefined && (obj.isSynced = message.isSynced); + message.nickname !== undefined && (obj.nickname = message.nickname); + message.rootHash !== undefined && (obj.rootHash = message.rootHash); + return obj; + }, + + create, I>>(base?: I): HubInfoResponse { + return HubInfoResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): HubInfoResponse { + const message = createBaseHubInfoResponse(); + message.version = object.version ?? ''; + message.isSynced = object.isSynced ?? false; + message.nickname = object.nickname ?? ''; + message.rootHash = object.rootHash ?? ''; + return message; + }, +}; + +function createBaseTrieNodeMetadataResponse(): TrieNodeMetadataResponse { + return { prefix: new Uint8Array(), numMessages: 0, hash: '', children: [] }; +} + +export const TrieNodeMetadataResponse = { + encode(message: TrieNodeMetadataResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + if (message.numMessages !== 0) { + writer.uint32(16).uint64(message.numMessages); + } + if (message.hash !== '') { + writer.uint32(26).string(message.hash); + } + for (const v of message.children) { + TrieNodeMetadataResponse.encode(v!, writer.uint32(34).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeMetadataResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodeMetadataResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.prefix = reader.bytes(); + continue; + case 2: + if (tag != 16) { + break; + } + + message.numMessages = longToNumber(reader.uint64() as Long); + continue; + case 3: + if (tag != 26) { + break; + } + + message.hash = reader.string(); + continue; + case 4: + if (tag != 34) { + break; + } + + message.children.push(TrieNodeMetadataResponse.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TrieNodeMetadataResponse { + return { + prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), + numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, + hash: isSet(object.hash) ? String(object.hash) : '', + children: Array.isArray(object?.children) + ? object.children.map((e: any) => TrieNodeMetadataResponse.fromJSON(e)) + : [], + }; + }, + + toJSON(message: TrieNodeMetadataResponse): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); + message.hash !== undefined && (obj.hash = message.hash); + if (message.children) { + obj.children = message.children.map((e) => (e ? TrieNodeMetadataResponse.toJSON(e) : undefined)); + } else { + obj.children = []; + } + return obj; + }, + + create, I>>(base?: I): TrieNodeMetadataResponse { + return TrieNodeMetadataResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodeMetadataResponse { + const message = createBaseTrieNodeMetadataResponse(); + message.prefix = object.prefix ?? new Uint8Array(); + message.numMessages = object.numMessages ?? 0; + message.hash = object.hash ?? ''; + message.children = object.children?.map((e) => TrieNodeMetadataResponse.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseTrieNodeSnapshotResponse(): TrieNodeSnapshotResponse { + return { prefix: new Uint8Array(), excludedHashes: [], numMessages: 0, rootHash: '' }; +} + +export const TrieNodeSnapshotResponse = { + encode(message: TrieNodeSnapshotResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + for (const v of message.excludedHashes) { + writer.uint32(18).string(v!); + } + if (message.numMessages !== 0) { + writer.uint32(24).uint64(message.numMessages); + } + if (message.rootHash !== '') { + writer.uint32(34).string(message.rootHash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeSnapshotResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodeSnapshotResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.prefix = reader.bytes(); + continue; + case 2: + if (tag != 18) { + break; + } + + message.excludedHashes.push(reader.string()); + continue; + case 3: + if (tag != 24) { + break; + } + + message.numMessages = longToNumber(reader.uint64() as Long); + continue; + case 4: + if (tag != 34) { + break; + } + + message.rootHash = reader.string(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TrieNodeSnapshotResponse { + return { + prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), + excludedHashes: Array.isArray(object?.excludedHashes) ? object.excludedHashes.map((e: any) => String(e)) : [], + numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, + rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', + }; + }, + + toJSON(message: TrieNodeSnapshotResponse): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + if (message.excludedHashes) { + obj.excludedHashes = message.excludedHashes.map((e) => e); + } else { + obj.excludedHashes = []; + } + message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); + message.rootHash !== undefined && (obj.rootHash = message.rootHash); + return obj; + }, + + create, I>>(base?: I): TrieNodeSnapshotResponse { + return TrieNodeSnapshotResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodeSnapshotResponse { + const message = createBaseTrieNodeSnapshotResponse(); + message.prefix = object.prefix ?? new Uint8Array(); + message.excludedHashes = object.excludedHashes?.map((e) => e) || []; + message.numMessages = object.numMessages ?? 0; + message.rootHash = object.rootHash ?? ''; + return message; + }, +}; + +function createBaseTrieNodePrefix(): TrieNodePrefix { + return { prefix: new Uint8Array() }; +} + +export const TrieNodePrefix = { + encode(message: TrieNodePrefix, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodePrefix { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodePrefix(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.prefix = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TrieNodePrefix { + return { prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array() }; + }, + + toJSON(message: TrieNodePrefix): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): TrieNodePrefix { + return TrieNodePrefix.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodePrefix { + const message = createBaseTrieNodePrefix(); + message.prefix = object.prefix ?? new Uint8Array(); + return message; + }, +}; + +function createBaseSyncIds(): SyncIds { + return { syncIds: [] }; +} + +export const SyncIds = { + encode(message: SyncIds, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.syncIds) { + writer.uint32(10).bytes(v!); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SyncIds { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSyncIds(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.syncIds.push(reader.bytes()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SyncIds { + return { syncIds: Array.isArray(object?.syncIds) ? object.syncIds.map((e: any) => bytesFromBase64(e)) : [] }; + }, + + toJSON(message: SyncIds): unknown { + const obj: any = {}; + if (message.syncIds) { + obj.syncIds = message.syncIds.map((e) => base64FromBytes(e !== undefined ? e : new Uint8Array())); + } else { + obj.syncIds = []; + } + return obj; + }, + + create, I>>(base?: I): SyncIds { + return SyncIds.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SyncIds { + const message = createBaseSyncIds(); + message.syncIds = object.syncIds?.map((e) => e) || []; + return message; + }, +}; + +function createBaseFidRequest(): FidRequest { + return { fid: 0, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const FidRequest = { + encode(message: FidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.pageSize !== undefined) { + writer.uint32(16).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(26).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(32).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 16) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 4: + if (tag != 32) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): FidRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: FidRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): FidRequest { + return FidRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidRequest { + const message = createBaseFidRequest(); + message.fid = object.fid ?? 0; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseFidsRequest(): FidsRequest { + return { pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const FidsRequest = { + encode(message: FidsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.pageSize !== undefined) { + writer.uint32(8).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(18).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(24).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidsRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 2: + if (tag != 18) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 3: + if (tag != 24) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): FidsRequest { + return { + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: FidsRequest): unknown { + const obj: any = {}; + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): FidsRequest { + return FidsRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidsRequest { + const message = createBaseFidsRequest(); + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseFidsResponse(): FidsResponse { + return { fids: [], nextPageToken: undefined }; +} + +export const FidsResponse = { + encode(message: FidsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.fids) { + writer.uint64(v); + } + writer.ldelim(); + if (message.nextPageToken !== undefined) { + writer.uint32(18).bytes(message.nextPageToken); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidsResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidsResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag == 8) { + message.fids.push(longToNumber(reader.uint64() as Long)); + continue; + } + + if (tag == 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.fids.push(longToNumber(reader.uint64() as Long)); + } + + continue; + } + + break; + case 2: + if (tag != 18) { + break; + } + + message.nextPageToken = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): FidsResponse { + return { + fids: Array.isArray(object?.fids) ? object.fids.map((e: any) => Number(e)) : [], + nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, + }; + }, + + toJSON(message: FidsResponse): unknown { + const obj: any = {}; + if (message.fids) { + obj.fids = message.fids.map((e) => Math.round(e)); + } else { + obj.fids = []; + } + message.nextPageToken !== undefined && + (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); + return obj; + }, + + create, I>>(base?: I): FidsResponse { + return FidsResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidsResponse { + const message = createBaseFidsResponse(); + message.fids = object.fids?.map((e) => e) || []; + message.nextPageToken = object.nextPageToken ?? undefined; + return message; + }, +}; + +function createBaseMessagesResponse(): MessagesResponse { + return { messages: [], nextPageToken: undefined }; +} + +export const MessagesResponse = { + encode(message: MessagesResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.messages) { + Message.encode(v!, writer.uint32(10).fork()).ldelim(); + } + if (message.nextPageToken !== undefined) { + writer.uint32(18).bytes(message.nextPageToken); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MessagesResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMessagesResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.messages.push(Message.decode(reader, reader.uint32())); + continue; + case 2: + if (tag != 18) { + break; + } + + message.nextPageToken = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MessagesResponse { + return { + messages: Array.isArray(object?.messages) ? object.messages.map((e: any) => Message.fromJSON(e)) : [], + nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, + }; + }, + + toJSON(message: MessagesResponse): unknown { + const obj: any = {}; + if (message.messages) { + obj.messages = message.messages.map((e) => (e ? Message.toJSON(e) : undefined)); + } else { + obj.messages = []; + } + message.nextPageToken !== undefined && + (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); + return obj; + }, + + create, I>>(base?: I): MessagesResponse { + return MessagesResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): MessagesResponse { + const message = createBaseMessagesResponse(); + message.messages = object.messages?.map((e) => Message.fromPartial(e)) || []; + message.nextPageToken = object.nextPageToken ?? undefined; + return message; + }, +}; + +function createBaseCastsByParentRequest(): CastsByParentRequest { + return { castId: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const CastsByParentRequest = { + encode(message: CastsByParentRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); + } + if (message.pageSize !== undefined) { + writer.uint32(16).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(26).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(32).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): CastsByParentRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCastsByParentRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.castId = CastId.decode(reader, reader.uint32()); + continue; + case 2: + if (tag != 16) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 3: + if (tag != 26) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 4: + if (tag != 32) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): CastsByParentRequest { + return { + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: CastsByParentRequest): unknown { + const obj: any = {}; + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): CastsByParentRequest { + return CastsByParentRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): CastsByParentRequest { + const message = createBaseCastsByParentRequest(); + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseReactionRequest(): ReactionRequest { + return { fid: 0, reactionType: 0, castId: undefined }; +} + +export const ReactionRequest = { + encode(message: ReactionRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.reactionType !== 0) { + writer.uint32(16).int32(message.reactionType); + } + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(26).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 16) { + break; + } + + message.reactionType = reader.int32() as any; + continue; + case 3: + if (tag != 26) { + break; + } + + message.castId = CastId.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReactionRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : 0, + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + }; + }, + + toJSON(message: ReactionRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.reactionType !== undefined && (obj.reactionType = reactionTypeToJSON(message.reactionType)); + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + return obj; + }, + + create, I>>(base?: I): ReactionRequest { + return ReactionRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionRequest { + const message = createBaseReactionRequest(); + message.fid = object.fid ?? 0; + message.reactionType = object.reactionType ?? 0; + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + return message; + }, +}; + +function createBaseReactionsByFidRequest(): ReactionsByFidRequest { + return { fid: 0, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const ReactionsByFidRequest = { + encode(message: ReactionsByFidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.reactionType !== undefined) { + writer.uint32(16).int32(message.reactionType); + } + if (message.pageSize !== undefined) { + writer.uint32(24).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(34).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(40).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByFidRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionsByFidRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 16) { + break; + } + + message.reactionType = reader.int32() as any; + continue; + case 3: + if (tag != 24) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 4: + if (tag != 34) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 5: + if (tag != 40) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReactionsByFidRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: ReactionsByFidRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.reactionType !== undefined && + (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): ReactionsByFidRequest { + return ReactionsByFidRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionsByFidRequest { + const message = createBaseReactionsByFidRequest(); + message.fid = object.fid ?? 0; + message.reactionType = object.reactionType ?? undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseReactionsByCastRequest(): ReactionsByCastRequest { + return { castId: undefined, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const ReactionsByCastRequest = { + encode(message: ReactionsByCastRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); + } + if (message.reactionType !== undefined) { + writer.uint32(16).int32(message.reactionType); + } + if (message.pageSize !== undefined) { + writer.uint32(24).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(34).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(40).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByCastRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionsByCastRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.castId = CastId.decode(reader, reader.uint32()); + continue; + case 2: + if (tag != 16) { + break; + } + + message.reactionType = reader.int32() as any; + continue; + case 3: + if (tag != 24) { + break; + } + + message.pageSize = reader.uint32(); + continue; + case 4: + if (tag != 34) { + break; + } + + message.pageToken = reader.bytes(); + continue; + case 5: + if (tag != 40) { + break; + } + + message.reverse = reader.bool(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReactionsByCastRequest { + return { + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: ReactionsByCastRequest): unknown { + const obj: any = {}; + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + message.reactionType !== undefined && + (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): ReactionsByCastRequest { + return ReactionsByCastRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionsByCastRequest { + const message = createBaseReactionsByCastRequest(); + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + message.reactionType = object.reactionType ?? undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseUserDataRequest(): UserDataRequest { + return { fid: 0, userDataType: 0 }; +} + +export const UserDataRequest = { + encode(message: UserDataRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.userDataType !== 0) { + writer.uint32(16).int32(message.userDataType); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UserDataRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUserDataRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 16) { + break; + } + + message.userDataType = reader.int32() as any; + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): UserDataRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + userDataType: isSet(object.userDataType) ? userDataTypeFromJSON(object.userDataType) : 0, + }; + }, + + toJSON(message: UserDataRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.userDataType !== undefined && (obj.userDataType = userDataTypeToJSON(message.userDataType)); + return obj; + }, + + create, I>>(base?: I): UserDataRequest { + return UserDataRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): UserDataRequest { + const message = createBaseUserDataRequest(); + message.fid = object.fid ?? 0; + message.userDataType = object.userDataType ?? 0; + return message; + }, +}; + +function createBaseNameRegistryEventRequest(): NameRegistryEventRequest { + return { name: new Uint8Array() }; +} + +export const NameRegistryEventRequest = { + encode(message: NameRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.name.length !== 0) { + writer.uint32(10).bytes(message.name); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): NameRegistryEventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseNameRegistryEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.name = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): NameRegistryEventRequest { + return { name: isSet(object.name) ? bytesFromBase64(object.name) : new Uint8Array() }; + }, + + toJSON(message: NameRegistryEventRequest): unknown { + const obj: any = {}; + message.name !== undefined && + (obj.name = base64FromBytes(message.name !== undefined ? message.name : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): NameRegistryEventRequest { + return NameRegistryEventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): NameRegistryEventRequest { + const message = createBaseNameRegistryEventRequest(); + message.name = object.name ?? new Uint8Array(); + return message; + }, +}; + +function createBaseVerificationRequest(): VerificationRequest { + return { fid: 0, address: new Uint8Array() }; +} + +export const VerificationRequest = { + encode(message: VerificationRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.address.length !== 0) { + writer.uint32(18).bytes(message.address); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): VerificationRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVerificationRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 18) { + break; + } + + message.address = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): VerificationRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array(), + }; + }, + + toJSON(message: VerificationRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.address !== undefined && + (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): VerificationRequest { + return VerificationRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): VerificationRequest { + const message = createBaseVerificationRequest(); + message.fid = object.fid ?? 0; + message.address = object.address ?? new Uint8Array(); + return message; + }, +}; + +function createBaseSignerRequest(): SignerRequest { + return { fid: 0, signer: new Uint8Array() }; +} + +export const SignerRequest = { + encode(message: SignerRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.signer.length !== 0) { + writer.uint32(18).bytes(message.signer); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SignerRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSignerRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + case 2: + if (tag != 18) { + break; + } + + message.signer = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SignerRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + signer: isSet(object.signer) ? bytesFromBase64(object.signer) : new Uint8Array(), + }; + }, + + toJSON(message: SignerRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.signer !== undefined && + (obj.signer = base64FromBytes(message.signer !== undefined ? message.signer : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): SignerRequest { + return SignerRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SignerRequest { + const message = createBaseSignerRequest(); + message.fid = object.fid ?? 0; + message.signer = object.signer ?? new Uint8Array(); + return message; + }, +}; + +function createBaseIdRegistryEventRequest(): IdRegistryEventRequest { + return { fid: 0 }; +} + +export const IdRegistryEventRequest = { + encode(message: IdRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIdRegistryEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 8) { + break; + } + + message.fid = longToNumber(reader.uint64() as Long); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): IdRegistryEventRequest { + return { fid: isSet(object.fid) ? Number(object.fid) : 0 }; + }, + + toJSON(message: IdRegistryEventRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + return obj; + }, + + create, I>>(base?: I): IdRegistryEventRequest { + return IdRegistryEventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): IdRegistryEventRequest { + const message = createBaseIdRegistryEventRequest(); + message.fid = object.fid ?? 0; + return message; + }, +}; + +function createBaseIdRegistryEventByAddressRequest(): IdRegistryEventByAddressRequest { + return { address: new Uint8Array() }; +} + +export const IdRegistryEventByAddressRequest = { + encode(message: IdRegistryEventByAddressRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.address.length !== 0) { + writer.uint32(10).bytes(message.address); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventByAddressRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIdRegistryEventByAddressRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag != 10) { + break; + } + + message.address = reader.bytes(); + continue; + } + if ((tag & 7) == 4 || tag == 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): IdRegistryEventByAddressRequest { + return { address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array() }; + }, + + toJSON(message: IdRegistryEventByAddressRequest): unknown { + const obj: any = {}; + message.address !== undefined && + (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): IdRegistryEventByAddressRequest { + return IdRegistryEventByAddressRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>( + object: I + ): IdRegistryEventByAddressRequest { + const message = createBaseIdRegistryEventByAddressRequest(); + message.address = object.address ?? new Uint8Array(); + return message; + }, +}; + +declare var self: any | undefined; +declare var window: any | undefined; +declare var global: any | undefined; +var tsProtoGlobalThis: any = (() => { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof global !== 'undefined') { + return global; + } + throw 'Unable to locate global object'; +})(); + +function bytesFromBase64(b64: string): Uint8Array { + if (tsProtoGlobalThis.Buffer) { + return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, 'base64')); + } else { + const bin = tsProtoGlobalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if (tsProtoGlobalThis.Buffer) { + return tsProtoGlobalThis.Buffer.from(arr).toString('base64'); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(String.fromCharCode(byte)); + }); + return tsProtoGlobalThis.btoa(bin.join('')); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(long: Long): number { + if (long.gt(Number.MAX_SAFE_INTEGER)) { + throw new tsProtoGlobalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); + } + return long.toNumber(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/packages/hub-web/src/generated/rpc.ts b/packages/hub-web/src/generated/rpc.ts index 9c42ad5706..542e4152cb 100644 --- a/packages/hub-web/src/generated/rpc.ts +++ b/packages/hub-web/src/generated/rpc.ts @@ -1,1891 +1,36 @@ /* eslint-disable */ import { grpc } from '@improbable-eng/grpc-web'; import { BrowserHeaders } from 'browser-headers'; -import Long from 'long'; -import _m0 from 'protobufjs/minimal'; import { Observable } from 'rxjs'; import { share } from 'rxjs/operators'; -import { HubEvent, HubEventType, hubEventTypeFromJSON, hubEventTypeToJSON } from './hub_event'; +import { HubEvent } from './hub_event'; import { IdRegistryEvent } from './id_registry_event'; -import { - CastId, - Message, - ReactionType, - reactionTypeFromJSON, - reactionTypeToJSON, - UserDataType, - userDataTypeFromJSON, - userDataTypeToJSON, -} from './message'; +import { CastId, Message } from './message'; import { NameRegistryEvent } from './name_registry_event'; - -export interface Empty {} - -export interface SubscribeRequest { - eventTypes: HubEventType[]; - fromId?: number | undefined; -} - -export interface EventRequest { - id: number; -} - -/** Response Types for the Sync RPC Methods */ -export interface HubInfoResponse { - version: string; - isSynced: boolean; - nickname: string; - rootHash: string; -} - -export interface TrieNodeMetadataResponse { - prefix: Uint8Array; - numMessages: number; - hash: string; - children: TrieNodeMetadataResponse[]; -} - -export interface TrieNodeSnapshotResponse { - prefix: Uint8Array; - excludedHashes: string[]; - numMessages: number; - rootHash: string; -} - -export interface TrieNodePrefix { - prefix: Uint8Array; -} - -export interface SyncIds { - syncIds: Uint8Array[]; -} - -export interface FidRequest { - fid: number; - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface FidsRequest { - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface FidsResponse { - fids: number[]; - nextPageToken?: Uint8Array | undefined; -} - -export interface MessagesResponse { - messages: Message[]; - nextPageToken?: Uint8Array | undefined; -} - -export interface CastsByParentRequest { - castId: CastId | undefined; - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface ReactionRequest { - fid: number; - reactionType: ReactionType; - castId: CastId | undefined; -} - -export interface ReactionsByFidRequest { - fid: number; - reactionType?: ReactionType | undefined; - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface ReactionsByCastRequest { - castId: CastId | undefined; - reactionType?: ReactionType | undefined; - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface UserDataRequest { - fid: number; - userDataType: UserDataType; -} - -export interface NameRegistryEventRequest { - name: Uint8Array; -} - -export interface VerificationRequest { - fid: number; - address: Uint8Array; -} - -export interface SignerRequest { - fid: number; - signer: Uint8Array; -} - -export interface IdRegistryEventRequest { - fid: number; -} - -export interface IdRegistryEventByAddressRequest { - address: Uint8Array; -} - -function createBaseEmpty(): Empty { - return {}; -} - -export const Empty = { - encode(_: Empty, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Empty { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEmpty(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(_: any): Empty { - return {}; - }, - - toJSON(_: Empty): unknown { - const obj: any = {}; - return obj; - }, - - create, I>>(base?: I): Empty { - return Empty.fromPartial(base ?? {}); - }, - - fromPartial, I>>(_: I): Empty { - const message = createBaseEmpty(); - return message; - }, -}; - -function createBaseSubscribeRequest(): SubscribeRequest { - return { eventTypes: [], fromId: undefined }; -} - -export const SubscribeRequest = { - encode(message: SubscribeRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - writer.uint32(10).fork(); - for (const v of message.eventTypes) { - writer.int32(v); - } - writer.ldelim(); - if (message.fromId !== undefined) { - writer.uint32(16).uint64(message.fromId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribeRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag == 8) { - message.eventTypes.push(reader.int32() as any); - continue; - } - - if (tag == 10) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.eventTypes.push(reader.int32() as any); - } - - continue; - } - - break; - case 2: - if (tag != 16) { - break; - } - - message.fromId = longToNumber(reader.uint64() as Long); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SubscribeRequest { - return { - eventTypes: Array.isArray(object?.eventTypes) ? object.eventTypes.map((e: any) => hubEventTypeFromJSON(e)) : [], - fromId: isSet(object.fromId) ? Number(object.fromId) : undefined, - }; - }, - - toJSON(message: SubscribeRequest): unknown { - const obj: any = {}; - if (message.eventTypes) { - obj.eventTypes = message.eventTypes.map((e) => hubEventTypeToJSON(e)); - } else { - obj.eventTypes = []; - } - message.fromId !== undefined && (obj.fromId = Math.round(message.fromId)); - return obj; - }, - - create, I>>(base?: I): SubscribeRequest { - return SubscribeRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): SubscribeRequest { - const message = createBaseSubscribeRequest(); - message.eventTypes = object.eventTypes?.map((e) => e) || []; - message.fromId = object.fromId ?? undefined; - return message; - }, -}; - -function createBaseEventRequest(): EventRequest { - return { id: 0 }; -} - -export const EventRequest = { - encode(message: EventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== 0) { - writer.uint32(8).uint64(message.id); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): EventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.id = longToNumber(reader.uint64() as Long); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): EventRequest { - return { id: isSet(object.id) ? Number(object.id) : 0 }; - }, - - toJSON(message: EventRequest): unknown { - const obj: any = {}; - message.id !== undefined && (obj.id = Math.round(message.id)); - return obj; - }, - - create, I>>(base?: I): EventRequest { - return EventRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): EventRequest { - const message = createBaseEventRequest(); - message.id = object.id ?? 0; - return message; - }, -}; - -function createBaseHubInfoResponse(): HubInfoResponse { - return { version: '', isSynced: false, nickname: '', rootHash: '' }; -} - -export const HubInfoResponse = { - encode(message: HubInfoResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.version !== '') { - writer.uint32(10).string(message.version); - } - if (message.isSynced === true) { - writer.uint32(16).bool(message.isSynced); - } - if (message.nickname !== '') { - writer.uint32(26).string(message.nickname); - } - if (message.rootHash !== '') { - writer.uint32(34).string(message.rootHash); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): HubInfoResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseHubInfoResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.version = reader.string(); - continue; - case 2: - if (tag != 16) { - break; - } - - message.isSynced = reader.bool(); - continue; - case 3: - if (tag != 26) { - break; - } - - message.nickname = reader.string(); - continue; - case 4: - if (tag != 34) { - break; - } - - message.rootHash = reader.string(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): HubInfoResponse { - return { - version: isSet(object.version) ? String(object.version) : '', - isSynced: isSet(object.isSynced) ? Boolean(object.isSynced) : false, - nickname: isSet(object.nickname) ? String(object.nickname) : '', - rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', - }; - }, - - toJSON(message: HubInfoResponse): unknown { - const obj: any = {}; - message.version !== undefined && (obj.version = message.version); - message.isSynced !== undefined && (obj.isSynced = message.isSynced); - message.nickname !== undefined && (obj.nickname = message.nickname); - message.rootHash !== undefined && (obj.rootHash = message.rootHash); - return obj; - }, - - create, I>>(base?: I): HubInfoResponse { - return HubInfoResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): HubInfoResponse { - const message = createBaseHubInfoResponse(); - message.version = object.version ?? ''; - message.isSynced = object.isSynced ?? false; - message.nickname = object.nickname ?? ''; - message.rootHash = object.rootHash ?? ''; - return message; - }, -}; - -function createBaseTrieNodeMetadataResponse(): TrieNodeMetadataResponse { - return { prefix: new Uint8Array(), numMessages: 0, hash: '', children: [] }; -} - -export const TrieNodeMetadataResponse = { - encode(message: TrieNodeMetadataResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.prefix.length !== 0) { - writer.uint32(10).bytes(message.prefix); - } - if (message.numMessages !== 0) { - writer.uint32(16).uint64(message.numMessages); - } - if (message.hash !== '') { - writer.uint32(26).string(message.hash); - } - for (const v of message.children) { - TrieNodeMetadataResponse.encode(v!, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeMetadataResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrieNodeMetadataResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.prefix = reader.bytes(); - continue; - case 2: - if (tag != 16) { - break; - } - - message.numMessages = longToNumber(reader.uint64() as Long); - continue; - case 3: - if (tag != 26) { - break; - } - - message.hash = reader.string(); - continue; - case 4: - if (tag != 34) { - break; - } - - message.children.push(TrieNodeMetadataResponse.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TrieNodeMetadataResponse { - return { - prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), - numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, - hash: isSet(object.hash) ? String(object.hash) : '', - children: Array.isArray(object?.children) - ? object.children.map((e: any) => TrieNodeMetadataResponse.fromJSON(e)) - : [], - }; - }, - - toJSON(message: TrieNodeMetadataResponse): unknown { - const obj: any = {}; - message.prefix !== undefined && - (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); - message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); - message.hash !== undefined && (obj.hash = message.hash); - if (message.children) { - obj.children = message.children.map((e) => (e ? TrieNodeMetadataResponse.toJSON(e) : undefined)); - } else { - obj.children = []; - } - return obj; - }, - - create, I>>(base?: I): TrieNodeMetadataResponse { - return TrieNodeMetadataResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): TrieNodeMetadataResponse { - const message = createBaseTrieNodeMetadataResponse(); - message.prefix = object.prefix ?? new Uint8Array(); - message.numMessages = object.numMessages ?? 0; - message.hash = object.hash ?? ''; - message.children = object.children?.map((e) => TrieNodeMetadataResponse.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseTrieNodeSnapshotResponse(): TrieNodeSnapshotResponse { - return { prefix: new Uint8Array(), excludedHashes: [], numMessages: 0, rootHash: '' }; -} - -export const TrieNodeSnapshotResponse = { - encode(message: TrieNodeSnapshotResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.prefix.length !== 0) { - writer.uint32(10).bytes(message.prefix); - } - for (const v of message.excludedHashes) { - writer.uint32(18).string(v!); - } - if (message.numMessages !== 0) { - writer.uint32(24).uint64(message.numMessages); - } - if (message.rootHash !== '') { - writer.uint32(34).string(message.rootHash); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeSnapshotResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrieNodeSnapshotResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.prefix = reader.bytes(); - continue; - case 2: - if (tag != 18) { - break; - } - - message.excludedHashes.push(reader.string()); - continue; - case 3: - if (tag != 24) { - break; - } - - message.numMessages = longToNumber(reader.uint64() as Long); - continue; - case 4: - if (tag != 34) { - break; - } - - message.rootHash = reader.string(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TrieNodeSnapshotResponse { - return { - prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), - excludedHashes: Array.isArray(object?.excludedHashes) ? object.excludedHashes.map((e: any) => String(e)) : [], - numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, - rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', - }; - }, - - toJSON(message: TrieNodeSnapshotResponse): unknown { - const obj: any = {}; - message.prefix !== undefined && - (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); - if (message.excludedHashes) { - obj.excludedHashes = message.excludedHashes.map((e) => e); - } else { - obj.excludedHashes = []; - } - message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); - message.rootHash !== undefined && (obj.rootHash = message.rootHash); - return obj; - }, - - create, I>>(base?: I): TrieNodeSnapshotResponse { - return TrieNodeSnapshotResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): TrieNodeSnapshotResponse { - const message = createBaseTrieNodeSnapshotResponse(); - message.prefix = object.prefix ?? new Uint8Array(); - message.excludedHashes = object.excludedHashes?.map((e) => e) || []; - message.numMessages = object.numMessages ?? 0; - message.rootHash = object.rootHash ?? ''; - return message; - }, -}; - -function createBaseTrieNodePrefix(): TrieNodePrefix { - return { prefix: new Uint8Array() }; -} - -export const TrieNodePrefix = { - encode(message: TrieNodePrefix, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.prefix.length !== 0) { - writer.uint32(10).bytes(message.prefix); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodePrefix { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrieNodePrefix(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.prefix = reader.bytes(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TrieNodePrefix { - return { prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array() }; - }, - - toJSON(message: TrieNodePrefix): unknown { - const obj: any = {}; - message.prefix !== undefined && - (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): TrieNodePrefix { - return TrieNodePrefix.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): TrieNodePrefix { - const message = createBaseTrieNodePrefix(); - message.prefix = object.prefix ?? new Uint8Array(); - return message; - }, -}; - -function createBaseSyncIds(): SyncIds { - return { syncIds: [] }; -} - -export const SyncIds = { - encode(message: SyncIds, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.syncIds) { - writer.uint32(10).bytes(v!); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SyncIds { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSyncIds(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.syncIds.push(reader.bytes()); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SyncIds { - return { syncIds: Array.isArray(object?.syncIds) ? object.syncIds.map((e: any) => bytesFromBase64(e)) : [] }; - }, - - toJSON(message: SyncIds): unknown { - const obj: any = {}; - if (message.syncIds) { - obj.syncIds = message.syncIds.map((e) => base64FromBytes(e !== undefined ? e : new Uint8Array())); - } else { - obj.syncIds = []; - } - return obj; - }, - - create, I>>(base?: I): SyncIds { - return SyncIds.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): SyncIds { - const message = createBaseSyncIds(); - message.syncIds = object.syncIds?.map((e) => e) || []; - return message; - }, -}; - -function createBaseFidRequest(): FidRequest { - return { fid: 0, pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const FidRequest = { - encode(message: FidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.pageSize !== undefined) { - writer.uint32(16).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(26).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(32).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FidRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFidRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.fid = longToNumber(reader.uint64() as Long); - continue; - case 2: - if (tag != 16) { - break; - } - - message.pageSize = reader.uint32(); - continue; - case 3: - if (tag != 26) { - break; - } - - message.pageToken = reader.bytes(); - continue; - case 4: - if (tag != 32) { - break; - } - - message.reverse = reader.bool(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): FidRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: FidRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): FidRequest { - return FidRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): FidRequest { - const message = createBaseFidRequest(); - message.fid = object.fid ?? 0; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseFidsRequest(): FidsRequest { - return { pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const FidsRequest = { - encode(message: FidsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.pageSize !== undefined) { - writer.uint32(8).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(18).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(24).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FidsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFidsRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.pageSize = reader.uint32(); - continue; - case 2: - if (tag != 18) { - break; - } - - message.pageToken = reader.bytes(); - continue; - case 3: - if (tag != 24) { - break; - } - - message.reverse = reader.bool(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): FidsRequest { - return { - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: FidsRequest): unknown { - const obj: any = {}; - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): FidsRequest { - return FidsRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): FidsRequest { - const message = createBaseFidsRequest(); - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseFidsResponse(): FidsResponse { - return { fids: [], nextPageToken: undefined }; -} - -export const FidsResponse = { - encode(message: FidsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - writer.uint32(10).fork(); - for (const v of message.fids) { - writer.uint64(v); - } - writer.ldelim(); - if (message.nextPageToken !== undefined) { - writer.uint32(18).bytes(message.nextPageToken); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FidsResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFidsResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag == 8) { - message.fids.push(longToNumber(reader.uint64() as Long)); - continue; - } - - if (tag == 10) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.fids.push(longToNumber(reader.uint64() as Long)); - } - - continue; - } - - break; - case 2: - if (tag != 18) { - break; - } - - message.nextPageToken = reader.bytes(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): FidsResponse { - return { - fids: Array.isArray(object?.fids) ? object.fids.map((e: any) => Number(e)) : [], - nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, - }; - }, - - toJSON(message: FidsResponse): unknown { - const obj: any = {}; - if (message.fids) { - obj.fids = message.fids.map((e) => Math.round(e)); - } else { - obj.fids = []; - } - message.nextPageToken !== undefined && - (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); - return obj; - }, - - create, I>>(base?: I): FidsResponse { - return FidsResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): FidsResponse { - const message = createBaseFidsResponse(); - message.fids = object.fids?.map((e) => e) || []; - message.nextPageToken = object.nextPageToken ?? undefined; - return message; - }, -}; - -function createBaseMessagesResponse(): MessagesResponse { - return { messages: [], nextPageToken: undefined }; -} - -export const MessagesResponse = { - encode(message: MessagesResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.messages) { - Message.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.nextPageToken !== undefined) { - writer.uint32(18).bytes(message.nextPageToken); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): MessagesResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseMessagesResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.messages.push(Message.decode(reader, reader.uint32())); - continue; - case 2: - if (tag != 18) { - break; - } - - message.nextPageToken = reader.bytes(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): MessagesResponse { - return { - messages: Array.isArray(object?.messages) ? object.messages.map((e: any) => Message.fromJSON(e)) : [], - nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, - }; - }, - - toJSON(message: MessagesResponse): unknown { - const obj: any = {}; - if (message.messages) { - obj.messages = message.messages.map((e) => (e ? Message.toJSON(e) : undefined)); - } else { - obj.messages = []; - } - message.nextPageToken !== undefined && - (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); - return obj; - }, - - create, I>>(base?: I): MessagesResponse { - return MessagesResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): MessagesResponse { - const message = createBaseMessagesResponse(); - message.messages = object.messages?.map((e) => Message.fromPartial(e)) || []; - message.nextPageToken = object.nextPageToken ?? undefined; - return message; - }, -}; - -function createBaseCastsByParentRequest(): CastsByParentRequest { - return { castId: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const CastsByParentRequest = { - encode(message: CastsByParentRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.castId !== undefined) { - CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); - } - if (message.pageSize !== undefined) { - writer.uint32(16).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(26).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(32).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): CastsByParentRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCastsByParentRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.castId = CastId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag != 16) { - break; - } - - message.pageSize = reader.uint32(); - continue; - case 3: - if (tag != 26) { - break; - } - - message.pageToken = reader.bytes(); - continue; - case 4: - if (tag != 32) { - break; - } - - message.reverse = reader.bool(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): CastsByParentRequest { - return { - castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: CastsByParentRequest): unknown { - const obj: any = {}; - message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): CastsByParentRequest { - return CastsByParentRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): CastsByParentRequest { - const message = createBaseCastsByParentRequest(); - message.castId = - object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseReactionRequest(): ReactionRequest { - return { fid: 0, reactionType: 0, castId: undefined }; -} - -export const ReactionRequest = { - encode(message: ReactionRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.reactionType !== 0) { - writer.uint32(16).int32(message.reactionType); - } - if (message.castId !== undefined) { - CastId.encode(message.castId, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ReactionRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseReactionRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.fid = longToNumber(reader.uint64() as Long); - continue; - case 2: - if (tag != 16) { - break; - } - - message.reactionType = reader.int32() as any; - continue; - case 3: - if (tag != 26) { - break; - } - - message.castId = CastId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ReactionRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : 0, - castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, - }; - }, - - toJSON(message: ReactionRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.reactionType !== undefined && (obj.reactionType = reactionTypeToJSON(message.reactionType)); - message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); - return obj; - }, - - create, I>>(base?: I): ReactionRequest { - return ReactionRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): ReactionRequest { - const message = createBaseReactionRequest(); - message.fid = object.fid ?? 0; - message.reactionType = object.reactionType ?? 0; - message.castId = - object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; - return message; - }, -}; - -function createBaseReactionsByFidRequest(): ReactionsByFidRequest { - return { fid: 0, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const ReactionsByFidRequest = { - encode(message: ReactionsByFidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.reactionType !== undefined) { - writer.uint32(16).int32(message.reactionType); - } - if (message.pageSize !== undefined) { - writer.uint32(24).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(34).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(40).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByFidRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseReactionsByFidRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.fid = longToNumber(reader.uint64() as Long); - continue; - case 2: - if (tag != 16) { - break; - } - - message.reactionType = reader.int32() as any; - continue; - case 3: - if (tag != 24) { - break; - } - - message.pageSize = reader.uint32(); - continue; - case 4: - if (tag != 34) { - break; - } - - message.pageToken = reader.bytes(); - continue; - case 5: - if (tag != 40) { - break; - } - - message.reverse = reader.bool(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ReactionsByFidRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: ReactionsByFidRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.reactionType !== undefined && - (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): ReactionsByFidRequest { - return ReactionsByFidRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): ReactionsByFidRequest { - const message = createBaseReactionsByFidRequest(); - message.fid = object.fid ?? 0; - message.reactionType = object.reactionType ?? undefined; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseReactionsByCastRequest(): ReactionsByCastRequest { - return { castId: undefined, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const ReactionsByCastRequest = { - encode(message: ReactionsByCastRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.castId !== undefined) { - CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); - } - if (message.reactionType !== undefined) { - writer.uint32(16).int32(message.reactionType); - } - if (message.pageSize !== undefined) { - writer.uint32(24).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(34).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(40).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByCastRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseReactionsByCastRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.castId = CastId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag != 16) { - break; - } - - message.reactionType = reader.int32() as any; - continue; - case 3: - if (tag != 24) { - break; - } - - message.pageSize = reader.uint32(); - continue; - case 4: - if (tag != 34) { - break; - } - - message.pageToken = reader.bytes(); - continue; - case 5: - if (tag != 40) { - break; - } - - message.reverse = reader.bool(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ReactionsByCastRequest { - return { - castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, - reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: ReactionsByCastRequest): unknown { - const obj: any = {}; - message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); - message.reactionType !== undefined && - (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): ReactionsByCastRequest { - return ReactionsByCastRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): ReactionsByCastRequest { - const message = createBaseReactionsByCastRequest(); - message.castId = - object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; - message.reactionType = object.reactionType ?? undefined; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseUserDataRequest(): UserDataRequest { - return { fid: 0, userDataType: 0 }; -} - -export const UserDataRequest = { - encode(message: UserDataRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.userDataType !== 0) { - writer.uint32(16).int32(message.userDataType); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserDataRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserDataRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.fid = longToNumber(reader.uint64() as Long); - continue; - case 2: - if (tag != 16) { - break; - } - - message.userDataType = reader.int32() as any; - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserDataRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - userDataType: isSet(object.userDataType) ? userDataTypeFromJSON(object.userDataType) : 0, - }; - }, - - toJSON(message: UserDataRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.userDataType !== undefined && (obj.userDataType = userDataTypeToJSON(message.userDataType)); - return obj; - }, - - create, I>>(base?: I): UserDataRequest { - return UserDataRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): UserDataRequest { - const message = createBaseUserDataRequest(); - message.fid = object.fid ?? 0; - message.userDataType = object.userDataType ?? 0; - return message; - }, -}; - -function createBaseNameRegistryEventRequest(): NameRegistryEventRequest { - return { name: new Uint8Array() }; -} - -export const NameRegistryEventRequest = { - encode(message: NameRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name.length !== 0) { - writer.uint32(10).bytes(message.name); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): NameRegistryEventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNameRegistryEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.name = reader.bytes(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): NameRegistryEventRequest { - return { name: isSet(object.name) ? bytesFromBase64(object.name) : new Uint8Array() }; - }, - - toJSON(message: NameRegistryEventRequest): unknown { - const obj: any = {}; - message.name !== undefined && - (obj.name = base64FromBytes(message.name !== undefined ? message.name : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): NameRegistryEventRequest { - return NameRegistryEventRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): NameRegistryEventRequest { - const message = createBaseNameRegistryEventRequest(); - message.name = object.name ?? new Uint8Array(); - return message; - }, -}; - -function createBaseVerificationRequest(): VerificationRequest { - return { fid: 0, address: new Uint8Array() }; -} - -export const VerificationRequest = { - encode(message: VerificationRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.address.length !== 0) { - writer.uint32(18).bytes(message.address); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VerificationRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVerificationRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.fid = longToNumber(reader.uint64() as Long); - continue; - case 2: - if (tag != 18) { - break; - } - - message.address = reader.bytes(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VerificationRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array(), - }; - }, - - toJSON(message: VerificationRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.address !== undefined && - (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): VerificationRequest { - return VerificationRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): VerificationRequest { - const message = createBaseVerificationRequest(); - message.fid = object.fid ?? 0; - message.address = object.address ?? new Uint8Array(); - return message; - }, -}; - -function createBaseSignerRequest(): SignerRequest { - return { fid: 0, signer: new Uint8Array() }; -} - -export const SignerRequest = { - encode(message: SignerRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.signer.length !== 0) { - writer.uint32(18).bytes(message.signer); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SignerRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSignerRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.fid = longToNumber(reader.uint64() as Long); - continue; - case 2: - if (tag != 18) { - break; - } - - message.signer = reader.bytes(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SignerRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - signer: isSet(object.signer) ? bytesFromBase64(object.signer) : new Uint8Array(), - }; - }, - - toJSON(message: SignerRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.signer !== undefined && - (obj.signer = base64FromBytes(message.signer !== undefined ? message.signer : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): SignerRequest { - return SignerRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): SignerRequest { - const message = createBaseSignerRequest(); - message.fid = object.fid ?? 0; - message.signer = object.signer ?? new Uint8Array(); - return message; - }, -}; - -function createBaseIdRegistryEventRequest(): IdRegistryEventRequest { - return { fid: 0 }; -} - -export const IdRegistryEventRequest = { - encode(message: IdRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseIdRegistryEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 8) { - break; - } - - message.fid = longToNumber(reader.uint64() as Long); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): IdRegistryEventRequest { - return { fid: isSet(object.fid) ? Number(object.fid) : 0 }; - }, - - toJSON(message: IdRegistryEventRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - return obj; - }, - - create, I>>(base?: I): IdRegistryEventRequest { - return IdRegistryEventRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): IdRegistryEventRequest { - const message = createBaseIdRegistryEventRequest(); - message.fid = object.fid ?? 0; - return message; - }, -}; - -function createBaseIdRegistryEventByAddressRequest(): IdRegistryEventByAddressRequest { - return { address: new Uint8Array() }; -} - -export const IdRegistryEventByAddressRequest = { - encode(message: IdRegistryEventByAddressRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.address.length !== 0) { - writer.uint32(10).bytes(message.address); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventByAddressRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseIdRegistryEventByAddressRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag != 10) { - break; - } - - message.address = reader.bytes(); - continue; - } - if ((tag & 7) == 4 || tag == 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): IdRegistryEventByAddressRequest { - return { address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array() }; - }, - - toJSON(message: IdRegistryEventByAddressRequest): unknown { - const obj: any = {}; - message.address !== undefined && - (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): IdRegistryEventByAddressRequest { - return IdRegistryEventByAddressRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>( - object: I - ): IdRegistryEventByAddressRequest { - const message = createBaseIdRegistryEventByAddressRequest(); - message.address = object.address ?? new Uint8Array(); - return message; - }, -}; +import { + CastsByParentRequest, + Empty, + EventRequest, + FidRequest, + FidsRequest, + FidsResponse, + HubInfoResponse, + IdRegistryEventByAddressRequest, + IdRegistryEventRequest, + MessagesResponse, + NameRegistryEventRequest, + ReactionRequest, + ReactionsByCastRequest, + ReactionsByFidRequest, + SignerRequest, + SubscribeRequest, + SyncIds, + TrieNodeMetadataResponse, + TrieNodePrefix, + TrieNodeSnapshotResponse, + UserDataRequest, + VerificationRequest, +} from './request_response'; export interface HubService { /** Submit Methods */ @@ -3088,31 +1233,6 @@ var tsProtoGlobalThis: any = (() => { throw 'Unable to locate global object'; })(); -function bytesFromBase64(b64: string): Uint8Array { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, 'base64')); - } else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } -} - -function base64FromBytes(arr: Uint8Array): string { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString('base64'); - } else { - const bin: string[] = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join('')); - } -} - type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; type DeepPartial = T extends Builtin @@ -3125,27 +1245,6 @@ type DeepPartial = T extends Builtin ? { [K in keyof T]?: DeepPartial } : Partial; -type KeysOfUnion = T extends T ? keyof T : never; -type Exact = P extends Builtin - ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function longToNumber(long: Long): number { - if (long.gt(Number.MAX_SAFE_INTEGER)) { - throw new tsProtoGlobalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); - } - return long.toNumber(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} - export class GrpcWebError extends tsProtoGlobalThis.Error { constructor(message: string, public code: grpc.Code, public metadata: grpc.Metadata) { super(message); diff --git a/packages/hub-web/src/index.ts b/packages/hub-web/src/index.ts index 0a1f23812a..42a2e78cbb 100644 --- a/packages/hub-web/src/index.ts +++ b/packages/hub-web/src/index.ts @@ -1,7 +1,5 @@ -export * from './generated/hub_event'; -export * from './generated/id_registry_event'; -export * from './generated/message'; -export * from './generated/name_registry_event'; -export * from './generated/rpc'; +export * from '@farcaster/protobufs'; +export * from '@farcaster/utils'; +export * from './generated/rpc'; export * from './client'; diff --git a/packages/protobufs/package.json b/packages/protobufs/package.json index b27f048a77..497776a084 100644 --- a/packages/protobufs/package.json +++ b/packages/protobufs/package.json @@ -18,7 +18,7 @@ "scripts": { "build": "tsup --config tsup.config.ts", "clean": "rimraf ./dist", - "protoc": "protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./src/generated/ --ts_proto_opt=esModuleInterop=true,exportCommonSymbols=false,outputServices=grpc-js,useOptionals=none,unrecognizedEnum=false,removeEnumPrefix=true --proto_path=./src/schemas ./src/schemas/*", + "protoc": "protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./src/generated/ --ts_proto_opt=esModuleInterop=true,exportCommonSymbols=false,outputServices=false,useOptionals=none,unrecognizedEnum=false,removeEnumPrefix=true --proto_path=./src/schemas ./src/schemas/*", "lint": "eslint src/ --color --ext .ts", "lint:fix": "yarn run lint -- --fix", "prepublishOnly": "yarn run build" @@ -28,7 +28,5 @@ "prettier-config-custom": "*", "ts-proto": "^1.142.1" }, - "dependencies": { - "@grpc/grpc-js": "^1.8.7" - } + "dependencies": {} } diff --git a/packages/protobufs/src/generated/request_response.ts b/packages/protobufs/src/generated/request_response.ts new file mode 100644 index 0000000000..62922861eb --- /dev/null +++ b/packages/protobufs/src/generated/request_response.ts @@ -0,0 +1,1717 @@ +/* eslint-disable */ +import Long from 'long'; +import _m0 from 'protobufjs/minimal'; +import { HubEventType, hubEventTypeFromJSON, hubEventTypeToJSON } from './hub_event'; +import { + CastId, + Message, + ReactionType, + reactionTypeFromJSON, + reactionTypeToJSON, + UserDataType, + userDataTypeFromJSON, + userDataTypeToJSON, +} from './message'; + +export interface Empty {} + +export interface SubscribeRequest { + eventTypes: HubEventType[]; + fromId?: number | undefined; +} + +export interface EventRequest { + id: number; +} + +/** Response Types for the Sync RPC Methods */ +export interface HubInfoResponse { + version: string; + isSynced: boolean; + nickname: string; + rootHash: string; +} + +export interface TrieNodeMetadataResponse { + prefix: Uint8Array; + numMessages: number; + hash: string; + children: TrieNodeMetadataResponse[]; +} + +export interface TrieNodeSnapshotResponse { + prefix: Uint8Array; + excludedHashes: string[]; + numMessages: number; + rootHash: string; +} + +export interface TrieNodePrefix { + prefix: Uint8Array; +} + +export interface SyncIds { + syncIds: Uint8Array[]; +} + +export interface FidRequest { + fid: number; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface FidsRequest { + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface FidsResponse { + fids: number[]; + nextPageToken?: Uint8Array | undefined; +} + +export interface MessagesResponse { + messages: Message[]; + nextPageToken?: Uint8Array | undefined; +} + +export interface CastsByParentRequest { + castId: CastId | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface ReactionRequest { + fid: number; + reactionType: ReactionType; + castId: CastId | undefined; +} + +export interface ReactionsByFidRequest { + fid: number; + reactionType?: ReactionType | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface ReactionsByCastRequest { + castId: CastId | undefined; + reactionType?: ReactionType | undefined; + pageSize?: number | undefined; + pageToken?: Uint8Array | undefined; + reverse?: boolean | undefined; +} + +export interface UserDataRequest { + fid: number; + userDataType: UserDataType; +} + +export interface NameRegistryEventRequest { + name: Uint8Array; +} + +export interface VerificationRequest { + fid: number; + address: Uint8Array; +} + +export interface SignerRequest { + fid: number; + signer: Uint8Array; +} + +export interface IdRegistryEventRequest { + fid: number; +} + +export interface IdRegistryEventByAddressRequest { + address: Uint8Array; +} + +function createBaseEmpty(): Empty { + return {}; +} + +export const Empty = { + encode(_: Empty, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Empty { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEmpty(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(_: any): Empty { + return {}; + }, + + toJSON(_: Empty): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): Empty { + return Empty.fromPartial(base ?? {}); + }, + + fromPartial, I>>(_: I): Empty { + const message = createBaseEmpty(); + return message; + }, +}; + +function createBaseSubscribeRequest(): SubscribeRequest { + return { eventTypes: [], fromId: undefined }; +} + +export const SubscribeRequest = { + encode(message: SubscribeRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.eventTypes) { + writer.int32(v); + } + writer.ldelim(); + if (message.fromId !== undefined) { + writer.uint32(16).uint64(message.fromId); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSubscribeRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if ((tag & 7) === 2) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.eventTypes.push(reader.int32() as any); + } + } else { + message.eventTypes.push(reader.int32() as any); + } + break; + case 2: + message.fromId = longToNumber(reader.uint64() as Long); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): SubscribeRequest { + return { + eventTypes: Array.isArray(object?.eventTypes) ? object.eventTypes.map((e: any) => hubEventTypeFromJSON(e)) : [], + fromId: isSet(object.fromId) ? Number(object.fromId) : undefined, + }; + }, + + toJSON(message: SubscribeRequest): unknown { + const obj: any = {}; + if (message.eventTypes) { + obj.eventTypes = message.eventTypes.map((e) => hubEventTypeToJSON(e)); + } else { + obj.eventTypes = []; + } + message.fromId !== undefined && (obj.fromId = Math.round(message.fromId)); + return obj; + }, + + create, I>>(base?: I): SubscribeRequest { + return SubscribeRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SubscribeRequest { + const message = createBaseSubscribeRequest(); + message.eventTypes = object.eventTypes?.map((e) => e) || []; + message.fromId = object.fromId ?? undefined; + return message; + }, +}; + +function createBaseEventRequest(): EventRequest { + return { id: 0 }; +} + +export const EventRequest = { + encode(message: EventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== 0) { + writer.uint32(8).uint64(message.id); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = longToNumber(reader.uint64() as Long); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): EventRequest { + return { id: isSet(object.id) ? Number(object.id) : 0 }; + }, + + toJSON(message: EventRequest): unknown { + const obj: any = {}; + message.id !== undefined && (obj.id = Math.round(message.id)); + return obj; + }, + + create, I>>(base?: I): EventRequest { + return EventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): EventRequest { + const message = createBaseEventRequest(); + message.id = object.id ?? 0; + return message; + }, +}; + +function createBaseHubInfoResponse(): HubInfoResponse { + return { version: '', isSynced: false, nickname: '', rootHash: '' }; +} + +export const HubInfoResponse = { + encode(message: HubInfoResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.version !== '') { + writer.uint32(10).string(message.version); + } + if (message.isSynced === true) { + writer.uint32(16).bool(message.isSynced); + } + if (message.nickname !== '') { + writer.uint32(26).string(message.nickname); + } + if (message.rootHash !== '') { + writer.uint32(34).string(message.rootHash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HubInfoResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHubInfoResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.version = reader.string(); + break; + case 2: + message.isSynced = reader.bool(); + break; + case 3: + message.nickname = reader.string(); + break; + case 4: + message.rootHash = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): HubInfoResponse { + return { + version: isSet(object.version) ? String(object.version) : '', + isSynced: isSet(object.isSynced) ? Boolean(object.isSynced) : false, + nickname: isSet(object.nickname) ? String(object.nickname) : '', + rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', + }; + }, + + toJSON(message: HubInfoResponse): unknown { + const obj: any = {}; + message.version !== undefined && (obj.version = message.version); + message.isSynced !== undefined && (obj.isSynced = message.isSynced); + message.nickname !== undefined && (obj.nickname = message.nickname); + message.rootHash !== undefined && (obj.rootHash = message.rootHash); + return obj; + }, + + create, I>>(base?: I): HubInfoResponse { + return HubInfoResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): HubInfoResponse { + const message = createBaseHubInfoResponse(); + message.version = object.version ?? ''; + message.isSynced = object.isSynced ?? false; + message.nickname = object.nickname ?? ''; + message.rootHash = object.rootHash ?? ''; + return message; + }, +}; + +function createBaseTrieNodeMetadataResponse(): TrieNodeMetadataResponse { + return { prefix: new Uint8Array(), numMessages: 0, hash: '', children: [] }; +} + +export const TrieNodeMetadataResponse = { + encode(message: TrieNodeMetadataResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + if (message.numMessages !== 0) { + writer.uint32(16).uint64(message.numMessages); + } + if (message.hash !== '') { + writer.uint32(26).string(message.hash); + } + for (const v of message.children) { + TrieNodeMetadataResponse.encode(v!, writer.uint32(34).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeMetadataResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodeMetadataResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.prefix = reader.bytes(); + break; + case 2: + message.numMessages = longToNumber(reader.uint64() as Long); + break; + case 3: + message.hash = reader.string(); + break; + case 4: + message.children.push(TrieNodeMetadataResponse.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): TrieNodeMetadataResponse { + return { + prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), + numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, + hash: isSet(object.hash) ? String(object.hash) : '', + children: Array.isArray(object?.children) + ? object.children.map((e: any) => TrieNodeMetadataResponse.fromJSON(e)) + : [], + }; + }, + + toJSON(message: TrieNodeMetadataResponse): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); + message.hash !== undefined && (obj.hash = message.hash); + if (message.children) { + obj.children = message.children.map((e) => (e ? TrieNodeMetadataResponse.toJSON(e) : undefined)); + } else { + obj.children = []; + } + return obj; + }, + + create, I>>(base?: I): TrieNodeMetadataResponse { + return TrieNodeMetadataResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodeMetadataResponse { + const message = createBaseTrieNodeMetadataResponse(); + message.prefix = object.prefix ?? new Uint8Array(); + message.numMessages = object.numMessages ?? 0; + message.hash = object.hash ?? ''; + message.children = object.children?.map((e) => TrieNodeMetadataResponse.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseTrieNodeSnapshotResponse(): TrieNodeSnapshotResponse { + return { prefix: new Uint8Array(), excludedHashes: [], numMessages: 0, rootHash: '' }; +} + +export const TrieNodeSnapshotResponse = { + encode(message: TrieNodeSnapshotResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + for (const v of message.excludedHashes) { + writer.uint32(18).string(v!); + } + if (message.numMessages !== 0) { + writer.uint32(24).uint64(message.numMessages); + } + if (message.rootHash !== '') { + writer.uint32(34).string(message.rootHash); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeSnapshotResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodeSnapshotResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.prefix = reader.bytes(); + break; + case 2: + message.excludedHashes.push(reader.string()); + break; + case 3: + message.numMessages = longToNumber(reader.uint64() as Long); + break; + case 4: + message.rootHash = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): TrieNodeSnapshotResponse { + return { + prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), + excludedHashes: Array.isArray(object?.excludedHashes) ? object.excludedHashes.map((e: any) => String(e)) : [], + numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, + rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', + }; + }, + + toJSON(message: TrieNodeSnapshotResponse): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + if (message.excludedHashes) { + obj.excludedHashes = message.excludedHashes.map((e) => e); + } else { + obj.excludedHashes = []; + } + message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); + message.rootHash !== undefined && (obj.rootHash = message.rootHash); + return obj; + }, + + create, I>>(base?: I): TrieNodeSnapshotResponse { + return TrieNodeSnapshotResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodeSnapshotResponse { + const message = createBaseTrieNodeSnapshotResponse(); + message.prefix = object.prefix ?? new Uint8Array(); + message.excludedHashes = object.excludedHashes?.map((e) => e) || []; + message.numMessages = object.numMessages ?? 0; + message.rootHash = object.rootHash ?? ''; + return message; + }, +}; + +function createBaseTrieNodePrefix(): TrieNodePrefix { + return { prefix: new Uint8Array() }; +} + +export const TrieNodePrefix = { + encode(message: TrieNodePrefix, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.prefix.length !== 0) { + writer.uint32(10).bytes(message.prefix); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodePrefix { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTrieNodePrefix(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.prefix = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): TrieNodePrefix { + return { prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array() }; + }, + + toJSON(message: TrieNodePrefix): unknown { + const obj: any = {}; + message.prefix !== undefined && + (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): TrieNodePrefix { + return TrieNodePrefix.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): TrieNodePrefix { + const message = createBaseTrieNodePrefix(); + message.prefix = object.prefix ?? new Uint8Array(); + return message; + }, +}; + +function createBaseSyncIds(): SyncIds { + return { syncIds: [] }; +} + +export const SyncIds = { + encode(message: SyncIds, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.syncIds) { + writer.uint32(10).bytes(v!); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SyncIds { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSyncIds(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.syncIds.push(reader.bytes()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): SyncIds { + return { syncIds: Array.isArray(object?.syncIds) ? object.syncIds.map((e: any) => bytesFromBase64(e)) : [] }; + }, + + toJSON(message: SyncIds): unknown { + const obj: any = {}; + if (message.syncIds) { + obj.syncIds = message.syncIds.map((e) => base64FromBytes(e !== undefined ? e : new Uint8Array())); + } else { + obj.syncIds = []; + } + return obj; + }, + + create, I>>(base?: I): SyncIds { + return SyncIds.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SyncIds { + const message = createBaseSyncIds(); + message.syncIds = object.syncIds?.map((e) => e) || []; + return message; + }, +}; + +function createBaseFidRequest(): FidRequest { + return { fid: 0, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const FidRequest = { + encode(message: FidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.pageSize !== undefined) { + writer.uint32(16).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(26).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(32).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fid = longToNumber(reader.uint64() as Long); + break; + case 2: + message.pageSize = reader.uint32(); + break; + case 3: + message.pageToken = reader.bytes(); + break; + case 4: + message.reverse = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): FidRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: FidRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): FidRequest { + return FidRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidRequest { + const message = createBaseFidRequest(); + message.fid = object.fid ?? 0; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseFidsRequest(): FidsRequest { + return { pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const FidsRequest = { + encode(message: FidsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.pageSize !== undefined) { + writer.uint32(8).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(18).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(24).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidsRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.pageSize = reader.uint32(); + break; + case 2: + message.pageToken = reader.bytes(); + break; + case 3: + message.reverse = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): FidsRequest { + return { + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: FidsRequest): unknown { + const obj: any = {}; + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): FidsRequest { + return FidsRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidsRequest { + const message = createBaseFidsRequest(); + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseFidsResponse(): FidsResponse { + return { fids: [], nextPageToken: undefined }; +} + +export const FidsResponse = { + encode(message: FidsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.fids) { + writer.uint64(v); + } + writer.ldelim(); + if (message.nextPageToken !== undefined) { + writer.uint32(18).bytes(message.nextPageToken); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FidsResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFidsResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if ((tag & 7) === 2) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.fids.push(longToNumber(reader.uint64() as Long)); + } + } else { + message.fids.push(longToNumber(reader.uint64() as Long)); + } + break; + case 2: + message.nextPageToken = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): FidsResponse { + return { + fids: Array.isArray(object?.fids) ? object.fids.map((e: any) => Number(e)) : [], + nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, + }; + }, + + toJSON(message: FidsResponse): unknown { + const obj: any = {}; + if (message.fids) { + obj.fids = message.fids.map((e) => Math.round(e)); + } else { + obj.fids = []; + } + message.nextPageToken !== undefined && + (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); + return obj; + }, + + create, I>>(base?: I): FidsResponse { + return FidsResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): FidsResponse { + const message = createBaseFidsResponse(); + message.fids = object.fids?.map((e) => e) || []; + message.nextPageToken = object.nextPageToken ?? undefined; + return message; + }, +}; + +function createBaseMessagesResponse(): MessagesResponse { + return { messages: [], nextPageToken: undefined }; +} + +export const MessagesResponse = { + encode(message: MessagesResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.messages) { + Message.encode(v!, writer.uint32(10).fork()).ldelim(); + } + if (message.nextPageToken !== undefined) { + writer.uint32(18).bytes(message.nextPageToken); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MessagesResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMessagesResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.messages.push(Message.decode(reader, reader.uint32())); + break; + case 2: + message.nextPageToken = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): MessagesResponse { + return { + messages: Array.isArray(object?.messages) ? object.messages.map((e: any) => Message.fromJSON(e)) : [], + nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, + }; + }, + + toJSON(message: MessagesResponse): unknown { + const obj: any = {}; + if (message.messages) { + obj.messages = message.messages.map((e) => (e ? Message.toJSON(e) : undefined)); + } else { + obj.messages = []; + } + message.nextPageToken !== undefined && + (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); + return obj; + }, + + create, I>>(base?: I): MessagesResponse { + return MessagesResponse.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): MessagesResponse { + const message = createBaseMessagesResponse(); + message.messages = object.messages?.map((e) => Message.fromPartial(e)) || []; + message.nextPageToken = object.nextPageToken ?? undefined; + return message; + }, +}; + +function createBaseCastsByParentRequest(): CastsByParentRequest { + return { castId: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const CastsByParentRequest = { + encode(message: CastsByParentRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); + } + if (message.pageSize !== undefined) { + writer.uint32(16).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(26).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(32).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): CastsByParentRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCastsByParentRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.castId = CastId.decode(reader, reader.uint32()); + break; + case 2: + message.pageSize = reader.uint32(); + break; + case 3: + message.pageToken = reader.bytes(); + break; + case 4: + message.reverse = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): CastsByParentRequest { + return { + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: CastsByParentRequest): unknown { + const obj: any = {}; + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): CastsByParentRequest { + return CastsByParentRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): CastsByParentRequest { + const message = createBaseCastsByParentRequest(); + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseReactionRequest(): ReactionRequest { + return { fid: 0, reactionType: 0, castId: undefined }; +} + +export const ReactionRequest = { + encode(message: ReactionRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.reactionType !== 0) { + writer.uint32(16).int32(message.reactionType); + } + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(26).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fid = longToNumber(reader.uint64() as Long); + break; + case 2: + message.reactionType = reader.int32() as any; + break; + case 3: + message.castId = CastId.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): ReactionRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : 0, + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + }; + }, + + toJSON(message: ReactionRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.reactionType !== undefined && (obj.reactionType = reactionTypeToJSON(message.reactionType)); + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + return obj; + }, + + create, I>>(base?: I): ReactionRequest { + return ReactionRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionRequest { + const message = createBaseReactionRequest(); + message.fid = object.fid ?? 0; + message.reactionType = object.reactionType ?? 0; + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + return message; + }, +}; + +function createBaseReactionsByFidRequest(): ReactionsByFidRequest { + return { fid: 0, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const ReactionsByFidRequest = { + encode(message: ReactionsByFidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.reactionType !== undefined) { + writer.uint32(16).int32(message.reactionType); + } + if (message.pageSize !== undefined) { + writer.uint32(24).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(34).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(40).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByFidRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionsByFidRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fid = longToNumber(reader.uint64() as Long); + break; + case 2: + message.reactionType = reader.int32() as any; + break; + case 3: + message.pageSize = reader.uint32(); + break; + case 4: + message.pageToken = reader.bytes(); + break; + case 5: + message.reverse = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): ReactionsByFidRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: ReactionsByFidRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.reactionType !== undefined && + (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): ReactionsByFidRequest { + return ReactionsByFidRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionsByFidRequest { + const message = createBaseReactionsByFidRequest(); + message.fid = object.fid ?? 0; + message.reactionType = object.reactionType ?? undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseReactionsByCastRequest(): ReactionsByCastRequest { + return { castId: undefined, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; +} + +export const ReactionsByCastRequest = { + encode(message: ReactionsByCastRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.castId !== undefined) { + CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); + } + if (message.reactionType !== undefined) { + writer.uint32(16).int32(message.reactionType); + } + if (message.pageSize !== undefined) { + writer.uint32(24).uint32(message.pageSize); + } + if (message.pageToken !== undefined) { + writer.uint32(34).bytes(message.pageToken); + } + if (message.reverse !== undefined) { + writer.uint32(40).bool(message.reverse); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByCastRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReactionsByCastRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.castId = CastId.decode(reader, reader.uint32()); + break; + case 2: + message.reactionType = reader.int32() as any; + break; + case 3: + message.pageSize = reader.uint32(); + break; + case 4: + message.pageToken = reader.bytes(); + break; + case 5: + message.reverse = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): ReactionsByCastRequest { + return { + castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, + reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, + pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, + reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, + }; + }, + + toJSON(message: ReactionsByCastRequest): unknown { + const obj: any = {}; + message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); + message.reactionType !== undefined && + (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); + message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); + message.pageToken !== undefined && + (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); + message.reverse !== undefined && (obj.reverse = message.reverse); + return obj; + }, + + create, I>>(base?: I): ReactionsByCastRequest { + return ReactionsByCastRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): ReactionsByCastRequest { + const message = createBaseReactionsByCastRequest(); + message.castId = + object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; + message.reactionType = object.reactionType ?? undefined; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? undefined; + message.reverse = object.reverse ?? undefined; + return message; + }, +}; + +function createBaseUserDataRequest(): UserDataRequest { + return { fid: 0, userDataType: 0 }; +} + +export const UserDataRequest = { + encode(message: UserDataRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.userDataType !== 0) { + writer.uint32(16).int32(message.userDataType); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UserDataRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUserDataRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fid = longToNumber(reader.uint64() as Long); + break; + case 2: + message.userDataType = reader.int32() as any; + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): UserDataRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + userDataType: isSet(object.userDataType) ? userDataTypeFromJSON(object.userDataType) : 0, + }; + }, + + toJSON(message: UserDataRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.userDataType !== undefined && (obj.userDataType = userDataTypeToJSON(message.userDataType)); + return obj; + }, + + create, I>>(base?: I): UserDataRequest { + return UserDataRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): UserDataRequest { + const message = createBaseUserDataRequest(); + message.fid = object.fid ?? 0; + message.userDataType = object.userDataType ?? 0; + return message; + }, +}; + +function createBaseNameRegistryEventRequest(): NameRegistryEventRequest { + return { name: new Uint8Array() }; +} + +export const NameRegistryEventRequest = { + encode(message: NameRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.name.length !== 0) { + writer.uint32(10).bytes(message.name); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): NameRegistryEventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseNameRegistryEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): NameRegistryEventRequest { + return { name: isSet(object.name) ? bytesFromBase64(object.name) : new Uint8Array() }; + }, + + toJSON(message: NameRegistryEventRequest): unknown { + const obj: any = {}; + message.name !== undefined && + (obj.name = base64FromBytes(message.name !== undefined ? message.name : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): NameRegistryEventRequest { + return NameRegistryEventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): NameRegistryEventRequest { + const message = createBaseNameRegistryEventRequest(); + message.name = object.name ?? new Uint8Array(); + return message; + }, +}; + +function createBaseVerificationRequest(): VerificationRequest { + return { fid: 0, address: new Uint8Array() }; +} + +export const VerificationRequest = { + encode(message: VerificationRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.address.length !== 0) { + writer.uint32(18).bytes(message.address); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): VerificationRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseVerificationRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fid = longToNumber(reader.uint64() as Long); + break; + case 2: + message.address = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): VerificationRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array(), + }; + }, + + toJSON(message: VerificationRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.address !== undefined && + (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): VerificationRequest { + return VerificationRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): VerificationRequest { + const message = createBaseVerificationRequest(); + message.fid = object.fid ?? 0; + message.address = object.address ?? new Uint8Array(); + return message; + }, +}; + +function createBaseSignerRequest(): SignerRequest { + return { fid: 0, signer: new Uint8Array() }; +} + +export const SignerRequest = { + encode(message: SignerRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + if (message.signer.length !== 0) { + writer.uint32(18).bytes(message.signer); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SignerRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSignerRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fid = longToNumber(reader.uint64() as Long); + break; + case 2: + message.signer = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): SignerRequest { + return { + fid: isSet(object.fid) ? Number(object.fid) : 0, + signer: isSet(object.signer) ? bytesFromBase64(object.signer) : new Uint8Array(), + }; + }, + + toJSON(message: SignerRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + message.signer !== undefined && + (obj.signer = base64FromBytes(message.signer !== undefined ? message.signer : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): SignerRequest { + return SignerRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): SignerRequest { + const message = createBaseSignerRequest(); + message.fid = object.fid ?? 0; + message.signer = object.signer ?? new Uint8Array(); + return message; + }, +}; + +function createBaseIdRegistryEventRequest(): IdRegistryEventRequest { + return { fid: 0 }; +} + +export const IdRegistryEventRequest = { + encode(message: IdRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.fid !== 0) { + writer.uint32(8).uint64(message.fid); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIdRegistryEventRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fid = longToNumber(reader.uint64() as Long); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): IdRegistryEventRequest { + return { fid: isSet(object.fid) ? Number(object.fid) : 0 }; + }, + + toJSON(message: IdRegistryEventRequest): unknown { + const obj: any = {}; + message.fid !== undefined && (obj.fid = Math.round(message.fid)); + return obj; + }, + + create, I>>(base?: I): IdRegistryEventRequest { + return IdRegistryEventRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): IdRegistryEventRequest { + const message = createBaseIdRegistryEventRequest(); + message.fid = object.fid ?? 0; + return message; + }, +}; + +function createBaseIdRegistryEventByAddressRequest(): IdRegistryEventByAddressRequest { + return { address: new Uint8Array() }; +} + +export const IdRegistryEventByAddressRequest = { + encode(message: IdRegistryEventByAddressRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.address.length !== 0) { + writer.uint32(10).bytes(message.address); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventByAddressRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIdRegistryEventByAddressRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.address = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): IdRegistryEventByAddressRequest { + return { address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array() }; + }, + + toJSON(message: IdRegistryEventByAddressRequest): unknown { + const obj: any = {}; + message.address !== undefined && + (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); + return obj; + }, + + create, I>>(base?: I): IdRegistryEventByAddressRequest { + return IdRegistryEventByAddressRequest.fromPartial(base ?? {}); + }, + + fromPartial, I>>( + object: I + ): IdRegistryEventByAddressRequest { + const message = createBaseIdRegistryEventByAddressRequest(); + message.address = object.address ?? new Uint8Array(); + return message; + }, +}; + +declare var self: any | undefined; +declare var window: any | undefined; +declare var global: any | undefined; +var tsProtoGlobalThis: any = (() => { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof global !== 'undefined') { + return global; + } + throw 'Unable to locate global object'; +})(); + +function bytesFromBase64(b64: string): Uint8Array { + if (tsProtoGlobalThis.Buffer) { + return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, 'base64')); + } else { + const bin = tsProtoGlobalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if (tsProtoGlobalThis.Buffer) { + return tsProtoGlobalThis.Buffer.from(arr).toString('base64'); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(String.fromCharCode(byte)); + }); + return tsProtoGlobalThis.btoa(bin.join('')); + } +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(long: Long): number { + if (long.gt(Number.MAX_SAFE_INTEGER)) { + throw new tsProtoGlobalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); + } + return long.toNumber(); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/packages/protobufs/src/generated/rpc.ts b/packages/protobufs/src/generated/rpc.ts index 79ffd91767..d15de7d98a 100644 --- a/packages/protobufs/src/generated/rpc.ts +++ b/packages/protobufs/src/generated/rpc.ts @@ -1,2616 +1 @@ /* eslint-disable */ -import { - CallOptions, - ChannelCredentials, - Client, - ClientOptions, - ClientReadableStream, - ClientUnaryCall, - handleServerStreamingCall, - handleUnaryCall, - makeGenericClientConstructor, - Metadata, - ServiceError, - UntypedServiceImplementation, -} from '@grpc/grpc-js'; -import Long from 'long'; -import _m0 from 'protobufjs/minimal'; -import { HubEvent, HubEventType, hubEventTypeFromJSON, hubEventTypeToJSON } from './hub_event'; -import { IdRegistryEvent } from './id_registry_event'; -import { - CastId, - Message, - ReactionType, - reactionTypeFromJSON, - reactionTypeToJSON, - UserDataType, - userDataTypeFromJSON, - userDataTypeToJSON, -} from './message'; -import { NameRegistryEvent } from './name_registry_event'; - -export interface Empty {} - -export interface SubscribeRequest { - eventTypes: HubEventType[]; - fromId?: number | undefined; -} - -export interface EventRequest { - id: number; -} - -/** Response Types for the Sync RPC Methods */ -export interface HubInfoResponse { - version: string; - isSynced: boolean; - nickname: string; - rootHash: string; -} - -export interface TrieNodeMetadataResponse { - prefix: Uint8Array; - numMessages: number; - hash: string; - children: TrieNodeMetadataResponse[]; -} - -export interface TrieNodeSnapshotResponse { - prefix: Uint8Array; - excludedHashes: string[]; - numMessages: number; - rootHash: string; -} - -export interface TrieNodePrefix { - prefix: Uint8Array; -} - -export interface SyncIds { - syncIds: Uint8Array[]; -} - -export interface FidRequest { - fid: number; - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface FidsRequest { - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface FidsResponse { - fids: number[]; - nextPageToken?: Uint8Array | undefined; -} - -export interface MessagesResponse { - messages: Message[]; - nextPageToken?: Uint8Array | undefined; -} - -export interface CastsByParentRequest { - castId: CastId | undefined; - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface ReactionRequest { - fid: number; - reactionType: ReactionType; - castId: CastId | undefined; -} - -export interface ReactionsByFidRequest { - fid: number; - reactionType?: ReactionType | undefined; - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface ReactionsByCastRequest { - castId: CastId | undefined; - reactionType?: ReactionType | undefined; - pageSize?: number | undefined; - pageToken?: Uint8Array | undefined; - reverse?: boolean | undefined; -} - -export interface UserDataRequest { - fid: number; - userDataType: UserDataType; -} - -export interface NameRegistryEventRequest { - name: Uint8Array; -} - -export interface VerificationRequest { - fid: number; - address: Uint8Array; -} - -export interface SignerRequest { - fid: number; - signer: Uint8Array; -} - -export interface IdRegistryEventRequest { - fid: number; -} - -export interface IdRegistryEventByAddressRequest { - address: Uint8Array; -} - -function createBaseEmpty(): Empty { - return {}; -} - -export const Empty = { - encode(_: Empty, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Empty { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEmpty(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(_: any): Empty { - return {}; - }, - - toJSON(_: Empty): unknown { - const obj: any = {}; - return obj; - }, - - create, I>>(base?: I): Empty { - return Empty.fromPartial(base ?? {}); - }, - - fromPartial, I>>(_: I): Empty { - const message = createBaseEmpty(); - return message; - }, -}; - -function createBaseSubscribeRequest(): SubscribeRequest { - return { eventTypes: [], fromId: undefined }; -} - -export const SubscribeRequest = { - encode(message: SubscribeRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - writer.uint32(10).fork(); - for (const v of message.eventTypes) { - writer.int32(v); - } - writer.ldelim(); - if (message.fromId !== undefined) { - writer.uint32(16).uint64(message.fromId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribeRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if ((tag & 7) === 2) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.eventTypes.push(reader.int32() as any); - } - } else { - message.eventTypes.push(reader.int32() as any); - } - break; - case 2: - message.fromId = longToNumber(reader.uint64() as Long); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): SubscribeRequest { - return { - eventTypes: Array.isArray(object?.eventTypes) ? object.eventTypes.map((e: any) => hubEventTypeFromJSON(e)) : [], - fromId: isSet(object.fromId) ? Number(object.fromId) : undefined, - }; - }, - - toJSON(message: SubscribeRequest): unknown { - const obj: any = {}; - if (message.eventTypes) { - obj.eventTypes = message.eventTypes.map((e) => hubEventTypeToJSON(e)); - } else { - obj.eventTypes = []; - } - message.fromId !== undefined && (obj.fromId = Math.round(message.fromId)); - return obj; - }, - - create, I>>(base?: I): SubscribeRequest { - return SubscribeRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): SubscribeRequest { - const message = createBaseSubscribeRequest(); - message.eventTypes = object.eventTypes?.map((e) => e) || []; - message.fromId = object.fromId ?? undefined; - return message; - }, -}; - -function createBaseEventRequest(): EventRequest { - return { id: 0 }; -} - -export const EventRequest = { - encode(message: EventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== 0) { - writer.uint32(8).uint64(message.id); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): EventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.id = longToNumber(reader.uint64() as Long); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): EventRequest { - return { id: isSet(object.id) ? Number(object.id) : 0 }; - }, - - toJSON(message: EventRequest): unknown { - const obj: any = {}; - message.id !== undefined && (obj.id = Math.round(message.id)); - return obj; - }, - - create, I>>(base?: I): EventRequest { - return EventRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): EventRequest { - const message = createBaseEventRequest(); - message.id = object.id ?? 0; - return message; - }, -}; - -function createBaseHubInfoResponse(): HubInfoResponse { - return { version: '', isSynced: false, nickname: '', rootHash: '' }; -} - -export const HubInfoResponse = { - encode(message: HubInfoResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.version !== '') { - writer.uint32(10).string(message.version); - } - if (message.isSynced === true) { - writer.uint32(16).bool(message.isSynced); - } - if (message.nickname !== '') { - writer.uint32(26).string(message.nickname); - } - if (message.rootHash !== '') { - writer.uint32(34).string(message.rootHash); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): HubInfoResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseHubInfoResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.version = reader.string(); - break; - case 2: - message.isSynced = reader.bool(); - break; - case 3: - message.nickname = reader.string(); - break; - case 4: - message.rootHash = reader.string(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): HubInfoResponse { - return { - version: isSet(object.version) ? String(object.version) : '', - isSynced: isSet(object.isSynced) ? Boolean(object.isSynced) : false, - nickname: isSet(object.nickname) ? String(object.nickname) : '', - rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', - }; - }, - - toJSON(message: HubInfoResponse): unknown { - const obj: any = {}; - message.version !== undefined && (obj.version = message.version); - message.isSynced !== undefined && (obj.isSynced = message.isSynced); - message.nickname !== undefined && (obj.nickname = message.nickname); - message.rootHash !== undefined && (obj.rootHash = message.rootHash); - return obj; - }, - - create, I>>(base?: I): HubInfoResponse { - return HubInfoResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): HubInfoResponse { - const message = createBaseHubInfoResponse(); - message.version = object.version ?? ''; - message.isSynced = object.isSynced ?? false; - message.nickname = object.nickname ?? ''; - message.rootHash = object.rootHash ?? ''; - return message; - }, -}; - -function createBaseTrieNodeMetadataResponse(): TrieNodeMetadataResponse { - return { prefix: new Uint8Array(), numMessages: 0, hash: '', children: [] }; -} - -export const TrieNodeMetadataResponse = { - encode(message: TrieNodeMetadataResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.prefix.length !== 0) { - writer.uint32(10).bytes(message.prefix); - } - if (message.numMessages !== 0) { - writer.uint32(16).uint64(message.numMessages); - } - if (message.hash !== '') { - writer.uint32(26).string(message.hash); - } - for (const v of message.children) { - TrieNodeMetadataResponse.encode(v!, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeMetadataResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrieNodeMetadataResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.prefix = reader.bytes(); - break; - case 2: - message.numMessages = longToNumber(reader.uint64() as Long); - break; - case 3: - message.hash = reader.string(); - break; - case 4: - message.children.push(TrieNodeMetadataResponse.decode(reader, reader.uint32())); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): TrieNodeMetadataResponse { - return { - prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), - numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, - hash: isSet(object.hash) ? String(object.hash) : '', - children: Array.isArray(object?.children) - ? object.children.map((e: any) => TrieNodeMetadataResponse.fromJSON(e)) - : [], - }; - }, - - toJSON(message: TrieNodeMetadataResponse): unknown { - const obj: any = {}; - message.prefix !== undefined && - (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); - message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); - message.hash !== undefined && (obj.hash = message.hash); - if (message.children) { - obj.children = message.children.map((e) => (e ? TrieNodeMetadataResponse.toJSON(e) : undefined)); - } else { - obj.children = []; - } - return obj; - }, - - create, I>>(base?: I): TrieNodeMetadataResponse { - return TrieNodeMetadataResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): TrieNodeMetadataResponse { - const message = createBaseTrieNodeMetadataResponse(); - message.prefix = object.prefix ?? new Uint8Array(); - message.numMessages = object.numMessages ?? 0; - message.hash = object.hash ?? ''; - message.children = object.children?.map((e) => TrieNodeMetadataResponse.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseTrieNodeSnapshotResponse(): TrieNodeSnapshotResponse { - return { prefix: new Uint8Array(), excludedHashes: [], numMessages: 0, rootHash: '' }; -} - -export const TrieNodeSnapshotResponse = { - encode(message: TrieNodeSnapshotResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.prefix.length !== 0) { - writer.uint32(10).bytes(message.prefix); - } - for (const v of message.excludedHashes) { - writer.uint32(18).string(v!); - } - if (message.numMessages !== 0) { - writer.uint32(24).uint64(message.numMessages); - } - if (message.rootHash !== '') { - writer.uint32(34).string(message.rootHash); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodeSnapshotResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrieNodeSnapshotResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.prefix = reader.bytes(); - break; - case 2: - message.excludedHashes.push(reader.string()); - break; - case 3: - message.numMessages = longToNumber(reader.uint64() as Long); - break; - case 4: - message.rootHash = reader.string(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): TrieNodeSnapshotResponse { - return { - prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array(), - excludedHashes: Array.isArray(object?.excludedHashes) ? object.excludedHashes.map((e: any) => String(e)) : [], - numMessages: isSet(object.numMessages) ? Number(object.numMessages) : 0, - rootHash: isSet(object.rootHash) ? String(object.rootHash) : '', - }; - }, - - toJSON(message: TrieNodeSnapshotResponse): unknown { - const obj: any = {}; - message.prefix !== undefined && - (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); - if (message.excludedHashes) { - obj.excludedHashes = message.excludedHashes.map((e) => e); - } else { - obj.excludedHashes = []; - } - message.numMessages !== undefined && (obj.numMessages = Math.round(message.numMessages)); - message.rootHash !== undefined && (obj.rootHash = message.rootHash); - return obj; - }, - - create, I>>(base?: I): TrieNodeSnapshotResponse { - return TrieNodeSnapshotResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): TrieNodeSnapshotResponse { - const message = createBaseTrieNodeSnapshotResponse(); - message.prefix = object.prefix ?? new Uint8Array(); - message.excludedHashes = object.excludedHashes?.map((e) => e) || []; - message.numMessages = object.numMessages ?? 0; - message.rootHash = object.rootHash ?? ''; - return message; - }, -}; - -function createBaseTrieNodePrefix(): TrieNodePrefix { - return { prefix: new Uint8Array() }; -} - -export const TrieNodePrefix = { - encode(message: TrieNodePrefix, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.prefix.length !== 0) { - writer.uint32(10).bytes(message.prefix); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TrieNodePrefix { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrieNodePrefix(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.prefix = reader.bytes(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): TrieNodePrefix { - return { prefix: isSet(object.prefix) ? bytesFromBase64(object.prefix) : new Uint8Array() }; - }, - - toJSON(message: TrieNodePrefix): unknown { - const obj: any = {}; - message.prefix !== undefined && - (obj.prefix = base64FromBytes(message.prefix !== undefined ? message.prefix : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): TrieNodePrefix { - return TrieNodePrefix.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): TrieNodePrefix { - const message = createBaseTrieNodePrefix(); - message.prefix = object.prefix ?? new Uint8Array(); - return message; - }, -}; - -function createBaseSyncIds(): SyncIds { - return { syncIds: [] }; -} - -export const SyncIds = { - encode(message: SyncIds, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.syncIds) { - writer.uint32(10).bytes(v!); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SyncIds { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSyncIds(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.syncIds.push(reader.bytes()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): SyncIds { - return { syncIds: Array.isArray(object?.syncIds) ? object.syncIds.map((e: any) => bytesFromBase64(e)) : [] }; - }, - - toJSON(message: SyncIds): unknown { - const obj: any = {}; - if (message.syncIds) { - obj.syncIds = message.syncIds.map((e) => base64FromBytes(e !== undefined ? e : new Uint8Array())); - } else { - obj.syncIds = []; - } - return obj; - }, - - create, I>>(base?: I): SyncIds { - return SyncIds.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): SyncIds { - const message = createBaseSyncIds(); - message.syncIds = object.syncIds?.map((e) => e) || []; - return message; - }, -}; - -function createBaseFidRequest(): FidRequest { - return { fid: 0, pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const FidRequest = { - encode(message: FidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.pageSize !== undefined) { - writer.uint32(16).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(26).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(32).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FidRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFidRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.fid = longToNumber(reader.uint64() as Long); - break; - case 2: - message.pageSize = reader.uint32(); - break; - case 3: - message.pageToken = reader.bytes(); - break; - case 4: - message.reverse = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): FidRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: FidRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): FidRequest { - return FidRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): FidRequest { - const message = createBaseFidRequest(); - message.fid = object.fid ?? 0; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseFidsRequest(): FidsRequest { - return { pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const FidsRequest = { - encode(message: FidsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.pageSize !== undefined) { - writer.uint32(8).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(18).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(24).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FidsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFidsRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.pageSize = reader.uint32(); - break; - case 2: - message.pageToken = reader.bytes(); - break; - case 3: - message.reverse = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): FidsRequest { - return { - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: FidsRequest): unknown { - const obj: any = {}; - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): FidsRequest { - return FidsRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): FidsRequest { - const message = createBaseFidsRequest(); - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseFidsResponse(): FidsResponse { - return { fids: [], nextPageToken: undefined }; -} - -export const FidsResponse = { - encode(message: FidsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - writer.uint32(10).fork(); - for (const v of message.fids) { - writer.uint64(v); - } - writer.ldelim(); - if (message.nextPageToken !== undefined) { - writer.uint32(18).bytes(message.nextPageToken); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FidsResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFidsResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if ((tag & 7) === 2) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.fids.push(longToNumber(reader.uint64() as Long)); - } - } else { - message.fids.push(longToNumber(reader.uint64() as Long)); - } - break; - case 2: - message.nextPageToken = reader.bytes(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): FidsResponse { - return { - fids: Array.isArray(object?.fids) ? object.fids.map((e: any) => Number(e)) : [], - nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, - }; - }, - - toJSON(message: FidsResponse): unknown { - const obj: any = {}; - if (message.fids) { - obj.fids = message.fids.map((e) => Math.round(e)); - } else { - obj.fids = []; - } - message.nextPageToken !== undefined && - (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); - return obj; - }, - - create, I>>(base?: I): FidsResponse { - return FidsResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): FidsResponse { - const message = createBaseFidsResponse(); - message.fids = object.fids?.map((e) => e) || []; - message.nextPageToken = object.nextPageToken ?? undefined; - return message; - }, -}; - -function createBaseMessagesResponse(): MessagesResponse { - return { messages: [], nextPageToken: undefined }; -} - -export const MessagesResponse = { - encode(message: MessagesResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.messages) { - Message.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.nextPageToken !== undefined) { - writer.uint32(18).bytes(message.nextPageToken); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): MessagesResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseMessagesResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.messages.push(Message.decode(reader, reader.uint32())); - break; - case 2: - message.nextPageToken = reader.bytes(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): MessagesResponse { - return { - messages: Array.isArray(object?.messages) ? object.messages.map((e: any) => Message.fromJSON(e)) : [], - nextPageToken: isSet(object.nextPageToken) ? bytesFromBase64(object.nextPageToken) : undefined, - }; - }, - - toJSON(message: MessagesResponse): unknown { - const obj: any = {}; - if (message.messages) { - obj.messages = message.messages.map((e) => (e ? Message.toJSON(e) : undefined)); - } else { - obj.messages = []; - } - message.nextPageToken !== undefined && - (obj.nextPageToken = message.nextPageToken !== undefined ? base64FromBytes(message.nextPageToken) : undefined); - return obj; - }, - - create, I>>(base?: I): MessagesResponse { - return MessagesResponse.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): MessagesResponse { - const message = createBaseMessagesResponse(); - message.messages = object.messages?.map((e) => Message.fromPartial(e)) || []; - message.nextPageToken = object.nextPageToken ?? undefined; - return message; - }, -}; - -function createBaseCastsByParentRequest(): CastsByParentRequest { - return { castId: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const CastsByParentRequest = { - encode(message: CastsByParentRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.castId !== undefined) { - CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); - } - if (message.pageSize !== undefined) { - writer.uint32(16).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(26).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(32).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): CastsByParentRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCastsByParentRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.castId = CastId.decode(reader, reader.uint32()); - break; - case 2: - message.pageSize = reader.uint32(); - break; - case 3: - message.pageToken = reader.bytes(); - break; - case 4: - message.reverse = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): CastsByParentRequest { - return { - castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: CastsByParentRequest): unknown { - const obj: any = {}; - message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): CastsByParentRequest { - return CastsByParentRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): CastsByParentRequest { - const message = createBaseCastsByParentRequest(); - message.castId = - object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseReactionRequest(): ReactionRequest { - return { fid: 0, reactionType: 0, castId: undefined }; -} - -export const ReactionRequest = { - encode(message: ReactionRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.reactionType !== 0) { - writer.uint32(16).int32(message.reactionType); - } - if (message.castId !== undefined) { - CastId.encode(message.castId, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ReactionRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseReactionRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.fid = longToNumber(reader.uint64() as Long); - break; - case 2: - message.reactionType = reader.int32() as any; - break; - case 3: - message.castId = CastId.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): ReactionRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : 0, - castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, - }; - }, - - toJSON(message: ReactionRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.reactionType !== undefined && (obj.reactionType = reactionTypeToJSON(message.reactionType)); - message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); - return obj; - }, - - create, I>>(base?: I): ReactionRequest { - return ReactionRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): ReactionRequest { - const message = createBaseReactionRequest(); - message.fid = object.fid ?? 0; - message.reactionType = object.reactionType ?? 0; - message.castId = - object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; - return message; - }, -}; - -function createBaseReactionsByFidRequest(): ReactionsByFidRequest { - return { fid: 0, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const ReactionsByFidRequest = { - encode(message: ReactionsByFidRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.reactionType !== undefined) { - writer.uint32(16).int32(message.reactionType); - } - if (message.pageSize !== undefined) { - writer.uint32(24).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(34).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(40).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByFidRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseReactionsByFidRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.fid = longToNumber(reader.uint64() as Long); - break; - case 2: - message.reactionType = reader.int32() as any; - break; - case 3: - message.pageSize = reader.uint32(); - break; - case 4: - message.pageToken = reader.bytes(); - break; - case 5: - message.reverse = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): ReactionsByFidRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: ReactionsByFidRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.reactionType !== undefined && - (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): ReactionsByFidRequest { - return ReactionsByFidRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): ReactionsByFidRequest { - const message = createBaseReactionsByFidRequest(); - message.fid = object.fid ?? 0; - message.reactionType = object.reactionType ?? undefined; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseReactionsByCastRequest(): ReactionsByCastRequest { - return { castId: undefined, reactionType: undefined, pageSize: undefined, pageToken: undefined, reverse: undefined }; -} - -export const ReactionsByCastRequest = { - encode(message: ReactionsByCastRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.castId !== undefined) { - CastId.encode(message.castId, writer.uint32(10).fork()).ldelim(); - } - if (message.reactionType !== undefined) { - writer.uint32(16).int32(message.reactionType); - } - if (message.pageSize !== undefined) { - writer.uint32(24).uint32(message.pageSize); - } - if (message.pageToken !== undefined) { - writer.uint32(34).bytes(message.pageToken); - } - if (message.reverse !== undefined) { - writer.uint32(40).bool(message.reverse); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ReactionsByCastRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseReactionsByCastRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.castId = CastId.decode(reader, reader.uint32()); - break; - case 2: - message.reactionType = reader.int32() as any; - break; - case 3: - message.pageSize = reader.uint32(); - break; - case 4: - message.pageToken = reader.bytes(); - break; - case 5: - message.reverse = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): ReactionsByCastRequest { - return { - castId: isSet(object.castId) ? CastId.fromJSON(object.castId) : undefined, - reactionType: isSet(object.reactionType) ? reactionTypeFromJSON(object.reactionType) : undefined, - pageSize: isSet(object.pageSize) ? Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? bytesFromBase64(object.pageToken) : undefined, - reverse: isSet(object.reverse) ? Boolean(object.reverse) : undefined, - }; - }, - - toJSON(message: ReactionsByCastRequest): unknown { - const obj: any = {}; - message.castId !== undefined && (obj.castId = message.castId ? CastId.toJSON(message.castId) : undefined); - message.reactionType !== undefined && - (obj.reactionType = message.reactionType !== undefined ? reactionTypeToJSON(message.reactionType) : undefined); - message.pageSize !== undefined && (obj.pageSize = Math.round(message.pageSize)); - message.pageToken !== undefined && - (obj.pageToken = message.pageToken !== undefined ? base64FromBytes(message.pageToken) : undefined); - message.reverse !== undefined && (obj.reverse = message.reverse); - return obj; - }, - - create, I>>(base?: I): ReactionsByCastRequest { - return ReactionsByCastRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): ReactionsByCastRequest { - const message = createBaseReactionsByCastRequest(); - message.castId = - object.castId !== undefined && object.castId !== null ? CastId.fromPartial(object.castId) : undefined; - message.reactionType = object.reactionType ?? undefined; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? undefined; - message.reverse = object.reverse ?? undefined; - return message; - }, -}; - -function createBaseUserDataRequest(): UserDataRequest { - return { fid: 0, userDataType: 0 }; -} - -export const UserDataRequest = { - encode(message: UserDataRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.userDataType !== 0) { - writer.uint32(16).int32(message.userDataType); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserDataRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserDataRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.fid = longToNumber(reader.uint64() as Long); - break; - case 2: - message.userDataType = reader.int32() as any; - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): UserDataRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - userDataType: isSet(object.userDataType) ? userDataTypeFromJSON(object.userDataType) : 0, - }; - }, - - toJSON(message: UserDataRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.userDataType !== undefined && (obj.userDataType = userDataTypeToJSON(message.userDataType)); - return obj; - }, - - create, I>>(base?: I): UserDataRequest { - return UserDataRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): UserDataRequest { - const message = createBaseUserDataRequest(); - message.fid = object.fid ?? 0; - message.userDataType = object.userDataType ?? 0; - return message; - }, -}; - -function createBaseNameRegistryEventRequest(): NameRegistryEventRequest { - return { name: new Uint8Array() }; -} - -export const NameRegistryEventRequest = { - encode(message: NameRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name.length !== 0) { - writer.uint32(10).bytes(message.name); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): NameRegistryEventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNameRegistryEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.name = reader.bytes(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): NameRegistryEventRequest { - return { name: isSet(object.name) ? bytesFromBase64(object.name) : new Uint8Array() }; - }, - - toJSON(message: NameRegistryEventRequest): unknown { - const obj: any = {}; - message.name !== undefined && - (obj.name = base64FromBytes(message.name !== undefined ? message.name : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): NameRegistryEventRequest { - return NameRegistryEventRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): NameRegistryEventRequest { - const message = createBaseNameRegistryEventRequest(); - message.name = object.name ?? new Uint8Array(); - return message; - }, -}; - -function createBaseVerificationRequest(): VerificationRequest { - return { fid: 0, address: new Uint8Array() }; -} - -export const VerificationRequest = { - encode(message: VerificationRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.address.length !== 0) { - writer.uint32(18).bytes(message.address); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VerificationRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVerificationRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.fid = longToNumber(reader.uint64() as Long); - break; - case 2: - message.address = reader.bytes(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): VerificationRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array(), - }; - }, - - toJSON(message: VerificationRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.address !== undefined && - (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): VerificationRequest { - return VerificationRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): VerificationRequest { - const message = createBaseVerificationRequest(); - message.fid = object.fid ?? 0; - message.address = object.address ?? new Uint8Array(); - return message; - }, -}; - -function createBaseSignerRequest(): SignerRequest { - return { fid: 0, signer: new Uint8Array() }; -} - -export const SignerRequest = { - encode(message: SignerRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - if (message.signer.length !== 0) { - writer.uint32(18).bytes(message.signer); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SignerRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSignerRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.fid = longToNumber(reader.uint64() as Long); - break; - case 2: - message.signer = reader.bytes(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): SignerRequest { - return { - fid: isSet(object.fid) ? Number(object.fid) : 0, - signer: isSet(object.signer) ? bytesFromBase64(object.signer) : new Uint8Array(), - }; - }, - - toJSON(message: SignerRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - message.signer !== undefined && - (obj.signer = base64FromBytes(message.signer !== undefined ? message.signer : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): SignerRequest { - return SignerRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): SignerRequest { - const message = createBaseSignerRequest(); - message.fid = object.fid ?? 0; - message.signer = object.signer ?? new Uint8Array(); - return message; - }, -}; - -function createBaseIdRegistryEventRequest(): IdRegistryEventRequest { - return { fid: 0 }; -} - -export const IdRegistryEventRequest = { - encode(message: IdRegistryEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fid !== 0) { - writer.uint32(8).uint64(message.fid); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseIdRegistryEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.fid = longToNumber(reader.uint64() as Long); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): IdRegistryEventRequest { - return { fid: isSet(object.fid) ? Number(object.fid) : 0 }; - }, - - toJSON(message: IdRegistryEventRequest): unknown { - const obj: any = {}; - message.fid !== undefined && (obj.fid = Math.round(message.fid)); - return obj; - }, - - create, I>>(base?: I): IdRegistryEventRequest { - return IdRegistryEventRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>(object: I): IdRegistryEventRequest { - const message = createBaseIdRegistryEventRequest(); - message.fid = object.fid ?? 0; - return message; - }, -}; - -function createBaseIdRegistryEventByAddressRequest(): IdRegistryEventByAddressRequest { - return { address: new Uint8Array() }; -} - -export const IdRegistryEventByAddressRequest = { - encode(message: IdRegistryEventByAddressRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.address.length !== 0) { - writer.uint32(10).bytes(message.address); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): IdRegistryEventByAddressRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseIdRegistryEventByAddressRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.address = reader.bytes(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): IdRegistryEventByAddressRequest { - return { address: isSet(object.address) ? bytesFromBase64(object.address) : new Uint8Array() }; - }, - - toJSON(message: IdRegistryEventByAddressRequest): unknown { - const obj: any = {}; - message.address !== undefined && - (obj.address = base64FromBytes(message.address !== undefined ? message.address : new Uint8Array())); - return obj; - }, - - create, I>>(base?: I): IdRegistryEventByAddressRequest { - return IdRegistryEventByAddressRequest.fromPartial(base ?? {}); - }, - - fromPartial, I>>( - object: I - ): IdRegistryEventByAddressRequest { - const message = createBaseIdRegistryEventByAddressRequest(); - message.address = object.address ?? new Uint8Array(); - return message; - }, -}; - -export type HubServiceService = typeof HubServiceService; -export const HubServiceService = { - /** Submit Methods */ - submitMessage: { - path: '/HubService/SubmitMessage', - requestStream: false, - responseStream: false, - requestSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), - requestDeserialize: (value: Buffer) => Message.decode(value), - responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), - responseDeserialize: (value: Buffer) => Message.decode(value), - }, - /** Event Methods */ - subscribe: { - path: '/HubService/Subscribe', - requestStream: false, - responseStream: true, - requestSerialize: (value: SubscribeRequest) => Buffer.from(SubscribeRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => SubscribeRequest.decode(value), - responseSerialize: (value: HubEvent) => Buffer.from(HubEvent.encode(value).finish()), - responseDeserialize: (value: Buffer) => HubEvent.decode(value), - }, - getEvent: { - path: '/HubService/GetEvent', - requestStream: false, - responseStream: false, - requestSerialize: (value: EventRequest) => Buffer.from(EventRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => EventRequest.decode(value), - responseSerialize: (value: HubEvent) => Buffer.from(HubEvent.encode(value).finish()), - responseDeserialize: (value: Buffer) => HubEvent.decode(value), - }, - /** Casts */ - getCast: { - path: '/HubService/GetCast', - requestStream: false, - responseStream: false, - requestSerialize: (value: CastId) => Buffer.from(CastId.encode(value).finish()), - requestDeserialize: (value: Buffer) => CastId.decode(value), - responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), - responseDeserialize: (value: Buffer) => Message.decode(value), - }, - getCastsByFid: { - path: '/HubService/GetCastsByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getCastsByParent: { - path: '/HubService/GetCastsByParent', - requestStream: false, - responseStream: false, - requestSerialize: (value: CastsByParentRequest) => Buffer.from(CastsByParentRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => CastsByParentRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getCastsByMention: { - path: '/HubService/GetCastsByMention', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - /** Reactions */ - getReaction: { - path: '/HubService/GetReaction', - requestStream: false, - responseStream: false, - requestSerialize: (value: ReactionRequest) => Buffer.from(ReactionRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => ReactionRequest.decode(value), - responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), - responseDeserialize: (value: Buffer) => Message.decode(value), - }, - getReactionsByFid: { - path: '/HubService/GetReactionsByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: ReactionsByFidRequest) => Buffer.from(ReactionsByFidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => ReactionsByFidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getReactionsByCast: { - path: '/HubService/GetReactionsByCast', - requestStream: false, - responseStream: false, - requestSerialize: (value: ReactionsByCastRequest) => Buffer.from(ReactionsByCastRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => ReactionsByCastRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - /** User Data */ - getUserData: { - path: '/HubService/GetUserData', - requestStream: false, - responseStream: false, - requestSerialize: (value: UserDataRequest) => Buffer.from(UserDataRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => UserDataRequest.decode(value), - responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), - responseDeserialize: (value: Buffer) => Message.decode(value), - }, - getUserDataByFid: { - path: '/HubService/GetUserDataByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getNameRegistryEvent: { - path: '/HubService/GetNameRegistryEvent', - requestStream: false, - responseStream: false, - requestSerialize: (value: NameRegistryEventRequest) => Buffer.from(NameRegistryEventRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => NameRegistryEventRequest.decode(value), - responseSerialize: (value: NameRegistryEvent) => Buffer.from(NameRegistryEvent.encode(value).finish()), - responseDeserialize: (value: Buffer) => NameRegistryEvent.decode(value), - }, - /** Verifications */ - getVerification: { - path: '/HubService/GetVerification', - requestStream: false, - responseStream: false, - requestSerialize: (value: VerificationRequest) => Buffer.from(VerificationRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => VerificationRequest.decode(value), - responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), - responseDeserialize: (value: Buffer) => Message.decode(value), - }, - getVerificationsByFid: { - path: '/HubService/GetVerificationsByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - /** Signer */ - getSigner: { - path: '/HubService/GetSigner', - requestStream: false, - responseStream: false, - requestSerialize: (value: SignerRequest) => Buffer.from(SignerRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => SignerRequest.decode(value), - responseSerialize: (value: Message) => Buffer.from(Message.encode(value).finish()), - responseDeserialize: (value: Buffer) => Message.decode(value), - }, - getSignersByFid: { - path: '/HubService/GetSignersByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getIdRegistryEvent: { - path: '/HubService/GetIdRegistryEvent', - requestStream: false, - responseStream: false, - requestSerialize: (value: IdRegistryEventRequest) => Buffer.from(IdRegistryEventRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => IdRegistryEventRequest.decode(value), - responseSerialize: (value: IdRegistryEvent) => Buffer.from(IdRegistryEvent.encode(value).finish()), - responseDeserialize: (value: Buffer) => IdRegistryEvent.decode(value), - }, - getIdRegistryEventByAddress: { - path: '/HubService/GetIdRegistryEventByAddress', - requestStream: false, - responseStream: false, - requestSerialize: (value: IdRegistryEventByAddressRequest) => - Buffer.from(IdRegistryEventByAddressRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => IdRegistryEventByAddressRequest.decode(value), - responseSerialize: (value: IdRegistryEvent) => Buffer.from(IdRegistryEvent.encode(value).finish()), - responseDeserialize: (value: Buffer) => IdRegistryEvent.decode(value), - }, - getFids: { - path: '/HubService/GetFids', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidsRequest) => Buffer.from(FidsRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidsRequest.decode(value), - responseSerialize: (value: FidsResponse) => Buffer.from(FidsResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => FidsResponse.decode(value), - }, - /** Bulk Methods */ - getAllCastMessagesByFid: { - path: '/HubService/GetAllCastMessagesByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getAllReactionMessagesByFid: { - path: '/HubService/GetAllReactionMessagesByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getAllVerificationMessagesByFid: { - path: '/HubService/GetAllVerificationMessagesByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getAllSignerMessagesByFid: { - path: '/HubService/GetAllSignerMessagesByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getAllUserDataMessagesByFid: { - path: '/HubService/GetAllUserDataMessagesByFid', - requestStream: false, - responseStream: false, - requestSerialize: (value: FidRequest) => Buffer.from(FidRequest.encode(value).finish()), - requestDeserialize: (value: Buffer) => FidRequest.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - /** Sync Methods */ - getInfo: { - path: '/HubService/GetInfo', - requestStream: false, - responseStream: false, - requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), - requestDeserialize: (value: Buffer) => Empty.decode(value), - responseSerialize: (value: HubInfoResponse) => Buffer.from(HubInfoResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => HubInfoResponse.decode(value), - }, - getAllSyncIdsByPrefix: { - path: '/HubService/GetAllSyncIdsByPrefix', - requestStream: false, - responseStream: false, - requestSerialize: (value: TrieNodePrefix) => Buffer.from(TrieNodePrefix.encode(value).finish()), - requestDeserialize: (value: Buffer) => TrieNodePrefix.decode(value), - responseSerialize: (value: SyncIds) => Buffer.from(SyncIds.encode(value).finish()), - responseDeserialize: (value: Buffer) => SyncIds.decode(value), - }, - getAllMessagesBySyncIds: { - path: '/HubService/GetAllMessagesBySyncIds', - requestStream: false, - responseStream: false, - requestSerialize: (value: SyncIds) => Buffer.from(SyncIds.encode(value).finish()), - requestDeserialize: (value: Buffer) => SyncIds.decode(value), - responseSerialize: (value: MessagesResponse) => Buffer.from(MessagesResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => MessagesResponse.decode(value), - }, - getSyncMetadataByPrefix: { - path: '/HubService/GetSyncMetadataByPrefix', - requestStream: false, - responseStream: false, - requestSerialize: (value: TrieNodePrefix) => Buffer.from(TrieNodePrefix.encode(value).finish()), - requestDeserialize: (value: Buffer) => TrieNodePrefix.decode(value), - responseSerialize: (value: TrieNodeMetadataResponse) => - Buffer.from(TrieNodeMetadataResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => TrieNodeMetadataResponse.decode(value), - }, - getSyncSnapshotByPrefix: { - path: '/HubService/GetSyncSnapshotByPrefix', - requestStream: false, - responseStream: false, - requestSerialize: (value: TrieNodePrefix) => Buffer.from(TrieNodePrefix.encode(value).finish()), - requestDeserialize: (value: Buffer) => TrieNodePrefix.decode(value), - responseSerialize: (value: TrieNodeSnapshotResponse) => - Buffer.from(TrieNodeSnapshotResponse.encode(value).finish()), - responseDeserialize: (value: Buffer) => TrieNodeSnapshotResponse.decode(value), - }, -} as const; - -export interface HubServiceServer extends UntypedServiceImplementation { - /** Submit Methods */ - submitMessage: handleUnaryCall; - /** Event Methods */ - subscribe: handleServerStreamingCall; - getEvent: handleUnaryCall; - /** Casts */ - getCast: handleUnaryCall; - getCastsByFid: handleUnaryCall; - getCastsByParent: handleUnaryCall; - getCastsByMention: handleUnaryCall; - /** Reactions */ - getReaction: handleUnaryCall; - getReactionsByFid: handleUnaryCall; - getReactionsByCast: handleUnaryCall; - /** User Data */ - getUserData: handleUnaryCall; - getUserDataByFid: handleUnaryCall; - getNameRegistryEvent: handleUnaryCall; - /** Verifications */ - getVerification: handleUnaryCall; - getVerificationsByFid: handleUnaryCall; - /** Signer */ - getSigner: handleUnaryCall; - getSignersByFid: handleUnaryCall; - getIdRegistryEvent: handleUnaryCall; - getIdRegistryEventByAddress: handleUnaryCall; - getFids: handleUnaryCall; - /** Bulk Methods */ - getAllCastMessagesByFid: handleUnaryCall; - getAllReactionMessagesByFid: handleUnaryCall; - getAllVerificationMessagesByFid: handleUnaryCall; - getAllSignerMessagesByFid: handleUnaryCall; - getAllUserDataMessagesByFid: handleUnaryCall; - /** Sync Methods */ - getInfo: handleUnaryCall; - getAllSyncIdsByPrefix: handleUnaryCall; - getAllMessagesBySyncIds: handleUnaryCall; - getSyncMetadataByPrefix: handleUnaryCall; - getSyncSnapshotByPrefix: handleUnaryCall; -} - -export interface HubServiceClient extends Client { - /** Submit Methods */ - submitMessage(request: Message, callback: (error: ServiceError | null, response: Message) => void): ClientUnaryCall; - submitMessage( - request: Message, - metadata: Metadata, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - submitMessage( - request: Message, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - /** Event Methods */ - subscribe(request: SubscribeRequest, options?: Partial): ClientReadableStream; - subscribe( - request: SubscribeRequest, - metadata?: Metadata, - options?: Partial - ): ClientReadableStream; - getEvent(request: EventRequest, callback: (error: ServiceError | null, response: HubEvent) => void): ClientUnaryCall; - getEvent( - request: EventRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: HubEvent) => void - ): ClientUnaryCall; - getEvent( - request: EventRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: HubEvent) => void - ): ClientUnaryCall; - /** Casts */ - getCast(request: CastId, callback: (error: ServiceError | null, response: Message) => void): ClientUnaryCall; - getCast( - request: CastId, - metadata: Metadata, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getCast( - request: CastId, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getCastsByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getCastsByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getCastsByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getCastsByParent( - request: CastsByParentRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getCastsByParent( - request: CastsByParentRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getCastsByParent( - request: CastsByParentRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getCastsByMention( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getCastsByMention( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getCastsByMention( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - /** Reactions */ - getReaction( - request: ReactionRequest, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getReaction( - request: ReactionRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getReaction( - request: ReactionRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getReactionsByFid( - request: ReactionsByFidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getReactionsByFid( - request: ReactionsByFidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getReactionsByFid( - request: ReactionsByFidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getReactionsByCast( - request: ReactionsByCastRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getReactionsByCast( - request: ReactionsByCastRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getReactionsByCast( - request: ReactionsByCastRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - /** User Data */ - getUserData( - request: UserDataRequest, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getUserData( - request: UserDataRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getUserData( - request: UserDataRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getUserDataByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getUserDataByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getUserDataByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getNameRegistryEvent( - request: NameRegistryEventRequest, - callback: (error: ServiceError | null, response: NameRegistryEvent) => void - ): ClientUnaryCall; - getNameRegistryEvent( - request: NameRegistryEventRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: NameRegistryEvent) => void - ): ClientUnaryCall; - getNameRegistryEvent( - request: NameRegistryEventRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: NameRegistryEvent) => void - ): ClientUnaryCall; - /** Verifications */ - getVerification( - request: VerificationRequest, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getVerification( - request: VerificationRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getVerification( - request: VerificationRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getVerificationsByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getVerificationsByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getVerificationsByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - /** Signer */ - getSigner(request: SignerRequest, callback: (error: ServiceError | null, response: Message) => void): ClientUnaryCall; - getSigner( - request: SignerRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getSigner( - request: SignerRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: Message) => void - ): ClientUnaryCall; - getSignersByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getSignersByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getSignersByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getIdRegistryEvent( - request: IdRegistryEventRequest, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - getIdRegistryEvent( - request: IdRegistryEventRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - getIdRegistryEvent( - request: IdRegistryEventRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - getIdRegistryEventByAddress( - request: IdRegistryEventByAddressRequest, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - getIdRegistryEventByAddress( - request: IdRegistryEventByAddressRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - getIdRegistryEventByAddress( - request: IdRegistryEventByAddressRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - getFids( - request: FidsRequest, - callback: (error: ServiceError | null, response: FidsResponse) => void - ): ClientUnaryCall; - getFids( - request: FidsRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: FidsResponse) => void - ): ClientUnaryCall; - getFids( - request: FidsRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: FidsResponse) => void - ): ClientUnaryCall; - /** Bulk Methods */ - getAllCastMessagesByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllCastMessagesByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllCastMessagesByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllReactionMessagesByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllReactionMessagesByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllReactionMessagesByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllVerificationMessagesByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllVerificationMessagesByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllVerificationMessagesByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllSignerMessagesByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllSignerMessagesByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllSignerMessagesByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllUserDataMessagesByFid( - request: FidRequest, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllUserDataMessagesByFid( - request: FidRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllUserDataMessagesByFid( - request: FidRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - /** Sync Methods */ - getInfo(request: Empty, callback: (error: ServiceError | null, response: HubInfoResponse) => void): ClientUnaryCall; - getInfo( - request: Empty, - metadata: Metadata, - callback: (error: ServiceError | null, response: HubInfoResponse) => void - ): ClientUnaryCall; - getInfo( - request: Empty, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: HubInfoResponse) => void - ): ClientUnaryCall; - getAllSyncIdsByPrefix( - request: TrieNodePrefix, - callback: (error: ServiceError | null, response: SyncIds) => void - ): ClientUnaryCall; - getAllSyncIdsByPrefix( - request: TrieNodePrefix, - metadata: Metadata, - callback: (error: ServiceError | null, response: SyncIds) => void - ): ClientUnaryCall; - getAllSyncIdsByPrefix( - request: TrieNodePrefix, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: SyncIds) => void - ): ClientUnaryCall; - getAllMessagesBySyncIds( - request: SyncIds, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllMessagesBySyncIds( - request: SyncIds, - metadata: Metadata, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getAllMessagesBySyncIds( - request: SyncIds, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: MessagesResponse) => void - ): ClientUnaryCall; - getSyncMetadataByPrefix( - request: TrieNodePrefix, - callback: (error: ServiceError | null, response: TrieNodeMetadataResponse) => void - ): ClientUnaryCall; - getSyncMetadataByPrefix( - request: TrieNodePrefix, - metadata: Metadata, - callback: (error: ServiceError | null, response: TrieNodeMetadataResponse) => void - ): ClientUnaryCall; - getSyncMetadataByPrefix( - request: TrieNodePrefix, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: TrieNodeMetadataResponse) => void - ): ClientUnaryCall; - getSyncSnapshotByPrefix( - request: TrieNodePrefix, - callback: (error: ServiceError | null, response: TrieNodeSnapshotResponse) => void - ): ClientUnaryCall; - getSyncSnapshotByPrefix( - request: TrieNodePrefix, - metadata: Metadata, - callback: (error: ServiceError | null, response: TrieNodeSnapshotResponse) => void - ): ClientUnaryCall; - getSyncSnapshotByPrefix( - request: TrieNodePrefix, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: TrieNodeSnapshotResponse) => void - ): ClientUnaryCall; -} - -export const HubServiceClient = makeGenericClientConstructor(HubServiceService, 'HubService') as unknown as { - new (address: string, credentials: ChannelCredentials, options?: Partial): HubServiceClient; - service: typeof HubServiceService; -}; - -export type AdminServiceService = typeof AdminServiceService; -export const AdminServiceService = { - rebuildSyncTrie: { - path: '/AdminService/RebuildSyncTrie', - requestStream: false, - responseStream: false, - requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), - requestDeserialize: (value: Buffer) => Empty.decode(value), - responseSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), - responseDeserialize: (value: Buffer) => Empty.decode(value), - }, - deleteAllMessagesFromDb: { - path: '/AdminService/DeleteAllMessagesFromDb', - requestStream: false, - responseStream: false, - requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), - requestDeserialize: (value: Buffer) => Empty.decode(value), - responseSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), - responseDeserialize: (value: Buffer) => Empty.decode(value), - }, - submitIdRegistryEvent: { - path: '/AdminService/SubmitIdRegistryEvent', - requestStream: false, - responseStream: false, - requestSerialize: (value: IdRegistryEvent) => Buffer.from(IdRegistryEvent.encode(value).finish()), - requestDeserialize: (value: Buffer) => IdRegistryEvent.decode(value), - responseSerialize: (value: IdRegistryEvent) => Buffer.from(IdRegistryEvent.encode(value).finish()), - responseDeserialize: (value: Buffer) => IdRegistryEvent.decode(value), - }, - submitNameRegistryEvent: { - path: '/AdminService/SubmitNameRegistryEvent', - requestStream: false, - responseStream: false, - requestSerialize: (value: NameRegistryEvent) => Buffer.from(NameRegistryEvent.encode(value).finish()), - requestDeserialize: (value: Buffer) => NameRegistryEvent.decode(value), - responseSerialize: (value: NameRegistryEvent) => Buffer.from(NameRegistryEvent.encode(value).finish()), - responseDeserialize: (value: Buffer) => NameRegistryEvent.decode(value), - }, -} as const; - -export interface AdminServiceServer extends UntypedServiceImplementation { - rebuildSyncTrie: handleUnaryCall; - deleteAllMessagesFromDb: handleUnaryCall; - submitIdRegistryEvent: handleUnaryCall; - submitNameRegistryEvent: handleUnaryCall; -} - -export interface AdminServiceClient extends Client { - rebuildSyncTrie(request: Empty, callback: (error: ServiceError | null, response: Empty) => void): ClientUnaryCall; - rebuildSyncTrie( - request: Empty, - metadata: Metadata, - callback: (error: ServiceError | null, response: Empty) => void - ): ClientUnaryCall; - rebuildSyncTrie( - request: Empty, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: Empty) => void - ): ClientUnaryCall; - deleteAllMessagesFromDb( - request: Empty, - callback: (error: ServiceError | null, response: Empty) => void - ): ClientUnaryCall; - deleteAllMessagesFromDb( - request: Empty, - metadata: Metadata, - callback: (error: ServiceError | null, response: Empty) => void - ): ClientUnaryCall; - deleteAllMessagesFromDb( - request: Empty, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: Empty) => void - ): ClientUnaryCall; - submitIdRegistryEvent( - request: IdRegistryEvent, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - submitIdRegistryEvent( - request: IdRegistryEvent, - metadata: Metadata, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - submitIdRegistryEvent( - request: IdRegistryEvent, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: IdRegistryEvent) => void - ): ClientUnaryCall; - submitNameRegistryEvent( - request: NameRegistryEvent, - callback: (error: ServiceError | null, response: NameRegistryEvent) => void - ): ClientUnaryCall; - submitNameRegistryEvent( - request: NameRegistryEvent, - metadata: Metadata, - callback: (error: ServiceError | null, response: NameRegistryEvent) => void - ): ClientUnaryCall; - submitNameRegistryEvent( - request: NameRegistryEvent, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: NameRegistryEvent) => void - ): ClientUnaryCall; -} - -export const AdminServiceClient = makeGenericClientConstructor(AdminServiceService, 'AdminService') as unknown as { - new (address: string, credentials: ChannelCredentials, options?: Partial): AdminServiceClient; - service: typeof AdminServiceService; -}; - -declare var self: any | undefined; -declare var window: any | undefined; -declare var global: any | undefined; -var tsProtoGlobalThis: any = (() => { - if (typeof globalThis !== 'undefined') { - return globalThis; - } - if (typeof self !== 'undefined') { - return self; - } - if (typeof window !== 'undefined') { - return window; - } - if (typeof global !== 'undefined') { - return global; - } - throw 'Unable to locate global object'; -})(); - -function bytesFromBase64(b64: string): Uint8Array { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, 'base64')); - } else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } -} - -function base64FromBytes(arr: Uint8Array): string { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString('base64'); - } else { - const bin: string[] = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join('')); - } -} - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -type DeepPartial = T extends Builtin - ? T - : T extends Array - ? Array> - : T extends ReadonlyArray - ? ReadonlyArray> - : T extends {} - ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -type Exact = P extends Builtin - ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function longToNumber(long: Long): number { - if (long.gt(Number.MAX_SAFE_INTEGER)) { - throw new tsProtoGlobalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); - } - return long.toNumber(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/packages/protobufs/src/index.ts b/packages/protobufs/src/index.ts index 870ca71705..3438004617 100644 --- a/packages/protobufs/src/index.ts +++ b/packages/protobufs/src/index.ts @@ -1,8 +1,3 @@ -import * as grpc from '@grpc/grpc-js'; -import { AdminServiceClient, HubServiceClient } from './generated/rpc'; - -export { Metadata, Server, ServerCredentials, status } from '@grpc/grpc-js'; -export type { CallOptions, Client, ClientReadableStream, ClientUnaryCall, ServiceError } from '@grpc/grpc-js'; export * from './generated/gossip'; export * from './generated/hub_event'; export * from './generated/hub_state'; @@ -10,25 +5,7 @@ export * from './generated/id_registry_event'; export * from './generated/job'; export * from './generated/message'; export * from './generated/name_registry_event'; -export * from './generated/rpc'; export * from './generated/sync_trie'; +export * from './generated/request_response'; export * from './typeguards'; export * from './types'; - -export const getServer = (): grpc.Server => { - const server = new grpc.Server(); - - return server; -}; - -export const getSSLClient = (address: string): HubServiceClient => { - return new HubServiceClient(address, grpc.credentials.createSsl()); -}; - -export const getInsecureClient = (address: string): HubServiceClient => { - return new HubServiceClient(address, grpc.credentials.createInsecure()); -}; - -export const getAdminClient = (address: string): AdminServiceClient => { - return new AdminServiceClient(address, grpc.credentials.createInsecure()); -}; diff --git a/packages/protobufs/src/schemas/request_response.proto b/packages/protobufs/src/schemas/request_response.proto new file mode 100644 index 0000000000..c15d6ce14b --- /dev/null +++ b/packages/protobufs/src/schemas/request_response.proto @@ -0,0 +1,124 @@ +syntax = "proto3"; + +import "message.proto"; +import "hub_event.proto"; + +message Empty {} + +message SubscribeRequest { + repeated HubEventType event_types = 1; + optional uint64 from_id = 2; +} + +message EventRequest { + uint64 id = 1; +} + +// Response Types for the Sync RPC Methods +message HubInfoResponse { + string version = 1; + bool is_synced = 2; + string nickname = 3; + string root_hash = 4; +} + +message TrieNodeMetadataResponse { + bytes prefix = 1; + uint64 num_messages = 2; + string hash = 3; + repeated TrieNodeMetadataResponse children = 4; +} + +message TrieNodeSnapshotResponse { + bytes prefix = 1; + repeated string excluded_hashes = 2; + uint64 num_messages = 3; + string root_hash = 4; +} + +message TrieNodePrefix { + bytes prefix = 1; +} + +message SyncIds { + repeated bytes sync_ids = 1; +} + +message FidRequest { + uint64 fid = 1; + optional uint32 page_size = 2; + optional bytes page_token = 3; + optional bool reverse = 4; +} + +message FidsRequest { + optional uint32 page_size = 1; + optional bytes page_token = 2; + optional bool reverse = 3; +} + +message FidsResponse { + repeated uint64 fids = 1; + optional bytes next_page_token = 2; +} + +message MessagesResponse { + repeated Message messages = 1; + optional bytes next_page_token = 2; +} + +message CastsByParentRequest { + CastId cast_id = 1; + optional uint32 page_size = 2; + optional bytes page_token = 3; + optional bool reverse = 4; +} + +message ReactionRequest { + uint64 fid = 1; + ReactionType reaction_type = 2; + CastId cast_id = 3; +} + +message ReactionsByFidRequest { + uint64 fid = 1; + optional ReactionType reaction_type = 2; + optional uint32 page_size = 3; + optional bytes page_token = 4; + optional bool reverse = 5; +} + +message ReactionsByCastRequest { + CastId cast_id = 1; + optional ReactionType reaction_type = 2; + optional uint32 page_size = 3; + optional bytes page_token = 4; + optional bool reverse = 5; +} + +message UserDataRequest { + uint64 fid = 1; + UserDataType user_data_type = 2; +} + +message NameRegistryEventRequest { + bytes name = 1; +} + +message VerificationRequest { + uint64 fid = 1; + bytes address = 2; +} + +message SignerRequest { + uint64 fid = 1; + bytes signer = 2; +} + +message IdRegistryEventRequest { + uint64 fid = 1; +} + +message IdRegistryEventByAddressRequest { + bytes address = 1; +} diff --git a/packages/protobufs/src/schemas/rpc.proto b/packages/protobufs/src/schemas/rpc.proto index c126394db4..20dec52cff 100644 --- a/packages/protobufs/src/schemas/rpc.proto +++ b/packages/protobufs/src/schemas/rpc.proto @@ -4,126 +4,7 @@ import "message.proto"; import "id_registry_event.proto"; import "name_registry_event.proto"; import "hub_event.proto"; - -message Empty {} - -message SubscribeRequest { - repeated HubEventType event_types = 1; - optional uint64 from_id = 2; -} - -message EventRequest { - uint64 id = 1; -} - -// Response Types for the Sync RPC Methods -message HubInfoResponse { - string version = 1; - bool is_synced = 2; - string nickname = 3; - string root_hash = 4; -} - -message TrieNodeMetadataResponse { - bytes prefix = 1; - uint64 num_messages = 2; - string hash = 3; - repeated TrieNodeMetadataResponse children = 4; -} - -message TrieNodeSnapshotResponse { - bytes prefix = 1; - repeated string excluded_hashes = 2; - uint64 num_messages = 3; - string root_hash = 4; -} - -message TrieNodePrefix { - bytes prefix = 1; -} - -message SyncIds { - repeated bytes sync_ids = 1; -} - -message FidRequest { - uint64 fid = 1; - optional uint32 page_size = 2; - optional bytes page_token = 3; - optional bool reverse = 4; -} - -message FidsRequest { - optional uint32 page_size = 1; - optional bytes page_token = 2; - optional bool reverse = 3; -} - -message FidsResponse { - repeated uint64 fids = 1; - optional bytes next_page_token = 2; -} - -message MessagesResponse { - repeated Message messages = 1; - optional bytes next_page_token = 2; -} - -message CastsByParentRequest { - CastId cast_id = 1; - optional uint32 page_size = 2; - optional bytes page_token = 3; - optional bool reverse = 4; -} - -message ReactionRequest { - uint64 fid = 1; - ReactionType reaction_type = 2; - CastId cast_id = 3; -} - -message ReactionsByFidRequest { - uint64 fid = 1; - optional ReactionType reaction_type = 2; - optional uint32 page_size = 3; - optional bytes page_token = 4; - optional bool reverse = 5; -} - -message ReactionsByCastRequest { - CastId cast_id = 1; - optional ReactionType reaction_type = 2; - optional uint32 page_size = 3; - optional bytes page_token = 4; - optional bool reverse = 5; -} - -message UserDataRequest { - uint64 fid = 1; - UserDataType user_data_type = 2; -} - -message NameRegistryEventRequest { - bytes name = 1; -} - -message VerificationRequest { - uint64 fid = 1; - bytes address = 2; -} - -message SignerRequest { - uint64 fid = 1; - bytes signer = 2; -} - -message IdRegistryEventRequest { - uint64 fid = 1; -} - -message IdRegistryEventByAddressRequest { - bytes address = 1; -} +import "request_response.proto"; service HubService { // Submit Methods diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 19e119c6ec..b4fe6dbd84 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,6 +1,5 @@ export * from './builders'; export * from './bytes'; -export * from './client'; export * from './crypto'; export * from './errors'; export * from './factories'; diff --git a/yarn.lock b/yarn.lock index 0d08a88fdc..1c20a4ec8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1141,7 +1141,15 @@ dependencies: lodash.mergewith "^4.6.2" -"@grpc/grpc-js@^1.8.7", "@grpc/grpc-js@~1.8.7": +"@grpc/grpc-js@^1.8.13": + version "1.8.13" + resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.13.tgz#e775685962909b76f8d4b813833c3d123867165b" + integrity sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + +"@grpc/grpc-js@~1.8.7": version "1.8.7" resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.7.tgz#2154fc0134462ad45f4134e8b54682a25ed05956" integrity sha512-dRAWjRFN1Zy9mzPNLkFFIWT8T6C9euwluzCHZUKuhC+Bk3MayNPcpgDRyG+sg+n2sitEUySKxUynirVpu9ItKw==