diff --git a/lib/shared/dm-ops/add-members-spec.js b/lib/shared/dm-ops/add-members-spec.js --- a/lib/shared/dm-ops/add-members-spec.js +++ b/lib/shared/dm-ops/add-members-spec.js @@ -8,7 +8,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMAddMembersOperation } from '../../types/dm-ops.js'; +import { + type DMAddMembersOperation, + dmAddMembersOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import type { RawMessageInfo } from '../../types/message-types.js'; import type { AddMembersMessageData } from '../../types/messages/add-members.js'; @@ -166,6 +169,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmAddMembersOperationValidator, }); export { diff --git a/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js b/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js --- a/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js +++ b/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js @@ -7,7 +7,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMAddViewerToThreadMembersOperation } from '../../types/dm-ops.js'; +import { + type DMAddViewerToThreadMembersOperation, + dmAddViewerToThreadMembersValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import type { RawMessageInfo } from '../../types/message-types.js'; import { messageTruncationStatus } from '../../types/message-types.js'; @@ -157,6 +160,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmAddViewerToThreadMembersValidator, }); export { diff --git a/lib/shared/dm-ops/change-thread-read-status-spec.js b/lib/shared/dm-ops/change-thread-read-status-spec.js --- a/lib/shared/dm-ops/change-thread-read-status-spec.js +++ b/lib/shared/dm-ops/change-thread-read-status-spec.js @@ -6,8 +6,11 @@ import type { DMOperationSpec, ProcessDMOperationUtilities, -} from './dm-op-spec'; -import type { DMChangeThreadReadStatusOperation } from '../../types/dm-ops'; +} from './dm-op-spec.js'; +import { + type DMChangeThreadReadStatusOperation, + dmChangeThreadReadStatusOperationValidator, +} from '../../types/dm-ops.js'; import { updateTypes } from '../../types/update-types-enum.js'; const changeThreadReadStatusSpec: DMOperationSpec = @@ -72,6 +75,7 @@ return { isProcessingPossible: true }; }, supportsAutoRetry: true, + operationValidator: dmChangeThreadReadStatusOperationValidator, }); export { changeThreadReadStatusSpec }; diff --git a/lib/shared/dm-ops/change-thread-settings-spec.js b/lib/shared/dm-ops/change-thread-settings-spec.js --- a/lib/shared/dm-ops/change-thread-settings-spec.js +++ b/lib/shared/dm-ops/change-thread-settings-spec.js @@ -8,10 +8,11 @@ ProcessDMOperationUtilities, ProcessingPossibilityCheckResult, } from './dm-op-spec.js'; -import type { - DMBlobOperation, - DMChangeThreadSettingsOperation, - DMThreadSettingsChanges, +import { + type DMBlobOperation, + type DMChangeThreadSettingsOperation, + type DMThreadSettingsChanges, + dmChangeThreadSettingsOperationValidator, } from '../../types/dm-ops.js'; import type { RawMessageInfo } from '../../types/message-types'; import { messageTypes } from '../../types/message-types-enum.js'; @@ -246,6 +247,7 @@ return { isProcessingPossible: true }; }, supportsAutoRetry: true, + operationValidator: dmChangeThreadSettingsOperationValidator, }); export { changeThreadSettingsSpec, createChangeSettingsMessageDatasAndUpdate }; diff --git a/lib/shared/dm-ops/change-thread-subscription.js b/lib/shared/dm-ops/change-thread-subscription.js --- a/lib/shared/dm-ops/change-thread-subscription.js +++ b/lib/shared/dm-ops/change-thread-subscription.js @@ -7,7 +7,10 @@ ProcessDMOperationUtilities, DMOperationSpec, } from './dm-op-spec.js'; -import type { DMChangeThreadSubscriptionOperation } from '../../types/dm-ops.js'; +import { + type DMChangeThreadSubscriptionOperation, + dmChangeThreadSubscriptionOperationValidator, +} from '../../types/dm-ops.js'; import { updateTypes } from '../../types/update-types-enum.js'; import type { ClientUpdateInfo } from '../../types/update-types.js'; @@ -108,6 +111,7 @@ return { isProcessingPossible: true }; }, supportsAutoRetry: true, + operationValidator: dmChangeThreadSubscriptionOperationValidator, }); export { changeThreadSubscriptionSpec }; diff --git a/lib/shared/dm-ops/create-entry-spec.js b/lib/shared/dm-ops/create-entry-spec.js --- a/lib/shared/dm-ops/create-entry-spec.js +++ b/lib/shared/dm-ops/create-entry-spec.js @@ -6,7 +6,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMCreateEntryOperation } from '../../types/dm-ops.js'; +import { + type DMCreateEntryOperation, + dmCreateEntryOperationValidator, +} from '../../types/dm-ops.js'; import type { ThickRawEntryInfo } from '../../types/entry-types.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { updateTypes } from '../../types/update-types-enum.js'; @@ -103,6 +106,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmCreateEntryOperationValidator, }); export { createEntrySpec }; diff --git a/lib/shared/dm-ops/create-sidebar-spec.js b/lib/shared/dm-ops/create-sidebar-spec.js --- a/lib/shared/dm-ops/create-sidebar-spec.js +++ b/lib/shared/dm-ops/create-sidebar-spec.js @@ -7,7 +7,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMCreateSidebarOperation } from '../../types/dm-ops.js'; +import { + type DMCreateSidebarOperation, + dmCreateSidebarOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { type RawMessageInfo, @@ -251,6 +254,7 @@ return { isProcessingPossible: true }; }, supportsAutoRetry: true, + operationValidator: dmCreateSidebarOperationValidator, }); export { createSidebarSpec }; diff --git a/lib/shared/dm-ops/create-thread-spec.js b/lib/shared/dm-ops/create-thread-spec.js --- a/lib/shared/dm-ops/create-thread-spec.js +++ b/lib/shared/dm-ops/create-thread-spec.js @@ -14,9 +14,10 @@ getThickThreadRolePermissionsBlob, makePermissionsForChildrenBlob, } from '../../permissions/thread-permissions.js'; -import type { - CreateThickRawThreadInfoInput, - DMCreateThreadOperation, +import { + type CreateThickRawThreadInfoInput, + type DMCreateThreadOperation, + dmCreateThreadOperationValidator, } from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { messageTruncationStatus } from '../../types/message-types.js'; @@ -309,6 +310,7 @@ return { isProcessingPossible: true }; }, supportsAutoRetry: true, + operationValidator: dmCreateThreadOperationValidator, }); export { diff --git a/lib/shared/dm-ops/delete-entry-spec.js b/lib/shared/dm-ops/delete-entry-spec.js --- a/lib/shared/dm-ops/delete-entry-spec.js +++ b/lib/shared/dm-ops/delete-entry-spec.js @@ -7,7 +7,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMDeleteEntryOperation } from '../../types/dm-ops.js'; +import { + type DMDeleteEntryOperation, + dmDeleteEntryOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { updateTypes } from '../../types/update-types-enum.js'; import type { EntryUpdateInfo } from '../../types/update-types.js'; @@ -116,6 +119,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmDeleteEntryOperationValidator, }); export { deleteEntrySpec }; diff --git a/lib/shared/dm-ops/dm-op-spec.js b/lib/shared/dm-ops/dm-op-spec.js --- a/lib/shared/dm-ops/dm-op-spec.js +++ b/lib/shared/dm-ops/dm-op-spec.js @@ -1,5 +1,7 @@ // @flow +import type { TInterface } from 'tcomb'; + import type { DMOperation, DMOperationResult } from '../../types/dm-ops.js'; import type { RawEntryInfos } from '../../types/entry-types.js'; import type { UserIdentitiesResponse } from '../../types/identity-service-types.js'; @@ -44,4 +46,5 @@ utilities: ProcessDMOperationUtilities, ) => Promise, +supportsAutoRetry: boolean, + +operationValidator: TInterface, }; diff --git a/lib/shared/dm-ops/edit-entry-spec.js b/lib/shared/dm-ops/edit-entry-spec.js --- a/lib/shared/dm-ops/edit-entry-spec.js +++ b/lib/shared/dm-ops/edit-entry-spec.js @@ -7,7 +7,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMEditEntryOperation } from '../../types/dm-ops.js'; +import { + type DMEditEntryOperation, + dmEditEntryOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { updateTypes } from '../../types/update-types-enum.js'; import type { EntryUpdateInfo } from '../../types/update-types.js'; @@ -117,6 +120,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmEditEntryOperationValidator, }); export { editEntrySpec }; diff --git a/lib/shared/dm-ops/join-thread-spec.js b/lib/shared/dm-ops/join-thread-spec.js --- a/lib/shared/dm-ops/join-thread-spec.js +++ b/lib/shared/dm-ops/join-thread-spec.js @@ -11,7 +11,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMJoinThreadOperation } from '../../types/dm-ops.js'; +import { + type DMJoinThreadOperation, + dmJoinThreadOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { messageTruncationStatus, @@ -206,6 +209,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmJoinThreadOperationValidator, }); export { joinThreadSpec }; diff --git a/lib/shared/dm-ops/leave-thread-spec.js b/lib/shared/dm-ops/leave-thread-spec.js --- a/lib/shared/dm-ops/leave-thread-spec.js +++ b/lib/shared/dm-ops/leave-thread-spec.js @@ -8,7 +8,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMLeaveThreadOperation } from '../../types/dm-ops.js'; +import { + type DMLeaveThreadOperation, + dmLeaveThreadOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import type { ThickRawThreadInfo } from '../../types/minimally-encoded-thread-permissions-types.js'; import { minimallyEncodeThreadCurrentUserInfo } from '../../types/minimally-encoded-thread-permissions-types.js'; @@ -192,6 +195,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmLeaveThreadOperationValidator, }); export { leaveThreadSpec }; diff --git a/lib/shared/dm-ops/process-dm-ops.js b/lib/shared/dm-ops/process-dm-ops.js --- a/lib/shared/dm-ops/process-dm-ops.js +++ b/lib/shared/dm-ops/process-dm-ops.js @@ -147,6 +147,11 @@ return; } + if (!dmOpSpecs[dmOp.type].operationValidator.is(dmOp)) { + console.log(`Ignoring ${dmOp.type} operation because it is invalid`); + return; + } + const [messageIDConflictCheckResult, processingCheckResult] = await Promise.all([ checkMessageIDConflict(dmOp, utilities), diff --git a/lib/shared/dm-ops/remove-members-spec.js b/lib/shared/dm-ops/remove-members-spec.js --- a/lib/shared/dm-ops/remove-members-spec.js +++ b/lib/shared/dm-ops/remove-members-spec.js @@ -7,7 +7,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMRemoveMembersOperation } from '../../types/dm-ops.js'; +import { + type DMRemoveMembersOperation, + dmRemoveMembersOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { threadTypes } from '../../types/thread-types-enum.js'; import { updateTypes } from '../../types/update-types-enum.js'; @@ -129,6 +132,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmRemoveMembersOperationValidator, }); export { removeMembersSpec }; diff --git a/lib/shared/dm-ops/send-edit-message-spec.js b/lib/shared/dm-ops/send-edit-message-spec.js --- a/lib/shared/dm-ops/send-edit-message-spec.js +++ b/lib/shared/dm-ops/send-edit-message-spec.js @@ -4,7 +4,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMSendEditMessageOperation } from '../../types/dm-ops.js'; +import { + type DMSendEditMessageOperation, + dmSendEditMessageOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { rawMessageInfoFromMessageData } from '../message-utils.js'; @@ -68,6 +71,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmSendEditMessageOperationValidator, }); export { sendEditMessageSpec }; diff --git a/lib/shared/dm-ops/send-multimedia-message-spec.js b/lib/shared/dm-ops/send-multimedia-message-spec.js --- a/lib/shared/dm-ops/send-multimedia-message-spec.js +++ b/lib/shared/dm-ops/send-multimedia-message-spec.js @@ -8,9 +8,10 @@ encryptedMediaBlobURI, encryptedVideoThumbnailBlobURI, } from '../../media/media-utils.js'; -import type { - DMSendMultimediaMessageOperation, - DMBlobOperation, +import { + type DMSendMultimediaMessageOperation, + type DMBlobOperation, + dmSendMultimediaMessageOperationValidator, } from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import type { ClientUpdateInfo } from '../../types/update-types.js'; @@ -101,6 +102,7 @@ return { isProcessingPossible: true }; }, supportsAutoRetry: false, + operationValidator: dmSendMultimediaMessageOperationValidator, }); export { sendMultimediaMessageSpec }; diff --git a/lib/shared/dm-ops/send-reaction-message-spec.js b/lib/shared/dm-ops/send-reaction-message-spec.js --- a/lib/shared/dm-ops/send-reaction-message-spec.js +++ b/lib/shared/dm-ops/send-reaction-message-spec.js @@ -4,7 +4,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMSendReactionMessageOperation } from '../../types/dm-ops.js'; +import { + type DMSendReactionMessageOperation, + dmSendReactionMessageOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { rawMessageInfoFromMessageData } from '../message-utils.js'; @@ -76,6 +79,7 @@ }; }, supportsAutoRetry: true, + operationValidator: dmSendReactionMessageOperationValidator, }); export { sendReactionMessageSpec }; diff --git a/lib/shared/dm-ops/send-text-message-spec.js b/lib/shared/dm-ops/send-text-message-spec.js --- a/lib/shared/dm-ops/send-text-message-spec.js +++ b/lib/shared/dm-ops/send-text-message-spec.js @@ -4,7 +4,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMSendTextMessageOperation } from '../../types/dm-ops.js'; +import { + type DMSendTextMessageOperation, + dmSendTextMessageOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import type { ClientUpdateInfo } from '../../types/update-types.js'; import { rawMessageInfoFromMessageData } from '../message-utils.js'; @@ -62,6 +65,7 @@ return { isProcessingPossible: true }; }, supportsAutoRetry: false, + operationValidator: dmSendTextMessageOperationValidator, }); export { sendTextMessageSpec }; diff --git a/lib/shared/dm-ops/update-relationship-spec.js b/lib/shared/dm-ops/update-relationship-spec.js --- a/lib/shared/dm-ops/update-relationship-spec.js +++ b/lib/shared/dm-ops/update-relationship-spec.js @@ -4,7 +4,10 @@ DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMUpdateRelationshipOperation } from '../../types/dm-ops.js'; +import { + type DMUpdateRelationshipOperation, + dmUpdateRelationshipOperationValidator, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import { rawMessageInfoFromMessageData } from '../message-utils.js'; @@ -105,6 +108,7 @@ } }, supportsAutoRetry: true, + operationValidator: dmUpdateRelationshipOperationValidator, }); export { updateRelationshipSpec };