@cocreate/indexeddb 1.23.0 → 1.23.1

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.
Files changed (3) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +1 -1
  3. package/src/index.js +913 -793
package/src/index.js CHANGED
@@ -23,856 +23,976 @@
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
+ for (let i = 0; i < objectStoreNames.length; i++) {
318
+ if (data.$filter && data.$filter.query) {
319
+ let isFilter = queryData(
320
+ { name: objectStoreNames[i] },
321
+ data.$filter.query
322
+ );
323
+ if (isFilter)
324
+ newData.push({
325
+ name: objectStoreNames,
326
+ $storage: ["indexeddb"],
327
+ $database: [database]
328
+ });
329
+ } else
330
+ newData.push({
331
+ name: objectStoreNames[i],
332
+ $storage: ["indexeddb"],
333
+ $database: [database]
334
+ });
335
+ }
336
+ } else {
337
+ db.close();
338
+
339
+ let request = await processDatabase({
340
+ method: "database.get",
341
+ database,
342
+ upgrade: true
343
+ });
344
+ await new Promise((resolve) => {
345
+ request.onupgradeneeded = function (event) {
346
+ let db = event.target.result;
347
+ let arrays;
348
+ if (data.method == "array.update")
349
+ arrays = Object.keys(data[type]);
350
+ else arrays = data[type];
351
+ if (!Array.isArray(arrays)) arrays = [arrays];
352
+
353
+ for (let i = 0; i < arrays.length; i++) {
354
+ let error,
355
+ array = arrays[i];
356
+
357
+ let arrayExist = db.objectStoreNames.contains(array);
358
+ if (arrayExist && data.method == "array.create") {
359
+ error = "array already exists";
360
+ } else if (data.method == "array.delete") {
361
+ if (objectStoreNames.includes(array)) {
362
+ db.deleteObjectStore(array);
363
+ } else {
364
+ error = "the array does not exist";
365
+ }
366
+ } else {
367
+ if (!arrayExist && data.method == "array.update")
368
+ array = data[type][arrays[i]];
369
+
370
+ if (arrayExist) {
371
+ if (data.method == "array.update") {
372
+ let transaction = event.target.transaction;
373
+ let objectStore =
374
+ transaction.objectStore(array);
375
+
376
+ if (
377
+ !objectStoreNames.includes(
378
+ data[type][arrays[i]]
379
+ )
380
+ )
381
+ array = objectStore.name =
382
+ data[type][arrays[i]];
383
+ else
384
+ error =
385
+ "An array with the new name already exist";
386
+ }
387
+ } else if (data.method == "array.update")
388
+ error = "array does not exists";
389
+ }
390
+
391
+ if (!error)
392
+ newData.push({
393
+ name: array,
394
+ $storage: ["indexeddb"],
395
+ $database: [database]
396
+ });
397
+ else errorHandler(data, error, database);
398
+ }
399
+ };
400
+
401
+ request.onsuccess = function (event) {
402
+ event.target.result.close();
403
+ resolve();
404
+ };
405
+
406
+ request.onerror = function (event) {
407
+ errorHandler(data, event.target.error, database);
408
+ resolve();
409
+ };
410
+ });
411
+ }
350
412
  }
351
413
 
352
414
  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
- }
415
+ let db = await processDatabase({ method: "database.get", database });
416
+ let arrayExist = db.objectStoreNames.contains(array);
417
+ if (arrayExist) {
418
+ // ToDO: switch here to types
419
+ let transaction = db.transaction(array, "readonly");
420
+ let objectStore = transaction.objectStore(array);
421
+ let indexNames = Array.from(objectStore.indexNames);
422
+
423
+ if (data.method == "index.read") {
424
+ for (let i = 0; i < indexNames.length; i++) {
425
+ let name = indexNames[i];
426
+ if (data.$filter && data.$filter.query)
427
+ if (!queryData({ name }, data.$filter.query)) continue;
428
+
429
+ newData.push({
430
+ name,
431
+ $storage: ["indexeddb"],
432
+ $database: [database],
433
+ $array: [array]
434
+ });
435
+ }
436
+ db.close();
437
+ } else {
438
+ db.close();
439
+ let indexes;
440
+ if (data.method == "index.update")
441
+ indexes = Object.keys(data[type]);
442
+ else indexes = data[type];
443
+
444
+ if (!Array.isArray(indexes)) indexes = [indexes];
445
+
446
+ for (let i = 0; i < indexes.length; i++) {
447
+ let error,
448
+ index = indexes[i];
449
+ db = await processDatabase({
450
+ method: "database.get",
451
+ database,
452
+ upgrade: true
453
+ });
454
+ let transaction = db.transaction;
455
+ let objectStore = transaction.objectStore(array);
456
+ let indexExist = indexNames.includes(index);
457
+
458
+ if (data.method == "index.create") {
459
+ if (!indexExist)
460
+ objectStore.createIndex(index, index, {
461
+ unique: false
462
+ });
463
+ else error = "index already exist";
464
+ } else if (indexExist) {
465
+ if (data.method == "index.delete")
466
+ objectStore.deleteIndex(index);
467
+ else if (
468
+ data.method == "index.update" &&
469
+ !indexNames.includes(data[type][indexes[i]])
470
+ ) {
471
+ if (!indexNames.includes(data[type][indexes[i]])) {
472
+ let indexObj = objectStore.index(index);
473
+ index = indexObj.name = data[type][indexes[i]];
474
+ } else error = "new index name already exist";
475
+ }
476
+ } else error = "index does not exist";
477
+
478
+ if (!error)
479
+ newData.push({
480
+ name: index,
481
+ $storage: ["indexeddb"],
482
+ $database: [database],
483
+ $array: [array]
484
+ });
485
+ else errorHandler(data, error, database, array);
486
+
487
+ db.result.close();
488
+ }
489
+ }
490
+ }
425
491
  }
426
492
 
427
493
  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
- }
494
+ let db = await processDatabase({ method: "database.get", database });
495
+
496
+ try {
497
+ if (!data[type]) data[type] = [];
498
+ else if (typeof data[type] === "string")
499
+ data[type] = [{ _id: data[type] }];
500
+ else if (!Array.isArray(data[type])) data[type] = [data[type]];
501
+
502
+ let isFilter;
503
+ if (data.$filter) isFilter = true;
504
+
505
+ let arrayExist = db.objectStoreNames.contains(array);
506
+ if (!arrayExist) {
507
+ db.close();
508
+ if (
509
+ data.method == "object.create" ||
510
+ data.method == "object.update"
511
+ ) {
512
+ db = await processDatabase({
513
+ method: "database.get",
514
+ database,
515
+ array
516
+ });
517
+ } else {
518
+ return errorHandler(
519
+ data,
520
+ "array does not exist",
521
+ database,
522
+ array
523
+ );
524
+ }
525
+ }
526
+
527
+ if (!array || !db)
528
+ throw new Error({ error: "This is an error message.", db, array });
529
+
530
+ let lastItem;
531
+ if ((isFilter && !data[type].length) || data.isFilter) {
532
+ if (data[type].length) lastItem = data[type][data[type].length - 1];
533
+ data[type] = [{ isFilter: "isEmptyObjectFilter" }];
534
+
535
+ // data[type].splice(0, 0, { isFilter: 'isEmptyObjectFilter' });
536
+ }
537
+
538
+ let transactionType = "readwrite";
539
+ if (data.method == "object.read") transactionType = "readonly";
540
+
541
+ let transaction = db.transaction([array], transactionType);
542
+ let objectStore = transaction.objectStore(array);
543
+
544
+ let globalOperators = getGlobalOperators(data);
545
+ let upsert = data.upsert;
546
+
547
+ for (let i = 0; i < data[type].length; i++) {
548
+ const reference = {
549
+ $storage: ["indexeddb"],
550
+ $database: [database],
551
+ $array: [array]
552
+ };
553
+
554
+ delete data[type][i].$storage;
555
+ delete data[type][i].$database;
556
+ delete data[type][i].$array;
557
+
558
+ if (data.method == "object.create") {
559
+ if (data.organization_id)
560
+ data[type][i]["organization_id"] = data.organization_id;
561
+
562
+ if (!data[type][i]._id)
563
+ data[type][i]["_id"] = ObjectId().toString();
564
+ data[type][i] = dotNotationToObject(data[type][i]);
565
+
566
+ // TODO: user_id || clientId shohould be retrieved from CoCreate
567
+ data[type][i]["created"] = {
568
+ on: data.timeStamp,
569
+ by: data.user_id || data.clientId
570
+ };
571
+ data[type][i] = await add(objectStore, data[type][i]);
572
+ data[type][i] = { ...reference, ...data[type][i] };
573
+ } else {
574
+ if (data[type][i].$filter) isFilter = true;
575
+
576
+ if (data.method == "object.update") {
577
+ if (data.organization_id)
578
+ data[type][i]["organization_id"] = data.organization_id;
579
+
580
+ if (data[type][i].$upsert) upsert = data[type][i].$upsert;
581
+ // TODO: user_id || clientId shohould be retrieved from CoCreate
582
+ if (!data[type][i].modified)
583
+ data[type][i].modified = {
584
+ on: data.timeStamp,
585
+ by: data.user_id || data.clientId
586
+ };
587
+ }
588
+
589
+ let index = 0,
590
+ limit,
591
+ range,
592
+ direction;
593
+ if (data[type][i]._id) {
594
+ range = IDBKeyRange.only(data[type][i]._id);
595
+ } else if (isFilter) {
596
+ let indexName;
597
+ let indexFields;
598
+
599
+ if (data.$filter) {
600
+ // TODO: requires a more robust sorting thats suports various directions
601
+ // Build compound index name from sort keys
602
+ if (data.$filter.sort && data.$filter.sort.length > 0) {
603
+ // Create a standard index name without _id
604
+ let sortKeys = data.$filter.sort
605
+ .map((sort) => sort.key)
606
+ .filter((key) => key !== "_id");
607
+ indexName = sortKeys.join("_"); // e.g., "createdAt_category"
608
+
609
+ // Define compound index fields
610
+ indexFields = [...sortKeys];
611
+
612
+ // Set cursor direction based on the first sort key direction
613
+ direction =
614
+ data.$filter.sort[0].direction === "desc"
615
+ ? "prev"
616
+ : "next";
617
+
618
+ // Use last item's values, including _id, to set up the range for pagination
619
+ if (indexName && lastItem && lastItem._id) {
620
+ indexName += "_id";
621
+ indexFields.push("_id");
622
+ let lastKeyValues = [
623
+ ...sortKeys.map((key) => lastItem[key]),
624
+ lastItem._id
625
+ ]; // Compound key array with _id
626
+
627
+ // Create IDBKeyRange based on direction and lastKeyValues
628
+ if (direction === "next") {
629
+ range = IDBKeyRange.lowerBound(
630
+ lastKeyValues,
631
+ true
632
+ );
633
+ } else {
634
+ range = IDBKeyRange.upperBound(
635
+ lastKeyValues,
636
+ true
637
+ );
638
+ }
639
+ }
640
+ } else if (
641
+ data.$filter.query &&
642
+ data.$filter.query[0] &&
643
+ data.$filter.query[0].key
644
+ ) {
645
+ if (data.$filter.query[0].operator === "$eq") {
646
+ range = IDBKeyRange.only(
647
+ data.$filter.query[0].value
648
+ );
649
+ } else if (
650
+ data.$filter.query[0].operator === "$gt"
651
+ ) {
652
+ range = IDBKeyRange.lowerBound(
653
+ data.$filter.query[0].value,
654
+ true
655
+ );
656
+ } else if (
657
+ data.$filter.query[0].operator === "$lt"
658
+ ) {
659
+ range = IDBKeyRange.upperBound(
660
+ data.$filter.query[0].value,
661
+ true
662
+ );
663
+ } else if (
664
+ data.$filter.query[0].operator === "$gte"
665
+ ) {
666
+ range = IDBKeyRange.lowerBound(
667
+ data.$filter.query[0].value
668
+ );
669
+ } else if (
670
+ data.$filter.query[0].operator === "$lte"
671
+ ) {
672
+ range = IDBKeyRange.upperBound(
673
+ data.$filter.query[0].value
674
+ );
675
+ }
676
+
677
+ indexName = data.$filter.query[0].key;
678
+ }
679
+ }
680
+
681
+ if (indexName && !indexName.includes("-")) {
682
+ // Check if the compound index exists; create it if not
683
+ let indexNames = Array.from(objectStore.indexNames);
684
+ if (!indexNames.includes(indexName)) {
685
+ db.close();
686
+ db = await processDatabase({
687
+ method: "database.get",
688
+ database,
689
+ array,
690
+ indexName,
691
+ indexFields
692
+ });
693
+ transaction = db.transaction(array, "readwrite");
694
+ objectStore = transaction.objectStore(array);
695
+ }
696
+ objectStore = objectStore.index(indexName);
697
+ }
698
+
699
+ let count = objectStore.count();
700
+ count.onsuccess = function () {
701
+ if (data.$filter) data.$filter.count = count.result;
702
+ else if (data.object.$filter)
703
+ data.object.$filter.count = count.result;
704
+ };
705
+
706
+ if (data.$filter) {
707
+ if (data.$filter.index) index = data.$filter.index;
708
+ if (data.$filter.limit) limit = data.$filter.limit;
709
+ }
710
+
711
+ if (data[type][i].$filter) {
712
+ if (data[type][i].$filter.index)
713
+ index = data[type][i].$filter.index;
714
+ if (data[type][i].$filter.limit)
715
+ limit = data[type][i].$filter.limit;
716
+ }
717
+ } else if (
718
+ data.method == "object.delete" ||
719
+ (data.method == "object.update" &&
720
+ !range &&
721
+ !upsert &&
722
+ !isFilter)
723
+ ) {
724
+ continue;
725
+ }
726
+
727
+ await openCursor(
728
+ objectStore,
729
+ range,
730
+ direction,
731
+ data,
732
+ newData,
733
+ isFilter,
734
+ index,
735
+ limit,
736
+ database,
737
+ array,
738
+ upsert,
739
+ type,
740
+ i,
741
+ globalOperators,
742
+ reference
743
+ );
744
+
745
+ if (index) newData = newData.slice(index);
746
+ }
747
+ }
748
+
749
+ if (db.close) db.close();
750
+ } catch (error) {
751
+ errorHandler(data, error, database, array);
752
+ if (db.close) db.close();
753
+ }
649
754
  }
650
755
 
651
756
  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
757
+ objectStore,
758
+ range,
759
+ direction,
760
+ data,
761
+ newData,
762
+ isFilter,
763
+ index,
764
+ limit,
765
+ database,
766
+ array,
767
+ upsert,
768
+ type,
769
+ i,
770
+ globalOperators,
771
+ reference
667
772
  ) {
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
- });
773
+ return new Promise(async (resolve, reject) => {
774
+ const request = objectStore.openCursor(range || null, direction); // next, prev
775
+
776
+ let hasUpdated,
777
+ matchedLength = 0,
778
+ hasSkipped;
779
+ request.onsuccess = async () => {
780
+ let cursor = request.result;
781
+
782
+ if (
783
+ data.method === "object.create" ||
784
+ (data.method === "object.update" &&
785
+ ((!range && !isFilter && upsert) ||
786
+ (!cursor && upsert && !hasUpdated)))
787
+ ) {
788
+ let isMatch = true;
789
+ if (isFilter) {
790
+ if (cursor)
791
+ isMatch = filter(
792
+ objectStore,
793
+ data[type][i],
794
+ data[type][i],
795
+ cursor.value
796
+ );
797
+ else if (data.method === "object.update" && !upsert)
798
+ isMatch = false;
799
+ }
800
+
801
+ if (isMatch !== false) {
802
+ try {
803
+ data[type][i]._id = ObjectId(
804
+ data[type][i]._id
805
+ ).toString();
806
+ } catch (error) {
807
+ data[type][i]._id = ObjectId().toString();
808
+ }
809
+
810
+ let result;
811
+ if (data.method == "object.create") {
812
+ data[type][i] = await add(objectStore, data[type][i]);
813
+ } else if (data.method == "object.update") {
814
+ let update = createUpdate(
815
+ cursor && cursor.value ? cursor.value : {},
816
+ data[type][i],
817
+ globalOperators
818
+ );
819
+ if (update) {
820
+ await put(objectStore, update);
821
+ data[type][i].$update = update;
822
+ }
823
+ }
824
+ data[type][i] = { ...reference, ...data[type][i] };
825
+
826
+ matchedLength++;
827
+ }
828
+ resolve();
829
+ } else if (cursor) {
830
+ if (index && !hasSkipped) {
831
+ cursor.advance(index);
832
+ hasSkipped = true;
833
+ } else {
834
+ let isMatch = true;
835
+ if (isFilter)
836
+ isMatch = filter(
837
+ objectStore,
838
+ data,
839
+ data[type][i],
840
+ cursor.value
841
+ );
842
+
843
+ if (isMatch !== false) {
844
+ let result = cursor.value;
845
+
846
+ if (data.method == "object.update") {
847
+ let update = createUpdate(
848
+ cursor.value,
849
+ data[type][i],
850
+ globalOperators
851
+ );
852
+ if (update) await cursorUpdate(cursor, update);
853
+ result = data[type][i];
854
+ result.$update = update;
855
+ // result = cursor.update(update)
856
+ hasUpdated = true;
857
+ // set dotnotation for keys with $operators for items that end in [] to be used by socket.id
858
+ // TODO: if update.$<operator>.someKey[] requires the index of inerted item added to the field name. update.$<operator>.someKey[<index>]
859
+ // TODO: if $addToSet get field name and item if it does not exist.
860
+ // TODO: if $pull get field name and find if item exist and delete.
861
+ } else if (data.method == "object.delete") {
862
+ result = cursor.value;
863
+ cursor.delete();
864
+ }
865
+
866
+ if (data[type][i]._id)
867
+ data[type][i] = { ...reference, ...result };
868
+ else {
869
+ let object = data[type].find(
870
+ (obj) => obj._id && obj._id === result._id
871
+ );
872
+ if (object)
873
+ object = { ...reference, ...object, ...result };
874
+ else newData.push({ ...reference, ...result });
875
+ }
876
+ }
877
+
878
+ if (
879
+ !limit ||
880
+ (limit && limit > newData.length + matchedLength)
881
+ ) {
882
+ cursor.continue();
883
+ } else {
884
+ resolve();
885
+ }
886
+ }
887
+ } else {
888
+ resolve();
889
+ }
890
+ };
891
+
892
+ request.onerror = () => {
893
+ reject(request.error);
894
+ };
895
+ });
778
896
  }
779
897
 
780
898
  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
- });
899
+ return new Promise((resolve, reject) => {
900
+ const store = objectStore.objectStore || objectStore;
901
+ let request = store.add(object);
902
+ request.onsuccess = () => resolve(object);
903
+ request.onerror = () => reject(request.error);
904
+ });
787
905
  }
788
906
 
789
907
  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
- });
908
+ return new Promise((resolve, reject) => {
909
+ const request = objectStore.get(object._id);
910
+ request.onsuccess = () => resolve(request.result);
911
+ request.onerror = () => reject(request.error);
912
+ });
795
913
  }
796
914
 
797
915
  function put(objectStore, object) {
798
- return new Promise((resolve, reject) => {
799
- const store = objectStore.objectStore || objectStore;
800
- let request = store.put(object);
916
+ return new Promise((resolve, reject) => {
917
+ const store = objectStore.objectStore || objectStore;
918
+ let request = store.put(object);
801
919
 
802
- request.onsuccess = () => resolve(object);
803
- request.onerror = () => reject(request.error);
804
- });
920
+ request.onsuccess = () => resolve(object);
921
+ request.onerror = () => reject(request.error);
922
+ });
805
923
  }
806
924
 
807
925
  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
- });
926
+ return new Promise((resolve, reject) => {
927
+ const request = objectStore.delete(object._id);
928
+ request.onsuccess = () => resolve(object);
929
+ request.onerror = () => reject(request.error);
930
+ });
813
931
  }
814
932
 
815
933
  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
- });
934
+ return new Promise((resolve, reject) => {
935
+ const request = cursor.update(update);
936
+ request.onsuccess = () => resolve(request.source.value);
937
+ request.onerror = () => reject(request.error);
938
+ });
821
939
  }
822
940
 
823
941
  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;
942
+ let isMatch = true;
943
+ let filter = data.$filter || object.$filter;
944
+ if (filter) {
945
+ if (filter.query) isMatch = queryData(result, filter.query);
946
+ if (isMatch && filter.search)
947
+ isMatch = searchData(result, filter.search);
948
+ }
949
+
950
+ return isMatch;
832
951
  }
833
952
 
834
953
  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
- }
954
+ for (let operator of Object.keys(data)) {
955
+ if (!operator.startsWith("$")) return;
956
+ for (let key of Object.keys(data[operator]))
957
+ object[operator + "." + key] = data[operator][key];
958
+ }
840
959
 
841
- return object;
960
+ return object;
842
961
  }
843
962
 
844
963
  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;
964
+ // data.request = data[type] || {}
965
+ if (
966
+ data[type] &&
967
+ data[type][0] &&
968
+ data[type][0].isFilter === "isEmptyObjectFilter"
969
+ ) {
970
+ data[type].shift();
971
+ data.isFilter = true;
972
+ }
973
+
974
+ data[type].push(...newData);
975
+
976
+ if (data.$filter) {
977
+ if (data.$filter.sort)
978
+ data[type] = sortData(data[type], data.$filter.sort);
979
+
980
+ data.$filter.startingIndex = data.$filter.index;
981
+ data.$filter.index += data[type].length;
982
+ }
983
+
984
+ return data;
865
985
  }
866
986
 
867
987
  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];
988
+ console.error(error, data);
989
+ // if (typeof error == "object") error["storage"] = "indexeddb";
990
+ // else error = { storage: "indexeddb", message: error };
991
+
992
+ // if (database) error["database"] = database;
993
+ // if (array) error["array"] = array;
994
+ // if (data.error) data.error.push(error);
995
+ // else data.error = [error];
876
996
  }
877
997
 
878
998
  init();