@@ -317,8 +317,18 @@ defmodule Electric.Shapes.Api do
317317
318318 # TODO: discuss returning a 307 redirect rather than a 409, the client
319319 # will have to detect this and throw out old data
320+
321+ # In SSE mode we send the must refetch object as an event
322+ # instead of a singleton array containing that object
323+ must_refetch =
324+ if request . params . experimental_live_sse do
325+ hd ( @ must_refetch )
326+ else
327+ @ must_refetch
328+ end
329+
320330 { :error ,
321- Response . error ( request , @ must_refetch ,
331+ Response . error ( request , must_refetch ,
322332 handle: active_shape_handle ,
323333 status: 409
324334 ) }
@@ -610,10 +620,9 @@ defmodule Electric.Shapes.Api do
610620 last_message_time: last_message_time ,
611621 request:
612622 % {
613- api:
614- % {
615- keepalive_interval: keepalive_interval
616- } = api ,
623+ api: % {
624+ keepalive_interval: keepalive_interval
625+ } ,
617626 handle: shape_handle ,
618627 new_changes_ref: ref
619628 } = request ,
@@ -664,7 +673,7 @@ defmodule Electric.Shapes.Api do
664673
665674 { ^ ref , :shape_rotation } ->
666675 must_refetch = % { headers: % { control: "must-refetch" } }
667- message = encode_message ( api , must_refetch )
676+ message = encode_message ( request , must_refetch )
668677
669678 { message , % { state | mode: :done } }
670679
@@ -793,11 +802,19 @@ defmodule Electric.Shapes.Api do
793802 encode ( api , :log , stream )
794803 end
795804
796- @ spec encode_message ( Api . t ( ) | Request . t ( ) , term ( ) ) :: Enum . t ( )
797- def encode_message ( % Api { } = api , message ) do
805+ # Error messages are encoded normally, even when using SSE
806+ # because they are returned on the original fetch request
807+ # with a status code that is not 2xx.
808+ @ spec encode_error_message ( Api . t ( ) | Request . t ( ) , term ( ) ) :: Enum . t ( )
809+ def encode_error_message ( % Api { } = api , message ) do
810+ encode ( api , :message , message )
811+ end
812+
813+ def encode_error_message ( % Request { api: api } , message ) do
798814 encode ( api , :message , message )
799815 end
800816
817+ @ spec encode_message ( Request . t ( ) , term ( ) ) :: Enum . t ( )
801818 def encode_message (
802819 % Request { api: api , params: % { live: true , experimental_live_sse: true } } ,
803820 message
0 commit comments