Fix:Shares not working with timeouts longer than 23 days #3164

This commit is contained in:
advplyr 2024-07-27 17:40:51 -05:00
parent ee53086444
commit 88693d73bd
3 changed files with 64 additions and 10 deletions

View File

@ -1,12 +1,14 @@
const Database = require('../Database') const Database = require('../Database')
const Logger = require('../Logger') const Logger = require('../Logger')
const SocketAuthority = require('../SocketAuthority') const SocketAuthority = require('../SocketAuthority')
const LongTimeout = require('../utils/longTimeout')
const { elapsedPretty } = require('../utils/index')
/** /**
* @typedef OpenMediaItemShareObject * @typedef OpenMediaItemShareObject
* @property {string} id * @property {string} id
* @property {import('../models/MediaItemShare').MediaItemShareObject} mediaItemShare * @property {import('../models/MediaItemShare').MediaItemShareObject} mediaItemShare
* @property {NodeJS.Timeout} timeout * @property {LongTimeout} timeout
*/ */
class ShareManager { class ShareManager {
@ -118,13 +120,13 @@ class ShareManager {
this.destroyMediaItemShare(mediaItemShare.id) this.destroyMediaItemShare(mediaItemShare.id)
return return
} }
const timeout = new LongTimeout()
const timeout = setTimeout(() => { timeout.set(() => {
Logger.info(`[ShareManager] Removing expired media item share "${mediaItemShare.id}"`) Logger.info(`[ShareManager] Removing expired media item share "${mediaItemShare.id}"`)
this.removeMediaItemShare(mediaItemShare.id) this.removeMediaItemShare(mediaItemShare.id)
}, expiresAtDuration) }, expiresAtDuration)
this.openMediaItemShares.push({ id: mediaItemShare.id, mediaItemShare: mediaItemShare.toJSON(), timeout }) this.openMediaItemShares.push({ id: mediaItemShare.id, mediaItemShare: mediaItemShare.toJSON(), timeout })
Logger.info(`[ShareManager] Scheduled media item share "${mediaItemShare.id}" to expire in ${expiresAtDuration}ms`) Logger.info(`[ShareManager] Scheduled media item share "${mediaItemShare.id}" to expire in ${elapsedPretty(expiresAtDuration / 1000)}`)
} }
/** /**
@ -149,7 +151,7 @@ class ShareManager {
if (!mediaItemShare) return if (!mediaItemShare) return
if (mediaItemShare.timeout) { if (mediaItemShare.timeout) {
clearTimeout(mediaItemShare.timeout) mediaItemShare.timeout.clear()
} }
this.openMediaItemShares = this.openMediaItemShares.filter((s) => s.id !== mediaItemShareId) this.openMediaItemShares = this.openMediaItemShares.filter((s) => s.id !== mediaItemShareId)

View File

@ -66,6 +66,11 @@ module.exports.getId = (prepend = '') => {
return _id return _id
} }
/**
*
* @param {number} seconds
* @returns {string}
*/
function elapsedPretty(seconds) { function elapsedPretty(seconds) {
if (seconds > 0 && seconds < 1) { if (seconds > 0 && seconds < 1) {
return `${Math.floor(seconds * 1000)} ms` return `${Math.floor(seconds * 1000)} ms`
@ -73,16 +78,27 @@ function elapsedPretty(seconds) {
if (seconds < 60) { if (seconds < 60) {
return `${Math.floor(seconds)} sec` return `${Math.floor(seconds)} sec`
} }
var minutes = Math.floor(seconds / 60) let minutes = Math.floor(seconds / 60)
if (minutes < 70) { if (minutes < 70) {
return `${minutes} min` return `${minutes} min`
} }
var hours = Math.floor(minutes / 60) let hours = Math.floor(minutes / 60)
minutes -= hours * 60 minutes -= hours * 60
if (!minutes) {
return `${hours} hr` let days = Math.floor(hours / 24)
hours -= days * 24
const timeParts = []
if (days) {
timeParts.push(`${days} d`)
} }
return `${hours} hr ${minutes} min` if (hours || (days && minutes)) {
timeParts.push(`${hours} hr`)
}
if (minutes) {
timeParts.push(`${minutes} min`)
}
return timeParts.join(' ')
} }
module.exports.elapsedPretty = elapsedPretty module.exports.elapsedPretty = elapsedPretty

View File

@ -0,0 +1,36 @@
/**
* Handle timeouts greater than 32-bit signed integer
*/
class LongTimeout {
constructor() {
this.timeout = 0
this.timer = null
}
clear() {
clearTimeout(this.timer)
}
/**
*
* @param {Function} fn
* @param {number} timeout
*/
set(fn, timeout) {
const maxValue = 2147483647
const handleTimeout = () => {
if (this.timeout > 0) {
let delay = Math.min(this.timeout, maxValue)
this.timeout = this.timeout - delay
this.timer = setTimeout(handleTimeout, delay)
return
}
fn()
}
this.timeout = timeout
handleTimeout()
}
}
module.exports = LongTimeout