-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Phoenix.Router based socket routing #6142
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 7 commits
466c697
a8e858f
30cfdcf
d4176b0
ed8b1d2
70f015b
cb56e85
d6a715d
0e0c2d7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -411,6 +411,10 @@ defmodule Phoenix.Endpoint do | |
| quote do | ||
| @behaviour Phoenix.Endpoint | ||
|
|
||
| def __start_sockets__ do | ||
| unquote(Keyword.get(opts, :start_sockets, [])) | ||
| end | ||
|
|
||
| unquote(config(opts)) | ||
| unquote(pubsub()) | ||
| unquote(plug()) | ||
|
|
@@ -424,9 +428,11 @@ defmodule Phoenix.Endpoint do | |
|
|
||
| # Compile-time configuration checking | ||
| # This ensures that if a compile-time configuration is overwritten at runtime the application won't boot. | ||
| var!(code_reloading?) = Application.compile_env(@otp_app, [__MODULE__, :code_reloader], false) | ||
| var!(debug_errors?) = Application.compile_env(@otp_app, [__MODULE__, :debug_errors], false) | ||
| var!(force_ssl) = Application.compile_env(@otp_app, [__MODULE__, :force_ssl]) | ||
| var!(code_reloading?) = | ||
| Application.compile_env(@otp_app, [__MODULE__, :code_reloader], false) | ||
|
|
||
| var!(debug_errors?) = Application.compile_env(@otp_app, [__MODULE__, :debug_errors], false) | ||
| var!(force_ssl) = Application.compile_env(@otp_app, [__MODULE__, :force_ssl]) | ||
|
|
||
| # Avoid unused variable warnings | ||
| _ = var!(code_reloading?) | ||
|
|
@@ -480,14 +486,13 @@ defmodule Phoenix.Endpoint do | |
| use Plug.Builder, init_mode: Phoenix.plug_init_mode() | ||
| import Phoenix.Endpoint | ||
|
|
||
| Module.register_attribute(__MODULE__, :phoenix_sockets, accumulate: true) | ||
|
|
||
| if force_ssl = Phoenix.Endpoint.__force_ssl__(__MODULE__, var!(force_ssl)) do | ||
| plug Plug.SSL, force_ssl | ||
| end | ||
|
|
||
| if var!(debug_errors?) do | ||
| logo = "data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNzEgNDgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgoJPHBhdGggZD0ibTI2LjM3MSAzMy40NzctLjU1Mi0uMWMtMy45Mi0uNzI5LTYuMzk3LTMuMS03LjU3LTYuODI5LS43MzMtMi4zMjQuNTk3LTQuMDM1IDMuMDM1LTQuMTQ4IDEuOTk1LS4wOTIgMy4zNjIgMS4wNTUgNC41NyAyLjM5IDEuNTU3IDEuNzIgMi45ODQgMy41NTggNC41MTQgNS4zMDUgMi4yMDIgMi41MTUgNC43OTcgNC4xMzQgOC4zNDcgMy42MzQgMy4xODMtLjQ0OCA1Ljk1OC0xLjcyNSA4LjM3MS0zLjgyOC4zNjMtLjMxNi43NjEtLjU5MiAxLjE0NC0uODg2bC0uMjQxLS4yODRjLTIuMDI3LjYzLTQuMDkzLjg0MS02LjIwNS43MzUtMy4xOTUtLjE2LTYuMjQtLjgyOC04Ljk2NC0yLjU4Mi0yLjQ4Ni0xLjYwMS00LjMxOS0zLjc0Ni01LjE5LTYuNjExLS43MDQtMi4zMTUuNzM2LTMuOTM0IDMuMTM1LTMuNi45NDguMTMzIDEuNzQ2LjU2IDIuNDYzIDEuMTY1LjU4My40OTMgMS4xNDMgMS4wMTUgMS43MzggMS40OTMgMi44IDIuMjUgNi43MTIgMi4zNzUgMTAuMjY1LS4wNjgtNS44NDItLjAyNi05LjgxNy0zLjI0LTEzLjMwOC03LjMxMy0xLjM2Ni0xLjU5NC0yLjctMy4yMTYtNC4wOTUtNC43ODUtMi42OTgtMy4wMzYtNS42OTItNS43MS05Ljc5LTYuNjIzQzEyLjgtLjYyMyA3Ljc0NS4xNCAyLjg5MyAyLjM2MSAxLjkyNiAyLjgwNC45OTcgMy4zMTkgMCA0LjE0OWMuNDk0IDAgLjc2My4wMDYgMS4wMzIgMCAyLjQ0Ni0uMDY0IDQuMjggMS4wMjMgNS42MDIgMy4wMjQuOTYyIDEuNDU3IDEuNDE1IDMuMTA0IDEuNzYxIDQuNzk4LjUxMyAyLjUxNS4yNDcgNS4wNzguNTQ0IDcuNjA1Ljc2MSA2LjQ5NCA0LjA4IDExLjAyNiAxMC4yNiAxMy4zNDYgMi4yNjcuODUyIDQuNTkxIDEuMTM1IDcuMTcyLjU1NVpNMTAuNzUxIDMuODUyYy0uOTc2LjI0Ni0xLjc1Ni0uMTQ4LTIuNTYtLjk2MiAxLjM3Ny0uMzQzIDIuNTkyLS40NzYgMy44OTctLjUyOC0uMTA3Ljg0OC0uNjA3IDEuMzA2LTEuMzM2IDEuNDlabTMyLjAwMiAzNy45MjRjLS4wODUtLjYyNi0uNjItLjkwMS0xLjA0LTEuMjI4LTEuODU3LTEuNDQ2LTQuMDMtMS45NTgtNi4zMzMtMi0xLjM3NS0uMDI2LTIuNzM1LS4xMjgtNC4wMzEtLjYxLS41OTUtLjIyLTEuMjYtLjUwNS0xLjI0NC0xLjI3Mi4wMTUtLjc4LjY5My0xIDEuMzEtMS4xODQuNTA1LS4xNSAxLjAyNi0uMjQ3IDEuNi0uMzgyLTEuNDYtLjkzNi0yLjg4Ni0xLjA2NS00Ljc4Ny0uMy0yLjk5MyAxLjIwMi01Ljk0MyAxLjA2LTguOTI2LS4wMTctMS42ODQtLjYwOC0zLjE3OS0xLjU2My00LjczNS0yLjQwOGwtLjA0My4wM2EyLjk2IDIuOTYgMCAwIDAgLjA0LS4wMjljLS4wMzgtLjExNy0uMTA3LS4xMi0uMTk3LS4wNTRsLjEyMi4xMDdjMS4yOSAyLjExNSAzLjAzNCAzLjgxNyA1LjAwNCA1LjI3MSAzLjc5MyAyLjggNy45MzYgNC40NzEgMTIuNzg0IDMuNzNBNjYuNzE0IDY2LjcxNCAwIDAgMSAzNyA0MC44NzdjMS45OC0uMTYgMy44NjYuMzk4IDUuNzUzLjg5OVptLTkuMTQtMzAuMzQ1Yy0uMTA1LS4wNzYtLjIwNi0uMjY2LS40Mi0uMDY5IDEuNzQ1IDIuMzYgMy45ODUgNC4wOTggNi42ODMgNS4xOTMgNC4zNTQgMS43NjcgOC43NzMgMi4wNyAxMy4yOTMuNTEgMy41MS0xLjIxIDYuMDMzLS4wMjggNy4zNDMgMy4zOC4xOS0zLjk1NS0yLjEzNy02LjgzNy01Ljg0My03LjQwMS0yLjA4NC0uMzE4LTQuMDEuMzczLTUuOTYyLjk0LTUuNDM0IDEuNTc1LTEwLjQ4NS43OTgtMTUuMDk0LTIuNTUzWm0yNy4wODUgMTUuNDI1Yy43MDguMDU5IDEuNDE2LjEyMyAyLjEyNC4xODUtMS42LTEuNDA1LTMuNTUtMS41MTctNS41MjMtMS40MDQtMy4wMDMuMTctNS4xNjcgMS45MDMtNy4xNCAzLjk3Mi0xLjczOSAxLjgyNC0zLjMxIDMuODctNS45MDMgNC42MDQuMDQzLjA3OC4wNTQuMTE3LjA2Ni4xMTcuMzUuMDA1LjY5OS4wMjEgMS4wNDcuMDA1IDMuNzY4LS4xNyA3LjMxNy0uOTY1IDEwLjE0LTMuNy44OS0uODYgMS42ODUtMS44MTcgMi41NDQtMi43MS43MTYtLjc0NiAxLjU4NC0xLjE1OSAyLjY0NS0xLjA3Wm0tOC43NTMtNC42N2MtMi44MTIuMjQ2LTUuMjU0IDEuNDA5LTcuNTQ4IDIuOTQzLTEuNzY2IDEuMTgtMy42NTQgMS43MzgtNS43NzYgMS4zNy0uMzc0LS4wNjYtLjc1LS4xMTQtMS4xMjQtLjE3bC0uMDEzLjE1NmMuMTM1LjA3LjI2NS4xNTEuNDA1LjIwNy4zNTQuMTQuNzAyLjMwOCAxLjA3LjM5NSA0LjA4My45NzEgNy45OTIuNDc0IDExLjUxNi0xLjgwMyAyLjIyMS0xLjQzNSA0LjUyMS0xLjcwNyA3LjAxMy0xLjMzNi4yNTIuMDM4LjUwMy4wODMuNzU2LjEwNy4yMzQuMDIyLjQ3OS4yNTUuNzk1LjAwMy0yLjE3OS0xLjU3NC00LjUyNi0yLjA5Ni03LjA5NC0xLjg3MlptLTEwLjA0OS05LjU0NGMxLjQ3NS4wNTEgMi45NDMtLjE0MiA0LjQ4Ni0xLjA1OS0uNDUyLjA0LS42NDMuMDQtLjgyNy4wNzYtMi4xMjYuNDI0LTQuMDMzLS4wNC01LjczMy0xLjM4My0uNjIzLS40OTMtMS4yNTctLjk3NC0xLjg4OS0xLjQ1Ny0yLjUwMy0xLjkxNC01LjM3NC0yLjU1NS04LjUxNC0yLjUuMDUuMTU0LjA1NC4yNi4xMDguMzE1IDMuNDE3IDMuNDU1IDcuMzcxIDUuODM2IDEyLjM2OSA2LjAwOFptMjQuNzI3IDE3LjczMWMtMi4xMTQtMi4wOTctNC45NTItMi4zNjctNy41NzgtLjUzNyAxLjczOC4wNzggMy4wNDMuNjMyIDQuMTAxIDEuNzI4LjM3NC4zODguNzYzLjc2OCAxLjE4MiAxLjEwNiAxLjYgMS4yOSA0LjMxMSAxLjM1MiA1Ljg5Ni4xNTUtMS44NjEtLjcyNi0xLjg2MS0uNzI2LTMuNjAxLTIuNDUyWm0tMjEuMDU4IDE2LjA2Yy0xLjg1OC0zLjQ2LTQuOTgxLTQuMjQtOC41OS00LjAwOGE5LjY2NyA5LjY2NyAwIDAgMSAyLjk3NyAxLjM5Yy44NC41ODYgMS41NDcgMS4zMTEgMi4yNDMgMi4wNTUgMS4zOCAxLjQ3MyAzLjUzNCAyLjM3NiA0Ljk2MiAyLjA3LS42NTYtLjQxMi0xLjIzOC0uODQ4LTEuNTkyLTEuNTA3Wm0xNy4yOS0xOS4zMmMwLS4wMjMuMDAxLS4wNDUuMDAzLS4wNjhsLS4wMDYuMDA2LjAwNi0uMDA2LS4wMzYtLjAwNC4wMjEuMDE4LjAxMi4wNTNabS0yMCAxNC43NDRhNy42MSA3LjYxIDAgMCAwLS4wNzItLjA0MS4xMjcuMTI3IDAgMCAwIC4wMTUuMDQzYy4wMDUuMDA4LjAzOCAwIC4wNTgtLjAwMlptLS4wNzItLjA0MS0uMDA4LS4wMzQtLjAwOC4wMS4wMDgtLjAxLS4wMjItLjAwNi4wMDUuMDI2LjAyNC4wMTRaIgogICAgICAgICAgICBmaWxsPSIjRkQ0RjAwIiAvPgo8L3N2Zz4K" | ||
| logo = | ||
| "data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNzEgNDgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgoJPHBhdGggZD0ibTI2LjM3MSAzMy40NzctLjU1Mi0uMWMtMy45Mi0uNzI5LTYuMzk3LTMuMS03LjU3LTYuODI5LS43MzMtMi4zMjQuNTk3LTQuMDM1IDMuMDM1LTQuMTQ4IDEuOTk1LS4wOTIgMy4zNjIgMS4wNTUgNC41NyAyLjM5IDEuNTU3IDEuNzIgMi45ODQgMy41NTggNC41MTQgNS4zMDUgMi4yMDIgMi41MTUgNC43OTcgNC4xMzQgOC4zNDcgMy42MzQgMy4xODMtLjQ0OCA1Ljk1OC0xLjcyNSA4LjM3MS0zLjgyOC4zNjMtLjMxNi43NjEtLjU5MiAxLjE0NC0uODg2bC0uMjQxLS4yODRjLTIuMDI3LjYzLTQuMDkzLjg0MS02LjIwNS43MzUtMy4xOTUtLjE2LTYuMjQtLjgyOC04Ljk2NC0yLjU4Mi0yLjQ4Ni0xLjYwMS00LjMxOS0zLjc0Ni01LjE5LTYuNjExLS43MDQtMi4zMTUuNzM2LTMuOTM0IDMuMTM1LTMuNi45NDguMTMzIDEuNzQ2LjU2IDIuNDYzIDEuMTY1LjU4My40OTMgMS4xNDMgMS4wMTUgMS43MzggMS40OTMgMi44IDIuMjUgNi43MTIgMi4zNzUgMTAuMjY1LS4wNjgtNS44NDItLjAyNi05LjgxNy0zLjI0LTEzLjMwOC03LjMxMy0xLjM2Ni0xLjU5NC0yLjctMy4yMTYtNC4wOTUtNC43ODUtMi42OTgtMy4wMzYtNS42OTItNS43MS05Ljc5LTYuNjIzQzEyLjgtLjYyMyA3Ljc0NS4xNCAyLjg5MyAyLjM2MSAxLjkyNiAyLjgwNC45OTcgMy4zMTkgMCA0LjE0OWMuNDk0IDAgLjc2My4wMDYgMS4wMzIgMCAyLjQ0Ni0uMDY0IDQuMjggMS4wMjMgNS42MDIgMy4wMjQuOTYyIDEuNDU3IDEuNDE1IDMuMTA0IDEuNzYxIDQuNzk4LjUxMyAyLjUxNS4yNDcgNS4wNzguNTQ0IDcuNjA1Ljc2MSA2LjQ5NCA0LjA4IDExLjAyNiAxMC4yNiAxMy4zNDYgMi4yNjcuODUyIDQuNTkxIDEuMTM1IDcuMTcyLjU1NVpNMTAuNzUxIDMuODUyYy0uOTc2LjI0Ni0xLjc1Ni0uMTQ4LTIuNTYtLjk2MiAxLjM3Ny0uMzQzIDIuNTkyLS40NzYgMy44OTctLjUyOC0uMTA3Ljg0OC0uNjA3IDEuMzA2LTEuMzM2IDEuNDlabTMyLjAwMiAzNy45MjRjLS4wODUtLjYyNi0uNjItLjkwMS0xLjA0LTEuMjI4LTEuODU3LTEuNDQ2LTQuMDMtMS45NTgtNi4zMzMtMi0xLjM3NS0uMDI2LTIuNzM1LS4xMjgtNC4wMzEtLjYxLS41OTUtLjIyLTEuMjYtLjUwNS0xLjI0NC0xLjI3Mi4wMTUtLjc4LjY5My0xIDEuMzEtMS4xODQuNTA1LS4xNSAxLjAyNi0uMjQ3IDEuNi0uMzgyLTEuNDYtLjkzNi0yLjg4Ni0xLjA2NS00Ljc4Ny0uMy0yLjk5MyAxLjIwMi01Ljk0MyAxLjA2LTguOTI2LS4wMTctMS42ODQtLjYwOC0zLjE3OS0xLjU2My00LjczNS0yLjQwOGwtLjA0My4wM2EyLjk2IDIuOTYgMCAwIDAgLjA0LS4wMjljLS4wMzgtLjExNy0uMTA3LS4xMi0uMTk3LS4wNTRsLjEyMi4xMDdjMS4yOSAyLjExNSAzLjAzNCAzLjgxNyA1LjAwNCA1LjI3MSAzLjc5MyAyLjggNy45MzYgNC40NzEgMTIuNzg0IDMuNzNBNjYuNzE0IDY2LjcxNCAwIDAgMSAzNyA0MC44NzdjMS45OC0uMTYgMy44NjYuMzk4IDUuNzUzLjg5OVptLTkuMTQtMzAuMzQ1Yy0uMTA1LS4wNzYtLjIwNi0uMjY2LS40Mi0uMDY5IDEuNzQ1IDIuMzYgMy45ODUgNC4wOTggNi42ODMgNS4xOTMgNC4zNTQgMS43NjcgOC43NzMgMi4wNyAxMy4yOTMuNTEgMy41MS0xLjIxIDYuMDMzLS4wMjggNy4zNDMgMy4zOC4xOS0zLjk1NS0yLjEzNy02LjgzNy01Ljg0My03LjQwMS0yLjA4NC0uMzE4LTQuMDEuMzczLTUuOTYyLjk0LTUuNDM0IDEuNTc1LTEwLjQ4NS43OTgtMTUuMDk0LTIuNTUzWm0yNy4wODUgMTUuNDI1Yy43MDguMDU5IDEuNDE2LjEyMyAyLjEyNC4xODUtMS42LTEuNDA1LTMuNTUtMS41MTctNS41MjMtMS40MDQtMy4wMDMuMTctNS4xNjcgMS45MDMtNy4xNCAzLjk3Mi0xLjczOSAxLjgyNC0zLjMxIDMuODctNS45MDMgNC42MDQuMDQzLjA3OC4wNTQuMTE3LjA2Ni4xMTcuMzUuMDA1LjY5OS4wMjEgMS4wNDcuMDA1IDMuNzY4LS4xNyA3LjMxNy0uOTY1IDEwLjE0LTMuNy44OS0uODYgMS42ODUtMS44MTcgMi41NDQtMi43MS43MTYtLjc0NiAxLjU4NC0xLjE1OSAyLjY0NS0xLjA3Wm0tOC43NTMtNC42N2MtMi44MTIuMjQ2LTUuMjU0IDEuNDA5LTcuNTQ4IDIuOTQzLTEuNzY2IDEuMTgtMy42NTQgMS43MzgtNS43NzYgMS4zNy0uMzc0LS4wNjYtLjc1LS4xMTQtMS4xMjQtLjE3bC0uMDEzLjE1NmMuMTM1LjA3LjI2NS4xNTEuNDA1LjIwNy4zNTQuMTQuNzAyLjMwOCAxLjA3LjM5NSA0LjA4My45NzEgNy45OTIuNDc0IDExLjUxNi0xLjgwMyAyLjIyMS0xLjQzNSA0LjUyMS0xLjcwNyA3LjAxMy0xLjMzNi4yNTIuMDM4LjUwMy4wODMuNzU2LjEwNy4yMzQuMDIyLjQ3OS4yNTUuNzk1LjAwMy0yLjE3OS0xLjU3NC00LjUyNi0yLjA5Ni03LjA5NC0xLjg3MlptLTEwLjA0OS05LjU0NGMxLjQ3NS4wNTEgMi45NDMtLjE0MiA0LjQ4Ni0xLjA1OS0uNDUyLjA0LS42NDMuMDQtLjgyNy4wNzYtMi4xMjYuNDI0LTQuMDMzLS4wNC01LjczMy0xLjM4My0uNjIzLS40OTMtMS4yNTctLjk3NC0xLjg4OS0xLjQ1Ny0yLjUwMy0xLjkxNC01LjM3NC0yLjU1NS04LjUxNC0yLjUuMDUuMTU0LjA1NC4yNi4xMDguMzE1IDMuNDE3IDMuNDU1IDcuMzcxIDUuODM2IDEyLjM2OSA2LjAwOFptMjQuNzI3IDE3LjczMWMtMi4xMTQtMi4wOTctNC45NTItMi4zNjctNy41NzgtLjUzNyAxLjczOC4wNzggMy4wNDMuNjMyIDQuMTAxIDEuNzI4LjM3NC4zODguNzYzLjc2OCAxLjE4MiAxLjEwNiAxLjYgMS4yOSA0LjMxMSAxLjM1MiA1Ljg5Ni4xNTUtMS44NjEtLjcyNi0xLjg2MS0uNzI2LTMuNjAxLTIuNDUyWm0tMjEuMDU4IDE2LjA2Yy0xLjg1OC0zLjQ2LTQuOTgxLTQuMjQtOC41OS00LjAwOGE5LjY2NyA5LjY2NyAwIDAgMSAyLjk3NyAxLjM5Yy44NC41ODYgMS41NDcgMS4zMTEgMi4yNDMgMi4wNTUgMS4zOCAxLjQ3MyAzLjUzNCAyLjM3NiA0Ljk2MiAyLjA3LS42NTYtLjQxMi0xLjIzOC0uODQ4LTEuNTkyLTEuNTA3Wm0xNy4yOS0xOS4zMmMwLS4wMjMuMDAxLS4wNDUuMDAzLS4wNjhsLS4wMDYuMDA2LjAwNi0uMDA2LS4wMzYtLjAwNC4wMjEuMDE4LjAxMi4wNTNabS0yMCAxNC43NDRhNy42MSA3LjYxIDAgMCAwLS4wNzItLjA0MS4xMjcuMTI3IDAgMCAwIC4wMTUuMDQzYy4wMDUuMDA4LjAzOCAwIC4wNTgtLjAwMlptLS4wNzItLjA0MS0uMDA4LS4wMzQtLjAwOC4wMS4wMDgtLjAxLS4wMjItLjAwNi4wMDUuMDI2LjAyNC4wMTRaIgogICAgICAgICAgICBmaWxsPSIjRkQ0RjAwIiAvPgo8L3N2Zz4K" | ||
|
|
||
| use Plug.Debugger, | ||
| otp_app: @otp_app, | ||
|
|
@@ -502,8 +507,6 @@ defmodule Phoenix.Endpoint do | |
| ] | ||
| end | ||
|
|
||
| plug :socket_dispatch | ||
|
|
||
| # Compile after the debugger so we properly wrap it. | ||
| @before_compile Phoenix.Endpoint | ||
| end | ||
|
|
@@ -640,19 +643,7 @@ defmodule Phoenix.Endpoint do | |
| end | ||
|
|
||
| @doc false | ||
| defmacro __before_compile__(%{module: module}) do | ||
| sockets = Module.get_attribute(module, :phoenix_sockets) | ||
|
|
||
| dispatches = | ||
| for {path, socket, socket_opts} <- sockets, | ||
| {path, plug, conn_ast, plug_opts} <- socket_paths(module, path, socket, socket_opts) do | ||
| quote do | ||
| defp do_socket_dispatch(unquote(path), conn) do | ||
| halt(unquote(plug).call(unquote(conn_ast), unquote(Macro.escape(plug_opts)))) | ||
| end | ||
| end | ||
| end | ||
|
|
||
| defmacro __before_compile__(_env) do | ||
| quote do | ||
| defoverridable call: 2 | ||
|
|
||
|
|
@@ -687,118 +678,9 @@ defmodule Phoenix.Endpoint do | |
| ) | ||
| end | ||
| end | ||
|
|
||
| @doc false | ||
| def __sockets__, do: unquote(Macro.escape(sockets)) | ||
|
|
||
| @doc false | ||
| def socket_dispatch(%{path_info: path} = conn, _opts), do: do_socket_dispatch(path, conn) | ||
| unquote(dispatches) | ||
| defp do_socket_dispatch(_path, conn), do: conn | ||
| end | ||
| end | ||
|
|
||
| defp socket_paths(endpoint, path, socket, opts) do | ||
| paths = [] | ||
|
|
||
| common_config = [ | ||
| :path, | ||
| :serializer, | ||
| :transport_log, | ||
| :check_origin, | ||
| :check_csrf, | ||
| :code_reloader, | ||
| :connect_info, | ||
| :auth_token | ||
| ] | ||
|
|
||
| websocket = | ||
| opts | ||
| |> Keyword.get(:websocket, true) | ||
| |> maybe_validate_keys( | ||
| common_config ++ | ||
| [ | ||
| :timeout, | ||
| :max_frame_size, | ||
| :fullsweep_after, | ||
| :compress, | ||
| :subprotocols, | ||
| :error_handler | ||
| ] | ||
| ) | ||
|
|
||
| longpoll = | ||
| opts | ||
| |> Keyword.get(:longpoll, true) | ||
| |> maybe_validate_keys( | ||
| common_config ++ | ||
| [ | ||
| :window_ms, | ||
| :pubsub_timeout_ms, | ||
| :crypto | ||
| ] | ||
| ) | ||
|
|
||
| paths = | ||
| if websocket do | ||
| websocket = put_auth_token(websocket, opts[:auth_token]) | ||
| config = Phoenix.Socket.Transport.load_config(websocket, Phoenix.Transports.WebSocket) | ||
| plug_init = {endpoint, socket, config} | ||
| {conn_ast, match_path} = socket_path(path, config) | ||
| [{match_path, Phoenix.Transports.WebSocket, conn_ast, plug_init} | paths] | ||
| else | ||
| paths | ||
| end | ||
|
|
||
| paths = | ||
| if longpoll do | ||
| longpoll = put_auth_token(longpoll, opts[:auth_token]) | ||
| config = Phoenix.Socket.Transport.load_config(longpoll, Phoenix.Transports.LongPoll) | ||
| plug_init = {endpoint, socket, config} | ||
| {conn_ast, match_path} = socket_path(path, config) | ||
| [{match_path, Phoenix.Transports.LongPoll, conn_ast, plug_init} | paths] | ||
| else | ||
| paths | ||
| end | ||
|
|
||
| paths | ||
| end | ||
|
|
||
| defp put_auth_token(true, enabled), do: [auth_token: enabled] | ||
| defp put_auth_token(opts, enabled), do: Keyword.put(opts, :auth_token, enabled) | ||
|
|
||
| defp socket_path(path, config) do | ||
| end_path_fragment = Keyword.fetch!(config, :path) | ||
|
|
||
| {vars, path} = | ||
| String.split(path <> "/" <> end_path_fragment, "/", trim: true) | ||
| |> Enum.join("/") | ||
| |> Plug.Router.Utils.build_path_match() | ||
|
|
||
| conn_ast = | ||
| if vars == [] do | ||
| quote do | ||
| conn | ||
| end | ||
| else | ||
| params = | ||
| for var <- vars, | ||
| param = Atom.to_string(var), | ||
| not match?("_" <> _, param), | ||
| do: {param, Macro.var(var, nil)} | ||
|
|
||
| quote do | ||
| params = %{unquote_splicing(params)} | ||
| %{conn | path_params: params, params: params} | ||
| end | ||
| end | ||
|
|
||
| {conn_ast, path} | ||
| end | ||
|
|
||
| defp maybe_validate_keys(opts, keys) when is_list(opts), do: Keyword.validate!(opts, keys) | ||
| defp maybe_validate_keys(other, _), do: other | ||
|
|
||
| ## API | ||
|
|
||
| @doc """ | ||
|
|
@@ -1060,11 +942,11 @@ defmodule Phoenix.Endpoint do | |
| by `Phoenix.Token`. By default tokens are valid for 2 weeks | ||
|
|
||
| """ | ||
| defmacro socket(path, module, opts \\ []) do | ||
| module = Macro.expand(module, %{__CALLER__ | function: {:socket_dispatch, 2}}) | ||
| defmacro socket(_path, _module, _opts \\ []) do | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We most likely want to still support the old way as usual
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, I removed stuff in here mostly to make sure I catch everything. Making this propely backwards compatibility preserving will make sense once other questions are dealt with. |
||
| # module = Macro.expand(module, %{__CALLER__ | function: {:socket_dispatch, 2}}) | ||
|
|
||
| quote do | ||
| @phoenix_sockets {unquote(path), unquote(module), unquote(opts)} | ||
| # @phoenix_sockets {unquote(path), unquote(module), unquote(opts)} | ||
| end | ||
| end | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,54 @@ | ||
| defmodule Phoenix.Socket.Router do | ||
| @moduledoc false | ||
|
|
||
| defmacro socket(path, user_socket, opts) do | ||
| websocket = Keyword.get(opts, :websocket, true) | ||
| longpoll = Keyword.get(opts, :longpoll, true) | ||
|
|
||
| ws_quote = | ||
| if websocket do | ||
| websocket = put_auth_token(websocket, opts[:auth_token]) | ||
| {end_segment, websocket} = Keyword.pop(websocket, :path, "/websocket") | ||
| path = Path.join(path, end_segment) | ||
|
|
||
| quote do | ||
| match :*, | ||
| unquote(path), | ||
| Phoenix.Transports.WebSocket, | ||
| [ | ||
| {:user_socket, unquote(user_socket)} | ||
| | unquote(websocket) | ||
| ] | ||
| end | ||
| else | ||
| [] | ||
| end | ||
|
|
||
| lp_quote = | ||
| if longpoll do | ||
| longpoll = put_auth_token(longpoll, opts[:auth_token]) | ||
| {end_segment, longpoll} = Keyword.pop(longpoll, :path, "/longpoll") | ||
| path = Path.join(path, end_segment) | ||
|
|
||
| quote do | ||
| match :*, | ||
| unquote(path), | ||
| Phoenix.Transports.LongPoll, | ||
| [ | ||
| {:user_socket, unquote(user_socket)} | ||
| | unquote(longpoll) | ||
| ] | ||
| end | ||
| else | ||
| [] | ||
| end | ||
|
|
||
| quote do | ||
| unquote(ws_quote) | ||
| unquote(lp_quote) | ||
| end | ||
| end | ||
|
|
||
| defp put_auth_token(true, enabled), do: [auth_token: enabled] | ||
| defp put_auth_token(opts, enabled), do: Keyword.put(opts, :auth_token, enabled) | ||
| end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know yet if I really like having it explicit.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I'm with you. On the one hand it is really nice how this used to work.
On the other hand I don't like the amount of stuff that's being configured on the endpoint socket macro. Because there's just a single entry point to "everything" that also means everything needs to somehow be configured right there.
Given routers and endpoints are really only quite loosely coupled there's afaik also no good way to retain the static knowledge of to be started socket modules from the router macro.