Feat v0.5.0 realtime dialog (#30)
All checks were successful
All checks were successful
Co-authored-by: Jeffrey Smith <jasafpro@gmail.com> Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
This commit was merged in pull request #30.
This commit is contained in:
@@ -117,6 +117,12 @@ func TestRouteFor(t *testing.T) {
|
||||
// Extension lifecycle
|
||||
{"extension.loaded", DirLocal},
|
||||
{"extension.error", DirLocal},
|
||||
// Realtime (v0.5.0)
|
||||
{"realtime.chat.message", DirToClient},
|
||||
{"realtime.custom.event", DirToClient},
|
||||
// Room management (v0.5.0)
|
||||
{"room.subscribe", DirFromClient},
|
||||
{"room.unsubscribe", DirFromClient},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
@@ -190,6 +196,27 @@ func TestWaitFor_CleansUpSubscription(t *testing.T) {
|
||||
bus.Publish(Event{Label: "tool.result.cleanup", Payload: json.RawMessage(`{}`)})
|
||||
}
|
||||
|
||||
func TestRealtimeRouting(t *testing.T) {
|
||||
// realtime.* events should be sent to clients but not accepted from them
|
||||
if !ShouldSendToClient("realtime.chat.message") {
|
||||
t.Error("realtime.* should be sent to client")
|
||||
}
|
||||
if ShouldAcceptFromClient("realtime.chat.message") {
|
||||
t.Error("realtime.* should NOT be accepted from client")
|
||||
}
|
||||
|
||||
// room.subscribe/unsubscribe should be accepted from clients
|
||||
if !ShouldAcceptFromClient("room.subscribe") {
|
||||
t.Error("room.subscribe should be accepted from client")
|
||||
}
|
||||
if !ShouldAcceptFromClient("room.unsubscribe") {
|
||||
t.Error("room.unsubscribe should be accepted from client")
|
||||
}
|
||||
if ShouldSendToClient("room.subscribe") {
|
||||
t.Error("room.subscribe should NOT be sent to client")
|
||||
}
|
||||
}
|
||||
|
||||
func TestToolCallRouteToClient(t *testing.T) {
|
||||
if !ShouldSendToClient("tool.call.abc123") {
|
||||
t.Error("tool.call.* should be sent to client")
|
||||
|
||||
@@ -87,6 +87,13 @@ var routeTable = map[string]Direction{
|
||||
"trigger.fired": DirLocal, // Trigger invocation event (observability)
|
||||
"trigger.error": DirLocal, // Trigger execution error
|
||||
|
||||
// Realtime (v0.5.0): extension-published events, room-scoped
|
||||
"realtime.": DirToClient,
|
||||
|
||||
// Room management (v0.5.0): client room join/leave
|
||||
"room.subscribe": DirFromClient,
|
||||
"room.unsubscribe": DirFromClient,
|
||||
|
||||
// Heartbeat
|
||||
"ping": DirFromClient,
|
||||
"pong": DirToClient,
|
||||
|
||||
@@ -316,6 +316,26 @@ func (c *Conn) readPump() {
|
||||
continue
|
||||
}
|
||||
|
||||
// v0.5.0: Room management — intercept before bus publish (like ping)
|
||||
if event.Label == "room.subscribe" {
|
||||
var req struct {
|
||||
Room string `json:"room"`
|
||||
}
|
||||
if json.Unmarshal(event.Payload, &req) == nil && req.Room != "" && len(c.rooms) < 100 {
|
||||
c.JoinRoom(req.Room)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if event.Label == "room.unsubscribe" {
|
||||
var req struct {
|
||||
Room string `json:"room"`
|
||||
}
|
||||
if json.Unmarshal(event.Payload, &req) == nil && req.Room != "" {
|
||||
c.LeaveRoom(req.Room)
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// Validate: only accept events allowed from clients
|
||||
if !ShouldAcceptFromClient(event.Label) {
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user