/** * Compress JSON.stringify with gzip */ export async function stringifyCompressed(chords: T): Promise { const stream = new Blob([JSON.stringify(chords)]).stream().pipeThrough(new CompressionStream("gzip")) return await new Response(stream).blob() } /** * Decompress JSON.parse with gzip */ export async function parseCompressed(blob: Blob): Promise { const stream = blob.stream().pipeThrough(new DecompressionStream("deflate")) return await new Response(stream).json() } /** * Share JS object as url query param */ export async function getSharableUrl(name: string, data: any, baseHref = window.location.href): Promise { return new Promise(async resolve => { const reader = new FileReader() reader.onloadend = function () { const base64String = (reader.result as string).replace(/^data:application\/octet-stream;base64,/, "") const url = new URL(baseHref) url.searchParams.set(name, base64String) resolve(url) } reader.readAsDataURL(await stringifyCompressed(data)) }) } export async function parseSharableUrl( name: string, url: string = window.location.href, ): Promise { const searchParams = new URL(url).searchParams if (!searchParams.has(name)) return return await fetch(`data:application/octet-stream;base64,${searchParams.get(name)}`) .then(it => it.blob()) .then(it => parseCompressed(it)) }