Files
JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/ProtocolToTurnContextMapper.cs

85 lines
2.7 KiB
C#
Raw Normal View History

using System.Text.Json;
using Jibo.Cloud.Domain.Models;
using Jibo.Runtime.Abstractions;
namespace Jibo.Cloud.Application.Services;
public sealed class ProtocolToTurnContextMapper
{
2026-04-11 21:50:26 -05:00
public TurnContext MapListenMessage(WebSocketMessageEnvelope envelope, CloudSession session, string messageType)
{
var text = ExtractTranscript(envelope.Text);
2026-04-11 21:50:26 -05:00
var protocolOperation = messageType.ToLowerInvariant();
var attributes = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
{
["messageType"] = messageType
};
if (!string.IsNullOrWhiteSpace(session.LastTransId))
{
attributes["transID"] = session.LastTransId;
}
if (session.Metadata.TryGetValue("context", out var context))
{
attributes["context"] = context;
}
if (session.Metadata.TryGetValue("listenRules", out var listenRules))
{
attributes["listenRules"] = listenRules;
}
return new TurnContext
{
SessionId = session.SessionId,
2026-04-11 21:50:26 -05:00
InputMode = session.FollowUpOpen ? TurnInputMode.FollowUp : TurnInputMode.DirectText,
SourceKind = TurnSourceKind.Api,
RawTranscript = text,
NormalizedTranscript = text?.Trim(),
DeviceId = session.DeviceId,
HostName = envelope.HostName,
RequestId = envelope.ConnectionId,
ProtocolService = "neo-hub",
2026-04-11 21:50:26 -05:00
ProtocolOperation = protocolOperation,
FirmwareVersion = session.Metadata.TryGetValue("firmwareVersion", out var firmwareVersion) ? firmwareVersion as string : null,
ApplicationVersion = session.Metadata.TryGetValue("applicationVersion", out var applicationVersion) ? applicationVersion as string : null,
2026-04-11 21:50:26 -05:00
IsFollowUpEligible = true,
Attributes = attributes
};
}
private static string? ExtractTranscript(string? text)
{
if (string.IsNullOrWhiteSpace(text))
{
return null;
}
try
{
using var document = JsonDocument.Parse(text);
var root = document.RootElement;
if (root.TryGetProperty("data", out var data))
{
if (data.TryGetProperty("text", out var transcript) && transcript.ValueKind == JsonValueKind.String)
{
return transcript.GetString();
}
if (data.TryGetProperty("intent", out var intent) && intent.ValueKind == JsonValueKind.String)
{
return intent.GetString();
}
}
}
catch
{
return text;
}
return text;
}
}