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