Page MenuHomePhabricator

D11675.id39203.diff
No OneTemporary

D11675.id39203.diff

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<FarcasterUser>,
+next: {
- +cursor: string,
+ +cursor: ?string,
},
},
};
@@ -48,35 +50,44 @@
// We're using the term "friend" for a bidirectional follow
async fetchFriendFIDs(fid: string): Promise<string[]> {
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;
}
}

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 29, 8:16 PM (21 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2597840
Default Alt Text
D11675.id39203.diff (2 KB)

Event Timeline