Desatando los Proxies de Objetos: Construyendo Envoltorios Tipo-Seguros para Cualquier Cosa

Rate this content
Bookmark

Tal vez hayas o no hayas oído hablar de los proxies de objetos antes, pero ¿alguna vez has entendido cómo usarlos? ¿Cuál es el caso de uso real de un proxy de objeto? En esta charla, haremos una inmersión profunda en los proxies de objetos, comprendiendo cómo funcionan y los tipos de cosas que puedes construir utilizando ellos. Construiremos envoltorios de alto nivel para bibliotecas existentes y aprenderemos cómo envolverlos de manera tipo-segura.

FAQ

Los proxies de objetos son middleware para tus objetos, actuando como un envoltorio alrededor de tu objeto que te permite controlar la entrada y salida de datos cuando un usuario intenta acceder a un método o propiedad.

Un caso de uso común de los proxies de objetos es controlar el acceso a los datos, realizando validación de entrada o implementando control de acceso en objetos con propiedades privilegiadas. También se utilizan para agregar registros de acceso y manejar respuestas diferidas o condicionales.

Prisma utiliza proxies de objetos para generar tipos para todas tus tablas y aplicarlos a un proxy de objeto. Esto permite a Prisma realizar llamadas a la red y acceder a la base de datos de manera dinámica cuando se accede a una propiedad utilizando el método de punto.

TRPC es un ejemplo de cómo se pueden utilizar los proxies de objetos para realizar llamadas de procedimientos remotos (RPC). Utiliza proxies para transpilar las llamadas a consultas en llamadas de red que se ejecutan en el backend y devuelven resultados en el frontend.

En un servidor Fastify, puedes simular un proxy de objeto mediante la creación de un punto de acceso que acepte nombres de procedimiento y parámetros, los aplique a un procedimiento y devuelva la respuesta. Esto simula el comportamiento de un proxy de objeto manejando llamadas de método.

Las principales propiedades que acepta un proxy de objeto incluyen 'get', para interceptar accesos a propiedades; 'has', para verificar si una propiedad existe; y 'apply', que es una trampa para llamadas a métodos en el proxy de objeto.

Se puede mejorar el rendimiento utilizando técnicas como el almacenamiento en caché sobre los proxies de objetos, lo que permite que las llamadas a objetos sean más rápidas al reducir la necesidad de recalcular o reobtener datos ya solicitados anteriormente.

Akash Joshi
Akash Joshi
16 min
21 Sep, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Los proxies de objetos son middleware para objetos que permiten controlar la entrada y salida. Tienen varios casos de uso, como controlar el acceso a datos, agregar registros y manejar respuestas. Implementar proxies de objetos implica transpilar llamadas en solicitudes de red y manejar el acceso a propiedades y llamadas a métodos. Manejar trampas y errores de proxies de objetos implica falsificar la estructura del objeto, registrar objetos y propiedades objetivo y resolver errores. Realizar llamadas a API con proxies de objetos implica definir el tipo correcto, realizar llamadas al backend y envolver los métodos para devolver promesas. Los proxies de objetos se utilizan ampliamente en bibliotecas ORM y RPC y se deben explorar y experimentar.

1. Introducción a los Proxies de Objetos

Short description:

Voy a hablar sobre cómo desatar los proxies de objetos, construyendo envoltorios seguros por tipo para cualquier cosa. Los proxies de objetos son middleware para tus objetos que te permiten controlar la entrada y salida. Tienen varios casos de uso como controlar el acceso a los datos, agregar registros y manejar respuestas. Prisma y PRPC son ejemplos de frameworks que utilizan proxies de objetos para acceder a bases de datos y habilitar llamadas de métodos transparentes.

Hola chicos, mi nombre es Akash Joshi. Soy un ingeniero de software en SIGTECH y hoy voy a hablar sobre cómo desatar los proxies de objetos, construyendo envoltorios seguros por tipo para cualquier cosa. Los proxies de objetos son una herramienta increíblemente útil pero poco explorada que se utiliza ampliamente en todas las bibliotecas que usamos en nuestro día a día. Así que voy a explicar cómo funcionan, qué son y cómo puedes usarlos también.

Entonces, ¿qué son los proxies de objetos? Los proxies de objetos son básicamente middleware para tus objetos. Así que piensa en ellos como un envoltorio alrededor de tu objeto con el que puedes controlar qué entrada llega al objeto y qué devuelves del objeto cuando un usuario intenta acceder a un método o una propiedad. Entonces, ¿cuáles son algunos de los casos de uso que vemos con los proxies de objetos en la vida real? Uno de los primeros casos de uso que se nos ocurre es controlar el acceso a los datos. Por ejemplo, realizar validación de entrada o implementar una capa de control de acceso en cualquier tipo de objeto que pueda contener propiedades privilegiadas. Por ejemplo, en un banco, si quieres crear un objeto que contenga los datos del usuario, en función de si un usuario o uno de tus desarrolladores tiene acceso a esa propiedad o no, puedes realizar validación de entrada en ella. Entonces, si el usuario o el desarrollador tiene acceso a esa propiedad, entonces la devuelves, de lo contrario puedes devolver un error o lo que quieras hacer en su lugar.

De manera similar, puedes agregar registros a tus objetos a través de los proxies de objetos. Por ejemplo, si un usuario intenta acceder repetidamente a datos no autorizados, o si simplemente quieres tener un registro de todas las actividades que tus desarrolladores están realizando en cualquier objeto privilegiado, entonces puedes agregar registros a través de los proxies de objetos. Todos los accesos se registran en uno de tus registros de acceso. Pero lo más importante, para lo que usamos los proxies de objetos es el manejo de respuestas. Esto puede implicar devolver algo diferente en función de lo que el usuario proporcione o cargar en memoria de forma diferida ciertos objetos. Por ejemplo, siguiendo con el caso de uso del usuario. Digamos que tenemos un objeto que contiene los detalles bancarios de un usuario, como su historial de direcciones y su historial de transacciones, entre otras cosas. Pero no quieres obtener todo esto en tiempo de ejecución. Entonces, cada vez que alguien intenta acceder a su historial de direcciones, hacemos una llamada a la API de direcciones para obtener todos esos datos y luego los devolvemos como resultado. Así que desde el lado del desarrollador, parece que hiciste una llamada a una propiedad, como user.address. Pero en el backend, en realidad se realiza una llamada a la API. Y también puedes implementar almacenamiento en caché y otras cosas encima de esto para hacer que tus llamadas a objetos sean más rápidas.

En la práctica, los proxies de objetos son utilizados por Prisma. ¿Alguna vez te has preguntado cómo Prisma sabe cuáles son todas tus tablas y cómo puede acceder a todas ellas en tiempo de ejecución, aunque en realidad no estén presentes en su código fuente? Lo que hacen es generar los tipos para todas tus tablas y luego los aplican a un proxy de objeto. Así que cada vez que accedes a una propiedad utilizando el método de punto, como prisma.analytics, prisma.user, prisma.posts, lo que realmente hace es realizar una llamada a la red a través de los proxies de objeto para acceder a la base de datos real y luego obtener esos resultados y devolverlos a tu cliente. Por supuesto, no está todo codificado en el código base de Prisma, sino que se genera en tiempo de ejecución a través de TypeScript y luego los proxies de objetos se encargan del resto. De manera similar, PRPC funciona con un concepto similar donde te permite realizar llamadas a objetos y llamadas a métodos desde tu frontend a tu backend de manera bastante transparente. También utilizan proxies de objetos. Exponen un objeto enrutador en el backend y exponen sus tipos y luego utilizan esos tipos en el frontend.

2. Implementando Proxies de Objetos

Short description:

La proxyización real ocurre en el frontend donde cualquier llamada a una de sus consultas es transpilada por el proxy de objeto en una llamada de red. Vamos a implementar una versión simple de la biblioteca TRPC y explicar cómo funcionan los proxies de objetos. En el servidor, tenemos un servidor Fastify con una ruta que acepta un nombre de procedimiento y parámetros, los aplica al procedimiento y devuelve la respuesta. El objeto API proporcionado por el desarrollador contiene las APIs expuestas. En el lado del cliente, definimos un proxy de objeto para acceder a propiedades y realizar llamadas a métodos. Utilizamos las propiedades get, has y apply del proxy para manejar el acceso a propiedades y las llamadas a métodos.

Entonces, la proxyización real ocurre en el frontend donde cualquier llamada a una de sus consultas es realmente transpilada por el proxy de objeto en una llamada de red y luego la llamada de red se ejecuta en el backend para devolverte el resultado en el frontend. Así que lo que vamos a hacer ahora es implementar una versión muy simple de la biblioteca TRPC o intentar implementar un poco de RPC al backend nosotros mismos utilizando proxies de objetos. También voy a explicar cómo funcionan los proxies de objetos. Esto solo implica un poco de código. En primer lugar, veamos cómo se ve nuestro servidor. Este es un servidor Fastify muy simple. Si vas a la página de documentación de Fastify, esto es similar a lo que verás en la página principal. De hecho, esto es lo que he copiado de allí. La única ruta que he agregado aquí es /RPC. Acepta un nombre de procedimiento y un conjunto de parámetros para ese procedimiento. Luego, analiza esto a esta cadena de datos y luego aplica esos parámetros a ese procedimiento y luego devuelve la respuesta al frontend.

¿De dónde obtenemos el procedimiento real? Digamos que tenemos un objeto API que el desarrollador proporciona al servidor y este objeto API contiene todas las APIs que el desarrollador realmente quiere exponer al cliente. En este caso, estamos exponiendo hello, que simplemente devuelve world, y luego otro método llamado sum, que devuelve la suma de dos números. Y observa cómo hemos definido correctamente los tipos aquí. Esto se debe a que vamos a usar las propiedades de TypeScript para pasar ese tipo también al cliente.

En el lado del cliente, lo que vamos a hacer ahora es definir un proxy de objeto muy simple. Echa un vistazo al método principal aquí donde voy a definir algunas líneas de código que intentan acceder a algunas propiedades del proxy de objeto y tratan de obtener los resultados de ello. El primero es que intentamos destruir una propiedad llamada hello en un objeto que aún no existe. Luego verificamos dos propiedades para ver si existen en el objeto y por último intentamos hacer llamadas a métodos en el proxy de objeto y luego mostramos el resultado de ello en la consola. Así que definamos rápidamente nuestro proxy de objeto aquí. La sintaxis para definir proxies de objetos es usar un nuevo proxy para definirlos. El primer parámetro que toma es el objeto objetivo en el que quieres construirlo. La forma estándar sería usar un envoltorio sobre un objeto existente. En este caso, vamos a usar solo las propiedades del envoltorio, por lo que paso un objeto vacío.

A continuación, vamos a ver todas las propiedades que acepta un proxy. Principalmente son get, has y apply. Estas son las propiedades en las que te centrarás principalmente al construir proxies de objetos. La propiedad get es el método de punto, por lo que cuando estás destruyendo hello o estás haciendo proxy de cliente.punto o proxy de cliente.cualquierotracosa, entonces se llama al método get y puedes devolver lo que quieras desde él. El método has es como hasOwnProperty, que verifica si una propiedad existe en el proxy de objeto o no, y en este caso simplemente devolvemos true, por lo que estos dos métodos que verifican si estos dos parámetros existen en la propiedad del objeto deben devolver true aunque en realidad no existan allí, y por último tenemos apply. No creo que tengamos suficiente tiempo para profundizar en ello, pero es una trampa para cualquier llamada a métodos que hagas en tu proxy de objeto. En este caso, get debería ser suficiente, profundizaremos en ello a medida que lo definamos.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Una Guía del Comportamiento de Renderizado de React
React Advanced Conference 2022React Advanced Conference 2022
25 min
Una Guía del Comportamiento de Renderizado de React
Top Content
React es una biblioteca para "renderizar" UI a partir de componentes, pero muchos usuarios se encuentran confundidos acerca de cómo funciona realmente el renderizado de React. ¿Qué significan términos como "renderizado", "reconciliación", "Fibers", y "committing"? ¿Cuándo ocurren los renderizados? ¿Cómo afecta el Contexto al renderizado, y cómo las bibliotecas como Redux causan actualizaciones? En esta charla, aclararemos la confusión y proporcionaremos una base sólida para entender cuándo, por qué, y cómo React renderiza. Veremos: - Qué es realmente el "renderizado" - Cómo React encola los renderizados y el comportamiento de renderizado estándar - Cómo se utilizan las claves y los tipos de componentes en el renderizado - Técnicas para optimizar el rendimiento del renderizado - Cómo el uso del contexto afecta al comportamiento del renderizado - Cómo las bibliotecas externas se integran en el renderizado de React
Escalando con Remix y Micro Frontends
Remix Conf Europe 2022Remix Conf Europe 2022
23 min
Escalando con Remix y Micro Frontends
Top Content
¿Tienes un producto grande construido por muchos equipos? ¿Estás luchando para lanzar a menudo? ¿Se convirtió tu frontend en un monolito inmantenible masivo? Si, como yo, has respondido sí a cualquiera de esas preguntas, ¡esta charla es para ti! Te mostraré exactamente cómo puedes construir una arquitectura de micro frontend con Remix para resolver esos desafíos.
Concurrencia en React, Explicada
React Summit 2023React Summit 2023
23 min
Concurrencia en React, Explicada
Top Content
¡React 18! ¡Funciones concurrentes! Tal vez ya hayas probado las nuevas APIs como useTransition, o tal vez solo hayas oído hablar de ellas. Pero, ¿sabes cómo React 18 logra las mejoras de rendimiento que trae consigo? En esta charla, echemos un vistazo bajo el capó de las características de rendimiento de React 18: - Cómo React 18 reduce el tiempo que tu página permanece congelada (también conocido como TBT) - Qué sucede exactamente en el hilo principal cuando ejecutas useTransition() - Cuál es la trampa con las mejoras (¡no hay torta gratis!), y por qué Vue.js y Preact se negaron rotundamente a lanzar algo similar
Componentes de Full Stack
Remix Conf Europe 2022Remix Conf Europe 2022
37 min
Componentes de Full Stack
Top Content
Remix es un marco de trabajo web que te ofrece el modelo mental simple de una aplicación de múltiples páginas (MPA) pero el poder y las capacidades de una aplicación de una sola página (SPA). Uno de los grandes desafíos de las SPA es la gestión de la red que resulta en una gran cantidad de indirecciones y código defectuoso. Esto es especialmente notable en el estado de la aplicación que Remix elimina por completo, pero también es un problema en los componentes individuales que se comunican con un punto final de backend de un solo propósito (como una búsqueda de combobox, por ejemplo).
En esta charla, Kent demostrará cómo Remix te permite construir componentes de interfaz de usuario complejos que están conectados a un backend de la manera más simple y poderosa que hayas visto. Dejándote tiempo para relajarte con tu familia o lo que sea que hagas para divertirte.
Haciendo JavaScript en WebAssembly Rápido
JSNation Live 2021JSNation Live 2021
29 min
Haciendo JavaScript en WebAssembly Rápido
Top Content
JavaScript en el navegador se ejecuta muchas veces más rápido de lo que lo hacía hace dos décadas. Y eso sucedió porque los proveedores de navegadores pasaron ese tiempo trabajando en intensivas optimizaciones de rendimiento en sus motores JavaScript.Debido a este trabajo de optimización, JavaScript ahora se está ejecutando en muchos lugares además del navegador. Pero todavía hay algunos entornos donde los motores JS no pueden aplicar esas optimizaciones de la manera correcta para hacer las cosas rápidas.Estamos trabajando para resolver esto, comenzando una nueva ola de trabajo de optimización de JavaScript. Estamos mejorando el rendimiento de JavaScript para entornos completamente diferentes, donde se aplican reglas diferentes. Y esto es posible gracias a WebAssembly. En esta charla, explicaré cómo funciona todo esto y qué vendrá a continuación.
Depuración de JS
React Summit 2023React Summit 2023
24 min
Depuración de JS
Top Content
Como desarrolladores, pasamos gran parte de nuestro tiempo depurando aplicaciones, a menudo código que ni siquiera escribimos. Lamentablemente, a pocos desarrolladores se les ha enseñado cómo abordar la depuración, es algo que la mayoría de nosotros aprendemos a través de la experiencia dolorosa. La buena noticia es que _puedes_ aprender a depurar de manera efectiva, y hay varias técnicas y herramientas clave que puedes usar para depurar aplicaciones de JS y React.

Workshops on related topic

Consejos sobre React Hooks que solo los profesionales conocen
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
Consejos sobre React Hooks que solo los profesionales conocen
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
La adición de la API de hooks a React fue un cambio bastante importante. Antes de los hooks, la mayoría de los componentos tenían que ser basados en clases. Ahora, con los hooks, estos son a menudo componentes funcionales mucho más simples. Los hooks pueden ser realmente simples de usar. Casi engañosamente simples. Porque todavía hay muchas formas en las que puedes equivocarte con los hooks. Y a menudo resulta que hay muchas formas en las que puedes mejorar tus componentes con una mejor comprensión de cómo se puede usar cada hook de React.Aprenderás todo sobre los pros y los contras de los diversos hooks. Aprenderás cuándo usar useState() versus useReducer(). Veremos cómo usar useContext() de manera eficiente. Verás cuándo usar useLayoutEffect() y cuándo useEffect() es mejor.
Diseñando Pruebas Efectivas con la Biblioteca de Pruebas de React
React Summit 2023React Summit 2023
151 min
Diseñando Pruebas Efectivas con la Biblioteca de Pruebas de React
Top Content
Featured Workshop
Josh Justice
Josh Justice
La Biblioteca de Pruebas de React es un gran marco para las pruebas de componentes de React porque responde muchas preguntas por ti, por lo que no necesitas preocuparte por esas preguntas. Pero eso no significa que las pruebas sean fáciles. Todavía hay muchas preguntas que tienes que resolver por ti mismo: ¿Cuántas pruebas de componentes debes escribir vs pruebas de extremo a extremo o pruebas de unidad de nivel inferior? ¿Cómo puedes probar una cierta línea de código que es difícil de probar? ¿Y qué se supone que debes hacer con esa persistente advertencia de act()?
En esta masterclass de tres horas, presentaremos la Biblioteca de Pruebas de React junto con un modelo mental de cómo pensar en el diseño de tus pruebas de componentes. Este modelo mental te ayudará a ver cómo probar cada bit de lógica, si debes o no simular dependencias, y ayudará a mejorar el diseño de tus componentes. Te irás con las herramientas, técnicas y principios que necesitas para implementar pruebas de componentes de bajo costo y alto valor.
Tabla de contenidos- Los diferentes tipos de pruebas de aplicaciones de React, y dónde encajan las pruebas de componentes- Un modelo mental para pensar en las entradas y salidas de los componentes que pruebas- Opciones para seleccionar elementos DOM para verificar e interactuar con ellos- El valor de los mocks y por qué no deben evitarse- Los desafíos con la asincronía en las pruebas de RTL y cómo manejarlos
Requisitos previos- Familiaridad con la construcción de aplicaciones con React- Experiencia básica escribiendo pruebas automatizadas con Jest u otro marco de pruebas unitarias- No necesitas ninguna experiencia con la Biblioteca de Pruebas de React- Configuración de la máquina: Node LTS, Yarn
Uso de CodeMirror para construir un editor de JavaScript con Linting y AutoCompletado
React Day Berlin 2022React Day Berlin 2022
86 min
Uso de CodeMirror para construir un editor de JavaScript con Linting y AutoCompletado
Top Content
WorkshopFree
Hussien Khayoon
Kahvi Patel
2 authors
Usar una biblioteca puede parecer fácil a primera vista, pero ¿cómo eliges la biblioteca correcta? ¿Cómo actualizas una existente? ¿Y cómo te abres camino a través de la documentación para encontrar lo que quieres?
En esta masterclass, discutiremos todos estos puntos finos mientras pasamos por un ejemplo general de construcción de un editor de código usando CodeMirror en React. Todo mientras compartimos algunas de las sutilezas que nuestro equipo aprendió sobre el uso de esta biblioteca y algunos problemas que encontramos.
Pruebas de Aplicaciones Web utilizando Cypress
TestJS Summit - January, 2021TestJS Summit - January, 2021
173 min
Pruebas de Aplicaciones Web utilizando Cypress
WorkshopFree
Gleb Bahmutov
Gleb Bahmutov
Este masterclass te enseñará los conceptos básicos de cómo escribir pruebas de extremo a extremo utilizando Cypress Test Runner.
Cubriremos la escritura de pruebas, abarcando todas las características de la aplicación, estructurando las pruebas, interceptando solicitudes de red y configurando los datos del backend.
Cualquier persona que conozca el lenguaje de programación JavaScript y tenga NPM instalado podrá seguir el masterclass.
Construye un potente DataGrid en pocas horas con Ag Grid
React Summit US 2023React Summit US 2023
96 min
Construye un potente DataGrid en pocas horas con Ag Grid
WorkshopFree
Mike Ryan
Mike Ryan
¿Tu aplicación React necesita mostrar eficientemente muchos (y muchos) datos en una cuadrícula? ¿Tus usuarios quieren poder buscar, ordenar, filtrar y editar datos? AG Grid es la mejor cuadrícula de JavaScript en el mundo y está llena de características, es altamente eficiente y extensible. En esta masterclass, aprenderás cómo empezar con AG Grid, cómo podemos habilitar la ordenación y el filtrado de datos en la cuadrícula, la representación de celdas y más. Saldrás de esta masterclass gratuita de 3 horas equipado con el conocimiento para implementar AG Grid en tu aplicación React.
Todos sabemos que crear nuestra propia solución de cuadrícula no es fácil, y seamos honestos, no es algo en lo que deberíamos estar trabajando. Estamos enfocados en construir un producto e impulsar la innovación. En esta masterclass, verás lo fácil que es empezar con AG Grid.
Prerrequisitos: React y JavaScript básicos
Nivel de la masterclass: Principiante
0 a Auth en una Hora Usando NodeJS SDK
Node Congress 2023Node Congress 2023
63 min
0 a Auth en una Hora Usando NodeJS SDK
WorkshopFree
Asaf Shen
Asaf Shen
La autenticación sin contraseña puede parecer compleja, pero es fácil de agregar a cualquier aplicación utilizando la herramienta adecuada.
Mejoraremos una aplicación JS de pila completa (backend de Node.JS + frontend de React) para autenticar usuarios con OAuth (inicio de sesión social) y contraseñas de un solo uso (correo electrónico), incluyendo:- Autenticación de usuario - Administrar interacciones de usuario, devolver JWT de sesión / actualización- Gestión y validación de sesiones - Almacenar la sesión para solicitudes de cliente posteriores, validar / actualizar sesiones
Al final del masterclass, también tocaremos otro enfoque para la autenticación de código utilizando Flujos Descope en el frontend (flujos de arrastrar y soltar), manteniendo solo la validación de sesión en el backend. Con esto, también mostraremos lo fácil que es habilitar la biometría y otros métodos de autenticación sin contraseña.
Tabla de contenidos- Una breve introducción a los conceptos básicos de autenticación- Codificación- Por qué importa la autenticación sin contraseña
Requisitos previos- IDE de tu elección- Node 18 o superior