Socket
Socket
Sign inDemoInstall

broadcast-channel

Package Overview
Dependencies
Maintainers
1
Versions
98
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

broadcast-channel - npm Package Compare versions

Comparing version 1.2.4 to 1.2.5

4

dist/es/index.js

@@ -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",

@@ -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 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc