| /** |
| * WebSocketPlugin will allow us to get new data from the server |
| * without having to poll for changes on the frontend. |
| * |
| * This plugin is subscribed to host state property and logging |
| * changes, indicated in the app header Health and Power status. |
| * |
| * https://github.com/openbmc/docs/blob/b41aff0fabe137cdb0cfff584b5fe4a41c0c8e77/rest-api.md#event-subscription-protocol |
| */ |
| const WebSocketPlugin = (store) => { |
| let ws; |
| const data = { |
| paths: ['/xyz/openbmc_project/state/host0', '/xyz/openbmc_project/logging'], |
| interfaces: [ |
| 'xyz.openbmc_project.State.Host', |
| 'xyz.openbmc_project.Logging.Entry', |
| ], |
| }; |
| |
| const initWebSocket = () => { |
| const socketDisabled = |
| process.env.VUE_APP_SUBSCRIBE_SOCKET_DISABLED === 'true' ? true : false; |
| if (socketDisabled) return; |
| const token = store.getters['authentication/token']; |
| ws = new WebSocket(`wss://${window.location.host}/subscribe`, [token]); |
| ws.onopen = () => { |
| ws.send(JSON.stringify(data)); |
| }; |
| ws.onerror = (event) => { |
| console.error(event); |
| }; |
| ws.onmessage = (event) => { |
| const data = JSON.parse(event.data); |
| const eventInterface = data.interface; |
| const path = data.path; |
| |
| if (eventInterface === 'xyz.openbmc_project.State.Host') { |
| const { properties: { CurrentHostState } = {} } = data; |
| if (CurrentHostState) { |
| store.commit('global/setServerStatus', CurrentHostState); |
| } |
| } else if (path === '/xyz/openbmc_project/logging') { |
| store.dispatch('eventLog/getEventLogData'); |
| } |
| }; |
| }; |
| |
| store.subscribe(({ type }) => { |
| if (type === 'authentication/authSuccess') { |
| initWebSocket(); |
| } |
| if (type === 'authentication/logout') { |
| if (ws) ws.close(); |
| } |
| }); |
| |
| if (store.getters['authentication/isLoggedIn']) initWebSocket(); |
| }; |
| |
| export default WebSocketPlugin; |