# sha256\_base64

```lua
return function()
    local app = getApp();
    local state = app.getAppState();
    
    --encryption and base64 shortcut
    local sha256AndBase64 = app.sha256_base64('somestring');
    log(sha256AndBase64);
end
```

{% hint style="info" %}
This is usually used with security issues and dealing with API stuff.
{% endhint %}

## Example script for OBS websockets

```lua
function authentication(ob)
    local challenge = ob['d']['authentication']['challenge'];
    local salt = ob['d']['authentication']['salt'];

    set('rpcVersion', ob['d']['authentication']['rpcVersion'])

    local app = getApp();
    local salted_sha_base64 = app.sha256_base64(password .. salt); 
    local password_challenge_sha_base64 = app.sha256_base64(salted_sha_base64 .. challenge); 

    local m_data = {};
    m_data['op'] = 1;
    m_data['d'] = {};

    m_data['d']['rpcVersion'] = rpcVersion;
    m_data['d']['authentication'] = password_challenge_sha_base64;
    m_data['d']['eventSubscriptions'] = 33; --these are events you can subscribe to

    app.sendWebsocketMessage(socket, json.serialize(m_data));

end

function yourEvent(title, type, message, code)

    if title ~= socket then --make sure we're using the socket title we want!
        return; --otherwise exit out early :)
    end

    if type == 'OnMessage' then
        --route all messages here!
        --the code will be blank. ''

        log('receiving message: ' .. message);

        local ob = json.parse(message);
        if ob['op'] == 0 then
            authentication(ob);
        end

        if ob['op'] == 2 then
           switchToScene(gamePlaySceneName);
        end
    end
    if type == 'OnOpen' then
        --the socket opened!!
        --the message and code will be blank. ''
        log('socket was opened!');
    end

    if type == 'OnClose' or type == 'OnError' then
        --if the message type is OnClose or OnError, let's clean up the socket...
        local app = getApp();
        app.removeWebSocket(socket);
        log('socket is closed!');
        log(message);
        log(code);
    end
end


function switchToScene(scene)
    local m_data = {};
    m_data['op'] = 6;
    m_data['d'] = {};
    local app = getApp();
    m_data['d']['requestType'] = 'SetCurrentProgramScene';
    m_data['d']['requestId'] = 'f819dcf0-89cc-11eb-8f0e-382c4ac93b9c';
    m_data['d']['requestData'] = {};
    m_data['d']['requestData']['sceneName'] = scene;
    app.sendWebsocketMessage(socket, json.serialize(m_data));
end

--retrieved from json data
ip = 'ws://192.168.1.70:4444';
password = 'your_websocket_password_in_obs';
gamePlaySceneName = 'your scene title';
--
rpcVersion = 1;
socket = 'obs_socket_holder'; 

return function()

    load();
    log('OBS websocket tutorial');
    local app = getApp();

    --remove old existing websocket just incase...
    app.removeWebSocket(socket);
    wait(1); --give it time to remove the old one
    addEvent('websocket', 'yourEvent'); --subscribe to all websockets that exist...

    
    local params = {};
    params[1] = 'Sec-WebSocket-Protocol';
    params[2] = 'obswebsocket.json';
    app.createWebsocket(socket, ip, params); --title a websoscket and connect to a server...

    keepAlive();
end
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.streamavatars.com/lua-scripting-api/api-reference-and-tips/classes/app/sha256_base64.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
