JavaScript runtime for Fastly Compute@Edge

Overview

Fastly Compute@Edge JS Runtime

The JS Compute Runtime for Fastly's Compute@Edge platform provides the environment JavaScript is executed in when using the Compute@Edge JavaScript SDK.

Note: If you just want to use JavaScript on the Compute@Edge Platform, we recommend using the JavaScript Starter Kits provided by the Fastly CLI tool. For more information please see the JavaScript documentation on the Fastly Developer Hub.

Working with the JS Compute Runtime source

Note that this repository uses Git submodules, so you will need to run

git submodule update --recursive --init

to pull down or update submodules.

Building the JS Compute Runtime

To build from source, you need to ensure that the headers and object files for the SpiderMonkey JavaScript engine are available. It's recommended to download pre-built object files:

(cd c-dependencies/spidermonkey && sh download-engine.sh)

Alternatively, the engine can also be built from source using c-dependencies/spidermonkey/build-engine.sh. That should only be required if you want to modify the engine itself, however.

Once that is done, the runtime and the CLI tool for applying it to JS source code can be built using cargo:

cargo build --release

Testing

The JS Compute Runtime doesn't currently contain automated tests itself. Instead, Fastly runs an automated test suite for an internal repository for the JavaScript SDK using the runtime.

Manual testing is well supported, however. To test your changes, you can follow these steps:

  1. Build the runtime's CLI tool, see above
  2. Create a C@E service from a JS source file by running the CLI tool
  3. Test the service using Fastly's local testing server

As an example, to turn a file test.js with this source code:

addEventListener('fetch', e => {
  console.log("Hello World!");
});

into a C@E service with your build of the CLI tool, run the following command:

cargo run --release -- test.js test.wasm

Then test your service in Viceroy:

viceroy test.wasm
Comments
  • js-compute-runtime 0.2.0 potential regressions

    js-compute-runtime 0.2.0 potential regressions

    When using version 0.1.0, projects needed to polyfill URL and URLSearchParams as they were not implemented in the runtime

    In version 0.2.0 these globals are now implemented but when building a project which tries to still polyfill these features, a Wizer error is thrown:

    Error: failed to initialize JS

    Caused by: 0: the wizer.initialize function trapped 1: wasm trap: unreachable wasm backtrace:

    I confirmed this was the polyfills by commenting out this one line in my project and the project then being able to be compiled:

    globalThis.URL = require("core-js/features/url");
    

    I assume this means that the globals are currently frozen intrinsics, is this an intentional decision or should these be writable and configurable?

    opened by JakeChampion 8
  • Serialisation issue with Headers and Set-Cookie

    Serialisation issue with Headers and Set-Cookie

    When setting set-cookie headers with header.append() there can sometimes be an issue where the set-cookie header is serialised into one header which is comma seperated: image

    This is not accepted as multiple cookies by browsers, after some digging I have found that this only happens when using a Header object which is then passed as a HeaderInit object when creating a response.

    This works (creates multiple headers):

    addEventListener("fetch", (event) => {
      let r = new Response("Hello");
    
      r.headers.append("Set-Cookie", "test=1");
      r.headers.append("Set-Cookie", "test2=2");
      r.headers.append("Set-Cookie", "test3=3");
      
      event.respondWith(r)
    });
    

    This does not (single comma separated header):

    addEventListener("fetch", (event) => {
      let h = new Headers();
    
      h.append("Set-Cookie", "test=1");
      h.append("Set-Cookie", "test2=2");
      h.append("Set-Cookie", "test3=3");
      
      event.respondWith(new Response("Hello", {
        headers: h
      }))
    });
    
    opened by williamoverton 6
  • Bump @actions/github from 5.0.3 to 5.1.0 in /.github/actions/compute-sdk-test

    Bump @actions/github from 5.0.3 to 5.1.0 in /.github/actions/compute-sdk-test

    Bumps @actions/github from 5.0.3 to 5.1.0.

    Changelog

    Sourced from @​actions/github's changelog.

    5.1.0

    • Add additionalPlugins parameter to getOctokit method #1181
    • Dependency updates #1180
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies javascript 
    opened by dependabot[bot] 5
  • Throw error if specific constructors are called as plain functions

    Throw error if specific constructors are called as plain functions

    The below constructors will now throw an error if called as plain functions as per their specifications:

    • CompressionStream
    • Headers
    • Request
    • Response
    • TextDecoder
    • TextEncoder
    • TransformStream
    • URL
    • URLSearchParams

    These constructors can now only be called via new or Reflect.construct

    I wasn't sure what we want to do with the Fastly specific constructors such as CacheOverride so I have left them as-is

    opened by JakeChampion 5
  • Throw error exit code for failed compilation

    Throw error exit code for failed compilation

    If I compile a syntactically valid javascript file that is still not valid we get a wizer error. However the exit code is 0.

    Example input index.js:

    spaghetti
    

    output of js-compute-runtime --skip-pkg bin/index.js bin/main.wasm:

    Exception while evaluating JS: (new ReferenceError("spaghetti is not defined", "<stdin>", 1))
      @<stdin>:1:29
      @<stdin>:1:121
    
    Error: failed to initialize JS
    
    Caused by:
        0: the `wizer.initialize` function trapped
        1: Exited with i32 exit status 1
           wasm backtrace:
               0: 0x3d82a1 - <unknown>!<wasm function 8744>
               1: 0x3d9434 - <unknown>!<wasm function 8760>
               2: 0x1c23a - <unknown>!<wasm function 300>
               3: 0x1bfd5 - <unknown>!<wasm function 298>
               4: 0x1c554 - <unknown>!<wasm function 303>
           
    Wizer failed with status: exit status: 1
    

    This is the correct error but the status code is 0:

    ...
    Wizer failed with status: exit status: 1
     
    ➜  echo $?
    0
    

    This makes it impossible for tooling to detect build errors.

    opened by williamoverton 5
  • Improve handling of hostcall errors

    Improve handling of hostcall errors

    Added more meaningful messages to hostcall errors

    The mapping from error code number to message comes from https://docs.rs/fastly-shared/0.6.3/src/fastly_shared/lib.rs.html#35-96

    Resolves https://github.com/fastly/js-compute-runtime/issues/11

    opened by JakeChampion 5
  • WebAssembly trapped manipulating ReadableStreams

    WebAssembly trapped manipulating ReadableStreams

    Hi, Following #10, I tried to reproduce a clone response function using ReadableStream::tee(), making 2 new responses from one. The function looks like that:

    function cloneResponse(response) {
        const teedOff = response.body.tee();
        return {
            currentResponse: new Response(teedOff[0], { headers: cloneHeaders(response.headers), status: response.status }),
            newResponse: new Response(teedOff[1], { headers: cloneHeaders(response.headers), status: response.status }),
        }
    }
    

    By doing that, I can read the responses body using the ReadableStream::getReader(), they are not locked. But if I want to use the Response::json(), Response::text() or Response::arrayBuffer() instead of the reader, I get this error:

    Aug 12 15:57:25.102 ERROR request{id=0}: WebAssembly trapped: wasm trap: unreachable
    wasm backtrace:
        0: 0x5a6b - <unknown>!<wasm function 69>
        1: 0x593c - <unknown>!<wasm function 68>
        2: 0x11d6e - <unknown>!<wasm function 181>
        3: 0x129f1 - <unknown>!<wasm function 186>
        4: 0x384ca - <unknown>!<wasm function 475>
        5: 0x316ee - <unknown>!<wasm function 455>
        6: 0x299a9 - <unknown>!<wasm function 452>
        7: 0x387f9 - <unknown>!<wasm function 475>
        8: 0x3b701 - <unknown>!<wasm function 498>
        9: 0x177517 - <unknown>!<wasm function 3190>
       10: 0x96905 - <unknown>!<wasm function 1403>
       11: 0x1236ff - <unknown>!<wasm function 2376>
       12: 0x384ca - <unknown>!<wasm function 475>
       13: 0x3b701 - <unknown>!<wasm function 498>
       14: 0xa5a0e - <unknown>!<wasm function 1557>
       15: 0xfc9a5 - <unknown>!<wasm function 2121>
       16: 0x142cb - <unknown>!<wasm function 219>
       17: 0x3eb380 - <unknown>!<wasm function 8540>
       18: 0x140cf - <unknown>!<wasm function 218>
    

    Am I doing something wrong ? Thanks !

    opened by roptch 5
  • Bump typedoc from 0.21.10 to 0.23.21 in /sdk/js-compute

    Bump typedoc from 0.21.10 to 0.23.21 in /sdk/js-compute

    ⚠️ Dependabot is rebasing this PR ⚠️

    Rebasing might not happen immediately, so don't worry if this takes some time.

    Note: if you make any changes to this PR yourself, they will take precedence over the rebase.


    Bumps typedoc from 0.21.10 to 0.23.21.

    Release notes

    Sourced from typedoc's releases.

    v0.23.21

    Features

    • Added support for a catch-all wildcard in externalSymbolLinkMappings, #2102.
    • Added support for TypeScript 4.9.

    Thanks!

    v0.23.20

    Bug Fixes

    • Fixed comment discovery for @inheritDoc if inheriting from a function type alias, #2087.

    v0.23.19

    Bug Fixes

    • Fixed title link if titleLink option was not specified, #2085.

    Thanks!

    v0.23.18

    Features

    • Improved error reporting when failing to find entry points, #2080, #2082.

    Bug Fixes

    • Constructor parameter-properties will now use the @param comment for the parameter if available, #1261.
    • Fixed display of object types containing methods, #1788.
    • Fixed conversion of intrinsic string mapping types when converting without a type node, #2079.

    v0.23.17

    Features

    • Added titleLink, navigationLinks and sidebarLinks options to add additional links to the rendered output, #1830.
    • Added sourceLinkTemplate option to allow more flexible specification of remote urls. Deprecated now redundant gitRevision detection starting with https?:// introduced in v0.23.16, #2068.

    Thanks!

    ... (truncated)

    Changelog

    Sourced from typedoc's changelog.

    v0.23.21 (2022-11-14)

    Features

    • Added support for a catch-all wildcard in externalSymbolLinkMappings, #2102.
    • Added support for TypeScript 4.9.

    Thanks!

    v0.23.20 (2022-11-03)

    Bug Fixes

    • Fixed comment discovery for @inheritDoc if inheriting from a function type alias, #2087.

    v0.23.19 (2022-10-28)

    Bug Fixes

    • Fixed title link if titleLink option was not specified, #2085.

    Thanks!

    v0.23.18 (2022-10-23)

    Features

    • Improved error reporting when failing to find entry points, #2080, #2082.

    Bug Fixes

    • Constructor parameter-properties will now use the @param comment for the parameter if available, #1261.
    • Fixed display of object types containing methods, #1788.
    • Fixed conversion of intrinsic string mapping types when converting without a type node, #2079.

    v0.23.17 (2022-10-18)

    Features

    • Added titleLink, navigationLinks and sidebarLinks options to add additional links to the rendered output, #1830.
    • Added sourceLinkTemplate option to allow more flexible specification of remote urls. Deprecated now redundant gitRevision detection starting with https?:// introduced in v0.23.16, #2068.

    Thanks!

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies javascript 
    opened by dependabot[bot] 4
  • Bump env_logger from 0.9.1 to 0.9.3

    Bump env_logger from 0.9.1 to 0.9.3

    Bumps env_logger from 0.9.1 to 0.9.3.

    Release notes

    Sourced from env_logger's releases.

    v0.9.3

    Fix a regression from v0.9.2 where env_logger would fail to compile with the termcolor feature turned off.

    v0.9.2

    Fix and un-deprecate Target::Pipe, which was basically not working at all before and deprecated in 0.9.1.

    Commits
    • 3da1104 Release version 0.9.3
    • 21f421c Make ci package build on 1.41 again
    • bdae47c Fix build breakage in 0.9.2 without termcolor feature
    • 555cbc2 Release version 0.9.2
    • c89f719 Fix clippy lints
    • 84b701d Change Pipe to always use the test (uncolored) semantics
    • 9edf205 Revert "Deprecate Target::Pipe since it is broken"
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies rust 
    opened by dependabot[bot] 4
  • Can't call functions of classes derived from built-in classes

    Can't call functions of classes derived from built-in classes

    Consider the following code that works as expected:

    class Base {
      fn() { return 'fn'; }
    }
    class Derived extends Base {
      constructor() {
        super();
        this.foo = () => { return 'foo'; };
      }
      bar() { return 'bar'; }
      get baz() { return 'baz'; }
    }
    
    const obj = new Derived();
    console.log(Object.getOwnPropertyNames(Base.prototype));    // constructor,fn
    console.log(Object.getOwnPropertyNames(Derived.prototype)); // constructor,bar,baz
    console.log(Object.getOwnPropertyNames(obj));               // foo
    console.log(obj.fn());                                      // fn
    console.log(obj.foo());                                     // foo
    console.log(obj.bar());                                     // bar
    console.log(obj.baz);                                       // baz
    console.log(obj.foo === undefined);                         // false
    console.log(obj.bar === undefined);                         // false
    console.log(obj.baz === undefined);                         // false
    

    When you try to do the same thing by extending builtins:

    class MyRequest extends Request {
      constructor(input, init) {
        super(input, init);
        this.foo = () => { return 'foo'; };
      }
      bar() { return 'bar'; }
      get baz() { return 'baz'; }
    }
    
    const request = new MyRequest('https://www.google.com/');
    console.log(Object.getOwnPropertyNames(Request.prototype));   // constructor,method,url,version,headers,body,bodyUsed,arrayBuffer,json,text,setCacheOverride
    console.log(Object.getOwnPropertyNames(MyRequest.prototype)); // ** constructor,bar,baz
    console.log(Object.getOwnPropertyNames(request));             // foo
    console.log(request.url);                                     // https://www.google.com/
    console.log(request.foo());                                   // foo
    console.log(request.bar());                                   // ** Error: request.bar is not a function
    console.log(request.baz);                                     // ** undefined
    console.log(request.foo === undefined);                       // false
    console.log(request.bar === undefined);                       // ** true
    console.log(request.baz === undefined);                       // ** true
    

    Look at the logs relating to bar and baz (marked with asterisks above). You can see that the two methods (bar method and baz getter) added through the class definition are added to the prototype but have undefined values. Note that the property added in the constructor (foo) does work, however.

    The same problem happens whether we are extending Request, Response, Headers, URL, URLSearchParams, etc. so I believe it is just for the builtins, and I believe it's a bug.

    opened by harmony7 4
  • Missing some build instructions on README?

    Missing some build instructions on README?

    Missing some instructions on README for the build?

    I encountered errors during the following build commands on README.md:

    $ git submodule update --recursive --init
    $ (cd c-dependencies/spidermonkey && sh download-engine.sh)
    $ cargo build --release // ERROR
    

    Not sure if this is common for other people, but I share what I've done, for the record.

    • Install cbindgen https://github.com/eqrion/cbindgen#quick-start
    • Install wasi-sdk and export the sdk path https://github.com/WebAssembly/wasi-sdk#install $ export WASI_CXX=${WASI_SDK_PATH}/bin/clang++
    • Modify Makefile
      -ifdef DEBUG
      +DEBUG ?= false
      +ifneq ($(DEBUG), false)
      

      *cargo exports DEBUG=false when running build.rs with --release flag

    Environment:

    • hash: dbd9386
    • platform: M1 Mac (darwin, arm64)
    opened by shqld 4
  • component: --component option for outputting a component

    component: --component option for outputting a component

    This adds a new --component flag to the runtime CLI, that when provided will output a full component binary for the runtime instead of a core Wasm binary.

    The component binary uses the latest version of the wasi-preview2 adapter to adapt the WASI imports, fetched from the releases of https://github.com/bytecodealliance/preview2-prototyping.

    Component generation along with WASI 1 -> WASI preview 2 adaption is only after Wizering so that we retain full compat with the current core Wasm Wizer process.

    The WASI adapter is applied using a build of wit component provided by js-component-tools providing wasm-tools for JS, so js-component-tools is introduced as a dependency of the runtime in the process (~20MB, no dependencies).

    Strictly speaking, this completes the task of generating a js-compute-runtime Wasm component.

    Whether this should be merged is a question of if we want to introduce the extra js-component-tools dependency for non component installers. It might not be such an issue, or we could maintain this branch.

    Review / feedback / thoughts / comments very welcome.

    opened by guybedford 0
  • Verify that it's better to not perform shrinking GC after evaluating the script

    Verify that it's better to not perform shrinking GC after evaluating the script

    After executing the script, we perform a non-shrinking GC. Testing indicated that shrinking here caused more writes to 4kb pages than a normal GC, but let's verify that this is the case.

    performance 
    opened by elliottt 0
  • Check if increasing the empty chunk count before GC makes sense

    Check if increasing the empty chunk count before GC makes sense

    Currently we have the following line commented out during initialization, and we should check to see if it's worth uncommenting:

    JS_SetGCParameter(cx, JSGC_MAX_EMPTY_CHUNK_COUNT, 10);
    
    performance 
    opened by elliottt 0
  • Verify that shrinking GC is correct before executing the script during initialization

    Verify that shrinking GC is correct before executing the script during initialization

    Verify that it's better to perform a shrinking GC during initialization before running the script, as testing indicated. Running a shrinking GC caused fewer 4kb pages to be written to when processing a request, which suggests that memory was less fragmented as a result.

    performance 
    opened by elliottt 0
Releases(v1.0.1)
Owner
Fastly
Fastly
Window.js is an open-source Javascript runtime for desktop graphics programming.

Window.js Window.js is an open-source Javascript runtime for desktop graphics programming. It is documented at windowjs.org. Introduction Window.js pr

Window.js 2.2k Dec 31, 2022
GPU 3D signed distance field generator, written with DirectX 11 compute shader

GPU SDF Generator GPU 3D signed distance field generator, written with DirectX 11 compute shader Building git clone --recursive https://github.com/Air

Z Guan 30 Dec 13, 2022
A python library to run metal compute kernels on MacOS

metalcompute for Python A python library to run metal compute kernels on MacOS Usage Example execution from M1-based Mac running MacOS 12.0: > ./build

Andrew Baldwin 21 Nov 7, 2022
DirectX 11 library that provides convenient access to compute-based triangle filtering (CTF)

AMD GeometryFX The GeometryFX library provides convenient access to compute-based triangle filtering (CTF), which improves triangle throughput by filt

GPUOpen Effects 218 Dec 15, 2022
EdgeTX is the cutting edge of OpenTx

Welcome to EdgeTX! The cutting edge open-source firmware for your R/C radio! About EdgeTX EdgeTX is the cutting edge of OpenTX. It is the place where

null 830 Jan 9, 2023
ESP32 + Arducam Mini 2MP Plus Edge Impulse Example

Minimal example code for running an Edge Impulse image classification network with the ESP32, ArduCAM, and PlatformIO

David Schwarz 6 Apr 23, 2022
Qnicorn: a cutting edge version of unicorn-engine.org

Qnicorn Engine Qnicorn is a cutting edge and community-driven version of unicorn-engine. Qnicorn offers the features below: All features that Unicorn2

qiling.io 4 Sep 10, 2022
Semantic Edge Detection with Diverse Deep Supervision

Semantic Edge Detection with Diverse Deep Supervision This repository contains the code for our IJCV paper: "Semantic Edge Detection with Diverse Deep

Yun Liu 13 Oct 7, 2022
Cloud-native high-performance edge/middle/service proxy

Cloud-native high-performance edge/middle/service proxy Envoy is hosted by the Cloud Native Computing Foundation (CNCF). If you are a company that wan

Envoy Proxy - CNCF 21.2k Jan 9, 2023
Ccd - Edge first cd replacement tool for Windows cmd shell.

Cursorial CD Cursorial CD, or ccd for short, is a cd replacement for Window's cmd shell. Unlike cd, it operates on an edge first search, so you can qu

Scott Seligman 5 Feb 2, 2022
An all-in-one Spartan Edge Accelerator shield implementation for the gbaHD

gbaHD AIO Shield This is a Spartan Edge Accelerator shield which implements all the hardware connections needed for zwenergy's gbaHD, no wires require

null 46 Dec 25, 2022
BOF implementation of chlonium tool to dump Chrome/Edge Masterkey

ChromiumKeyDump BOF implementation of Chlonium tool to dump Chrome/Edge Masterkey. Forked from https://github.com/crypt0p3g/bof-collection Setup How t

null 2 Feb 12, 2022
Elk is a tiny embeddable JavaScript engine that implements a small but usable subset of ES6

Elk is a tiny embeddable JavaScript engine that implements a small but usable subset of ES6. It is designed for microcontroller development. Instead of writing firmware code in C/C++, Elk allows to develop in JavaScript. Another use case is providing customers with a secure, protected scripting environment for product customisation.

Cesanta Software 1.5k Jan 8, 2023
LLVM bindings for Node.js/JavaScript/TypeScript

llvm-bindings LLVM bindings for Node.js/JavaScript/TypeScript Supported OS macOS Ubuntu Windows Supported LLVM methods listed in the TypeScript defini

ApsarasX 250 Dec 18, 2022
Android Bindings for QuickJS, A fine little javascript engine.

quickjs-android quickjs-android 是 QuickJS JavaScript 引擎的 Android 接口框架,整体基于面向对象设计,提供了自动GC功能,使用简单。armeabi-v7a 的大小仅 350KB,是 Google V8 不错的替代品,启动速度比 V8 快,内

Wiki 121 Dec 28, 2022
A simple library that helps Android developers to execute JavaScript code from Android native side easily without using Webview.

AndroidJSModule A simple library that helps Android developers to execute JavaScript code from Android native side easily without using Webview. Insta

Hung Nguyen 5 May 24, 2022
Header-only ECMAScript (JavaScript) compatible regular expression engine

SRELL (std::regex-like library) is a regular expression template library for C++ and has native support for UTF-8, UTF-16, and UTF-32. This is up-to-d

Dmitry Atamanov 4 Mar 11, 2022
A secure authentication system written in modern javascript and C++ 17

A fully fledged authentication system written in modern JavaScript and C++ 17. Written with the MEVN stack (MySQL, Express.js, Vue.js, Node.js) by a pro leet h4x0r.

vmexit 25 Nov 29, 2022
Convert Javascript/TypeScript to C

Convert Javascript/TypeScript to C

Andrei Markeev 1.1k Jan 4, 2023