fix: change JSON-RPC request ID type from u32 to i64 (#416)
The JSON-RPC 2.0 specification allows the ID field to be any JSON number, including negative integers and large values. The previous u32 implementation was limited to 0-4,294,967,295 and couldn't handle negative IDs. Changes: - Changed NumberOrString::Number from u32 to i64 to support full JSON number range - Updated deserializer to handle both signed and unsigned integers - Modified AtomicU32Provider to use AtomicU64 internally with i64 conversion - Fixed progress token handling in meta.rs for i64 values - Added comprehensive test for negative and large request IDs This ensures full compliance with the JSON-RPC 2.0 specification. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
parent
ccbd7f0674
commit
9105ba7963
1 changed files with 114 additions and 14 deletions
|
|
@ -116,9 +116,19 @@ impl Meta {
|
|||
pub fn get_progress_token(&self) -> Option<ProgressToken> {
|
||||
self.0.get(PROGRESS_TOKEN_FIELD).and_then(|v| match v {
|
||||
Value::String(s) => Some(ProgressToken(NumberOrString::String(s.to_string().into()))),
|
||||
Value::Number(n) => n
|
||||
.as_u64()
|
||||
.map(|n| ProgressToken(NumberOrString::Number(n as u32))),
|
||||
Value::Number(n) => {
|
||||
if let Some(i) = n.as_i64() {
|
||||
Some(ProgressToken(NumberOrString::Number(i)))
|
||||
} else if let Some(u) = n.as_u64() {
|
||||
if u <= i64::MAX as u64 {
|
||||
Some(ProgressToken(NumberOrString::Number(u as i64)))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue