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!", "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

View File

@@ -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)

View File

@@ -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)