Я пытаюсь использовать библиотеку для создания клиента websocket
websockex вместе с ets
, так как я также используюwebsocket в Фениксе, потому что я делаю приложение типа
client --websocket-->phoenix-->websocket-->third-party server
. Я намерен сохранить объект сокета каждого клиента вместе с идентификатором пользователя, чтобы при получении ответа от стороннего производителяЯ знаю, к какому клиенту, подключенному к моему приложению Phoenix, я должен отправить сообщение, чтобы сохранить эти сокеты, которые я использую ets ...
проблема в том, что каждый раз, когда я пытаюсь записать в таблицу, я получаю
** (ArgumentError) argument error
(stdlib) :ets.insert(:sockets, {"uid", "mierda"})
(stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
(iex) lib/iex/evaluator.ex:257: IEx.Evaluator.handle_eval/5
(iex) lib/iex/evaluator.ex:237: IEx.Evaluator.do_eval/3
(iex) lib/iex/evaluator.ex:215: IEx.Evaluator.eval/3
(iex) lib/iex/evaluator.ex:103: IEx.Evaluator.loop/1
(iex) lib/iex/evaluator.ex:27: IEx.Evaluator.init/4
(websocketsample) lib/websocketsample_web/channels/websocket_communicator.ex:29: WebsocketCommunicator.translate/3
(websocketsample) lib/websocketsample_web/channels/timer_channel.ex:15: WebsocketsampleWeb.TimerChannel.handle_in/3
(phoenix) lib/phoenix/channel/server.ex:268: anonymous fn/4 in Phoenix.Channel.Server.handle_info/2
(websocketsample) lib/websocketsample_web/endpoint.ex:1: WebsocketsampleWeb.Endpoint.instrument/4
(stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:711: :gen_server.handle_msg/6
чтобы выполнить тест, внутри start_link я попытался сохранить значение и сразу же получить его ... это работает без проблем, однако внутри моей функции перевода, если я пытаюсь записать в таблицу, я получаювышеупомянутая ошибка ...
Я даже пытался использовать IEx.pry и в этом контексте сделать сохранение любого (чтобы проверить, что проблема эффективно с этим и не проблема с моей функцией), я не могэфсохраните значение
defmodule WebsocketCommunicator do
use WebSockex
require Logger
require IEx
def start_link(opt \\ []) do
Logger.info("inicializando la tabla")
:ets.new(:sockets,[:named_table,:public])
:ets.insert(:sockets, {"test","this works"})
[{_k,v}] = :ets.lookup(:sockets,"test") #this works ok
Logger.info("valor es #{v}" )
WebSockex.start_link("ws://localhost:8999",__MODULE__,:fake_state,opt)
end
def translate(client,message,socket) do
uid = Ecto.UUID.generate()
IEx.pry()
:ets.insert(:sockets,{uid,socket}) #this fails
#inside pry if I type this also fails
:ets.insert(:sockets,{"something","boom"})
[{_k,v}] = :ets.lookup(:sockets,uid)
Logger.info("valor es #{v}" )
#mensaje = Poison.encode!(%{"uid" => uid, "text"=>message})
WebSockex.send_frame(client, {:text, "doesnt works!!!"})
end
def handle_frame({:text,msg},:fake_state) do
Logger.info("receiving --> #{msg}")
{:ok, :fake_state}
# {:reply,{:text,msg},:fake_state}
end
end
websockex не использует genserver, поэтому я не могу использовать функцию init, знаете, в чем может быть проблема или дать мне какое-то временное решение? ... большое спасибо...