# JavaScript Client

Esta documentación se extrae de [social-rpc-client-js](https://github.com/decentraland/social-rpc-client-js#using-the-client)

#### Configuración básica y uso

Para usar el cliente, instala el paquete en tu proyecto NPM:

```bash
npm install -S @dcl/social-rpc-client
```

Importa la función creadora del cliente desde el paquete instalado:

```typescript
import { createSocialClient } from "@dcl/social-client";
```

Crea una nueva instancia del cliente proporcionando al cliente:

1. Una URL para la API REST del Social Service
2. Una URL para el endpoint WebSocket del Social Service
3. La dirección del usuario (la misma que se usa para firmar la identidad)
4. Una identidad, firmada con la wallet del usuario.

```typescript
import { createSocialClient } from "@dcl/social-client";
import { Wallet } from 'ethers'

// Genera una wallet aleatoria para fines de prueba o usa la del usuario en entornos de producción.
const wallet = Wallet.createRandom()
const identity = await createIdentity(wallet, expiration)

const socialClient = await createSocialClient(
  "https://social.decentraland.org",
  "wss://social-service.decentraland.org",
  wallet.address,
  identity
);
```

El `createSocialClient` ejecutará las operaciones requeridas para conectarse al Social Service y devolverá el cliente conectado.

Usa el cliente para interactuar con el Social Service:

```typescript
import { createSocialClient } from "@dcl/social-client";

const socialClient = await createSocialClient(
  "https://social.decentraland.org",
  "wss://social-service.decentraland.org",
  wallet.address,
  identity
);

const friends = socialClient.getFriends()
for await (const friend of friends) {
  console.log(friend)
}
```

El cliente expone los métodos disponibles a través del [social protobuff](https://github.com/decentraland/protocol/blob/main/public/social.proto) y un método disconnect que desconecta el cliente del Social Service.

#### Generando una identidad

Para autenticar a los usuarios con el Social Service, necesitarás generar una identidad para ellos. Para ello, la `@dcl/crypto` biblioteca proporciona el `Authenticator.initializeAuthChain` método. Úsalo para generar una identidad para tus usuarios:

```typescript
  import { Wallet } from 'ethers'
  import { Authenticator } from '@dcl/crypto'
  // Genera una wallet aleatoria para fines de prueba o usa la del usuario en entornos de producción.
  const userWallet = Wallet.createRandom()

  // Genera una identidad para el usuario.
  const address = await userWallet.getAddress()
  const ephemeralWallet = Wallet.createRandom()
  const payload = {
    address: ephemeralWallet.address,
    privateKey: ephemeralWallet.privateKey,
    publicKey: ephemeralWallet.publicKey
  }
  const identity = await Authenticator.initializeAuthChain(address, payload, expiration, (message: string) => signer.signMessage(message))
```
