class SeapigObject

Attributes

destroyed[RW]
object_id[RW]
parent[RW]
received_at[R]
stall[RW]
version[RW]
version_requested[RW]

Public Class Methods

new(server, object_id, parent = nil) click to toggle source
# File lib/seapig/client.rb, line 173
def initialize(server, object_id, parent = nil)
        @server = server
        @object_id = object_id
        @version = 0
        @onchange_proc = nil
        @onproduce_proc = nil
        @valid = false
        @shadow = JSON.load(JSON.dump(self))
        @stall = false
        @parent = parent
        @destroyed = false
end

Public Instance Methods

matches?(id) click to toggle source
# File lib/seapig/client.rb, line 168
def matches?(id)
        id =~ Regexp.new(Regexp.escape(@object_id).gsub('\*','.*?'))
end
onchange(&block) click to toggle source
# File lib/seapig/client.rb, line 187
def onchange(&block)
        @onchange_proc = block
end
onproduce(&block) click to toggle source
# File lib/seapig/client.rb, line 192
def onproduce(&block)
        @onproduce_proc = block
end
patch(message) click to toggle source
# File lib/seapig/client.rb, line 197
def patch(message)
        @received_at = Time.new
        old_data = @shadow
        if (not message['old_version']) or (message['old_version'] == 0) or (message['value'])
                self.clear
        elsif not @version == message['old_version']
                p @version, message
                puts "Seapig lost some updates, this should never happen"
                exit 2
        end
        if message['value']
                self.merge!(message['value'])
        else
                Hana::Patch.new(message['patch']).apply(self)
        end
        @version = message['new_version']
        @valid = true
        @shadow = JSON.load(JSON.dump(self))
        @onchange_proc.call(self) if @onchange_proc and old_data != @shadow
end
produce(object_id, version) click to toggle source
# File lib/seapig/client.rb, line 275
def produce(object_id, version)
        @version_requested = version
        if @onproduce_proc
                @onproduce_proc.call(self)
        else
                self.upload(0,{},object_id)
        end
end
reset() click to toggle source
# File lib/seapig/client.rb, line 219
def reset()
        @version = 0
        @shadow = {}
        self
end
sanitized() click to toggle source
# File lib/seapig/client.rb, line 247
def sanitized
        JSON.load(JSON.dump(self))
end
send(new_version=nil) click to toggle source
# File lib/seapig/client.rb, line 238
def send(new_version=nil)
        old_version = @version
        old_object = @shadow
        @version = (new_version or (Time.new.to_f*1000000).to_i)
        @shadow = sanitized
        upload(old_version, old_object, @object_id)
end
set(data) click to toggle source
# File lib/seapig/client.rb, line 226
def set(data)
        if data
                @stall = false
                self.clear
                self.merge!(data)
        else
                @stall = true
        end
        self
end
upload(old_version, old_object, object_id) click to toggle source
# File lib/seapig/client.rb, line 252
def upload(old_version, old_object, object_id)
        message = {
                id: object_id,
                action: 'object-patch',
                old_version: old_version,
                new_version: @version,
        }
        if old_version == 0 or @stall
                message.merge!(value: (if @stall then false else @shadow end))
        else
                diff = JsonDiff.generate(old_object, @shadow)
                value = @shadow
                if JSON.dump(diff.size) < JSON.dump(value.size) #can we afford this?
                        message.merge!(patch: diff)
                else
                        message.merge!(old_version: 0, value: @shadow)
                end
        end
        @server.socket.send JSON.dump(message)
        self
end
valid?() click to toggle source
# File lib/seapig/client.rb, line 285
def valid?
        @valid
end