UNPKG

cl-react-graph

Version:
113 lines (91 loc) 3.45 kB
"use strict"; exports.__esModule = true; exports.default = socketIo; exports.getPageData = getPageData; exports.registerPath = registerPath; exports.unregisterPath = unregisterPath; exports.getIsInitialized = exports.getPageQueryData = exports.getStaticQueryData = void 0; var _errorOverlayHandler = require("./error-overlay-handler"); let socket = null; let staticQueryData = {}; let pageQueryData = {}; let isInitialized = false; const getStaticQueryData = () => staticQueryData; exports.getStaticQueryData = getStaticQueryData; const getPageQueryData = () => pageQueryData; exports.getPageQueryData = getPageQueryData; const getIsInitialized = () => isInitialized; exports.getIsInitialized = getIsInitialized; function socketIo() { if (process.env.NODE_ENV !== `production`) { if (!socket) { // Try to initialize web socket if we didn't do it already try { // eslint-disable-next-line no-undef socket = io(); const didDataChange = (msg, queryData) => !(msg.payload.id in queryData) || JSON.stringify(msg.payload.result) !== JSON.stringify(queryData[msg.payload.id]); socket.on(`message`, msg => { if (msg.type === `staticQueryResult`) { if (didDataChange(msg, staticQueryData)) { staticQueryData = Object.assign({}, staticQueryData, { [msg.payload.id]: msg.payload.result }); } } else if (msg.type === `pageQueryResult`) { if (didDataChange(msg, pageQueryData)) { pageQueryData = Object.assign({}, pageQueryData, { [msg.payload.id]: msg.payload.result }); } } else if (msg.type === `overlayError`) { if (msg.payload.message) { (0, _errorOverlayHandler.reportError)(msg.payload.id, msg.payload.message); } else { (0, _errorOverlayHandler.clearError)(msg.payload.id); } } if (msg.type && msg.payload) { ___emitter.emit(msg.type, msg.payload); } }); } catch (err) { console.error(`Could not connect to socket.io on dev server.`); } } return socket; } else { return null; } } const inFlightGetPageDataPromiseCache = {}; function getPageData(pathname) { if (inFlightGetPageDataPromiseCache[pathname]) { return inFlightGetPageDataPromiseCache[pathname]; } else { inFlightGetPageDataPromiseCache[pathname] = new Promise(resolve => { if (pageQueryData[pathname]) { delete inFlightGetPageDataPromiseCache[pathname]; resolve(pageQueryData[pathname]); } else { const onPageDataCallback = msg => { if (msg.type === `pageQueryResult` && msg.payload.id === pathname) { socket.off(`message`, onPageDataCallback); delete inFlightGetPageDataPromiseCache[pathname]; resolve(pageQueryData[pathname]); } }; socket.on(`message`, onPageDataCallback); socket.emit(`getDataForPath`, pathname); } }); } return inFlightGetPageDataPromiseCache[pathname]; } // Tell websocket-manager.js the new path we're on. // This will help the backend prioritize queries for this // path. function registerPath(path) { socket.emit(`registerPath`, path); } // Unregister the former path function unregisterPath(path) { socket.emit(`unregisterPath`, path); }