diff --git a/README.md b/README.md index 3e1732802..fd4676256 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.websocketRequest(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 61ee6a590..33e3c9370 100644 --- a/browser-app.cpp +++ b/browser-app.cpp @@ -99,13 +99,13 @@ void BrowserApp::OnBeforeCommandLineProcessing(const CefString &, CefRefPtr exposedFunctions = {"getControlLevel", "getCurrentScene", "getStatus", - "startRecording", "stopRecording", "startStreaming", - "stopStreaming", "pauseRecording", "unpauseRecording", - "startReplayBuffer", "stopReplayBuffer", "saveReplayBuffer", - "startVirtualcam", "stopVirtualcam", "getScenes", - "setCurrentScene", "getTransitions", "getCurrentTransition", - "setCurrentTransition"}; +std::vector exposedFunctions = {"getControlLevel", "getCurrentScene", "getStatus", + "startRecording", "stopRecording", "startStreaming", + "stopStreaming", "pauseRecording", "unpauseRecording", + "startReplayBuffer", "stopReplayBuffer", "saveReplayBuffer", + "startVirtualcam", "stopVirtualcam", "getScenes", + "setCurrentScene", "getTransitions", "getCurrentTransition", + "setCurrentTransition", "websocketRequest"}; void BrowserApp::OnContextCreated(CefRefPtr browser, CefRefPtr, CefRefPtr context) { diff --git a/browser-client.cpp b/browser-client.cpp index 7b40b3fde..76318eeaa 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 #include #include #include @@ -153,6 +154,24 @@ bool BrowserClient::OnProcessMessageReceived(CefRefPtr browser, CefR obs_frontend_start_virtualcam(); } else if (name == "stopVirtualcam") { obs_frontend_stop_virtualcam(); + } else if (name == "websocketRequest") { + 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); + } else { + json = {{"code", 205}, // GenericError + {"result", false}, + {"comment", "Unable to call obs-websocket request"}}; + } } [[fallthrough]]; case ControlLevel::Advanced: