@bbn/bbn 2.0.248 → 2.0.250
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/dist/bbn.js +3 -3
- package/dist/bbn.js.map +1 -1
- package/dist/bbn.sw.js +3 -3
- package/dist/bbn.sw.js.map +1 -1
- package/dist/db/classes/Object.js +18 -18
- package/dist/db/classes/ObjectProxy.d.ts +2 -1
- package/dist/db/classes/ObjectProxy.js +18 -20
- package/dist/db/classes/Proxy.js +14 -13
- package/dist/fn/browser/log.js +1 -0
- package/dist/fn/init.js +5 -2
- package/dist/index-no-dep.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +4 -2
- package/dist/worker/Client.d.ts +9 -0
- package/dist/worker/Client.js +70 -0
- package/package.json +6 -2
|
@@ -520,7 +520,6 @@ const db = {
|
|
|
520
520
|
}
|
|
521
521
|
},
|
|
522
522
|
async importStructure(database, structure) {
|
|
523
|
-
log("fn importStructure");
|
|
524
523
|
if (!this._structures[database]) {
|
|
525
524
|
this._structures[database] = {};
|
|
526
525
|
}
|
|
@@ -563,15 +562,12 @@ const db = {
|
|
|
563
562
|
database.close();
|
|
564
563
|
resolve(version);
|
|
565
564
|
};
|
|
566
|
-
req.
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
database.close();
|
|
572
|
-
resolve(version);
|
|
565
|
+
req.onerror = () => {
|
|
566
|
+
reject(req.error);
|
|
567
|
+
};
|
|
568
|
+
req.onblocked = () => {
|
|
569
|
+
reject(new Error(_('Opening database %s to determine its version was blocked', name)));
|
|
573
570
|
};
|
|
574
|
-
req.onerror = () => reject(req.error);
|
|
575
571
|
});
|
|
576
572
|
},
|
|
577
573
|
async reopenWithUpgrade(name) {
|
|
@@ -585,15 +581,16 @@ const db = {
|
|
|
585
581
|
if (this._connections[name]) {
|
|
586
582
|
this.close(name);
|
|
587
583
|
}
|
|
588
|
-
|
|
584
|
+
const obj = await this.open(name, nextVersion);
|
|
585
|
+
return obj;
|
|
589
586
|
},
|
|
590
587
|
async open(database, version) {
|
|
591
588
|
//log("Hello " + database)
|
|
592
589
|
if (!idb) {
|
|
593
590
|
throw new Error(_('IndexedDB is not available'));
|
|
594
591
|
}
|
|
595
|
-
if (
|
|
596
|
-
return new Promise(resolve => resolve(new bbnDbObjectProxy(database)));
|
|
592
|
+
if (bbn.worker) {
|
|
593
|
+
return new Promise(resolve => resolve(new bbnDbObjectProxy(bbn.worker, database)));
|
|
597
594
|
}
|
|
598
595
|
if (!this._structures[database]) {
|
|
599
596
|
throw new Error(_('Impossible to find a structure for the database %s', database));
|
|
@@ -602,10 +599,11 @@ const db = {
|
|
|
602
599
|
return this._objects[database];
|
|
603
600
|
}
|
|
604
601
|
await new Promise((resolve, reject) => {
|
|
605
|
-
const req = version
|
|
606
|
-
|
|
602
|
+
const req = version
|
|
603
|
+
? idb.open(database, version)
|
|
604
|
+
: idb.open(database);
|
|
605
|
+
req.onupgradeneeded = event => {
|
|
607
606
|
const db = req.result;
|
|
608
|
-
this._connections[database] = req.result;
|
|
609
607
|
const dbStructure = this._structures[database] || {};
|
|
610
608
|
iterate(dbStructure, (structure, storeName) => {
|
|
611
609
|
if (!db.objectStoreNames.contains(storeName)) {
|
|
@@ -617,9 +615,11 @@ const db = {
|
|
|
617
615
|
this._connections[database] = req.result;
|
|
618
616
|
resolve(req.result);
|
|
619
617
|
};
|
|
620
|
-
req.onerror = () =>
|
|
621
|
-
|
|
622
|
-
|
|
618
|
+
req.onerror = () => {
|
|
619
|
+
reject(req.error);
|
|
620
|
+
};
|
|
621
|
+
req.onblocked = event => {
|
|
622
|
+
reject(new Error(_('Upgrade blocked for database %s', database)));
|
|
623
623
|
};
|
|
624
624
|
});
|
|
625
625
|
this._objects[database] = new DbObject(database);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { DbApi, OrderClause } from '../types.js';
|
|
2
2
|
export default class bbnDbObjectProxy implements DbApi {
|
|
3
|
+
private readonly _worker;
|
|
3
4
|
private readonly _dbName;
|
|
4
5
|
lastErr: any;
|
|
5
|
-
constructor(dbName: string);
|
|
6
|
+
constructor(worker: bbnWorkerClient, dbName: string);
|
|
6
7
|
get dbName(): string;
|
|
7
8
|
insert(table: string, data: any): Promise<number>;
|
|
8
9
|
update(table: string, data: any, where: any, replace?: boolean): Promise<number>;
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
let requestId = 0;
|
|
2
|
-
function
|
|
2
|
+
function callWorker(worker, obj, method, args) {
|
|
3
3
|
return new Promise((resolve, reject) => {
|
|
4
|
-
if (!navigator.serviceWorker?.controller) {
|
|
5
|
-
reject(new Error('No active service worker controller'));
|
|
6
|
-
return;
|
|
7
|
-
}
|
|
8
4
|
const id = ++requestId;
|
|
9
5
|
const channel = new MessageChannel();
|
|
10
6
|
channel.port1.onmessage = event => {
|
|
@@ -20,7 +16,7 @@ function callServiceWorker(obj, method, args) {
|
|
|
20
16
|
resolve(msg.result);
|
|
21
17
|
}
|
|
22
18
|
else {
|
|
23
|
-
reject(new Error(msg.error || 'IndexedDB
|
|
19
|
+
reject(new Error(msg.error || 'IndexedDB worker error'));
|
|
24
20
|
}
|
|
25
21
|
channel.port1.close();
|
|
26
22
|
};
|
|
@@ -30,52 +26,54 @@ function callServiceWorker(obj, method, args) {
|
|
|
30
26
|
method,
|
|
31
27
|
args
|
|
32
28
|
};
|
|
33
|
-
|
|
29
|
+
worker.sendMessage(command, [channel.port2]);
|
|
34
30
|
});
|
|
35
31
|
}
|
|
36
32
|
export default class bbnDbObjectProxy {
|
|
33
|
+
_worker;
|
|
37
34
|
_dbName;
|
|
38
35
|
lastErr = null;
|
|
39
|
-
constructor(dbName) {
|
|
36
|
+
constructor(worker, dbName) {
|
|
37
|
+
this._worker = worker;
|
|
40
38
|
this._dbName = dbName;
|
|
41
39
|
}
|
|
42
40
|
get dbName() {
|
|
43
41
|
return this._dbName;
|
|
44
42
|
}
|
|
45
43
|
insert(table, data) {
|
|
46
|
-
return
|
|
44
|
+
return callWorker(this._worker, this, 'object.insert', [table, data]);
|
|
47
45
|
}
|
|
48
46
|
update(table, data, where, replace = false) {
|
|
49
|
-
return
|
|
47
|
+
return callWorker(this._worker, this, 'object.update', [table, data, where, replace]);
|
|
50
48
|
}
|
|
51
49
|
delete(table, where) {
|
|
52
|
-
return
|
|
50
|
+
return callWorker(this._worker, this, 'object.delete', [table, where]);
|
|
53
51
|
}
|
|
54
52
|
selectOne(table, field, where, order, start, limit) {
|
|
55
|
-
return
|
|
53
|
+
return callWorker(this._worker, this, 'object.selectOne', [table, field, where, order, start, limit]);
|
|
56
54
|
}
|
|
57
55
|
select(table, fields, where, order, start) {
|
|
58
|
-
return
|
|
56
|
+
return callWorker(this._worker, this, 'object.select', [table, fields, where, order, start]);
|
|
59
57
|
}
|
|
60
58
|
selectAll(table, fields, where, order, start, limit) {
|
|
61
|
-
return
|
|
59
|
+
return callWorker(this._worker, this, 'object.selectAll', [table, fields, where, order, start, limit]);
|
|
62
60
|
}
|
|
63
61
|
getColumnValues(table, field, where, order, start, limit) {
|
|
64
|
-
return
|
|
62
|
+
return callWorker(this._worker, this, 'object.getColumnValues', [table, field, where, order, start, limit]);
|
|
65
63
|
}
|
|
66
64
|
count(table, where) {
|
|
67
|
-
return
|
|
65
|
+
return callWorker(this._worker, this, 'object.count', [table, where]);
|
|
68
66
|
}
|
|
69
67
|
copyTable(target, table, fields, where, order, start, limit) {
|
|
70
|
-
return
|
|
68
|
+
return callWorker(this._worker, this, 'object.copyTable', [target, table, fields, where, order, start, limit]);
|
|
71
69
|
}
|
|
72
70
|
deleteTable(table) {
|
|
73
|
-
return
|
|
71
|
+
return callWorker(this._worker, this, 'object.deleteTable', [table]);
|
|
74
72
|
}
|
|
75
73
|
close() {
|
|
76
|
-
void
|
|
74
|
+
void callWorker(this._worker, this, 'object.close', []);
|
|
77
75
|
}
|
|
78
76
|
lastError() {
|
|
79
|
-
return
|
|
77
|
+
return callWorker(this._worker, this, 'object.lastError', [this.dbName]);
|
|
80
78
|
}
|
|
81
79
|
}
|
package/dist/db/classes/Proxy.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import bbnDbObjectProxy from './ObjectProxy.js';
|
|
2
2
|
let requestId = 0;
|
|
3
|
-
function
|
|
3
|
+
function callWorker(database, method, args) {
|
|
4
4
|
return new Promise((resolve, reject) => {
|
|
5
|
-
if (!navigator.serviceWorker?.controller) {
|
|
6
|
-
reject(new Error('No active service worker controller'));
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
5
|
const id = ++requestId;
|
|
10
6
|
const channel = new MessageChannel();
|
|
11
7
|
channel.port1.onmessage = event => {
|
|
@@ -17,7 +13,7 @@ function callServiceWorker(database, method, args) {
|
|
|
17
13
|
resolve(msg.result);
|
|
18
14
|
}
|
|
19
15
|
else {
|
|
20
|
-
reject(new Error(msg.error || 'IndexedDB
|
|
16
|
+
reject(new Error(msg.error || 'IndexedDB worker error'));
|
|
21
17
|
}
|
|
22
18
|
channel.port1.close();
|
|
23
19
|
};
|
|
@@ -27,26 +23,31 @@ function callServiceWorker(database, method, args) {
|
|
|
27
23
|
method,
|
|
28
24
|
args
|
|
29
25
|
};
|
|
30
|
-
|
|
26
|
+
if (!bbn.worker) {
|
|
27
|
+
reject(new Error('Worker is not available'));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
bbn.worker.sendMessage(command, [channel.port2]);
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
const bbnDbProxy = {
|
|
34
34
|
ok: true,
|
|
35
35
|
async open(database, version) {
|
|
36
|
-
await
|
|
37
|
-
return new bbnDbObjectProxy(database);
|
|
36
|
+
await callWorker(database, 'manager.open', [database, version]);
|
|
37
|
+
return new bbnDbObjectProxy(bbn.worker, database);
|
|
38
38
|
},
|
|
39
39
|
async add(database, name, structure) {
|
|
40
|
-
|
|
40
|
+
const res = await callWorker(database, 'manager.add', [database, name, structure]);
|
|
41
|
+
return res;
|
|
41
42
|
},
|
|
42
43
|
async remove(database, name) {
|
|
43
|
-
return await
|
|
44
|
+
return await callWorker(database, 'manager.remove', [database, name]);
|
|
44
45
|
},
|
|
45
46
|
async importStructure(database, structure) {
|
|
46
|
-
return await
|
|
47
|
+
return await callWorker(database, 'manager.importStructure', [database, structure]);
|
|
47
48
|
},
|
|
48
49
|
async close(database) {
|
|
49
|
-
return await
|
|
50
|
+
return await callWorker(database, 'manager.close', [database]);
|
|
50
51
|
}
|
|
51
52
|
};
|
|
52
53
|
export default bbnDbProxy;
|
package/dist/fn/browser/log.js
CHANGED
package/dist/fn/init.js
CHANGED
|
@@ -6,9 +6,9 @@ import resize from './style/resize.js';
|
|
|
6
6
|
import isMobile from './browser/isMobile.js';
|
|
7
7
|
import isTabletDevice from './browser/isTabletDevice.js';
|
|
8
8
|
import isFunction from './type/isFunction.js';
|
|
9
|
-
import log from './browser/log.js';
|
|
10
9
|
import timestamp from './datetime/timestamp.js';
|
|
11
10
|
import setupIntl from '../dt/functions/setupIntl.js';
|
|
11
|
+
import bbnWorkerClient from '../worker/Client.js';
|
|
12
12
|
const onFocus = () => {
|
|
13
13
|
bbn.env.last_focus = bbn.dt().unix();
|
|
14
14
|
};
|
|
@@ -37,7 +37,7 @@ const onActivity = (e) => {
|
|
|
37
37
|
target.hasAttribute("href") &&
|
|
38
38
|
!target.hasAttribute("target") &&
|
|
39
39
|
!target.classList.contains("bbn-no")) {
|
|
40
|
-
log("Link clicked: " + target.getAttribute("href"));
|
|
40
|
+
//log("Link clicked: " + target.getAttribute("href"));
|
|
41
41
|
link(target.getAttribute("href"), e);
|
|
42
42
|
}
|
|
43
43
|
};
|
|
@@ -123,6 +123,9 @@ export default function init(cfg, force) {
|
|
|
123
123
|
document.body.classList.add("bbn-tablet");
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
+
if (bbn.env.worker) {
|
|
127
|
+
bbn.worker = new bbnWorkerClient(bbn.env.worker);
|
|
128
|
+
}
|
|
126
129
|
if (window.history) {
|
|
127
130
|
window.onpopstate = function (e) {
|
|
128
131
|
let h = window.history;
|
package/dist/index-no-dep.js
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import bbnDbCenter from './db/classes/Center.js';
|
|
|
10
10
|
import fn from './fn.js';
|
|
11
11
|
import dt from './dt.js';
|
|
12
12
|
import buildLocaleFromIntl from './dt/functions/buildLocaleFromIntl.js';
|
|
13
|
+
export { Temporal };
|
|
13
14
|
const bbn = {
|
|
14
15
|
version: "1.0.1",
|
|
15
16
|
opt: {
|
|
@@ -24,7 +25,7 @@ const bbn = {
|
|
|
24
25
|
com,
|
|
25
26
|
env,
|
|
26
27
|
get db() {
|
|
27
|
-
if (
|
|
28
|
+
if (bbn.worker) {
|
|
28
29
|
return bbnDbProxy;
|
|
29
30
|
}
|
|
30
31
|
return bbnDb;
|
|
@@ -107,4 +108,5 @@ if ('undefined' !== typeof globalThis) {
|
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
buildLocaleFromIntl();
|
|
110
|
-
export { bbn
|
|
111
|
+
export { bbn };
|
|
112
|
+
export default bbn;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export default class bbnWorkerClient {
|
|
2
|
+
worker: SharedWorker;
|
|
3
|
+
listeners: Set<Function>;
|
|
4
|
+
hasError: boolean;
|
|
5
|
+
constructor(workerUrl: string);
|
|
6
|
+
sendMessage(message: object, ports?: any[]): boolean;
|
|
7
|
+
addEventListener(listener: Function): void;
|
|
8
|
+
removeEventListener(listener: Function): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export default class bbnWorkerClient {
|
|
2
|
+
worker;
|
|
3
|
+
listeners;
|
|
4
|
+
hasError = false;
|
|
5
|
+
constructor(workerUrl) {
|
|
6
|
+
this.listeners = new Set();
|
|
7
|
+
const url = new URL(workerUrl);
|
|
8
|
+
const w = new SharedWorker(url, {
|
|
9
|
+
type: 'module'
|
|
10
|
+
});
|
|
11
|
+
console.log('SharedWorker client created:');
|
|
12
|
+
w.onerror = event => {
|
|
13
|
+
console.error('SharedWorker error');
|
|
14
|
+
this.hasError = true;
|
|
15
|
+
console.log('constructor:', event.constructor.name);
|
|
16
|
+
console.log('type:', event.type);
|
|
17
|
+
console.log('message' in event
|
|
18
|
+
? event.message
|
|
19
|
+
: '(no message)');
|
|
20
|
+
console.log('filename' in event
|
|
21
|
+
? event.filename
|
|
22
|
+
: '(no filename)');
|
|
23
|
+
console.log('lineno' in event
|
|
24
|
+
? event.lineno
|
|
25
|
+
: '(no lineno)');
|
|
26
|
+
console.log('colno' in event
|
|
27
|
+
? event.colno
|
|
28
|
+
: '(no colno)');
|
|
29
|
+
console.log('error' in event
|
|
30
|
+
? event.error
|
|
31
|
+
: '(no error object)');
|
|
32
|
+
event.preventDefault();
|
|
33
|
+
};
|
|
34
|
+
w.port.start();
|
|
35
|
+
w.port.onmessage = event => {
|
|
36
|
+
//console.log('Received message from SharedWorker: ' + JSON.stringify(event.data));
|
|
37
|
+
for (const listener of this.listeners) {
|
|
38
|
+
try {
|
|
39
|
+
listener(event.data, event);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
console.error('Error in SharedWorker message listener', e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
this.worker = w;
|
|
47
|
+
}
|
|
48
|
+
sendMessage(message, ports = []) {
|
|
49
|
+
if (!this.worker) {
|
|
50
|
+
throw new Error('SharedWorker is not initialized');
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
this.worker.port.postMessage(message, ports);
|
|
54
|
+
if (!('database' in message)) {
|
|
55
|
+
//console.log('Sent message to SharedWorker: ' + JSON.stringify(message));
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
console.error('Unable to send message to SharedWorker', e);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
addEventListener(listener) {
|
|
65
|
+
this.listeners.add(listener);
|
|
66
|
+
}
|
|
67
|
+
removeEventListener(listener) {
|
|
68
|
+
this.listeners.delete(listener);
|
|
69
|
+
}
|
|
70
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bbn/bbn",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.250",
|
|
4
4
|
"description": "Javascript toolkit",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -40,12 +40,13 @@
|
|
|
40
40
|
"@rollup/plugin-replace": "^6.0.3",
|
|
41
41
|
"@rollup/plugin-terser": "^0.4.4",
|
|
42
42
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
43
|
+
"@rollup/plugin-commonjs": "^29.0.3",
|
|
43
44
|
"@types/mocha": "^10.0.10",
|
|
44
45
|
"chai": "^6.2.1",
|
|
45
46
|
"jsdom": "^27.2.0",
|
|
46
47
|
"jsdom-global": "^3.0.2",
|
|
47
48
|
"mocha": "^11.7.5",
|
|
48
|
-
"rollup": "^4.
|
|
49
|
+
"rollup": "^4.60.3",
|
|
49
50
|
"ts-loader": "^9.5.4",
|
|
50
51
|
"tslib": "^2.8.1",
|
|
51
52
|
"tsx": "^4.21.0",
|
|
@@ -72,5 +73,8 @@
|
|
|
72
73
|
"@formatjs/intl-relativetimeformat": "^11.4.13",
|
|
73
74
|
"cldr-core": "^48.0.0",
|
|
74
75
|
"temporal-polyfill": "^0.3.0"
|
|
76
|
+
},
|
|
77
|
+
"allowScripts": {
|
|
78
|
+
"esbuild@0.27.7": true
|
|
75
79
|
}
|
|
76
80
|
}
|