|
3 | 3 | -behaviour(sockjs_sender). |
4 | 4 | -behaviour(gen_server). |
5 | 5 |
|
6 | | --export([init/0, start_link/1, maybe_create/2, sender/1, reply/2]). |
| 6 | +-export([init/0, start_link/2, maybe_create/2, sender/1, reply/2]). |
7 | 7 |
|
8 | 8 | -export([send/2, close/3]). |
9 | 9 |
|
10 | 10 | -export([init/1, handle_call/3, handle_info/2, terminate/2, code_change/3, |
11 | 11 | handle_cast/2]). |
12 | 12 |
|
13 | | --record(session, {id, outbound_queue = queue:new(), response_pid, |
| 13 | +-record(session, {id, outbound_queue = queue:new(), response_pid, receiver, |
14 | 14 | session_timeout, closed = false, close_msg}). |
15 | 15 | -define(ETS, sockjs_table). |
16 | 16 |
|
17 | 17 | init() -> |
18 | 18 | ets:new(?ETS, [public, named_table]). |
19 | 19 |
|
20 | | -start_link(SessionId) -> |
21 | | - gen_server:start_link(?MODULE, SessionId, []). |
| 20 | +start_link(SessionId, Receive) -> |
| 21 | + gen_server:start_link(?MODULE, {SessionId, Receive}, []). |
22 | 22 |
|
23 | 23 | maybe_create(dummy, _) -> |
24 | 24 | ok; |
25 | 25 |
|
26 | 26 | maybe_create(SessionId, Receive) -> |
27 | 27 | case ets:lookup(?ETS, SessionId) of |
28 | | - [] -> {ok, SPid} = sockjs_session_sup:start_child(SessionId), |
| 28 | + [] -> {ok, SPid} = sockjs_session_sup:start_child( |
| 29 | + SessionId, Receive), |
29 | 30 | enqueue({open, nil}, SessionId), |
30 | 31 | Receive({?MODULE, SessionId}, init), |
31 | 32 | SPid; |
@@ -90,10 +91,10 @@ reply(Reply, Pid, State = #session{response_pid = Pid}) -> |
90 | 91 |
|
91 | 92 | %% -------------------------------------------------------------------------- |
92 | 93 |
|
93 | | -init(SessionId) -> |
| 94 | +init({SessionId, Receive}) -> |
94 | 95 | ets:insert(?ETS, {SessionId, self()}), |
95 | 96 | process_flag(trap_exit, true), |
96 | | - {ok, #session{id = SessionId}}. |
| 97 | + {ok, #session{id = SessionId, receiver = Receive}}. |
97 | 98 |
|
98 | 99 | %% For non-streaming transports we want to send a closed message every time |
99 | 100 | %% we are asked - for streaming transports we only want to send it once. |
@@ -141,8 +142,10 @@ handle_info(session_timeout, State = #session{response_pid = undefined}) -> |
141 | 142 | handle_info(Info, State) -> |
142 | 143 | {stop, {odd_info, Info}, State}. |
143 | 144 |
|
144 | | -terminate(_Reason, #session{id = ID}) -> |
145 | | - ets:delete(?ETS, ID), |
| 145 | +terminate(_Reason, #session{id = SessionId, |
| 146 | + receiver = Receive}) -> |
| 147 | + Receive({?MODULE, SessionId}, closed), |
| 148 | + ets:delete(?ETS, SessionId), |
146 | 149 | ok. |
147 | 150 |
|
148 | 151 | code_change(_OldVsn, State, _Extra) -> |
|
0 commit comments