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

@debonet/remote-promises

v1.0.2

Published

Library to add a network abstraction between calls to and fulfillment of function promises

Downloads

5

Readme

remote-promises

An ES6 library to add a network abstraction between calls to and fulfillment of function promises

Usage (typical operation)

Instead of being confined to a single application running on a single processor:

	function somePromiseFunction(){ return new Promise( ... ) }

	somePromiseFunction( args )
		.then( ... )
		.catch( ... )
		.finally( ... );

With remote-promises, we can move the handling of the function to a different process or machine.

In the typical configuration, the function is handled by a system that also acts as a server. The function is called by a system that is acts as the client. For this configuration we use the .serve() and .client() methods.

For example to move the above call to a function server called some_server, it would just require:

	function somePromiseFunction(){ return new Promise( ... ) }

	RemotePromise.serve( somePromiseFunction, 3000, { path: "somePath" } );

and from some other process/system do:

	const somePromiseFunction = RemotePromise.client( "ws://some_server:3000/somePath" );

	somePromiseFunction( args )
		.then( ... )
		.catch( ... )
		.finally( ... );

Of course remote-promises works with regular functions as well. In this case it converts them into promise functions, e.g.:

	function simple(){ return "success"; }

	RemotePromise.serve( simple, 3000, { path: "somePath" } );
	const simpleAsPromise = RemotePromise.client( "ws://some_server:3000/somePath" );

	simpleAsPromise( args )
		.then( ... )
		.catch( ... )
		.finally( ... );

Usage (flipped operation)

In most configurations, the callee is the client and the function handler is the server, but it can also be reversed.

For flipped operation the callee acts as a server, using the .marshal() methed, and the function handler acts as a network client using the .provide() method.

	function somePromiseFunction(){ return new Promise( ... ) }

	RemotePromise.provide( somePromiseFunction, "ws://some_server:3000/somePath" );	

and from some other process/system do:

	const somePromiseFunction = await RemotePromise.marshal( 3000, { path: "somePath" } );

	somePromiseFunction( args )
		.then( ... )
		.catch( ... )
		.finally( ... );

Multiple providers

In flipped operation, a server that is marshalling ( via .marshal() ) can accept multiple providers ( via .provide(). In such a case, the work is delegated in turn to provider with the lowest number of outstanding requests.

Note that there are no constraints requiring that the implementation of each function be identical, which could lead to some unanticipated effects.

Await

As with all promise returning functions, remote-promises can be used with the await construct. E.g.:

	const somePromiseFunction = await RemotePromise.marshal( 3000, { path: "somePath" } );
	
	try {
		const result = await somePromiseFunction( args );
		...
	}
	catch ( err ){
		...
	}

Closing connections

All remote-promise methods return an object with a close() method that can be used to terminate that end of the connection.

Eg:

	function somePromiseFunction(){ return new Promise( ... ) }

  const server = RemotePromise.serve( somePromiseFunction, 3000, { path: "somePath" } );
	const remoteFunction = RemotePromise.client( "ws://some_server:3000/somePath" );

	server.close();
	remoteFunction.close();

  const provider = RemotePromise.provide( somePromiseFunction, "ws://some_server:3000/somePath" );	
	const marshalledFunction = await RemotePromise.marshal( 3000, { path: "somePath" } );

	provider.close();
	marshalledFunction.close();

API

Serve

  • serve ( func, port[, options?] )
  • frpServe ( func, port[, options?] )
  • frpRunnerServer ( func[, options?] )

Offers a function for execution for clients who connect via the .client() method described below

func

a function that returns a promise ( or, equivalently, an async function ).

port

the port number on which the service should be offered

-options_

Other server options, see socket.io

-returns_

A RemotePromiseServer object, which can be closed via a close() call.

Client

  • client ( url[, options?] )
  • ffpClient ( url[, options?] )
  • ffpCallerClient ( url[, options?] )

Get a function that executes functionality offered on a server that is offering functionalty via the serve() method above.

url

A web socket url, served via the serve() method

options

Other client options, see socket.io

returns

Returns a function that returns a promise that resolves with the result of the function as executed on the system running the serve() call.

The returned function contains a close() method that can be used to disconnect the client

Provide

  • provide ( func, url[, options?] )
  • frpProvide ( func, url[, options?] )
  • frpRunnerClient ( func, url[, options?] )

Offers a function for execution to a remote server that is marshalling functionalty via the .marshal() method below

func

a function that returns a promise ( or, equivalently, an async function ).

url

A web socket url, being marshaled via the marshal() method

options

Other client options, see socket.io

returns

Returns remote-promise server that can be closed via a call to close()

Marshal

  • marshal ( port[, options?] )
  • ffpMarshal ( port[, options?] )
  • ffpCallerServer ( port[, options?] )

Opens a marshalling service for providers to offer functions for execution via the .provide() method above

port

the port number to which the service should be provided via a provide() call

options

Other server options, see socket.io

returns

Returns a function that returns a promise that resolves with the result of the function as executed on the system running the provide() call.

The returned function contains a close() method that can be used to end the marshalling service.