@cocreate/crud-client
Advanced tools
Comparing version 1.27.0 to 1.28.0
{ | ||
"name": "@cocreate/crud-client", | ||
"version": "1.27.0", | ||
"version": "1.28.0", | ||
"description": "An useful CRUD api operate Create, read, update, delete with built in database. Can be used as a firebase alternative. Easily configured using HTML5 attributes and/or JavaScript API.", | ||
@@ -62,5 +62,5 @@ "keywords": [ | ||
"@cocreate/indexeddb": "^1.13.5", | ||
"@cocreate/socket-client": "^1.27.0", | ||
"@cocreate/socket-client": "^1.28.0", | ||
"@cocreate/uuid": "^1.7.2" | ||
} | ||
} |
215
src/index.js
@@ -70,3 +70,3 @@ /******************************************************************************** | ||
data['timeStamp'] = new Date().toISOString() | ||
data['timeStamp'] = new Date() | ||
@@ -78,3 +78,3 @@ if (data.method.startsWith('read')) | ||
if (!data.organization_id) | ||
data.organization_id = await this.getOrganizationId() | ||
data.organization_id = await this.socket.organization_id() | ||
@@ -85,5 +85,9 @@ if (data.database || data.array || data.type) { | ||
if (!data.database) | ||
data['database'] = data.organization_id || this.socket.config.organization_id | ||
data['database'] = data.organization_id | ||
if (!data.user_id) | ||
data['user_id'] = this.socket.config.user_id | ||
data['user_id'] = this.socket.user_id | ||
if (data.broadcastClient !== false && data.broadcastClient !== 'false') | ||
data['broadcastClient'] = true | ||
if (data.method.startsWith('read')) | ||
data.broadcastBrowser = false | ||
} | ||
@@ -93,20 +97,25 @@ | ||
indexeddb.send(data).then((response) => { | ||
if (!data.method.startsWith('read')) { | ||
if (!data.broadcastBrowser && data.broadcastBrowser != 'false') | ||
response['broadcastBrowser'] = 'once' | ||
if (data.method.startsWith('delete')) { | ||
indexeddb.send({ | ||
method: 'create.object', | ||
database: 'crudSync', | ||
array: 'deleted', | ||
object: { _id: ObjectId(), item: response } | ||
}) | ||
} | ||
if (data.method.startsWith('delete')) { | ||
indexeddb.send({ | ||
method: 'create.object', | ||
database: 'crudSync', | ||
array: 'deleted', | ||
object: { _id: ObjectId(), item: response } | ||
}) | ||
} | ||
this.socket.send(response).then((response) => { | ||
let type = data.method.split('.'); | ||
type = type[type.length - 1]; | ||
if (type && response[type] && response[type].length) { | ||
if (data.broadcastBrowser !== false && data.broadcastBrowser !== 'false') | ||
response['broadcastBrowser'] = true | ||
resolve(response); | ||
}) | ||
response.status = 'resolved' | ||
this.socket.send(response) | ||
} else { | ||
this.socket.send(response).then((response) => { | ||
resolve(response); | ||
}) | ||
} | ||
}) | ||
@@ -121,19 +130,2 @@ } else { | ||
getOrganizationId: function () { | ||
return new Promise(async (resolve) => { | ||
let organization_id = this.socket.config.organization_id || localStorage.getItem('organization_id') | ||
if (organization_id) | ||
resolve(organization_id) | ||
else { | ||
let test = setTimeout(() => { | ||
organization_id = this.socket.config.organization_id || localStorage.getItem('organization_id') | ||
if (organization_id) | ||
resolve(organization_id) | ||
}, 1000) | ||
} | ||
}); | ||
}, | ||
listen: function (method, callback) { | ||
@@ -144,3 +136,2 @@ // TODO: this.socket.listen('crud.' + method, callback); | ||
// TODO: could be handeled by sharedworker once support is more widespread https://caniuse.com/sharedworkers | ||
syncListeners: function () { | ||
@@ -162,130 +153,30 @@ const method = ['create', 'read', 'update', 'delete']; | ||
sync: async function (data) { | ||
const self = this | ||
if (indexeddb && data.uid && data.status == 'received') { | ||
if (data.method == 'read.array' || data.method == 'read.object') { | ||
// TODO: on page refresh clientId is updated may require a browserId to group all clientIds | ||
if (this.socket.clientId == data.clientId) | ||
self.syncDatabase(data) | ||
if (data.method.startsWith('read.') && this.socket.has(data.socketId)) { | ||
const self = this | ||
let type = data.method.split(".")[1] | ||
let deletedItems = await this.getDeletedItems() | ||
let isDeleted = '' // this.isDeleted(type, items[i], deletedItems) | ||
} else { | ||
if (this.socket.clientId != data.clientId) { | ||
indexeddb.send({ | ||
method: "read.object", | ||
database: 'crudSync', | ||
array: 'synced', | ||
object: { _id: data.uid } | ||
}).then((response) => { | ||
if (!response.object || !response.object[0]) { | ||
indexeddb.send({ | ||
method: "create.object", | ||
database: 'crudSync', | ||
array: 'synced', | ||
object: { _id: data.uid } | ||
}) | ||
indexeddb.send({ ...data }) | ||
} | ||
if (isDeleted) { | ||
console.log('sync failed item recently deleted') | ||
} else { | ||
let response = await indexeddb.send({ | ||
method: 'update.' + type, | ||
[type]: data[type], | ||
$filter: { | ||
query: [ | ||
// { key: 'modified.on', value: data.modified.on, operator: '$gt' }, | ||
{ key: 'modified.on', value: data.timeStamp, operator: '$lt' } | ||
] | ||
}, | ||
organization_id: data.organization_id | ||
}) | ||
} | ||
} | ||
} | ||
}, | ||
syncDatabase: async function (data) { | ||
const self = this | ||
let type = data.method.split(".")[1] | ||
let db | ||
let Data = { ...data } | ||
Data.type = type | ||
Data[type] = [] | ||
let deletedItems = await this.getDeletedItems() | ||
let items = data[type]; | ||
if (!Array.isArray(items) && items != undefined) | ||
items = [items] | ||
let itemsLength = items.length | ||
for (let i = 0; i < items.length; i++) { | ||
let isDeleted = this.isDeleted(type, items[i], deletedItems) | ||
if (isDeleted) { | ||
console.log('sync failed item recently deleted') | ||
} else { | ||
if (!db) { | ||
db = await indexeddb.send({ method: 'get.database', database: items[i].$database }) | ||
} else if (db.name != items[i].database) { | ||
db.close() | ||
db = await indexeddb.send({ method: 'get.database', database: items[i].$database }) | ||
if (response) | ||
self.socket.sendLocalMessage(response) | ||
} | ||
if (type == 'array') { | ||
itemsLength -= 1 | ||
let objectStoreNames = Array.from(db.objectStoreNames) | ||
if (!objectStoreNames.includes(items[i].name)) { | ||
Data.request.push(items[i].name) | ||
Data[type].push(items[i]) | ||
} | ||
if (!itemsLength) { | ||
db.close() | ||
if (Data.array.length) { | ||
indexeddb.send({ ...Data }) | ||
self.broadcastSynced('sync', Data) | ||
} | ||
} | ||
} | ||
if (type == 'object' && items[i].array && items[i]._id) { | ||
let transaction = db.transaction([items[i].$array], "readwrite"); | ||
let array = transaction.objectStore(items[i].$array); | ||
let request = array.get(items[i]._id); | ||
request.onsuccess = function () { | ||
itemsLength -= 1 | ||
let storedDoc = request.result | ||
let storedDocCompare, docCompare | ||
let Doc = { ...items[i] } | ||
delete items[i].$storage | ||
delete items[i].$database | ||
delete items[i].$array | ||
if (storedDoc) { | ||
storedDocCompare = storedDoc.modified || storedDoc.created | ||
docCompare = items[i].modified || items[i].created | ||
// TODO: on page load objects can be updated resulting in a false compare. needs to sync | ||
if (storedDocCompare && docCompare) { | ||
if (Doc.array == 'crdt-transactions') | ||
console.log('crdt-transactions', Doc) | ||
console.log('isSyncable', storedDocCompare.on, storedDocCompare.on < docCompare.on, docCompare.on) | ||
if (storedDocCompare.on < docCompare.on) { | ||
Data.object.push(Doc) | ||
array.put(items[i]) | ||
} else { | ||
} | ||
} | ||
} else { | ||
Data.object.push(Doc) | ||
array.put(items[i]) | ||
} | ||
if (!itemsLength) { | ||
db.close() | ||
self.broadcastSynced('sync', Data) | ||
} | ||
} | ||
request.onerror = function () { | ||
itemsLength -= 1 | ||
if (!itemsLength) { | ||
db.close() | ||
} | ||
console.log('sync failed', items[i]) | ||
} | ||
} | ||
} else if (this.socket.clientId != data.clientId) { | ||
indexeddb.send({ ...data }) | ||
} | ||
@@ -346,10 +237,2 @@ } | ||
broadcastSynced: function (action, data) { | ||
const listeners = this.socket.listeners.get(action); | ||
if (listeners) | ||
listeners.forEach(listener => { | ||
listener(data); | ||
}); | ||
}, | ||
syncServer: function () { | ||
@@ -356,0 +239,0 @@ const self = this; |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
188466
556