diff --git a/lib/shared/dm-ops/dm-op-utils.js b/lib/shared/dm-ops/dm-op-utils.js --- a/lib/shared/dm-ops/dm-op-utils.js +++ b/lib/shared/dm-ops/dm-op-utils.js @@ -2,6 +2,7 @@ import uuid from 'uuid'; +import type { MessageSourceMetadata } from '../../types/db-ops-types.js'; import type { DMOperation } from '../../types/dm-ops.js'; import { outboundP2PMessageStatuses, @@ -44,7 +45,15 @@ return outboundP2PMessages; } -export type DMOperationSpecification = { +export const dmOperationSpecificationTypes = Object.freeze({ + OUTBOUND: 'OutboundDMOperationSpecification', + INBOUND: 'InboundDMOperationSpecification', +}); + +// The operation generated on the sending client, causes changes to +// the state and broadcasting information to peers. +export type OutboundDMOperationSpecification = { + +type: 'OutboundDMOperationSpecification', +op: DMOperation, +supportsAutoRetry: boolean, +recipients: @@ -52,8 +61,20 @@ | { +type: 'some_users', +userIDs: $ReadOnlyArray }, }; +// The operation received from other peers, causes changes to +// the state and after processing, sends confirmation to the sender. +export type InboundDMOperationSpecification = { + +type: 'InboundDMOperationSpecification', + +op: DMOperation, + +metadata: ?MessageSourceMetadata, +}; + +export type DMOperationSpecification = + | OutboundDMOperationSpecification + | InboundDMOperationSpecification; + async function createMessagesToPeersFromDMOp( - operation: DMOperationSpecification, + operation: OutboundDMOperationSpecification, allPeerUserIDAndDeviceIDs: $ReadOnlyArray<{ +userID: string, +deviceID: string, 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,7 +5,7 @@ import uuid from 'uuid'; import { dmOpSpecs } from './dm-op-specs.js'; -import type { DMOperationSpecification } from './dm-op-utils.js'; +import type { OutboundDMOperationSpecification } 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'; @@ -156,13 +156,13 @@ } function useProcessAndSendDMOperation(): ( - dmOperationSpecification: DMOperationSpecification, + dmOperationSpecification: OutboundDMOperationSpecification, ) => Promise { const processDMOps = useProcessDMOperation(); const { sendDMOperation } = usePeerToPeerCommunication(); return React.useCallback( - async (dmOperationSpecification: DMOperationSpecification) => { + async (dmOperationSpecification: OutboundDMOperationSpecification) => { await processDMOps(dmOperationSpecification.op); await sendDMOperation(dmOperationSpecification); }, diff --git a/lib/tunnelbroker/peer-to-peer-context.js b/lib/tunnelbroker/peer-to-peer-context.js --- a/lib/tunnelbroker/peer-to-peer-context.js +++ b/lib/tunnelbroker/peer-to-peer-context.js @@ -12,7 +12,7 @@ import { getAllPeerUserIDAndDeviceIDs } from '../selectors/user-selectors.js'; import { createMessagesToPeersFromDMOp, - type DMOperationSpecification, + type OutboundDMOperationSpecification, } from '../shared/dm-ops/dm-op-utils.js'; import { type AuthMetadata, @@ -38,7 +38,7 @@ outboundMessageIDs: ?$ReadOnlyArray, dmOpID: ?string, ) => void, - +sendDMOperation: (op: DMOperationSpecification) => Promise, + +sendDMOperation: (op: OutboundDMOperationSpecification) => Promise, +broadcastEphemeralMessage: ( contentPayload: string, recipients: $ReadOnlyArray<{ +userID: string, +deviceID: string }>, @@ -179,7 +179,7 @@ const currentUserInfo = useSelector(state => state.currentUserInfo); const sendDMOperation = React.useCallback( - async (op: DMOperationSpecification) => { + async (op: OutboundDMOperationSpecification) => { const dmOpID = uuid.v4(); const promise = new Promise((resolve, reject) => { dmOpsSendingPromiseResolvers.current.set(dmOpID, { resolve, reject });