summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/result/EventStream.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/result/EventStream.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/EventStream.java65
1 files changed, 65 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/result/EventStream.java b/container-search/src/main/java/com/yahoo/search/result/EventStream.java
new file mode 100644
index 00000000000..84ef9a8ee86
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/search/result/EventStream.java
@@ -0,0 +1,65 @@
+// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.result;
+
+import com.yahoo.processing.response.DefaultIncomingData;
+
+/**
+ * A stream of events which can be rendered as Server-Sent Events (SSE).
+ *
+ * @author lesters
+ */
+public class EventStream extends HitGroup {
+
+ private int eventCount = 0;
+
+ public static final String DEFAULT_EVENT_TYPE = "token";
+
+ private EventStream(String id, DefaultIncomingData<Hit> incomingData) {
+ super(id, new Relevance(1), incomingData);
+ this.setOrdered(true); // avoid hit group ordering - important as sequence as inserted should be kept
+ }
+
+ public static EventStream create(String id) {
+ DefaultIncomingData<Hit> incomingData = new DefaultIncomingData<>();
+ EventStream stream = new EventStream(id, incomingData);
+ incomingData.assignOwner(stream);
+ return stream;
+ }
+
+ public void add(String data) {
+ add(data, DEFAULT_EVENT_TYPE);
+ }
+
+ public void add(String data, String type) {
+ incoming().add(new Event(String.valueOf(eventCount + 1), data, type));
+ eventCount++;
+ }
+
+ public void error(String source, ErrorMessage message) {
+ incoming().add(new DefaultErrorHit(source, message));
+ }
+
+ public void markComplete() {
+ incoming().markComplete();
+ }
+
+ public static class Event extends Hit {
+
+ private final String type;
+
+ public Event(String id, String data, String type) {
+ super(id);
+ this.type = type;
+ setField(type, data);
+ }
+
+ public String toString() {
+ return getField(type).toString();
+ }
+
+ public String type() {
+ return type;
+ }
+
+ }
+}