terminalwire-rails 0.3.4 → 0.3.5.alpha1

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/terminalwire/rails.rb +75 -0
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b673f8d024d72c051166e229a96fa9ee1d9af98aee1ddebf6e1b14ddfc7191e
4
- data.tar.gz: 6b13180556de42dc7ce74fda978f6d73f65e6bae3c56164fa04f7c076846c483
3
+ metadata.gz: d90959e1a40056af30dc79f607892c5d8d0a83fe53d85aa4ae3eb3287fe95024
4
+ data.tar.gz: 4b9027cebbb44ddde23bf53a52cb83dc16663f436714df55b9240dbf15614950
5
5
  SHA512:
6
- metadata.gz: 9a315bf5e6f231ba413c3daa02c1dbc23905f3f27503fc8992f1fc618a0464b9f5f17bac152ab902d21584e9758a55d8f636454fc74c6e54ef1841b71721f967
7
- data.tar.gz: dfc1334dd424c50e709b1db159866945b76f90850a9d83333e19646841550faa2c4207e10a717025fcefb32893ccb16bb153c392d0837dccee9b10f9c853100d
6
+ metadata.gz: eccbe784b7025be7dadaab1be611e311cdfe30c59ce4464fdca0155e822f6b10d12fe4247a28d72d21b2195d1a6ab73ddf2e7220ae1263e15a44555f62e09ec7
7
+ data.tar.gz: 2e111bdda7a9c31b1f84738a624e81cb425fab9bad6f7916e15aa85aa2ea8d7eb5a94d34d884f112cf995357490c47c173751e24d1154c0d9f086be194be3842
@@ -5,6 +5,81 @@ require "jwt"
5
5
 
6
6
  module Terminalwire
7
7
  module Rails
8
+ class Channel
9
+ # Prefix used to for channel name to avoid conflicts.
10
+ NAMESPACE = "terminalwire".freeze
11
+
12
+ # Length of random channel name.
13
+ RANDOM_NAME_LENGTH = 32
14
+
15
+ # 5 minutes, which is really way too much time.
16
+ TIMEOUT_SECONDS = 5 * 60
17
+
18
+ attr_reader :name, :server, :logger, :timeout
19
+
20
+ def initialize(name: self.class.random_name, server: self.class.server, logger: self.class.logger, timeout: TIMEOUT_SECONDS)
21
+ @server = server
22
+ @name = name
23
+ @queue = Queue.new
24
+ @logger = logger
25
+ @timeout = timeout
26
+
27
+ yield self if block_given?
28
+ end
29
+
30
+ def broadcast(message)
31
+ @logger.info "ActiveExchange: Publishing #{message.inspect} to #{@name.inspect}"
32
+ @server.broadcast(@name, message)
33
+ end
34
+ alias :publish :broadcast
35
+
36
+ def subscribe
37
+ return if @queue.closed?
38
+ @logger.info "ActiveExchange: Subscribed to #{@name.inspect}"
39
+ @server.subscribe(@name, -> (message) { @queue << message })
40
+ end
41
+
42
+ def read
43
+ Timeout::timeout @timeout do
44
+ subscribe
45
+ @logger.debug "Queue: waiting"
46
+ @queue.pop
47
+ end
48
+ ensure
49
+ @logger.debug "Queue: closed"
50
+ @queue.close
51
+ end
52
+ alias :pop :read
53
+
54
+ def to_param
55
+ self.class.verifier.generate(@name, expires_in: @timeout)
56
+ end
57
+
58
+ class << self
59
+ def server
60
+ ActionCable.server.pubsub
61
+ end
62
+
63
+ def logger
64
+ ::Rails.logger
65
+ end
66
+
67
+ def random_name
68
+ [NAMESPACE, SecureRandom.hex(RANDOM_NAME_LENGTH)].join(":")
69
+ end
70
+
71
+ # Use Rails' secret_key_base for signing
72
+ def verifier
73
+ @verifier ||= ActiveSupport::MessageVerifier.new(::Rails.application.secret_key_base)
74
+ end
75
+
76
+ def from_param(...)
77
+ new name: verifier.verify(...)
78
+ end
79
+ alias :find :from_param
80
+ end
81
+ end
82
+
8
83
  class Session
9
84
  # JWT file name for the session file.
10
85
  FILENAME = "session.jwt"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terminalwire-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.5.alpha1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brad Gessler
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-02-27 00:00:00.000000000 Z
10
+ date: 2025-03-19 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: terminalwire-server
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.3.4
18
+ version: 0.3.5.alpha1
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.3.4
25
+ version: 0.3.5.alpha1
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rails
28
28
  requirement: !ruby/object:Gem::Requirement