Remove dexie

This commit is contained in:
Jonathan Staab 2023-02-09 09:23:46 -06:00
parent 0cbc9874db
commit 34d1ac7fb2
14 changed files with 42 additions and 77 deletions

View File

@ -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

14
package-lock.json generated
View File

@ -14,7 +14,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",
@ -1366,14 +1365,6 @@
"node": ">=0.8.0"
}
},
"node_modules/dexie": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.2.tgz",
"integrity": "sha512-q5dC3HPmir2DERlX+toCBbHQXW5MsyrFqPFcovkH9N2S/UW/H3H5AWAB6iEOExeraAu+j+zRDG+zg/D7YhH0qg==",
"engines": {
"node": ">=6.0"
}
},
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@ -6173,11 +6164,6 @@
"minimist": "^1.2.6"
}
},
"dexie": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.2.tgz",
"integrity": "sha512-q5dC3HPmir2DERlX+toCBbHQXW5MsyrFqPFcovkH9N2S/UW/H3H5AWAB6iEOExeraAu+j+zRDG+zg/D7YhH0qg=="
},
"didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",

View File

@ -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",

View File

@ -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

View File

@ -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)
}

View File

@ -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,
}

View File

@ -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<any>],

View File

@ -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') {

View File

@ -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))
}

View File

@ -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)
})

View File

@ -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

View File

@ -1,5 +1,5 @@
<script>
import {pluck} from 'ramda'
import {pluck, objOf} from 'ramda'
import {noop, createMap} from 'hurdak/lib/hurdak'
import {onMount} from 'svelte'
import {get} from 'svelte/store'
@ -9,7 +9,7 @@
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import RelayCard from "src/partials/RelayCard.svelte"
import {lq, pool, db, user} from "src/agent"
import {database, pool, user} from "src/agent"
import {modal, settings} from "src/app"
import defaults from "src/agent/defaults"
@ -22,16 +22,12 @@
.then(async res => {
const json = await res.json()
for (const url of json.relays) {
db.table('relays').put({url})
}
database.relays.bulkPatch(createMap('url', json.relays.map(objOf('url'))))
}).catch(noop)
for (const relay of defaults.relays) {
db.table('relays').put(relay)
}
database.relays.bulkPatch(createMap('url', defaults.relays))
const knownRelays = lq(() => db.table('relays').toArray())
const knownRelays = database.watch(relays => relays.all())
$: {
const joined = pluck('url', $user?.relays || [])
@ -42,14 +38,8 @@
onMount(() => {
return poll(1000, async () => {
const userRelays = $user?.relays || []
const urls = pluck('url', userRelays)
const relaysByUrl = createMap(
'url',
await db.table('relays').where('url').anyOf(urls).toArray()
)
relays = userRelays.map(relay => ({...relaysByUrl[relay.url], ...relay}))
relays = ($user?.relays || [])
.map(relay => ({...database.relays.get(relay.url), ...relay}))
// Attempt to connect so we can show status
relays.forEach(relay => pool.connect(relay.url))

View File

@ -12,7 +12,7 @@
import Content from "src/partials/Content.svelte"
import Modal from "src/partials/Modal.svelte"
import Heading from 'src/partials/Heading.svelte'
import {lq, user, db, getRelays} from "src/agent"
import {database, user, getRelays} from "src/agent"
import {toast, modal} from "src/app"
import cmd from "src/app/cmd"
@ -22,7 +22,7 @@
let q = ''
let search
const knownRelays = lq(() => db.table('relays').toArray())
const knownRelays = database.watch('relays', relays => relays.all())
$: {
const data = reject(({url}) => find(whereEq({url}), relays), $knownRelays || [])

View File

@ -39,6 +39,14 @@ addEventListener('message', async ({data: {topic, payload, channel}}) => {
test = v => value.includes(v)
} else if (operator === 'eq') {
test = equals(value)
} else if (operator === 'lt') {
test = v => (v || 0) < value
} else if (operator === 'lte') {
test = v => (v || 0) <= value
} else if (operator === 'gt') {
test = v => (v || 0) > value
} else if (operator === 'gte') {
test = v => (v || 0) >= value
} else if (operator === 'nil') {
test = isNil
} else {