diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 237fcd369ea..00000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,555 +0,0 @@ -# Required Env Vars -# NPM_TOKEN - -version: 2.1 -# reusable environment for all jobs -executors: - main-executor: - working_directory: ~/webex-js-sdk - docker: - - image: cimg/node:16.16.0-browsers - -# orbs -orbs: - browser-tools: circleci/browser-tools@1.4.2 - -# Reusable commands for jobs -commands: - install_graphicsmagick_and_libgcrypt: - description: "Install graphicsmagick and libgcrypt" - steps: - - run: | - sudo apt-get update - sudo apt-get install -y graphicsmagick libgcrypt-dev - checkout_and_fetch_tags: - description: "Checkout and fetch tags" - steps: - - checkout - - run: git remote add upstream git@github.com:webex/webex-js-sdk.git - - run: git fetch upstream --tags - restore_node_modules: - description: "Restore the node_modules dependencies cache" - steps: - - restore_cache: - keys: - - node-modules-cache-node-Gallium-npm-6-{{ .Environment.CACHE_VERSION }}-{{ checksum "yarn.lock" }} - - node-modules-cache-node-Gallium-npm-6-{{ .Environment.CACHE_VERSION }}- - # Cache workaround to cache patch changes - # https://github.com/ds300/patch-package#docker-and-ci - - run: - name: "Hash patch-package patches" - command: cat patches/* | md5sum > patches.hash - restore_built_packages: - description: "Restore built packages" - steps: - - attach_workspace: - at: ~/webex-js-sdk - skip_check: - description: "Check to see if testing needs to be skipped" - steps: - - run: - name: Check if we need to skip - command: if [[ -z $(node tooling/modified-packages.js) ]]; then circleci step halt; fi - -jobs: - yarn_install: - executor: main-executor - environment: - SAUCE_CONNECT_DOWNLOAD_ON_INSTALL: true - steps: - - install_graphicsmagick_and_libgcrypt - - checkout_and_fetch_tags - - run: - name: "Install dependencies" - command: yarn - # Cache workaround to cache patch changes - # https://github.com/ds300/patch-package#docker-and-ci - - run: - name: "Hash patch-package patches" - command: cat patches/* | md5sum > patches.hash - # Cache node_modules across different internal jobs in the workflow and across different circleci runs - - save_cache: - key: node-modules-cache-node-Gallium-npm-6-{{ .Environment.CACHE_VERSION }}-{{ checksum "yarn.lock" }} - paths: - - node_modules - - run: - name: "Save yarn install log" - command: yarn info --json > /tmp/yarn_install.log || true - - store_artifacts: - path: /tmp/yarn_install.log - destination: yarn-install - - build: - executor: main-executor - parameters: - env: - type: string - default: "test" - environment: - NODE_ENV: << parameters.env >> - steps: - - install_graphicsmagick_and_libgcrypt - - checkout_and_fetch_tags - - restore_node_modules - - run: - name: "Build all packages" - command: yarn run build - # Save the dist/ folder of the packages for other jobs in the workflow - - persist_to_workspace: - root: ~/webex-js-sdk - paths: - - packages - - build_production: - executor: main-executor - environment: - NODE_ENV: production - ATLAS_SERVICE_URL: "https://atlas-a.wbx2.com/admin/api/v1" - CONVERSATION_SERVICE: "https://conv-a.wbx2.com/conversation/api/v1" - ENCRYPTION_SERVICE_URL: "https://encryption-a.wbx2.com" - HYDRA_SERVICE_URL: "https://api.ciscospark.com/v1/" - IDBROKER_BASE_URL: "https://idbroker.webex.com" - IDENTITY_BASE_URL: "https://identity.webex.com" - U2C_SERVICE_URL: "https://u2c.wbx2.com/u2c/api/v1" - WDM_SERVICE_URL: "https://wdm-a.wbx2.com/wdm/api/v1" - WHISTLER_API_SERVICE_URL: "https://whistler-prod.allnint.ciscospark.com/api/v1" - WEBEX_TEST_USERS_CI_GATEWAY_SERVICE_URL: "https://cig-service-a.wbx2.com/cig-service/api/v1" - WEBEX_CONVERSATION_DEFAULT_CLUSTER: "urn:TEAM:us-east-2_a:identityLookup" - steps: - - install_graphicsmagick_and_libgcrypt - - checkout_and_fetch_tags - - restore_node_modules - - run: - name: "Build all packages" - command: yarn run build - # Save the dist/ folder of the packages for other jobs in the workflow - - persist_to_workspace: - root: ~/webex-js-sdk - paths: - - packages - - static_analysis: - executor: main-executor - steps: - - checkout_and_fetch_tags - - restore_node_modules - - restore_built_packages - - run: - name: "Run ESLint" - command: yarn run lint - - store_test_results: - path: reports/style - - store_artifacts: - path: reports/style - destination: style - - # Sometimes the output of the modified packages script gets lost - # in a long output of the tests. This is simply a helper for PRs. - list_changed_packages: - executor: main-executor - steps: - - checkout_and_fetch_tags - - restore_node_modules - - restore_built_packages - - run: - name: "List Modified Packages" - command: | - PACKAGES=$(node tooling/modified-packages.js --single-line) - - echo "Modified Packages:" - echo "${PACKAGES}" - - # Run unit tests for modified packages only with `--unit` flag - # Tested against Chrome and Firefox on Mac and Windows - unit_tests: - executor: main-executor - environment: - COVERAGE: true - steps: - - checkout_and_fetch_tags - - restore_node_modules - - restore_built_packages - - skip_check - # Generate build number for a single identifier for SauceLabs - - run: - name: "Generate Build Number" - command: echo "export BUILD_NUMBER=CircleCI-${CIRCLE_PR_USERNAME}-${CIRCLE_PR_REPONAME}-${CIRCLE_PR_NUMBER}_${CIRCLE_WORKFLOW_ID}" >> $BASH_ENV - # Run unit tests on modified packages - - run: - name: "Test Modified Packages" - command: | - PACKAGES=$(node tooling/modified-packages.js --single-line) - - echo "Modified Packages:" - echo "${PACKAGES}" - - VAR1="@webex/plugin-meetings" - VAR2="webex" - for PACKAGE in ${PACKAGES}; do - if [[ "$PACKAGE" == "$VAR1" || "$PACKAGE" == "$VAR2" ]]; then - yarn run test:unit --silent --packages "${PACKAGE}" - echo "DONE TESTING ${PACKAGE} ON MOCHA" - fi - done - - yarn run jest --selectProjects ${PACKAGES} --passWithNoTests --maxWorkers=2 - echo "DONE TESTING" - # This script parses all the XML files generated by mocha and karma to see if any tests failed/errored out - # The reason this script exists is that all tests are "exec"'d and running in a single process instead of a parallel - # So if a failure happens it will continue to the next test suite in the queue - - run: - name: "Check if any unit tests failed" - command: | - mkdir -p reports/junit/mocha - FAILURES=$(find reports/junit/mocha/ -iname '*.xml' -print0 | xargs -0 sed -n 's/.*failures=\"\([^\"]*\).*/\1/p' | xargs) - - echo Failures $FAILURES - - if [[ $FAILURES =~ ^([0 ])*$ ]]; then - echo 'Unit tests succeeded' - else - echo 'Unit tests failed' - exit 1 - fi - - store_test_results: - path: reports/junit - - store_artifacts: - path: reports/junit - destination: junit - - store_artifacts: - path: sauce.log - destination: sauce - - samples: - working_directory: ~/webex-js-sdk - docker: - - image: circleci/node:gallium - environment: - NODE_ENV: "test" - COVERAGE: true - steps: - - checkout_and_fetch_tags - - restore_node_modules - - restore_built_packages - # Generate build number for a single identifier for SauceLabs - - run: - name: "Generate Build Number" - command: echo "export BUILD_NUMBER=CircleCI-${CIRCLE_PR_USERNAME}-${CIRCLE_PR_REPONAME}-${CIRCLE_PR_NUMBER}_${CIRCLE_WORKFLOW_ID}" >> $BASH_ENV - # Test Samples on SauceLabs - - run: - name: "Test Samples" - command: yarn run samples:test - - store_test_results: - path: reports/junit - - store_artifacts: - path: sauce.log - destination: sauce - - store_artifacts: - path: reports/junit/wdio - destination: wdio - - store_artifacts: - path: reports/cobertura.xml - destination: cobertura.xml - - store_artifacts: - path: /home/circleci/.yarn/_logs/ - destination: yarn-logs - - # Run integration tests on modified packages with `--integration` flag - # Tested against Chrome and Firefox on Mac and Windows - integration_tests: - executor: main-executor - environment: - COVERAGE: true - steps: - - checkout_and_fetch_tags - - browser-tools/install-browser-tools - - install_graphicsmagick_and_libgcrypt - - restore_node_modules - - restore_built_packages - - skip_check - # Generate build number for a single identifier for SauceLabs - - run: - name: "Generate Build Number" - command: echo "export BUILD_NUMBER=CircleCI-${CIRCLE_PR_USERNAME}-${CIRCLE_PR_REPONAME}-${CIRCLE_PR_NUMBER}_${CIRCLE_WORKFLOW_ID}" >> $BASH_ENV - # Run integration tests on modified packages with `--integration` flag - # Tested against Chrome and Firefox on Mac and Windows - - run: - name: "Test Integration - Run integration tests on modified packages on Chrome and Firefox" - command: | - PACKAGES=$(node tooling/modified-packages.js) - - echo "Modified Packages:" - echo "${PACKAGES}" - - for PACKAGE in ${PACKAGES}; do - yarn run test:integration --silent --packages "${PACKAGE}" --integration - done - # This script parses all the XML files generated by mocha and karma to see if any tests failed/errored out - # The reason this script exists is that all tests are "exec"'d and running in a single process instead of a parallel - # So if a failure happens it will continue to the next test suite in the queue - - run: - name: "Check if any integration tests failed" - command: | - mkdir -p reports/junit/karma - FAILURES=$(find reports/junit/karma/ -iname '*.xml' -print0 | xargs -0 sed -n 's/.*failures=\"\([^\"]*\).*/\1/p' | xargs) - - echo Failures $FAILURES - - if [[ $FAILURES =~ ^([0 ])*$ ]]; then - echo 'Integration tests succeeded' - else - echo 'Integration tests failed' - exit 1 - fi - - store_test_results: - path: reports/junit - - store_artifacts: - path: reports/junit - destination: junit - - store_artifacts: - path: sauce.log - destination: sauce - - versioning_and_publish: - executor: main-executor - steps: - - checkout_and_fetch_tags - - restore_node_modules - - add_ssh_keys: - fingerprints: - - "89:ed:56:33:f5:1b:7b:b6:a1:04:02:a0:f9:47:13:0a" - - run: - name: "Temporary change origin url to HTTPS for documentation generation" - command: git remote set-url origin https://github.com/webex/webex-js-sdk.git - - run: - name: "Build Docs" - command: yarn run build:docs - - run: - name: "Change origin url back to ssh" - command: git remote set-url origin git@github.com:webex/webex-js-sdk.git - - run: - name: "Build Samples" - command: yarn run samples:build - - run: - name: "Publish Docs Folder" - command: | - # Check if there's anything to commit before committing - if [ -n "$(git status --porcelain)" ]; then - git add docs/ - git add -f docs/samples/webex.min.js* - git add -f docs/samples/meetings.min.js* - git commit -m "docs(api): update docs [skip ci]" - git push upstream HEAD:master - fi - - run: - name: "Check if we need to skip version bumping and publishing to npm [skip npm]" - command: | - # Grab the 2nd to last commit message from the log for [skip npm] - # Last commit is the update docs - MESSAGE=$(git log -n 1 --skip 1 --pretty=format:%s) - - if [[ "$MESSAGE" == *\["skip npm"\]* ]]; then - circleci step halt - fi - - run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - - run: - name: "Grab Current Version Number" - command: echo "export CURRENT_VERSION=$(node -p "require('./package.json').version")" >> $BASH_ENV - - run: - name: "Check if we need to bump" - command: | - if ! \ - { git log "$( git describe --tags --abbrev=0 )..HEAD" --format='%s' | cut -d: -f1 | sort -u | sed -e 's/([^)]*)//' | grep -q -i -E '^feat|fix|perf|revert$' ; } || \ - { git log "$( git describe --tags --abbrev=0 )..HEAD" --format='%s' | cut -d: -f1 | sort -u | sed -e 's/([^)]*)//' | grep -q -E '\!$' ; } || \ - { git log "$( git describe --tags --abbrev=0 )..HEAD" --format='%b' | grep -q -E '^BREAKING CHANGE:' ; } - then - echo "No applicable changes since the previous tag, skipping..." - circleci step halt - fi - - run: - name: "Run standard-version" - command: yarn run release - - run: - name: "Grab Upcoming Version Number" - command: echo "export UPCOMING_VERSION=$(node -p "require('./package.json').version")" >> $BASH_ENV - - run: - name: "Check if we need to publish a new version" - command: | - echo "Current Version: $CURRENT_VERSION" - echo "Upcoming Version: $UPCOMING_VERSION" - - if [[ "$CURRENT_VERSION" == "$UPCOMING_VERSION" ]]; then - circleci step halt - fi - - run: - name: "Publish to NPM" - command: | - echo "replace yarn workspace environment variables " - yarn run deps:generate - - echo "Publish to NPM" - npm run tooling -- exec --cmd bash -- -c 'npm publish --access public || true' - - run: - name: "Push to upstream/master" - command: git push --follow-tags upstream master - tap: - executor: main-executor - parameters: - package: - type: string - environment: - COVERAGE: true - EU_PRIMARY_ORG_ID: "d9b9d739-c7e4-4956-809e-5da447a3b8ca" - IDBROKER_BASE_URL: "https://idbroker.webex.com" - IDENTITY_BASE_URL: "https://identity.webex.com" - U2C_SERVICE_URL: "https://u2c.wbx2.com/u2c/api/v1" - WDM_SERVICE_URL: "https://wdm-a.wbx2.com/wdm/api/v1" - WHISTLER_API_SERVICE_URL: "https://whistler-prod.allnint.ciscospark.com/api/v1" - WEBEX_TEST_USERS_CI_GATEWAY_SERVICE_URL: "https://cig-service-a.wbx2.com/cig-service/api/v1" - WEBEX_CONVERSATION_DEFAULT_CLUSTER: "urn:TEAM:us-east-2_a:identityLookup" - steps: - - install_graphicsmagick_and_libgcrypt - - checkout_and_fetch_tags - - restore_node_modules - - restore_built_packages - - run: - name: "Generate Build Number" - command: echo "export BUILD_NUMBER=CircleCI-SDK-TAP-<< parameters.package >>_${CIRCLE_WORKFLOW_ID}" >> $BASH_ENV - - run: yarn run test:integration --silent --packages << parameters.package >> defaults - - run: - name: 'Check if tap test for "<< parameters.package >>" failed' - command: | - mkdir -p reports/junit/karma - FAILURES=$(find reports/junit/karma/ -iname '*.xml' -print0 | xargs -0 sed -n 's/.*failures=\"\([^\"]*\).*/\1/p' | xargs) - - echo Failures $FAILURES - - if [[ $FAILURES =~ ^([0 ])*$ ]]; then - echo 'Tap test for "<< parameters.package >>" succeeded' - else - echo 'Tap test for "<< parameters.package >>" failed' - exit 1 - fi - - store_test_results: - path: reports/junit - - store_artifacts: - path: reports/junit - destination: junit - # - run: - # name: 'Create Incident on PagerDuty' - # when: on_fail - # command: | - # # Easier way of assigning variables in a json object without escaping double quotes in the curl command - # generate_incident_data() { - # # '\<<' must be escaped in v2.1+ due to yaml conflicts - # # https://discuss.circleci.com/t/2-1-config-and-build-processing/24102/31 - # cat \<> TAP Test", - # "source": "CircleCI - Webex JS SDK", - # "severity": "critical" - # }, - # "links": [ - # { - # "href": "${CIRCLE_BUILD_URL}", - # "text": "CircleCI - << parameters.package >> TAP Test - Build #${CIRCLE_BUILD_NUM}" - # } - # ], - # "client": "CircleCI - Webex-JS-SDK TAP Test - Build #${CIRCLE_BUILD_NUM}", - # "client_url": "${CIRCLE_BUILD_URL}" - # } - # EOF - # } - # curl -X POST --header 'Content-Type: application/json' -d "$(generate_incident_data)" https://events.pagerduty.com/v2/enqueue - -workflows: - github_checks: - jobs: - - yarn_install: - filters: - branches: - ignore: - - master - - build: - requires: - - yarn_install - - static_analysis: - requires: - - yarn_install - - list_changed_packages: - requires: - - yarn_install - - unit_tests: - requires: - - build - - static_analysis - - integration_tests: - requires: - - build - - static_analysis - - samples: - requires: - - build - - static_analysis - build_for_release: - jobs: - - yarn_install: - filters: - branches: - only: master - - versioning_and_publish: - filters: - branches: - only: master - requires: - - yarn_install - tap_tests: - triggers: - - schedule: - # Everyday @ 6:15PM UTC | 3:15PM EST | 2:15PM EDT | 12:15PM PST | 11:15AM PDT - cron: "15 18 * * 1-5" - filters: - branches: - only: - - master - jobs: - - yarn_install: - filters: - branches: - only: master - - build_production: - requires: - - yarn_install - - tap: - name: "@webex/webex-core tap" - package: "@webex/webex-core" - requires: - - build_production - - tap: - name: "@webex/plugin-meetings tap" - package: "@webex/plugin-meetings" - requires: - - build_production - - tap: - name: "@webex/internal-plugin-conversation tap" - package: "@webex/internal-plugin-conversation" - requires: - - build_production - - tap: - name: "@webex/internal-plugin-encryption tap" - package: "@webex/internal-plugin-encryption" - requires: - - build_production - - tap: - name: "@webex/internal-plugin-locus tap" - package: "@webex/internal-plugin-locus" - requires: - - build_production - - tap: - name: "@webex/internal-plugin-mercury tap" - package: "@webex/internal-plugin-mercury" - requires: - - build_production \ No newline at end of file diff --git a/.circleci/local.config.yml b/.circleci/local.config.yml deleted file mode 100644 index f494b642676..00000000000 --- a/.circleci/local.config.yml +++ /dev/null @@ -1,88 +0,0 @@ -version: 2 - -jobs: - build: - docker: - - image: circleci/node:dubnium-browsers - working_directory: ~/webex-js-sdk - environment: - - NODE_ENV: test - - SAUCE_CONNECT_DOWNLOAD_ON_INSTALL: true - - ATLAS_SERVICE_URL: https://atlas-intb.ciscospark.com/admin/api/v1 - - CONVERSATION_SERVICE: https://conversation-intb.ciscospark.com/conversation/api/v1 - - ENCRYPTION_SERVICE_URL: https://encryption-intb.ciscospark.com/encryption/api/v1 - - HYDRA_SERVICE_URL: https://apialpha.ciscospark.com/v1/ - - IDBROKER_BASE_URL: https://idbrokerbts.webex.com - - IDENTITY_BASE_URL: https://identitybts.webex.com - - U2C_SERVICE_URL: https://u2c-intb.ciscospark.com/u2c/api/v1 - - WDM_SERVICE_URL: https://wdm-intb.ciscospark.com/wdm/api/v1 - - WHISTLER_API_SERVICE_URL: https://whistler.allnint.ciscospark.com/api/v1 - steps: - - run: - name: 'Install graphicsmagick and libgcrypt' - command: | - sudo apt-get update - sudo apt-get install graphicsmagick libgcrypt-dev - - checkout - - run: - name: 'Update NPM and Install dependencies' - command: sudo npm install -g npm@6 - - run: - name: 'Install dependencies' - command: yarn - - run: - name: 'Run linting' - command: yarn run lint - - run: - name: 'Build all packages' - command: yarn run build - - run: - # Run unit tests on modified packages - name: 'Test modified packages' - command: if [[ $(node tooling/modified-packages.js) ]]; then npm run test:ci:github; fi - # This script parses all the XML files generated by mocha and karma to see if any tests failed/errored out - # The reason this script exists is that all tests are "exec"'d and running in a single process instead of a parallel - # So if a failure happens it will continue to the next test suite in the queue - - run: - name: 'Check if any unit tests failed' - command: | - FAILURES=$(find reports -iname 'webex*.xml' -print0 | xargs -0 sed -n 's/.*failures=\"\([^\"]*\).*/\1/p' | xargs) - ERRORS=$(find reports -iname 'webex*.xml' -print0 | xargs -0 sed -n 's/.*errors=\"\([^\"]*\).*/\1/p' | xargs) - - echo Failures $FAILURES - echo Errors $ERRORS - - if [[ "$FAILURES" -ne *0* ]] || [[ "$ERRORS" -ne *0* ]]; then - echo 'Unit tests failed' - exit 1 - fi - - run: - name: 'Test Samples' - command: npm run samples:test - # Run integration tests on modified packages with `--integration` flag - # Tested against Chrome and Firefox on Mac and Windows - - run: - name: 'Test Integration - run all integration tests on Mac and Windows version of Chrome and Firefox' - command: if [[ $(node tooling/modified-packages.js) ]]; then npm run test:ci:integration; fi - # This script parses all the XML files generated by mocha and karma to see if any tests failed/errored out - # The reason this script exists is that all tests are "exec"'d and running in a single process instead of a parallel - # So if a failure happens it will continue to the next test suite in the queue - - run: - name: 'Check if any integration tests failed' - command: | - FAILURES=$(find reports -iname 'webex*.xml' -print0 | xargs -0 sed -n 's/.*failures=\"\([^\"]*\).*/\1/p' | xargs) - ERRORS=$(find reports -iname 'webex*.xml' -print0 | xargs -0 sed -n 's/.*errors=\"\([^\"]*\).*/\1/p' | xargs) - - echo Failures $FAILURES - echo Errors $ERRORS - - if [[ "$FAILURES" -ne *0* ]] || [[ "$ERRORS" -ne *0* ]]; then - echo 'Unit tests failed' - exit 1 - fi - -workflows: - version: 2 - workflow: - jobs: - - build diff --git a/.coveralls.yml b/.coveralls.yml deleted file mode 100644 index 11d031f1867..00000000000 --- a/.coveralls.yml +++ /dev/null @@ -1,2 +0,0 @@ -service_name: circleci -repo_token: 1k681GkllIiA3wQhT4ynmFKrgSEODm59O diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000000..aa216c7c6a3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,33 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Platform (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + - Device Type [e.g. Desktop/Mobile (Android/iOS)] + +**Additional context** +Add any other context about the problem here such as logs and HAR files. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 665938f75cd..f19bbee1cd5 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,81 @@ blank_issues_enabled: false -contact_links: - - name: 🐞 Bug reports, ⁉️⁉ Questions & πŸ†˜ Support - url: https://developer.webex.com/support - about: Something going wrong? Do you have a question? Checkout https://developer.webex.com/support - - name: ⚑️ Feature Requests and Ideas - url: https://ciscocollaboration.aha.io/ - about: Got a suggestion? Please use https://ciscocollaboration.aha.io/ so others can help prioritize your awesome idea πŸ’‘ +issue_templates: + - name: Bug report + description: File a bug report + labels: ["bug"] + body: + - type: dropdown + attributes: + label: Domain + description: Which domain does this issue belong to? + options: + - Calling + - Meeting + - Messaging + - Other + + - type: markdown + attributes: + value: | + **Please describe the problem** + (What happened? What were you trying to do? What should have happened?) + + - type: input + attributes: + label: Frequency + description: How often does this occur? + placeholder: Every time, occasionally, first time, not sure + + - type: input + attributes: + label: Version + description: What version are you using? + placeholder: v1.0.0 + + - type: input + attributes: + label: Platform + description: What platform are you using? + placeholder: Windows 10, Mac OS X, Ubuntu 20.04 + + - type: textarea + attributes: + label: Steps To Recreate + description: Please list the steps needed to recreate the issue. + placeholder: Step 1, Step 2, Step 3... + + - type: textarea + attributes: + label: Console Logs + description: Please provide the relevant console logs. + + - type: textarea + attributes: + label: HAR Logs + description: Please provide the relevant HAR logs. + + - name: Enhancement + description: Suggest an enhancement + labels: ["enhancement"] + body: + - type: dropdown + attributes: + label: Domain + description: Which domain does this enhancement belong to? + options: + - Calling + - Meeting + - Messaging + - Other + + - type: textarea + attributes: + label: Describe the feature + description: What feature would you like to see added? + placeholder: Write here... + + - type: textarea + attributes: + label: Use Cases + description: Please describe a couple of use-cases for this feature. + placeholder: Write here... \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000000..4fe86d5ec8e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: feature +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.prettierignore b/.prettierignore index 416468be0ac..4495a6a6ad2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,7 +1,6 @@ docs patches coverage -.circleci .github .yarn docker diff --git a/amplify.yml b/amplify.yml index b42e2bf38a7..cbea46f1906 100644 --- a/amplify.yml +++ b/amplify.yml @@ -6,7 +6,10 @@ frontend: - yarn install --immutable build: commands: - - yarn run samples:build + - yarn workspaces foreach --from '@webex/*-tools' --topological-dev --parallel --verbose run build:src + - yarn package-tools sync --tag next + - yarn run build:local + - yarn run build:docs artifacts: baseDirectory: docs/ files: diff --git a/docs/api/assets/anchor.js b/docs/api/assets/anchor.js deleted file mode 100644 index 1f573dcbb10..00000000000 --- a/docs/api/assets/anchor.js +++ /dev/null @@ -1,350 +0,0 @@ -/*! - * AnchorJS - v4.0.0 - 2017-06-02 - * https://github.com/bryanbraun/anchorjs - * Copyright (c) 2017 Bryan Braun; Licensed MIT - */ -/* eslint-env amd, node */ - -// https://github.com/umdjs/umd/blob/master/templates/returnExports.js -(function (root, factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else if (typeof module === 'object' && module.exports) { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - } else { - // Browser globals (root is window) - root.AnchorJS = factory(); - root.anchors = new root.AnchorJS(); - } -})(this, function () { - 'use strict'; - function AnchorJS(options) { - this.options = options || {}; - this.elements = []; - - /** - * Assigns options to the internal options object, and provides defaults. - * @param {Object} opts - Options object - */ - function _applyRemainingDefaultOptions(opts) { - opts.icon = opts.hasOwnProperty('icon') ? opts.icon : '\ue9cb'; // Accepts characters (and also URLs?), like '#', 'ΒΆ', '❑', or 'Β§'. - opts.visible = opts.hasOwnProperty('visible') ? opts.visible : 'hover'; // Also accepts 'always' & 'touch' - opts.placement = opts.hasOwnProperty('placement') - ? opts.placement - : 'right'; // Also accepts 'left' - opts.class = opts.hasOwnProperty('class') ? opts.class : ''; // Accepts any class name. - // Using Math.floor here will ensure the value is Number-cast and an integer. - opts.truncate = opts.hasOwnProperty('truncate') - ? Math.floor(opts.truncate) - : 64; // Accepts any value that can be typecast to a number. - } - - _applyRemainingDefaultOptions(this.options); - - /** - * Checks to see if this device supports touch. Uses criteria pulled from Modernizr: - * https://github.com/Modernizr/Modernizr/blob/da22eb27631fc4957f67607fe6042e85c0a84656/feature-detects/touchevents.js#L40 - * @returns {Boolean} - true if the current device supports touch. - */ - this.isTouchDevice = function () { - return !!( - 'ontouchstart' in window || - (window.DocumentTouch && document instanceof DocumentTouch) - ); - }; - - /** - * Add anchor links to page elements. - * @param {String|Array|Nodelist} selector - A CSS selector for targeting the elements you wish to add anchor links - * to. Also accepts an array or nodeList containing the relavant elements. - * @returns {this} - The AnchorJS object - */ - this.add = function (selector) { - var elements, - elsWithIds, - idList, - elementID, - i, - index, - count, - tidyText, - newTidyText, - readableID, - anchor, - visibleOptionToUse, - indexesToDrop = []; - - // We reapply options here because somebody may have overwritten the default options object when setting options. - // For example, this overwrites all options but visible: - // - // anchors.options = { visible: 'always'; } - _applyRemainingDefaultOptions(this.options); - - visibleOptionToUse = this.options.visible; - if (visibleOptionToUse === 'touch') { - visibleOptionToUse = this.isTouchDevice() ? 'always' : 'hover'; - } - - // Provide a sensible default selector, if none is given. - if (!selector) { - selector = 'h2, h3, h4, h5, h6'; - } - - elements = _getElements(selector); - - if (elements.length === 0) { - return this; - } - - _addBaselineStyles(); - - // We produce a list of existing IDs so we don't generate a duplicate. - elsWithIds = document.querySelectorAll('[id]'); - idList = [].map.call(elsWithIds, function assign(el) { - return el.id; - }); - - for (i = 0; i < elements.length; i++) { - if (this.hasAnchorJSLink(elements[i])) { - indexesToDrop.push(i); - continue; - } - - if (elements[i].hasAttribute('id')) { - elementID = elements[i].getAttribute('id'); - } else if (elements[i].hasAttribute('data-anchor-id')) { - elementID = elements[i].getAttribute('data-anchor-id'); - } else { - tidyText = this.urlify(elements[i].textContent); - - // Compare our generated ID to existing IDs (and increment it if needed) - // before we add it to the page. - newTidyText = tidyText; - count = 0; - do { - if (index !== undefined) { - newTidyText = tidyText + '-' + count; - } - - index = idList.indexOf(newTidyText); - count += 1; - } while (index !== -1); - index = undefined; - idList.push(newTidyText); - - elements[i].setAttribute('id', newTidyText); - elementID = newTidyText; - } - - readableID = elementID.replace(/-/g, ' '); - - // The following code builds the following DOM structure in a more effiecient (albeit opaque) way. - // ''; - anchor = document.createElement('a'); - anchor.className = 'anchorjs-link ' + this.options.class; - anchor.href = '#' + elementID; - anchor.setAttribute('aria-label', 'Anchor link for: ' + readableID); - anchor.setAttribute('data-anchorjs-icon', this.options.icon); - - if (visibleOptionToUse === 'always') { - anchor.style.opacity = '1'; - } - - if (this.options.icon === '\ue9cb') { - anchor.style.font = '1em/1 anchorjs-icons'; - - // We set lineHeight = 1 here because the `anchorjs-icons` font family could otherwise affect the - // height of the heading. This isn't the case for icons with `placement: left`, so we restore - // line-height: inherit in that case, ensuring they remain positioned correctly. For more info, - // see https://github.com/bryanbraun/anchorjs/issues/39. - if (this.options.placement === 'left') { - anchor.style.lineHeight = 'inherit'; - } - } - - if (this.options.placement === 'left') { - anchor.style.position = 'absolute'; - anchor.style.marginLeft = '-1em'; - anchor.style.paddingRight = '0.5em'; - elements[i].insertBefore(anchor, elements[i].firstChild); - } else { - // if the option provided is `right` (or anything else). - anchor.style.paddingLeft = '0.375em'; - elements[i].appendChild(anchor); - } - } - - for (i = 0; i < indexesToDrop.length; i++) { - elements.splice(indexesToDrop[i] - i, 1); - } - this.elements = this.elements.concat(elements); - - return this; - }; - - /** - * Removes all anchorjs-links from elements targed by the selector. - * @param {String|Array|Nodelist} selector - A CSS selector string targeting elements with anchor links, - * OR a nodeList / array containing the DOM elements. - * @returns {this} - The AnchorJS object - */ - this.remove = function (selector) { - var index, - domAnchor, - elements = _getElements(selector); - - for (var i = 0; i < elements.length; i++) { - domAnchor = elements[i].querySelector('.anchorjs-link'); - if (domAnchor) { - // Drop the element from our main list, if it's in there. - index = this.elements.indexOf(elements[i]); - if (index !== -1) { - this.elements.splice(index, 1); - } - // Remove the anchor from the DOM. - elements[i].removeChild(domAnchor); - } - } - return this; - }; - - /** - * Removes all anchorjs links. Mostly used for tests. - */ - this.removeAll = function () { - this.remove(this.elements); - }; - - /** - * Urlify - Refine text so it makes a good ID. - * - * To do this, we remove apostrophes, replace nonsafe characters with hyphens, - * remove extra hyphens, truncate, trim hyphens, and make lowercase. - * - * @param {String} text - Any text. Usually pulled from the webpage element we are linking to. - * @returns {String} - hyphen-delimited text for use in IDs and URLs. - */ - this.urlify = function (text) { - // Regex for finding the nonsafe URL characters (many need escaping): & +$,:;=?@"#{}|^~[`%!'<>]./()*\ - var nonsafeChars = /[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\]/g, - urlText; - - // The reason we include this _applyRemainingDefaultOptions is so urlify can be called independently, - // even after setting options. This can be useful for tests or other applications. - if (!this.options.truncate) { - _applyRemainingDefaultOptions(this.options); - } - - // Note: we trim hyphens after truncating because truncating can cause dangling hyphens. - // Example string: // " ⚑⚑ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." - urlText = text - .trim() // "⚑⚑ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." - .replace(/\'/gi, '') // "⚑⚑ Dont forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." - .replace(nonsafeChars, '-') // "⚑⚑-Dont-forget--URL-fragments-should-be-i18n-friendly--hyphenated--short--and-clean-" - .replace(/-{2,}/g, '-') // "⚑⚑-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-short-and-clean-" - .substring(0, this.options.truncate) // "⚑⚑-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-" - .replace(/^-+|-+$/gm, '') // "⚑⚑-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated" - .toLowerCase(); // "⚑⚑-dont-forget-url-fragments-should-be-i18n-friendly-hyphenated" - - return urlText; - }; - - /** - * Determines if this element already has an AnchorJS link on it. - * Uses this technique: http://stackoverflow.com/a/5898748/1154642 - * @param {HTMLElemnt} el - a DOM node - * @returns {Boolean} true/false - */ - this.hasAnchorJSLink = function (el) { - var hasLeftAnchor = - el.firstChild && - (' ' + el.firstChild.className + ' ').indexOf(' anchorjs-link ') > -1, - hasRightAnchor = - el.lastChild && - (' ' + el.lastChild.className + ' ').indexOf(' anchorjs-link ') > -1; - - return hasLeftAnchor || hasRightAnchor || false; - }; - - /** - * Turns a selector, nodeList, or array of elements into an array of elements (so we can use array methods). - * It also throws errors on any other inputs. Used to handle inputs to .add and .remove. - * @param {String|Array|Nodelist} input - A CSS selector string targeting elements with anchor links, - * OR a nodeList / array containing the DOM elements. - * @returns {Array} - An array containing the elements we want. - */ - function _getElements(input) { - var elements; - if (typeof input === 'string' || input instanceof String) { - // See https://davidwalsh.name/nodelist-array for the technique transforming nodeList -> Array. - elements = [].slice.call(document.querySelectorAll(input)); - // I checked the 'input instanceof NodeList' test in IE9 and modern browsers and it worked for me. - } else if (Array.isArray(input) || input instanceof NodeList) { - elements = [].slice.call(input); - } else { - throw new Error('The selector provided to AnchorJS was invalid.'); - } - return elements; - } - - /** - * _addBaselineStyles - * Adds baseline styles to the page, used by all AnchorJS links irregardless of configuration. - */ - function _addBaselineStyles() { - // We don't want to add global baseline styles if they've been added before. - if (document.head.querySelector('style.anchorjs') !== null) { - return; - } - - var style = document.createElement('style'), - linkRule = - ' .anchorjs-link {' + - ' opacity: 0;' + - ' text-decoration: none;' + - ' -webkit-font-smoothing: antialiased;' + - ' -moz-osx-font-smoothing: grayscale;' + - ' }', - hoverRule = - ' *:hover > .anchorjs-link,' + - ' .anchorjs-link:focus {' + - ' opacity: 1;' + - ' }', - anchorjsLinkFontFace = - ' @font-face {' + - ' font-family: "anchorjs-icons";' + // Icon from icomoon; 10px wide & 10px tall; 2 empty below & 4 above - ' src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype");' + - ' }', - pseudoElContent = - ' [data-anchorjs-icon]::after {' + - ' content: attr(data-anchorjs-icon);' + - ' }', - firstStyleEl; - - style.className = 'anchorjs'; - style.appendChild(document.createTextNode('')); // Necessary for Webkit. - - // We place it in the head with the other style tags, if possible, so as to - // not look out of place. We insert before the others so these styles can be - // overridden if necessary. - firstStyleEl = document.head.querySelector('[rel="stylesheet"], style'); - if (firstStyleEl === undefined) { - document.head.appendChild(style); - } else { - document.head.insertBefore(style, firstStyleEl); - } - - style.sheet.insertRule(linkRule, style.sheet.cssRules.length); - style.sheet.insertRule(hoverRule, style.sheet.cssRules.length); - style.sheet.insertRule(pseudoElContent, style.sheet.cssRules.length); - style.sheet.insertRule(anchorjsLinkFontFace, style.sheet.cssRules.length); - } - } - - return AnchorJS; -}); diff --git a/docs/api/assets/bass-addons.css b/docs/api/assets/bass-addons.css deleted file mode 100644 index c27e96d8618..00000000000 --- a/docs/api/assets/bass-addons.css +++ /dev/null @@ -1,12 +0,0 @@ -.input { - font-family: inherit; - display: block; - width: 100%; - height: 2rem; - padding: .5rem; - margin-bottom: 1rem; - border: 1px solid #ccc; - font-size: .875rem; - border-radius: 3px; - box-sizing: border-box; -} diff --git a/docs/api/assets/bass.css b/docs/api/assets/bass.css deleted file mode 100644 index 2d860c56e3f..00000000000 --- a/docs/api/assets/bass.css +++ /dev/null @@ -1,544 +0,0 @@ -/*! Basscss | http://basscss.com | MIT License */ - -.h1{ font-size: 2rem } -.h2{ font-size: 1.5rem } -.h3{ font-size: 1.25rem } -.h4{ font-size: 1rem } -.h5{ font-size: .875rem } -.h6{ font-size: .75rem } - -.font-family-inherit{ font-family:inherit } -.font-size-inherit{ font-size:inherit } -.text-decoration-none{ text-decoration:none } - -.bold{ font-weight: bold; font-weight: bold } -.regular{ font-weight:normal } -.italic{ font-style:italic } -.caps{ text-transform:uppercase; letter-spacing: .2em; } - -.left-align{ text-align:left } -.center{ text-align:center } -.right-align{ text-align:right } -.justify{ text-align:justify } - -.nowrap{ white-space:nowrap } -.break-word{ word-wrap:break-word } - -.line-height-1{ line-height: 1 } -.line-height-2{ line-height: 1.125 } -.line-height-3{ line-height: 1.25 } -.line-height-4{ line-height: 1.5 } - -.list-style-none{ list-style:none } -.underline{ text-decoration:underline } - -.truncate{ - max-width:100%; - overflow:hidden; - text-overflow:ellipsis; - white-space:nowrap; -} - -.list-reset{ - list-style:none; - padding-left:0; -} - -.inline{ display:inline } -.block{ display:block } -.inline-block{ display:inline-block } -.table{ display:table } -.table-cell{ display:table-cell } - -.overflow-hidden{ overflow:hidden } -.overflow-scroll{ overflow:scroll } -.overflow-auto{ overflow:auto } - -.clearfix:before, -.clearfix:after{ - content:" "; - display:table -} -.clearfix:after{ clear:both } - -.left{ float:left } -.right{ float:right } - -.fit{ max-width:100% } - -.max-width-1{ max-width: 24rem } -.max-width-2{ max-width: 32rem } -.max-width-3{ max-width: 48rem } -.max-width-4{ max-width: 64rem } - -.border-box{ box-sizing:border-box } - -.align-baseline{ vertical-align:baseline } -.align-top{ vertical-align:top } -.align-middle{ vertical-align:middle } -.align-bottom{ vertical-align:bottom } - -.m0{ margin:0 } -.mt0{ margin-top:0 } -.mr0{ margin-right:0 } -.mb0{ margin-bottom:0 } -.ml0{ margin-left:0 } -.mx0{ margin-left:0; margin-right:0 } -.my0{ margin-top:0; margin-bottom:0 } - -.m1{ margin: .5rem } -.mt1{ margin-top: .5rem } -.mr1{ margin-right: .5rem } -.mb1{ margin-bottom: .5rem } -.ml1{ margin-left: .5rem } -.mx1{ margin-left: .5rem; margin-right: .5rem } -.my1{ margin-top: .5rem; margin-bottom: .5rem } - -.m2{ margin: 1rem } -.mt2{ margin-top: 1rem } -.mr2{ margin-right: 1rem } -.mb2{ margin-bottom: 1rem } -.ml2{ margin-left: 1rem } -.mx2{ margin-left: 1rem; margin-right: 1rem } -.my2{ margin-top: 1rem; margin-bottom: 1rem } - -.m3{ margin: 2rem } -.mt3{ margin-top: 2rem } -.mr3{ margin-right: 2rem } -.mb3{ margin-bottom: 2rem } -.ml3{ margin-left: 2rem } -.mx3{ margin-left: 2rem; margin-right: 2rem } -.my3{ margin-top: 2rem; margin-bottom: 2rem } - -.m4{ margin: 4rem } -.mt4{ margin-top: 4rem } -.mr4{ margin-right: 4rem } -.mb4{ margin-bottom: 4rem } -.ml4{ margin-left: 4rem } -.mx4{ margin-left: 4rem; margin-right: 4rem } -.my4{ margin-top: 4rem; margin-bottom: 4rem } - -.mxn1{ margin-left: -.5rem; margin-right: -.5rem; } -.mxn2{ margin-left: -1rem; margin-right: -1rem; } -.mxn3{ margin-left: -2rem; margin-right: -2rem; } -.mxn4{ margin-left: -4rem; margin-right: -4rem; } - -.ml-auto{ margin-left:auto } -.mr-auto{ margin-right:auto } -.mx-auto{ margin-left:auto; margin-right:auto; } - -.p0{ padding:0 } -.pt0{ padding-top:0 } -.pr0{ padding-right:0 } -.pb0{ padding-bottom:0 } -.pl0{ padding-left:0 } -.px0{ padding-left:0; padding-right:0 } -.py0{ padding-top:0; padding-bottom:0 } - -.p1{ padding: .5rem } -.pt1{ padding-top: .5rem } -.pr1{ padding-right: .5rem } -.pb1{ padding-bottom: .5rem } -.pl1{ padding-left: .5rem } -.py1{ padding-top: .5rem; padding-bottom: .5rem } -.px1{ padding-left: .5rem; padding-right: .5rem } - -.p2{ padding: 1rem } -.pt2{ padding-top: 1rem } -.pr2{ padding-right: 1rem } -.pb2{ padding-bottom: 1rem } -.pl2{ padding-left: 1rem } -.py2{ padding-top: 1rem; padding-bottom: 1rem } -.px2{ padding-left: 1rem; padding-right: 1rem } - -.p3{ padding: 2rem } -.pt3{ padding-top: 2rem } -.pr3{ padding-right: 2rem } -.pb3{ padding-bottom: 2rem } -.pl3{ padding-left: 2rem } -.py3{ padding-top: 2rem; padding-bottom: 2rem } -.px3{ padding-left: 2rem; padding-right: 2rem } - -.p4{ padding: 4rem } -.pt4{ padding-top: 4rem } -.pr4{ padding-right: 4rem } -.pb4{ padding-bottom: 4rem } -.pl4{ padding-left: 4rem } -.py4{ padding-top: 4rem; padding-bottom: 4rem } -.px4{ padding-left: 4rem; padding-right: 4rem } - -.col{ - float:left; - box-sizing:border-box; -} - -.col-right{ - float:right; - box-sizing:border-box; -} - -.col-1{ - width:8.33333%; -} - -.col-2{ - width:16.66667%; -} - -.col-3{ - width:25%; -} - -.col-4{ - width:33.33333%; -} - -.col-5{ - width:41.66667%; -} - -.col-6{ - width:50%; -} - -.col-7{ - width:58.33333%; -} - -.col-8{ - width:66.66667%; -} - -.col-9{ - width:75%; -} - -.col-10{ - width:83.33333%; -} - -.col-11{ - width:91.66667%; -} - -.col-12{ - width:100%; -} -@media (min-width: 40em){ - - .sm-col{ - float:left; - box-sizing:border-box; - } - - .sm-col-right{ - float:right; - box-sizing:border-box; - } - - .sm-col-1{ - width:8.33333%; - } - - .sm-col-2{ - width:16.66667%; - } - - .sm-col-3{ - width:25%; - } - - .sm-col-4{ - width:33.33333%; - } - - .sm-col-5{ - width:41.66667%; - } - - .sm-col-6{ - width:50%; - } - - .sm-col-7{ - width:58.33333%; - } - - .sm-col-8{ - width:66.66667%; - } - - .sm-col-9{ - width:75%; - } - - .sm-col-10{ - width:83.33333%; - } - - .sm-col-11{ - width:91.66667%; - } - - .sm-col-12{ - width:100%; - } - -} -@media (min-width: 52em){ - - .md-col{ - float:left; - box-sizing:border-box; - } - - .md-col-right{ - float:right; - box-sizing:border-box; - } - - .md-col-1{ - width:8.33333%; - } - - .md-col-2{ - width:16.66667%; - } - - .md-col-3{ - width:25%; - } - - .md-col-4{ - width:33.33333%; - } - - .md-col-5{ - width:41.66667%; - } - - .md-col-6{ - width:50%; - } - - .md-col-7{ - width:58.33333%; - } - - .md-col-8{ - width:66.66667%; - } - - .md-col-9{ - width:75%; - } - - .md-col-10{ - width:83.33333%; - } - - .md-col-11{ - width:91.66667%; - } - - .md-col-12{ - width:100%; - } - -} -@media (min-width: 64em){ - - .lg-col{ - float:left; - box-sizing:border-box; - } - - .lg-col-right{ - float:right; - box-sizing:border-box; - } - - .lg-col-1{ - width:8.33333%; - } - - .lg-col-2{ - width:16.66667%; - } - - .lg-col-3{ - width:25%; - } - - .lg-col-4{ - width:33.33333%; - } - - .lg-col-5{ - width:41.66667%; - } - - .lg-col-6{ - width:50%; - } - - .lg-col-7{ - width:58.33333%; - } - - .lg-col-8{ - width:66.66667%; - } - - .lg-col-9{ - width:75%; - } - - .lg-col-10{ - width:83.33333%; - } - - .lg-col-11{ - width:91.66667%; - } - - .lg-col-12{ - width:100%; - } - -} -.flex{ display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex } - -@media (min-width: 40em){ - .sm-flex{ display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex } -} - -@media (min-width: 52em){ - .md-flex{ display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex } -} - -@media (min-width: 64em){ - .lg-flex{ display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex } -} - -.flex-column{ -webkit-box-orient:vertical; -webkit-box-direction:normal; -webkit-flex-direction:column; -ms-flex-direction:column; flex-direction:column } -.flex-wrap{ -webkit-flex-wrap:wrap; -ms-flex-wrap:wrap; flex-wrap:wrap } - -.items-start{ -webkit-box-align:start; -webkit-align-items:flex-start; -ms-flex-align:start; -ms-grid-row-align:flex-start; align-items:flex-start } -.items-end{ -webkit-box-align:end; -webkit-align-items:flex-end; -ms-flex-align:end; -ms-grid-row-align:flex-end; align-items:flex-end } -.items-center{ -webkit-box-align:center; -webkit-align-items:center; -ms-flex-align:center; -ms-grid-row-align:center; align-items:center } -.items-baseline{ -webkit-box-align:baseline; -webkit-align-items:baseline; -ms-flex-align:baseline; -ms-grid-row-align:baseline; align-items:baseline } -.items-stretch{ -webkit-box-align:stretch; -webkit-align-items:stretch; -ms-flex-align:stretch; -ms-grid-row-align:stretch; align-items:stretch } - -.self-start{ -webkit-align-self:flex-start; -ms-flex-item-align:start; align-self:flex-start } -.self-end{ -webkit-align-self:flex-end; -ms-flex-item-align:end; align-self:flex-end } -.self-center{ -webkit-align-self:center; -ms-flex-item-align:center; align-self:center } -.self-baseline{ -webkit-align-self:baseline; -ms-flex-item-align:baseline; align-self:baseline } -.self-stretch{ -webkit-align-self:stretch; -ms-flex-item-align:stretch; align-self:stretch } - -.justify-start{ -webkit-box-pack:start; -webkit-justify-content:flex-start; -ms-flex-pack:start; justify-content:flex-start } -.justify-end{ -webkit-box-pack:end; -webkit-justify-content:flex-end; -ms-flex-pack:end; justify-content:flex-end } -.justify-center{ -webkit-box-pack:center; -webkit-justify-content:center; -ms-flex-pack:center; justify-content:center } -.justify-between{ -webkit-box-pack:justify; -webkit-justify-content:space-between; -ms-flex-pack:justify; justify-content:space-between } -.justify-around{ -webkit-justify-content:space-around; -ms-flex-pack:distribute; justify-content:space-around } - -.content-start{ -webkit-align-content:flex-start; -ms-flex-line-pack:start; align-content:flex-start } -.content-end{ -webkit-align-content:flex-end; -ms-flex-line-pack:end; align-content:flex-end } -.content-center{ -webkit-align-content:center; -ms-flex-line-pack:center; align-content:center } -.content-between{ -webkit-align-content:space-between; -ms-flex-line-pack:justify; align-content:space-between } -.content-around{ -webkit-align-content:space-around; -ms-flex-line-pack:distribute; align-content:space-around } -.content-stretch{ -webkit-align-content:stretch; -ms-flex-line-pack:stretch; align-content:stretch } -.flex-auto{ - -webkit-box-flex:1; - -webkit-flex:1 1 auto; - -ms-flex:1 1 auto; - flex:1 1 auto; - min-width:0; - min-height:0; -} -.flex-none{ -webkit-box-flex:0; -webkit-flex:none; -ms-flex:none; flex:none } -.fs0{ flex-shrink: 0 } - -.order-0{ -webkit-box-ordinal-group:1; -webkit-order:0; -ms-flex-order:0; order:0 } -.order-1{ -webkit-box-ordinal-group:2; -webkit-order:1; -ms-flex-order:1; order:1 } -.order-2{ -webkit-box-ordinal-group:3; -webkit-order:2; -ms-flex-order:2; order:2 } -.order-3{ -webkit-box-ordinal-group:4; -webkit-order:3; -ms-flex-order:3; order:3 } -.order-last{ -webkit-box-ordinal-group:100000; -webkit-order:99999; -ms-flex-order:99999; order:99999 } - -.relative{ position:relative } -.absolute{ position:absolute } -.fixed{ position:fixed } - -.top-0{ top:0 } -.right-0{ right:0 } -.bottom-0{ bottom:0 } -.left-0{ left:0 } - -.z1{ z-index: 1 } -.z2{ z-index: 2 } -.z3{ z-index: 3 } -.z4{ z-index: 4 } - -.border{ - border-style:solid; - border-width: 1px; -} - -.border-top{ - border-top-style:solid; - border-top-width: 1px; -} - -.border-right{ - border-right-style:solid; - border-right-width: 1px; -} - -.border-bottom{ - border-bottom-style:solid; - border-bottom-width: 1px; -} - -.border-left{ - border-left-style:solid; - border-left-width: 1px; -} - -.border-none{ border:0 } - -.rounded{ border-radius: 3px } -.circle{ border-radius:50% } - -.rounded-top{ border-radius: 3px 3px 0 0 } -.rounded-right{ border-radius: 0 3px 3px 0 } -.rounded-bottom{ border-radius: 0 0 3px 3px } -.rounded-left{ border-radius: 3px 0 0 3px } - -.not-rounded{ border-radius:0 } - -.hide{ - position:absolute !important; - height:1px; - width:1px; - overflow:hidden; - clip:rect(1px, 1px, 1px, 1px); -} - -@media (max-width: 40em){ - .xs-hide{ display:none !important } -} - -@media (min-width: 40em) and (max-width: 52em){ - .sm-hide{ display:none !important } -} - -@media (min-width: 52em) and (max-width: 64em){ - .md-hide{ display:none !important } -} - -@media (min-width: 64em){ - .lg-hide{ display:none !important } -} - -.display-none{ display:none !important } - diff --git a/docs/api/assets/fonts/EOT/SourceCodePro-Bold.eot b/docs/api/assets/fonts/EOT/SourceCodePro-Bold.eot deleted file mode 100755 index d24cc39f470..00000000000 Binary files a/docs/api/assets/fonts/EOT/SourceCodePro-Bold.eot and /dev/null differ diff --git a/docs/api/assets/fonts/EOT/SourceCodePro-Regular.eot b/docs/api/assets/fonts/EOT/SourceCodePro-Regular.eot deleted file mode 100755 index 09e94730dbb..00000000000 Binary files a/docs/api/assets/fonts/EOT/SourceCodePro-Regular.eot and /dev/null differ diff --git a/docs/api/assets/fonts/LICENSE.txt b/docs/api/assets/fonts/LICENSE.txt deleted file mode 100755 index d154618a7d0..00000000000 --- a/docs/api/assets/fonts/LICENSE.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. - -This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/api/assets/fonts/OTF/SourceCodePro-Bold.otf b/docs/api/assets/fonts/OTF/SourceCodePro-Bold.otf deleted file mode 100755 index f4e576cecf7..00000000000 Binary files a/docs/api/assets/fonts/OTF/SourceCodePro-Bold.otf and /dev/null differ diff --git a/docs/api/assets/fonts/OTF/SourceCodePro-Regular.otf b/docs/api/assets/fonts/OTF/SourceCodePro-Regular.otf deleted file mode 100755 index 4e3b9d0bcd9..00000000000 Binary files a/docs/api/assets/fonts/OTF/SourceCodePro-Regular.otf and /dev/null differ diff --git a/docs/api/assets/fonts/TTF/SourceCodePro-Bold.ttf b/docs/api/assets/fonts/TTF/SourceCodePro-Bold.ttf deleted file mode 100755 index e0c576f1b02..00000000000 Binary files a/docs/api/assets/fonts/TTF/SourceCodePro-Bold.ttf and /dev/null differ diff --git a/docs/api/assets/fonts/TTF/SourceCodePro-Regular.ttf b/docs/api/assets/fonts/TTF/SourceCodePro-Regular.ttf deleted file mode 100755 index 437f47280b4..00000000000 Binary files a/docs/api/assets/fonts/TTF/SourceCodePro-Regular.ttf and /dev/null differ diff --git a/docs/api/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff b/docs/api/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff deleted file mode 100755 index cf960992f69..00000000000 Binary files a/docs/api/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff and /dev/null differ diff --git a/docs/api/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff b/docs/api/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff deleted file mode 100755 index 395436eb849..00000000000 Binary files a/docs/api/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff and /dev/null differ diff --git a/docs/api/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff b/docs/api/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff deleted file mode 100755 index c65ba841a76..00000000000 Binary files a/docs/api/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff and /dev/null differ diff --git a/docs/api/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff b/docs/api/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff deleted file mode 100755 index 0af792a1e4b..00000000000 Binary files a/docs/api/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff and /dev/null differ diff --git a/docs/api/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 b/docs/api/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 deleted file mode 100755 index cbe383538a9..00000000000 Binary files a/docs/api/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 and /dev/null differ diff --git a/docs/api/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 b/docs/api/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 deleted file mode 100755 index 65cd591bd84..00000000000 Binary files a/docs/api/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 and /dev/null differ diff --git a/docs/api/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 b/docs/api/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 deleted file mode 100755 index b78d5235e6a..00000000000 Binary files a/docs/api/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 and /dev/null differ diff --git a/docs/api/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 b/docs/api/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 deleted file mode 100755 index 18d2199ea49..00000000000 Binary files a/docs/api/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 and /dev/null differ diff --git a/docs/api/assets/fonts/source-code-pro.css b/docs/api/assets/fonts/source-code-pro.css deleted file mode 100755 index 3abb4f0904d..00000000000 --- a/docs/api/assets/fonts/source-code-pro.css +++ /dev/null @@ -1,23 +0,0 @@ -@font-face{ - font-family: 'Source Code Pro'; - font-weight: 400; - font-style: normal; - font-stretch: normal; - src: url('EOT/SourceCodePro-Regular.eot') format('embedded-opentype'), - url('WOFF2/TTF/SourceCodePro-Regular.ttf.woff2') format('woff2'), - url('WOFF/OTF/SourceCodePro-Regular.otf.woff') format('woff'), - url('OTF/SourceCodePro-Regular.otf') format('opentype'), - url('TTF/SourceCodePro-Regular.ttf') format('truetype'); -} - -@font-face{ - font-family: 'Source Code Pro'; - font-weight: 700; - font-style: normal; - font-stretch: normal; - src: url('EOT/SourceCodePro-Bold.eot') format('embedded-opentype'), - url('WOFF2/TTF/SourceCodePro-Bold.ttf.woff2') format('woff2'), - url('WOFF/OTF/SourceCodePro-Bold.otf.woff') format('woff'), - url('OTF/SourceCodePro-Bold.otf') format('opentype'), - url('TTF/SourceCodePro-Bold.ttf') format('truetype'); -} diff --git a/docs/api/assets/github.css b/docs/api/assets/github.css deleted file mode 100644 index 8852abb4c67..00000000000 --- a/docs/api/assets/github.css +++ /dev/null @@ -1,123 +0,0 @@ -/* - -github.com style (c) Vasily Polovnyov - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #333; - background: #f8f8f8; - -webkit-text-size-adjust: none; -} - -.hljs-comment, -.diff .hljs-header, -.hljs-javadoc { - color: #998; - font-style: italic; -} - -.hljs-keyword, -.css .rule .hljs-keyword, -.hljs-winutils, -.nginx .hljs-title, -.hljs-subst, -.hljs-request, -.hljs-status { - color: #1184CE; -} - -.hljs-number, -.hljs-hexcolor, -.ruby .hljs-constant { - color: #ed225d; -} - -.hljs-string, -.hljs-tag .hljs-value, -.hljs-phpdoc, -.hljs-dartdoc, -.tex .hljs-formula { - color: #ed225d; -} - -.hljs-title, -.hljs-id, -.scss .hljs-preprocessor { - color: #900; - font-weight: bold; -} - -.hljs-list .hljs-keyword, -.hljs-subst { - font-weight: normal; -} - -.hljs-class .hljs-title, -.hljs-type, -.vhdl .hljs-literal, -.tex .hljs-command { - color: #458; - font-weight: bold; -} - -.hljs-tag, -.hljs-tag .hljs-title, -.hljs-rules .hljs-property, -.django .hljs-tag .hljs-keyword { - color: #000080; - font-weight: normal; -} - -.hljs-attribute, -.hljs-variable, -.lisp .hljs-body { - color: #008080; -} - -.hljs-regexp { - color: #009926; -} - -.hljs-symbol, -.ruby .hljs-symbol .hljs-string, -.lisp .hljs-keyword, -.clojure .hljs-keyword, -.scheme .hljs-keyword, -.tex .hljs-special, -.hljs-prompt { - color: #990073; -} - -.hljs-built_in { - color: #0086b3; -} - -.hljs-preprocessor, -.hljs-pragma, -.hljs-pi, -.hljs-doctype, -.hljs-shebang, -.hljs-cdata { - color: #999; - font-weight: bold; -} - -.hljs-deletion { - background: #fdd; -} - -.hljs-addition { - background: #dfd; -} - -.diff .hljs-change { - background: #0086b3; -} - -.hljs-chunk { - color: #aaa; -} diff --git a/docs/api/assets/site.js b/docs/api/assets/site.js deleted file mode 100644 index a624be7b2c6..00000000000 --- a/docs/api/assets/site.js +++ /dev/null @@ -1,168 +0,0 @@ -/* global anchors */ - -// add anchor links to headers -anchors.options.placement = 'left'; -anchors.add('h3'); - -// Filter UI -var tocElements = document.getElementById('toc').getElementsByTagName('li'); - -document.getElementById('filter-input').addEventListener('keyup', function (e) { - var i, element, children; - - // enter key - if (e.keyCode === 13) { - // go to the first displayed item in the toc - for (i = 0; i < tocElements.length; i++) { - element = tocElements[i]; - if (!element.classList.contains('display-none')) { - location.replace(element.firstChild.href); - return e.preventDefault(); - } - } - } - - var match = function () { - return true; - }; - - var value = this.value.toLowerCase(); - - if (!value.match(/^\s*$/)) { - match = function (element) { - var html = element.firstChild.innerHTML; - return html && html.toLowerCase().indexOf(value) !== -1; - }; - } - - for (i = 0; i < tocElements.length; i++) { - element = tocElements[i]; - children = Array.from(element.getElementsByTagName('li')); - if (match(element) || children.some(match)) { - element.classList.remove('display-none'); - } else { - element.classList.add('display-none'); - } - } -}); - -var items = document.getElementsByClassName('toggle-sibling'); -for (var j = 0; j < items.length; j++) { - items[j].addEventListener('click', toggleSibling); -} - -function toggleSibling() { - var stepSibling = this.parentNode.getElementsByClassName('toggle-target')[0]; - var icon = this.getElementsByClassName('icon')[0]; - var klass = 'display-none'; - if (stepSibling.classList.contains(klass)) { - stepSibling.classList.remove(klass); - icon.innerHTML = 'β–Ύ'; - } else { - stepSibling.classList.add(klass); - icon.innerHTML = 'β–Έ'; - } -} - -function showHashTarget(targetId) { - if (targetId) { - var hashTarget = document.getElementById(targetId); - // new target is hidden - if ( - hashTarget && - hashTarget.offsetHeight === 0 && - hashTarget.parentNode.parentNode.classList.contains('display-none') - ) { - hashTarget.parentNode.parentNode.classList.remove('display-none'); - } - } -} - -function scrollIntoView(targetId) { - // Only scroll to element if we don't have a stored scroll position. - if (targetId && !history.state) { - var hashTarget = document.getElementById(targetId); - if (hashTarget) { - hashTarget.scrollIntoView(); - } - } -} - -function gotoCurrentTarget() { - showHashTarget(location.hash.substring(1)); - scrollIntoView(location.hash.substring(1)); -} - -window.addEventListener('hashchange', gotoCurrentTarget); -gotoCurrentTarget(); - -var toclinks = document.getElementsByClassName('pre-open'); -for (var k = 0; k < toclinks.length; k++) { - toclinks[k].addEventListener('mousedown', preOpen, false); -} - -function preOpen() { - showHashTarget(this.hash.substring(1)); -} - -var split_left = document.querySelector('#split-left'); -var split_right = document.querySelector('#split-right'); -var split_parent = split_left.parentNode; -var cw_with_sb = split_left.clientWidth; -split_left.style.overflow = 'hidden'; -var cw_without_sb = split_left.clientWidth; -split_left.style.overflow = ''; - -Split(['#split-left', '#split-right'], { - elementStyle: function (dimension, size, gutterSize) { - return { - 'flex-basis': 'calc(' + size + '% - ' + gutterSize + 'px)' - }; - }, - gutterStyle: function (dimension, gutterSize) { - return { - 'flex-basis': gutterSize + 'px' - }; - }, - gutterSize: 20, - sizes: [33, 67] -}); - -// Chrome doesn't remember scroll position properly so do it ourselves. -// Also works on Firefox and Edge. - -function updateState() { - history.replaceState( - { - left_top: split_left.scrollTop, - right_top: split_right.scrollTop - }, - document.title - ); -} - -function loadState(ev) { - if (ev) { - // Edge doesn't replace change history.state on popstate. - history.replaceState(ev.state, document.title); - } - if (history.state) { - split_left.scrollTop = history.state.left_top; - split_right.scrollTop = history.state.right_top; - } -} - -window.addEventListener('load', function () { - // Restore after Firefox scrolls to hash. - setTimeout(function () { - loadState(); - // Update with initial scroll position. - updateState(); - // Update scroll positions only after we've loaded because Firefox - // emits an initial scroll event with 0. - split_left.addEventListener('scroll', updateState); - split_right.addEventListener('scroll', updateState); - }, 1); -}); - -window.addEventListener('popstate', loadState); diff --git a/docs/api/assets/split.css b/docs/api/assets/split.css deleted file mode 100644 index 2d7779ee9b1..00000000000 --- a/docs/api/assets/split.css +++ /dev/null @@ -1,15 +0,0 @@ -.gutter { - background-color: #f5f5f5; - background-repeat: no-repeat; - background-position: 50%; -} - -.gutter.gutter-vertical { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII='); - cursor: ns-resize; -} - -.gutter.gutter-horizontal { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg=='); - cursor: ew-resize; -} diff --git a/docs/api/assets/split.js b/docs/api/assets/split.js deleted file mode 100644 index 71f9a60bd43..00000000000 --- a/docs/api/assets/split.js +++ /dev/null @@ -1,782 +0,0 @@ -/*! Split.js - v1.5.11 */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.Split = factory()); -}(this, (function () { 'use strict'; - - // The programming goals of Split.js are to deliver readable, understandable and - // maintainable code, while at the same time manually optimizing for tiny minified file size, - // browser compatibility without additional requirements, graceful fallback (IE8 is supported) - // and very few assumptions about the user's page layout. - var global = window; - var document = global.document; - - // Save a couple long function names that are used frequently. - // This optimization saves around 400 bytes. - var addEventListener = 'addEventListener'; - var removeEventListener = 'removeEventListener'; - var getBoundingClientRect = 'getBoundingClientRect'; - var gutterStartDragging = '_a'; - var aGutterSize = '_b'; - var bGutterSize = '_c'; - var HORIZONTAL = 'horizontal'; - var NOOP = function () { return false; }; - - // Figure out if we're in IE8 or not. IE8 will still render correctly, - // but will be static instead of draggable. - var isIE8 = global.attachEvent && !global[addEventListener]; - - // Helper function determines which prefixes of CSS calc we need. - // We only need to do this once on startup, when this anonymous function is called. - // - // Tests -webkit, -moz and -o prefixes. Modified from StackOverflow: - // http://stackoverflow.com/questions/16625140/js-feature-detection-to-detect-the-usage-of-webkit-calc-over-calc/16625167#16625167 - var calc = (['', '-webkit-', '-moz-', '-o-'] - .filter(function (prefix) { - var el = document.createElement('div'); - el.style.cssText = "width:" + prefix + "calc(9px)"; - - return !!el.style.length - }) - .shift()) + "calc"; - - // Helper function checks if its argument is a string-like type - var isString = function (v) { return typeof v === 'string' || v instanceof String; }; - - // Helper function allows elements and string selectors to be used - // interchangeably. In either case an element is returned. This allows us to - // do `Split([elem1, elem2])` as well as `Split(['#id1', '#id2'])`. - var elementOrSelector = function (el) { - if (isString(el)) { - var ele = document.querySelector(el); - if (!ele) { - throw new Error(("Selector " + el + " did not match a DOM element")) - } - return ele - } - - return el - }; - - // Helper function gets a property from the properties object, with a default fallback - var getOption = function (options, propName, def) { - var value = options[propName]; - if (value !== undefined) { - return value - } - return def - }; - - var getGutterSize = function (gutterSize, isFirst, isLast, gutterAlign) { - if (isFirst) { - if (gutterAlign === 'end') { - return 0 - } - if (gutterAlign === 'center') { - return gutterSize / 2 - } - } else if (isLast) { - if (gutterAlign === 'start') { - return 0 - } - if (gutterAlign === 'center') { - return gutterSize / 2 - } - } - - return gutterSize - }; - - // Default options - var defaultGutterFn = function (i, gutterDirection) { - var gut = document.createElement('div'); - gut.className = "gutter gutter-" + gutterDirection; - return gut - }; - - var defaultElementStyleFn = function (dim, size, gutSize) { - var style = {}; - - if (!isString(size)) { - if (!isIE8) { - style[dim] = calc + "(" + size + "% - " + gutSize + "px)"; - } else { - style[dim] = size + "%"; - } - } else { - style[dim] = size; - } - - return style - }; - - var defaultGutterStyleFn = function (dim, gutSize) { - var obj; - - return (( obj = {}, obj[dim] = (gutSize + "px"), obj )); - }; - - // The main function to initialize a split. Split.js thinks about each pair - // of elements as an independant pair. Dragging the gutter between two elements - // only changes the dimensions of elements in that pair. This is key to understanding - // how the following functions operate, since each function is bound to a pair. - // - // A pair object is shaped like this: - // - // { - // a: DOM element, - // b: DOM element, - // aMin: Number, - // bMin: Number, - // dragging: Boolean, - // parent: DOM element, - // direction: 'horizontal' | 'vertical' - // } - // - // The basic sequence: - // - // 1. Set defaults to something sane. `options` doesn't have to be passed at all. - // 2. Initialize a bunch of strings based on the direction we're splitting. - // A lot of the behavior in the rest of the library is paramatized down to - // rely on CSS strings and classes. - // 3. Define the dragging helper functions, and a few helpers to go with them. - // 4. Loop through the elements while pairing them off. Every pair gets an - // `pair` object and a gutter. - // 5. Actually size the pair elements, insert gutters and attach event listeners. - var Split = function (idsOption, options) { - if ( options === void 0 ) options = {}; - - var ids = idsOption; - var dimension; - var clientAxis; - var position; - var positionEnd; - var clientSize; - var elements; - - // Allow HTMLCollection to be used as an argument when supported - if (Array.from) { - ids = Array.from(ids); - } - - // All DOM elements in the split should have a common parent. We can grab - // the first elements parent and hope users read the docs because the - // behavior will be whacky otherwise. - var firstElement = elementOrSelector(ids[0]); - var parent = firstElement.parentNode; - var parentStyle = getComputedStyle ? getComputedStyle(parent) : null; - var parentFlexDirection = parentStyle ? parentStyle.flexDirection : null; - - // Set default options.sizes to equal percentages of the parent element. - var sizes = getOption(options, 'sizes') || ids.map(function () { return 100 / ids.length; }); - - // Standardize minSize to an array if it isn't already. This allows minSize - // to be passed as a number. - var minSize = getOption(options, 'minSize', 100); - var minSizes = Array.isArray(minSize) ? minSize : ids.map(function () { return minSize; }); - - // Get other options - var expandToMin = getOption(options, 'expandToMin', false); - var gutterSize = getOption(options, 'gutterSize', 10); - var gutterAlign = getOption(options, 'gutterAlign', 'center'); - var snapOffset = getOption(options, 'snapOffset', 30); - var dragInterval = getOption(options, 'dragInterval', 1); - var direction = getOption(options, 'direction', HORIZONTAL); - var cursor = getOption( - options, - 'cursor', - direction === HORIZONTAL ? 'col-resize' : 'row-resize' - ); - var gutter = getOption(options, 'gutter', defaultGutterFn); - var elementStyle = getOption( - options, - 'elementStyle', - defaultElementStyleFn - ); - var gutterStyle = getOption(options, 'gutterStyle', defaultGutterStyleFn); - - // 2. Initialize a bunch of strings based on the direction we're splitting. - // A lot of the behavior in the rest of the library is paramatized down to - // rely on CSS strings and classes. - if (direction === HORIZONTAL) { - dimension = 'width'; - clientAxis = 'clientX'; - position = 'left'; - positionEnd = 'right'; - clientSize = 'clientWidth'; - } else if (direction === 'vertical') { - dimension = 'height'; - clientAxis = 'clientY'; - position = 'top'; - positionEnd = 'bottom'; - clientSize = 'clientHeight'; - } - - // 3. Define the dragging helper functions, and a few helpers to go with them. - // Each helper is bound to a pair object that contains its metadata. This - // also makes it easy to store references to listeners that that will be - // added and removed. - // - // Even though there are no other functions contained in them, aliasing - // this to self saves 50 bytes or so since it's used so frequently. - // - // The pair object saves metadata like dragging state, position and - // event listener references. - - function setElementSize(el, size, gutSize, i) { - // Split.js allows setting sizes via numbers (ideally), or if you must, - // by string, like '300px'. This is less than ideal, because it breaks - // the fluid layout that `calc(% - px)` provides. You're on your own if you do that, - // make sure you calculate the gutter size by hand. - var style = elementStyle(dimension, size, gutSize, i); - - Object.keys(style).forEach(function (prop) { - // eslint-disable-next-line no-param-reassign - el.style[prop] = style[prop]; - }); - } - - function setGutterSize(gutterElement, gutSize, i) { - var style = gutterStyle(dimension, gutSize, i); - - Object.keys(style).forEach(function (prop) { - // eslint-disable-next-line no-param-reassign - gutterElement.style[prop] = style[prop]; - }); - } - - function getSizes() { - return elements.map(function (element) { return element.size; }) - } - - // Supports touch events, but not multitouch, so only the first - // finger `touches[0]` is counted. - function getMousePosition(e) { - if ('touches' in e) { return e.touches[0][clientAxis] } - return e[clientAxis] - } - - // Actually adjust the size of elements `a` and `b` to `offset` while dragging. - // calc is used to allow calc(percentage + gutterpx) on the whole split instance, - // which allows the viewport to be resized without additional logic. - // Element a's size is the same as offset. b's size is total size - a size. - // Both sizes are calculated from the initial parent percentage, - // then the gutter size is subtracted. - function adjust(offset) { - var a = elements[this.a]; - var b = elements[this.b]; - var percentage = a.size + b.size; - - a.size = (offset / this.size) * percentage; - b.size = percentage - (offset / this.size) * percentage; - - setElementSize(a.element, a.size, this[aGutterSize], a.i); - setElementSize(b.element, b.size, this[bGutterSize], b.i); - } - - // drag, where all the magic happens. The logic is really quite simple: - // - // 1. Ignore if the pair is not dragging. - // 2. Get the offset of the event. - // 3. Snap offset to min if within snappable range (within min + snapOffset). - // 4. Actually adjust each element in the pair to offset. - // - // --------------------------------------------------------------------- - // | | <- a.minSize || b.minSize -> | | - // | | | <- this.snapOffset || this.snapOffset -> | | | - // | | | || | | | - // | | | || | | | - // --------------------------------------------------------------------- - // | <- this.start this.size -> | - function drag(e) { - var offset; - var a = elements[this.a]; - var b = elements[this.b]; - - if (!this.dragging) { return } - - // Get the offset of the event from the first side of the - // pair `this.start`. Then offset by the initial position of the - // mouse compared to the gutter size. - offset = - getMousePosition(e) - - this.start + - (this[aGutterSize] - this.dragOffset); - - if (dragInterval > 1) { - offset = Math.round(offset / dragInterval) * dragInterval; - } - - // If within snapOffset of min or max, set offset to min or max. - // snapOffset buffers a.minSize and b.minSize, so logic is opposite for both. - // Include the appropriate gutter sizes to prevent overflows. - if (offset <= a.minSize + snapOffset + this[aGutterSize]) { - offset = a.minSize + this[aGutterSize]; - } else if ( - offset >= - this.size - (b.minSize + snapOffset + this[bGutterSize]) - ) { - offset = this.size - (b.minSize + this[bGutterSize]); - } - - // Actually adjust the size. - adjust.call(this, offset); - - // Call the drag callback continously. Don't do anything too intensive - // in this callback. - getOption(options, 'onDrag', NOOP)(); - } - - // Cache some important sizes when drag starts, so we don't have to do that - // continously: - // - // `size`: The total size of the pair. First + second + first gutter + second gutter. - // `start`: The leading side of the first element. - // - // ------------------------------------------------ - // | aGutterSize -> ||| | - // | ||| | - // | ||| | - // | ||| <- bGutterSize | - // ------------------------------------------------ - // | <- start size -> | - function calculateSizes() { - // Figure out the parent size minus padding. - var a = elements[this.a].element; - var b = elements[this.b].element; - - var aBounds = a[getBoundingClientRect](); - var bBounds = b[getBoundingClientRect](); - - this.size = - aBounds[dimension] + - bBounds[dimension] + - this[aGutterSize] + - this[bGutterSize]; - this.start = aBounds[position]; - this.end = aBounds[positionEnd]; - } - - function innerSize(element) { - // Return nothing if getComputedStyle is not supported (< IE9) - // Or if parent element has no layout yet - if (!getComputedStyle) { return null } - - var computedStyle = getComputedStyle(element); - - if (!computedStyle) { return null } - - var size = element[clientSize]; - - if (size === 0) { return null } - - if (direction === HORIZONTAL) { - size -= - parseFloat(computedStyle.paddingLeft) + - parseFloat(computedStyle.paddingRight); - } else { - size -= - parseFloat(computedStyle.paddingTop) + - parseFloat(computedStyle.paddingBottom); - } - - return size - } - - // When specifying percentage sizes that are less than the computed - // size of the element minus the gutter, the lesser percentages must be increased - // (and decreased from the other elements) to make space for the pixels - // subtracted by the gutters. - function trimToMin(sizesToTrim) { - // Try to get inner size of parent element. - // If it's no supported, return original sizes. - var parentSize = innerSize(parent); - if (parentSize === null) { - return sizesToTrim - } - - if (minSizes.reduce(function (a, b) { return a + b; }, 0) > parentSize) { - return sizesToTrim - } - - // Keep track of the excess pixels, the amount of pixels over the desired percentage - // Also keep track of the elements with pixels to spare, to decrease after if needed - var excessPixels = 0; - var toSpare = []; - - var pixelSizes = sizesToTrim.map(function (size, i) { - // Convert requested percentages to pixel sizes - var pixelSize = (parentSize * size) / 100; - var elementGutterSize = getGutterSize( - gutterSize, - i === 0, - i === sizesToTrim.length - 1, - gutterAlign - ); - var elementMinSize = minSizes[i] + elementGutterSize; - - // If element is too smal, increase excess pixels by the difference - // and mark that it has no pixels to spare - if (pixelSize < elementMinSize) { - excessPixels += elementMinSize - pixelSize; - toSpare.push(0); - return elementMinSize - } - - // Otherwise, mark the pixels it has to spare and return it's original size - toSpare.push(pixelSize - elementMinSize); - return pixelSize - }); - - // If nothing was adjusted, return the original sizes - if (excessPixels === 0) { - return sizesToTrim - } - - return pixelSizes.map(function (pixelSize, i) { - var newPixelSize = pixelSize; - - // While there's still pixels to take, and there's enough pixels to spare, - // take as many as possible up to the total excess pixels - if (excessPixels > 0 && toSpare[i] - excessPixels > 0) { - var takenPixels = Math.min( - excessPixels, - toSpare[i] - excessPixels - ); - - // Subtract the amount taken for the next iteration - excessPixels -= takenPixels; - newPixelSize = pixelSize - takenPixels; - } - - // Return the pixel size adjusted as a percentage - return (newPixelSize / parentSize) * 100 - }) - } - - // stopDragging is very similar to startDragging in reverse. - function stopDragging() { - var self = this; - var a = elements[self.a].element; - var b = elements[self.b].element; - - if (self.dragging) { - getOption(options, 'onDragEnd', NOOP)(getSizes()); - } - - self.dragging = false; - - // Remove the stored event listeners. This is why we store them. - global[removeEventListener]('mouseup', self.stop); - global[removeEventListener]('touchend', self.stop); - global[removeEventListener]('touchcancel', self.stop); - global[removeEventListener]('mousemove', self.move); - global[removeEventListener]('touchmove', self.move); - - // Clear bound function references - self.stop = null; - self.move = null; - - a[removeEventListener]('selectstart', NOOP); - a[removeEventListener]('dragstart', NOOP); - b[removeEventListener]('selectstart', NOOP); - b[removeEventListener]('dragstart', NOOP); - - a.style.userSelect = ''; - a.style.webkitUserSelect = ''; - a.style.MozUserSelect = ''; - a.style.pointerEvents = ''; - - b.style.userSelect = ''; - b.style.webkitUserSelect = ''; - b.style.MozUserSelect = ''; - b.style.pointerEvents = ''; - - self.gutter.style.cursor = ''; - self.parent.style.cursor = ''; - document.body.style.cursor = ''; - } - - // startDragging calls `calculateSizes` to store the inital size in the pair object. - // It also adds event listeners for mouse/touch events, - // and prevents selection while dragging so avoid the selecting text. - function startDragging(e) { - // Right-clicking can't start dragging. - if ('button' in e && e.button !== 0) { - return - } - - // Alias frequently used variables to save space. 200 bytes. - var self = this; - var a = elements[self.a].element; - var b = elements[self.b].element; - - // Call the onDragStart callback. - if (!self.dragging) { - getOption(options, 'onDragStart', NOOP)(getSizes()); - } - - // Don't actually drag the element. We emulate that in the drag function. - e.preventDefault(); - - // Set the dragging property of the pair object. - self.dragging = true; - - // Create two event listeners bound to the same pair object and store - // them in the pair object. - self.move = drag.bind(self); - self.stop = stopDragging.bind(self); - - // All the binding. `window` gets the stop events in case we drag out of the elements. - global[addEventListener]('mouseup', self.stop); - global[addEventListener]('touchend', self.stop); - global[addEventListener]('touchcancel', self.stop); - global[addEventListener]('mousemove', self.move); - global[addEventListener]('touchmove', self.move); - - // Disable selection. Disable! - a[addEventListener]('selectstart', NOOP); - a[addEventListener]('dragstart', NOOP); - b[addEventListener]('selectstart', NOOP); - b[addEventListener]('dragstart', NOOP); - - a.style.userSelect = 'none'; - a.style.webkitUserSelect = 'none'; - a.style.MozUserSelect = 'none'; - a.style.pointerEvents = 'none'; - - b.style.userSelect = 'none'; - b.style.webkitUserSelect = 'none'; - b.style.MozUserSelect = 'none'; - b.style.pointerEvents = 'none'; - - // Set the cursor at multiple levels - self.gutter.style.cursor = cursor; - self.parent.style.cursor = cursor; - document.body.style.cursor = cursor; - - // Cache the initial sizes of the pair. - calculateSizes.call(self); - - // Determine the position of the mouse compared to the gutter - self.dragOffset = getMousePosition(e) - self.end; - } - - // adjust sizes to ensure percentage is within min size and gutter. - sizes = trimToMin(sizes); - - // 5. Create pair and element objects. Each pair has an index reference to - // elements `a` and `b` of the pair (first and second elements). - // Loop through the elements while pairing them off. Every pair gets a - // `pair` object and a gutter. - // - // Basic logic: - // - // - Starting with the second element `i > 0`, create `pair` objects with - // `a = i - 1` and `b = i` - // - Set gutter sizes based on the _pair_ being first/last. The first and last - // pair have gutterSize / 2, since they only have one half gutter, and not two. - // - Create gutter elements and add event listeners. - // - Set the size of the elements, minus the gutter sizes. - // - // ----------------------------------------------------------------------- - // | i=0 | i=1 | i=2 | i=3 | - // | | | | | - // | pair 0 pair 1 pair 2 | - // | | | | | - // ----------------------------------------------------------------------- - var pairs = []; - elements = ids.map(function (id, i) { - // Create the element object. - var element = { - element: elementOrSelector(id), - size: sizes[i], - minSize: minSizes[i], - i: i, - }; - - var pair; - - if (i > 0) { - // Create the pair object with its metadata. - pair = { - a: i - 1, - b: i, - dragging: false, - direction: direction, - parent: parent, - }; - - pair[aGutterSize] = getGutterSize( - gutterSize, - i - 1 === 0, - false, - gutterAlign - ); - pair[bGutterSize] = getGutterSize( - gutterSize, - false, - i === ids.length - 1, - gutterAlign - ); - - // if the parent has a reverse flex-direction, switch the pair elements. - if ( - parentFlexDirection === 'row-reverse' || - parentFlexDirection === 'column-reverse' - ) { - var temp = pair.a; - pair.a = pair.b; - pair.b = temp; - } - } - - // Determine the size of the current element. IE8 is supported by - // staticly assigning sizes without draggable gutters. Assigns a string - // to `size`. - // - // IE9 and above - if (!isIE8) { - // Create gutter elements for each pair. - if (i > 0) { - var gutterElement = gutter(i, direction, element.element); - setGutterSize(gutterElement, gutterSize, i); - - // Save bound event listener for removal later - pair[gutterStartDragging] = startDragging.bind(pair); - - // Attach bound event listener - gutterElement[addEventListener]( - 'mousedown', - pair[gutterStartDragging] - ); - gutterElement[addEventListener]( - 'touchstart', - pair[gutterStartDragging] - ); - - parent.insertBefore(gutterElement, element.element); - - pair.gutter = gutterElement; - } - } - - setElementSize( - element.element, - element.size, - getGutterSize( - gutterSize, - i === 0, - i === ids.length - 1, - gutterAlign - ), - i - ); - - // After the first iteration, and we have a pair object, append it to the - // list of pairs. - if (i > 0) { - pairs.push(pair); - } - - return element - }); - - function adjustToMin(element) { - var isLast = element.i === pairs.length; - var pair = isLast ? pairs[element.i - 1] : pairs[element.i]; - - calculateSizes.call(pair); - - var size = isLast - ? pair.size - element.minSize - pair[bGutterSize] - : element.minSize + pair[aGutterSize]; - - adjust.call(pair, size); - } - - elements.forEach(function (element) { - var computedSize = element.element[getBoundingClientRect]()[dimension]; - - if (computedSize < element.minSize) { - if (expandToMin) { - adjustToMin(element); - } else { - // eslint-disable-next-line no-param-reassign - element.minSize = computedSize; - } - } - }); - - function setSizes(newSizes) { - var trimmed = trimToMin(newSizes); - trimmed.forEach(function (newSize, i) { - if (i > 0) { - var pair = pairs[i - 1]; - - var a = elements[pair.a]; - var b = elements[pair.b]; - - a.size = trimmed[i - 1]; - b.size = newSize; - - setElementSize(a.element, a.size, pair[aGutterSize], a.i); - setElementSize(b.element, b.size, pair[bGutterSize], b.i); - } - }); - } - - function destroy(preserveStyles, preserveGutter) { - pairs.forEach(function (pair) { - if (preserveGutter !== true) { - pair.parent.removeChild(pair.gutter); - } else { - pair.gutter[removeEventListener]( - 'mousedown', - pair[gutterStartDragging] - ); - pair.gutter[removeEventListener]( - 'touchstart', - pair[gutterStartDragging] - ); - } - - if (preserveStyles !== true) { - var style = elementStyle( - dimension, - pair.a.size, - pair[aGutterSize] - ); - - Object.keys(style).forEach(function (prop) { - elements[pair.a].element.style[prop] = ''; - elements[pair.b].element.style[prop] = ''; - }); - } - }); - } - - if (isIE8) { - return { - setSizes: setSizes, - destroy: destroy, - } - } - - return { - setSizes: setSizes, - getSizes: getSizes, - collapse: function collapse(i) { - adjustToMin(elements[i]); - }, - destroy: destroy, - parent: parent, - pairs: pairs, - } - }; - - return Split; - -}))); diff --git a/docs/api/assets/style.css b/docs/api/assets/style.css deleted file mode 100644 index 0618f4376f2..00000000000 --- a/docs/api/assets/style.css +++ /dev/null @@ -1,147 +0,0 @@ -.documentation { - font-family: Helvetica, sans-serif; - color: #666; - line-height: 1.5; - background: #f5f5f5; -} - -.black { - color: #666; -} - -.bg-white { - background-color: #fff; -} - -h4 { - margin: 20px 0 10px 0; -} - -.documentation h3 { - color: #000; -} - -.border-bottom { - border-color: #ddd; -} - -a { - color: #1184ce; - text-decoration: none; -} - -.documentation a[href]:hover { - text-decoration: underline; -} - -a:hover { - cursor: pointer; -} - -.py1-ul li { - padding: 5px 0; -} - -.max-height-100 { - max-height: 100%; -} - -.height-viewport-100 { - height: 100vh; -} - -section:target h3 { - font-weight: 700; -} - -.documentation td, -.documentation th { - padding: 0.25rem 0.25rem; -} - -h1:hover .anchorjs-link, -h2:hover .anchorjs-link, -h3:hover .anchorjs-link, -h4:hover .anchorjs-link { - opacity: 1; -} - -.fix-3 { - width: 25%; - max-width: 244px; -} - -.fix-3 { - width: 25%; - max-width: 244px; -} - -@media (min-width: 52em) { - .fix-margin-3 { - margin-left: 25%; - } -} - -.pre, -pre, -code, -.code { - font-family: Source Code Pro, Menlo, Consolas, Liberation Mono, monospace; - font-size: 14px; -} - -.fill-light { - background: #f9f9f9; -} - -.width2 { - width: 1rem; -} - -.input { - font-family: inherit; - display: block; - width: 100%; - height: 2rem; - padding: 0.5rem; - margin-bottom: 1rem; - border: 1px solid #ccc; - font-size: 0.875rem; - border-radius: 3px; - box-sizing: border-box; -} - -table { - border-collapse: collapse; -} - -.prose table th, -.prose table td { - text-align: left; - padding: 8px; - border: 1px solid #ddd; -} - -.prose table th:nth-child(1) { - border-right: none; -} -.prose table th:nth-child(2) { - border-left: none; -} - -.prose table { - border: 1px solid #ddd; -} - -.prose-big { - font-size: 18px; - line-height: 30px; -} - -.quiet { - opacity: 0.7; -} - -.minishadow { - box-shadow: 2px 2px 10px #f3f3f3; -} diff --git a/docs/api/index.html b/docs/api/index.html deleted file mode 100644 index 3322b9e13b2..00000000000 --- a/docs/api/index.html +++ /dev/null @@ -1,61173 +0,0 @@ - - - - - webex-js-sdk 2.58.1 | Documentation - - - - - - - - -
-
-
-

webex-js-sdk

-
2.58.1
- -
- -
- -
-
-
- - -
- -

- webex-js-sdk -

- - -

webex

-
-

The Cisco Webex JS SDK

-
-

Install

-

Usage

-
-

All of the examples in these API docs assume you've gotten an authenticated Webex instance (unless otherwise specified) using one of the methods below.

-
-

webex has three basic modes of operation:

- -

Shell Script (Quick Start)

-

This is the quickest way to get up and running with our JavaScript SDK. Simply set the environment variable WEBEX_ACCESS_TOKEN to your access token and add the following line at the top of your JavaScript file to get a ready-to-use instance.

-
-

You can get your WEBEX_ACCESS_TOKEN from the Cisco Webex for Developers portal.

-
-
-

webex/env is also a great way to get started with bots.

-
-

Browser

-

Our JavaScript SDK provides out-of-the-box support for the OAuth 2.0 Implicit Grant Flow.

-
-

You'll need to register an OAuth Client to get your "authorization string"

-
-

Use the steps under Bundling (or something similar) to get the SDK into your browser, then use the following JavaScript to get started:

-

Bundling

-

You'll need to bundle the SDK to use it in a web browser. Right now, we do all our SDK testing with Browserify, but our Cisco Webex Widgets use webpack.

-

The following snippet is the bare minimum to get our code into a form suitable for a web browser. You'll probably want to additionally pipe it through a minifier like UglifyJS before going to production.

-

Then, just load your bundle using:

-

NodeJS

-

Though the implicit flow is great for single page apps, it's not ideal for integrations that might need to do things on your users' behalf months in the future. We additionally support the OAuth 2.0 Authorization Code Grant flow, but due to its complexity, there's a bit you'll need to wire up in your app to take advantage of it. The following is an example of how an Express app might do authentication.

- - -
- - - -
- - -
- -

- Webex -

- - - - packages/webex/src/webex.js - - -
- - -

See Browser Guide and -Server Guide

- -
new Webex()
- - - - - - - - - - - - - - - - - -
Related
- - - Browser Guide - - - - - Server Guide - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - init(attrs) -
-
- -
- -
- - - - - - - - -
- - - - -
- -

- Authorization -

- - - - -
- - - -
- - - - - -

Browser support for OAuth2. Automatically parses the URL hash for an access -token

- -
new AuthorizationBrowser()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - isAuthenticating -
-
- -
- -
-
-
- β–Έ - isAuthorizing -
-
- -
- -
-
-
- β–Έ - initiateLogin(options) -
-
- -
- -
-
-
- β–Έ - initiateImplicitGrant(options) -
-
- -
- -
-
-
- β–Έ - initiateAuthorizationCodeGrant(options) -
-
- -
- -
-
-
- β–Έ - requestAccessTokenFromJwt(options) -
-
- -
- -
-
-
- β–Έ - logout(options) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

NodeJS support for OAuth2

- -
new AuthorizationNode()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - isAuthenticating -
-
- -
- -
-
-
- β–Έ - isAuthorizing -
-
- -
- -
-
-
- β–Έ - requestAuthorizationCodeGrant(options) -
-
- -
- -
-
-
- β–Έ - requestAccessTokenFromJwt(options) -
-
- -
- -
- - - - - - -
- - - - -
- -

- Meetings -

- - - - -
- - - -
- - - - - -

Maintain a cache of meetings and sync with services.

- -
new Meetings(args: ...any)
- - -

- Extends - - WebexPlugin - -

- - - - - - - - - - -
Parameters
-
- -
-
- args (...any) - -
- -
- -
- - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - register() -
-
- -
- -
-
-
- β–Έ - unregister() -
-
- -
- -
-
-
- β–Έ - setReachability() -
-
- -
- -
-
-
- β–Έ - getReachability() -
-
- -
- -
-
-
- β–Έ - startReachability() -
-
- -
- -
-
-
- β–Έ - getPersonalMeetingRoom() -
-
- -
- -
-
-
- β–Έ - create(destination, type = null, useRandomDelayForInfo) -
-
- -
- -
-
-
- β–Έ - getMeetingByType(type, value) -
-
- -
- -
-
-
- β–Έ - getAllMeetings(options) -
-
- -
- -
-
-
- β–Έ - syncMeetings() -
-
- -
- -
-
-
- β–Έ - getScheduledMeetings(options) -
-
- -
- -
-
-
- β–Έ - getSupportedDevices -
-
- -
- -
-
-
- β–Έ - getDevices -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - personalMeetingRoom -
-
- -
- -
-
-
- β–Έ - registered -
-
- -
- -
-
-
- β–Έ - uploadLogs(options) -
-
- -
- -
-
-
- β–Έ - getLogger() -
-
- -
- -
-
-
- β–Έ - propertyName -
-
- -
- -
-
-
- β–Έ - propertyName -
-
- -
- -
- - - - - - -
Events
-
- -
-
-
- β–Έ - meetings:ready -
-
- -
- -
-
-
- β–Έ - network:disconnected -
-
- -
- -
-
-
- β–Έ - meetings:registered -
-
- -
- -
-
-
- β–Έ - meeting:removed -
-
- -
- -
-
-
- β–Έ - meeting:added -
-
- -
- -
- - -
- - - - -
- - - - - -

Meeting is the crux of the plugin

- -
new Meeting()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - fetchMeetingInfo(options) -
-
- -
- -
-
-
- β–Έ - verifyPassword(password, captchaCode) -
-
- -
- -
-
-
- β–Έ - refreshCaptcha() -
-
- -
- -
-
-
- β–Έ - getAnalyzerMetricsPrePayload(options) -
-
- -
- -
-
-
- β–Έ - invite(invitee, alertIfActive = true) -
-
- -
- -
-
-
- β–Έ - cancelPhoneInvite(invitee) -
-
- -
- -
-
-
- β–Έ - admit(memberIds) -
-
- -
- -
-
-
- β–Έ - remove(memberId) -
-
- -
- -
-
-
- β–Έ - mute(memberId, mute) -
-
- -
- -
-
-
- β–Έ - transfer(memberId, moderator) -
-
- -
- -
-
-
- β–Έ - getMembers() -
-
- -
- -
-
-
- β–Έ - isAudioConnected() -
-
- -
- -
-
-
- β–Έ - isAudioMuted() -
-
- -
- -
-
-
- β–Έ - isAudioSelf() -
-
- -
- -
-
-
- β–Έ - isVideoConnected() -
-
- -
- -
-
-
- β–Έ - isVideoMuted() -
-
- -
- -
-
-
- β–Έ - isVideoSelf() -
-
- -
- -
-
-
- β–Έ - setRemoteStream(pc) -
-
- -
- -
-
-
- β–Έ - uploadLogs(options) -
-
- -
- -
-
-
- β–Έ - unsetRemoteStream() -
-
- -
- -
-
-
- β–Έ - closeRemoteStream() -
-
- -
- -
-
-
- β–Έ - closeRemoteTracks() -
-
- -
- -
-
-
- β–Έ - setLocalTracks(localStream) -
-
- -
- -
-
-
- β–Έ - setLocalShareTrack(localShare) -
-
- -
- -
-
-
- β–Έ - unsetLocalVideoTrack() -
-
- -
- -
-
-
- β–Έ - unsetLocalShareTrack() -
-
- -
- -
-
-
- β–Έ - setMercuryListener() -
-
- -
- -
-
-
- β–Έ - closePeerConnections() -
-
- -
- -
-
-
- β–Έ - unsetPeerConnections(peerConnection) -
-
- -
- -
-
-
- β–Έ - muteAudio() -
-
- -
- -
-
-
- β–Έ - unmuteAudio() -
-
- -
- -
-
-
- β–Έ - muteVideo() -
-
- -
- -
-
-
- β–Έ - unmuteVideo() -
-
- -
- -
-
-
- β–Έ - joinWithMedia(options) -
-
- -
- -
-
-
- β–Έ - reconnect(options) -
-
- -
- -
-
-
- β–Έ - usePhoneAudio(phoneNumber) -
-
- -
- -
-
-
- β–Έ - disconnectPhoneAudio() -
-
- -
- -
-
-
- β–Έ - moveTo(resourceId) -
-
- -
- -
-
-
- β–Έ - moveFrom(resourceId) -
-
- -
- -
-
-
- β–Έ - getMediaStreams -
-
- -
- -
-
-
- β–Έ - addMedia(options) -
-
- -
- -
-
-
- β–Έ - processNextQueuedMediaUpdate -
-
- -
- -
-
-
- β–Έ - updateMedia(options) -
-
- -
- -
-
-
- β–Έ - updateAudio(options) -
-
- -
- -
-
-
- β–Έ - updateVideo(options) -
-
- -
- -
-
-
- β–Έ - updateShare(options) -
-
- -
- -
-
-
- β–Έ - acknowledge(type) -
-
- -
- -
-
-
- β–Έ - decline(reason) -
-
- -
- -
-
-
- β–Έ - leave(options) -
-
- -
- -
-
-
- β–Έ - startWhiteboardShare(channelUrl, resourceToken) -
-
- -
- -
-
-
- β–Έ - stopWhiteboardShare(channelUrl) -
-
- -
- -
-
-
- β–Έ - stopShare(options) -
-
- -
- -
-
-
- β–Έ - startRecording() -
-
- -
- -
-
-
- β–Έ - setMuteOnEntry(enabled) -
-
- -
- -
-
-
- β–Έ - setDisallowUnmute(enabled) -
-
- -
- -
-
-
- β–Έ - stopRecording() -
-
- -
- -
-
-
- β–Έ - pauseRecording() -
-
- -
- -
-
-
- β–Έ - resumeRecording() -
-
- -
- -
-
-
- β–Έ - lockMeeting() -
-
- -
- -
-
-
- β–Έ - unlockMeeting() -
-
- -
- -
-
-
- β–Έ - sendDTMF(tones) -
-
- -
- -
-
-
- β–Έ - changeVideoLayout(layoutType?, renderInfo) -
-
- -
- -
-
-
- β–Έ - endMeetingForAll() -
-
- -
- -
-
-
- β–Έ - clearMeetingData -
-
- -
- -
-
-
- β–Έ - isBnrEnabled() -
-
- -
- -
-
-
- β–Έ - isBnrEnabled() -
-
- -
- -
-
-
- β–Έ - enableBNR() -
-
- -
- -
-
-
- β–Έ - disableBNR() -
-
- -
- -
-
-
- β–Έ - sendReaction(reactionType, skinToneType) -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - id -
-
- -
- -
-
-
- β–Έ - correlationId -
-
- -
- -
-
-
- β–Έ - userId -
-
- -
- -
-
-
- β–Έ - orgId -
-
- -
- -
-
-
- β–Έ - resource -
-
- -
- -
-
-
- β–Έ - deviceUrl -
-
- -
- -
-
-
- β–Έ - meetingInfo -
-
- -
- -
-
-
- β–Έ - members -
-
- -
- -
-
-
- β–Έ - meetingFiniteStateMachine -
-
- -
- -
-
-
- β–Έ - conversationUrl -
-
- -
- -
-
-
- β–Έ - locusUrl -
-
- -
- -
-
-
- β–Έ - sipUri -
-
- -
- -
-
-
- β–Έ - destination -
-
- -
- -
-
-
- β–Έ - destinationType -
-
- -
- -
-
-
- β–Έ - partner -
-
- -
- -
-
-
- β–Έ - type -
-
- -
- -
-
-
- β–Έ - owner -
-
- -
- -
-
-
- β–Έ - hostId -
-
- -
- -
-
-
- β–Έ - policy -
-
- -
- -
-
-
- β–Έ - mediaConnections -
-
- -
- -
-
-
- β–Έ - mediaProperties -
-
- -
- -
-
-
- β–Έ - inMeetingActions -
-
- -
- -
-
-
- β–Έ - isSharing -
-
- -
- -
-
-
- β–Έ - shareStatus -
-
- -
- -
-
-
- β–Έ - callEvents -
-
- -
- -
-
-
- β–Έ - networkStatus -
-
- -
- -
-
-
- β–Έ - recording -
-
- -
- -
-
-
- β–Έ - passwordStatus -
-
- -
- -
-
-
- β–Έ - requiredCaptcha -
-
- -
- -
-
-
- β–Έ - recordingController -
-
- -
- -
-
-
- β–Έ - controlsOptionsManager -
-
- -
- -
-
-
- β–Έ - unsetRemoteTracks() -
-
- -
- -
-
-
- β–Έ - isTranscriptionSupported() -
-
- -
- -
-
-
- β–Έ - stopReceivingTranscription() -
-
- -
- -
-
-
- β–Έ - canUpdateMedia() -
-
- -
- -
-
-
- β–Έ - setLocalVideoQuality(level) -
-
- -
- -
-
-
- β–Έ - setRemoteQualityLevel(level) -
-
- -
- -
-
-
- β–Έ - setMeetingQuality(level) -
-
- -
- -
-
-
- β–Έ - shareScreen(options) -
-
- -
- -
-
-
- β–Έ - setStartSetupDelay(typeMedia) -
-
- -
- -
-
-
- β–Έ - setEndSetupDelay(typeMedia) -
-
- -
- -
-
-
- β–Έ - getSetupDelayDuration(typeMedia) -
-
- -
- -
-
-
- β–Έ - setStartSendingMediaDelay(typeMedia) -
-
- -
- -
-
-
- β–Έ - setEndSendingMediaDelay(typeMedia) -
-
- -
- -
-
-
- β–Έ - getSendingMediaDelayDuration(typeMedia) -
-
- -
- -
-
-
- β–Έ - setStartLocalSDPGenRemoteSDPRecvDelay() -
-
- -
- -
-
-
- β–Έ - setEndLocalSDPGenRemoteSDPRecvDelay() -
-
- -
- -
-
-
- β–Έ - getLocalSDPGenRemoteSDPRecvDelay() -
-
- -
- -
-
-
- β–Έ - setStartCallInitiateJoinReq() -
-
- -
- -
-
-
- β–Έ - setEndCallInitiateJoinReq() -
-
- -
- -
-
-
- β–Έ - getCallInitiateJoinReq() -
-
- -
- -
-
-
- β–Έ - setStartJoinReqResp() -
-
- -
- -
-
-
- β–Έ - setEndJoinReqResp() -
-
- -
- -
-
-
- β–Έ - getJoinReqResp() -
-
- -
- -
-
-
- β–Έ - getTotalJmt() -
-
- -
- -
- - - - - - -
Events
-
- -
-
-
- β–Έ - meeting:stateChange -
-
- -
- -
-
-
- β–Έ - media:ready -
-
- -
- -
-
-
- β–Έ - media:stopped -
-
- -
- -
-
-
- β–Έ - meeting:ringing -
-
- -
- -
-
-
- β–Έ - meeting:ringingStop -
-
- -
- -
-
-
- β–Έ - meeting:startedSharingLocal -
-
- -
- -
-
-
- β–Έ - meeting:stoppedSharingLocal -
-
- -
- -
-
-
- β–Έ - meeting:startedSharingRemote -
-
- -
- -
-
-
- β–Έ - meeting:stoppedSharingRemote -
-
- -
- -
-
-
- β–Έ - meeting:locked -
-
- -
- -
-
-
- β–Έ - meeting:unlocked -
-
- -
- -
-
-
- β–Έ - meeting:actionsUpdate -
-
- -
- -
-
-
- β–Έ - meeting:self:unmutedByOthers -
-
- -
- -
-
-
- β–Έ - meeting:self:mutedByOthers -
-
- -
- -
-
-
- β–Έ - meeting:self:requestedToUnmute -
-
- -
- -
-
-
- β–Έ - meeting:self:guestAdmitted -
-
- -
- -
-
-
- β–Έ - meeting:self:lobbyWaiting -
-
- -
- -
-
-
- β–Έ - meeting:self:left -
-
- -
- -
-
-
- β–Έ - meeting:reconnectionStarting -
-
- -
- -
-
-
- β–Έ - meeting:reconnectionSuccess -
-
- -
- -
-
-
- β–Έ - meeting:reconnectionFailure -
-
- -
- -
-
-
- β–Έ - network:quality -
-
- -
- -
-
-
- β–Έ - media:stopped -
-
- -
- -
-
-
- β–Έ - media:stopped -
-
- -
- -
- - -
- - - - -
- -

- Messaging -

- - - - -
- - - -
- - - - - -

Messages are how people communicate in rooms. Each message timestamped and -represented in Webex as a distinct block of content. Messages can contain -plain text and a single file attachment. See the -Message Attachments Guide -for a list of supported media types.

- -
new Messages()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - listen() -
-
- -
- -
-
-
- β–Έ - listen() -
-
- -
- -
-
-
- β–Έ - create(message) -
-
- -
- -
-
-
- β–Έ - update(message, altMessage) -
-
- -
- -
-
-
- β–Έ - get(message) -
-
- -
- -
-
-
- β–Έ - list(options) -
-
- -
- -
-
-
- β–Έ - remove(message) -
-
- -
- -
- - - - - - -
- - - - -
- -

- Resources -

- - -

These are the resources provided by Webex instances for interacting with our developer API

- - -
- - - -
- - - - - -

Memberships represent a person's relationship to a room. Use this API to list -members of any room that you're in or create memberships to invite someone -to a room. Memberships can also be updated to make someone a moderator -or deleted to remove them from the room.

- -
new Memberships()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - listen() -
-
- -
- -
-
-
- β–Έ - create(membership) -
-
- -
- -
-
-
- β–Έ - get(membership) -
-
- -
- -
-
-
- β–Έ - list(options) -
-
- -
- -
-
-
- β–Έ - listWithReadStatus(options) -
-
- -
- -
-
-
- β–Έ - remove(membership) -
-
- -
- -
-
-
- β–Έ - update(membership) -
-
- -
- -
-
-
- β–Έ - updateLastSeen(message) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new People()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - get(person) -
-
- -
- -
-
-
- β–Έ - list(options, showAllTypes) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Rooms are virtual meeting places for getting stuff done. This resource -represents the room itself. Check out the Memberships API to learn -how to add and remove people from rooms and the Messages API for -posting and managing content.

- -
new Rooms()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - listen() -
-
- -
- -
-
-
- β–Έ - create(room) -
-
- -
- -
-
-
- β–Έ - get(room, options) -
-
- -
- -
-
-
- β–Έ - list(options) -
-
- -
- -
-
-
- β–Έ - listWithReadStatus(maxRecent) -
-
- -
- -
-
-
- β–Έ - getWithReadStatus(roomId) -
-
- -
- -
-
-
- β–Έ - remove(room) -
-
- -
- -
-
-
- β–Έ - update(room) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new Teams()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - create(team) -
-
- -
- -
-
-
- β–Έ - get(team, options) -
-
- -
- -
-
-
- β–Έ - list(options) -
-
- -
- -
-
-
- β–Έ - update(team) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Team Memberships represent a person's relationship to a team. Use this API to -list members of any team that you're in or create memberships to invite -someone to a team. Team memberships can also be updated to make someone a -moderator or deleted to remove them from the team.

-

Just like in the Webex app, you must be a member of the team in order to list -its memberships or invite people.

- -
new TeamMemberships()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - create(membership) -
-
- -
- -
-
-
- β–Έ - get(membership) -
-
- -
- -
-
-
- β–Έ - list(options) -
-
- -
- -
-
-
- β–Έ - remove(membership) -
-
- -
- -
-
-
- β–Έ - update(membership) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Webhooks allow your app to be notified via HTTP when a specific event -occurs on Webex. For example, your app can register a webhook to be -notified when a new message is posted into a specific room.

- -
new Webhooks()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - create(webhook) -
-
- -
- -
-
-
- β–Έ - get(webhook) -
-
- -
- -
-
-
- β–Έ - list(options) -
-
- -
- -
-
-
- β–Έ - remove(webhook) -
-
- -
- -
-
-
- β–Έ - update(webhook) -
-
- -
- -
- - - - - - -
- - - - -
- -

- Logging -

- - - - -
- - - -
- - - - - - -
new Logger()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - formatLogs() -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
LoggerConfig
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- level (string?) - : Maximum log level that -should be printed to the console. One of -silent|error|warn|log|info|debug|trace - - -
- -
- historyLength (number?) - : Maximum number of entries to store in the log buffer. - - -
- -
- - - - - - - - - -
Example
- - -
{
-  level: process.env.WEBEX_LOG_LEVEL,
-  historyLength: 1000
-}
- - - - - - - - - - -
- - - - -
- -

- Types -

- - -

The following typedefs describes the responses of the various API calls.

- - -
- - - -
- - - - - - -
MembershipObject
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- id (string) - : Unique identifier for the membership - - -
- -
- roomId (string) - : The room ID - - -
- -
- personId (string) - : The person ID - - -
- -
- personEmail (email) - : The email address of the person / room member - - -
- -
- isModerator (boolean) - : Indicates whether the specified person should be a room moderator - - -
- -
- isMonitor (boolean) - : Indicates whether the specified member is a room monitor - - -
- -
- created (isoDate) - : The date and time that this membership was created - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
MessageObject
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- id (string) - : (server generated) Unique identifier for the message - - -
- -
- personId (string) - : The ID for the author of the message - - -
- -
- personEmail (email) - : The email for the author of the message - - -
- -
- roomId (string) - : The ID for the room of the message - - -
- -
- text (string) - : The message posted to the room in plain text - - -
- -
- markdown (string) - : The message posted to the room in markdown - - -
- -
- files (Array<string>) - : The source URL(s) for the message attachment(s). -See the -Message Attachments - -Guide for a list of supported media types. - - -
- -
- created (isoDate) - : (server generated) The date and time that the message was created - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
PersonObject
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- id (string) - : (server generated) Unique identifier for the person - - -
- -
- emails (Array<email>) - : Email addresses of the person - - -
- -
- displayName (string) - : Display name of the person - - -
- -
- created (isoDate) - : (server generated) The date and time that the person was created - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
RoomObject
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- id (string) - : (server generated) Unique identifier for the room - - -
- -
- title (string) - : The display name for the room. All room members -will see the title so make it something good - - -
- -
- teamId (string) - : (optional) The ID of the team to which the room -belongs - - -
- -
- created (isoDate) - : (server generated) The date and time that the -room was created - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
TeamObject
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- id (string) - : (server generated) Unique identifier for the team - - -
- -
- name (string) - : The name of the team - - -
- -
- created (isoDate) - : (server generated) The date and time that the -team was created - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
TeamMembershipObject
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- id (string) - : (server generated) Unique identifier for the team membership - - -
- -
- teamId (string) - : The team ID - - -
- -
- personId (string) - : The person ID - - -
- -
- personEmail (string) - : The email address of the person - - -
- -
- isModerator (boolean) - : Set to -true - to make the person a team -moderator - - -
- -
- created (string) - : (server generated) The date and time that the team membership was created - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
WebhookObject
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- id (string) - : (server generated) Unique identifier for the webhook - - -
- -
- resource (string) - : The resource type for the webhook - - -
- -
- event (string) - : The event type for the webhook - - -
- -
- filter (string) - : The filter that defines the webhook scope - - -
- -
- targetUrl (string) - : The URL that receives POST requests for each event - - -
- -
- name (string) - : A user-friendly name for this webhook - - -
- -
- created (string) - : (server generated) The date and time that the webhook was created - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- email -

- - - - packages/webex/src/index.js - - -
- - -

An email address, as a string.

- -
email
- -

- Type: - string -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- isoDate -

- - - - packages/webex/src/index.js - - -
- - -

The date and time, specified in ISO 8601 extended offset date/time -format (e.g. 2015-10-18T14:26:16+00:00).

- -
isoDate
- -

- Type: - string -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
AttachmentActionObject
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- id (string) - : (server generated) Unique identifier for the attachment action - - -
- -
- messageId (string) - : The ID of the message in which attachment action is to be performed - - -
- -
- type (string) - : The type of attachment action eg., submit - - -
- -
- inputs (Object) - : The inputs for form fields in attachment message - - -
- -
- personId (string) - : (server generated) The ID for the author of the attachment action - - -
- -
- roomId (string) - : (server generated) The ID for the room of the message - - -
- -
- created (isoDate) - : (server generated) The date and time that the message was created - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

AttachmentActions are events that communicate information when a user clicks on an -Action.Submit button in a card displayed in Webex -Information conveyed in an AttachmentAction includes details about the user that -clicked the button along with any card specific inputs. See the -Attachments Actions API Documentation -for more details

- -
new AttachmentActions()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - create(attachmentAction) -
-
- -
- -
-
-
- β–Έ - get(attachmentAction) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Gets a list of all recent devices associated with the user -the device list gets populated from Redis

- -
getAll(): Promise<Device>
- - - - - - - - - - - - - - - - -
Returns
- Promise<Device>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Gets a list of all recent devices associated with the user -the device list gets populated from Redis

- -
refresh(): Promise<Device>
- - - - - - - - - - - - - - - - -
Returns
- Promise<Device>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Search for a device by name

- -
search(options: Object): Promise<Device>
- - - - - - - - - - - -
Parameters
-
- -
-
- options (Object) - -
- - - - - - - - - - - - - - - - - - - - - - -
NameDescription
options.searchQuery string -
- -
- -
- - - - - - -
Returns
- Promise<Device>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Caches the device info and also registers to Redis for subsequent fetches

- -
upsert(device: Object): deviceInfo
- - - - - - - - - - - -
Parameters
-
- -
-
- device (Object) - -
- - - - - - - - - - - - - - - - - - - - - - -
NameDescription
device.id string -
- -
- -
- - - - - - -
Returns
- deviceInfo: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Retreives device info of a particular device

- -
get(token: string): Promise<deviceInfo>
- - - - - - - - - - - -
Parameters
-
- -
-
- token (string) - -
- -
- -
- - - - - - -
Returns
- Promise<deviceInfo>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Unregisters the device from Redis, will not fetch in subsequent loads, -similar to space.deleteBinding()

- -
remove(deviceId: string): Promise<deviceInfo>
- - - - - - - - - - - -
Parameters
-
- -
-
- deviceId (string) - -
- -
- -
- - - - - - -
Returns
- Promise<deviceInfo>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Requests to display PIN on the device

- -
requestPin(device: object, options: object): Promise<deviceInfo>
- - - - - - - - - - - -
Parameters
-
- -
-
- device (object) - -
- -
- -
-
- options (object - = {}) - -
- - - - - - - - - - - - - - - - - - - - - - -
NameDescription
options.data object -
- -
- -
- - - - - - -
Returns
- Promise<deviceInfo>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

pairs the device with the user (manual pairing), also adds it to -user's recents list for subsequent fetches. -similar to space.join()

- -
pair(options: object): Promise<deviceInfo>
- - - - - - - - - - - -
Parameters
-
- -
-
- options (object - = {}) - -
- - - - - - - - - - - - - - - - - - - - - - -
NameDescription
options.pin number -
- -
- -
- - - - - - -
Returns
- Promise<deviceInfo>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

unpairs the device with the user (manual/ultrasonic pairing), but still -keeps in the recents list/does not remove from Redis -options.removeAllDevices will remove all associated devices to user -similar to space.leave()

- -
unpair(options: object): Promise<deviceInfo>
- - - - - - - - - - - -
Parameters
-
- -
-
- options (object - = {}) - -
- - - - - - - - - - - - - - - - - - - - - - -
NameDescription
options.removeAllDevices boolean -
- -
- -
- - - - - - -
Returns
- Promise<deviceInfo>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

binds the space to the paired device (if supported) -similar to space.bindConversation()

- -
bindSpace(options: object): Promise<deviceInfo>
- - - - - - - - - - - -
Parameters
-
- -
-
- options (object - = {}) - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
options.url boolean - , conversation url -
options.kmsResourceObjectUrl boolean - of the convo -
- -
- -
- - - - - - -
Returns
- Promise<deviceInfo>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

unbinds the space to the paired device (if supported) -similar to space.unbindConversation()

- -
unbindSpace(): Promise<deviceInfo>
- - - - - - - - - - - - - - - - -
Returns
- Promise<deviceInfo>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Gets the audio state of the paired device -similar to device.getAudioState()

- -
getAudioState(): Promise<audioState>
- - - - - - - - - - - - - - - - -
Returns
- Promise<audioState>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Updates audio state of the paired device, should be called every 10 minutes -or when mic or volume state is changed -similar to device.putAudioState()

- -
putAudioState(space: object, audioState: object): Promise<audioState>
- - - - - - - - - - - -
Parameters
-
- -
-
- space (object) - -
- -
- -
-
- audioState (object - = {}) - -
- -
- -
- - - - - - -
Returns
- Promise<audioState>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Mutes paired device -similar to device.mute()

- -
mute(): Promise<audioState>
- - - - - - - - - - - - - - - - -
Returns
- Promise<audioState>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Unmutes paired device -similar to device.unmute()

- -
unmute(): Promise<audioState>
- - - - - - - - - - - - - - - - -
Returns
- Promise<audioState>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Increases paired device's volume -similar to device.increaseVolume()

- -
increaseVolume(): Promise<audioState>
- - - - - - - - - - - - - - - - -
Returns
- Promise<audioState>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Decreases paired device's volume -similar to device.decreaseVolume()

- -
decreaseVolume(): Promise<audioState>
- - - - - - - - - - - - - - - - -
Returns
- Promise<audioState>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Sets paired device's volume but should use increase and decrease api instead -similar to device.setVolume()

- -
setVolume(level: number): Promise<audioState>
- - - - - - - - - - - -
Parameters
-
- -
-
- level (number - = 0) - -
- -
- -
- - - - - - -
Returns
- Promise<audioState>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Utility function to update decrypted device name on device object

- -
_updateDeviceMetadata(deviceArray: Array): device
- - - - - - - - - - - -
Parameters
-
- -
-
- deviceArray (Array - = []) - -
- -
- -
- - - - - - -
Returns
- device: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Utility function to update decrypted device name on device object

- -
_decryptDeviceName(inDevice: object): device
- - - - - - - - - - - -
Parameters
-
- -
-
- inDevice (object - = {}) - -
- -
- -
- - - - - - -
Returns
- device: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Utility function to update device info on mercury updates

- -
_receiveDeviceUpdates(device: object): device
- - - - - - - - - - - -
Parameters
-
- -
-
- device (object) - -
- -
- -
- - - - - - -
Returns
- device: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Metrics handles all the call metrics events

- -
new Metrics()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - initMediaPayload(eventType, identifiers, options) -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - initialSetup(meetingCollection, webex) -
-
- -
- -
-
-
- β–Έ - postEvent(options) -
-
- -
- -
-
-
- β–Έ - initPayload(eventType, identifiers, options) -
-
- -
- -
-
-
- β–Έ - parseLocusError(err, showToUser) -
-
- -
- -
-
-
- β–Έ - userAgentToString() -
-
- -
- -
-
-
- β–Έ - sendBehavioralMetric(metricName, metricFields, metricTags) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new LogsRequest()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - uploadLogs(options) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - -

MediaDirection

- -
MediaDirection
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- sendAudio (boolean) - - -
- -
- receiveAudio (boolean) - - -
- -
- sendVideo (boolean) - - -
- -
- receiveVideo (boolean) - - -
- -
- sendShare (boolean) - - -
- -
- receiveShare (boolean) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

MediaDirection

- -
MediaDirection
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- sendAudio (boolean) - - -
- -
- receiveAudio (boolean) - - -
- -
- sendVideo (boolean) - - -
- -
- receiveVideo (boolean) - - -
- -
- sendShare (boolean) - - -
- -
- receiveShare (boolean) - - -
- -
- isSharing (boolean) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

SendOptions

- -
SendOptions
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- sharePreferences (Object) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

SendOptions

- -
SendOptions
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- sendAudio (Boolean) - - -
- -
- sendVideo (Boolean) - - -
- -
- sendShare (Boolean) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
Media
- -

- Type: - any -

- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - setLocalTrack(enabled, track) -
-
- -
- -
-
-
- β–Έ - reconnectMedia(peerConnection, meetingProperties) -
-
- -
- -
-
-
- β–Έ - generateLocalMedias(mediaId, audioMuted, videoMuted) -
-
- -
- -
-
-
- β–Έ - getLocalMedia(options, config) -
-
- -
- -
-
-
- β–Έ - checkTracks(trackType, track, receiveTracks) -
-
- -
- -
-
-
- β–Έ - attachMedia(mediaProperties, meetingProperties) -
-
- -
- -
-
-
- β–Έ - updateMedia(mediaProperties, meetingProperties) -
-
- -
- -
-
-
- β–Έ - setTrackOnTransceiver(transceiver, options) -
-
- -
- -
-
-
- β–Έ - updateTransceiver(meetingProperties, peerConnection, transceiver, options) -
-
- -
- -
-
-
- β–Έ - getDisplayMedia(options, config) -
-
- -
- -
-
-
- β–Έ - getMedia(audio, video, config) -
-
- -
- -
-
-
- β–Έ - getSupportedDevice(options?) -
-
- -
- -
-
-
- β–Έ - getDevices() -
-
- -
- -
-
-
- β–Έ - toggleStream() -
-
- -
- -
-
-
- β–Έ - stopTracks(track) -
-
- -
- -
-
-
- β–Έ - stopStream(stream) -
-
- -
- -
-
-
- β–Έ - getUserMedia(mediaSetting, audioVideo, sharePreferences, config) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
pc
- -

- Type: - any -

- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - setContentSlides(screenPc) -
-
- -
- -
-
-
- β–Έ - iceCandidate(peerConnection, options) -
-
- -
- -
-
-
- β–Έ - replaceTrack(peerConnection, track) -
-
- -
- -
-
-
- β–Έ - addStream(peerConnection, stream) -
-
- -
- -
-
-
- β–Έ - setRemoteSessionDetails(peerConnection, typeStr, remoteSdp, meetingId) -
-
- -
- -
-
-
- β–Έ - createOffer(peerConnection, meetingProperties) -
-
- -
- -
-
-
- β–Έ - rollBackLocalDescription(peerConnection) -
-
- -
- -
-
-
- β–Έ - updatePeerConnection(params, meetingProperties) -
-
- -
- -
-
-
- β–Έ - createAnswer(params, meetingProperties) -
-
- -
- -
-
-
- β–Έ - close(peerConnection) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - -

munges the bandwidth limit into the sdp

- -
insertBandwidthLimit
- - - - - - - - - - - -
Parameters
-
- -
-
- sdpLines (String) - -
- -
- -
-
- index (Number) - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

needed for calliope max-fs

- -
setRemoteVideoConstraints
- - - - - - - - - - - -
Parameters
-
- -
-
- sdp (String) - -
- -
- -
-
- level (String - = QUALITY_LEVELS.HIGH) - quality level for max-fs - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

checks that sdp has h264 codec in it

- -
checkH264Support
- - - - - - - - - - - -
Parameters
-
- -
-
- sdp (String) - -
- -
- -
- - - - - - -
Returns
- boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

validates the sdp, checks port, candidates, and ice info

- -
isSdpInvalid
- - - - - - - - - - - -
Parameters
-
- -
-
- sdp (String) - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

munges the bandwidth into the sdp

- -
limitBandwidth
- - - - - - - - - - - -
Parameters
-
- -
-
- sdp (String) - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Convert C line to IPv4

- -
convertCLineToIpv4(sdp: string): string
- - - - - - - - - - - -
Parameters
-
- -
-
- sdp (string) - -
- -
- -
- - - - - - -
Returns
- string: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

estimate profile levels for max-fs & max-mbps values

- -
adjustH264Profile(sdp: string, maxFsValue: number): string
- - - - - - - - - - - -
Parameters
-
- -
-
- sdp (string) - -
- -
- -
-
- maxFsValue (number) - -
- -
- -
- - - - - - -
Returns
- string: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Extended Error object to signify the intent to join for unclaimed PMR scenarios

- -
new ReconnectionError(message: String?, error: Object?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- message (String? - = ERROR_DICTIONARY.RECONNECTION.MESSAGE) - -
- -
- -
-
- error (Object? - = null) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Extended Error object for media errors

- -
new MediaError(message: String?, error: Object?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- message (String? - = ERROR_DICTIONARY.MEDIA.MESSAGE) - -
- -
- -
-
- error (Object? - = null) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new MeetingNotActiveError()
- - -

- Extends - - WebexMeetingsError - -

- - - - - - - - - - - - -
Properties
-
- -
- code (number) - : 30101 - - -
- -
- message (string) - : 'Meeting has already Ended or not Active' - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new UserNotJoinedError()
- - -

- Extends - - WebexMeetingsError - -

- - - - - - - - - - - - -
Properties
-
- -
- code (number) - : 30102 - - -
- -
- message (string) - : 'User has already left the meeting' - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new NoMediaEstablishedYetError()
- - -

- Extends - - WebexMeetingsError - -

- - - - - - - - - - - - -
Properties
-
- -
- code (number) - : 30103 - - -
- -
- message (string) - : 'User has not established media yet' - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new UserInLobbyError()
- - -

- Extends - - WebexMeetingsError - -

- - - - - - - - - - - - -
Properties
-
- -
- code (number) - : 30104 - - -
- -
- message (string) - : 'user is still in the lobby or not joined' - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new InvalidSdpError()
- - -

- Extends - - WebexMeetingsError - -

- - - - - - - - - - - - -
Properties
-
- -
- code (number) - : 30201 - - -
- -
- message (string) - : 'user is still in the lobby or not joined' - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new IceGatheringFailed()
- - -

- Extends - - WebexMeetingsError - -

- - - - - - - - - - - - -
Properties
-
- -
- code (number) - : 30202 - - -
- -
- message (string) - : 'user failed ice gathering check network/firewall' - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new WebexMeetingsError(code: number, args: ...Array<any>, message: string?, fileName: string?, lineNumber: number?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- code (number) - Error code - -
- -
- -
-
- args (...Array<any>) - -
- -
- -
-
- message (string?) - Error message - -
- -
- -
-
- fileName (string?) - Name of the script file where error was generated - -
- -
- -
-
- lineNumber (number?) - Line number of the script file where error was generated - -
- -
- -
- - - -
Properties
-
- -
- code (number) - : Error code - - -
- -
- - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - toString() -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Extended Error object to signify the intent to join for unclaimed PMR scenarios

- -
new IntentToJoinError(message: String?, error: Object?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- message (String? - = ERROR_DICTIONARY.INTENT_TO_JOIN.MESSAGE) - -
- -
- -
-
- error (Object? - = null) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Extended Error object to signify a join meeting error

- -
new JoinMeetingError(options: Object?, message: String?, error: Object?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- options (Object? - = {}) - -
- -
- -
-
- message (String? - = ERROR_DICTIONARY.JOIN_MEETING.MESSAGE) - -
- -
- -
-
- error (Object? - = null) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Extended Error object for general parameter errors

- -
new PermissionError(message: String?, error: Object?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- message (String? - = ERROR_DICTIONARY.PERMISSION.MESSAGE) - -
- -
- -
-
- error (Object? - = null) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new MeetingInfo()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - getMeetingInfo(id) -
-
- -
- -
-
-
- β–Έ - setMeetingInfo(id, info) -
-
- -
- -
-
-
- β–Έ - fetchInfoOptions(destination, type = null) -
-
- -
- -
-
-
- β–Έ - fetchMeetingInfo(destination, type = null) -
-
- -
- -
-
-
- β–Έ - fetchMeetingInfo(destination, type = null, password, captchaInfo) -
-
- -
- -
-
-
- β–Έ - createAdhocSpaceMeeting(conversationUrl) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
new MeetingInfo()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - getMeetingInfo(id) -
-
- -
- -
-
-
- β–Έ - setMeetingInfo(id, info) -
-
- -
- -
-
-
- β–Έ - fetchInfoOptions(destination, type = null) -
-
- -
- -
-
-
- β–Έ - fetchMeetingInfo(destination, type = null) -
-
- -
- -
-
-
- β–Έ - fetchMeetingInfo(destination, type = null, password, captchaInfo) -
-
- -
- -
-
-
- β–Έ - createAdhocSpaceMeeting(conversationUrl) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
new MeetingInfoCollection()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - get(id) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
new MeetingInfoRequest()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - fetchMeetingInfo(options) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
new MeetingInfoRequest()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - fetchMeetingInfo(options) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - -

Helper function to check if a string matches a known meeting link pattern

- -
isMeetingLink(value: String): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- value (String) - string to parse and see if it matches a meeting link - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Helper function to check if a string matches a known meeting link pattern

- -
isMeetingLink(value: String): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- value (String) - string to parse and see if it matches a meeting link - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Helper function to build up a correct locus url depending on the value passed

- -
getResourceUrl(type: String, value: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- type (String) - One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK] - -
- -
- -
-
- value (Object) - ?? value.value - -
- -
- -
- - - - - - -
Returns
- Object: - returns an object with {resource, method} - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Helper function to build up a correct locus url depending on the value passed

- -
getRequestBody(options: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- options (Object) - type and value to fetch meeting info - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
options.type String - One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK] -
options.destination Object - ?? value.value -
- -
- -
- - - - - - -
Returns
- Object: - returns an object with {resource, method} - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Helper function to parse the webex site/host from a URI string.

- -
getWebexSite(uri: String): String
- - - - - - - - - - - -
Parameters
-
- -
-
- uri (String) - string (e.g. ' -10019857020@convergedats.webex.com -') - -
- -
- -
- - - - - - -
Returns
- String: - the site/host part of the URI string (e.g. 'convergedats.webex.com') - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Helper function to return the direct URI for fetching meeting info (to avoid a redirect).

- -
getDirectMeetingInfoURI(options: Object): String
- - - - - - - - - - - -
Parameters
-
- -
-
- options (Object) - type and value to fetch meeting info - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
options.type String - One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK] -
options.destination Object - ?? value.value -
- -
- -
- - - - - - -
Returns
- String: - returns a URI string or null of there is no direct URI - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Error to indicate that wbxappapi requires a password

- -
new MeetingInfoV2PasswordError(wbxAppApiErrorCode: Number?, meetingInfo: Object?, message: String?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- wbxAppApiErrorCode (Number?) - -
- -
- -
-
- meetingInfo (Object?) - -
- -
- -
-
- message (String? - = PASSWORD_ERROR_DEFAULT_MESSAGE) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- MeetingInfoV2AdhocMeetingError -

- - - - packages/@webex/plugin-meetings/src/meeting-info/meeting-info-v2.ts - - -
- - -

Error generating a adhoc space meeting

- -
new MeetingInfoV2AdhocMeetingError(wbxAppApiErrorCode: Number?, message: String?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- wbxAppApiErrorCode (Number?) - -
- -
- -
-
- message (String? - = ADHOC_MEETING_DEFAULT_ERROR) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Error to indicate that preferred webex site not present to start adhoc meeting

- -
new MeetingInfoV2CaptchaError(wbxAppApiErrorCode: Number?, captchaInfo: Object?, message: String?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- wbxAppApiErrorCode (Number?) - -
- -
- -
-
- captchaInfo (Object?) - -
- -
- -
-
- message (String? - = CAPTCHA_ERROR_DEFAULT_MESSAGE) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

AudioVideo

- -
AudioVideo
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- audio (Object) - - -
    - -
  • audio.deviceId String - -
  • - -
- -
- -
- video (Object) - - -
    - -
  • video.deviceId String - -
  • - -
  • video.localVideoQuality String - -

    // [240p, 360p, 480p, 720p, 1080p]

    -
  • - -
- -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

SharePreferences

- -
SharePreferences
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- shareConstraints (Object?) - - -
- -
- highFrameRate (Boolean?) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

JoinOptions

- -
JoinOptions
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- resourceId (String?) - - -
- -
- pin (String?) - - -
- -
- moderator (Boolean?) - - -
- -
- meetingQuality ((String | Object)?) - - -
    - -
  • meetingQuality.local String? - -
  • - -
  • meetingQuality.remote String? - -
  • - -
- -
- -
- rejoin (Boolean?) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Recording

- -
Recording
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- state (Object) - - -
- -
- modifiedBy (String) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

The meeting instance to execute all state changes on

- -
meeting
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Specify joining via audio (option: pstn), video, screenshare

- -
join(options: JoinOptions): Promise
- - - - - - - - - - - -
Parameters
-
- -
-
- options (JoinOptions - = {}) - A configurable options object for joining a meeting - -
- -
- -
- - - - - - -
Returns
- Promise: - the join response - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Stats Analyzer class that will emit events based on detected quality

- -
new StatsAnalyzer()
- - -

- Extends - - EventsScope - -

- - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - updateMediaStatus(status) -
-
- -
- -
-
-
- β–Έ - sendMqaData() -
-
- -
- -
-
-
- β–Έ - startAnalyzer(peerConnection) -
-
- -
- -
-
-
- β–Έ - stopAnalyzer() -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - parseAudioSource(result, type) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Values for some browsers specifically Safari will be undefined we explicitly set to null -https://bugs.webkit.org/show_bug.cgi?id=206645 -https://bugs.webkit.org/show_bug.cgi?id=212668

- -
PACKETLOSS
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

NetworkQualityMonitor class that will emit events based on detected quality

- -
new NetworkQualityMonitor()
- - -

- Extends - - EventsScope - -

- - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - emitNetworkQuality() -
-
- -
- -
-
-
- β–Έ - updateNetworkQualityStatus() -
-
- -
- -
-
-
- β–Έ - determineUplinkNetworkQuality(configObj) -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - networkQualityStats -
-
- -
- -
- - - - - - -
Events
-
- -
-
-
- β–Έ - network:quality -
-
- -
- -
- - -
- - - - -
- - - - - -

determines if packetLoss ratio is over threshold set in config -sets networkQualityScore to 0 if over threshold

- -
determinePacketLoss
- - - - - - - - - - - - - - - - -
Returns
- boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

determines if round trip time value is over threshold set in config -sets networkQualityScore to 0 if over threshold

- -
determineLatency
- - - - - - - - - - - - - - - - -
Returns
- boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

determines if jitter value is over threshold in config -sets networkQualityScore to 0 if over threshold

- -
deterMineJitter
- - - - - - - - - - - - - - - - -
Returns
- boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

returns null if val is specifically undefined

- -
determineIfUndefined
- - - - - - - - - - - -
Parameters
-
- -
-
- value ((number | undefined)) - -
- -
- -
- - - - - - -
Returns
- (number | null): - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Events -plugin-meetings local -Used to emit events internally between modules specific to an object

- -
new EventsScope()
- - -

- Extends - - ChildEmitter - -

- - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - emit(scope, eventName, args) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Roap options

- -
RoapOptions
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- sdp (String) - - -
- -
- meeting (Meeting) - - -
- -
- roapSeq (Number) - - -
- -
- reconnect (Boolean) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
SeqOptions
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- correlationId (String) - - -
- -
- mediaId (String) - - -
- -
- seq (Number) - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new RoapHandler()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - perform(session, meeting, action) -
-
- -
- -
-
-
- β–Έ - execute(signal, session, action, meeting, prefix) -
-
- -
- -
-
-
- β–Έ - handleAction(session, action, meeting, correlationId) -
-
- -
- -
-
-
- β–Έ - submit(action) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new RoapRequest()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - attachRechabilityData(localSdp, options) -
-
- -
- -
-
-
- β–Έ - sendRoap(options) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Handles the process of finding out TURN server information from Linus. -This is achieved by sending a TURN_DISCOVERY_REQUEST.

- -
new TurnDiscovery(roapRequest: RoapRequest)
- - - - - - - - - - - -
Parameters
-
- -
-
- roapRequest (RoapRequest) - -
- -
- -
- - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - sendRoapOK(meeting) -
-
- -
- -
-
-
- β–Έ - doTurnDiscovery(meeting, isReconnecting) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new MediaProperties()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - getVideoDeviceId() -
-
- -
- -
-
-
- β–Έ - setRemoteAudioTrack(remoteAudioTrack) -
-
- -
- -
-
-
- β–Έ - setRemoteVideoTrack(remoteVideoTrack) -
-
- -
- -
-
-
- β–Έ - setVideoDeviceId(deviceId) -
-
- -
- -
-
-
- β–Έ - unsetRemoteStream() -
-
- -
- -
-
-
- β–Έ - unsetRemoteMedia() -
-
- -
- -
-
-
- β–Έ - unsetRemoteStreams() -
-
- -
- -
-
-
- β–Έ - unsetRemoteTracks() -
-
- -
- -
-
-
- β–Έ - unsetMediaStreams() -
-
- -
- -
-
-
- β–Έ - unsetMediaTracks() -
-
- -
- -
-
-
- β–Έ - waitForIceConnectedState() -
-
- -
- -
-
-
- β–Έ - getCurrentConnectionType() -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Initializes the StateMachine for the meeting

- -
create(meetingRef: Meeting): StateMachine
- - - - - - - - - - - -
Parameters
-
- -
-
- meetingRef (Meeting) - A reference to a meeting instance - -
- -
- -
- - - - - - -
Returns
- StateMachine: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
to(remote: Object): String
- - - - - - - - - - - -
Parameters
-
- -
-
- remote (Object) - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
remote.remoteAnswered Boolean -
remote.remoteDeclined Boolean -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Ring stop transition, to end the ring event for the meeting, and transition the state to ANSWERED OR DECLINED, only for outgoing meetings

- -
onRemote(transition: Object, stop: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- transition (Object) - -- FiniteStateMachine automatically passed, not used - -
- -
- -
-
- stop (Object) - -- {remoteAnswered: {Boolean}, remoteDeclined: {Boolean}} - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Ring transition, to cause the ring event for the meeting, and transition the state to RINGING, for both incoming, and outgoing meetings

- -
onRing(transition: Object, type: String): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- transition (Object) - -- FiniteStateMachine automatically passed, not used - -
- -
- -
-
- type (String) - -- incoming call === INCOMING / or other meetings have a ring type of JOIN - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

handle the entry to error state

- -
onEnterError(transition: Object, error: Error): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- transition (Object) - -
- -
- -
-
- error (Error) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

After ANY transition occurs, we want to know what state the meeting moved to for debugging

- -
onAfterTransition(transition: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- transition (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

The purpose of this class is to manage the local and remote mute state and make sure that the server state always matches -the last requested state by the client.

-

More info about Locus muting API: https://sqbu-github.cisco.com/pages/WebExSquared/locus/guides/mute.html#

- -
new MuteState(type: String, meeting: Object)
- - - - - - - - - - - -
Parameters
-
- -
-
- type (String) - audio or video - -
- -
- -
-
- meeting (Object) - the meeting object (used for reading current remote mute status) - -
- -
- -
- - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - handleClientRequest(meeting?, mute?) -
-
- -
- -
-
-
- β–Έ - applyClientStateLocally(meeting?) -
-
- -
- -
-
-
- β–Έ - handleServerRemoteMuteUpdate(muted?, unmuteAllowed?) -
-
- -
- -
-
-
- β–Έ - handleServerLocalUnmuteRequired(meeting?) -
-
- -
- -
-
-
- β–Έ - isMuted() -
-
- -
- -
-
-
- β–Έ - isLocallyMuted() -
-
- -
- -
-
-
- β–Έ - isSelf() -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
handleClientRequest(isEnable: Boolean?, meeting: Object?): Promise
- - - - - - - - - - - -
Parameters
-
- -
-
- isEnable (Boolean?) - true for enableBNR, false for disableBNR request - -
- -
- -
-
- meeting (Object?) - the meeting object - -
- -
- -
- - - - - - -
Returns
- Promise: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

enableBNR API

- -
enableBNR(meeting: Object): Promise<Boolean>
- - - - - - - - - - - -
Parameters
-
- -
-
- meeting (Object) - the meeting object - -
- -
- -
- - - - - - -
Returns
- Promise<Boolean>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

disableBNR API

- -
disableBNR(meeting: Object): Promise<Boolean>
- - - - - - - - - - - -
Parameters
-
- -
-
- meeting (Object) - the meeting object - -
- -
- -
- - - - - - -
Returns
- Promise<Boolean>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Stores the delta values for a changed participant.

- -
DeltaParticipant
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- delta (Record<string, boolean>) - : Contains changed streams. - - -
- -
- person (Object) - : Contains person data. - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

handles when the locus.host is updated

- -
updateHostInfo(host: Object): undefined
- - - - - - - - - - - -
Parameters
-
- -
-
- host (Object) - the locus.host property - -
- -
- -
- - - - - - -
Returns
- undefined: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

handles when the locus.mediaShares is updated

- -
updateMediaShares(mediaShares: Object): undefined
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - the locus.mediaShares property - -
- -
- -
- - - - - - -
Returns
- undefined: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

handles when the locus.self is updated

- -
updateSelf(self: Object, participants: Array): undefined
- - - - - - - - - - - -
Parameters
-
- -
-
- self (Object) - the locus.mediaShares property - -
- -
- -
-
- participants (Array) - the locus.participants property - -
- -
- -
- - - - - - -
Returns
- undefined: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

parses the relevant values for self: muted, guest, moderator, mediaStatus, state, joinedWith, pstnDevices, creator, id

- -
parse(self: Object, deviceId: String): undefined
- - - - - - - - - - - -
Parameters
-
- -
-
- self (Object) - -
- -
- -
-
- deviceId (String) - -
- -
- -
- - - - - - -
Returns
- undefined: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Checks if user has joined the meeting

- -
isJoined(self: Object): boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- self (Object) - -
- -
- -
- - - - - - -
Returns
- boolean: - isJoined - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Validate if the Meeting Layout Controls Layout has changed.

- -
layoutChanged(previous: Self, current: Self): boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- previous (Self) - Previous self state - -
- -
- -
-
- current (Self) - Current self state [per event] - -
- -
- -
- - - - - - -
Returns
- boolean: - If the MEeting Layout Controls Layout has changed. - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get the id from the self object

- -
getSelfIdentity(self: Object): String
- - - - - - - - - - - -
Parameters
-
- -
-
- self (Object) - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get the "remote mute" property from the self object

- -
getRemoteMuted(self: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- self (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- wasMediaInactiveOrReleased -

- - - - packages/@webex/plugin-meetings/src/locus-info/selfUtils.ts - - -
- - - -
wasMediaInactiveOrReleased(oldSelf: Object, changedSelf: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- oldSelf (Object - = {}) - -
- -
- -
-
- changedSelf (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isLocusUserUnadmitted(check: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- check (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isLocusUserAdmitted(check: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- check (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isUserUnadmitted(self: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- self (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - -
Throws
-
    - -
  • Error: when self is undefined -
  • - -
- - - - - - - - - - - -
- - - - -
- - - - - - -
isDeviceObserving(oldSelf: Object, changedSelf: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- oldSelf (Object) - -
- -
- -
-
- changedSelf (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - -
Throws
-
    - -
  • Error: if changed self was undefined -
  • - -
- - - - - - - - - - - -
- - - - -
- - - - - - -
isUserAdmitted(oldSelf: Object, changedSelf: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- oldSelf (Object) - -
- -
- -
-
- changedSelf (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - -
Throws
-
    - -
  • Error: if changed self was undefined -
  • - -
- - - - - - - - - - - -
- - - - -
- - - - - -

extract the sipUrl from the partner

- -
getSipUrl(partner: Object, type: any, sipUri: any, info: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- partner (Object) - -
- -
- -
-
- type (any) - -
- -
- -
-
- sipUri (any) - -
- -
- -
-
- info (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

parse the relevant host values that we care about: id

- -
parse(host: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- host (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - parsed host or null if host was undefined - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get the previous and current host values parsed, as well as the boolean updates

- -
getHosts(oldHost: Object, newHost: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- oldHost (Object) - -
- -
- -
-
- newHost (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - previous: {Object} old host, current: {Object} new host, updates: {isNewHost: {boolean}} boolean update values - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

determine by id if 2 hosts are different

- -
isDifferentHosts(previousId: String, currentId: String): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- previousId (String) - -
- -
- -
-
- currentId (String) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Extract the id from the host object

- -
getId(host: Object): String
- - - - - - - - - - - -
Parameters
-
- -
-
- host (Object) - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Controls

- -
LocusControls
- -

- Type: - Object -

- - - - - - - - - - - - - -
Properties
-
- -
- record (Object) - - -
    - -
  • record.recording Boolean - -
  • - -
  • record.meta Object - -
  • - -
- -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

parse the relevant host values that we care about: id

- -
parse(controls: LocusControls): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- controls (LocusControls) - -
- -
- -
- - - - - - -
Returns
- Object: - parsedObject - parsed host or null if host was undefined - - - -
Returns
- String: - parsedObject.recordingId - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

parses and returns previous state vs current state and triggers the changes.

- -
getControls(oldControls: LocusControls, newControls: LocusControls): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- oldControls (LocusControls) - previous state - -
- -
- -
-
- newControls (LocusControls) - current state - -
- -
- -
- - - - - - -
Returns
- Object: - combination of state plus the changes - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Extract the id from the record controls object

- -
getId(controls: LocusControls): (String | null)
- - - - - - - - - - - -
Parameters
-
- -
-
- controls (LocusControls) - -
- -
- -
- - - - - - -
Returns
- (String | null): - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Parse the relevant values that we care about

- -
parseApp(embeddedApp: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- embeddedApp (Object) - raw embedded app object - -
- -
- -
- - - - - - -
Returns
- Object: - parsedObject - parsed embedded app object - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Determines if two embedded apps arrays are similar. -NOTE: This is a simple test for performance reasons.

- -
areSimilar(apps1: Array<any>, apps2: Array<any>): boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- apps1 (Array<any>) - an array of apps - -
- -
- -
-
- apps2 (Array<any>) - an array of apps - -
- -
- -
- - - - - - -
Returns
- boolean: - true if the arrays are different - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Parse the array of embedded apps

- -
parse(embeddedApps: array): array
- - - - - - - - - - - -
Parameters
-
- -
-
- embeddedApps (array) - -
- -
- -
- - - - - - -
Returns
- array: - result - new array of parsed embedded app objects - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

parses the relevant values for mediaShares: contentId, disposition

- -
parse(mediaShares: Object): undefined
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- undefined: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get the previous and current mediaShares values parsed, as well as the boolean updates

- -
getMediaShares(oldShare: Object, newShare: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- oldShare (Object) - -
- -
- -
-
- newShare (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - previous: {Object} old share, current: {Object} new share, - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get the content floor disposition (released, granted)

- -
getContentDisposition(mediaShares: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - disposition - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get the whiteboard floor disposition (released, granted)

- -
getWhiteboardDisposition(mediaShares: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Boolean: - disposition - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

extract the content property from media shares

- -
extractContent(mediaShares: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

extract the whiteboard property from media shares

- -
extractWhiteboard(mediaShares: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

extract the media stream floor property from content object

- -
extractFloor(mediaStream: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaStream (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

extract the content's floor from media shares

- -
extractContentFloor(mediaShares: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

extract the whiteboard's floor from media shares

- -
extractWhiteboardFloor(mediaShares: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get who is sharing from media shares (content)

- -
getContentBeneficiaryId(mediaShares: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get who is sharing from media shares (whiteboard)

- -
getWhiteboardBeneficiaryId(mediaShares: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

get the which whiteboard is being shared via resource url

- -
getWhiteboardResourceUrl(mediaShares: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- mediaShares (Object) - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Compares two loci to determine which one contains the most recent state

- -
compare(current: Types~Locus, incoming: Types~Locus): string
- - - - - - - - - - - -
Parameters
-
- -
-
- current (Types~Locus) - -
- -
- -
-
- incoming (Types~Locus) - -
- -
- -
- - - - - - -
Returns
- string: - loci comparison state - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
LociMetadata
- -

- Type: - object -

- - - - - - - - - - - - - -
Properties
-
- -
- start (number) - : Starting sequence number - - -
- -
- end (number) - : Ending sequence number - - -
- -
- first (number) - : First sequence number - - -
- -
- last (number) - : Last sequence number - - -
- -
- min (number) - : Minimum sequence number - - -
- -
- max (number) - : Maximum sequence number - - -
- -
- entries (number) - : Loci sequence entries - - -
- -
- - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Simple queue

- -
new SimpleQueue()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - clear() -
-
- -
- -
-
-
- β–Έ - enqueue(item) -
-
- -
- -
-
-
- β–Έ - dequeue() -
-
- -
- -
-
-
- β–Έ - size() -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Used to indicate that the reconnect logic needs to be retried.

- -
new NeedsRetryError()
- - -

- Extends - - Error - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Used to indicate that the meeting needs to be rejoined, not just media reconnected

- -
new NeedsRejoinError()
- - -

- Extends - - Error - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new ReconnectionManager()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - iceReconnected() -
-
- -
- -
-
-
- β–Έ - waitForIceReconnect() -
-
- -
- -
-
-
- β–Έ - reset() -
-
- -
- -
-
-
- β–Έ - cleanUp() -
-
- -
- -
-
-
- β–Έ - reconnect(reconnectOptions) -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - rejoinMeeting(wasSharing) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new MeetingRequest()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - joinMeeting(options) -
-
- -
- -
-
-
- β–Έ - syncMeeting(options) -
-
- -
- -
-
-
- β–Έ - getFullLocus(options) -
-
- -
- -
-
-
- β–Έ - leaveMeeting(options) -
-
- -
- -
-
-
- β–Έ - acknowledgeMeeting(options) -
-
- -
- -
-
-
- β–Έ - declineMeeting(options) -
-
- -
- -
-
-
- β–Έ - remoteAudioVideoToggle(options) -
-
- -
- -
-
-
- β–Έ - changeMeetingFloor(options) -
-
- -
- -
-
-
- β–Έ - sendDTMF(options) -
-
- -
- -
-
-
- β–Έ - changeVideoLayout(options) -
-
- -
- -
-
-
- β–Έ - endMeetingForAll(options) -
-
- -
- -
-
-
- β–Έ - keepAlive(options) -
-
- -
- -
-
-
- β–Έ - sendReaction(options) -
-
- -
- -
-
-
- β–Έ - getActiveMeetings() -
-
- -
- -
-
-
- β–Έ - fetchGeoHint() -
-
- -
- -
-
-
- β–Έ - getMeetingPreferences() -
-
- -
- -
-
-
- β–Έ - determineRedirections(responseBody) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new MeetingRequest()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - joinMeeting(options) -
-
- -
- -
-
-
- β–Έ - syncMeeting(options) -
-
- -
- -
-
-
- β–Έ - getFullLocus(options) -
-
- -
- -
-
-
- β–Έ - leaveMeeting(options) -
-
- -
- -
-
-
- β–Έ - acknowledgeMeeting(options) -
-
- -
- -
-
-
- β–Έ - declineMeeting(options) -
-
- -
- -
-
-
- β–Έ - remoteAudioVideoToggle(options) -
-
- -
- -
-
-
- β–Έ - changeMeetingFloor(options) -
-
- -
- -
-
-
- β–Έ - sendDTMF(options) -
-
- -
- -
-
-
- β–Έ - changeVideoLayout(options) -
-
- -
- -
-
-
- β–Έ - endMeetingForAll(options) -
-
- -
- -
-
-
- β–Έ - keepAlive(options) -
-
- -
- -
-
-
- β–Έ - sendReaction(options) -
-
- -
- -
-
-
- β–Έ - getActiveMeetings() -
-
- -
- -
-
-
- β–Έ - fetchGeoHint() -
-
- -
- -
-
-
- β–Έ - getMeetingPreferences() -
-
- -
- -
-
-
- β–Έ - determineRedirections(responseBody) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new Members()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - setLocusUrl(locus, locusUrl = null) -
-
- -
- -
-
-
- β–Έ - setHostId(locus, hostId = null) -
-
- -
- -
-
-
- β–Έ - setType(fullState, type = null) -
-
- -
- -
-
-
- β–Έ - setSelfId(locus, selfId = null) -
-
- -
- -
-
-
- β–Έ - setMediaShareContentId(locus, contentId?) -
-
- -
- -
-
-
- β–Έ - setMediaShareWhiteboardId(locus, whiteboardId?) -
-
- -
- -
-
-
- β–Έ - addMember(invitee, alertIfActive?) -
-
- -
- -
-
-
- β–Έ - cancelPhoneInvite(invitee) -
-
- -
- -
-
-
- β–Έ - admitMembers(memberIds) -
-
- -
- -
-
-
- β–Έ - removeMember(memberId) -
-
- -
- -
-
-
- β–Έ - muteMember(memberId, mute = true) -
-
- -
- -
-
-
- β–Έ - raiseOrLowerHand(memberId, raise = true) -
-
- -
- -
-
-
- β–Έ - lowerAllHands(requestingMemberId) -
-
- -
- -
-
-
- β–Έ - transferHostToMember(memberId, moderator = true) -
-
- -
- -
-
-
- β–Έ - sendDialPadKey(tones, memberId) -
-
- -
- -
- - - - - - - - -
Events
-
- -
-
-
- β–Έ - members:update -
-
- -
- -
-
-
- β–Έ - members:content:update -
-
- -
- -
-
-
- β–Έ - members:host:update -
-
- -
- -
-
-
- β–Έ - members:self:update -
-
- -
- -
- - -
- - - - -
- - - - - - -
new Member()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - setIsContentSharing(flag) -
-
- -
- -
-
-
- β–Έ - setIsHost(flag) -
-
- -
- -
-
-
- β–Έ - setIsSelf(flag) -
-
- -
- -
-
-
- β–Έ - processIsContentSharing(participant, sharingId) -
-
- -
- -
-
-
- β–Έ - processIsRecording(participant, recordingId) -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - id -
-
- -
- -
-
-
- β–Έ - name -
-
- -
- -
-
-
- β–Έ - isAudioMuted -
-
- -
- -
-
-
- β–Έ - isVideoMuted -
-
- -
- -
-
-
- β–Έ - isHandRaised -
-
- -
- -
-
-
- β–Έ - isSelf -
-
- -
- -
-
-
- β–Έ - isHost -
-
- -
- -
-
-
- β–Έ - isGuest -
-
- -
- -
-
-
- β–Έ - isInLobby -
-
- -
- -
-
-
- β–Έ - isInMeeting -
-
- -
- -
-
-
- β–Έ - isNotAdmitted -
-
- -
- -
-
-
- β–Έ - isContentSharing -
-
- -
- -
-
-
- β–Έ - status -
-
- -
- -
-
-
- β–Έ - isDevice -
-
- -
- -
-
-
- β–Έ - isUser -
-
- -
- -
-
-
- β–Έ - associatedUser -
-
- -
- -
-
-
- β–Έ - isRecording -
-
- -
- -
-
-
- β–Έ - isMutable -
-
- -
- -
-
-
- β–Έ - isRemovable -
-
- -
- -
-
-
- β–Έ - isModerator -
-
- -
- -
-
-
- β–Έ - isModeratorAssignmentProhibited -
-
- -
- -
-
-
- β–Έ - mediaStatus -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
isUser(participant: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isGuest(participant: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isDevice(participant: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

checks to see if the participant id is the same as the passed id -there are multiple ids that can be used

- -
isSame(participant: Object, id: String): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
-
- id (String) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

checks to see if the participant id is the same as the passed id for associated devices -there are multiple ids that can be used

- -
isAssociatedSame(participant: Object, id: String): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
-
- id (String) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isNotAdmitted(participant: Object, isGuest: Boolean, status: String): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
-
- isGuest (Boolean) - -
- -
- -
-
- status (String) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isAudioMuted(participant: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isVideoMuted(participant: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isHandRaised(participant: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

utility method for audio/video muted status

- -
isMuted(status: String, accessor: String): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- status (String) - -
- -
- -
-
- accessor (String) - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

utility method for getting the recording member for later comparison

- -
getRecordingMember(controls: Object): (String | null)
- - - - - - - - - - - -
Parameters
-
- -
-
- controls (Object) - -
- -
- -
- - - - - - -
Returns
- (String | null): - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
isRecording(participant: Object): Boolean
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- Boolean: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
extractStatus(participant: Object): String
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
extractId(participant: Object): String
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

extracts the media status from nested participant object

- -
extractMediaStatus(participant: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- Object: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
extractName(participant: Object): String
- - - - - - - - - - - -
Parameters
-
- -
-
- participant (Object) - the locus participant - -
- -
- -
- - - - - - -
Returns
- String: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new MembersCollection()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - getAll() -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - get(id) -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new MembersRequest()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - addMembers(options) -
-
- -
- -
-
-
- β–Έ - admitMember(options) -
-
- -
- -
-
-
- β–Έ - cancelPhoneInvite(options) -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - sendDialPadKey(options) -
-
- -
- -
- - - - - - -
- - - - -
- - -
- -

- generateAddMemberOptions -

- - - - packages/@webex/plugin-meetings/src/members/util.ts - - -
- - - -
generateAddMemberOptions(invitee: Object, locusUrl: String, alertIfActive: Boolean): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- invitee (Object) - with emailAddress, email or phoneNumber - -
- -
- -
-
- locusUrl (String) - -
- -
- -
-
- alertIfActive (Boolean) - -
- -
- -
- - - - - - -
Returns
- Object: - the format object - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- generateAdmitMemberOptions -

- - - - packages/@webex/plugin-meetings/src/members/util.ts - - -
- - - -
generateAdmitMemberOptions(memberIds: Array, locusUrl: String): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- memberIds (Array) - -
- -
- -
-
- locusUrl (String) - -
- -
- -
- - - - - - -
Returns
- Object: - the format object - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
getAddMemberBody(options: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- options (Object) - with {invitee: {emailAddress, email, phoneNumber}, alertIfActive} - -
- -
- -
- - - - - - -
Returns
- Object: - with {invitees: [{address}], alertIfActive} - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- getAdmitMemberRequestBody -

- - - - packages/@webex/plugin-meetings/src/members/util.ts - - -
- - - -
getAdmitMemberRequestBody(options: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- options (Object) - with {memberIds} - -
- -
- -
- - - - - - -
Returns
- Object: - admit with {memberIds} - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- getAdmitMemberRequestParams -

- - - - packages/@webex/plugin-meetings/src/members/util.ts - - -
- - - -
getAdmitMemberRequestParams(format: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- format (Object) - with {memberIds, locusUrl} - -
- -
- -
- - - - - - -
Returns
- Object: - the request parameters (method, uri, body) needed to make a admitMember request - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- getAddMemberRequestParams -

- - - - packages/@webex/plugin-meetings/src/members/util.ts - - -
- - - -
getAddMemberRequestParams(format: Object): Object
- - - - - - - - - - - -
Parameters
-
- -
-
- format (Object) - with {invitee {emailAddress, email, phoneNumber}, locusUrl, alertIfActive} - -
- -
- -
- - - - - - -
Returns
- Object: - the request parameters (method, uri, body) needed to make a addMember request - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Meeting Webex assistance transcription feature.

- -
new Transcription()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - connect(token, sessionID) -
-
- -
- -
-
-
- β–Έ - onCloseSocket(callback) -
-
- -
- -
-
-
- β–Έ - onErrorSocket(callback) -
-
- -
- -
-
-
- β–Έ - subscribe(callback) -
-
- -
- -
-
-
- β–Έ - closeSocket() -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
new ReconnectInProgress()
- - -

- Extends - - Error - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
createState(roapRef: Roap): StateMachine
- - - - - - - - - - - -
Parameters
-
- -
-
- roapRef (Roap) - initializes the state machine - -
- -
- -
- - - - - - -
Returns
- StateMachine: - an instance of a state machine - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Method to handle the transitions between states

- -
to(signal: String, meeting: Meeting, roap: Object): String
- - - - - - - - - - - -
Parameters
-
- -
-
- signal (String) - -
- -
- -
-
- meeting (Meeting) - instance of a Meeting - -
- -
- -
-
- roap (Object) - -
- -
- -
- - - - - - -
Returns
- String: - new state value - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Event that fires after we've transitioned to a new state

- -
onAfterStep(transition: Object): null
- - - - - - - - - - - -
Parameters
-
- -
-
- transition (Object) - -
- -
- -
- - - - - - -
Returns
- null: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

IInMeetingActions -Type for In-Meeting Actions

- -
IInMeetingActions
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new InMeetingActions()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - get -
-
- -
- -
-
-
- β–Έ - set -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
set(options: Object): void
- - - - - - - - - - - -
Parameters
-
- -
-
- options (Object) - -
- -
- -
- - - - - - -
Returns
- void: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
setLocusUrl(url: string): void
- - - - - - - - - - - -
Parameters
-
- -
-
- url (string) - -
- -
- -
- - - - - - -
Returns
- void: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
setDisplayHints(hints: Array): void
- - - - - - - - - - - -
Parameters
-
- -
-
- hints (Array) - -
- -
- -
- - - - - - -
Returns
- void: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
setSessionId(id: string): void
- - - - - - - - - - - -
Parameters
-
- -
-
- id (string) - -
- -
- -
- - - - - - -
Returns
- void: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
setServiceUrl(url: string): void
- - - - - - - - - - - -
Parameters
-
- -
-
- url (string) - -
- -
- -
- - - - - - -
Returns
- void: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
getLocusUrl(): string
- - - - - - - - - - - - - - - - -
Returns
- string: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
getLocusId(): string
- - - - - - - - - - - - - - - - -
Returns
- string: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
getSessionId(): string
- - - - - - - - - - - - - - - - -
Returns
- string: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
getServiceUrl(): string
- - - - - - - - - - - - - - - - -
Returns
- string: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
getDisplayHints(): Array
- - - - - - - - - - - - - - - - -
Returns
- Array: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
startRecording(): Promise
- - - - - - - - - - - - - - - - -
Returns
- Promise: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
stopRecording(): Promise
- - - - - - - - - - - - - - - - -
Returns
- Promise: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
pauseRecording(): Promise
- - - - - - - - - - - - - - - - -
Returns
- Promise: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
resumeRecording(): Promise
- - - - - - - - - - - - - - - - -
Returns
- Promise: - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

docs -https://sqbu-github.cisco.com/pages/WebExSquared/locus/guides/mute.html -https://confluence-eng-gpk2.cisco.com/conf/display/LOCUS/Hard+Mute+and+Audio+Privacy#HardMuteandAudioPrivacy-SelfMuteonEntry -https://confluence-eng-gpk2.cisco.com/conf/pages/viewpage.action?spaceKey=UC&title=WEBEX-124454%3A+UCF%3A+Hard+mute+support+for+Teams+joining+Webex+meeting -https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-180867 -https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-393351

- -
new ControlsOptionsManager(request: MeetingRequest, options: {locusUrl: string, displayHints: Array<string>?}?)
- - - - - - - - - - - -
Parameters
-
- -
-
- request (MeetingRequest) - -
- -
- -
-
- options ({locusUrl: string, displayHints: Array<string>?}?) - -
- -
- -
- - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - set(options) -
-
- -
- -
-
-
- β–Έ - setLocusUrl(url) -
-
- -
- -
-
-
- β–Έ - setDisplayHints(hints) -
-
- -
- -
-
-
- β–Έ - getLocusUrl() -
-
- -
- -
-
-
- β–Έ - getDisplayHints() -
-
- -
- -
-
-
- β–Έ - setMuteOnEntry(enabled) -
-
- -
- -
-
-
- β–Έ - setDisallowUnmute(enabled) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
new PersonalMeetingRoom()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - claim(link, pin, preferred = true) -
-
- -
- -
-
-
- β–Έ - get(options) -
-
- -
- -
- - - - -
Instance Members
-
- -
-
-
- β–Έ - pmr -
-
- -
- -
-
-
- β–Έ - sipUri -
-
- -
- - - -
-
-
- β–Έ - userId -
-
- -
- -
-
-
- β–Έ - name -
-
- -
- -
- - - - - - -
- - - - -
- - - - - - -
claimPmr(options: Object): Promise
- - - - - - - - - - - -
Parameters
-
- -
-
- options (Object) - with format of {userId, passcode, meetingAddress, preferred} - -
- -
- -
- - - - - - -
Returns
- Promise: - returns a promise that resolves/rejects the result of the request - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new Reachability()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - gatherReachability() -
-
- -
- -
-
-
- β–Έ - isAnyClusterReachable() -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
new ReachabilityRequest()
- - - - - - - - - - - - - - - - - - - - - - - - - -
Instance Members
-
- -
-
-
- β–Έ - getClusters -
-
- -
- -
-
-
- β–Έ - remoteSDPForClusters -
-
- -
- -
- - - - - - -
- - - - -
- - - - - -

Extended Error object to signify password related errors

- -
new PasswordError(message: String?, error: Object?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- message (String? - = ERROR_DICTIONARY.PASSWORD.MESSAGE) - -
- -
- -
-
- error (Object? - = null) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Extended Error object to signify captcha related errors

- -
new CaptchaError(message: String?, error: Object?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- message (String? - = ERROR_DICTIONARY.CAPTCHA.MESSAGE) - -
- -
- -
-
- error (Object? - = null) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
new MeetingCollection()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - getByKey(key, value) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - - -
new Collection()
- - - - - - - - - - - - - - - - - - - - - - - -
Static Members
-
- -
-
-
- β–Έ - get(id) -
-
- -
- -
-
-
- β–Έ - set(id, value) -
-
- -
- -
-
-
- β–Έ - delete(id) -
-
- -
- -
-
-
- β–Έ - getAll() -
-
- -
- -
-
-
- β–Έ - setAll(set) -
-
- -
- -
- - - - - - - - -
- - - - -
- - - - - -

Meetings Media Codec Missing Event -Emitted when H.264 codec is not -found in the browser.

- -
media:codec:missing
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Meetings Media Codec Loaded Event -Emitted when H.264 codec has been -loaded in the browser.

- -
media:codec:loaded
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

@description Layout type for remote video participants. Allowed values are: Single, Equal, ActivePresence, Prominent, OnePlusN

- -
LAYOUT_TYPES
- -

- Type: - array -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- REMOTE_VIDEO_CONSTRAINTS -

- - - - packages/@webex/plugin-meetings/src/constants.ts - - -
- - -

Max frame sizes based on h264 configs -https://en.wikipedia.org/wiki/Advanced_Video_Coding

- -
REMOTE_VIDEO_CONSTRAINTS
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - -

Extended Error object for general parameter errors

- -
new ParameterError(message: String?, error: Object?)
- - -

- Extends - - Error - -

- - - - - - - - - - -
Parameters
-
- -
-
- message (String? - = MEETINGCONSTANTS.ERROR_DICTIONARY.PARAMETER.MESSAGE) - -
- -
- -
-
- error (Object? - = null) - -
- -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- buildRoomInfo -

- - - - packages/@webex/plugin-rooms/src/rooms.js - - -
- - -

Helper method to build a roomInfo object from a conversation object

- -
buildRoomInfo(webex: Object, conversation: Conversation~ConversationObject): Promise<RoomInfoObject>
- - - - - - - - - - - -
Parameters
-
- -
-
- webex (Object) - sdk object - -
- -
- -
-
- conversation (Conversation~ConversationObject) - -
- -
- -
- - - - - - -
Returns
- Promise<RoomInfoObject>: - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -

- buildRoomInfoList -

- - - - packages/@webex/plugin-rooms/src/rooms.js - - -
- - -

Helper method to build a list of roomInfo object from conversation list

- -
buildRoomInfoList(webex: Object, conversations: Conversation~ConversationObjectList): Promise<RoomInfoList>
- - - - - - - - - - - -
Parameters
-
- -
-
- webex (Object) - sdk object - -
- -
- -
-
- conversations (Conversation~ConversationObjectList) - -
- -
- -
- - - - - - -
Returns
- Promise<RoomInfoList>: - - - - - - - - - - - - - - - - - - -
- - - -
-
- - - - - diff --git a/docs/samples/calling/app.js b/docs/samples/calling/app.js index 3900d1fbfb3..4990cb2be0a 100644 --- a/docs/samples/calling/app.js +++ b/docs/samples/calling/app.js @@ -90,7 +90,7 @@ const bnrButton = document.getElementById('bnr_button'); let base64; let audio64; let call; -let callTranferObj; +let callTransferObj; let broadworksCorrelationInfo; let localAudioStream; let effect; @@ -125,6 +125,11 @@ function getMediaSettings() { return settings; } +function updateCallControlButtons(callObject){ + holdResumeElm.value = callObject.held ? 'Resume':'Hold' + muteElm.value = callObject.muted ? 'Unmute':'Mute' +} + function getAudioVideoInput() { const deviceId = (id) => devicesById[id]; const audioInput = getOptionValue(audioInputDevicesElem) || 'default'; @@ -248,11 +253,9 @@ async function initCalling(e) { calling.on('ready', () => { console.log('Authentication :: Calling Ready'); - registerElm.disabled = false; callHistoryElm.disabled = false; voicemailElm.disabled = false; authStatusElm.innerText = 'Saved access token!'; - registerElm.classList.add('btn--green'); callHistoryElm.classList.add('btn--green'); voicemailElm.classList.add('btn--green'); dndButton.classList.add('btn--red'); @@ -264,6 +267,7 @@ async function initCalling(e) { calling.register().then(async () => { unregisterElm.classList.add('btn--red'); + registerElm.classList.add('btn--green'); registerElm.disabled = false; callingClient = window.callingClient = calling.callingClient; @@ -282,16 +286,9 @@ async function initCalling(e) { if (window.voicemail === undefined) { voicemail = window.voicemail = calling.voicemailClient; - const initResponse = await voicemail.init(); - - console.log(`Init response `, initResponse); } fetchLines(); - fetchDNDSetting(); - fetchCallForwardSetting(); - fetchVoicemailSetting(); - fetchCallWaitingSetting(); }); }); @@ -300,6 +297,13 @@ async function initCalling(e) { credentialsFormElm.addEventListener('submit', initCalling); +function getSettings() { + fetchCallForwardSetting(); + fetchVoicemailSetting(); + fetchCallWaitingSetting(); + fetchDNDSetting(); +} + function toggleDisplay(elementId, status) { const element = document.getElementById(elementId); @@ -343,7 +347,7 @@ function createDevice() { calling.webex.internal.device.url !== '' ? `Registered, deviceId: ${deviceInfo.mobiusDeviceId}` : 'Not Registered'; - // unregisterElm.disabled = false; + unregisterElm.disabled = false; }); // Start listening for incoming calls @@ -365,6 +369,7 @@ function createDevice() { makeCallBtn.disabled = false; endElm.disabled = true; muteElm.value = 'Mute'; + holdResumeElm.value = 'Hold'; answerElm.disabled = true; }); @@ -389,42 +394,68 @@ function endCall() { makeCallBtn.disabled = false; endElm.disabled = true; muteElm.value = 'Mute'; + holdResumeElm.value = 'Hold' imageElm.removeChild(img); } function endSecondCall() { - callTranferObj.end(); - transferDetailsElm.innerText = `${callTranferObj.getCorrelationId()}: Call Disconnected`; + callTransferObj.end(); + transferDetailsElm.innerText = `${callTransferObj.getCorrelationId()}: Call Disconnected`; + callTransferObj = null endSecondElm.disabled = true; - muteElm.value = 'Mute'; + transferElm.innerHTML = 'Transfer'; + updateCallControlButtons(call) + if (call.muted){ + localAudioStream.outputStream.getAudioTracks()[0].enabled = false + } imageElm.removeChild(img); } function muteUnmute() { muteElm.value = muteElm.value === 'Mute' ? 'Unmute' : 'Mute'; - - call.mute(localAudioStream); + if (callTransferObj){ + callTransferObj.mute(localAudioStream) + } + else { + call.mute(localAudioStream); + } } function holdResume() { - const elem = document.getElementById('hold_button'); - - call.on('held', (correlationId) => { - if (elem.value === 'Hold') { - callDetailsElm.innerText = 'Call is held'; - elem.value = 'Resume'; - } - }); - - call.on('resumed', (correlationId) => { - if (elem.value === 'Resume') { - callDetailsElm.innerText = 'Call is Resumed'; - elem.value = 'Hold'; - } - }); - - call.doHoldResume(); + if (callTransferObj){ + callTransferObj.on('held', (correlationId) => { + if (holdResumeElm.value === 'Hold') { + callDetailsElm.innerText = 'Call is held'; + holdResumeElm.value = 'Resume'; + } + }); + + callTransferObj.on('resumed', (correlationId) => { + if (holdResumeElm.value === 'Resume') { + callDetailsElm.innerText = 'Call is Resumed'; + holdResumeElm.value = 'Hold'; + } + }); + callTransferObj.doHoldResume() + } + else{ + call.on('held', (correlationId) => { + if (holdResumeElm.value === 'Hold') { + callDetailsElm.innerText = 'Call is held'; + holdResumeElm.value = 'Resume'; + } + }); + + call.on('resumed', (correlationId) => { + if (holdResumeElm.value === 'Resume') { + callDetailsElm.innerText = 'Call is Resumed'; + holdResumeElm.value = 'Hold'; + } + }); + call.doHoldResume(); + } } + function deleteDevice() { line.deregister(); line.on('unregistered', () => { @@ -432,7 +463,7 @@ function deleteDevice() { registrationStatusElm.innerText = 'Unregistered'; }) registerElm.disabled = false; - // unregisterElm.disabled = true; + unregisterElm.disabled = true; } function populateSourceDevices(mediaDevice) { @@ -458,6 +489,28 @@ function populateSourceDevices(mediaDevice) { select && select.appendChild(option); } +async function changeInputStream() { + const selectedDevice = audioInputDevicesElem.options[audioInputDevicesElem.selectedIndex].value; + + const constraints = { + audio: true, + deviceId: selectedDevice ? { exact: selectedDevice } : undefined + }; + const newStream = await Calling.createMicrophoneStream(constraints); + + call.updateMedia(newStream); +} + +async function changeOutputStream() { + const selectedDevice = audioOutputDevicesElem.options[audioOutputDevicesElem.selectedIndex].value; + mediaStreamsRemoteAudio.setSinkId(selectedDevice); +} + +async function changeStream() { + changeInputStream(); + changeOutputStream(); +} + /** * */ @@ -552,37 +605,40 @@ async function getCallQuality() { } function commitTransfer() { + const digit = transferTarget.value; transferElm.disabled = true; if (transferOptionsElm.options[transferOptionsElm.selectedIndex].text === 'Consult Transfer') { - callTranferObj = line.makeCall({ + call.doHoldResume(); + transferDetailsElm.innerText = `Placed call: ${call.getCorrelationId()} on hold and dialing Transfer target`; + + callTransferObj = line.makeCall({ type: 'uri', address: digit, }); - - callTranferObj.on('remote_media', (track) => { + updateCallControlButtons(callTransferObj) + callTransferObj.on('remote_media', (track) => { document.getElementById('remote-audio').srcObject = new MediaStream([track]); transferDetailsElm.innerText = `Got remote audio`; }); - callTranferObj.on('established', (correlationId) => { + callTransferObj.on('established', (correlationId) => { transferDetailsElm.innerText = `${correlationId}: Transfer target connected`; endSecondElm.disabled = false; transferElm.innerHTML = 'Commit'; transferElm.disabled = false; }); - callTranferObj.on('disconnect', (correlationId) => { + callTransferObj.on('disconnect', (correlationId) => { endSecondElm.disabled = true; - callTranferObj = null; + callTransferObj = null; }); - callTranferObj.dial(localAudioStream); + callTransferObj.dial(localAudioStream); - transferDetailsElm.innerText = `Dialing Transfer target`; } else { console.log(`Initiating blind transfer with ${digit}`); call.completeTransfer('BLIND', undefined, digit); @@ -594,17 +650,12 @@ function initiateTransfer() { transferInitiated = true; if (!call.isHeld()) { - call.doHoldResume(); - - call.on('held', (correlationId) => { - transferDetailsElm.innerText = `Placed call: ${call.getCorrelationId()} on hold`; commitTransfer(); - }); } else { transferDetailsElm.innerText = `Transferring call..`; - if (callTranferObj) { + if (callTransferObj) { console.log(`Completing consult transfer with ${digit}`); - call.completeTransfer('CONSULT', callTranferObj.getCallId(), undefined); + call.completeTransfer('CONSULT', callTransferObj.getCallId(), undefined); } } } @@ -776,6 +827,8 @@ function definedTable(callHistoryResponse) { EndTime SessionType CallbackAddress + RedirectionReason + Forwarded by `; callHistoryHeader.innerHTML += callHistHeaderHtml; @@ -790,6 +843,8 @@ function definedTable(callHistoryResponse) { ${callHistoryResponse.data.userSessions[i].endTime} ${callHistoryResponse.data.userSessions[i].sessionType} ${callHistoryResponse.data.userSessions[i].other.callbackAddress} + ${callHistoryResponse.data.userSessions[i].callingSpecifics?.redirectionDetails?.reason === undefined ? 'NA' : callHistoryResponse.data.userSessions[i].callingSpecifics.redirectionDetails.reason} + ${callHistoryResponse.data.userSessions[i].callingSpecifics?.redirectionDetails?.name === undefined ? 'NA' : callHistoryResponse.data.userSessions[i].callingSpecifics.redirectionDetails.name} `; callHistoryTable.innerHTML += callHistoryRow; @@ -833,6 +888,7 @@ async function createCallHistory() { * Function to use Voice Mail API's. */ async function createVoiceMail() { + await voicemail.init(); const backendConnector = calling.webex.internal.device.callingBehavior; if (backendConnector === 'NATIVE_SIP_CALL_TO_UCM') { diff --git a/docs/samples/calling/index.html b/docs/samples/calling/index.html index 0a5d2f9796c..0ad26f7d6ad 100644 --- a/docs/samples/calling/index.html +++ b/docs/samples/calling/index.html @@ -72,8 +72,8 @@

Authentication

- - + +
Not Registered
@@ -203,9 +203,8 @@

Call Transfer

NOTE: Choose your sending and receiving options for the meeting.

- - + +