UNPKG

axe-core

Version:

Accessibility engine for automated Web UI testing

110 lines (99 loc) 2.59 kB
const errorTypes = Object.freeze([ 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError' ]); export function stringifyMessage({ topic, channelId, message, messageId, keepalive }) { const data = { channelId, topic, messageId, keepalive: !!keepalive, source: getSource() }; if (message instanceof Error) { data.error = { name: message.name, message: message.message, stack: message.stack }; } else { data.payload = message; } return JSON.stringify(data); } /** * Parse the received message for processing * @param {string} dataString Message received * @return {object} Object to be used for pub/sub */ export function parseMessage(dataString) { let data; try { data = JSON.parse(dataString); } catch (e) { return; // Wasn't meant for us. } if (!isRespondableMessage(data)) { return; } const { topic, channelId, messageId, keepalive } = data; const message = typeof data.error === 'object' ? buildErrorObject(data.error) : data.payload; return { topic, message, messageId, channelId, keepalive: !!keepalive }; } /** * Verify the received message is from the "respondable" module * @private * @param {Object} postedMessage The message received via postMessage * @return {Boolean} `true` if the message is verified from respondable */ function isRespondableMessage(postedMessage) { return ( typeof postedMessage === 'object' && typeof postedMessage.channelId === 'string' && postedMessage.source === getSource() ); } /** * Convert a javascript Error into something that can be stringified * @param {Error} error Any type of error * @return {Object} Processable object */ function buildErrorObject(error) { let msg = error.message || 'Unknown error occurred'; const errorName = errorTypes.includes(error.name) ? error.name : 'Error'; const ErrConstructor = window[errorName] || Error; if (error.stack) { msg += '\n' + error.stack.replace(error.message, ''); } return new ErrConstructor(msg); } /** * get the unique string to be used to identify our instance of axe * @private */ function getSource() { let application = 'axeAPI'; let version = ''; // TODO: es-modules_audit if (typeof axe !== 'undefined' && axe._audit && axe._audit.application) { application = axe._audit.application; } if (typeof axe !== 'undefined') { // TODO: es-modules-version version = axe.version; } return application + '.' + version; }