@@ -33,13 +33,16 @@ import (
33
33
var cfg config.Config
34
34
var (
35
35
amqp_amqp = & cobra.Command {}
36
+ amqp_amqp091 = & cobra.Command {}
36
37
amqp_stomp = & cobra.Command {}
37
38
amqp_mqtt = & cobra.Command {}
38
39
stomp_stomp = & cobra.Command {}
39
40
stomp_amqp = & cobra.Command {}
41
+ stomp_amqp091 = & cobra.Command {}
40
42
stomp_mqtt = & cobra.Command {}
41
43
mqtt_mqtt = & cobra.Command {}
42
44
mqtt_amqp = & cobra.Command {}
45
+ mqtt_amqp091 = & cobra.Command {}
43
46
mqtt_stomp = & cobra.Command {}
44
47
amqp091_amqp091 = & cobra.Command {}
45
48
amqp091_amqp = & cobra.Command {}
53
56
amqpAppProperties []string
54
57
amqpAppPropertyFilters []string
55
58
amqpPropertyFilters []string
59
+ streamOffset string
56
60
)
57
61
58
62
var (
@@ -114,6 +118,9 @@ func RootCmd() *cobra.Command {
114
118
amqpConsumerFlags .StringArrayVar (& amqpPropertyFilters , "amqp-property-filter" , []string {},
115
119
"AMQP property filters, eg. key1=&p:prefix" )
116
120
121
+ amqp091PublisherFlags := pflag .NewFlagSet ("amqp091-publisher" , pflag .ContinueOnError )
122
+ amqp091ConsumerFlags := pflag .NewFlagSet ("amqp091-consumer" , pflag .ContinueOnError )
123
+
117
124
amqp_amqp = & cobra.Command {
118
125
Use : "amqp-amqp" ,
119
126
Aliases : []string {"amqp" },
@@ -126,6 +133,17 @@ func RootCmd() *cobra.Command {
126
133
amqp_amqp .Flags ().AddFlagSet (amqpPublisherFlags )
127
134
amqp_amqp .Flags ().AddFlagSet (amqpConsumerFlags )
128
135
136
+ amqp_amqp091 = & cobra.Command {
137
+ Use : "amqp-amqp091" ,
138
+ Run : func (cmd * cobra.Command , args []string ) {
139
+ cfg .PublisherProto = config .AMQP
140
+ cfg .ConsumerProto = config .AMQP091
141
+ start (cfg )
142
+ },
143
+ }
144
+ amqp_amqp .Flags ().AddFlagSet (amqpPublisherFlags )
145
+ amqp_amqp .Flags ().AddFlagSet (amqp091ConsumerFlags )
146
+
129
147
amqp_stomp = & cobra.Command {
130
148
Use : "amqp-stomp" ,
131
149
Run : func (cmd * cobra.Command , args []string ) {
@@ -167,6 +185,16 @@ func RootCmd() *cobra.Command {
167
185
}
168
186
stomp_amqp .Flags ().AddFlagSet (amqpConsumerFlags )
169
187
188
+ stomp_amqp091 = & cobra.Command {
189
+ Use : "stomp-amqp091" ,
190
+ Run : func (cmd * cobra.Command , args []string ) {
191
+ cfg .PublisherProto = config .STOMP
192
+ cfg .ConsumerProto = config .AMQP091
193
+ start (cfg )
194
+ },
195
+ }
196
+ stomp_amqp .Flags ().AddFlagSet (amqp091ConsumerFlags )
197
+
170
198
stomp_mqtt = & cobra.Command {
171
199
Use : "stomp-mqtt" ,
172
200
Run : func (cmd * cobra.Command , args []string ) {
@@ -200,6 +228,17 @@ func RootCmd() *cobra.Command {
200
228
mqtt_amqp .Flags ().AddFlagSet (mqttPublisherFlags )
201
229
mqtt_amqp .Flags ().AddFlagSet (amqpConsumerFlags )
202
230
231
+ mqtt_amqp091 = & cobra.Command {
232
+ Use : "mqtt-amqp091" ,
233
+ Run : func (cmd * cobra.Command , args []string ) {
234
+ cfg .PublisherProto = config .MQTT
235
+ cfg .ConsumerProto = config .AMQP091
236
+ start (cfg )
237
+ },
238
+ }
239
+ mqtt_amqp .Flags ().AddFlagSet (mqttPublisherFlags )
240
+ mqtt_amqp .Flags ().AddFlagSet (amqp091ConsumerFlags )
241
+
203
242
mqtt_stomp = & cobra.Command {
204
243
Use : "mqtt-stomp" ,
205
244
Run : func (cmd * cobra.Command , args []string ) {
@@ -219,6 +258,8 @@ func RootCmd() *cobra.Command {
219
258
start (cfg )
220
259
},
221
260
}
261
+ amqp091_amqp091 .Flags ().AddFlagSet (amqp091PublisherFlags )
262
+ amqp091_amqp091 .Flags ().AddFlagSet (amqp091ConsumerFlags )
222
263
223
264
amqp091_amqp = & cobra.Command {
224
265
Use : "amqp091-amqp" ,
@@ -228,6 +269,8 @@ func RootCmd() *cobra.Command {
228
269
start (cfg )
229
270
},
230
271
}
272
+ amqp091_amqp .Flags ().AddFlagSet (amqp091PublisherFlags )
273
+ amqp091_amqp .Flags ().AddFlagSet (amqpConsumerFlags )
231
274
232
275
amqp091_mqtt = & cobra.Command {
233
276
Use : "amqp091-mqtt" ,
@@ -237,6 +280,7 @@ func RootCmd() *cobra.Command {
237
280
start (cfg )
238
281
},
239
282
}
283
+ amqp091_mqtt .Flags ().AddFlagSet (amqp091PublisherFlags )
240
284
241
285
amqp091_stomp = & cobra.Command {
242
286
Use : "amqp091-stomp" ,
@@ -246,6 +290,7 @@ func RootCmd() *cobra.Command {
246
290
start (cfg )
247
291
},
248
292
}
293
+ amqp091_stomp .Flags ().AddFlagSet (amqp091PublisherFlags )
249
294
250
295
versionCmd = & cobra.Command {
251
296
Use : "version" ,
@@ -304,7 +349,7 @@ func RootCmd() *cobra.Command {
304
349
"The queue/topic/terminus to consume from (%d will be replaced with the consumer's id)" )
305
350
rootCmd .PersistentFlags ().StringVar (& cfg .ConsumerId , "consumer-id" , "omq-consumer-%d" ,
306
351
"Client ID for AMQP and MQTT consumers (%d => consumer's id, %r => random)" )
307
- rootCmd .PersistentFlags ().StringVar (& cfg . StreamOffset , "stream-offset" , "" ,
352
+ rootCmd .PersistentFlags ().StringVar (& streamOffset , "stream-offset" , "" ,
308
353
"Stream consumer offset specification (default=next)" )
309
354
rootCmd .PersistentFlags ().Int32Var (& cfg .ConsumerPriority , "consumer-priority" , 0 , "Consumer priority" )
310
355
rootCmd .PersistentFlags ().IntVar (& cfg .ConsumerCredits , "consumer-credits" , 1 ,
@@ -353,13 +398,16 @@ func RootCmd() *cobra.Command {
353
398
"The DNS name that will return members to synchronize with" )
354
399
355
400
rootCmd .AddCommand (amqp_amqp )
401
+ rootCmd .AddCommand (amqp_amqp091 )
356
402
rootCmd .AddCommand (amqp_stomp )
357
403
rootCmd .AddCommand (amqp_mqtt )
358
404
rootCmd .AddCommand (stomp_stomp )
359
405
rootCmd .AddCommand (stomp_amqp )
406
+ rootCmd .AddCommand (stomp_amqp091 )
360
407
rootCmd .AddCommand (stomp_mqtt )
361
408
rootCmd .AddCommand (mqtt_mqtt )
362
409
rootCmd .AddCommand (mqtt_amqp )
410
+ rootCmd .AddCommand (mqtt_amqp091 )
363
411
rootCmd .AddCommand (mqtt_stomp )
364
412
rootCmd .AddCommand (amqp091_amqp091 )
365
413
rootCmd .AddCommand (amqp091_amqp )
@@ -645,6 +693,12 @@ func sanitizeConfig(cfg *config.Config) error {
645
693
}
646
694
}
647
695
696
+ offset , err := parseStreamOffset (streamOffset )
697
+ if err != nil {
698
+ return fmt .Errorf ("invalid stream offset value" )
699
+ }
700
+ cfg .StreamOffset = offset
701
+
648
702
// AMQP application properties
649
703
cfg .Amqp .AppProperties = make (map [string ][]string )
650
704
for _ , val := range amqpAppProperties {
@@ -688,6 +742,26 @@ func sanitizeConfig(cfg *config.Config) error {
688
742
return nil
689
743
}
690
744
745
+ func parseStreamOffset (offset string ) (any , error ) {
746
+ switch offset {
747
+ case "" :
748
+ return "" , nil
749
+ case "next" , "first" , "last" :
750
+ return offset , nil
751
+ default :
752
+ // check if streamOffset can be parsed as unsigned integer (chunkID)
753
+ if chunkID , err := strconv .ParseInt (offset , 10 , 64 ); err == nil {
754
+ return chunkID , nil
755
+ }
756
+ // check if streamOffset can be parsed as an ISO 8601 timestamp
757
+ if timestamp , err := time .Parse (time .RFC3339 , offset ); err == nil {
758
+ return timestamp , nil
759
+ }
760
+ }
761
+ // return "", fmt.Errorf("invalid stream offset: %s", offset)
762
+ return offset , nil //, fmt.Errorf("invalid stream offset: %s", offset)
763
+ }
764
+
691
765
func handleInterupt (ctx context.Context , cancel context.CancelFunc ) {
692
766
go func () {
693
767
c := make (chan os.Signal , 1 )
0 commit comments