From 911ff7fd8b9544f2c2a3a279e5174bcf28377fa6 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Mon, 4 Nov 2024 15:26:17 +0900 Subject: [PATCH] Add compression-streams-polyfill and integrate CompressionStream support --- package.json | 1 + pnpm-lock.yaml | 15 +++++++++++++++ src/ts/storage/risuSave.ts | 14 ++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/package.json b/package.json index c74c0ccc..4d96dce0 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "body-parser": "^1.20.2", "buffer": "^6.0.3", "codemirror": "^5.65.16", + "compression-streams-polyfill": "^0.1.7", "core-js": "^3.35.0", "cors": "^2.8.5", "crc": "^4.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1670758c..6b072698 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,6 +86,9 @@ importers: codemirror: specifier: ^5.65.16 version: 5.65.16 + compression-streams-polyfill: + specifier: ^0.1.7 + version: 0.1.7 core-js: specifier: ^3.35.0 version: 3.35.0 @@ -1491,6 +1494,9 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compression-streams-polyfill@0.1.7: + resolution: {integrity: sha512-Y6VkJzi9JkvmcgDuJ2jJZ5DGljNhUrFBGxx5+gQ2RNg+uPesuRDDL5zN1NTk5NTuynyVkQ4MNip5z37MmtbdpQ==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1908,6 +1914,9 @@ packages: fflate@0.8.1: resolution: {integrity: sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -5031,6 +5040,10 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + compression-streams-polyfill@0.1.7: + dependencies: + fflate: 0.8.2 + concat-map@0.0.1: {} console-control-strings@1.1.0: @@ -5493,6 +5506,8 @@ snapshots: fflate@0.8.1: {} + fflate@0.8.2: {} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 diff --git a/src/ts/storage/risuSave.ts b/src/ts/storage/risuSave.ts index a4e6fd6c..41e41aa9 100644 --- a/src/ts/storage/risuSave.ts +++ b/src/ts/storage/risuSave.ts @@ -15,6 +15,18 @@ 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 magicStreamCompressedHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 9]); + +async function checkCompressionStreams(){ + if(!CompressionStream){ + const {makeCompressionStream} = await import('compression-streams-polyfill/ponyfill'); + globalThis.CompressionStream = makeCompressionStream(TransformStream); + } + if(!DecompressionStream){ + const {makeDecompressionStream} = await import('compression-streams-polyfill/ponyfill'); + globalThis.DecompressionStream = makeDecompressionStream(TransformStream); + } +} + export function encodeRisuSaveLegacy(data:any, compression:'noCompression'|'compression' = 'noCompression'){ let encoded:Uint8Array = packr.encode(data) if(compression === 'compression'){ @@ -33,6 +45,7 @@ export function encodeRisuSaveLegacy(data:any, compression:'noCompression'|'comp } export async function encodeRisuSave(data:any) { + await checkCompressionStreams() let encoded:Uint8Array = packr.encode(data) const cs = new CompressionStream('gzip'); const writer = cs.writable.getWriter(); @@ -55,6 +68,7 @@ export async function decodeRisuSave(data:Uint8Array){ data = data.slice(magicHeader.length) return unpackr.decode(data) case "stream":{ + await checkCompressionStreams() data = data.slice(magicStreamCompressedHeader.length) const cs = new DecompressionStream('gzip'); const writer = cs.writable.getWriter();