Fix simultaneous accesses to inflight RequestCache

This commit is contained in:
Cadence Ember 2020-07-29 15:32:04 +12:00
parent 43c2d66b04
commit 78cefb0776
No known key found for this signature in database
GPG Key ID: 128B99B1B74A6412
2 changed files with 6 additions and 15 deletions

View File

@ -92,7 +92,7 @@ class TtlCache {
}
/**
* @extends TtlCache<T>
* @extends TtlCache<Promise<T>>
* @template T
*/
class RequestCache extends TtlCache {
@ -110,14 +110,12 @@ class RequestCache extends TtlCache {
*/
getOrFetch(key, callback) {
this.cleanKey(key)
if (this.cache.has(key)) return Promise.resolve({result: this.get(key), fromCache: true})
else {
const pending = callback().then(result => {
this.set(key, result)
return {result, fromCache: false}
})
if (this.cache.has(key)) {
return this.getWithoutClean(key).then(result => ({result, fromCache: true}))
} else {
const pending = callback()
this.set(key, pending)
return pending
return pending.then(result => ({result, fromCache: false}))
}
}

View File

@ -400,19 +400,12 @@ function fetchShortcodeData(shortcode) {
const p = new URLSearchParams()
p.set("query_hash", constants.external.shortcode_query_hash)
p.set("variables", JSON.stringify({shortcode}))
let status
return requestCache.getOrFetchPromise("shortcode/"+shortcode, () => {
return switcher.request("post_graphql", `https://www.instagram.com/graphql/query/?${p.toString()}`, async res => {
status = res.status
if (res.status === 429) throw constants.symbols.RATE_LIMITED
}).then(res => res.json()).then(root => {
/** @type {import("./types").TimelineEntryN3} */
const data = root.data.shortcode_media
if (data && !data.__typename) { // empty data? that's really weird.
console.error(`Shortcode request ${shortcode} gave empty data object. status: ${status}, root:`)
console.error(root)
console.error("will just proceed to crash as normal.")
}
if (data == null) {
// the thing doesn't exist
throw constants.symbols.NOT_FOUND