forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import twemoji from 'twemoji'
2
3import {renderLogger} from './logger.js'
4
5const U200D = String.fromCharCode(0x200d)
6const UFE0F_REGEXP = /\uFE0F/g
7
8export async function loadEmojiAsSvg(chars: string) {
9 const cached = emojiCache.get(chars)
10 if (cached) return cached
11 const iconCode = twemoji.convert.toCodePoint(
12 chars.indexOf(U200D) < 0 ? chars.replace(UFE0F_REGEXP, '') : chars,
13 )
14 const res = await fetch(getEmojiUrl(iconCode))
15 const body = await res.arrayBuffer()
16 if (!res.ok) {
17 renderLogger.warn(
18 {status: res.status, err: Buffer.from(body).toString()},
19 'could not fetch emoji',
20 )
21 return
22 }
23 const svg =
24 'data:image/svg+xml;base64,' + Buffer.from(body).toString('base64')
25 emojiCache.set(chars, svg)
26 return svg
27}
28
29const emojiCache = new Map<string, string>()
30
31function getEmojiUrl(code: string) {
32 return (
33 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/16.0.1/svg/' +
34 code.toLowerCase() +
35 '.svg'
36 )
37}