Closed8
大きなデータを圧縮してサーバーに渡したい

Route handlersを使っているので、4.5MB以上のリクエストを送れないが、送りたい場合が出てきた
本来バックエンドをRouter handlersから別にするべきだが、時間がかかる上にかなりデグレの心配があるのでより時間が少なそうなデータ圧縮のアプローチを行うことにした

圧縮技術の選定
- pako
- fflate
- CompressionStream

依存関係を増やしたくないのでWeb標準のCompressionStreamを使ってみる

こんなノリ
const compress = async (data: Record<string, unknown>): Promise<string> => {
const compressedConfig = JSON.stringify(data);
const encoder = new TextEncoder();
const encodedData = encoder.encode(compressedConfig);
try {
const compressedData = await new Response(
new Blob([encodedData]).stream().pipeThrough(new CompressionStream('gzip')),
).arrayBuffer();
return arrayBufferToBase64(compressedData);
} catch (error) {
console.error('compressConfig error', error);
throw error;
}
};

その名の通りテキストをエンコードする. Uint8Arrayの形式でエンコード
8ビット整数値の配列

エンコードする必要ないな

こんなノリ
const compress = async (data: Record<string, unknown>): Promise<string> => {
const compressedConfig = JSON.stringify(data);
try {
const compressedData = await new Response(
new Blob([compressedConfig]).stream().pipeThrough(new CompressionStream('gzip')),
).arrayBuffer();
return arrayBufferToBase64(compressedData);
} catch (error) {
console.error('compressConfig error', error);
throw error;
}
};
このスクラップは2025/02/04にクローズされました