_fixComponentPaths: function(c) { if (!this._listeners) { return; } if (c.na !== undefined || c.si !== undefined || c.sd !== undefined) { return; } var to_remove = []; var _ref = this._listeners; for (var i = 0; i < _ref.length; i++) { var l = _ref[i]; var dummy = { p: l.path, na: 0 }; var xformed = type.transformComponent([], dummy, c, 'left'); if (xformed.length === 0) { to_remove.push(i); } else if (xformed.length === 1) { l.path = xformed[0].p; } else { throw new Error("Bad assumption in json-api: xforming an 'na' op will always result in 0 or 1 components."); } } to_remove.sort(function(a, b) { return b - a; }); var _results = []; for (var j = 0; j < to_remove.length; j++) { i = to_remove[j]; _results.push(this._listeners.splice(i, 1)); } return _results; },
_onOp: function(op) { for (var i = 0; i < op.length; i++) { var c = op[i]; this._fixComponentPaths(c); if(c.lm !== undefined) { this._updateSubdocPaths([c]); } var match_path = c.na === undefined ? c.p.slice(0, c.p.length - 1) : c.p; for (var l = 0; l < this._listeners.length; l++) { var listener = this._listeners[l]; var cb = listener.cb; if (pathEquals(listener.path, match_path)) { switch (listener.event) { case 'insert': if (c.li !== undefined && c.ld === undefined) { cb(c.p[c.p.length - 1], c.li); } else if (c.oi !== undefined && c.od === undefined) { cb(c.p[c.p.length - 1], c.oi); } else if (c.si !== undefined) { cb(c.p[c.p.length - 1], c.si); } break; case 'delete': if (c.li === undefined && c.ld !== undefined) { cb(c.p[c.p.length - 1], c.ld); } else if (c.oi === undefined && c.od !== undefined) { cb(c.p[c.p.length - 1], c.od); } else if (c.sd !== undefined) { cb(c.p[c.p.length - 1], c.sd); } break; case 'replace': if (c.li !== undefined && c.ld !== undefined) { cb(c.p[c.p.length - 1], c.ld, c.li); } else if (c.oi !== undefined && c.od !== undefined) { cb(c.p[c.p.length - 1], c.od, c.oi); } break; case 'move': if (c.lm !== undefined) { cb(c.p[c.p.length - 1], c.lm); } break; case 'add': if (c.na !== undefined) { cb(c.na); } } } if (type.canOpAffectPath(c, listener.path) && listener.event === 'child op') { var child_path = c.p.slice(listener.path.length); cb(child_path, c); } } } }