multiformats
Version:
Interface for multihash, multicodec, multibase and CID
43 lines (38 loc) โข 2.07 kB
text/typescript
import { from } from './base.ts'
const alphabet = Array.from('๐๐ชโ๐ฐ๐๐๐๐๐๐๐๐๐๐๐๐๐โ๐ป๐ฅ๐พ๐ฟ๐โค๐๐คฃ๐๐๐๐ญ๐๐๐
๐๐๐ฅ๐ฅฐ๐๐๐๐ข๐ค๐๐๐ช๐โบ๐๐ค๐๐๐๐๐น๐คฆ๐๐โโจ๐คท๐ฑ๐๐ธ๐๐๐๐๐๐๐๐๐คฉ๐๐๐ค๐๐ฏ๐๐๐ถ๐๐คญโฃ๐๐๐๐ช๐๐ฅ๐๐๐ฉ๐ก๐คช๐๐ฅณ๐ฅ๐คค๐๐๐ณโ๐๐๐ด๐๐ฌ๐๐๐ท๐ป๐โญโ
๐ฅบ๐๐๐ค๐ฆโ๐ฃ๐๐โน๐๐๐ โ๐๐บ๐๐ป๐๐๐๐๐น๐ฃ๐ซ๐๐๐ต๐ค๐๐ด๐ค๐ผ๐ซโฝ๐คโ๐๐คซ๐๐ฎ๐๐ป๐๐ถ๐๐ฒ๐ฟ๐งก๐โก๐๐โโ๐๐ฐ๐คจ๐ถ๐ค๐ถ๐ฐ๐๐ข๐ค๐๐จ๐จ๐คฌโ๐๐บ๐ค๐๐๐ฑ๐๐ถ๐ฅดโถโกโ๐๐ธโฌ๐จ๐๐ฆ๐ท๐บโ ๐
๐๐ต๐๐คฒ๐ค ๐คง๐๐ต๐
๐ง๐พ๐๐๐ค๐๐คฏ๐ทโ๐ง๐ฏ๐๐๐ค๐๐โ๐ด๐ฃ๐ธ๐๐๐ฅ๐คข๐
๐ก๐ฉ๐๐ธ๐ป๐ค๐คฎ๐ผ๐ฅต๐ฉ๐๐๐ผ๐๐ฃ๐ฅ')
const alphabetBytesToChars: string[] = (alphabet.reduce<string[]>((p, c, i) => { p[i] = c; return p }, ([])))
const alphabetCharsToBytes: number[] = (alphabet.reduce<number[]>((p, c, i) => {
const codePoint = c.codePointAt(0)
if (codePoint == null) {
throw new Error(`Invalid character: ${c}`)
}
p[codePoint] = i
return p
}, ([])))
function encode (data: Uint8Array): string {
return data.reduce((p, c) => {
p += alphabetBytesToChars[c]
return p
}, '')
}
function decode (str: string): Uint8Array<ArrayBuffer> {
const byts = []
for (const char of str) {
const codePoint = char.codePointAt(0)
if (codePoint == null) {
throw new Error(`Invalid character: ${char}`)
}
const byt = alphabetCharsToBytes[codePoint]
if (byt == null) {
throw new Error(`Non-base256emoji character: ${char}`)
}
byts.push(byt)
}
return new Uint8Array(byts)
}
export const base256emoji = from({
prefix: '๐',
name: 'base256emoji',
encode,
decode
})