broadcast-channel
Advanced tools
Comparing version 1.2.4 to 1.2.5
@@ -61,3 +61,3 @@ import { isPromise } from './util.js'; | ||
set onmessage(fn) { | ||
var time = new Date().getTime() - 5; | ||
var time = new Date().getTime(); | ||
var listenObj = { | ||
@@ -77,3 +77,3 @@ time: time, | ||
addEventListener: function addEventListener(type, fn) { | ||
var time = new Date().getTime() - 5; | ||
var time = new Date().getTime(); | ||
var listenObj = { | ||
@@ -80,0 +80,0 @@ time: time, |
@@ -46,15 +46,21 @@ import _regeneratorRuntime from 'babel-runtime/regenerator'; | ||
var getPathsCache = new Map(); | ||
export function getPaths(channelName) { | ||
var folderPathBase = path.join(os.tmpdir(), TMP_FOLDER_NAME); | ||
var channelPathBase = path.join(os.tmpdir(), TMP_FOLDER_NAME, sha3_224(channelName) // use hash incase of strange characters | ||
); | ||
var folderPathReaders = path.join(channelPathBase, 'readers'); | ||
var folderPathMessages = path.join(channelPathBase, 'messages'); | ||
if (!getPathsCache.has(channelName)) { | ||
var folderPathBase = path.join(os.tmpdir(), TMP_FOLDER_NAME); | ||
var channelPathBase = path.join(os.tmpdir(), TMP_FOLDER_NAME, sha3_224(channelName) // use hash incase of strange characters | ||
); | ||
var folderPathReaders = path.join(channelPathBase, 'readers'); | ||
var folderPathMessages = path.join(channelPathBase, 'messages'); | ||
return { | ||
base: folderPathBase, | ||
channelBase: channelPathBase, | ||
readers: folderPathReaders, | ||
messages: folderPathMessages | ||
}; | ||
var ret = { | ||
base: folderPathBase, | ||
channelBase: channelPathBase, | ||
readers: folderPathReaders, | ||
messages: folderPathMessages | ||
}; | ||
getPathsCache.set(channelName, ret); | ||
return ret; | ||
} | ||
return getPathsCache.get(channelName); | ||
} | ||
@@ -132,35 +138,11 @@ | ||
*/ | ||
export var createSocketInfoFile = function () { | ||
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(channelName, readerUuid) { | ||
var pathToFile; | ||
return _regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_context2.next = 2; | ||
return ensureFoldersExist(channelName); | ||
export function createSocketInfoFile(channelName, readerUuid) { | ||
var pathToFile = socketInfoPath(channelName, readerUuid); | ||
return writeFile(pathToFile, JSON.stringify({ | ||
time: new Date().getTime() | ||
})).then(function () { | ||
return pathToFile; | ||
}); | ||
} | ||
case 2: | ||
pathToFile = socketInfoPath(channelName, readerUuid); | ||
_context2.next = 5; | ||
return writeFile(pathToFile, JSON.stringify({ | ||
time: new Date().getTime() | ||
})); | ||
case 5: | ||
return _context2.abrupt('return', pathToFile); | ||
case 6: | ||
case 'end': | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, this); | ||
})); | ||
return function createSocketInfoFile(_x2, _x3) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}(); | ||
/** | ||
@@ -171,7 +153,7 @@ * creates the socket-file and subscribes to it | ||
export var createSocketEventEmitter = function () { | ||
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(channelName, readerUuid) { | ||
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(channelName, readerUuid) { | ||
var pathToSocket, emitter, server; | ||
return _regeneratorRuntime.wrap(function _callee3$(_context3) { | ||
return _regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
@@ -191,3 +173,3 @@ pathToSocket = socketPath(channelName, readerUuid); | ||
}); | ||
_context3.next = 5; | ||
_context2.next = 5; | ||
return new Promise(function (res) { | ||
@@ -204,3 +186,3 @@ server.listen(pathToSocket, function () { | ||
return _context3.abrupt('return', { | ||
return _context2.abrupt('return', { | ||
path: pathToSocket, | ||
@@ -213,10 +195,10 @@ emitter: emitter, | ||
case 'end': | ||
return _context3.stop(); | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee3, this); | ||
}, _callee2, this); | ||
})); | ||
return function createSocketEventEmitter(_x4, _x5) { | ||
return _ref3.apply(this, arguments); | ||
return function createSocketEventEmitter(_x2, _x3) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
@@ -226,11 +208,11 @@ }(); | ||
export var openClientConnection = function () { | ||
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(channelName, readerUuid) { | ||
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(channelName, readerUuid) { | ||
var pathToSocket, client; | ||
return _regeneratorRuntime.wrap(function _callee4$(_context4) { | ||
return _regeneratorRuntime.wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
pathToSocket = socketPath(channelName, readerUuid); | ||
client = new net.Socket(); | ||
_context4.next = 4; | ||
_context3.next = 4; | ||
return new Promise(function (res) { | ||
@@ -241,14 +223,14 @@ client.connect(pathToSocket, res); | ||
case 4: | ||
return _context4.abrupt('return', client); | ||
return _context3.abrupt('return', client); | ||
case 5: | ||
case 'end': | ||
return _context4.stop(); | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee4, this); | ||
}, _callee3, this); | ||
})); | ||
return function openClientConnection(_x6, _x7) { | ||
return _ref4.apply(this, arguments); | ||
return function openClientConnection(_x4, _x5) { | ||
return _ref3.apply(this, arguments); | ||
}; | ||
@@ -262,7 +244,7 @@ }(); | ||
export var writeMessage = function () { | ||
var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(channelName, readerUuid, messageJson) { | ||
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(channelName, readerUuid, messageJson) { | ||
var time, writeObject, token, fileName, msgPath; | ||
return _regeneratorRuntime.wrap(function _callee5$(_context5) { | ||
return _regeneratorRuntime.wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
@@ -278,7 +260,7 @@ time = new Date().getTime(); | ||
msgPath = path.join(getPaths(channelName).messages, fileName); | ||
_context5.next = 7; | ||
_context4.next = 7; | ||
return writeFile(msgPath, JSON.stringify(writeObject)); | ||
case 7: | ||
return _context5.abrupt('return', { | ||
return _context4.abrupt('return', { | ||
time: time, | ||
@@ -292,10 +274,10 @@ uuid: readerUuid, | ||
case 'end': | ||
return _context5.stop(); | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee5, this); | ||
}, _callee4, this); | ||
})); | ||
return function writeMessage(_x8, _x9, _x10) { | ||
return _ref5.apply(this, arguments); | ||
return function writeMessage(_x6, _x7, _x8) { | ||
return _ref4.apply(this, arguments); | ||
}; | ||
@@ -309,15 +291,15 @@ }(); | ||
export var getReadersUuids = function () { | ||
var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(channelName) { | ||
var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(channelName) { | ||
var readersPath, files; | ||
return _regeneratorRuntime.wrap(function _callee6$(_context6) { | ||
return _regeneratorRuntime.wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context6.prev = _context6.next) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
readersPath = getPaths(channelName).readers; | ||
_context6.next = 3; | ||
_context5.next = 3; | ||
return readdir(readersPath); | ||
case 3: | ||
files = _context6.sent; | ||
return _context6.abrupt('return', files.map(function (file) { | ||
files = _context5.sent; | ||
return _context5.abrupt('return', files.map(function (file) { | ||
return file.split('.'); | ||
@@ -333,10 +315,10 @@ }).filter(function (split) { | ||
case 'end': | ||
return _context6.stop(); | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee6, this); | ||
}, _callee5, this); | ||
})); | ||
return function getReadersUuids(_x11) { | ||
return _ref6.apply(this, arguments); | ||
return function getReadersUuids(_x9) { | ||
return _ref5.apply(this, arguments); | ||
}; | ||
@@ -346,22 +328,22 @@ }(); | ||
export var messagePath = function () { | ||
var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(channelName, time, token, writerUuid) { | ||
var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(channelName, time, token, writerUuid) { | ||
var fileName, msgPath; | ||
return _regeneratorRuntime.wrap(function _callee7$(_context7) { | ||
return _regeneratorRuntime.wrap(function _callee6$(_context6) { | ||
while (1) { | ||
switch (_context7.prev = _context7.next) { | ||
switch (_context6.prev = _context6.next) { | ||
case 0: | ||
fileName = time + '_' + writerUuid + '_' + token + '.json'; | ||
msgPath = path.join(getPaths(channelName).messages, fileName); | ||
return _context7.abrupt('return', msgPath); | ||
return _context6.abrupt('return', msgPath); | ||
case 3: | ||
case 'end': | ||
return _context7.stop(); | ||
return _context6.stop(); | ||
} | ||
} | ||
}, _callee7, this); | ||
}, _callee6, this); | ||
})); | ||
return function messagePath(_x12, _x13, _x14, _x15) { | ||
return _ref7.apply(this, arguments); | ||
return function messagePath(_x10, _x11, _x12, _x13) { | ||
return _ref6.apply(this, arguments); | ||
}; | ||
@@ -371,15 +353,15 @@ }(); | ||
export var getAllMessages = function () { | ||
var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8(channelName) { | ||
var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(channelName) { | ||
var messagesPath, files; | ||
return _regeneratorRuntime.wrap(function _callee8$(_context8) { | ||
return _regeneratorRuntime.wrap(function _callee7$(_context7) { | ||
while (1) { | ||
switch (_context8.prev = _context8.next) { | ||
switch (_context7.prev = _context7.next) { | ||
case 0: | ||
messagesPath = getPaths(channelName).messages; | ||
_context8.next = 3; | ||
_context7.next = 3; | ||
return readdir(messagesPath); | ||
case 3: | ||
files = _context8.sent; | ||
return _context8.abrupt('return', files.map(function (file) { | ||
files = _context7.sent; | ||
return _context7.abrupt('return', files.map(function (file) { | ||
var fileName = file.split('.')[0]; | ||
@@ -398,10 +380,10 @@ var split = fileName.split('_'); | ||
case 'end': | ||
return _context8.stop(); | ||
return _context7.stop(); | ||
} | ||
} | ||
}, _callee8, this); | ||
}, _callee7, this); | ||
})); | ||
return function getAllMessages(_x16) { | ||
return _ref8.apply(this, arguments); | ||
return function getAllMessages(_x14) { | ||
return _ref7.apply(this, arguments); | ||
}; | ||
@@ -421,38 +403,17 @@ }(); | ||
export var readMessage = function () { | ||
var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9(messageObj) { | ||
var content; | ||
return _regeneratorRuntime.wrap(function _callee9$(_context9) { | ||
while (1) { | ||
switch (_context9.prev = _context9.next) { | ||
case 0: | ||
_context9.next = 2; | ||
return readFile(messageObj.path, 'utf8'); | ||
export function readMessage(messageObj) { | ||
return readFile(messageObj.path, 'utf8').then(function (content) { | ||
return JSON.parse(content); | ||
}); | ||
} | ||
case 2: | ||
content = _context9.sent; | ||
return _context9.abrupt('return', JSON.parse(content)); | ||
case 4: | ||
case 'end': | ||
return _context9.stop(); | ||
} | ||
} | ||
}, _callee9, this); | ||
})); | ||
return function readMessage(_x17) { | ||
return _ref9.apply(this, arguments); | ||
}; | ||
}(); | ||
export var cleanOldMessages = function () { | ||
var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10(messageObjects, ttl) { | ||
var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8(messageObjects, ttl) { | ||
var olderThen; | ||
return _regeneratorRuntime.wrap(function _callee10$(_context10) { | ||
return _regeneratorRuntime.wrap(function _callee8$(_context8) { | ||
while (1) { | ||
switch (_context10.prev = _context10.next) { | ||
switch (_context8.prev = _context8.next) { | ||
case 0: | ||
olderThen = new Date().getTime() - ttl; | ||
_context10.next = 3; | ||
_context8.next = 3; | ||
return Promise.all(messageObjects.filter(function (obj) { | ||
@@ -468,10 +429,10 @@ return obj.time < olderThen; | ||
case 'end': | ||
return _context10.stop(); | ||
return _context8.stop(); | ||
} | ||
} | ||
}, _callee10, this); | ||
}, _callee8, this); | ||
})); | ||
return function cleanOldMessages(_x18, _x19) { | ||
return _ref10.apply(this, arguments); | ||
return function cleanOldMessages(_x15, _x16) { | ||
return _ref8.apply(this, arguments); | ||
}; | ||
@@ -483,14 +444,14 @@ }(); | ||
export var create = function () { | ||
var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee11(channelName) { | ||
var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9(channelName) { | ||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
var uuid, _ref12, otherReaderUuids, socketEE, infoFilePath, writeQueue, state; | ||
var uuid, writeQueue, state, _ref10, socketEE, infoFilePath; | ||
return _regeneratorRuntime.wrap(function _callee11$(_context11) { | ||
return _regeneratorRuntime.wrap(function _callee9$(_context9) { | ||
while (1) { | ||
switch (_context11.prev = _context11.next) { | ||
switch (_context9.prev = _context9.next) { | ||
case 0: | ||
options = fillOptionsWithDefaults(options); | ||
_context11.next = 3; | ||
_context9.next = 3; | ||
return ensureFoldersExist(channelName); | ||
@@ -500,13 +461,5 @@ | ||
uuid = randomToken(10); | ||
_context11.next = 6; | ||
return Promise.all([getReadersUuids(channelName), createSocketEventEmitter(channelName, uuid), createSocketInfoFile(channelName, uuid)]); | ||
case 6: | ||
_ref12 = _context11.sent; | ||
otherReaderUuids = _ref12[0]; | ||
socketEE = _ref12[1]; | ||
infoFilePath = _ref12[2]; | ||
// ensures we do not read messages in parrallel | ||
// ensures we do not read messages in parrallel | ||
writeQueue = new IdleQueue(1); | ||
@@ -517,4 +470,2 @@ state = { | ||
uuid: uuid, | ||
socketEE: socketEE, | ||
infoFilePath: infoFilePath, | ||
// contains all messages that have been emitted before | ||
@@ -525,3 +476,2 @@ emittedMessagesIds: new Set(), | ||
writeQueue: writeQueue, | ||
otherReaderUuids: otherReaderUuids, | ||
otherReaderClients: {}, | ||
@@ -534,7 +484,13 @@ // ensure if process crashes, everything is cleaned up | ||
}; | ||
_context11.next = 14; | ||
return refreshReaderClients(state); | ||
_context9.next = 8; | ||
return Promise.all([createSocketEventEmitter(channelName, uuid), createSocketInfoFile(channelName, uuid), refreshReaderClients(state)]); | ||
case 14: | ||
case 8: | ||
_ref10 = _context9.sent; | ||
socketEE = _ref10[0]; | ||
infoFilePath = _ref10[1]; | ||
state.socketEE = socketEE; | ||
state.infoFilePath = infoFilePath; | ||
// when new message comes in, we read it and emit it | ||
@@ -546,17 +502,24 @@ socketEE.emitter.on('data', function (data) { | ||
return _context11.abrupt('return', state); | ||
return _context9.abrupt('return', state); | ||
case 16: | ||
case 15: | ||
case 'end': | ||
return _context11.stop(); | ||
return _context9.stop(); | ||
} | ||
} | ||
}, _callee11, this); | ||
}, _callee9, this); | ||
})); | ||
return function create(_x20) { | ||
return _ref11.apply(this, arguments); | ||
return function create(_x17) { | ||
return _ref9.apply(this, arguments); | ||
}; | ||
}(); | ||
export function _filterMessage(msgObj, state) { | ||
if (msgObj.senderUuid === state.uuid) return false; // not send by own | ||
if (state.emittedMessagesIds.has(msgObj.token)) return false; // not already emitted | ||
if (msgObj.time < state.messagesCallbackTime) return false; // not older then onMessageCallback | ||
return true; | ||
} | ||
/** | ||
@@ -567,19 +530,14 @@ * when the socket pings, so that we now new messages came, | ||
export var handleMessagePing = function () { | ||
var _ref13 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee12(state) { | ||
var _this = this; | ||
var msgObj = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; | ||
var messages, useMessages, _loop, _iterator, _isArray, _i, _ref14, _ret; | ||
return _regeneratorRuntime.wrap(function _callee12$(_context13) { | ||
var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10(state, msgObj) { | ||
var messages, useMessages; | ||
return _regeneratorRuntime.wrap(function _callee10$(_context10) { | ||
while (1) { | ||
switch (_context13.prev = _context13.next) { | ||
switch (_context10.prev = _context10.next) { | ||
case 0: | ||
if (state.messagesCallback) { | ||
_context13.next = 2; | ||
_context10.next = 2; | ||
break; | ||
} | ||
return _context13.abrupt('return'); | ||
return _context10.abrupt('return'); | ||
@@ -590,12 +548,12 @@ case 2: | ||
if (msgObj) { | ||
_context13.next = 9; | ||
_context10.next = 9; | ||
break; | ||
} | ||
_context13.next = 6; | ||
_context10.next = 6; | ||
return getAllMessages(state.channelName); | ||
case 6: | ||
messages = _context13.sent; | ||
_context13.next = 10; | ||
messages = _context10.sent; | ||
_context10.next = 10; | ||
break; | ||
@@ -609,108 +567,48 @@ | ||
useMessages = messages.filter(function (msgObj) { | ||
return msgObj.senderUuid !== state.uuid; | ||
}) // not send by own | ||
.filter(function (msgObj) { | ||
return !state.emittedMessagesIds.has(msgObj.token); | ||
}) // not already emitted | ||
.filter(function (msgObj) { | ||
return msgObj.time >= state.messagesCallbackTime; | ||
}) // not older then onMessageCallback | ||
.sort(function (msgObjA, msgObjB) { | ||
return _filterMessage(msgObj, state); | ||
}).sort(function (msgObjA, msgObjB) { | ||
return msgObjA.time - msgObjB.time; | ||
}); // sort by time | ||
if (!state.messagesCallback) { | ||
_context13.next = 20; | ||
// if no listener or message, so not do anything | ||
if (!(!useMessages.length || !state.messagesCallback)) { | ||
_context10.next = 13; | ||
break; | ||
} | ||
_loop = /*#__PURE__*/_regeneratorRuntime.mark(function _loop() { | ||
var msgObj, content; | ||
return _regeneratorRuntime.wrap(function _loop$(_context12) { | ||
while (1) { | ||
switch (_context12.prev = _context12.next) { | ||
case 0: | ||
if (!_isArray) { | ||
_context12.next = 6; | ||
break; | ||
} | ||
return _context10.abrupt('return'); | ||
if (!(_i >= _iterator.length)) { | ||
_context12.next = 3; | ||
break; | ||
} | ||
case 13: | ||
_context10.next = 15; | ||
return Promise.all(useMessages.map(function (msgObj) { | ||
return readMessage(msgObj).then(function (content) { | ||
return msgObj.content = content; | ||
}); | ||
})); | ||
return _context12.abrupt('return', 'break'); | ||
case 15: | ||
case 3: | ||
_ref14 = _iterator[_i++]; | ||
_context12.next = 10; | ||
break; | ||
useMessages.forEach(function (msgObj) { | ||
state.emittedMessagesIds.add(msgObj.token); | ||
setTimeout(function () { | ||
return state.emittedMessagesIds['delete'](msgObj.token); | ||
}, state.options.node.ttl * 2); | ||
case 6: | ||
_i = _iterator.next(); | ||
if (!_i.done) { | ||
_context12.next = 9; | ||
break; | ||
} | ||
return _context12.abrupt('return', 'break'); | ||
case 9: | ||
_ref14 = _i.value; | ||
case 10: | ||
msgObj = _ref14; | ||
_context12.next = 13; | ||
return readMessage(msgObj); | ||
case 13: | ||
content = _context12.sent; | ||
state.emittedMessagesIds.add(msgObj.token); | ||
setTimeout(function () { | ||
return state.emittedMessagesIds['delete'](msgObj.token); | ||
}, state.options.node.ttl * 2); | ||
if (state.messagesCallback) { | ||
state.messagesCallback(content.data); | ||
} | ||
case 17: | ||
case 'end': | ||
return _context12.stop(); | ||
} | ||
} | ||
}, _loop, _this); | ||
if (state.messagesCallback) { | ||
state.messagesCallback(msgObj.content.data); | ||
} | ||
}); | ||
_iterator = useMessages, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); | ||
case 14: | ||
return _context13.delegateYield(_loop(), 't0', 15); | ||
case 15: | ||
_ret = _context13.t0; | ||
if (!(_ret === 'break')) { | ||
_context13.next = 18; | ||
break; | ||
} | ||
return _context13.abrupt('break', 20); | ||
case 18: | ||
_context13.next = 14; | ||
break; | ||
case 20: | ||
case 16: | ||
case 'end': | ||
return _context13.stop(); | ||
return _context10.stop(); | ||
} | ||
} | ||
}, _callee12, this); | ||
}, _callee10, this); | ||
})); | ||
return function handleMessagePing(_x22) { | ||
return _ref13.apply(this, arguments); | ||
return function handleMessagePing(_x19, _x20) { | ||
return _ref11.apply(this, arguments); | ||
}; | ||
@@ -720,15 +618,15 @@ }(); | ||
export var refreshReaderClients = function () { | ||
var _ref15 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee15(channelState) { | ||
var _this2 = this; | ||
var _ref12 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee13(channelState) { | ||
var _this = this; | ||
var otherReaders; | ||
return _regeneratorRuntime.wrap(function _callee15$(_context16) { | ||
return _regeneratorRuntime.wrap(function _callee13$(_context13) { | ||
while (1) { | ||
switch (_context16.prev = _context16.next) { | ||
switch (_context13.prev = _context13.next) { | ||
case 0: | ||
_context16.next = 2; | ||
_context13.next = 2; | ||
return getReadersUuids(channelState.channelName); | ||
case 2: | ||
otherReaders = _context16.sent; | ||
otherReaders = _context13.sent; | ||
@@ -740,18 +638,18 @@ | ||
}).forEach(function () { | ||
var _ref16 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee13(readerUuid) { | ||
return _regeneratorRuntime.wrap(function _callee13$(_context14) { | ||
var _ref13 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee11(readerUuid) { | ||
return _regeneratorRuntime.wrap(function _callee11$(_context11) { | ||
while (1) { | ||
switch (_context14.prev = _context14.next) { | ||
switch (_context11.prev = _context11.next) { | ||
case 0: | ||
_context14.prev = 0; | ||
_context14.next = 3; | ||
_context11.prev = 0; | ||
_context11.next = 3; | ||
return channelState.otherReaderClients[readerUuid].destroy(); | ||
case 3: | ||
_context14.next = 7; | ||
_context11.next = 7; | ||
break; | ||
case 5: | ||
_context14.prev = 5; | ||
_context14.t0 = _context14['catch'](0); | ||
_context11.prev = 5; | ||
_context11.t0 = _context11['catch'](0); | ||
@@ -763,14 +661,14 @@ case 7: | ||
case 'end': | ||
return _context14.stop(); | ||
return _context11.stop(); | ||
} | ||
} | ||
}, _callee13, _this2, [[0, 5]]); | ||
}, _callee11, _this, [[0, 5]]); | ||
})); | ||
return function (_x25) { | ||
return _ref16.apply(this, arguments); | ||
return function (_x22) { | ||
return _ref13.apply(this, arguments); | ||
}; | ||
}()); | ||
_context16.next = 6; | ||
_context13.next = 6; | ||
return Promise.all(otherReaders.filter(function (readerUuid) { | ||
@@ -783,42 +681,42 @@ return readerUuid !== channelState.uuid; | ||
.map(function () { | ||
var _ref17 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee14(readerUuid) { | ||
var _ref14 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee12(readerUuid) { | ||
var client; | ||
return _regeneratorRuntime.wrap(function _callee14$(_context15) { | ||
return _regeneratorRuntime.wrap(function _callee12$(_context12) { | ||
while (1) { | ||
switch (_context15.prev = _context15.next) { | ||
switch (_context12.prev = _context12.next) { | ||
case 0: | ||
_context15.prev = 0; | ||
_context12.prev = 0; | ||
if (!channelState.closed) { | ||
_context15.next = 3; | ||
_context12.next = 3; | ||
break; | ||
} | ||
return _context15.abrupt('return'); | ||
return _context12.abrupt('return'); | ||
case 3: | ||
_context15.next = 5; | ||
_context12.next = 5; | ||
return openClientConnection(channelState.channelName, readerUuid); | ||
case 5: | ||
client = _context15.sent; | ||
client = _context12.sent; | ||
channelState.otherReaderClients[readerUuid] = client; | ||
_context15.next = 11; | ||
_context12.next = 11; | ||
break; | ||
case 9: | ||
_context15.prev = 9; | ||
_context15.t0 = _context15['catch'](0); | ||
_context12.prev = 9; | ||
_context12.t0 = _context12['catch'](0); | ||
case 11: | ||
case 'end': | ||
return _context15.stop(); | ||
return _context12.stop(); | ||
} | ||
} | ||
}, _callee14, _this2, [[0, 9]]); | ||
}, _callee12, _this, [[0, 9]]); | ||
})); | ||
return function (_x26) { | ||
return _ref17.apply(this, arguments); | ||
return function (_x23) { | ||
return _ref14.apply(this, arguments); | ||
}; | ||
@@ -832,91 +730,68 @@ }() | ||
case 'end': | ||
return _context16.stop(); | ||
return _context13.stop(); | ||
} | ||
} | ||
}, _callee15, this); | ||
}, _callee13, this); | ||
})); | ||
return function refreshReaderClients(_x24) { | ||
return _ref15.apply(this, arguments); | ||
return function refreshReaderClients(_x21) { | ||
return _ref12.apply(this, arguments); | ||
}; | ||
}(); | ||
export var postMessage = function () { | ||
var _ref18 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee17(channelState, messageJson) { | ||
var _this3 = this; | ||
export function postMessage(channelState, messageJson) { | ||
var _this2 = this; | ||
return _regeneratorRuntime.wrap(function _callee17$(_context18) { | ||
while (1) { | ||
switch (_context18.prev = _context18.next) { | ||
case 0: | ||
_context18.next = 2; | ||
return channelState.writeQueue.requestIdlePromise(); | ||
// ensure we do this not in parallel | ||
return channelState.writeQueue.requestIdlePromise().then(function () { | ||
return channelState.writeQueue.wrapCall(_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee14() { | ||
var _ref16, msgObj, pingStr; | ||
case 2: | ||
_context18.next = 4; | ||
return channelState.writeQueue.wrapCall(_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee16() { | ||
var msgObj, pingStr, messages; | ||
return _regeneratorRuntime.wrap(function _callee16$(_context17) { | ||
while (1) { | ||
switch (_context17.prev = _context17.next) { | ||
case 0: | ||
_context17.next = 2; | ||
return refreshReaderClients(channelState); | ||
return _regeneratorRuntime.wrap(function _callee14$(_context14) { | ||
while (1) { | ||
switch (_context14.prev = _context14.next) { | ||
case 0: | ||
_context14.next = 2; | ||
return Promise.all([writeMessage(channelState.channelName, channelState.uuid, messageJson), refreshReaderClients(channelState)]); | ||
case 2: | ||
_context17.next = 4; | ||
return writeMessage(channelState.channelName, channelState.uuid, messageJson); | ||
case 2: | ||
_ref16 = _context14.sent; | ||
msgObj = _ref16[0]; | ||
pingStr = '{"t":' + msgObj.time + ',"u":"' + msgObj.uuid + '","to":"' + msgObj.token + '"}'; | ||
_context14.next = 7; | ||
return Promise.all(Object.values(channelState.otherReaderClients).filter(function (client) { | ||
return client.writable; | ||
}) // client might have closed in between | ||
.map(function (client) { | ||
return new Promise(function (res) { | ||
client.write(pingStr, res); | ||
}); | ||
})); | ||
case 4: | ||
msgObj = _context17.sent; | ||
pingStr = '{"t":' + msgObj.time + ',"u":"' + msgObj.uuid + '","to":"' + msgObj.token + '"}'; | ||
_context17.next = 8; | ||
return Promise.all(Object.values(channelState.otherReaderClients).filter(function (client) { | ||
return client.writable; | ||
}) // client might have closed in between | ||
.map(function (client) { | ||
return new Promise(function (res) { | ||
client.write(pingStr, res); | ||
}); | ||
})); | ||
case 7: | ||
case 8: | ||
if (!(randomInt(0, 50) === 0)) { | ||
_context17.next = 13; | ||
break; | ||
} | ||
/** | ||
* clean up old messages | ||
* to not waste resources on cleaning up, | ||
* only if random-int matches, we clean up old messages | ||
*/ | ||
if (randomInt(0, 50) === 0) { | ||
/* await */getAllMessages(channelState.channelName).then(function (allMessages) { | ||
return cleanOldMessages(allMessages, channelState.options.node.ttl); | ||
}); | ||
} | ||
_context17.next = 11; | ||
return getAllMessages(channelState.channelName); | ||
// emit to own eventEmitter | ||
// channelState.socketEE.emitter.emit('data', JSON.parse(JSON.stringify(messageJson))); | ||
case 11: | ||
messages = _context17.sent; | ||
/*await*/cleanOldMessages(messages, channelState.options.node.ttl); | ||
case 13: | ||
case 'end': | ||
return _context17.stop(); | ||
} | ||
} | ||
}, _callee16, _this3); | ||
})) | ||
// emit to own eventEmitter | ||
// channelState.socketEE.emitter.emit('data', JSON.parse(JSON.stringify(messageJson))); | ||
); | ||
case 4: | ||
case 'end': | ||
return _context18.stop(); | ||
case 8: | ||
case 'end': | ||
return _context14.stop(); | ||
} | ||
} | ||
} | ||
}, _callee17, this); | ||
})); | ||
}, _callee14, _this2); | ||
}))); | ||
}); | ||
} | ||
return function postMessage(_x27, _x28) { | ||
return _ref18.apply(this, arguments); | ||
}; | ||
}(); | ||
export function onMessage(channelState, fn) { | ||
@@ -930,55 +805,28 @@ var time = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date().getTime(); | ||
export var close = function () { | ||
var _ref20 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee18(channelState) { | ||
return _regeneratorRuntime.wrap(function _callee18$(_context19) { | ||
while (1) { | ||
switch (_context19.prev = _context19.next) { | ||
case 0: | ||
if (!channelState.closed) { | ||
_context19.next = 2; | ||
break; | ||
} | ||
export function close(channelState) { | ||
if (channelState.closed) return; | ||
channelState.closed = true; | ||
return _context19.abrupt('return'); | ||
if (typeof channelState.removeUnload === 'function') channelState.removeUnload(); | ||
case 2: | ||
channelState.closed = true; | ||
/** | ||
* the server get closed lazy because others might still write on it | ||
* and have not found out that the infoFile was deleted | ||
*/ | ||
setTimeout(function () { | ||
return channelState.socketEE.server.close(); | ||
}, 200); | ||
if (typeof channelState.removeUnload === 'function') channelState.removeUnload(); | ||
channelState.socketEE.emitter.removeAllListeners(); | ||
channelState.writeQueue.clear(); | ||
/** | ||
* the server get closed lazy because others might still write on it | ||
* and have not found out that the infoFile was deleted | ||
*/ | ||
setTimeout(function () { | ||
return channelState.socketEE.server.close(); | ||
}, 200); | ||
Object.values(channelState.otherReaderClients).forEach(function (client) { | ||
return client.destroy(); | ||
}); | ||
channelState.socketEE.emitter.removeAllListeners(); | ||
channelState.writeQueue.clear(); | ||
unlink(channelState.infoFilePath)['catch'](function () { | ||
return null; | ||
}); | ||
} | ||
_context19.next = 9; | ||
return unlink(channelState.infoFilePath)['catch'](function () { | ||
return null; | ||
}); | ||
case 9: | ||
Object.values(channelState.otherReaderClients).forEach(function (client) { | ||
return client.destroy(); | ||
}); | ||
case 10: | ||
case 'end': | ||
return _context19.stop(); | ||
} | ||
} | ||
}, _callee18, this); | ||
})); | ||
return function close(_x30) { | ||
return _ref20.apply(this, arguments); | ||
}; | ||
}(); | ||
export function canBeUsed() { | ||
@@ -985,0 +833,0 @@ return isNode; |
@@ -67,3 +67,3 @@ 'use strict'; | ||
set onmessage(fn) { | ||
var time = new Date().getTime() - 5; | ||
var time = new Date().getTime(); | ||
var listenObj = { | ||
@@ -83,3 +83,3 @@ time: time, | ||
addEventListener: function addEventListener(type, fn) { | ||
var time = new Date().getTime() - 5; | ||
var time = new Date().getTime(); | ||
var listenObj = { | ||
@@ -86,0 +86,0 @@ time: time, |
@@ -6,3 +6,3 @@ 'use strict'; | ||
}); | ||
exports.close = exports.postMessage = exports.refreshReaderClients = exports.handleMessagePing = exports.create = exports.type = exports.cleanOldMessages = exports.readMessage = exports.getAllMessages = exports.messagePath = exports.getReadersUuids = exports.writeMessage = exports.openClientConnection = exports.createSocketEventEmitter = exports.createSocketInfoFile = exports.ensureFoldersExist = undefined; | ||
exports.refreshReaderClients = exports.handleMessagePing = exports.create = exports.type = exports.cleanOldMessages = exports.getAllMessages = exports.messagePath = exports.getReadersUuids = exports.writeMessage = exports.openClientConnection = exports.createSocketEventEmitter = exports.ensureFoldersExist = undefined; | ||
@@ -74,51 +74,11 @@ var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); | ||
/** | ||
* Because it is not possible to get all socket-files in a folder, | ||
* when used under fucking windows, | ||
* we have to set a normal file so other readers know our socket exists | ||
*/ | ||
var createSocketInfoFile = exports.createSocketInfoFile = function () { | ||
var _ref2 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee2(channelName, readerUuid) { | ||
var pathToFile; | ||
return _regenerator2['default'].wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_context2.next = 2; | ||
return ensureFoldersExist(channelName); | ||
case 2: | ||
pathToFile = socketInfoPath(channelName, readerUuid); | ||
_context2.next = 5; | ||
return writeFile(pathToFile, JSON.stringify({ | ||
time: new Date().getTime() | ||
})); | ||
case 5: | ||
return _context2.abrupt('return', pathToFile); | ||
case 6: | ||
case 'end': | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, this); | ||
})); | ||
return function createSocketInfoFile(_x2, _x3) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}(); | ||
/** | ||
* creates the socket-file and subscribes to it | ||
* @return {{emitter: EventEmitter, server: any}} | ||
*/ | ||
var createSocketEventEmitter = exports.createSocketEventEmitter = function () { | ||
var _ref3 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee3(channelName, readerUuid) { | ||
var _ref2 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee2(channelName, readerUuid) { | ||
var pathToSocket, emitter, server; | ||
return _regenerator2['default'].wrap(function _callee3$(_context3) { | ||
return _regenerator2['default'].wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
@@ -138,3 +98,3 @@ pathToSocket = socketPath(channelName, readerUuid); | ||
}); | ||
_context3.next = 5; | ||
_context2.next = 5; | ||
return new Promise(function (res) { | ||
@@ -151,3 +111,3 @@ server.listen(pathToSocket, function () { | ||
return _context3.abrupt('return', { | ||
return _context2.abrupt('return', { | ||
path: pathToSocket, | ||
@@ -160,10 +120,10 @@ emitter: emitter, | ||
case 'end': | ||
return _context3.stop(); | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee3, this); | ||
}, _callee2, this); | ||
})); | ||
return function createSocketEventEmitter(_x4, _x5) { | ||
return _ref3.apply(this, arguments); | ||
return function createSocketEventEmitter(_x2, _x3) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
@@ -173,11 +133,11 @@ }(); | ||
var openClientConnection = exports.openClientConnection = function () { | ||
var _ref4 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee4(channelName, readerUuid) { | ||
var _ref3 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee3(channelName, readerUuid) { | ||
var pathToSocket, client; | ||
return _regenerator2['default'].wrap(function _callee4$(_context4) { | ||
return _regenerator2['default'].wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
pathToSocket = socketPath(channelName, readerUuid); | ||
client = new net.Socket(); | ||
_context4.next = 4; | ||
_context3.next = 4; | ||
return new Promise(function (res) { | ||
@@ -188,14 +148,14 @@ client.connect(pathToSocket, res); | ||
case 4: | ||
return _context4.abrupt('return', client); | ||
return _context3.abrupt('return', client); | ||
case 5: | ||
case 'end': | ||
return _context4.stop(); | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee4, this); | ||
}, _callee3, this); | ||
})); | ||
return function openClientConnection(_x6, _x7) { | ||
return _ref4.apply(this, arguments); | ||
return function openClientConnection(_x4, _x5) { | ||
return _ref3.apply(this, arguments); | ||
}; | ||
@@ -211,7 +171,7 @@ }(); | ||
var writeMessage = exports.writeMessage = function () { | ||
var _ref5 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee5(channelName, readerUuid, messageJson) { | ||
var _ref4 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee4(channelName, readerUuid, messageJson) { | ||
var time, writeObject, token, fileName, msgPath; | ||
return _regenerator2['default'].wrap(function _callee5$(_context5) { | ||
return _regenerator2['default'].wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
@@ -227,7 +187,7 @@ time = new Date().getTime(); | ||
msgPath = path.join(getPaths(channelName).messages, fileName); | ||
_context5.next = 7; | ||
_context4.next = 7; | ||
return writeFile(msgPath, JSON.stringify(writeObject)); | ||
case 7: | ||
return _context5.abrupt('return', { | ||
return _context4.abrupt('return', { | ||
time: time, | ||
@@ -241,10 +201,10 @@ uuid: readerUuid, | ||
case 'end': | ||
return _context5.stop(); | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee5, this); | ||
}, _callee4, this); | ||
})); | ||
return function writeMessage(_x8, _x9, _x10) { | ||
return _ref5.apply(this, arguments); | ||
return function writeMessage(_x6, _x7, _x8) { | ||
return _ref4.apply(this, arguments); | ||
}; | ||
@@ -260,15 +220,15 @@ }(); | ||
var getReadersUuids = exports.getReadersUuids = function () { | ||
var _ref6 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee6(channelName) { | ||
var _ref5 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee5(channelName) { | ||
var readersPath, files; | ||
return _regenerator2['default'].wrap(function _callee6$(_context6) { | ||
return _regenerator2['default'].wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context6.prev = _context6.next) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
readersPath = getPaths(channelName).readers; | ||
_context6.next = 3; | ||
_context5.next = 3; | ||
return readdir(readersPath); | ||
case 3: | ||
files = _context6.sent; | ||
return _context6.abrupt('return', files.map(function (file) { | ||
files = _context5.sent; | ||
return _context5.abrupt('return', files.map(function (file) { | ||
return file.split('.'); | ||
@@ -284,10 +244,10 @@ }).filter(function (split) { | ||
case 'end': | ||
return _context6.stop(); | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee6, this); | ||
}, _callee5, this); | ||
})); | ||
return function getReadersUuids(_x11) { | ||
return _ref6.apply(this, arguments); | ||
return function getReadersUuids(_x9) { | ||
return _ref5.apply(this, arguments); | ||
}; | ||
@@ -297,22 +257,22 @@ }(); | ||
var messagePath = exports.messagePath = function () { | ||
var _ref7 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee7(channelName, time, token, writerUuid) { | ||
var _ref6 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee6(channelName, time, token, writerUuid) { | ||
var fileName, msgPath; | ||
return _regenerator2['default'].wrap(function _callee7$(_context7) { | ||
return _regenerator2['default'].wrap(function _callee6$(_context6) { | ||
while (1) { | ||
switch (_context7.prev = _context7.next) { | ||
switch (_context6.prev = _context6.next) { | ||
case 0: | ||
fileName = time + '_' + writerUuid + '_' + token + '.json'; | ||
msgPath = path.join(getPaths(channelName).messages, fileName); | ||
return _context7.abrupt('return', msgPath); | ||
return _context6.abrupt('return', msgPath); | ||
case 3: | ||
case 'end': | ||
return _context7.stop(); | ||
return _context6.stop(); | ||
} | ||
} | ||
}, _callee7, this); | ||
}, _callee6, this); | ||
})); | ||
return function messagePath(_x12, _x13, _x14, _x15) { | ||
return _ref7.apply(this, arguments); | ||
return function messagePath(_x10, _x11, _x12, _x13) { | ||
return _ref6.apply(this, arguments); | ||
}; | ||
@@ -322,15 +282,15 @@ }(); | ||
var getAllMessages = exports.getAllMessages = function () { | ||
var _ref8 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee8(channelName) { | ||
var _ref7 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee7(channelName) { | ||
var messagesPath, files; | ||
return _regenerator2['default'].wrap(function _callee8$(_context8) { | ||
return _regenerator2['default'].wrap(function _callee7$(_context7) { | ||
while (1) { | ||
switch (_context8.prev = _context8.next) { | ||
switch (_context7.prev = _context7.next) { | ||
case 0: | ||
messagesPath = getPaths(channelName).messages; | ||
_context8.next = 3; | ||
_context7.next = 3; | ||
return readdir(messagesPath); | ||
case 3: | ||
files = _context8.sent; | ||
return _context8.abrupt('return', files.map(function (file) { | ||
files = _context7.sent; | ||
return _context7.abrupt('return', files.map(function (file) { | ||
var fileName = file.split('.')[0]; | ||
@@ -349,49 +309,22 @@ var split = fileName.split('_'); | ||
case 'end': | ||
return _context8.stop(); | ||
return _context7.stop(); | ||
} | ||
} | ||
}, _callee8, this); | ||
}, _callee7, this); | ||
})); | ||
return function getAllMessages(_x16) { | ||
return _ref8.apply(this, arguments); | ||
return function getAllMessages(_x14) { | ||
return _ref7.apply(this, arguments); | ||
}; | ||
}(); | ||
var readMessage = exports.readMessage = function () { | ||
var _ref9 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee9(messageObj) { | ||
var content; | ||
return _regenerator2['default'].wrap(function _callee9$(_context9) { | ||
while (1) { | ||
switch (_context9.prev = _context9.next) { | ||
case 0: | ||
_context9.next = 2; | ||
return readFile(messageObj.path, 'utf8'); | ||
case 2: | ||
content = _context9.sent; | ||
return _context9.abrupt('return', JSON.parse(content)); | ||
case 4: | ||
case 'end': | ||
return _context9.stop(); | ||
} | ||
} | ||
}, _callee9, this); | ||
})); | ||
return function readMessage(_x17) { | ||
return _ref9.apply(this, arguments); | ||
}; | ||
}(); | ||
var cleanOldMessages = exports.cleanOldMessages = function () { | ||
var _ref10 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee10(messageObjects, ttl) { | ||
var _ref8 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee8(messageObjects, ttl) { | ||
var olderThen; | ||
return _regenerator2['default'].wrap(function _callee10$(_context10) { | ||
return _regenerator2['default'].wrap(function _callee8$(_context8) { | ||
while (1) { | ||
switch (_context10.prev = _context10.next) { | ||
switch (_context8.prev = _context8.next) { | ||
case 0: | ||
olderThen = new Date().getTime() - ttl; | ||
_context10.next = 3; | ||
_context8.next = 3; | ||
return Promise.all(messageObjects.filter(function (obj) { | ||
@@ -407,10 +340,10 @@ return obj.time < olderThen; | ||
case 'end': | ||
return _context10.stop(); | ||
return _context8.stop(); | ||
} | ||
} | ||
}, _callee10, this); | ||
}, _callee8, this); | ||
})); | ||
return function cleanOldMessages(_x18, _x19) { | ||
return _ref10.apply(this, arguments); | ||
return function cleanOldMessages(_x15, _x16) { | ||
return _ref8.apply(this, arguments); | ||
}; | ||
@@ -420,14 +353,14 @@ }(); | ||
var create = exports.create = function () { | ||
var _ref11 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee11(channelName) { | ||
var _ref9 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee9(channelName) { | ||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
var uuid, _ref12, _ref13, otherReaderUuids, socketEE, infoFilePath, writeQueue, state; | ||
var uuid, writeQueue, state, _ref10, _ref11, socketEE, infoFilePath; | ||
return _regenerator2['default'].wrap(function _callee11$(_context11) { | ||
return _regenerator2['default'].wrap(function _callee9$(_context9) { | ||
while (1) { | ||
switch (_context11.prev = _context11.next) { | ||
switch (_context9.prev = _context9.next) { | ||
case 0: | ||
options = (0, _options.fillOptionsWithDefaults)(options); | ||
_context11.next = 3; | ||
_context9.next = 3; | ||
return ensureFoldersExist(channelName); | ||
@@ -437,14 +370,5 @@ | ||
uuid = (0, _util2.randomToken)(10); | ||
_context11.next = 6; | ||
return Promise.all([getReadersUuids(channelName), createSocketEventEmitter(channelName, uuid), createSocketInfoFile(channelName, uuid)]); | ||
case 6: | ||
_ref12 = _context11.sent; | ||
_ref13 = (0, _slicedToArray3['default'])(_ref12, 3); | ||
otherReaderUuids = _ref13[0]; | ||
socketEE = _ref13[1]; | ||
infoFilePath = _ref13[2]; | ||
// ensures we do not read messages in parrallel | ||
// ensures we do not read messages in parrallel | ||
writeQueue = new _customIdleQueue2['default'](1); | ||
@@ -455,4 +379,2 @@ state = { | ||
uuid: uuid, | ||
socketEE: socketEE, | ||
infoFilePath: infoFilePath, | ||
// contains all messages that have been emitted before | ||
@@ -463,3 +385,2 @@ emittedMessagesIds: new Set(), | ||
writeQueue: writeQueue, | ||
otherReaderUuids: otherReaderUuids, | ||
otherReaderClients: {}, | ||
@@ -472,7 +393,14 @@ // ensure if process crashes, everything is cleaned up | ||
}; | ||
_context11.next = 15; | ||
return refreshReaderClients(state); | ||
_context9.next = 8; | ||
return Promise.all([createSocketEventEmitter(channelName, uuid), createSocketInfoFile(channelName, uuid), refreshReaderClients(state)]); | ||
case 15: | ||
case 8: | ||
_ref10 = _context9.sent; | ||
_ref11 = (0, _slicedToArray3['default'])(_ref10, 2); | ||
socketEE = _ref11[0]; | ||
infoFilePath = _ref11[1]; | ||
state.socketEE = socketEE; | ||
state.infoFilePath = infoFilePath; | ||
// when new message comes in, we read it and emit it | ||
@@ -484,14 +412,14 @@ socketEE.emitter.on('data', function (data) { | ||
return _context11.abrupt('return', state); | ||
return _context9.abrupt('return', state); | ||
case 17: | ||
case 16: | ||
case 'end': | ||
return _context11.stop(); | ||
return _context9.stop(); | ||
} | ||
} | ||
}, _callee11, this); | ||
}, _callee9, this); | ||
})); | ||
return function create(_x21) { | ||
return _ref11.apply(this, arguments); | ||
return function create(_x18) { | ||
return _ref9.apply(this, arguments); | ||
}; | ||
@@ -504,22 +432,15 @@ }(); | ||
*/ | ||
var handleMessagePing = exports.handleMessagePing = function () { | ||
var _ref14 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee12(state) { | ||
var _this = this; | ||
var msgObj = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; | ||
var messages, useMessages, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step; | ||
return _regenerator2['default'].wrap(function _callee12$(_context13) { | ||
var _ref12 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee10(state, msgObj) { | ||
var messages, useMessages; | ||
return _regenerator2['default'].wrap(function _callee10$(_context10) { | ||
while (1) { | ||
switch (_context13.prev = _context13.next) { | ||
switch (_context10.prev = _context10.next) { | ||
case 0: | ||
if (state.messagesCallback) { | ||
_context13.next = 2; | ||
_context10.next = 2; | ||
break; | ||
} | ||
return _context13.abrupt('return'); | ||
return _context10.abrupt('return'); | ||
@@ -530,12 +451,12 @@ case 2: | ||
if (msgObj) { | ||
_context13.next = 9; | ||
_context10.next = 9; | ||
break; | ||
} | ||
_context13.next = 6; | ||
_context10.next = 6; | ||
return getAllMessages(state.channelName); | ||
case 6: | ||
messages = _context13.sent; | ||
_context13.next = 10; | ||
messages = _context10.sent; | ||
_context10.next = 10; | ||
break; | ||
@@ -549,111 +470,48 @@ | ||
useMessages = messages.filter(function (msgObj) { | ||
return msgObj.senderUuid !== state.uuid; | ||
}) // not send by own | ||
.filter(function (msgObj) { | ||
return !state.emittedMessagesIds.has(msgObj.token); | ||
}) // not already emitted | ||
.filter(function (msgObj) { | ||
return msgObj.time >= state.messagesCallbackTime; | ||
}) // not older then onMessageCallback | ||
.sort(function (msgObjA, msgObjB) { | ||
return _filterMessage(msgObj, state); | ||
}).sort(function (msgObjA, msgObjB) { | ||
return msgObjA.time - msgObjB.time; | ||
}); // sort by time | ||
if (!state.messagesCallback) { | ||
_context13.next = 37; | ||
break; | ||
} | ||
_iteratorNormalCompletion = true; | ||
_didIteratorError = false; | ||
_iteratorError = undefined; | ||
_context13.prev = 15; | ||
_loop = /*#__PURE__*/_regenerator2['default'].mark(function _loop() { | ||
var msgObj, content; | ||
return _regenerator2['default'].wrap(function _loop$(_context12) { | ||
while (1) { | ||
switch (_context12.prev = _context12.next) { | ||
case 0: | ||
msgObj = _step.value; | ||
_context12.next = 3; | ||
return readMessage(msgObj); | ||
// if no listener or message, so not do anything | ||
case 3: | ||
content = _context12.sent; | ||
state.emittedMessagesIds.add(msgObj.token); | ||
setTimeout(function () { | ||
return state.emittedMessagesIds['delete'](msgObj.token); | ||
}, state.options.node.ttl * 2); | ||
if (state.messagesCallback) { | ||
state.messagesCallback(content.data); | ||
} | ||
case 7: | ||
case 'end': | ||
return _context12.stop(); | ||
} | ||
} | ||
}, _loop, _this); | ||
}); | ||
_iterator = useMessages[Symbol.iterator](); | ||
case 18: | ||
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { | ||
_context13.next = 23; | ||
if (!(!useMessages.length || !state.messagesCallback)) { | ||
_context10.next = 13; | ||
break; | ||
} | ||
return _context13.delegateYield(_loop(), 't0', 20); | ||
return _context10.abrupt('return'); | ||
case 20: | ||
_iteratorNormalCompletion = true; | ||
_context13.next = 18; | ||
break; | ||
case 13: | ||
_context10.next = 15; | ||
return Promise.all(useMessages.map(function (msgObj) { | ||
return readMessage(msgObj).then(function (content) { | ||
return msgObj.content = content; | ||
}); | ||
})); | ||
case 23: | ||
_context13.next = 29; | ||
break; | ||
case 15: | ||
case 25: | ||
_context13.prev = 25; | ||
_context13.t1 = _context13['catch'](15); | ||
_didIteratorError = true; | ||
_iteratorError = _context13.t1; | ||
useMessages.forEach(function (msgObj) { | ||
state.emittedMessagesIds.add(msgObj.token); | ||
setTimeout(function () { | ||
return state.emittedMessagesIds['delete'](msgObj.token); | ||
}, state.options.node.ttl * 2); | ||
case 29: | ||
_context13.prev = 29; | ||
_context13.prev = 30; | ||
if (state.messagesCallback) { | ||
state.messagesCallback(msgObj.content.data); | ||
} | ||
}); | ||
if (!_iteratorNormalCompletion && _iterator['return']) { | ||
_iterator['return'](); | ||
} | ||
case 32: | ||
_context13.prev = 32; | ||
if (!_didIteratorError) { | ||
_context13.next = 35; | ||
break; | ||
} | ||
throw _iteratorError; | ||
case 35: | ||
return _context13.finish(32); | ||
case 36: | ||
return _context13.finish(29); | ||
case 37: | ||
case 16: | ||
case 'end': | ||
return _context13.stop(); | ||
return _context10.stop(); | ||
} | ||
} | ||
}, _callee12, this, [[15, 25, 29, 37], [30,, 32, 36]]); | ||
}, _callee10, this); | ||
})); | ||
return function handleMessagePing(_x23) { | ||
return _ref14.apply(this, arguments); | ||
return function handleMessagePing(_x19, _x20) { | ||
return _ref12.apply(this, arguments); | ||
}; | ||
@@ -663,15 +521,15 @@ }(); | ||
var refreshReaderClients = exports.refreshReaderClients = function () { | ||
var _ref15 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee15(channelState) { | ||
var _this2 = this; | ||
var _ref13 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee13(channelState) { | ||
var _this = this; | ||
var otherReaders; | ||
return _regenerator2['default'].wrap(function _callee15$(_context16) { | ||
return _regenerator2['default'].wrap(function _callee13$(_context13) { | ||
while (1) { | ||
switch (_context16.prev = _context16.next) { | ||
switch (_context13.prev = _context13.next) { | ||
case 0: | ||
_context16.next = 2; | ||
_context13.next = 2; | ||
return getReadersUuids(channelState.channelName); | ||
case 2: | ||
otherReaders = _context16.sent; | ||
otherReaders = _context13.sent; | ||
@@ -683,18 +541,18 @@ | ||
}).forEach(function () { | ||
var _ref16 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee13(readerUuid) { | ||
return _regenerator2['default'].wrap(function _callee13$(_context14) { | ||
var _ref14 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee11(readerUuid) { | ||
return _regenerator2['default'].wrap(function _callee11$(_context11) { | ||
while (1) { | ||
switch (_context14.prev = _context14.next) { | ||
switch (_context11.prev = _context11.next) { | ||
case 0: | ||
_context14.prev = 0; | ||
_context14.next = 3; | ||
_context11.prev = 0; | ||
_context11.next = 3; | ||
return channelState.otherReaderClients[readerUuid].destroy(); | ||
case 3: | ||
_context14.next = 7; | ||
_context11.next = 7; | ||
break; | ||
case 5: | ||
_context14.prev = 5; | ||
_context14.t0 = _context14['catch'](0); | ||
_context11.prev = 5; | ||
_context11.t0 = _context11['catch'](0); | ||
@@ -706,14 +564,14 @@ case 7: | ||
case 'end': | ||
return _context14.stop(); | ||
return _context11.stop(); | ||
} | ||
} | ||
}, _callee13, _this2, [[0, 5]]); | ||
}, _callee11, _this, [[0, 5]]); | ||
})); | ||
return function (_x25) { | ||
return _ref16.apply(this, arguments); | ||
return function (_x22) { | ||
return _ref14.apply(this, arguments); | ||
}; | ||
}()); | ||
_context16.next = 6; | ||
_context13.next = 6; | ||
return Promise.all(otherReaders.filter(function (readerUuid) { | ||
@@ -726,42 +584,42 @@ return readerUuid !== channelState.uuid; | ||
.map(function () { | ||
var _ref17 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee14(readerUuid) { | ||
var _ref15 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee12(readerUuid) { | ||
var client; | ||
return _regenerator2['default'].wrap(function _callee14$(_context15) { | ||
return _regenerator2['default'].wrap(function _callee12$(_context12) { | ||
while (1) { | ||
switch (_context15.prev = _context15.next) { | ||
switch (_context12.prev = _context12.next) { | ||
case 0: | ||
_context15.prev = 0; | ||
_context12.prev = 0; | ||
if (!channelState.closed) { | ||
_context15.next = 3; | ||
_context12.next = 3; | ||
break; | ||
} | ||
return _context15.abrupt('return'); | ||
return _context12.abrupt('return'); | ||
case 3: | ||
_context15.next = 5; | ||
_context12.next = 5; | ||
return openClientConnection(channelState.channelName, readerUuid); | ||
case 5: | ||
client = _context15.sent; | ||
client = _context12.sent; | ||
channelState.otherReaderClients[readerUuid] = client; | ||
_context15.next = 11; | ||
_context12.next = 11; | ||
break; | ||
case 9: | ||
_context15.prev = 9; | ||
_context15.t0 = _context15['catch'](0); | ||
_context12.prev = 9; | ||
_context12.t0 = _context12['catch'](0); | ||
case 11: | ||
case 'end': | ||
return _context15.stop(); | ||
return _context12.stop(); | ||
} | ||
} | ||
}, _callee14, _this2, [[0, 9]]); | ||
}, _callee12, _this, [[0, 9]]); | ||
})); | ||
return function (_x26) { | ||
return _ref17.apply(this, arguments); | ||
return function (_x23) { | ||
return _ref15.apply(this, arguments); | ||
}; | ||
@@ -775,144 +633,13 @@ }() | ||
case 'end': | ||
return _context16.stop(); | ||
return _context13.stop(); | ||
} | ||
} | ||
}, _callee15, this); | ||
}, _callee13, this); | ||
})); | ||
return function refreshReaderClients(_x24) { | ||
return _ref15.apply(this, arguments); | ||
return function refreshReaderClients(_x21) { | ||
return _ref13.apply(this, arguments); | ||
}; | ||
}(); | ||
var postMessage = exports.postMessage = function () { | ||
var _ref18 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee17(channelState, messageJson) { | ||
var _this3 = this; | ||
return _regenerator2['default'].wrap(function _callee17$(_context18) { | ||
while (1) { | ||
switch (_context18.prev = _context18.next) { | ||
case 0: | ||
_context18.next = 2; | ||
return channelState.writeQueue.requestIdlePromise(); | ||
case 2: | ||
_context18.next = 4; | ||
return channelState.writeQueue.wrapCall((0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee16() { | ||
var msgObj, pingStr, messages; | ||
return _regenerator2['default'].wrap(function _callee16$(_context17) { | ||
while (1) { | ||
switch (_context17.prev = _context17.next) { | ||
case 0: | ||
_context17.next = 2; | ||
return refreshReaderClients(channelState); | ||
case 2: | ||
_context17.next = 4; | ||
return writeMessage(channelState.channelName, channelState.uuid, messageJson); | ||
case 4: | ||
msgObj = _context17.sent; | ||
pingStr = '{"t":' + msgObj.time + ',"u":"' + msgObj.uuid + '","to":"' + msgObj.token + '"}'; | ||
_context17.next = 8; | ||
return Promise.all(Object.values(channelState.otherReaderClients).filter(function (client) { | ||
return client.writable; | ||
}) // client might have closed in between | ||
.map(function (client) { | ||
return new Promise(function (res) { | ||
client.write(pingStr, res); | ||
}); | ||
})); | ||
case 8: | ||
if (!((0, _util2.randomInt)(0, 50) === 0)) { | ||
_context17.next = 13; | ||
break; | ||
} | ||
_context17.next = 11; | ||
return getAllMessages(channelState.channelName); | ||
case 11: | ||
messages = _context17.sent; | ||
/*await*/cleanOldMessages(messages, channelState.options.node.ttl); | ||
case 13: | ||
case 'end': | ||
return _context17.stop(); | ||
} | ||
} | ||
}, _callee16, _this3); | ||
})) | ||
// emit to own eventEmitter | ||
// channelState.socketEE.emitter.emit('data', JSON.parse(JSON.stringify(messageJson))); | ||
); | ||
case 4: | ||
case 'end': | ||
return _context18.stop(); | ||
} | ||
} | ||
}, _callee17, this); | ||
})); | ||
return function postMessage(_x27, _x28) { | ||
return _ref18.apply(this, arguments); | ||
}; | ||
}(); | ||
var close = exports.close = function () { | ||
var _ref20 = (0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee18(channelState) { | ||
return _regenerator2['default'].wrap(function _callee18$(_context19) { | ||
while (1) { | ||
switch (_context19.prev = _context19.next) { | ||
case 0: | ||
if (!channelState.closed) { | ||
_context19.next = 2; | ||
break; | ||
} | ||
return _context19.abrupt('return'); | ||
case 2: | ||
channelState.closed = true; | ||
if (typeof channelState.removeUnload === 'function') channelState.removeUnload(); | ||
/** | ||
* the server get closed lazy because others might still write on it | ||
* and have not found out that the infoFile was deleted | ||
*/ | ||
setTimeout(function () { | ||
return channelState.socketEE.server.close(); | ||
}, 200); | ||
channelState.socketEE.emitter.removeAllListeners(); | ||
channelState.writeQueue.clear(); | ||
_context19.next = 9; | ||
return unlink(channelState.infoFilePath)['catch'](function () { | ||
return null; | ||
}); | ||
case 9: | ||
Object.values(channelState.otherReaderClients).forEach(function (client) { | ||
return client.destroy(); | ||
}); | ||
case 10: | ||
case 'end': | ||
return _context19.stop(); | ||
} | ||
} | ||
}, _callee18, this); | ||
})); | ||
return function close(_x30) { | ||
return _ref20.apply(this, arguments); | ||
}; | ||
}(); | ||
exports.cleanPipeName = cleanPipeName; | ||
@@ -922,4 +649,9 @@ exports.getPaths = getPaths; | ||
exports.socketInfoPath = socketInfoPath; | ||
exports.createSocketInfoFile = createSocketInfoFile; | ||
exports.getSingleMessage = getSingleMessage; | ||
exports.readMessage = readMessage; | ||
exports._filterMessage = _filterMessage; | ||
exports.postMessage = postMessage; | ||
exports.onMessage = onMessage; | ||
exports.close = close; | ||
exports.canBeUsed = canBeUsed; | ||
@@ -1001,15 +733,21 @@ exports.averageResponseTime = averageResponseTime; | ||
var getPathsCache = new Map(); | ||
function getPaths(channelName) { | ||
var folderPathBase = path.join(os.tmpdir(), TMP_FOLDER_NAME); | ||
var channelPathBase = path.join(os.tmpdir(), TMP_FOLDER_NAME, (0, _jsSha.sha3_224)(channelName) // use hash incase of strange characters | ||
); | ||
var folderPathReaders = path.join(channelPathBase, 'readers'); | ||
var folderPathMessages = path.join(channelPathBase, 'messages'); | ||
if (!getPathsCache.has(channelName)) { | ||
var folderPathBase = path.join(os.tmpdir(), TMP_FOLDER_NAME); | ||
var channelPathBase = path.join(os.tmpdir(), TMP_FOLDER_NAME, (0, _jsSha.sha3_224)(channelName) // use hash incase of strange characters | ||
); | ||
var folderPathReaders = path.join(channelPathBase, 'readers'); | ||
var folderPathMessages = path.join(channelPathBase, 'messages'); | ||
return { | ||
base: folderPathBase, | ||
channelBase: channelPathBase, | ||
readers: folderPathReaders, | ||
messages: folderPathMessages | ||
}; | ||
var ret = { | ||
base: folderPathBase, | ||
channelBase: channelPathBase, | ||
readers: folderPathReaders, | ||
messages: folderPathMessages | ||
}; | ||
getPathsCache.set(channelName, ret); | ||
return ret; | ||
} | ||
return getPathsCache.get(channelName); | ||
} | ||
@@ -1028,2 +766,16 @@ | ||
return socketPath; | ||
} | ||
/** | ||
* Because it is not possible to get all socket-files in a folder, | ||
* when used under fucking windows, | ||
* we have to set a normal file so other readers know our socket exists | ||
*/ | ||
function createSocketInfoFile(channelName, readerUuid) { | ||
var pathToFile = socketInfoPath(channelName, readerUuid); | ||
return writeFile(pathToFile, JSON.stringify({ | ||
time: new Date().getTime() | ||
})).then(function () { | ||
return pathToFile; | ||
}); | ||
}function getSingleMessage(channelName, msgObj) { | ||
@@ -1040,4 +792,71 @@ var messagesPath = getPaths(channelName).messages; | ||
function readMessage(messageObj) { | ||
return readFile(messageObj.path, 'utf8').then(function (content) { | ||
return JSON.parse(content); | ||
}); | ||
} | ||
var type = exports.type = 'node'; | ||
function _filterMessage(msgObj, state) { | ||
if (msgObj.senderUuid === state.uuid) return false; // not send by own | ||
if (state.emittedMessagesIds.has(msgObj.token)) return false; // not already emitted | ||
if (msgObj.time < state.messagesCallbackTime) return false; // not older then onMessageCallback | ||
return true; | ||
}function postMessage(channelState, messageJson) { | ||
var _this2 = this; | ||
// ensure we do this not in parallel | ||
return channelState.writeQueue.requestIdlePromise().then(function () { | ||
return channelState.writeQueue.wrapCall((0, _asyncToGenerator3['default'])( /*#__PURE__*/_regenerator2['default'].mark(function _callee14() { | ||
var _ref17, _ref18, msgObj, pingStr; | ||
return _regenerator2['default'].wrap(function _callee14$(_context14) { | ||
while (1) { | ||
switch (_context14.prev = _context14.next) { | ||
case 0: | ||
_context14.next = 2; | ||
return Promise.all([writeMessage(channelState.channelName, channelState.uuid, messageJson), refreshReaderClients(channelState)]); | ||
case 2: | ||
_ref17 = _context14.sent; | ||
_ref18 = (0, _slicedToArray3['default'])(_ref17, 1); | ||
msgObj = _ref18[0]; | ||
pingStr = '{"t":' + msgObj.time + ',"u":"' + msgObj.uuid + '","to":"' + msgObj.token + '"}'; | ||
_context14.next = 8; | ||
return Promise.all(Object.values(channelState.otherReaderClients).filter(function (client) { | ||
return client.writable; | ||
}) // client might have closed in between | ||
.map(function (client) { | ||
return new Promise(function (res) { | ||
client.write(pingStr, res); | ||
}); | ||
})); | ||
case 8: | ||
/** | ||
* clean up old messages | ||
* to not waste resources on cleaning up, | ||
* only if random-int matches, we clean up old messages | ||
*/ | ||
if ((0, _util2.randomInt)(0, 50) === 0) { | ||
/* await */getAllMessages(channelState.channelName).then(function (allMessages) { | ||
return cleanOldMessages(allMessages, channelState.options.node.ttl); | ||
}); | ||
} | ||
// emit to own eventEmitter | ||
// channelState.socketEE.emitter.emit('data', JSON.parse(JSON.stringify(messageJson))); | ||
case 9: | ||
case 'end': | ||
return _context14.stop(); | ||
} | ||
} | ||
}, _callee14, _this2); | ||
}))); | ||
}); | ||
} | ||
function onMessage(channelState, fn) { | ||
@@ -1051,2 +870,28 @@ var time = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Date().getTime(); | ||
function close(channelState) { | ||
if (channelState.closed) return; | ||
channelState.closed = true; | ||
if (typeof channelState.removeUnload === 'function') channelState.removeUnload(); | ||
/** | ||
* the server get closed lazy because others might still write on it | ||
* and have not found out that the infoFile was deleted | ||
*/ | ||
setTimeout(function () { | ||
return channelState.socketEE.server.close(); | ||
}, 200); | ||
channelState.socketEE.emitter.removeAllListeners(); | ||
channelState.writeQueue.clear(); | ||
Object.values(channelState.otherReaderClients).forEach(function (client) { | ||
return client.destroy(); | ||
}); | ||
unlink(channelState.infoFilePath)['catch'](function () { | ||
return null; | ||
}); | ||
} | ||
function canBeUsed() { | ||
@@ -1053,0 +898,0 @@ return _detectNode2['default']; |
{ | ||
"name": "broadcast-channel", | ||
"version": "1.2.4", | ||
"version": "1.2.5", | ||
"description": "A BroadcastChannel implementation that works with new browsers, older browsers and Node.js", | ||
@@ -59,3 +59,2 @@ "homepage": "https://github.com/pubkey/broadcast-channel#readme", | ||
"dependencies": { | ||
"@types/core-js": "^2.5.0", | ||
"babel-runtime": "6.26.0", | ||
@@ -68,3 +67,4 @@ "custom-idle-queue": "2.0.1", | ||
"devDependencies": { | ||
"@babel/types": "^7.0.0-beta.51", | ||
"@types/core-js": "2.5.0", | ||
"@babel/types": "7.0.0-beta.51", | ||
"assert": "1.4.1", | ||
@@ -93,3 +93,3 @@ "async-test-util": "1.6.1", | ||
"browserify": "16.2.2", | ||
"child-process-promise": "^2.2.1", | ||
"child-process-promise": "2.2.1", | ||
"clone": "2.1.1", | ||
@@ -96,0 +96,0 @@ "concurrently": "3.6.0", |
57
perf.txt
@@ -92,1 +92,58 @@ BEFORE: | ||
----------------------------------------- | ||
----------------------------------------- | ||
16. July.2018: test:performance | ||
BEFORE: { | ||
"openClose": 1499.9152579996735, | ||
"sendRecieve": { | ||
"parallel": 6752.695256000385, | ||
"series": 5142.3914529997855 | ||
} | ||
} | ||
AFTER: { // getPathsCache | ||
"openClose": 1154.4196130000055, | ||
"sendRecieve": { | ||
"parallel": 6559.061360999942, | ||
"series": 4965.728401999921 | ||
} | ||
} | ||
AFTER2: { // cleanup things | ||
"openClose": 1086.149023000151, | ||
"sendRecieve": { | ||
"parallel": 6496.672225000337, | ||
"series": 4932.777033999562 | ||
} | ||
} | ||
AFTER3: { // run things in parallel | ||
"openClose": 737.8487470000982, | ||
"sendRecieve": { | ||
"parallel": 6637.516607999802, | ||
"series": 4835.849313000217 | ||
} | ||
} | ||
AFTER4: { // read content in parallel | ||
"openClose": 746.0398439988494, | ||
"sendRecieve": { | ||
"parallel": 6332.704676998779, | ||
"series": 4761.053835000843 | ||
} | ||
} | ||
AFTER5: { // better postMessage | ||
"openClose": 666.0222460012883, | ||
"sendRecieve": { | ||
"parallel": 5854.225347001106, | ||
"series": 4425.243154998869 | ||
} | ||
} | ||
----------------------------------------- |
@@ -72,3 +72,3 @@ import { | ||
set onmessage(fn) { | ||
const time = new Date().getTime() - 5; | ||
const time = new Date().getTime(); | ||
const listenObj = { | ||
@@ -88,3 +88,3 @@ time, | ||
addEventListener(type, fn) { | ||
const time = new Date().getTime() - 5; | ||
const time = new Date().getTime(); | ||
const listenObj = { | ||
@@ -91,0 +91,0 @@ time, |
@@ -52,37 +52,39 @@ /** | ||
const TMP_FOLDER_NAME = 'pubkey.broadcast-channel'; | ||
const getPathsCache = new Map(); | ||
export function getPaths(channelName) { | ||
const folderPathBase = path.join( | ||
os.tmpdir(), | ||
TMP_FOLDER_NAME | ||
); | ||
const channelPathBase = path.join( | ||
os.tmpdir(), | ||
TMP_FOLDER_NAME, | ||
sha3_224(channelName) // use hash incase of strange characters | ||
); | ||
const folderPathReaders = path.join( | ||
channelPathBase, | ||
'readers' | ||
); | ||
const folderPathMessages = path.join( | ||
channelPathBase, | ||
'messages' | ||
); | ||
if (!getPathsCache.has(channelName)) { | ||
const folderPathBase = path.join( | ||
os.tmpdir(), | ||
TMP_FOLDER_NAME | ||
); | ||
const channelPathBase = path.join( | ||
os.tmpdir(), | ||
TMP_FOLDER_NAME, | ||
sha3_224(channelName) // use hash incase of strange characters | ||
); | ||
const folderPathReaders = path.join( | ||
channelPathBase, | ||
'readers' | ||
); | ||
const folderPathMessages = path.join( | ||
channelPathBase, | ||
'messages' | ||
); | ||
return { | ||
base: folderPathBase, | ||
channelBase: channelPathBase, | ||
readers: folderPathReaders, | ||
messages: folderPathMessages | ||
}; | ||
const ret = { | ||
base: folderPathBase, | ||
channelBase: channelPathBase, | ||
readers: folderPathReaders, | ||
messages: folderPathMessages | ||
}; | ||
getPathsCache.set(channelName, ret); | ||
return ret; | ||
} | ||
return getPathsCache.get(channelName); | ||
} | ||
export async function ensureFoldersExist(channelName) { | ||
const paths = getPaths(channelName); | ||
await mkdir(paths.base).catch(() => null); | ||
@@ -121,6 +123,5 @@ await mkdir(paths.channelBase).catch(() => null); | ||
*/ | ||
export async function createSocketInfoFile(channelName, readerUuid) { | ||
await ensureFoldersExist(channelName); | ||
export function createSocketInfoFile(channelName, readerUuid) { | ||
const pathToFile = socketInfoPath(channelName, readerUuid); | ||
await writeFile( | ||
return writeFile( | ||
pathToFile, | ||
@@ -130,4 +131,3 @@ JSON.stringify({ | ||
}) | ||
); | ||
return pathToFile; | ||
).then(() => pathToFile); | ||
} | ||
@@ -276,5 +276,5 @@ | ||
export async function readMessage(messageObj) { | ||
const content = await readFile(messageObj.path, 'utf8'); | ||
return JSON.parse(content); | ||
export function readMessage(messageObj) { | ||
return readFile(messageObj.path, 'utf8') | ||
.then(content => JSON.parse(content)); | ||
} | ||
@@ -302,11 +302,2 @@ | ||
const [ | ||
otherReaderUuids, | ||
socketEE, | ||
infoFilePath | ||
] = await Promise.all([ | ||
getReadersUuids(channelName), | ||
createSocketEventEmitter(channelName, uuid), | ||
createSocketInfoFile(channelName, uuid) | ||
]); | ||
@@ -320,4 +311,2 @@ // ensures we do not read messages in parrallel | ||
uuid, | ||
socketEE, | ||
infoFilePath, | ||
// contains all messages that have been emitted before | ||
@@ -328,3 +317,2 @@ emittedMessagesIds: new Set(), | ||
writeQueue, | ||
otherReaderUuids, | ||
otherReaderClients: {}, | ||
@@ -336,3 +324,12 @@ // ensure if process crashes, everything is cleaned up | ||
await refreshReaderClients(state); | ||
const [ | ||
socketEE, | ||
infoFilePath | ||
] = await Promise.all([ | ||
createSocketEventEmitter(channelName, uuid), | ||
createSocketInfoFile(channelName, uuid), | ||
refreshReaderClients(state) | ||
]); | ||
state.socketEE = socketEE; | ||
state.infoFilePath = infoFilePath; | ||
@@ -349,2 +346,12 @@ // when new message comes in, we read it and emit it | ||
export function _filterMessage(msgObj, state) { | ||
if (msgObj.senderUuid === state.uuid) return false; // not send by own | ||
if (state.emittedMessagesIds.has(msgObj.token)) return false; // not already emitted | ||
if (msgObj.time < state.messagesCallbackTime) return false; // not older then onMessageCallback | ||
return true; | ||
} | ||
/** | ||
@@ -354,3 +361,3 @@ * when the socket pings, so that we now new messages came, | ||
*/ | ||
export async function handleMessagePing(state, msgObj = null) { | ||
export async function handleMessagePing(state, msgObj) { | ||
/** | ||
@@ -361,3 +368,2 @@ * when there are no listener, we do nothing | ||
let messages; | ||
@@ -375,21 +381,28 @@ if (!msgObj) { | ||
const useMessages = messages | ||
.filter(msgObj => msgObj.senderUuid !== state.uuid) // not send by own | ||
.filter(msgObj => !state.emittedMessagesIds.has(msgObj.token)) // not already emitted | ||
.filter(msgObj => msgObj.time >= state.messagesCallbackTime) // not older then onMessageCallback | ||
.filter(msgObj => _filterMessage(msgObj, state)) | ||
.sort((msgObjA, msgObjB) => msgObjA.time - msgObjB.time); // sort by time | ||
if (state.messagesCallback) { | ||
for (const msgObj of useMessages) { | ||
const content = await readMessage(msgObj); | ||
state.emittedMessagesIds.add(msgObj.token); | ||
setTimeout( | ||
() => state.emittedMessagesIds.delete(msgObj.token), | ||
state.options.node.ttl * 2 | ||
); | ||
if (state.messagesCallback) { | ||
state.messagesCallback(content.data); | ||
} | ||
// if no listener or message, so not do anything | ||
if (!useMessages.length || !state.messagesCallback) return; | ||
// read contents | ||
await Promise.all( | ||
useMessages | ||
.map( | ||
msgObj => readMessage(msgObj).then(content => msgObj.content = content) | ||
) | ||
); | ||
useMessages.forEach(msgObj => { | ||
state.emittedMessagesIds.add(msgObj.token); | ||
setTimeout( | ||
() => state.emittedMessagesIds.delete(msgObj.token), | ||
state.options.node.ttl * 2 | ||
); | ||
if (state.messagesCallback) { | ||
state.messagesCallback(msgObj.content.data); | ||
} | ||
} | ||
}); | ||
} | ||
@@ -428,41 +441,43 @@ | ||
export async function postMessage(channelState, messageJson) { | ||
export function postMessage(channelState, messageJson) { | ||
// ensure we do this not in parallel | ||
await channelState.writeQueue.requestIdlePromise(); | ||
await channelState.writeQueue.wrapCall( | ||
async () => { | ||
await refreshReaderClients(channelState); | ||
const msgObj = await writeMessage( | ||
channelState.channelName, | ||
channelState.uuid, | ||
messageJson | ||
); | ||
return channelState.writeQueue.requestIdlePromise() | ||
.then( | ||
() => channelState.writeQueue.wrapCall( | ||
async () => { | ||
const [msgObj] = await Promise.all([ | ||
writeMessage( | ||
channelState.channelName, | ||
channelState.uuid, | ||
messageJson | ||
), | ||
refreshReaderClients(channelState) | ||
]); | ||
const pingStr = '{"t":' + msgObj.time + ',"u":"' + msgObj.uuid + '","to":"' + msgObj.token + '"}'; | ||
const pingStr = '{"t":' + msgObj.time + ',"u":"' + msgObj.uuid + '","to":"' + msgObj.token + '"}'; | ||
await Promise.all( | ||
Object.values(channelState.otherReaderClients) | ||
.filter(client => client.writable) // client might have closed in between | ||
.map(client => { | ||
return new Promise(res => { | ||
client.write(pingStr, res); | ||
}); | ||
}) | ||
); | ||
await Promise.all( | ||
Object.values(channelState.otherReaderClients) | ||
.filter(client => client.writable) // client might have closed in between | ||
.map(client => { | ||
return new Promise(res => { | ||
client.write(pingStr, res); | ||
}); | ||
}) | ||
); | ||
/** | ||
* clean up old messages | ||
* to not waste resources on cleaning up, | ||
* only if random-int matches, we clean up old messages | ||
*/ | ||
if (randomInt(0, 50) === 0) { | ||
/* await */ getAllMessages(channelState.channelName) | ||
.then(allMessages => cleanOldMessages(allMessages, channelState.options.node.ttl)); | ||
} | ||
/** | ||
* clean up old messages | ||
* to not waste resources on cleaning up, | ||
* only if random-int matches, we clean up old messages | ||
*/ | ||
if (randomInt(0, 50) === 0) { | ||
const messages = await getAllMessages(channelState.channelName); | ||
/*await*/ cleanOldMessages(messages, channelState.options.node.ttl); | ||
} | ||
// emit to own eventEmitter | ||
// channelState.socketEE.emitter.emit('data', JSON.parse(JSON.stringify(messageJson))); | ||
} | ||
); | ||
// emit to own eventEmitter | ||
// channelState.socketEE.emitter.emit('data', JSON.parse(JSON.stringify(messageJson))); | ||
} | ||
) | ||
); | ||
} | ||
@@ -477,3 +492,3 @@ | ||
export async function close(channelState) { | ||
export function close(channelState) { | ||
if (channelState.closed) return; | ||
@@ -494,6 +509,6 @@ channelState.closed = true; | ||
await unlink(channelState.infoFilePath).catch(() => null); | ||
Object.values(channelState.otherReaderClients) | ||
.forEach(client => client.destroy()); | ||
unlink(channelState.infoFilePath).catch(() => null); | ||
} | ||
@@ -500,0 +515,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
5
187444
57
4445
- Removed@types/core-js@^2.5.0
- Removed@types/core-js@2.5.8(transitive)