Change saving

This commit is contained in:
kwaroran
2024-11-02 01:46:21 +09:00
parent d487bf298b
commit efbda2333d
65 changed files with 184 additions and 121 deletions

View File

@@ -1,6 +1,6 @@
import { Packr, Unpackr, decode } from "msgpackr";
import * as fflate from "fflate";
import { isTauri } from "../globalApi";
import { AppendableBuffer, isTauri } from "../globalApi.svelte";
const packr = new Packr({
useRecords:false
@@ -12,7 +12,8 @@ const unpackr = new Unpackr({
})
const magicHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 7]);
const magicCompressedHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 8]);
const magicCompressedHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 8]);
const magicStreamCompressedHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 9]);
export function encodeRisuSaveLegacy(data:any, compression:'noCompression'|'compression' = 'noCompression'){
let encoded:Uint8Array = packr.encode(data)
@@ -31,7 +32,20 @@ export function encodeRisuSaveLegacy(data:any, compression:'noCompression'|'comp
}
}
export function decodeRisuSave(data:Uint8Array){
export async function encodeRisuSave(data:any) {
let encoded:Uint8Array = packr.encode(data)
const cs = new CompressionStream('gzip');
const writer = cs.writable.getWriter();
writer.write(encoded);
writer.close();
const buf = await new Response(cs.readable).arrayBuffer()
const result = new Uint8Array(new Uint8Array(buf).length + magicStreamCompressedHeader.length);
result.set(magicStreamCompressedHeader, 0)
result.set(new Uint8Array(buf), magicStreamCompressedHeader.length)
return result
}
export async function decodeRisuSave(data:Uint8Array){
try {
switch(checkHeader(data)){
case "compressed":
@@ -40,6 +54,15 @@ export function decodeRisuSave(data:Uint8Array){
case "raw":
data = data.slice(magicHeader.length)
return unpackr.decode(data)
case "stream":{
data = data.slice(magicStreamCompressedHeader.length)
const cs = new DecompressionStream('gzip');
const writer = cs.writable.getWriter();
writer.write(data);
writer.close();
const buf = await new Response(cs.readable).arrayBuffer()
return unpackr.decode(new Uint8Array(buf))
}
}
return unpackr.decode(data)
}
@@ -63,7 +86,7 @@ export function decodeRisuSave(data:Uint8Array){
function checkHeader(data: Uint8Array) {
let header:'none'|'compressed'|'raw' = 'raw'
let header:'none'|'compressed'|'raw'|'stream' = 'raw'
if (data.length < magicHeader.length) {
return false;
@@ -84,7 +107,18 @@ function checkHeader(data: Uint8Array) {
break
}
}
}
}
if(header === 'none'){
header = 'stream'
for (let i = 0; i < magicStreamCompressedHeader.length; i++) {
if (data[i] !== magicStreamCompressedHeader[i]) {
header = 'none'
break
}
}
}
// All bytes matched
return header;
}