private async Task <bool> SubmitAsync(OpMessageType msgType, IEnumerable <T> ops) { // compose all of the ops into one op JToken composedOp = null; foreach (T op in ops) { JToken serializedOp = Type.Serialize(op); composedOp = composedOp != null?Type.Compose(composedOp, serializedOp) : serializedOp; } // make sure that the last submit has completed if (_inflightOp != null) { await _inflightOp.Task; } // send op to server _inflightOp = new TaskCompletionSource <bool>(); int seq = _conn.NextSeq(); _inflightOpInfo = new OpInfo(msgType, seq, composedOp); await _conn.SendOpAsync(this, msgType, seq, composedOp); return(await _inflightOp.Task); }
internal Task SendOpAsync(IDocumentInternal doc, OpMessageType msgType, int seq, JToken op) { var msg = new JObject( new JProperty("a", "op"), new JProperty("c", doc.Collection), new JProperty("d", doc.Id), new JProperty("v", doc.Version < 0 ? null : (int?)doc.Version), new JProperty("src", _id), new JProperty("seq", seq)); switch (msgType) { case OpMessageType.Op: msg["op"] = op.DeepClone(); break; case OpMessageType.Create: msg["create"] = new JObject( new JProperty("type", doc.Type.Uri.ToString()), new JProperty("data", op.DeepClone())); break; case OpMessageType.Delete: msg["del"] = true; break; } return(_socket.SendTextAsync(msg.ToString())); }
public OpInfo(OpMessageType msgType, int seq, JToken op) { MessageType = msgType; Seq = seq; Op = op; }
private Task <bool> SubmitAsync(OpMessageType msgType, T op) { return(SubmitAsync(msgType, new[] { op })); }