Skip to content

Commit c85adf6

Browse files
Merge pull request #551 from simstudioai/improvement/socket-per-session
Improvement(socket conn level): move socket connection to browser session level rather than workspace
2 parents 936d2d3 + a05ba86 commit c85adf6

3 files changed

Lines changed: 44 additions & 31 deletions

File tree

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1-
import { WorkspaceProvider } from '@/providers/workspace-provider'
21
import Providers from './w/components/providers/providers'
32
import { Sidebar } from './w/components/sidebar/sidebar'
43

54
export default function WorkspaceLayout({ children }: { children: React.ReactNode }) {
65
return (
7-
<WorkspaceProvider>
8-
<Providers>
9-
<div className='flex min-h-screen w-full'>
10-
<div className='z-20'>
11-
<Sidebar />
12-
</div>
13-
<div className='flex flex-1 flex-col'>{children}</div>
6+
<Providers>
7+
<div className='flex min-h-screen w-full'>
8+
<div className='z-20'>
9+
<Sidebar />
1410
</div>
15-
</Providers>
16-
</WorkspaceProvider>
11+
<div className='flex flex-1 flex-col'>{children}</div>
12+
</div>
13+
</Providers>
1714
)
1815
}

apps/sim/app/workspace/layout.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use client'
2+
3+
import { useSession } from '@/lib/auth-client'
4+
import { SocketProvider } from '@/contexts/socket-context'
5+
6+
interface WorkspaceRootLayoutProps {
7+
children: React.ReactNode
8+
}
9+
10+
export default function WorkspaceRootLayout({ children }: WorkspaceRootLayoutProps) {
11+
const session = useSession()
12+
13+
const user = session.data?.user
14+
? {
15+
id: session.data.user.id,
16+
name: session.data.user.name,
17+
email: session.data.user.email,
18+
}
19+
: undefined
20+
21+
return <SocketProvider user={user}>{children}</SocketProvider>
22+
}

apps/sim/contexts/socket-context.tsx

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -99,21 +99,13 @@ export function SocketProvider({ children, user }: SocketProviderProps) {
9999
workflowDeleted?: (data: any) => void
100100
}>({})
101101

102-
// Initialize socket when user is available
102+
// Initialize socket when user is available - only once per session
103103
useEffect(() => {
104104
if (!user?.id) return
105105

106-
// Prevent duplicate connections - disconnect existing socket first
107-
if (socket) {
108-
logger.info('Disconnecting existing socket before creating new one')
109-
socket.disconnect()
110-
setSocket(null)
111-
setIsConnected(false)
112-
}
113-
114-
// Prevent multiple simultaneous initialization attempts
115-
if (isConnecting) {
116-
logger.info('Socket initialization already in progress, skipping')
106+
// Only initialize if we don't have a socket and aren't already connecting
107+
if (socket || isConnecting) {
108+
logger.info('Socket already exists or is connecting, skipping initialization')
117109
return
118110
}
119111

@@ -296,16 +288,8 @@ export function SocketProvider({ children, user }: SocketProviderProps) {
296288
// Start the socket initialization
297289
initializeSocket()
298290

299-
// Cleanup on unmount or user change
291+
// Cleanup on unmount only (not on user change since socket is session-level)
300292
return () => {
301-
if (socket) {
302-
logger.info('Cleaning up socket connection')
303-
socket.disconnect()
304-
setSocket(null)
305-
setIsConnected(false)
306-
setIsConnecting(false)
307-
}
308-
309293
positionUpdateTimeouts.current.forEach((timeoutId) => {
310294
clearTimeout(timeoutId)
311295
})
@@ -314,6 +298,16 @@ export function SocketProvider({ children, user }: SocketProviderProps) {
314298
}
315299
}, [user?.id])
316300

301+
// Cleanup socket on component unmount
302+
useEffect(() => {
303+
return () => {
304+
if (socket) {
305+
logger.info('Cleaning up socket connection on unmount')
306+
socket.disconnect()
307+
}
308+
}
309+
}, [])
310+
317311
// Join workflow room
318312
const joinWorkflow = useCallback(
319313
(workflowId: string) => {

0 commit comments

Comments
 (0)