Esempio n. 1
0
 private static void WriteId(
     this SocketMessageWriter writer,
     string id)
 {
     writer.Writer.WritePropertyName("id");
     writer.Writer.WriteStringValue(id);
 }
Esempio n. 2
0
        private async Task RegisterInternalAsync(
            ISubscription subscription,
            ISocketConnection connection)
        {
            if (_subs.TryAdd(subscription.Id, new Sub(subscription, connection)))
            {
                connection.Disposed += (sender, args) => RemoveSubscription(subscription.Id);

                if (connection.IsClosed)
                {
                    _subs.TryRemove(subscription.Id, out _);
                    return;
                }

                subscription.OnRegister(() => UnregisterAsync(subscription.Id));

                var writer = new SocketMessageWriter();

                writer.WriteStartObject();
                writer.WriteType(MessageTypes.Subscription.Start);
                writer.WriteId(subscription.Id);
                writer.WriteStartPayload();
                subscription.OperationFormatter.Serialize(subscription.Operation, writer);
                writer.WriteEndObject();

                await connection.SendAsync(writer.Body).ConfigureAwait(false);
            }
        }
        public async Task WriteInitializeMessage_CustomObject_IsMatch()
        {
            // arrange
            await using var writer = new SocketMessageWriter();

            // act
            writer.WriteInitializeMessage(new CustomPayload());

            // assert
            Encoding.UTF8.GetString(writer.Body.Span).MatchSnapshot();
        }
        public async Task WriteInitializeMessage_Default_IsMatch()
        {
            // arrange
            await using var writer = new SocketMessageWriter();

            // act
            writer.WriteInitializeMessage(null);

            // assert
            Encoding.UTF8.GetString(writer.Body.Span).MatchSnapshot();
        }
        public async Task WriteStopOperationMessage_OperationIdNull_IsMatch()
        {
            // arrange
            await using var writer = new SocketMessageWriter();

            // act
            Exception?ex =
                Record.Exception(() => writer.WriteStopOperationMessage(null !));

            // assert
            Assert.IsType <ArgumentNullException>(ex);
        }
        public async Task WriteStopOperationMessage_WithOperationId_IsMatch()
        {
            // arrange
            await using var writer = new SocketMessageWriter();
            var operationId = "12f90cc5-2905-4d10-b33a-cb6d8f98a810";

            // act
            writer.WriteStopOperationMessage(operationId);

            // assert
            Encoding.UTF8.GetString(writer.Body.Span).MatchSnapshot();
        }
        public async Task WriteInitializeMessage_Dictionary_IsMatch()
        {
            // arrange
            await using var writer = new SocketMessageWriter();

            // act
            writer.WriteInitializeMessage(new Dictionary <string, object> {
                ["Key"] = "Value"
            });

            // assert
            Encoding.UTF8.GetString(writer.Body.Span).MatchSnapshot();
        }
Esempio n. 8
0
        /// <summary>
        /// Writes a <see cref="GraphQLWebSocketMessageType.Stop"/> message to the writer
        /// </summary>
        /// <param name="writer">The writer</param>
        /// <param name="operationId">The operation id of the operation</param>
        public static void WriteStopOperationMessage(
            this SocketMessageWriter writer,
            string operationId)
        {
            if (operationId == null)
            {
                throw new ArgumentNullException(nameof(operationId));
            }

            writer.WriteStartObject();
            writer.WriteType(GraphQLWebSocketMessageType.Stop);
            writer.WriteId(operationId);
            writer.WriteEndObject();
        }
Esempio n. 9
0
        public async Task UnregisterAsync(string subscriptionId)
        {
            if (_subs.TryRemove(subscriptionId, out Sub? sub))
            {
                var writer = new SocketMessageWriter();

                writer.WriteStartObject();
                writer.WriteType(MessageTypes.Subscription.Stop);
                writer.WriteId(subscriptionId);
                writer.WriteEndObject();

                await sub.Connection.SendAsync(writer.Body);
            }
        }
        public async Task WriteStartOperationMessage_RequestIsNull_IsMatch()
        {
            // arrange
            await using var writer = new SocketMessageWriter();
            var operationId = "12f90cc5-2905-4d10-b33a-cb6d8f98a810";


            // act
            Exception?ex =
                Record.Exception(() => writer.WriteStartOperationMessage(operationId, null !));

            // assert
            Assert.IsType <ArgumentNullException>(ex);
        }
Esempio n. 11
0
        /// <summary>
        /// Writes a <see cref="GraphQLWebSocketMessageType.ConnectionInit"/>message to the writer
        /// </summary>
        /// <param name="writer">The writer</param>
        /// <param name="payload">The payload of the init message</param>
        public static void WriteInitializeMessage(
            this SocketMessageWriter writer,
            object?payload)
        {
            writer.WriteStartObject();
            writer.WriteType(GraphQLWebSocketMessageType.ConnectionInit);

            if (payload is not null)
            {
                writer.WriteStartPayload();
                JsonSerializer.Serialize(writer.Writer, payload);
            }

            writer.WriteEndObject();
        }
        public async Task WriteStartOperationMessage_WithOperation_IsMatch()
        {
            // arrange
            await using var writer = new SocketMessageWriter();
            var operationId = "12f90cc5-2905-4d10-b33a-cb6d8f98a810";
            var request     = new OperationRequest("Foo",
                                                   GetHeroQueryDocument.Instance,
                                                   new Dictionary <string, object?>()
            {
                { "Var1", "Value1" }
            });


            // act
            writer.WriteStartOperationMessage(operationId, request);

            // assert
            Encoding.UTF8.GetString(writer.Body.Span).MatchSnapshot();
        }
        public async Task WriteStartOperationMessage_OperationIdNull_IsMatch()
        {
            // arrange
            await using var writer = new SocketMessageWriter();
            var request = new OperationRequest("Foo",
                                               GetHeroQueryDocument.Instance,
                                               new Dictionary <string, object?>()
            {
                { "Var1", "Value1" }
            });


            // act
            Exception?ex =
                Record.Exception(() => writer.WriteStartOperationMessage(null !, request));

            // assert
            Assert.IsType <ArgumentNullException>(ex);
        }
Esempio n. 14
0
        /// <summary>
        /// Writes a <see cref="GraphQLWebSocketMessageType.Start"/> message to the writer
        /// </summary>
        /// <param name="writer">The writer</param>
        /// <param name="operationId">The operation id of the operation</param>
        /// <param name="request">The operation request containing the payload</param>
        public static void WriteStartOperationMessage(
            this SocketMessageWriter writer,
            string operationId,
            OperationRequest request)
        {
            if (operationId == null)
            {
                throw new ArgumentNullException(nameof(operationId));
            }

            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            writer.WriteStartObject();
            writer.WriteType(GraphQLWebSocketMessageType.Start);
            writer.WriteId(operationId);
            writer.WriteStartPayload();
            writer.Serialize(request);
            writer.WriteEndObject();
        }
Esempio n. 15
0
        private static void WriteType(
            this SocketMessageWriter writer,
            GraphQLWebSocketMessageType type)
        {
            writer.Writer.WritePropertyName("type");
            ReadOnlySpan <byte> typeToWriter = type switch
            {
                GraphQLWebSocketMessageType.ConnectionInit => ConnectionInitialize,
                GraphQLWebSocketMessageType.ConnectionAccept => ConnectionAccept,
                GraphQLWebSocketMessageType.ConnectionError => ConnectionError,
                GraphQLWebSocketMessageType.KeepAlive => KeepAlive,
                GraphQLWebSocketMessageType.ConnectionTerminate => ConnectionTerminate,
                GraphQLWebSocketMessageType.Start => Start,
                GraphQLWebSocketMessageType.Data => Data,
                GraphQLWebSocketMessageType.Error => Error,
                GraphQLWebSocketMessageType.Complete => Complete,
                GraphQLWebSocketMessageType.Stop => Stop,
                _ => throw new ArgumentOutOfRangeException(nameof(type), type, null)
            };

            writer.Writer.WriteStringValue(typeToWriter);
        }
Esempio n. 16
0
 /// <summary>
 /// Writes a <see cref="GraphQLWebSocketMessageType.ConnectionInit"/>message to the writer
 /// </summary>
 /// <param name="writer">The writer</param>
 public static void WriteInitializeMessage(this SocketMessageWriter writer)
 {
     writer.WriteStartObject();
     writer.WriteType(GraphQLWebSocketMessageType.ConnectionInit);
     writer.WriteEndObject();
 }
Esempio n. 17
0
 /// <summary>
 /// Writes a <see cref="GraphQLWebSocketMessageType.ConnectionTerminate"/> message to the
 /// writer
 /// </summary>
 /// <param name="writer">The writer</param>
 public static void WriteTerminateMessage(this SocketMessageWriter writer)
 {
     writer.WriteStartObject();
     writer.WriteType(GraphQLWebSocketMessageType.ConnectionTerminate);
     writer.WriteEndObject();
 }
Esempio n. 18
0
 private static void Serialize(
     this SocketMessageWriter writer,
     OperationRequest request)
 {
     JsonOperationRequestSerializer.Default.Serialize(request, writer.Writer);
 }
Esempio n. 19
0
 private static void WriteStartPayload(this SocketMessageWriter writer)
 {
     writer.Writer.WritePropertyName("payload");
 }