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

electron-cgi

v1.0.6

Published

Library to connect node applications to other apps using the stdin/stdout much like what was done in the 90s with CGI (common gateway interface)

Downloads

1,649

Readme

Electron CGI

Electron CGI is a NodeJs library (npm package: electron-cgi) that makes interacting with executables from other languages easy.

Currently there's support for .Net through the ElectronCgi.DotNet Nuget package.

Here's an example of how you can interact with a .Net application (more examples here):

In NodeJs/Electron:

const { ConnectionBuilder } = require('electron-cgi');

const connection = new ConnectionBuilder()
        .connectTo('dotnet', 'run', '--project', 'DotNetConsoleProjectWithElectronCgiDotNetNugetPackage')
        .build();

connection.onDisconnect = () => {
    console.log('Lost connection to the .Net process');
};

connection.send('greeting', 'John', (error, theGreeting) => {
    if (error) {
        console.log(error); //serialized exception from the .NET handler
        return;
    }

    console.log(theGreeting); // will print "Hello John!"
});

//alternatively use async/await, in an async function:
try{
    const greeting = await connection.send('greeting', 'John');
    console.log(greeting);
}catch (err) {
    console.log(err); //err is the serialized exception thrown in the .NET handler for the greeting request
}

connection.close();

And in the .Net Console Application:

using ElectronCgi.DotNet;

//...
static void Main(string[] args)
{
    var connection = new ConnectionBuilder()
                        .WithLogging()
                        .Build();

    // expects a request named "greeting" with a string argument and returns a string
    connection.On("greeting", (string name) =>
    {
        return $"Hello {name}!";
    });

    // wait for incoming requests
    connection.Listen();
}

How does it work?

Electron CGI establishes a "connection" with an external process. That external process must be configured to accept that connection. In the example above that's what the Listen method does.

In Node we can "send" requests (for example "greeting" with "John" as a parameter) and receive a response from the other process.

The way this communication channel is established is by using the connected process' stdin and stdout streams. This approach does not rely on starting up a web server and because of that introduces very little overhead in terms of the requests' round-trip time.

Changelog

Update version 1.0.6

  • Fix for falsy return values from request handlers on node being sent as null to .NET

Update version 1.0.3..1.0.5

  • Incorrect documentation fix
  • Re-added Connection to index.d.ts
  • Republish because of .git being in the npm package (https://github.com/npm/npm/issues/20213)

Update version 1.0.2

  • Fix for incorrect typescript definition file for connection (callbacks were missing the error parameter)

Update version 1.0.1

  • Added ability to omit parameters in .send, for example connection.send('getAlll', (err, allResults) => {...})

Update version 1.0.0

  • Alignment of the API for making requests with Node.js conventions (this is a breaking change)

    connection.send('requestId', args, (error, response) => {...})

  • Ability to use promises. If no callback is provided send returns a promise:

      try{
          const result = await connection.send('request', args);
          //use result
      }catch(error) {
          //handle error
      }
  • Errors propagate from .NET to Node.js (requires NuGet package ElectronCgi.DotNet version 1.0.1)

    • If an exception is thrown in a handler in .NET it will be serialized and sent to Node.js.
  • Arguments are now optional in connection.send (e.g. this is valid: connection.send('start'))

  • Bugfixes

Update version 0.0.5

  • Duplex: ability to send requests from both .Net and Node.js

Update version 0.0.3 and 0.0.4

  • (.Net) Ability to serve request concurrently (uses System.Threading.Tasks.DataFlow)
  • Intellisense for electron-cgi
  • .Net stderr stream is displayed in node's console (Console.Error.WriteLine in .Net is now visible)
  • Fixed logging in ElectronCgi.DotNet
  • Duplex communication (i.e. ability initiate a requests in .Net to Node):

In .Net:

var posts = await GetNewPosts();
connection.Send("new-posts", posts);

Node.js:

connection.on('new-posts', posts => {
    console.log('Received posts from Net:');
    posts.forEach(post => {
        console.log(post.title);
    });
});