# Chat socket
Client example code
```javascript
const io = require('socket.io-client');
const jwt = require('jsonwebtoken');
const user1 = '406525501113368576';
const user2 = '408503898509148160';
function createConnection(socketServer, chatToken) {
const socket = io(socketServer, {
transports: ['websocket'],
query: { token: chatToken },
});
// client-side
socket.on('connect_error', (err) => {
console.log(err.message); // prints the message associated with the error
});
socket.on('connect', () => {
console.log(`create connection to ${socketServer} successfully`)
socket.emit('createMessage', {
channel_id: `${user1}-${user2}`,
image_urls: ['http://cdn.piktina.com/123.jpg'],
message: 'description for images hahah',
type: 'image',
client_gen_id: Date.now(),
}, (err, data) => console.log(err, data));
// socket.emit('updateMessage', {
// channel_id: `${user1}-${user2}`,
// created_at: 1630057791871,
// type: 'text',
// message: 'Hello world', // new message
// }, (err, data) => console.log(err, data));
socket.emit('getOnlineStatus', {
user_ids: [user1, user2],
}, (err, data) => console.log(err, data));
socket.emit('isTyping', {
channel_id: `${user1}-${user2}`,
to_user_ids: [user1, user2],
}, (err, data) => console.log(err, data));
socket.emit('read', {
channel_id: `${user1}-${user2}`,
to_user_ids: [user1, user2],
}, (err, data) => console.log(err, data));
});
const events = ['error', 'disconnect', 'createMessage', 'isTyping', 'read'];
events.forEach((event) => {
socket.on(event, (data) => console.log('received event: ', event, data));
});
}
const socketServer = process.env.SOCKET_SERVER_URL || 'https://chat-socket.default:1337/';
const jwtSecret = process.env.JWT_SECRET || 'secret';
const chatToken = jwt.sign({ sub: user1, iss: 'chat' }, jwtSecret);
createConnection(socketServer, chatToken);
```
# Events (launch version 0.1)
When client emit an event to server, if there is any error, server will return error in callback function by calling `callback(err, data)`, format of error is
```json
{
"error": "Type of error", // Iternal Server Error, Bad Request
"message": "Error message show to user"
}
```
### Example code on client and server
```javascript
// client code
socket.emit('eventName', data, (err, response) => {
if(err) console.log(err.message)
})
// server code
socket.on('eventName', (data, callback) => {
//check data is valid
if(!isValid(data)){
if(callback) callback({error: 'Bad Request', message: 'Empty Data'}, null)
return
}
// processing data
let {response, err} = processing(data)
if(err){
if(callback) callback(err, null)
return
}
callback(null, response)
})
```
## send a message
- Client emit event / Server on event: `createMessage`
- Payload (client -> server)
- send text message
```json
{
"channel_id": "ch1",
"type": "text",
"message": "Hello",
"client_gen_id": 2763648234,
"metadata": {"field": "value"}
}
```
- send images
```json
{
"channel_id": "ch1",
"image_urls":["http://cdn.chotot.com/123.jpg"],
"message": "description for images",
"type": "image",
"client_gen_id": 2763648234,
"metadata": {"field": "value"}
}
```
- send attachment
```json
{
"channel_id": "channel1",
"message": "hello world",
"image_urls": [],
"type": "attachment",
"attachment": {
"id": "123",
"type": "minicv",
"data": {
"key": "value"
// flexible fields
}
}
"client_gen_id": 2763648234,
"metadata": {"field": "value"}
}
```
- Callback response
- Success Response
```json
{
"channel_id": "ch1",
"type": "text",
"message": "Hello",
"client_gen_id": 2763648234,
"sender_id": "user1",
"created_at": 2763649234
}
```
- Error
```json
{
"error": "Bad Request",
"message": "Missing message type"
}
```
- Server emit event/Client on event: `createMessage`
- Payload(server -> client)
```json
{
"channel_id": "ch1",
"type": "text",
"message": "Hello",
"client_gen_id": 2763648234,
"sender_id": "user1",
"created_at": 2763649234
}
```
## get online status
- Client emit event / Server on event: `getOnlineStatus`
- Payload (client -> server)
```json
{
"user_ids": ["user1", "user2", "user3"]
}
```
- Callback response
- Success Response
```json
[
{"user_id": "user1", "is_online": true, "last_online_at": 2763649234},
{"user_id": "user2", "is_online": false, "last_online_at": 2763649234},
{"user_id": "user3", "is_online": false, "last_online_at": 0}
]
```
- Error
```json
{
"error": "Bad Request",
"message": "user_ids is not an array"
}
```
## typing
- Client emit event / Server on event: `isTyping`
- Payload (client -> server)
```json
{
"channel_id": "ch1",
"to_user_ids": ["user2", "user3"]
}
```
- Callback response
- Error
```json
{
"error": "Bad Request"
"message": "channel_id is not valid"
}
```
- Server emit event/Client on event: `isTyping`
- Payload(server -> client)
```json
{
"channel_id": "ch1",
"user_id": "user1"
}
```
## read
- Client emit event / Server on event: `read`
- Payload (client -> server)
```json
{
"channel_id": "ch1",
"to_user_ids": ["user2", "user3"]
}
```
- Callback response
- Success
```json
{
"unread_count": 11
}
```
- Error
```json
{
"error": "Bad Request"
"message": "channel_id is not valid"
}
```
- Server emit event/Client on event: `read`
- Payload(server -> client)
```json
{
"channel_id": "ch1",
"user_id": "user1",
"last_read_at": 2763649234,
}
```
## watchOnlineStatus
- Client emit event / Server on event: `watchOnlineStatus`
- Payload (client -> server)
```json
{
"channel_ids": ["channel_id_1", "channel_id_2", "channel_id_3"],
}
```
- Server emit event/Client on event: `refreshOnlineStatus`
- Payload(server -> client)
```json
{
"online_channels": ["channel_id_1", "channel_id_2"]
}
```
## update a message
- Client emit event / Server on event: `updateMessage`
- Payload (client -> server)
```json
{
"channel_id": "ch1",
"message_created_at": 2763649234,
"message": "Hello world" // new message
}
```
- Callback response
- Error
```json
{
"error": "Not found",
"message": "Message not found"
}
```
- Server emit event/Client on event: `updateMessage`
- Payload(server -> client)
```json
{
"channel_id": "ch1",
"type": "text",
"message": "Hello",
"client_gen_id": 2763648234,
"sender_id": "user1",
"message_created_at": 2763649234
}
```
## delete a message
- Client emit event / Server on event: `deleteMessage`
- Payload (client -> server)
```json
{
"channel_id": "ch1",
"message_created_at": 2763649234,
}
```
- Callback response
- Error
```json
{
"error": "Not found",
"message": "Message not found"
}
```
- Server emit event/Client on event: `deleteMessage`
- Payload(server -> client)
```json
{
"channel_id": "ch1",
"sender_id": "user1",
"message_created_at": 2763649234
}
```
## create channel
- Client emit event: `createChannel`
- Emit payload:
```json
{
"to_user_id": "userId",
"message": "I can pay $500", // optional
"message_type": "text", // optional
"channel_type": "direct"
}
```
- Callback response:
```json
{
"channel_id": "channel1"
}
```
## list channels
- Client emit event: `listChannels`
- Emit payload:
```json
{
"params": {
"before_ts": "1656749676347", // default now (milliseconds)
"order": "desc" // default desc
"limit": 10,
}
}
```
- Callback repsonse:
```json
[
{
"channel_id": "channel_1",
"unread_count": 12,
"last_message": "hello",
"last_message_type": "buyer",
"last_message_created_at": 1610693806662,
"channel_name": "user2", // display as name for channel
"channel_avatar": "https://cdn.chotot.com/user2.jpg", // display as avatar for channel
"is_muted": false,
},
...
]
```
## get channel detail
- Client emit event: getChannel
- Emit payload:
```json
{
"channel_id": "channel_id1"
}
```
- Callback response:
```json
{
"channel": {
"channel_id": "channel_1",
"channel_name": "name of this chat room, this can be ad title",
"channel_avatar": "http://cdn.chotot.com/useravatar.jpg",
"unread_count": 12,
"last_message": "hello",
"last_message_type": "buyer",
"last_message_created_at": 1610693806662,
// status of :channel_id for :user_id
"status": "blocked", // banned, others_banned,...
"status_text": "you are blocked by user2",
"is_muted": false, // to show toggle button mute/unmute
},
"users": [
{
"full_name": "abc",
"avatar": "https://cdn.piktina.com/user1.jpg",
"metadata": {"phone":"0123","email":"xyz@gmail.com"},
"user_id": "user1",
"last_received_at": 1610693806662, // not yet available
"last_read_at": 1610693806665,
"joined_at": 1610693806662,
"role": "seller"
},
{
"full_name": "abcd",
"avatar": "https://cdn.piktina.com/user2.jpg",
"metadata": {"phone":"0123","email":"xyz@gmail.com"},
"user_id": "user2",
"last_received_at": 1610693806662, // not yet available
"last_read_at": 1610693806665,
"joined_at": 1610693806662,
"role": "seller"
}
]
}
```
<!-- ## update total unread count
- Server emit event: `updateTotalUnreadCount`
- When:
- on success socket connection.
- on read event
- on new message.
- Emit payload:
```json
{
"unread_count": 10
}
``` -->