Class: SeapigObject

Inherits:
Hash
  • Object
show all
Defined in:
lib/seapig/client.rb

Direct Known Subclasses

SeapigWildcardObject

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(server, object_id, parent = nil) ⇒ SeapigObject

Returns a new instance of SeapigObject.



172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/seapig/client.rb', line 172

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

Instance Attribute Details

#destroyedObject

Returns the value of attribute destroyed.



164
165
166
# File 'lib/seapig/client.rb', line 164

def destroyed
  @destroyed
end

#object_idObject

Returns the value of attribute object_id.



164
165
166
# File 'lib/seapig/client.rb', line 164

def object_id
  @object_id
end

#onproduce_procObject

Returns the value of attribute onproduce_proc.



164
165
166
# File 'lib/seapig/client.rb', line 164

def onproduce_proc
  @onproduce_proc
end

#parentObject

Returns the value of attribute parent.



164
165
166
# File 'lib/seapig/client.rb', line 164

def parent
  @parent
end

#stallObject

Returns the value of attribute stall.



164
165
166
# File 'lib/seapig/client.rb', line 164

def stall
  @stall
end

#validObject

Returns the value of attribute valid.



164
165
166
# File 'lib/seapig/client.rb', line 164

def valid
  @valid
end

#versionObject

Returns the value of attribute version.



164
165
166
# File 'lib/seapig/client.rb', line 164

def version
  @version
end

Instance Method Details

#changed(new_version = nil) ⇒ Object



228
229
230
231
232
233
234
# File 'lib/seapig/client.rb', line 228

def changed(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

#matches?(id) ⇒ Boolean

Returns:

  • (Boolean)


167
168
169
# File 'lib/seapig/client.rb', line 167

def matches?(id)
	id =~ Regexp.new(Regexp.escape(@object_id).gsub('\*','.*?'))
end

#onchange(&block) ⇒ Object



186
187
188
# File 'lib/seapig/client.rb', line 186

def onchange(&block)
	@onchange_proc = block
end

#onproduce(&block) ⇒ Object



191
192
193
# File 'lib/seapig/client.rb', line 191

def onproduce(&block)
	@onproduce_proc = block
end

#patch(message) ⇒ Object



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/seapig/client.rb', line 196

def patch(message)
	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
	@onchange_proc.call(self) if @onchange_proc
end

#sanitizedObject



237
238
239
# File 'lib/seapig/client.rb', line 237

def sanitized
	JSON.load(JSON.dump(self))
end

#set(data, version) ⇒ Object



215
216
217
218
219
220
221
222
223
224
225
# File 'lib/seapig/client.rb', line 215

def set(data, version)
	if data
		@stall = false
		self.clear
		self.merge!(data)
		@shadow = sanitized
	else
		@stall = true
	end
	@version = version
end

#upload(old_version, old_object, object_id) ⇒ Object



242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# File 'lib/seapig/client.rb', line 242

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)
end