UNPKG

react-chrome-redux

Version:

A set of utilities for building Redux applications in Google Chrome Extensions.

122 lines (108 loc) 5.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var noop = exports.noop = function noop(payload) { return payload; }; var transformPayload = function transformPayload(message) { var transformer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop; return _extends({}, message, message.payload ? { payload: transformer(message.payload) } : {}); }; var deserializeListener = function deserializeListener(listener) { var deserializer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop; var shouldDeserialize = arguments[2]; // If a shouldDeserialize function is passed, return a function that uses it // to check if any given message payload should be deserialized if (shouldDeserialize) { return function (message) { for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } if (shouldDeserialize.apply(undefined, [message].concat(args))) { return listener.apply(undefined, [transformPayload(message, deserializer)].concat(args)); } return listener.apply(undefined, [message].concat(args)); }; } // Otherwise, return a function that tries to deserialize on every message return function (message) { for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } return listener.apply(undefined, [transformPayload(message, deserializer)].concat(args)); }; }; /** * A function returned from withDeserializer that, when called, wraps addListenerFn with the * deserializer passed to withDeserializer. * @name AddListenerDeserializer * @function * @param {Function} addListenerFn The add listener function to wrap. * @returns {DeserializedAddListener} */ /** * A wrapped add listener function that registers the given listener. * @name DeserializedAddListener * @function * @param {Function} listener The listener function to register. It should expect the (optionally) * deserialized message as its first argument. * @param {Function} [shouldDeserialize] A function that takes the arguments passed to the listener * and returns whether the message payload should be deserialized. Not all messages (notably, messages * this listener doesn't care about) should be attempted to be deserialized. */ /** * Given a deserializer, returns an AddListenerDeserializer function that that takes an add listener * function and returns a DeserializedAddListener that automatically deserializes message payloads. * Each message listener is expected to take the message as its first argument. * @param {Function} deserializer A function that deserializes a message payload. * @returns {AddListenerDeserializer} * Example Usage: * const withJsonDeserializer = withDeserializer(payload => JSON.parse(payload)); * const deserializedChromeListener = withJsonDeserializer(chrome.runtime.onMessage.addListener); * const shouldDeserialize = (message) => message.type === 'DESERIALIZE_ME'; * deserializedChromeListener(message => console.log("Payload:", message.payload), shouldDeserialize); * chrome.runtime.sendMessage("{'type:'DESERIALIZE_ME','payload':{'prop':4}}"); * //Payload: { prop: 4 }; * chrome.runtime.sendMessage("{'payload':{'prop':4}}"); * //Payload: "{'prop':4}"; */ var withDeserializer = exports.withDeserializer = function withDeserializer() { var deserializer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : noop; return function (addListenerFn) { return function (listener, shouldDeserialize) { return addListenerFn(deserializeListener(listener, deserializer, shouldDeserialize)); }; }; }; /** * Given a serializer, returns a function that takes a message sending * function as its sole argument and returns a wrapped message sender that * automaticaly serializes message payloads. The message sender * is expected to take the message as its first argument, unless messageArgIndex * is nonzero, in which case it is expected in the position specified by messageArgIndex. * @param {Function} serializer A function that serializes a message payload * Example Usage: * const withJsonSerializer = withSerializer(payload => JSON.stringify(payload)) * const serializedChromeSender = withJsonSerializer(chrome.runtime.sendMessage) * chrome.runtime.addListener(message => console.log("Payload:", message.payload)) * serializedChromeSender({ payload: { prop: 4 }}) * //Payload: "{'prop':4}" */ var withSerializer = exports.withSerializer = function withSerializer() { var serializer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : noop; return function (sendMessageFn) { var messageArgIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return function () { for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } if (args.length <= messageArgIndex) { throw new Error("Message in request could not be serialized. " + ("Expected message in position " + messageArgIndex + " but only received " + args.length + " args.")); } args[messageArgIndex] = transformPayload(args[messageArgIndex], serializer); return sendMessageFn.apply(undefined, args); }; }; };