From 09899429db20ed02dcd112c32da7f79847dd9a7a Mon Sep 17 00:00:00 2001 From: Mateusz Charytoniuk <mateusz.charytoniuk@protonmail.com> Date: Fri, 22 Mar 2024 20:20:59 +0100 Subject: [PATCH] chore: rename dm-rpc -> json-rpc --- README.md | 8 +- .../docs/features/websockets/protocols.md | 50 ++++++------ docs/pages/docs/features/websockets/server.md | 24 +++--- docs/pages/index.md | 6 +- .../index.md | 80 +++++++++---------- ...RPC.php => RespondsToWebSocketJsonRPC.php} | 6 +- .../{RPCMessage.php => JsonRPCMessage.php} | 6 +- ...idator.php => JsonRPCMessageValidator.php} | 14 ++-- ...terface.php => JsonRPCMethodInterface.php} | 2 +- ...hp => JsonRPCMethodValidatorInterface.php} | 6 +- ...tification.php => JsonRPCNotification.php} | 4 +- src/{RPCRequest.php => JsonRPCRequest.php} | 4 +- src/{RPCResponse.php => JsonRPCResponse.php} | 4 +- src/SingletonCollection.php | 2 +- ...ocketJsonRPCResponderAggregateProvider.php | 54 +++++++++++++ ...WebSocketRPCResponderAggregateProvider.php | 54 ------------- src/SiteAction.php | 2 +- ... WebSocketJsonRPCConnectionController.php} | 2 +- ...tJsonRPCConnectionControllerInterface.php} | 2 +- ...p => WebSocketJsonRPCConnectionHandle.php} | 18 ++--- ...nder.php => WebSocketJsonRPCResponder.php} | 8 +- .../LlamaCppSubjectActionPromptResponder.php | 18 ++--- .../ObservableTasksTableUpdateResponder.php | 16 ++-- ...=> WebSocketJsonRPCResponderAggregate.php} | 10 +-- ...=> WebSocketJsonRPCResponderInterface.php} | 10 +-- src/WebSocketProtocol.php | 2 +- ...ller.php => JsonRPCProtocolController.php} | 34 ++++---- .../UnexpectedNotification.php | 4 +- .../UnexpectedRequest.php | 4 +- src/WebSocketProtocolIteratorTest.php | 4 +- 30 files changed, 228 insertions(+), 230 deletions(-) rename src/Attribute/{RespondsToWebSocketRPC.php => RespondsToWebSocketJsonRPC.php} (58%) rename src/InputValidatedData/{RPCMessage.php => JsonRPCMessage.php} (67%) rename src/InputValidator/{RPCMessageValidator.php => JsonRPCMessageValidator.php} (73%) rename src/{RPCMethodInterface.php => JsonRPCMethodInterface.php} (77%) rename src/{RPCMethodValidatorInterface.php => JsonRPCMethodValidatorInterface.php} (55%) rename src/{RPCNotification.php => JsonRPCNotification.php} (81%) rename src/{RPCRequest.php => JsonRPCRequest.php} (80%) rename src/{RPCResponse.php => JsonRPCResponse.php} (79%) create mode 100644 src/SingletonProvider/WebSocketJsonRPCResponderAggregateProvider.php delete mode 100644 src/SingletonProvider/WebSocketRPCResponderAggregateProvider.php rename src/{WebSocketRPCConnectionController.php => WebSocketJsonRPCConnectionController.php} (63%) rename src/{WebSocketRPCConnectionControllerInterface.php => WebSocketJsonRPCConnectionControllerInterface.php} (86%) rename src/{WebSocketRPCConnectionHandle.php => WebSocketJsonRPCConnectionHandle.php} (79%) rename src/{WebSocketRPCResponder.php => WebSocketJsonRPCResponder.php} (80%) rename src/{WebSocketRPCResponder => WebSocketJsonRPCResponder}/LlamaCppSubjectActionPromptResponder.php (92%) rename src/{WebSocketRPCResponder => WebSocketJsonRPCResponder}/ObservableTasksTableUpdateResponder.php (77%) rename src/{WebSocketRPCResponderAggregate.php => WebSocketJsonRPCResponderAggregate.php} (62%) rename src/{WebSocketRPCResponderInterface.php => WebSocketJsonRPCResponderInterface.php} (73%) rename src/WebSocketProtocolController/{RPCProtocolController.php => JsonRPCProtocolController.php} (85%) diff --git a/README.md b/README.md index 520007af..6b323b41 100644 --- a/README.md +++ b/README.md @@ -55,9 +55,9 @@ You can set up all the asynchronous features using attributes. No elaborate configuration is needed. ```php -#[RespondsToWebSocketRPC(RPCMethod::Echo)] -#[Singleton(collection: SingletonCollection::WebSocketRPCResponder)] -final readonly class EchoResponder extends WebSocketRPCResponder +#[RespondsToWebSocketJsonRPC(JsonRPCMethod::Echo)] +#[Singleton(collection: SingletonCollection::WebSocketJsonRPCResponder)] +final readonly class EchoResponder extends WebSocketJsonJsonRPCResponder { public function getConstraint(): Constraint { @@ -69,7 +69,7 @@ final readonly class EchoResponder extends WebSocketRPCResponder WebSocketConnection $webSocketConnection, RPCRequest $rpcRequest, ): void { - $webSocketConnection->push(new RPCResponse( + $webSocketConnection->push(new JsonRPCResponse( $rpcRequest, $rpcRequest->payload, )); diff --git a/docs/pages/docs/features/websockets/protocols.md b/docs/pages/docs/features/websockets/protocols.md index 79763e44..523422d1 100644 --- a/docs/pages/docs/features/websockets/protocols.md +++ b/docs/pages/docs/features/websockets/protocols.md @@ -11,14 +11,14 @@ description: > # Protocols -## RPC +## Json RPC ```graphviz render digraph { Message -> WebSocketServerController - -> RPCProtocolController - -> WebSocketRPCResponder + -> JsonRPCProtocolController + -> WebSocketJsonRPCResponder ; } ``` @@ -34,7 +34,7 @@ const serverUrl = new URL('wss://localhost:9501'); serverUrl.searchParams.append('csrf', /* obtain CSRF token */); -const webSocket = new WebSocket(serverUrl, ['dm-rpc']); +const webSocket = new WebSocket(serverUrl, ['jsonrpc']); ``` For example, if you are using {{docs/features/templating/twig/index}}, you can @@ -53,31 +53,31 @@ serverUrl.searchParams.append( ); ``` -### Writing RPC Responders +### Writing Json RPC Responders ```php <?php -namespace App\WebSocketRPCResponder; +namespace App\WebSocketJsonRPCResponder; -use App\RPCMethod; -use Distantmagic\Resonance\Attribute\RespondsToWebSocketRPC; +use App\JsonRPCMethod; +use Distantmagic\Resonance\Attribute\RespondsToWebSocketJsonRPC; use Distantmagic\Resonance\Attribute\Singleton; use Distantmagic\Resonance\Attribute\WantsFeature; -use Distantmagic\Resonance\Feature; use Distantmagic\Resonance\Constraint; use Distantmagic\Resonance\Constraint\StringConstraint; -use Distantmagic\Resonance\RPCRequest; -use Distantmagic\Resonance\RPCResponse; +use Distantmagic\Resonance\Feature; +use Distantmagic\Resonance\JsonRPCRequest; +use Distantmagic\Resonance\JsonRPCResponse; use Distantmagic\Resonance\SingletonCollection; use Distantmagic\Resonance\WebSocketAuthResolution; use Distantmagic\Resonance\WebSocketConnection; -use Distantmagic\Resonance\WebSocketRPCResponder; +use Distantmagic\Resonance\WebSocketJsonRPCResponder; -#[RespondsToWebSocketRPC(RPCMethod::Echo)] -#[Singleton(collection: SingletonCollection::WebSocketRPCResponder)] +#[RespondsToWebSocketJsonRPC(JsonRPCMethod::Echo)] +#[Singleton(collection: SingletonCollection::WebSocketJsonRPCResponder)] #[WantsFeature(Feature::WebSocket)] -final readonly class EchoResponder extends WebSocketRPCResponder +final readonly class EchoResponder extends WebSocketJsonRPCResponder { public function getConstraint(): Constraint { @@ -87,9 +87,9 @@ final readonly class EchoResponder extends WebSocketRPCResponder public function onRequest( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCRequest $rpcRequest, + JsonRPCRequest $rpcRequest, ): void { - $webSocketConnection->push(new RPCResponse( + $webSocketConnection->push(new JsonRPCResponse( $rpcRequest, $rpcRequest->payload, )); @@ -101,12 +101,12 @@ final readonly class EchoResponder extends WebSocketRPCResponder In case you want not only respond to RPC messages, but also be able to push notifications to the client at any moment, you can implement -`Distantmagic\Resonance\WebSocketRPCConnectionControllerInterface` and +`Distantmagic\Resonance\WebSocketJsonRPCConnectionControllerInterface` and register in in the {{docs/features/dependency-injection/index}} container. For example: -```php file:app/WebSocketRPCConnectionController.php +```php file:app/WebSocketJsonRPCConnectionController.php <?php namespace App; @@ -114,14 +114,14 @@ namespace App; use Distantmagic\Resonance\Attribute\Singleton; use Distantmagic\Resonance\Attribute\WantsFeature; use Distantmagic\Resonance\Feature; -use Distantmagic\Resonance\RPCNotification; +use Distantmagic\Resonance\JsonRPCNotification; use Distantmagic\Resonance\WebSocketAuthResolution; use Distantmagic\Resonance\WebSocketConnection; -use Distantmagic\Resonance\WebSocketRPCConnectionControllerInterface; +use Distantmagic\Resonance\WebSocketJsonRPCConnectionControllerInterface; -#[Singleton(provides: WebSocketRPCConnectionControllerInterface::class)] +#[Singleton(provides: WebSocketJsonRPCConnectionControllerInterface::class)] #[WantsFeature(Feature::WebSocket)] -readonly class WebSocketRPCConnectionController implements WebSocketRPCConnectionControllerInterface +readonly class WebSocketJsonRPCConnectionController implements WebSocketJsonRPCConnectionControllerInterface { public function onClose( WebSocketAuthResolution $webSocketAuthResolution, @@ -139,8 +139,8 @@ readonly class WebSocketRPCConnectionController implements WebSocketRPCConnectio // connection is closed } - $webSocketConnection->push(new RPCNotification( - RPCMethod::YourMethod, + $webSocketConnection->push(new JsonRPCNotification( + JsonRPCMethod::YourMethod, [ // your payload ] diff --git a/docs/pages/docs/features/websockets/server.md b/docs/pages/docs/features/websockets/server.md index abbc69df..fe8e331b 100644 --- a/docs/pages/docs/features/websockets/server.md +++ b/docs/pages/docs/features/websockets/server.md @@ -24,18 +24,18 @@ However, they cannot share the same port if they are separated. ## Enabling the Server To enable WebSocket server you need to provide the -`RPCMethodValidatorInterface`. For example: +`JsonRPCMethodValidatorInterface`. For example: -```php file:app\RPCMethod.php +```php file:app\JsonRPCMethod.php <?php namespace App; use Distantmagic\Resonance\EnumValuesTrait; +use Distantmagic\Resonance\JsonRPCMethodInterface; use Distantmagic\Resonance\NameableEnumTrait; -use Distantmagic\Resonance\RPCMethodInterface; -enum RPCMethod: string implements RPCMethodInterface +enum JsonRPCMethod: string implements JsonRPCMethodInterface { use EnumValuesTrait; use NameableEnumTrait; @@ -49,7 +49,7 @@ Do not forget about `#[WantsFeature(Feature::WebSocket)` attribute. If added to any singleton, it tells Resonance to enable the WebSocket server. ::: -```php file:app\RPCMethodValidator.php +```php file:app\JsonRPCMethodValidator.php <?php namespace App; @@ -57,21 +57,21 @@ namespace App; use Distantmagic\Resonance\Attribute\Singleton; use Distantmagic\Resonance\Attribute\WantsFeature; use Distantmagic\Resonance\Feature; -use Distantmagic\Resonance\RPCMethodInterface; -use Distantmagic\Resonance\RPCMethodValidatorInterface; +use Distantmagic\Resonance\JsonRPCMethodInterface; +use Distantmagic\Resonance\JsonRPCMethodValidatorInterface; -#[Singleton(provides: RPCMethodValidatorInterface::class)] +#[Singleton(provides: JsonRPCMethodValidatorInterface::class)] #[WantsFeature(Feature::WebSocket)] -readonly class RPCMethodValidator implements RPCMethodValidatorInterface +readonly class JsonRPCMethodValidator implements JsonRPCMethodValidatorInterface { public function cases(): array { - return RPCMethod::cases(); + return JsonRPCMethod::cases(); } - public function castToRPCMethod(string $methodName): RPCMethodInterface + public function castToRPCMethod(string $methodName): JsonRPCMethodInterface { - return RPCMethod::from($methodName); + return JsonRPCMethod::from($methodName); } public function names(): array diff --git a/docs/pages/index.md b/docs/pages/index.md index ea8919bf..663aca8f 100644 --- a/docs/pages/index.md +++ b/docs/pages/index.md @@ -149,9 +149,9 @@ readonly class CatAdopt implements PromptSubjectResponderInterface class="language-php" data-controller="hljs" data-hljs-language-value="php" - >#[RespondsToWebSocketRPC(RPCMethod::Echo)] -#[Singleton(collection: SingletonCollection::WebSocketRPCResponder)] -final readonly class EchoResponder extends WebSocketRPCResponder + >#[RespondsToWebSocketJsonRPC(JsonRPCMethod::Echo)] +#[Singleton(collection: SingletonCollection::WebSocketJsonRPCResponder)] +final readonly class EchoResponder extends WebSocketJsonRPCResponder { public function getConstraint(): Constraint { diff --git a/docs/pages/tutorials/how-to-create-llm-websocket-chat-with-llama-cpp/index.md b/docs/pages/tutorials/how-to-create-llm-websocket-chat-with-llama-cpp/index.md index 4eaf93db..a02b430c 100644 --- a/docs/pages/tutorials/how-to-create-llm-websocket-chat-with-llama-cpp/index.md +++ b/docs/pages/tutorials/how-to-create-llm-websocket-chat-with-llama-cpp/index.md @@ -39,7 +39,7 @@ Once you have both Resonance and First, we must create a security gate and decide which users can use our chat. Let's say all authenticated users can do that: -```php file:app/SiteActionGate/StartWebSocketRPCConnectionGate.php +```php file:app/SiteActionGate/StartWebSocketJsonRPCConnectionGate.php <?php namespace App\SiteActionGate; @@ -52,9 +52,9 @@ use Distantmagic\Resonance\SingletonCollection; use Distantmagic\Resonance\SiteAction; use Distantmagic\Resonance\SiteActionGate; -#[DecidesSiteAction(SiteAction::StartWebSocketRPCConnection)] +#[DecidesSiteAction(SiteAction::StartWebSocketJsonRPCConnection)] #[Singleton(collection: SingletonCollection::SiteActionGate)] -final readonly class StartWebSocketRPCConnectionGate extends SiteActionGate +final readonly class StartWebSocketJsonRPCConnectionGate extends SiteActionGate { public function can(?AuthenticatedUser $authenticatedUser): bool { @@ -101,7 +101,7 @@ use Distantmagic\Resonance\TwigTemplate; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -#[Can(SiteAction::StartWebSocketRPCConnection)] +#[Can(SiteAction::StartWebSocketJsonRPCConnection)] #[RespondsToHttp( method: RequestMethod::GET, pattern: '/chat', @@ -136,9 +136,9 @@ Method, the first field, is validated against `RPCMethodInterface`, through namespace App; use Distantmagic\Resonance\EnumValuesTrait; -use Distantmagic\Resonance\RPCMethodInterface; +use Distantmagic\Resonance\JsonRPCMethodInterface; -enum RPCMethod: string implements RPCMethodInterface +enum JsonRPCMethod: string implements JsonRPCMethodInterface { use EnumValuesTrait; @@ -160,26 +160,26 @@ namespace App; use Distantmagic\Resonance\Attribute\Singleton; use Distantmagic\Resonance\Attribute\WantsFeature; use Distantmagic\Resonance\Feature; -use Distantmagic\Resonance\RPCMethodInterface; -use Distantmagic\Resonance\RPCMethodValidatorInterface; +use Distantmagic\Resonance\JsonRPCMethodInterface; +use Distantmagic\Resonance\JsonRPCMethodValidatorInterface; -#[Singleton(provides: RPCMethodValidatorInterface::class)] +#[Singleton(provides: JsonRPCMethodValidatorInterface::class)] #[WantsFeature(Feature::WebSocket)] -readonly class RPCMethodValidator implements RPCMethodValidatorInterface +readonly class JsonRPCMethodValidator implements JsonRPCMethodValidatorInterface { public function cases(): array { - return RPCMethod::cases(); + return JsonRPCMethod::cases(); } - public function castToRPCMethod(string $methodName): RPCMethodInterface + public function castToRPCMethod(string $methodName): JsonRPCMethodInterface { - return RPCMethod::from($methodName); + return JsonRPCMethod::from($methodName); } public function values(): array { - return RPCMethod::values(); + return JsonRPCMethod::values(); } } ``` @@ -196,33 +196,33 @@ It will then use `LlamaCppClient` to fetch tokens from [llama.cpp](https://github.com/ggerganov/llama.cpp) server and forward them to the WebSocket connection: -```php file:app/WebSocketRPCResponder/LlmChatPromptResponder.php +```php file:app/WebSocketJsonRPCResponder/LlmChatPromptResponder.php <?php -namespace App\WebSocketRPCResponder; +namespace App\WebSocketJsonRPCResponder; -use App\RPCMethod; -use Distantmagic\Resonance\Attribute\RespondsToWebSocketRPC; +use App\JsonRPCMethod; +use Distantmagic\Resonance\Attribute\RespondsToWebSocketJsonRPC; use Distantmagic\Resonance\Attribute\Singleton; use Distantmagic\Resonance\Attribute\WantsFeature; -use Distantmagic\Resonance\Feature; use Distantmagic\Resonance\Constraint; use Distantmagic\Resonance\Constraint\ObjectConstraint; use Distantmagic\Resonance\Constraint\StringConstraint; +use Distantmagic\Resonance\Feature; +use Distantmagic\Resonance\JsonRPCNotification; +use Distantmagic\Resonance\JsonRPCRequest; +use Distantmagic\Resonance\JsonRPCResponse; use Distantmagic\Resonance\LlamaCppClient; use Distantmagic\Resonance\LlamaCppCompletionRequest; -use Distantmagic\Resonance\RPCNotification; -use Distantmagic\Resonance\RPCRequest; -use Distantmagic\Resonance\RPCResponse; use Distantmagic\Resonance\SingletonCollection; use Distantmagic\Resonance\WebSocketAuthResolution; use Distantmagic\Resonance\WebSocketConnection; -use Distantmagic\Resonance\WebSocketRPCResponder; +use Distantmagic\Resonance\WebSocketJsonRPCResponder; -#[RespondsToWebSocketRPC(RPCMethod::LlmChatPrompt)] -#[Singleton(collection: SingletonCollection::WebSocketRPCResponder)] +#[RespondsToWebSocketJsonRPC(JsonRPCMethod::LlmChatPrompt)] +#[Singleton(collection: SingletonCollection::WebSocketJsonRPCResponder)] #[WantsFeature(Feature::WebSocket)] -final readonly class LlmChatPromptResponder extends WebSocketRPCResponder +final readonly class LlmChatPromptResponder extends WebSocketJsonRPCResponder { public function __construct( private LlamaCppClient $llamaCppClient, @@ -240,7 +240,7 @@ final readonly class LlmChatPromptResponder extends WebSocketRPCResponder public function onNotification( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCNotification $rpcNotification, + JsonRPCNotification $rpcNotification, ): void { $request = new LlamaCppCompletionRequest($rpcNotification->payload->prompt); @@ -248,8 +248,8 @@ final readonly class LlmChatPromptResponder extends WebSocketRPCResponder foreach ($completion as $token) { if ($webSocketConnection->status->isOpen()) { - $webSocketConnection->push(new RPCNotification( - RPCMethod::LlmToken, + $webSocketConnection->push(new JsonRPCNotification( + JsonRPCMethod::LlmToken, $token->content, )); } else { @@ -265,7 +265,7 @@ final readonly class LlmChatPromptResponder extends WebSocketRPCResponder [Stimulus](https://stimulus.hotwired.dev/) controller starts WebSocket connection and sends user prompts to the server. Not that WebSocket connection uses both {{docs/features/security/csrf-protection/index}} and -`dm-rpc` {{docs/features/websockets/protocols}}: +`jsonrpc` {{docs/features/websockets/protocols}}: ```typescript file:resources/ts/controller_llmchat.ts import { Controller } from "@hotwired/stimulus"; @@ -290,7 +290,7 @@ export class controller_llmchat extends Controller<HTMLElement> { servertUrl.searchParams.append("csrf", this.csrfTokenValue); - const webSocket = new WebSocket(servertUrl, ["dm-rpc"]); + const webSocket = new WebSocket(servertUrl, ["jsonrpc"]); webSocket.addEventListener("close", () => { this.webSocket = null; @@ -307,9 +307,7 @@ export class controller_llmchat extends Controller<HTMLElement> { const parsed: unknown = JSON.parse(evt.data); - if (Array.isArray(parsed) && "string" === typeof parsed[1]) { - this.chatLogTarget.append(parsed[1]); - } + this.chatLogTarget.append(parsed.result); }); } @@ -322,13 +320,13 @@ export class controller_llmchat extends Controller<HTMLElement> { this.chatLogTarget.innerHTML = ''; - this.webSocket?.send(JSON.stringify([ - "llm_chat_prompt", - { - prompt: this.userInputFieldTarget.value, - }, - null - ])); + this.webSocket?.send(JSON.stringify({ + jsonrpc: "2.0", + method: "llm_chat_prompt", + params: { + prompt: this.userInputFieldTarget.value, + } + })); this.userInputFieldTarget.value = ''; } diff --git a/src/Attribute/RespondsToWebSocketRPC.php b/src/Attribute/RespondsToWebSocketJsonRPC.php similarity index 58% rename from src/Attribute/RespondsToWebSocketRPC.php rename to src/Attribute/RespondsToWebSocketJsonRPC.php index 004d5eb0..dcff4ce8 100644 --- a/src/Attribute/RespondsToWebSocketRPC.php +++ b/src/Attribute/RespondsToWebSocketJsonRPC.php @@ -6,12 +6,12 @@ namespace Distantmagic\Resonance\Attribute; use Attribute; use Distantmagic\Resonance\Attribute as BaseAttribute; -use Distantmagic\Resonance\RPCMethodInterface; +use Distantmagic\Resonance\JsonRPCMethodInterface; #[Attribute(Attribute::TARGET_CLASS)] -final readonly class RespondsToWebSocketRPC extends BaseAttribute +final readonly class RespondsToWebSocketJsonRPC extends BaseAttribute { public function __construct( - public RPCMethodInterface $method, + public JsonRPCMethodInterface $method, ) {} } diff --git a/src/InputValidatedData/RPCMessage.php b/src/InputValidatedData/JsonRPCMessage.php similarity index 67% rename from src/InputValidatedData/RPCMessage.php rename to src/InputValidatedData/JsonRPCMessage.php index ee4a0937..6ede324a 100644 --- a/src/InputValidatedData/RPCMessage.php +++ b/src/InputValidatedData/JsonRPCMessage.php @@ -5,18 +5,18 @@ declare(strict_types=1); namespace Distantmagic\Resonance\InputValidatedData; use Distantmagic\Resonance\InputValidatedData; -use Distantmagic\Resonance\RPCMethodInterface; +use Distantmagic\Resonance\JsonRPCMethodInterface; /** * @template TPayload */ -readonly class RPCMessage extends InputValidatedData +readonly class JsonRPCMessage extends InputValidatedData { /** * @param TPayload $payload */ public function __construct( - public RPCMethodInterface $method, + public JsonRPCMethodInterface $method, public mixed $payload, public ?string $requestId, ) {} diff --git a/src/InputValidator/RPCMessageValidator.php b/src/InputValidator/JsonRPCMessageValidator.php similarity index 73% rename from src/InputValidator/RPCMessageValidator.php rename to src/InputValidator/JsonRPCMessageValidator.php index 49a731c4..953236ce 100644 --- a/src/InputValidator/RPCMessageValidator.php +++ b/src/InputValidator/JsonRPCMessageValidator.php @@ -12,13 +12,13 @@ use Distantmagic\Resonance\Constraint\EnumConstraint; use Distantmagic\Resonance\Constraint\StringConstraint; use Distantmagic\Resonance\Constraint\TupleConstraint; use Distantmagic\Resonance\Feature; -use Distantmagic\Resonance\InputValidatedData\RPCMessage; +use Distantmagic\Resonance\InputValidatedData\JsonRPCMessage; use Distantmagic\Resonance\InputValidator; -use Distantmagic\Resonance\RPCMethodValidatorInterface; +use Distantmagic\Resonance\JsonRPCMethodValidatorInterface; use Distantmagic\Resonance\SingletonCollection; /** - * @extends InputValidator<RPCMessage, array{ + * @extends InputValidator<JsonRPCMessage, array{ * 0: string, * 1: mixed, * 2: null|string, @@ -26,13 +26,13 @@ use Distantmagic\Resonance\SingletonCollection; */ #[GrantsFeature(Feature::WebSocket)] #[Singleton(collection: SingletonCollection::InputValidator)] -readonly class RPCMessageValidator extends InputValidator +readonly class JsonRPCMessageValidator extends InputValidator { - public function __construct(private RPCMethodValidatorInterface $rpcMethodValidator) {} + public function __construct(private JsonRPCMethodValidatorInterface $rpcMethodValidator) {} - public function castValidatedData(mixed $data): RPCMessage + public function castValidatedData(mixed $data): JsonRPCMessage { - return new RPCMessage( + return new JsonRPCMessage( $this->rpcMethodValidator->castToRPCMethod($data[0]), $data[1], $data[2], diff --git a/src/RPCMethodInterface.php b/src/JsonRPCMethodInterface.php similarity index 77% rename from src/RPCMethodInterface.php rename to src/JsonRPCMethodInterface.php index 2e1deb24..05baa42d 100644 --- a/src/RPCMethodInterface.php +++ b/src/JsonRPCMethodInterface.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace Distantmagic\Resonance; -interface RPCMethodInterface +interface JsonRPCMethodInterface { public function getValue(): string; } diff --git a/src/RPCMethodValidatorInterface.php b/src/JsonRPCMethodValidatorInterface.php similarity index 55% rename from src/RPCMethodValidatorInterface.php rename to src/JsonRPCMethodValidatorInterface.php index 1e8a3ea2..d310cfff 100644 --- a/src/RPCMethodValidatorInterface.php +++ b/src/JsonRPCMethodValidatorInterface.php @@ -4,14 +4,14 @@ declare(strict_types=1); namespace Distantmagic\Resonance; -interface RPCMethodValidatorInterface +interface JsonRPCMethodValidatorInterface { /** - * @return array<RPCMethodInterface> + * @return array<JsonRPCMethodInterface> */ public function cases(): array; - public function castToRPCMethod(string $methodName): RPCMethodInterface; + public function castToRPCMethod(string $methodName): JsonRPCMethodInterface; /** * @return array<string> diff --git a/src/RPCNotification.php b/src/JsonRPCNotification.php similarity index 81% rename from src/RPCNotification.php rename to src/JsonRPCNotification.php index e99f1eb6..c99fe2f9 100644 --- a/src/RPCNotification.php +++ b/src/JsonRPCNotification.php @@ -11,13 +11,13 @@ use Stringable; * * @template TPayload */ -readonly class RPCNotification implements Stringable +readonly class JsonRPCNotification implements Stringable { /** * @param TPayload $payload */ public function __construct( - public RPCMethodInterface $method, + public JsonRPCMethodInterface $method, public mixed $payload, ) {} diff --git a/src/RPCRequest.php b/src/JsonRPCRequest.php similarity index 80% rename from src/RPCRequest.php rename to src/JsonRPCRequest.php index 57b9bb4b..151f43e6 100644 --- a/src/RPCRequest.php +++ b/src/JsonRPCRequest.php @@ -9,13 +9,13 @@ namespace Distantmagic\Resonance; * * @template TPayload */ -readonly class RPCRequest +readonly class JsonRPCRequest { /** * @param TPayload $payload */ public function __construct( - public RPCMethodInterface $method, + public JsonRPCMethodInterface $method, public mixed $payload, public string $requestId, ) {} diff --git a/src/RPCResponse.php b/src/JsonRPCResponse.php similarity index 79% rename from src/RPCResponse.php rename to src/JsonRPCResponse.php index 15d1a8e9..c5dfe3f6 100644 --- a/src/RPCResponse.php +++ b/src/JsonRPCResponse.php @@ -6,10 +6,10 @@ namespace Distantmagic\Resonance; use Stringable; -readonly class RPCResponse implements Stringable +readonly class JsonRPCResponse implements Stringable { public function __construct( - private RPCRequest $rpcRequest, + private JsonRPCRequest $rpcRequest, private mixed $content, ) {} diff --git a/src/SingletonCollection.php b/src/SingletonCollection.php index 64b3f6ba..63356a3f 100644 --- a/src/SingletonCollection.php +++ b/src/SingletonCollection.php @@ -37,6 +37,6 @@ enum SingletonCollection implements SingletonCollectionInterface case TwigFilter; case TwigFunction; case TwigLoader; + case WebSocketJsonRPCResponder; case WebSocketProtocolController; - case WebSocketRPCResponder; } diff --git a/src/SingletonProvider/WebSocketJsonRPCResponderAggregateProvider.php b/src/SingletonProvider/WebSocketJsonRPCResponderAggregateProvider.php new file mode 100644 index 00000000..aa794cdc --- /dev/null +++ b/src/SingletonProvider/WebSocketJsonRPCResponderAggregateProvider.php @@ -0,0 +1,54 @@ +<?php + +declare(strict_types=1); + +namespace Distantmagic\Resonance\SingletonProvider; + +use Distantmagic\Resonance\Attribute\RequiresSingletonCollection; +use Distantmagic\Resonance\Attribute\RespondsToWebSocketJsonRPC; +use Distantmagic\Resonance\Attribute\Singleton; +use Distantmagic\Resonance\PHPProjectFiles; +use Distantmagic\Resonance\SingletonAttribute; +use Distantmagic\Resonance\SingletonCollection; +use Distantmagic\Resonance\SingletonContainer; +use Distantmagic\Resonance\SingletonProvider; +use Distantmagic\Resonance\WebSocketJsonRPCResponderAggregate; +use Distantmagic\Resonance\WebSocketJsonRPCResponderInterface; + +/** + * @template-extends SingletonProvider<WebSocketJsonRPCResponderAggregate> + */ +#[RequiresSingletonCollection(SingletonCollection::WebSocketJsonRPCResponder)] +#[Singleton(provides: WebSocketJsonRPCResponderAggregate::class)] +final readonly class WebSocketJsonRPCResponderAggregateProvider extends SingletonProvider +{ + public function provide(SingletonContainer $singletons, PHPProjectFiles $phpProjectFiles): WebSocketJsonRPCResponderAggregate + { + $webSocketJsonRPCResponderAggregate = new WebSocketJsonRPCResponderAggregate(); + + foreach ($this->collectWebSocketJsonRPCResponders($singletons) as $rpcResponderAttribute) { + $webSocketJsonRPCResponderAggregate->cachedConstraints->put( + $rpcResponderAttribute->singleton, + $rpcResponderAttribute->singleton->getConstraint(), + ); + $webSocketJsonRPCResponderAggregate->rpcResponders->put( + $rpcResponderAttribute->attribute->method, + $rpcResponderAttribute->singleton, + ); + } + + return $webSocketJsonRPCResponderAggregate; + } + + /** + * @return iterable<SingletonAttribute<WebSocketJsonRPCResponderInterface,RespondsToWebSocketJsonRPC>> + */ + private function collectWebSocketJsonRPCResponders(SingletonContainer $singletons): iterable + { + return $this->collectAttributes( + $singletons, + WebSocketJsonRPCResponderInterface::class, + RespondsToWebSocketJsonRPC::class, + ); + } +} diff --git a/src/SingletonProvider/WebSocketRPCResponderAggregateProvider.php b/src/SingletonProvider/WebSocketRPCResponderAggregateProvider.php deleted file mode 100644 index 611752ce..00000000 --- a/src/SingletonProvider/WebSocketRPCResponderAggregateProvider.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -declare(strict_types=1); - -namespace Distantmagic\Resonance\SingletonProvider; - -use Distantmagic\Resonance\Attribute\RequiresSingletonCollection; -use Distantmagic\Resonance\Attribute\RespondsToWebSocketRPC; -use Distantmagic\Resonance\Attribute\Singleton; -use Distantmagic\Resonance\PHPProjectFiles; -use Distantmagic\Resonance\SingletonAttribute; -use Distantmagic\Resonance\SingletonCollection; -use Distantmagic\Resonance\SingletonContainer; -use Distantmagic\Resonance\SingletonProvider; -use Distantmagic\Resonance\WebSocketRPCResponderAggregate; -use Distantmagic\Resonance\WebSocketRPCResponderInterface; - -/** - * @template-extends SingletonProvider<WebSocketRPCResponderAggregate> - */ -#[RequiresSingletonCollection(SingletonCollection::WebSocketRPCResponder)] -#[Singleton(provides: WebSocketRPCResponderAggregate::class)] -final readonly class WebSocketRPCResponderAggregateProvider extends SingletonProvider -{ - public function provide(SingletonContainer $singletons, PHPProjectFiles $phpProjectFiles): WebSocketRPCResponderAggregate - { - $webSocketRPCResponderAggregate = new WebSocketRPCResponderAggregate(); - - foreach ($this->collectWebSocketRPCResponders($singletons) as $rpcResponderAttribute) { - $webSocketRPCResponderAggregate->cachedConstraints->put( - $rpcResponderAttribute->singleton, - $rpcResponderAttribute->singleton->getConstraint(), - ); - $webSocketRPCResponderAggregate->rpcResponders->put( - $rpcResponderAttribute->attribute->method, - $rpcResponderAttribute->singleton, - ); - } - - return $webSocketRPCResponderAggregate; - } - - /** - * @return iterable<SingletonAttribute<WebSocketRPCResponderInterface,RespondsToWebSocketRPC>> - */ - private function collectWebSocketRPCResponders(SingletonContainer $singletons): iterable - { - return $this->collectAttributes( - $singletons, - WebSocketRPCResponderInterface::class, - RespondsToWebSocketRPC::class, - ); - } -} diff --git a/src/SiteAction.php b/src/SiteAction.php index 19cb2856..b076b752 100644 --- a/src/SiteAction.php +++ b/src/SiteAction.php @@ -8,7 +8,7 @@ enum SiteAction implements SiteActionInterface { use NameableEnumTrait; - case StartWebSocketRPCConnection; + case StartWebSocketJsonRPCConnection; case UseGraphQL; case UseOAuth2; } diff --git a/src/WebSocketRPCConnectionController.php b/src/WebSocketJsonRPCConnectionController.php similarity index 63% rename from src/WebSocketRPCConnectionController.php rename to src/WebSocketJsonRPCConnectionController.php index d4a55383..98f36700 100644 --- a/src/WebSocketRPCConnectionController.php +++ b/src/WebSocketJsonRPCConnectionController.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace Distantmagic\Resonance; -abstract readonly class WebSocketRPCConnectionController implements WebSocketRPCConnectionControllerInterface +abstract readonly class WebSocketJsonRPCConnectionController implements WebSocketJsonRPCConnectionControllerInterface { public function onClose(WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection): void {} } diff --git a/src/WebSocketRPCConnectionControllerInterface.php b/src/WebSocketJsonRPCConnectionControllerInterface.php similarity index 86% rename from src/WebSocketRPCConnectionControllerInterface.php rename to src/WebSocketJsonRPCConnectionControllerInterface.php index 3b2ac589..b5843e79 100644 --- a/src/WebSocketRPCConnectionControllerInterface.php +++ b/src/WebSocketJsonRPCConnectionControllerInterface.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace Distantmagic\Resonance; -interface WebSocketRPCConnectionControllerInterface +interface WebSocketJsonRPCConnectionControllerInterface { public function onClose( WebSocketAuthResolution $webSocketAuthResolution, diff --git a/src/WebSocketRPCConnectionHandle.php b/src/WebSocketJsonRPCConnectionHandle.php similarity index 79% rename from src/WebSocketRPCConnectionHandle.php rename to src/WebSocketJsonRPCConnectionHandle.php index 8e37283f..edd3164d 100644 --- a/src/WebSocketRPCConnectionHandle.php +++ b/src/WebSocketJsonRPCConnectionHandle.php @@ -4,18 +4,18 @@ declare(strict_types=1); namespace Distantmagic\Resonance; -use Distantmagic\Resonance\InputValidatedData\RPCMessage; +use Distantmagic\Resonance\InputValidatedData\JsonRPCMessage; use Ds\Set; -readonly class WebSocketRPCConnectionHandle +readonly class WebSocketJsonRPCConnectionHandle { /** - * @var Set<WebSocketRPCResponderInterface> + * @var Set<WebSocketJsonRPCResponderInterface> */ private Set $activeResponders; public function __construct( - public WebSocketRPCResponderAggregate $webSocketRPCResponderAggregate, + public WebSocketJsonRPCResponderAggregate $webSocketJsonRPCResponderAggregate, public WebSocketAuthResolution $webSocketAuthResolution, public WebSocketConnection $webSocketConnection, ) { @@ -36,15 +36,15 @@ readonly class WebSocketRPCConnectionHandle } } - public function onRPCMessage(RPCMessage $rpcMessage): ConstraintResult + public function onRPCMessage(JsonRPCMessage $rpcMessage): ConstraintResult { $responder = $this - ->webSocketRPCResponderAggregate + ->webSocketJsonRPCResponderAggregate ->selectResponder($rpcMessage) ; $constraintResult = $this - ->webSocketRPCResponderAggregate + ->webSocketJsonRPCResponderAggregate ->cachedConstraints ->get($responder) ->validate($rpcMessage->payload) @@ -65,7 +65,7 @@ readonly class WebSocketRPCConnectionHandle $responder->onRequest( $this->webSocketAuthResolution, $this->webSocketConnection, - new RPCRequest( + new JsonRPCRequest( $rpcMessage->method, $constraintResult->castedData, $rpcMessage->requestId, @@ -75,7 +75,7 @@ readonly class WebSocketRPCConnectionHandle $responder->onNotification( $this->webSocketAuthResolution, $this->webSocketConnection, - new RPCNotification( + new JsonRPCNotification( $rpcMessage->method, $constraintResult->castedData, ) diff --git a/src/WebSocketRPCResponder.php b/src/WebSocketJsonRPCResponder.php similarity index 80% rename from src/WebSocketRPCResponder.php rename to src/WebSocketJsonRPCResponder.php index 57880c39..b855e13c 100644 --- a/src/WebSocketRPCResponder.php +++ b/src/WebSocketJsonRPCResponder.php @@ -10,9 +10,9 @@ use Distantmagic\Resonance\WebSocketProtocolException\UnexpectedRequest; /** * @template TPayload * - * @template-implements WebSocketRPCResponderInterface<TPayload> + * @template-implements WebSocketJsonRPCResponderInterface<TPayload> */ -abstract readonly class WebSocketRPCResponder implements WebSocketRPCResponderInterface +abstract readonly class WebSocketJsonRPCResponder implements WebSocketJsonRPCResponderInterface { public function onBeforeMessage( WebSocketAuthResolution $webSocketAuthResolution, @@ -27,7 +27,7 @@ abstract readonly class WebSocketRPCResponder implements WebSocketRPCResponderIn public function onNotification( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCNotification $rpcNotification, + JsonRPCNotification $rpcNotification, ): void { throw new UnexpectedNotification($rpcNotification->method); } @@ -35,7 +35,7 @@ abstract readonly class WebSocketRPCResponder implements WebSocketRPCResponderIn public function onRequest( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCRequest $rpcRequest, + JsonRPCRequest $rpcRequest, ): void { throw new UnexpectedRequest($rpcRequest->method); } diff --git a/src/WebSocketRPCResponder/LlamaCppSubjectActionPromptResponder.php b/src/WebSocketJsonRPCResponder/LlamaCppSubjectActionPromptResponder.php similarity index 92% rename from src/WebSocketRPCResponder/LlamaCppSubjectActionPromptResponder.php rename to src/WebSocketJsonRPCResponder/LlamaCppSubjectActionPromptResponder.php index ef0f5304..1de9c946 100644 --- a/src/WebSocketRPCResponder/LlamaCppSubjectActionPromptResponder.php +++ b/src/WebSocketJsonRPCResponder/LlamaCppSubjectActionPromptResponder.php @@ -2,9 +2,10 @@ declare(strict_types=1); -namespace Distantmagic\Resonance\WebSocketRPCResponder; +namespace Distantmagic\Resonance\WebSocketJsonRPCResponder; use Distantmagic\Resonance\BackusNaurFormGrammar\SubjectActionGrammar; +use Distantmagic\Resonance\JsonRPCRequest; use Distantmagic\Resonance\LlamaCppClient; use Distantmagic\Resonance\LlamaCppCompletionIterator; use Distantmagic\Resonance\LlamaCppCompletionRequest; @@ -17,10 +18,9 @@ use Distantmagic\Resonance\ObservableTaskStatusUpdate; use Distantmagic\Resonance\ObservableTaskTable; use Distantmagic\Resonance\ObservableTaskTimeoutIterator; use Distantmagic\Resonance\PromptSubjectResponderAggregate; -use Distantmagic\Resonance\RPCRequest; use Distantmagic\Resonance\WebSocketAuthResolution; use Distantmagic\Resonance\WebSocketConnection; -use Distantmagic\Resonance\WebSocketRPCResponder; +use Distantmagic\Resonance\WebSocketJsonRPCResponder; use Generator; use Psr\Log\LoggerInterface; use WeakMap; @@ -28,9 +28,9 @@ use WeakMap; /** * @template TPayload * - * @template-extends WebSocketRPCResponder<TPayload> + * @template-extends WebSocketJsonRPCResponder<TPayload> */ -abstract readonly class LlamaCppSubjectActionPromptResponder extends WebSocketRPCResponder +abstract readonly class LlamaCppSubjectActionPromptResponder extends WebSocketJsonRPCResponder { /** * @var WeakMap<WebSocketConnection,LlamaCppCompletionIterator> @@ -45,7 +45,7 @@ abstract readonly class LlamaCppSubjectActionPromptResponder extends WebSocketRP abstract protected function onResponseChunk( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCRequest $rpcRequest, + JsonRPCRequest $rpcRequest, mixed $responseChunk, bool $isLastChunk, ): void; @@ -78,7 +78,7 @@ abstract readonly class LlamaCppSubjectActionPromptResponder extends WebSocketRP public function onRequest( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCRequest $rpcRequest, + JsonRPCRequest $rpcRequest, ): void { $this->observableTaskTable->observe(new ObservableTask( new ObservableTaskTimeoutIterator( @@ -105,14 +105,14 @@ abstract readonly class LlamaCppSubjectActionPromptResponder extends WebSocketRP } /** - * @param RPCRequest<TPayload> $rpcRequest + * @param JsonRPCRequest<TPayload> $rpcRequest * * @return Generator<ObservableTaskStatusUpdate> */ private function onObservableRequest( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCRequest $rpcRequest, + JsonRPCRequest $rpcRequest, ): Generator { $request = new LlamaCppCompletionRequest( backusNaurFormGrammar: $this->subjectActionGrammar, diff --git a/src/WebSocketRPCResponder/ObservableTasksTableUpdateResponder.php b/src/WebSocketJsonRPCResponder/ObservableTasksTableUpdateResponder.php similarity index 77% rename from src/WebSocketRPCResponder/ObservableTasksTableUpdateResponder.php rename to src/WebSocketJsonRPCResponder/ObservableTasksTableUpdateResponder.php index b38daff1..5d2002c1 100644 --- a/src/WebSocketRPCResponder/ObservableTasksTableUpdateResponder.php +++ b/src/WebSocketJsonRPCResponder/ObservableTasksTableUpdateResponder.php @@ -2,24 +2,24 @@ declare(strict_types=1); -namespace Distantmagic\Resonance\WebSocketRPCResponder; +namespace Distantmagic\Resonance\WebSocketJsonRPCResponder; use Distantmagic\Resonance\Constraint; use Distantmagic\Resonance\Constraint\ObjectConstraint; +use Distantmagic\Resonance\JsonRPCRequest; +use Distantmagic\Resonance\JsonRPCResponse; use Distantmagic\Resonance\ObservableTaskSlotStatusUpdate; use Distantmagic\Resonance\ObservableTaskTable; -use Distantmagic\Resonance\RPCRequest; -use Distantmagic\Resonance\RPCResponse; use Distantmagic\Resonance\WebSocketAuthResolution; use Distantmagic\Resonance\WebSocketConnection; -use Distantmagic\Resonance\WebSocketRPCResponder; +use Distantmagic\Resonance\WebSocketJsonRPCResponder; /** * @template TPayload * - * @template-extends WebSocketRPCResponder<TPayload> + * @template-extends WebSocketJsonRPCResponder<TPayload> */ -readonly class ObservableTasksTableUpdateResponder extends WebSocketRPCResponder +readonly class ObservableTasksTableUpdateResponder extends WebSocketJsonRPCResponder { public function __construct( private ObservableTaskTable $observableTaskTable, @@ -33,7 +33,7 @@ readonly class ObservableTasksTableUpdateResponder extends WebSocketRPCResponder public function onRequest( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCRequest $rpcRequest, + JsonRPCRequest $rpcRequest, ): void { $this->observableTaskTable->observers->add( static function (ObservableTaskSlotStatusUpdate $observableTaskSlotStatusUpdate) use ( @@ -44,7 +44,7 @@ readonly class ObservableTasksTableUpdateResponder extends WebSocketRPCResponder return false; } - return $webSocketConnection->push(new RPCResponse( + return $webSocketConnection->push(new JsonRPCResponse( rpcRequest: $rpcRequest, content: $observableTaskSlotStatusUpdate, )); diff --git a/src/WebSocketRPCResponderAggregate.php b/src/WebSocketJsonRPCResponderAggregate.php similarity index 62% rename from src/WebSocketRPCResponderAggregate.php rename to src/WebSocketJsonRPCResponderAggregate.php index 4208bb19..4c7245aa 100644 --- a/src/WebSocketRPCResponderAggregate.php +++ b/src/WebSocketJsonRPCResponderAggregate.php @@ -4,19 +4,19 @@ declare(strict_types=1); namespace Distantmagic\Resonance; -use Distantmagic\Resonance\InputValidatedData\RPCMessage; +use Distantmagic\Resonance\InputValidatedData\JsonRPCMessage; use DomainException; use Ds\Map; -readonly class WebSocketRPCResponderAggregate +readonly class WebSocketJsonRPCResponderAggregate { /** - * @var Map<WebSocketRPCResponderInterface,Constraint> + * @var Map<WebSocketJsonRPCResponderInterface,Constraint> */ public Map $cachedConstraints; /** - * @var Map<RPCMethodInterface,WebSocketRPCResponderInterface> $rpcResponders + * @var Map<JsonRPCMethodInterface,WebSocketJsonRPCResponderInterface> $rpcResponders */ public Map $rpcResponders; @@ -26,7 +26,7 @@ readonly class WebSocketRPCResponderAggregate $this->rpcResponders = new Map(); } - public function selectResponder(RPCMessage $rpcMessage): WebSocketRPCResponderInterface + public function selectResponder(JsonRPCMessage $rpcMessage): WebSocketJsonRPCResponderInterface { if (!$this->rpcResponders->hasKey($rpcMessage->method)) { throw new DomainException('There is no responder registered for RPC method: '.$rpcMessage->method->getValue()); diff --git a/src/WebSocketRPCResponderInterface.php b/src/WebSocketJsonRPCResponderInterface.php similarity index 73% rename from src/WebSocketRPCResponderInterface.php rename to src/WebSocketJsonRPCResponderInterface.php index 904a7454..48d2e462 100644 --- a/src/WebSocketRPCResponderInterface.php +++ b/src/WebSocketJsonRPCResponderInterface.php @@ -7,7 +7,7 @@ namespace Distantmagic\Resonance; /** * @template TPayload */ -interface WebSocketRPCResponderInterface extends ConstraintSourceInterface +interface WebSocketJsonRPCResponderInterface extends ConstraintSourceInterface { public function onBeforeMessage( WebSocketAuthResolution $webSocketAuthResolution, @@ -20,20 +20,20 @@ interface WebSocketRPCResponderInterface extends ConstraintSourceInterface ): void; /** - * @param RPCNotification<TPayload> $rpcNotification + * @param JsonRPCNotification<TPayload> $rpcNotification */ public function onNotification( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCNotification $rpcNotification, + JsonRPCNotification $rpcNotification, ): void; /** - * @param RPCRequest<TPayload> $rpcRequest + * @param JsonRPCRequest<TPayload> $rpcRequest */ public function onRequest( WebSocketAuthResolution $webSocketAuthResolution, WebSocketConnection $webSocketConnection, - RPCRequest $rpcRequest, + JsonRPCRequest $rpcRequest, ): void; } diff --git a/src/WebSocketProtocol.php b/src/WebSocketProtocol.php index f7528316..ce666d8c 100644 --- a/src/WebSocketProtocol.php +++ b/src/WebSocketProtocol.php @@ -6,5 +6,5 @@ namespace Distantmagic\Resonance; enum WebSocketProtocol: string { - case RPC = 'dm-rpc'; + case JsonRPC = 'jsonrpc'; } diff --git a/src/WebSocketProtocolController/RPCProtocolController.php b/src/WebSocketProtocolController/JsonRPCProtocolController.php similarity index 85% rename from src/WebSocketProtocolController/RPCProtocolController.php rename to src/WebSocketProtocolController/JsonRPCProtocolController.php index d7450c94..832415aa 100644 --- a/src/WebSocketProtocolController/RPCProtocolController.php +++ b/src/WebSocketProtocolController/JsonRPCProtocolController.php @@ -12,7 +12,7 @@ use Distantmagic\Resonance\ConstraintResultErrorMessage; use Distantmagic\Resonance\CSRFManager; use Distantmagic\Resonance\Feature; use Distantmagic\Resonance\Gatekeeper; -use Distantmagic\Resonance\InputValidator\RPCMessageValidator; +use Distantmagic\Resonance\InputValidator\JsonRPCMessageValidator; use Distantmagic\Resonance\InputValidatorController; use Distantmagic\Resonance\JsonSerializer; use Distantmagic\Resonance\SingletonCollection; @@ -20,12 +20,12 @@ use Distantmagic\Resonance\SiteAction; use Distantmagic\Resonance\WebSocketAuthResolution; use Distantmagic\Resonance\WebSocketConnection; use Distantmagic\Resonance\WebSocketConnectionStatus; +use Distantmagic\Resonance\WebSocketJsonRPCConnectionControllerInterface; +use Distantmagic\Resonance\WebSocketJsonRPCConnectionHandle; +use Distantmagic\Resonance\WebSocketJsonRPCResponderAggregate; use Distantmagic\Resonance\WebSocketProtocol; use Distantmagic\Resonance\WebSocketProtocolController; use Distantmagic\Resonance\WebSocketProtocolException; -use Distantmagic\Resonance\WebSocketRPCConnectionControllerInterface; -use Distantmagic\Resonance\WebSocketRPCConnectionHandle; -use Distantmagic\Resonance\WebSocketRPCResponderAggregate; use Ds\Map; use JsonException; use Psr\Http\Message\ServerRequestInterface; @@ -35,13 +35,13 @@ use Swoole\WebSocket\Frame; use Swoole\WebSocket\Server; use Throwable; -#[ControlsWebSocketProtocol(WebSocketProtocol::RPC)] +#[ControlsWebSocketProtocol(WebSocketProtocol::JsonRPC)] #[GrantsFeature(Feature::WebSocket)] #[Singleton(collection: SingletonCollection::WebSocketProtocolController)] -final readonly class RPCProtocolController extends WebSocketProtocolController +final readonly class JsonRPCProtocolController extends WebSocketProtocolController { /** - * @var Map<int, WebSocketRPCConnectionHandle> + * @var Map<int, WebSocketJsonRPCConnectionHandle> */ private Map $connectionHandles; @@ -50,14 +50,14 @@ final readonly class RPCProtocolController extends WebSocketProtocolController private AuthenticatedUserStoreAggregate $authenticatedUserStoreAggregate, private Gatekeeper $gatekeeper, private InputValidatorController $inputValidatorController, + private JsonRPCMessageValidator $rpcMessageValidator, private JsonSerializer $jsonSerializer, private LoggerInterface $logger, - private RPCMessageValidator $rpcMessageValidator, - private WebSocketRPCResponderAggregate $webSocketRPCResponderAggregate, - private ?WebSocketRPCConnectionControllerInterface $webSocketRPCConnectionController = null, + private WebSocketJsonRPCResponderAggregate $webSocketJsonRPCResponderAggregate, + private ?WebSocketJsonRPCConnectionControllerInterface $webSocketJsonRPCConnectionController = null, ) { /** - * @var Map<int, WebSocketRPCConnectionHandle> + * @var Map<int, WebSocketJsonRPCConnectionHandle> */ $this->connectionHandles = new Map(); } @@ -85,7 +85,7 @@ final readonly class RPCProtocolController extends WebSocketProtocolController $user = $this->authenticatedUserStoreAggregate->getAuthenticatedUser($request); return new WebSocketAuthResolution( - $this->gatekeeper->withUser($user)->can(SiteAction::StartWebSocketRPCConnection), + $this->gatekeeper->withUser($user)->can(SiteAction::StartWebSocketJsonRPCConnection), $user, ); } @@ -104,7 +104,7 @@ final readonly class RPCProtocolController extends WebSocketProtocolController $connectionHandle->webSocketConnection->status = WebSocketConnectionStatus::Closed; $connectionHandle->onClose(); - $this->webSocketRPCConnectionController?->onClose( + $this->webSocketJsonRPCConnectionController?->onClose( $connectionHandle->webSocketAuthResolution, $connectionHandle->webSocketConnection, ); @@ -133,13 +133,13 @@ final readonly class RPCProtocolController extends WebSocketProtocolController public function onOpen(Server $server, int $fd, WebSocketAuthResolution $webSocketAuthResolution): void { $webSocketConnection = new WebSocketConnection($server, $fd); - $connectionHandle = new WebSocketRPCConnectionHandle( - $this->webSocketRPCResponderAggregate, + $connectionHandle = new WebSocketJsonRPCConnectionHandle( + $this->webSocketJsonRPCResponderAggregate, $webSocketAuthResolution, $webSocketConnection, ); - $this->webSocketRPCConnectionController?->onOpen( + $this->webSocketJsonRPCConnectionController?->onOpen( $webSocketAuthResolution, $webSocketConnection, ); @@ -147,7 +147,7 @@ final readonly class RPCProtocolController extends WebSocketProtocolController $this->connectionHandles->put($fd, $connectionHandle); } - private function getFrameController(Frame $frame): WebSocketRPCConnectionHandle + private function getFrameController(Frame $frame): WebSocketJsonRPCConnectionHandle { if (!$this->connectionHandles->hasKey($frame->fd)) { throw new RuntimeException(sprintf( diff --git a/src/WebSocketProtocolException/UnexpectedNotification.php b/src/WebSocketProtocolException/UnexpectedNotification.php index e6f1f39a..d0a0e2b3 100644 --- a/src/WebSocketProtocolException/UnexpectedNotification.php +++ b/src/WebSocketProtocolException/UnexpectedNotification.php @@ -4,12 +4,12 @@ declare(strict_types=1); namespace Distantmagic\Resonance\WebSocketProtocolException; -use Distantmagic\Resonance\RPCMethodInterface; +use Distantmagic\Resonance\JsonRPCMethodInterface; use Distantmagic\Resonance\WebSocketProtocolException; class UnexpectedNotification extends WebSocketProtocolException { - public function __construct(RPCMethodInterface $rpcMethod) + public function __construct(JsonRPCMethodInterface $rpcMethod) { parent::__construct('RPC method must expect a notification: '.$rpcMethod->getValue()); } diff --git a/src/WebSocketProtocolException/UnexpectedRequest.php b/src/WebSocketProtocolException/UnexpectedRequest.php index 4e3d64f8..870ec188 100644 --- a/src/WebSocketProtocolException/UnexpectedRequest.php +++ b/src/WebSocketProtocolException/UnexpectedRequest.php @@ -4,12 +4,12 @@ declare(strict_types=1); namespace Distantmagic\Resonance\WebSocketProtocolException; -use Distantmagic\Resonance\RPCMethodInterface; +use Distantmagic\Resonance\JsonRPCMethodInterface; use Distantmagic\Resonance\WebSocketProtocolException; class UnexpectedRequest extends WebSocketProtocolException { - public function __construct(RPCMethodInterface $rpcMethod) + public function __construct(JsonRPCMethodInterface $rpcMethod) { parent::__construct('RPC method must not expect a response: '.$rpcMethod->getValue()); } diff --git a/src/WebSocketProtocolIteratorTest.php b/src/WebSocketProtocolIteratorTest.php index 727baffb..dec58bb4 100644 --- a/src/WebSocketProtocolIteratorTest.php +++ b/src/WebSocketProtocolIteratorTest.php @@ -15,11 +15,11 @@ final class WebSocketProtocolIteratorTest extends TestCase { public function test_iterates_over_protocol_values(): void { - $iter = new WebSocketProtocolIterator(' foo, dm-rpc,bar, baz'); + $iter = new WebSocketProtocolIterator(' foo, jsonrpc,bar, baz'); $values = iterator_to_array($iter); self::assertCount(1, $values); self::assertContainsOnlyInstancesOf(WebSocketProtocol::class, $values); - self::assertEquals(WebSocketProtocol::RPC, $values[0]); + self::assertEquals(WebSocketProtocol::JsonRPC, $values[0]); } } -- GitLab