pinkman 0.9.9.9.9 → 0.9.9.9.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/pinkman_base/controller.coffee +3 -1
- data/app/channels/pinkman_channel.rb +48 -0
- data/lib/generators/pinkman/channel_generator.rb +6 -1
- data/lib/generators/pinkman/templates/channel.rb.erb +40 -5
- data/lib/pinkman/broadcaster.rb +119 -0
- data/lib/pinkman/version.rb +1 -1
- data/lib/pinkman.rb +1 -17
- metadata +4 -4
- data/lib/generators/pinkman/pinkman_channel_generator.rb +0 -12
- data/lib/generators/pinkman/templates/pinkman_channel.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2578f7ed00a7dbdeb84024113b941e578ce5df966cb3835637879aca2adaae1e
|
4
|
+
data.tar.gz: c04a023cf880c0ff3e4618fb778330f2da7f141a06703bb69d3c0ef1a05512a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88f823fd6b206c0bf6027f3cc2ce89deb8da96f7e3d413d5039eb5e20b33c2fc5197d3c00a4b3040414cbbf3ed5a1b9dc99d1dcb7637818d3408eef46e937f63
|
7
|
+
data.tar.gz: 014dcc79ec52d9fd9ee2b1a9b5bdb01389c182c853224409a6160aeffacc53001e93b7475eac6a9b4d3c8b685f7fafcd41c923a32f600c114689a053aea1d2d9
|
@@ -291,7 +291,9 @@ class window.PinkmanController extends window.PinkmanObject
|
|
291
291
|
throw 'Callback not found.'
|
292
292
|
params = if (typeof opt == 'object' and opt['params']?) then opt['params'] else new Object
|
293
293
|
params.channel = channel
|
294
|
-
|
294
|
+
if $p.isObject(opt)
|
295
|
+
params.room = opt.room if opt.room?
|
296
|
+
params.filter_by = (opt.filter_by or opt.filterBy ) if (opt.filterBy? or opt.filter_by?)
|
295
297
|
Pinkman.cable.subscriptions.create params, received: callback
|
296
298
|
|
297
299
|
scrolling: (callback) ->
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'pinkman/broadcaster'
|
2
|
+
|
3
|
+
class PinkmanChannel < ActionCable::Channel::Base
|
4
|
+
|
5
|
+
def self.model
|
6
|
+
@model || self.to_s.gsub('Channel','').constantize
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.model= model
|
10
|
+
@model = model
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.rooms
|
14
|
+
@rooms ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.broadcast scope
|
18
|
+
broadcasting = Pinkman::Broadcaster.new(scope: scope, model: model)
|
19
|
+
if block_given?
|
20
|
+
yield(broadcasting)
|
21
|
+
if broadcasting.save
|
22
|
+
broadcasting
|
23
|
+
else
|
24
|
+
raise "Pinkman: Error trying to broadcasting to #{broadcasting.room}."
|
25
|
+
end
|
26
|
+
else
|
27
|
+
raise 'PinkmanChannel.broadcast: no block given'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def model
|
32
|
+
self.class.model
|
33
|
+
end
|
34
|
+
|
35
|
+
def subscribed
|
36
|
+
stream
|
37
|
+
end
|
38
|
+
|
39
|
+
def unsubscribed
|
40
|
+
stop_all_streams
|
41
|
+
end
|
42
|
+
|
43
|
+
def stream
|
44
|
+
Pinkman::Broadcaster.stream(self,current_scope,params)
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
end
|
@@ -16,13 +16,18 @@ module Pinkman
|
|
16
16
|
class_name.camelize
|
17
17
|
end
|
18
18
|
|
19
|
+
def room_name
|
20
|
+
model_name.tableize
|
21
|
+
end
|
22
|
+
|
19
23
|
def channel_name
|
20
24
|
model_name + 'Channel'
|
21
25
|
end
|
22
26
|
|
23
27
|
def file_name
|
24
28
|
class_name.underscore + "_channel.rb"
|
25
|
-
end
|
29
|
+
end
|
30
|
+
alias filename file_name
|
26
31
|
|
27
32
|
end
|
28
33
|
end
|
@@ -1,10 +1,45 @@
|
|
1
1
|
class <%= channel_name %> < PinkmanChannel
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def unsubscribed
|
3
|
+
# TO DO: use connection/params to determine the current scope
|
4
|
+
def current_scope
|
5
|
+
:public
|
8
6
|
end
|
9
7
|
|
8
|
+
# broadcast :public do |config|
|
9
|
+
# config.room :<%= room_name %>
|
10
|
+
# end
|
11
|
+
|
12
|
+
# --- Quick Broadcast Guide
|
13
|
+
|
14
|
+
# Start a broadcast here to transmit <%= model_name %>.
|
15
|
+
|
16
|
+
# Who consumes the transmission?
|
17
|
+
# Everyone that subscribes to <%= channel_name %> and have a current_scope that is broadcasting something.
|
18
|
+
|
19
|
+
# What gets broadcasted?
|
20
|
+
# Every instance of <%= model_name %> that gets created, updated or destroyed
|
21
|
+
# is broadcasted as json of the passed scope.
|
22
|
+
|
23
|
+
# Optionally, you can use filter_by to restrict
|
24
|
+
# the transmission to a particular group of records.
|
25
|
+
|
26
|
+
# --- Usage
|
27
|
+
|
28
|
+
# -- js/coffe - client:
|
29
|
+
# App.controller 'any-controller', ->
|
30
|
+
# @main = ->
|
31
|
+
#
|
32
|
+
# @subscribe '<%= channel_name %>',
|
33
|
+
# room: '<%= room_name %>'
|
34
|
+
# filter_by: 123
|
35
|
+
|
36
|
+
# -- ruby / server: here (<%= filename %>)
|
37
|
+
# broadcast :public do |config|
|
38
|
+
# config.room :<%= room_name %>
|
39
|
+
#
|
40
|
+
# config.filter_by :attribute
|
41
|
+
# # Only records that got `attribute == 123` will be broadcasted.
|
42
|
+
#
|
43
|
+
# end
|
44
|
+
|
10
45
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
class Pinkman::Broadcaster
|
4
|
+
|
5
|
+
include ActiveModel::Validations
|
6
|
+
|
7
|
+
attr_accessor :model, :scope, :record
|
8
|
+
validates :model, :room, :scope, presence: true
|
9
|
+
|
10
|
+
|
11
|
+
def initialize options
|
12
|
+
self.scope = options[:scope]
|
13
|
+
self.model = options[:model]
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.broadcasters
|
18
|
+
@broadcasters ||= {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.broadcast room, scope, action, record
|
22
|
+
ActionCable.server.broadcast(room_name_from_record(room,record), {action: action, data: record.json_hash(scope)})
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.stream channel, scope, params
|
26
|
+
if params[:room].present?
|
27
|
+
broadcaster = broadcasters[params[:room].to_sym]
|
28
|
+
if broadcaster.present? and broadcaster.scope == scope
|
29
|
+
channel.stream_from(room_name_from_params(broadcaster,params))
|
30
|
+
else
|
31
|
+
raise "Insuficient permissions or room '#{params[:room]}' not found."
|
32
|
+
end
|
33
|
+
else
|
34
|
+
raise 'Room not specified through client.'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.room_name_from_params broadcaster, params
|
39
|
+
if params[:filter_by].is_a? String
|
40
|
+
broadcaster.encrypt(broadcaster.room,params[:filter_by])
|
41
|
+
elsif params[:filter_by].is_a? Array
|
42
|
+
broadcaster.encrypt(broadcaster.room, params[:filter_by].join(' '))
|
43
|
+
else
|
44
|
+
broadcaster.room
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.room_name_from_record room_name, record
|
49
|
+
broadcaster = broadcasters[room_name.to_sym]
|
50
|
+
if broadcaster
|
51
|
+
broadcaster.room_name(record)
|
52
|
+
else
|
53
|
+
raise "#{room_name} not found/declared"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def room room_name=nil
|
58
|
+
if room_name.present?
|
59
|
+
@room = room_name
|
60
|
+
else
|
61
|
+
@room
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def filter_by *args
|
66
|
+
if args.any?
|
67
|
+
@filter_by = args
|
68
|
+
else
|
69
|
+
@filter_by ||= []
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def save
|
74
|
+
valid? and (self.class.broadcasters[room.to_sym] = self) and set_callbacks
|
75
|
+
end
|
76
|
+
|
77
|
+
def get_record params
|
78
|
+
if filter_by.any? and params[:filter_by].present?
|
79
|
+
where_hash = {}
|
80
|
+
filter_by.each_with_index {|attribute,i| where_hash[attribute] = params[:filter_by][i] }
|
81
|
+
model.where(where_hash).first if model.where(where_hash).any?
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def encrypt_room_name(record)
|
86
|
+
passphrase = filter_by.map { |attribute| record.send(attribute) }.join(' ')
|
87
|
+
encrypt(room,passphrase)
|
88
|
+
end
|
89
|
+
|
90
|
+
def encrypt room_name, passphrase
|
91
|
+
md5(room_name.to_s + 'pinkroom' + passphrase)
|
92
|
+
end
|
93
|
+
|
94
|
+
def room_name(record=nil)
|
95
|
+
(record.present? and filter_by.any?) ? encrypt_room_name(record) : room
|
96
|
+
end
|
97
|
+
|
98
|
+
def md5 val
|
99
|
+
Digest::MD5.hexdigest(val)
|
100
|
+
end
|
101
|
+
|
102
|
+
def set_callbacks
|
103
|
+
if valid?
|
104
|
+
['create','update','destroy'].each do |action|
|
105
|
+
current_room = room
|
106
|
+
current_scope = scope
|
107
|
+
method_name = "broadcast_#{action}_to_#{room}".to_sym
|
108
|
+
unless model.instance_methods.include?(method_name)
|
109
|
+
model.define_method method_name do
|
110
|
+
Pinkman::Broadcaster.broadcast(current_room, current_scope, action, self)
|
111
|
+
end
|
112
|
+
model.send("after_#{action}".to_sym, method_name)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
true
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
data/lib/pinkman/version.rb
CHANGED
data/lib/pinkman.rb
CHANGED
@@ -5,6 +5,7 @@ require 'pinkman/serializer'
|
|
5
5
|
require 'pinkman/views_helpers'
|
6
6
|
require 'pinkman/form_helper'
|
7
7
|
require 'pinkman/version'
|
8
|
+
require 'pinkman/broadcaster'
|
8
9
|
|
9
10
|
module Pinkman
|
10
11
|
|
@@ -39,23 +40,6 @@ module Pinkman
|
|
39
40
|
# Extending ActiveRecord
|
40
41
|
ActiveRecord::Base.singleton_class.class_eval do
|
41
42
|
|
42
|
-
# Real time
|
43
|
-
def broadcast_to room, scope
|
44
|
-
@broadcasting_to ||= {}
|
45
|
-
@broadcasting_to[room] = scope
|
46
|
-
['create','update','destroy'].each do |action|
|
47
|
-
send("after_#{action}".to_sym, "broadcast_#{action}_#{room}".to_sym)
|
48
|
-
define_method "broadcast_#{action}_#{room}" do
|
49
|
-
ActionCable.server.broadcast room, {action: action, data: json_hash(scope)}
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def allow_streaming? room, scope
|
55
|
-
@broadcasting_to.is_a?(Hash) and @broadcasting_to[room] == scope
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
43
|
# Serializer
|
60
44
|
def serializer= value
|
61
45
|
@serializer = value
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pinkman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.9.9.
|
4
|
+
version: 0.9.9.9.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Agilso Oliveira
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -222,6 +222,7 @@ files:
|
|
222
222
|
- app/assets/stylesheets/pinkman/sector.scss
|
223
223
|
- app/assets/stylesheets/pinkman/tables.scss
|
224
224
|
- app/assets/stylesheets/pinkman/typo.scss
|
225
|
+
- app/channels/pinkman_channel.rb
|
225
226
|
- app/controllers/pinkman/pinkman_controller.rb
|
226
227
|
- app/helpers/pinkman/pinkman_helper.rb
|
227
228
|
- app/views/pinkman/_error_for.html.slim
|
@@ -242,7 +243,6 @@ files:
|
|
242
243
|
- lib/generators/pinkman/install_generator.rb
|
243
244
|
- lib/generators/pinkman/model_generator.rb
|
244
245
|
- lib/generators/pinkman/page_generator.rb
|
245
|
-
- lib/generators/pinkman/pinkman_channel_generator.rb
|
246
246
|
- lib/generators/pinkman/resource_generator.rb
|
247
247
|
- lib/generators/pinkman/route_generator.rb
|
248
248
|
- lib/generators/pinkman/route_resource_generator.rb
|
@@ -267,10 +267,10 @@ files:
|
|
267
267
|
- lib/generators/pinkman/templates/pink_template.html.erb.erb
|
268
268
|
- lib/generators/pinkman/templates/pink_template.html.haml.erb
|
269
269
|
- lib/generators/pinkman/templates/pink_template.html.slim.erb
|
270
|
-
- lib/generators/pinkman/templates/pinkman_channel.rb
|
271
270
|
- lib/generators/pinkman/templates/serializer.rb.erb
|
272
271
|
- lib/pinkman.rb
|
273
272
|
- lib/pinkman/base_helper.rb
|
273
|
+
- lib/pinkman/broadcaster.rb
|
274
274
|
- lib/pinkman/form_helper.rb
|
275
275
|
- lib/pinkman/form_helper/form_helpers.rb
|
276
276
|
- lib/pinkman/serializer.rb
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'rails/generators/base'
|
2
|
-
|
3
|
-
module Pinkman
|
4
|
-
class PinkmanChannelGenerator < ::Rails::Generators::Base
|
5
|
-
source_root File.expand_path('../templates', __FILE__)
|
6
|
-
|
7
|
-
def copy_pinkman_channel_file
|
8
|
-
template "pinkman_channel.rb", "app/channels/pinkman_channel.rb"
|
9
|
-
end
|
10
|
-
|
11
|
-
end
|
12
|
-
end
|