Skip to content

Commit bdc78cb

Browse files
authored
fix: change waitUntil from published to validated to avoid CI timeout
fix: change waitUntil from published to validated to avoid CI timeout
2 parents fd4e1e7 + dccbe6d commit bdc78cb

52 files changed

Lines changed: 516 additions & 318 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎CLAUDE.md‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,15 @@ Built on top of NATS (transport layer), mq9 adds store-first semantics and prior
109109

110110
```
111111
$mq9.AI.MAILBOX.CREATE PUB+reply create mailbox
112-
$mq9.AI.MAILBOX.MSG.{mail_id}.{priority} PUB send message
113-
$mq9.AI.MAILBOX.MSG.{mail_id}.* SUB subscribe (all priorities)
114-
$mq9.AI.MAILBOX.MSG.{mail_id}.{priority} SUB subscribe (one priority)
112+
$mq9.AI.MAILBOX.MSG.{mail_id} PUB/SUB send/receive default (normal) message
113+
$mq9.AI.MAILBOX.MSG.{mail_id}.{priority} PUB send urgent or critical message
114+
$mq9.AI.MAILBOX.MSG.{mail_id}.* SUB subscribe urgent+critical (excludes default normal)
115+
$mq9.AI.MAILBOX.MSG.{mail_id}.{priority} SUB subscribe one non-default priority
115116
$mq9.AI.MAILBOX.LIST.{mail_id} PUB+reply list messages snapshot (no payload)
116117
$mq9.AI.MAILBOX.DELETE.{mail_id}.{msg_id} PUB+reply delete one message
117118
```
118119

119-
Priority values: `high` / `normal` / `low`
120+
Priority values: `critical` (highest) / `urgent` / `normal` (default, no suffix)
120121

121122
### Key semantics
122123

@@ -229,7 +230,7 @@ Each language has a standalone project that imports the published SDK v0.3.5.
229230
All demos run the same scenario:
230231
1. Connect to `nats://localhost:4222`
231232
2. Create a private mailbox (TTL 60s)
232-
3. Send 3 messages (high / normal / low priority)
233+
3. Send 3 messages (critical / urgent / normal priority)
233234
4. Subscribe and print received messages
234235
5. List mailbox metadata, delete one message
235236
6. Create a public mailbox

‎README.md‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ mq9 gives every agent a durable mailbox. Messages persist until TTL expires —
1212
| Concept | Description |
1313
|---------|-------------|
1414
| **Mailbox** | Agent's address. Private (UUID) or public (user-defined name). TTL-driven, auto-cleaned. |
15-
| **Priority** | `high` / `normal` / `low`. Cross-priority ordering guaranteed by storage. |
15+
| **Priority** | `critical` / `urgent` / `normal` (default, no suffix). Cross-priority ordering guaranteed by storage. |
1616
| **Store-first** | Subscriber gets all non-expired messages on connect, then real-time going forward. |
1717
| **Queue group** | Multiple subscribers sharing a group receive each message exactly once. |
1818

@@ -21,7 +21,8 @@ mq9 gives every agent a durable mailbox. Messages persist until TTL expires —
2121
| Operation | Subject |
2222
|-----------|---------|
2323
| Create mailbox | `$mq9.AI.MAILBOX.CREATE` |
24-
| Send message | `$mq9.AI.MAILBOX.MSG.{mail_id}.{priority}` |
24+
| Send message (default) | `$mq9.AI.MAILBOX.MSG.{mail_id}` |
25+
| Send message (urgent/critical) | `$mq9.AI.MAILBOX.MSG.{mail_id}.{priority}` |
2526
| Subscribe | `$mq9.AI.MAILBOX.MSG.{mail_id}.*` |
2627
| List metadata | `$mq9.AI.MAILBOX.LIST.{mail_id}` |
2728
| Delete message | `$mq9.AI.MAILBOX.DELETE.{mail_id}.{msg_id}` |
@@ -34,12 +35,12 @@ Full spec: [docs/mq9-protocol.md](docs/mq9-protocol.md)
3435

3536
| Language | Package | Version | Install |
3637
|----------|---------|---------|---------|
37-
| Python | `robustmq` | 0.3.5 | `pip install robustmq` |
38-
| Go | `github.com/robustmq/robustmq-sdk/go` | v0.3.5 | `go get github.com/robustmq/robustmq-sdk/go` |
39-
| JavaScript | `@robustmq/sdk` | 0.3.5 | `npm install @robustmq/sdk` |
40-
| Java | `com.robustmq:robustmq` | 0.3.5 | Maven / Gradle (see below) |
41-
| Rust | `robustmq` | 0.3.5 | `cargo add robustmq` |
42-
| C# | `RobustMQ` | 0.3.5 | `dotnet add package RobustMQ` |
38+
| Python | `robustmq` | 1.0.1 | `pip install robustmq` |
39+
| Go | `github.com/robustmq/robustmq-sdk/go` | v1.0.1 | `go get github.com/robustmq/robustmq-sdk/go` |
40+
| JavaScript | `@robustmq/sdk` | 1.0.1 | `npm install @robustmq/sdk` |
41+
| Java | `com.robustmq:robustmq` | 1.0.1 | Maven / Gradle (see below) |
42+
| Rust | `robustmq` | 1.0.1 | `cargo add robustmq` |
43+
| C# | `RobustMQ` | 1.0.1 | `dotnet add package RobustMQ` |
4344

4445
### Integrations
4546

@@ -99,7 +100,7 @@ await client.send(mailbox.mailId, "hello", "normal");
99100
<dependency>
100101
<groupId>com.robustmq</groupId>
101102
<artifactId>robustmq</artifactId>
102-
<version>0.3.5</version>
103+
<version>1.0.1</version>
103104
</dependency>
104105
```
105106
```java
@@ -113,7 +114,7 @@ client.send(mailbox.getMailId(), "hello".getBytes(), Priority.NORMAL).get();
113114

114115
**Java (Gradle)**
115116
```groovy
116-
implementation 'com.robustmq:robustmq:0.3.5'
117+
implementation 'com.robustmq:robustmq:1.0.1'
117118
```
118119

119120
**Rust**
@@ -201,7 +202,7 @@ Full examples: [demo/demo-langchain-mq9/](demo/demo-langchain-mq9/) · [demo/dem
201202

202203
Each demo is a standalone project that connects to `nats://demo.robustmq.com:4222` and runs the same scenario:
203204
1. Create a private mailbox (TTL 60s)
204-
2. Send 3 messages (high / normal / low priority)
205+
2. Send 3 messages (critical / urgent / normal priority)
205206
3. Subscribe and print received messages
206207
4. List mailbox metadata, delete one message
207208
5. Create a public mailbox
@@ -261,7 +262,7 @@ demo/
261262
demo-langchain-mq9/ # langchain-mq9 demo
262263
demo-multi-agent/ # cross-language multi-agent demo (Python + Go)
263264
demo-langgraph/ # LangGraph workflow demo
264-
VERSION # Canonical version (currently 0.3.5)
265+
VERSION # Canonical version (currently 1.0.1)
265266
```
266267

267268
---

‎VERSION‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.3.5
1+
1.0.1

‎csharp/RobustMQ.Mq9.Tests/MQ9ClientTests.cs‎

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -92,41 +92,42 @@ public async Task Create_ServerError_ThrowsMQ9Error()
9292
// ── send ──────────────────────────────────────────────────────────────────
9393

9494
[Fact]
95-
public async Task Send_PublishesCorrectSubject()
95+
public async Task Send_NormalPriority_UsesBareSubject()
9696
{
9797
var mock = Substitute.For<INatsConnection>();
9898
var client = ClientWithMock(mock);
9999

100100
await client.SendAsync("m-001", "hello"u8.ToArray(), Priority.Normal);
101101

102+
// normal uses bare subject (no suffix)
102103
await mock.Received(1).PublishAsync(
103-
"$mq9.AI.MAILBOX.MSG.m-001.normal",
104+
"$mq9.AI.MAILBOX.MSG.m-001",
104105
Arg.Any<byte[]>());
105106
}
106107

107108
[Fact]
108-
public async Task Send_HighPriority_CorrectSubject()
109+
public async Task Send_CriticalPriority_UsesSuffix()
109110
{
110111
var mock = Substitute.For<INatsConnection>();
111112
var client = ClientWithMock(mock);
112113

113-
await client.SendAsync("m-001", "urgent"u8.ToArray(), Priority.High);
114+
await client.SendAsync("m-001", "abort"u8.ToArray(), Priority.Critical);
114115

115116
await mock.Received(1).PublishAsync(
116-
"$mq9.AI.MAILBOX.MSG.m-001.high",
117+
"$mq9.AI.MAILBOX.MSG.m-001.critical",
117118
Arg.Any<byte[]>());
118119
}
119120

120121
[Fact]
121-
public async Task Send_LowPriority_CorrectSubject()
122+
public async Task Send_UrgentPriority_UsesSuffix()
122123
{
123124
var mock = Substitute.For<INatsConnection>();
124125
var client = ClientWithMock(mock);
125126

126-
await client.SendAsync("m-001", "bg"u8.ToArray(), Priority.Low);
127+
await client.SendAsync("m-001", "interrupt"u8.ToArray(), Priority.Urgent);
127128

128129
await mock.Received(1).PublishAsync(
129-
"$mq9.AI.MAILBOX.MSG.m-001.low",
130+
"$mq9.AI.MAILBOX.MSG.m-001.urgent",
130131
Arg.Any<byte[]>());
131132
}
132133

@@ -151,7 +152,7 @@ public async Task Subscribe_AllPriorities_UsesWildcardSubject()
151152
}
152153

153154
[Fact]
154-
public async Task Subscribe_SinglePriority_UsesSpecificSubject()
155+
public async Task Subscribe_CriticalPriority_UsesSuffixedSubject()
155156
{
156157
var mock = Substitute.For<INatsConnection>();
157158
var capturedSubject = "";
@@ -164,9 +165,29 @@ public async Task Subscribe_SinglePriority_UsesSpecificSubject()
164165
var client = ClientWithMock(mock);
165166

166167
await using var _ = await client.SubscribeAsync("m-001", async _ => await Task.CompletedTask,
167-
priority: Priority.High);
168+
priority: Priority.Critical);
168169

169-
Assert.Equal("$mq9.AI.MAILBOX.MSG.m-001.high", capturedSubject);
170+
Assert.Equal("$mq9.AI.MAILBOX.MSG.m-001.critical", capturedSubject);
171+
}
172+
173+
[Fact]
174+
public async Task Subscribe_NormalPriority_UsesBareSubject()
175+
{
176+
var mock = Substitute.For<INatsConnection>();
177+
var capturedSubject = "";
178+
mock.SubscribeCoreAsync<byte[]>(Arg.Any<string>(), cancellationToken: Arg.Any<CancellationToken>())
179+
.Returns(callInfo =>
180+
{
181+
capturedSubject = callInfo.ArgAt<string>(0);
182+
return ValueTask.FromResult(Substitute.For<INatsSub<byte[]>>());
183+
});
184+
var client = ClientWithMock(mock);
185+
186+
await using var _ = await client.SubscribeAsync("m-001", async _ => await Task.CompletedTask,
187+
priority: Priority.Normal);
188+
189+
// normal uses bare subject (no suffix)
190+
Assert.Equal("$mq9.AI.MAILBOX.MSG.m-001", capturedSubject);
170191
}
171192

172193
[Fact]
@@ -210,7 +231,7 @@ await Assert.ThrowsAsync<InvalidOperationException>(
210231
public async Task List_ReturnsMessageMeta()
211232
{
212233
var json = "{\"mail_id\":\"m-001\",\"messages\":[{\"msg_id\":\"x1\","
213-
+ "\"priority\":\"high\",\"ts\":100}]}";
234+
+ "\"priority\":\"critical\",\"ts\":100}]}";
214235

215236
var mock = Substitute.For<INatsConnection>();
216237
mock.RequestAsync<byte[], byte[]>(
@@ -223,7 +244,7 @@ public async Task List_ReturnsMessageMeta()
223244

224245
Assert.Single(metas);
225246
Assert.Equal("x1", metas[0].MsgId);
226-
Assert.Equal(Priority.High, metas[0].Priority);
247+
Assert.Equal(Priority.Critical, metas[0].Priority);
227248
Assert.Equal(100L, metas[0].Ts);
228249
}
229250

‎csharp/RobustMQ.Mq9/MQ9Client.cs‎

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ public async Task SendAsync(string mailId, byte[] payload,
8282
Priority priority = Priority.Normal)
8383
{
8484
EnsureConnected();
85-
var subject = $"{Prefix}.MAILBOX.MSG.{mailId}.{priority.ToSubjectString()}";
85+
var subject = priority == Priority.Normal
86+
? $"{Prefix}.MAILBOX.MSG.{mailId}"
87+
: $"{Prefix}.MAILBOX.MSG.{mailId}.{priority.ToSubjectString()}";
8688
await _nc!.PublishAsync(subject, payload);
8789
}
8890

@@ -96,7 +98,9 @@ public async Task<IAsyncDisposable> SubscribeAsync(
9698
{
9799
EnsureConnected();
98100
var subject = priority.HasValue
99-
? $"{Prefix}.MAILBOX.MSG.{mailId}.{priority.Value.ToSubjectString()}"
101+
? (priority.Value == Priority.Normal
102+
? $"{Prefix}.MAILBOX.MSG.{mailId}"
103+
: $"{Prefix}.MAILBOX.MSG.{mailId}.{priority.Value.ToSubjectString()}")
100104
: $"{Prefix}.MAILBOX.MSG.{mailId}.*";
101105

102106
var sub = string.IsNullOrEmpty(queueGroup)
@@ -182,9 +186,11 @@ private async Task<JsonNode> RequestAsync(string subject, JsonNode payload)
182186

183187
private static Mq9Message ParseIncoming(string mailId, string subject, byte[] data)
184188
{
185-
// Extract priority from last subject token
186-
var parts = subject.Split('.');
187-
var priorityStr = parts.Length > 0 ? parts[^1] : "normal";
189+
// Subject is bare $mq9.AI.MAILBOX.MSG.{mailId} (normal)
190+
// or $mq9.AI.MAILBOX.MSG.{mailId}.{urgent|critical}
191+
var msgBase = $"{Prefix}.MAILBOX.MSG.{mailId}";
192+
var suffix = subject.StartsWith(msgBase) ? subject[msgBase.Length..] : "";
193+
var priorityStr = suffix.StartsWith(".") ? suffix[1..] : "";
188194
var priority = PriorityExtensions.FromString(priorityStr);
189195

190196
try

‎csharp/RobustMQ.Mq9/Models.cs‎

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,24 @@ namespace RobustMQ.Mq9;
22

33
public enum Priority
44
{
5-
High,
6-
Normal,
7-
Low
5+
Critical,
6+
Urgent,
7+
Normal
88
}
99

1010
internal static class PriorityExtensions
1111
{
1212
public static string ToSubjectString(this Priority p) => p switch
1313
{
14-
Priority.High => "high",
15-
Priority.Normal => "normal",
16-
Priority.Low => "low",
14+
Priority.Critical => "critical",
15+
Priority.Urgent => "urgent",
1716
_ => "normal"
1817
};
1918

2019
public static Priority FromString(string s) => s switch
2120
{
22-
"high" => Priority.High,
23-
"low" => Priority.Low,
21+
"critical" => Priority.Critical,
22+
"urgent" => Priority.Urgent,
2423
_ => Priority.Normal
2524
};
2625
}

‎csharp/RobustMQ.Mq9/RobustMQ.Mq9.csproj‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<PackageId>RobustMQ</PackageId>
88
<RootNamespace>RobustMQ.Mq9</RootNamespace>
99
<AssemblyName>RobustMQ</AssemblyName>
10-
<Version>0.3.5</Version>
10+
<Version>1.0.1</Version>
1111
<Description>RobustMQ SDK — unified messaging for AI, IoT, and data pipelines</Description>
1212
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
1313
<PackageProjectUrl>https://github.com/robustmq/robustmq-sdk</PackageProjectUrl>

‎demo/demo-csharp/Program.cs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
Console.WriteLine($"[csharp] private mailbox: {mailbox.MailId}");
2020

2121
// 2. Send 3 messages with different priorities
22-
await client.SendAsync(mailbox.MailId, "urgent task"u8.ToArray(), Priority.High);
22+
await client.SendAsync(mailbox.MailId, "abort signal"u8.ToArray(), Priority.Critical);
23+
await client.SendAsync(mailbox.MailId, "urgent task"u8.ToArray(), Priority.Urgent);
2324
await client.SendAsync(mailbox.MailId, "normal task"u8.ToArray(), Priority.Normal);
24-
await client.SendAsync(mailbox.MailId, "background task"u8.ToArray(), Priority.Low);
25-
Console.WriteLine("[csharp] sent 3 messages (high / normal / low)");
25+
Console.WriteLine("[csharp] sent 3 messages (critical / urgent / normal)");
2626

2727
// 3. Subscribe and print received messages
2828
await using var sub = await client.SubscribeAsync(mailbox.MailId, async msg =>

‎demo/demo-csharp/demo-csharp.csproj‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="RobustMQ.Mq9" Version="0.3.5" />
11+
<PackageReference Include="RobustMQ.Mq9" Version="1.0.1" />
1212
</ItemGroup>
1313

1414
</Project>

‎demo/demo-go/main.go‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ func main() {
3333
fmt.Printf("[go] private mailbox: %s\n", mailbox.MailID)
3434

3535
// 2. Send 3 messages with different priorities
36-
_ = c.Send(mailbox.MailID, []byte("urgent task"), mq9.High)
36+
_ = c.Send(mailbox.MailID, []byte("abort signal"), mq9.Critical)
37+
_ = c.Send(mailbox.MailID, []byte("urgent task"), mq9.Urgent)
3738
_ = c.Send(mailbox.MailID, []byte("normal task"), mq9.Normal)
38-
_ = c.Send(mailbox.MailID, []byte("background task"), mq9.Low)
39-
fmt.Println("[go] sent 3 messages (high / normal / low)")
39+
fmt.Println("[go] sent 3 messages (critical / urgent / normal)")
4040

4141
// 3. Subscribe and print received messages
4242
sub, err := c.Subscribe(mailbox.MailID, func(msg *mq9.Message) {

0 commit comments

Comments
 (0)