@@ -3,7 +3,6 @@ package gorums
3
3
import (
4
4
"context"
5
5
"fmt"
6
- "log"
7
6
"time"
8
7
9
8
"github.com/relab/gorums/ordering"
@@ -29,43 +28,32 @@ func BroadcastHandler[T RequestTypes, V iBroadcastStruct](impl implementationFun
29
28
defer srv .broadcastSrv .Unlock ()
30
29
req := in .Message .(T )
31
30
defer ctx .Release ()
32
- // guard:
33
- // - A broadcastID should be non-empty:
34
- // - Maybe the request should be unique? Remove duplicates of the same broadcast? <- Most likely no (up to the implementer)
35
- if err := srv .broadcastSrv .validateMessage (in ); err != nil {
36
- log .Fatalln (err , in .Metadata )
37
- return
38
- }
39
- // this does not work yet:
40
- //ctx.update(in.Metadata)
41
- // it is better if the client provide this data in the request:
42
- //if in.Metadata.BroadcastMsg.Sender == "client" && in.Metadata.BroadcastMsg.OriginAddr == "" {
43
- // p, _ := peer.FromContext(ctx)
44
- // in.Metadata.BroadcastMsg.OriginAddr = p.Addr.String()
45
- //}
46
- addOriginMethod (in .Metadata )
47
- broadcastMetadata := newBroadcastMetadata (in .Metadata )
48
- // the client can specify middleware, e.g. authentication, to return early.
49
- if err := srv .broadcastSrv .runMiddleware (broadcastMetadata ); err != nil {
50
- // return if any of the middlewares return an error
51
- return
52
- }
53
- //srv.broadcastSrv.b.reset()
54
- //srv.broadcastSrv.b.setMetadata(broadcastMetadata)
55
- // add the request as a client request
56
- srv .broadcastSrv .bNew .setMetadata (broadcastMetadata )
57
- srv .broadcastSrv .addClientRequest (in .Metadata , ctx , finished )
58
- impl (ctx , req , srv .broadcastSrv .bNew .(V ))
59
- //srv.broadcastSrv.determineBroadcast(broadcastMetadata)
60
- //// verify whether a server or a client sent the request
61
- if in .Metadata .BroadcastMsg .Sender == BroadcastClient {
62
- go srv .broadcastSrv .timeoutClientResponse (ctx , in , finished )
63
- // //SendMessage(ctx, finished, WrapMessage(in.Metadata, protoreflect.ProtoMessage(nil), nil))
64
- } /*else {
65
- // // server to server communication does not need response?
66
- // SendMessage(ctx, finished, WrapMessage(in.Metadata, protoreflect.ProtoMessage(nil), err))
67
- //}*/
68
- //srv.broadcastSrv.determineReturnToClient(ctx, in.Metadata.BroadcastMsg.GetBroadcastID())
31
+ doneChan := make (chan struct {})
32
+ go func () {
33
+ defer func () { close (doneChan ) }()
34
+ // guard:
35
+ // - A broadcastID should be non-empty:
36
+ // - Maybe the request should be unique? Remove duplicates of the same broadcast? <- Most likely no (up to the implementer)
37
+ if err := srv .broadcastSrv .validateMessage (in ); err != nil {
38
+ return
39
+ }
40
+ addOriginMethod (in .Metadata )
41
+ broadcastMetadata := newBroadcastMetadata (in .Metadata )
42
+ // the client can specify middleware, e.g. authentication, to return early.
43
+ if err := srv .broadcastSrv .runMiddleware (broadcastMetadata ); err != nil {
44
+ // return if any of the middlewares return an error
45
+ return
46
+ }
47
+ srv .broadcastSrv .bNew .setMetadata (broadcastMetadata )
48
+ // add the request as a client request
49
+ srv .broadcastSrv .addClientRequest (in .Metadata , ctx , finished )
50
+ impl (ctx , req , srv .broadcastSrv .bNew .(V ))
51
+ //// verify whether a server or a client sent the request
52
+ //if in.Metadata.BroadcastMsg.Sender == BroadcastClient {
53
+ // go srv.broadcastSrv.timeoutClientResponse(ctx, in, finished)
54
+ //}
55
+ }()
56
+ <- doneChan
69
57
}
70
58
}
71
59
0 commit comments