diff --git a/src/modules/main/chat-list/persistence/chat-storage.ts b/src/modules/main/chat-list/persistence/chat-storage.ts index 0cc5ae1..48af795 100644 --- a/src/modules/main/chat-list/persistence/chat-storage.ts +++ b/src/modules/main/chat-list/persistence/chat-storage.ts @@ -1,5 +1,5 @@ -import {IDBPDatabase} from "idb"; -import {Chat} from "@/modules/main/chat-list/persistence/chat.ts"; +import { IDBPDatabase } from "idb"; +import { Chat } from "@/modules/main/chat-list/persistence/chat.ts"; export interface ChatStorage { put(chat: Chat): Promise; @@ -11,7 +11,7 @@ export interface ChatStorage { delete(id: string): Promise; } -export function createChatObjectStore(db: IDBPDatabase){ +export function createChatObjectStore(db: IDBPDatabase) { db.createObjectStore("chat", { keyPath: "id", }).createIndex("lastMessageDate", "lastMessageDate"); @@ -24,7 +24,7 @@ export function createChatStorage(db: IDBPDatabase): ChatStorage { }, async get(id: string): Promise { - return await db.transaction("chat").store.get(IDBKeyRange.only(id)); + return await db.transaction("chat").store.get(IDBKeyRange.only(id)) as Chat; }, async rename(id: string, title: string): Promise { diff --git a/src/modules/main/chat/persistence/message-storage.ts b/src/modules/main/chat/persistence/message-storage.ts index 919c9e3..c45e35c 100644 --- a/src/modules/main/chat/persistence/message-storage.ts +++ b/src/modules/main/chat/persistence/message-storage.ts @@ -17,7 +17,6 @@ export function createMessageObjectStore(db: IDBPDatabase) { export function createMessageStorage(db: IDBPDatabase): MessageStorage { return { async lastMessage({ url, queueId }): Promise { - console.log("TEST", url, queueId); const cursor = await db.transaction("message-v2") .store.index("queueId") .openCursor(IDBKeyRange.only([url, queueId]), "prev"); diff --git a/src/modules/umbrella/logic/logic.ts b/src/modules/umbrella/logic/logic.ts index 4410591..52cd063 100644 --- a/src/modules/umbrella/logic/logic.ts +++ b/src/modules/umbrella/logic/logic.ts @@ -72,11 +72,11 @@ function createSeedClient() { }, }); client.setForeground(true); - window.onfocus = function() { + window.onoffline = function() { console.log(">> foreground(true)"); client.setForeground(true); }; - window.onblur = function() { + window.ononline = function() { console.log("<< foreground(false)"); client.setForeground(false); }; diff --git a/src/modules/umbrella/persistence/seed-persistence.ts b/src/modules/umbrella/persistence/seed-persistence.ts index a40d1a4..7fd22d2 100644 --- a/src/modules/umbrella/persistence/seed-persistence.ts +++ b/src/modules/umbrella/persistence/seed-persistence.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import { createMessageObjectStore, createMessageStorage, @@ -55,19 +57,23 @@ export async function createPersistence(): Promise { if (version <= 7) { const chatStore = transaction.objectStore("chat"); - const cursor = await chatStore.openCursor() ?? []; - for await (const { value: chat } of cursor) { - (chat as Chat).unreadCount = 0; - await chatStore.put(chat); + const cursor = await chatStore.openCursor(); + if (cursor) { + for await (const { value: chat } of cursor) { + (chat as Chat).unreadCount = 0; + await chatStore.put(chat); + } } } if (version <= 8) { const chatStore = transaction.objectStore("chat"); - const cursor = await chatStore.openCursor() ?? []; - for await (const { value: chat } of cursor) { - (chat as Chat).serverUrl = "https://meetacy.app/seed-go"; - await chatStore.put(chat); + const cursor = await chatStore.openCursor(); + if (cursor) { + for await (const { value: chat } of cursor) { + (chat as Chat).serverUrl = "https://meetacy.app/seed-go"; + await chatStore.put(chat); + } } } if (version <= 9) { @@ -76,11 +82,13 @@ export async function createPersistence(): Promise { const messageStore = transaction.objectStore("message"); const messageV2Store = transaction.objectStore("message-v2"); - const cursor = await messageStore.openCursor() ?? []; - for await (const { value } of cursor) { - // eslint-disable-next-line - value.queueId = value.chatId; - await messageV2Store.put(value); + const cursor = await messageStore.openCursor(); + if (cursor) { + for await (const { value: message } of cursor) { + message.queueId = message.chatId; + message.url = "wss://meetacy.app/seed-go"; + await messageV2Store.put(message); + } } db.deleteObjectStore("message"); @@ -88,10 +96,12 @@ export async function createPersistence(): Promise { if (version <= 10) { const chatStore = transaction.objectStore("chat"); - const cursor = await chatStore.openCursor() ?? []; - for await (const { value: chat } of cursor) { - (chat as Chat).serverUrl = "wss://meetacy.app/seed-go"; - await chatStore.put(chat); + const cursor = await chatStore.openCursor(); + if (cursor) { + for await (const { value: chat } of cursor) { + (chat as Chat).serverUrl = "wss://meetacy.app/seed-go"; + await chatStore.put(chat); + } } } }, diff --git a/src/sdk-v2/seed-client.ts b/src/sdk-v2/seed-client.ts index c70a826..217e755 100644 --- a/src/sdk-v2/seed-client.ts +++ b/src/sdk-v2/seed-client.ts @@ -99,17 +99,27 @@ export function createSeedClient( const events: Observable = createObservable(); const engine = createSeedEngine(engineOptions.mainUrl); - const subscribeQueueIds: Set = new Set(); - const waitingQueues: Map> = new Map(); + const subscribeQueues: Map> = new Map(); - setInterval(() => { - void engine.executeOrThrow( - engineOptions.mainUrl, - { - "type": "ping", - }, - ); - }, 15_000); + function setSubscribeQueue( + url: string, + queueId: string, + subscribed: boolean, + ) { + const urlQueues = subscribeQueues.get(url) ?? new Set(); + subscribeQueues.set(url, urlQueues); + if (subscribed) { + urlQueues.add(queueId); + } else { + urlQueues.delete(queueId); + } + } + function getSubscribeQueue(url: string, queueId: string) { + const urlQueues = subscribeQueues.get(url); + return urlQueues !== undefined && urlQueues.has(queueId); + } + + const waitingQueues: Map> = new Map(); function setWaitingQueue(url: string, queueId: string, waiting: boolean) { const urlQueues = waitingQueues.get(url) ?? new Set(); @@ -130,6 +140,16 @@ export function createSeedClient( return urlQueues !== undefined && urlQueues.has(queueId); } + setInterval(() => { + ensureServer(engineOptions.mainUrl); + void engine.executeOrThrow( + engineOptions.mainUrl, + { + "type": "ping", + }, + ); + }, 15_000); + engine.events.subscribe(event => { switch (event.type) { case "ready": @@ -188,11 +208,11 @@ export function createSeedClient( } function subscribe(url: string, { queueId, nonce }: SeedClientSubscribeOptions) { - if (subscribeQueueIds.has(url)) { + if (getSubscribeQueue(url, queueId)) { throw new Error(`Already subscribed to this chat id ${queueId}`); } ensureServer(url); - subscribeQueueIds.add(url); + setSubscribeQueue(url, queueId, true); const request: SubscribeRequest = { type: "subscribe", queueId, nonce, diff --git a/src/sdk-v2/seed-engine.ts b/src/sdk-v2/seed-engine.ts index 2428d54..a991235 100644 --- a/src/sdk-v2/seed-engine.ts +++ b/src/sdk-v2/seed-engine.ts @@ -186,9 +186,9 @@ export function createSeedEngine(mainUrl: string): SeedEngine { ) { console.log(`>> execute\nServer: ${url}\nRequest:`, payload); return new Promise((resolve, reject) => { - if (!ready) throw new SeedEngineDisconnected(); + if (!ready) reject(new SeedEngineDisconnected()); if (checkConnection && !connectedUrls.has(url)) { - throw new SeedEngineDisconnected(); + reject(new SeedEngineDisconnected()); } requests.push({