added pooling
This commit is contained in:
parent
e3d16753f6
commit
e3c2c780c8
1 changed files with 51 additions and 0 deletions
51
xmpp.view.ts
51
xmpp.view.ts
|
|
@ -617,6 +617,8 @@ private _handle_message(el: Element) {
|
||||||
private _scroll_setup = new Set<string>() // scroll listener installed
|
private _scroll_setup = new Set<string>() // scroll listener installed
|
||||||
private _rooms = new Map<string, Xmpp_room>()
|
private _rooms = new Map<string, Xmpp_room>()
|
||||||
private _oldest_time = new Map<string, number>() // room_jid → oldest msg timestamp
|
private _oldest_time = new Map<string, number>() // room_jid → oldest msg timestamp
|
||||||
|
private _poll_timer: number | null = null
|
||||||
|
private _poll_count: number = 0
|
||||||
private _ver = 0
|
private _ver = 0
|
||||||
|
|
||||||
private _toast_container: HTMLDivElement | null = null
|
private _toast_container: HTMLDivElement | null = null
|
||||||
|
|
@ -1129,6 +1131,7 @@ private _handle_message(el: Element) {
|
||||||
this.my_jid(bound_jid)
|
this.my_jid(bound_jid)
|
||||||
this.status('connected')
|
this.status('connected')
|
||||||
this._connect_at = Date.now()
|
this._connect_at = Date.now()
|
||||||
|
this._start_polling()
|
||||||
void this._load_persisted()
|
void this._load_persisted()
|
||||||
}
|
}
|
||||||
conn.on_bookmarks = bookmarks => {
|
conn.on_bookmarks = bookmarks => {
|
||||||
|
|
@ -1264,6 +1267,7 @@ private _handle_message(el: Element) {
|
||||||
this._rooms.clear()
|
this._rooms.clear()
|
||||||
this.rooms([])
|
this.rooms([])
|
||||||
this._oldest_time.clear()
|
this._oldest_time.clear()
|
||||||
|
this._stop_polling()
|
||||||
this.messages_ver(0)
|
this.messages_ver(0)
|
||||||
this.$.$mol_state_arg.value('chat', null)
|
this.$.$mol_state_arg.value('chat', null)
|
||||||
}
|
}
|
||||||
|
|
@ -1891,6 +1895,53 @@ private _handle_message(el: Element) {
|
||||||
this._last_displayed_sent.set(jid, newest.time)
|
this._last_displayed_sent.set(jid, newest.time)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Periodically poll for new messages in loaded chats to recover from connection issues.
|
||||||
|
private _start_polling() {
|
||||||
|
if (this._poll_timer) clearInterval(this._poll_timer)
|
||||||
|
this._poll_count = 0
|
||||||
|
this._poll_timer = setInterval(() => {
|
||||||
|
if (!this._conn) return
|
||||||
|
this._poll_count++
|
||||||
|
const current_chat = this.$.$mol_state_arg.value('chat')
|
||||||
|
const is_full_poll = this._poll_count % 6 === 0 // every 30 seconds
|
||||||
|
|
||||||
|
// Always poll current chat if open
|
||||||
|
if (current_chat) {
|
||||||
|
if (this._history_loaded.has(current_chat) && !this._loading_more.has(current_chat)) {
|
||||||
|
this._conn.request_mam(current_chat, 5)
|
||||||
|
} else if (this._rooms.has(current_chat) && !this._loading_more.has(current_chat)) {
|
||||||
|
this._conn.request_mam_room(current_chat, 5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Poll all others every 30 seconds
|
||||||
|
if (is_full_poll) {
|
||||||
|
// Poll 1:1 chats that have history loaded (except current)
|
||||||
|
for (const peer of this._history_loaded) {
|
||||||
|
if (peer === current_chat) continue
|
||||||
|
if (!this._loading_more.has(peer)) {
|
||||||
|
this._conn.request_mam(peer, 5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Poll rooms that are joined (except current)
|
||||||
|
for (const room of this._rooms.values()) {
|
||||||
|
if (room.jid === current_chat) continue
|
||||||
|
if (!this._loading_more.has(room.jid)) {
|
||||||
|
this._conn.request_mam_room(room.jid, 5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 5000) // every 5 seconds
|
||||||
|
}
|
||||||
|
|
||||||
|
private _stop_polling() {
|
||||||
|
if (this._poll_timer) {
|
||||||
|
clearInterval(this._poll_timer)
|
||||||
|
this._poll_timer = null
|
||||||
|
this._poll_count = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async _upload_and_send(jid: string, file: File): Promise<void> {
|
private async _upload_and_send(jid: string, file: File): Promise<void> {
|
||||||
if (!this._conn) throw new Error('Not connected')
|
if (!this._conn) throw new Error('Not connected')
|
||||||
const { put, get } = await this._conn.request_slot(file.name, file.size, file.type)
|
const { put, get } = await this._conn.request_slot(file.name, file.size, file.type)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue