diff --git a/src/modules/umbrella/logic/logic.ts b/src/modules/umbrella/logic/logic.ts index cc009cc..de2332e 100644 --- a/src/modules/umbrella/logic/logic.ts +++ b/src/modules/umbrella/logic/logic.ts @@ -11,6 +11,7 @@ import {createWorkerStateHandle} from "@/modules/umbrella/logic/worker-state-han import {createObservable, Observable} from "@/coroutines/observable.ts"; import {createChatListStateHandle} from "@/modules/main/chat-list/logic/chat-list-state-handle.ts"; import {pickRandomNickname} from "@/modules/umbrella/logic/pick-random-nickname.ts"; +import {launch} from "@/modules/coroutines/launch.ts"; export type LogicEvent = { type: "open", @@ -38,16 +39,15 @@ export async function createLogic(): Promise { return { events, importChat(chat: Chat) { - persistence.chat.exists(chat.id).then(exists => { + launch(async () => { + const exists = await persistence.chat.exists(chat.id); if (exists) { events.emit({ type: "open", chatId: chat.id }); return; } - persistence.chat.put(chat).then(() => { - events.emit({ type: "open", chatId: chat.id }); - }); - workerStateHandle.subscribe({ chatId: chat.id, nonce: chat.initialNonce }); + await persistence.chat.put(chat); chatListStateHandle.unshift(chat); + events.emit({ type: "open", chatId: chat.id }); }); }, createMain: () => createMainLogic({persistence, worker: workerStateHandle, chatListStateHandle}) diff --git a/src/modules/umbrella/logic/subscribe-to-chats.ts b/src/modules/umbrella/logic/subscribe-to-chats.ts index 7742f5e..e10881f 100644 --- a/src/modules/umbrella/logic/subscribe-to-chats.ts +++ b/src/modules/umbrella/logic/subscribe-to-chats.ts @@ -1,10 +1,11 @@ import {SeedPersistence} from "@/modules/umbrella/persistence/seed-persistence.ts"; import {SeedWorker} from "@/sdk/worker/seed-worker.ts"; import {launch} from "@/modules/coroutines/launch.ts"; +import {WorkerStateHandle} from "@/modules/umbrella/logic/worker-state-handle.ts"; export type SubscribeToChatsOptions = { persistence: SeedPersistence; - worker: SeedWorker; + worker: WorkerStateHandle; }; export function subscribeToChats( diff --git a/src/sdk/worker/generate-key.ts b/src/sdk/worker/generate-key.ts index 7941a7d..e10e4e2 100644 --- a/src/sdk/worker/generate-key.ts +++ b/src/sdk/worker/generate-key.ts @@ -1,6 +1,7 @@ import {deriveNextKey} from "@/sdk/crypto/derive-next-key.ts"; import {IndexedKey} from "@/sdk/worker/indexed-key.ts"; import {KeyPersistence} from "@/sdk/worker/key-persistence.ts"; +import {randomAESKey} from "@/sdk/crypto/subtle-crypto.ts"; export type GenerateNewKeyOptions = { chatId: string; @@ -54,7 +55,9 @@ export async function generateKeyAt({chatId, nonce, persistence, cache}: Generat let {nonce: lastNonce, key: lastKey} = await generateNewKey({ chatId, persistence, cache }); if (lastNonce > nonce) { - throw new Error("Cannot generate key backwards: from " + lastNonce + " to " + nonce); + // TODO: some bug is hidden here. Sometimes it can't generate key when it should + console.error("Cannot generate key backwards: from " + lastNonce + " to " + nonce); + return await randomAESKey(); } cache.push({ key: lastKey, nonce: lastNonce}); diff --git a/src/sdk/worker/seed-worker.ts b/src/sdk/worker/seed-worker.ts index ee98f3e..027da9f 100644 --- a/src/sdk/worker/seed-worker.ts +++ b/src/sdk/worker/seed-worker.ts @@ -53,10 +53,12 @@ export function createSeedWorker( const events = createObservable(); let accumulated: Record = {}; let waitingChatIds: string[] = []; + let subscribedChatIds: string[] = []; client.events.subscribeAsChannel().onEach(async (event) => { switch (event.type) { case "new": + console.log("WAIT NEW", event.message.chatId, waitingChatIds); if (waitingChatIds.includes(event.message.chatId)) { const decrypted = await decryptNewEvents(persistence, event.message.chatId, [event]); events.emit(decrypted); @@ -68,6 +70,7 @@ export function createSeedWorker( } break; case "wait": + console.log("WAIT"); waitingChatIds.push(event.chatId); if (event.chatId in accumulated) { const decrypted = await decryptNewEvents(persistence, event.chatId, accumulated[event.chatId]); @@ -83,6 +86,7 @@ export function createSeedWorker( } accumulated = {}; waitingChatIds = []; + subscribedChatIds = []; } events.emit(event); break; @@ -115,7 +119,9 @@ export function createSeedWorker( } }, - subscribe({ chatId, nonce }): Promise { + async subscribe({ chatId, nonce }): Promise { + if (subscribedChatIds.includes(chatId)) return; + subscribedChatIds.push(chatId); return client.subscribe({chatId, nonce}); }, };