WIP: Epiphany Refactor (#85)

This commit is contained in:
Lucien Greathouse
2018-08-26 01:03:53 -07:00
committed by GitHub
parent 80b9b7594b
commit 72bc77f1d5
52 changed files with 1145 additions and 2157 deletions

View File

@@ -19,14 +19,15 @@ setmetatable(ApiContext.Error, {
end
})
function ApiContext.new(url, onMessage)
assert(type(url) == "string")
function ApiContext.new(baseUrl, onMessage)
assert(type(baseUrl) == "string")
assert(type(onMessage) == "function")
local context = {
url = url,
baseUrl = baseUrl,
onMessage = onMessage,
serverId = nil,
rootInstanceId = nil,
connected = false,
messageCursor = -1,
partitionRoutes = nil,
@@ -38,7 +39,9 @@ function ApiContext.new(url, onMessage)
end
function ApiContext:connect()
return Http.get(self.url .. "/api/rojo")
local url = ("%s/api/rojo"):format(self.baseUrl)
return Http.get(url)
:andThen(function(response)
local body = response:json()
@@ -61,15 +64,18 @@ function ApiContext:connect()
self.serverId = body.serverId
self.connected = true
self.partitionRoutes = body.partitions
self.rootInstanceId = body.rootInstanceId
end)
end
function ApiContext:readAll()
function ApiContext:read(ids)
if not self.connected then
return Promise.reject()
end
return Http.get(self.url .. "/api/read_all")
local url = ("%s/api/read/%s"):format(self.baseUrl, table.concat(ids, ","))
return Http.get(url)
:andThen(function(response)
local body = response:json()
@@ -92,7 +98,9 @@ function ApiContext:retrieveMessages()
return Promise.reject()
end
return Http.get(self.url .. "/api/subscribe/" .. self.messageCursor)
local url = ("%s/api/subscribe/%s"):format(self.baseUrl, self.messageCursor)
return Http.get(url)
:andThen(function(response)
local body = response:json()

View File

@@ -1,6 +1,6 @@
local HttpService = game:GetService("HttpService")
local HTTP_DEBUG = false
local HTTP_DEBUG = true
local Promise = require(script.Parent.Parent.Promise)

View File

@@ -11,57 +11,7 @@ function Session.new()
setmetatable(self, Session)
local function createFoldersUntil(location, route)
for i = 1, #route - 1 do
local piece = route[i]
local child = location:FindFirstChild(piece)
if child == nil then
child = Instance.new("Folder")
child.Name = piece
child.Parent = location
end
location = child
end
return location
end
local function reify(instancesById, id)
local object = instancesById[tostring(id)]
local instance = Instance.new(object.className)
instance.Name = object.name
for key, property in pairs(object.properties) do
instance[key] = property.value
end
for _, childId in ipairs(object.children) do
reify(instancesById, childId).Parent = instance
end
return instance
end
local api
local function readAll()
print("Reading all...")
return api:readAll()
:andThen(function(response)
for partitionName, partitionRoute in pairs(api.partitionRoutes) do
local parent = createFoldersUntil(game, partitionRoute)
local rootInstanceId = response.partitionInstances[partitionName]
print("Root for", partitionName, "is", rootInstanceId)
reify(response.instances, rootInstanceId).Parent = parent
end
end)
end
api = ApiContext.new(REMOTE_URL, function(message)
if message.type == "InstanceChanged" then
@@ -73,7 +23,9 @@ function Session.new()
end)
api:connect()
:andThen(readAll)
:andThen(function()
return api:read({api.rootInstanceId})
end)
:andThen(function()
return api:retrieveMessages()
end)