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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@netuno/ws-client

v1.2.0

Published

<a href="https://www.npmjs.com/package/@netuno/ws-client"><img src="https://img.shields.io/npm/v/@netuno/ws-client.svg?style=flat" alt="npm version"></a>

Downloads

203

Readme

ws-client

Client to integrations with Netuno WebSocket and Services.

More about the Netuno Platform.

This module makes is easy to support WebSocket in web applications.

Install

bun add @netuno/ws-client

Import

import _ws from '@netuno/ws-client';

Config

Defines the main events:

_ws.config({
    url: 'ws://localhost:9000/ws/example',
    servicesPrefix: '/services',
    method: 'GET',
    autoReconnect: true,
    connect: (event) => {
        ...
    },
    close: (event) => {
        ...
    },
    error: (error) => {
        ...
    },
    message: (data, event) => {
        ...
    }
});

Connect

_ws.connect();

Close

_ws.close();

Listener

The listener observes the execution of a specific service and is used to inject behaviors such as events.

The listener will execute these events when the service specified are executed:

  • start - before the service request is sent via WebSocket.
  • success - if the service executed very well.
  • fail - if the service gives an error.
  • end - after the service execution is ended.

The listener must specify the HTTP method, which is GET by default.

See how to define a listener:

const listenerRef = _ws.addListener({
    method: 'GET', // Optional
    service: "my/service",
    start: () => { ... }, // Optional
    success: (data) => {
        ...
    },
    fail: (error)=> {
        ...
    },
    end: () => { ... } // Optional
});

Remove listener:

_ws.removeListener(listenerRef);

Send Service

Send data to the service, and the output comes in the listener defined.

The service path and the HTTP method must be specified, which by default is GET.

_ws.sendService({
    method: 'GET', // Optional
    service: 'my/service',
    data: {
        params: 'values here' 
    }
});

Send Service with a Listener

Send service directly supports the listener events definition for simple cases.

Send data to the service, and the output will be received in the success or fail event.

It is useful when it is not necessary to keep the listener, for one-time service execution.

In the background, a listener is auto-created, and it is auto-removed in the end.

_ws.sendService({
    method: 'POST', // Optional
    service: 'my/service',
    data: {
        param: 'code' 
    },
    start: () => { ... }, // Optional
    success: (data) => {
        ...
    },
    fail: (error)=> {
        ...
    },
    end: () => { ... } // Optional
});

React Integration

When integrating with React, it's recommended to load the listener within the useEffect method used to create the component.

The useEffect return function removes the listener when the component is destroyed.

See this example:

import {useEffect, useState} from "react";

import {Spin, Button, notification} from "antd";

import _ws from "@netuno/ws-client";

import Item from "./Item";

function ProductList() {
    const [loading, setLoading] = useState(true);
    const [list, setList] = useState(null);
    useEffect(() => {
        const listenerRef = _ws.addListener({
            service: "product/list",
            start: () => {
                setLoading(true);
            },
            success: (data) => {
                setList(data.content);
            },
            fail: (error) => {
                console.error("Service product/list failed.", error);
                notification.error({
                    title: "Product List",
                    description: `Failed with status code ${error.status}.`
                })
            },
            end: () => {
                setLoading(false);
            }
        });
        onLoad();
        return () => {
            _ws.removeListener(listenerRef);
        }
    }, []);
    const onLoad = () => {
        _ws.sendService({
            service: "product/list"
        });
    };
    return (
        <div>
            {loading && <Spin/>}
            {!loading && <Button onClick={onLoad}>Update</Button>}
            {list && <ul>
                {list.map(({uid, name}) => (
                    <Item
                        key={uid}
                        uid={uid}
                        name={name}
                    />
                ))}
            </ul>}
        </div>
    );
}

export default ProductList;