Class: SeapigMasterObject

Inherits:
SeapigObject show all
Defined in:
lib/seapig-client-ruby/client.rb

Direct Known Subclasses

SeapigWildcardMasterObject

Instance Attribute Summary collapse

Attributes inherited from SeapigObject

#destroyed, #id, #initialized, #version

Instance Method Summary collapse

Methods inherited from SeapigObject

#destroy, #matches, #ondestroy, #onstatuschange, #sanitized, #unlink

Constructor Details

#initialize(client, id, options) ⇒ SeapigMasterObject

Returns a new instance of SeapigMasterObject.



305
306
307
308
309
310
# File 'lib/seapig-client-ruby/client.rb', line 305

def initialize(client, id, options)
  super(client, id, options)
  @version = (options[:version] or [(Time.new.to_f*1000).floor, 0])
  @shadow = self.sanitized
  @stall = false
end

Instance Attribute Details

#stallObject

Returns the value of attribute stall.



302
303
304
# File 'lib/seapig-client-ruby/client.rb', line 302

def stall
  @stall
end

Instance Method Details

#bump(options = {}) ⇒ Object



334
335
336
337
338
339
340
341
# File 'lib/seapig-client-ruby/client.rb', line 334

def bump(options={})
  version_old = @version
  data_old = @shadow
  @version = (options[:version] or [version_old[0], version_old[1]+1])
  @shadow = sanitized
  @initialized = true
  upload(version_old, data_old, @version, @stall ? false : @shadow)
end

#onproduce(&block) ⇒ Object



313
314
315
316
# File 'lib/seapig-client-ruby/client.rb', line 313

def onproduce(&block)
  @onproduce_proc = block
  self
end

#produce(id, version_inferred) ⇒ Object

—– for SeapigClient



345
346
347
348
349
350
351
352
# File 'lib/seapig-client-ruby/client.rb', line 345

def produce(id, version_inferred)
  if @onproduce_proc
    @onproduce_proc.call(self, version_inferred)
  else
    raise "Master object #{id} has to either be initialized at all times or have an onproduce callback" if not @initialized
    upload(0, {}, @version, @shadow)
  end
end

#set(options = {}) ⇒ Object



319
320
321
322
323
324
325
326
327
328
329
330
331
# File 'lib/seapig-client-ruby/client.rb', line 319

def set(options={})
  @version = options[:version] if options[:version]
  if options[:object]
    @stall = false
    self.clear
    self.merge!(options[:object])
  elsif options[:object] == false or options[:stall]
    @stall = true
  end
  @shadow = sanitized
  @initialized = true
  upload(0, {}, @version, @stall ? false : @shadow)
end

#upload(version_old, data_old, version_new, data_new) ⇒ Object



355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
# File 'lib/seapig-client-ruby/client.rb', line 355

def upload(version_old, data_old, version_new, data_new)
  if @client.connected
    if version_old == 0 or data_new == false or data_new == true
      @client.socket.send JSON.dump(id: @id, action: 'object-patch', :"version-new" => version_new, value: data_new)
    else
      diff = JsonDiff.generate(data_old, data_new)
      if JSON.dump(diff).size < JSON.dump(data_new).size #can we afford this?
        @client.socket.send JSON.dump(id: @id, action: 'object-patch', :'version-old' => version_old, :'version-new' => version_new, patch: diff)
      else
        @client.socket.send JSON.dump(id: @id, action: 'object-patch', :'version-new' => version_new, value: data_new)
      end
    end
  end
  self
end