|
16 | 16 |
|
17 | 17 | newPackage("JSONRPC", |
18 | 18 | Headline => "JSON-RPC server", |
19 | | - Version => "0.1", |
20 | | - Date => "May 19, 2025", |
| 19 | + Version => "0.2", |
| 20 | + Date => "December 8, 2025", |
21 | 21 | Authors => {{ |
22 | 22 | Name => "Doug Torrance", |
23 | 23 | Email => "dtorrance@piedmont.edu", |
24 | 24 | HomePage => "https://webwork.piedmont.edu/~dtorrance"}}, |
25 | 25 | Keywords => {"System"}, |
26 | 26 | PackageImports => {"JSON"}) |
27 | 27 |
|
| 28 | +--------------- |
| 29 | +-- ChangeLog -- |
| 30 | +--------------- |
| 31 | + |
| 32 | +-* |
| 33 | +
|
| 34 | +0.2 (2025-12-08, M2 1.26.05) |
| 35 | +* Use attempt for error messages |
| 36 | +
|
| 37 | +0.1 (2025-05-19, M2 1.25.11) |
| 38 | +* Initial release |
| 39 | +
|
| 40 | +*- |
| 41 | + |
28 | 42 | export { |
29 | 43 | -- classes |
30 | 44 | "JSONRPCError", |
@@ -139,17 +153,15 @@ callMethod(JSONRPCMethod, List, Thing) := (m, params, ID) -> ( |
139 | 153 | i -> if i >= #params then null else params#i) |
140 | 154 | else params); |
141 | 155 | if #inp == 1 then inp = inp#0; |
142 | | - r := (try m#"function" inp |
143 | | - -- TODO: use lastError here once it's available |
144 | | - -- afterwards, validate params and only throw this |
145 | | - -- error when they're bad |
146 | | - -- also update JSONRPCError doc node |
147 | | - else JSONRPCError(-32602, "Invalid params")); |
148 | | - if instance(r, JSONRPCError) |
149 | | - then m#"server"#"logger" concatenate( |
150 | | - "method \"", m#"name", "\" failed with error: ", toJSON r) |
| 156 | + -- TODO: validate params and throw the following if they're bad: |
| 157 | + -- JSONRPCError(-32602, "Invalid params") |
| 158 | + (r, err) := attempt m#"function" inp; |
| 159 | + if err =!= null then ( |
| 160 | + r = JSONRPCError(-32603, "Internal error: " | err#"message"); |
| 161 | + m#"server"#"logger" concatenate( |
| 162 | + "method \"", m#"name", "\" failed with error: ", toJSON r)) |
151 | 163 | else m#"server"#"logger" concatenate( |
152 | | - "method \"", m#"name", "\" returned: ", toJSON r); |
| 164 | + "method \"", m#"name", "\" returned: ", toJSON r); |
153 | 165 | makeResponse(m#"server", r, ID)) |
154 | 166 |
|
155 | 167 | callMethod(JSONRPCMethod, HashTable, Thing) := (m, params, ID) -> ( |
@@ -383,21 +395,13 @@ doc /// |
383 | 395 | data. This class ensures that errors are properly formatted according to |
384 | 396 | the JSON-RPC 2.0 specification and can be easily included in responses to |
385 | 397 | clients. |
386 | | - |
387 | | - Consider the following example. The default response doesn't include a |
388 | | - very useful error message. |
389 | 398 | Example |
390 | 399 | server = new JSONRPCServer |
391 | | - registerMethod(server, "divide", (x, y) -> x/y) |
392 | | - handleRequest(server, makeRequest("divide", {1, 0}, 1)) |
393 | | - Text |
394 | | - Let's replace it with a more useful one. |
395 | | - Example |
396 | 400 | registerMethod(server, "divide", (x, y) -> ( |
397 | 401 | if zero y then JSONRPCError(-32001, "division by zero") |
398 | 402 | else x/y)) |
399 | 403 | handleRequest(server, makeRequest("divide", {1, 0}, 1)) |
400 | | - handleRequest(server, makeRequest("divide", {22, 7}, 1)) |
| 404 | + handleRequest(server, makeRequest("divide", {22, 7}, 2)) |
401 | 405 | Text |
402 | 406 | Note that the error codes -32000 to -32099 are reserved for use by |
403 | 407 | JSON-RPC servers, so @CODE "errCode"@ should lie in this interval |
@@ -650,6 +654,9 @@ assertJSONRPC = (request, expected) -> assert BinaryOperation(symbol ===, |
650 | 654 | registerMethod(server, "foo", () -> JSONRPCError(1234, "bar")) |
651 | 655 | assertJSONRPC("{\"jsonrpc\": \"2.0\", \"method\": \"foo\", \"id\": 1}", |
652 | 656 | "{\"error\": {\"code\": 1234, \"message\": \"bar\"}, \"jsonrpc\": \"2.0\", \"id\": 1}") |
| 657 | +registerMethod(server, "divide", (x,y) -> x/y) |
| 658 | +assertJSONRPC("{\"jsonrpc\": \"2.0\", \"method\": \"divide\", \"params\": [1, 0], \"id\": 2}", |
| 659 | + "{\"error\": {\"code\": -32603, \"message\": \"Internal error: division by zero\"}, \"jsonrpc\": \"2.0\", \"id\": 2}") |
653 | 660 | /// |
654 | 661 |
|
655 | 662 | TEST /// |
|
0 commit comments