plugin: Refactor HTTP and ApiContext foundations

This commit is contained in:
Lucien Greathouse
2019-10-02 11:04:40 -07:00
parent 21d4acebc3
commit 7cada2608f
3 changed files with 31 additions and 42 deletions

View File

@@ -11,10 +11,10 @@ Error.Kind = {
"Make sure the server is running -- use 'rojo serve' to run it!",
},
Timeout = {
message = "Request timed out.",
message = "HTTP request timed out.",
},
Unknown = {
message = "Unknown error: {{message}}",
message = "Unknown HTTP error: {{message}}",
},
}
@@ -45,7 +45,7 @@ end
--[[
This method shouldn't have to exist. Ugh.
]]
function Error.fromErrorString(message)
function Error.fromRobloxErrorString(message)
local lower = message:lower()
if lower:find("^http requests are not enabled") then

View File

@@ -13,19 +13,20 @@ local Http = {}
Http.Error = HttpError
Http.Response = HttpResponse
function Http.get(url)
local function performRequest(requestParams)
local requestId = lastRequestId + 1
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)
coroutine.wrap(function()
local success, response = pcall(function()
return HttpService:RequestAsync({
Url = url,
Method = "GET",
})
return HttpService:RequestAsync(requestParams)
end)
if success then
@@ -33,37 +34,25 @@ function Http.get(url)
resolve(HttpResponse.fromRobloxResponse(response))
else
Log.trace("Request %d failure: %s", requestId, response)
reject(HttpError.fromErrorString(response))
reject(HttpError.fromRobloxErrorString(response))
end
end)()
end)
end
function Http.get(url)
return performRequest({
Url = url,
Method = "GET",
})
end
function Http.post(url, body)
local requestId = lastRequestId + 1
lastRequestId = requestId
Log.trace("POST(%d) %s\n%s", requestId, url, 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)
return performRequest({
Url = url,
Method = "POST",
Body = body,
})
end
function Http.jsonEncode(object)

View File

@@ -9,30 +9,30 @@ local Session = {}
Session.__index = Session
function Session.new(config)
local remoteUrl = ("http://%s:%s"):format(config.address, config.port)
local api = ApiContext.new(remoteUrl)
local baseUrl = ("http://%s:%s"):format(config.address, config.port)
local apiContext = ApiContext.new(baseUrl)
local self = {
onError = config.onError,
disconnected = false,
reconciler = Reconciler.new(),
api = api,
apiContext = apiContext,
}
api:connect()
apiContext:connect()
:andThen(function()
if self.disconnected then
return
end
return api:read({api.rootInstanceId})
return apiContext:read({apiContext.rootInstanceId})
end)
:andThen(function(response)
if self.disconnected then
return
end
self.reconciler:reconcile(response.instances, api.rootInstanceId, game)
self.reconciler:reconcile(response.instances, apiContext.rootInstanceId, game)
return self:__processMessages()
end)
:catch(function(message)
@@ -48,7 +48,7 @@ function Session:__processMessages()
return Promise.resolve()
end
return self.api:retrieveMessages()
return self.apiContext:retrieveMessages()
:andThen(function(messages)
local promise = Promise.resolve(nil)
@@ -84,7 +84,7 @@ function Session:__onMessage(message)
table.insert(requestedIds, id)
end
return self.api:read(requestedIds)
return self.apiContext:read(requestedIds)
:andThen(function(response)
return self.reconciler:applyUpdate(requestedIds, response.instances)
end)