Skip to content

Commit c639456

Browse files
authored
feat(rx): add rx package, Close T-16 (#248)
1 parent e5118cb commit c639456

9 files changed

Lines changed: 1694 additions & 6 deletions

File tree

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ module github.com/yomorun/yomo
33
go 1.16
44

55
require (
6+
github.com/cenkalti/backoff/v4 v4.1.1
67
github.com/lucas-clemente/quic-go v0.22.1
8+
github.com/reactivex/rxgo/v2 v2.5.0
79
github.com/stretchr/testify v1.7.0
810
github.com/yomorun/y3 v1.0.4
911
go.uber.org/zap v1.19.0

go.sum

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx
1414
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
1515
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
1616
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
17+
github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
18+
github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ=
19+
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
1720
github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
1821
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
1922
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@@ -22,6 +25,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
2225
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2326
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2427
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
28+
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
29+
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
2530
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
2631
github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
2732
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -117,6 +122,8 @@ github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP
117122
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
118123
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
119124
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
125+
github.com/reactivex/rxgo/v2 v2.5.0 h1:FhPgHwX9vKdNQB2gq9EPt+EKk9QrrzoeztGbEEnZam4=
126+
github.com/reactivex/rxgo/v2 v2.5.0/go.mod h1:bs4fVZxcb5ZckLIOeIeVH942yunJLWDABWGbrHAW+qU=
120127
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
121128
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
122129
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
@@ -143,6 +150,7 @@ github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYED
143150
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
144151
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
145152
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
153+
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
146154
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
147155
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
148156
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -151,6 +159,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
151159
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
152160
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
153161
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
162+
github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775 h1:BLNsFR8l/hj/oGjnJXkd4Vi3s4kQD3/3x8HSAE4bzN0=
163+
github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775/go.mod h1:XUZ4x3oGhWfiOnUvTslnKKs39AWUct3g3yJvXTQSJOQ=
154164
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
155165
github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
156166
github.com/yomorun/y3 v1.0.4 h1:HsptwVCb12QBbSnuolbFn1YLdXOuF/tBFsGmKA5FsDk=
@@ -210,7 +220,9 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ
210220
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
211221
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
212222
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
223+
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
213224
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
225+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
214226
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
215227
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
216228
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=

rx/factory.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package rx
2+
3+
import (
4+
"context"
5+
6+
"github.com/reactivex/rxgo/v2"
7+
)
8+
9+
// Factory creates the rx.Stream from several sources.
10+
type Factory interface {
11+
// FromChannel creates a new Stream from a channel.
12+
FromChannel(ctx context.Context, channel chan interface{}) Stream
13+
14+
// FromItems creates a new Stream from items.
15+
FromItems(ctx context.Context, items []interface{}) Stream
16+
}
17+
18+
type factoryImpl struct {
19+
}
20+
21+
// NewFactory creates a new Rx factory.
22+
func NewFactory() Factory {
23+
return &factoryImpl{}
24+
}
25+
26+
// FromChannel creates a new Stream from a channel.
27+
func (fac *factoryImpl) FromChannel(ctx context.Context, channel chan interface{}) Stream {
28+
f := func(ctx context.Context, next chan rxgo.Item) {
29+
defer close(next)
30+
31+
for {
32+
select {
33+
case <-ctx.Done():
34+
return
35+
case item, ok := <-channel:
36+
if !ok {
37+
return
38+
}
39+
40+
switch item := item.(type) {
41+
default:
42+
Of(item).SendContext(ctx, next)
43+
case error:
44+
rxgo.Error(item).SendContext(ctx, next)
45+
}
46+
}
47+
}
48+
}
49+
return CreateObservable(ctx, f)
50+
}
51+
52+
// FromItems creates a new Stream from items.
53+
func (fac *factoryImpl) FromItems(ctx context.Context, items []interface{}) Stream {
54+
next := make(chan rxgo.Item)
55+
go func() {
56+
for _, item := range items {
57+
next <- Of(item)
58+
}
59+
}()
60+
61+
return ConvertObservable(ctx, rxgo.FromChannel(next))
62+
}

rx/runtime.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package rx
2+
3+
import (
4+
"context"
5+
6+
"github.com/yomorun/yomo"
7+
"github.com/yomorun/yomo/pkg/logger"
8+
)
9+
10+
// Runtime is the Stream Serverless Runtime for RxStream.
11+
type Runtime struct {
12+
rawBytesChan chan interface{}
13+
sfn yomo.StreamFunction
14+
stream Stream
15+
}
16+
17+
// NewRuntime creates a new Rx Stream Serverless Runtime.
18+
func NewRuntime(sfn yomo.StreamFunction) *Runtime {
19+
return &Runtime{
20+
rawBytesChan: make(chan interface{}),
21+
sfn: sfn,
22+
}
23+
}
24+
25+
// RawByteHandler is the Handler for RawBytes.
26+
func (r *Runtime) RawByteHandler(data []byte) (byte, []byte) {
27+
go func() {
28+
r.rawBytesChan <- data
29+
}()
30+
31+
// observe the data from RxStream.
32+
for item := range r.stream.Observe() {
33+
if item.Error() {
34+
logger.Errorf("[Rx Handler] Handler got an error, err=%v", item.E)
35+
continue
36+
}
37+
38+
if item.V == nil {
39+
logger.Warn("[Rx Handler] the returned data is nil.")
40+
continue
41+
}
42+
43+
data, ok := (item.V).(BytesWithDataID)
44+
if !ok {
45+
logger.Warn("[Rx Handler] the data is not a BytesWithDataID, won't send it to YoMo-Zipper.")
46+
continue
47+
}
48+
49+
logger.Infof("[RawByteHandler] Send data with [tag=%#x] to YoMo-Zipper.", data.DataID)
50+
return data.DataID, data.Bytes
51+
}
52+
53+
// return empty data by default, the new data from RxStream will be returned in `Pipe` function.
54+
return 0x0, nil
55+
}
56+
57+
// Pipe the RxHandler with RxStream.
58+
func (r *Runtime) Pipe(rxHandler func(rxstream Stream) Stream) {
59+
fac := NewFactory()
60+
// create a RxStream from raw bytes channel.
61+
rxstream := fac.FromChannel(context.Background(), r.rawBytesChan)
62+
63+
// run RxHandler and get a new RxStream.
64+
r.stream = rxHandler(rxstream)
65+
}

0 commit comments

Comments
 (0)