@@ -38,6 +38,7 @@ import {reloadPreviouslySuppressedFiles} from './preview-server/watch-ignore-nex
3838import type { RemotionConfigResponse } from './remotion-config-response' ;
3939const loggedStaticFileHints = new Set < string > ( ) ;
4040const ELEMENT_INSTALL_FOCUS_MAX_AGE = 5 * 60 * 1000 ;
41+ const ELEMENT_INSTALL_TARGET_RESPONSE_WAIT = 250 ;
4142
4243const static404 = ( response : ServerResponse ) : Promise < void > => {
4344 response . writeHead ( 404 ) ;
@@ -124,11 +125,13 @@ const handleElementInstallOptions = ({
124125} ;
125126
126127const handleElementInstallTarget = ( {
128+ liveEventsServer,
127129 request,
128130 response,
129131 remotionRoot,
130132 gitSource,
131133} : {
134+ liveEventsServer : LiveEventsServer ;
132135 request : IncomingMessage ;
133136 response : ServerResponse ;
134137 remotionRoot : string ;
@@ -142,30 +145,42 @@ const handleElementInstallTarget = ({
142145 return Promise . resolve ( ) ;
143146 }
144147
145- const target = getElementInstallTarget ( ) ;
146- const now = Date . now ( ) ;
147- const targetIsLive =
148- target !== null && now - target . updatedAt < ELEMENT_INSTALL_TARGET_MAX_AGE ;
149- const host = request . headers . host ?? null ;
150- const port = host ?. split ( ':' ) . at ( - 1 ) ?? null ;
151- setElementInstallCorsHeaders ( { request, response} ) ;
152- response . writeHead ( 200 , { 'Content-Type' : 'application/json' } ) ;
153- response . end (
154- JSON . stringify ( {
155- type : 'remotion-studio' ,
156- projectName : getProjectName ( {
157- basename : path . basename ,
158- gitSource,
159- resolvedRemotionRoot : remotionRoot ,
160- } ) ,
161- port : port === null ? null : Number ( port ) ,
162- lastFocusedAt : target ?. lastFocusedAt ?? null ,
163- canInstall : target !== null && target . canInstall && targetIsLive ,
164- activeCompositionId : target ?. compositionId ?? null ,
165- readOnly : target ?. readOnly ?? false ,
166- } ) ,
167- ) ;
168- return Promise . resolve ( ) ;
148+ const requestId = `${ Date . now ( ) } -${ Math . random ( ) . toString ( 16 ) . slice ( 2 ) } ` ;
149+
150+ liveEventsServer . sendEventToClient ( {
151+ type : 'request-element-install-target' ,
152+ requestId,
153+ } ) ;
154+
155+ return new Promise < void > ( ( resolve ) => {
156+ setTimeout ( ( ) => {
157+ const target = getElementInstallTarget ( requestId ) ;
158+ const now = Date . now ( ) ;
159+ const targetIsLive =
160+ target !== null &&
161+ now - target . updatedAt < ELEMENT_INSTALL_TARGET_MAX_AGE ;
162+ const host = request . headers . host ?? null ;
163+ const port = host ?. split ( ':' ) . at ( - 1 ) ?? null ;
164+ setElementInstallCorsHeaders ( { request, response} ) ;
165+ response . writeHead ( 200 , { 'Content-Type' : 'application/json' } ) ;
166+ response . end (
167+ JSON . stringify ( {
168+ type : 'remotion-studio' ,
169+ projectName : getProjectName ( {
170+ basename : path . basename ,
171+ gitSource,
172+ resolvedRemotionRoot : remotionRoot ,
173+ } ) ,
174+ port : port === null ? null : Number ( port ) ,
175+ lastFocusedAt : target ?. lastFocusedAt ?? null ,
176+ canInstall : target !== null && target . canInstall && targetIsLive ,
177+ activeCompositionId : target ?. compositionId ?? null ,
178+ readOnly : target ?. readOnly ?? false ,
179+ } ) ,
180+ ) ;
181+ resolve ( ) ;
182+ } , ELEMENT_INSTALL_TARGET_RESPONSE_WAIT ) ;
183+ } ) ;
169184} ;
170185
171186const handleRequestElementInstall = async ( {
@@ -206,7 +221,7 @@ const handleRequestElementInstall = async ({
206221 return ;
207222 }
208223
209- const target = getElementInstallTarget ( ) ;
224+ const target = getElementInstallTarget ( null ) ;
210225 const now = Date . now ( ) ;
211226 const targetIsLive =
212227 target !== null &&
@@ -641,6 +656,7 @@ export const handleRoutes = ({
641656
642657 if ( url . pathname === '/api/element-install-target' ) {
643658 return handleElementInstallTarget ( {
659+ liveEventsServer,
644660 request,
645661 response,
646662 remotionRoot,
0 commit comments