<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="https://unpkg.com/dexie@^2.0.0-beta/dist/dexie.js"></script>
  </head>

  <body>
    <button id="add" class="add">Add item to db</button>
    <textarea id="result" class="result"></textarea>
    <script src="script.js"></script>
  </body>
  
</html>
async function testFetch() {
  const result = await fetch('test.html');
  let resultObject;
  switch (result.status) {
    case 200: {
      resultObject = await result.json();
      console.table(resultObject);
      break;
    }
    case 500: {
      resultObject = await result.json();
      console.error(resultObject)
      resultText = JSON.stringify(resultObject);
      break;
    }
    default: {
      resultObject = await result.text();
      console.log(resultText);
      break;
    }
  }
  const resultElement = document.getElementById('result');
  resultElement.innerText = resultObject.map(r => r.id).join('\n');
}

async function start() {
  let service = await navigator.serviceWorker.getRegistration();
  if (service) {
    console.log('service updating');
    await service.update()
  } else {
    service = await navigator.serviceWorker.register('sw.js');
  }
  console.log('service registered: ', service);
  if(service.installing) {
    console.log('Service worker installing');
  } else if(service.waiting) {
    console.log('Service worker installed');
  } else if(service.active) {
    console.log('Service worker active');
  }
  service.onupdatefound = () => {
    console.log('update found');
  }
  navigator.serviceWorker.oncontrollerchange = () => {
    console.log('active service: ', service.active);
    testFetch();
  };
  if (service.active) {
    testFetch();
  } else {
    location.reload();
  }
}

start();
const addButton = document.getElementById('add');
addButton.onclick = () => {
  testFetch();
}
/* Styles go here */

.main {
  display: flex;
}

.add {
  width: 100%;
  margin: 10px;
}

.result {
  width: 100%;
  margin: 10px;
  height: 100px;
}
importScripts('https://unpkg.com/dexie@2.0.1/dist/dexie.js');
console.log('loaded');

self.oninstall = () => {
  console.log('installed');
  self.skipWaiting();
}
self.onactivate = () => {
  console.log('activated');
}
self.onfetch = (e) => {
  if (e.request.url.endsWith('test.html')) {
    e.respondWith(respond(e));
  }
}

async function respond(e) {
  console.log('responding to', e);
  try {
    const data = await createTestData();
    return new Response(
      JSON.stringify(data),
      {status: 200, statusText: 'OK'}
    );
  } catch (error) {
    return new Response(
      JSON.stringify(error),
      {status: 500, statusText: 'ERROR'}
    );
  }
}

async function createTestData() {
  console.log('creating test data...');
  const db = new Dexie('test');
  db.version(1).stores({test: 'id'});
  const key = await self.crypto.subtle.generateKey({name: 'AES-CBC', length: 128}, false, ['encrypt']);
  const object = {test: 'hallo'};
  const array = [1, 2, 3, 4, 5, 6];
  const map = new Map();
  const set1 = new Set();
  const id = Math.random();
  const data = {id, object, array, map, set1, key};
  console.log('created', data);
  console.log('storing data...');
  await db.table('test').put(data);
  console.log('retrieving data...');  
  const result = await db.table('test').toArray();
  console.log('data retrieved', result);
  db.close();
  return result;
}