# squeeze/1.0/assets/js/worker.js

Squeeze – Image Optimization &amp; Compression, WEBP Conversion, version 1.0. 104 lines.

- Page: https://pluginprobe.com/plugins/squeeze/1.0/code/assets/js/worker.js
- Raw: https://pluginprobe.com/plugins/squeeze/1.0/raw/assets/js/worker.js
- Modified: 2023-06-16T08:41:02+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/squeeze/1.0/code/assets/js/worker.js#L10-L20`.

```javascript
import * as jpeg from '@jsquash/jpeg';
import * as png from '@jsquash/png';
import optimise from '@jsquash/oxipng/optimise';

async function decode(sourceType, fileBuffer) {
  switch (sourceType) {
    //case 'avif':
    //  return await avif.decode(fileBuffer);
    case 'jpeg':
      return await jpeg.decode(fileBuffer);
    case 'png':
      return await png.decode(fileBuffer);
    //case 'webp':
    //  return await webp.decode(fileBuffer);
    default:
      throw new Error(`Unknown source type: ${sourceType}`);
  }
}

async function encode(outputType, imageData) {
  const options = {
    "jpeg_quality": 75,
    "jpeg_baseline": false,
    "jpeg_arithmetic": false,
    "jpeg_progressive": true,
    "jpeg_optimize_coding": true,
    "jpeg_smoothing": 0,
    "jpeg_color_space": 3,
    "jpeg_quant_table": 3,
    "jpeg_trellis_multipass": false,
    "jpeg_trellis_opt_zero": false,
    "jpeg_trellis_opt_table": false,
    "jpeg_trellis_loops": 1,
    "jpeg_auto_subsample": true,
    "jpeg_chroma_subsample": 2,
    "jpeg_separate_chroma_quality": false,
    "jpeg_chroma_quality": 75,
    "png_level": 2,
    "png_interlace": false,
    "auto_compress": true,
    "backup_original": true
};

  switch (outputType) {
    //case 'avif':
    //  return await avif.encode(imageData);
    case 'jpeg':
      const jpegOptions = {}
      for (const [key, value] of Object.entries(options)) {
        if (key.includes('jpeg')) {
          const keyName = key.replace('jpeg_', '')
          jpegOptions[keyName] = value
        }
      }
      return await jpeg.encode(imageData, jpegOptions);
    case 'png':
      const pngOptions = {}
      for (const [key, value] of Object.entries(options)) {
        if (key.includes('png')) {
          const keyName = key.replace('png_', '')
          pngOptions[keyName] = value
        }
      }
      return await png.encode(imageData, pngOptions);
    //case 'webp':
    //  return await webp.encode(imageData);
    default:
      throw new Error(`Unknown output type: ${outputType}`);
  }
}

async function convert(sourceType, outputType, fileBuffer) {
  const imageData = await decode(sourceType, fileBuffer);
  return encode(outputType, imageData);
}

function blobToBase64(blob) {
  return new Promise((resolve, _) => {
    const reader = new FileReader();
    reader.onloadend = () => resolve(reader.result);
    reader.readAsDataURL(blob);
  });
}

async function showOutput(imageBuffer, outputType) {
  const imageBlob = new Blob([imageBuffer], { type: `image/${outputType}` });
  const base64String = await blobToBase64(imageBlob);

  return base64String;
}

self.onmessage = async function(e) {
  console.log('Worker: Message received from main script');

  const {fileBuffer, sourceType, outputType} = e.data;

  let imageBuffer = await convert(sourceType, outputType, fileBuffer);
  let base64 = await showOutput(imageBuffer, outputType);

  console.log(e)

  postMessage(base64)
  
}
```
