instant-api

Like instant soup but API. JSON-RPC2 flavor with Websockets and HTTP.

Usage no npm install needed!

<script type="module">
  import instantApi from 'https://cdn.skypack.dev/instant-api';
</script>

README

Instant API

Like instant soup but API. JSON-RPC2 flavor with Websockets and HTTP.

💾 Install

npm i -s instant-api

📡 Expose task 'makeSoup' at port 3000

var tasks = {
  'makeSoup': require('./tasks/make-soup')
}
require('instant-api')(tasks ,{ port: process.env.PORT || 3000 })

🤖 tasks/make-soup.js

module.exports = function (rpc) {

  // use parameters
  console.log(rpc.params)

  // return result
  rpc.sendResult('Done. Enjoy!')

  // return param error
  //rpc.sendParamsError('Missing parameter ...')

  // return custom error
  //rpc.sendError('Splash')

  // use in promise chains
  // rawQuery(query).then(rpc.sendResult).catch(rpc.sendError)

}

📣 Call task...

var message = {
  method: 'makeSoup',
  params: { size: 'medium' },
  jsonrpc: '2.0',
  id: Math.round(Math.random()*1e20)
}

// ... from a browser using HTTP
fetch('http://localhost:3000', {
  method: 'POST', body: JSON.stringify( message )
}).then(function(response){
  return response.json()
}).then(function(body){
  console.log(body.result)
}).catch(console.error)

// ... from a browser using Websockets
var ws = new WebSocket('ws://localhost:3000')
ws.onopen = function () {
  ws.send( JSON.stringify(message) )
}
ws.onmessage = function (event) {
  console.log(JSON.parse(event.data))
}

// ... from another server
// npm install --save request
require('request').post({
  url: 'http://localhost:3000',
  json: message
}, function (error, response, body) {
  if (!error && response.statusCode === 200) {
    console.log(body.result)
  } else {
    console.error(error || body)
  }
})

🚨 Cross origin settings

By default, CORS is enabled but does not permit transmitting credentials. You can specify allowed CORS domains which will also be able to send credentials:

var tasks = {
  'makeSoup': require('./tasks/make-soup')
}
require('instant-api')(tasks ,{
  port: process.env.PORT || 3000,
  corsAllowedDomains: [ 'example.org', 'test.example.org' ]
})

🕹 Run example

npm run example

Remix on Glitch