@bbn/bbn 2.0.247 → 2.0.249

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.
@@ -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.onupgradeneeded = () => {
567
- // Database did not exist before; this open created it temporarily.
568
- // Version is therefore effectively 1.
569
- const database = req.result;
570
- const version = database.version;
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,19 +581,16 @@ const db = {
585
581
  if (this._connections[name]) {
586
582
  this.close(name);
587
583
  }
588
- return await this.open(name, nextVersion);
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
- if (database !== 'bbn') {
593
- log("THERE SHOULD BE A DEBUGGER!!!!!!!");
594
- debugger;
595
- }
596
589
  if (!idb) {
597
590
  throw new Error(_('IndexedDB is not available'));
598
591
  }
599
- if (navigator.serviceWorker?.controller) {
600
- return new Promise(resolve => resolve(new bbnDbObjectProxy(database)));
592
+ if (bbn.worker) {
593
+ return new Promise(resolve => resolve(new bbnDbObjectProxy(bbn.worker, database)));
601
594
  }
602
595
  if (!this._structures[database]) {
603
596
  throw new Error(_('Impossible to find a structure for the database %s', database));
@@ -606,10 +599,11 @@ const db = {
606
599
  return this._objects[database];
607
600
  }
608
601
  await new Promise((resolve, reject) => {
609
- const req = version ? idb.open(database, version) : idb.open(database);
610
- req.onupgradeneeded = () => {
602
+ const req = version
603
+ ? idb.open(database, version)
604
+ : idb.open(database);
605
+ req.onupgradeneeded = event => {
611
606
  const db = req.result;
612
- this._connections[database] = req.result;
613
607
  const dbStructure = this._structures[database] || {};
614
608
  iterate(dbStructure, (structure, storeName) => {
615
609
  if (!db.objectStoreNames.contains(storeName)) {
@@ -621,9 +615,11 @@ const db = {
621
615
  this._connections[database] = req.result;
622
616
  resolve(req.result);
623
617
  };
624
- req.onerror = () => reject(req.error);
625
- req.onblocked = (event) => {
626
- reject(_('open: Upgrade blocked for database %s. Please close other connections to proceed.', database));
618
+ req.onerror = () => {
619
+ reject(req.error);
620
+ };
621
+ req.onblocked = event => {
622
+ reject(new Error(_('Upgrade blocked for database %s', database)));
627
623
  };
628
624
  });
629
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 callServiceWorker(obj, method, args) {
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 service worker error'));
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
- navigator.serviceWorker.controller.postMessage(command, [channel.port2]);
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 callServiceWorker(this, 'object.insert', [table, data]);
44
+ return callWorker(this._worker, this, 'object.insert', [table, data]);
47
45
  }
48
46
  update(table, data, where, replace = false) {
49
- return callServiceWorker(this, 'object.update', [table, data, where, replace]);
47
+ return callWorker(this._worker, this, 'object.update', [table, data, where, replace]);
50
48
  }
51
49
  delete(table, where) {
52
- return callServiceWorker(this, 'object.delete', [table, where]);
50
+ return callWorker(this._worker, this, 'object.delete', [table, where]);
53
51
  }
54
52
  selectOne(table, field, where, order, start, limit) {
55
- return callServiceWorker(this, 'object.selectOne', [table, field, where, order, start, limit]);
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 callServiceWorker(this, 'object.select', [table, fields, where, order, start]);
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 callServiceWorker(this, 'object.selectAll', [table, fields, where, order, start, limit]);
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 callServiceWorker(this, 'object.getColumnValues', [table, field, where, order, start, limit]);
62
+ return callWorker(this._worker, this, 'object.getColumnValues', [table, field, where, order, start, limit]);
65
63
  }
66
64
  count(table, where) {
67
- return callServiceWorker(this, 'object.count', [table, where]);
65
+ return callWorker(this._worker, this, 'object.count', [table, where]);
68
66
  }
69
67
  copyTable(target, table, fields, where, order, start, limit) {
70
- return callServiceWorker(this, 'object.copyTable', [target, table, fields, where, order, start, limit]);
68
+ return callWorker(this._worker, this, 'object.copyTable', [target, table, fields, where, order, start, limit]);
71
69
  }
72
70
  deleteTable(table) {
73
- return callServiceWorker(this, 'object.deleteTable', [table]);
71
+ return callWorker(this._worker, this, 'object.deleteTable', [table]);
74
72
  }
75
73
  close() {
76
- void callServiceWorker(this, 'object.close', []);
74
+ void callWorker(this._worker, this, 'object.close', []);
77
75
  }
78
76
  lastError() {
79
- return callServiceWorker(this, 'object.lastError', [this.dbName]);
77
+ return callWorker(this._worker, this, 'object.lastError', [this.dbName]);
80
78
  }
81
79
  }
@@ -1,11 +1,7 @@
1
1
  import bbnDbObjectProxy from './ObjectProxy.js';
2
2
  let requestId = 0;
3
- function callServiceWorker(database, method, args) {
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 service worker error'));
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
- navigator.serviceWorker.controller.postMessage(command, [channel.port2]);
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 callServiceWorker(database, 'manager.open', [database, version]);
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
- return await callServiceWorker(database, 'manager.add', [database, name, structure]);
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 callServiceWorker(database, 'manager.remove', [database, name]);
44
+ return await callWorker(database, 'manager.remove', [database, name]);
44
45
  },
45
46
  async importStructure(database, structure) {
46
- return await callServiceWorker(database, 'manager.importStructure', [database, structure]);
47
+ return await callWorker(database, 'manager.importStructure', [database, structure]);
47
48
  },
48
49
  async close(database) {
49
- return await callServiceWorker(database, 'manager.close', [database]);
50
+ return await callWorker(database, 'manager.close', [database]);
50
51
  }
51
52
  };
52
53
  export default bbnDbProxy;
@@ -13,6 +13,7 @@ import isFunction from '../type/isFunction.js';
13
13
  * @returns
14
14
  */
15
15
  export default function log(...args) {
16
+ //debugger;
16
17
  if (globalThis.bbn?.env?.logging && (globalThis.console !== undefined)) {
17
18
  let cfg;
18
19
  let level = 5;
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;
@@ -22,7 +22,7 @@ const bbn = {
22
22
  com,
23
23
  env,
24
24
  get db() {
25
- if (navigator.serviceWorker?.controller) {
25
+ if (bbn.worker) {
26
26
  return bbnDbProxy;
27
27
  }
28
28
  return bbnDb;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  import { Temporal } from 'temporal-polyfill';
2
+ export { Temporal };
2
3
  declare const bbn: Bbn;
3
- export { bbn as default, bbn, Temporal };
4
+ export { bbn };
5
+ export default bbn;
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 (navigator.serviceWorker?.controller) {
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 as default, bbn, Temporal };
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.247",
3
+ "version": "2.0.249",
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.53.2",
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
  }