1.0.24 • Published 2 years ago

rpc-middleware v1.0.24

Weekly downloads
-
License
ISC
Repository
github
Last release
2 years ago

rpc-middleware

Live Demo: https://rpc-demo.herokuapp.com, Source Code: Click here

Why?

STOP hustle of naming endpoints points and request types (get/post/put/delete/etc) in your existing projects and simply start calling functions (you make in server) from frontend directly.

Easy to incorporate into existing projects so you can focus simply calling server functions.

Github: https://github.com/sahilrajput03/rpc-middleware-npm

Get Started

All below code is already deployed @ live demo, Source Code: Click here

On server:

Create two files: server-functions.js and server.js like below.

// File: server-function.js
module.exports.test = () => 'works!'

// string as parameter
module.exports.yoy = (message) => {
	return message + ' from server..'
}

// object as parameter
module.exports.cat = (body) => {
	const {say} = body
	return 'Cat says:' + say + '!!'
}

// multiple parameter
module.exports.love = (name1, name2) => {
	return `God loves: ${name1} and ${name2}`
}
// on error rpc send status: 400 (BAD REQUEST) and body as `err`
module.exports.rain = (name1, name2) => {
	const messg = `${name1} does not like ${name2}`
	let err = {name: 'RAIN AWAY', message: 'SUN DOWN'}
}

and

// File: server.js
const express = require('express')
const createRpcPostRoute = require('rpc-middleware')

const fns = require('./server-functions')

const PORT = 8080
const app = express()
app.use(express.json())

app.get('/', (_, res) => res.sendFile(__dirname + '/index.html'))

// This calls: `app.post(route, functionMiddleware)` internally
createRpcPostRoute('/rpc', fns, app)

// FYI: You can create multiple rpc routes for different version of an api
// createRpcPostRoute('/rpc/v2', ver2fns, app)

app.listen(PORT, () => {
	console.log('Server started on port:', PORT)
})

and thats it for the server and you may start the server by running node server.js

On frontend (react/vue/angular/vanilla/etc):

Make sure you have imported axios (or included axios via cdn), then

// STEP1: Setup RPC client
const rpc = createRpc('/rpc')

// STEP2: Call functions now (`res` is an axios response)
const res = await rpc.test()
const res = await rpc.yoy('God loves all')
const res = await rpc.cat({say: 'meoww'})
const res = await rpc.love('donald', 'pikachu')

// logging response data
console.log(res.data)

try {
	const res = await rpc.someNonExistingFunction('pokemons')
} catch (error) {
	const {name, message, status} = error
	log('CAUGHT ERROR: \n' + ['name: ' + name, 'message: ' + message, 'status: ' + status].join('\n\n'))
}

try {
	const res = await rpc.rain('Charlizard', 'Nobita')
} catch (error) {
	const {name, message, status} = error
	log('CAUGHT ERROR: \n' + ['name: ' + name, 'message: ' + message, 'status: ' + status].join('\n\n'))
}

// Utility function to create our rpc client
function createRpc(url) {
	const target = {}
	const handler = {
		get(target, prop) {
			return async (...functionParams) => {
				if (!url.endsWith('/')) {
					url = url + '/'
				}
				return await axios
					.post(`${url}${prop}`, functionParams)
					.then((response) => response.data)
					.catch((e) => {
						throw {...e.response.data, status: e.response.status}
					})
			}
		},
	}
}

Congrats if you ran all above code. Thanks for trying it out. Conside starring the https://github.com/sahilrajput03/rpc-middleware-npm repository to appreciate my works.

1.0.24

2 years ago

1.0.23

2 years ago

1.0.22

2 years ago

1.0.21

2 years ago

1.0.20

2 years ago

1.0.19

2 years ago

1.0.18

2 years ago

1.0.17

2 years ago

1.0.16

2 years ago

1.0.15

2 years ago

1.0.14

2 years ago

1.0.13

2 years ago

1.0.12

2 years ago

1.0.11

2 years ago

1.0.10

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago