diff --git a/packages/status-js/src/client/community/delete_handle-channel-chat-message.ts b/packages/status-js/src/client/community/delete_handle-channel-chat-message.ts deleted file mode 100644 index 568637c..0000000 --- a/packages/status-js/src/client/community/delete_handle-channel-chat-message.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { recoverPublicKey } from '~/src/utils/recover-public-key' - -import { ApplicationMetadataMessage } from '../../../protos/application-metadata-message' -import { ChatMessage } from '../../../protos/chat-message' -import { ProtocolMessage } from '../../../protos/protocol-message' -import { payloadToId } from '../../utils/payload-to-id' -import { getChannelId } from './get-channel-id' -import { mapChatMessage } from './map-chat-message' - -import type { MessageType } from './community' -import type { WakuMessage } from 'js-waku' - -export function handleChannelChatMessage( - wakuMessage: WakuMessage -): MessageType | undefined { - if (!wakuMessage.payload) { - return - } - - if (!wakuMessage.signaturePublicKey) { - return - } - - let messageToDecode = wakuMessage.payload - let decodedProtocol - try { - decodedProtocol = ProtocolMessage.decode(messageToDecode) - if (decodedProtocol) { - messageToDecode = decodedProtocol.publicMessage - } - } catch {} - - // fixme!: remove after replacing payloadToId - if (!decodedProtocol) { - return - } - - const decodedMetadata = ApplicationMetadataMessage.decode(messageToDecode) - if (!decodedMetadata.payload) { - return - } - messageToDecode = decodedMetadata.payload - - // todo: merge and process other types of messages - if ( - decodedMetadata.type !== ApplicationMetadataMessage.Type.TYPE_CHAT_MESSAGE - ) { - return - } - - const publicKey = recoverPublicKey( - decodedMetadata.signature, - decodedMetadata.payload - ) - - const decodedPayload = ChatMessage.decode(messageToDecode) - - // fixme?: handle decodedProtocol.encryptedMessage - const messageId = payloadToId(decodedProtocol.publicMessage, publicKey) - - const channelId = getChannelId(decodedPayload.chatId) - - const message = mapChatMessage(decodedPayload, { messageId, channelId }) - - return message -} diff --git a/packages/status-js/src/client/community/fetch-channel-chat-messages.ts b/packages/status-js/src/client/community/fetch-channel-chat-messages.ts deleted file mode 100644 index b98c29a..0000000 --- a/packages/status-js/src/client/community/fetch-channel-chat-messages.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { PageDirection } from 'js-waku' - -import { handleChannelChatMessage } from './delete_handle-channel-chat-message' - -import type { MessageType } from './community' -import type { Waku } from 'js-waku' - -const CHUNK_SIZE = 50 -const PAGE_SIZE = CHUNK_SIZE - -export const fetchChannelChatMessages = async ( - waku: Waku, - symKey: Uint8Array, - contentTopic: string, - storedMessages: MessageType[], - options: { start: Date; end?: Date }, - callback: (messages: MessageType[]) => void -): Promise => { - let result: MessageType[] = [] - - const startTime = options.start - let endTime = options.end || new Date() - - if (storedMessages.length) { - const oldestMessageTime = new Date(Number(storedMessages[0].timestamp)) - - if (oldestMessageTime <= options.start) { - callback(storedMessages) - - return result - } - - if (endTime >= oldestMessageTime) { - endTime = oldestMessageTime - } - } - - const fetchedMessages = await fetchMessages( - waku, - symKey, - contentTopic, - storedMessages, - { startTime, endTime }, - callback - ) - - if (!fetchedMessages.length) { - return result - } - - result = [...fetchedMessages, ...storedMessages] - - return result -} - -export async function fetchMessages( - waku: Waku, - symKey: Uint8Array, - contentTopic: string, - storedMessages: MessageType[], - options: { - startTime: Date - endTime: Date - }, - callback: (messages: MessageType[]) => void -) { - const remainingFetchedMessages: MessageType[] = [] - let fetchedMessages: MessageType[] = [] - - await waku.store.queryHistory([contentTopic], { - timeFilter: { - startTime: options.startTime, - endTime: options.endTime, - }, - pageSize: PAGE_SIZE, - // most recent page first - pageDirection: PageDirection.BACKWARD, - decryptionKeys: [symKey], - callback: wakuMessages => { - // most recent message first - for (const wakuMessage of wakuMessages.reverse()) { - const message = handleChannelChatMessage(wakuMessage) - - if (message) { - remainingFetchedMessages.push(message) - } - } - - // todo?: remove chunking until PAGE_SIZE !== CHUNK_SIZE - while (remainingFetchedMessages.length >= CHUNK_SIZE) { - // reverse - const _chunk = remainingFetchedMessages.splice(0, CHUNK_SIZE).reverse() - const _messages = [..._chunk, ...fetchedMessages, ...storedMessages] - - callback(_messages) - - fetchedMessages = [..._chunk, ...fetchedMessages] - } - }, - }) - - if (remainingFetchedMessages.length) { - const _chunk = remainingFetchedMessages.splice(0).reverse() - const _messages = [..._chunk, ...fetchedMessages, ...storedMessages] - - callback(_messages) - - fetchedMessages = [..._chunk, ...fetchedMessages] - } - - return fetchedMessages -} diff --git a/packages/status-js/src/client/community/handle-channel-chat-message.ts b/packages/status-js/src/client/community/handle-channel-chat-message.ts deleted file mode 100644 index 4be593d..0000000 --- a/packages/status-js/src/client/community/handle-channel-chat-message.ts +++ /dev/null @@ -1,276 +0,0 @@ -// todo: merge with handle-channel-chat-message.ts -// todo?: rename to handle-message -import { bytesToHex } from 'ethereum-cryptography/utils' - -import { recoverPublicKey } from '~/src/utils/recover-public-key' - -import { ApplicationMetadataMessage } from '../../../protos/application-metadata-message' -import { - ChatMessage, - DeleteMessage, - EditMessage, -} from '../../../protos/chat-message' -import { EmojiReaction } from '../../../protos/emoji-reaction' -import { PinMessage } from '../../../protos/pin-message' -import { ProtocolMessage } from '../../../protos/protocol-message' -import { payloadToId } from '../../utils/payload-to-id' -import { getChannelId } from './get-channel-id' -import { getReactions } from './get-reactions' -import { mapChatMessage } from './map-chat-message' - -import type { MessageType } from './community' -import type { WakuMessage } from 'js-waku' - -export function handleChannelChatMessage( - wakuMessage: WakuMessage, - messages: Partial<{ [key: string]: MessageType[] }>, - accountPublicKey?: string -): MessageType[] { - let result: MessageType[] = [] - - if (!wakuMessage.payload) { - return result - } - - // todo: explain - if (!wakuMessage.signaturePublicKey) { - return result - } - - let messageToDecode = wakuMessage.payload - let decodedProtocol - - try { - decodedProtocol = ProtocolMessage.decode(wakuMessage.payload) - if (decodedProtocol) { - messageToDecode = decodedProtocol.publicMessage - } - } catch {} - - // fixme!: remove after replacing payloadToId - if (!decodedProtocol) { - return result - } - - const decodedMetadata = ApplicationMetadataMessage.decode(messageToDecode) - if (!decodedMetadata.payload) { - return result - } - messageToDecode = decodedMetadata.payload - - // todo?: - // if (!decodedMetadata.identity) { - // break - // } - - const publicKey = recoverPublicKey( - decodedMetadata.signature, - decodedMetadata.payload - ) - - // todo: merge and process other types of messages - // TODO?: ignore messages which are messageType !== COMMUNITY_CHAT - switch (decodedMetadata.type) { - case ApplicationMetadataMessage.Type.TYPE_CHAT_MESSAGE: { - const decodedPayload = ChatMessage.decode(messageToDecode) - - // fixme?: handle decodedProtocol.encryptedMessage - const messageId = payloadToId(decodedProtocol.publicMessage, publicKey) - const channelId = getChannelId(decodedPayload.chatId) - - const _messages = messages[channelId] || [] - - const message = mapChatMessage(decodedPayload, { messageId, channelId }) - - // findIndexLeft - // const index = _messages.findIndex(({ timestamp }) => { - // new Date(Number(timestamp)) > new Date(Number(message.timestamp)) - // }) - // findIndexRight - let messageIndex = _messages.length - while (messageIndex > 0) { - const _message = _messages[messageIndex - 1] - - // // already received - // if (_message.messageId === messageId) { - // messageIndex = -1 - - // break - // } - - if ( - new Date(Number(_message.timestamp)) <= - new Date(Number(message.timestamp)) - ) { - break - } - - messageIndex-- - } - - // // already received - // if (messageIndex < 0) { - // break - // } - - // replied - let responsedToMessageIndex = _messages.length - while (--responsedToMessageIndex >= 0) { - const _message = _messages[responsedToMessageIndex] - - if (_message.messageId === message.responseTo) { - break - } - } - - if (responsedToMessageIndex >= 0) { - message.responseToMessage = _messages[responsedToMessageIndex] - } - - _messages.splice(messageIndex, 0, message) - - result = _messages - - break - } - case ApplicationMetadataMessage.Type.TYPE_EDIT_MESSAGE: { - const decodedPayload = EditMessage.decode(messageToDecode) - - const messageId = decodedPayload.messageId - const channelId = getChannelId(decodedPayload.chatId) - - const _messages = messages[channelId] || [] - - // findIndexLeft - // const index = _messages.findIndex(message => message.messageId === messageId) - // findIndexRight - let index = _messages.length - while (--index >= 0) { - const _message = _messages[index] - - if (_message.messageId === messageId) { - break - } - } - - // original not found - if (index < 0) { - break - } - - const _message = _messages[index] - - // todo?: use mapChatMessage - const message = { - ..._message, - // fixme?: other fields that user can edit - text: decodedPayload.text, - } - - _messages[index] = message - - result = _messages - - break - } - case ApplicationMetadataMessage.Type.TYPE_DELETE_MESSAGE: { - const decodedPayload = DeleteMessage.decode(messageToDecode) - - const messageId = decodedPayload.messageId - const channelId = getChannelId(decodedPayload.chatId) - - const _messages = messages[channelId] || [] - - let index = _messages.length - while (--index >= 0) { - const _message = _messages[index] - - if (_message.messageId === messageId) { - break - } - } - - // original not found - if (index < 0) { - break - } - - // todo?: use delete; set to null - _messages.splice(index, 1) - - result = _messages - - break - } - case ApplicationMetadataMessage.Type.TYPE_PIN_MESSAGE: { - const decodedPayload = PinMessage.decode(messageToDecode) - - const messageId = decodedPayload.messageId - const channelId = getChannelId(decodedPayload.chatId) - - const _messages = messages[channelId] || [] - - let index = _messages.length - while (--index >= 0) { - const _message = _messages[index] - - if (_message.messageId === messageId) { - break - } - } - - // original not found - if (index < 0) { - break - } - - _messages[index].pinned = Boolean(decodedPayload.pinned) - - result = _messages - - break - } - case ApplicationMetadataMessage.Type.TYPE_EMOJI_REACTION: { - const decodedPayload = EmojiReaction.decode(messageToDecode) - - const messageId = decodedPayload.messageId - const channelId = getChannelId(decodedPayload.chatId) - - const _messages = messages[channelId] || [] - - let index = _messages.length - while (--index >= 0) { - const _message = _messages[index] - - if (_message.messageId === messageId) { - break - } - } - - // original not found - if (index < 0) { - break - } - - const _message = _messages[index] - const isMe = - accountPublicKey === `0x${bytesToHex(wakuMessage.signaturePublicKey)}` - - // fixme! - _messages[index].reactions = getReactions( - decodedPayload, - _message.reactions, - isMe - ) - - result = _messages - - break - } - - default: - break - } - - return result -} diff --git a/packages/status-js/src/client/community/handle-community.ts b/packages/status-js/src/client/community/handle-community.ts deleted file mode 100644 index e048837..0000000 --- a/packages/status-js/src/client/community/handle-community.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { ApplicationMetadataMessage } from '../../../protos/application-metadata-message' -import { ProtocolMessage } from '../../../protos/protocol-message' -import { CommunityDescription } from '../../wire/community_description' - -import type { CommunityMetadataType } from './community' -import type { WakuMessage } from 'js-waku' - -export function handleCommunity( - wakuMessage: WakuMessage -): CommunityMetadataType | undefined { - if (!wakuMessage.payload) { - return - } - - if (!wakuMessage.signaturePublicKey) { - return - } - - let messageToDecode = wakuMessage.payload - - try { - const decodedProtocol = ProtocolMessage.decode(messageToDecode) - if (decodedProtocol) { - messageToDecode = decodedProtocol.publicMessage - } - } catch {} - - const decodedMetadata = ApplicationMetadataMessage.decode(messageToDecode) - if (!decodedMetadata.payload) { - return - } - messageToDecode = decodedMetadata.payload - - // todo: merge and process other types of messages - if ( - decodedMetadata.type !== - ApplicationMetadataMessage.Type.TYPE_COMMUNITY_DESCRIPTION - ) { - return - } - - const decodedPayload = CommunityDescription.decode(messageToDecode) - // todo!: explain - if (!decodedPayload.identity) { - return - } - - return decodedPayload.proto -}