SDK 0.9.0-rc.0
Member SDK
Member adalah user terautentikasi milik aplikasi customer. Member berbeda dari Visitor yang bersifat sementara dan Agent yang bekerja untuk tenant.
Status: universal communication release candidate
Rilis 0.9 menyediakan direct/group chat, P2P direct audio/video, managed group audio/video, selected/all-member ringing, upgrade direct call, dan host transfer. Ringnity memilih media plane dari server; aplikasi tidak memilih LiveKit.
Apa yang bisa dibangun
Gunakan Member sebagai baseline universal untuk aplikasi chat, komunitas, game, kelas, telehealth, atau meeting dengan user terautentikasi. Ringnity mengelola authorization, durable chat, receipt, realtime, signaling, direct P2P media, group media, reconnect, dan transport policy. Aplikasi customer mengelola login, relationship bisnis, navigasi, branding, conversation UI, call controls, dan layout participant.
Core meeting berbasis chat dan group audio/video siap dibangun secara headless. Screen sharing, server recording, captions, dan waiting room belum termasuk public contract 0.9 dan tidak boleh diasumsikan tersedia.
1. Customer backend menerbitkan token
const issued = await server.tokens.createMemberToken({
externalId: authenticatedUser.id,
displayName: authenticatedUser.displayName,
scopes: [
"member:profile:read", "member:conversations:read",
"member:conversations:write",
"member:messages:read", "member:messages:write",
"member:receipts:write", "member:attachments:write",
"member:calls:read", "member:calls:write",
"member:devices:write", "member:realtime:connect",
],
});Server API credential membutuhkan scope server:member-token:write dan tidak pernah masuk ke browser atau aplikasi mobile.
2. Backend mengizinkan pasangan Member
const granted = await server.memberConversations.grant({
memberExternalIds: [authenticatedUser.id, peerUser.id],
});Operasi backend-only ini membutuhkan server:member-conversation:write. Client tidak dapat membuat relationship sendiri.
3. Aplikasi membuka direct chat
const member = new RingnityMember({ tokenProvider: fetchMemberToken });
const profile = await member.getProfile();
const chat = await member.openConversation(peerMemberId);
await member.sendMessage(chat.conversation.conversationId, {
body: "Hello",
clientMessageId: crypto.randomUUID(),
});
await member.connect();
member.subscribe(chat.conversation.conversationId);Kontrak yang sama tersedia pada TypeScript, React Native, Flutter, Kotlin, dan Swift.
4. Aplikasi membuat group chat
const group = await member.createGroup({
title: "Product community",
memberIds: selectedMemberIds,
clientRequestId: crypto.randomUUID(),
});
await member.sendMessage(group.conversationId, { body: "Welcome" });
await member.inviteGroupMembers(group.groupId, additionalMemberIds);Select all diselesaikan UI menjadi daftar memberIds eksplisit agar retry deterministik dan perubahan directory tidak memperluas audience secara diam-diam.
5. Aplikasi membuat direct call
const call = await member.createCall(chat.conversation.conversationId, {
callChannel: "video",
});
member.on("call.incoming", async ({ call }) => {
await member.acceptCall(call.id);
});SDK mengelola media P2P, SDP/ICE replay, dan TURN/TLS. Aplikasi tetap memiliki UI/UX dan keputusan accept/decline.
6. Aplikasi membuat group call
const room = await member.createCallRoom({
sourceConversationId: group.conversationId,
initialMedia: "video",
audienceScope: "selected_members",
inviteeMemberIds: selectedMemberIds,
});
const media = await member.joinManagedCallRoom(room.callRoomId, {
microphoneEnabled: true,
cameraEnabled: true,
});Gunakan audienceScope all_members untuk mengundang seluruh anggota aktif. Untuk mengubah direct call aktif menjadi group call, kirim upgradeFromCallSessionId pada createCallRoom.
7. Aktifkan incoming call di background
await member.registerDevice({
platform: "ios",
provider: "apns_voip",
token: pushKitToken,
apnsEnvironment: "production",
});Gunakan APNs VoIP pada iOS atau FCM pada Android. Push hanya membangunkan aplikasi; SDK tetap mengambil status dan signaling yang server-authorized setelah reconnect.
Batas keamanan
- Satu externalId unik hanya di dalam tenant customer.
- Token Member tidak dapat digunakan sebagai Visitor atau Agent.
- Member yang dinonaktifkan langsung kehilangan akses walau JWT belum kedaluwarsa.
- Revocation backend menutup membership kedua pihak tanpa menghapus riwayat.
- AI customer service tetap Agent dengan policy AI dan human handoff.
Turn Your Website Into a Real-Time Call Center
Let customers call your team directly from your website, no phone numbers and no apps required. Just add one <script>.
