diff --git a/lib/utils/neynar-client.js b/lib/utils/neynar-client.js --- a/lib/utils/neynar-client.js +++ b/lib/utils/neynar-client.js @@ -2,6 +2,8 @@ import invariant from 'invariant'; +import { getMessageForException } from './errors.js'; + type FarcasterUser = { +fid: number, +viewerContext: { @@ -14,7 +16,7 @@ +result: { +users: $ReadOnlyArray, +next: { - +cursor: string, + +cursor: ?string, }, }, }; @@ -48,35 +50,44 @@ // We're using the term "friend" for a bidirectional follow async fetchFriendFIDs(fid: string): Promise { const fids = []; - const params: { [string]: string } = { - fid, - viewerFid: fid, - limit: fetchFollowerLimit.toString(), - }; - while (true) { + let paginationCursor = null; + + do { + const params: { [string]: string } = { + fid, + viewerFid: fid, + limit: fetchFollowerLimit.toString(), + ...(paginationCursor ? { cursor: paginationCursor } : null), + }; + const url = getNeynarURL('1', 'followers', params); - const response = await fetch(url, { - method: 'GET', - headers: { - Accept: 'application/json', - api_key: this.apiKey, - }, - }); - const json: FetchFollowersResponse = await response.json(); - const { users } = json.result; - for (const user of users) { - if (!user.viewerContext.following) { - continue; + + try { + const response = await fetch(url, { + method: 'GET', + headers: { + Accept: 'application/json', + api_key: this.apiKey, + }, + }); + + const json: FetchFollowersResponse = await response.json(); + const { users } = json.result; + + for (const user of users) { + if (user.viewerContext.following) { + fids.push(user.fid.toString()); + } } - fids.push(user.fid.toString()); - } - if (users.length < fetchFollowerLimit) { - return fids; + + paginationCursor = json.result.next.cursor; + } catch (error) { + console.log('Failed to fetch friend FIDs:', error); + throw new Error(getMessageForException(error) ?? 'unknown'); } - params.cursor = json.result.next.cursor; - } - // eslint-disable-next-line no-unreachable - throw new Error('should not get here'); + } while (paginationCursor); + + return fids; } }