Basic synchronization of edited objects

This commit is contained in:
Lucien Greathouse 2018-05-26 02:06:10 -07:00
parent 00b903e97c
commit 8729de1312
6 changed files with 148 additions and 34 deletions

View file

@ -57,14 +57,35 @@ function ApiContext:connect()
self.serverId = body.serverId
self.connected = true
return self:_retrieveMessages()
end)
end
function ApiContext:_retrieveMessages()
function ApiContext:readAll()
if not self.connected then
return Promise.resolve()
return Promise.reject()
end
return Http.get(self.url .. "/read_all")
:andThen(function(response)
local body = response:json()
if body.serverId ~= self.serverId then
return Promise.reject("server changed ID")
end
self.messageCursor = body.messageCursor
return body.instances
end, function(err)
self.connected = false
return Promise.reject(err)
end)
end
function ApiContext:retrieveMessages()
if not self.connected then
return Promise.reject()
end
return Http.get(self.url .. "/subscribe/" .. self.messageCursor)
@ -81,7 +102,7 @@ function ApiContext:_retrieveMessages()
self.messageCursor = body.messageCursor
return self:_retrieveMessages()
return self:retrieveMessages()
end, function(err)
self.connected = false

View file

@ -1,7 +1,4 @@
local Promise = require(script.Parent.Parent.modules.Promise)
local Config = require(script.Parent.Config)
local Http = require(script.Parent.Http)
local ApiContext = require(script.Parent.ApiContext)
local REMOTE_URL = ("http://localhost:%d"):format(Config.port)
@ -14,10 +11,59 @@ function Session.new()
setmetatable(self, Session)
local api = ApiContext.new(REMOTE_URL, function(message)
print("Got message:", message)
local created = {}
created["0"] = game:GetService("ReplicatedFirst")
local api
local function readAll()
print("Reading all...")
return api:readAll()
:andThen(function(instances)
for id, instance in pairs(instances) do
if id ~= "0" then
local existing = created[id]
if existing ~= nil then
pcall(existing.Destroy, existing)
end
local real = Instance.new(instance.className)
real.Name = instance.name
for key, value in pairs(instance.properties) do
real[key] = value
end
created[id] = real
end
end
for id, instance in pairs(instances) do
if id ~= "0" then
print("parent", created[id], created[tostring(instance.parent)])
created[id].Parent = created[tostring(instance.parent)]
end
end
end)
end
api = ApiContext.new(REMOTE_URL, function(message)
print("got message", message)
if message.type == "InstanceChanged" then
print("Instance", message.id, "changed!")
readAll()
else
warn("Unknown message type " .. message.type)
end
end)
api:connect()
:andThen(readAll)
:andThen(function()
return api:retrieveMessages()
end)
return self
end