Compare commits

...
1 Commits
Author SHA1 Message Date
admin c8d7e03afe lock streaming text 2025-06-05 22:22:34 -07:00
@@ -26,48 +26,58 @@ namespace eagle {
private readonly HashSet<IClientTextListener> _listeners = new();
public void Clear() { _streamingTexts.Clear(); }
public void Clear() {
lock (this) { _streamingTexts.Clear(); }
}
public Dictionary<String, TextEntry> All() {
return new Dictionary<string, TextEntry>(_streamingTexts);
lock (this) { return new Dictionary<string, TextEntry>(_streamingTexts); }
}
public String
HandleNewStreamingText(String llmId, String newText, Int32 knownByteCount, bool completed) {
var currentText = "";
if (_streamingTexts.TryGetValue(llmId, out var entry)) { currentText = entry.Text; }
lock (this) {
var currentText = "";
if (_streamingTexts.TryGetValue(llmId, out var entry)) { currentText = entry.Text; }
var currentTextBytes = Encoding.UTF8.GetBytes(currentText);
var truncatedBytes = currentTextBytes.Take(knownByteCount).ToArray();
var currentTextBytes = Encoding.UTF8.GetBytes(currentText);
var truncatedBytes = currentTextBytes.Take(knownByteCount).ToArray();
var updatedText = Encoding.UTF8.GetString(truncatedBytes) + newText;
_streamingTexts[llmId] = new TextEntry(updatedText, completed);
var updatedText = Encoding.UTF8.GetString(truncatedBytes) + newText;
_streamingTexts[llmId] = new TextEntry(updatedText, completed);
_listeners.Where(x => x.TextId() == llmId)
.ToList()
.ForEach(x => x.OnTextUpdate(updatedText, completed));
_listeners.Where(x => x.TextId() == llmId)
.ToList()
.ForEach(x => x.OnTextUpdate(updatedText, completed));
return updatedText;
return updatedText;
}
}
public TextEntry GetTextEntry(string streamId) {
if (String.IsNullOrEmpty(streamId)) return new TextEntry("", false);
lock (this) {
if (String.IsNullOrEmpty(streamId)) return new TextEntry("", false);
if (ClientPregeneratedText.Provider.TryGetText(streamId, out var text)) {
return new TextEntry(text, true);
if (ClientPregeneratedText.Provider.TryGetText(streamId, out var text)) {
return new TextEntry(text, true);
}
return _streamingTexts.GetValueOrDefault(streamId, null);
}
return _streamingTexts.GetValueOrDefault(streamId, null);
}
public void AddListener(IClientTextListener listener) {
if (listener.TextId() is {} textId && !String.IsNullOrEmpty(textId)) {
_listeners.Add(listener);
var entry = GetTextEntry(textId);
if (entry != null) { listener.OnTextUpdate(entry.Text, entry.Completed); }
lock (this) {
if (listener.TextId() is {} textId && !String.IsNullOrEmpty(textId)) {
_listeners.Add(listener);
var entry = GetTextEntry(textId);
if (entry != null) { listener.OnTextUpdate(entry.Text, entry.Completed); }
}
}
}
public void RemoveListener(IClientTextListener listener) { _listeners.Remove(listener); }
public void RemoveListener(IClientTextListener listener) {
lock (this) { _listeners.Remove(listener); }
}
}
}