• Stars
    star
    168
  • Rank 225,507 (Top 5 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 6 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Inline C++ with Node.js

NPM version NPM download GitHub issues GitHub license

inline-cpp

Inline C++ with Node.js

Works on: Linux, Windows, MacOS

Purpose:

  • Simplify native module prototyping. Enable native code in Node.js REPL.
  • Allow JS scripts to generate C++ code and run it dynamically.
  • Popularise NAPI usage and node-addon-api.
  • This is NOT intended to be used as native module replacement!
    If you want to publish a native module, please package it as required by node-gyp.

Installation

npm install --save inline-cpp

or install it globally (it works with Node.js REPL):

npm install -g inline-cpp

Usage

// test.js
const compile = require('inline-cpp');

const hello = compile `
  String func(const CallbackInfo& info) {
    return String::New(info.Env(), "Hello world from C++!");
  }
`

console.log(hello())

Now run it:

➜ node test.js
Hello world from C++!

The first time you run the script, it takes longer to execute. For each inline block of code, a native module will be generated, compiled with node-gyp and loaded dynamically. If the module Init function is not defined, it is generated as well.
The next time you run the script, it will reuse previously generated module, so it will run instantly (unless you change the inline C++ code).

For more C++ code examples, see node-addon-api
For more inline-cpp API examples, see examples on github

API

inline-cpp supports several invocation methods.

Pass some code as string to build it with default options.

const InlineCPP = require('inline-cpp');
InlineCPP('code')

You can also pass code using tagged template syntax.

InlineCPP `code`

Pass an object to create a new compiler with custom options.
Options will get passed to node-gyp target.

const customCompiler = InlineCPP({ ... })

If the code block only contains a single function, the compiler returns the function.
If it contains multiple functions or custom Init, the module itself is returned.

Disclaimer

This is just a prototype. I created this to check the general concept.
You're welcome to contribute! Here are some ideas:

  • Parse/Find all functions in the block of code, add them to exports
  • Use node-gyp directly, instead of invoking node node-gyp.js
  • Improve error handling/reporting
  • Create advanced usage examples
  • Cleanup unused modules from cache periodically
  • ...

Debugging

You can enable debug output by setting env. variable: DEBUG=inline-cpp

More Repositories

1

TinyGSM

A small Arduino library for GSM modules, that just works
C++
1,935
star
2

StandWithUkraine

#StandWithUkraine banner and related documents
JavaScript
1,394
star
3

awesome-wasm-tools

😎 A curated list of awesome, language-agnostic WebAssembly tools
453
star
4

miband-js

MiBand 2 JS library for Node.JS and HTML5 (WebBluetooth)
JavaScript
342
star
5

ViperIDE

An innovative MicroPython / CircuitPython IDE for Web and Mobile
Python
341
star
6

blynk-library-python

Blynk library for Python. Works with Python 2, Python 3, MicroPython.
Python
284
star
7

muon

µON - a compact and simple binary object notation
Python
244
star
8

blynk-library-js

Blynk library for JS. Works with Browsers, Node.js, Espruino.
JavaScript
215
star
9

wasm2native

Turn WASI apps into native executables
C
117
star
10

Preferences

Preferences library for Arduino, ESP8266, RP2040, Particle, Realtek Ameba
C
69
star
11

blynk-library-particle

Blynk library for Particle Core, Photon, Electon, P0, P1, RedBear Duo etc.
C++
46
star
12

wasm3_dino_rpi_pico

WebAssembly Dino game for PPi Pico
WebAssembly
45
star
13

interp

Interpreter experiment. Testing dispatch methods: Switching, Direct/Indirect Threaded Code, Tail-Calls and Inlining
C
43
star
14

Wasm3_RGB_Lamp

Animating an RGB lamp, using WebAssembly!
C++
42
star
15

blynk-library-lua

Blynk library for Lua. Works with Lua 5.1+, LuaJIT, NodeMCU.
Lua
41
star
16

w600tool

Firmware upload tool for Winner Micro W600 & W601 WiFi
Python
38
star
17

StreamDebugger

StreamDebugger allows easier debugging of Serial-based communication on Arduino, like AT command interface in ESP8266, SIM800, SIM900, and other GSM modules
C++
35
star
18

randomart

Generative WebGL Random Art renderer
JavaScript
31
star
19

ESP32_PPPoS

PPP over Serial for ESP32
C++
27
star
20

serial-server

Simple serial port server
JavaScript
26
star
21

GY80

Arduino/Processing sketch for GY80 9DOF AHRS
Arduino
22
star
22

UNO-R4-WiFi-freedom

UNO R4 WiFi set free!
C++
20
star
23

JIDL

Simple, flexible, JSON-based Interface Definition Language
Python
18
star
24

blynk-library-openwrt

OpenWRT packages for Blynk C++ library
Makefile
18
star
25

blynk-pc-remote

This app allows you to control your PC remotely using the Blynk App.
JavaScript
13
star
26

espruino-await

async/await example for Espruino
JavaScript
11
star
27

OpenWRT-Espruino-packages

Espruino package for OpenWRT
Makefile
10
star
28

blynk-tools

Tools for working with Blynk IoT Platform
JavaScript
8
star
29

blynk-library-ez-connect

Blynk example for Marvell® EZ-Connect™ MW302
C++
6
star
30

pypp

Python PreProcessor
Python
6
star
31

wasm2mpy

Running WebAssembly as a native MicroPython module
C
4
star
32

vshymanskyy

4
star
33

aiodns

A small async DNS client for MicroPython
Python
4
star
34

ESP_UNO_R4

C
4
star
35

TurtlOS

educational os project
C++
3
star
36

blynk-community-map

JavaScript
3
star
37

xplat

C++ cross-platform abstraction library
C++
1
star
38

vshymanskyy.github.io

1
star
39

bronyk

bronyk robot control system
C++
1
star
40

lbm-micropython

LoRa Basic Modem integration for MicroPython
C
1
star
41

kad

kademlia overlay network implementation
C++
1
star