nponiros / sync_client

Module using IndexedDB to save data and can later use a server to synchronize the data in the database with other devices
MIT License
36 stars 13 forks source link

SyncClient

Code Climate

Synopsis

This module can be used to write data to IndexedDB using Dexie and to synchronize the data in IndexedDB with a server. Dexie.Syncable is used for the synchronization. This module contains an implementation of the ISyncProtocol. It was primarily written to work with sync-server but should work with other servers which offer the same API.

Installation

npm install --save sync-client

Basic Usage

import SyncClient from 'sync-client';
// SyncClient is a subclass of Dexie

const databaseName = 'testDB'; // The name for the indexedDB database
const versions = [{
  version: 1,
  stores: { // Has the same format as https://github.com/dfahlander/Dexie.js/wiki/Version.stores()
    test: 'id',
  },
}];

const syncClient = new SyncClient(databaseName, versions);

API

constructor(dbName, versions, options)

Parameters:

Return:

A SyncClient instance. Via this instance you can access all methods of a Dexie instance. More information can be found in the Dexie API Reference

Example:

import SyncClient from 'sync-client';

const dbVersions = [
    {
      version: 1,
      stores: {
        todos: 'id'
      }
    },
    {
      version: 2,
      stores: {
        todos: 'id, tags'
      },
      upgrader(transaction) { ... }
    }
]

const syncClient = new SyncClient('MyTodosDB', dbVersions);

Static Methods

getID()

Description:

Creates and returns a unique ID using cuid. This method does not add anything to the database. Alternatively you can use the prototype getID() method.

Parameters:

None.

Returns:

A string representing the ID.

Prototype Methods

getID()

Description:

Creates and returns a unique ID using cuid. This method does not add anything to the database. Alternatively you can use the static getID() method.

Parameters:

None.

Returns:

A string representing the ID.

connect(url, options)

Description:

This method tries to connect to a server and start the synchronization process. Before trying to connect, it checks if window.navigator.onLine is true and if yes it sends a ping to ${url}/check to make sure that the server is online. If The checks pass it calls the connect method of [Dexie.Syncable](https://github.com/dfahlander/Dexie.js/wiki/db.syncable.connect()). Subsequent calls to connect just resolve unless we manually disconnected before by calling disconnect(url) or if the client auto-disconnected us because of an error during synchronization or because we are offline (navigator.onLine changed to false).

Parameters:

Returns:

A Promise which resolves if we managed to connect to the server and rejects if we failed to connect.

disconnect(url)

Description:

This method tries to disconnect from a server and stop the synchronization process. Calls the disconnect method of [Dexie.Syncable](https://github.com/dfahlander/Dexie.js/wiki/db.syncable.disconnect()).

Parameters:

Returns:

A Promise which resolves if we managed to disconnect and rejects if we failed to disconnect.

removeUrl(url)

Description:

It disconnects from the server with the given URL and removes all relevant synchronization data from the database. It does not remove data in your tables. Calls the delete method of [Dexie.Syncable](https://github.com/dfahlander/Dexie.js/wiki/db.syncable.delete())

Parameters:

Returns:

A Promise which resolves if we managed to delete the data and rejects if we failed.

statusChange(url, cb)

Description:

This method can be used to register a listener which is called every time the connection status of the given URL is changed.

Parameters:

Returns:

Nothing.

getStatuses()

Description:

This method can be used to get a list of all URLs the their current status.

Parameters:

None.

Returns:

A Promise which resolves with an array of {url: string, status: SyncClient.statuses} object. The promise is rejected if we failed to get the statuses.

getStatus(url)

Description:

This method can be used to get the text status for one URL.

Parameters:

Returns:

A Promise which resolves with a status of type SyncClient.statuses. The promise is rejected if we fail to get the status.

Static Properties

statuses

Description:

An object containing keys pointing to statuses of Dexie.Syncable. Instead of returning the number for a status it returns the string as key. For example SyncClient.statuses.ERROR will return 'ERROR'.

Running the tests

The following commands can be execute to run the tests.

npm install
npm test

The last command will run eslint and the unit tests for the module.

TODO

Contributing

If you feel you can help in any way, be it with documentation, examples, extra testing, or new features please open an issue or pull request. If you have any questions feel free to open an issue with your question.

License

MIT License

cuid.js has license MIT Copyright (c) Eric Elliott 2012. The file was modified to use ES2015 syntax.