예제 #1
0
        public void Emit(string eventName, object[] args, Action<string> ack)
        {
            var packet = new Packet { Type = PacketType.Event, Name = eventName, Data = JsonConvert.SerializeObject(args, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }) };

             if (ack != null)
             {
            packet.Ack = "data";
            packet.Id = (++m_ackPacketCount).ToString(CultureInfo.InvariantCulture);
            m_acks[packet.Id] = ack;
             }

             SendPacket(packet);
        }
      internal void HandlePacket(Packet packet)
      {
         Action<string> ack = args => m_socket.SendPacket(new Packet { Type = PacketType.Ack, Args = args, AckId = packet.Id });

         switch (packet.Type)
         {
            case PacketType.Connect:
               EmitLocally("connect");
               break;
            case PacketType.Disconnect:
               EmitLocally("disconnect", packet.Reason);
               break;
            case PacketType.Message:
            case PacketType.Json:
               if (packet.Ack != null && packet.Ack != "data")
               {
                  ack(null);
               }

               EmitLocally("message", packet.Data, packet.Ack == "data" ? ack : null);
               break;
            case PacketType.Event:
               var args = JsonConvert.DeserializeObject<object[]>(packet.Args);

               EmitLocally(packet.Name, args, packet.Ack == "data" ? ack : null);
               break;
            case PacketType.Ack:
               if (m_acks.ContainsKey(packet.AckId))
               {
                  var ackToCall = m_acks[packet.AckId];
                  m_acks.Remove(packet.AckId);
                  ackToCall(packet.Args);
               }
               break;
            case PacketType.Error:
               EmitLocally(packet.Reason == "unauthorized" ? "connect_failed" : "error", packet.Reason);
               break;
         }
      }
 public PacketSentEventArgs(Packet packet)
 {
    Packet = packet;
 }
        public static string EncodePacket(Packet packet)
        {
            var parts = new List<string>();

             parts.Add(((int) packet.Type).ToString(CultureInfo.InvariantCulture));
             parts.Add((packet.Id ?? "") + (packet.Ack == "data" ? "+" : string.Empty));
             parts.Add(packet.EndPoint ?? "");

             string data = packet.Data;

             switch (packet.Type)
             {
             case PacketType.Connect:
                 data = packet.QueryString;
                 break;
             case PacketType.Event:
               data = JsonConvert.SerializeObject(new { name = packet.Name, args = string.IsNullOrEmpty(packet.Data) ? null : JArray.Parse(data) }, Formatting.None, new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore});
               break;
            case PacketType.Ack:
               data = packet.AckId + (!string.IsNullOrEmpty(packet.Args) ? "+" + packet.Args : string.Empty) ;
               break;
             }

             if (data != null)
             {
            parts.Add(data);
             }

             return string.Join(":", parts.ToArray());
        }
        public static Packet DecodePacket(string packetData)
        {
            var match = PacketRegex.Match(packetData);
             var packet = new Packet();

             var id = match.Groups["Id"].Value;
             var type = (PacketType)int.Parse(match.Groups["Type"].Value);
             var data = match.Groups["Data"].Value;
             var endPoint = match.Groups["EndPoint"].Value;
             var ack = match.Groups["Ack"].Value;

             if (!string.IsNullOrEmpty(id))
             {
            packet.Id = id;
            packet.Ack = !string.IsNullOrEmpty(ack) ? "data" : "true";
             }

             packet.Type = type;
             packet.EndPoint = endPoint;
             packet.Data = data;

             switch (type)
             {
            case PacketType.Connect:
               packet.Data = null;
               packet.QueryString = data;
               break;
            case PacketType.Error:
               var errorParts = data.Split(new[] {'+'});

               if (errorParts.Length >= 1)
               {
                  if (Reasons.ContainsKey(errorParts[0]))
                  {
                     packet.Reason = Reasons[errorParts[0]];
                  }
               }

               if (errorParts.Length >= 2)
               {
                  if (Advice.ContainsKey(errorParts[1]))
                  {
                     packet.Advice = Advice[errorParts[1]];
                  }
               }

               break;
            case PacketType.Event:
               var packetEvent = JsonConvert.DeserializeObject<Event>(data);
               packet.Name = packetEvent.Name;
               packet.Args = packetEvent.Args != null ? ((JContainer)packetEvent.Args).ToString(Formatting.None, null) : "[]";
               break;
            case PacketType.Ack:
               var ackMatches = Regex.Match(data, @"^(?<AckId>[0-9]+)(\+)?(?<Args>.*)", RegexOptions.Compiled);

               if (ackMatches.Success)
               {
                  packet.AckId = ackMatches.Groups["AckId"].Value;
                  packet.Args = string.IsNullOrEmpty(ackMatches.Groups["Args"].Value) ? "[]" : ackMatches.Groups["Args"].Value;
               }

               break;
             }

             return packet;
        }
      internal void SendPacket(Packet packet)
      {
         if (m_socket == null || !Connected)
         {
            return;
         }

         m_socket.Write(PacketParser.EncodePacket(packet));   
      }
      private void SendPacket(Packet packet)
      {
         packet.EndPoint = Name;

         m_socket.SendPacket(packet);
      }
예제 #8
0
      public void WhenEmitOnTheClient_ItShouldBeEmittedWithTheDefaultNamespace()
      {
         var expected = new Packet
         {
            Type = PacketType.Event,
            Name = "eventName",
            Data = "[\"data\"]",
            EndPoint = string.Empty
         };

         var expectedData = PacketParser.EncodePacket(expected);

         socket.Emit("eventName", "data");
         
         A.CallTo(() => fakeWebSocket.Write(expectedData)).MustHaveHappened();
      }
예제 #9
0
      public void WhenAnEventComesIn_ItShouldExecuteEventListeners()
      {
         var expected = new Packet
         {
            Type = PacketType.Event,
            Name = "eventName",
            Args = "[\"data\"]",
            EndPoint = ""
         };

         object[] actualData = null;

         socket.On("data", (data, callback) => { actualData = data; });

         fakeWebSocket.MessageReceived += Raise.With(fakeWebSocket, new MessageReceivedEventArgs(PacketParser.EncodePacket(expected))).Now;
         
         Assert.AreEqual(expected.Data, actualData);
      }
예제 #10
0
      public void WhenEmitWithMultipleArgs_ItShouldSendTheCorrectPacket()
      {
         var expected = new Packet
         {
            Type = PacketType.Event,
            Name = "eventName",
            Data = "[\"a\",\"b\",\"c\",\"d\"]",
            EndPoint = ""
         };

         socket.Emit("eventName", "a", "b", "c", "d");

         A.CallTo(() => fakeWebSocket.Write(PacketParser.EncodePacket(expected))).MustHaveHappened();
      }
예제 #11
0
      public void WhenEmitOnASpecificNamespace_ItShouldSendTheCorrectPacket()
      {
         var expected = new Packet
         {
            Type = PacketType.Event,
            Name = "eventName",
            Data = "[\"data\"]",
            EndPoint = "/ns"
         };

         io.Of("/ns").Emit("eventName", "data");

         A.CallTo(() => fakeWebSocket.Write(PacketParser.EncodePacket(expected))).MustHaveHappened();
      }
예제 #12
0
      public void WhenEmitOnTheDefaultNamespace_ItShouldSendTheCorrectPacket()
      {
         var expected = new Packet
         {
            Type = PacketType.Event,
            Name = "eventName",
            Data = "[\"data\"]",
            EndPoint = string.Empty
         };

         io.Of("").Emit("eventName", "data");

         io.Of(null).Emit("eventName", "data");

         A.CallTo(() => fakeWebSocket.Write(PacketParser.EncodePacket(expected))).MustHaveHappened(Repeated.Exactly.Times(2));
      }