private static async Task <InboundMessage> InternalRequest(string @event, [CanBeNull] IClient target, params object[] payloads) { var tcs = new TaskCompletionSource <InboundMessage>(); var callback = new Action <byte[]>(data => { var message = InboundMessage.From(data); logger.Trace($"Request Received: {PrintInboundMessage(message)}"); tcs.SetResult(message); }); var msg = new OutboundMessage { Id = Guid.NewGuid(), Target = target, 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; } }
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 void Fire(OutboundMessage message) { this.logger.Debug($"Fire: \"{message.Event}\" with {message.Payloads.Count} payload(s): {string.Join(", ", message.Payloads)}"); if (message.Target != null) { new PlayerList()[message.Target.Handle].TriggerEvent(message.Event, this.serializer.Serialize(message)); } else { BaseScript.TriggerClientEvent(message.Event, this.serializer.Serialize(message)); } }
private static string PrintOutboundMessage(OutboundMessage message) { var str = $"\"{message.Event}\" with "; if (message.Target != null) { str += $"to {message.Target.Handle} "; } if (message.Payloads.Count < 1) { return(str + "no payloads"); } return(str + $"{"payload".Pluralize(message.Payloads.Count)}:{Environment.NewLine}\t{string.Join($"{Environment.NewLine}\t", message.Payloads)}"); }
public async void Fire(OutboundMessage message) { // Marshall back to the main thread in order to use a native call. await BaseScript.Delay(0); this.logger.Trace($"Fire: \"{message.Event}\" with {message.Payloads.Count} payload(s): {string.Join(", ", message.Payloads)}"); if (message.Target != null) { new PlayerList()[message.Target.Handle].TriggerEvent(message.Event, this.serializer.Serialize(message)); } else { BaseScript.TriggerClientEvent(message.Event, this.serializer.Serialize(message)); } }
private static async void Emit(OutboundMessage message) { logger.Trace($"Fire: \"{PrintOutboundMessage(message)}\""); // Marshall back to the main thread in order to use a native call. await BaseScript.Delay(0); if (message.Target != null) { logger.Trace($"TriggerClientEvent: Using PlayerList with {"player".Pluralize(players.Count())}"); BaseScript.TriggerClientEvent(players[message.Target.Handle], message.Event, message.Pack()); } else { logger.Trace("TriggerClientEvent: All clients"); BaseScript.TriggerClientEvent(message.Event, message.Pack()); } }
public static byte[] Pack(OutboundMessage message) { message.Sent = DateTime.UtcNow; var json = Serialize(message); using (var inputStream = new MemoryStream(json, false)) using (var compressedStream = new ZlibStream(inputStream, CompressionMode.Compress, (CompressionLevel)Level, true)) using (var outputStream = new MemoryStream()) { compressedStream.CopyTo(outputStream); var r = outputStream.ToArray(); Logger.Trace($"Packed {new UnicodeEncoding(false, false).GetString(json).Length} chars, {inputStream.Length} bytes to {r.Length} bytes: {message.Event}"); return(r); } }
public async void Fire(OutboundMessage message) { // Marshall back to the main thread in order to use a native call. await BaseScript.Delay(0); if (message.Payloads.Count > 0) { this.logger.Trace($"Fire: \"{message.Event}\" {(message.Target != null ? $"to {message.Target.Handle} " : string.Empty)}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}\" {(message.Target != null ? $"to {message.Target.Handle} " : string.Empty)}with no payloads"); } if (message.Target != null) { BaseScript.TriggerClientEvent(new PlayerList()[message.Target.Handle], message.Event, message.Pack()); } else { BaseScript.TriggerClientEvent(message.Event, message.Pack()); } }