@cocreate/indexeddb 1.23.0 → 1.23.2

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/src/index.js CHANGED
@@ -23,856 +23,980 @@
23
23
  */
24
24
 
25
25
  import {
26
- ObjectId,
27
- dotNotationToObject,
28
- searchData,
29
- sortData,
30
- queryData,
31
- createUpdate,
32
- isEqualArray,
33
- isEqualObject,
26
+ ObjectId,
27
+ dotNotationToObject,
28
+ searchData,
29
+ sortData,
30
+ queryData,
31
+ createUpdate,
32
+ isEqualArray,
33
+ isEqualObject
34
34
  } from "@cocreate/utils";
35
35
 
36
36
  let indexedDbFunction;
37
37
 
38
38
  function init() {
39
- // Check for support.
40
- if (!("indexedDB" in window)) {
41
- console.log("This browser doesn't support IndexedDB.");
42
- setStatus(false);
43
- return;
44
- } else {
45
- try {
46
- indexedDB.databases();
47
- if (window.CoCreateConfig && window.CoCreateConfig.indexeddb !== false)
48
- setStatus(true);
49
- } catch (e) {
50
- setStatus(false);
51
- }
52
- }
39
+ // Check for support.
40
+ if (!("indexedDB" in window)) {
41
+ console.log("This browser doesn't support IndexedDB.");
42
+ setStatus(false);
43
+ return;
44
+ } else {
45
+ try {
46
+ indexedDB.databases();
47
+ if (
48
+ window.CoCreateConfig &&
49
+ window.CoCreateConfig.indexeddb !== false
50
+ )
51
+ setStatus(true);
52
+ } catch (e) {
53
+ setStatus(false);
54
+ }
55
+ }
53
56
  }
54
57
 
55
58
  function setStatus(value) {
56
- if (window.CoCreateConfig) window.CoCreateConfig.indexeddb = value;
57
- else window.CoCreateConfig = { indexeddb: value };
58
-
59
- if (!value) {
60
- indexedDbFunction = indexedDb;
61
- send = value;
62
- } else if (!send) {
63
- send = indexedDbFunction;
64
- indexedDbFunction = true;
65
- }
59
+ if (window.CoCreateConfig) window.CoCreateConfig.indexeddb = value;
60
+ else window.CoCreateConfig = { indexeddb: value };
61
+
62
+ if (!value) {
63
+ indexedDbFunction = indexedDb;
64
+ send = value;
65
+ } else if (!send) {
66
+ send = indexedDbFunction;
67
+ indexedDbFunction = true;
68
+ }
66
69
  }
67
70
 
68
71
  async function send(data) {
69
- try {
70
- let newData = [];
71
-
72
- let type = data.method.split(".")[0];
73
- if (type === "database") {
74
- if (data.method === "database.get") {
75
- return await processDatabase(data);
76
- } else await processDatabase(data, newData, type);
77
- } else {
78
- if (!data["timeStamp"]) data["timeStamp"] = new Date().toISOString();
79
-
80
- let databases = data.database;
81
- if (!databases && data.organization_id)
82
- databases = [data.organization_id];
83
- if (!Array.isArray(databases)) databases = [databases];
84
-
85
- let arrays = data.array || [];
86
- if (!Array.isArray(arrays)) arrays = [arrays];
87
-
88
- for (let i = 0; i < databases.length; i++) {
89
- let database = databases[i];
90
- if (type === "array") {
91
- await processArray(data, newData, database, type);
92
- } else {
93
- for (let j = 0; j < arrays.length; j++) {
94
- if (type === "index")
95
- await processIndex(data, newData, database, type);
96
- else if (type === "object")
97
- await processObject(data, newData, database, arrays[j], type);
98
- }
99
- }
100
- }
101
- }
102
-
103
- return createData(data, newData, type);
104
- } catch (error) {
105
- errorHandler(data, error);
106
- }
72
+ try {
73
+ let newData = [];
74
+
75
+ let type = data.method.split(".")[0];
76
+ if (type === "database") {
77
+ if (data.method === "database.get") {
78
+ return await processDatabase(data);
79
+ } else await processDatabase(data, newData, type);
80
+ } else {
81
+ if (!data["timeStamp"])
82
+ data["timeStamp"] = new Date().toISOString();
83
+
84
+ let databases = data.database;
85
+ if (!databases && data.organization_id)
86
+ databases = [data.organization_id];
87
+ if (!Array.isArray(databases)) databases = [databases];
88
+
89
+ let arrays = data.array || [];
90
+ if (!Array.isArray(arrays)) arrays = [arrays];
91
+
92
+ for (let i = 0; i < databases.length; i++) {
93
+ let database = databases[i];
94
+ if (type === "array") {
95
+ await processArray(data, newData, database, type);
96
+ } else {
97
+ for (let j = 0; j < arrays.length; j++) {
98
+ if (type === "index")
99
+ await processIndex(data, newData, database, type);
100
+ else if (type === "object")
101
+ await processObject(
102
+ data,
103
+ newData,
104
+ database,
105
+ arrays[j],
106
+ type
107
+ );
108
+ }
109
+ }
110
+ }
111
+ }
112
+
113
+ return createData(data, newData, type);
114
+ } catch (error) {
115
+ errorHandler(data, error);
116
+ }
107
117
  }
108
118
 
109
119
  const dbVersion = new Map();
110
120
  const processDatabase = (data, newData, type) => {
111
- return new Promise(
112
- (resolve, reject) => {
113
- if (!data) data = {};
114
- if (!data[type]) data[type] = [];
115
-
116
- if (data.method == "database.read") {
117
- indexedDB.databases().then((databases) => {
118
- for (let database of databases) {
119
- if (data.$filter && data.$filter.query) {
120
- let isFilter = queryData(database, data.$filter.query);
121
- if (isFilter)
122
- newData.push({ $storage: ["indexeddb"], ...database });
123
- } else newData.push({ $storage: ["indexeddb"], ...database });
124
- }
125
-
126
- resolve();
127
- });
128
- } else {
129
- let databases;
130
- if (data.method == "database.update")
131
- databases = Object.keys(data.database);
132
- else databases = data.database;
133
-
134
- if (!Array.isArray(databases)) databases = [databases];
135
-
136
- for (let i = 0; i < databases.length; i++) {
137
- let openRequest,
138
- database = databases[i];
139
- switch (data.method) {
140
- case "database.get":
141
- case "database.create":
142
- case "database.update":
143
- openRequest = indexedDB.open(database);
144
- break;
145
- case "database.delete":
146
- openRequest = indexedDB.deleteprocessDatabase(database);
147
- break;
148
- default:
149
- errorHandler(data, "unknown method", database);
150
- resolve(data);
151
- }
152
-
153
- openRequest.onsuccess = function () {
154
- let db = openRequest.result;
155
-
156
- if (data.method == "database.update") {
157
- let objectStoreNames = Array.from(db.objectStoreNames);
158
- for (let array of objectStoreNames) {
159
- let request = array.openCursor();
160
-
161
- request.onsuccess = function () {
162
- let cursor = request.result;
163
- if (cursor) {
164
- let value = cursor.value;
165
-
166
- cursor.continue();
167
- } else {
168
- // -1
169
- }
170
- };
171
-
172
- request.onerror = function () {
173
- errorHandler(data, request.error, database, array);
174
- };
175
- }
176
- } else if (data.upgrade === true) {
177
- db.close();
178
-
179
- let version =
180
- dbVersion.get(database) || openRequest.result.version;
181
- resolve(indexedDB.open(database, Number((version += 1))));
182
- dbVersion.set(database, version);
183
- } else if (data.array) {
184
- db.close();
185
-
186
- let version =
187
- dbVersion.get(database) || openRequest.result.version;
188
- let request = indexedDB.open(database, Number((version += 1)));
189
- dbVersion.set(database, version);
190
-
191
- request.onupgradeneeded = function (event) {
192
- const db = event.target.result;
193
-
194
- let arrays = data.array;
195
- if (!Array.isArray(arrays)) arrays = [arrays];
196
-
197
- for (let j = 0; j < arrays.length; j++) {
198
- if (!db.objectStoreNames.contains(arrays[j])) {
199
- try {
200
- db.createObjectStore(arrays[j], {
201
- keyPath: "_id",
202
- autoIncrement: true,
203
- });
204
- } catch (error) {
205
- errorHandler(data, error, database, arrays[j]);
206
- }
207
- }
208
-
209
- if (data.indexName) {
210
- const transaction = event.target.transaction;
211
- const objectStore = transaction.objectStore(arrays[j]);
212
- if (!objectStore.indexNames.contains(data.indexName))
213
- objectStore.createIndex(
214
- data.indexName,
215
- data.indexFields,
216
- { unique: data.unique || false }
217
- );
218
- }
219
- }
220
- };
221
-
222
- request.onsuccess = function (event) {
223
- if (databases.length - 1 === i) {
224
- if (data.method == "database.get")
225
- resolve(event.target.result);
226
- else resolve(data);
227
- }
228
- };
229
-
230
- request.onerror = function (event) {
231
- errorHandler(data, event.target.error, database, array);
232
- if (databases.length - 1 === i) {
233
- if (data.method == "database.get")
234
- resolve(event.target.result);
235
- else resolve(data);
236
- }
237
- };
238
- } else if (databases.length - 1 === i) {
239
- if (data.method == "database.get") resolve(db);
240
- else resolve(data);
241
- }
242
- };
243
-
244
- openRequest.onerror = function () {
245
- errorHandler(data, openRequest.error, database);
246
- resolve(data);
247
- };
248
- }
249
- }
250
- },
251
- (error) => {
252
- errorHandler(data, error);
253
- }
254
- );
121
+ return new Promise(
122
+ (resolve, reject) => {
123
+ if (!data) data = {};
124
+ if (!data[type]) data[type] = [];
125
+
126
+ if (data.method == "database.read") {
127
+ indexedDB.databases().then((databases) => {
128
+ for (let database of databases) {
129
+ if (data.$filter && data.$filter.query) {
130
+ let isFilter = queryData(
131
+ database,
132
+ data.$filter.query
133
+ );
134
+ if (isFilter)
135
+ newData.push({
136
+ $storage: ["indexeddb"],
137
+ ...database
138
+ });
139
+ } else
140
+ newData.push({
141
+ $storage: ["indexeddb"],
142
+ ...database
143
+ });
144
+ }
145
+
146
+ resolve();
147
+ });
148
+ } else {
149
+ let databases;
150
+ if (data.method == "database.update")
151
+ databases = Object.keys(data.database);
152
+ else databases = data.database;
153
+
154
+ if (!Array.isArray(databases)) databases = [databases];
155
+
156
+ for (let i = 0; i < databases.length; i++) {
157
+ let openRequest,
158
+ database = databases[i];
159
+ switch (data.method) {
160
+ case "database.get":
161
+ case "database.create":
162
+ case "database.update":
163
+ openRequest = indexedDB.open(database);
164
+ break;
165
+ case "database.delete":
166
+ openRequest =
167
+ indexedDB.deleteprocessDatabase(database);
168
+ break;
169
+ default:
170
+ errorHandler(data, "unknown method", database);
171
+ resolve(data);
172
+ }
173
+
174
+ openRequest.onsuccess = function () {
175
+ let db = openRequest.result;
176
+
177
+ if (data.method == "database.update") {
178
+ let objectStoreNames = Array.from(
179
+ db.objectStoreNames
180
+ );
181
+ for (let array of objectStoreNames) {
182
+ let request = array.openCursor();
183
+
184
+ request.onsuccess = function () {
185
+ let cursor = request.result;
186
+ if (cursor) {
187
+ let value = cursor.value;
188
+
189
+ cursor.continue();
190
+ } else {
191
+ // -1
192
+ }
193
+ };
194
+
195
+ request.onerror = function () {
196
+ errorHandler(
197
+ data,
198
+ request.error,
199
+ database,
200
+ array
201
+ );
202
+ };
203
+ }
204
+ } else if (data.upgrade === true) {
205
+ db.close();
206
+
207
+ let version =
208
+ dbVersion.get(database) ||
209
+ openRequest.result.version;
210
+ resolve(
211
+ indexedDB.open(database, Number((version += 1)))
212
+ );
213
+ dbVersion.set(database, version);
214
+ } else if (data.array) {
215
+ db.close();
216
+
217
+ let version =
218
+ dbVersion.get(database) ||
219
+ openRequest.result.version;
220
+ let request = indexedDB.open(
221
+ database,
222
+ Number((version += 1))
223
+ );
224
+ dbVersion.set(database, version);
225
+
226
+ request.onupgradeneeded = function (event) {
227
+ const db = event.target.result;
228
+
229
+ let arrays = data.array;
230
+ if (!Array.isArray(arrays)) arrays = [arrays];
231
+
232
+ for (let j = 0; j < arrays.length; j++) {
233
+ if (
234
+ !db.objectStoreNames.contains(arrays[j])
235
+ ) {
236
+ try {
237
+ db.createObjectStore(arrays[j], {
238
+ keyPath: "_id",
239
+ autoIncrement: true
240
+ });
241
+ } catch (error) {
242
+ errorHandler(
243
+ data,
244
+ error,
245
+ database,
246
+ arrays[j]
247
+ );
248
+ }
249
+ }
250
+
251
+ if (data.indexName) {
252
+ const transaction =
253
+ event.target.transaction;
254
+ const objectStore =
255
+ transaction.objectStore(arrays[j]);
256
+ if (
257
+ !objectStore.indexNames.contains(
258
+ data.indexName
259
+ )
260
+ )
261
+ objectStore.createIndex(
262
+ data.indexName,
263
+ data.indexFields,
264
+ { unique: data.unique || false }
265
+ );
266
+ }
267
+ }
268
+ };
269
+
270
+ request.onsuccess = function (event) {
271
+ if (databases.length - 1 === i) {
272
+ if (data.method == "database.get")
273
+ resolve(event.target.result);
274
+ else resolve(data);
275
+ }
276
+ };
277
+
278
+ request.onerror = function (event) {
279
+ errorHandler(
280
+ data,
281
+ event.target.error,
282
+ database,
283
+ array
284
+ );
285
+ if (databases.length - 1 === i) {
286
+ if (data.method == "database.get")
287
+ resolve(event.target.result);
288
+ else resolve(data);
289
+ }
290
+ };
291
+ } else if (databases.length - 1 === i) {
292
+ if (data.method == "database.get") resolve(db);
293
+ else resolve(data);
294
+ }
295
+ };
296
+
297
+ openRequest.onerror = function () {
298
+ errorHandler(data, openRequest.error, database);
299
+ resolve(data);
300
+ };
301
+ }
302
+ }
303
+ },
304
+ (error) => {
305
+ errorHandler(data, error);
306
+ }
307
+ );
255
308
  };
256
309
 
257
310
  async function processArray(data, newData, database, type) {
258
- let db = await processDatabase({ method: "database.get", database });
259
-
260
- let objectStoreNames = Array.from(db.objectStoreNames);
261
- if (data.method == "array.read") {
262
- if (!data[type]) data[type] = [];
263
-
264
- for (let i = 0; i < objectStoreNames.length; i++) {
265
- if (data.$filter && data.$filter.query) {
266
- let isFilter = queryData(
267
- { name: objectStoreNames[i] },
268
- data.$filter.query
269
- );
270
- if (isFilter)
271
- newData.push({
272
- name: objectStoreNames,
273
- $storage: ["indexeddb"],
274
- $database: [database],
275
- });
276
- } else
277
- newData.push({
278
- name: objectStoreNames[i],
279
- $storage: ["indexeddb"],
280
- $database: [database],
281
- });
282
- }
283
- } else {
284
- db.close();
285
-
286
- let request = await processDatabase({
287
- method: "database.get",
288
- database,
289
- upgrade: true,
290
- });
291
- await new Promise((resolve) => {
292
- request.onupgradeneeded = function (event) {
293
- let db = event.target.result;
294
- let arrays;
295
- if (data.method == "array.update") arrays = Object.keys(data[type]);
296
- else arrays = data[type];
297
- if (!Array.isArray(arrays)) arrays = [arrays];
298
-
299
- for (let i = 0; i < arrays.length; i++) {
300
- let error,
301
- array = arrays[i];
302
-
303
- let arrayExist = db.objectStoreNames.contains(array);
304
- if (arrayExist && data.method == "array.create") {
305
- error = "array already exists";
306
- } else if (data.method == "array.delete") {
307
- if (objectStoreNames.includes(array)) {
308
- db.deleteObjectStore(array);
309
- } else {
310
- error = "the array does not exist";
311
- }
312
- } else {
313
- if (!arrayExist && data.method == "array.update")
314
- array = data[type][arrays[i]];
315
-
316
- if (arrayExist) {
317
- if (data.method == "array.update") {
318
- let transaction = event.target.transaction;
319
- let objectStore = transaction.objectStore(array);
320
-
321
- if (!objectStoreNames.includes(data[type][arrays[i]]))
322
- array = objectStore.name = data[type][arrays[i]];
323
- else error = "An array with the new name already exist";
324
- }
325
- } else if (data.method == "array.update")
326
- error = "array does not exists";
327
- }
328
-
329
- if (!error)
330
- newData.push({
331
- name: array,
332
- $storage: ["indexeddb"],
333
- $database: [database],
334
- });
335
- else errorHandler(data, error, database);
336
- }
337
- };
338
-
339
- request.onsuccess = function (event) {
340
- event.target.result.close();
341
- resolve();
342
- };
343
-
344
- request.onerror = function (event) {
345
- errorHandler(data, event.target.error, database);
346
- resolve();
347
- };
348
- });
349
- }
311
+ let db = await processDatabase({ method: "database.get", database });
312
+
313
+ let objectStoreNames = Array.from(db.objectStoreNames);
314
+ if (data.method == "array.read") {
315
+ if (!data[type]) data[type] = [];
316
+
317
+ if (!Array.isArray(data[type])) {
318
+ data[type] = [data[type]];
319
+ }
320
+
321
+ for (let i = 0; i < objectStoreNames.length; i++) {
322
+ if (data.$filter && data.$filter.query) {
323
+ let isFilter = queryData(
324
+ { name: objectStoreNames[i] },
325
+ data.$filter.query
326
+ );
327
+ if (isFilter)
328
+ newData.push({
329
+ name: objectStoreNames,
330
+ $storage: ["indexeddb"],
331
+ $database: [database]
332
+ });
333
+ } else
334
+ newData.push({
335
+ name: objectStoreNames[i],
336
+ $storage: ["indexeddb"],
337
+ $database: [database]
338
+ });
339
+ }
340
+ } else {
341
+ db.close();
342
+
343
+ let request = await processDatabase({
344
+ method: "database.get",
345
+ database,
346
+ upgrade: true
347
+ });
348
+ await new Promise((resolve) => {
349
+ request.onupgradeneeded = function (event) {
350
+ let db = event.target.result;
351
+ let arrays;
352
+ if (data.method == "array.update")
353
+ arrays = Object.keys(data[type]);
354
+ else arrays = data[type];
355
+ if (!Array.isArray(arrays)) arrays = [arrays];
356
+
357
+ for (let i = 0; i < arrays.length; i++) {
358
+ let error,
359
+ array = arrays[i];
360
+
361
+ let arrayExist = db.objectStoreNames.contains(array);
362
+ if (arrayExist && data.method == "array.create") {
363
+ error = "array already exists";
364
+ } else if (data.method == "array.delete") {
365
+ if (objectStoreNames.includes(array)) {
366
+ db.deleteObjectStore(array);
367
+ } else {
368
+ error = "the array does not exist";
369
+ }
370
+ } else {
371
+ if (!arrayExist && data.method == "array.update")
372
+ array = data[type][arrays[i]];
373
+
374
+ if (arrayExist) {
375
+ if (data.method == "array.update") {
376
+ let transaction = event.target.transaction;
377
+ let objectStore =
378
+ transaction.objectStore(array);
379
+
380
+ if (
381
+ !objectStoreNames.includes(
382
+ data[type][arrays[i]]
383
+ )
384
+ )
385
+ array = objectStore.name =
386
+ data[type][arrays[i]];
387
+ else
388
+ error =
389
+ "An array with the new name already exist";
390
+ }
391
+ } else if (data.method == "array.update")
392
+ error = "array does not exists";
393
+ }
394
+
395
+ if (!error)
396
+ newData.push({
397
+ name: array,
398
+ $storage: ["indexeddb"],
399
+ $database: [database]
400
+ });
401
+ else errorHandler(data, error, database);
402
+ }
403
+ };
404
+
405
+ request.onsuccess = function (event) {
406
+ event.target.result.close();
407
+ resolve();
408
+ };
409
+
410
+ request.onerror = function (event) {
411
+ errorHandler(data, event.target.error, database);
412
+ resolve();
413
+ };
414
+ });
415
+ }
350
416
  }
351
417
 
352
418
  async function processIndex(data, newData, database, array, type) {
353
- let db = await processDatabase({ method: "database.get", database });
354
- let arrayExist = db.objectStoreNames.contains(array);
355
- if (arrayExist) {
356
- // ToDO: switch here to types
357
- let transaction = db.transaction(array, "readonly");
358
- let objectStore = transaction.objectStore(array);
359
- let indexNames = Array.from(objectStore.indexNames);
360
-
361
- if (data.method == "index.read") {
362
- for (let i = 0; i < indexNames.length; i++) {
363
- let name = indexNames[i];
364
- if (data.$filter && data.$filter.query)
365
- if (!queryData({ name }, data.$filter.query)) continue;
366
-
367
- newData.push({
368
- name,
369
- $storage: ["indexeddb"],
370
- $database: [database],
371
- $array: [array],
372
- });
373
- }
374
- db.close();
375
- } else {
376
- db.close();
377
- let indexes;
378
- if (data.method == "index.update") indexes = Object.keys(data[type]);
379
- else indexes = data[type];
380
-
381
- if (!Array.isArray(indexes)) indexes = [indexes];
382
-
383
- for (let i = 0; i < indexes.length; i++) {
384
- let error,
385
- index = indexes[i];
386
- db = await processDatabase({
387
- method: "database.get",
388
- database,
389
- upgrade: true,
390
- });
391
- let transaction = db.transaction;
392
- let objectStore = transaction.objectStore(array);
393
- let indexExist = indexNames.includes(index);
394
-
395
- if (data.method == "index.create") {
396
- if (!indexExist)
397
- objectStore.createIndex(index, index, { unique: false });
398
- else error = "index already exist";
399
- } else if (indexExist) {
400
- if (data.method == "index.delete") objectStore.deleteIndex(index);
401
- else if (
402
- data.method == "index.update" &&
403
- !indexNames.includes(data[type][indexes[i]])
404
- ) {
405
- if (!indexNames.includes(data[type][indexes[i]])) {
406
- let indexObj = objectStore.index(index);
407
- index = indexObj.name = data[type][indexes[i]];
408
- } else error = "new index name already exist";
409
- }
410
- } else error = "index does not exist";
411
-
412
- if (!error)
413
- newData.push({
414
- name: index,
415
- $storage: ["indexeddb"],
416
- $database: [database],
417
- $array: [array],
418
- });
419
- else errorHandler(data, error, database, array);
420
-
421
- db.result.close();
422
- }
423
- }
424
- }
419
+ let db = await processDatabase({ method: "database.get", database });
420
+ let arrayExist = db.objectStoreNames.contains(array);
421
+ if (arrayExist) {
422
+ // ToDO: switch here to types
423
+ let transaction = db.transaction(array, "readonly");
424
+ let objectStore = transaction.objectStore(array);
425
+ let indexNames = Array.from(objectStore.indexNames);
426
+
427
+ if (data.method == "index.read") {
428
+ for (let i = 0; i < indexNames.length; i++) {
429
+ let name = indexNames[i];
430
+ if (data.$filter && data.$filter.query)
431
+ if (!queryData({ name }, data.$filter.query)) continue;
432
+
433
+ newData.push({
434
+ name,
435
+ $storage: ["indexeddb"],
436
+ $database: [database],
437
+ $array: [array]
438
+ });
439
+ }
440
+ db.close();
441
+ } else {
442
+ db.close();
443
+ let indexes;
444
+ if (data.method == "index.update")
445
+ indexes = Object.keys(data[type]);
446
+ else indexes = data[type];
447
+
448
+ if (!Array.isArray(indexes)) indexes = [indexes];
449
+
450
+ for (let i = 0; i < indexes.length; i++) {
451
+ let error,
452
+ index = indexes[i];
453
+ db = await processDatabase({
454
+ method: "database.get",
455
+ database,
456
+ upgrade: true
457
+ });
458
+ let transaction = db.transaction;
459
+ let objectStore = transaction.objectStore(array);
460
+ let indexExist = indexNames.includes(index);
461
+
462
+ if (data.method == "index.create") {
463
+ if (!indexExist)
464
+ objectStore.createIndex(index, index, {
465
+ unique: false
466
+ });
467
+ else error = "index already exist";
468
+ } else if (indexExist) {
469
+ if (data.method == "index.delete")
470
+ objectStore.deleteIndex(index);
471
+ else if (
472
+ data.method == "index.update" &&
473
+ !indexNames.includes(data[type][indexes[i]])
474
+ ) {
475
+ if (!indexNames.includes(data[type][indexes[i]])) {
476
+ let indexObj = objectStore.index(index);
477
+ index = indexObj.name = data[type][indexes[i]];
478
+ } else error = "new index name already exist";
479
+ }
480
+ } else error = "index does not exist";
481
+
482
+ if (!error)
483
+ newData.push({
484
+ name: index,
485
+ $storage: ["indexeddb"],
486
+ $database: [database],
487
+ $array: [array]
488
+ });
489
+ else errorHandler(data, error, database, array);
490
+
491
+ db.result.close();
492
+ }
493
+ }
494
+ }
425
495
  }
426
496
 
427
497
  async function processObject(data, newData, database, array, type) {
428
- let db = await processDatabase({ method: "database.get", database });
429
-
430
- try {
431
- if (!data[type]) data[type] = [];
432
- else if (typeof data[type] === "string") data[type] = [{ _id: data[type] }];
433
- else if (!Array.isArray(data[type])) data[type] = [data[type]];
434
-
435
- let isFilter;
436
- if (data.$filter) isFilter = true;
437
-
438
- let arrayExist = db.objectStoreNames.contains(array);
439
- if (!arrayExist) {
440
- db.close();
441
- if (data.method == "object.create" || data.method == "object.update") {
442
- db = await processDatabase({ method: "database.get", database, array });
443
- } else {
444
- return errorHandler(data, "array does not exist", database, array);
445
- }
446
- }
447
-
448
- if (!array || !db)
449
- throw new Error({ error: "This is an error message.", db, array });
450
-
451
- let lastItem;
452
- if ((isFilter && !data[type].length) || data.isFilter) {
453
- if (data[type].length) lastItem = data[type][data[type].length - 1];
454
- data[type] = [{ isFilter: "isEmptyObjectFilter" }];
455
-
456
- // data[type].splice(0, 0, { isFilter: 'isEmptyObjectFilter' });
457
- }
458
-
459
- let transactionType = "readwrite";
460
- if (data.method == "object.read") transactionType = "readonly";
461
-
462
- let transaction = db.transaction([array], transactionType);
463
- let objectStore = transaction.objectStore(array);
464
-
465
- let globalOperators = getGlobalOperators(data);
466
- let upsert = data.upsert;
467
-
468
- for (let i = 0; i < data[type].length; i++) {
469
- const reference = {
470
- $storage: ["indexeddb"],
471
- $database: [database],
472
- $array: [array],
473
- };
474
-
475
- delete data[type][i].$storage;
476
- delete data[type][i].$database;
477
- delete data[type][i].$array;
478
-
479
- if (data.method == "object.create") {
480
- if (data.organization_id)
481
- data[type][i]["organization_id"] = data.organization_id;
482
-
483
- if (!data[type][i]._id) data[type][i]["_id"] = ObjectId().toString();
484
- data[type][i] = dotNotationToObject(data[type][i]);
485
-
486
- // TODO: user_id || clientId shohould be retrieved from CoCreate
487
- data[type][i]["created"] = {
488
- on: data.timeStamp,
489
- by: data.user_id || data.clientId,
490
- };
491
- data[type][i] = await add(objectStore, data[type][i]);
492
- data[type][i] = { ...reference, ...data[type][i] };
493
- } else {
494
- if (data[type][i].$filter) isFilter = true;
495
-
496
- if (data.method == "object.update") {
497
- if (data.organization_id)
498
- data[type][i]["organization_id"] = data.organization_id;
499
-
500
- if (data[type][i].$upsert) upsert = data[type][i].$upsert;
501
- // TODO: user_id || clientId shohould be retrieved from CoCreate
502
- if (!data[type][i].modified)
503
- data[type][i].modified = {
504
- on: data.timeStamp,
505
- by: data.user_id || data.clientId,
506
- };
507
- }
508
-
509
- let index = 0,
510
- limit,
511
- range,
512
- direction;
513
- if (data[type][i]._id) {
514
- range = IDBKeyRange.only(data[type][i]._id);
515
- } else if (isFilter) {
516
- let indexName;
517
- let indexFields;
518
-
519
- if (data.$filter) {
520
- // TODO: requires a more robust sorting thats suports various directions
521
- // Build compound index name from sort keys
522
- if (data.$filter.sort && data.$filter.sort.length > 0) {
523
- // Create a standard index name without _id
524
- let sortKeys = data.$filter.sort
525
- .map((sort) => sort.key)
526
- .filter((key) => key !== "_id");
527
- indexName = sortKeys.join("_"); // e.g., "createdAt_category"
528
-
529
- // Define compound index fields
530
- indexFields = [...sortKeys];
531
-
532
- // Set cursor direction based on the first sort key direction
533
- direction =
534
- data.$filter.sort[0].direction === "desc" ? "prev" : "next";
535
-
536
- // Use last item's values, including _id, to set up the range for pagination
537
- if (indexName && lastItem && lastItem._id) {
538
- indexName += "_id";
539
- indexFields.push("_id");
540
- let lastKeyValues = [
541
- ...sortKeys.map((key) => lastItem[key]),
542
- lastItem._id,
543
- ]; // Compound key array with _id
544
-
545
- // Create IDBKeyRange based on direction and lastKeyValues
546
- if (direction === "next") {
547
- range = IDBKeyRange.lowerBound(lastKeyValues, true);
548
- } else {
549
- range = IDBKeyRange.upperBound(lastKeyValues, true);
550
- }
551
- }
552
- } else if (
553
- data.$filter.query &&
554
- data.$filter.query[0] &&
555
- data.$filter.query[0].key
556
- ) {
557
- if (data.$filter.query[0].operator === "$eq") {
558
- range = IDBKeyRange.only(data.$filter.query[0].value);
559
- } else if (data.$filter.query[0].operator === "$gt") {
560
- range = IDBKeyRange.lowerBound(
561
- data.$filter.query[0].value,
562
- true
563
- );
564
- } else if (data.$filter.query[0].operator === "$lt") {
565
- range = IDBKeyRange.upperBound(
566
- data.$filter.query[0].value,
567
- true
568
- );
569
- } else if (data.$filter.query[0].operator === "$gte") {
570
- range = IDBKeyRange.lowerBound(data.$filter.query[0].value);
571
- } else if (data.$filter.query[0].operator === "$lte") {
572
- range = IDBKeyRange.upperBound(data.$filter.query[0].value);
573
- }
574
-
575
- indexName = data.$filter.query[0].key;
576
- }
577
- }
578
-
579
- if (indexName && !indexName.includes("-")) {
580
- // Check if the compound index exists; create it if not
581
- let indexNames = Array.from(objectStore.indexNames);
582
- if (!indexNames.includes(indexName)) {
583
- db.close();
584
- db = await processDatabase({
585
- method: "database.get",
586
- database,
587
- array,
588
- indexName,
589
- indexFields,
590
- });
591
- transaction = db.transaction(array, "readwrite");
592
- objectStore = transaction.objectStore(array);
593
- }
594
- objectStore = objectStore.index(indexName);
595
- }
596
-
597
- let count = objectStore.count();
598
- count.onsuccess = function () {
599
- if (data.$filter) data.$filter.count = count.result;
600
- else if (data.object.$filter)
601
- data.object.$filter.count = count.result;
602
- };
603
-
604
- if (data.$filter) {
605
- if (data.$filter.index) index = data.$filter.index;
606
- if (data.$filter.limit) limit = data.$filter.limit;
607
- }
608
-
609
- if (data[type][i].$filter) {
610
- if (data[type][i].$filter.index)
611
- index = data[type][i].$filter.index;
612
- if (data[type][i].$filter.limit)
613
- limit = data[type][i].$filter.limit;
614
- }
615
- } else if (
616
- data.method == "object.delete" ||
617
- (data.method == "object.update" && !range && !upsert && !isFilter)
618
- ) {
619
- continue;
620
- }
621
-
622
- await openCursor(
623
- objectStore,
624
- range,
625
- direction,
626
- data,
627
- newData,
628
- isFilter,
629
- index,
630
- limit,
631
- database,
632
- array,
633
- upsert,
634
- type,
635
- i,
636
- globalOperators,
637
- reference
638
- );
639
-
640
- if (index) newData = newData.slice(index);
641
- }
642
- }
643
-
644
- if (db.close) db.close();
645
- } catch (error) {
646
- errorHandler(data, error, database, array);
647
- if (db.close) db.close();
648
- }
498
+ let db = await processDatabase({ method: "database.get", database });
499
+
500
+ try {
501
+ if (!data[type]) data[type] = [];
502
+ else if (typeof data[type] === "string")
503
+ data[type] = [{ _id: data[type] }];
504
+ else if (!Array.isArray(data[type])) data[type] = [data[type]];
505
+
506
+ let isFilter;
507
+ if (data.$filter) isFilter = true;
508
+
509
+ let arrayExist = db.objectStoreNames.contains(array);
510
+ if (!arrayExist) {
511
+ db.close();
512
+ if (
513
+ data.method == "object.create" ||
514
+ data.method == "object.update"
515
+ ) {
516
+ db = await processDatabase({
517
+ method: "database.get",
518
+ database,
519
+ array
520
+ });
521
+ } else {
522
+ return errorHandler(
523
+ data,
524
+ "array does not exist",
525
+ database,
526
+ array
527
+ );
528
+ }
529
+ }
530
+
531
+ if (!array || !db)
532
+ throw new Error({ error: "This is an error message.", db, array });
533
+
534
+ let lastItem;
535
+ if ((isFilter && !data[type].length) || data.isFilter) {
536
+ if (data[type].length) lastItem = data[type][data[type].length - 1];
537
+ data[type] = [{ isFilter: "isEmptyObjectFilter" }];
538
+
539
+ // data[type].splice(0, 0, { isFilter: 'isEmptyObjectFilter' });
540
+ }
541
+
542
+ let transactionType = "readwrite";
543
+ if (data.method == "object.read") transactionType = "readonly";
544
+
545
+ let transaction = db.transaction([array], transactionType);
546
+ let objectStore = transaction.objectStore(array);
547
+
548
+ let globalOperators = getGlobalOperators(data);
549
+ let upsert = data.upsert;
550
+
551
+ for (let i = 0; i < data[type].length; i++) {
552
+ const reference = {
553
+ $storage: ["indexeddb"],
554
+ $database: [database],
555
+ $array: [array]
556
+ };
557
+
558
+ delete data[type][i].$storage;
559
+ delete data[type][i].$database;
560
+ delete data[type][i].$array;
561
+
562
+ if (data.method == "object.create") {
563
+ if (data.organization_id)
564
+ data[type][i]["organization_id"] = data.organization_id;
565
+
566
+ if (!data[type][i]._id)
567
+ data[type][i]["_id"] = ObjectId().toString();
568
+ data[type][i] = dotNotationToObject(data[type][i]);
569
+
570
+ // TODO: user_id || clientId shohould be retrieved from CoCreate
571
+ data[type][i]["created"] = {
572
+ on: data.timeStamp,
573
+ by: data.user_id || data.clientId
574
+ };
575
+ data[type][i] = await add(objectStore, data[type][i]);
576
+ data[type][i] = { ...reference, ...data[type][i] };
577
+ } else {
578
+ if (data[type][i].$filter) isFilter = true;
579
+
580
+ if (data.method == "object.update") {
581
+ if (data.organization_id)
582
+ data[type][i]["organization_id"] = data.organization_id;
583
+
584
+ if (data[type][i].$upsert) upsert = data[type][i].$upsert;
585
+ // TODO: user_id || clientId shohould be retrieved from CoCreate
586
+ if (!data[type][i].modified)
587
+ data[type][i].modified = {
588
+ on: data.timeStamp,
589
+ by: data.user_id || data.clientId
590
+ };
591
+ }
592
+
593
+ let index = 0,
594
+ limit,
595
+ range,
596
+ direction;
597
+ if (data[type][i]._id) {
598
+ range = IDBKeyRange.only(data[type][i]._id);
599
+ } else if (isFilter) {
600
+ let indexName;
601
+ let indexFields;
602
+
603
+ if (data.$filter) {
604
+ // TODO: requires a more robust sorting thats suports various directions
605
+ // Build compound index name from sort keys
606
+ if (data.$filter.sort && data.$filter.sort.length > 0) {
607
+ // Create a standard index name without _id
608
+ let sortKeys = data.$filter.sort
609
+ .map((sort) => sort.key)
610
+ .filter((key) => key !== "_id");
611
+ indexName = sortKeys.join("_"); // e.g., "createdAt_category"
612
+
613
+ // Define compound index fields
614
+ indexFields = [...sortKeys];
615
+
616
+ // Set cursor direction based on the first sort key direction
617
+ direction =
618
+ data.$filter.sort[0].direction === "desc"
619
+ ? "prev"
620
+ : "next";
621
+
622
+ // Use last item's values, including _id, to set up the range for pagination
623
+ if (indexName && lastItem && lastItem._id) {
624
+ indexName += "_id";
625
+ indexFields.push("_id");
626
+ let lastKeyValues = [
627
+ ...sortKeys.map((key) => lastItem[key]),
628
+ lastItem._id
629
+ ]; // Compound key array with _id
630
+
631
+ // Create IDBKeyRange based on direction and lastKeyValues
632
+ if (direction === "next") {
633
+ range = IDBKeyRange.lowerBound(
634
+ lastKeyValues,
635
+ true
636
+ );
637
+ } else {
638
+ range = IDBKeyRange.upperBound(
639
+ lastKeyValues,
640
+ true
641
+ );
642
+ }
643
+ }
644
+ } else if (
645
+ data.$filter.query &&
646
+ data.$filter.query[0] &&
647
+ data.$filter.query[0].key
648
+ ) {
649
+ if (data.$filter.query[0].operator === "$eq") {
650
+ range = IDBKeyRange.only(
651
+ data.$filter.query[0].value
652
+ );
653
+ } else if (
654
+ data.$filter.query[0].operator === "$gt"
655
+ ) {
656
+ range = IDBKeyRange.lowerBound(
657
+ data.$filter.query[0].value,
658
+ true
659
+ );
660
+ } else if (
661
+ data.$filter.query[0].operator === "$lt"
662
+ ) {
663
+ range = IDBKeyRange.upperBound(
664
+ data.$filter.query[0].value,
665
+ true
666
+ );
667
+ } else if (
668
+ data.$filter.query[0].operator === "$gte"
669
+ ) {
670
+ range = IDBKeyRange.lowerBound(
671
+ data.$filter.query[0].value
672
+ );
673
+ } else if (
674
+ data.$filter.query[0].operator === "$lte"
675
+ ) {
676
+ range = IDBKeyRange.upperBound(
677
+ data.$filter.query[0].value
678
+ );
679
+ }
680
+
681
+ indexName = data.$filter.query[0].key;
682
+ }
683
+ }
684
+
685
+ if (indexName && !indexName.includes("-")) {
686
+ // Check if the compound index exists; create it if not
687
+ let indexNames = Array.from(objectStore.indexNames);
688
+ if (!indexNames.includes(indexName)) {
689
+ db.close();
690
+ db = await processDatabase({
691
+ method: "database.get",
692
+ database,
693
+ array,
694
+ indexName,
695
+ indexFields
696
+ });
697
+ transaction = db.transaction(array, "readwrite");
698
+ objectStore = transaction.objectStore(array);
699
+ }
700
+ objectStore = objectStore.index(indexName);
701
+ }
702
+
703
+ let count = objectStore.count();
704
+ count.onsuccess = function () {
705
+ if (data.$filter) data.$filter.count = count.result;
706
+ else if (data.object.$filter)
707
+ data.object.$filter.count = count.result;
708
+ };
709
+
710
+ if (data.$filter) {
711
+ if (data.$filter.index) index = data.$filter.index;
712
+ if (data.$filter.limit) limit = data.$filter.limit;
713
+ }
714
+
715
+ if (data[type][i].$filter) {
716
+ if (data[type][i].$filter.index)
717
+ index = data[type][i].$filter.index;
718
+ if (data[type][i].$filter.limit)
719
+ limit = data[type][i].$filter.limit;
720
+ }
721
+ } else if (
722
+ data.method == "object.delete" ||
723
+ (data.method == "object.update" &&
724
+ !range &&
725
+ !upsert &&
726
+ !isFilter)
727
+ ) {
728
+ continue;
729
+ }
730
+
731
+ await openCursor(
732
+ objectStore,
733
+ range,
734
+ direction,
735
+ data,
736
+ newData,
737
+ isFilter,
738
+ index,
739
+ limit,
740
+ database,
741
+ array,
742
+ upsert,
743
+ type,
744
+ i,
745
+ globalOperators,
746
+ reference
747
+ );
748
+
749
+ if (index) newData = newData.slice(index);
750
+ }
751
+ }
752
+
753
+ if (db.close) db.close();
754
+ } catch (error) {
755
+ errorHandler(data, error, database, array);
756
+ if (db.close) db.close();
757
+ }
649
758
  }
650
759
 
651
760
  function openCursor(
652
- objectStore,
653
- range,
654
- direction,
655
- data,
656
- newData,
657
- isFilter,
658
- index,
659
- limit,
660
- database,
661
- array,
662
- upsert,
663
- type,
664
- i,
665
- globalOperators,
666
- reference
761
+ objectStore,
762
+ range,
763
+ direction,
764
+ data,
765
+ newData,
766
+ isFilter,
767
+ index,
768
+ limit,
769
+ database,
770
+ array,
771
+ upsert,
772
+ type,
773
+ i,
774
+ globalOperators,
775
+ reference
667
776
  ) {
668
- return new Promise(async (resolve, reject) => {
669
- const request = objectStore.openCursor(range || null, direction); // next, prev
670
-
671
- let hasUpdated,
672
- matchedLength = 0,
673
- hasSkipped;
674
- request.onsuccess = async () => {
675
- let cursor = request.result;
676
-
677
- if (
678
- data.method === "object.create" ||
679
- (data.method === "object.update" &&
680
- ((!range && !isFilter && upsert) ||
681
- (!cursor && upsert && !hasUpdated)))
682
- ) {
683
- let isMatch = true;
684
- if (isFilter) {
685
- if (cursor)
686
- isMatch = filter(
687
- objectStore,
688
- data[type][i],
689
- data[type][i],
690
- cursor.value
691
- );
692
- else if (data.method === "object.update" && !upsert) isMatch = false;
693
- }
694
-
695
- if (isMatch !== false) {
696
- try {
697
- data[type][i]._id = ObjectId(data[type][i]._id).toString();
698
- } catch (error) {
699
- data[type][i]._id = ObjectId().toString();
700
- }
701
-
702
- let result;
703
- if (data.method == "object.create") {
704
- data[type][i] = await add(objectStore, data[type][i]);
705
- } else if (data.method == "object.update") {
706
- let update = createUpdate(
707
- cursor && cursor.value ? cursor.value : {},
708
- data[type][i],
709
- globalOperators
710
- );
711
- if (update) {
712
- await put(objectStore, update);
713
- data[type][i].$update = update;
714
- }
715
- }
716
- data[type][i] = { ...reference, ...data[type][i] };
717
-
718
- matchedLength++;
719
- }
720
- resolve();
721
- } else if (cursor) {
722
- if (index && !hasSkipped) {
723
- cursor.advance(index);
724
- hasSkipped = true;
725
- } else {
726
- let isMatch = true;
727
- if (isFilter)
728
- isMatch = filter(objectStore, data, data[type][i], cursor.value);
729
-
730
- if (isMatch !== false) {
731
- let result = cursor.value;
732
-
733
- if (data.method == "object.update") {
734
- let update = createUpdate(
735
- cursor.value,
736
- data[type][i],
737
- globalOperators
738
- );
739
- if (update) await cursorUpdate(cursor, update);
740
- result = data[type][i];
741
- result.$update = update;
742
- // result = cursor.update(update)
743
- hasUpdated = true;
744
- // set dotnotation for keys with $operators for items that end in [] to be used by socket.id
745
- // TODO: if update.$<operator>.someKey[] requires the index of inerted item added to the field name. update.$<operator>.someKey[<index>]
746
- // TODO: if $addToSet get field name and item if it does not exist.
747
- // TODO: if $pull get field name and find if item exist and delete.
748
- } else if (data.method == "object.delete") {
749
- result = cursor.value;
750
- cursor.delete();
751
- }
752
-
753
- if (data[type][i]._id) data[type][i] = { ...reference, ...result };
754
- else {
755
- let object = data[type].find(
756
- (obj) => obj._id && obj._id === result._id
757
- );
758
- if (object) object = { ...reference, ...object, ...result };
759
- else newData.push({ ...reference, ...result });
760
- }
761
- }
762
-
763
- if (!limit || (limit && limit > newData.length + matchedLength)) {
764
- cursor.continue();
765
- } else {
766
- resolve();
767
- }
768
- }
769
- } else {
770
- resolve();
771
- }
772
- };
773
-
774
- request.onerror = () => {
775
- reject(request.error);
776
- };
777
- });
777
+ return new Promise(async (resolve, reject) => {
778
+ const request = objectStore.openCursor(range || null, direction); // next, prev
779
+
780
+ let hasUpdated,
781
+ matchedLength = 0,
782
+ hasSkipped;
783
+ request.onsuccess = async () => {
784
+ let cursor = request.result;
785
+
786
+ if (
787
+ data.method === "object.create" ||
788
+ (data.method === "object.update" &&
789
+ ((!range && !isFilter && upsert) ||
790
+ (!cursor && upsert && !hasUpdated)))
791
+ ) {
792
+ let isMatch = true;
793
+ if (isFilter) {
794
+ if (cursor)
795
+ isMatch = filter(
796
+ objectStore,
797
+ data[type][i],
798
+ data[type][i],
799
+ cursor.value
800
+ );
801
+ else if (data.method === "object.update" && !upsert)
802
+ isMatch = false;
803
+ }
804
+
805
+ if (isMatch !== false) {
806
+ try {
807
+ data[type][i]._id = ObjectId(
808
+ data[type][i]._id
809
+ ).toString();
810
+ } catch (error) {
811
+ data[type][i]._id = ObjectId().toString();
812
+ }
813
+
814
+ let result;
815
+ if (data.method == "object.create") {
816
+ data[type][i] = await add(objectStore, data[type][i]);
817
+ } else if (data.method == "object.update") {
818
+ let update = createUpdate(
819
+ cursor && cursor.value ? cursor.value : {},
820
+ data[type][i],
821
+ globalOperators
822
+ );
823
+ if (update) {
824
+ await put(objectStore, update);
825
+ data[type][i].$update = update;
826
+ }
827
+ }
828
+ data[type][i] = { ...reference, ...data[type][i] };
829
+
830
+ matchedLength++;
831
+ }
832
+ resolve();
833
+ } else if (cursor) {
834
+ if (index && !hasSkipped) {
835
+ cursor.advance(index);
836
+ hasSkipped = true;
837
+ } else {
838
+ let isMatch = true;
839
+ if (isFilter)
840
+ isMatch = filter(
841
+ objectStore,
842
+ data,
843
+ data[type][i],
844
+ cursor.value
845
+ );
846
+
847
+ if (isMatch !== false) {
848
+ let result = cursor.value;
849
+
850
+ if (data.method == "object.update") {
851
+ let update = createUpdate(
852
+ cursor.value,
853
+ data[type][i],
854
+ globalOperators
855
+ );
856
+ if (update) await cursorUpdate(cursor, update);
857
+ result = data[type][i];
858
+ result.$update = update;
859
+ // result = cursor.update(update)
860
+ hasUpdated = true;
861
+ // set dotnotation for keys with $operators for items that end in [] to be used by socket.id
862
+ // TODO: if update.$<operator>.someKey[] requires the index of inerted item added to the field name. update.$<operator>.someKey[<index>]
863
+ // TODO: if $addToSet get field name and item if it does not exist.
864
+ // TODO: if $pull get field name and find if item exist and delete.
865
+ } else if (data.method == "object.delete") {
866
+ result = cursor.value;
867
+ cursor.delete();
868
+ }
869
+
870
+ if (data[type][i]._id)
871
+ data[type][i] = { ...reference, ...result };
872
+ else {
873
+ let object = data[type].find(
874
+ (obj) => obj._id && obj._id === result._id
875
+ );
876
+ if (object)
877
+ object = { ...reference, ...object, ...result };
878
+ else newData.push({ ...reference, ...result });
879
+ }
880
+ }
881
+
882
+ if (
883
+ !limit ||
884
+ (limit && limit > newData.length + matchedLength)
885
+ ) {
886
+ cursor.continue();
887
+ } else {
888
+ resolve();
889
+ }
890
+ }
891
+ } else {
892
+ resolve();
893
+ }
894
+ };
895
+
896
+ request.onerror = () => {
897
+ reject(request.error);
898
+ };
899
+ });
778
900
  }
779
901
 
780
902
  function add(objectStore, object) {
781
- return new Promise((resolve, reject) => {
782
- const store = objectStore.objectStore || objectStore;
783
- let request = store.add(object);
784
- request.onsuccess = () => resolve(object);
785
- request.onerror = () => reject(request.error);
786
- });
903
+ return new Promise((resolve, reject) => {
904
+ const store = objectStore.objectStore || objectStore;
905
+ let request = store.add(object);
906
+ request.onsuccess = () => resolve(object);
907
+ request.onerror = () => reject(request.error);
908
+ });
787
909
  }
788
910
 
789
911
  function get(objectStore, object) {
790
- return new Promise((resolve, reject) => {
791
- const request = objectStore.get(object._id);
792
- request.onsuccess = () => resolve(request.result);
793
- request.onerror = () => reject(request.error);
794
- });
912
+ return new Promise((resolve, reject) => {
913
+ const request = objectStore.get(object._id);
914
+ request.onsuccess = () => resolve(request.result);
915
+ request.onerror = () => reject(request.error);
916
+ });
795
917
  }
796
918
 
797
919
  function put(objectStore, object) {
798
- return new Promise((resolve, reject) => {
799
- const store = objectStore.objectStore || objectStore;
800
- let request = store.put(object);
920
+ return new Promise((resolve, reject) => {
921
+ const store = objectStore.objectStore || objectStore;
922
+ let request = store.put(object);
801
923
 
802
- request.onsuccess = () => resolve(object);
803
- request.onerror = () => reject(request.error);
804
- });
924
+ request.onsuccess = () => resolve(object);
925
+ request.onerror = () => reject(request.error);
926
+ });
805
927
  }
806
928
 
807
929
  function deleteObject(objectStore, object) {
808
- return new Promise((resolve, reject) => {
809
- const request = objectStore.delete(object._id);
810
- request.onsuccess = () => resolve(object);
811
- request.onerror = () => reject(request.error);
812
- });
930
+ return new Promise((resolve, reject) => {
931
+ const request = objectStore.delete(object._id);
932
+ request.onsuccess = () => resolve(object);
933
+ request.onerror = () => reject(request.error);
934
+ });
813
935
  }
814
936
 
815
937
  function cursorUpdate(cursor, update) {
816
- return new Promise((resolve, reject) => {
817
- const request = cursor.update(update);
818
- request.onsuccess = () => resolve(request.source.value);
819
- request.onerror = () => reject(request.error);
820
- });
938
+ return new Promise((resolve, reject) => {
939
+ const request = cursor.update(update);
940
+ request.onsuccess = () => resolve(request.source.value);
941
+ request.onerror = () => reject(request.error);
942
+ });
821
943
  }
822
944
 
823
945
  function filter(objectStore, data, object, result) {
824
- let isMatch = true;
825
- let filter = data.$filter || object.$filter;
826
- if (filter) {
827
- if (filter.query) isMatch = queryData(result, filter.query);
828
- if (isMatch && filter.search) isMatch = searchData(result, filter.search);
829
- }
830
-
831
- return isMatch;
946
+ let isMatch = true;
947
+ let filter = data.$filter || object.$filter;
948
+ if (filter) {
949
+ if (filter.query) isMatch = queryData(result, filter.query);
950
+ if (isMatch && filter.search)
951
+ isMatch = searchData(result, filter.search);
952
+ }
953
+
954
+ return isMatch;
832
955
  }
833
956
 
834
957
  function getGlobalOperators(data, object = {}) {
835
- for (let operator of Object.keys(data)) {
836
- if (!operator.startsWith("$")) return;
837
- for (let key of Object.keys(data[operator]))
838
- object[operator + "." + key] = data[operator][key];
839
- }
958
+ for (let operator of Object.keys(data)) {
959
+ if (!operator.startsWith("$")) return;
960
+ for (let key of Object.keys(data[operator]))
961
+ object[operator + "." + key] = data[operator][key];
962
+ }
840
963
 
841
- return object;
964
+ return object;
842
965
  }
843
966
 
844
967
  function createData(data, newData, type) {
845
- // data.request = data[type] || {}
846
- if (
847
- data[type] &&
848
- data[type][0] &&
849
- data[type][0].isFilter === "isEmptyObjectFilter"
850
- ) {
851
- data[type].shift();
852
- data.isFilter = true;
853
- }
854
-
855
- data[type].push(...newData);
856
-
857
- if (data.$filter) {
858
- if (data.$filter.sort) data[type] = sortData(data[type], data.$filter.sort);
859
-
860
- data.$filter.startingIndex = data.$filter.index;
861
- data.$filter.index += data[type].length;
862
- }
863
-
864
- return data;
968
+ // data.request = data[type] || {}
969
+ if (
970
+ data[type] &&
971
+ data[type][0] &&
972
+ data[type][0].isFilter === "isEmptyObjectFilter"
973
+ ) {
974
+ data[type].shift();
975
+ data.isFilter = true;
976
+ }
977
+
978
+ data[type].push(...newData);
979
+
980
+ if (data.$filter) {
981
+ if (data.$filter.sort)
982
+ data[type] = sortData(data[type], data.$filter.sort);
983
+
984
+ data.$filter.startingIndex = data.$filter.index;
985
+ data.$filter.index += data[type].length;
986
+ }
987
+
988
+ return data;
865
989
  }
866
990
 
867
991
  function errorHandler(data, error, database, array) {
868
- console.error(error, data);
869
- if (typeof error == "object") error["storage"] = "indexeddb";
870
- else error = { storage: "indexeddb", message: error };
871
-
872
- if (database) error["database"] = database;
873
- if (array) error["array"] = array;
874
- if (data.error) data.error.push(error);
875
- else data.error = [error];
992
+ console.error(error, data);
993
+ // if (typeof error == "object") error["storage"] = "indexeddb";
994
+ // else error = { storage: "indexeddb", message: error };
995
+
996
+ // if (database) error["database"] = database;
997
+ // if (array) error["array"] = array;
998
+ // if (data.error) data.error.push(error);
999
+ // else data.error = [error];
876
1000
  }
877
1001
 
878
1002
  init();