Add changelog, wait for only some relays to eose

This commit is contained in:
Jonathan Staab 2022-12-23 16:36:17 -08:00
parent fd3f8ec4f6
commit 4a47ea2dc9
6 changed files with 51 additions and 24 deletions

View File

@ -30,12 +30,21 @@ If you like Coracle and want to support its development, you can donate sats via
- [ ] With link/image previews, remove the url from the note body if it's on a separate last line
- [ ] Stack views so scroll position isn't lost on navigation
- [ ] Add notification for slow relays
- [ ] Wait for 60% or so of relays to eose to balance completeness with speed
- [ ] Add a CSP, check for XSS in image urls
- [ ] Parent notes are having a hard time loading
# Changelog
## 0.2.0
- [x] Completely re-worked data synchronization layer, moving from naive just-in-time requests to background listeners and a local copy stored in dexie. Events and tags, but not people are deleted from the database on logout, and old events are periodically purged.
- [x]
- [x] Completely re-worked data synchronization layer, moving from naive just-in-time requests to background listeners, loaders, and a local copy stored in dexie. Events and tags, but not people are deleted from the database on logout, and old events are periodically purged.
- [x] Added alert badge and page.
- [x] Improved relay page. Suggestions are now taken from
- [x] Removed chat to keep scope of work smaller. Let me know if you'd like to see that come back.
- [x] Split tabs out into separate components
- [x] Removed dispatch, added cmd instead
- [x] Added image previews in addition to link previews
- [x] Fixed infinite scrolling
- [x] Removed cursor/listener abstractions
- [x] Added some default pubkeys
- [x] Wait for some, not all relays to send eose to keep things fast
- [x] General refactoring and bugfixing

View File

@ -60,7 +60,9 @@
settings.set($settings)
// do a hard refresh so everything gets totally cleared
window.location = '/login'
setTimeout(() => {
window.location = '/login'
}, 100)
}
onMount(() => {

View File

@ -35,11 +35,6 @@ const createReply = (content, e) =>
const deleteEvent = ids => publishEvent(5, '', ids.map(id => t("e", id)))
export default {
updateUser, addPetname, removePetname, muffle, createRoom, updateRoom, createMessage, createNote,
createReaction, createReply, deleteEvent,
}
// utils
const copyTags = (e, newTags = []) => {
@ -76,3 +71,8 @@ const publishEvent = async (...args) => {
return event
}
export default {
updateUser, addPetname, removePetname, muffle, createRoom, updateRoom, createMessage, createNote,
createReaction, createReply, deleteEvent, publishEvent,
}

View File

@ -22,19 +22,28 @@ class Channel {
this.status = 'idle'
}
sub(filter, onEvent, onEose = noop, opts = {}) {
const relays = Object.keys(pool.relays)
// If we don't have any relays, we'll wait forever for an eose, but
// we already know we're done. Use a timeout since callers are
// expecting this to be async and we run into errors otherwise.
if (Object.keys(pool.relays).length === 0) {
if (relays.length === 0) {
setTimeout(onEose)
return {unsub: noop}
}
// Start our subscription, wait for only one relay to eose before
// calling it done. We were waiting for all before, but that made
// the slowest relay a bottleneck
const sub = pool.sub({filter, cb: onEvent}, this.name, onEose)
// Start our subscription, wait for only our fastest relays to eose before calling it done.
// We were waiting for all before, but that made the slowest relay a bottleneck. Waiting for
// only one meant we might be settling for very incomplete data
const eoseRelays = []
const sub = pool.sub({filter, cb: onEvent}, this.name, r => {
eoseRelays.push(r)
if (eoseRelays.length >= relays.length - 2) {
onEose()
}
})
const done = () => {
if (this.status === 'busy') {
@ -184,11 +193,12 @@ const syncNetwork = async () => {
// Fall back to some pubkeys we like so we can support new users
if (pubkeys.length === 0) {
pubkeys = [
"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d", // fiatjaf
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245", // jb55
"97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322", // hodlbod
"472f440f29ef996e92a186b8d320ff180c855903882e59d50de1b8bd5669301e", // Marty Bent
"82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2", // Jack
"85080d3bad70ccdcd7f74c29a44f55bb85cbcd3dd0cbb957da1d215bdb931204", // Preston
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245", // jb55
"c4eabae1be3cf657bc1855ee05e69de9f059cb7a059227168b80b89761cbc4e0", // Jack Mallers
]
}

View File

@ -41,11 +41,15 @@
}
const loadLikes = async limit => {
return relay.annotateChunk(take(limit, await relay.filterEvents({
kinds: [7],
authors: [pubkey],
muffle: getTagValues($user?.muffle || []),
})))
const events = await relay.annotateChunk(
take(limit, await relay.filterEvents({
kinds: [7],
authors: [pubkey],
muffle: getTagValues($user?.muffle || []),
}))
)
return events.filter(e => e.kind === 1)
}
const loadNetwork = async limit => {

View File

@ -1,6 +1,8 @@
<script>
import {when, propEq} from 'ramda'
import {fly} from 'svelte/transition'
import {onMount, onDestroy} from 'svelte'
import {now} from 'src/util/misc'
import relay from 'src/relay'
import Note from 'src/partials/Note.svelte'
import Spinner from 'src/partials/Spinner.svelte'
@ -18,7 +20,7 @@
if (note) {
sub = await relay.pool.listenForEvents(
'routes/NoteDetail',
[{kinds: [1, 5, 7], '#e': [note.id]}],
[{kinds: [1, 5, 7], '#e': [note.id], since: now()}],
when(propEq('kind', 1), relay.loadNoteContext)
)
}
@ -42,11 +44,11 @@
</script>
{#if !note}
<div class="text-white">
<div class="text-white" in:fly={{y: 20}}>
Sorry, we weren't able to find this note.
</div>
{:else if $observable}
<div n:fly={{y: 20}}>
<div in:fly={{y: 20}}>
<Note invertColors anchorId={note.id} note={$observable} depth={2} />
</div>
{:else}