Skip to content

Commit 1f5e3c5

Browse files
committed
made a bunch of alpha modifications
1 parent a551616 commit 1f5e3c5

File tree

8 files changed

+137
-70
lines changed

8 files changed

+137
-70
lines changed

lib/nostr/client/relays/relay_manager.ex

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,22 @@ defmodule Nostr.Client.Relays.RelayManager do
1818
{:ok, opts}
1919
end
2020

21-
def add(relay_url) do
21+
def add(relay_url_list) when is_list(relay_url_list) do
22+
for relay_url <- relay_url_list do
23+
add(relay_url)
24+
end
25+
end
26+
27+
def add(relay_url) when is_binary(relay_url) do
2228
DynamicSupervisor.start_child(RelayManager, {RelaySocket, [relay_url, self()]})
2329
end
2430

31+
def active_relay_sockets do
32+
DynamicSupervisor.which_children(RelayManager)
33+
|> Enum.map(&get_pid/1)
34+
|> Enum.filter(&RelaySocket.ready?/1)
35+
end
36+
2537
def active_pids() do
2638
DynamicSupervisor.which_children(RelayManager)
2739
|> Enum.map(&get_pid/1)

lib/nostr/client/relays/relay_socket/publisher.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule Nostr.Client.Relays.RelaySocket.Publisher do
44
"""
55

66
def successful_connection(pid, relay_url) do
7-
send(pid, {:console, :connected, %{url: relay_url}})
7+
send(pid, {:console, :connected, %{url: relay_url, pid: self()}})
88
end
99

1010
def websockets_ready(pid, relay_url) do

lib/nostr/client/relays/relay_socket/server.ex

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,20 @@ defmodule Nostr.Client.Relays.RelaySocket.Server do
1313

1414
@impl true
1515
def init(%{relay_url: relay_url, owner_pid: owner_pid}) do
16+
Logger.info("Starting a relay socket for #{relay_url}, #{inspect self()}")
17+
1618
send(self(), {:connect_to_relay, relay_url, owner_pid})
1719

1820
{:ok, %RelaySocket{}}
1921
end
2022

23+
@impl true
24+
def terminate(reason, state) do
25+
Logger.warning("A relay socket is terminating: #{inspect reason}")
26+
27+
{:ok, state}
28+
end
29+
2130
@impl true
2231
def handle_cast({:unsubscribe, subscription_id}, state) do
2332
state =
@@ -61,6 +70,9 @@ defmodule Nostr.Client.Relays.RelaySocket.Server do
6170
def handle_call(:url, _from, %RelaySocket{conn: conn} = state) do
6271
url = ~s(#{conn.private.scheme}://#{conn.host}:#{conn.port})
6372

73+
IO.inspect("URL: #{url}")
74+
IO.inspect state
75+
6476
{:reply, url, state}
6577
end
6678

@@ -132,6 +144,8 @@ defmodule Nostr.Client.Relays.RelaySocket.Server do
132144
def handle_call({:notes, pubkeys, limit, subscriber}, _from, state) do
133145
{subscription_id, json} = Nostr.Client.Request.notes(pubkeys, limit)
134146

147+
IO.puts json
148+
135149
send(self(), {:subscription_request, state, subscription_id, json, subscriber})
136150

137151
{:reply, subscription_id, state}

lib/nostr/client/subscriptions/all_subscription.ex

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@ defmodule Nostr.Client.Subscriptions.AllSubscription do
5858

5959
@impl true
6060
def handle_info(event, %{subscriber: subscriber} = state) do
61-
IO.inspect(event, label: "in all_subscription")
62-
6361
send(subscriber, event)
6462

6563
{:noreply, state}

lib/nostr/client/subscriptions/contacts_subscription.ex

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,61 @@ defmodule Nostr.Client.Subscriptions.ContactsSubscription do
66

77
use GenServer
88

9+
require Logger
10+
911
alias Nostr.Client.Relays.RelaySocket
1012

11-
def start_link([relay_pids, pubkey, subscriber]) do
12-
GenServer.start_link(__MODULE__, %{
13-
relay_pids: relay_pids,
13+
def start([relay_pid, pubkey, subscriber]), do: start(relay_pid, pubkey, subscriber)
14+
15+
def start(relay_pid, pubkey, subscriber \\ self()) when is_pid(relay_pid) do
16+
Logger.info("#{inspect(relay_pid)} contacts subscription: #{inspect(pubkey)}")
17+
18+
GenServer.start(__MODULE__, %{
19+
relay_pid: relay_pid,
1420
pubkey: pubkey,
1521
subscriber: subscriber
1622
})
1723
end
1824

1925
@impl true
20-
def init(%{relay_pids: relay_pids, pubkey: pubkey} = state) do
26+
def init(state) do
2127
Process.flag(:trap_exit, true)
2228

23-
subscriptions =
24-
relay_pids
25-
|> Enum.map(fn relay_pid ->
26-
RelaySocket.subscribe_contacts(relay_pid, pubkey)
27-
end)
28-
29-
{
30-
:ok,
31-
state
32-
|> set_contract_subscriptions(subscriptions)
33-
}
29+
send(self(), :connect)
30+
31+
{:ok, state}
3432
end
3533

3634
@impl true
37-
def terminate(_reason, %{relay_pids: relay_pids, subscriptions: subscriptions} = state) do
38-
unsubscribe_all(relay_pids, subscriptions)
35+
def terminate(_reason, %{relay_pid: relay_pid} = state) do
36+
if(Map.has_key?(state, :relay_subscription)) do
37+
subscription = Map.get(state, :relay_subscription)
38+
unsubscribe(relay_pid, subscription)
39+
end
3940

4041
{:noreply, state}
4142
end
4243

44+
@impl true
45+
def handle_info(:connect, %{relay_pid: relay_pid, pubkey: pubkey} = state) do
46+
case Process.alive?(relay_pid) do
47+
true ->
48+
subscription = RelaySocket.subscribe_contacts(relay_pid, pubkey)
49+
50+
{
51+
:noreply,
52+
state
53+
|> set_contract_subscription(subscription)
54+
}
55+
56+
false ->
57+
Process.flag(:trap_exit, false)
58+
Process.exit(self(), "disconnected relay, can't subscribe to contacts")
59+
60+
{:noreply, state}
61+
end
62+
end
63+
4364
@impl true
4465
def handle_info({:end_of_stored_events, _relay_url, _subscription_id}, state) do
4566
## nothing to do
@@ -49,20 +70,16 @@ defmodule Nostr.Client.Subscriptions.ContactsSubscription do
4970

5071
@impl true
5172
def handle_info(profile, %{subscriber: subscriber} = state) do
52-
IO.puts("CONTACTS FROM HERE")
53-
5473
send(subscriber, profile)
5574

5675
{:noreply, state}
5776
end
5877

59-
defp set_contract_subscriptions(state, subscriptions) do
60-
Map.put(state, :subscriptions, subscriptions)
78+
defp set_contract_subscription(state, subscription) do
79+
Map.put(state, :relay_subscription, subscription)
6180
end
6281

63-
defp unsubscribe_all(relay_pids, subscriptions) do
64-
for relay_pid <- relay_pids, subscription <- subscriptions do
65-
RelaySocket.unsubscribe(relay_pid, subscription)
66-
end
82+
defp unsubscribe(relay_pid, subscription) do
83+
RelaySocket.unsubscribe(relay_pid, subscription)
6784
end
6885
end

lib/nostr/client/subscriptions/notes_subscription.ex

Lines changed: 50 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ defmodule Nostr.MixProject do
6060
{:credo, "~> 1.6", only: [:dev, :test], runtime: false},
6161
{:hammox, "~> 0.7", only: :test},
6262
{:mint_web_socket, "~> 1.0"},
63-
{:nostr_basics, "~> 0.1.2"}
63+
{:nostr_basics, "~> 0.1.6"}
6464
]
6565
end
6666
end

0 commit comments

Comments
 (0)