align with honeybee updates. change ID to URL semantics.

This commit is contained in:
Jay
2026-06-08 09:43:19 -04:00
parent 69f9219819
commit 42e6e2af83
10 changed files with 88 additions and 73 deletions
+4 -4
View File
@@ -85,16 +85,16 @@ func (m *AuthManager) routeInbox() {
m.mu.Unlock() m.mu.Unlock()
now := time.Now() now := time.Now()
m.envoy.Observer().Record(msg.ID, ChallengeReceived{Challenge: challenge, At: now}) m.envoy.Observer().Record(msg.URL, ChallengeReceived{Challenge: challenge, At: now})
signed, err := m.respond(challenge) signed, err := m.respond(challenge)
if err != nil { if err != nil {
m.envoy.Observer().Record(msg.ID, AuthResponseFailed{Err: err, At: time.Now()}) m.envoy.Observer().Record(msg.URL, AuthResponseFailed{Err: err, At: time.Now()})
continue continue
} }
if err := m.envoy.Send([]byte(envelope.EncloseAuthResponse(signed))); err != nil { if err := m.envoy.Send([]byte(envelope.EncloseAuthResponse(signed))); err != nil {
m.envoy.Observer().Record(msg.ID, AuthResponseFailed{Err: err, At: time.Now()}) m.envoy.Observer().Record(msg.URL, AuthResponseFailed{Err: err, At: time.Now()})
continue continue
} }
@@ -102,7 +102,7 @@ func (m *AuthManager) routeInbox() {
m.logger.Info("responded to auth", "challenge", challenge) m.logger.Info("responded to auth", "challenge", challenge)
} }
m.envoy.Observer().Record(msg.ID, AuthResponseSent{At: time.Now()}) m.envoy.Observer().Record(msg.URL, AuthResponseSent{At: time.Now()})
} }
} }
} }
+28 -13
View File
@@ -30,6 +30,7 @@ const (
EventConnected EmbassyEventKind = iota EventConnected EmbassyEventKind = iota
EventDisconnected EventDisconnected
EventDialFailed EventDialFailed
EventRetired
EventEmbassyUnknown EventEmbassyUnknown
) )
@@ -41,20 +42,22 @@ func mapEmbassyEvent(kind honeybee.PoolEventKind) EmbassyEventKind {
return EventDisconnected return EventDisconnected
case honeybee.EventDialFailed: case honeybee.EventDialFailed:
return EventDialFailed return EventDialFailed
case honeybee.EventRetired:
return EventRetired
default: default:
return EventEmbassyUnknown return EventEmbassyUnknown
} }
} }
type PoolEvent struct { type PoolEvent struct {
ID string URL string
Kind EmbassyEventKind Kind EmbassyEventKind
At time.Time At time.Time
Err error Err error
} }
type InboxMessage struct { type InboxMessage struct {
ID string URL string
Data []byte Data []byte
ReceivedAt time.Time ReceivedAt time.Time
} }
@@ -249,7 +252,7 @@ func (e *Embassy) routeEvents() {
return return
} }
url, err := honeybee.NormalizeURL(ev.ID) url, err := honeybee.NormalizeURL(ev.URL)
if err != nil { if err != nil {
continue continue
} }
@@ -266,7 +269,7 @@ func (e *Embassy) routeEvents() {
case <-e.ctx.Done(): case <-e.ctx.Done():
return return
case sub <- PoolEvent{ case sub <- PoolEvent{
ID: ev.ID, Kind: mapEmbassyEvent(ev.Kind), At: ev.At, Err: ev.Err, URL: ev.URL, Kind: mapEmbassyEvent(ev.Kind), At: ev.At, Err: ev.Err,
}: }:
} }
} }
@@ -283,7 +286,7 @@ func (e *Embassy) routeInbox() {
return return
} }
url, err := honeybee.NormalizeURL(ev.ID) url, err := honeybee.NormalizeURL(ev.URL)
if err != nil { if err != nil {
continue continue
} }
@@ -300,7 +303,7 @@ func (e *Embassy) routeInbox() {
case <-e.ctx.Done(): case <-e.ctx.Done():
return return
case sub <- InboxMessage{ case sub <- InboxMessage{
ID: ev.ID, Data: ev.Data, ReceivedAt: ev.ReceivedAt}: URL: ev.URL, Data: ev.Data, ReceivedAt: ev.ReceivedAt}:
} }
} }
} }
@@ -318,9 +321,9 @@ type Envoy struct {
send func(data []byte) error send func(data []byte) error
events <-chan PoolEvent events <-chan PoolEvent
inbox <-chan InboxMessage inbox <-chan InboxMessage
eventSubs []chan<- PoolEvent eventSubs []chan PoolEvent
labelledInboxSubs map[string][]chan<- InboxMessage labelledInboxSubs map[string][]chan InboxMessage
inboxSubs []chan<- InboxMessage inboxSubs []chan InboxMessage
ctx context.Context ctx context.Context
cancel context.CancelFunc cancel context.CancelFunc
@@ -350,7 +353,7 @@ func newEnvoy(
send: send, send: send,
events: events, events: events,
inbox: inbox, inbox: inbox,
labelledInboxSubs: make(map[string][]chan<- InboxMessage), labelledInboxSubs: make(map[string][]chan InboxMessage),
ctx: ctx, ctx: ctx,
cancel: cancel, cancel: cancel,
observer: observer, observer: observer,
@@ -378,7 +381,7 @@ func (e *Envoy) Context() context.Context {
return e.ctx return e.ctx
} }
func (e *Envoy) PeerID() string { func (e *Envoy) URL() string {
return e.url return e.url
} }
@@ -408,7 +411,7 @@ func (e *Envoy) Dismiss() {
e.eventSubs = nil e.eventSubs = nil
e.inboxSubs = nil e.inboxSubs = nil
e.labelledInboxSubs = make(map[string][]chan<- InboxMessage) e.labelledInboxSubs = make(map[string][]chan InboxMessage)
} }
func (e *Envoy) Send(data []byte) error { func (e *Envoy) Send(data []byte) error {
@@ -423,6 +426,18 @@ func (e *Envoy) SubscribeEvents() <-chan PoolEvent {
return ch return ch
} }
func (e *Envoy) UnsubscribeEvents(ch <-chan PoolEvent) {
e.mu.Lock()
defer e.mu.Unlock()
for i, sub := range e.eventSubs {
if sub == ch {
e.eventSubs[i] = e.eventSubs[len(e.eventSubs)-1]
e.eventSubs = e.eventSubs[:len(e.eventSubs)-1]
return
}
}
}
func (e *Envoy) SubscribeInbox(labels []string) <-chan InboxMessage { func (e *Envoy) SubscribeInbox(labels []string) <-chan InboxMessage {
e.mu.Lock() e.mu.Lock()
defer e.mu.Unlock() defer e.mu.Unlock()
@@ -430,7 +445,7 @@ func (e *Envoy) SubscribeInbox(labels []string) <-chan InboxMessage {
e.inboxSubs = append(e.inboxSubs, ch) e.inboxSubs = append(e.inboxSubs, ch)
for _, label := range labels { for _, label := range labels {
if _, ok := e.labelledInboxSubs[label]; !ok { if _, ok := e.labelledInboxSubs[label]; !ok {
e.labelledInboxSubs[label] = make([]chan<- InboxMessage, 0) e.labelledInboxSubs[label] = make([]chan InboxMessage, 0)
} }
e.labelledInboxSubs[label] = append(e.labelledInboxSubs[label], ch) e.labelledInboxSubs[label] = append(e.labelledInboxSubs[label], ch)
} }
+5 -5
View File
@@ -42,16 +42,16 @@ func TestEmbassy_Dispatch(t *testing.T) {
}() }()
p.events <- honeybee.PoolEvent{ p.events <- honeybee.PoolEvent{
ID: p.url, Kind: honeybee.EventConnected, At: time.Now()} URL: p.url, Kind: honeybee.EventConnected, At: time.Now()}
p.events <- honeybee.PoolEvent{ p.events <- honeybee.PoolEvent{
ID: "wss://other", Kind: honeybee.EventConnected, At: time.Now()} URL: "wss://other", Kind: honeybee.EventConnected, At: time.Now()}
p.inbox <- honeybee.InboxMessage{ p.inbox <- honeybee.InboxMessage{
ID: p.url, URL: p.url,
Data: envelope.EncloseEvent([]byte("{}")), Data: envelope.EncloseEvent([]byte("{}")),
ReceivedAt: time.Now(), ReceivedAt: time.Now(),
} }
p.inbox <- honeybee.InboxMessage{ p.inbox <- honeybee.InboxMessage{
ID: "wss://other", URL: "wss://other",
Data: envelope.EncloseEvent([]byte("{}")), Data: envelope.EncloseEvent([]byte("{}")),
ReceivedAt: time.Now(), ReceivedAt: time.Now(),
} }
@@ -114,7 +114,7 @@ func TestEmbassy_DialFailed_Routing(t *testing.T) {
assert.Equal(t, EventDialFailed, got.Kind) assert.Equal(t, EventDialFailed, got.Kind)
assert.ErrorIs(t, got.Err, dialErr) assert.ErrorIs(t, got.Err, dialErr)
assert.Equal(t, p.url, got.ID) assert.Equal(t, p.url, got.URL)
}) })
t.Run("not routed to unrelated envoy subscriber", func(t *testing.T) { t.Run("not routed to unrelated envoy subscriber", func(t *testing.T) {
+4 -4
View File
@@ -75,7 +75,7 @@ func TestEnvoy_IsConnected(t *testing.T) {
}() }()
events <- PoolEvent{ events <- PoolEvent{
ID: url, Kind: EventConnected, At: time.Now()} URL: url, Kind: EventConnected, At: time.Now()}
Eventually(t, func() bool { Eventually(t, func() bool {
return envoy.IsConnected() return envoy.IsConnected()
@@ -101,7 +101,7 @@ func TestEnvoy_Events(t *testing.T) {
}() }()
events <- PoolEvent{ events <- PoolEvent{
ID: url, Kind: EventConnected, At: time.Now()} URL: url, Kind: EventConnected, At: time.Now()}
Eventually(t, func() bool { Eventually(t, func() bool {
mu.RLock() mu.RLock()
@@ -133,12 +133,12 @@ func TestEnvoy_Inbox(t *testing.T) {
}() }()
inbox <- InboxMessage{ inbox <- InboxMessage{
ID: url, URL: url,
Data: envelope.EncloseEvent([]byte("{}")), Data: envelope.EncloseEvent([]byte("{}")),
ReceivedAt: time.Now(), ReceivedAt: time.Now(),
} }
inbox <- InboxMessage{ inbox <- InboxMessage{
ID: url, URL: url,
Data: envelope.EncloseOK("id", true, "ok"), Data: envelope.EncloseOK("id", true, "ok"),
ReceivedAt: time.Now(), ReceivedAt: time.Now(),
} }
+4 -4
View File
@@ -87,22 +87,22 @@ func newMockPool(t *testing.T) *mockPool {
func (p *mockPool) connect() { func (p *mockPool) connect() {
p.events <- honeybee.PoolEvent{ p.events <- honeybee.PoolEvent{
ID: p.url, Kind: honeybee.EventConnected, At: time.Now()} URL: p.url, Kind: honeybee.EventConnected, At: time.Now()}
} }
func (p *mockPool) disconnect() { func (p *mockPool) disconnect() {
p.events <- honeybee.PoolEvent{ p.events <- honeybee.PoolEvent{
ID: p.url, Kind: honeybee.EventDisconnected, At: time.Now()} URL: p.url, Kind: honeybee.EventDisconnected, At: time.Now()}
} }
func (p *mockPool) dialFail(err error) { func (p *mockPool) dialFail(err error) {
p.events <- honeybee.PoolEvent{ p.events <- honeybee.PoolEvent{
ID: p.url, Kind: honeybee.EventDialFailed, Err: err, At: time.Now()} URL: p.url, Kind: honeybee.EventDialFailed, Err: err, At: time.Now()}
} }
func (p *mockPool) receive(data []byte) { func (p *mockPool) receive(data []byte) {
p.inbox <- honeybee.InboxMessage{ p.inbox <- honeybee.InboxMessage{
ID: p.url, URL: p.url,
Data: data, Data: data,
ReceivedAt: time.Now(), ReceivedAt: time.Now(),
} }
+3 -3
View File
@@ -14,7 +14,7 @@ type NoticeReceived struct {
} }
type Notice struct { type Notice struct {
PeerID string Peer string
Message string Message string
Timestamp time.Time Timestamp time.Time
} }
@@ -62,11 +62,11 @@ func (h *NoticeHandler) route() {
} }
now := time.Now() now := time.Now()
h.notices <- Notice{ h.notices <- Notice{
PeerID: msg.ID, Peer: msg.URL,
Message: message, Message: message,
Timestamp: now, Timestamp: now,
} }
h.envoy.Observer().Record(msg.ID, NoticeReceived{ h.envoy.Observer().Record(msg.URL, NoticeReceived{
Message: message, Message: message,
At: now, At: now,
}) })
+1 -1
View File
@@ -26,7 +26,7 @@ func TestNoticeHandler(t *testing.T) {
}, "notice not delivered") }, "notice not delivered")
assert.Equal(t, "hello", got.Message) assert.Equal(t, "hello", got.Message)
assert.Equal(t, p.url, got.PeerID) assert.Equal(t, p.url, got.Peer)
assert.False(t, got.Timestamp.IsZero()) assert.False(t, got.Timestamp.IsZero())
}) })
+5 -5
View File
@@ -103,7 +103,7 @@ func (p *EventPublisher) Publish(eventID string, eventJSON []byte, timeout time.
p.mu.Lock() p.mu.Lock()
p.deregister(eventID) p.deregister(eventID)
p.mu.Unlock() p.mu.Unlock()
p.envoy.Observer().Record(p.envoy.PeerID(), p.envoy.Observer().Record(p.envoy.URL(),
PublishTimeout{EventID: eventID, At: time.Now()}) PublishTimeout{EventID: eventID, At: time.Now()})
p.deliver(entry, publishResult{err: errors.New("publish timeout")}) p.deliver(entry, publishResult{err: errors.New("publish timeout")})
}) })
@@ -148,12 +148,12 @@ func (p *EventPublisher) trySend(entry *pendingEntry) error {
err := p.envoy.Send([]byte(envelope.EncloseEvent(entry.eventJSON))) err := p.envoy.Send([]byte(envelope.EncloseEvent(entry.eventJSON)))
if err != nil { if err != nil {
p.envoy.Observer().Record(p.envoy.PeerID(), p.envoy.Observer().Record(p.envoy.URL(),
PublishSendFailed{EventID: entry.eventID, Err: err, At: time.Now()}) PublishSendFailed{EventID: entry.eventID, Err: err, At: time.Now()})
return err return err
} }
entry.sent = true entry.sent = true
p.envoy.Observer().Record(p.envoy.PeerID(), p.envoy.Observer().Record(p.envoy.URL(),
PublishDispatched{EventID: entry.eventID, At: time.Now()}) PublishDispatched{EventID: entry.eventID, At: time.Now()})
return nil return nil
} }
@@ -188,10 +188,10 @@ func (p *EventPublisher) routeInbox() {
} }
if accepted { if accepted {
p.envoy.Observer().Record(msg.ID, p.envoy.Observer().Record(msg.URL,
PublishAccepted{EventID: eventID, At: time.Now()}) PublishAccepted{EventID: eventID, At: time.Now()})
} else { } else {
p.envoy.Observer().Record(msg.ID, p.envoy.Observer().Record(msg.URL,
PublishRejected{EventID: eventID, Message: message, At: time.Now()}) PublishRejected{EventID: eventID, Message: message, At: time.Now()})
} }
p.deliver(entry, publishResult{accepted: accepted, message: message}) p.deliver(entry, publishResult{accepted: accepted, message: message})
+28 -28
View File
@@ -18,13 +18,13 @@ import (
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
type ReqEvent struct { type ReqEvent struct {
PeerID string Peer string
ReceivedAt time.Time ReceivedAt time.Time
Data []byte Data []byte
} }
type ReqClosed struct { type ReqClosed struct {
PeerID string Peer string
ReceivedAt time.Time ReceivedAt time.Time
Data string Data string
} }
@@ -34,38 +34,38 @@ type ReqClosed struct {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
type ReqDispatched struct { type ReqDispatched struct {
SubID string ID string
DispatchedAt time.Time DispatchedAt time.Time
} }
type ReqSendFailed struct { type ReqSendFailed struct {
SubID string ID string
Err error Err error
At time.Time At time.Time
} }
type FirstEventReceived struct { type FirstEventReceived struct {
SubID string ID string
ReceivedAt time.Time ReceivedAt time.Time
} }
type StreamEOSEReceived struct { type StreamEOSEReceived struct {
SubID string ID string
ReceivedAt time.Time ReceivedAt time.Time
} }
type QueryEOSEReceived struct { type QueryEOSEReceived struct {
SubID string ID string
ReceivedAt time.Time ReceivedAt time.Time
} }
type MissedEOSE struct { type MissedEOSE struct {
SubID string ID string
At time.Time At time.Time
} }
type ClosedReceived struct { type ClosedReceived struct {
SubID string ID string
ReceivedAt time.Time ReceivedAt time.Time
Message string Message string
} }
@@ -259,8 +259,8 @@ func (m *RequestManager) Query(
return result, &cl, nil return result, &cl, nil
case <-ctx.Done(): case <-ctx.Done():
// query timed out // query timed out
m.observer.Record(m.envoy.PeerID(), m.observer.Record(m.envoy.URL(),
MissedEOSE{SubID: id, At: time.Now()}) MissedEOSE{ID: id, At: time.Now()})
if m.logger != nil { if m.logger != nil {
m.logger.Warn("missed eose", "req", id) m.logger.Warn("missed eose", "req", id)
} }
@@ -328,15 +328,15 @@ func (m *RequestManager) activate(req *request) {
go func() { go func() {
err := m.envoy.Send(envelope.EncloseReq(req.id, req.filters)) err := m.envoy.Send(envelope.EncloseReq(req.id, req.filters))
if err != nil { if err != nil {
m.observer.Record(m.envoy.PeerID(), m.observer.Record(m.envoy.URL(),
ReqSendFailed{SubID: req.id, Err: err, At: time.Now()}) ReqSendFailed{ID: req.id, Err: err, At: time.Now()})
if m.logger != nil { if m.logger != nil {
m.logger.Warn("req send failed", "req", req.id, "error", err) m.logger.Warn("req send failed", "req", req.id, "error", err)
} }
return return
} }
m.observer.Record(m.envoy.PeerID(), m.observer.Record(m.envoy.URL(),
ReqDispatched{SubID: req.id, DispatchedAt: time.Now()}) ReqDispatched{ID: req.id, DispatchedAt: time.Now()})
if m.logger != nil { if m.logger != nil {
m.logger.Debug("req sent", "req", req.id) m.logger.Debug("req sent", "req", req.id)
} }
@@ -424,13 +424,13 @@ func (m *RequestManager) routeEvent(msg InboxMessage) {
req.firstEventSeen = true req.firstEventSeen = true
reqSubID := req.id reqSubID := req.id
receivedAt := msg.ReceivedAt receivedAt := msg.ReceivedAt
go m.observer.Record(m.envoy.PeerID(), go m.observer.Record(m.envoy.URL(),
FirstEventReceived{SubID: reqSubID, ReceivedAt: receivedAt}) FirstEventReceived{ID: reqSubID, ReceivedAt: receivedAt})
} }
m.mu.Unlock() m.mu.Unlock()
req.buffer <- ReqEvent{ req.buffer <- ReqEvent{
PeerID: msg.ID, Peer: msg.URL,
ReceivedAt: msg.ReceivedAt, ReceivedAt: msg.ReceivedAt,
Data: event, Data: event,
} }
@@ -453,11 +453,11 @@ func (m *RequestManager) routeEOSE(msg InboxMessage) {
reqSubID := req.id reqSubID := req.id
receivedAt := msg.ReceivedAt receivedAt := msg.ReceivedAt
if req.isQuery { if req.isQuery {
go m.observer.Record(m.envoy.PeerID(), go m.observer.Record(m.envoy.URL(),
QueryEOSEReceived{SubID: reqSubID, ReceivedAt: receivedAt}) QueryEOSEReceived{ID: reqSubID, ReceivedAt: receivedAt})
} else { } else {
go m.observer.Record(m.envoy.PeerID(), go m.observer.Record(m.envoy.URL(),
StreamEOSEReceived{SubID: reqSubID, ReceivedAt: receivedAt}) StreamEOSEReceived{ID: reqSubID, ReceivedAt: receivedAt})
} }
if req.active && req.isQuery { if req.active && req.isQuery {
// manually cleanup query state // manually cleanup query state
@@ -493,9 +493,9 @@ func (m *RequestManager) routeClosed(msg InboxMessage) {
} }
reqSubID := req.id reqSubID := req.id
receivedAt := msg.ReceivedAt receivedAt := msg.ReceivedAt
go m.observer.Record(m.envoy.PeerID(), go m.observer.Record(m.envoy.URL(),
ClosedReceived{ ClosedReceived{
SubID: reqSubID, ID: reqSubID,
ReceivedAt: receivedAt, ReceivedAt: receivedAt,
Message: message, Message: message,
}) })
@@ -504,7 +504,7 @@ func (m *RequestManager) routeClosed(msg InboxMessage) {
} }
req.closedOnce.Do(func() { req.closedOnce.Do(func() {
req.closed <- ReqClosed{ req.closed <- ReqClosed{
PeerID: msg.ID, Peer: msg.URL,
ReceivedAt: msg.ReceivedAt, ReceivedAt: msg.ReceivedAt,
Data: message, Data: message,
} }
+6 -6
View File
@@ -111,7 +111,7 @@ func TestRequestManager_Stream(t *testing.T) {
return len(EventsOf[ReqDispatched](obs)) == 1 return len(EventsOf[ReqDispatched](obs)) == 1
}, "expected ReqDispatched observable") }, "expected ReqDispatched observable")
dispatched := EventsOf[ReqDispatched](obs) dispatched := EventsOf[ReqDispatched](obs)
assert.Equal(t, id, dispatched[0].SubID) assert.Equal(t, id, dispatched[0].ID)
}) })
t.Run("does not send req when disconnected", func(t *testing.T) { t.Run("does not send req when disconnected", func(t *testing.T) {
@@ -186,7 +186,7 @@ func TestRequestManager_Stream(t *testing.T) {
return len(EventsOf[FirstEventReceived](obs)) == 1 return len(EventsOf[FirstEventReceived](obs)) == 1
}, "expected FirstEventReceived observable") }, "expected FirstEventReceived observable")
first := EventsOf[FirstEventReceived](obs) first := EventsOf[FirstEventReceived](obs)
assert.Equal(t, id, first[0].SubID) assert.Equal(t, id, first[0].ID)
assert.False(t, first[0].ReceivedAt.IsZero()) assert.False(t, first[0].ReceivedAt.IsZero())
}) })
@@ -247,7 +247,7 @@ func TestRequestManager_Stream(t *testing.T) {
return len(EventsOf[StreamEOSEReceived](obs)) == 1 return len(EventsOf[StreamEOSEReceived](obs)) == 1
}, "expected StreamEOSEReceived observable") }, "expected StreamEOSEReceived observable")
eoseEvents := EventsOf[StreamEOSEReceived](obs) eoseEvents := EventsOf[StreamEOSEReceived](obs)
assert.Equal(t, id, eoseEvents[0].SubID) assert.Equal(t, id, eoseEvents[0].ID)
}) })
t.Run("closed deregisters and signals caller", func(t *testing.T) { t.Run("closed deregisters and signals caller", func(t *testing.T) {
@@ -289,7 +289,7 @@ func TestRequestManager_Stream(t *testing.T) {
return len(EventsOf[ClosedReceived](obs)) == 1 return len(EventsOf[ClosedReceived](obs)) == 1
}, "expected ClosedReceived observable") }, "expected ClosedReceived observable")
closedEvents := EventsOf[ClosedReceived](obs) closedEvents := EventsOf[ClosedReceived](obs)
assert.Equal(t, id, closedEvents[0].SubID) assert.Equal(t, id, closedEvents[0].ID)
assert.Equal(t, "error: test", closedEvents[0].Message) assert.Equal(t, "error: test", closedEvents[0].Message)
Eventually(t, func() bool { Eventually(t, func() bool {
@@ -342,7 +342,7 @@ func TestRequestManager_Stream(t *testing.T) {
return len(EventsOf[ReqSendFailed](obs)) >= 1 return len(EventsOf[ReqSendFailed](obs)) >= 1
}, "expected ReqSendFailed observable") }, "expected ReqSendFailed observable")
failed := EventsOf[ReqSendFailed](obs) failed := EventsOf[ReqSendFailed](obs)
assert.Equal(t, id, failed[0].SubID) assert.Equal(t, id, failed[0].ID)
assert.NotNil(t, failed[0].Err) assert.NotNil(t, failed[0].Err)
Never(t, func() bool { Never(t, func() bool {
@@ -486,7 +486,7 @@ func TestRequestManager_Query(t *testing.T) {
return len(EventsOf[QueryEOSEReceived](obs)) == 1 return len(EventsOf[QueryEOSEReceived](obs)) == 1
}, "expected QueryEOSEReceived observable") }, "expected QueryEOSEReceived observable")
qeose := EventsOf[QueryEOSEReceived](obs) qeose := EventsOf[QueryEOSEReceived](obs)
assert.Equal(t, querySubID, qeose[0].SubID) assert.Equal(t, querySubID, qeose[0].ID)
// CLOSE envelope should have been sent after EOSE // CLOSE envelope should have been sent after EOSE
var closeEnv []byte var closeEnv []byte