collab 0.1.6 → 0.2.1

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: 035125d713bb0557c3201837d47b34ade974800e4d422c04e8f7705c18e7abf1
4
- data.tar.gz: 4a4c6dae13075523895b6ef394db0848f7030d922a1d8b7abca2f3bd804db72a
3
+ metadata.gz: c3f3f1936db40a7ef5a4e74cd9d1f1e691440d385aaf1414b8bc0af99e8dd06d
4
+ data.tar.gz: 44c4468e3fbce3c218562a9a9278242a5b6776317b9065fbc6a8a5d88341d0e3
5
5
  SHA512:
6
- metadata.gz: c34b9b5002c6d8f1b41c6198c83d78a94cdb826cdc0d53e40b3cb4438114bb12d3a6759b7a73d4cef891f5dea6775cee8fe27c719218011e23194d56cb2213ea
7
- data.tar.gz: 391e56c178e49861157b4479cca2a656175ce5e72de5526483dbc21608078b68da8c0f8399bcaa5f811eb0b536f897dcf0ae50323bd525335051975838ce7dd7
6
+ metadata.gz: 06133afa987cb5d34990f8f0ba82bd7f55fb693c1f47aab9280d13f7c511acdb2b8d64b1b3bfc3e1cb4db0b4eeb948d93caefce28c4aba99c87666d4df94599e
7
+ data.tar.gz: 2b8d25e17ca7a08c5e175a75718d8ba758f86db94fc19e58072c886419c308ff059e9fb2370d293201e2af8a98a12d16ca7f3f63d52f7c7c848c376e3d503431
@@ -7,6 +7,7 @@ module Collab
7
7
  yield @config
8
8
  end
9
9
 
10
+ autoload "Channel", "collab/channel"
10
11
  autoload "Config", "collab/config"
11
12
  autoload "Bridge", "collab/bridge"
12
13
  autoload "HasCollaborativeDocument", "collab/has_collaborative_document"
@@ -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.6'
2
+ VERSION = '0.2.1'
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.6
4
+ version: 0.2.1
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