Skip encoding/decoding step when importing and downloading projects

This commit is contained in:
Misode
2024-11-26 01:15:24 +01:00
parent ef03fe6058
commit d370b4244a
3 changed files with 10 additions and 9 deletions

View File

@@ -295,23 +295,23 @@ export class BiMap<A, B> {
}
}
export async function readZip(file: File | ArrayBuffer, predicate: (name: string) => boolean = () => true): Promise<[string, string][]> {
export async function readZip(file: File | ArrayBuffer, predicate: (name: string) => boolean = () => true): Promise<[string, Uint8Array][]> {
const buffer = file instanceof File ? await file.arrayBuffer() : file
const reader = new zip.ZipReader(new zip.BlobReader(new Blob([buffer])))
const entries = await reader.getEntries()
return await Promise.all(entries
.filter(e => !e.directory && predicate(e.filename))
.map(async e => {
const writer = new zip.TextWriter('utf-8')
return [e.filename, await e.getData?.(writer)] as [string, string]
const writer = new zip.Uint8ArrayWriter()
return [e.filename, await e.getData?.(writer)]
})
)
}
export async function writeZip(entries: [string, string][]): Promise<string> {
export async function writeZip(entries: [string, Uint8Array][]): Promise<string> {
const writer = new zip.ZipWriter(new zip.Data64URIWriter('application/zip'))
await Promise.all(entries.map(async ([name, data]) => {
await writer.add(name, new zip.TextReader(data))
await writer.add(name, new zip.Uint8ArrayReader(data))
}))
return await writer.close()
}

View File

@@ -44,11 +44,13 @@ export function CustomizedPanel({ tab }: Props) {
const entries = Object.entries(pack).flatMap(([type, files]) => {
const prefix = `data/minecraft/${type}/`
return [...files.entries()].map(([name, data]) => {
return [prefix + name + '.json', stringifySource(JSON.stringify(data, null, 2), 'json')] as [string, string]
const text = stringifySource(JSON.stringify(data, null, 2), 'json')
return [prefix + name + '.json', new TextEncoder().encode(text)] as [string, Uint8Array]
})
})
const pack_format = config.versions.find(v => v.id === version)!.pack_format
entries.push(['pack.mcmeta', stringifySource(JSON.stringify({ pack: { pack_format, description: 'Customized world from misode.github.io' } }, null, 2), 'json')])
const packMcmetaText = stringifySource(JSON.stringify({ pack: { pack_format, description: 'Customized world from misode.github.io' } }, null, 2), 'json')
entries.push(['pack.mcmeta', new TextEncoder().encode(packMcmetaText)])
const url = await writeZip(entries)
download.current.setAttribute('href', url)
download.current.setAttribute('download', 'customized.zip')

View File

@@ -47,8 +47,7 @@ export function ProjectPanel() {
if (!download.current || entries === undefined) return
const zipEntries = await Promise.all(entries.map(async e => {
const data = await client.fs.readFile(projectRoot + e)
const text = new TextDecoder().decode(data)
return [e, text] as [string, string]
return [e, data] as [string, Uint8Array]
}))
const url = await writeZip(zipEntries)
download.current.setAttribute('href', url)