@@ -140,7 +140,7 @@ defmodule Phoenix.Sync.Electric do
140140 @ doc false
141141 @ impl Phoenix.Sync.Adapter
142142 def children ( env , opts ) do
143- { mode , electric_opts } = electric_opts ( opts )
143+ { mode , electric_opts } = electric_opts ( env , opts )
144144
145145 case mode do
146146 :disabled ->
@@ -158,7 +158,7 @@ defmodule Phoenix.Sync.Electric do
158158 @ doc false
159159 @ impl Phoenix.Sync.Adapter
160160 def plug_opts ( env , opts ) do
161- { mode , electric_opts } = electric_opts ( opts )
161+ { mode , electric_opts } = electric_opts ( env , opts )
162162 # don't need to validate the mode here -- it will have already been
163163 # validated by children/0 which is run at phoenix_sync startup before the
164164 # plug opts call even comes through
@@ -179,7 +179,7 @@ defmodule Phoenix.Sync.Electric do
179179 @ doc false
180180 @ impl Phoenix.Sync.Adapter
181181 def client ( env , opts ) do
182- { mode , electric_opts } = electric_opts ( opts )
182+ { mode , electric_opts } = electric_opts ( env , opts )
183183
184184 case mode do
185185 mode when mode in @ client_valid_modes ->
@@ -197,35 +197,29 @@ defmodule Phoenix.Sync.Electric do
197197 @ electric_available?
198198 end
199199
200- defp electric_opts ( opts ) do
200+ defp electric_opts ( env , opts ) do
201201 Keyword . pop_lazy ( opts , :mode , fn ->
202- if electric_available? ( ) do
203- Logger . warning ( [
204- "missing mode configuration for :phoenix_sync. Electric is installed so assuming `embedded` mode"
205- ] )
206-
207- :embedded
208- else
209- Logger . warning ( "No `:mode` configuration for :phoenix_sync, assuming `:disabled`" )
210-
211- :disabled
212- end
202+ default_mode ( env )
213203 end )
214204 end
215205
216- defp electric_api_server ( opts ) do
217- config = electric_http_config ( opts )
206+ defp default_mode ( :test ) do
207+ :disabled
208+ end
218209
219- cond do
220- Code . ensure_loaded? ( Bandit ) ->
221- Electric.Application . api_server ( Bandit , config )
210+ if @ electric_available? do
211+ defp default_mode ( _env ) do
212+ Logger . warning ( [
213+ "missing mode configuration for :phoenix_sync. Electric is installed so assuming `embedded` mode"
214+ ] )
222215
223- Code . ensure_loaded? ( Plug.Cowboy ) ->
224- Electric.Application . api_server ( Plug.Cowboy , config )
216+ :embedded
217+ end
218+ else
219+ defp default_mode ( _env ) do
220+ Logger . warning ( "No `:mode` configuration for :phoenix_sync, assuming `:disabled`" )
225221
226- true ->
227- raise RuntimeError ,
228- message: "No HTTP server found. Please install either Bandit or Plug.Cowboy"
222+ :disabled
229223 end
230224 end
231225
@@ -236,15 +230,23 @@ defmodule Phoenix.Sync.Electric do
236230 end
237231 end
238232
239- defp plug_opts ( env , :embedded , electric_opts ) do
240- if electric_available? ( ) do
241- env
242- |> core_configuration ( electric_opts )
243- |> Electric.Application . api_plug_opts ( )
244- |> Keyword . fetch! ( :api )
245- else
246- raise RuntimeError ,
247- message: "Configured for embedded mode but `:electric` dependency not installed"
233+ if @ electric_available? do
234+ defp plug_opts ( env , :embedded , electric_opts ) do
235+ if electric_available? ( ) do
236+ env
237+ |> core_configuration ( electric_opts )
238+ |> Electric.Application . api_plug_opts ( )
239+ |> Keyword . fetch! ( :api )
240+ else
241+ raise RuntimeError ,
242+ message: "Configured for embedded mode but `:electric` dependency not installed"
243+ end
244+ end
245+ else
246+ defp plug_opts ( _env , :embedded , _electric_opts ) do
247+ raise ArgumentError ,
248+ message:
249+ "phoenix_sync configured in `mode: :embedded` but electric not installed. Please add `:electric` to your dependencies or use `:http` mode."
248250 end
249251 end
250252
@@ -259,36 +261,71 @@ defmodule Phoenix.Sync.Electric do
259261 defp electric_children ( env , mode , opts ) do
260262 case validate_database_config ( env , mode , opts ) do
261263 { :start , db_config_fun , message } ->
262- if electric_available? ( ) do
263- db_config =
264- db_config_fun . ( )
265- |> Keyword . update! ( :connection_opts , & Electric.Utils . obfuscate_password / 1 )
264+ start_embedded ( env , mode , db_config_fun , message )
266265
267- electric_config = core_configuration ( env , db_config )
266+ :ignore ->
267+ { :ok , [ ] }
268268
269- Logger . info ( message )
269+ { :error , _ } = error ->
270+ error
271+ end
272+ end
270273
271- http_server =
272- case mode do
273- :http -> electric_api_server ( electric_config )
274- :embedded -> [ ]
275- end
274+ if @ electric_available? do
275+ defp start_embedded ( env , mode , db_config_fun , message ) do
276+ db_config =
277+ db_config_fun . ( )
278+ |> Keyword . update! ( :connection_opts , & Electric.Utils . obfuscate_password / 1 )
276279
277- { :ok ,
278- [
279- { Electric.StackSupervisor , Electric.Application . configuration ( electric_config ) }
280- | http_server
281- ] }
282- else
283- { :error ,
284- "Electric configured to start in embedded mode but :electric dependency not available" }
280+ electric_config = core_configuration ( env , db_config )
281+
282+ Logger . info ( message )
283+
284+ http_server =
285+ case mode do
286+ :http -> electric_api_server ( electric_config )
287+ : embedded -> [ ]
285288 end
286289
287- :ignore ->
288- { :ok , [ ] }
290+ { :ok ,
291+ [
292+ { Electric.StackSupervisor , Electric.Application . configuration ( electric_config ) }
293+ | http_server
294+ ] }
295+ end
289296
290- { :error , _ } = error ->
291- error
297+ defp electric_api_server ( opts ) do
298+ config = electric_http_config ( opts )
299+
300+ cond do
301+ Code . ensure_loaded? ( Bandit ) ->
302+ Electric.Application . api_server ( Bandit , config )
303+
304+ Code . ensure_loaded? ( Plug.Cowboy ) ->
305+ Electric.Application . api_server ( Plug.Cowboy , config )
306+
307+ true ->
308+ raise RuntimeError ,
309+ message: "No HTTP server found. Please install either Bandit or Plug.Cowboy"
310+ end
311+ end
312+
313+ defp electric_http_config ( opts ) do
314+ case Keyword . fetch ( opts , :http ) do
315+ { :ok , http_opts } ->
316+ opts
317+ |> then ( fn o ->
318+ if ( port = http_opts [ :port ] , do: Keyword . put ( o , :service_port , port ) , else: o )
319+ end )
320+
321+ :error ->
322+ opts
323+ end
324+ end
325+ else
326+ defp start_embedded ( _env , _mode , _db_config_fun , _message ) do
327+ { :error ,
328+ "Electric configured to start in embedded mode but :electric dependency not available" }
292329 end
293330 end
294331
@@ -389,26 +426,32 @@ defmodule Phoenix.Sync.Electric do
389426 end
390427 end
391428
392- defp convert_repo_config ( repo_config ) do
393- expected_keys = Electric . connection_opts_schema ( ) |> Keyword . keys ( )
394-
395- ssl_opts =
396- case Keyword . get ( repo_config , :ssl , nil ) do
397- off when off in [ nil , false ] -> [ sslmode: :disable ]
398- true -> [ sslmode: :require ]
399- _opts -> [ ]
400- end
429+ if @ electric_available? do
430+ defp convert_repo_config ( repo_config ) do
431+ expected_keys = Electric . connection_opts_schema ( ) |> Keyword . keys ( )
432+
433+ ssl_opts =
434+ case Keyword . get ( repo_config , :ssl , nil ) do
435+ off when off in [ nil , false ] -> [ sslmode: :disable ]
436+ true -> [ sslmode: :require ]
437+ _opts -> [ ]
438+ end
401439
402- tcp_opts =
403- if :inet6 in Keyword . get ( repo_config , :socket_options , [ ] ) ,
404- do: [ ipv6: true ] ,
405- else: [ ]
440+ tcp_opts =
441+ if :inet6 in Keyword . get ( repo_config , :socket_options , [ ] ) ,
442+ do: [ ipv6: true ] ,
443+ else: [ ]
406444
407- repo_config
408- |> Keyword . take ( expected_keys )
409- |> Keyword . merge ( ssl_opts )
410- |> Keyword . merge ( tcp_opts )
411- |> Keyword . put_new ( :port , 5432 )
445+ repo_config
446+ |> Keyword . take ( expected_keys )
447+ |> Keyword . merge ( ssl_opts )
448+ |> Keyword . merge ( tcp_opts )
449+ |> Keyword . put_new ( :port , 5432 )
450+ end
451+ else
452+ defp convert_repo_config ( _repo_config ) do
453+ [ ]
454+ end
412455 end
413456
414457 defp http_mode_plug_opts ( electric_config ) do
@@ -426,19 +469,6 @@ defmodule Phoenix.Sync.Electric do
426469 end
427470 end
428471
429- defp electric_http_config ( opts ) do
430- case Keyword . fetch ( opts , :http ) do
431- { :ok , http_opts } ->
432- opts
433- |> then ( fn o ->
434- if ( port = http_opts [ :port ] , do: Keyword . put ( o , :service_port , port ) , else: o )
435- end )
436-
437- :error ->
438- opts
439- end
440- end
441-
442472 if @ electric_available? do
443473 defp configure_client ( opts , :embedded ) do
444474 Electric.Client . embedded ( opts )
0 commit comments