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