realtime_check_permission( )
Checks permissions for a subscriber on a channel or channel resource.
Description
The realtime_check_permission
hook is triggered when a site visitor subscribes
to a channel to check what permissions the subscriber will have.
The realtime_check_permission()
function is not a function that you call from
your code. You define the function in a file named realtime-permissions.js
in your site's Backend section.
If this function is not defined, all subscribers will receive the default permissions,
which are:
{"read": true}
Implement permissions logic for channels and subscribers by either:
- Including all permissions logic in the body of this function.
- Use the
PermissionsRouter
to add permissions logic per channel. Then callcheck()
in the body of this function and return the permissions object it returns.
Note: When previewing your site, permissions for read are always granted.
Syntax
function realtime_check_permission(channel: Channel, subscriber: Subscriber): Promise<ChannelPermissions> | ChannelPermissions
realtime_check_permission Parameters
NAME
TYPE
DESCRIPTION
The channel, and optionally the resource, to check permissions for.
The subscriber to check permissions for.
Returns
The permissions granted to the subscriber on the channel or channel resource.
Return Type:
|
ChannelPermissionsChannelPermissions
ChannelPermissions
NAME
TYPE
DESCRIPTION
Whether the subscriber has read permissions. Defaults to true
.
Was this helpful?
1// In realtime-permissions.js23export function realtime_check_permission(channel, subscriber) {4 // set default permissions5 let permissions = {"read": true};67 if(channel.name === "MembersOnly") {8 if(subscriber.type === "Member"){9 permissions.read = true;10 }11 else {12 permissions.read = false;13 }14 }1516 return permissions;17}
1// In realtime-permissions.js23import {permissionsRouter} from 'wix-realtime-backend';45permissionsRouter.default( (channel, subscriber) => {6 return {"read": true};7} );89const membersOnlyChannel = {"name": "MembersOnly"};1011permissionsRouter.add(membersOnlyChannel, (channel, subscriber) => {12 if(subscriber.type === "Member") {13 return {"read": true};14 }15 else {16 return {"read": false};17 }18});1920export function realtime_check_permission(channel, subscriber) {21 return permissionsRouter.check(channel,subscriber);22}
1// In realtime-permissions.js23import { members } from `wix-members-backend`;45export async function realtime_check_permission(channel, subscriber) {6 // set default permissions7 let permissions = { "read": true };89 if(channel.name === "BobsOnly") {10 let member = await members.getMember(subscriber.id, { fieldsets: ['FULL'] });11 if(member.contactDetails.firstName === "Bob") {12 permissions.read = true;13 }14 else {15 permissions.read = false;16 }17 }1819 return permissions;20}
1// In realtime-permissions.js23import { members } from `wix-members-backend`;4import { permissionsRouter } from 'wix-realtime-backend';56permissionsRouter.default((channel, subscriber) => {7 return {"read": true};8});910const membersOnlyChannel = {"name": "MembersOnly"};1112permissionsRouter.add( membersOnlyChannel, async (channel, subscriber) => {13 let member = await members.getMember(subscriber.id, { fieldsets: ['FULL'] });1415 if(channel.resourceId === "BobsOnly") {16 if(member.contactDetails.firstName === "Bob") {17 return { "read": true };18 }19 else {20 return { "read": false };21 }22 }23 else {24 return { "read": true };25 }26} );2728export function realtime_check_permission(channel, subscriber) {29 return permissionsRouter.check(channel, subscriber);30}
You can test out the code in our example template.
1import { subscribe } from 'wix-realtime';2import { publishMessage } from 'backend/realtime';34const updatesChannel = {name: 'updates'};5const updatesMembersChannel = {name: 'updates', resourceId: 'members'};6const updatesAdminsChannel = {name: 'updates', resourceId: 'admins'};7const updatesGuestsChannel = {name: 'updates', resourceId: 'guests'};89$w.onReady(function () {10 subscribeToChannels();11 setupPublishButtons();12});1314function subscribeToChannels() {15 subscribe(updatesChannel, messageHandler)16 .catch(() => console.log('Not subscribed to updates channel'));17 subscribe(updatesMembersChannel, messageHandler)18 .catch(() => console.log('Not subscribed to members channel'));19 subscribe(updatesAdminsChannel, messageHandler)20 .catch(() => console.log('Not subscribed to admins channel'));21 subscribe(updatesGuestsChannel, messageHandler)22 .catch(() => console.log('Not subscribed to guest channel'));23}2425function messageHandler(message, channel) {26 const channelName = channel.name;27 const channelResource = channel.resourceId ? `-${channel.resourceId}` : '';28 let newMessageLine = `${channelName}${channelResource}: ${message.payload}\n`;29 $w('#receivedMessages').value += newMessageLine;30}3132function setupPublishButtons() {33 $w('#updateButton').onClick(event => {34 publish(event.target, updatesChannel);35 });3637 $w('#memberUpdateButton').onClick(event => {38 publish(event.target, updatesMembersChannel);39 });4041 $w('#adminUpdateButton').onClick(event => {42 publish(event.target, updatesAdminsChannel);43 });4445 $w('#guestUpdateButton').onClick(event => {46 publish(event.target, updatesGuestsChannel);47 });48}4950async function publish(button, channel) {51 if ($w('#message').value) {52 button.disable();53 $w('#message').disable();5455 await publishMessage(channel, $w('#message').value);5657 $w('#message').value = undefined;58 $w('#message').enable();59 button.enable();60 }61}