Skip to content

Commit d21f377

Browse files
committed
use StorageEnvelopContainer to store messages
1 parent 8900c2b commit d21f377

File tree

8 files changed

+103
-58
lines changed

8 files changed

+103
-58
lines changed

packages/lib/storage/src/new/index.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
StorageAPI,
2121
} from './types';
2222
import { addConversation, addMessage } from './write';
23+
import { StorageEnvelopContainer } from '../Storage';
2324

2425
/**
2526
* This function creates a closure that, when invoked, adds a new conversation
@@ -116,8 +117,8 @@ function toggleHideConversationSideEffectContainment(
116117
*/
117118
function addMessageSideEffectContainment(
118119
db: Db,
119-
): (contactEnsName: string, envelop: Envelop) => Promise<void> {
120-
return async (contactEnsName: string, envelop: Envelop) => {
120+
): (contactEnsName: string, envelop: StorageEnvelopContainer) => Promise<void> {
121+
return async (contactEnsName: string, envelop: StorageEnvelopContainer) => {
121122
//First we have to get the conversation manifest
122123
const conversationManifest = await getConversationManifest(
123124
contactEnsName,
@@ -215,7 +216,7 @@ export function createStorage(
215216
if (!chunk) {
216217
return [];
217218
}
218-
return chunk.envelops;
219+
return chunk.envelopContainer;
219220
},
220221

221222
getNumberOfMessages: (contactEnsName: string) =>

packages/lib/storage/src/new/storage.test.ts

+53-20
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { stringify } from '@dm3-org/dm3-lib-shared';
22
import { createStorage } from './index';
33
import { makeEnvelop } from './testHelper';
44
import { Chunk, Encryption, ReadStrategy, StorageAPI } from './types';
5+
import { MessageState } from '@dm3-org/dm3-lib-messaging';
56

67
describe('createStorage Integration Tests', () => {
78
let storageApi: StorageAPI;
@@ -98,10 +99,15 @@ describe('createStorage Integration Tests', () => {
9899
'Hello Bob',
99100
1706084571962,
100101
);
101-
await storageApi.addMessage('bob.eth', envelop);
102+
103+
const storageEnvelopContainer = {
104+
envelop,
105+
messageState: MessageState.Created,
106+
};
107+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
102108
const messageChunk = await storageApi.getMessages('bob.eth', 0);
103109
expect(messageChunk.length).toBe(1);
104-
expect(messageChunk[0]).toEqual(envelop);
110+
expect(messageChunk[0]).toEqual(storageEnvelopContainer);
105111
});
106112
it('add new message - updates number of messages', async () => {
107113
await storageApi.addConversation('bob.eth');
@@ -121,7 +127,12 @@ describe('createStorage Integration Tests', () => {
121127
1706084571962,
122128
);
123129

124-
await storageApi.addMessage('bob.eth', envelop);
130+
const storageEnvelopContainer = {
131+
envelop,
132+
messageState: MessageState.Created,
133+
};
134+
135+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
125136
//We acreate an newStorageApi to verify that the data is stored in remote storage and not just locally
126137
storageApi = await createStorage('alice.eth', mockSign, {
127138
readStrategy: ReadStrategy.RemoteFirst,
@@ -130,7 +141,7 @@ describe('createStorage Integration Tests', () => {
130141
messageCounter = await storageApi.getNumberOfMessages('bob.eth');
131142
expect(messageCounter).toBe(1);
132143

133-
await storageApi.addMessage('bob.eth', envelop);
144+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
134145
//We acreate an newStorageApi to verify that the data is stored in remote storage and not just locally
135146
storageApi = await createStorage('alice.eth', mockSign, {
136147
readStrategy: ReadStrategy.RemoteFirst,
@@ -139,7 +150,7 @@ describe('createStorage Integration Tests', () => {
139150
messageCounter = await storageApi.getNumberOfMessages('bob.eth');
140151
expect(messageCounter).toBe(2);
141152

142-
await storageApi.addMessage('bob.eth', envelop);
153+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
143154
//We acreate an newStorageApi to verify that the data is stored in remote storage and not just locally
144155
storageApi = await createStorage('alice.eth', mockSign, {
145156
readStrategy: ReadStrategy.RemoteFirst,
@@ -151,9 +162,9 @@ describe('createStorage Integration Tests', () => {
151162
const messages = await storageApi.getMessages('bob.eth', 0);
152163
expect(messages.length).toBe(3);
153164

154-
expect(messages[0]).toEqual(envelop);
155-
expect(messages[1]).toEqual(envelop);
156-
expect(messages[2]).toEqual(envelop);
165+
expect(messages[0]).toEqual(storageEnvelopContainer);
166+
expect(messages[1]).toEqual(storageEnvelopContainer);
167+
expect(messages[2]).toEqual(storageEnvelopContainer);
157168
});
158169
it('getMessages -- return [] if no converation exists', async () => {
159170
const messages = await storageApi.getMessages('bob.eth', 0);
@@ -209,7 +220,13 @@ describe('createStorage Integration Tests', () => {
209220
'Hello Bob',
210221
1706084571962,
211222
);
212-
await storageApi.addMessage('bob.eth', envelop);
223+
224+
const storageEnvelopContainer = {
225+
envelop,
226+
messageState: MessageState.Created,
227+
};
228+
229+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
213230
//We acreate an newStorageApi to verify that the data is stored in remote storage and not just locally
214231
storageApi = await createStorage('alice.eth', mockSign, {
215232
readStrategy: ReadStrategy.RemoteFirst,
@@ -224,7 +241,7 @@ describe('createStorage Integration Tests', () => {
224241

225242
const getMessages = await storageApi.getMessages('bob.eth', 0);
226243
expect(getMessages.length).toBe(1);
227-
expect(getMessages[0]).toEqual(envelop);
244+
expect(getMessages[0]).toEqual(storageEnvelopContainer);
228245
});
229246
it('hide conversation -- conversation can be hidden', async () => {
230247
await storageApi.addConversation('bob.eth');
@@ -288,10 +305,16 @@ describe('createStorage Integration Tests', () => {
288305
'Hello Bob',
289306
1706084571962,
290307
);
291-
await storageApi.addMessage('bob.eth', envelop);
308+
309+
const storageEnvelopContainer = {
310+
envelop,
311+
messageState: MessageState.Created,
312+
};
313+
314+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
292315
const messageChunk = await storageApi.getMessages('bob.eth', 0);
293316
expect(messageChunk.length).toBe(1);
294-
expect(messageChunk[0]).toEqual(envelop);
317+
expect(messageChunk[0]).toEqual(storageEnvelopContainer);
295318
});
296319
it('add new message - updates number of messages', async () => {
297320
await storageApi.addConversation('bob.eth');
@@ -305,25 +328,29 @@ describe('createStorage Integration Tests', () => {
305328
'Hello Bob',
306329
1706084571962,
307330
);
331+
const storageEnvelopContainer = {
332+
envelop,
333+
messageState: MessageState.Created,
334+
};
308335

309-
await storageApi.addMessage('bob.eth', envelop);
336+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
310337
messageCounter = await storageApi.getNumberOfMessages('bob.eth');
311338
expect(messageCounter).toBe(1);
312339

313-
await storageApi.addMessage('bob.eth', envelop);
340+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
314341
messageCounter = await storageApi.getNumberOfMessages('bob.eth');
315342
expect(messageCounter).toBe(2);
316343

317-
await storageApi.addMessage('bob.eth', envelop);
344+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
318345
messageCounter = await storageApi.getNumberOfMessages('bob.eth');
319346
expect(messageCounter).toBe(3);
320347

321348
const messages = await storageApi.getMessages('bob.eth', 0);
322349
expect(messages.length).toBe(3);
323350

324-
expect(messages[0]).toEqual(envelop);
325-
expect(messages[1]).toEqual(envelop);
326-
expect(messages[2]).toEqual(envelop);
351+
expect(messages[0]).toEqual(storageEnvelopContainer);
352+
expect(messages[1]).toEqual(storageEnvelopContainer);
353+
expect(messages[2]).toEqual(storageEnvelopContainer);
327354
});
328355
it('getMessages -- return [] if no converation exists', async () => {
329356
const messages = await storageApi.getMessages('bob.eth', 0);
@@ -354,7 +381,13 @@ describe('createStorage Integration Tests', () => {
354381
'Hello Bob',
355382
1706084571962,
356383
);
357-
await storageApi.addMessage('bob.eth', envelop);
384+
385+
const storageEnvelopContainer = {
386+
envelop,
387+
messageState: MessageState.Created,
388+
};
389+
390+
await storageApi.addMessage('bob.eth', storageEnvelopContainer);
358391

359392
const conversations = await storageApi.getConversationList(0);
360393
expect(conversations.length).toBe(1);
@@ -364,7 +397,7 @@ describe('createStorage Integration Tests', () => {
364397

365398
const getMessages = await storageApi.getMessages('bob.eth', 0);
366399
expect(getMessages.length).toBe(1);
367-
expect(getMessages[0]).toEqual(envelop);
400+
expect(getMessages[0]).toEqual(storageEnvelopContainer);
368401
});
369402
it('hide conversation -- conversation can be hidden', async () => {
370403
await storageApi.addConversation('bob.eth');

packages/lib/storage/src/new/testHelper.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Envelop, Message } from '@dm3-org/dm3-lib-messaging';
1+
import { Envelop, Message, MessageState } from '@dm3-org/dm3-lib-messaging';
22
import { sha256 } from '@dm3-org/dm3-lib-shared';
33
import {
44
AccountManifest,
@@ -53,6 +53,12 @@ export function makeEnvelop(
5353

5454
export const sign = async (data: string) => sha256(data);
5555
export const testEnvelop = makeEnvelop('from1', 'to1', 'message', Date.now());
56+
57+
const storageEnvelopContainer = {
58+
envelop: testEnvelop,
59+
messageState: MessageState.Created,
60+
};
61+
5662
export const db: Db = {
5763
accountEnsName: 'test.dm3.eth',
5864
updateLocalStorageOnRemoteRead: async <T extends Chunk>(
@@ -91,7 +97,7 @@ export const db: Db = {
9197
// MessageChunk page 1 for test.dm3.eth and alice.eth
9298
case await getMessageChunkKey(db, 'alice.eth', 1):
9399
const messageChunk: MessageChunk = {
94-
envelops: [testEnvelop],
100+
envelopContainer: [storageEnvelopContainer],
95101
key,
96102
};
97103
return messageChunk as T;

packages/lib/storage/src/new/types.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Envelop } from '@dm3-org/dm3-lib-messaging';
1+
import { Envelop, MessageState } from '@dm3-org/dm3-lib-messaging';
22

33
export const INITIAL_ACCOUNT_MANIFEST = (key: string): AccountManifest => ({
44
conversationListCounter: 0,
@@ -18,12 +18,17 @@ export interface Conversation extends ConversationManifest {
1818

1919
export interface StorageAPI {
2020
getConversationList: (page: number) => Promise<Conversation[]>;
21-
22-
getMessages: (contactEnsName: string, page: number) => Promise<Envelop[]>;
21+
getMessages: (
22+
contactEnsName: string,
23+
page: number,
24+
) => Promise<StorageEnvelopContainer[]>;
2325
getNumberOfMessages: (contactEnsName: string) => Promise<number>;
2426
getNumberOfConverations: () => Promise<number>;
2527
addConversation: (contactEnsName: string) => Promise<void>;
26-
addMessage: (contactEnsName: string, envelop: Envelop) => Promise<void>;
28+
addMessage: (
29+
contactEnsName: string,
30+
envelop: StorageEnvelopContainer,
31+
) => Promise<void>;
2732
toggleHideConversation: (
2833
contactEnsName: string,
2934
isHidden: boolean,
@@ -77,10 +82,15 @@ export interface ConversationManifest extends Chunk {
7782
}
7883

7984
export interface MessageChunk extends Chunk {
80-
envelops: Envelop[];
85+
envelopContainer: StorageEnvelopContainer[];
8186
}
8287

8388
export type RemoteFetchCb = <T extends Chunk>(
8489
key: string,
8590
value: T,
8691
) => Promise<void>;
92+
93+
export interface StorageEnvelopContainer {
94+
messageState: MessageState;
95+
envelop: Envelop;
96+
}

packages/lib/storage/src/new/write.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
MessageChunk,
2121
} from './types';
2222
import { getSize } from '@dm3-org/dm3-lib-shared';
23+
import { StorageEnvelopContainer } from '../Storage';
2324

2425
/**
2526
* This function adds a new conversation to the conversation list.
@@ -94,7 +95,7 @@ export async function addConversation(
9495
*/
9596
export async function addMessage(
9697
contactEnsName: string,
97-
envelop: Envelop,
98+
storageEnvelopContainer: StorageEnvelopContainer,
9899
db: Db,
99100
): Promise<{
100101
messageChunk: MessageChunk;
@@ -105,7 +106,7 @@ export async function addMessage(
105106
// However, the getEnvelopSize function exepects an encrypted envelop as input.
106107
// In the case of the storage we encrypt the whole chunk and not a single message.
107108
// Therefore we use the getSize function on an unencrypted envelop.
108-
if (getSize(envelop) > MAX_MESSAGE_SIZE) {
109+
if (getSize(storageEnvelopContainer.envelop) > MAX_MESSAGE_SIZE) {
109110
throw Error(`Message size is too big`);
110111
}
111112
// get the conversation manifest and calculate the target chunk index based on the current message counter.
@@ -138,9 +139,9 @@ export async function addMessage(
138139
messageChunk: {
139140
key,
140141

141-
envelops: messageChunk
142-
? [...messageChunk.envelops, envelop]
143-
: [envelop],
142+
envelopContainer: messageChunk
143+
? [...messageChunk.envelopContainer, storageEnvelopContainer]
144+
: [storageEnvelopContainer],
144145
},
145146
conversationManifest: {
146147
...conversationManifest,

packages/messenger-widget/src/components/Contacts/Contacts.tsx

+4-17
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,8 @@ export function Contacts(props: DashboardProps) {
4040
// fetches context api data
4141
const { state, dispatch } = useContext(GlobalContext);
4242
const { account, deliveryServiceToken } = useContext(AuthContext);
43-
const {
44-
contacts: contacts,
45-
initialized,
46-
setSelectedContact,
47-
selectedContact,
48-
} = useContext(ConversationContext);
43+
const { contacts, initialized, setSelectedContact, selectedContact } =
44+
useContext(ConversationContext);
4945
const mainnetProvider = useMainnetProvider();
5046
const { resolveAliasToTLD } = useTopLevelAlias();
5147

@@ -65,16 +61,8 @@ export function Contacts(props: DashboardProps) {
6561

6662
// handles any change in socket or session
6763
useEffect(() => {
68-
if (!initialized) {
69-
dispatch({
70-
type: ModalStateType.LoaderContent,
71-
payload: 'Fetching contacts...',
72-
});
73-
console.log('start loader');
74-
return startLoader();
75-
}
76-
77-
closeLoader();
64+
console.log(' initialized', initialized);
65+
console.log('contacts', contacts);
7866
}, [initialized]);
7967

8068
// handles change in accounts
@@ -244,7 +232,6 @@ export function Contacts(props: DashboardProps) {
244232
</div>
245233

246234
{/* @Bhupesh what is this cached contacts section for */}
247-
248235
{/* {state.cache.contacts &&
249236
id !== selectedContact?.contactDetails.account.ensName &&
250237
(

packages/messenger-widget/src/hooks/conversation/hydrateContact.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { getAvatarProfilePic } from '../../utils/ens-utils';
1414
import { GetMessages, GetNumberOfMessages } from '../storage/useStorage';
1515
import { Envelop } from '@dm3-org/dm3-lib-messaging';
1616
import { MessageActionType } from '../../utils/enum-type-utils';
17+
import { StorageEnvelopContainer } from '@dm3-org/dm3-lib-storage';
1718

1819
export const hydrateContract = async (
1920
provider: ethers.providers.JsonRpcProvider,
@@ -46,11 +47,13 @@ const fetchPreview = async (
4647
Math.floor(numberOfmessages / MAX_MESSAGES_PER_CHUNK),
4748
);
4849

49-
const lastMessage = lastMessages.filter((msg: Envelop) => {
50-
//Only consider NEW mesages for preview
51-
//TODO @Heiko double check pls
52-
return msg.message.metadata?.type === MessageActionType.NEW;
53-
})[lastMessages.length - 1]?.message?.message;
50+
const lastMessage = lastMessages.filter(
51+
({ envelop }: StorageEnvelopContainer) => {
52+
//Only consider NEW mesages for preview
53+
//TODO @Heiko double check pls
54+
return envelop.message.metadata?.type === MessageActionType.NEW;
55+
},
56+
)[lastMessages.length - 1]?.envelop?.message.message;
5457

5558
//If there is no message to preview we use the empty string
5659
const messagePreview = lastMessage ?? '';

packages/messenger-widget/src/hooks/storage/useStorage.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
//Will be initialized with the deliveryServiceToken and the initialUserDb after the user has logged in.
55

66
import {
7+
StorageEnvelopContainer,
78
UserDB,
89
createRemoteKeyValueStoreApi,
910
createStorage,
@@ -132,5 +133,8 @@ export const useStorage = (
132133
export type StoreMessageAsync = (message: any) => void;
133134
export type GetConversations = (page: number) => Promise<Conversation[]>;
134135
export type AddConversation = (contact: string) => void;
135-
export type GetMessages = (contact: string, page: number) => Promise<Envelop[]>;
136+
export type GetMessages = (
137+
contact: string,
138+
page: number,
139+
) => Promise<StorageEnvelopContainer[]>;
136140
export type GetNumberOfMessages = (contact: string) => Promise<number>;

0 commit comments

Comments
 (0)