From 25d2ae6f5843419320b331761d34911cb3144428 Mon Sep 17 00:00:00 2001 From: Ujjwal Gupta Date: Fri, 18 Jun 2021 11:19:13 +0530 Subject: [PATCH] fix connection issue in service worker https://github.com/ujjwalguptaofficial/JsStore/issues/221 --- src/main/connection_helper.ts | 2 +- test/cases/service_worker.js | 51 +++++++++++++++++++++++++ test/files.js | 6 +++ test/static/sw.js | 72 +++++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 test/cases/service_worker.js create mode 100644 test/static/sw.js diff --git a/src/main/connection_helper.ts b/src/main/connection_helper.ts index 3d75cddc..b1dac887 100644 --- a/src/main/connection_helper.ts +++ b/src/main/connection_helper.ts @@ -41,7 +41,7 @@ export class ConnectionHelper { private $worker; private get jsstoreWorker() { - return this.$worker || window['JsStoreWorker']; + return this.$worker || self['JsStoreWorker']; } constructor(worker?: Worker) { diff --git a/test/cases/service_worker.js b/test/cases/service_worker.js new file mode 100644 index 00000000..1be5a225 --- /dev/null +++ b/test/cases/service_worker.js @@ -0,0 +1,51 @@ + +describe('Test service worker', function () { + it('register service worker', function () { + var __waitForSWState = function(registration, desiredState) { + return new Promise((resolve, reject) => { + let serviceWorker = registration.installing; + + if (!serviceWorker) { + return reject(new Error('The service worker is not installing. ' + + 'Is the test environment clean?')); + } + + const stateListener = (evt) => { + if (evt.target.state === desiredState) { + serviceWorker.removeEventListener('statechange', stateListener); + return resolve(); + } + + if (evt.target.state === 'redundant') { + serviceWorker.removeEventListener('statechange', stateListener); + + return reject(new Error('Installing service worker became redundant')); + } + }; + + serviceWorker.addEventListener('statechange', stateListener); + }); + } + return navigator.serviceWorker.register("/test/static/sw.js") + .then(function (reg ) { + return __waitForSWState(reg,'installed'); + }) + + }) + + it('check if connection is created',function(){ + window.caches.match('/__test/example') + .then((response) => { + if (!response) { + throw new Error('Eek, no response was found in the cache.'); + } + + return response.text(); + }) + .then((responseText) => { + if (responseText !== 'Hello, World!') { + throw new Error(`The response text was wrong!: '${responseText}'`); + } + }); + }) +}) \ No newline at end of file diff --git a/test/files.js b/test/files.js index db72cdfc..92cfcb0c 100644 --- a/test/files.js +++ b/test/files.js @@ -24,11 +24,17 @@ exports.list_of_files = [ 'test/cases/db_update_datatype.js', 'test/cases/multiple_connection.js', 'test/cases/db_upgrade.js', + 'test/cases/service_worker.js', { pattern: 'test/static/*.json', included: false, served: true, }, + { + pattern: 'test/static/*.js', + included: false, + served: true, + }, { pattern: 'output/*.js', included: false, diff --git a/test/static/sw.js b/test/static/sw.js new file mode 100644 index 00000000..d92ad389 --- /dev/null +++ b/test/static/sw.js @@ -0,0 +1,72 @@ +importScripts('/output/jsstore.js'); +importScripts('/output/jsstore.worker.js'); + +self.addEventListener('fetch', function (event) { + console.log("fetch event:", event.request.url); +}); + +var dbName = "ServiceWorkerDemo"; + +function initDb() { + var connection = new JsStore.Connection(); + return connection.initDb(getDbSchema()).then(function(isDbCreated){ + if (isDbCreated) { + console.log('db created'); + } + else { + console.log('db opened'); + } + return connection; + }) +} + +function getDbSchema() { + var table = { + name: 'Student', + columns: { + id: { + primaryKey: true, + autoIncrement: true + }, + name: { + notNull: true, + dataType: 'string' + }, + gender: { + dataType: 'string', + default: 'male' + }, + country: { + notNull: true, + dataType: 'string' + }, + city: { + dataType: 'string', + notNull: true + } + } + } + + var db = { + name: dbName, + tables: [table] + } + return db; +} + +// throw "ss" + +self.addEventListener('install', (event) => { + const promiseChain = caches.open('test-cache') + .then((openCache) => { + initDb().then(function (connection) { + return connection.terminate(); + }).then(() => { + return openCache.put( + new Request('/__test/example'), + new Response('Hello, World!') + ); + }) + }); + event.waitUntil(promiseChain); +}); \ No newline at end of file