UNPKG

@tracking-exposed/data

Version:
101 lines (76 loc) 2.58 kB
"use strict"; 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