Tinkering with zero testing

This commit is contained in:
Lucien Greathouse
2018-12-29 22:59:41 -08:00
parent 645ab0ae98
commit 2f1aadd497
2 changed files with 41 additions and 31 deletions

View File

@@ -15,18 +15,17 @@ ApiContext.Error = {
setmetatable(ApiContext.Error, {
__index = function(_, key)
error("Invalid API.Error name " .. key, 2)
error("Invalid ApiContext.Error name " .. key, 2)
end
})
-- TODO: Switch to onMessages and batch processing
function ApiContext.new(baseUrl, onMessage)
function ApiContext.new(baseUrl)
assert(type(baseUrl) == "string")
assert(type(onMessage) == "function")
local context = {
local self = {
baseUrl = baseUrl,
onMessage = onMessage,
onMessageCallback = nil,
serverId = nil,
rootInstanceId = nil,
connected = false,
@@ -34,9 +33,13 @@ function ApiContext.new(baseUrl, onMessage)
partitionRoutes = nil,
}
setmetatable(context, ApiContext)
setmetatable(self, ApiContext)
return context
return self
end
function ApiContext:onMessage(callback)
self.onMessageCallback = callback
end
function ApiContext:connect()
@@ -77,6 +80,11 @@ function ApiContext:read(ids)
local url = ("%s/api/read/%s"):format(self.baseUrl, table.concat(ids, ","))
return Http.get(url)
:catch(function(err)
self.connected = false
return Promise.reject(err)
end)
:andThen(function(response)
local body = response:json()
@@ -87,10 +95,6 @@ function ApiContext:read(ids)
self.messageCursor = body.messageCursor
return body
end, function(err)
self.connected = false
return Promise.reject(err)
end)
end
@@ -102,23 +106,7 @@ function ApiContext:retrieveMessages()
local url = ("%s/api/subscribe/%s"):format(self.baseUrl, self.messageCursor)
return Http.get(url)
:andThen(function(response)
local body = response:json()
if body.serverId ~= self.serverId then
return Promise.reject("Server changed ID")
end
-- TODO: Wait for all messages to be processed before resuming.
-- This callback will return a promise!
for _, message in ipairs(body.messages) do
self.onMessage(message)
end
self.messageCursor = body.messageCursor
return self:retrieveMessages()
end, function(err)
:catch(function(err)
if err.type == HttpError.Error.Timeout then
return self:retrieveMessages()
end
@@ -127,6 +115,28 @@ function ApiContext:retrieveMessages()
return Promise.reject(err)
end)
:andThen(function(response)
local body = response:json()
if body.serverId ~= self.serverId then
return Promise.reject("Server changed ID")
end
local promise = Promise.resolve(nil)
for _, message in ipairs(body.messages) do
promise = promise:andThen(function()
return self.onMessageCalllback(message)
end)
end
self.messageCursor = body.messageCursor
return promise
end)
:andThen(function()
return self:retrieveMessages()
end)
end
return ApiContext
return ApiContext

View File

@@ -132,9 +132,9 @@ function Session.new()
local instanceMap = makeInstanceMap()
local api
local api = ApiContext.new(REMOTE_URL)
api = ApiContext.new(REMOTE_URL, function(message)
ApiContext:onMessage(function(message)
local idsToGet = {}
for _, id in ipairs(message.added) do