npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

upos

v2.3.1

Published

update partial object in socket

Readme

Tutorial UPOS — Update Partial Object in Socket

Sumario

Introdução

Você já tentou atualizar um objeto utilizando socket? Da muito trabalho não é mesmo? A solução mais otimizada é você atualizar atributo por atributo desse mesmo objeto, mas isso é um inferno, porque perdemos muito tempo escrevendo linhas de código repetidas vezes, com o UPOS não haverá mais esse problema!

Como funciona ?

O UPOS, ele instancia seu objeto criado no lado do cliente no servidor do socket, e como isso funciona? Basicamente pegamos seu objeto e registramos ele no servidor, agora tanto o cliente quanto o servidor conhecem o mesmo objeto, e com a solução do UPOS, sempre que você tentar atualizar um atributo desse objeto, apenas o valor atual desse atributo será enviado pela rede. E o objeto só será atualizado no lado do cliente, apenas e unicamente quando o receber a atualização do servidor, garantindo assim que todos os clientes sempre tenham o mesmo objeto atualizado.

No UPOS é utilizado um esquema, onde que para instanciar um objeto é necessário passar uma id e um tipo para esse objeto e só depois o próprio objeto, garantindo assim uma identificação completa do mesmo, então cada cliente que tiver com o mesmo id e tipo, sempre receberá esse objeto, garantindo que não haverá conflitos entre objetos do mesmo tipo, e evitando tbm objetos com a mesma id e de tipos diferentes!

Instalação

  npm i upos

Uso Básico

Servidor

Após a instalação do UPOS, você já terá acesso a biblioteca e a versão indica do ws utilizado.

Apos instalar o upos, instale:

  npm i typescript @types/node ts-node -D

execute:

  npx tsc --init

Agora é necessário criar um arquivo chamado main.ts, e escrever:

import Server from 'upos/server';

const serve = new Server(1000); //default: 1000

serve.boot({
  port: 3000,
}, () => {
  console.log('started server');
});

Obs.: existe um cacheSystem, esse sistema de cache limite o uso de memória do UPOS, se você não passar o limite, o valor default é 1000MB, recomendo que adicione um limite baseado nas suas demandas e/ou capacidades do seu servidor, o UPOS tem esse limite de memória, pos os objetos que serão registrado, são salvos dentro da memória, para maximar o desempenho do servidor! Caso tente ser registrado um objeto que va ultrapassar o limite de memória, os objetos mais antigos serão apagados até liberar espaço suficiente para o novo objeto!

e para Executar esse código:

  npx ts-node main.ts

Pronto, agora o lado do servidor já está com a configuração base

Para capturar sempre que um objeto for atualizado:

import Server from 'upos/server';

//1000 é o limite de memória que será utilizado. 
/*
   Data é o objeto retornado sempre que um objeto for atualizado 
   para todos os clientes.
*/
const serve = new Server(1000, (data) => {
  console.log(data);
});

serve.boot({
  port: 3000,
}, () => {
  console.log('started server');
});

Atributos retornados no parâmetro data:

{
    id: number, 
    typeName: string, 
    key: string, 
    value: any, 
    instance: any
}

Cliente

Instanciando objeto

Exemplo em typeScript

import { Socket, SetObject } from 'upos/client';

const url = '';
Socket.connection(url); //default: 'ws://localhost'

let user: any = {
    name: '',
    email: '',
}
//Instancia seu objeto no lado do servidor
SetObject.boot({
    id: 1,
    typeName: 'user',
    instance: user,
})
    //captura o novo objeto
    .then((data) => {
        //Agora seu objeto será atualizado apenas pelo servidor
        user = data;
    })

Note que ao chamarmos a função boot da class SetObject, temos que passar uma id e um typeName, onde esse typeName sempre será o tipo do objeto, assim você poderá ter vários objetos do mesmo tipo e com id's diferentes, caso algum outro cliente tente registrar um novo objeto com id e typeName já registrados no servidor, o servidor apenas enviará os dados mais recentes desse objeto.

Também a possibilidade de executar uma ação quando o objeto for atualizado, e também quando você tentar atualizar o objeto, através dos métodos get e set, dessa forma:

import { Socket, SetObject } from 'upos/client';

const url = '';
Socket.connection(url); //default: 'ws://localhost'

let user: any = {
    name: '',
    email: '',
}
//Instancia seu objeto no lado do servidor
SetObject.boot({
    id: 1,
    typeName: 'user',
    instance: user,
}, {
    //Sempre que o objeto for atualizado, você poderá realizar alguma ação
  get(data) {
      console.log(data);
  },
  //Sempre que você tentar da um set nos atributos do objeto esse ação será executada
  set(data) {
      console.log(data);
  }
})
    //captura o novo objeto
    .then((data) => {
        //Agora seu objeto será atualizado apenas pelo servidor
        user = data;
    })

Os atributos retornados pelo método get e set, tem esses atributos:

{
  id: number,
  typeName: string,
  key: string,
  value: any,
  instance: T,
}

Outros exemplos em:

Exemplo em Vue

Primeiro No arquivo main.js ou main.ts Conecte o cliente ao servidor

Forma simples:

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import { Socket } from 'upos/client';

Socket.connection('ws://localhost:3000');

createApp(App).mount('#app')

Para instanciar um Objeto utilizando OPTIONS API

<template>
  <pre>{{user}}</pre>
</template>

<script lang="ts">
  import { SetObject } from 'upos/client';

  export default {
    name: 'HomeView',

    data() {
      return {
        user: {
          name: '',
          email: '',
        }
      }
    },

    mounted() {
      SetObject.boot({
        id: 1,
        typeName: 'user',
        instance: this.user
      })
          .then(data => {
            this.user = data;
          })
    }
  }
</script>

Para Instanciar um Objeto utilizando COMPOSITION API

<template>
  <pre>{{user}}</pre>
</template>

<script lang="ts" setup>
import { SetObject } from 'upos/client';
import { onMounted, ref } from 'vue'

const user = ref({
  name: '',
  email: ''
});

onMounted(async () => {
  await SetObject.boot({
    id: 1,
    typeName: 'user',
    instance: user.value
  })
    .then(data => {
      user.value = data;
    })
})
</script>

Exemplo em React

Obs.: Essa biblioteca não funciona no NextJs

Primeiro conecte-se ao servidor do socket, abrindo o arquivo main.jsx ou main.tsx

import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.tsx'
import { Socket } from "upos/client";

const url = '';
Socket.connection(url); //default: 'ws://localhost'

createRoot(document.getElementById('root')!).render(
    <App />,
)

Agora em qualquer component:

import { useEffect, useState } from 'react';
import './App.css';
import { SetObject } from 'upos/client';

function App() {
    const [user, setUser] = useState({
        name: '',
        email: '',
    });
    useEffect(() => {
        SetObject.boot({
            id: 1,
            typeName: 'user',
            instance: user
        })
            .then(data => {
                setUser(data);
            })
    });

  return (
    <>
      <div>{user.name}</div>
    </>
  )
}

export default App

Exemplo em Angular

Primeiro vá no arquivo main.ts:

import { bootstrapApplication } from '@angular/platform-browser';
import { appConfig } from './app/app.config';
import { AppComponent } from './app/app.component';
import { Socket } from 'upos/client';

const url = '';
Socket.connection(url); //default: 'ws://localhost'

bootstrapApplication(AppComponent, appConfig)
  .catch((err) => console.error(err));

Agora em qualquer component:

import { Component, OnInit } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { SetObject } from 'upos/client';

@Component({
  selector: 'app-root',
  imports: [RouterOutlet],
  templateUrl: './app.component.html',
  styleUrl: './app.component.scss'
})
export class AppComponent implements OnInit {
  user = {
    name: '',
    email: ''
  };

  ngOnInit() {
    SetObject.boot({
      id: 1,
      typeName: 'user',
      instance: this.user,
    })
      .then((data) => {
        this.user = data;
      });
  }
}

Exemplo em SvelteKit

Primeiro passo, desativar o ssr da rota que será utilizado o component, dessa forma no arquivo +page.server.ts:

export const ssr = false;

Agora no +page.svelte:

<script lang="ts">
    import { onMount } from "svelte";
    import { Socket, SetObject } from 'upos/client';

    let user = $state({
        name: '',
        email: '',
        age: ''
    });

    onMount(async () => {
        const url = '';
        Socket.connection(url); //default: 'ws://localhost'
        await SetObject.boot({
            id: 1,
            typeName: 'user',
            instance: user,
        })
            .then(data => {
                user = data;
            });
    });
</script>

<pre>{JSON.stringify(user)}</pre>