Skip to content
This repository was archived by the owner on Oct 19, 2018. It is now read-only.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e3cc02a

Browse files
committedMay 11, 2016
working - files need to be split up though
1 parent fb33c4d commit e3cc02a

File tree

6 files changed

+161
-226
lines changed

6 files changed

+161
-226
lines changed
 

‎lib/active_record/base.rb

Lines changed: 0 additions & 54 deletions
This file was deleted.

‎lib/reactive_record/syncromesh.rb.erb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ module ReactiveRecord
55
include React::IsomorphicHelpers
66

77
def self.sync_change(data)
8-
puts "sync_change(#{data})"
98
Base.when_not_saving(Object.const_get(data[:klass])) do |klass|
109
klass._react_param_conversion(data[:record]).backing_record.sync_scopes
1110
end
1211
end
1312

1413
def self.sync_destroy(data)
15-
puts "sync_destroy(#{data})"
1614
record = Object.const_get(data[:klass])._react_param_conversion(data[:record])
1715
ReactiveRecord::Base.load_data { record.destroy }
1816
record.backing_record.destroyed = true

‎lib/reactive_record/syncromesh_controller.rb

Lines changed: 0 additions & 14 deletions
This file was deleted.

‎lib/syncromesh.rb

Lines changed: 161 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,39 @@
1+
module ActiveRecord
2+
class Base
3+
4+
class << self
5+
6+
def no_auto_sync
7+
@no_auto_sync = true
8+
end
9+
10+
alias_method :old_scope, :scope
11+
12+
def scope(name, server, client = nil)
13+
if server == :no_sync
14+
server = client
15+
client = nil
16+
elsif client.nil? && @no_auto_sync.nil?
17+
client = server
18+
end
19+
if RUBY_ENGINE == 'opal' && client
20+
to_sync name do |scope, model|
21+
if ReactiveRecord::SyncWrapper.new(model).instance_eval(&client)
22+
scope << model
23+
else
24+
scope.delete(model)
25+
end
26+
end
27+
end
28+
old_scope(name, server)
29+
end
30+
end
31+
end
32+
end
33+
134
if RUBY_ENGINE == 'opal'
235

336
require_relative 'syncromesh/version'
4-
require_relative 'active_record/base'
537
require_relative 'reactive_record/syncromesh'
638
require_relative 'reactive_record/base'
739
require_relative 'reactive_record/sync_wrapper'
@@ -10,9 +42,134 @@
1042

1143
require 'opal'
1244
require "syncromesh/version"
13-
require 'syncromesh/syncromesh'
14-
require 'syncromesh/simple_poller'
15-
require 'reactive_record/syncromesh_controller'
45+
require "syncromesh/configuration"
46+
47+
module Syncromesh
48+
49+
extend Syncromesh::Configuration
50+
51+
define_setting :transport, :pusher
52+
define_setting :app_id
53+
define_setting :key
54+
define_setting :secret
55+
define_setting :encrypted, true
56+
define_setting :channel_prefix
57+
define_setting :seconds_polled_data_will_be_retained, 5*60
58+
define_setting :seconds_between_poll, 0.50
59+
define_setting :client_logging, true
60+
61+
def self.pusher
62+
unless channel_prefix
63+
transport = nil
64+
raise "******** NO CHANNEL PREFIX SET ***************"
65+
end
66+
@pusher ||= Pusher::Client.new(
67+
app_id: app_id,
68+
key: key,
69+
secret: secret,
70+
encrypted: encrypted
71+
)
72+
end
73+
74+
def self.channel
75+
"#{channel_prefix}"
76+
end
77+
78+
def self.after_change(model)
79+
if transport == :pusher
80+
pusher.trigger(Syncromesh.channel, 'change', klass: model.class.name, record: model.react_serializer)
81+
elsif transport == :simple_poller
82+
SimplePoller.write('change', {klass: model.class.name, record: model.react_serializer})
83+
elsif transport != :none
84+
raise "Unknown transport #{Syncromesh.transport} - not supported"
85+
end
86+
end
87+
88+
def self.after_destroy(model)
89+
if transport == :pusher
90+
pusher.trigger(Syncromesh.channel, 'destroy', klass: model.class.name, record: model.react_serializer)
91+
elsif transport == :simple_poller
92+
SimplePoller.write('destroy', {klass: model.class.name, record: model.react_serializer})
93+
elsif transport != :none
94+
raise "Unknown transport #{Syncromesh.transport} - not supported"
95+
end
96+
end
97+
98+
module SimplePoller
99+
100+
require "pstore"
101+
102+
def self.subscribe
103+
subscriber = SecureRandom.hex(10)
104+
update_store do |store|
105+
store[subscriber] = {data: [], last_read_at: Time.now}
106+
end
107+
subscriber
108+
end
109+
110+
def self.read(subscriber)
111+
update_store do |store|
112+
data = store[subscriber][:data] rescue []
113+
store[subscriber] = {data: [], last_read_at: Time.now}
114+
data
115+
end
116+
end
117+
118+
def self.write(event, data)
119+
update_store do |store|
120+
store.each do |subscriber, subscriber_store|
121+
subscriber_store[:data] << [event, data]
122+
end
123+
end
124+
125+
end
126+
127+
def self.update_store
128+
store = PStore.new('syncromesh-simple-poller-store')
129+
store.transaction do
130+
data = store[:data] || {}
131+
data.delete_if do |subscriber, subscriber_store|
132+
subscriber_store[:last_read_at] < Time.now-Syncromesh.seconds_polled_data_will_be_retained
133+
end
134+
result = yield data
135+
store[:data] = data
136+
result
137+
end
138+
end
139+
end
140+
end
141+
142+
module ActiveRecord
143+
144+
class Base
145+
after_commit :syncromesh_after_change, on: [:create, :update]
146+
after_commit :syncromesh_after_destroy, on: [:destroy]
147+
148+
def syncromesh_after_change
149+
Syncromesh.after_change self
150+
end
151+
152+
def syncromesh_after_destroy
153+
Syncromesh.after_destroy self
154+
end
155+
end
156+
157+
end
158+
159+
module ReactiveRecord
160+
161+
class SyncromeshController < ::ActionController::Base
162+
163+
def subscribe
164+
render json: {id: Syncromesh::SimplePoller.subscribe}
165+
end
166+
167+
def read
168+
render json: Syncromesh::SimplePoller.read(params[:subscriber])
169+
end
170+
end
171+
172+
end
16173

17174
Opal.append_path File.expand_path('../', __FILE__).untaint
18175

‎lib/syncromesh/simple_poller.rb

Lines changed: 0 additions & 45 deletions
This file was deleted.

‎lib/syncromesh/syncromesh.rb

Lines changed: 0 additions & 107 deletions
This file was deleted.

0 commit comments

Comments
 (0)
This repository has been archived.