public static byte[] Pack(OutboundMessage message) { var json = Serialize(message); using (var compressedStream = new ZlibStream(new MemoryStream(json, false), CompressionMode.Compress, CompressionLevel.Default, false)) using (var outputStream = new MemoryStream()) { compressedStream.CopyTo(outputStream); return(outputStream.ToArray()); } }
public static byte[] Pack(OutboundMessage message) { message.Sent = DateTime.UtcNow; var json = Serialize(message); using (var compressedStream = new ZlibStream(new MemoryStream(json, false), CompressionMode.Compress, (CompressionLevel)Level, false)) using (var outputStream = new MemoryStream()) { compressedStream.CopyTo(outputStream); return(outputStream.ToArray()); } }
private static async void Emit(OutboundMessage message) { if (message.Event != CoreEvents.LogMirror) { Logger.Trace(message.Payloads.Count > 0 ? $"Emit: \"{message.Event}\" with {message.Payloads.Count} payload{(message.Payloads.Count > 1 ? "s" : string.Empty)}:{Environment.NewLine}\t{string.Join($"{Environment.NewLine}\t", message.Payloads)}" : $"Emit: \"{message.Event}\" with no payloads"); } // Marshall back to the main thread in order to use a native call. await BaseScript.Delay(0); BaseScript.TriggerServerEvent(message.Event, message.Pack()); }
public void Fire(OutboundMessage message) { if (!message.Event.StartsWith("nfive:log:")) { if (message.Payloads.Count > 0) { this.logger.Trace($"Fire: \"{message.Event}\" with {message.Payloads.Count} payload{(message.Payloads.Count > 1 ? "s" : string.Empty)}:{Environment.NewLine}\t{string.Join($"{Environment.NewLine}\t", message.Payloads)}"); } else { this.logger.Trace($"Fire: \"{message.Event}\" with no payloads"); } } BaseScript.TriggerServerEvent(message.Event, message.Pack()); }
public void Fire(OutboundMessage message) { var serializedMessage = this.serializer.Serialize(message); var serializedMessageSize = serializedMessage.Length * 16; //this.logger.Debug($"Fire: \"{message.Event}\" with {message.Payloads.Count} payload(s) ({serializedMessage.Length * 16} bits): {string.Join(", ", message.Payloads)}"); bandwidth += serializedMessageSize; this.logger.Debug($"Fire: \"{message.Event}\" with {message.Payloads.Count} payload(s) of total size '{serializedMessageSize}' bits"); BaseScript.TriggerServerEvent(message.Event, serializedMessage); if (Game.GameTime <= bandwidthTime + 1000) { return; } bandwidthTime = Game.GameTime; this.logger.Debug($"RPC bits per second: {bandwidth}"); bandwidth = 0; }
private static async Task <InboundMessage> InternalRequest(string @event, params object[] payloads) { var tcs = new TaskCompletionSource <InboundMessage>(); var callback = new Action <byte[]>(data => { var message = InboundMessage.From(data); Logger.Trace(message.Payloads.Count > 0 ? $"Request Received: \"{message.Event}\" with {message.Payloads.Count} payload{(message.Payloads.Count > 1 ? "s" : string.Empty)}:{Environment.NewLine}\t{string.Join($"{Environment.NewLine}\t", message.Payloads)}" : $"Request Received: \"{message.Event}\" with no payloads"); tcs.SetResult(message); }); var msg = new OutboundMessage { Id = Guid.NewGuid(), Event = @event, Payloads = payloads.Select(p => Serializer.Serialize(p)).ToList() }; try { events[$"{msg.Id}:{@event}"] += callback; Emit(msg); return(await tcs.Task); } finally { events[$"{msg.Id}:{@event}"] -= callback; } }