@benev/slate
Version:
frontend web stuff
53 lines (49 loc) • 2.68 kB
JavaScript
/*
"anka" is an alternative to base64 that i totally made up.
- it looks cool because it features characters from the indian subcontinent.
- each byte is represented by one character, which makes a 256 bit id incomparably short at only 32 characters.
- however, it's probably a bad idea, for these negative reasons:
1. many of these characters are actually 2-or-3-byte sequences (so even though anka is visually more compact than base64 to the user, it's actually more data in terms of bytes).
2. it's horrible for url-encoding.
3. it's horrible for trying to manually copy by typing.
256-bit anka ids look like this:
ஒഐওଆઊসਅവஎଉखਬശயഘसചവਭଏரঊझഠடଓઐഴঠണവઞ
ठକநइஎਦਏஒഊটਹஜഴयભকயঙਪഉजकঝഐवઠসഏਓਡਟऋ
થঞठખஉધഫரਜऐફരਪਙਗഭਣഎफઇমએরଔડਉதਤஅदઘച
*/
import { Bytes } from "./bytes.js";
const characters = [...new Set([
// devanagari
..."अआइईउऊऋएऐओऔकखगघङचछजझञटठडढणतथदधनपफबभमयरलवशषसह",
// tamil
..."அஆஇஈஉஊஎஏஐஒஓகஙசஜஞடணதநபமயரலவழளறன",
// bengali
..."অআইঈউঊএঐওকখগঘঙচছজঝঞটঠডঢণতথদধনপফবভমযরলশষসহ",
// gurmukhi
..."ਅਆਇਈਉਊਏਐਓਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਵਸਹ",
// malayalam
..."അആഇഈഉഊഎഏഐഒഓകഖഗഘങചഛജഝഞടഠഡഢണതഥദധനപഫബഭമയരലവശസഹളഴറ",
// gujarati
..."અઆઇઈઉઊએઐઓકખગઘઙચછજઝઞટઠડઢણતથદધનપફબભમયરલવશષસહ",
// odia
..."ଅଆଇଈଉଊଏଐଓଔକଖଗଘଙଚଛଜଝଞଟଠଡଢଣତଥଦଧନପଫବଭମଯରଲଶଷସହ",
])];
export const Anka = Object.freeze({
string(bytes) {
return [...bytes]
.map(int => characters.at(int))
.join("");
},
bytes(code) {
return new Uint8Array([...code].map(char => {
const index = characters.indexOf(char);
if (index === -1)
throw new Error(`invalid anka character "${char}"`);
return index;
}));
},
random(count = 32) {
return this.string(Bytes.random(count));
},
});
//# sourceMappingURL=anka.js.map