52 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var config = require('../../config');
 | |
| 
 | |
| if (typeof ot === 'undefined') {
 | |
|   var ot = {};
 | |
| }
 | |
| 
 | |
| ot.Server = (function (global) {
 | |
|   'use strict';
 | |
| 
 | |
|   // Constructor. Takes the current document as a string and optionally the array
 | |
|   // of all operations.
 | |
|   function Server (document, operations) {
 | |
|     this.document = document;
 | |
|     this.operations = operations || [];
 | |
|   }
 | |
| 
 | |
|   // Call this method whenever you receive an operation from a client.
 | |
|   Server.prototype.receiveOperation = function (revision, operation) {
 | |
|     if (revision < 0 || this.operations.length < revision) {
 | |
|       throw new Error("operation revision not in history");
 | |
|     }
 | |
|     // Find all operations that the client didn't know of when it sent the
 | |
|     // operation ...
 | |
|     var concurrentOperations = this.operations.slice(revision);
 | |
| 
 | |
|     // ... and transform the operation against all these operations ...
 | |
|     var transform = operation.constructor.transform;
 | |
|     for (var i = 0; i < concurrentOperations.length; i++) {
 | |
|       operation = transform(operation, concurrentOperations[i])[0];
 | |
|     }
 | |
| 
 | |
|     // ... and apply that on the document.
 | |
|     var newDocument = operation.apply(this.document);
 | |
|     // ignore if exceed the max length of document
 | |
|     if(newDocument.length > config.documentmaxlength && newDocument.length > this.document.length)
 | |
|         return;
 | |
|     this.document = newDocument;
 | |
|     // Store operation in history.
 | |
|     this.operations.push(operation);
 | |
| 
 | |
|     // It's the caller's responsibility to send the operation to all connected
 | |
|     // clients and an acknowledgement to the creator.
 | |
|     return operation;
 | |
|   };
 | |
| 
 | |
|   return Server;
 | |
| 
 | |
| }(this));
 | |
| 
 | |
| if (typeof module === 'object') {
 | |
|   module.exports = ot.Server;
 | |
| } |