@vanillaspa/sqlite-database 1.4.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import sqlite3InitModule from '@sqlite.org/sqlite-wasm';
2
- import { addEventListener, dispatchEvent } from '@vanillaspa/event-bus';
3
2
 
4
3
  if (!window.Worker) throw new Error(`Your browser doesn't support web workers.`);
5
4
 
@@ -12,17 +11,6 @@ try {
12
11
  console.error('Initialization error:', err.name, err.message);
13
12
  }
14
13
 
15
- const workers = new Map();
16
- export function getWorkers() {
17
- return workers;
18
- }
19
-
20
- function initializeWorker(name) {
21
- if (!workers.has(name)) {
22
- workers.set(name, new Worker(new URL('./sqliteWorker.js', import.meta.url), { type: 'module' }));
23
- }
24
- }
25
-
26
14
  function enqueue(worker, payload) {
27
15
  const { port1, port2 } = new MessageChannel();
28
16
  return new Promise((resolve, reject) => {
@@ -40,95 +28,62 @@ function enqueue(worker, payload) {
40
28
  })
41
29
  }
42
30
 
43
- function fire(type, detail, context) {
44
- dispatchEvent(new CustomEvent(type, { detail: { ...detail, target: context } }));
45
- }
46
- // No public API, but event-bus listener
47
- addEventListener('sqlite:createDB', async (event) => {
48
- const { name, target } = event.detail;
49
- try {
50
- initializeWorker(name);
51
- const result = await enqueue(workers.get(name), { action: 'createDB', name });
52
- fire('sqlite:ready', { result, name }, target);
53
- } catch (error) {
54
- fire('sqlite:error', { error: error.message, action: 'createDB' }, target);
31
+ const workers = new Map();
32
+ function getWorker(name) {
33
+ if (!workers.has(name)) {
34
+ workers.set(name, new Worker(new URL('./sqliteWorker.js', import.meta.url), { type: 'module' }));
55
35
  }
56
- }, import.meta);
36
+ return workers.get(name);
37
+ }
57
38
 
58
- addEventListener('sqlite:query', async (event) => {
59
- const { sql, name, target } = event.detail;
60
- try {
61
- const result = await enqueue(workers.get(name), { action: "executeQuery", sql });
62
- fire('sqlite:result', { result, sql }, target);
63
- } catch (error) {
64
- fire('sqlite:error', { error: error.message, action: 'executeQuery', sql }, target);
65
- }
66
- }, import.meta);
39
+ export function getWorkers() {
40
+ return workers;
41
+ }
67
42
 
68
- addEventListener('sqlite:statement', async (event) => {
69
- const { sql, values, name, target } = event.detail;
70
- try {
71
- const result = await enqueue(workers.get(name), { action: "prepareStatement", sql, values });
72
- fire('sqlite:result', { result, sql }, target);
73
- } catch (error) {
74
- fire('sqlite:error', { error: error.message, action: 'prepareStatement', sql }, target);
75
- }
76
- }, import.meta)
43
+ export function createDB(name) {
44
+ return enqueue(getWorker(name), { action: 'createDB', name });
45
+ }
77
46
 
78
- addEventListener('sqlite:upload', async (event) => {
79
- const { fileName, arrayBuffer, target } = event.detail;
80
- try {
81
- const [name, extension] = fileName.split(".");
82
- if (!['sqlite', 'sqlite3'].includes(extension)) {
83
- throw new Error(`UnsupportedError: Unsupported extension ".${extension}"`);
84
- }
85
- if (!workers.has(name)) initializeWorker(name);
86
- const result = await enqueue(workers.get(name), { action: 'uploadDB', name, arrayBuffer });
87
- fire('sqlite:upload', { result, name }, target)
88
- } catch (error) {
89
- fire('sqlite:error', { error: error.message, action: 'uploadDB' }, target);
90
- }
91
- }, import.meta);
47
+ export async function closeDB(name) {
48
+ const worker = getWorker(name);
49
+ await enqueue(worker, { action: 'closeDB' });
50
+ worker.terminate();
51
+ workers.delete(name);
52
+ }
92
53
 
93
- addEventListener('sqlite:download', async (event) => {
94
- const { name, target } = event.detail;
95
- try {
96
- const blob = await enqueue(workers.get(name), { action: 'downloadDB' });
97
- const url = URL.createObjectURL(blob);
98
- const a = document.createElement('a');
99
- a.href = url;
100
- a.download = `${name}.sqlite3`;
101
- a.click();
102
- URL.revokeObjectURL(url)
103
- fire('sqlite:downloaded', { name }, target);
104
- } catch (error) {
105
- fire('sqlite:error', { error: error.message, action: 'downloadDB' }, target);
106
- }
107
- }, import.meta);
54
+ export async function deleteDB(name) {
55
+ const worker = getWorker(name);
56
+ await enqueue(worker, { action: 'closeDB' });
57
+ const root = await navigator.storage.getDirectory();
58
+ const fileHandle = await root.getFileHandle(`${name}.sqlite3`).catch(() => null);
59
+ if (fileHandle) await fileHandle.remove();
60
+ worker.terminate();
61
+ workers.delete(name);
62
+ }
108
63
 
109
- addEventListener('sqlite:closeDB', async (event) => {
110
- const { name, target } = event.detail;
111
- try {
112
- await enqueue(workers.get(name), { action: 'closeDB' });
113
- workers.get(name).terminate();
114
- workers.delete(name);
115
- fire('sqlite:closed', { name }, target);
116
- } catch (error) {
117
- fire('sqlite:error', { error: error.message, action: 'closeDB' }, target);
118
- }
119
- }, import.meta);
64
+ export function executeQuery(sql, name) {
65
+ return enqueue(getWorker(name), { action: 'executeQuery', sql });
66
+ }
67
+
68
+ export function executeStatement(sql, values, name) {
69
+ return enqueue(getWorker(name), { action: 'prepareStatement', sql, values });
70
+ }
120
71
 
121
- addEventListener('sqlite:deleteDB', async (event) => {
122
- const { name, target } = event.detail;
123
- try {
124
- await enqueue(workers.get(name), { action: 'closeDB' });
125
- const root = await navigator.storage.getDirectory();
126
- const fileHandle = await root.getFileHandle(`${name}.sqlite3`).catch(() => null);
127
- if (fileHandle) await fileHandle.remove();
128
- workers.get(name).terminate();
129
- workers.delete(name);
130
- fire('sqlite:deleted', { name }, target);
131
- } catch (error) {
132
- fire('sqlite:error', { error: error.message, action: 'deleteDB' }, target);
72
+ export function uploadDB(fileName, arrayBuffer) {
73
+ const [name, extension] = fileName.split('.'); // TODO handle multiple dots in fileName
74
+ if (!['sqlite', 'sqlite3'].includes(extension)) {
75
+ throw new Error(`UnsupportedError: Unsupported extension ".${extension}"`);
133
76
  }
134
- }, import.meta);
77
+ return enqueue(getWorker(name), { action: 'uploadDB', name, arrayBuffer });
78
+ }
79
+
80
+ export async function downloadDB(name) {
81
+ const blob = await enqueue(getWorker(name), { action: 'downloadDB' });
82
+ const url = URL.createObjectURL(blob);
83
+ const a = document.createElement('a');
84
+ a.href = url;
85
+ a.download = `${name}.sqlite3`;
86
+ a.click();
87
+ URL.revokeObjectURL(url);
88
+ return blob;
89
+ }
package/package.json CHANGED
@@ -5,8 +5,7 @@
5
5
  },
6
6
  "description": "A serverless SQLite database inside your browser.",
7
7
  "dependencies": {
8
- "@sqlite.org/sqlite-wasm":"latest",
9
- "@vanillaspa/event-bus": "latest"
8
+ "@sqlite.org/sqlite-wasm":"latest"
10
9
  },
11
10
  "homepage": "https://github.com/vanillaspa/sqlite-database#readme",
12
11
  "keywords": [
@@ -31,5 +30,5 @@
31
30
  "url": "git+https://github.com/vanillaspa/sqlite-database.git"
32
31
  },
33
32
  "type": "module",
34
- "version": "1.4.2"
33
+ "version": "1.6.0"
35
34
  }
package/sqliteWorker.js CHANGED
@@ -10,7 +10,7 @@ async function getInstance() {
10
10
  return sqlite3;
11
11
  }
12
12
 
13
- function reply(port, result) {
13
+ function reply(port, result) { // TODO: check json coverage
14
14
  port.postMessage({ type: 'application/json', result });
15
15
  port.close();
16
16
  }
@@ -69,7 +69,7 @@ onmessage = async function ({ data, ports }) {
69
69
  case 'executeQuery': {
70
70
  const { sql } = data;
71
71
  try {
72
- const result = db.exec({ sql: sql.sql, returnValue: "resultRows" });
72
+ const result = db.exec({ sql , returnValue: "resultRows" });
73
73
  reply(port, result);
74
74
  } catch (e) {
75
75
  handleSQLiteError(port, sql, e)