Skip to content

Commit 20b531e

Browse files
authored
feat: Support SubscribeTopicEvents API (#1088)
1 parent f9dfcaf commit 20b531e

File tree

10 files changed

+2345
-984
lines changed

10 files changed

+2345
-984
lines changed

demo/pubsub/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ You can run server/client demo with different component names.
22
It is worth noting that both server and client demo should set the same store name by param `-s`.
33
For example:
44
```shell
5-
cd ${project_path}/demo/pubsub/server/
5+
#################### Run pubsub demo with appcallback ####################
6+
cd ${project_path}/demo/pubsub/appcallback/
67
# 1. start subscriber
78
go build -o subscriber
89
/.subscriber -s pub_subs_demo

pkg/grpc/default_api/api.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ type api struct {
8686
// app callback
8787
AppCallbackConn *grpc.ClientConn
8888
topicPerComponent map[string]TopicSubscriptions
89+
streamer *streamer
8990
// json
9091
json jsoniter.API
9192
}
@@ -148,6 +149,7 @@ func NewAPI(
148149
secretStores: secretStores,
149150
json: jsoniter.ConfigFastest,
150151
}
152+
151153
}
152154

153155
func (a *api) SayHello(ctx context.Context, in *runtimev1pb.SayHelloRequest) (*runtimev1pb.SayHelloResponse, error) {

pkg/grpc/default_api/api_pubsub.go

Lines changed: 54 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -151,56 +151,23 @@ func (a *api) getInterestedTopics() (map[string]TopicSubscriptions, error) {
151151
}
152152

153153
func (a *api) publishMessageGRPC(ctx context.Context, msg *pubsub.NewMessage) error {
154-
// 1. Unmarshal to cloudEvent model
155-
var cloudEvent map[string]interface{}
156-
err := a.json.Unmarshal(msg.Data, &cloudEvent)
154+
155+
// TODO tracing
156+
envelope, cloudEvent, err := a.envelopeFromSubscriptionMessage(ctx, msg)
157+
157158
if err != nil {
158-
log.DefaultLogger.Debugf("[runtime]error deserializing cloud events proto: %s", err)
159159
return err
160160
}
161161

162-
// 2. Drop msg if the current cloud event has expired
163-
if pubsub.HasExpired(cloudEvent) {
164-
log.DefaultLogger.Warnf("[runtime]dropping expired pub/sub event %v as of %v", cloudEvent[pubsub.IDField].(string), cloudEvent[pubsub.ExpirationField].(string))
162+
if envelope == nil {
165163
return nil
166164
}
167165

168-
// 3. Convert to proto domain struct
169-
envelope := &runtimev1pb.TopicEventRequest{
170-
Id: cloudEvent[pubsub.IDField].(string),
171-
Source: cloudEvent[pubsub.SourceField].(string),
172-
DataContentType: cloudEvent[pubsub.DataContentTypeField].(string),
173-
Type: cloudEvent[pubsub.TypeField].(string),
174-
SpecVersion: cloudEvent[pubsub.SpecVersionField].(string),
175-
Topic: msg.Topic,
176-
PubsubName: msg.Metadata[Metadata_key_pubsubName],
177-
}
178-
179-
// set data field
180-
if data, ok := cloudEvent[pubsub.DataBase64Field]; ok && data != nil {
181-
decoded, decodeErr := base64.StdEncoding.DecodeString(data.(string))
182-
if decodeErr != nil {
183-
log.DefaultLogger.Debugf("unable to base64 decode cloudEvent field data_base64: %s", decodeErr)
184-
return err
185-
}
186-
187-
envelope.Data = decoded
188-
} else if data, ok := cloudEvent[pubsub.DataField]; ok && data != nil {
189-
envelope.Data = nil
190-
191-
if contenttype.IsStringContentType(envelope.DataContentType) {
192-
envelope.Data = []byte(data.(string))
193-
} else if contenttype.IsJSONContentType(envelope.DataContentType) {
194-
envelope.Data, _ = a.json.Marshal(data)
195-
}
196-
}
197-
// TODO tracing
198-
199-
// 4. Call appcallback
166+
// Call appcallback
200167
clientV1 := runtimev1pb.NewAppCallbackClient(a.AppCallbackConn)
201168
res, err := clientV1.OnTopicEvent(ctx, envelope)
202169

203-
// 5. Check result
170+
// Check result
204171
return retryStrategy(err, res, cloudEvent)
205172
}
206173

@@ -246,3 +213,50 @@ func listTopicSubscriptions(client runtimev1pb.AppCallbackClient, log log.ErrorL
246213
}
247214
return make([]*runtimev1pb.TopicSubscription, 0)
248215
}
216+
217+
func (a *api) envelopeFromSubscriptionMessage(ctx context.Context, msg *pubsub.NewMessage) (*runtimev1pb.TopicEventRequest, map[string]interface{}, error) {
218+
// 1. Unmarshal to cloudEvent model
219+
var cloudEvent map[string]interface{}
220+
err := a.json.Unmarshal(msg.Data, &cloudEvent)
221+
if err != nil {
222+
log.DefaultLogger.Debugf("[runtime]error deserializing cloud events proto: %s", err)
223+
return nil, cloudEvent, err
224+
}
225+
226+
// 2. Drop msg if the current cloud event has expired
227+
if pubsub.HasExpired(cloudEvent) {
228+
log.DefaultLogger.Warnf("[runtime]dropping expired pub/sub event %v as of %v", cloudEvent[pubsub.IDField].(string), cloudEvent[pubsub.ExpirationField].(string))
229+
return nil, cloudEvent, nil
230+
}
231+
232+
// 3. Convert to proto domain struct
233+
envelope := &runtimev1pb.TopicEventRequest{
234+
Id: cloudEvent[pubsub.IDField].(string),
235+
Source: cloudEvent[pubsub.SourceField].(string),
236+
DataContentType: cloudEvent[pubsub.DataContentTypeField].(string),
237+
Type: cloudEvent[pubsub.TypeField].(string),
238+
SpecVersion: cloudEvent[pubsub.SpecVersionField].(string),
239+
Topic: msg.Topic,
240+
PubsubName: msg.Metadata[Metadata_key_pubsubName],
241+
}
242+
243+
// set data field
244+
if data, ok := cloudEvent[pubsub.DataBase64Field]; ok && data != nil {
245+
decoded, decodeErr := base64.StdEncoding.DecodeString(data.(string))
246+
if decodeErr != nil {
247+
log.DefaultLogger.Debugf("unable to base64 decode cloudEvent field data_base64: %s", decodeErr)
248+
return nil, cloudEvent, err
249+
}
250+
251+
envelope.Data = decoded
252+
} else if data, ok := cloudEvent[pubsub.DataField]; ok && data != nil {
253+
envelope.Data = nil
254+
255+
if contenttype.IsStringContentType(envelope.DataContentType) {
256+
envelope.Data = []byte(data.(string))
257+
} else if contenttype.IsJSONContentType(envelope.DataContentType) {
258+
envelope.Data, _ = a.json.Marshal(data)
259+
}
260+
}
261+
return envelope, cloudEvent, nil
262+
}

0 commit comments

Comments
 (0)