---
# System prepended metadata

title: NodeJS SDK

---

# NodeJS SDK

A NodeJS Bot SDK for SendingNetwork.

## Quick Start

### Add dependency
```shell
npm i sendingnetwork-bot-sdk
```

### Prepare a configuration file
Provide server node url, wallet address and private key in file bot.creds.json:
```json
{
    "nodeUrl": "https://example.com",
    "walletAddress": "",
    "privateKey": ""
}
```

### Create an instance of `SDNClient`
After reading the configuration file, create an instance of `SDNClient`. Register event listener and start syncing.
```typescript
// preLogin to get message to sign
let auth = new SDNAuth(nodeUrl)
let loginMessage = await auth.didPreLogin(address)

// sign message
let web3 = new Web3()
web3.eth.accounts.wallet.add(key);
let signature = await web3.eth.sign(loginMessage["message"], address)

// didLogin to get access token
let loginResp = await auth.didLogin(
    loginMessage["did"], loginMessage["message"], signature["signature"], 
    loginMessage["random_server"], loginMessage["updated"])
let accessToken = loginResp["access_token"]

// create SDNClient with a storage file
let storage = new SimpleFsStorageProvider("/path/to/bot/storage/file");
let client = new SDNClient(nodeUrl, accessToken, storage);

// register message listener
client.on("room.message", async (roomId: string, event: any) => {
    LogService.info("index", roomId, event);
});

// start syncing
await client.start();
```

### Call API functions
```typescript
// create new room
await client.createRoom({name: roomName})

// invite user to the room
await client.inviteUser(inviteUserId, inviteRoomId)

// send room message
await client.sendText(sendRoomId, "hello world")
```

## Examples
See more use cases in `examples` directory.


## Client API Doc

### Login DID

```typescript
public async didLogin(did: string, message: string, token: string, nonce: string, update_time: string): Promise<any>
```

input params：

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| did | string | user did    | true     |
| message | string | signing message    | true     |
| token | string | signature    | true     |
| nonce | string | random nonce    | true     |
| update_time | string | update time of did document    | true     |

output params：

| Name     | Type        | Description | Required |
| :------- | :---------- | :---------- | :------- |
| user_id | string | user did | true     |
| access_token | string | access token | true     |
| device_id | string | device id | true     |


### Create Room

```typescript
public createRoom(properties: RoomCreateOptions = {}): Promise<string>
```

input params：RoomCreateOptions

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| name | string | room name    | true     |
| topic | string | room topic  | false    |
| invite | string array | array of user ids to invite | false |

output params:

| Name     | Type        | Description | Required |
| :------- | :---------- | :---------- | :------- |
| roomId | string | id of the new room | true     |


### Invite User
```typescript
public inviteUser(userId, roomId)
```
input params：

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| roomId | string | room id    | true     |
| userId | string | user id  | true    |

output params: none


### Kick User
```typescript
public kickUser(userId, roomId, reason = null)
```
input params：

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| roomId | string | room id    | true     |
| userId | string | user id  | true    |
| reason | string | invite reason | false |

return values: none


### Join Room
```typescript
public joinRoom(roomId: string): Promise<string>
```
input params：

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| roomId | string | room id    | true     |

output params: none


### Leave Room
```typescript
public leaveRoom(roomId: string, reason?: string)
```

input params：

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| roomId | string | room id    | true     |
| reason | string | leave reason | false |

output params: none


### Get Room Memebers
```typescript
 public getAllRoomMembers(roomId: string, atToken?: string): Promise<MembershipEvent[]>
```

input params：

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| roomId | string | room id    | true     |
| atToken | string | optional batch token, null for "now"    | true     |


output params:

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| MembershipEvent[] | array of MembershipEvent | membership event data | true     |


### Send Message
```typescript
public sendText(roomId: string, text: string): Promise<string>
```

input params：

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| roomId | string | room id    | true     |
| text | string | message to send    | true     |

output params:

| Name    | Type   | Description | Required |
| :------ | :----- | :---------- | :------- |
| eventId | string | event id    | true     |