[
https://issues.apache.org/jira/browse/CAMEL-23398?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen updated CAMEL-23398:
--------------------------------
Fix Version/s: 4.x
> 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
> 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)