Skip to content

Commit 33a1563

Browse files
committed
feat: removeHandler and byte based response
1 parent 7bf2f69 commit 33a1563

2 files changed

Lines changed: 39 additions & 12 deletions

File tree

pkg/layer2/layer2.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"context"
1111
"encoding/binary"
1212
"fmt"
13+
"reflect"
1314
"sync"
1415

1516
"github.com/ethersphere/bee/v2/pkg/log"
@@ -131,6 +132,19 @@ func (p *protocolService) AddHandler(handler msgHandler) {
131132
p.handlers = append(p.handlers, handler)
132133
}
133134

135+
func (p *protocolService) RemoveHandler(handler msgHandler) {
136+
p.mu.Lock()
137+
defer p.mu.Unlock()
138+
handlerValue := reflect.ValueOf(handler).Pointer()
139+
140+
for i, f := range p.handlers {
141+
if reflect.ValueOf(f).Pointer() == handlerValue {
142+
p.handlers = append(p.handlers[:i], p.handlers[i+1:]...)
143+
return
144+
}
145+
}
146+
}
147+
134148
// handler handles incoming messages from all connected peers and calls registered hook functions
135149
func (s *protocolService) handler(ctx context.Context, peer p2p.Peer, stream p2p.Stream) error {
136150
for {

pkg/layer2/ws.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package layer2
88

99
import (
1010
"context"
11+
"sync/atomic"
1112
"time"
1213

1314
"github.com/ethereum/go-ethereum/common"
@@ -41,23 +42,34 @@ func ListeningWs(ctx context.Context, conn *websocket.Conn, options WsOptions, l
4142
err error
4243
)
4344

45+
respMessageType := atomic.Uint32{} // 1 textbase, 2 bytebase
46+
respMessageType.Store(1)
47+
protocolListener := func(a swarm.Address, b []byte) {
48+
if respMessageType.Load() == 1 {
49+
space := byte(' ')
50+
msg := append([]byte{byte(atMsg + '0'), space}, ([]byte(a.String()))...)
51+
msg = append(msg, append([]byte{space}, b...)...)
52+
err := conn.WriteMessage(1, msg)
53+
if err != nil {
54+
logger.Error(err, "L2 ws write message")
55+
}
56+
} else {
57+
msg := append([]byte{byte(atMsg + '0')}, a.Bytes()...)
58+
msg = append(msg, b...)
59+
err := conn.WriteMessage(2, msg)
60+
if err != nil {
61+
logger.Error(err, "L2 ws write message")
62+
}
63+
}
64+
}
65+
66+
protocolService.AddHandler(protocolListener)
4467
conn.SetCloseHandler(func(code int, text string) error {
4568
logger.Debug("L2 ws: client gone", "protocol", protocolService.streamName, "code", code, "message", text)
46-
// TODO remove handler
69+
protocolService.RemoveHandler(protocolListener)
4770
return nil
4871
})
4972

50-
protocolService.AddHandler(func(a swarm.Address, b []byte) {
51-
space := byte(' ')
52-
msg := append([]byte{byte(atMsg + '0'), space}, ([]byte(a.String()))...)
53-
msg = append(msg, append([]byte{space}, b...)...)
54-
err := conn.WriteMessage(1, msg)
55-
if err != nil {
56-
logger.Error(err, "L2 ws write message")
57-
}
58-
// TODO messagetype 2
59-
})
60-
6173
go func() {
6274
for {
6375
err = conn.SetReadDeadline(time.Now().Add(readDeadline))
@@ -70,6 +82,7 @@ func ListeningWs(ctx context.Context, conn *websocket.Conn, options WsOptions, l
7082
logger.Error(err, "L2 ws read message")
7183
return
7284
}
85+
respMessageType.Store(uint32(messageType))
7386
if messageType == 1 {
7487
action := actionType(p[0] - '0')
7588
offset := 2 // + 1 delimeter

0 commit comments

Comments
 (0)