public void command_sender_should_send_envelope() { // arrange var builder = new EnvelopeBuilder("env"); builder.AddItem(new CreateAccount(Identifier)); builder.AddItem(new CreateAccount(Identifier)); builder.AddItem(new CreateAccount(Identifier)); // act Sender.SendEnvelope(builder.Build()); // assert }
public static ImmutableEnvelope BuildEnvelope(this IMessage message) { var eb = new EnvelopeBuilder(Guid.NewGuid().ToString()); eb.AddItem((object) message); return eb.Build(); }
void AppendToStream(IIdentity id, string envelopeId, Applied then, string explanation) { var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id)); var b = new EnvelopeBuilder("unknown"); b.AddString("caused-by", envelopeId); if (!String.IsNullOrEmpty(explanation)) { b.AddString("explain", explanation); } foreach (var e in then.Events) { b.AddItem((object)e); } var data = _streamer.SaveEnvelopeData(b.Build()); Context.Debug("?? Append {0} at v{3} to '{1}' in thread {2}", then.Events.Count, IdentityConvert.ToStream(id), Thread.CurrentThread.ManagedThreadId, then.Version); if (!stream.TryAppend(data, TapeAppendCondition.VersionIs(then.Version))) { throw new InvalidOperationException("Failed to update the stream - it has been changed concurrently"); } }
public void AppendToStream(IIdentity id, long originalVersion, ICollection<IEvent<IIdentity>> events, string explanation) { if (events.Count == 0) return; var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id)); var b = new EnvelopeBuilder("unknown"); if (!String.IsNullOrEmpty(explanation)) { b.AddString("explain", explanation); } foreach (var e in events) { b.AddItem((object)e); } var data = _streamer.SaveEnvelopeData(b.Build()); var result = stream.TryAppend(data, TapeAppendCondition.VersionIs(originalVersion)); if (result == 0) { throw new InvalidOperationException("Failed to update the stream - it has been changed concurrently"); } PublishDomainSuccess(id, events, originalVersion); }
void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems) { if (messageItems.Length == 0) return; var id = _idGenerator(); var builder = new EnvelopeBuilder(id); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var queue = GetOutboundQueue(); if (Transaction.Current == null) { queue.PutMessage(envelope); _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, false, envelope.Items.Select(x => x.MappedType.Name).ToArray())); } else { var action = new CommitActionEnlistment(() => { queue.PutMessage(envelope); _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, true, envelope.Items.Select(x => x.MappedType.Name).ToArray())); }); Transaction.Current.EnlistVolatile(action, EnlistmentOptions.None); } }
public void Test() { var b = new EnvelopeBuilder("GUID"); b.DelayBy(TimeSpan.FromSeconds(10)); b.AddString("Test"); b.AddItem(new { Cool = "1"}).AddAttribute("D2","D1"); Console.WriteLine(b.Build().PrintToString(o => o.Dump())); }
public void Payload_should_be_serialized() { var builder = new EnvelopeBuilder("my-id"); builder.AddItem(new MyMessage("42")); var envelope = RoundtripViaSerializer(builder); Assert.AreEqual(1, envelope.Items.Length); Assert.AreEqual("42", ((MyMessage)envelope.Items[0].Content).Value); }
public static byte[] SaveEnvelopeData(this IEnvelopeStreamer streamer, object message, Action<EnvelopeBuilder> build = null) { var builder = new EnvelopeBuilder(Guid.NewGuid().ToString()); builder.AddItem(message); if (null != build) { build(builder); } return streamer.SaveEnvelopeData(builder.Build()); }
public static byte[] SaveEnvelopeData(this IEnvelopeStreamer streamer, object message, Action <EnvelopeBuilder> build = null) { var builder = new EnvelopeBuilder(Guid.NewGuid().ToString()); builder.AddItem(message); if (null != build) { build(builder); } return(streamer.SaveEnvelopeData(builder.Build())); }
public void DispatchCommand(object command, Action<EnvelopeBuilder> builder = null) { var envelopeBuilder = new EnvelopeBuilder(Guid.NewGuid().ToString()); envelopeBuilder.AddItem(command); if (builder != null) builder(envelopeBuilder); var envelope = envelopeBuilder.Build(); var data = _serializer.SaveEnvelopeData(envelope); if (!_tapeStream.TryAppend(data)) throw new InvalidOperationException("Failed to record domain log"); _aggregateFactory.Dispatch(envelope); }
void PublishEvents(IIdentity id, Applied then) { var arVersion = then.Version + 1; var arName = IdentityConvert.ToTransportable(id); var name = String.Format("{0}-{1}", arName, arVersion); var builder = new EnvelopeBuilder(name); builder.AddString("entity", arName); foreach (var @event in then.Events) { builder.AddItem((object)@event); } _writer.PutMessage(_streamer.SaveEnvelopeData(builder.Build())); }
private void SendMessage(object command, string optionalID = null) { var auth = FormsAuth.GetSessionIdentityFromRequest(); var envelopeId = optionalID ?? Guid.NewGuid().ToString().ToLowerInvariant(); var eb = new EnvelopeBuilder(envelopeId); if (auth.HasValue) { eb.AddString("web-user", auth.Value.User.Identifier.ToString(CultureInfo.InvariantCulture)); eb.AddString("web-token", auth.Value.Token); } eb.AddItem(command); m_queueWriter.PutMessage(eb.Build()); }
void SendMessage(object command, string optionalId) { var auth = FormsAuth.GetSessionIdentityFromRequest(); var envelopeId = optionalId ?? Guid.NewGuid().ToString().ToLowerInvariant(); var eb = new EnvelopeBuilder(envelopeId); if (auth.HasValue) { eb.AddString("web-user", auth.Value.User.Id.ToString(CultureInfo.InvariantCulture)); eb.AddString("web-token", auth.Value.Token); } eb.AddItem(command); _writer.PutMessage(_streamer.SaveEnvelopeData(eb.Build())); }
public void DispatchCommand(object command, Action <EnvelopeBuilder> builder = null) { var envelopeBuilder = new EnvelopeBuilder(Guid.NewGuid().ToString()); envelopeBuilder.AddItem(command); if (builder != null) { builder(envelopeBuilder); } var envelope = envelopeBuilder.Build(); var data = _serializer.SaveEnvelopeData(envelope); if (!_tapeStream.TryAppend(data)) { throw new InvalidOperationException("Failed to record domain log"); } _aggregateFactory.Dispatch(envelope); }
string HashContents(Action <EnvelopeBuilder> configure, object[] messageItems) { var builder = new EnvelopeBuilder("hash"); builder.OverrideCreatedOnUtc(DateTime.MinValue); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var data = _streamer.SaveEnvelopeData(envelope); using (var sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(data); return(BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant()); } }
public override void Handle(IHttpContext context) { var contract = context.GetRequestUrl().Remove(0, "/mouseevents/".Length); var envelopeBuilder = new EnvelopeBuilder(contract + " - " + DateTime.Now.Ticks.ToString()); Type contractType; if (!_serializer.TryGetContractTypeByName(contract, out contractType)) { context.WriteString(string.Format("Trying to post command with unknown contract '{0}'.", contract)); context.SetStatusTo(HttpStatusCode.BadRequest); return; } var decodedData = HttpUtility.UrlDecode(context.Request.QueryString.ToString()); var mouseEvent = JsonSerializer.DeserializeFromString(decodedData, contractType); envelopeBuilder.AddItem(mouseEvent); _writer.PutMessage(_streamer.SaveEnvelopeData(envelopeBuilder.Build())); context.SetStatusTo(HttpStatusCode.OK); }
public void AppendToStream(IIdentity id, long originalVersion, ICollection<IEvent> events) { if (events.Count == 0) return; var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id)); var b = new EnvelopeBuilder("unknown"); foreach (var e in events) { b.AddItem((object)e); } var data = _streamer.SaveEnvelopeData(b.Build()); var result = stream.TryAppend(data, TapeAppendCondition.VersionIs(originalVersion)); if (result == 0) { // this is temporary implementation throw OptimisticConcurrencyException.Create(-1, originalVersion, id, null); } PublishDomainSuccess(id, events, originalVersion); }
void InnerSendBatch(Action <EnvelopeBuilder> configure, object[] messageItems) { if (messageItems.Length == 0) { return; } var id = _idGenerator(); var builder = new EnvelopeBuilder(id); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var queue = GetOutboundQueue(); if (Transaction.Current == null) { queue.PutMessage(envelope); _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, false, envelope.Items.Select(x => x.MappedType.Name).ToArray())); } else { var action = new CommitActionEnlistment(() => { queue.PutMessage(envelope); _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, true, envelope.Items.Select(x => x.MappedType.Name).ToArray())); }); Transaction.Current.EnlistVolatile(action, EnlistmentOptions.None); } }
void InnerSendBatch(Action <EnvelopeBuilder> configure, object[] messageItems, IdGeneration id = IdGeneration.Default) { string envelopeId; switch (id) { case IdGeneration.Default: envelopeId = _idGenerator(); break; case IdGeneration.HashContent: envelopeId = HashContents(configure, messageItems); break; default: throw new ArgumentOutOfRangeException("id"); } var builder = new EnvelopeBuilder(envelopeId); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var data = _streamer.SaveEnvelopeData(envelope); var queue = GetOutboundQueue(); queue.PutMessage(data); SystemObserver.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, envelope.Items.Select(x => x.MappedType.Name).ToArray(), envelope.GetAllAttributes())); }
public void Multiple_payloads_are_handled_in_sequence() { var builder = new EnvelopeBuilder("my-id"); for (int i = 0; i < 5; i++) { var content = new string('*', i); var added = builder.AddItem(new MyMessage(content)); added.AddAttribute("hum", i.ToString()); } var envelope = RoundtripViaSerializer(builder); Assert.AreEqual(5, envelope.Items.Length); for (int i = 0; i < 5; i++) { var messageItem = envelope.Items[i]; Assert.AreEqual(new string('*', i), ((MyMessage)messageItem.Content).Value); Assert.AreEqual(i.ToString(), messageItem.GetAttribute("hum", "")); } }
public void Multiple_payloads_are_handled_in_sequence() { var builder = new EnvelopeBuilder("my-id"); for (int i = 0; i < 5; i++) { var content = new string('*',i); var added = builder.AddItem(new MyMessage(content)); added.AddAttribute("hum", i.ToString()); } var envelope = RoundtripViaSerializer(builder); Assert.AreEqual(5, envelope.Items.Length); for (int i = 0; i < 5; i++) { var messageItem = envelope.Items[i]; Assert.AreEqual(new string('*', i), ((MyMessage)messageItem.Content).Value); Assert.AreEqual(i.ToString(), messageItem.GetAttribute("hum", "")); } }
void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems) { var id = _idGenerator(); var builder = new EnvelopeBuilder(id); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); SendEnvelope(envelope); }
string HashContents(Action<EnvelopeBuilder> configure, object[] messageItems) { var builder = new EnvelopeBuilder("hash"); builder.OverrideCreatedOnUtc(DateTime.MinValue); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var data = _streamer.SaveEnvelopeData(envelope); using (var sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(data); return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); } }
void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems, IdGeneration id = IdGeneration.Default) { string envelopeId; switch (id) { case IdGeneration.Default: envelopeId = _idGenerator(); break; case IdGeneration.HashContent: envelopeId = HashContents(configure, messageItems); break; default: throw new ArgumentOutOfRangeException("id"); } var builder = new EnvelopeBuilder(envelopeId); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var data = _streamer.SaveEnvelopeData(envelope); var queue = GetOutboundQueue(); queue.PutMessage(data); SystemObserver.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, envelope.Items.Select(x => x.MappedType.Name).ToArray(), envelope.GetAllAttributes())); }
void PublishDomainSuccess(IIdentity id, IEnumerable<IEvent> events, long version) { var arVersion = version + 1; var arName = IdentityConvert.ToTransportable(id); var name = String.Format("{0}-{1}", arName, arVersion); var builder = new EnvelopeBuilder(name); builder.AddString("entity", arName); foreach (var @event in events) { builder.AddItem((object)@event); } _writer.PutMessage(_streamer.SaveEnvelopeData(builder.Build())); }