cl-react-graph
Version:
113 lines (91 loc) • 3.45 kB
JavaScript
;
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);
}