From aae88c891312d83e76425aee90bac52a341fde75 Mon Sep 17 00:00:00 2001 From: Exeldro Date: Mon, 22 Apr 2024 13:37:50 +0200 Subject: [PATCH] Add function to call websocket request from JavaScript --- README.md | 25 +++++++++++++++++++++++++ browser-app.cpp | 14 +++++++------- browser-client.cpp | 23 +++++++++++++++++++++++ 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3e1732802..a7000fea4 100644 --- a/README.md +++ b/README.md @@ -315,6 +315,31 @@ Permissions required: ALL window.obsstudio.stopVirtualcam() ``` +#### Call Websocket request +Permissions required: ALL +```js +/** + * @typedef {Object} WebsocketResponse + * @property {number} code - RequestStatus code + * @property {bool} result - is true if the request resulted in Success. False if otherwise. + * @property {string} responseData - JSON string containing response data + * @property {string} comment - may be provided by the server on errors to offer further details on why a request failed. + */ + +/** + * @callback WebsocketRequestCallback + * @param {WebsocketResponse} response + */ + +/** + * @param {WebsocketRequestCallback} cb + * @param {string} request_type - The request type to call + * @param {string} request_data - JSON string containing appropriate request data + */ +window.obsstudio.callWebsocketRequest(function (response_data) { + console.log(JSON.stringify(response)) +}, request_type, request_data) +``` ### Register for visibility callbacks diff --git a/browser-app.cpp b/browser-app.cpp index 582b1c6ee..47366a789 100644 --- a/browser-app.cpp +++ b/browser-app.cpp @@ -100,13 +100,13 @@ void BrowserApp::OnBeforeCommandLineProcessing( } std::vector exposedFunctions = { - "getControlLevel", "getCurrentScene", "getStatus", - "startRecording", "stopRecording", "startStreaming", - "stopStreaming", "pauseRecording", "unpauseRecording", - "startReplayBuffer", "stopReplayBuffer", "saveReplayBuffer", - "startVirtualcam", "stopVirtualcam", "getScenes", - "setCurrentScene", "getTransitions", "getCurrentTransition", - "setCurrentTransition"}; + "getControlLevel", "getCurrentScene", "getStatus", + "startRecording", "stopRecording", "startStreaming", + "stopStreaming", "pauseRecording", "unpauseRecording", + "startReplayBuffer", "stopReplayBuffer", "saveReplayBuffer", + "startVirtualcam", "stopVirtualcam", "getScenes", + "setCurrentScene", "getTransitions", "getCurrentTransition", + "setCurrentTransition", "callWebsocketRequest"}; void BrowserApp::OnContextCreated(CefRefPtr browser, CefRefPtr, diff --git a/browser-client.cpp b/browser-client.cpp index d91ca7024..9a88e12be 100644 --- a/browser-client.cpp +++ b/browser-client.cpp @@ -19,6 +19,7 @@ #include "browser-client.hpp" #include "obs-browser-source.hpp" #include "base64/base64.hpp" +#include "..\obs-websocket\lib\obs-websocket-api.h" #include #include #include @@ -142,6 +143,28 @@ bool BrowserClient::OnProcessMessageReceived( obs_frontend_start_virtualcam(); } else if (name == "stopVirtualcam") { obs_frontend_stop_virtualcam(); + } else if (name == "callWebsocketRequest") { + std::string request_type = + input_args->GetString(1).ToString(); + std::string request_data_string = + input_args->GetString(2).ToString(); + OBSDataAutoRelease request_data = + obs_data_create_from_json( + request_data_string.c_str()); + struct obs_websocket_request_response *response = + obs_websocket_call_request(request_type.c_str(), + request_data); + if (response) { + json = {{"code", response->status_code}, + {"result", + response->status_code == 100}}; + if (response->response_data) + json["responseData"] = + response->response_data; + if (response->comment) + json["comment"] = response->comment; + obs_websocket_request_response_free(response); + } } [[fallthrough]]; case ControlLevel::Advanced: