Skip to content

Commit 4618660

Browse files
authored
Support pluggable tube/runtime loader (#172)
Signed-off-by: Zike Yang <zike@apache.org>
1 parent d65f987 commit 4618660

File tree

5 files changed

+68
-61
lines changed

5 files changed

+68
-61
lines changed

fs/contube/contube.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,5 +139,7 @@ func (e *RecordImpl) GetPayload() []byte {
139139
}
140140

141141
func (e *RecordImpl) Commit() {
142-
e.commitFunc()
142+
if e.commitFunc != nil {
143+
e.commitFunc()
144+
}
143145
}

go.mod

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,17 @@ require (
99
github.com/emicklei/go-restful-openapi/v2 v2.9.2-0.20231020145053-a5b7d60bb267
1010
github.com/emicklei/go-restful/v3 v3.12.0
1111
github.com/go-openapi/spec v0.21.0
12-
github.com/gorilla/mux v1.8.1
1312
github.com/pkg/errors v0.9.1
1413
github.com/spf13/cobra v1.8.0
14+
github.com/spf13/viper v1.18.2
1515
github.com/stretchr/testify v1.9.0
1616
github.com/tetratelabs/wazero v1.6.0
1717
golang.org/x/net v0.22.0
1818
golang.org/x/time v0.5.0
1919
google.golang.org/grpc v1.61.1
2020
google.golang.org/protobuf v1.33.0
2121
gopkg.in/yaml.v3 v3.0.1
22+
k8s.io/utils v0.0.0-20240102154912-e7106e64919e
2223
)
2324

2425
require (
@@ -36,9 +37,7 @@ require (
3637
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
3738
github.com/danieljoos/wincred v1.2.1 // indirect
3839
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
39-
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
4040
github.com/dvsekhvalnov/jose2go v1.6.0 // indirect
41-
github.com/frankban/quicktest v1.14.6 // indirect
4241
github.com/fsnotify/fsnotify v1.7.0 // indirect
4342
github.com/getsentry/sentry-go v0.27.0 // indirect
4443
github.com/go-logr/logr v1.4.1 // indirect
@@ -85,7 +84,6 @@ require (
8584
github.com/spf13/afero v1.11.0 // indirect
8685
github.com/spf13/cast v1.6.0 // indirect
8786
github.com/spf13/pflag v1.0.5 // indirect
88-
github.com/spf13/viper v1.18.2 // indirect
8987
github.com/subosito/gotenv v1.6.0 // indirect
9088
go.uber.org/atomic v1.11.0 // indirect
9189
go.uber.org/multierr v1.9.0 // indirect
@@ -105,7 +103,6 @@ require (
105103
k8s.io/apimachinery v0.29.1 // indirect
106104
k8s.io/client-go v0.29.1 // indirect
107105
k8s.io/klog/v2 v2.120.1 // indirect
108-
k8s.io/utils v0.0.0-20240102154912-e7106e64919e // indirect
109106
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
110107
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
111108
sigs.k8s.io/yaml v1.4.0 // indirect

go.sum

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ github.com/AthenZ/athenz v1.11.50 h1:mCyQhI32GHPpPde9NVChI46hpRjw+vX1Z4RN8GCDILE
66
github.com/AthenZ/athenz v1.11.50/go.mod h1:HfKWur/iDpTKNb2TVaKKy4mt+Qa0PnZpIOqcmR9/i+Q=
77
github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
88
github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
9-
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
10-
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
119
github.com/apache/pulsar-client-go v0.12.0 h1:rrMlwpr6IgLRPXLRRh2vSlcw5tGV2PUSjZwmqgh2B2I=
1210
github.com/apache/pulsar-client-go v0.12.0/go.mod h1:dkutuH4oS2pXiGm+Ti7fQZ4MRjrMPZ8IJeEGAWMeckk=
1311
github.com/ardielle/ardielle-go v1.5.2 h1:TilHTpHIQJ27R1Tl/iITBzMwiUGSlVfiVhwDNGM3Zj4=
@@ -37,28 +35,20 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
3735
github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs=
3836
github.com/danieljoos/wincred v1.2.1/go.mod h1:uGaFL9fDn3OLTvzCGulzE+SzjEe5NGlh5FdCcyfPwps=
3937
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
40-
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4138
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4239
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
4340
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
44-
github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
45-
github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
4641
github.com/dimfeld/httptreemux v5.0.1+incompatible h1:Qj3gVcDNoOthBAqftuD596rm4wg/adLLz5xh5CmpiCA=
4742
github.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0=
4843
github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY=
4944
github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU=
50-
github.com/emicklei/go-restful-openapi/v2 v2.9.1 h1:Of8B1rXdG81il5TTiSY+9Qrh7pYOr8aLdynHIpvo7fM=
51-
github.com/emicklei/go-restful-openapi/v2 v2.9.1/go.mod h1:VKNgZyYviM1hnyrjD9RDzP2RuE94xTXxV+u6MGN4v4k=
5245
github.com/emicklei/go-restful-openapi/v2 v2.9.2-0.20231020145053-a5b7d60bb267 h1:9hKp1vLTq4I9hA/hhZHOUTNX8DGFdLsLMl9pHl9VJAA=
5346
github.com/emicklei/go-restful-openapi/v2 v2.9.2-0.20231020145053-a5b7d60bb267/go.mod h1:4CTuOXHFg3jkvCpnXN+Wkw5prVUnP8hIACssJTYorWo=
54-
github.com/emicklei/go-restful/v3 v3.7.3/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
5547
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
5648
github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk=
5749
github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
5850
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
5951
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
60-
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
61-
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
6252
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
6353
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
6454
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -71,11 +61,9 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34
7161
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
7262
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
7363
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
74-
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
7564
github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
7665
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
7766
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
78-
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
7967
github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
8068
github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
8169
github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
@@ -107,8 +95,6 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU
10795
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
10896
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
10997
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
110-
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
111-
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
11298
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU=
11399
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0=
114100
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
@@ -168,7 +154,6 @@ github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTw
168154
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
169155
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
170156
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
171-
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
172157
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
173158
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
174159
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -247,7 +232,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
247232
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
248233
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
249234
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
250-
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
251235
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
252236
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
253237
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
@@ -263,7 +247,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
263247
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
264248
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
265249
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
266-
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
267250
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
268251
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
269252
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -276,7 +259,6 @@ golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
276259
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
277260
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
278261
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
279-
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
280262
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
281263
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
282264
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=

server/config.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"github.com/functionstream/function-stream/common"
2121
"github.com/pkg/errors"
2222
"github.com/spf13/viper"
23-
"k8s.io/utils/set"
2423
"log/slog"
2524
"os"
2625
"strings"
@@ -52,7 +51,7 @@ func init() {
5251
viper.SetDefault("ListenAddr", "7300")
5352
}
5453

55-
func preprocessFactoriesConfig(n string, m map[string]*FactoryConfig, supportedTypes set.Set[string]) error {
54+
func preprocessFactoriesConfig(n string, m map[string]*FactoryConfig) error {
5655
for name, factory := range m {
5756
if ref := factory.Ref; ref != nil && *ref != "" {
5857
referred, ok := m[strings.ToLower(*ref)]
@@ -70,9 +69,6 @@ func preprocessFactoriesConfig(n string, m map[string]*FactoryConfig, supportedT
7069
if factory.Type == nil {
7170
return errors.Errorf("%s factory %s has no type", n, name)
7271
}
73-
if !supportedTypes.Has(strings.ToLower(*factory.Type)) {
74-
return errors.Errorf("%s factory %s has unsupported type %s", n, name, *factory.Type)
75-
}
7672
}
7773
return nil
7874
}
@@ -81,11 +77,11 @@ func (c *Config) preprocessConfig() error {
8177
if c.ListenAddr == "" {
8278
return errors.New("ListenAddr shouldn't be empty")
8379
}
84-
err := preprocessFactoriesConfig("Tube", c.TubeFactory, set.New[string](common.PulsarTubeType, common.MemoryTubeType))
80+
err := preprocessFactoriesConfig("Tube", c.TubeFactory)
8581
if err != nil {
8682
return err
8783
}
88-
return preprocessFactoriesConfig("Runtime", c.RuntimeFactory, set.New[string](WASMRuntime, GRPCRuntime))
84+
return preprocessFactoriesConfig("Runtime", c.RuntimeFactory)
8985
}
9086

9187
func loadConfig() (*Config, error) {

server/server.go

Lines changed: 60 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,27 @@ import (
3737
"time"
3838
)
3939

40+
var (
41+
ErrUnsupportedTRuntimeType = errors.New("unsupported runtime type")
42+
ErrUnsupportedTubeType = errors.New("unsupported tube type")
43+
)
44+
4045
type Server struct {
4146
options *serverOptions
4247
httpSvr atomic.Pointer[http.Server]
4348
log *slog.Logger
4449
Manager *fs.FunctionManager
4550
}
4651

52+
type TubeLoaderType func(c *FactoryConfig) (contube.TubeFactory, error)
53+
type RuntimeLoaderType func(c *FactoryConfig) (api.FunctionRuntimeFactory, error)
54+
4755
type serverOptions struct {
48-
httpListener net.Listener
49-
managerOpts []fs.ManagerOption
50-
httpTubeFact *contube.HttpTubeFactory
56+
httpListener net.Listener
57+
managerOpts []fs.ManagerOption
58+
httpTubeFact *contube.HttpTubeFactory
59+
tubeLoader TubeLoaderType
60+
runtimeLoader RuntimeLoaderType
5161
}
5262

5363
type ServerOption interface {
@@ -86,6 +96,24 @@ func WithHttpTubeFactory(factory *contube.HttpTubeFactory) ServerOption {
8696
})
8797
}
8898

99+
// WithTubeLoader sets the loader for the tube factory.
100+
// This must be called before WithConfig.
101+
func WithTubeLoader(loader TubeLoaderType) ServerOption {
102+
return serverOptionFunc(func(o *serverOptions) (*serverOptions, error) {
103+
o.tubeLoader = loader
104+
return o, nil
105+
})
106+
}
107+
108+
// WithRuntimeLoader sets the loader for the runtime factory.
109+
// This must be called before WithConfig.
110+
func WithRuntimeLoader(loader RuntimeLoaderType) ServerOption {
111+
return serverOptionFunc(func(o *serverOptions) (*serverOptions, error) {
112+
o.runtimeLoader = loader
113+
return o, nil
114+
})
115+
}
116+
89117
func getRefFactory(m map[string]*FactoryConfig, name string, visited set.Set[string]) (string, error) {
90118
if visited.Has(name) {
91119
return "", errors.Errorf("circular reference of factory %s", name)
@@ -101,7 +129,7 @@ func getRefFactory(m map[string]*FactoryConfig, name string, visited set.Set[str
101129
return name, nil
102130
}
103131

104-
func initFactories[T any](m map[string]*FactoryConfig, newFactory func(n string, c *FactoryConfig) (T, error), setup func(n string, f T)) error {
132+
func initFactories[T any](m map[string]*FactoryConfig, newFactory func(c *FactoryConfig) (T, error), setup func(n string, f T)) error {
105133
factoryMap := make(map[string]T)
106134

107135
for name := range m {
@@ -114,7 +142,10 @@ func initFactories[T any](m map[string]*FactoryConfig, newFactory func(n string,
114142
if !exist {
115143
return errors.Errorf("factory %s not found, which the factory %s is pointed to", refName, name)
116144
}
117-
f, err := newFactory(refName, fc)
145+
if fc.Type == nil {
146+
return errors.Errorf("factory %s type is not set", refName)
147+
}
148+
f, err := newFactory(fc)
118149
if err != nil {
119150
return err
120151
}
@@ -126,43 +157,40 @@ func initFactories[T any](m map[string]*FactoryConfig, newFactory func(n string,
126157
return nil
127158
}
128159

160+
func DefaultTubeLoader(c *FactoryConfig) (contube.TubeFactory, error) {
161+
switch strings.ToLower(*c.Type) {
162+
case common.PulsarTubeType:
163+
return contube.NewPulsarEventQueueFactory(context.Background(), contube.ConfigMap(*c.Config))
164+
case common.MemoryTubeType:
165+
return contube.NewMemoryQueueFactory(context.Background()), nil
166+
}
167+
return nil, errors.WithMessagef(ErrUnsupportedTubeType, "unsupported tube type :%s", *c.Type)
168+
}
169+
170+
func DefaultRuntimeLoader(c *FactoryConfig) (api.FunctionRuntimeFactory, error) {
171+
switch strings.ToLower(*c.Type) {
172+
case WASMRuntime:
173+
return wazero.NewWazeroFunctionRuntimeFactory(), nil
174+
}
175+
return nil, errors.WithMessagef(ErrUnsupportedTRuntimeType, "unsupported runtime type: %s", *c.Type)
176+
}
177+
129178
func WithConfig(config *Config) ServerOption {
130179
return serverOptionFunc(func(o *serverOptions) (*serverOptions, error) {
131180
ln, err := net.Listen("tcp", config.ListenAddr)
132181
if err != nil {
133182
return nil, err
134183
}
135184
o.httpListener = ln
136-
err = initFactories[contube.TubeFactory](config.TubeFactory, func(n string, c *FactoryConfig) (contube.TubeFactory, error) {
137-
if c.Type == nil {
138-
return nil, errors.Errorf("tube factory %s type is not set", n)
139-
}
140-
switch strings.ToLower(*c.Type) {
141-
case common.PulsarTubeType:
142-
return contube.NewPulsarEventQueueFactory(context.Background(), contube.ConfigMap(*c.Config))
143-
case common.MemoryTubeType:
144-
return contube.NewMemoryQueueFactory(context.Background()), nil
145-
}
146-
return nil, errors.Errorf("unsupported tube type %s", *c.Type)
147-
}, func(n string, f contube.TubeFactory) {
185+
err = initFactories[contube.TubeFactory](config.TubeFactory, o.tubeLoader, func(n string, f contube.TubeFactory) {
148186
o.managerOpts = append(o.managerOpts, fs.WithTubeFactory(n, f))
149187
})
150188
if err != nil {
151189
return nil, err
152190
}
153-
err = initFactories[api.FunctionRuntimeFactory](config.RuntimeFactory,
154-
func(n string, c *FactoryConfig) (api.FunctionRuntimeFactory, error) {
155-
if c.Type == nil {
156-
return nil, errors.Errorf("runtime factory %s type is not set", n)
157-
}
158-
switch strings.ToLower(*c.Type) {
159-
case WASMRuntime:
160-
return wazero.NewWazeroFunctionRuntimeFactory(), nil
161-
}
162-
return nil, errors.Errorf("unsupported runtime type %s", *c.Type)
163-
}, func(n string, f api.FunctionRuntimeFactory) {
164-
o.managerOpts = append(o.managerOpts, fs.WithRuntimeFactory(n, f))
165-
})
191+
err = initFactories[api.FunctionRuntimeFactory](config.RuntimeFactory, o.runtimeLoader, func(n string, f api.FunctionRuntimeFactory) {
192+
o.managerOpts = append(o.managerOpts, fs.WithRuntimeFactory(n, f))
193+
})
166194
if err != nil {
167195
return nil, err
168196
}
@@ -178,6 +206,8 @@ func NewServer(opts ...ServerOption) (*Server, error) {
178206
fs.WithTubeFactory("http", httpTubeFact),
179207
}
180208
options.httpTubeFact = httpTubeFact
209+
options.tubeLoader = DefaultTubeLoader
210+
options.runtimeLoader = DefaultRuntimeLoader
181211
for _, o := range opts {
182212
if o == nil {
183213
continue

0 commit comments

Comments
 (0)