Search code examples
node.jsbotframeworktypeerrormicrosoft-teamsazure-bot-service

BotFramework TypeError: Cannot perform 'get' on a proxy that has been revoked


I am trying to develop a MS Teams bot that sends content to students module(unit) wise. I have created 3 classes:

  1. methods.js = Contains all the methods for sending texts, attachments etc.
  2. teamBot.js = Captures a specific keyword from the users and based on that executes a function.
  3. test.js = Connects the bot with Airtable and sends the content accordingly

I am facing Cannot perform 'get' on a proxy that has been revoked error. I figured it might be because of the context. I am passing context as a parameter, which I feel might not be the correct way, how can I achieve the result, and retain the context between files.

teamsBot.js

const test = require("./test");
class TeamsBot extends TeamsActivityHandler {
  constructor() {
    super();

    // record the likeCount
    this.likeCountObj = { likeCount: 0 };

    this.onMessage(async (context, next) => {
      console.log("Running with Message Activity.");
      let txt = context.activity.text;
      // const removedMentionText = TurnContext.removeRecipientMention(context.activity);
      // if (removedMentionText) {
      //   // Remove the line break
      //   txt = removedMentionText.toLowerCase().replace(/\n|\r/g, "").trim();
      // }

      // Trigger command by IM text
      switch (txt) {
        case "Begin": {
         await test.sendModuleContent(context)
        }
 

      // By calling next() you ensure that the next BotHandler is run.
      await next();
    });

    // Listen to MembersAdded event, view https://learn.microsoft.com/en-us/microsoftteams/platform/resources/bot-v3/bots-notifications for more events
    this.onMembersAdded(async (context, next) => {
      const membersAdded = context.activity.membersAdded;
      for (let cnt = 0; cnt < membersAdded.length; cnt++) {
        if (membersAdded[cnt].id) {
          const card = cardTools.AdaptiveCards.declareWithoutData(rawWelcomeCard).render();
          await context.sendActivity({ attachments: [CardFactory.adaptiveCard(card)] });
          break;
        }
      }
      await next();
    });
  }

test.js

const ms = require('./methods')
async function sendModuleContent(context) {
 data = module_text //fetched from Airtable
await ms.sendText(context, data)
}

methods.js

const {TeamsActivityHandler, ActivityHandler, MessageFactory } = require('botbuilder');


async function sendText(context, text){
    console.log("Sending text")
    await context.sendActivity(text);

}

Solution

  • Refer this: TypeError: Cannot perform 'get' on a proxy that has been revoked

    make the following changes to test.js

    const {
        TurnContext
    } = require("botbuilder");
    
    var conversationReferences = {};
    var adapter;
    
    async function sendModuleContent(context) {
        data = module_text //fetched from Airtable
    
        const currentUser = context.activity.from.id;
    
        conversationReferences[currentUser] = TurnContext.getConversationReference(context.activity);
    
        adapter = context.adapter;
        await adapter.continueConversation(conversationReferences[currentUser], async turnContext => {
            await turnContext.sendActivity(data);
        });
    }