Implementing Real Time chat SDK to bubble.io

Very Strange, Something on my end or the bubble end for sure.

One More question. We have copied the logic from the chatty app for the backend codeless experience.

image.png

We are running into the following error where a messageId is not being passed.

Here is the dump from the top of the print statements in the block coding below.

0:58:24.205 | SERVER_CODE | INFO | [2084] { context: { ___jsonclass: 'com.backendless.servercode.RunnerContext', ___class: 'com.backendless.servercode.RunnerContext', deviceType: 'JS', crossHandlerData: {}, userLocale: 'en', httpHeaders: null, userId: 'DED08AE0-385B-4A4D-B49C-BA4793F06D07', eventContext: null, userRoles: [ 'AuthenticatedUser', 'JSUser' ], userToken: '059AFEC9-8DD6-4691-B35B-ADCD33370593', prematureResult: null, missingProperties: {}, appId: '0860C0F4-E6B1-5759-FF78-D09E15245600', httpResponseHeaders: {}, userRole: [ 'AuthenticatedUser', 'JSUser' ] }, message: 'testing out the chat', publishOptions: { ___jsonclass: 'com.backendless.messaging.PublishOptions', ___class: 'com.backendless.messaging.PublishOptions', WP_TOAST_PARAMETER_TAG: 'wp-parameter', IOS_BADGE_TAG: 'ios-badge', templateValues: null, IOS_IMMEDIATE_PUSH: 'ios_immediate_push', ANDROID_TICKER_TEXT_TAG: 'android-ticker-text', WP_TOAST_SUBTITLE_TAG: 'wp-subtitle', IOS_SUBTITLE_TAG: 'ios-alert-subtitle', WP_RAW_DATA: 'wp-raw', publisherId: null, IOS_TITLE_TAG: 'ios-alert-title', WP_TILE_BACK_TITLE: 'wp-backTitle', MESSAGE_ID: 'messageId', ANDROID_LARGE_ICON_TAG: 'android-large-icon', WP_TILE_COUNT: 'wp-count', WP_CONTENT_TAG: 'wp-content', subtopic: null, ANDROID_ATTACHMENT_URL_TAG: 'android-attachment-url', WP_TYPE_TAG: 'wp-type', headers: {}, IOS_SOUND_TAG: 'ios-sound', ANDROID_CONTENT_SOUND_TAG: 'android-content-sound', OSX_SUBTITLE_TAG: 'osx-alert-subtitle', WP_BADGE_TAG: 'wp-badge', WP_TILE_BACKGROUND_IMAGE: 'wp-backgroundImage', ANDROID_SUMMARY_SUBTEXT_TAG: 'android-summary-subtext', OSX_TITLE_TAG: 'osx-alert-title', ANDROID_IMMEDIATE_PUSH: 'android_immediate_push', ANDROID_CONTENT_TITLE_TAG: 'android-content-title', ANDROID_ACTION_TAG: 'android-action', TEMPLATE_NAME: 'template_name', NOTIFICATION_ID: 'notificationId', IOS_ALERT_TAG: 'ios-alert', INLINE_REPLY: 'inline_reply', IOS_RICH_MEDIA_URL_TAG: 'ios-rich-media-url', WP_TILE_BACK_BACKGROUND_IMAGE: 'wp-backImage', WP_TILE_BACK_CONTENT: 'wp-backContent', WP_TITLE_TAG: 'wp-title', MESSAGE_TAG: 'message', ANDROID_CONTENT_TEXT_TAG: 'android-content-text' }, deliveryOptions: { ___jsonclass: 'com.backendless.messaging.DeliveryOptions', ___class: 'com.backendless.messaging.DeliveryOptions', repeatExpiresAt: null, publishAt: null, repeatEvery: 0, pushSinglecast: [], pushBroadcast: 0, publishPolicy: 'BOTH', segmentQuery: null } }

0:58:24.257 | SERVER_CODE | ERROR | [2084] TypeError: Cannot read property 'messageId' of undefined at getObjectProperty (/opt/backendless/repo/0860c0f4-e6b1-5759-ff78-d09e15245600/files/servercode/CODELESS/default/PRODUCTION/handlers/messaging/generic/afterPublish.js:5:18) at Object. (/opt/backendless/repo/0860c0f4-e6b1-5759-ff78-d09e15245600/files/servercode/CODELESS/default/PRODUCTION/handlers/messaging/generic/afterPublish.js:33:305) at Domain. (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:118:38) at Domain.run (domain.js:373:15) at /usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:117:7 at new Promise () at execute (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:52:10) at executeTask (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/executor.js:82:7) at Object.executor.execute (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/executor.js:191:22) at executeTask (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/cloud-worker.js:65:44)

How does the chatty example get the messageId. What am I doing wrong here.

The image is not displayed. Could you please repost?

@mark-piller see the file above.

I see there are two print blocks, one for Request Message and the other one is for Request. Do you have the log output for those?

16:32:13.693 | SERVER_CODE | INFO | [13356] Starting Post Save to DB Request Message

16:32:13.693 | SERVER_CODE | INFO | [13356] testing

16:32:13.693 | SERVER_CODE | INFO | [13356] Request

16:32:13.696 | SERVER_CODE | INFO | [13356] { context: { ___jsonclass: ‘com.backendless.servercode.RunnerContext’, ___class: ‘com.backendless.servercode.RunnerContext’, deviceType: ‘JS’, crossHandlerData: {}, userLocale: ‘en’, httpHeaders: null, userId: ‘DED08AE0-385B-4A4D-B49C-BA4793F06D07’, eventContext: null, userRoles: [ ‘AuthenticatedUser’, ‘JSUser’ ], userToken: ‘7DF807A0-4F85-4700-8084-846828B8AA3B’, prematureResult: null, missingProperties: {}, appId: ‘0860C0F4-E6B1-5759-FF78-D09E15245600’, httpResponseHeaders: {}, userRole: [ ‘AuthenticatedUser’, ‘JSUser’ ] }, message: ‘testing’, publishOptions: { ___jsonclass: ‘com.backendless.messaging.PublishOptions’, ___class: ‘com.backendless.messaging.PublishOptions’, WP_TOAST_PARAMETER_TAG: ‘wp-parameter’, IOS_BADGE_TAG: ‘ios-badge’, templateValues: null, IOS_IMMEDIATE_PUSH: ‘ios_immediate_push’, ANDROID_TICKER_TEXT_TAG: ‘android-ticker-text’, WP_TOAST_SUBTITLE_TAG: ‘wp-subtitle’, IOS_SUBTITLE_TAG: ‘ios-alert-subtitle’, WP_RAW_DATA: ‘wp-raw’, publisherId: null, IOS_TITLE_TAG: ‘ios-alert-title’, WP_TILE_BACK_TITLE: ‘wp-backTitle’, MESSAGE_ID: ‘messageId’, ANDROID_LARGE_ICON_TAG: ‘android-large-icon’, WP_TILE_COUNT: ‘wp-count’, WP_CONTENT_TAG: ‘wp-content’, subtopic: null, ANDROID_ATTACHMENT_URL_TAG: ‘android-attachment-url’, WP_TYPE_TAG: ‘wp-type’, headers: {}, IOS_SOUND_TAG: ‘ios-sound’, ANDROID_CONTENT_SOUND_TAG: ‘android-content-sound’, OSX_SUBTITLE_TAG: ‘osx-alert-subtitle’, WP_BADGE_TAG: ‘wp-badge’, WP_TILE_BACKGROUND_IMAGE: ‘wp-backgroundImage’, ANDROID_SUMMARY_SUBTEXT_TAG: ‘android-summary-subtext’, OSX_TITLE_TAG: ‘osx-alert-title’, ANDROID_IMMEDIATE_PUSH: ‘android_immediate_push’, ANDROID_CONTENT_TITLE_TAG: ‘android-content-title’, ANDROID_ACTION_TAG: ‘android-action’, TEMPLATE_NAME: ‘template_name’, NOTIFICATION_ID: ‘notificationId’, IOS_ALERT_TAG: ‘ios-alert’, INLINE_REPLY: ‘inline_reply’, IOS_RICH_MEDIA_URL_TAG: ‘ios-rich-media-url’, WP_TILE_BACK_BACKGROUND_IMAGE: ‘wp-backImage’, WP_TILE_BACK_CONTENT: ‘wp-backContent’, WP_TITLE_TAG: ‘wp-title’, MESSAGE_TAG: ‘message’, ANDROID_CONTENT_TEXT_TAG: ‘android-content-text’ }, deliveryOptions: { ___jsonclass: ‘com.backendless.messaging.DeliveryOptions’, ___class: ‘com.backendless.messaging.DeliveryOptions’, repeatExpiresAt: null, publishAt: null, repeatEvery: 0, pushSinglecast: [], pushBroadcast: 0, publishPolicy: ‘BOTH’, segmentQuery: null } }

16:32:13.696 | SERVER_CODE | INFO | [13356] Chat ID

16:32:13.697 | SERVER_CODE | INFO | [13356] undefined

16:32:13.802 | SERVER_CODE | ERROR | [13356] TypeError: Cannot read property ‘messageId’ of undefined at getObjectProperty (/opt/backendless/repo/0860c0f4-e6b1-5759-ff78-d09e15245600/files/servercode/CODELESS/default/PRODUCTION/handlers/messaging/generic/afterPublish.js:5:18) at Object. (/opt/backendless/repo/0860c0f4-e6b1-5759-ff78-d09e15245600/files/servercode/CODELESS/default/PRODUCTION/handlers/messaging/generic/afterPublish.js:36:305) at Domain. (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:118:38) at Domain.run (domain.js:373:15) at /usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:117:7 at new Promise () at execute (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:52:10) at executeTask (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/executor.js:82:7) at Object.executor.execute (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/executor.js:191:22) at executeTask (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/cloud-worker.js:65:44)

Unofrtunately this doesn’t help. I am trying to correlate the log output to the print blocks in your logic and they do not match up. Most importantly, I’d like to see what specifically the Request Message and Request objects look like. It is important since the logic works with the properties in these objects.

Hi @mark-piller
Here is the printout of the code you requested

This is the Requested Message

testing

Here is the request

19:29:52.346 | SERVER_CODE | INFO | [5761] { context: { ___jsonclass: 'com.backendless.servercode.RunnerContext', ___class: 'com.backendless.servercode.RunnerContext', deviceType: 'JS', crossHandlerData: {}, userLocale: 'en', httpHeaders: null, userId: 'DED08AE0-385B-4A4D-B49C-BA4793F06D07', eventContext: null, userRoles: [ 'AuthenticatedUser', 'JSUser' ], userToken: '7DF807A0-4F85-4700-8084-846828B8AA3B', prematureResult: null, missingProperties: {}, appId: '0860C0F4-E6B1-5759-FF78-D09E15245600', httpResponseHeaders: {}, userRole: [ 'AuthenticatedUser', 'JSUser' ] }, message: 'testing', publishOptions: { ___jsonclass: 'com.backendless.messaging.PublishOptions', ___class: 'com.backendless.messaging.PublishOptions', WP_TOAST_PARAMETER_TAG: 'wp-parameter', IOS_BADGE_TAG: 'ios-badge', templateValues: null, IOS_IMMEDIATE_PUSH: 'ios_immediate_push', ANDROID_TICKER_TEXT_TAG: 'android-ticker-text', WP_TOAST_SUBTITLE_TAG: 'wp-subtitle', IOS_SUBTITLE_TAG: 'ios-alert-subtitle', WP_RAW_DATA: 'wp-raw', publisherId: null, IOS_TITLE_TAG: 'ios-alert-title', WP_TILE_BACK_TITLE: 'wp-backTitle', MESSAGE_ID: 'messageId', ANDROID_LARGE_ICON_TAG: 'android-large-icon', WP_TILE_COUNT: 'wp-count', WP_CONTENT_TAG: 'wp-content', subtopic: null, ANDROID_ATTACHMENT_URL_TAG: 'android-attachment-url', WP_TYPE_TAG: 'wp-type', headers: {}, IOS_SOUND_TAG: 'ios-sound', ANDROID_CONTENT_SOUND_TAG: 'android-content-sound', OSX_SUBTITLE_TAG: 'osx-alert-subtitle', WP_BADGE_TAG: 'wp-badge', WP_TILE_BACKGROUND_IMAGE: 'wp-backgroundImage', ANDROID_SUMMARY_SUBTEXT_TAG: 'android-summary-subtext', OSX_TITLE_TAG: 'osx-alert-title', ANDROID_IMMEDIATE_PUSH: 'android_immediate_push', ANDROID_CONTENT_TITLE_TAG: 'android-content-title', ANDROID_ACTION_TAG: 'android-action', TEMPLATE_NAME: 'template_name', NOTIFICATION_ID: 'notificationId', IOS_ALERT_TAG: 'ios-alert', INLINE_REPLY: 'inline_reply', IOS_RICH_MEDIA_URL_TAG: 'ios-rich-media-url', WP_TILE_BACK_BACKGROUND_IMAGE: 'wp-backImage', WP_TILE_BACK_CONTENT: 'wp-backContent', WP_TITLE_TAG: 'wp-title', MESSAGE_TAG: 'message', ANDROID_CONTENT_TEXT_TAG: 'android-content-text' }, deliveryOptions: { ___jsonclass: 'com.backendless.messaging.DeliveryOptions', ___class: 'com.backendless.messaging.DeliveryOptions', repeatExpiresAt: null, publishAt: null, repeatEvery: 0, pushSinglecast: [], pushBroadcast: 0, publishPolicy: 'BOTH', segmentQuery: null } }

Mark, I am wondering how I use the publish with Headers to provide a chat ID and to and from. I feel like i am missing the documentation on how to build the calls for the backend I am working on based on Chatty. Is there some documentation I am missing. It would be the same setup for the to, from, readby chatid and messageId

pubOps = new Backendless.PublishOptions({
        headers: {
            chatId: "Chat12345",
            to:"Mark"
        }
    });
Backendless.Messaging.publish( "default", "Input Add Chat Here's value", pubOps )
.then( function( result ) {
    console.log( "message has been published" );
  })
.catch( function( error ) {
    console.log( "error publishing the message - " + error );
  })

Here is my current backend workflow

and here are the results

22:14:52.359 | SERVER_CODE | INFO | [6422] RequestMessage
22:14:52.359 | SERVER_CODE | INFO | [6422] "test chat"
22:14:52.359 | SERVER_CODE | INFO | [6422] Request
22:14:52.362 | SERVER_CODE | INFO | [6422] { context: { ___jsonclass: 'com.backendless.servercode.RunnerContext', ___class: 'com.backendless.servercode.RunnerContext', deviceType: 'JS', crossHandlerData: {}, userLocale: 'en', httpHeaders: null, userId: 'DED08AE0-385B-4A4D-B49C-BA4793F06D07', eventContext: null, userRoles: [ 'AuthenticatedUser', 'JSUser' ], userToken: 'C47EF024-B065-4692-8A52-CCB823B92FF0', prematureResult: null, missingProperties: {}, appId: '0860C0F4-E6B1-5759-FF78-D09E15245600', httpResponseHeaders: {}, userRole: [ 'AuthenticatedUser', 'JSUser' ] }, message: 'test chat', publishOptions: { ___jsonclass: 'com.backendless.messaging.PublishOptions', ___class: 'com.backendless.messaging.PublishOptions', WP_TOAST_PARAMETER_TAG: 'wp-parameter', IOS_BADGE_TAG: 'ios-badge', templateValues: null, IOS_IMMEDIATE_PUSH: 'ios_immediate_push', ANDROID_TICKER_TEXT_TAG: 'android-ticker-text', WP_TOAST_SUBTITLE_TAG: 'wp-subtitle', IOS_SUBTITLE_TAG: 'ios-alert-subtitle', WP_RAW_DATA: 'wp-raw', publisherId: null, IOS_TITLE_TAG: 'ios-alert-title', WP_TILE_BACK_TITLE: 'wp-backTitle', MESSAGE_ID: 'messageId', ANDROID_LARGE_ICON_TAG: 'android-large-icon', WP_TILE_COUNT: 'wp-count', WP_CONTENT_TAG: 'wp-content', subtopic: null, ANDROID_ATTACHMENT_URL_TAG: 'android-attachment-url', WP_TYPE_TAG: 'wp-type', headers: { chatId: 'Chat12345', to: 'Mark' }, IOS_SOUND_TAG: 'ios-sound', ANDROID_CONTENT_SOUND_TAG: 'android-content-sound', OSX_SUBTITLE_TAG: 'osx-alert-subtitle', WP_BADGE_TAG: 'wp-badge', WP_TILE_BACKGROUND_IMAGE: 'wp-backgroundImage', ANDROID_SUMMARY_SUBTEXT_TAG: 'android-summary-subtext', OSX_TITLE_TAG: 'osx-alert-title', ANDROID_IMMEDIATE_PUSH: 'android_immediate_push', ANDROID_CONTENT_TITLE_TAG: 'android-content-title', ANDROID_ACTION_TAG: 'android-action', TEMPLATE_NAME: 'template_name', NOTIFICATION_ID: 'notificationId', IOS_ALERT_TAG: 'ios-alert', INLINE_REPLY: 'inline_reply', IOS_RICH_MEDIA_URL_TAG: 'ios-rich-media-url', WP_TILE_BACK_BACKGROUND_IMAGE: 'wp-backImage', WP_TILE_BACK_CONTENT: 'wp-backContent', WP_TITLE_TAG: 'wp-title', MESSAGE_TAG: 'message', ANDROID_CONTENT_TEXT_TAG: 'android-content-text' }, deliveryOptions: { ___jsonclass: 'com.backendless.messaging.DeliveryOptions', ___class: 'com.backendless.messaging.DeliveryOptions', repeatExpiresAt: null, publishAt: null, repeatEvery: 0, pushSinglecast: [], pushBroadcast: 0, publishPolicy: 'BOTH', segmentQuery: null } }
22:14:52.362 | SERVER_CODE | INFO | [6422] UserID
22:14:52.362 | SERVER_CODE | INFO | [6422] DED08AE0-385B-4A4D-B49C-BA4793F06D07
22:14:52.362 | SERVER_CODE | INFO | [6422] ChatID
22:14:52.363 | SERVER_CODE | INFO | [6422] undefined
22:14:52.363 | SERVER_CODE | INFO | [6422] { ___jsonclass: 'com.backendless.messaging.PublishOptions', ___class: 'com.backendless.messaging.PublishOptions', WP_TOAST_PARAMETER_TAG: 'wp-parameter', IOS_BADGE_TAG: 'ios-badge', templateValues: null, IOS_IMMEDIATE_PUSH: 'ios_immediate_push', ANDROID_TICKER_TEXT_TAG: 'android-ticker-text', WP_TOAST_SUBTITLE_TAG: 'wp-subtitle', IOS_SUBTITLE_TAG: 'ios-alert-subtitle', WP_RAW_DATA: 'wp-raw', publisherId: null, IOS_TITLE_TAG: 'ios-alert-title', WP_TILE_BACK_TITLE: 'wp-backTitle', MESSAGE_ID: 'messageId', ANDROID_LARGE_ICON_TAG: 'android-large-icon', WP_TILE_COUNT: 'wp-count', WP_CONTENT_TAG: 'wp-content', subtopic: null, ANDROID_ATTACHMENT_URL_TAG: 'android-attachment-url', WP_TYPE_TAG: 'wp-type', headers: { chatId: 'Chat12345', to: 'Mark' }, IOS_SOUND_TAG: 'ios-sound', ANDROID_CONTENT_SOUND_TAG: 'android-content-sound', OSX_SUBTITLE_TAG: 'osx-alert-subtitle', WP_BADGE_TAG: 'wp-badge', WP_TILE_BACKGROUND_IMAGE: 'wp-backgroundImage', ANDROID_SUMMARY_SUBTEXT_TAG: 'android-summary-subtext', OSX_TITLE_TAG: 'osx-alert-title', ANDROID_IMMEDIATE_PUSH: 'android_immediate_push', ANDROID_CONTENT_TITLE_TAG: 'android-content-title', ANDROID_ACTION_TAG: 'android-action', TEMPLATE_NAME: 'template_name', NOTIFICATION_ID: 'notificationId', IOS_ALERT_TAG: 'ios-alert', INLINE_REPLY: 'inline_reply', IOS_RICH_MEDIA_URL_TAG: 'ios-rich-media-url', WP_TILE_BACK_BACKGROUND_IMAGE: 'wp-backImage', WP_TILE_BACK_CONTENT: 'wp-backContent', WP_TITLE_TAG: 'wp-title', MESSAGE_TAG: 'message', ANDROID_CONTENT_TEXT_TAG: 'android-content-text' }
22:14:52.430 | SERVER_CODE | ERROR | [6422] TypeError: Cannot read property 'messageId' of undefined at getObjectProperty (/opt/backendless/repo/0860c0f4-e6b1-5759-ff78-d09e15245600/files/servercode/CODELESS/default/PRODUCTION/handlers/messaging/generic/afterPublish.js:5:18) at Object. (/opt/backendless/repo/0860c0f4-e6b1-5759-ff78-d09e15245600/files/servercode/CODELESS/default/PRODUCTION/handlers/messaging/generic/afterPublish.js:40:305) at Domain. (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:118:38) at Domain.run (domain.js:373:15) at /usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:117:7 at new Promise () at execute (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/invoke-handler.js:52:10) at executeTask (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/executor.js:82:7) at Object.executor.execute (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/tasks/executor.js:191:22) at executeTask (/usr/local/lib/node_modules/backendless-coderunner/lib/server-code/runners/cloud-worker.js:65:44)
22:14:52.431 | SERVER_CODE | INFO | [6422] Processing finished in 168.151ms

Once i can get the two fields setup I assume I can then do filtered messaging for each user to get chats directed to that user? or is there another way you recommend doing this.

If the Request Message prints just "testing", it means the following elements of the logic will fail because they expect that Request Message is an object:

I also tried message publishing with headers and subscription for filtered messages. The links I shared before have been updated with that code, you’re welcome to try it out.

I followed the examples we publish in our documentation:

Publishing a message with headers:
https://backendless.com/docs/js/pubsub_publish_with_headers.html

Subscribing to receive filtered messages:
https://backendless.com/docs/js/pubsub_message_filtering.html#filtering-of-dictionarymap-messages

I used UI Builder to publish messages. Here’s my codeless logic:

The system generates the following code:

await Backendless.Messaging.publish(
'default', 
(getObjectProperty(___arguments.context.pageData, 'msg')), 
new Backendless.PublishOptions({ subtopic: '', 
                                headers: ({ 'importance': 'high','chatId': '12345' }) }), 
                                new Backendless.DeliveryOptions({ publishPolicy: 'PUBSUB' }));

The code can be simplified to look like this:

var channel = "default",
    message = "whatever the user typed into the input field",
    pubOps = new Backendless.PublishOptions({
        headers: {
            importance: "high",
            chatId: "12345"
        }
    });

await Backendless.Messaging.publish( channel, message, pubOps );

On the subscription side, the code looks like this:

    var channel = Backendless.Messaging.subscribe( "default" );
    
    function onMessage( msg ) {
      console.log( msg );
      console.log( "Message received: " + msg.message )
    }
    
    var selector = "importance = 'high' and chatId = '12345'"; 
    channel.addMessageListener( selector, onMessage );

Hope this helps.

Mark

Thanks Mark! I will be playing with this here. How are you generating unique chatID is that being generated from another place in your app?

Hello @Invited4

I don’t know Mark’s schema, but I suppose the chatId should be an objectId from table “Chats”.

Regards,
Viktor

Hello,

Did anyone of you succesfully implemented RTC info bubble? If so, how do you show-biznesu these data in RG?