Electron sdk zoomsdk InitSDK got error 14 in windows

Description
Hello We use Zoom Electron SDK 5.12.2 , Recently we found that some Windows users will return 14 when calling the InitSDK method. Restarting the app in time also gets 14, unless the computer is restarted. Please help to see what is going on. The user’s computer does not have zoom and other video conferencing clients installed.

Which Electron Meeting SDK version?
We use Electron SDK 5.12.2
and in version.txt: win32 native sdk version:win_meetingsdk_5.12.2.9319_x86

Additional context

const request = require('request');
const ZOOMSDKMOD = require('../lib/zoom_sdk.js');

const {
  ZOOM_TYPE_OS_TYPE,
  ZoomSDK_LANGUAGE_ID = {},
  ZoomSDKError,
  ZoomAuthResult,
  ZoomUserType,
  ZoomMeetingStatus,
  ZoomAPPLocale
} = require('../lib/settings.js');

const logger = log4js.getLogger('zoom');

let DOMAIN;
let APPKEY = "****" 
let APPSECRET = "****"
let LANGID = ZoomSDK_LANGUAGE_ID.LANGUAGE_English;

let zoomsdk;
let zoommeeting;
let zoomauth;
let zoominfomod;
let startMeetingCallback;
let joinMeetingCallback;
let meetingnum;
let zoomDirectShare;

let retryTimes = 0;

let resolveTemp;
let rejectTemp;
const ProcSDKReady = () => {
  return new Promise((resolve, reject) => {
    resolveTemp = resolve
    rejectTemp = reject
    const options = {
      authcb: (result) => {
        if (ZoomAuthResult.AUTHRET_SUCCESS === result) {
          const opts = {
            meetingstatuscb: (status, ret) => {
              if (ZoomMeetingStatus.MEETING_STATUS_INMEETING === status) {
                // ZoomMeetingStatus.MEETING_STATUS_INMEETING => 3
                if (!zoominfomod) {
                  zoominfomod = zoommeeting.GetMeetingInfo();
                }
                if (typeof startMeetingCallback === 'function') {
                  const number = zoominfomod.GetMeetingNumber();
                  const meetingUrl = zoominfomod.GetJoinMeetingUrl();
                  const m = meetingUrl.match(/\?pwd=([^=&]+)/i);
                  const password = m ? m[1] : '';
                  startMeetingCallback({
                    meetingCode: number,
                    meetingUrl,
                    password,
                  });
                  startMeetingCallback = null;
                } else if (typeof joinMeetingCallback === 'function') {

                  joinMeetingCallback({
                    meetingStatus: status,
                  });
                  joinMeetingCallback = null;
                }
              } else if (ZoomMeetingStatus.MEETING_STATUS_ENDED === status) {
                // ZoomMeetingStatus.MEETING_STATUS_ENDED => 7
                if (typeof joinMeetingCallback === 'function') {
                  joinMeetingCallback({
                    meetingStatus: status,
                  });
                  joinMeetingCallback = null;
                } else if (typeof startMeetingCallback === 'function') {
                  startMeetingCallback({
                    meetingStatus: status,
                    errorMsg: null,
                  });
                }
              }
            },
            meetinguserjoincb: (useritem) => {
              // console.log('==meetinguserjoincb', useritem);
            },
            meetinguserleftcb: (userid) => {
              // console.log('==meetinguserleftcb', userid);
            },
            meetinghostchangecb: (userid) => {
              // console.log('==meetinghostchangecb', userid);
            },
          };
          zoommeeting = zoomsdk.GetMeeting(opts);
          zoominfomod = zoommeeting.GetMeetingInfo();
          resolveTemp();
        } else {
          rejectTemp(new Error(`zoom auth result ${result}`));
        }
      },
      logincb: null,
      logoutcb: null,
    };

    zoomauth = zoomsdk.GetAuth(options);
    zoomauth.SDKAuth(APPKEY, APPSECRET);
    zoomDirectShare = zoomauth.GetDirectShare()
  });
};

const apicallresultcb = (apiname, ret) => {
  if (apiname === 'InitSDK' && ZoomSDKError.SDKERR_SUCCESS === ret) {
    ProcSDKReady();
  }
};

const initoptions = {
  apicallretcb: apicallresultcb,
  ostype: ZOOM_TYPE_OS_TYPE.WIN_OS,
};
initoptions.path = process.platform === 'darwin' ? './../sdk/mac/' : './../sdk/win32/';

zoomsdk = ZOOMSDKMOD.ZoomSDK.getInstance(initoptions);


const setDomain = () => {
  return new Promise((resolve, reject) => {
    const opts = {
      path: '', // win require absolute path, mac require ''
      domain: DOMAIN,
      enable_log: false,
      langid: LANGID,
    };
    const ret = zoomsdk.InitSDK(opts);
    if (ZoomSDKError.SDKERR_SUCCESS === ret) {
      ProcSDKReady()
        .then(() => {
          resolve();
          logger.info('InitSDK success');
        })
        .catch((ex) => {
          resolve(ex);
          logger.info('InitSDK ProcSDKReady error', ex.message);
        });
    } else {
	  reject(new Error(`zoomsdk initSDK error[${ret}]`));
      logger.info('InitSDK error', ret);
    }
  })
};

const retry = (func, callback) => {
  retryTimes++
  if (retryTimes > 1) {
    ubtElectron.trace(DEVTRACE.RETRY_FAIL, { meetingnum, result: 'retry fail' })
    callback()
    retryTimes = 0
    return
  }
  logger.info('ZOOM retry init,times:', retryTimes);
  zoommeeting.LeaveMeeting()
  setTimeout(() => {
    zoomsdk = ZOOMSDKMOD.ZoomSDK.getInstance(initoptions);
    func()
  }, 3000)

}

const ZOOM = {

  Init: (lang) => {
    return new Promise((resolve, reject) => {
      if (lang) {
        LANGID = lang.startsWith('zh') ? ZoomSDK_LANGUAGE_ID.LANGUAGE_Chinese_Simplified : ZoomSDK_LANGUAGE_ID.LANGUAGE_English;
      }
      if (DOMAIN) {
        if (zoommeeting) {
          resolve();
        } else {
          ProcSDKReady().then(() => {
            resolve();
          }).catch(ex => {
            resolve(ex);
          });
        }
      } else {
        identityauth2
          .getAuth(mainContext)
          .then(({ identityauth2Entity, corpId }) => {
            const url = 'xxxxxxxxxxxxxxx' //get appkey appsecret and domain from server
            const options = {
              url,
              headers: {
                identityAuth2: JSON.stringify(identityauth2Entity),
                corpId,
                moduleId: mainContext.config.getModuleId(),
              },
              json: true,
              agentOptions: url.startsWith('https://') ? agent.httpsAgent : agent.httpAgent,
            };

            request(options, (err, response, body = {}) => {
              if (err) {
                
                resolve(err);
                logger.info('getZoomToken error', err);
                return;
              }
              if (response.statusCode === 200) {
                let { serviceDomain, key, secret, urlPrefix, provider } = response.body
                DOMAIN = serviceDomain
                APPKEY = key
                APPSECRET = secret
                PROVIDER = provider
                mainContext.zoomUrlPrefix = urlPrefix
                logger.info('domain,key,secret', DOMAIN, APPKEY, APPSECRET);
                setDomain()
                  .then((result) => {
                    resolve(result);
                  })
                  .catch((ex) => {
                    DOMAIN = '';
                    resolve(ex);
                  });
              } else {
                resolve(new Error(`Get zoom service domain error[${response.statusCode}]: ${body.errMsg}`));
                logger.info('domain api error', response.statusCode, body.errMsg);
              }
            })
          }).catch(ex => {
            resolve(ex);
            logger.info('identity error', ex.message);
          })
      }
    });
  },
  StartMeeting: (data, callback) => {
    meetingnum = data.meetingnum
    setDomain()
    ZOOM.Init().then((err) => {
      if (err) {
        callback({
          sdkStatus: 'error',
          errorMsg: err.message || err.toString(),
        });
        return;
      }
      if (!zoommeeting) {
        callback({
          sdkStatus: 'error',
          errorMsg: 'zoommeeting is not available',
        });
        return;
      }
      const result = zoommeeting.StartMeetingWithOutLogin({
        ...data,
        zoomusertype: ZoomUserType.ZoomUserType_EMAIL_LOGIN,
      });

      if (ZoomSDKError.SDKERR_SUCCESS === result) {
        retryTimes = 0
        startMeetingCallback = callback;
      } else {
        retry(ZOOM.StartMeeting.bind(this, data, callback), callback.bind(this, {
          sdkStatus: result,
          errorMsg: null,
        }))
      }
    });
  },
  JoinMeeting: (data, callback) => {
    let result;
    meetingnum = data.meetingnum
    ZOOM.Init().then((err) => {
      if (err) {
        return callback({
          sdkStatus: 'error',
          errorMsg: err.message || err.toString(),
        });
      }
      if (!zoommeeting) {
        callback({
          sdkStatus: 'error',
          errorMsg: 'zoommeeting is not available',
        });
        return;
      }
      if (zoommeeting) {
        result = zoommeeting.JoinMeetingWithoutLogin(data);
      }
      if (ZoomSDKError.SDKERR_SUCCESS === result) {
        joinMeetingCallback = callback;
        retryTimes = 0
      } else {
        retry(ZOOM.JoinMeeting.bind(this, data, callback), callback.bind(this, {
          sdkStatus: result,
          errorMsg: null,
        }))
      }
    })
  },
  CleanUPSDK: () => {
    if (zoomsdk) {
      zoomsdk.CleanUPSDK();
    }
  },
  LeaveMeeting: (endMeeting) => {
    ZOOM.Init().then((err) => {
      if (err) {
        return;
      }
      if (zoommeeting) {
        zoommeeting.LeaveMeeting({
          endMeeting,
        });
      }
    });
  }
};

module.exports = ZOOM;

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.