diff --git a/lib/shared/farcaster/farcaster-messages-types.js b/lib/shared/farcaster/farcaster-messages-types.js --- a/lib/shared/farcaster/farcaster-messages-types.js +++ b/lib/shared/farcaster/farcaster-messages-types.js @@ -11,7 +11,7 @@ FarcasterDCUserBaseValidator, farcasterMessageUserContextValidator, } from './farcaster-user-types.js'; -import { tShapeInexact } from '../../utils/validation-utils.js'; +import { tShapeInexact, tFarcasterID } from '../../utils/validation-utils.js'; export const farcasterMessageTypes = Object.freeze({ TEXT: 'text', @@ -111,7 +111,7 @@ }; const farcasterMessageValidator: TInterface = tShapeInexact({ conversationId: t.String, - senderFid: t.Number, + senderFid: tFarcasterID, messageId: t.String, serverTimestamp: t.Number, type: t.enums.of([ diff --git a/lib/shared/farcaster/farcaster-user-types.js b/lib/shared/farcaster/farcaster-user-types.js --- a/lib/shared/farcaster/farcaster-user-types.js +++ b/lib/shared/farcaster/farcaster-user-types.js @@ -3,7 +3,7 @@ import type { TInterface } from 'tcomb'; import t from 'tcomb'; -import { tShapeInexact } from '../../utils/validation-utils.js'; +import { tShapeInexact, tFarcasterID } from '../../utils/validation-utils.js'; type FarcasterProfilePicture = { +url: string, @@ -25,7 +25,7 @@ }; const farcasterMessageUserContextValidator: TInterface = tShapeInexact({ - fid: t.Number, + fid: tFarcasterID, username: t.maybe(t.String), displayName: t.String, pfp: t.maybe(farcasterProfilePictureValidator), @@ -40,7 +40,7 @@ }; const FarcasterDCUserBaseValidator: TInterface = tShapeInexact({ - fid: t.Number, + fid: tFarcasterID, username: t.maybe(t.String), displayName: t.String, pfp: t.maybe(farcasterProfilePictureValidator), @@ -77,7 +77,7 @@ ... }; const farcasterDCUserValidator: TInterface = tShapeInexact({ - fid: t.Number, + fid: tFarcasterID, username: t.maybe(t.String), displayName: t.String, pfp: t.maybe(farcasterProfilePictureValidator), diff --git a/lib/utils/conversion-utils.js b/lib/utils/conversion-utils.js --- a/lib/utils/conversion-utils.js +++ b/lib/utils/conversion-utils.js @@ -5,7 +5,12 @@ import type { TInterface, TType } from 'tcomb'; import { convertIDToNewSchema } from './migration-utils.js'; -import { assertWithValidator, tID, tUserID } from './validation-utils.js'; +import { + assertWithValidator, + tID, + tUserID, + tFarcasterID, +} from './validation-utils.js'; import { getPendingThreadID, parsePendingThreadID, @@ -61,14 +66,29 @@ outputValidator: TType, data: T, ): $ReadOnlyArray { - const result = new Set(); - const conversionFunction = (id: string) => { + return extractIDsFromPayload(outputValidator, data, tUserID); +} + +function extractFarcasterIDsFromPayload( + outputValidator: TType, + data: T, +): $ReadOnlyArray { + return extractIDsFromPayload(outputValidator, data, tFarcasterID); +} + +function extractIDsFromPayload( + outputValidator: TType, + data: T, + extractedType: TType, +): $ReadOnlyArray { + const result = new Set(); + const conversionFunction = (id: U) => { result.add(id); return id; }; try { - convertObject(outputValidator, data, [tUserID], conversionFunction); + convertObject(outputValidator, data, [extractedType], conversionFunction); } catch {} return [...result]; @@ -192,6 +212,7 @@ convertClientIDsToServerIDs, convertServerIDsToClientIDs, extractUserIDsFromPayload, + extractFarcasterIDsFromPayload, convertObject, convertObjToBytes, convertBytesToObj, diff --git a/lib/utils/validation-utils.js b/lib/utils/validation-utils.js --- a/lib/utils/validation-utils.js +++ b/lib/utils/validation-utils.js @@ -96,6 +96,10 @@ t.String, (id: string) => !!id, ); +const tFarcasterID: TRefinement = t.refinement( + t.Number, + (id: number) => !!id, +); const tMediaMessagePhoto: TInterface = tShape({ type: tString('photo'), @@ -172,6 +176,7 @@ tOldValidUsername, tID, tUserID, + tFarcasterID, tMediaMessagePhoto, tMediaMessageVideo, tMediaMessageMedia,