@tracking-exposed/data
Version:
A common data layer for tracking exposed.
101 lines (76 loc) • 2.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.fetchSet = exports.addToSet = exports.pollFromStream = exports.publishToStream = exports.client = exports.toEvent = exports.fromEvent = void 0;
var _ioredis = _interopRequireDefault(require("ioredis"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const fromEvent = event => event.reduce((acc, arg, i) => {
const chunk = Math.floor(i / 2);
const tuple = acc[chunk] || []; // eslint-disable-next-line no-param-reassign
acc[chunk] = tuple.concat(arg);
return acc;
}, []).reduce((acc, [key, value]) => Object.assign(acc, {
[key]: value
}), {});
exports.fromEvent = fromEvent;
const toEvent = obj => Object.keys(obj).reduce((memo, key) => memo.concat([key, obj[key]]), []);
exports.toEvent = toEvent;
const client = (() => {
let cache;
return (host, port) => {
if (cache != null) return cache; // $FlowFixMe
const {
string: xadd
} = _ioredis.default.prototype.createBuiltinCommand("xadd"); // $FlowFixMe
const {
string: xread
} = _ioredis.default.prototype.createBuiltinCommand("xread"); // $FlowFixMe
_ioredis.default.prototype.xadd = xadd; // $FlowFixMe
_ioredis.default.prototype.xread = xread;
cache = new _ioredis.default({
host,
port,
lazyConnect: true
});
return cache;
};
})();
exports.client = client;
const publishToStream = (redisClient, stream, data) => {
const args = toEvent(data); // $FlowFixMe
return redisClient.xadd(stream, "*", ...args);
};
exports.publishToStream = publishToStream;
const pollFromStream = async (redisClient, stream, lastId) => {
// $FlowFixMe
const data = await redisClient.xread("BLOCK", "0", "STREAMS", stream, lastId);
return data.reduce((memo, [, events]) => memo.concat(events.map(([id, eventData]) => {
const eventObj = fromEvent(eventData);
return {
stream,
id,
data: eventObj
};
})), []);
};
exports.pollFromStream = pollFromStream;
const addToSet = async (redisClient, key, members) => {
const data = await redisClient.sadd(key, ...(Array.isArray(members) ? members : [members]));
return data;
};
exports.addToSet = addToSet;
const fetchSet = async (redisClient, key) => {
const data = await redisClient.smembers(key);
return data;
};
exports.fetchSet = fetchSet;
var _default = {
client,
publishToStream,
pollFromStream,
addToSet,
fetchSet
};
exports.default = _default;
//# sourceMappingURL=redis.js.map