add a cache for accounts too
This commit is contained in:
parent
a8d70174ad
commit
ab3efd2829
|
@ -108,13 +108,13 @@
|
||||||
if (process.env.NODE_ENV !== 'production') {
|
if (process.env.NODE_ENV !== 'production') {
|
||||||
console.log('addStatuses()')
|
console.log('addStatuses()')
|
||||||
}
|
}
|
||||||
let instanceName = this.store.get('instanceName')
|
let instanceName = this.store.get('currentInstance')
|
||||||
let timeline = this.get('timeline')
|
let timeline = this.get('timeline')
|
||||||
/* no await */ database.insertStatuses(instanceName, timeline, newStatuses)
|
|
||||||
let statusIds = this.get('statusIds')
|
let statusIds = this.get('statusIds')
|
||||||
if (!statusIds) {
|
if (!statusIds) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
/* no await */ database.insertStatuses(instanceName, timeline, newStatuses)
|
||||||
let newStatusIds = newStatuses.map(status => status.id)
|
let newStatusIds = newStatuses.map(status => status.id)
|
||||||
let merged = mergeStatuses(statusIds, newStatusIds)
|
let merged = mergeStatuses(statusIds, newStatusIds)
|
||||||
this.set({ statusIds: merged })
|
this.set({ statusIds: merged })
|
||||||
|
|
|
@ -16,12 +16,20 @@ import {
|
||||||
import QuickLRU from 'quick-lru'
|
import QuickLRU from 'quick-lru'
|
||||||
|
|
||||||
const statusesCache = new QuickLRU({maxSize: 100})
|
const statusesCache = new QuickLRU({maxSize: 100})
|
||||||
|
const accountsCache = new QuickLRU({maxSize: 50})
|
||||||
|
|
||||||
if (process.browser && process.env.NODE_ENV !== 'production') {
|
if (process.browser && process.env.NODE_ENV !== 'production') {
|
||||||
window.cacheStats = {
|
window.cacheStats = {
|
||||||
|
statuses: {
|
||||||
cache: statusesCache,
|
cache: statusesCache,
|
||||||
cacheHits: 0,
|
hits: 0,
|
||||||
cacheMisses: 0
|
misses: 0
|
||||||
|
},
|
||||||
|
accounts: {
|
||||||
|
cache: accountsCache,
|
||||||
|
hits: 0,
|
||||||
|
misses: 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +59,10 @@ export async function getTimeline(instanceName, timeline, maxId = null, limit =
|
||||||
export async function insertStatuses(instanceName, timeline, statuses) {
|
export async function insertStatuses(instanceName, timeline, statuses) {
|
||||||
for (let status of statuses) {
|
for (let status of statuses) {
|
||||||
statusesCache.set(status.id, status)
|
statusesCache.set(status.id, status)
|
||||||
|
accountsCache.set(status.account.id, status.account)
|
||||||
|
if (status.reblog) {
|
||||||
|
accountsCache.set(status.reblog.account.id, status.reblog.account)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const db = await getDatabase(instanceName, timeline)
|
const db = await getDatabase(instanceName, timeline)
|
||||||
await dbPromise(db, [TIMELINE_STORE, STATUSES_STORE, ACCOUNTS_STORE], 'readwrite', (stores) => {
|
await dbPromise(db, [TIMELINE_STORE, STATUSES_STORE, ACCOUNTS_STORE], 'readwrite', (stores) => {
|
||||||
|
@ -90,12 +102,22 @@ export async function setInstanceVerifyCredentials(instanceName, verifyCredentia
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getAccount(instanceName, accountId) {
|
export async function getAccount(instanceName, accountId) {
|
||||||
|
if (accountsCache.has(accountId)) {
|
||||||
|
if (process.browser && process.env.NODE_ENV !== 'production') {
|
||||||
|
window.cacheStats.accounts.hits++
|
||||||
|
}
|
||||||
|
return accountsCache.get(accountId)
|
||||||
|
}
|
||||||
const db = await getDatabase(instanceName)
|
const db = await getDatabase(instanceName)
|
||||||
return await dbPromise(db, ACCOUNTS_STORE, 'readonly', (store, callback) => {
|
let result = await dbPromise(db, ACCOUNTS_STORE, 'readonly', (store, callback) => {
|
||||||
store.get(accountId).onsuccess = (e) => {
|
store.get(accountId).onsuccess = (e) => {
|
||||||
callback(e.target.result && e.target.result)
|
callback(e.target.result && e.target.result)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
if (process.browser && process.env.NODE_ENV !== 'production') {
|
||||||
|
window.cacheStats.accounts.misses++
|
||||||
|
}
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function clearDatabaseForInstance(instanceName) {
|
export async function clearDatabaseForInstance(instanceName) {
|
||||||
|
@ -105,7 +127,7 @@ export async function clearDatabaseForInstance(instanceName) {
|
||||||
export async function getStatus(instanceName, statusId) {
|
export async function getStatus(instanceName, statusId) {
|
||||||
if (statusesCache.has(statusId)) {
|
if (statusesCache.has(statusId)) {
|
||||||
if (process.browser && process.env.NODE_ENV !== 'production') {
|
if (process.browser && process.env.NODE_ENV !== 'production') {
|
||||||
window.cacheStats.cacheHits++
|
window.cacheStats.statuses.hits++
|
||||||
}
|
}
|
||||||
return statusesCache.get(statusId)
|
return statusesCache.get(statusId)
|
||||||
}
|
}
|
||||||
|
@ -117,7 +139,7 @@ export async function getStatus(instanceName, statusId) {
|
||||||
})
|
})
|
||||||
statusesCache.set(statusId, result)
|
statusesCache.set(statusId, result)
|
||||||
if (process.browser && process.env.NODE_ENV !== 'production') {
|
if (process.browser && process.env.NODE_ENV !== 'production') {
|
||||||
window.cacheStats.cacheMisses++
|
window.cacheStats.statuses.misses++
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
|
@ -9,6 +9,10 @@ import {
|
||||||
} from './constants'
|
} from './constants'
|
||||||
|
|
||||||
export function getDatabase(instanceName) {
|
export function getDatabase(instanceName) {
|
||||||
|
if (!instanceName && process.env.NODE_ENV !== 'production') {
|
||||||
|
console.trace()
|
||||||
|
throw new Error('instanceName is undefined in getDatabase()')
|
||||||
|
}
|
||||||
if (databaseCache[instanceName]) {
|
if (databaseCache[instanceName]) {
|
||||||
return Promise.resolve(databaseCache[instanceName])
|
return Promise.resolve(databaseCache[instanceName])
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue