• Stars
    star
    1,186
  • Rank 39,441 (Top 0.8 %)
  • Language
    TypeScript
  • Created over 13 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Realtime model synchronization engine for Node.js

Racer

Racer is a realtime model synchronization engine for Node.js. By leveraging ShareDB, multiple users can interact with the same data in realtime via Operational Transformation, a sophisticated conflict resolution algorithm that works in realtime and with offline clients. ShareDB also supports PubSub across multiple servers for horizontal scaling. Clients can express data subscriptions and fetches in terms of queries and specific documents, so different clients can be subscribed to different overlapping sets of data. On top of this sophisticated backend, Racer provides a simple model and event interface for writing application logic.

Build Status Coverage Status

Disclaimer

Racer is alpha software. If you are interested in contributing, please reach out to Nate.

Demos

There are currently two demos, which are included in the racer-examples repo.

  • Pad – A very simple collaborative text editor.
  • Todos – Classic todo list demonstrating the use of Racer's model methods.

Features

  • Realtime updates – Model methods automatically propagate changes among browser clients and Node servers in realtime. The racer-browserchannel adapter is recommended for connecting browsers in realtime.

  • Realtime query subscriptions – Clients may subscribe to a limited set of information relevant to the current session. Both document and realtime query subscriptions are supported. Currently, arbitrary Mongo queries are supported.

  • Conflict resolution – Leveraging ShareDB's JSON Operational Transformation algorithm, Racer will emit events that bring conflicting client states into eventual consistency. In addition to their synchronous API, model methods have callbacks for handling the resolved state after a server response.

  • Immediate interaction – Model methods appear to take effect immediately. Meanwhile, Racer sends updates to the server and checks for conflicts. If the updates are successful, they are stored and broadcast to other clients.

  • Offline – Since model methods are applied immediately, clients continue to work offline. Any changes to the local client or the global state automatically sync upon reconnecting.

  • Unified server and client interface – The same model interface can be used on the server for initial page rendering and on the client for user interaction. Racer supports bundling models created on the server and reinitializing them in the same state in the browser.

  • Persistent storage – Racer uses ShareDB to keep a journal of all data operations, publish operations to multiple frontend servers, and automatically persist documents. It currently supports MongoDB, and it can be easily adapted to support other document stores.

  • Access control – (Under development) Racer will have hooks for access control to protect documents from malicious reads and writes.

  • Solr queries – (Under development) A Solr adapter will support updating Solr indices as data change and queries for realtime updated search results.

Future features

  • Browser local storage – Pending changes and offline model data will also sync to HTML5 localStorage for persistent offline usage.

  • Validation – An implementation of shared and non-shared schema-based validation is planned.

Installation

Racer requires Node v0.10. You will also need to have a MongoDB and a Redis server running on your machine. The examples will connect via the default configurations.

$ npm install racer

Tests

Run the tests with

$ npm test

Usage

Racer can be used independently as shown in the examples, but Racer and Derby are designed to work especially well together. Racer can also be used along with other MVC frameworks, such as Angular.

For now, Racer is mostly documented along with Derby. See the Derby model docs.

MIT License

Copyright (c) 2011 by Brian Noguchi and Nate Smith

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

More Repositories

1

derby

MVC framework making it easy to write realtime, collaborative applications that run in both Node.js and browsers
TypeScript
4,725
star
2

derby-examples

Example applications for the Derby framework
CoffeeScript
283
star
3

arraydiff

Diff two arrays, finding inserts, removes, and moves
JavaScript
38
star
4

d-bootstrap

A Derby component library based on Twitter Bootstrap
JavaScript
30
star
5

derby-site

DerbyJs Site
JavaScript
28
star
6

multiplayernotepad

JavaScript
20
star
7

racer-examples

Example apps for Racer
CSS
18
star
8

derby-standalone

Client-side only version of Derby
HTML
15
star
9

html-util

HTML utilities for simple parsing and escaping
JavaScript
14
star
10

tracks

Shared browser and server routes built on Express
JavaScript
11
star
11

derby-templates

Parse JavaScript-like expressions for use in templates
JavaScript
8
star
12

racer-browserchannel

JavaScript
7
star
13

component-examples

listing of community built derby examples
CoffeeScript
7
star
14

derby-debug

Derby app plugin to add debugging utility functions
JavaScript
6
star
15

d-quill

Derby rich text editor component based on Quill
JavaScript
6
star
16

derby-parsing

HTML-based templating for Derby
JavaScript
5
star
17

derby-starter

A generic server for use with Derby apps
JavaScript
4
star
18

d-codemirror

derby component for live-bound CodeMirror
JavaScript
4
star
19

saddle

JavaScript
4
star
20

derby-stylus

Derby plugin to add stylus support
JavaScript
4
star
21

racer-websocket

Racer plugin for websockets
JavaScript
3
star
22

d-before-unload

Derby component to stop page from unloading when it has pending operations
JavaScript
2
star
23

racer-bundle

Create Browserify package for a Racer or Derby app
JavaScript
2
star
24

d-connection-alert

Connection alert Derby component
JavaScript
2
star
25

d-d3-barchart

a barchart component for Derby demonstrating a common pattern with d3.js
JavaScript
1
star
26

racer-logger

readable logging for derby applications
JavaScript
1
star
27

d-barchart-vanilla

a barchart component for Derby built without d3.js to illustrate a pattern
JavaScript
1
star
28

derby-less

Derby plugin to add Less support
JavaScript
1
star
29

derby-intl

Derby plugin for internationalization
JavaScript
1
star
30

derby-assets

Logos, colors, and other marketing assets for the Derby project
1
star
31

d-showdown

Derby component wrapping showdown (markdown renderer)
JavaScript
1
star