Buscar

Limpiar filtro
Anuncio
Esther Sanchez · 21 oct, 2022

Nuevo vídeo: Despliegues en Kubernetes con Alta Disponibilidad

¡Hola Comunidad! Hemos grabado el webinar que hicimos ayer y lo hemos subido al canal de YouTube de la Comunidad de Desarrolladores en español. Si os perdisteis el webinar o lo queréis volver a ver con más detalle, ya está disponible la grabación! Alberto Fuentes mostró cómo desplegar arquitecturas de InterSystems IRIS con Alta Disponibilidad utilizando Kubernetes y el IKO (InterSystems Kubernetes Operator), utilizó servicios de AWS (Amazon Web Services) para realizar ejemplos de despliegue, comentó distintas arquitecturas de alta disponibilidad que se pueden montar fácilmente.... ¡y muchas cosas más! Por eso, si utilizáis Kubernetes... ¡no os perdáis el vídeo! ⏯ Despliegues en Kubernetes con Alta Disponibilidad Además de este webinar, en el canal de YouTube de la Comunidad podéis ver otro webinar sobre Kubernetes, que es un buen punto de partida para conocer esta plataforma open source: ⏯ Webinar 7: Sacando el máximo rendimiento a Kubernetes Por cierto, en las listas de reproducción del canal de YouTube de la Comunidad de Desarrolladores en español podéis ver todos los webinars que hemos realizado (¡ya llevamos diecinueve!), varios tutoriales, trucos, demos... ¡Echadle un ojo y dadle al play! ▶️
Anuncio
Esther Sanchez · 14 feb, 2023

5ª Mesa Redonda de la Comunidad: Inteligencia Artificial / Machine Learning

¡Hola Comunidad! Os convocamos a una nueva mesa redonda de la Comunidad. Muchos nos habíais pedido una mesa redonda sobre Inteligencia Artificial y Machine Learning, y estamos encantados de poder ofrecerla. Serán 60 minutos de animada charla (en inglés) y también habrá una breve demo. En esta ocasión el experto invitado es @Thomas.Dyar, Product Specialist - Machine Learning, en InterSystems. 📅 Fecha: 28 de febrero (martes) 🕑 Hora: 3:00 PM (CET) ➡️ Registraos a través de este reto en Global Masters. Os enviaremos una invitación de calendario por email. Si tenéis alguna pregunta sobre el tema, podéis escribirla en los comentarios de esta publicación. Y la pregunta se responderá durante la mesa redonda.Si alguno de vosotros no pertenecéis a Global Masters, el Programa de Fidelización de la Comunidad de Desarrolladores, podéis daros de alta usando vuestras credenciales SSO de InterSystems. ¡Recordad que hoy es la Mesa Redonda sobre Inteligencia Artificial y Machine Learning! Podéis inscribiros a través de este reto en Global Masters. Y si tenéis alguna duda sobre el tema y queréis hacer una pregunta, podéis escribirla en un comentario en esta publicación y la pregunta se responderá durante la mesa redonda. ¡Gracias!
Anuncio
Sergio Farago · 22 abr, 2025

Programa de Acceso Anticipado: mejoras en OAuth2

InterSystems IRIS 2025.2.0 introduce varias funcionalidades para mejorar la experiencia de configuración de OAuth2. - OAuth2 es ahora un tipo de autenticación nativo y puede activarse fácilmente para vuestros servicios y aplicaciones web. Anteriormente, OAuth2 era un tipo de autenticación delegada. - Ahora podéis crear servidores de recursos con la nueva clase OAuth2.ResourceServer, lo que simplifica considerablemente la configuración. Antes, los servidores de recursos eran instancias de OAuth2.Client. - La clase OAuth2.ResourceServer proporciona un autenticador de ejemplo para determinar los permisos de usuario que, en configuraciones simples, no requiere código personalizado (anteriormente se necesitaba una implementación personalizada de ZAUTHENTICATE). Este autenticador sencillo se puede extender y personalizar según vuestras necesidades. OAuth2.ResourceServer admite múltiples audiencias. - Ahora podéis usar JDBC y ODBC para autenticaros en InterSystems IRIS con tokens de acceso. Nos interesa conocer vuestra opinión sobre estos nuevos cambios y si funcionan como esperáis. Podéis descargar el software y la nueva documentación de estas funcionalidades usando este Link: https://evaluation.intersystems.com/Eval/early-access/OAuth2 Para enviar comentarios, usad la página del EAP y haced clic en el botón de feedback en la parte derecha.
Anuncio
Esther Sanchez · 3 ago, 2021

Problema Técnico Global

¡Hola Comunidad! Estamos experimentando algunos problemas técnicos y hemos sufrido un corte de servicio en la red corporativa. Por este motivo, podéis tener problemas al iniciar sesión en nuestros sitios web globales, incluyendo la Comunidad de Desarrolladores. Nuestros especialistas técnicos están trabajando para resolver las incidencias y esperamos restablecer pronto el funcionamiento normal. Para seguir informados, podéis entrar en el Servidor de Discord de la Comunidad de Desarrolladores de InterSystems 👈 ¡Gracias por vuestra paciencia! Lamentamos los inconvenientes que esto os pueda ocasionar.

#Valor clave

1 Publicaciones0 Seguidores

#Analítica convergente

1 Publicaciones0 Seguidores
Artículo
Luis Angel Pérez Ramos · 14 dic, 2022

Cómo subir y descargar archivos a través de HTTP

En este artículo, mostraré cómo subir y descargar archivos vía http desde los productos de InterSystems. A menudo desde la comunidad surgen preguntas sobre como trabajar con archivos a través de http y normalmente os emplazamos a revisar el proyecto FileServer, que muestra la subida/descarga de archivos. Pero me gustaría hablar un poco más de cómo podemos enviar y recibir archivos desde los productos de InterSystems. Cómo descargar un archivo Si tenéis un archivo en un sistema de archivos y conocéis su ruta, podéis enviarlo vía REST o en el contexto de CSP llamando a este método: ClassMethod serve(name As %String) As %Status { #dim sc As %Status = $$$OK #dim %response As %CSP.Response kill %request.Data set %request.Data("STREAMOID",1)= ##class(%CSP.StreamServer).Encrypt(##class(%CSP.StreamServer).GetOidForFile(name)) if ##class(%CSP.StreamServer).OnPreHTTP() { set %response.Headers("Content-Disposition")="attachment; filename*=UTF-8''" _ ##class(%CSP.Page).EscapeURL(##class(%File).GetFilename(name), "UTF8") set sc = ##class(%CSP.StreamServer).OnPage() } quit sc } Si tenéis un stream en lugar de un nombre de fichero, podéis reemplazar ##class(%CSP.StreamServer).GetOidForFile(name) por stream.%Oid() ¡Y eso es todo! En un navegador, el usuario verá un cuadro de diálogo de descarga. Cómo subir un archivo En el lado del cliente (asumiendo el uso de JS/HTML), cread un input de tipo file: <input id="myFile" type="file"> y escribid un código JavaScript para enviar solicitudes POST al servidor (depende del framework): function FileLoad(){ var formData = new FormData(); formData.append("file", document.getElementById("myFile").files[0]); var xhr = new XMLHttpRequest(); // Upload data to server xhr.open("POST", "/rest/path", true); xhr.send(formData); xhr.onload = function(e) { if (this.status == 200) { // everything is OK } else { alert(this.status + ' ' + this.statusText); } }; } En el lado del servidor, podéis obtener el stream de una forma tan sencilla como la siguiente #dim %request As %CSP.Request #dim stream As %CSP.BinaryStream set stream = %request.GetMimeData("file") Después, podéis guardar este stream a un archvo, en una base de datos o simplemente procesarlo sin guardarlo. Enlaces de interéss FileServer MIME Form data WebDAV implementation para InterSystems Este artículo ha sido etiquetado como "Mejores prácticas" ("Best practices"). Los artículos con la etiqueta "Mejores prácticas" incluyen recomendaciones sobre cómo desarrollar, probar, implementar y administrar mejor las soluciones de InterSystems.
Anuncio
Esther Sanchez · 4 oct, 2019

Nuevo vídeo: Desarrollo multi-modelo

¡Hola a tod@s! Tenemos un nuevo vídeo en el Canal de YouTube de la Comunidad de Desarrolladores en inglés: Desarrollo multi-modelo El vídeo muestra los distintos modelos de datos que se pueden usar con InterSystems IRIS y cómo permiten crear excelentes aplicaciones. Además, repasa las diferentes tendencias en la industria, en las que el enfoque multi-modelo se está imponiendo sobre la persistencia políglota. Ponentes: @Jeffrey.Fried, Director of Product Management, y @Alain.Houf, Senior Sales Engineer ¡Esperamos que os resulte útil!
Artículo
Robert Cemper · 7 feb, 2022

GlobalToJSON-embedded-Python

Este es un paquete para exportar un Global a un archivo de objeto JSON y volver a crearlo recargando desde este archivo embeddedPython se refiere a las nuevas tecnologías disponibles. Debe entenderse como un ejercicio de aprendizaje decómo manejar las diferentes interfaces. Solo los nodos de Global que contienen datos se presentan en el archivo JSON generado. Exportamos este Global Este es el contenido del archivo. El Loader relacionado crea exactamente el mismo Global El ejemplo es una clase en la que se mezclan Intersystems Object Script y Embedded Python.Así que es un código híbrido. Intersystems Object Script se usa para iterar a través de Global con $QUERY().También escribe datos con una estructura $LISTBUILD(). El objeto JSON corresponde así al modelo Eficiente. Embedded Python se utiliza para escribir y leer el archivo de datos. Y también se genera el objeto JSONy su resolución se realiza con Embedded Python. Una tarea especial es la conversión correcta de una estructura de subíndice convencional (sub,sub,sub,..) en una lista de Python [sub,sub,sub, ...]. Esta lista de Python es obligatoria para cualquier acceso directoa los nodos de Global.¡Y al nodo superior del Global, que por definición no tiene subíndice, se accede con esta lista especial [None]! Puede ser beneficioso mirar el código en detalle. Vídeo (en inglés)
Anuncio
Esther Sanchez · 31 ago, 2022

Recompensa en Global Masters: Te ayudamos a organizar un webinar

¡Hola Comunidad! ¿Sabíais que en Global Masters se pueden conseguir recompensas para las empresas? Hoy os explicamos una de ellas: ⚡️ Organiza un webinar con el soporte de InterSystems ⚡️ Si estáis interesados en organizar un webinar profesional para desarrolladores sobre vuestra solución/herramienta y vuestros servicios... Podéis canjear este premio por 3 000 puntos y os ayudamos a organizarlo. Qué ofrecemos: Promoción del webinar en la Comunidad de Desarrolladores y en sus redes sociales; Página de registro al webinar; Prueba antes del evento y soporte técnico durante el webinar. Requisitos: La aplicación de la empresa interesada debe funcionar en InterSystems IRIS/IRIS for Health o ser una herramienta para gestionar/desarrollar con IRIS. Los webinars son una excelente forma de dar a conocer productos y servicios para generar interés y nuevos contactos. Así que... si siempre quisisteis hacer un webinar pero no sabéis por donde empezar... aprovechad esta recompensa en Global Masters! Si aún no sois miembro de Global Masters, nuestra plataforma de fidelización, podéis registraros ahora mismo! En esta publicación os explicamos todos los detalles sobre Global Masters. Más información sobre Global Masters: Descripción de los niveles de Global Masters Descripción de las insignias de Global Masters y cómo conseguirlas
Artículo
Ricardo Paiva · 2 dic, 2022

Herramienta de migración de datos - Part III: de DB2 a IRIS

Esta es la tercera parte de una serie de artículos sobre migración desde las principales bases de datos del mercado a InterSystems IRIS. En esta parte, explicaré los pasos para migrar desde DB2. Como describí en los anteriores artículos, actualmente hay varias opciones para hacer la migración. Sin embargo, las dos opciones más populares incluyen el uso de DBeaver (https://openexchange.intersystems.com/package/DBeaver) o SQLGateway. Explicaremos la primera opción aquí. La segunda opción fue explicada por @Robert.Cemper1003 en un excelente artículo: Migración de base de datos usando SQLgateway. Obtención de los datos de muestra para el proceso de migración En Github es posible descargar un proyecto de docker-compose para crear y ejecutar dos bases de datos: Source Database (Base de datos de origen): Instancia Docker de la base de datos DB2 con una base de datos de muestra. Target Database (Base de datos objetivo): Instancia Docker de InterSystems IRIS con un esquema preparado para recibir la base de datos de origen. Para obtener la muestra y ejecutarla, sigue estos pasos:1. Ve al repositorio git: https://github.com/yurimarx/migration-db2-iris.2. Clona el proyecto: git clone https://github.com/yurimarx/migration-db2-iris.git. 3. Ve a la carpeta del proyecto migration-db2-iris.4. Realiza el build: docker-compose build.5. Ejecuta los contenedores: docker-compose up -d.6. Comprueba en el escritorio de tu docker con las instancias si todo está bien: Sobre los datos que se van a migrar En las dos primeras partes, trabajamos con una base de datos de ventas. Sin embargo, DB2, cuando se instala, viene con una base de datos de muestra (es una base de datos de ventas más completa), y será la que usemos en este artículo. Los datos que se van a migrar se representan aquí: Por lo tanto, el proceso de migración de DB2 a IRIS incluirá 22 tablas.El destino de la migración será el esquema dc_test que se encuentra dentro del namespace USER en la base de datos de InterSystems IRIS. Herramienta open-source para migrar de DB2 a IRIS: DBeaver DBeaver es una herramienta de bases de datos para conectar, crear, descartar, seleccionar, actualizar y eliminar objetos de datos en las principales bases de datos del mercado. Se puede descargar en Open Exchange: https://openexchange.intersystems.com/package/DBeaver. Y sigue las instrucciones de instalación para tener este magnífico producto en tu portátil o equipo de sobremesa.DBeaver puede utilizarse para migrar datos entre conexiones de bases de datos, incluso si son de diferentes fabricantes y versiones. Cómo conectar las bases de datos de origen y destino mediante DBeaver Ahora vamos a establecer las conexiones de bases de datos que se van a migrar.Para establecer la conexión de DB2 a DBeaver:1. Antes de conectar DB2 por primera vez, espera de 5 a 10 minutos. Este es el tiempo que el script de DB2 necesita para construir la base de datos de muestra después de la creación de la instancia de Docker.2. En DBeaver, ve a File > New.3. Selecciona Database Connection y haz clic en Next: 4. Haz clic en la pestaña SQL > DB2 LUW y luego en Next: 5. Completa los campos de conexión a DB2 en la pestaña Main, como se muestra en esta imagen : ● Host: localhost● Port: 50000● Database: sample● Username: db2inst1● Password: password● Haz clic en Finish. Para configurar la conexión de InterSystems IRIS a DBeaver:1. En DBeaver, ve a File > New.2. Selecciona Database Connection y haz clic en Next: 3. Haz clic en la pestaña SQL > InterSystems IRIS y luego en Next: 4. Si DBeaver solicita descargar el driver de InterSystems IRIS, haz clic en Sí u Ok.5. Completa los campos de conexión de InterSystems IRIS como se muestra en esta imagen: ● Host: localhost● Database/Schema: user● Username: _SYSTEM● Password: SYS● Haz clic en Test Connection y en Finish Las conexiones (db y user) están disponibles en Database Navigator: Realizar la migración Para realizar la migración hay que seguir estos pasos:1. Expande la conexión de muestra (DB2 connection) > public y selecciona todas las tablas. Haz clic derecho con el ratón sobre las tablas seleccionadas y elige Export Data, así: 2. Selecciona Database, como se ve en esta imagen, y haz clic en Next: 3. Haz clic en el botón Choose: 4. Selecciona dc_test y haz clic en Ok. 5. Ahora será necesario cambiar algunas configuraciones de tipos de datos para la base de datos de destino, porque IRIS y DB2 utilizan diferentes tipos de datos para almacenar valores XML.6. Expande la tabla DB2INST1.CATALOG, selecciona el campo CATALOG (es un tipo de campo XML) y haz clic en Columns… 7. Cambia el Target Type de LONGVARBINARY a VARCHAR(10000) y haz clic en Ok. 8. Repite el proceso con las tablas a. CUSTOMER, campos INFO y HISTORY.b. PRODUCT, campo DESCRIPTION.c. SUPPLIERS, campo ADDR.d. PURCHASEORDER, campo PORDER. 9. Ahora, con los Target Data Types cambiados, haz clic en Next. 10. Establece el Fetch size en 1000000 y haz clic en Next. 11. Acepta los valores predeterminados de Data load settings y haz clic en Next. 12. En Confirm haz clic en Proceed. 13. Ahora podrás ver en el Navegador de bases de datos todas las tablas DB2 que se encuentran dentro del esquema de InterSystems IRIS dc_test El proceso de migración es muy sencillo en el caso de las tablas, pero en el caso de las vistas, funciones, triggers y procedimientos almacenados, será necesario reescribir el código fuente SQL utilizando ObjectScript o SQL.
Anuncio
Esther Sanchez · 30 jun, 2020

Nuevo vídeo: IntegratedML - Predicción de readmisiones de pacientes

¡Hola Comunidad! Os traemos un nuevo vídeo, disponible en el canal de YouTube de la Comunidad de Desarrolladores en inglés sobre el módulo IntegratedML: ⏯ IntegratedML: Predicción de readmisiones de pacientes El vídeo muestra cómo IntegratedML puede usarse para hacer predicciones basándose en los datos de una tabla, directamente en el entorno SQL de InterSystems IRIS; en este ejemplo, se utilizan datos de pacientes para predecir sus readmisiones. Para saber más, podéis echar un vistazo a esta serie de recursos para IntegratedML. Esperamos que os resulte útil 👍🏼
Anuncio
Esther Sanchez · 23 nov, 2020

Nuevo vídeo: Demo de ZPMshow

¡Hola Comunidad! Os traemos un nuevo vídeo, grabado por Robert Cemper y disponible en el canal de YouTube de la Comunidad de Desarrolladores en inglés: ⏯ ZPMshow Demo El vídeo es una demo de ZPMshow – un asistente para registrar, instalar y desinstalar InterSystems Package Manager (ZPM). ⬇️ ZPMshow en Open Exchange Para cualquier duda o consulta, escribid por favor a Robert a robert.cemper@chello o con un Mensaje Directo en la Comunidad. ¡Un fuerte aplauso a Robert! 👏🏼 Y esperamos que os resulte útil
Pregunta
Kurro Lopez · 14 mar, 2023

Error al instalar ZPM

Buenas, Estoy intentando instalar en una nueva instancia de IRIS el ZPM para poder importar paquetes de utilidades en nuestro servidor de desarrollo. Al importar el fichero zpm-0.5.3.xml me está dando este error. ¿Alguien puede ayudar? Gracias Hola Kurro, Has visto esta issue https://github.com/intersystems/ipm/issues/367 no se si es un error "falso" en tu caso Saludos El primero error me lo da cuando instalo el ZPM, y si intento incluir algun paquete me devuelve el mismo error pero no se instala nada
Artículo
Ricardo Paiva · 6 dic, 2019

Tutorial de WebSockets

¡Hola Comunidad! La mayor parte de las comunicaciones servidor-cliente en la web se basan en una estructura de solicitud y respuesta. El cliente envía una solicitud al servidor y el servidor responde a esta solicitud. El protocolo WebSocket ofrece un canal bidireccional de comunicación entre un servidor y un cliente, lo que permite a los servidores enviar mensajes a los clientes sin antes haber recibido una solicitud. Por más información sobre el protocolo WebSocket y su implementación en InterSystems IRIS, vea los siguientes enlaces: WebSocket protocol WebSockets in InterSystems IRIS documentation Este tutorial es una actualización del tutorial rápido "Asynchronous Websockets -- a quick tutorial" para Caché 2016.2+ e InterSystems IRIS 2018.1+. Funcionamiento asíncrono vs síncrono En InterSystems IRIS, una conexión WebSocket puede implementarse de forma síncrona o asíncrona. El tipo de funcionamiento de la conexión WebSocket entre el cliente y el servidor está determinada por la propiedad “SharedConnection” de la clase %CSP.WebSocket. SharedConnection=1 : funcionamiento asíncrono SharedConnection=0: funcionamiento síncrono Una conexión WebSocket entre un cliente y un servidor basado en InterSystems IRIS incluye una conexión entre la instancia de InterSystems IRIS y la Puerta de enlace web. En la forma de funcionamiento síncrona de WebSocket, la conexión usa un canal privado. En el funcionamiento asíncrono de WebSocket, un grupo de clientes WebSocket comparten un conjunto de conexiones entre la instancia de InterSystems IRIS y la Puerta de enlace web. La ventaja de la implementación asíncrona de WebSockets se hace más notoria cuando uno tiene varios clientes que se conectan al mismo servidor, ya que esta implementación no requiere que cada cliente cuente con una conexión exclusiva entre la Puerta de enlace web y la instancia de InterSystems IRIS.En este tutorial implementaré WebSockets de forma asíncrona. Por lo tanto, todas las ventanas de chat abiertas comparten un conjunto de conexiones entre la Puerta de enlace web y la instancia de InterSystems IRIS que aloja la clase de servidor de WebSocket. Resumen de la aplicación de chat El "hola mundo" de WebSockets es una aplicación de chat en la que el usuario puede enviar mensajes que se transmiten a todos los usuarios que hayan iniciado sesión en la aplicación. En este tutorial, los componentes de la aplicación de chat incluyen: Servidor: implementado en una clase que extiende a %CSP.WebSocket Cliente: implementado por una página CSP La implementación de esta aplicación de chat logrará lo siguiente: Los usuarios podrán transmitir mensajes a todas las ventanas de chat abiertas a la vez (broadcast) Los usuarios conectados aparecerán en la lista de usuarios conectados ("Online Users") de todas las ventanas de chat abiertas Los usuarios podrán cambiar su nombre de usuario con solo escribir un mensaje que comience con la palabra clave "alias" y este mensaje no se transmitirá, pero actualizará la lista de usuarios conectados Cuando los usuarios cierren su ventana de chat, se eliminarán de la lista de usuarios conectados Para ver el código fuente de la aplicación de chat, visite este repositorio de GitHub. El cliente El lado cliente de nuestra aplicación de chat lo implementa una página CSP que contiene la información de estilo de la ventana de chat, la declaración de la conexión WebSocket, los eventos y métodos de WebSocket que manejan la comunicación hacia y desde el servidor y las funciones de ayuda que empaquetan los mensajes enviados al servidor y procesan los mensajes entrantes.Primero analizaremos cómo la aplicación inicia la conexión WebSocket usando una biblioteca de WebSocket para Javascript. ws = new WebSocket(((window.location.protocol === "https:")? "wss:":"ws:") + "//"+ window.location.host + "/csp/user/Chat.Server.cls"); new crea una nueva instancia de la clase WebSocket. Esto abre una conexión de WebSocket al servidor usando el protocolo "wss" (indica el uso de TLS para el canal de comunicación de WebSocket) o el "ws". El servidor queda determinado por el número de puerto de servidor web y el nombre de host de la instancia que define la clase Chat.Server (esta información está incluida en la variable window.location.host. El nombre de nuestra clase (Chat.Server.cls) está incluido en la URI de apertura del WebSocket como una solicitud GET del recurso en el servidor.El evento ws.onopen se dispara cuando la conexión de WebSocket se establece con éxito, y pasa del estado connecting (conectando) a open (abierta). ws.onopen = function(event){ document.getElementById("headline").innerHTML = "CHAT - CONNECTED"; }; Este evento actualiza el encabezado de la ventana de chat de forma de indicar que el cliente y el servidor están conectados. Envío de mensajes La acción de que un usuario envíe un mensaje dispara la función send (enviar). Esta función sirve como envoltorio del método ws.send, que contiene las mecánicas para enviar el mensaje al servidor sobre una conexión WebSocket. function send() { var line=$("#inputline").val(); if (line.substr(0,5)=="alias"){ alias=line.split(" ")[1]; if (alias==""){ alias="default"; } var data = {} data.User = alias ws.send(JSON.stringify(data)); } else { var msg=btoa(line); var data={}; data.Message=msg; data.Author=alias; if (ws && msg!="") { ws.send(JSON.stringify(data)); } } $("#inputline").val(""); } send empaqueta la información a enviar al servidor en un objeto JSON, para lo cual define pares de clave/valor de acuerdo con el tipo de información a enviar (actualización de alias o mensaje general). btoa traduce el contenido de un mensaje general a una cadena de texto ASCII con cifrado de base 64. Recepción de mensajes Cuando el cliente recibe un mensaje del servidor, se dispara el evento ws.onmessage. ws.onmessage = function(event) { var d=JSON.parse(event.data); if (d.Type=="Chat") { $("#chat").append(wrapmessage(d)); $("#chatdiv").animate({ scrollTop: $('#chatdiv').prop("scrollHeight")}, 1000); } else if(d.Type=="userlist") { var ul = document.getElementById("userlist"); while(ul.firstChild){ul.removeChild(ul.firstChild)}; $("#userlist").append(wrapuser(d.Users)); } else if(d.Type=="Status"){ document.getElementById("headline").innerHTML = "CHAT - connected - "+d.WSID; } }; Dependiendo del tipo de mensaje recibido por el cliente (“Chat”, “userlist” o “status”), el evento onmessage llama a wrapmessage o wrapuser para poblar las secciones apropiadas de la ventana de chat con los datos entrantes. Si el mensaje entrante es una actualización de estado, el encabezado de estado de la ventana de chat se actualiza con el ID de WebSocket, lo que define la conexión WebSocket bidireccional asociada con la ventana de chat. Componentes adicionales del cliente Un error en la comunicación entre el cliente y el servidor dispara el método onerror de WebSocket, que emite un alerta para notificarnos del error y actualiza el encabezado de estado de la página. ws.onerror = function(event) { document.GetElementById("headline").innerHTML = "CHAT - error"; alert("Received error"); }; Cuando la conexión WebSocket entre el cliente y el servidor se cierra, el método onclose se dispara y actualiza el encabezado de estado. ws.onclose = function(event) { ws = null; document.getElementById("headline").innerHTML = "CHAT - disconnected"; } El servidor El lado servidor de la aplicación de chat es implementado por la clase Chat.Server, que extiende a %CSP.WebSocket. Nuestra clase de servidor hereda varias propiedades y métodos de %CSP.WebSocket, algunas de las cuales analizaré a continuación. Chat.Server también implementa métodos personalizados para procesar mensajes provenientes de, y transmitir mensajes hacia, los clientes. Antes de iniciar el servidor OnPreServer() se ejecuta antes de crearse el WebSocket y se hereda de la clase %CSP.WebSocket. Method OnPreServer() As %Status { set ..SharedConnection=1 if (..WebSocketID '= ""){ set ^Chat.WebSocketConnections(..WebSocketID)="" } else { set ^Chat.Errors($INCREMENT(^Chat.Errors),"no websocketid defined")=$HOROLOG } Quit $$$OK } Este método establece en 1 el parámetro de clase SharedConnection, lo que indica que nuestra conexión WebSocket será asíncrona y soportada por múltiples procesos que definen las conexiones entre la instancia de InterSystems IRIS y la puerta de enlace web. El parámetro SharedConnection solo se puede modificar en OnPreServer(). OnPreServer() también almacena el ID de WebSocket asociado con el cliente en la global ^Chat.WebSocketConnections. El método Server El método Server() contiene el cuerpo de lógica principal ejecutado por el servidor. Method Server() As %Status { do ..StatusUpdate(..WebSocketID) for { set data=..Read(.size,.sc,1) if ($$$ISERR(sc)){ if ($$$GETERRORCODE(sc)=$$$CSPWebSocketTimeout) { //$$$DEBUG("no data") } if ($$$GETERRORCODE(sc)=$$$CSPWebSocketClosed){ kill ^Chat.WebSocketConnections(..WebSocketID) do ..RemoveUser($g(^Chat.Users(..WebSocketID))) kill ^Chat.Users(..WebSocketID) quit // Client closed WebSocket } } else{ if data["User"{ do ..AddUser(data,..WebSocketID) } else { set mid=$INCREMENT(^Chat.Messages) set ^Chat.Messages(mid)=data do ..ProcessMessage(mid) } } } Quit $$$OK } Este método lee los mensajes entrantes desde el cliente (usando el método`Read de la clase %CSP.WebSockets), agrega los objetos JSON recibidos al global ^Chat.Messages y llama a ProcessMessage() para reenviar el mensaje a todos los demás clientes de chat conectados. Cuando un usuario cierra su ventana de chat (lo que finaliza la conexión WebSocket al servidor), la llamada del método Server() a Read devuelve un código de error que se evalúa en la macro $$$CSPWebSocketClosed y el método procede a manejar el cierre de forma acorde. Procesamiento y distribución de mensajes ProcessMessage() agrega metadatos al mensaje de chat entrante y llama a SendData(), al que le pasa el mensaje como parámetro. ClassMethod ProcessMessage(mid As %String) { set msg = ##class(%DynamicObject).%FromJSON($GET(^Chat.Messages(mid))) set msg.Type="Chat" set msg.Sent=$ZDATETIME($HOROLOG,3) do ..SendData(msg) } ProcessMessage() recupera el mensaje con formato JSON desde el global ^Chat.Messages y lo convierte en un objeto de InterSystems IRIS usando el método %FromJSON de la clase %DynamicObject. Esto nos permite editar los datos fácilmente antes de reenviar el mensaje a todos los clientes de chat conectados. Agregamos un atributo `Type` (tipo) con el valor “Chat,” que el cliente usará para determinar qué hacer con el mensaje entrante. SendData() envía el mensaje a todos los demás clientes de chat conectados. ClassMethod SendData(data As %DynamicObject) { set c = "" for { set c = $order(^Chat.WebSocketConnections(c)) if c="" Quit set ws = ..%New() set sc = ws.OpenServer(c) if $$$ISERR(sc) { do ..HandleError(c,"open") } set sc = ws.Write(data.%ToJSON()) if $$$ISERR(sc) { do ..HandleError(c,"write") } } } SendData() vuelve a convertir el objeto de InterSystems IRIS en una cadena JSON (data.%ToJSON()) y hace un envío push del mensaje a todos los clientes del chat. SendData() recibe el ID de WebSocket ID asociado a cada conexión cliente-servidor desde el global ^Chat.WebSocketConnections y usa el ID para abrir una conexión WebSocket mediante el método OpenServer de la clase %CSP.WebSocket. Para hacer esto podemos usar el método OpenServer, porque nuestras conexiones WebSocket son asíncronas: tomamos uno del conjunto compartido existente de procesos InterSystems IRIS-Puerta de enlace web y le asignamos el ID de WebSocket que identifica la conexión del servidor a un cliente de chat específico. Finalmente, el método Write() de %CSP.WebSocket hace un envío push al cliente de la representación del mensaje como cadena JSON. Conclusión Esta aplicación de chat demuestra cómo establecer conexiones WebSocket entre un cliente y un servidor alojado en InterSystems IRIS. Para leer más sobre el protocolo y su implementación en InterSystems IRIS, siga los enlaces que dejé en la introducción.