Handle empty subscription queue and OOP-ify

This commit is contained in:
Cadence Ember 2020-10-03 01:32:22 +13:00
parent 830c009066
commit 1ea272600c
No known key found for this signature in database
GPG Key ID: BC1C2C61CF521B17
3 changed files with 67 additions and 31 deletions

View File

@ -3,6 +3,7 @@ const db = require("../utils/db")
const {fetchChannelLatest} = require("../utils/youtube") const {fetchChannelLatest} = require("../utils/youtube")
const {getUser} = require("../utils/getuser") const {getUser} = require("../utils/getuser")
const {timeToPastText} = require("../utils/converters") const {timeToPastText} = require("../utils/converters")
const {refresher} = require("../background/feed-update")
module.exports = [ module.exports = [
{ {
@ -13,6 +14,8 @@ module.exports = [
let channels = [] let channels = []
let refreshed = null let refreshed = null
if (user.token) { if (user.token) {
// trigger a background refresh, needed if they came back from being inactive
refresher.skipWaiting()
// get channels // get channels
const subscriptions = user.getSubscriptions() const subscriptions = user.getSubscriptions()
const template = Array(subscriptions.length).fill("?").join(", ") const template = Array(subscriptions.length).fill("?").join(", ")

View File

@ -61,9 +61,16 @@ class RefreshQueue {
} }
} }
const refreshQueue = new RefreshQueue() class Refresher {
constructor() {
this.sym = constants.symbols.refresher
this.refreshQueue = new RefreshQueue()
this.state = this.sym.ACTIVE
this.waitingTimeout = null
this.next()
}
function refreshChannel(ucid) { refreshChannel(ucid) {
return fetch(`http://localhost:3000/api/v1/channels/${ucid}/latest`).then(res => res.json()).then(root => { return fetch(`http://localhost:3000/api/v1/channels/${ucid}/latest`).then(res => res.json()).then(root => {
if (Array.isArray(root)) { if (Array.isArray(root)) {
root.forEach(video => { root.forEach(video => {
@ -82,22 +89,40 @@ function refreshChannel(ucid) {
throw new Error(root.error) throw new Error(root.error)
} }
}) })
} }
function refreshNext() { next() {
if (refreshQueue.isEmpty()) { if (this.refreshQueue.isEmpty()) {
const timeSinceLastLoop = Date.now() - refreshQueue.lastLoadTime const timeSinceLastLoop = Date.now() - this.refreshQueue.lastLoadTime
if (timeSinceLastLoop < constants.caching.subscriptions_refresh_loop_min) { if (timeSinceLastLoop < constants.caching.subscriptions_refresh_loop_min) {
const timeToWait = constants.caching.subscriptions_refresh_loop_min - timeSinceLastLoop const timeToWait = constants.caching.subscriptions_refresh_loop_min - timeSinceLastLoop
console.log(`waiting ${timeToWait} before next loop`) console.log(`waiting ${timeToWait} before next loop`)
return setTimeout(refreshNext, timeToWait) this.state = this.sym.WAITING
this.waitingTimeout = setTimeout(() => this.next(), timeToWait)
return
} else { } else {
refreshQueue.load() this.refreshQueue.load()
} }
} }
const ucid = refreshQueue.next() if (!this.refreshQueue.isEmpty()) {
refreshChannel(ucid).then(refreshNext) this.state = this.sym.ACTIVE
const ucid = this.refreshQueue.next()
this.refreshChannel(ucid).then(() => this.next())
} else {
this.state = this.sym.EMPTY
}
}
skipWaiting() {
if (this.state !== this.sym.ACTIVE) {
clearTimeout(this.waitingTimeout)
this.refreshQueue.lastLoadTime = 0
this.next()
}
}
} }
refreshNext() const refresher = new Refresher()
module.exports.refresher = refresher

View File

@ -19,6 +19,14 @@ const constants = {
regex: { regex: {
ucid: "[A-Za-z0-9-_]+", ucid: "[A-Za-z0-9-_]+",
video_id: "[A-Za-z0-9-_]+" video_id: "[A-Za-z0-9-_]+"
},
symbols: {
refresher: {
ACTIVE: Symbol("ACTIVE"),
WAITING: Symbol("WAITING"),
EMPTY: Symbol("EMPTY")
}
} }
} }