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