From 2f1aadd497863328c139eedb76d4cce87f4bb264 Mon Sep 17 00:00:00 2001 From: Lucien Greathouse Date: Sat, 29 Dec 2018 22:59:41 -0800 Subject: [PATCH] Tinkering with zero testing --- plugin/src/ApiContext.lua | 68 ++++++++++++++++++++++----------------- plugin/src/Session.lua | 4 +-- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/plugin/src/ApiContext.lua b/plugin/src/ApiContext.lua index 54362a39..0c7b5d92 100644 --- a/plugin/src/ApiContext.lua +++ b/plugin/src/ApiContext.lua @@ -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 \ No newline at end of file diff --git a/plugin/src/Session.lua b/plugin/src/Session.lua index 17af009e..893bd76b 100644 --- a/plugin/src/Session.lua +++ b/plugin/src/Session.lua @@ -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