# Eclipse Vert.x
Tal como deberia ya estar claro, Vert.x es el IO y el modelo por defecto de programacion usado en ES4X. Sin embargo hay algunas buenas mejoras del standard Vert.x APIs (opens new window).
# APIs Generadas
Todas las APIs publicadas a npm con el namespace @vertx y @reactiverse son generadas en codigo. Generacion de codigo
es una ayuda que permite que estas APIs sean utilizadas por usuarios JavaScript en un formato que sea familiar sin
comprometer el rendimiento de la aplicacion.
Todas las interacciones con la JVM occuren sobre el objecto Java. La parte mas importance es mover una clase JVM a JS:
// Importa la clase java.lang.Math para utilizarla
// como un tipo JS en el script
const Math = Java.type('javalang.Math');
Podriamos hacer esto con todos los APIs pero hay varios limites que ES4X intenta resolver:
- Propenso a error - Necesitas saber los APIs de Java y tipos exactos para utilizarlos en JavaScript.
- Imposible definir dependencias - Si necesitas utilizar APIs de otros modulos, importar de clase en clase no puede definir dependencia entre ellas.
- Sin soporte IDE - El desarrollador necesitara conocer el API antes de usarlo y el IDE no ofrecera asistencia.
El generador ES4X soluciona esto creando un modulo npm para cada modulo vertx y definicion de tipos en cada clase.
Cada modulo tedra los siguientes archivos:
package.json- Define las dependencias entre modulosindex.js- interfaz API commonjsindex.mjs- Interfaz API ESMindex.d.ts- Definicion completa de tipos para la interfaz APIenum.js- Enumeraciones commonjs APIenum.mjs- Enumeraciones ESM APIenum.d.ts- Definicion completa de tipos para las enumeraciones APIoptions.js- Objetos de datos commonjs APIoptions.mjs- Objectos de datos ESM APIoptions.d.ts- Definicion completa de tipos para los objectos de datos
Todos los archivos index simplificaran la importancion de clases a JVM con reemplazos, por ejemplo:
// sin ES4X
const Router = Java.type('io.vertx.ext.web.Router');
// con ES4X
import { Router } from '@vertx/web';
Este pequeño cambio permite que los IDEs ayuden con el desarrollo y que los gestores de paquetes descarguen las dependencias necesarias.
Finalmente todos los archivos .d.ts avisaran a los IDEs sobre los tipos y datan ayuda de autocompletacion de codigo.
# promise/future
Vert.x tiene 2 tipos:
io.vertx.core.Futureio.vertx.core.Promise
Extrañamente, una promesa Vert.x no es lo mismo que un futuro en JavaScript. Una promesa Vert.x es la parte escribible de
un futuro Vert.x. En terminos de JavaScript:
- Vert.x
Future=== JavaScriptPromise Like (Thenable) - Vert.x
Promise=== JavaScriptExecutor Function
# async/await
async/await esta disponible sin necesidad de compilacion en GraalVM. ES4X añade una caracteristica mas al tipo
Future de Vert.x. Los APIs que devuelven un Future de Vert.x se pueden usar como thenable, esto significa que:
// Usando Java API
vertx.createHttpServer()
.listen(0)
.onSuccess(server => {
console.log('Servidor listo!')
})
.onFailure(err => {
console.log('Fallo en el inicio del servidor!')
});
Puede ser usado como Thenable:
try {
let server = await vertx
.createHttpServer()
.listen(0);
console.log('Servidor listo!');
} catch (err) {
console.log('Fallo en el inicio del servidor!')
}
:::Consejo
async/await funciona hasta con bucles, lo que hace trabajar con codigo asincronico muy facil, incluso mezclando codigo JS y Java.
:::
# Conversion de Tipos
Vert.x esta escrito en Java, sin embargo en JavaScript no tenemos que preocuparnos de los tipos tanto como en Java. ES4X
hace algunas conversiones de forma automatica por defecto:
| Java | TypeScript |
|---|---|
| void | void |
| boolean | boolean |
| byte | number |
| short | number |
| int | number |
| long | number |
| float | number |
| double | number |
| char | string |
| boolean[] | boolean[] |
| byte[] | number[] |
| short[] | number[] |
| int[] | number[] |
| long[] | number[] |
| float[] | number[] |
| double[] | number[] |
| char[] | string[] |
| java.lang.Void | void |
| java.lang.Object | any |
| java.lang.Boolean | boolean |
| java.lang.Double | number |
| java.lang.Float | number |
| java.lang.Integer | number |
| java.lang.Long | number |
| java.lang.Short | number |
| java.lang.Char | string |
| java.lang.String | string |
| java.lang.CharSequence | string |
| java.lang.Boolean[] | boolean[] |
| java.lang.Double[] | number[] |
| java.lang.Float[] | number[] |
| java.lang.Integer[] | number[] |
| java.lang.Long[] | number[] |
| java.lang.Short[] | number[] |
| java.lang.Char[] | string[] |
| java.lang.String[] | string[] |
| java.lang.CharSequence[] | string[] |
| java.lang.Object[] | any[] |
| java.lang.Iterable | any[] |
| java.util.function.BiConsumer | <T extends any, U extends any>(arg0: T, arg1: U) => void |
| java.util.function.BiFunction | <T extends any, U extends any, R extends any>(arg0: T, arg1: U) => R |
| java.util.function.BinaryOperator | <T extends any>(arg0: T, arg1: T) => T |
| java.util.function.BiPredicate | <T extends any, U extends any>(arg0: T, arg1: U) => boolean |
| java.util.function.Consumer | <T extends any>(arg0: T) => void |
| java.util.function.Function | <T extends any, R extends any>(arg0: T) => R |
| java.util.function.Predicate | <T extends any>(arg0: T) => boolean |
| java.util.function.Supplier | <T extends any>() => T |
| java.util.function.UnaryOperator | <T extends any>(arg0: T) => T |
| java.time.Instant | Date |
| java.time.LocalDate | Date |
| java.time.LocalDateTime | Date |
| java.time.ZonedDateTime | Date |
| java.lang.Iterable<T> | <T>[] |
| java.util.Collection<T> | <T>[] |
| java.util.List<T> | <T>[] |
| java.util.Map<K, V> | { [key: <K>]: <V> } |