From 0312051c1b191cbdabce0d742b9644f38dd982c3 Mon Sep 17 00:00:00 2001 From: Eris Date: Fri, 15 Oct 2021 02:09:16 +0200 Subject: [PATCH] Reduce PubSub message parsing times by leveraging STJ sourcegen --- .../Helpers/JSON/TwitchPubSubSerializerContext.cs | 12 ++++++++++++ .../Twitch/TwitchPubSubServiceExperimentalAgent.cs | 10 ++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 CatCore/Helpers/JSON/TwitchPubSubSerializerContext.cs diff --git a/CatCore/Helpers/JSON/TwitchPubSubSerializerContext.cs b/CatCore/Helpers/JSON/TwitchPubSubSerializerContext.cs new file mode 100644 index 0000000..9a17c2c --- /dev/null +++ b/CatCore/Helpers/JSON/TwitchPubSubSerializerContext.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; +using CatCore.Models.Twitch.PubSub.Requests; +using CatCore.Models.Twitch.PubSub.Responses; + +namespace CatCore.Helpers.JSON +{ + [JsonSerializable(typeof(TopicNegotiationMessage))] + [JsonSerializable(typeof(Follow))] + internal partial class TwitchPubSubSerializerContext : JsonSerializerContext + { + } +} \ No newline at end of file diff --git a/CatCore/Services/Twitch/TwitchPubSubServiceExperimentalAgent.cs b/CatCore/Services/Twitch/TwitchPubSubServiceExperimentalAgent.cs index 19d3b62..e3f4222 100644 --- a/CatCore/Services/Twitch/TwitchPubSubServiceExperimentalAgent.cs +++ b/CatCore/Services/Twitch/TwitchPubSubServiceExperimentalAgent.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using System.Timers; using CatCore.Helpers; +using CatCore.Helpers.JSON; using CatCore.Models.Shared; using CatCore.Models.Twitch.PubSub; using CatCore.Models.Twitch.PubSub.Requests; @@ -360,7 +361,9 @@ async Task HandleQueue() var fullTopic = ConvertTopic(msg.topic); var nonce = GenerateNonce(); - var jsonMessage = JsonSerializer.Serialize(new TopicNegotiationMessage(mode, new TopicNegotiationMessageData(new[] { fullTopic }), nonce)); + var jsonMessage = JsonSerializer.Serialize( + new TopicNegotiationMessage(mode, new TopicNegotiationMessageData(new[] { fullTopic }), nonce), + TwitchPubSubSerializerContext.Default.TopicNegotiationMessage); _inProgressTopicNegotiations.TryAdd(nonce, msg.topic); @@ -450,6 +453,7 @@ private void HandleMessageTypeInternal(JsonElement rootElement) { case PubSubTopics.FOLLOWING: { + /* TODO: Remove commented code if source-generated deserializing proves to be faster var followingDocument = JsonDocument.Parse(message).RootElement; var displayName = followingDocument.GetProperty("display_name").GetString()!; @@ -457,8 +461,10 @@ private void HandleMessageTypeInternal(JsonElement rootElement) var userId = followingDocument.GetProperty("user_id").GetString()!; _logger.Debug("Main event type: {MainType} - {DisplayName} now follows channel {TargetChannelId}", topic, displayName, _channelId); + new Follow(userId, username, displayName)*/ - OnFollow?.Invoke(_channelId, new Follow(userId, username, displayName)); + var follow = JsonSerializer.Deserialize(message, TwitchPubSubSerializerContext.Default.Follow); + OnFollow?.Invoke(_channelId, follow); break; }