collab 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4cb3d5c84a09fbfdcadf548291acb8c10029accff305db17230b93d18516a7a8
4
- data.tar.gz: 79496d3f80f590a45702ac7b5ccb2bd1f8b8eb7a7aa12cf17e8a90775c81ed13
3
+ metadata.gz: ae9c092826099d0d81012ba20446f93518d9f998136d110ae71141bed2a58e22
4
+ data.tar.gz: e6de0fca8c103f77bdf6677fb0ab993a8740eae2baf7292f28cf601a5946f4b7
5
5
  SHA512:
6
- metadata.gz: 821930a89df64df41fb0efc9e7963392e0d935b172c44cdf5270b48c4e1a4c7da052055ae478ba19fe01b30c652b2d3eb8c61c7b8f8c3ec00a8ea08e16acacca
7
- data.tar.gz: 4010cd1d1b9457897739a0336ec93a277fa14e464bceb5f6bd6f488154696d4874f8b6695dd9fc3871233585a375c0a1c6f04a8e5f52f71ffc5690ea873f2e5a
6
+ metadata.gz: a9db9beb2c46f7b4818fd494075ddb31ee68bcb137c3a347f71acf754efc3788afbaf2b67248b9e7b1a9bd80a780015a2a1db5a5778533823d32a83134550954
7
+ data.tar.gz: d65efb8027b52bf44c14e3a36829f66a845130dca3cffaf002b0ec0fe8cdeed2a137fd6e671aff6555c52ed03705b66e72f54fab5b2872aaa30d872f4f83d476
@@ -1,3 +1,5 @@
1
+ require "collab/railtie"
2
+
1
3
  module Collab
2
4
  def self.config
3
5
  @config ||= Collab::Config.new
@@ -7,7 +9,6 @@ module Collab
7
9
 
8
10
  autoload "Config", "collab/config"
9
11
  autoload "Bridge", "collab/bridge"
10
- autoload "Railtie", "collab/railtie"
11
12
  autoload "HasCollaborativeDocument", "collab/has_collaborative_document"
12
13
 
13
14
  module Models
@@ -23,7 +23,7 @@ module Collab
23
23
 
24
24
  def initialize
25
25
  @node = Dir.chdir(Rails.root) do
26
- IO.popen(["node", "-e", %q{"require('rails-collab-server')"}], "r+")
26
+ IO.popen(["node", "-e", "require('rails-collab-server')"], "r+")
27
27
  end
28
28
  end
29
29
 
@@ -31,24 +31,24 @@ module Collab
31
31
  @current ||= new
32
32
  end
33
33
 
34
- def call(name, data = nil, schemaName:)
35
- req = {name: name, data: data, schemaPackage: ::Collab.config.schema_package, schemaName: schemaName}
34
+ def call(name, data = nil, schema_name:)
35
+ req = {name: name, data: data, schemaPackage: ::Collab.config.schema_package, schemaName: schema_name}
36
36
  @node.puts(JSON.generate(req))
37
37
  res = JSON.parse(@node.gets)
38
38
  raise ::Collab::Bridge::JSRuntimeError.new(res["error"]) if res["error"]
39
39
  res["result"]
40
40
  end
41
41
 
42
- def apply_transaction(document, transaction, schemaName:)
43
- call("applyTransaction", {doc: document, data: transaction}, schemaName: schemaName)
42
+ def apply_transaction(document, transaction, schema_name:)
43
+ call("applyTransaction", {doc: document, data: transaction}, schema_name: schema_name)
44
44
  end
45
45
 
46
- def html_to_document(html, schemaName:)
47
- call("htmlToDoc", html, schemaName: schemaName)
46
+ def html_to_document(html, schema_name:)
47
+ call("htmlToDoc", html, schema_name: schema_name)
48
48
  end
49
49
 
50
- def document_to_html(document, schemaName:)
51
- call("docToHtml", document, schemaName: schemaName)
50
+ def document_to_html(document, schema_name:)
51
+ call("docToHtml", document, schema_name: schema_name)
52
52
  end
53
53
  end
54
54
  end
@@ -0,0 +1,32 @@
1
+ module Collab
2
+ module Channel
3
+ def document; @document end
4
+
5
+ def subscribed
6
+ @document = find_document
7
+
8
+ starting_version = params[:startingVersion]&.to_i
9
+ raise "missing startingVersion" if starting_version.nil?
10
+
11
+ stream_for document
12
+
13
+ transactions = document.transactions
14
+ .where("document_version > ?", starting_version)
15
+ .order(document_version: :asc)
16
+ .load
17
+
18
+ raise "invalid version" unless transactions.first.document_version == (starting_version + 1) unless transactions.empty?
19
+
20
+ transactions.lazy.map(&:as_json).each(method(:transmit))
21
+ end
22
+
23
+ def submit(data)
24
+ authorize_submit!(data)
25
+ document.perform_transaction_later(data)
26
+ end
27
+
28
+ def unsubscribed
29
+ stop_all_streams # this may not be needed
30
+ end
31
+ end
32
+ end
@@ -1,15 +1,5 @@
1
1
  module Collab
2
2
  class Config
3
- attr_accessor :max_transactions, :application_job, :queue_document_transaction_job_as, :schema_package, :application_record, :document_transaction_model, :document_model
4
-
5
- def find_document_for_subscribe(&block)
6
- @find_document_for_subscribe unless block
7
- @find_document_for_subscribe = block
8
- end
9
-
10
- def authorize_update_document(&block)
11
- @authorize_update_document unless block
12
- @authorize_update_document = block
13
- end
3
+ attr_accessor :max_transactions, :application_job, :queue_document_transaction_job_as, :schema_package, :application_record, :document_transaction_model, :document_model, :channel_name
14
4
  end
15
5
  end
@@ -29,8 +29,6 @@ module Collab
29
29
  end
30
30
 
31
31
  def from_html(html)
32
- raise "cannot override a persisted document" if self.persisted?
33
-
34
32
  self.document = ::Collab::Bridge.current.html_to_document(html, schema_name: schema_name)
35
33
  end
36
34
 
@@ -16,7 +16,7 @@ module Collab
16
16
  end
17
17
 
18
18
  def broadcast
19
- ::Collab::DocumentChannel.broadcast_to(document, as_json)
19
+ ::Collab.config.channel_name.constantize.broadcast_to(document, as_json)
20
20
  end
21
21
  end
22
- end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module Collab
2
- VERSION = '0.1.5'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -22,6 +22,8 @@ module Collab
22
22
  "db/migrate/create_collab_tables.rb",
23
23
  )
24
24
 
25
+ copy_file "channel.rb", "app/channels/collab_document_channel.rb"
26
+
25
27
  copy_file "initializer.rb", "config/initializers/collab.rb"
26
28
  end
27
29
  end
@@ -0,0 +1,19 @@
1
+ class CollabDocumentChannel < ApplicationCable::Channel
2
+ include Collab::Channel
3
+
4
+ private
5
+
6
+ # Find the document to subscribe to based on the params passed to the channel
7
+ # Authorization may also be performed here (raise an error)
8
+ def find_document
9
+ Collab::Models::Document.find(params[:document_id]).tap do |document|
10
+ raise "authorization failed"
11
+ end
12
+ end
13
+
14
+ # Called when a client submits a transaction in order to update a document
15
+ # You should throw an error if unauthorized
16
+ def authorize_submit!
17
+ raise "authorization failed"
18
+ end
19
+ end
@@ -17,7 +17,7 @@ class CreateCollabTables < ActiveRecord::Migration[6.0]
17
17
  end
18
18
 
19
19
  create_table :collab_document_transactions, id: false do |t|
20
- t.references :document, null: false, foreign_key: {to_table: :collaborative_documents}, type: :uuid, index: false
20
+ t.references :document, null: false, foreign_key: {to_table: :collab_documents}, type: :uuid, index: false
21
21
 
22
22
  t.jsonb :steps, array: true, null: false
23
23
  t.integer :document_version, null: false
@@ -6,20 +6,11 @@ Collab.config do |c|
6
6
  # How many old transactions to keep per document
7
7
  c.max_transactions = 250
8
8
 
9
- # Handlers
10
- # ========
11
- # Find a the document to subscribe to based on the params passed to the channel
12
- # Authorization may also be performed here (raise an error)
13
- # The block is executed in the scope of the ActionCable channel within #subscribe
14
- c.find_document_for_subscribe do
15
- Collab::Models::Document.find params[:document_id]
16
- end
17
- # Called when a client submits a transaction in order to update a document
18
- # You should throw an error if unauthorized
19
- # The block is executed in the instance of the channel
20
- c.authorize_update_document do |document, transaction_data|
21
- # raise "authorization failed"
22
- end
9
+ # ActionCable settings
10
+ # ====================
11
+ # The document channel to use for collaboration
12
+ # If you change this, you must pass {channel: "[ChannelName]"} as subscription params to the Javascript client
13
+ c.channel_name = "::CollabDocumentChannel"
23
14
 
24
15
  # ActionJob settings
25
16
  # ==================
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: collab
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Aubin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-30 00:00:00.000000000 Z
11
+ date: 2020-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,10 +52,10 @@ extensions: []
52
52
  extra_rdoc_files: []
53
53
  files:
54
54
  - Rakefile
55
- - app/channels/collab/document_channel.rb
56
55
  - app/jobs/collab/document_transaction_job.rb
57
56
  - lib/collab.rb
58
57
  - lib/collab/bridge.rb
58
+ - lib/collab/channel.rb
59
59
  - lib/collab/config.rb
60
60
  - lib/collab/has_collaborative_document.rb
61
61
  - lib/collab/models/base.rb
@@ -64,6 +64,7 @@ files:
64
64
  - lib/collab/railtie.rb
65
65
  - lib/collab/version.rb
66
66
  - lib/generators/collab/install/install_generator.rb
67
+ - lib/generators/collab/install/templates/channel.rb
67
68
  - lib/generators/collab/install/templates/create_collab_tables.rb
68
69
  - lib/generators/collab/install/templates/initializer.rb
69
70
  - lib/tasks/collab_tasks.rake
@@ -1,28 +0,0 @@
1
- class Collab::DocumentChannel < ApplicationCable::Channel
2
- def subscribed
3
- @document = instance_exec(::Collab.config.find_document_for_subscribe)
4
-
5
- starting_version = params[:startingVersion]&.to_i
6
- raise "missing startingVersion" if starting_version.nil?
7
-
8
- stream_for @document
9
-
10
- transactions = @document.transactions
11
- .where("document_version > ?", starting_version)
12
- .order(document_version: :asc)
13
- .load
14
-
15
- raise "invalid version" unless transactions.first.document_version == (starting_version + 1) unless transactions.empty?
16
-
17
- transactions.lazy.map(&:as_json).each(method(:transmit))
18
- end
19
-
20
- def submit(data)
21
- instance_exec(@document, data, &::Collab.config.authorize_update_document)
22
- @document.perform_transaction_later(data)
23
- end
24
-
25
- def unsubscribed
26
- stop_all_streams # this may not be needed
27
- end
28
- end