Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/rclarey/simple-ot
Browse files Browse the repository at this point in the history
  • Loading branch information
rclarey committed Mar 16, 2019
2 parents ff4a2db + e047bd5 commit cbca6e9
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 1 deletion.
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ language: node_js
install:
- nvm install 10.15.3
- yarn install
- yarn global add codecov

script:
- yarn test
- codecov
- yarn build
67 changes: 66 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,71 @@
# simple-ot
[![Build Status](https://travis-ci.com/rclarey/simple-ot.svg?branch=master)](https://travis-ci.com/rclarey/simple-ot)
[![codecov](https://codecov.io/gh/rclarey/simple-ot/branch/master/graph/badge.svg)](https://codecov.io/gh/rclarey/simple-ot)

A simple operational transform library that uses the GOTO control algorithm.
A simple operational transform library that uses the domain-agnostic GOTO control algorithm.

The implementation of the GOTO algorithm was written based on [this paper](https://dl.acm.org/citation.cfm?id=289469).

This repository also contains an implementation of inclusion and exclusion transformation functions, for character-wise operations on plaintext documents, that can be used with the GOTO algorithm.

## Install
```bash
yarn add simple-ot
```
or
```bash
npm install simple-ot --save
```

## Example
```typescript
import { charwise, OT } from './mod';
const {
Delete,
Insert,
OperationType,
deserialize,
exclusionTransform,
inclusionTransform,
serialize,
} = charwise;
const id = /* some function that generates IDs that are unique across all sites (ex. uuid) */;

const siteID = 1;
// create the singleton OT object for this site
const ot = new OT(inclusionTransform, exclusionTransform, siteID);

const localInsert = new Insert('a', 0, id(), siteID, ot.history());

// local operations can just be pushed to ot.historyBuffer
ot.historyBuffer.push(localInsert);

// ... and then sent to other sites
const serializedLocal = serialize(localInsert);
sendToOtherSites(serializedLocal);


// ... some time later we receive an operation from another site

const remoteSerialized = {
historyBuffer: [] as number[],
id: 1,
position: 1,
siteID: 0,
type: OperationType.DELETE,
};
const remoteDelete = deserialize(remoteSerialized);

// operations received from other sites need to be transformed before they
// can be applied at this site
const transformed = ot.goto(remoteDelete);

// now its safe to apply the operation and push it to ot.historyBuffer
applyOperation(transformed);
ot.historyBuffer.push(transformed);
```

## API
For the high-level, domain-agnostic control alogrithm see [control.ts](/src/control.ts).

For the implementation of character-wise inclusion and exclusion transformation functions see [charwise.ts](/src/charwise.ts).

0 comments on commit cbca6e9

Please sign in to comment.