mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-04-25 15:16:07 +00:00
plugin: Refactor HTTP and ApiContext foundations
This commit is contained in:
@@ -11,10 +11,10 @@ Error.Kind = {
|
|||||||
"Make sure the server is running -- use 'rojo serve' to run it!",
|
"Make sure the server is running -- use 'rojo serve' to run it!",
|
||||||
},
|
},
|
||||||
Timeout = {
|
Timeout = {
|
||||||
message = "Request timed out.",
|
message = "HTTP request timed out.",
|
||||||
},
|
},
|
||||||
Unknown = {
|
Unknown = {
|
||||||
message = "Unknown error: {{message}}",
|
message = "Unknown HTTP error: {{message}}",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ end
|
|||||||
--[[
|
--[[
|
||||||
This method shouldn't have to exist. Ugh.
|
This method shouldn't have to exist. Ugh.
|
||||||
]]
|
]]
|
||||||
function Error.fromErrorString(message)
|
function Error.fromRobloxErrorString(message)
|
||||||
local lower = message:lower()
|
local lower = message:lower()
|
||||||
|
|
||||||
if lower:find("^http requests are not enabled") then
|
if lower:find("^http requests are not enabled") then
|
||||||
|
|||||||
@@ -13,19 +13,20 @@ local Http = {}
|
|||||||
Http.Error = HttpError
|
Http.Error = HttpError
|
||||||
Http.Response = HttpResponse
|
Http.Response = HttpResponse
|
||||||
|
|
||||||
function Http.get(url)
|
local function performRequest(requestParams)
|
||||||
local requestId = lastRequestId + 1
|
local requestId = lastRequestId + 1
|
||||||
lastRequestId = requestId
|
lastRequestId = requestId
|
||||||
|
|
||||||
Log.trace("GET(%d) %s", requestId, url)
|
Log.trace("%s(%d) %s", requestParams.Method, requestId, requestParams.Url)
|
||||||
|
|
||||||
|
if requestParams.Body ~= nil then
|
||||||
|
Log.trace(requestParams.Body)
|
||||||
|
end
|
||||||
|
|
||||||
return Promise.new(function(resolve, reject)
|
return Promise.new(function(resolve, reject)
|
||||||
coroutine.wrap(function()
|
coroutine.wrap(function()
|
||||||
local success, response = pcall(function()
|
local success, response = pcall(function()
|
||||||
return HttpService:RequestAsync({
|
return HttpService:RequestAsync(requestParams)
|
||||||
Url = url,
|
|
||||||
Method = "GET",
|
|
||||||
})
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if success then
|
if success then
|
||||||
@@ -33,37 +34,25 @@ function Http.get(url)
|
|||||||
resolve(HttpResponse.fromRobloxResponse(response))
|
resolve(HttpResponse.fromRobloxResponse(response))
|
||||||
else
|
else
|
||||||
Log.trace("Request %d failure: %s", requestId, response)
|
Log.trace("Request %d failure: %s", requestId, response)
|
||||||
reject(HttpError.fromErrorString(response))
|
reject(HttpError.fromRobloxErrorString(response))
|
||||||
end
|
end
|
||||||
end)()
|
end)()
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Http.get(url)
|
||||||
|
return performRequest({
|
||||||
|
Url = url,
|
||||||
|
Method = "GET",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
function Http.post(url, body)
|
function Http.post(url, body)
|
||||||
local requestId = lastRequestId + 1
|
return performRequest({
|
||||||
lastRequestId = requestId
|
Url = url,
|
||||||
|
Method = "POST",
|
||||||
Log.trace("POST(%d) %s\n%s", requestId, url, body)
|
Body = body,
|
||||||
|
})
|
||||||
return Promise.new(function(resolve, reject)
|
|
||||||
coroutine.wrap(function()
|
|
||||||
local success, response = pcall(function()
|
|
||||||
return HttpService:RequestAsync({
|
|
||||||
Url = url,
|
|
||||||
Method = "POST",
|
|
||||||
Body = body,
|
|
||||||
})
|
|
||||||
end)
|
|
||||||
|
|
||||||
if success then
|
|
||||||
Log.trace("Request %d success: status code %s", requestId, response.StatusCode)
|
|
||||||
resolve(HttpResponse.fromRobloxResponse(response))
|
|
||||||
else
|
|
||||||
Log.trace("Request %d failure: %s", requestId, response)
|
|
||||||
reject(HttpError.fromErrorString(response))
|
|
||||||
end
|
|
||||||
end)()
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function Http.jsonEncode(object)
|
function Http.jsonEncode(object)
|
||||||
|
|||||||
@@ -9,30 +9,30 @@ local Session = {}
|
|||||||
Session.__index = Session
|
Session.__index = Session
|
||||||
|
|
||||||
function Session.new(config)
|
function Session.new(config)
|
||||||
local remoteUrl = ("http://%s:%s"):format(config.address, config.port)
|
local baseUrl = ("http://%s:%s"):format(config.address, config.port)
|
||||||
local api = ApiContext.new(remoteUrl)
|
local apiContext = ApiContext.new(baseUrl)
|
||||||
|
|
||||||
local self = {
|
local self = {
|
||||||
onError = config.onError,
|
onError = config.onError,
|
||||||
disconnected = false,
|
disconnected = false,
|
||||||
reconciler = Reconciler.new(),
|
reconciler = Reconciler.new(),
|
||||||
api = api,
|
apiContext = apiContext,
|
||||||
}
|
}
|
||||||
|
|
||||||
api:connect()
|
apiContext:connect()
|
||||||
:andThen(function()
|
:andThen(function()
|
||||||
if self.disconnected then
|
if self.disconnected then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
return api:read({api.rootInstanceId})
|
return apiContext:read({apiContext.rootInstanceId})
|
||||||
end)
|
end)
|
||||||
:andThen(function(response)
|
:andThen(function(response)
|
||||||
if self.disconnected then
|
if self.disconnected then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
self.reconciler:reconcile(response.instances, api.rootInstanceId, game)
|
self.reconciler:reconcile(response.instances, apiContext.rootInstanceId, game)
|
||||||
return self:__processMessages()
|
return self:__processMessages()
|
||||||
end)
|
end)
|
||||||
:catch(function(message)
|
:catch(function(message)
|
||||||
@@ -48,7 +48,7 @@ function Session:__processMessages()
|
|||||||
return Promise.resolve()
|
return Promise.resolve()
|
||||||
end
|
end
|
||||||
|
|
||||||
return self.api:retrieveMessages()
|
return self.apiContext:retrieveMessages()
|
||||||
:andThen(function(messages)
|
:andThen(function(messages)
|
||||||
local promise = Promise.resolve(nil)
|
local promise = Promise.resolve(nil)
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ function Session:__onMessage(message)
|
|||||||
table.insert(requestedIds, id)
|
table.insert(requestedIds, id)
|
||||||
end
|
end
|
||||||
|
|
||||||
return self.api:read(requestedIds)
|
return self.apiContext:read(requestedIds)
|
||||||
:andThen(function(response)
|
:andThen(function(response)
|
||||||
return self.reconciler:applyUpdate(requestedIds, response.instances)
|
return self.reconciler:applyUpdate(requestedIds, response.instances)
|
||||||
end)
|
end)
|
||||||
|
|||||||
Reference in New Issue
Block a user