|
1 | 1 | package enats |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "strconv" |
5 | 4 | "strings" |
6 | | - |
7 | | - "get.pme.sh/pmesh/config" |
8 | | - "get.pme.sh/pmesh/xlog" |
9 | 5 | ) |
10 | 6 |
|
11 | | -var AnyCastMachineID = config.MachineID(0) |
12 | | -var remoteQueueName = "ev." + AnyCastMachineID.String() + "." |
13 | | -var localQueueName = "ev." + config.GetMachineID().String() + "." |
| 7 | +const ( |
| 8 | + userPrefix = "raw." |
| 9 | +) |
14 | 10 |
|
15 | 11 | // Given a nats subject, return the user-specified topic. |
16 | | -func ToTopic(subject string) (topic string, dest config.MachineID) { |
17 | | - dest = AnyCastMachineID |
| 12 | +func ToTopic(subject string) string { |
| 13 | + return strings.TrimPrefix(subject, EventStreamPrefix) |
| 14 | +} |
18 | 15 |
|
| 16 | +// Given a user-specified topic, return the subject names to use for NATS consumers/publishers. |
| 17 | +func ToSubject(topic string) string { |
19 | 18 | // User specified topic |
20 | | - if strings.HasPrefix(subject, "jet.") { |
21 | | - topic = strings.TrimPrefix(subject, "jet.") |
22 | | - return |
23 | | - } |
24 | | - |
25 | | - // Remote topic |
26 | | - if strings.HasPrefix(subject, remoteQueueName) { |
27 | | - topic = subject[len(remoteQueueName):] |
28 | | - return |
29 | | - } |
30 | | - |
31 | | - // Local topic |
32 | | - if strings.HasPrefix(subject, localQueueName) { |
33 | | - topic = subject[len(localQueueName):] |
34 | | - dest = config.GetMachineID() |
35 | | - return |
36 | | - } |
37 | | - |
38 | | - if strings.HasPrefix(subject, "ev.") { |
39 | | - if len(subject) <= len(remoteQueueName) || subject[len(remoteQueueName)-1] != '.' { |
40 | | - xlog.Warn().Str("subject", subject).Msg("Invalid subject") |
41 | | - return |
42 | | - } |
43 | | - |
44 | | - u64, err := strconv.ParseUint(subject[len("ev."):len(remoteQueueName)-1], 16, 32) |
45 | | - if err != nil { |
46 | | - xlog.Warn().Str("subject", subject).Err(err).Msg("Invalid subject") |
47 | | - return |
48 | | - } |
49 | | - |
50 | | - dest = config.MachineID(uint32(u64)) |
51 | | - topic = subject[len(remoteQueueName):] |
52 | | - return |
| 19 | + if subject, ok := strings.CutPrefix(topic, userPrefix); ok { |
| 20 | + topic = subject |
| 21 | + } else if !strings.HasPrefix(topic, EventStreamPrefix) { |
| 22 | + topic = EventStreamPrefix + topic |
53 | 23 | } |
54 | 24 |
|
55 | | - topic = subject |
56 | | - return |
57 | | -} |
58 | | - |
59 | | -// Given a user-specified topic, return the subject names to use for NATS consumers. |
60 | | -func ToConsumerSubjects(topic string) []string { |
| 25 | + // Wildcard |
61 | 26 | if strings.HasSuffix(topic, ".") { |
62 | 27 | topic += ">" |
63 | 28 | } |
64 | | - if strings.HasPrefix(topic, "jet.") { |
65 | | - return []string{strings.TrimPrefix(topic, "jet.")} |
66 | | - } |
67 | | - if strings.HasPrefix(topic, "$local.") { |
68 | | - return []string{localQueueName + strings.TrimPrefix(topic, "$local.")} |
69 | | - } |
70 | | - return []string{ |
71 | | - remoteQueueName + topic, |
72 | | - localQueueName + topic, |
73 | | - } |
74 | | -} |
75 | | - |
76 | | -// Given a user-specified topic, return the subject name to use for NATS publishers. |
77 | | -func ToPublisherSubject(topic string) string { |
78 | | - if strings.HasPrefix(topic, "jet.") { |
79 | | - return strings.TrimPrefix(topic, "jet.") |
80 | | - } else if !strings.HasPrefix(topic, "$local.") { |
81 | | - return remoteQueueName + topic |
82 | | - } else { |
83 | | - return localQueueName + strings.TrimPrefix(topic, "$local.") |
84 | | - } |
85 | | -} |
86 | | -func ToPublisherSubjectWithTarget(topic string, target config.MachineID) string { |
87 | | - if strings.HasPrefix(topic, "jet.") { |
88 | | - return strings.TrimPrefix(topic, "jet.") |
89 | | - } else { |
90 | | - return "ev." + config.GetMachineID().String() + "." + strings.TrimPrefix(topic, "$local.") |
91 | | - } |
| 29 | + return topic |
92 | 30 | } |
93 | 31 |
|
| 32 | +// Given a user-specified topic, return the queue name to use for NATS consumers. |
94 | 33 | func ToConsumerQueueName(pfx, topic string) string { |
95 | | - queue := strings.ReplaceAll(pfx+topic, ".", "-") |
96 | | - queue = strings.ReplaceAll(queue, "*", "all") |
97 | | - queue = strings.ReplaceAll(queue, ">", "matchall") |
| 34 | + queue := pfx + ToSubject(topic) |
| 35 | + queue = strings.ReplaceAll(queue, ".", "-") |
| 36 | + queue = strings.ReplaceAll(queue, "*", "any") |
| 37 | + queue = strings.ReplaceAll(queue, ">", "all") |
98 | 38 | return queue |
99 | 39 | } |
0 commit comments