You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Ramu (Jira)" <ji...@apache.org> on 2026/08/26 01:32:00 UTC

[jira] [Work started] (CAMEL-23398) Add QuickJS JavaScript language using QuickJS4J

     [ https://issues.apache.org/jira/browse/CAMEL-23398?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Work on CAMEL-23398 started by Ramu.
------------------------------------
> Add QuickJS JavaScript language using QuickJS4J
> -----------------------------------------------
>
>                 Key: CAMEL-23398
>                 URL: https://issues.apache.org/jira/browse/CAMEL-23398
>             Project: Camel
>          Issue Type: New Feature
>            Reporter: Federico Mariani
>            Assignee: Ramu
>            Priority: Minor
>             Fix For: 4.x
>
>
> Add a new `camel-quickjs` language module that uses [QuickJS4J|https://github.com/roastedroot/quickjs4j] as a lightweight, pure-Java JavaScript engine alternative to GraalVM Polyglot.
> QuickJS4J compiles the QuickJS engine to WebAssembly and translates it to pure Java bytecode via [Chicory|https://github.com/nicktindall/chicory], requiring no JNI or native dependencies. This makes it portable across all JVM platforms (including s390x and ppc64le where GraalVM JS is disabled), GraalVM native-image compatible, and sandboxed for secure script execution.
> Both modules coexist: {{camel-javascript}} (GraalVM, full Java interop) and {{camel-quickjs}} (pure Java, lightweight).
> *Exchange Handling Alternatives*
> QuickJS4J communicates between Java and JavaScript via JSON serialization. Unlike GraalVM's {{HostAccess.ALL}}, live Java objects (Exchange, Message, CamelContext) cannot be passed directly as bindings. There are three approaches to handle this:
> *Alternative A -- Data-only bindings:*
> Expose Exchange data as JSON-serializable values: {{body}}, {{headers}}, {{properties}}, {{exchangeId}}. Scripts can read data but cannot call methods on Exchange or Message objects. This covers the most common use cases (filtering, transforming, routing decisions based on headers/body) and is simple to implement.
> {code}
> // Works: data access
> .when().quickjs("headers.MyHeader == 'foo'")
> .transform().quickjs("body.toUpperCase()")
> // Does NOT work: method calls on Java objects
> .quickjs("exchange.getMessage().setHeader('foo', 'bar')")
> {code}
> *Alternative B -- HostRef + Builtins bridge:*
> Use QuickJS4J's {{HostRef}} mechanism and {{Builtins}} API to register Java-side host functions (e.g., {{camel.getHeader("foo")}}, {{camel.getBody()}}, {{camel.setBody(...)}}). The Exchange is kept on the Java side as an opaque reference, and JS calls named bridge functions. This preserves the ability to read/write Exchange state from scripts but adds implementation complexity.
> {code}
> // Would work with bridge functions
> .quickjs("camel.setHeader('processed', true); camel.getBody()")
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)