1.0.1 • Published 7 years ago

node2go v1.0.1

Weekly downloads
1
License
MIT
Repository
-
Last release
7 years ago

Node2Go

Description

This is the JavaScript part of the library. Go counterpart: node2go-go.

Node2Go is an easy way to call predefined Go functions from NodeJS with json data going back and forth. Im aware of the fact, that there's a library similar to this one on Github. It's called gonode. I just wanted to write one myself, for fun mostly.

Features

  • ES6 ready
  • async execution
  • JSON format communication
  • no dependencies besides babel (ES6 modules only)
  • simple API - not yet documented in this file

To be continued...

Example

Also found in the example directory

/**
 * It's a pretty naive example, of course Go's recursive fibonacci will be
 * faster than Node's one.
 *
 * It's more of a general presentation of how to use this library.
 */

/**
 * Import the Client
 */
import GoClient from '../index'

async function main() {

  /**
   *
   * @description Create the client instance. The only required param is the
   * execPath to a Go binary.
   * @type {Client}
   */
  let go = new GoClient({execPath: '../go/bin/fibonacci'})

  try {

    /**
     *
     * @description start - spawn the child process, connect to it and start
     * listening for incoming messages. Remember to catch potential errors.
     */
    await go.start()
    console.log('Spawned, connected to socket, ready to read and write.')

    let res = await Promise.all([
      time('NodeJS', fibonacci, n),

      /**
       * @description normally it looks as simple as:
       * await go.call('fibonacci', {n})
       */
      time('Go', go.call.bind(go), 'fibonacci', {n})
    ])

    console.log(JSON.stringify(res, null, 2))

    /**
     * @description Remember to stop the client at some point. Killing the
     * master process also kills the child, but this is the graceful way.
     */
    go.stop()

  } catch(err) {
    console.log(err)
  }
}

main()

/**
 *
 * @type {number} - the fibonacci sequence will be calculated for this number
 */
const n = 42

/**
 *
 * @description just the usual recursive fibonacci sequence algorithm
 * @param {number} n
 * @returns {number}
 */
function fibonacci(n) {
  return !n ? n : n <= 2 ? 1 : fibonacci(n-2) + fibonacci(n - 1)
}

/**
 *
 * @description measure the time the passed function took to complete
 * @param {function} fn
 * @param {string} label
 * @param {*} args
 * @returns {{label: {string}, res: *, time: string}}
 */
async function time(label, fn, ...args) {
  let start = Date.now()
  let res = await Promise.resolve(fn(...args))
  return {label, res, time: `${((Date.now() - start) / 1e3).toFixed(3)}s`}
}