collab 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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