diff --git a/README.md b/README.md index fd014794..bc5245c9 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ If you like Coracle and want to support its development, you can donate sats via # Maintenance +- [ ] Throttle connection attempts with bad relays - [ ] Stop using until to paginate, we skip a ton of stuff. Or use until per relay? - Or just stop doing loading and listen - [ ] If the latest message in a dm was the user, don't show notification diff --git a/package-lock.json b/package-lock.json index c3414e93..40f5b34e 100644 Binary files a/package-lock.json and b/package-lock.json differ diff --git a/package.json b/package.json index 3cf4986c..adb66d17 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "@tsconfig/svelte": "^3.0.0", "classnames": "^2.3.2", "compressorjs": "^1.1.1", - "dexie": "^3.2.2", "fuse.js": "^6.6.2", "hurdak": "github:ConsignCloud/hurdak", "husky": "^8.0.3", diff --git a/src/App.svelte b/src/App.svelte index 17e3be43..1db72939 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -4,6 +4,7 @@ import {find, identity, nthArg, pluck} from 'ramda' import {onMount} from "svelte" + import {createMap} from 'hurdak/lib/hurdak' import {writable, get} from "svelte/store" import {fly, fade} from "svelte/transition" import {cubicInOut} from "svelte/easing" @@ -11,7 +12,7 @@ import {globalHistory} from "svelte-routing/src/history" import {displayPerson, isLike} from 'src/util/nostr' import {timedelta, shuffle, now, sleep} from 'src/util/misc' - import {db, keys, user, pool, getRelays} from 'src/agent' + import {database, keys, user, pool, getRelays} from 'src/agent' import {modal, toast, settings, logUsage, alerts, messages, loadAppData} from "src/app" import {routes} from "src/app/ui" import Anchor from 'src/partials/Anchor.svelte' @@ -41,7 +42,6 @@ import Chat from "src/routes/Chat.svelte" import ChatRoom from "src/routes/ChatRoom.svelte" import Messages from "src/routes/Messages.svelte" - import _db from 'src/agent/database' export let url = "" @@ -116,13 +116,14 @@ // Find relays with old/missing metadata and refresh them. Only pick a // few so we're not sending too many concurrent http requests - const allRelays = await db.table('relays').toArray() - const staleRelays = allRelays - .filter(r => (r.refreshed_at || 0) < now() - timedelta(7, 'days')) - const staleRelaysSample = shuffle(staleRelays).slice(0, 10) + const staleRelays = shuffle( + await database.relays.all({ + 'refreshed_at:lt': now() - timedelta(7, 'days'), + }) + ).slice(0, 10) const freshRelays = await Promise.all( - staleRelaysSample.map(async ({url}) => { + staleRelays.map(async ({url}) => { try { const res = await fetch(dufflepudUrl + '/relay/info', { method: 'POST', @@ -143,7 +144,7 @@ }) ) - db.table('relays').bulkPut(freshRelays.filter(identity)) + database.relays.bulkPatch(createMap('url', freshRelays.filter(identity))) } // Close menu on click outside diff --git a/src/agent/data.js b/src/agent/data.js index 2c553b0e..3972e316 100644 --- a/src/agent/data.js +++ b/src/agent/data.js @@ -1,4 +1,3 @@ -import Dexie, {liveQuery} from 'dexie' import {pick, isEmpty} from 'ramda' import {nip05} from 'nostr-tools' import {noop, createMap, ensurePlural, switcherFn} from 'hurdak/lib/hurdak' @@ -6,21 +5,6 @@ import {now} from 'src/util/misc' import {personKinds, Tags, roomAttrs, isRelay} from 'src/util/nostr' import database from 'src/agent/database' -export const lq = cb => liveQuery(async () => { - try { - return await cb() - } catch (e) { - console.error(e) - } -}) - -export const db = new Dexie('agent/data/db') - -db.version(13).stores({ - relays: '++url, name', - alerts: '++id, created_at', -}) - export const updatePeople = async updates => { await database.people.bulkPut(updates) } diff --git a/src/agent/database.ts b/src/agent/database.ts index cd709406..93e73688 100644 --- a/src/agent/database.ts +++ b/src/agent/database.ts @@ -210,6 +210,8 @@ const defineTable = (name: string): Table => { const people = defineTable('people') const rooms = defineTable('rooms') const messages = defineTable('messages') +const alerts = defineTable('alerts') +const relays = defineTable('relays') // Helper to allow us to listen to changes of any given table @@ -267,6 +269,6 @@ const getPersonWithFallback = pubkey => people.get(pubkey) || {pubkey} const clearAll = () => Promise.all(Object.keys(registry).map(clear)) export default { - getItem, setItem, removeItem, length, clear, keys, iterate, - watch, getPersonWithFallback, clearAll, people, rooms, messages, + getItem, setItem, removeItem, length, clear, keys, iterate, watch, + getPersonWithFallback, clearAll, people, rooms, messages, alerts, relays, } diff --git a/src/agent/index.ts b/src/agent/index.ts index 020f2682..38fa94ce 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -7,11 +7,11 @@ import pool from 'src/agent/pool' import keys from 'src/agent/keys' import defaults from 'src/agent/defaults' import database from 'src/agent/database' -import {lq, db, processEvents} from 'src/agent/data' +import {processEvents} from 'src/agent/data' -Object.assign(window, {pool, db, database}) +Object.assign(window, {pool, database}) -export {pool, keys, lq, db, database} +export {pool, keys, database} export const user = derived( [keys.pubkey, database.people as Readable], diff --git a/src/agent/pool.ts b/src/agent/pool.ts index f1947d75..6d3f038a 100644 --- a/src/agent/pool.ts +++ b/src/agent/pool.ts @@ -1,10 +1,10 @@ import type {Relay} from 'nostr-tools' import {relayInit} from 'nostr-tools' import {uniqBy, reject, prop, find, whereEq, is} from 'ramda' -import {ensurePlural} from 'hurdak/lib/hurdak' +import {ensurePlural, createMap} from 'hurdak/lib/hurdak' import {isRelay} from 'src/util/nostr' import {sleep} from 'src/util/misc' -import {db} from 'src/agent/data' +import {database} from 'src/agent' let connections = [] @@ -83,7 +83,7 @@ const findConnection = url => find(whereEq({url}), connections) const connect = async url => { const conn = findConnection(url) || new Connection(url) - await db.table('relays').put({url}) + await database.relays.bulkPatch(createMap('url', [{url}])) await Promise.race([conn.connect(), sleep(5000)]) if (conn.status === 'ready') { diff --git a/src/app/alerts.js b/src/app/alerts.js index ac1b255d..db903e21 100644 --- a/src/app/alerts.js +++ b/src/app/alerts.js @@ -2,7 +2,7 @@ import {get} from 'svelte/store' import {groupBy, pluck, partition, propEq} from 'ramda' import {synced, timedelta, batch, now} from 'src/util/misc' import {isAlert, findReplyId} from 'src/util/nostr' -import {load as _load, listen as _listen, db} from 'src/agent' +import {load as _load, listen as _listen, database} from 'src/agent' import loaders from 'src/app/loaders' import {annotate} from 'src/app' @@ -23,7 +23,7 @@ const onChunk = async (relays, pubkey, events) => { .filter(e => likesByParent[e.id]) .map(e => annotate({...e, likedBy: pluck('pubkey', likesByParent[e.id])}, context)) - await db.table('alerts').bulkPut(annotatedNotes.concat(likedNotes)) + await database.alerts.bulkPut(annotatedNotes.concat(likedNotes)) mostRecentAlert.update($t => events.reduce((t, e) => Math.max(t, e.created_at), $t)) } diff --git a/src/routes/Alerts.svelte b/src/routes/Alerts.svelte index 618daa1a..f990946c 100644 --- a/src/routes/Alerts.svelte +++ b/src/routes/Alerts.svelte @@ -3,7 +3,7 @@ import {onMount} from 'svelte' import {fly} from 'svelte/transition' import {now, createScroller} from 'src/util/misc' - import {db} from 'src/agent' + import {database} from 'src/agent' import {alerts} from 'src/app' import Note from 'src/partials/Note.svelte' import Content from 'src/partials/Content.svelte' @@ -18,7 +18,7 @@ return createScroller(async () => { limit += 10 - const events = await db.table('alerts').toArray() + const events = await database.alerts.all() notes = sortBy(e => -e.created_at, events).slice(0, limit) }) diff --git a/src/routes/Logout.svelte b/src/routes/Logout.svelte index 8a61b076..aacd9b0d 100644 --- a/src/routes/Logout.svelte +++ b/src/routes/Logout.svelte @@ -2,7 +2,7 @@ import {fly} from 'svelte/transition' import Anchor from 'src/partials/Anchor.svelte' import Content from "src/partials/Content.svelte" - import {db, database} from 'src/agent' + import {database} from 'src/agent' let confirmed = false @@ -13,12 +13,6 @@ await database.clearAll() - try { - await db.delete() - } catch (e) { - // pass - } - // do a hard refresh so everything gets totally cleared. // Give them a moment to see the state transition. Dexie // also apparently needs some time diff --git a/src/routes/RelayList.svelte b/src/routes/RelayList.svelte index 9a66e3b5..944b948d 100644 --- a/src/routes/RelayList.svelte +++ b/src/routes/RelayList.svelte @@ -1,5 +1,5 @@