@@ -10,43 +10,69 @@ defmodule Nostr.Client.Subscriptions.NotesSubscription do
1010
1111 alias Nostr.Client.Relays.RelaySocket
1212
13- def start_link ( [ relay_pids , pubkeys , subscriber ] ) do
14- GenServer . start_link ( __MODULE__ , % {
15- relay_pids: relay_pids ,
13+ def start ( [ relay_pid , pubkeys , subscriber ] ) , do: start ( relay_pid , pubkeys , subscriber )
14+
15+ def start ( relay_pid , pubkeys , subscriber \\ self ( ) ) when is_pid ( relay_pid ) do
16+ Logger . info ( "#{ inspect ( relay_pid ) } notes subscription: #{ inspect ( pubkeys ) } " )
17+
18+ GenServer . start ( __MODULE__ , % {
19+ relay_pid: relay_pid ,
1620 pubkeys: pubkeys ,
17- subscriber: subscriber
21+ subscriber: subscriber ,
22+ relay_subscriptions: [ ]
1823 } )
1924 end
2025
2126 @ impl true
22- def init ( % { relay_pids: relay_pids , pubkeys: pubkeys } = state ) do
27+ def init ( % { relay_pid: relay_pid , pubkeys: pubkeys } = state ) do
2328 Process . flag ( :trap_exit , true )
2429
25- send ( self ( ) , { :connect , relay_pids , pubkeys } )
30+ Logger . warning ( "NEW SUBSCRIPTION- ---------------- #{ inspect ( self ( ) ) } " )
31+
32+ send ( self ( ) , { :connect , relay_pid , pubkeys } )
2633
2734 { :ok , state }
2835 end
2936
3037 @ impl true
31- def terminate ( _reason , % { relay_pids: relay_pids , subscriptions: subscriptions } = state ) do
32- unsubscribe_all ( relay_pids , subscriptions )
38+ def terminate (
39+ _reason ,
40+ % { relay_pid: relay_pid , relay_subscriptions: relay_subscriptions } = state
41+ ) do
42+ Logger . warning ( "the #{ inspect ( self ( ) ) } note subscription is terminating" )
43+
44+ unsubscribe ( relay_pid , relay_subscriptions )
45+
46+ { :noreply , state }
47+ end
48+
49+ @ impl true
50+ def terminate ( reason , % { relay_pid: relay_pid , subscriber: subscriber } = state ) do
51+ Logger . warning (
52+ "TERMINATE EVENT: #{ inspect ( relay_pid ) } #{ inspect ( subscriber ) } , #{ inspect ( reason ) } "
53+ )
3354
3455 { :noreply , state }
3556 end
3657
3758 @ impl true
38- def handle_info ( { :connect , relay_pids , pubkeys } , state ) do
39- subscriptions =
40- relay_pids
41- |> Enum . map ( fn relay_pid ->
42- RelaySocket . subscribe_notes ( relay_pid , pubkeys )
43- end )
44-
45- {
46- :noreply ,
47- state
48- |> set_note_subscriptions ( subscriptions )
49- }
59+ def handle_info ( { :connect , relay_pid , pubkeys } , state ) do
60+ case Process . alive? ( relay_pid ) do
61+ true ->
62+ subscription = RelaySocket . subscribe_notes ( relay_pid , pubkeys )
63+
64+ {
65+ :noreply ,
66+ state
67+ |> add_notes_subscription ( subscription )
68+ }
69+
70+ false ->
71+ Process . flag ( :trap_exit , false )
72+ Process . exit ( self ( ) , "disconnected relay, can't subscribe to notes" )
73+
74+ { :noreply , state }
75+ end
5076 end
5177
5278 @ impl true
@@ -64,12 +90,12 @@ defmodule Nostr.Client.Subscriptions.NotesSubscription do
6490 { :noreply , state }
6591 end
6692
67- defp set_note_subscriptions ( state , subscriptions ) do
68- Map . put ( state , :subscriptions , subscriptions )
93+ defp add_notes_subscription ( % { relay_subscriptions: relay_subscriptions } = state , subscription ) do
94+ % { state | relay_subscriptions: [ subscription | relay_subscriptions ] }
6995 end
7096
71- defp unsubscribe_all ( relay_pids , subscriptions ) do
72- for relay_pid <- relay_pids , subscription <- subscriptions do
97+ defp unsubscribe ( relay_pid , subscriptions ) do
98+ for subscription <- subscriptions do
7399 RelaySocket . unsubscribe ( relay_pid , subscription )
74100 end
75101 end
0 commit comments