Skip to content

TeamworkGuy2/lokijs-collections-syncing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lokijs-collections-syncing

Sync lokijs-collections to or from a remote data source. To use this library your lokijs-collections models need to have 3 properties:

  • deleted property (truthy/falsey
  • modified property (truthy/falsey)
  • last modified property (timestamp - unix style milliseconds since epoch). See the lokijs-collections README for more info on creating and using collections.

Usage

This project is designed to be imported using commonJs require(...) calls. To use this in a web app, it's currently setup to be required and then included in a bundle at build time.

Setup

sync/SyncSettingsBuilder is used to create settings objects containing information and functions needed to sync a data collection.

sync/SyncDataCollection is used to upload a local in-memory data collection to a remote destination ('sync up') or download and integrate data from a remote data collection ('sync down').

Create a sync instance for a data collection:

var SyncSettingsBuilder = require("lokijs-collections-syncing/sync/SyncSettingsBuilder");

var collection = /* a lokijs-collections collection instance */

var collSync = SyncSettingsBuilder.fromDataCollectionAndSyncFuncs(
		collection,
		function syncDown(params) { /* returns a promise */ },
		function syncUp(params, data) { /* returns a promise */ }
	)
	.addFilterFuncs(function findItem(item) { /* return a lokijs (mongoDB) style query object */ })
	.build();

Example 1: Configure and run a sync:

var SyncDataCollection = require("lokijs-collections-syncing/sync/SyncDataCollection");

// set of configuration flags for sync down actions, can be reused
var syncDownOp = SyncDataCollection.createSyncDownOp(
	false/* remove all existing data from collection */,
	true/* removed deleted entries */,
	true/* merge new entities with existing ones using the '.addFilterFuncs()' func to match entities */
);

// Create a sync instance which can be used to sync any collection sync instance up or down
var syncer = new SyncDataCollection(
	(coll) => /* e.g. tableSyncHistory.get(coll.getName()) */,
	(coll) => /* e.g. tableSyncHistory.save(coll.getName()) */,
	"Deleted", /* property name in your data models that indicates whether an entity is deleted */
	"Modified", /* property name in your data models that indicates whether an entity has been modified since the last sync */
	"LastModified" /* property name in your data models that stores a last modified timestamps*/
);

var collUpdater = SyncDataCollection.createAddUpdateOrRemoveItemsFunc(collSync, "Deleted", syncDownOp);

syncer.syncUpCollection({ /* sync down parameters */ }, collSync);

syncer.syncDownCollection({ /* sync down parameters */ }, collSync.localCollection, collSync.syncDownFunc, collUpdater).then(function () {
	/* done! */
}, function (err) {
	/* sync error */
});

Example 2: (low-level)

Call sync functions manually, handle the results yourself:

collSync.syncUpFunc({ /* sync up parameters */ }, /* data array such as collection.data() */).then(function (results) {
	/* ... */
}, function (err) {
	/* ... */
});

collSync.syncDownFunc({ /* sync down parameters */ }).then(function (results) {
	/* ... */
}, function (err) {
	/* ... */
});