Handle rate limit error in JSON-RPC mode

This commit is contained in:
AsamK 2023-11-05 16:20:33 +01:00
parent 8d423adb4d
commit 699b21f066
3 changed files with 25 additions and 14 deletions

View file

@ -115,7 +115,7 @@ public class Main {
case IOErrorException ioErrorException -> 3; case IOErrorException ioErrorException -> 3;
case UntrustedKeyErrorException untrustedKeyErrorException -> 4; case UntrustedKeyErrorException untrustedKeyErrorException -> 4;
case RateLimitErrorException rateLimitErrorException -> 5; case RateLimitErrorException rateLimitErrorException -> 5;
case null, default -> 2; case null -> 2;
}; };
} }
} }

View file

@ -1,6 +1,6 @@
package org.asamk.signal.commands.exceptions; package org.asamk.signal.commands.exceptions;
public class CommandException extends Exception { public sealed abstract class CommandException extends Exception permits IOErrorException, RateLimitErrorException, UnexpectedErrorException, UntrustedKeyErrorException, UserErrorException {
public CommandException(final String message) { public CommandException(final String message) {
super(message); super(message);

View file

@ -14,6 +14,8 @@ import org.asamk.signal.commands.JsonRpcRegistrationCommand;
import org.asamk.signal.commands.JsonRpcSingleCommand; import org.asamk.signal.commands.JsonRpcSingleCommand;
import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.CommandException;
import org.asamk.signal.commands.exceptions.IOErrorException; import org.asamk.signal.commands.exceptions.IOErrorException;
import org.asamk.signal.commands.exceptions.RateLimitErrorException;
import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
import org.asamk.signal.commands.exceptions.UntrustedKeyErrorException; import org.asamk.signal.commands.exceptions.UntrustedKeyErrorException;
import org.asamk.signal.commands.exceptions.UserErrorException; import org.asamk.signal.commands.exceptions.UserErrorException;
import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.Manager;
@ -35,6 +37,7 @@ public class SignalJsonRpcCommandHandler {
private static final int USER_ERROR = -1; private static final int USER_ERROR = -1;
private static final int IO_ERROR = -3; private static final int IO_ERROR = -3;
private static final int UNTRUSTED_KEY_ERROR = -4; private static final int UNTRUSTED_KEY_ERROR = -4;
private static final int RATELIMIT_ERROR = -5;
private final Manager m; private final Manager m;
private final MultiAccountManager c; private final MultiAccountManager c;
@ -211,18 +214,26 @@ public class SignalJsonRpcCommandHandler {
throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST, throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST,
e.getMessage(), e.getMessage(),
null)); null));
} catch (UserErrorException e) { } catch (CommandException ce) {
throw new JsonRpcException(new JsonRpcResponse.Error(USER_ERROR, switch (ce) {
e.getMessage(), case UserErrorException e -> throw new JsonRpcException(new JsonRpcResponse.Error(USER_ERROR,
getErrorDataNode(objectMapper, result))); e.getMessage(),
} catch (IOErrorException e) { getErrorDataNode(objectMapper, result)));
throw new JsonRpcException(new JsonRpcResponse.Error(IO_ERROR, case IOErrorException e -> throw new JsonRpcException(new JsonRpcResponse.Error(IO_ERROR,
e.getMessage(), e.getMessage(),
getErrorDataNode(objectMapper, result))); getErrorDataNode(objectMapper, result)));
} catch (UntrustedKeyErrorException e) { case UntrustedKeyErrorException e -> throw new JsonRpcException(new JsonRpcResponse.Error(
throw new JsonRpcException(new JsonRpcResponse.Error(UNTRUSTED_KEY_ERROR, UNTRUSTED_KEY_ERROR,
e.getMessage(), e.getMessage(),
getErrorDataNode(objectMapper, result))); getErrorDataNode(objectMapper, result)));
case RateLimitErrorException e -> throw new JsonRpcException(new JsonRpcResponse.Error(RATELIMIT_ERROR,
e.getMessage(),
getErrorDataNode(objectMapper, result)));
case UnexpectedErrorException e ->
throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INTERNAL_ERROR,
e.getMessage(),
getErrorDataNode(objectMapper, result)));
}
} catch (Throwable e) { } catch (Throwable e) {
logger.error("Command execution failed", e); logger.error("Command execution failed", e);
throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INTERNAL_ERROR, throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INTERNAL_ERROR,