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, { setmetatable(ApiContext.Error, {
__index = function(_, key) __index = function(_, key)
error("Invalid API.Error name " .. key, 2) error("Invalid ApiContext.Error name " .. key, 2)
end end
}) })
-- TODO: Switch to onMessages and batch processing -- TODO: Switch to onMessages and batch processing
function ApiContext.new(baseUrl, onMessage) function ApiContext.new(baseUrl)
assert(type(baseUrl) == "string") assert(type(baseUrl) == "string")
assert(type(onMessage) == "function")
local context = { local self = {
baseUrl = baseUrl, baseUrl = baseUrl,
onMessage = onMessage, onMessageCallback = nil,
serverId = nil, serverId = nil,
rootInstanceId = nil, rootInstanceId = nil,
connected = false, connected = false,
@@ -34,9 +33,13 @@ function ApiContext.new(baseUrl, onMessage)
partitionRoutes = nil, partitionRoutes = nil,
} }
setmetatable(context, ApiContext) setmetatable(self, ApiContext)
return context return self
end
function ApiContext:onMessage(callback)
self.onMessageCallback = callback
end end
function ApiContext:connect() function ApiContext:connect()
@@ -77,6 +80,11 @@ function ApiContext:read(ids)
local url = ("%s/api/read/%s"):format(self.baseUrl, table.concat(ids, ",")) local url = ("%s/api/read/%s"):format(self.baseUrl, table.concat(ids, ","))
return Http.get(url) return Http.get(url)
:catch(function(err)
self.connected = false
return Promise.reject(err)
end)
:andThen(function(response) :andThen(function(response)
local body = response:json() local body = response:json()
@@ -87,10 +95,6 @@ function ApiContext:read(ids)
self.messageCursor = body.messageCursor self.messageCursor = body.messageCursor
return body return body
end, function(err)
self.connected = false
return Promise.reject(err)
end) end)
end end
@@ -102,23 +106,7 @@ function ApiContext:retrieveMessages()
local url = ("%s/api/subscribe/%s"):format(self.baseUrl, self.messageCursor) local url = ("%s/api/subscribe/%s"):format(self.baseUrl, self.messageCursor)
return Http.get(url) return Http.get(url)
:andThen(function(response) :catch(function(err)
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)
if err.type == HttpError.Error.Timeout then if err.type == HttpError.Error.Timeout then
return self:retrieveMessages() return self:retrieveMessages()
end end
@@ -127,6 +115,28 @@ function ApiContext:retrieveMessages()
return Promise.reject(err) return Promise.reject(err)
end) 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 end
return ApiContext return ApiContext

View File

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