Cache titles to reduce title requests. #2327

This commit is contained in:
ccd0 2019-08-04 18:58:53 -07:00
parent c6d4a42467
commit 5c6e8e15bd
2 changed files with 50 additions and 8 deletions

View File

@ -20,6 +20,8 @@ Embedding =
for key, service of Embedding.types when service.title?.batchSize
Embedding.flushTitles service.title
return
@cache.init Conf['cachedTitles']
$.sync 'cachedTitles', @cache.sync
events: (post) ->
return if g.VIEW is 'archive'
@ -106,7 +108,9 @@ Embedding =
{key, uid, options, link, post} = data
return if not (service = Embedding.types[key].title)
$.addClass link, key.toLowerCase()
if service.batchSize
if (text = Embedding.cache.get data)
Embedding.cb.titleText text, data
else if service.batchSize
(service.queue or= []).push data
if service.queue.length >= service.batchSize
Embedding.flushTitles service
@ -122,6 +126,38 @@ Embedding =
return
CrossOrigin.cache service.api(data.uid for data in queue), cb
cache: do ->
titles = $.dict()
newEntries = []
init = (data) ->
try
for {key, uid, text} in data
titles["#{key}.#{uid}"] = text
return
sync = (data) ->
try
for {key, uid, text} in data
k = "#{key}.#{uid}"
break if k of titles
titles[k] = text
return
get = ({key, uid}) ->
titles["#{key}.#{uid}"]
set = ({key, uid}, text) ->
titles["#{key}.#{uid}"] = text
newEntries.push {key, uid, text}
save()
save = $.debounce 2 * $.SECOND, ->
$.get 'cachedTitles', Conf['cachedTitles'], ({cachedTitles}) ->
sync cachedTitles
try
cachedTitles = newEntries.concat(cachedTitles)[-100..]
catch
cachedTitles = newEntries
newEntries = []
$.set 'cachedTitles', cachedTitles
{init, sync, get, set, save}
preview: (data) ->
{key, uid, link} = data
return if not (service = Embedding.types[key].preview)
@ -179,21 +215,25 @@ Embedding =
title: (req, data) ->
return unless req.status
{key, uid, options, link, post} = data
{key, uid} = data
{status} = req
service = Embedding.types[key].title
text = "[#{key}] #{switch status
switch status
when 200, 304
service.text req.response, uid
text = service.text req.response, uid
Embedding.cache.set data, text
when 404
"Not Found"
text = "Not Found"
when 403
"Forbidden or Private"
text = "Forbidden or Private"
else
"#{status}'d"
}"
text = "#{status}'d"
Embedding.cb.titleText text, data
titleText: (text, data) ->
{key, link, post} = data
text = "[#{key}] #{text}"
link.dataset.original = link.textContent
link.textContent = text
for post2 in post.clones

View File

@ -1183,3 +1183,5 @@ Config =
hiddenPSAList: [{}]
knownBanners: '<%= readJSON("banners.json").join(",") %>'
cachedTitles: [[]]