Overview
SubWallet uses Chrome’s runtime messaging API to enable communication between different parts of the extension:- Content Scripts ↔ Background Service
- Extension UI ↔ Background Service
- Web Pages ↔ Content Scripts (via window.postMessage)
Architecture
Message Protocol
Message Structure
packages/extension-base/src/background/types.ts:140-145
Message Types
Messages follow a naming convention: Format:<scope>(<namespace>.<action>)
Scopes:
pri()- Private messages (from extension UI or content script)pub()- Public messages (from web pages via injected provider)mobile()- Mobile app messages
Request Signatures
Location:packages/extension-base/src/background/types.ts
packages/extension-base/src/background/types.ts:84-128
Port Communication
Port Types
packages/extension-base/src/defaults.ts:18-19
Establishing Connection
From Extension UI
Location:packages/extension-koni-ui/src/messaging/base.ts
packages/extension-koni-ui/src/messaging/base.ts:22-56
From Content Script
Location:packages/extension-koni/src/content.ts
packages/extension-koni/src/content.ts:32-47
Sending Messages
Simple Request
packages/extension-koni-ui/src/messaging/base.ts:91-105
Subscription Request
packages/extension-koni-ui/src/messaging/base.ts:177-189
Receiving Messages in Background
Location:packages/extension-base/src/koni/background/handlers/index.ts
packages/extension-base/src/koni/background/handlers/index.ts:52-88
Window PostMessage (Page ↔ Content Script)
Message Origins
packages/extension-base/src/defaults.ts:20-21
Page to Content Script
packages/extension-koni/src/content.ts:75-83
Content Script to Page
packages/extension-koni/src/content.ts:50-57
Lazy Loading Pattern
Lazy Send
packages/extension-koni-ui/src/messaging/base.ts:107-134
Lazy Subscribe
packages/extension-koni-ui/src/messaging/base.ts:136-175
Error Handling
Port Disconnection
packages/extension-koni-ui/src/messaging/base.ts:59-83
Message Errors
Message Flow Examples
Example 1: Get Account List
Example 2: Subscribe to Balance
Example 3: dApp Authorization
Best Practices
- Always Validate Origins: Check message origins to prevent injection
- Handle Disconnections: Implement reconnection logic
- Use Type Safety: Leverage TypeScript message signatures
- Clean Up Subscriptions: Always unsubscribe when component unmounts
- Error Handling: Wrap message calls in try-catch
- Unique IDs: Use
getId()for unique message identifiers - Port Lifecycle: Properly manage port connections and cleanup
Related Documentation
- Background Services - Background architecture
- Extension UI - UI messaging implementation
- Content Scripts - Content script messaging