@@ -140,7 +140,10 @@ 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 ( env , opts )
143+ { mode , electric_opts } =
144+ opts
145+ |> set_environment_defaults ( env )
146+ |> electric_opts ( env )
144147
145148 case mode do
146149 :disabled ->
@@ -158,7 +161,11 @@ defmodule Phoenix.Sync.Electric do
158161 @ doc false
159162 @ impl Phoenix.Sync.Adapter
160163 def plug_opts ( env , opts ) do
161- { mode , electric_opts } = electric_opts ( env , opts )
164+ { mode , electric_opts } =
165+ opts
166+ |> set_environment_defaults ( env )
167+ |> electric_opts ( env )
168+
162169 # don't need to validate the mode here -- it will have already been
163170 # validated by children/0 which is run at phoenix_sync startup before the
164171 # plug opts call even comes through
@@ -179,7 +186,10 @@ defmodule Phoenix.Sync.Electric do
179186 @ doc false
180187 @ impl Phoenix.Sync.Adapter
181188 def client ( env , opts ) do
182- { mode , electric_opts } = electric_opts ( env , opts )
189+ { mode , electric_opts } =
190+ opts
191+ |> set_environment_defaults ( env )
192+ |> electric_opts ( env )
183193
184194 case mode do
185195 mode when mode in @ client_valid_modes ->
@@ -192,12 +202,52 @@ defmodule Phoenix.Sync.Electric do
192202 end
193203 end
194204
205+ # if we want to set up per-run configuration, and avoid weird state errors in
206+ # dev and test, then we have to write them to the application config, because
207+ # `children/2`, `client/2` and `plug_opts/2` need to have consistent
208+ # configuration values.
209+ defp set_environment_defaults ( opts , :test ) do
210+ opts
211+ |> set_persistent_config ( :stack_id , fn ->
212+ "electric-stack#{ System . monotonic_time ( ) } "
213+ end )
214+ |> set_persistent_config ( :replication_stream_id , fn ->
215+ String . replace ( "phoenix_sync#{ System . monotonic_time ( ) } " , "-" , "_" )
216+ end )
217+ |> set_persistent_config ( :replication_slot_temporary? , true )
218+ end
219+
220+ defp set_environment_defaults ( opts , :dev ) do
221+ opts
222+ |> set_environment_defaults ( :prod )
223+ |> set_persistent_config ( :storage_dir , fn ->
224+ Path . join ( [ System . tmp_dir! ( ) , "phoenix-sync#{ System . monotonic_time ( ) } " ] )
225+ end )
226+ end
227+
228+ defp set_environment_defaults ( opts , _env ) do
229+ opts
230+ |> set_persistent_config ( :stack_id , "electric-embedded" )
231+ end
232+
233+ defp set_persistent_config ( opts , key , value_fun ) when is_function ( value_fun ) do
234+ Keyword . put_new_lazy ( opts , key , fn ->
235+ value = value_fun . ( )
236+ Application . put_env ( :phoenix_sync , key , value )
237+ value
238+ end )
239+ end
240+
241+ defp set_persistent_config ( opts , key , value ) do
242+ set_persistent_config ( opts , key , fn -> value end )
243+ end
244+
195245 @ doc false
196246 def electric_available? do
197247 @ electric_available?
198248 end
199249
200- defp electric_opts ( env , opts ) do
250+ defp electric_opts ( opts , env ) do
201251 Keyword . pop_lazy ( opts , :mode , fn ->
202252 default_mode ( env )
203253 end )
@@ -258,6 +308,14 @@ defmodule Phoenix.Sync.Electric do
258308 electric_children ( env , mode , opts )
259309 end
260310
311+ # don't start embedded electric in :test env because electric
312+ # creates replication slots and doesn't play well with
313+ # async tests
314+ # defp electric_children(:test, :embedded, _opts) do
315+ # Logger.info("Not starting embedded electric in test mode")
316+ # {:ok, []}
317+ # end
318+
261319 defp electric_children ( env , mode , opts ) do
262320 case validate_database_config ( env , mode , opts ) do
263321 { :start , db_config_fun , message } ->
@@ -336,8 +394,8 @@ defmodule Phoenix.Sync.Electric do
336394 defp core_configuration ( env , opts ) do
337395 opts
338396 |> env_defaults ( env )
339- |> overrides ( )
340397 |> stack_id ( )
398+ |> overrides ( )
341399 end
342400
343401 defp env_defaults ( opts , :dev ) do
@@ -351,20 +409,20 @@ defmodule Phoenix.Sync.Electric do
351409 # :storage_dir,
352410 # Path.join(System.tmp_dir!(), "electric/shape-data#{System.monotonic_time()}")
353411 # )
354- |> Keyword . put_new (
355- :storage ,
356- { Electric.ShapeCache.InMemoryStorage ,
357- table_base_name: :"electric-storage#{ opts [ :stack_id ] } " , stack_id: opts [ :stack_id ] }
358- )
359- |> Keyword . put_new (
360- :persistent_kv ,
361- { Electric.PersistentKV.Memory , :new! , [ ] }
362- )
412+ # |> Keyword.put_new(
413+ # :storage,
414+ # {Electric.ShapeCache.InMemoryStorage,
415+ # table_base_name: :"electric-storage#{opts[:stack_id]}", stack_id: opts[:stack_id]}
416+ # )
417+ # |> Keyword.put_new(
418+ # :persistent_kv,
419+ # {Electric.PersistentKV.Memory, :new!, []}
420+ # )
363421 |> Keyword . put_new ( :send_cache_headers? , false )
364422 end
365423
366424 defp env_defaults ( opts , :test ) do
367- stack_id = "electric-stack#{ System . monotonic_time ( ) } "
425+ stack_id = "electric-stack"
368426
369427 opts = Keyword . put_new ( opts , :stack_id , stack_id )
370428
0 commit comments