У меня есть карта в Scala / Java, которую я хочу видеть в Javascript, работающей на движке graal.js.
case class Thing() {
def foo() { println("FOO!") } // just to see if this is callable from js (it is)
val m = Map("foo" -> "bar", "one" -> 1)
val d1 = m
val d2 = m.asJava
val d3 = toGraalValue(m)
val d4 = MapProxyObject(m.map { case (k, v) => (k.toString, toGraalValue(v)) })
def toGraalValue(a: Any): Value =
a match {
case s: List[_] => Value.asValue(ListProxyArray(s.map(toGraalValue).toArray))
case m: Map[_, _] => Value.asValue(MapProxyObject(m.map { case (k, v) => (k.toString, toGraalValue(v)) }))
case _ => Value.asValue(a)
}
}
Позже, функция Javascript в graal.js вызывается с помощью:
inv.invokeFunction(bindFn, args: _*)
Где bindFn - это скомпилированная функция (ниже), а args - это 1-элементный список, содержащий мой объект Thing.
Javascript:
function(thing) {
console.log(thing.d1);
console.log(thing.d2);
console.log(thing.d3);
console.log(thing.d4);
console.log(thing.foo());
}
Выход из объекта.foo () сработал, но все остальные разрешены в 'Foreign {}' в Javascript.Ни у одного из них нет значений на карте.
Как получить данные карты, созданные на JVM, видимые в коде JavaScript graal.js (желательно изначально в Javascript)?