1. Nguyên lý Publish/Subscribe

Trên Stringee, các Client App có thể theo dõi 1 cách realtime các thông tin/thuộc tính của nhau, bao gồm:

  • Trạng thái cuộc gọi
  • Trạng thái Online/Offline
  • Một thuộc tính bất kỳ do developer định nghĩa

Publish/Subscribe

Client A muốn theo dõi sự thay đổi thông tin/thuộc tính của Client B thì 2 bên phải định nghĩa 1 toppic ví dụ có tên là toppic_1:

  • Client A subscribe toppic_1
  • khi Client B có thuộc tính được chỉ ra thay đổi, nó sẽ publish thông tin vào toppic_1
  • Client A sẽ nhận được thông báo từ toppic_1

2. Quyết định việc pub/sub bằng Access token

Để chỉ ra 1 Client App muốn publish hay subscribe topic nào, bạn có thể chỉ ra trong Access token payload; đọc thêm về Access token tại đây

Cụ thể trong payload chỉ ra 2 trường (không nhất thiết phải có đủ cả 2):

subscribe: danh sách topic muốn subscribe cách nhau bởi dấu phẩy (,)

attributes: danh sách các thuộc tính và topic tương ứng mà Client sẽ publish thông tin vào khi thuộc tính thay đổi:

[{
    "attribute": "ATTRIBUTE_NAME",
    "topic": "TOPIC_NAME"
}]

Có 2 thuộc tính hệ thống sau (bạn không thể đặt trùng tên thuộc tính với 2 thuộc tính hệ thống này):

  • onlineStatus: Trạng thái Online/Offline của client
  • call: Trạng thái cuộc gọi (Calling/Ringing/Answered/Ended)

ngoài ra bạn có thể tự định nghĩa bất kỳ thuộc tính nào khác cho Client.

Có 1 topic mặc định của hệ thống:

  • ALL_CALL_STATUS: khi trạng thái cuộc gọi thay đổi, hệ thống sẽ publish thông tin vào topic này (cuộc gọi vào bất kỳ user nào)

Ví dụ về 1 access token payload:

{
    "jti": "...-1554197947",
    "iss": "...",
    "exp": 1555197947,
    "userId": "agent_1",
    "subscribe": "online_status_GRDHG0HI,ALL_CALL_STATUS,agent_manual_status",
    "attributes": [{
            "attribute": "onlineStatus",
            "topic": "online_status_GRDHG0HI"
        },
        {
            "attribute": "call",
            "topic": "call_GRDHG0HI"
        },
        {
            "attribute": "manual_status",
            "topic": "agent_manual_status"
        }
    ]
}

ở trên chỉ ra Client App khi xác thực bằng access token này sẽ:

Subscribe các topic:

  1. online_status_GRDHG0HI
  2. ALL_CALL_STATUS
  3. agent_manual_status

Publish các thuộc tính sau:

  1. Trạng thái online/offline vào topic online_status_GRDHG0HI
  2. Trạng thái cuộc gọi vào topic call_GRDHG0HI
  3. Thuộc tính manual_status thay đổi giá trị sẽ publish vào topic agent_manual_status

3. Lấy các thuộc tính hiện tại của 1 user

GET https://api.stringee.com/v1/users/USER_ID

Response:

{
    "loginTime": 1554204151774,
    "attributes": [
        {
            "attribute": "onlineStatus",
            "value": "online"
        },
        {
            "attribute": "call"
        },
        {
            "attribute": "app_is_foreground",
            "value": true
        }
    ],
    "chatCustomer": false,
    "userId": "USER_ID"
}

Lưu ý: REST API phải xác thực, xem chi tiết: https://developer.stringee.com/docs/call-rest-api/call-rest-api-authentication

4. Thay đổi thuộc tính của 1 user

a) Qua REST API

PUT https://api.stringee.com/v1/users/USER_ID/attributes

[
    {
        "attribute": "ATTRIBUTE_NAME",
        "value": "NEW_VALUE"
    }
]

Response:

{
    "loginTime": 1554204151774,
    "attributes": [
        {
            "attribute": "onlineStatus",
            "value": "online"
        },
        {
            "attribute": "call"
        },
        {
            "attribute": "ATTRIBUTE_NAME",
            "value": "NEW_VALUE"
        }
    ],
    "chatCustomer": false,
    "userId": "USER_ID"
}

Lưu ý: REST API phải xác thực, xem chi tiết: https://developer.stringee.com/docs/call-rest-api/call-rest-api-authentication

b) Từ Client App

Gọi hàm:

stringeeClient.changeAttribute('ATTRIBUTE_NAME', "NEW_VALUE")

5. Client nhận thông báo thay đổi thuộc tính/thông tin từ Client mình đã subscribe

stringeeClient.on('messagefromtopic', function (data) {
    console.log('++++++++++++++ messagefromtopic++++', data);
});

dữ liệu nhận sẽ có dạng:

{
    "topic": "online_status_GRDHG0HI",
    "message": {
        "newValue": "online",
        "callEnded": true,
        "attribute": "onlineStatus",
        "userId": "user_1",
        "projectId": 25,
        "timestamp": 1554261314286
    }
}