AIM Multisession Support Specification
Goal: Allow multiple concurrent logins for the same user account via clients that have multisession capability.
Functional Requirements
1. Concurrent Session Support ✅
Support multiple concurrent sessions for the same screen name when the client supports it.
- ✅ Users with multi-connection-capable clients can sign in from multiple locations at once
- ✅ Each session maintains its own independent connection state
- ✅ Sessions for the same user are tracked together by screen name
- ✅ Max concurrent sessions per user is configurable and enforced
2. Client Capability Detection ✅
Detect and respect what the client wants during login.
- ✅ Multi-connection flag is sent by client in TLV
0x4A during SNAC(0x17, 0x02) BUCPLoginRequest
- ✅ Three flag values: 0x0 (legacy/no support), 0x1 (supports multi-connection), 0x3 (supports but wants single session)
3. Session Instance Identification ✅
Each session needs a unique session number beyond screen name for proper routing and identification.
- ✅ Generate unique session number for each connection (stored in ServerCookie.SessionNum)
- ✅ Session number distinguishes between multiple concurrent sessions for same user
- ✅ Session numbers are used in authentication cookies for proper session routing
- ✅ RetrieveSession can target specific instances using sessionNum parameter (0 = first active, >0 = specific instance)
4. Session-Specific vs User-Level Data ✅
Distinguish between data that is per-session vs per-user.
Per-Session Data (Independent):
- ✅ Client capabilities (file transfer, voice chat, etc.) - each client may support different features
- ✅ Client identification string (client name, version)
- ✅ Connection state (IP address, connection time)
- ✅ Idle time
- ✅ Away status
- ✅ Session timeout settings
- ✅ Typing notifications - originated from specific session
User-Level Data (Shared across all sessions):
- ✅ Buddy list (feedbag)
- ✅ User profile and directory information
- ✅ Buddy icon (BART)
- ✅ Warning/evil level
- ✅ Preferences and settings
- ✅ Blocked users list
- ✅ Offline messages (delivered once to first available session)
5. New Session Handling ✅
Handle new session connections based on client capability.
- ✅ Legacy clients (flag 0x0) always disconnect existing sessions
- ✅ Single-session clients (flag 0x3) always disconnect existing sessions
- ✅ Multi-connection clients (flag 0x1) - new session is added, joininig existing sessions
6. Multi-Session Notifications ✅
Tell users when they sign in from additional locations.
- When a 2nd or later session connects, send an automated system message
- Message format: "AOL System Msg: Your AOL screen name (USERNAME) is now signed into AOL(R) Instant Messenger (TM) in N locations. Click here for more information."
- Message goes to ALL active sessions for that user
- Session count in message is accurate
- Notifications can be turned on or off via configuration
7. Away Messages & Auto-Responses ⚠️
Handle away status and auto-responses across multiple sessions.
Away Status Aggregation:
- ✅ User appears "away" to others ONLY if ALL sessions are away
- ✅ User appears "active" to others if ANY session is active
- ✅ Presence updates to buddies only happen when aggregate status changes
- ✅ Each session has its own independent away status
- ✅ Away status changes are tracked per-session
Auto-Response Behavior:
- ✅ Auto-responses are ONLY sent when ALL sessions are away
- ✅ When all sessions are away, sender receives auto-responses from all sessions that have an away message set
8. Idle Status Aggregation ✅
Calculate aggregate idle status across all sessions for presence.
- ✅ If ALL sessions are idle, return the most recent idle time to other users
- ✅ If at least ONE session is not idle, don't return an idle time (user appears active)
- ✅ Each session tracks its own idle time independently
- ✅ Idle status is aggregated similar to away status
9. Presence Broadcasting ✅
Broadcast presence changes to buddies only when aggregate online status changes.
- ✅ Buddies get "user online" notification when user's FIRST session comes online
- ✅ Buddies don't get duplicate "user online" when additional sessions connect
- ✅ Buddies get "user offline" notification when user's LAST session goes offline
- ✅ Presence updates are based on aggregate session state, not individual sessions
10. Intelligent Message Routing ✅
Route incoming instant messages to the right sessions based on their state.
- ✅ Messages go to ALL non-away sessions if any exist
- ✅ If ALL sessions are away, messages go to ALL sessions (including away ones)
- ✅ Don't send to idle/inactive sessions if active sessions exist
11. Typing Notifications ✅
Handle typing notifications across multiple sessions.
- ✅ Typing notifications are sent FROM the session where user is typing
- ✅ Outgoing typing notifications go to ALL active sessions
12. Offline Message Delivery ✅
Offline messages stored while user is completely offline.
- ✅ Offline messages delivered when FIRST session comes online
- ✅ Mark messages as delivered so they don't re-deliver to subsequent sessions
- ✅ If message delivery fails, retry on next session login
- ✅ Clear offline message queue after successful delivery
13. Buddy List Synchronization ✅
Sync buddy list changes across all sessions for the same user.
- ✅ Feedbag sync works for INSERT, UPDATE, and DELETE operations
- ✅ Feedbag INSERT, UPDATE, DELETE requests sent by the client are forwarded to other concurrent sessions (but not self)
- ✅ Uses messageRelayer.RelayToOtherInstances() to broadcast feedbag changes across all concurrent sessions
14. User Profile & Directory Information ✅
User profile updates are user-level and should be consistent.
- ✅ Each session can submit its own profile information
- ✅ Only the oldest (first) session's profile is displayed to other users
- ✅ Directory information updates are user-level
- ✅ Buddy icons (BART) are user-level - same icon shown from all sessions
15. Warning/Evil Levels ✅
Warning levels are user-level, not session-level.
- ✅ Warning level is shared across all sessions
- ✅ If user is warned, ALL sessions see the increased warning level
- ✅ Warning level decreases over time for the user, not per-session
- ✅ Warning notifications broadcast to all active sessions
16. Client Capabilities Per Session ✅
Each session may have different client capabilities.
- ✅ Sessions report their own capabilities (file transfer, games, voice, etc.)
- ✅ Show "most capable" feature set in presence
- Direct connection invitations should target specific session with required capability (Todo)
17. Chat Room Sessions ✅
Handle chat room participation with multisession constraints.
- ✅ Only ONE session per user can be in a specific chat room at a time
- ✅ If a user tries to join a chat room they're already in (from another session), boot the previous session from that chat room
18. Direct Connections & Rendezvous ✅
- Rendezvous requests go to all instances..
19. Global Rate Limiting ✅
Enforce rate limits per user across all their sessions.
- ✅ Rate limits are shared across ALL sessions for the same screen name
- ✅ Opening multiple sessions doesn't multiply rate limits
- ✅ Rate limit state persists across individual session disconnects
- ✅ Users can't circumvent rate limits by rapid sign-off/sign-on