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

@gr2m/net-interceptor

v1.0.0

Published

Intercept and mock outgoing network TCP/TLS connections

Downloads

91

Readme

@gr2m/net-interceptor

Test

Intercept outgoing network TCP/TLS connections

Install

npm install @gr2m/net-interceptor

Usage

import netInterceptor from "@gr2m/net-interceptor";

netInterceptor.start();
netInterceptor.on("connect", (socket, options, bypass) => {
  // call bypass() to continue the unintercepted connection
  if (options.host === "db.example.com") return bypass();
});

netInterceptor.on("connection", (socket) => {
  // do something with the socket
  socket.write("Hello from @gr2m/net-interceptor!");
});

API

netInterceptor is a singleton API.

netInterceptor.start()

Hooks into the request life cycle and emits connect events for each socket that connects to a server as well as connection events for all intercepted sockets.

netInterceptor.stop()

Stops interceptiong. No connect or connection events will be emitted.

netInterceptor.addListener(event, listener)

connect event

The listener callback is called with 3 arguments

  • socket: the intercepted net or TLS socket
  • options: socket options: {port, /* host, localAddress, localPort, family, allowHalfOpen */}
  • bypass: a function to call to continue the unintercepted connection

connection event

The listener callback is called with 2 arguments

  • socket: the response net or TLS socket
  • options: socket options: {port, /* host, localAddress, localPort, family, allowHalfOpen */}

netInterceptor.removeListener(event, listener)

Remove an event listener.

netInterceptor.removeAllListeners(event)

Removes all event listeners for the given event. Or when called without the event argument, remove all listeners for all events.

kRemote

import { kRemote } from "@gr2m/net-interceptor";
requestSocket[kRemote]; // response socket

kRemote is a symbol that can be used to access the response socket from the request socket when handling intercepted requests.

How it works

Once started, netInterceptor hooks itself into the net.connect and the tls.connect methods

When a socket is intercepted, we

  1. we create a mock net/TLS socket
  2. emit the connect event with the mock socket
  3. if bypass() was called in the connect event listener, we let the socket continue unintercepted
  4. if bypass() was not called
    1. we create another mock socket for the response and emit the "connection" event
    2. we emit connect on both mock sockets

and then emit a record event with the request, response, requestBody and responseBody options.

Contributing

See CONTRIBUTING.md

Credits

@gr2m/net-interceptor is built upon code and concepts from moll/node-mitm by Andri Möll. Monday Calendar supported that engineering work.

Gregor Martynus removed all http(s)-related code and made its focus on intercepting connections that use the lower-level net and tls modules.

License

LGPL