Mercurial > prosody-modules
comparison mod_pubsub_serverinfo/mod_pubsub_serverinfo.lua @ 5812:cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 08 Jan 2024 15:38:18 +0000 |
| parents | 76b57bcfe1b2 |
| children | d38772479891 |
comparison
equal
deleted
inserted
replaced
| 5811:ce8f0e458ffa | 5812:cf5f77491323 |
|---|---|
| 225 | 225 |
| 226 function does_opt_in(remoteDomain) | 226 function does_opt_in(remoteDomain) |
| 227 | 227 |
| 228 -- try to read answer from cache. | 228 -- try to read answer from cache. |
| 229 local cached_value = opt_in_cache[remoteDomain] | 229 local cached_value = opt_in_cache[remoteDomain] |
| 230 if cached_value ~= nil and os.difftime(cached_value.expires, os.time()) > 0 then | 230 local ttl = cached_value and os.difftime(cached_value.expires, os.time()); |
| 231 if cached_value and ttl > (publication_interval + 60) then | |
| 231 module:log("debug", "Opt-in status (from cache) for '%s': %s", remoteDomain, cached_value.opt_in) | 232 module:log("debug", "Opt-in status (from cache) for '%s': %s", remoteDomain, cached_value.opt_in) |
| 232 return cached_value.opt_in; | 233 return cached_value.opt_in; |
| 233 end | 234 end |
| 234 | 235 |
| 236 -- We don't have a cached value, or it is nearing expiration - refresh it now | |
| 235 -- TODO worry about not having multiple requests in flight to the same domain.cached_value | 237 -- TODO worry about not having multiple requests in flight to the same domain.cached_value |
| 236 | 238 |
| 237 -- Cache could not provide an answer. Perform service discovery. | |
| 238 module:log("debug", "No cached opt-in status for '%s': performing disco/info to determine opt-in.", remoteDomain) | 239 module:log("debug", "No cached opt-in status for '%s': performing disco/info to determine opt-in.", remoteDomain) |
| 239 local discoRequest = st.iq({ type = "get", to = remoteDomain, from = actor, id = new_id() }) | 240 local discoRequest = st.iq({ type = "get", to = remoteDomain, from = actor, id = new_id() }) |
| 240 :tag("query", { xmlns = "http://jabber.org/protocol/disco#info" }) | 241 :tag("query", { xmlns = "http://jabber.org/protocol/disco#info" }) |
| 241 | 242 |
| 242 module:send_iq(discoRequest):next( | 243 module:send_iq(discoRequest):next( |
| 270 expires = os.time() + cache_ttl; | 271 expires = os.time() + cache_ttl; |
| 271 } | 272 } |
| 272 end | 273 end |
| 273 ); | 274 ); |
| 274 | 275 |
| 275 -- return 'false' for now. Better luck next time... | 276 if ttl and ttl <= 0 then |
| 276 return false; | 277 -- Cache entry expired, remove it and assume not opted in |
| 277 | 278 opt_in_cache[remoteDomain] = nil; |
| 278 end | 279 return false; |
| 280 end | |
| 281 | |
| 282 return cached_value and cached_value.opt_in; | |
| 283 end |
