@@ -57,6 +57,32 @@ const API_BASE = process.env.SCREENITY_API_BASE_URL;
5757const CLOUD_FEATURES_ENABLED =
5858 process . env . SCREENITY_ENABLE_CLOUD_FEATURES === "true" ;
5959
60+ let activeRecordingSession = null ;
61+ let recordingTabListener = null ;
62+
63+ const clearRecordingSession = ( ) => {
64+ activeRecordingSession = null ;
65+ if ( recordingTabListener ) {
66+ chrome . tabs . onRemoved . removeListener ( recordingTabListener ) ;
67+ recordingTabListener = null ;
68+ }
69+ } ;
70+
71+ const registerRecordingTabListener = ( tabId ) => {
72+ if ( ! tabId || recordingTabListener ) return ;
73+ recordingTabListener = ( closedTabId ) => {
74+ if ( closedTabId === tabId ) {
75+ chrome . runtime . sendMessage ( {
76+ type : "stop-recording-tab" ,
77+ reason : "recording-tab-closed" ,
78+ tabId : closedTabId ,
79+ } ) ;
80+ clearRecordingSession ( ) ;
81+ }
82+ } ;
83+ chrome . tabs . onRemoved . addListener ( recordingTabListener ) ;
84+ } ;
85+
6086export const copyToClipboard = ( text ) => {
6187 if ( ! text ) return ;
6288 chrome . tabs . query ( { active : true , currentWindow : true } , ( tabs ) => {
@@ -104,7 +130,29 @@ export const setupHandlers = () => {
104130 async ( message , sender ) => await handleGetStreamingData ( message , sender )
105131 ) ;
106132 registerMessage ( "cancel-recording" , ( message ) => cancelRecording ( message ) ) ;
107- registerMessage ( "stop-recording-tab" , ( message , sendResponse ) => {
133+ registerMessage ( "stop-recording-tab" , ( message , sender , sendResponse ) => {
134+ try {
135+ const reason = message ?. reason || "unknown" ;
136+ const senderTabId = message ?. tabId || sender ?. tab ?. id || null ;
137+ const senderUrl = sender ?. url || null ;
138+ const stack = new Error ( ) . stack ;
139+ console . warn ( "[Screenity][BG] stop-recording-tab received" , {
140+ reason,
141+ senderTabId,
142+ senderUrl,
143+ } ) ;
144+ chrome . storage . local . set ( {
145+ lastStopRecordingEvent : {
146+ reason,
147+ senderTabId,
148+ senderUrl,
149+ stack,
150+ ts : Date . now ( ) ,
151+ } ,
152+ } ) ;
153+ } catch ( err ) {
154+ console . warn ( "[Screenity][BG] stop-recording-tab logging failed" , err ) ;
155+ }
108156 handleStopRecordingTab ( message ) ;
109157 sendResponse ( { ok : true } ) ;
110158 return true ;
@@ -236,6 +284,21 @@ export const setupHandlers = () => {
236284 }
237285 ) ;
238286 registerMessage ( "is-pinned" , async ( ) => await isPinned ( ) ) ;
287+
288+ // Prevent Chrome from discarding the CloudRecorder tab during recording
289+ registerMessage ( "set-tab-auto-discardable" , async ( { payload } , sender ) => {
290+ try {
291+ const tabId = sender ?. tab ?. id ;
292+ if ( tabId ) {
293+ await chrome . tabs . update ( tabId , {
294+ autoDiscardable : payload . discardable ,
295+ } ) ;
296+ }
297+ } catch ( err ) {
298+ console . warn ( "Failed to set tab autoDiscardable:" , err ) ;
299+ }
300+ } ) ;
301+
239302 registerMessage (
240303 "save-to-drive" ,
241304 async ( message ) => await handleSaveToDrive ( message , false )
@@ -911,4 +974,49 @@ export const setupHandlers = () => {
911974 } ) ;
912975 return true ;
913976 } ) ;
977+ registerMessage (
978+ "register-recording-session" ,
979+ ( message , sender , sendResponse ) => {
980+ const incoming = message . session || { } ;
981+ if (
982+ activeRecordingSession &&
983+ activeRecordingSession . id &&
984+ incoming . id &&
985+ activeRecordingSession . id !== incoming . id
986+ ) {
987+ sendResponse ( {
988+ ok : false ,
989+ error : "Another recording session is already active" ,
990+ activeRecordingSession,
991+ } ) ;
992+ return true ;
993+ }
994+
995+ const tabId = incoming . tabId || sender ?. tab ?. id || null ;
996+ activeRecordingSession = { ...incoming , tabId } ;
997+ registerRecordingTabListener ( tabId ) ;
998+ sendResponse ( { ok : true , session : activeRecordingSession } ) ;
999+ return true ;
1000+ }
1001+ ) ;
1002+
1003+ registerMessage (
1004+ "clear-recording-session" ,
1005+ ( message , sender , sendResponse ) => {
1006+ clearRecordingSession ( ) ;
1007+ sendResponse ( { ok : true } ) ;
1008+ return true ;
1009+ }
1010+ ) ;
1011+
1012+ registerMessage (
1013+ "restore-recording-session" ,
1014+ async ( message , sender , sendResponse ) => {
1015+ const { recorderSession } = await chrome . storage . local . get ( [
1016+ "recorderSession" ,
1017+ ] ) ;
1018+ sendResponse ( { recorderSession : recorderSession || null } ) ;
1019+ return true ;
1020+ }
1021+ ) ;
9141022} ;
0 commit comments