CMD messages can only be sent from the server, clients cannot actively send CMD messages
Listen for Command Messages
Basic Listening
Copy
cmdListener = (cmd: WKCMD) => {
// Handle CMD messages
};
// Add CMD message listener
WKIM.shared.cmdManager().addCmdListener(this.cmdListener);
// Remove listener when exiting page
WKIM.shared.cmdManager().removeCmdListener(this.cmdListener);
Complete Command Listening Management
Copy
interface CMDMessageEvent {
cmd: WKCMD;
timestamp: number;
processed: boolean;
}
class CMDMessageManager {
private static cmdListeners: Set<(cmd: WKCMD) => void> = new Set();
private static cmdEventCallbacks: Array<(event: CMDMessageEvent) => void> = [];
// Add command listener
static addCmdListener(callback: (cmd: WKCMD) => void): void {
this.cmdListeners.add(callback);
WKIM.shared.cmdManager().addCmdListener((cmd: WKCMD) => {
// Call callback
callback(cmd);
// Send to event callbacks
const event: CMDMessageEvent = {
cmd,
timestamp: Date.now(),
processed: false
};
this.cmdEventCallbacks.forEach(cb => cb(event));
// Handle common commands
this.handleCommonCommands(cmd);
console.log('Received command message:', cmd.cmd);
});
}
// Remove command listener
static removeCmdListener(callback: (cmd: WKCMD) => void): void {
this.cmdListeners.delete(callback);
WKIM.shared.cmdManager().removeCmdListener(callback);
}
// Add command event callback
static addCmdEventCallback(callback: (event: CMDMessageEvent) => void): void {
this.cmdEventCallbacks.push(callback);
}
// Remove command event callback
static removeCmdEventCallback(callback: (event: CMDMessageEvent) => void): void {
const index = this.cmdEventCallbacks.indexOf(callback);
if (index > -1) {
this.cmdEventCallbacks.splice(index, 1);
}
}
// Remove all listeners
static removeAllListeners(): void {
this.cmdListeners.forEach(callback => {
WKIM.shared.cmdManager().removeCmdListener(callback);
});
this.cmdListeners.clear();
this.cmdEventCallbacks = [];
}
// Handle common commands
private static handleCommonCommands(cmd: WKCMD): void {
switch (cmd.cmd) {
case 'syncConversation':
this.handleSyncConversation(cmd);
break;
case 'syncChannelInfo':
this.handleSyncChannelInfo(cmd);
break;
case 'syncChannelMember':
this.handleSyncChannelMember(cmd);
break;
case 'syncMessageExtra':
this.handleSyncMessageExtra(cmd);
break;
case 'syncMessageReaction':
this.handleSyncMessageReaction(cmd);
break;
case 'userStatusUpdate':
this.handleUserStatusUpdate(cmd);
break;
case 'channelUpdate':
this.handleChannelUpdate(cmd);
break;
case 'memberUpdate':
this.handleMemberUpdate(cmd);
break;
default:
console.log('Unhandled command:', cmd.cmd);
break;
}
}
// Handle sync conversation command
private static handleSyncConversation(cmd: WKCMD): void {
console.log('Handle sync conversation command');
// Trigger conversation sync logic
// Can call conversation manager's sync method here
}
// Handle sync channel info command
private static handleSyncChannelInfo(cmd: WKCMD): void {
console.log('Handle sync channel info command');
if (cmd.paramJsonObject) {
const channelId = cmd.paramJsonObject['channel_id'] as string;
const channelType = cmd.paramJsonObject['channel_type'] as number;
if (channelId && channelType !== undefined) {
// Refresh channel info
WKIM.shared.channelManager().fetchChannelInfo(channelId, channelType);
}
}
}
// Handle sync channel member command
private static handleSyncChannelMember(cmd: WKCMD): void {
console.log('Handle sync channel member command');
// Trigger channel member sync logic
}
// Handle sync message extra command
private static handleSyncMessageExtra(cmd: WKCMD): void {
console.log('Handle sync message extra command');
// Trigger message extra sync logic
}
// Handle sync message reaction command
private static handleSyncMessageReaction(cmd: WKCMD): void {
console.log('Handle sync message reaction command');
// Trigger message reaction sync logic
}
// Handle user status update command
private static handleUserStatusUpdate(cmd: WKCMD): void {
console.log('Handle user status update command');
if (cmd.paramJsonObject) {
const uid = cmd.paramJsonObject['uid'] as string;
const online = cmd.paramJsonObject['online'] as number;
if (uid && online !== undefined) {
// Update user online status
console.log(`User ${uid} status update: ${online === 1 ? 'online' : 'offline'}`);
}
}
}
// Handle channel update command
private static handleChannelUpdate(cmd: WKCMD): void {
console.log('Handle channel update command');
// Handle channel info changes
}
// Handle member update command
private static handleMemberUpdate(cmd: WKCMD): void {
console.log('Handle member update command');
// Handle member info changes
}
// Dispose
static dispose(): void {
this.removeAllListeners();
}
}
Common Command Types
System Sync Commands
These commands are used to sync various data states:Copy
class SystemSyncCommands {
// Sync conversation list
static readonly SYNC_CONVERSATION = 'syncConversation';
// Sync channel info
static readonly SYNC_CHANNEL_INFO = 'syncChannelInfo';
// Sync channel member
static readonly SYNC_CHANNEL_MEMBER = 'syncChannelMember';
// Sync message extra
static readonly SYNC_MESSAGE_EXTRA = 'syncMessageExtra';
// Sync message reaction
static readonly SYNC_MESSAGE_REACTION = 'syncMessageReaction';
// Handle system sync commands
static handleSyncCommand(cmd: WKCMD): void {
switch (cmd.cmd) {
case this.SYNC_CONVERSATION:
this.syncConversations(cmd.paramJsonObject);
break;
case this.SYNC_CHANNEL_INFO:
this.syncChannelInfo(cmd.paramJsonObject);
break;
case this.SYNC_CHANNEL_MEMBER:
this.syncChannelMember(cmd.paramJsonObject);
break;
case this.SYNC_MESSAGE_EXTRA:
this.syncMessageExtra(cmd.paramJsonObject);
break;
case this.SYNC_MESSAGE_REACTION:
this.syncMessageReaction(cmd.paramJsonObject);
break;
}
}
private static syncConversations(param?: Record<string, Object>): void {
// Implement conversation sync logic
console.log('Sync conversation data');
}
private static syncChannelInfo(param?: Record<string, Object>): void {
// Implement channel info sync logic
console.log('Sync channel info');
}
private static syncChannelMember(param?: Record<string, Object>): void {
// Implement channel member sync logic
console.log('Sync channel member');
}
private static syncMessageExtra(param?: Record<string, Object>): void {
// Implement message extra sync logic
console.log('Sync message extra');
}
private static syncMessageReaction(param?: Record<string, Object>): void {
// Implement message reaction sync logic
console.log('Sync message reaction');
}
}
Status Update Commands
These commands are used for real-time status updates:Copy
class StatusUpdateCommands {
// User online status update
static readonly USER_STATUS_UPDATE = 'userStatusUpdate';
// Channel status update
static readonly CHANNEL_UPDATE = 'channelUpdate';
// Member status update
static readonly MEMBER_UPDATE = 'memberUpdate';
// Message status update
static readonly MESSAGE_UPDATE = 'messageUpdate';
// Handle status update commands
static handleStatusCommand(cmd: WKCMD): void {
switch (cmd.cmd) {
case this.USER_STATUS_UPDATE:
this.handleUserStatusUpdate(cmd.paramJsonObject);
break;
case this.CHANNEL_UPDATE:
this.handleChannelUpdate(cmd.paramJsonObject);
break;
case this.MEMBER_UPDATE:
this.handleMemberUpdate(cmd.paramJsonObject);
break;
case this.MESSAGE_UPDATE:
this.handleMessageUpdate(cmd.paramJsonObject);
break;
}
}
private static handleUserStatusUpdate(param?: Record<string, Object>): void {
if (param) {
const uid = param['uid'] as string;
const online = param['online'] as number;
const lastSeen = param['last_seen'] as number;
console.log('User status update:', uid, 'online:', online, 'last seen:', lastSeen);
// Update local user status
// Can notify UI update through events
}
}
private static handleChannelUpdate(param?: Record<string, Object>): void {
if (param) {
const channelId = param['channel_id'] as string;
const channelType = param['channel_type'] as number;
console.log('Channel update:', channelId, 'type:', channelType);
// Refresh channel info
if (channelId && channelType !== undefined) {
WKIM.shared.channelManager().fetchChannelInfo(channelId, channelType);
}
}
}
private static handleMemberUpdate(param?: Record<string, Object>): void {
if (param) {
const channelId = param['channel_id'] as string;
const memberUid = param['member_uid'] as string;
console.log('Member update: channel', channelId, 'member', memberUid);
// Refresh member info
// Trigger member list update
}
}
private static handleMessageUpdate(param?: Record<string, Object>): void {
if (param) {
const messageId = param['message_id'] as string;
const action = param['action'] as string;
console.log('Message update:', messageId, 'action:', action);
// Handle message updates (like recall, edit, etc.)
}
}
}
Data Structure Description
WKCMD Command Object
Copy
export class WKCMD {
cmd: string = ''; // Command ID
paramJsonObject?: Record<string, Object>; // Command parameters
}
Field Description
| Field | Type | Description |
|---|---|---|
cmd | string | Command identifier, used to distinguish different types of commands |
paramJsonObject | Record<string, Object> | Command parameters, can contain any type of data |
Common Command Parameter Formats
Sync Command Parameters
Copy
// Sync conversation command parameters
{
"version": 123456,
"last_msg_seqs": "1,2,3,4,5",
"msg_count": 20
}
// Sync channel info command parameters
{
"channel_id": "channel123",
"channel_type": 2,
"version": 123456
}
Status Update Command Parameters
Copy
// User status update parameters
{
"uid": "user123",
"online": 1,
"last_seen": 1640995200,
"device_flag": 1
}
// Channel update parameters
{
"channel_id": "channel123",
"channel_type": 2,
"action": "update",
"fields": ["name", "avatar"]
}

