message cache
This commit is contained in:
parent
e6644043df
commit
e7973a2d84
2 changed files with 98 additions and 12 deletions
103
web/js/damus.js
103
web/js/damus.js
|
@ -166,6 +166,7 @@ async function damus_web_init_ready()
|
|||
model.ids = ids
|
||||
|
||||
model.pool = pool
|
||||
model.all_events = load_events(model)
|
||||
model.view_el = document.querySelector("#view")
|
||||
|
||||
switch_view('home')
|
||||
|
@ -393,7 +394,7 @@ function get_non_expired_unknowns(unks, type)
|
|||
|
||||
let new_expired = 0
|
||||
const ids = Object.keys(unks).sort(sort_parent_created).reduce((ids, unk_id) => {
|
||||
if (ids.length >= 128)
|
||||
if (ids.length >= 255)
|
||||
return ids
|
||||
|
||||
const unk = unks[unk_id]
|
||||
|
@ -434,8 +435,9 @@ function fetch_unknown_events(damus)
|
|||
}
|
||||
|
||||
if (evids.length !== 0) {
|
||||
filters.push({ids: evids})
|
||||
filters.push({"#e": evids, limit: 100})
|
||||
const unk_kinds = [1,5,6,7,40,42]
|
||||
filters.push({ids: evids, kinds: unk_kinds})
|
||||
filters.push({"#e": evids, kinds: [1,42], limit: 100})
|
||||
}
|
||||
|
||||
if (pks.length !== 0)
|
||||
|
@ -461,7 +463,7 @@ function shuffle(arr)
|
|||
|
||||
function schedule_unknown_refetch(damus)
|
||||
{
|
||||
const INTERVAL = 10000
|
||||
const INTERVAL = 5000
|
||||
if (!damus.unknown_timer) {
|
||||
log_debug("fetching unknown events now and in %d seconds", INTERVAL / 1000)
|
||||
|
||||
|
@ -578,6 +580,88 @@ function handle_redraw_logic(model, view_name)
|
|||
}
|
||||
}
|
||||
|
||||
function schedule_save_events(damus)
|
||||
{
|
||||
if (damus.save_timer)
|
||||
clearTimeout(damus.save_timer)
|
||||
damus.save_timer = setTimeout(save_events.bind(null, damus), 5000)
|
||||
}
|
||||
|
||||
function is_valid_time(now_sec, created_at)
|
||||
{
|
||||
// don't count events far in the future
|
||||
if (created_at - now_sec >= 120) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
function max(a, b) {
|
||||
return a > b ? a : b
|
||||
}
|
||||
|
||||
function calculate_last_of_kind(evs)
|
||||
{
|
||||
const now_sec = new Date().getTime() / 1000
|
||||
return Object.keys(evs).reduce((obj, evid) => {
|
||||
const ev = evs[evid]
|
||||
if (!is_valid_time(now_sec, ev.created_at))
|
||||
return obj
|
||||
const prev = obj[ev.kind] || 0
|
||||
obj[ev.kind] = max(ev.created_at, prev)
|
||||
return obj
|
||||
}, {})
|
||||
}
|
||||
|
||||
function load_events(damus)
|
||||
{
|
||||
if (!('event_cache' in localStorage))
|
||||
return {}
|
||||
const cached = JSON.parse(localStorage.getItem('event_cache'))
|
||||
|
||||
return cached.reduce((obj, ev) => {
|
||||
obj[ev.id] = ev
|
||||
process_event(damus, ev)
|
||||
return obj
|
||||
}, {})
|
||||
}
|
||||
|
||||
|
||||
function save_events(damus)
|
||||
{
|
||||
const keys = Object.keys(damus.all_events)
|
||||
const MAX_KINDS = {
|
||||
1: 2000,
|
||||
0: 2000,
|
||||
|
||||
6: 100,
|
||||
4: 100,
|
||||
5: 100,
|
||||
7: 100,
|
||||
}
|
||||
|
||||
let counts = {}
|
||||
|
||||
let cached = keys.map((key) => {
|
||||
const ev = damus.all_events[key]
|
||||
const {pubkey, content, tags, kind, created_at, id} = ev
|
||||
return {pubkey, content, tags, kind, created_at, id}
|
||||
})
|
||||
|
||||
cached.sort((a,b) => b.created_at - a.created_at)
|
||||
cached = cached.reduce((cs, ev) => {
|
||||
counts[ev.kind] = (counts[ev.kind] || 0)+1
|
||||
if (counts[ev.kind] < MAX_KINDS[ev.kind])
|
||||
cs.push(ev)
|
||||
return cs
|
||||
}, [])
|
||||
|
||||
log_debug('saving all events to local storage', cached.length)
|
||||
|
||||
localStorage.setItem('event_cache', JSON.stringify(cached))
|
||||
}
|
||||
|
||||
|
||||
function handle_home_event(model, relay, sub_id, ev) {
|
||||
const ids = model.ids
|
||||
|
||||
|
@ -585,6 +669,7 @@ function handle_home_event(model, relay, sub_id, ev) {
|
|||
if (!has_event(model, ev.id)) {
|
||||
model.all_events[ev.id] = ev
|
||||
process_event(model, ev)
|
||||
schedule_save_events(model)
|
||||
}
|
||||
|
||||
ev = model.all_events[ev.id]
|
||||
|
@ -658,7 +743,7 @@ function send_home_filters(model, relay) {
|
|||
friends.push(model.pubkey)
|
||||
|
||||
const contacts_filter = {kinds: [0], authors: friends}
|
||||
const dms_filter = {kinds: [4], limit: 100}
|
||||
const dms_filter = {kinds: [4], "#p": [ model.pubkey ], limit: 100}
|
||||
const our_dms_filter = {kinds: [4], authors: [ model.pubkey ], limit: 100}
|
||||
|
||||
const standard_kinds = [1,42,5,6,7]
|
||||
|
@ -677,7 +762,9 @@ function send_home_filters(model, relay) {
|
|||
if (relay) {
|
||||
last_of_kind =
|
||||
model.last_event_of_kind[relay] =
|
||||
model.last_event_of_kind[relay] || {}
|
||||
model.last_event_of_kind[relay] || calculate_last_of_kind(model.all_events)
|
||||
|
||||
console.log("last_of_kind", last_of_kind)
|
||||
}
|
||||
|
||||
update_filters_with_since(last_of_kind, home_filters)
|
||||
|
@ -696,8 +783,8 @@ function update_filter_with_since(last_of_kind, filter) {
|
|||
const kinds = filter.kinds || []
|
||||
let initial = null
|
||||
let earliest = kinds.reduce((earliest, kind) => {
|
||||
const last = last_of_kind[kind]
|
||||
let since = get_since_time(last)
|
||||
const last_created_at = last_of_kind[kind]
|
||||
let since = get_since_time(last_created_at)
|
||||
|
||||
if (!earliest) {
|
||||
if (since === null)
|
||||
|
|
|
@ -40,11 +40,10 @@ function bech32_decode(pubkey) {
|
|||
/* get_since_time returns null or an int of...
|
||||
* TODO don't know what this does plz help
|
||||
*/
|
||||
function get_since_time(last_event) {
|
||||
if (!last_event) {
|
||||
function get_since_time(created_at) {
|
||||
if (created_at == null)
|
||||
return null
|
||||
}
|
||||
return last_event.created_at - 60 * 10
|
||||
return created_at - 60 * 10
|
||||
}
|
||||
|
||||
function zero_bits(b) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue