Skip to content

Commit f7de19a

Browse files
committed
Update JSONRPC to use attempt for better error messages
Also bump to version 0.2 and start a changelog
1 parent 3e074f7 commit f7de19a

File tree

1 file changed

+28
-21
lines changed

1 file changed

+28
-21
lines changed

M2/Macaulay2/packages/JSONRPC.m2

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,29 @@
1616

1717
newPackage("JSONRPC",
1818
Headline => "JSON-RPC server",
19-
Version => "0.1",
20-
Date => "May 19, 2025",
19+
Version => "0.2",
20+
Date => "December 8, 2025",
2121
Authors => {{
2222
Name => "Doug Torrance",
2323
Email => "dtorrance@piedmont.edu",
2424
HomePage => "https://webwork.piedmont.edu/~dtorrance"}},
2525
Keywords => {"System"},
2626
PackageImports => {"JSON"})
2727

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+
2842
export {
2943
-- classes
3044
"JSONRPCError",
@@ -139,17 +153,15 @@ callMethod(JSONRPCMethod, List, Thing) := (m, params, ID) -> (
139153
i -> if i >= #params then null else params#i)
140154
else params);
141155
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))
151163
else m#"server"#"logger" concatenate(
152-
"method \"", m#"name", "\" returned: ", toJSON r);
164+
"method \"", m#"name", "\" returned: ", toJSON r);
153165
makeResponse(m#"server", r, ID))
154166

155167
callMethod(JSONRPCMethod, HashTable, Thing) := (m, params, ID) -> (
@@ -383,21 +395,13 @@ doc ///
383395
data. This class ensures that errors are properly formatted according to
384396
the JSON-RPC 2.0 specification and can be easily included in responses to
385397
clients.
386-
387-
Consider the following example. The default response doesn't include a
388-
very useful error message.
389398
Example
390399
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
396400
registerMethod(server, "divide", (x, y) -> (
397401
if zero y then JSONRPCError(-32001, "division by zero")
398402
else x/y))
399403
handleRequest(server, makeRequest("divide", {1, 0}, 1))
400-
handleRequest(server, makeRequest("divide", {22, 7}, 1))
404+
handleRequest(server, makeRequest("divide", {22, 7}, 2))
401405
Text
402406
Note that the error codes -32000 to -32099 are reserved for use by
403407
JSON-RPC servers, so @CODE "errCode"@ should lie in this interval
@@ -650,6 +654,9 @@ assertJSONRPC = (request, expected) -> assert BinaryOperation(symbol ===,
650654
registerMethod(server, "foo", () -> JSONRPCError(1234, "bar"))
651655
assertJSONRPC("{\"jsonrpc\": \"2.0\", \"method\": \"foo\", \"id\": 1}",
652656
"{\"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}")
653660
///
654661

655662
TEST ///

0 commit comments

Comments
 (0)