react-chrome-redux
Version:
A set of utilities for building Redux applications in Google Chrome Extensions.
122 lines (108 loc) • 5.75 kB
JavaScript
;
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);
};
};
};