diff --git a/lib/permissions/minimally-encoded-thread-permissions-validators.js b/lib/permissions/minimally-encoded-thread-permissions-validators.js --- a/lib/permissions/minimally-encoded-thread-permissions-validators.js +++ b/lib/permissions/minimally-encoded-thread-permissions-validators.js @@ -8,7 +8,7 @@ } from './minimally-encoded-thread-permissions.js'; import { clientAvatarValidator } from '../types/avatar-types.js'; import type { - MinimallyEncodedMemberInfo, + MemberInfo, RawThreadInfo, RelativeMemberInfo, MinimallyEncodedThreadCurrentUserInfo, @@ -40,16 +40,15 @@ permissions: tHexEncodedPermissionsBitmask, }); -const minimallyEncodedMemberInfoValidator: TInterface = - tShape({ - ...legacyMemberInfoValidator.meta.props, - minimallyEncoded: tBool(true), - permissions: tHexEncodedPermissionsBitmask, - }); +const MemberInfoValidator: TInterface = tShape({ + ...legacyMemberInfoValidator.meta.props, + minimallyEncoded: tBool(true), + permissions: tHexEncodedPermissionsBitmask, +}); const minimallyEncodedRelativeMemberInfoValidator: TInterface = tShape({ - ...minimallyEncodedMemberInfoValidator.meta.props, + ...MemberInfoValidator.meta.props, username: t.maybe(t.String), isViewer: t.Boolean, }); @@ -80,7 +79,7 @@ tShape({ ...legacyRawThreadInfoValidator.meta.props, minimallyEncoded: tBool(true), - members: t.list(minimallyEncodedMemberInfoValidator), + members: t.list(MemberInfoValidator), roles: t.dict(tID, minimallyEncodedRoleInfoValidator), currentUser: minimallyEncodedThreadCurrentUserInfoValidator, }); @@ -95,7 +94,7 @@ export { minimallyEncodedRoleInfoValidator, minimallyEncodedThreadCurrentUserInfoValidator, - minimallyEncodedMemberInfoValidator, + MemberInfoValidator, minimallyEncodedRelativeMemberInfoValidator, minimallyEncodedThreadInfoValidator, minimallyEncodedRawThreadInfoValidator, diff --git a/lib/permissions/minimally-encoded-thread-permissions.test.js b/lib/permissions/minimally-encoded-thread-permissions.test.js --- a/lib/permissions/minimally-encoded-thread-permissions.test.js +++ b/lib/permissions/minimally-encoded-thread-permissions.test.js @@ -6,7 +6,7 @@ expectedDecodedExampleRawThreadInfoA, } from './minimally-encoded-thread-permissions-test-data.js'; import { - minimallyEncodedMemberInfoValidator, + MemberInfoValidator, minimallyEncodedRawThreadInfoValidator, minimallyEncodedRoleInfoValidator, minimallyEncodedThreadCurrentUserInfoValidator, @@ -446,7 +446,7 @@ describe('minimallyEncodedMemberInfoValidator', () => { it('should validate correctly formed MinimallyEncodedMemberInfo', () => { expect( - minimallyEncodedMemberInfoValidator.is({ + MemberInfoValidator.is({ minimallyEncoded: true, id: 'memberID', permissions: 'ABCDEF', @@ -455,7 +455,7 @@ ).toBe(true); expect( - minimallyEncodedMemberInfoValidator.is({ + MemberInfoValidator.is({ minimallyEncoded: true, id: 'memberID', permissions: '01b', @@ -466,7 +466,7 @@ it('should NOT validate malformed MinimallyEncodedMemberInfo', () => { expect( - minimallyEncodedMemberInfoValidator.is({ + MemberInfoValidator.is({ minimallyEncoded: true, id: 'memberID', permissions: 'INVALID', @@ -475,7 +475,7 @@ ).toBe(false); expect( - minimallyEncodedMemberInfoValidator.is({ + MemberInfoValidator.is({ minimallyEncoded: true, id: 'memberID', permissions: 100, diff --git a/lib/shared/thread-utils.js b/lib/shared/thread-utils.js --- a/lib/shared/thread-utils.js +++ b/lib/shared/thread-utils.js @@ -58,12 +58,12 @@ type ComposableMessageInfo, } from '../types/message-types.js'; import type { - RelativeMemberInfo, RawThreadInfo, + RelativeMemberInfo, + MemberInfo, MinimallyEncodedThreadCurrentUserInfo, RoleInfo, ThreadInfo, - MinimallyEncodedMemberInfo, } from '../types/minimally-encoded-thread-permissions-types.js'; import { decodeMinimallyEncodedRoleInfo, @@ -220,7 +220,7 @@ } function threadActualMembers( - memberInfos: $ReadOnlyArray, + memberInfos: $ReadOnlyArray, ): $ReadOnlyArray { return memberInfos .filter(memberInfo => memberInfo.role) @@ -228,7 +228,7 @@ } function threadOtherMembers< - T: LegacyMemberInfo | MinimallyEncodedMemberInfo | RelativeMemberInfo, + T: LegacyMemberInfo | MemberInfo | RelativeMemberInfo, >(memberInfos: $ReadOnlyArray, viewerID: ?string): $ReadOnlyArray { return memberInfos.filter( memberInfo => memberInfo.role && memberInfo.id !== viewerID, @@ -1033,7 +1033,7 @@ memberInfo: | RelativeMemberInfo | LegacyMemberInfo - | MinimallyEncodedMemberInfo + | MemberInfo | ServerMemberInfo, ): boolean { if (memberInfo.minimallyEncoded) { diff --git a/lib/types/minimally-encoded-thread-permissions-types.js b/lib/types/minimally-encoded-thread-permissions-types.js --- a/lib/types/minimally-encoded-thread-permissions-types.js +++ b/lib/types/minimally-encoded-thread-permissions-types.js @@ -81,7 +81,7 @@ }; }; -export type MinimallyEncodedMemberInfo = $ReadOnly<{ +export type MemberInfo = $ReadOnly<{ ...LegacyMemberInfo, +minimallyEncoded: true, +permissions: string, @@ -89,7 +89,7 @@ const minimallyEncodeMemberInfo = ( memberInfo: LegacyMemberInfo, -): MinimallyEncodedMemberInfo => { +): MemberInfo => { invariant( !('minimallyEncoded' in memberInfo), 'memberInfo is already minimally encoded.', @@ -102,7 +102,7 @@ }; const decodeMinimallyEncodedMemberInfo = ( - minimallyEncodedMemberInfo: MinimallyEncodedMemberInfo, + minimallyEncodedMemberInfo: MemberInfo, ): LegacyMemberInfo => { const { minimallyEncoded, ...rest } = minimallyEncodedMemberInfo; return { @@ -114,7 +114,7 @@ }; export type RelativeMemberInfo = $ReadOnly<{ - ...MinimallyEncodedMemberInfo, + ...MemberInfo, +username: ?string, +isViewer: boolean, }>; @@ -122,7 +122,7 @@ export type RawThreadInfo = $ReadOnly<{ ...LegacyRawThreadInfo, +minimallyEncoded: true, - +members: $ReadOnlyArray, + +members: $ReadOnlyArray, +roles: { +[id: string]: RoleInfo }, +currentUser: MinimallyEncodedThreadCurrentUserInfo, }>; diff --git a/lib/utils/thread-ops-utils.js b/lib/utils/thread-ops-utils.js --- a/lib/utils/thread-ops-utils.js +++ b/lib/utils/thread-ops-utils.js @@ -3,12 +3,12 @@ import invariant from 'invariant'; import { - minimallyEncodedMemberInfoValidator, + MemberInfoValidator, minimallyEncodedRoleInfoValidator, minimallyEncodedThreadCurrentUserInfoValidator, } from '../permissions/minimally-encoded-thread-permissions-validators.js'; import type { - MinimallyEncodedMemberInfo, + MemberInfo, RawThreadInfo, RoleInfo, } from '../types/minimally-encoded-thread-permissions-types.js'; @@ -46,17 +46,18 @@ ): RawThreadInfo { // 1. Validate and potentially minimally encode `rawMembers`. const rawMembers = JSON.parse(clientDBThreadInfo.members); - const minimallyEncodedMembers: $ReadOnlyArray = - rawMembers.map(rawMember => { + const minimallyEncodedMembers: $ReadOnlyArray = rawMembers.map( + rawMember => { invariant( - minimallyEncodedMemberInfoValidator.is(rawMember) || + MemberInfoValidator.is(rawMember) || legacyMemberInfoValidator.is(rawMember), 'rawMember must be valid [MinimallyEncoded/Legacy]MemberInfo', ); return rawMember.minimallyEncoded ? rawMember : minimallyEncodeMemberInfo(rawMember); - }); + }, + ); // 2. Validate and potentially minimally encode `rawRoles`. const rawRoles = JSON.parse(clientDBThreadInfo.roles);