@@ -10,6 +10,7 @@ defmodule LiveDebugger.App.Debugger.NodeState.Web.Hooks.NodeAssigns do
1010 alias LiveDebugger.App.Utils.TermDiffer
1111 alias LiveDebugger.App.Utils.TermDiffer.Diff
1212 alias LiveDebugger.App.Utils.TermParser
13+ alias LiveDebugger.App.Utils.TermNode
1314 alias LiveDebugger.Utils.Memory
1415
1516 @ required_assigns [
@@ -27,9 +28,11 @@ defmodule LiveDebugger.App.Debugger.NodeState.Web.Hooks.NodeAssigns do
2728 socket
2829 |> check_assigns! ( @ required_assigns )
2930 |> attach_hook ( :node_assigns , :handle_async , & handle_async / 3 )
31+ |> attach_hook ( :node_assigns , :handle_event , & handle_event / 3 )
3032 |> register_hook ( :node_assigns )
3133 |> assign ( :node_assigns_info , AsyncResult . loading ( ) )
3234 |> assign ( :assigns_sizes , AsyncResult . loading ( ) )
35+ |> put_private ( :pulse_cleared? , true )
3336 |> assign_async_node_assigns ( )
3437 end
3538
@@ -67,6 +70,8 @@ defmodule LiveDebugger.App.Debugger.NodeState.Web.Hooks.NodeAssigns do
6770 |> assign ( :node_assigns_info , node_assigns_info )
6871 |> assign ( :assigns_sizes , assigns_sizes )
6972 |> start_async ( :fetch_node_assigns , fn ->
73+ # Small sleep serves here as a debounce mechanism
74+ Process . sleep ( 100 )
7075 NodeStateQueries . fetch_node_assigns ( pid , node_id )
7176 end )
7277 end
@@ -76,16 +81,20 @@ defmodule LiveDebugger.App.Debugger.NodeState.Web.Hooks.NodeAssigns do
7681 |> assign ( :node_assigns_info , AsyncResult . failed ( % AsyncResult { } , :no_node_id ) )
7782 end
7883
84+ defp handle_event ( _ , _ , socket ) do
85+ socket
86+ |> maybe_clear_term_node_pulse ( )
87+ |> cont ( )
88+ end
89+
7990 defp handle_async (
8091 :fetch_node_assigns ,
8192 { :ok , { :ok , node_assigns } } ,
82- % {
83- assigns: % {
84- node_assigns_info: % AsyncResult { ok?: true , result: { old_assigns , old_term_node , _ } }
85- }
86- } =
87- socket
93+ % { assigns: % { node_assigns_info: % AsyncResult { ok?: true } } } = socket
8894 ) do
95+ socket = maybe_clear_term_node_pulse ( socket )
96+ % AsyncResult { result: { old_assigns , old_term_node , _ } } = socket . assigns . node_assigns_info
97+
8998 node_assigns_info =
9099 case TermDiffer . diff ( old_assigns , node_assigns ) do
91100 % Diff { type: :equal } ->
@@ -95,15 +104,13 @@ defmodule LiveDebugger.App.Debugger.NodeState.Web.Hooks.NodeAssigns do
95104 copy_string = TermParser . term_to_copy_string ( node_assigns )
96105
97106 case TermParser . update_by_diff ( old_term_node , diff ) do
98- { :ok , term_node } ->
99- AsyncResult . ok ( { node_assigns , term_node , copy_string } )
100-
101- { :error , reason } ->
102- AsyncResult . failed ( socket . assigns . node_assigns_info , reason )
107+ { :ok , term_node } -> AsyncResult . ok ( { node_assigns , term_node , copy_string } )
108+ { :error , reason } -> AsyncResult . failed ( socket . assigns . node_assigns_info , reason )
103109 end
104110 end
105111
106112 socket
113+ |> put_private ( :pulse_cleared? , false )
107114 |> assign ( :node_assigns_info , node_assigns_info )
108115 |> assign_size_async ( node_assigns )
109116 |> halt ( )
@@ -168,4 +175,22 @@ defmodule LiveDebugger.App.Debugger.NodeState.Web.Hooks.NodeAssigns do
168175 defp assigns_serialized_size ( assigns ) do
169176 assigns |> Memory . serialized_term_size ( ) |> Memory . bytes_to_pretty_string ( )
170177 end
178+
179+ defp maybe_clear_term_node_pulse ( % { private: % { pulse_cleared?: true } } = socket ) do
180+ socket
181+ end
182+
183+ defp maybe_clear_term_node_pulse ( % { private: % { pulse_cleared?: false } } = socket ) do
184+ case socket . assigns . node_assigns_info do
185+ % AsyncResult { ok?: true , result: { node_assigns , term_node , copy_string } } ->
186+ term_node = TermNode . set_pulse ( term_node , false , recursive: true )
187+
188+ socket
189+ |> put_private ( :pulse_cleared? , true )
190+ |> assign ( :node_assigns_info , AsyncResult . ok ( { node_assigns , term_node , copy_string } ) )
191+
192+ _ ->
193+ socket
194+ end
195+ end
171196end
0 commit comments