Beispiel #1
0
    def apply_op(self, op, is_remote):
        oldSnapshot = self.snapshot
        self.snapshot = optransform.apply(self.snapshot, op)

        self.emit('change', op, oldSnapshot)
        if is_remote:
            self.emit('remoteop', op, oldSnapshot)
Beispiel #2
0
    def apply_op(self, op, is_remote):
        oldSnapshot = self.snapshot
        self.snapshot = optransform.apply(self.snapshot, op)

        self.emit('change', op, oldSnapshot)
        if is_remote:
            self.emit('remoteop', op, oldSnapshot)
Beispiel #3
0
        def _otApply(docOp, isRemote):
            oldSnapshot = self.snapshot
            self.snapshot = optransform.apply(self.snapshot, docOp)

            self.emit('change', docOp, oldSnapshot)
            if isRemote:
                self.emit('remoteop', docOp, oldSnapshot)
Beispiel #4
0
    def submit_op(self, op, callback):
        op = optransform.normalize(op)
        self.snapshot = optransform.apply(self.snapshot, op)

        if self.pending_op is not None:
            self.pending_op = optransform.compose(self.pending_op, op)
        else:
            self.pending_op = op

        if callback:
            self.pending_callbacks.append(callback)

        self.emit('change', op)

        self.flush()
Beispiel #5
0
    def submit_op(self, op, callback):
        op = optransform.normalize(op)
        self.snapshot = optransform.apply(self.snapshot, op)

        if self.pending_op is not None:
            self.pending_op = optransform.compose(self.pending_op, op)
        else:
            self.pending_op = op

        if callback:
            self.pending_callbacks.append(callback)

        self.emit('change', op)

        self.flush()
Beispiel #6
0
    def handle_op(self, doc, op, callback):
        if 'v' not in op or op['v'] < 0:
            return callback('Version missing', None)
        if op['v'] > doc['v']:
            return callback('Op at future version', None)
        if op['v'] < doc['v'] - self.options['maximumAge']:
            return callback('Op too old', None)
        if op['v'] < 0:
            return callback('Invalid version', None)

        ops = doc['ops'][(len(doc['ops']) + op['v'] - doc['v']):]

        if doc['v'] - op['v'] != len(ops):
            logging.error(
                "Could not get old ops in model for document {1}. Expected ops {1} to {2} and got {3} ops"
                .format(doc['name'], op['v'], doc['v'], len(ops)))
            return callback('Internal error', None)

        for oldOp in ops:
            op['op'] = optransform.transform(op['op'], oldOp['op'], 'left')
            op['v'] += 1

        newSnapshot = optransform.apply(doc['snapshot'], op['op'])

        if op['v'] != doc['v']:
            logging.error(
                "Version mismatch detected in model. File a ticket - this is a bug. Expecting {0} == {1}"
                .format(op['v'], doc['v']))
            return callback('Internal error', None)

        oldSnapshot = doc['snapshot']
        doc['v'] = op['v'] + 1
        doc['snapshot'] = newSnapshot
        for listener in doc['listeners']:
            listener(op, newSnapshot, oldSnapshot)

        def save_op_callback(error=None):
            if error:
                logging.error("Error saving op: {0}".format(error))
                return callback(error, None)
            else:
                return callback(None, op['v'])

        self.save_op(doc['name'], op, save_op_callback)
Beispiel #7
0
    def handle_op(self, doc, op, callback):
        if 'v' not in op or op['v'] < 0:
            return callback('Version missing', None)
        if op['v'] > doc['v']:
            return callback('Op at future version', None)
        if op['v'] < doc['v'] - self.options['maximumAge']:
            return callback('Op too old', None)
        if op['v'] < 0:
            return callback('Invalid version', None)

        ops = doc['ops'][(len(doc['ops'])+op['v']-doc['v']):]

        if doc['v'] - op['v'] != len(ops):
            logging.error("Could not get old ops in model for document {1}. Expected ops {1} to {2} and got {3} ops".format(doc['name'], op['v'], doc['v'], len(ops)))
            return callback('Internal error', None)

        for oldOp in ops:
            op['op'] = optransform.transform(op['op'], oldOp['op'], 'left')
            op['v']+=1

        newSnapshot = optransform.apply(doc['snapshot'], op['op'])

        if op['v'] != doc['v']:
            logging.error("Version mismatch detected in model. File a ticket - this is a bug. Expecting {0} == {1}".format(op['v'], doc['v']))
            return callback('Internal error', None)

        oldSnapshot = doc['snapshot']
        doc['v'] = op['v'] + 1
        doc['snapshot'] = newSnapshot
        for listener in doc['listeners']:
            listener(op, newSnapshot, oldSnapshot)

        def save_op_callback(error=None):
            if error:
                logging.error("Error saving op: {0}".format(error))
                return callback(error, None)
            else:
                return callback(None, op['v'])
        self.save_op(doc['name'], op, save_op_callback)