npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@talend/react-cmf-cqrs

v11.0.0

Published

@talend/react-cmf plugin for CQRS backend architecture

Downloads

280

Readme

Content Management Framework for CQRS (aka cmf-cqrs)

This is a library to help you to build configurable React App with CQRS pattern.

Travis CI NPM dependencies devdependencies

Content

This package provides tools to deal with cqrs backend allowing websocket handling :

  • acknowledgement actions
  • ACKDispatcher component
  • Smart Websocket middleware
  • ACK reducer

How it works

  • to start the websocket with smartWebsocket middleware :
ws = new SmartWebsocket(urlPrefix, {
	onOpen: () => dispatch({ type: SOCKET_ON_OPEN }),
	onClose: () => dispatch({ type: SOCKET_ON_CLOSE }),
	onMessage: messageEvent => {
		socketListener.forEach(func => func(messageEvent, dispatch, getState, ws));
	},
	onError: errorEvent => {
		dispatch({ type: SOCKET_ON_CLOSE, event: errorEvent });
	},
	onPing: event => {
		ws.pingTimeoutId = event.pingTimeoutId;
	},
	onPingTimeout: () => {
		dispatch({ type: SOCKET_ON_PING_TIMEOUT });
	},
	...socketOptions,
});

socketOptions is optionnal but allows websocket configuration from middleware instanciation within your application.

{
	checkInterval: 5000,
	pingInterval: 10000,
	pingTimeoutDelay: SOCKET_ON_PING_TIMEOUT_DELAY,
}
  • checkInterval : max duration between 2 websocket connections trials if closed
  • pingInterval : duration between ping message from the webapp to the server, like a heartbeat of the connection
  • pingTimeoutDelay : duration after which a PING message not being answered by a PONG will trigger a SOCKET_ON_PING_TIMEOUT and force close of the current connection

In onMessage event, you should get middleware handlers as well.

  • On the reducer, actions handled :
    • ACK_ADD_CONTEXT : Used to add a new request on stack
    • ACK_RECEIVE_MESSAGE : Used when a message come from the ws
    • ACK_DELETE : Used when you want to delete a handler

SocketMiddleware

This middleware serve two purpose

listening to action dispatched to the reducer, and be able to send message trought the websocket

listening to message comming from the websocket and dispatching message to the reducer

Configuration

import cmf from '@talend/react-cmf';
import cqrsModule, { middlewares as cqrsMiddlewares } from '@talend/react-cmf-cqrs';

const websocketMiddleware = cqrsMiddlewares.createWebsocketMiddleware(
	API['cqrs-websocket'],
	[...actionListeners],
	[...socketListener],
	{ ...socketOptions },
);

cmf.bootstrap({
	appId: 'app',
	// ...
	modules: [cqrsModule]
	middlewares: [websocketMiddleware]
});

the action listener recieve for each action the store state ,before the action is applied the action dispatched to the store reducer the new state resulting from the action to be applied

the value returned by the actionListener get sent trought the websocket.

/** an example of an action listener sending all action trought the ws **/
function myActionListener(previousState, action, nextState) {
	return JSON.stringify(action);
}

the socketListener recieve for each message the messageEvent containing all information about the message recieved the store.dispatch function so you can dispatch an action the store.getState function in case you want to check the store state before doing anything the smartWebSocket itself so the listener can access to the websocket itself (eg: datastreams pong socket listener that get timeoutId and clear it before it's execution)

/** an example of an message listener dispatching each message recieved **/
function myMessageListener(messageEvent, dispatch, getState, smartWebSocket) {
	dispatch({type: 'MESSAGE RECIEVED', message: JSON.parse(messageEvent.data);})
}

Additionnaly the websocket middleware dispatch action on socket state change and on message being recieved.

on socket connection open success the following action get dispatched

{ type: SOCKET_ON_OPEN }

on socket connection being closed the following action get dispatched

{ type: SOCKET_ON_CLOSE }

on socket connection being closed by an error the following action get dispatched

{ type: SOCKET_ON_ERROR, event: errorEvent }

on socket connection receiving a message, no action get dispatched but socketListeners are called which will take care of dispactching action or not or even do something else

on socket connection timeout reached, the following action get dispatched

{ type: SOCKET_ON_PING_TIMEOUT }

Hook

Once boostraped with the createWebsocketMiddleware, you can use the hook to get the websocket instance

import { useWebSocket } from '@talend/react-cmf-cqrs';

function MyComponent() {
	const { lastJsonMessage, lastMessage, readyState, sendMessage, sendJsonMessage } = useWebsocket();

	useEffect(() => {
		makeStuff(lastJsonMessage);
	}, [lastJsonMessage]);
}

We can provide a list of ignored events (because we make some pong request to maintain the connection) this way :

import { useWebSocket } from '@talend/react-cmf-cqrs';

function MyComponent() {
	const { lastJsonMessage, lastMessage, readyState, sendMessage, sendJsonMessage } = useWebsocket([
		'pong',
	]);

	useEffect(() => {
		makeStuff(lastJsonMessage);
	}, [lastJsonMessage]);
}