diff --git a/lib/shared/dm-ops/dm-ops-queue-handler.react.js b/lib/shared/dm-ops/dm-ops-queue-handler.react.js --- a/lib/shared/dm-ops/dm-ops-queue-handler.react.js +++ b/lib/shared/dm-ops/dm-ops-queue-handler.react.js @@ -2,6 +2,7 @@ import * as React from 'react'; +import { dmOperationSpecificationTypes } from './dm-op-utils.js'; import { useProcessDMOperation } from './process-dm-ops.js'; import { threadInfoSelector } from '../../selectors/thread-selectors.js'; import { @@ -59,7 +60,16 @@ continue; } for (const dmOp of queuedOperations[threadID]) { - void processDMOperation(dmOp.operation); + void processDMOperation({ + // This is `INBOUND` because we assume that when generating + // `dmOperationSpecificationTypes.OUBOUND` it should be possible + // to be processed and never queued up. + type: dmOperationSpecificationTypes.INBOUND, + op: dmOp.operation, + // There is no metadata, because messages were confirmed when + // adding to the queue. + metadata: null, + }); } dispatch({ 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 @@ -5,15 +5,16 @@ import uuid from 'uuid'; import { dmOpSpecs } from './dm-op-specs.js'; -import type { OutboundDMOperationSpecification } from './dm-op-utils.js'; +import type { + OutboundDMOperationSpecification, + DMOperationSpecification, +} from './dm-op-utils.js'; import { useLoggedInUserInfo } from '../../hooks/account-hooks.js'; import { useGetLatestMessageEdit } from '../../hooks/latest-message-edit.js'; import { useDispatchWithMessageSource } from '../../hooks/ops-hooks.js'; import { mergeUpdatesWithMessageInfos } from '../../reducers/message-reducer.js'; import { usePeerToPeerCommunication } from '../../tunnelbroker/peer-to-peer-context.js'; -import type { MessageSourceMetadata } from '../../types/db-ops-types.js'; import { - type DMOperation, processDMOpsActionType, queueDMOpsActionType, } from '../../types/dm-ops.js'; @@ -26,8 +27,7 @@ import { updateSpecs } from '../updates/update-specs.js'; function useProcessDMOperation(): ( - dmOp: DMOperation, - metadata: ?MessageSourceMetadata, + dmOperationSpecification: DMOperationSpecification, ) => Promise { const fetchMessage = useGetLatestMessageEdit(); const threadInfos = useSelector(state => state.threadStore.threadInfos); @@ -44,11 +44,13 @@ const loggedInUserInfo = useLoggedInUserInfo(); const viewerID = loggedInUserInfo?.id; return React.useCallback( - async (dmOp: DMOperation, metadata: ?MessageSourceMetadata) => { + async (dmOperationSpecification: DMOperationSpecification) => { if (!viewerID) { console.log('ignored DMOperation because logged out'); return; } + + const { op: dmOp, metadata } = dmOperationSpecification; const processingCheckResult = dmOpSpecs[dmOp.type].canBeProcessed( dmOp, viewerID, @@ -163,7 +165,7 @@ return React.useCallback( async (dmOperationSpecification: OutboundDMOperationSpecification) => { - await processDMOps(dmOperationSpecification.op); + await processDMOps(dmOperationSpecification); await sendDMOperation(dmOperationSpecification); }, [processDMOps, sendDMOperation], diff --git a/lib/tunnelbroker/use-peer-to-peer-message-handler.js b/lib/tunnelbroker/use-peer-to-peer-message-handler.js --- a/lib/tunnelbroker/use-peer-to-peer-message-handler.js +++ b/lib/tunnelbroker/use-peer-to-peer-message-handler.js @@ -22,6 +22,7 @@ verifyAndGetDeviceList, removeDeviceFromDeviceList, } from '../shared/device-list-utils.js'; +import { dmOperationSpecificationTypes } from '../shared/dm-ops/dm-op-utils.js'; import { useProcessDMOperation } from '../shared/dm-ops/process-dm-ops.js'; import { IdentityClientContext } from '../shared/identity-client-context.js'; import type { DeviceOlmInboundKeys } from '../types/identity-service-types.js'; @@ -121,9 +122,13 @@ userActionMessage.type === userActionsP2PMessageTypes.DM_OPERATION ) { // inbound P2P message is removed in DBOpsHandler after processing - await processDMOperation(userActionMessage.op, { - messageID, - senderDeviceID: senderInfo.deviceID, + await processDMOperation({ + type: dmOperationSpecificationTypes.INBOUND, + op: userActionMessage.op, + metadata: { + messageID, + senderDeviceID: senderInfo.deviceID, + }, }); } else if ( userActionMessage.type === userActionsP2PMessageTypes.ACCOUNT_DELETION