live 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/live/element.rb +22 -6
- data/lib/live/page.rb +6 -6
- data/lib/live/version.rb +1 -1
- data/lib/live/view.rb +28 -9
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb8e5793466102d92b796d1e86a24c1ff6406eb888b772c65a22c1857c49ad5e
|
4
|
+
data.tar.gz: b19804c4d65fa9798615bb681c5062602e2a0406b8a663ac1e8c4ef8a7f2b3c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a9c0e7beec4ba0f3102067b1df4da1329fcd35a90e2eb0de38db4ffa565dea7e56d52c6f4c922efd31aac0ee18d8427c40491f552ff3b5fafdec8d887d38898
|
7
|
+
data.tar.gz: 75f1b08b01c5b1f280ff93290082bc1da873ff1e259e0a76f0b7a996516fcde81cbe1ceb0824e6f817318d100ec86af05714fbcdc5550526e8572ac6eed71e59
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/live/element.rb
CHANGED
@@ -4,13 +4,18 @@
|
|
4
4
|
# Copyright, 2021-2024, by Samuel Williams.
|
5
5
|
|
6
6
|
require 'json'
|
7
|
+
require 'securerandom'
|
7
8
|
|
8
9
|
module Live
|
9
10
|
# Represents a single dynamic content area on the page.
|
10
11
|
class Element
|
12
|
+
def self.unique_id
|
13
|
+
SecureRandom.uuid
|
14
|
+
end
|
15
|
+
|
11
16
|
# @parameter id [String] The unique identifier within the page.
|
12
17
|
# @parameter data [Hash] The data associated with the element, typically stored as `data-` attributes.
|
13
|
-
def initialize(id, **data)
|
18
|
+
def initialize(id = Element.unique_id, **data)
|
14
19
|
@id = id
|
15
20
|
@data = data
|
16
21
|
@data[:class] ||= self.class.name
|
@@ -21,13 +26,24 @@ module Live
|
|
21
26
|
# The unique id within the bound page.
|
22
27
|
attr :id
|
23
28
|
|
29
|
+
# The data associated with the element.
|
30
|
+
attr :data
|
31
|
+
|
24
32
|
# Generate a JavaScript string which forwards the specified event to the server.
|
25
33
|
# @parameter details [Hash] The details associated with the forwarded event.
|
26
|
-
def
|
34
|
+
def forward_event(details = nil)
|
35
|
+
if details
|
36
|
+
"live.forwardEvent(#{JSON.dump(@id)}, event, #{JSON.dump(details)})"
|
37
|
+
else
|
38
|
+
"live.forwardEvent(#{JSON.dump(@id)}, event)"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def forward_form_event(details = nil)
|
27
43
|
if details
|
28
|
-
"live.
|
44
|
+
"live.forwardFormEvent(#{JSON.dump(@id)}, event, #{JSON.dump(details)})"
|
29
45
|
else
|
30
|
-
"live.
|
46
|
+
"live.forwardFormEvent(#{JSON.dump(@id)}, event)"
|
31
47
|
end
|
32
48
|
end
|
33
49
|
|
@@ -49,9 +65,9 @@ module Live
|
|
49
65
|
# Enqueue a remote procedure call to the currently bound page.
|
50
66
|
# @parameter method [Symbol] The name of the remote functio to invoke.
|
51
67
|
# @parameter arguments [Array]
|
52
|
-
def rpc(
|
68
|
+
def rpc(*arguments)
|
53
69
|
# This update might not be sent right away. Therefore, mutable arguments may be serialized to JSON at a later time (or never). This could be a race condition:
|
54
|
-
@page.updates.enqueue(
|
70
|
+
@page.updates.enqueue(arguments)
|
55
71
|
end
|
56
72
|
end
|
57
73
|
end
|
data/lib/live/page.rb
CHANGED
@@ -50,7 +50,7 @@ module Live
|
|
50
50
|
if element = @elements[id]
|
51
51
|
return element.handle(event)
|
52
52
|
else
|
53
|
-
Console.
|
53
|
+
Console.warn(self, "Could not handle event:", event, details)
|
54
54
|
end
|
55
55
|
|
56
56
|
return nil
|
@@ -68,12 +68,12 @@ module Live
|
|
68
68
|
if element = self.resolve(id, data)
|
69
69
|
self.bind(element)
|
70
70
|
else
|
71
|
-
Console.
|
71
|
+
Console.warn(self, "Could not resolve element:", message)
|
72
72
|
end
|
73
73
|
elsif id = message[:id]
|
74
74
|
self.handle(id, message[:event])
|
75
75
|
else
|
76
|
-
Console.
|
76
|
+
Console.warn(self, "Unhandled message:", message)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -82,7 +82,7 @@ module Live
|
|
82
82
|
def run(connection)
|
83
83
|
queue_task = Async do
|
84
84
|
while update = @updates.dequeue
|
85
|
-
Console.
|
85
|
+
Console.debug(self, "Sending update:", update)
|
86
86
|
|
87
87
|
connection.write(::Protocol::WebSocket::JSONMessage.generate(update))
|
88
88
|
connection.flush if @updates.empty?
|
@@ -90,12 +90,12 @@ module Live
|
|
90
90
|
end
|
91
91
|
|
92
92
|
while message = connection.read
|
93
|
-
Console.
|
93
|
+
Console.debug(self, "Reading message:", message)
|
94
94
|
|
95
95
|
if json_message = ::Protocol::WebSocket::JSONMessage.wrap(message)
|
96
96
|
process_message(json_message.parse)
|
97
97
|
else
|
98
|
-
Console.
|
98
|
+
Console.warn(self, "Unhandled message:", message)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
ensure
|
data/lib/live/version.rb
CHANGED
data/lib/live/view.rb
CHANGED
@@ -9,21 +9,40 @@ require 'xrb/builder'
|
|
9
9
|
module Live
|
10
10
|
# Represents a single division of content on the page an provides helpers for rendering the content.
|
11
11
|
class View < Element
|
12
|
+
# Update the content of the client-side element by rendering this view.
|
13
|
+
def update!(**options)
|
14
|
+
rpc(:update, @id, self.to_html, options)
|
15
|
+
end
|
16
|
+
|
12
17
|
# Replace the content of the client-side element by rendering this view.
|
13
|
-
|
14
|
-
|
18
|
+
# @parameter selector [String] The CSS selector to replace.
|
19
|
+
# @parameter node [String] The HTML to replace.
|
20
|
+
def replace(selector, node, **options)
|
21
|
+
rpc(:replace, selector, node.to_s, options)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Prepend to the content of the client-side element by appending the specified element.
|
25
|
+
# @parameter selector [String] The CSS selector to prepend to.
|
26
|
+
# @parameter node [String] The HTML to prepend.
|
27
|
+
def prepend(selector, node, **options)
|
28
|
+
rpc(:prepend, selector, node.to_s, options)
|
15
29
|
end
|
16
30
|
|
17
31
|
# Append to the content of the client-side element by appending the specified element.
|
18
|
-
# @parameter
|
19
|
-
|
20
|
-
|
32
|
+
# @parameter selector [String] The CSS selector to append to.
|
33
|
+
# @parameter node [String] The HTML to prepend.
|
34
|
+
def append(selector, node, **options)
|
35
|
+
rpc(:append, selector, node.to_s, options)
|
21
36
|
end
|
22
37
|
|
23
|
-
#
|
24
|
-
# @parameter
|
25
|
-
def
|
26
|
-
rpc(:
|
38
|
+
# Remove the specified element from the client-side element.
|
39
|
+
# @parameter selector [String] The CSS selector to remove.
|
40
|
+
def remove(selector, **options)
|
41
|
+
rpc(:remove, selector, options)
|
42
|
+
end
|
43
|
+
|
44
|
+
def dispatch_event(selector, type, **options)
|
45
|
+
rpc(:dispatch_event, selector, event, options)
|
27
46
|
end
|
28
47
|
|
29
48
|
# Render the element.
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: live
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
@@ -38,7 +38,7 @@ cert_chain:
|
|
38
38
|
Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
|
39
39
|
voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
|
40
40
|
-----END CERTIFICATE-----
|
41
|
-
date: 2024-04
|
41
|
+
date: 2024-05-04 00:00:00.000000000 Z
|
42
42
|
dependencies:
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: async-websocket
|
metadata.gz.sig
CHANGED
@@ -1 +1,3 @@
|
|
1
|
-
|
1
|
+
[O%��쐕^Q����)���'e�������5����hZz,z�����9М�7��ޫ�<u*[�x�G�k��I!u�2��MW��!t�^
|
2
|
+
A����z�������5[B�1�k���2�z���|����E�g��K���(�H�0�:N�]$�(�G�i�~A�U���N$6Qšw�S�}�O�J{���n�`D��ƁaB�bTߚ|��+)~�E�T9��6�5V��Q����S�ԏ��A��Xz��|�\St(��ɛ��G�z�gG�Pٟq4n� ���k�p��도)�����`A���xƬ0�Tb����A桺�K��b�1aƓ+�\!�r����h>V=�
|
3
|
+
���a�Kt؛��.�nf�M�ڊ��nB3b��
|