Google App Engine Channel API and Google DART

Recientemente he comenzado a trabajar con Google App Engine, Google DART y el Channel API. Este API permite establecer un canal de comunicación entre el servidor y el cliente. De este modo, mientras el canal esté abierto, cualquier evento que reciba el servidor lo envía a la aplicación cliente y el usuario puede ver como su aplicación se va actualizando sin necesidad de recargar ni tocar nada.

Es muy útil, por ejemplo, cuando lanzamos un proceso que corre en nuestro servidor, y el cliente debe quedar a la espera de recibir la notificación de que todo ha terminado y conocer si el resultado es positivo o negativo. Pensemos un ejemplo:

Un usuario abre su navegador, se conecta a nuestra aplciación, que le permite generar las nóminas de los empleados de la empresa. El usuario en la aplicación cliente (en este caso una web escrita en DART), rellena una serie de parámetros y pulsa Enviar. El cliente está enviando la orden de procesar y generar las nóminas de 15 empleados.

El servidor recibe la orden de ponerse a trabajar y decidimos dividir el proceso en N tareas, una tarea por cada nómina a generar. De este modo, según vayan terminando los procesos irán lanzando un mensaje de finalización al cliente.

El servidor genera 15 tareas. Según va terminando cada tarea envía un mensaje a la aplicación cliente indicando que ha terminado y si todo ha ido bien o mal.

El usuario, en la aplicación de navegador web, irá viendo como se va actualizando cada fila del proceso de generación de nóminas y el resultado de cada proceso.

Tras ver un poco en qué consiste el channel API de App Engine y como utilizarlo en nuestras aplicaciones clientes, voy a comentar un error que existía en esta librería si decides utilizarlo con DART.

Esta librería Channel API, es una librería JavaScript que recibe los mensajes del servidor, genera objetos JavaScript y luego se los pasa a DART. Al contrario el proceso es similar, el cliente genera un mensaje en un objeto DART que se traduce a objeto JavaScript y se envía al servidor.

He tenido la suerte de poder colaborar con Justin Fagnani del equipo de DART y autor de esta libería para resolver el problema. Puedes ver el hilo completo aquí:
https://groups.google.com/a/dartlang.org/forum/#!topic/misc/LNu3LacsngM

Tras revisar todo a fondo vimos que el error provenía de una mala conversión de los objetos JavaScript a objetos DART.

Básicamente debíamos hacer un stringfy de los objetos JavaScript en el fichero channel-dart.js para que DART pudiese generar objetos DART a partir de un JSON correctamente formado.

En la linea 18 del fichero channel-dart.js debes realizar este cambio:

<br />// Cambia esta linea<br />evt.initCustomEvent(type, false, false, detail);<br /><br />// Por esta otra.<br />evt.initCustomEvent(type, false, false, JSON.stringify(detail));<br />

En la linea 37 del fichero appengine_channel.dart debes realizar este cambio:

<br />// Cambia esta linea<br />Map detail = e.detail;<br /><br />// Por esta otra.<br />Map&lt;String, Object&gt; detail = JSON.parse(e.detail);<br />

Estoy muy feliz de haber podido colaborar, de haber cazado y solucionado un error tan malo que no permitía intercomunicar App Engine con DART a través del Channel API.


Google+

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s