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