fix(ws): 发送 WebSocket 协议级 Ping 控制帧防止 60s 后连接断开
writePump 只发 ActionCable 文本 JSON ping,从不发 websocket.PingMessage, 导致 readPump 的 PongHandler 永远不触发,ReadDeadline(60s) 到期后连接 被强制关闭。前端每 60 秒弹出"离线""重连"通知。 修复:在 ticker 中先发 PingMessage 控制帧(浏览器自动回 Pong 重置 ReadDeadline),再发 ActionCable 文本 ping(保活 ConnectionMonitor)。 同时包含此前会话中的其他变更: - 移除安全设置(SAML)页面及路由 - 新增超级管理员控制台前端页面 - platform agent_bots 路由使用 Platform* handler - 超级管理员入口改为 SPA 内路由跳转
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
/* global axios */
|
||||
|
||||
/**
|
||||
* Platform API client for Super Admin endpoints.
|
||||
* All endpoints are under /platform/api/v1/ and require super_admin auth.
|
||||
*/
|
||||
class PlatformAPI {
|
||||
constructor() {
|
||||
this.baseURL = '/platform/api/v1';
|
||||
}
|
||||
|
||||
// ── Accounts ──────────────────────────────────────────
|
||||
getAccounts(params = {}) {
|
||||
return axios.get(`${this.baseURL}/accounts`, { params });
|
||||
}
|
||||
|
||||
getAccount(id) {
|
||||
return axios.get(`${this.baseURL}/accounts/${id}`);
|
||||
}
|
||||
|
||||
createAccount(data) {
|
||||
return axios.post(`${this.baseURL}/accounts`, data);
|
||||
}
|
||||
|
||||
updateAccount(id, data) {
|
||||
return axios.patch(`${this.baseURL}/accounts/${id}`, data);
|
||||
}
|
||||
|
||||
deleteAccount(id) {
|
||||
return axios.delete(`${this.baseURL}/accounts/${id}`);
|
||||
}
|
||||
|
||||
// ── Users ─────────────────────────────────────────────
|
||||
getUsers(params = {}) {
|
||||
return axios.get(`${this.baseURL}/users`, { params });
|
||||
}
|
||||
|
||||
getUser(id) {
|
||||
return axios.get(`${this.baseURL}/users/${id}`);
|
||||
}
|
||||
|
||||
createUser(data) {
|
||||
return axios.post(`${this.baseURL}/users`, data);
|
||||
}
|
||||
|
||||
updateUser(id, data) {
|
||||
return axios.patch(`${this.baseURL}/users/${id}`, data);
|
||||
}
|
||||
|
||||
deleteUser(id) {
|
||||
return axios.delete(`${this.baseURL}/users/${id}`);
|
||||
}
|
||||
|
||||
// ── Account Users ─────────────────────────────────────
|
||||
getAccountUsers(accountId) {
|
||||
return axios.get(
|
||||
`${this.baseURL}/accounts/${accountId}/account_users`
|
||||
);
|
||||
}
|
||||
|
||||
createAccountUser(accountId, data) {
|
||||
return axios.post(
|
||||
`${this.baseURL}/accounts/${accountId}/account_users`,
|
||||
data
|
||||
);
|
||||
}
|
||||
|
||||
deleteAccountUser(accountId, userId) {
|
||||
return axios.delete(
|
||||
`${this.baseURL}/accounts/${userId}/account_users`,
|
||||
{ data: { user_id: userId } }
|
||||
);
|
||||
}
|
||||
|
||||
// ── Agent Bots (platform-level) ───────────────────────
|
||||
getAgentBots() {
|
||||
return axios.get(`${this.baseURL}/agent_bots`);
|
||||
}
|
||||
|
||||
createAgentBot(data) {
|
||||
return axios.post(`${this.baseURL}/agent_bots`, data);
|
||||
}
|
||||
|
||||
updateAgentBot(id, data) {
|
||||
return axios.put(`${this.baseURL}/agent_bots/${id}`, data);
|
||||
}
|
||||
|
||||
deleteAgentBot(id) {
|
||||
return axios.delete(`${this.baseURL}/agent_bots/${id}`);
|
||||
}
|
||||
|
||||
// ── Installation Config ───────────────────────────────
|
||||
getInstallationConfigs(params = {}) {
|
||||
return axios.get(`${this.baseURL}/installation_configs`, { params });
|
||||
}
|
||||
|
||||
createInstallationConfig(data) {
|
||||
return axios.post(`${this.baseURL}/installation_configs`, data);
|
||||
}
|
||||
|
||||
updateInstallationConfig(id, data) {
|
||||
return axios.put(`${this.baseURL}/installation_configs/${id}`, data);
|
||||
}
|
||||
|
||||
deleteInstallationConfig(id) {
|
||||
return axios.delete(`${this.baseURL}/installation_configs/${id}`);
|
||||
}
|
||||
}
|
||||
|
||||
export default new PlatformAPI();
|
||||
Reference in New Issue
Block a user