Skip to content

Commit 7f9dd97

Browse files
committed
refactor: rename start/1,2,3 to start_session/1,2,3 for better semantics
Rename the session creation functions from start to start_session to avoid confusion with start_link/1 (supervisor startup) and provide clearer semantics about what the functions do. Changes: - Added start_session/1,2,3 as the new primary API - Deprecated start/1,2,3 with @deprecated attribute - Old functions delegate to new ones for backward compatibility - Updated all documentation, examples, and tests to use start_session - Updated files: * lib/phoenix/session_process.ex - New functions + deprecations * lib/phoenix/session_process/helpers.ex - Use start_session * All test files - Use start_session * All example files - Use start_session * README.md - Use start_session * CLAUDE.md - Use start_session Benefits: - Clearer distinction between supervisor startup (start_link) and session creation (start_session) - More explicit naming reduces confusion - Backward compatible - old API still works with deprecation warnings - All 148 tests pass Migration: Replace Phoenix.SessionProcess.start(...) with Phoenix.SessionProcess.start_session(...) The old functions will show deprecation warnings but continue to work.
1 parent e285828 commit 7f9dd97

File tree

13 files changed

+138
-96
lines changed

13 files changed

+138
-96
lines changed

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ defmodule MyAppWeb.PageController do
441441
session_id = conn.assigns.session_id
442442

443443
# Start session
444-
{:ok, _pid} = SessionProcess.start(session_id)
444+
{:ok, _pid} = SessionProcess.start_session(session_id)
445445

446446
# Dispatch actions (MUST use binary types)
447447
:ok = SessionProcess.dispatch(session_id, "counter.increment")

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ defmodule MyAppWeb.PageController do
9393
session_id = conn.assigns.session_id
9494

9595
# Start session process
96-
{:ok, _pid} = Phoenix.SessionProcess.start(session_id)
96+
{:ok, _pid} = Phoenix.SessionProcess.start_session(session_id)
9797

9898
# Store user data
9999
Phoenix.SessionProcess.cast(session_id, {:put, :user_id, conn.assigns.current_user.id})
@@ -193,7 +193,7 @@ end
193193

194194
```elixir
195195
# In your controller:
196-
{:ok, _pid} = Phoenix.SessionProcess.start(session_id, MyApp.SessionProcess)
196+
{:ok, _pid} = Phoenix.SessionProcess.start_session(session_id, MyApp.SessionProcess)
197197

198198
# Dispatch actions (MUST use binary types)
199199
:ok = Phoenix.SessionProcess.dispatch(session_id, "counter.increment")
@@ -287,13 +287,13 @@ end
287287

288288
```elixir
289289
# Start with default module
290-
{:ok, pid} = Phoenix.SessionProcess.start("session_123")
290+
{:ok, pid} = Phoenix.SessionProcess.start_session("session_123")
291291

292292
# Start with custom module
293-
{:ok, pid} = Phoenix.SessionProcess.start("session_123", MyApp.CustomProcess)
293+
{:ok, pid} = Phoenix.SessionProcess.start_session("session_123", MyApp.CustomProcess)
294294

295295
# Start with custom module and arguments
296-
{:ok, pid} = Phoenix.SessionProcess.start("session_123", MyApp.CustomProcess, %{user_id: 456})
296+
{:ok, pid} = Phoenix.SessionProcess.start_session("session_123", MyApp.CustomProcess, %{user_id: 456})
297297
```
298298

299299
### Communication
@@ -536,7 +536,7 @@ The library provides detailed error responses with the `Phoenix.SessionProcess.E
536536
### Error Handling Examples
537537

538538
```elixir
539-
case Phoenix.SessionProcess.start(session_id) do
539+
case Phoenix.SessionProcess.start_session(session_id) do
540540
{:ok, pid} ->
541541
# Session started successfully
542542
{:ok, pid}
@@ -560,7 +560,7 @@ end
560560
Use `Phoenix.SessionProcess.Error.message/1` to get human-readable error messages:
561561

562562
```elixir
563-
{:error, error} = Phoenix.SessionProcess.start("invalid@session")
563+
{:error, error} = Phoenix.SessionProcess.start_session("invalid@session")
564564
Phoenix.SessionProcess.Error.message(error)
565565
# Returns: "Invalid session ID format: \"invalid@session\""
566566
```

examples/01_basic_session.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ end
4141
# Create a session
4242
session_id = "session_#{:rand.uniform(1_000_000)}"
4343
IO.puts("1. Starting session...")
44-
{:ok, pid} = Phoenix.SessionProcess.start(session_id, BasicSession)
44+
{:ok, pid} = Phoenix.SessionProcess.start_session(session_id, BasicSession)
4545
IO.puts(" ✓ Session started: #{session_id}")
4646
IO.puts(" ✓ Process PID: #{inspect(pid)}")
4747

examples/02_redux_reducers.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ end
8282
# Create a session
8383
session_id = "redux_session_#{:rand.uniform(1_000_000)}"
8484
IO.puts("1. Starting session with combined reducers...")
85-
{:ok, _pid} = Phoenix.SessionProcess.start(session_id, ReduxSession)
85+
{:ok, _pid} = Phoenix.SessionProcess.start_session(session_id, ReduxSession)
8686
IO.puts(" ✓ Session started: #{session_id}")
8787
IO.puts(" ✓ Reducers registered: counter, user")
8888

examples/03_async_actions.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ end
8888
# Create a session
8989
session_id = "async_session_#{:rand.uniform(1_000_000)}"
9090
IO.puts("1. Starting session...")
91-
{:ok, _pid} = Phoenix.SessionProcess.start(session_id, AsyncSession)
91+
{:ok, _pid} = Phoenix.SessionProcess.start_session(session_id, AsyncSession)
9292
IO.puts(" ✓ Session started: #{session_id}")
9393

9494
# Subscribe to loading state

lib/phoenix/session_process.ex

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ defmodule Phoenix.SessionProcess do
5151
session_id = conn.assigns.session_id
5252
5353
# Start session process
54-
{:ok, _pid} = Phoenix.SessionProcess.start(session_id)
54+
{:ok, _pid} = Phoenix.SessionProcess.start_session(session_id)
5555
5656
# Store data
5757
Phoenix.SessionProcess.cast(session_id, {:put, :user_id, 123})
@@ -224,11 +224,20 @@ defmodule Phoenix.SessionProcess do
224224
225225
## Examples
226226
227-
{:ok, pid} = Phoenix.SessionProcess.start("user_123")
228-
{:error, {:already_started, pid}} = Phoenix.SessionProcess.start("user_123")
227+
{:ok, pid} = Phoenix.SessionProcess.start_session("user_123")
228+
{:error, {:already_started, pid}} = Phoenix.SessionProcess.start_session("user_123")
229229
"""
230+
@spec start_session(binary()) :: {:ok, pid()} | {:error, term()}
231+
defdelegate start_session(session_id), to: Phoenix.SessionProcess.ProcessSupervisor
232+
233+
@doc """
234+
Deprecated: Use `start_session/1` instead.
235+
236+
This function is kept for backward compatibility but will be removed in a future version.
237+
"""
238+
@deprecated "Use start_session/1 instead"
230239
@spec start(binary()) :: {:ok, pid()} | {:error, term()}
231-
defdelegate start(session_id), to: Phoenix.SessionProcess.ProcessSupervisor, as: :start_session
240+
def start(session_id), do: start_session(session_id)
232241

233242
@doc """
234243
Starts a session process using a custom module.
@@ -248,19 +257,26 @@ defmodule Phoenix.SessionProcess do
248257
249258
## Examples
250259
251-
{:ok, pid} = Phoenix.SessionProcess.start("user_123", MyApp.CustomSessionProcess)
260+
{:ok, pid} = Phoenix.SessionProcess.start_session("user_123", MyApp.CustomSessionProcess)
252261
253-
iex> result = Phoenix.SessionProcess.start("valid_session", Phoenix.SessionProcess.DefaultSessionProcess)
262+
iex> result = Phoenix.SessionProcess.start_session("valid_session", Phoenix.SessionProcess.DefaultSessionProcess)
254263
iex> match?({:ok, _pid}, result) or match?({:error, {:already_started, _pid}}, result)
255264
true
256265
257-
iex> Phoenix.SessionProcess.start("invalid@session", Phoenix.SessionProcess.DefaultSessionProcess)
266+
iex> Phoenix.SessionProcess.start_session("invalid@session", Phoenix.SessionProcess.DefaultSessionProcess)
258267
{:error, {:invalid_session_id, "invalid@session"}}
259268
"""
269+
@spec start_session(binary(), atom()) :: {:ok, pid()} | {:error, term()}
270+
defdelegate start_session(session_id, module), to: Phoenix.SessionProcess.ProcessSupervisor
271+
272+
@doc """
273+
Deprecated: Use `start_session/2` instead.
274+
275+
This function is kept for backward compatibility but will be removed in a future version.
276+
"""
277+
@deprecated "Use start_session/2 instead"
260278
@spec start(binary(), atom()) :: {:ok, pid()} | {:error, term()}
261-
defdelegate start(session_id, module),
262-
to: Phoenix.SessionProcess.ProcessSupervisor,
263-
as: :start_session
279+
def start(session_id, module), do: start_session(session_id, module)
264280

265281
@doc """
266282
Starts a session process with a custom module and initialization arguments.
@@ -282,23 +298,30 @@ defmodule Phoenix.SessionProcess do
282298
## Examples
283299
284300
# With map argument
285-
{:ok, pid} = Phoenix.SessionProcess.start("user_123", MyApp.SessionProcess, %{user_id: 123})
301+
{:ok, pid} = Phoenix.SessionProcess.start_session("user_123", MyApp.SessionProcess, %{user_id: 123})
286302
287303
# With keyword list
288-
{:ok, pid} = Phoenix.SessionProcess.start("user_456", MyApp.SessionProcess, [debug: true])
304+
{:ok, pid} = Phoenix.SessionProcess.start_session("user_456", MyApp.SessionProcess, [debug: true])
289305
290-
iex> result = Phoenix.SessionProcess.start("valid_session_with_args", Phoenix.SessionProcess.DefaultSessionProcess, %{user_id: 123})
306+
iex> result = Phoenix.SessionProcess.start_session("valid_session_with_args", Phoenix.SessionProcess.DefaultSessionProcess, %{user_id: 123})
291307
iex> match?({:ok, _pid}, result) or match?({:error, {:already_started, _pid}}, result)
292308
true
293309
294-
iex> result = Phoenix.SessionProcess.start("valid_session_with_list", Phoenix.SessionProcess.DefaultSessionProcess, [debug: true])
310+
iex> result = Phoenix.SessionProcess.start_session("valid_session_with_list", Phoenix.SessionProcess.DefaultSessionProcess, [debug: true])
295311
iex> match?({:ok, _pid}, result) or match?({:error, {:already_started, _pid}}, result)
296312
true
297313
"""
314+
@spec start_session(binary(), atom(), any()) :: {:ok, pid()} | {:error, term()}
315+
defdelegate start_session(session_id, module, arg), to: Phoenix.SessionProcess.ProcessSupervisor
316+
317+
@doc """
318+
Deprecated: Use `start_session/3` instead.
319+
320+
This function is kept for backward compatibility but will be removed in a future version.
321+
"""
322+
@deprecated "Use start_session/3 instead"
298323
@spec start(binary(), atom(), any()) :: {:ok, pid()} | {:error, term()}
299-
defdelegate start(session_id, module, arg),
300-
to: Phoenix.SessionProcess.ProcessSupervisor,
301-
as: :start_session
324+
def start(session_id, module, arg), do: start_session(session_id, module, arg)
302325

303326
@doc """
304327
Checks if a session process is currently running.
@@ -312,7 +335,7 @@ defmodule Phoenix.SessionProcess do
312335
313336
## Examples
314337
315-
{:ok, _pid} = Phoenix.SessionProcess.start("user_123")
338+
{:ok, _pid} = Phoenix.SessionProcess.start_session("user_123")
316339
true = Phoenix.SessionProcess.started?("user_123")
317340
false = Phoenix.SessionProcess.started?("nonexistent")
318341
"""
@@ -336,7 +359,7 @@ defmodule Phoenix.SessionProcess do
336359
337360
## Examples
338361
339-
{:ok, _pid} = Phoenix.SessionProcess.start("user_123")
362+
{:ok, _pid} = Phoenix.SessionProcess.start_session("user_123")
340363
:ok = Phoenix.SessionProcess.terminate("user_123")
341364
{:error, :not_found} = Phoenix.SessionProcess.terminate("user_123")
342365
"""
@@ -361,7 +384,7 @@ defmodule Phoenix.SessionProcess do
361384
362385
## Examples
363386
364-
{:ok, _pid} = Phoenix.SessionProcess.start("user_123")
387+
{:ok, _pid} = Phoenix.SessionProcess.start_session("user_123")
365388
366389
# Keep session alive
367390
:ok = Phoenix.SessionProcess.touch("user_123")
@@ -396,7 +419,7 @@ defmodule Phoenix.SessionProcess do
396419
397420
## Examples
398421
399-
{:ok, _pid} = Phoenix.SessionProcess.start("user_123")
422+
{:ok, _pid} = Phoenix.SessionProcess.start_session("user_123")
400423
{:ok, state} = Phoenix.SessionProcess.call("user_123", :get_state)
401424
{:ok, :pong} = Phoenix.SessionProcess.call("user_123", :ping, 5_000)
402425
"""
@@ -421,7 +444,7 @@ defmodule Phoenix.SessionProcess do
421444
422445
## Examples
423446
424-
{:ok, _pid} = Phoenix.SessionProcess.start("user_123")
447+
{:ok, _pid} = Phoenix.SessionProcess.start_session("user_123")
425448
:ok = Phoenix.SessionProcess.cast("user_123", {:put, :user_id, 123})
426449
:ok = Phoenix.SessionProcess.cast("user_123", {:delete, :old_key})
427450
"""

lib/phoenix/session_process/helpers.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ defmodule Phoenix.SessionProcess.Helpers do
2222
def start_sessions(session_ids) when is_list(session_ids) do
2323
session_ids
2424
|> Enum.map(fn session_id ->
25-
Task.async(fn -> {session_id, SessionProcess.start(session_id)} end)
25+
Task.async(fn -> {session_id, SessionProcess.start_session(session_id)} end)
2626
end)
2727
|> Task.await_many(5_000)
2828
end
@@ -159,12 +159,12 @@ defmodule Phoenix.SessionProcess.Helpers do
159159
result =
160160
if module do
161161
if arg do
162-
SessionProcess.start(session_id, module, arg)
162+
SessionProcess.start_session(session_id, module, arg)
163163
else
164-
SessionProcess.start(session_id, module)
164+
SessionProcess.start_session(session_id, module)
165165
end
166166
else
167-
SessionProcess.start(session_id)
167+
SessionProcess.start_session(session_id)
168168
end
169169

170170
case result do

test/phoenix/session_process/dispatch_test.exs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ defmodule Phoenix.SessionProcess.DispatchTest do
5151

5252
setup do
5353
session_id = "test_session_#{:rand.uniform(1_000_000)}"
54-
{:ok, _pid} = SessionProcess.start(session_id, TestSessionProcess)
54+
{:ok, _pid} = SessionProcess.start_session(session_id, TestSessionProcess)
5555

5656
on_exit(fn ->
5757
if SessionProcess.started?(session_id) do
@@ -137,7 +137,7 @@ defmodule Phoenix.SessionProcess.DispatchTest do
137137

138138
test "dispatch validates action type is binary" do
139139
session_id = "validate_session_#{:rand.uniform(1_000_000)}"
140-
{:ok, _pid} = SessionProcess.start(session_id, TestSessionProcess)
140+
{:ok, _pid} = SessionProcess.start_session(session_id, TestSessionProcess)
141141

142142
assert_raise ArgumentError, ~r/Action type must be a binary string/, fn ->
143143
SessionProcess.dispatch(session_id, :atom_type)
@@ -148,7 +148,7 @@ defmodule Phoenix.SessionProcess.DispatchTest do
148148

149149
test "dispatch validates meta is a keyword list" do
150150
session_id = "validate_meta_#{:rand.uniform(1_000_000)}"
151-
{:ok, _pid} = SessionProcess.start(session_id, TestSessionProcess)
151+
{:ok, _pid} = SessionProcess.start_session(session_id, TestSessionProcess)
152152

153153
assert_raise ArgumentError, ~r/Action meta must be a keyword list/, fn ->
154154
SessionProcess.dispatch(session_id, "test", nil, %{async: true})

test/phoenix/session_process/integration_test.exs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ defmodule Phoenix.SessionProcess.IntegrationTest do
66
test "session validation and limits" do
77
# Test invalid session ID
88
assert {:error, {:invalid_session_id, "invalid@session"}} =
9-
SessionProcess.start("invalid@session")
9+
SessionProcess.start_session("invalid@session")
1010

1111
# Test empty session ID
12-
assert {:error, {:invalid_session_id, ""}} = SessionProcess.start("")
12+
assert {:error, {:invalid_session_id, ""}} = SessionProcess.start_session("")
1313
end
1414

1515
test "error handling for non-existent sessions" do
@@ -45,7 +45,8 @@ defmodule Phoenix.SessionProcess.IntegrationTest do
4545
session_id = "custom_module_test"
4646

4747
# Start with custom module
48-
assert {:ok, _pid} = SessionProcess.start(session_id, TestCustomSession, %{test: "data"})
48+
assert {:ok, _pid} =
49+
SessionProcess.start_session(session_id, TestCustomSession, %{test: "data"})
4950

5051
# Verify custom initialization worked
5152
assert %{custom: true} = SessionProcess.call(session_id, :get_state)

test/phoenix/session_process/macro_consistency_test.exs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ defmodule Phoenix.SessionProcess.MacroConsistencyTest do
3232
session_id = "test_process_with_arg_#{:rand.uniform(10000)}"
3333
init_arg = %{user_id: 123, data: "test"}
3434

35-
{:ok, _pid} = SessionProcess.start(session_id, TestProcessWithArg, init_arg)
35+
{:ok, _pid} = SessionProcess.start_session(session_id, TestProcessWithArg, init_arg)
3636

3737
state = SessionProcess.call(session_id, :get_state)
3838
assert state.initialized_with == init_arg
@@ -44,7 +44,7 @@ defmodule Phoenix.SessionProcess.MacroConsistencyTest do
4444
session_id = "test_process_with_arg_#{:rand.uniform(10000)}"
4545
init_arg = %{user_id: 456, data: "test"}
4646

47-
{:ok, _pid} = SessionProcess.start(session_id, TestProcessLinkWithArg, init_arg)
47+
{:ok, _pid} = SessionProcess.start_session(session_id, TestProcessLinkWithArg, init_arg)
4848

4949
state = SessionProcess.call(session_id, :get_state)
5050
assert state.initialized_with == init_arg
@@ -61,8 +61,8 @@ defmodule Phoenix.SessionProcess.MacroConsistencyTest do
6161
init_arg = %{value: 42}
6262

6363
# Both should accept the same argument format
64-
{:ok, _} = SessionProcess.start(session_id_1, TestProcessWithArg, init_arg)
65-
{:ok, _} = SessionProcess.start(session_id_2, TestProcessLinkWithArg, init_arg)
64+
{:ok, _} = SessionProcess.start_session(session_id_1, TestProcessWithArg, init_arg)
65+
{:ok, _} = SessionProcess.start_session(session_id_2, TestProcessLinkWithArg, init_arg)
6666

6767
state1 = SessionProcess.call(session_id_1, :get_state)
6868
state2 = SessionProcess.call(session_id_2, :get_state)

0 commit comments

Comments
 (0)