68 lines
2.3 KiB
JavaScript
68 lines
2.3 KiB
JavaScript
import { get } from '../_utils/lodash-lite.js'
|
|
import { mark, stop } from '../_utils/marks.js'
|
|
import { decode as decodeBlurhash, init as initBlurhash } from '../_utils/blurhash.js'
|
|
import { scheduleIdleTask } from '../_utils/scheduleIdleTask.js'
|
|
import { statusHtmlToPlainText } from '../_utils/statusHtmlToPlainText.js'
|
|
|
|
function getActualStatus (statusOrNotification) {
|
|
return get(statusOrNotification, ['status']) ||
|
|
get(statusOrNotification, ['notification', 'status'])
|
|
}
|
|
|
|
export function prepareToRehydrate () {
|
|
// start the blurhash worker a bit early to save time
|
|
try {
|
|
initBlurhash()
|
|
} catch (err) {
|
|
console.error('could not start blurhash worker', err)
|
|
}
|
|
}
|
|
|
|
async function decodeAllBlurhashes (statusOrNotification) {
|
|
const status = getActualStatus(statusOrNotification)
|
|
if (!status) {
|
|
return
|
|
}
|
|
const mediaWithBlurhashes = get(status, ['media_attachments'], [])
|
|
.concat(get(status, ['reblog', 'media_attachments'], []))
|
|
.filter(_ => _.blurhash)
|
|
if (mediaWithBlurhashes.length) {
|
|
mark(`decodeBlurhash-${status.id}`)
|
|
await Promise.all(mediaWithBlurhashes.map(async media => {
|
|
try {
|
|
media.decodedBlurhash = await decodeBlurhash(media.blurhash)
|
|
} catch (err) {
|
|
console.warn('Could not decode blurhash, ignoring', err)
|
|
}
|
|
}))
|
|
stop(`decodeBlurhash-${status.id}`)
|
|
}
|
|
}
|
|
|
|
async function calculatePlainTextContent (statusOrNotification) {
|
|
const status = getActualStatus(statusOrNotification)
|
|
if (!status) {
|
|
return
|
|
}
|
|
const originalStatus = status.reblog ? status.reblog : status
|
|
const content = originalStatus.content || ''
|
|
const mentions = originalStatus.mentions || []
|
|
// Calculating the plaintext from the HTML is a non-trivial operation, so we might
|
|
// as well do it in advance, while blurhash is being decoded on the worker thread.
|
|
await new Promise(resolve => {
|
|
scheduleIdleTask(() => {
|
|
originalStatus.plainTextContent = statusHtmlToPlainText(content, mentions)
|
|
resolve()
|
|
})
|
|
})
|
|
}
|
|
|
|
// Do stuff that we need to do when the status or notification is fetched from the database,
|
|
// like calculating the blurhash or calculating the plain text content
|
|
export async function rehydrateStatusOrNotification (statusOrNotification) {
|
|
await Promise.all([
|
|
decodeAllBlurhashes(statusOrNotification),
|
|
calculatePlainTextContent(statusOrNotification)
|
|
])
|
|
}
|