gaoluyang
2026-06-29 27cd042df9aca0383a49f3514bc21958dd890912
src/views/im/utils/config.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
/**
 * IM å‰ç«¯è¿è¡Œå‚æ•° / UI é˜ˆå€¼
 *
 * ä¸Ž constants.ts çš„分工:
 * - constants.ts:协议枚举(与后端 enum ä¸€ä¸€å¯¹åº”)+ åè®®å¥‘约值(如 IM_AT_ALL_USER_ID)
 * - config.ts:可调节的策略数值,包括镜像后端 ImProperties çš„默认值与纯前端 UI é˜ˆå€¼
 *
 * æ ‡æ³¨ã€ŒåŽç«¯é•œåƒã€çš„常量与 yudao.im.* é…ç½®é»˜è®¤å€¼ä¸€è‡´ï¼›è°ƒæ•´åŽç«¯é…ç½®æ—¶éœ€åŒæ­¥ä¿®æ”¹è¿™é‡Œ
 */
// ==================== åŽç«¯é•œåƒï¼ˆä¸Ž ImProperties é»˜è®¤å€¼å¯¹é½ï¼‰ ====================
/** ç¾¤æœ€å¤§æˆå‘˜äººæ•°ï¼ˆå¯¹é½ yudao.im.group.max-member) */
export const GROUP_MAX_MEMBER = 500
/** å•群管理员人数上限(对齐 yudao.im.group.admin-max-count) */
export const GROUP_ADMIN_MAX_COUNT = 3
/** å•群置顶消息条数上限(对齐 yudao.im.group.pin-max-count) */
export const GROUP_PIN_MAX_COUNT = 5
/**
 * æ˜¯å¦å¯ç”¨ç§èŠå·²è¯»åŠŸèƒ½ï¼ˆå¯¹é½ yudao.im.message.private-read-enabled)
 *
 * å…³é—­åŽï¼šè¿›å…¥ç§èŠä¼šè¯ä¸å†ä¸ŠæŠ¥å·²è¯»ä½ç½®ï¼›æ°”泡的「已读 / æœªè¯»ã€æ ‡ç­¾éšè—ï¼›
 * ç®¡ç†åŽå°ç§èŠæ¶ˆæ¯åˆ—表的「状态」列与详情中的状态字段隐藏
 */
export const MESSAGE_PRIVATE_READ_ENABLED = true
/**
 * æ˜¯å¦å¯ç”¨ç¾¤èŠå·²è¯»åŠŸèƒ½ï¼ˆå«ç¾¤æ¶ˆæ¯å›žæ‰§ï¼Œå¯¹é½ yudao.im.message.group-read-enabled)
 *
 * å…³é—­åŽï¼šè¿›å…¥ç¾¤ä¼šè¯ä¸å†ä¸ŠæŠ¥å·²è¯»ä½ç½®ï¼›è¾“入框的「发送回执消息」入口隐藏;
 * ç¾¤æ¶ˆæ¯æ°”泡上的「N äººå·²è¯»ã€popover éšè—ï¼›ç®¡ç†åŽå°ç¾¤æ¶ˆæ¯åˆ—表的「状态」「回执」列与详情中对应字段隐藏
 */
export const MESSAGE_GROUP_READ_ENABLED = true
/** æ¶ˆæ¯æ’¤å›žæ—¶é—´é™åˆ¶ï¼ˆåˆ†é’Ÿï¼Œå¯¹é½ yudao.im.message.recall-timeout-minutes) */
export const MESSAGE_RECALL_TIMEOUT_MINUTES = 5
/** ç§èŠç¦»çº¿æ¶ˆæ¯æœ€å¤§æ‹‰å–天数(对齐 yudao.im.message.private-pull-max-days) */
export const MESSAGE_PRIVATE_PULL_MAX_DAYS = 30
/** ç¾¤èŠç¦»çº¿æ¶ˆæ¯æœ€å¤§æ‹‰å–天数(对齐 yudao.im.message.group-pull-max-days) */
export const MESSAGE_GROUP_PULL_MAX_DAYS = 30
// ==================== å‰ç«¯ç‹¬æœ‰ï¼šæ‹‰å– / åˆ†é¡µ ====================
/** æ¯æ¬¡æ‹‰å–私聊消息的最大条数(后端上限 1000,前端取保守值 100) */
export const MESSAGE_PRIVATE_PULL_SIZE = 100
/** æ¯æ¬¡æ‹‰å–群聊消息的最大条数(后端上限 1000,前端取保守值 100) */
export const MESSAGE_GROUP_PULL_SIZE = 100
/** ã€Œæˆ‘相关」好友申请列表的单次拉取条数(游标分页 page size) */
export const FRIEND_REQUEST_PAGE_SIZE = 100
/** ã€Œæˆ‘相关」加群申请列表的单次拉取条数 */
export const GROUP_REQUEST_PAGE_SIZE = 100
// ==================== ä¸Šä¼ å®‰å…¨ç­–ç•¥ ====================
// æ•°å€¼ä¸ŽåŽç«¯ Spring multipart é…ç½®å¯¹é½ï¼ˆ`spring.servlet.multipart.max-file-size = 16MB`)
// åŽç«¯è°ƒå¤§åŽè¿™é‡ŒåŒæ­¥è°ƒï¼›ä¸è¦å•边放宽,否则用户上传完到后端 413
/** å›¾ç‰‡ / è§†é¢‘ / æ™®é€šæ–‡ä»¶å•文件上限(MB),对齐后端 max-file-size */
export const MESSAGE_IMAGE_MAX_MB = 16
export const MESSAGE_VIDEO_MAX_MB = 16
export const MESSAGE_FILE_MAX_MB = 16
/** è¯­éŸ³å•文件上限(MB):60s @ 64kbps çº¦ 0.5MB,5MB å·²è¿œè¶…录制可能产出的大小 */
export const MESSAGE_VOICE_MAX_MB = 5
/** å¯æ‰§è¡Œ / è„šæœ¬ç±»æ‰©å±•åé»‘åå•ï¼›æŽ¥æ”¶ç«¯ç‚¹å‡»ä¸‹è½½åŽæœ¬åœ°åŒå‡»å°±è·‘ï¼Œhtml æœ¬åœ°æ‰“开还能执行脚本 */
export const DANGEROUS_FILE_EXTENSIONS = [
  'exe',
  'bat',
  'cmd',
  'com',
  'msi',
  'scr',
  'pif',
  'vbs',
  'vbe',
  'wsf',
  'ws',
  'js',
  'jse',
  'jar',
  'sh',
  'app',
  'ps1',
  'reg',
  'html',
  'htm'
]
// ==================== å‰ç«¯ç‹¬æœ‰ï¼šUI é˜ˆå€¼ ====================
/** æ¶ˆæ¯ä¹‹é—´æ¸²æŸ“「时间分隔条」的阈值:10 åˆ†é’Ÿ */
export const MESSAGE_TIME_TIP_GAP_MS = 10 * 60 * 1000
/**
 * æ’¤å›žèœå•可见的时间窗:自己发送的消息超过这个时长就不能再撤回,菜单回退为「删除」
 *
 * æ¯”后端 MESSAGE_RECALL_TIMEOUT_MINUTES(5 åˆ†é’Ÿï¼‰ä¸¥æ ¼ï¼Œå¯¹é½å¾®ä¿¡ PC çš„ 2 åˆ†é’Ÿ
 */
export const MESSAGE_RECALL_WINDOW_MS = 2 * 60 * 1000
/** åˆå¹¶è½¬å‘消息(MERGE ç±»åž‹ï¼‰æ°”泡内预览的最大行数(对齐微信「聊天记录」气泡) */
export const MESSAGE_MERGE_PREVIEW_LINES = 3
/** æœ€è¿‘转发会话 key åˆ—表的最大保留数量(对齐微信 PC æ¨ªå‘头像区可见容量) */
export const CONVERSATION_RECENT_FORWARD_MAX = 12
// ==================== å‰ç«¯ç‹¬æœ‰ï¼šRTC é€šè¯å…œåº• ====================
/**
 * æŒ¯é“ƒè¶…时兜底;通话存活期间 timer è°ƒç”¨ noAnswerCallCheck æŽ¥å£çš„间隔;
 * å®žé™…超时阈值由后端 yudao.im.rtc.invite-timeout-minutes å†³å®šï¼Œå‰ç«¯ä»…决定触发频率
 */
export const RTC_NO_ANSWER_CALL_CHECK_INTERVAL_MS = 60 * 1000
// ==================== å‰ç«¯ç‹¬æœ‰ï¼šWebSocket è‡ªåŠ¨é‡è¿ž ====================
// æŒ‡æ•°é€€é¿ï¼šbase * 2^attempt,上限封顶;每次再叠加 0~jitter ms éšæœºåç§»
// é¿å…æœåŠ¡ç«¯é‡å¯æ—¶å…¨é‡å®¢æˆ·ç«¯åœ¨åŒä¸€ç§’æ‰“è¿‡æ¥å½¢æˆã€ŒæƒŠç¾¤ã€ï¼›ä¸è®¾æ¬¡æ•°ä¸Šé™ï¼ŒæŒç»­é‡è¿žç›´åˆ°é“¾è·¯æ¢å¤
/** é¦–次重连等待,单位 ms */
export const WS_RECONNECT_BASE_MS = 1000
/** é€€é¿ä¸Šé™ï¼Œå•位 ms;连续失败 5 æ¬¡åŽç¨³å®šåœ¨ 30s ä¸å†å¢žé•¿ */
export const WS_RECONNECT_MAX_MS = 30 * 1000
/** é€€é¿å åŠ çš„éšæœºæŠ–åŠ¨ä¸Šé™ï¼Œå•ä½ ms */
export const WS_RECONNECT_JITTER_MS = 1000