anycable-core 1.4.2 → 1.4.4

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: 391832d2af2280297419d7f62853313d8ac005e7ca826654d6669135748cb8e8
4
- data.tar.gz: 229e4b51b7eaed689f0394445e86ba96cb08889391ae343b810439a727e30c0f
3
+ metadata.gz: b02bcc10302bdd445b92e77c0ce354734e82a0ba124c9e88b2997b87013bbf3d
4
+ data.tar.gz: dadf0fdc856292e614f39ebd43b996da49ce4e9771408429ba75fae7ace9877b
5
5
  SHA512:
6
- metadata.gz: c951c3a248b67b9d481865d4a7c1e3d75f76ca963a8f314c8a4889fe9ab1e28eb889ecd48094c96802a20c9196f0932051167c1bd32b54ebf7d7d95dce71620b
7
- data.tar.gz: 630c505792b0f374dc6acf7ffa861fcde660687ed7ac8894a0275e9f8d707133dbb9c29c24ed7b0e1dd8650b428a421243d5d1179361421996c850bdc50d0128
6
+ metadata.gz: 918addcfda8aea6f57eb7fd4872a4b93eeafc18862e93d75221d55f13ded38c218c231a47fbf1b803ca717618a518a05b0c6bf86b080000aa566281842033167
7
+ data.tar.gz: f96deb1656000ce9d2089f94da40860bb9820598a5afb002a7ae5c2bc28f71f799dad6efeeea824e7bf306ceb8b76aad109b824c675391d4f218a81f90d9e491
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.4.3 (2023-10-15)
6
+
7
+ - Add broadcast options support. ([@palkan][])
8
+
9
+ - Add batch-broadcasting support. ([@palkan][])
10
+
5
11
  ## 1.4.2 (2023-09-05)
6
12
 
7
13
  - Fix parsing sentinel configuration from YAML in Rails. ([@palkan][])
@@ -7,8 +7,31 @@ module AnyCable
7
7
  raise NotImplementedError
8
8
  end
9
9
 
10
- def broadcast(stream, payload)
11
- raw_broadcast({stream: stream, data: payload}.to_json)
10
+ def batching(enabled = true)
11
+ self.batching_enabled = enabled
12
+ yield
13
+ ensure
14
+ maybe_flush_batch
15
+ end
16
+
17
+ def start_batching
18
+ self.batching_enabled = true
19
+ end
20
+
21
+ def finish_batching
22
+ maybe_flush_batch
23
+ end
24
+
25
+ def batching?
26
+ Thread.current[:anycable_batching]&.last
27
+ end
28
+
29
+ def broadcast(stream, payload, options = nil)
30
+ if batching?
31
+ current_batch << {stream: stream, data: payload, meta: options}.compact
32
+ else
33
+ raw_broadcast({stream: stream, data: payload, meta: options}.compact.to_json)
34
+ end
12
35
  end
13
36
 
14
37
  def broadcast_command(command, **payload)
@@ -21,6 +44,32 @@ module AnyCable
21
44
 
22
45
  private
23
46
 
47
+ def batching_enabled=(val)
48
+ # The stack must start with the true value,
49
+ # so we can check for emptiness to decide whether to flush
50
+ stack = batching_enabled_stack
51
+ stack << val if val || !stack.empty?
52
+ end
53
+
54
+ def batching_enabled_stack
55
+ Thread.current[:anycable_batching] ||= []
56
+ end
57
+
58
+ def current_batch
59
+ Thread.current[:anycable_batch] ||= []
60
+ end
61
+
62
+ def maybe_flush_batch
63
+ batching_enabled_stack.pop
64
+ return unless batching_enabled_stack.empty?
65
+
66
+ batch = current_batch
67
+ unless batch.empty?
68
+ raw_broadcast(batch.to_json)
69
+ end
70
+ current_batch.clear
71
+ end
72
+
24
73
  def logger
25
74
  AnyCable.logger
26
75
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AnyCable
4
- VERSION = "1.4.2"
4
+ VERSION = "1.4.4"
5
5
  end
data/lib/anycable.rb CHANGED
@@ -92,8 +92,8 @@ module AnyCable
92
92
 
93
93
  # Raw broadcast message to the channel, sends only string!
94
94
  # To send hash or object use ActionCable.server.broadcast instead!
95
- def broadcast(channel, payload)
96
- broadcast_adapter.broadcast(channel, payload)
95
+ def broadcast(...)
96
+ broadcast_adapter.broadcast(...)
97
97
  end
98
98
 
99
99
  def rpc_handler
@@ -1,7 +1,13 @@
1
1
  module AnyCable
2
+ type broadcastOptions = {exclude_socket: String}
3
+
2
4
  interface _BroadcastAdapter
3
5
  def raw_broadcast: (String _data) -> void
4
- def broadcast: (String stream, String payload) -> void
6
+ def batching: (?bool enabled) { () -> untyped } -> untyped
7
+ def start_batching: () -> void
8
+ def finish_batching: () -> void
9
+ def batching?: () -> (bool | NilClass)
10
+ def broadcast: (String stream, String payload, ?broadcastOptions options) -> void
5
11
  def broadcast_command: (String command, **untyped payload) -> void
6
12
  def announce!: () -> void
7
13
  end
@@ -13,6 +19,10 @@ module AnyCable
13
19
  private
14
20
 
15
21
  def logger: () -> Logger
22
+ def current_batch: () -> Array[untyped]
23
+ def maybe_flush_batch: () -> void
24
+ def batching_enabled_stack: () -> Array[bool]
25
+ def batching_enabled=: (bool) -> void
16
26
  end
17
27
  end
18
28
  end
data/sig/anycable.rbs CHANGED
@@ -36,6 +36,6 @@ module AnyCable
36
36
  def self.server_callbacks: () -> Array[^() -> void]
37
37
  def self.broadcast_adapter: () -> _BroadcastAdapter
38
38
  def self.broadcast_adapter=: (untyped adapter) -> void
39
- def self.broadcast: (String channel, String payload) -> void
39
+ def self.broadcast: (String channel, String payload, ?broadcastOptions options) -> void
40
40
  def self.rpc_handler: () -> RPC::Handler
41
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anycable-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - palkan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-06 00:00:00.000000000 Z
11
+ date: 2024-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: anyway_config
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: google-protobuf
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.13'
33
+ version: '3.25'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.13'
40
+ version: '3.25'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: redis
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -286,7 +286,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
286
  - !ruby/object:Gem::Version
287
287
  version: '0'
288
288
  requirements: []
289
- rubygems_version: 3.4.8
289
+ rubygems_version: 3.4.20
290
290
  signing_key:
291
291
  specification_version: 4
292
292
  summary: AnyCable core RPC implementation