local Base64 = require(script.Base64) local JobId = game:GetService('HttpService'):GenerateGUID(false) local config = require(script.Parent.Parent:WaitForChild("Configuration")) local BaseUrl = config["websocket-proxy"] local atob = Base64.atob local btoa = Base64.btoa local messages = {} local function notExists(whichArray, itemName) if (table.find(whichArray, itemName)) then return false else return true end end local function notEmpty(s) return s ~= nil or s ~= '' or s ~= " " end local ws = function (dict) local socket = {} local closed = false local onMessage = dict.onMessage or function(msg) print(msg) end local onError = dict.onError or function(err) print(err) end local server = game:GetService('HttpService') local response, status = server:RequestAsync({ ["Url"] = BaseUrl .. "/api/connect/" .. JobId, ["Method"] = "PUT", ["Body"] = server:JSONEncode({["url"] = dict.url}), ["Headers"] = {["Content-Type"] = "application/json"} }) if response.Success then local id = response.Body local function sendMessage(msg) wait() local resp = server:RequestAsync({ ["Url"] = BaseUrl .. "/api/send/" .. JobId .."/"..id, ["Method"] = "POST", ["Body"] = server:JSONEncode({["data"] = msg}), ["Headers"] = {["Content-Type"] = "application/json"} }) if not resp.Success then onError({message = resp.StatusMessage, code = resp.StatusCode}) return false else return true end end local loop = task.spawn(function() while wait(.5) do local response = server:RequestAsync({ ["Url"] = BaseUrl .. "/api/poll/"..JobId.."/".. id, ["Method"] = "GET" }) if response.Success then local msg = response.Body if notExists(messages, msg) then table.insert(messages, msg) if notEmpty(msg) then onMessage(socket, msg) end end else onError({message = response.StatusMessage, code = response.StatusCode}) break end end end) local function close() if closed then return end closed = true server:RequestAsync({ ["Url"] = BaseUrl .. "/api/close/" .. JobId .. "/" .. id, ["Method"] = "DELETE" }) task.cancel(loop) end game:BindToClose(close) socket = { sendMessage = sendMessage, onMessage = onMessage, close = close } return socket else onError({message = response.StatusMessage, code = response.StatusCode}) return false end end return ws