tailwind
Version:
tailwind is a base module for streaming and evented CQS applications.
106 lines (84 loc) • 2.81 kB
JavaScript
const partOf = require('partof');
const sendMessage = require('./wsSendMessage');
const subscriptions = {};
const postEvents = {
async subscribe (socket, { app, message }) {
if (!socket) {
throw new Error('Socket is missing.');
}
if (!app) {
throw new Error('App is missing.');
}
if (!message) {
throw new Error('Message is missing.');
}
const logger = app.services.getLogger();
const filter = message.payload ? message.payload.filter || {} : {};
const sendToClient = function (event) {
if (!partOf(filter, event)) {
return;
}
if (
!event.metadata.isAuthorized ||
event.metadata.isAuthorized.forPublic ||
(event.metadata.isAuthorized.forAuthenticated && message.token.sub !== 'anonymous') ||
(event.metadata.isAuthorized.owner === message.token.sub)
) {
(async () => {
try {
await sendMessage(socket, { type: 'event', payload: event, statusCode: 200, procedureId: message.procedureId });
} catch (ex) {
logger.error('Failed to send message.', { ex });
}
})();
}
};
const unsubscribe = function () {
app.api.outgoing.removeListener('data', sendToClient);
};
subscriptions[socket.uniqueId] = subscriptions[socket.uniqueId] || {};
subscriptions[socket.uniqueId][message.procedureId] = unsubscribe;
app.api.outgoing.on('data', sendToClient);
try {
await sendMessage(socket, { type: 'subscribedEvents', statusCode: 200, procedureId: message.procedureId });
} catch (ex) {
logger.error('Failed to send message.', { ex });
}
},
async unsubscribe (socket, { app, message }) {
if (!socket) {
throw new Error('Socket is missing.');
}
if (!app) {
throw new Error('App is missing.');
}
if (!message) {
throw new Error('Message is missing.');
}
const logger = app.services.getLogger();
if (!subscriptions[socket.uniqueId] || !subscriptions[socket.uniqueId][message.procedureId]) {
return;
}
const unsubscribe = subscriptions[socket.uniqueId][message.procedureId];
unsubscribe();
try {
await sendMessage(socket, { type: 'unsubscribedEvents', statusCode: 200, procedureId: message.procedureId });
} catch (ex) {
logger.error('Failed to send message.', { ex });
}
},
removeAllListenersFor (socket) {
if (!socket) {
throw new Error('Socket is missing.');
}
if (!subscriptions[socket.uniqueId]) {
return;
}
Object.keys(subscriptions[socket.uniqueId]).forEach(procedureId => {
const unsubscribe = subscriptions[socket.uniqueId][procedureId];
unsubscribe();
});
}
};
module.exports = postEvents;
;