diff --git a/CHANGELOG.md b/CHANGELOG.md
index a33a9e888..fc225a43b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+## v4.9.0 - 2020 - 05 - 11
+## Added
+- [main] Exposed `id` field on response object returned from `/v3/conversations` endpoint in PR [2129](https://github.com/microsoft/BotFramework-Emulator/pull/2129)
+
+- [client] - Bumped `botframework-webchat` to v4.9.0 in PR [2142](https://github.com/microsoft/BotFramework-Emulator/pull/2142)
+
+## Fixed
+- [build] Fixed system dialog on Mac OS warning about being unable to check for malicious code in PR [2135](https://github.com/microsoft/BotFramework-Emulator/pull/2135)
+- [client / main] Fixed an issue where starting a conversation via deeplink was initializing the WebSocket server twice and closing previously established connections in PR [2146](https://github.com/microsoft/BotFramework-Emulator/pull/2146)
+
## v4.8.1 - 2019 - 03 - 18
## Fixed
- [build] Replaced a missing .icns file that was deleted by mistake in a previous PR. Fixes the app icon on Linux & Mac in PR [2104](https://github.com/microsoft/BotFramework-Emulator/pull/2104)
diff --git a/package-lock.json b/package-lock.json
index b26941686..5299dedfa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5964,55 +5964,29 @@
}
},
"botframework-directlinespeech-sdk": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/botframework-directlinespeech-sdk/-/botframework-directlinespeech-sdk-4.8.0.tgz",
- "integrity": "sha512-vPdP86+D7TO7CdmnGmgwueHDzl8IWGQuH3BAeZ60NyjcI8++tni0v8yCd3HKXmOK8TSLPsvfQL6rePjFpVu96w==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/botframework-directlinespeech-sdk/-/botframework-directlinespeech-sdk-4.9.0.tgz",
+ "integrity": "sha512-w3QfjoPvyQwq46gLdRtoOKz+AXywj3ryJxjVAHwctU41vV31oJnq27tIBpMUR4lZnuZpyb8zqUm/YSgKImtq9A==",
"requires": {
- "@babel/runtime": "^7.8.4",
+ "@babel/runtime": "^7.8.7",
"abort-controller": "^3.0.0",
"abort-controller-es5": "1.0.1",
"base64-arraybuffer": "^0.2.0",
- "core-js": "^3.5.0",
+ "core-js": "^3.6.4",
"event-as-promise": "^1.0.5",
"event-target-shim": "^5.0.1",
"event-target-shim-es5": "1.0.1",
"math-random": "^1.0.4",
- "microsoft-cognitiveservices-speech-sdk": "1.8.1",
+ "microsoft-cognitiveservices-speech-sdk": "1.10.1",
"p-defer": "^3.0.0",
"p-defer-es5": "1.0.1",
- "web-speech-cognitive-services": "^6.0.0"
+ "web-speech-cognitive-services": "7.0.0-master.da7babf"
},
"dependencies": {
"core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
- },
- "https-proxy-agent": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz",
- "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==",
- "requires": {
- "agent-base": "^4.3.0",
- "debug": "^3.1.0"
- }
- },
- "microsoft-cognitiveservices-speech-sdk": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/microsoft-cognitiveservices-speech-sdk/-/microsoft-cognitiveservices-speech-sdk-1.8.1.tgz",
- "integrity": "sha512-sXP43LjW+twcz5SZs8i6vg9r2QK6XidArVAQybb4bmNMv+t/U8Dj1CKoy/l83Db0JLdDiU3zXYs+znILAqnn9g==",
- "requires": {
- "asn1.js-rfc2560": "^5.0.0",
- "asn1.js-rfc5280": "^3.0.0",
- "https-proxy-agent": "^3.0.0",
- "simple-lru-cache": "0.0.2",
- "ws": "^7.1.1"
- }
- },
- "ws": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz",
- "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ=="
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
+ "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
}
}
},
@@ -6022,27 +5996,28 @@
"integrity": "sha512-rSTywVl5dYzL4FNoK86s9kFPNkRx5iYJi7MAWEaSrhUiDV3KEHX/5VEHLa00d4nzQxC/jI9BqfbqdffpO97KIA=="
},
"botframework-webchat": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/botframework-webchat/-/botframework-webchat-4.8.0.tgz",
- "integrity": "sha512-6uire/MFNzrtq529HF6GR9O2ePZUmVq/8XnAWVLbGdkD7bA4cz9wZZgmr5lBx6Hg4AA0qntPnJQg5l6IrESpPQ==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/botframework-webchat/-/botframework-webchat-4.9.0.tgz",
+ "integrity": "sha512-nYbtZubUm28H4OBXA63pgz3Oq7FTeh4QLhAPXEl244WNEFCwJNRw3V6W4xoBqMBKQH6hfowO4dhR/8hkYeN8QQ==",
"requires": {
- "@babel/runtime": "^7.8.4",
+ "@babel/runtime": "7.8.7",
"adaptivecards": "1.2.5",
"botframework-directlinejs": "^0.11.6",
- "botframework-directlinespeech-sdk": "4.8.0",
- "botframework-webchat-component": "4.8.0",
- "botframework-webchat-core": "4.8.0",
- "core-js": "^3.5.0",
- "markdown-it": "^10.0.0",
- "markdown-it-for-inline": "^0.1.1",
- "memoize-one": "^5.1.1",
- "microsoft-cognitiveservices-speech-sdk": "1.6.0",
- "microsoft-speech-browser-sdk": "^0.0.12",
- "prop-types": "^15.7.2",
- "sanitize-html": "^1.20.0",
- "url-search-params-polyfill": "^7.0.0",
- "web-speech-cognitive-services": "^6.0.0",
- "whatwg-fetch": "^3.0.0"
+ "botframework-directlinespeech-sdk": "4.9.0",
+ "botframework-webchat-component": "4.9.0",
+ "botframework-webchat-core": "4.9.0",
+ "core-js": "3.6.4",
+ "markdown-it": "10.0.0",
+ "markdown-it-attrs": "3.0.2",
+ "markdown-it-attrs-es5": "1.0.0",
+ "markdown-it-for-inline": "0.1.1",
+ "memoize-one": "5.1.1",
+ "microsoft-cognitiveservices-speech-sdk": "1.10.1",
+ "prop-types": "15.7.2",
+ "sanitize-html": "1.20.0",
+ "url-search-params-polyfill": "8.0.0",
+ "web-speech-cognitive-services": "7.0.0-master.da7babf",
+ "whatwg-fetch": "3.0.0"
},
"dependencies": {
"core-js": {
@@ -6065,29 +6040,29 @@
}
},
"botframework-webchat-component": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/botframework-webchat-component/-/botframework-webchat-component-4.8.0.tgz",
- "integrity": "sha512-wV/rlsRDpf+s18QNt0GryPkpT6VAJdWeIjRWzD5jT5vk1uvGUiY0GQs8sBmlXoZXk47CAklTgU6+dc5h+J7drg==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/botframework-webchat-component/-/botframework-webchat-component-4.9.0.tgz",
+ "integrity": "sha512-H8zBeADVVhkfY/wSrEJlYD5jr3aJHLDDtAt3h4J7MAvdm1dlVc8NF9n1J+R34sBEIxyCUJ2+QeKe9oO+4Jdcdw==",
"requires": {
- "botframework-webchat-core": "4.8.0",
- "classnames": "^2.2.6",
- "event-target-shim": "^5.0.1",
+ "botframework-webchat-core": "4.9.0",
+ "classnames": "2.2.6",
+ "event-target-shim": "5.0.1",
"event-target-shim-es5": "1.0.1",
- "glamor": "^2.20.40",
- "globalize": "^1.4.2",
- "markdown-it": "^10.0.0",
- "math-random": "^1.0.4",
- "memoize-one": "^5.1.1",
- "prop-types": "^15.7.2",
- "react-dictate-button": "^1.2.2",
- "react-film": "^2.0.2",
- "react-redux": "^7.1.1",
- "react-say": "^2.0.0",
- "react-scroll-to-bottom": "~1.3.2",
- "redux": "^4.0.4",
+ "glamor": "2.20.40",
+ "globalize": "1.4.2",
+ "markdown-it": "10.0.0",
+ "math-random": "1.0.4",
+ "memoize-one": "5.1.1",
+ "prop-types": "15.7.2",
+ "react-dictate-button": "1.2.2",
+ "react-film": "2.0.2",
+ "react-redux": "7.2.0",
+ "react-say": "2.0.1-master.c5d6304",
+ "react-scroll-to-bottom": "1.3.2",
+ "redux": "4.0.5",
"remark": "10.0.1",
- "sanitize-html": "^1.20.1",
- "simple-update-in": "^2.1.1",
+ "sanitize-html": "1.20.1",
+ "simple-update-in": "2.1.1",
"strip-markdown": "3.0.4"
},
"dependencies": {
@@ -6124,6 +6099,23 @@
"symbol-observable": "^1.2.0"
}
},
+ "sanitize-html": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.20.1.tgz",
+ "integrity": "sha512-txnH8TQjaQvg2Q0HY06G6CDJLVYCpbnxrdO0WN8gjCKaU5J0KbyGYhZxx5QJg3WLZ1lB7XU9kDkfrCXUozqptA==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "htmlparser2": "^3.10.0",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.mergewith": "^4.6.1",
+ "postcss": "^7.0.5",
+ "srcset": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
"symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
@@ -6132,34 +6124,36 @@
}
},
"botframework-webchat-core": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/botframework-webchat-core/-/botframework-webchat-core-4.8.0.tgz",
- "integrity": "sha512-UpR5/pl9iSQJDH9BFmDkqWYYw5vabO2AJeT/UtVndZyi+PZMRv/VAnt3+QF5NdB4vtfGSuumRbO7Wt41VWnkAA==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/botframework-webchat-core/-/botframework-webchat-core-4.9.0.tgz",
+ "integrity": "sha512-4E7OYfsFrzFCuRS8v5d+rZ3Aned9dZqLxA5mX2WJaQ1CrJ/SfnGguF1knYbhowsIuuyuSwiKd+zs8Jj5dmD8xw==",
"requires": {
- "@babel/runtime": "^7.8.4",
- "jsonwebtoken": "^8.5.1",
- "math-random": "^1.0.4",
+ "@babel/runtime": "7.8.7",
+ "jsonwebtoken": "8.5.1",
+ "math-random": "1.0.4",
"mime": "2.4.4",
- "redux": "^4.0.4",
- "redux-saga": "1.1.1",
- "simple-update-in": "^2.1.1"
+ "p-defer": "3.0.0",
+ "p-defer-es5": "1.0.1",
+ "redux": "4.0.4",
+ "redux-saga": "1.1.3",
+ "simple-update-in": "2.1.1"
},
"dependencies": {
"redux": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz",
- "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz",
+ "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==",
"requires": {
"loose-envify": "^1.4.0",
"symbol-observable": "^1.2.0"
}
},
"redux-saga": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.1.1.tgz",
- "integrity": "sha512-guSnGJ/uEF8yL8Mn4aNa7HxRGCpVUALCkec9iTTD0fOhQqkF6bRQkBLeS+7/cAH3nFnr299bi/DOurTi1apcCA==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.1.3.tgz",
+ "integrity": "sha512-RkSn/z0mwaSa5/xH/hQLo8gNf4tlvT18qXDNvedihLcfzh+jMchDgaariQoehCpgRltEm4zHKJyINEz6aqswTw==",
"requires": {
- "@redux-saga/core": "^1.1.1"
+ "@redux-saga/core": "^1.1.3"
}
},
"symbol-observable": {
@@ -8920,21 +8914,34 @@
}
},
"domhandler": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz",
- "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
"requires": {
- "domelementtype": "^2.0.1"
+ "domelementtype": "1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ }
}
},
"domutils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.0.0.tgz",
- "integrity": "sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
"requires": {
- "dom-serializer": "^0.2.1",
- "domelementtype": "^2.0.1",
- "domhandler": "^3.0.0"
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ }
}
},
"dot-prop": {
@@ -12487,14 +12494,38 @@
"integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig=="
},
"htmlparser2": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
- "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==",
- "requires": {
- "domelementtype": "^2.0.1",
- "domhandler": "^3.0.0",
- "domutils": "^2.0.0",
- "entities": "^2.0.0"
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "requires": {
+ "domelementtype": "^1.3.1",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^3.1.1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ },
+ "entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
}
},
"http-cache-semantics": {
@@ -15678,6 +15709,23 @@
}
}
},
+ "markdown-it-attrs": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-3.0.2.tgz",
+ "integrity": "sha512-q45vdXU9TSWaHgFkWEFM97YHEoCmOyG9csLLdv3oVC6ARjT77u4wfng9rRtSOMb5UpxzT7zTX5GBbwm15H40dw=="
+ },
+ "markdown-it-attrs-es5": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-it-attrs-es5/-/markdown-it-attrs-es5-1.0.0.tgz",
+ "integrity": "sha512-bI1fNQIX/6/a2yw4OYWNkx7R2Zlt8n3IxnbaJhfcDAUimhnJ2eAG9GENqGaePewU8pAWz/hx9AM630WlCY0z5g==",
+ "requires": {
+ "@babel/core": "^7",
+ "@babel/preset-env": "^7",
+ "babel-loader": "^8",
+ "webpack": "^4",
+ "webpack-cli": "^3"
+ }
+ },
"markdown-it-for-inline": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/markdown-it-for-inline/-/markdown-it-for-inline-0.1.1.tgz",
@@ -15877,32 +15925,33 @@
}
},
"microsoft-cognitiveservices-speech-sdk": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/microsoft-cognitiveservices-speech-sdk/-/microsoft-cognitiveservices-speech-sdk-1.6.0.tgz",
- "integrity": "sha512-B1z9cOQSfQxHgjnbkx4NBj5YOHz0ymUBnXYec+thgwRsfJntKfWGJEdarvEjiHr0+UkC+ejuCaFshnHgtwgphQ==",
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/microsoft-cognitiveservices-speech-sdk/-/microsoft-cognitiveservices-speech-sdk-1.10.1.tgz",
+ "integrity": "sha512-uqtNe5p1Un6hXUse9pDGvk7p6QZ96t7YzWaTmmDeaL1eIbrXAPBK4ecTE7OR0JCfLlRcJFfnRJtNO+itdLD3ZQ==",
"requires": {
- "asn1.js-rfc2560": "^5.0.0",
+ "asn1.js-rfc2560": "^5.0.1",
"asn1.js-rfc5280": "^3.0.0",
- "https-proxy-agent": "^2.2.1",
+ "https-proxy-agent": "^3.0.1",
"simple-lru-cache": "0.0.2",
- "ws": "^6.1.2"
+ "ws": "^7.2.1"
},
"dependencies": {
- "ws": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
- "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+ "https-proxy-agent": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz",
+ "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==",
"requires": {
- "async-limiter": "~1.0.0"
+ "agent-base": "^4.3.0",
+ "debug": "^3.1.0"
}
+ },
+ "ws": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
+ "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w=="
}
}
},
- "microsoft-speech-browser-sdk": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/microsoft-speech-browser-sdk/-/microsoft-speech-browser-sdk-0.0.12.tgz",
- "integrity": "sha512-JYIR/WpaCyV1wk+4ff3kSJMqJFehbeApzG9CJxR+mN3z+4hFKGB/D5GaFsdN5WtRvnrekzUYSOv2nljMQb3Nwg=="
- },
"miller-rabin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
@@ -17729,9 +17778,9 @@
"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
},
"postcss": {
- "version": "7.0.27",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
- "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
+ "version": "7.0.30",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.30.tgz",
+ "integrity": "sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ==",
"requires": {
"chalk": "^2.4.2",
"source-map": "^0.6.1",
@@ -19247,9 +19296,9 @@
}
},
"react-say": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/react-say/-/react-say-2.0.0.tgz",
- "integrity": "sha512-jHtvt5Q+v5W1iqnQROEF3DL20zZYqz319ZkcVgQyyLyx/1GZ4Nr3gXaGvf0JHBpp+/UcETdtFTgOEzpDCaOL6Q==",
+ "version": "2.0.1-master.c5d6304",
+ "resolved": "https://registry.npmjs.org/react-say/-/react-say-2.0.1-master.c5d6304.tgz",
+ "integrity": "sha512-AbSVouNLXOjh/pKM6OWYR+/DjBp/5uuOmXfz50FmP/T7Kd2E7hC0GY/ZKWuwn85bgDNGsTb8X2XJYuFEI8MhyA==",
"requires": {
"@babel/runtime": "^7.7.2",
"classnames": "^2.2.6",
@@ -20241,19 +20290,19 @@
}
},
"sanitize-html": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.22.1.tgz",
- "integrity": "sha512-++IMC00KfMQc45UWZJlhWOlS9eMrME38sFG9GXfR+k6oBo9JXSYQgTOZCl9j3v/smFTRNT9XNwz5DseFdMY+2Q==",
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.20.0.tgz",
+ "integrity": "sha512-BpxXkBoAG+uKCHjoXFmox6kCSYpnulABoGcZ/R3QyY9ndXbIM5S94eOr1IqnzTG8TnbmXaxWoDDzKC5eJv7fEQ==",
"requires": {
"chalk": "^2.4.1",
- "htmlparser2": "^4.1.0",
+ "htmlparser2": "^3.10.0",
"lodash.clonedeep": "^4.5.0",
"lodash.escaperegexp": "^4.1.2",
"lodash.isplainobject": "^4.0.6",
"lodash.isstring": "^4.0.1",
- "lodash.mergewith": "^4.6.2",
- "postcss": "^7.0.27",
- "srcset": "^2.0.1",
+ "lodash.mergewith": "^4.6.1",
+ "postcss": "^7.0.5",
+ "srcset": "^1.0.0",
"xtend": "^4.0.1"
}
},
@@ -21287,9 +21336,13 @@
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"srcset": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/srcset/-/srcset-2.0.1.tgz",
- "integrity": "sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ=="
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz",
+ "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=",
+ "requires": {
+ "array-uniq": "^1.0.2",
+ "number-is-nan": "^1.0.0"
+ }
},
"sshpk": {
"version": "1.16.1",
@@ -22956,9 +23009,9 @@
}
},
"url-search-params-polyfill": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/url-search-params-polyfill/-/url-search-params-polyfill-7.0.1.tgz",
- "integrity": "sha512-bAw7L2E+jn9XHG5P9zrPnHdO0yJub4U+yXJOdpcpkr7OBd9T8oll4lUos0iSGRcDvfZoLUKfx9a6aNmIhJ4+mQ=="
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/url-search-params-polyfill/-/url-search-params-polyfill-8.0.0.tgz",
+ "integrity": "sha512-X4BTaEq1UMz9bTbMKQ6r+CippkKBsFWHiP9wycQc7aHH2Ml/Iieuo44+GJDb77pfP71bONYA/nUd4iokYAxVRQ=="
},
"url-to-options": {
"version": "1.0.1",
@@ -23111,9 +23164,9 @@
"integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA=="
},
"vfile-message": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.3.tgz",
- "integrity": "sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
"requires": {
"@types/unist": "^2.0.0",
"unist-util-stringify-position": "^2.0.0"
@@ -23271,18 +23324,20 @@
"integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg=="
},
"web-speech-cognitive-services": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/web-speech-cognitive-services/-/web-speech-cognitive-services-6.0.0.tgz",
- "integrity": "sha512-JVsFybLP8XOV8cQNVhfa857jBPDCEngIY5y79tG07bq7iSQoU5t+pQWU9LXj0kXj9wZBa/TSO2mLqVVB+UjYTg==",
+ "version": "7.0.0-master.da7babf",
+ "resolved": "https://registry.npmjs.org/web-speech-cognitive-services/-/web-speech-cognitive-services-7.0.0-master.da7babf.tgz",
+ "integrity": "sha512-gBOTZOV1yhc8y8BlPfpsuHKbKvhiZBgyk/5Q2OhgUJOdSDztNnw96IMg5zki1FlGf9oUFc57xXP7bZ98tSnBpA==",
"requires": {
- "@babel/runtime": "^7.5.5",
+ "@babel/runtime": "^7.8.7",
"base64-arraybuffer": "^0.2.0",
"event-as-promise": "^1.0.5",
- "events": "^3.0.0",
- "memoize-one": "^5.0.5",
- "microsoft-cognitiveservices-speech-sdk": "1.6.0",
+ "event-target-shim": "^5.0.1",
+ "event-target-shim-es5": "^1.0.1",
+ "memoize-one": "^5.1.1",
"on-error-resume-next": "^1.1.0",
- "simple-update-in": "^2.1.0"
+ "p-defer": "^3.0.0",
+ "p-defer-es5": "^1.0.1",
+ "simple-update-in": "^2.1.1"
}
},
"webdriverio": {
diff --git a/packages/app/client/package.json b/packages/app/client/package.json
index c957c9d41..b3ad26254 100644
--- a/packages/app/client/package.json
+++ b/packages/app/client/package.json
@@ -107,8 +107,8 @@
"base64url": "3.0.0",
"botframework-config": "4.4.0",
"botframework-schema": "^4.3.4",
- "botframework-webchat": "4.8.0",
- "botframework-webchat-core": "4.8.0",
+ "botframework-webchat": "4.9.0",
+ "botframework-webchat-core": "4.9.0",
"eslint-plugin-react": "^7.12.3",
"markdown-it": "^8.4.2",
"react": "16.8.6",
diff --git a/packages/app/main/package.json b/packages/app/main/package.json
index 2b00bbbf4..dd376a5f4 100644
--- a/packages/app/main/package.json
+++ b/packages/app/main/package.json
@@ -1,7 +1,7 @@
{
"name": "@bfemulator/main",
"packagename": "BotFramework-Emulator",
- "version": "4.8.1",
+ "version": "4.9.0",
"private": true,
"description": "Development tool for the Microsoft Bot Framework. Allows developers to test and debug bots on localhost.",
"main": "./app/server/main.js",
@@ -253,7 +253,11 @@
"x64"
]
}
- ]
+ ],
+ "extendInfo": {
+ "NSMicrophoneUsageDescription": "This app requires microphone access to record audio."
+ },
+ "entitlements": "./scripts/config/resources/entitlements.plist"
},
"dmg": {
"background": "./scripts/config/resources/background.tiff",
diff --git a/packages/app/main/scripts/config/resources/entitlements.plist b/packages/app/main/scripts/config/resources/entitlements.plist
index be8b7163d..e5d5e467c 100644
--- a/packages/app/main/scripts/config/resources/entitlements.plist
+++ b/packages/app/main/scripts/config/resources/entitlements.plist
@@ -10,5 +10,7 @@
com.apple.security.cs.allow-dyld-environment-variables
+ com.apple.security.device.audio-input
+
diff --git a/packages/app/main/src/server/webSocketServer.spec.ts b/packages/app/main/src/server/webSocketServer.spec.ts
index bc8abb87a..799378357 100644
--- a/packages/app/main/src/server/webSocketServer.spec.ts
+++ b/packages/app/main/src/server/webSocketServer.spec.ts
@@ -51,6 +51,7 @@ describe('WebSocketServer', () => {
mockCreateServer.mockClear();
mockWSServer.handleUpgrade.mockClear();
mockWSServer.on.mockClear();
+ (WebSocketServer as any)._restServer = undefined;
});
it('should return the corresponding socket for a conversation id', () => {
@@ -65,8 +66,6 @@ describe('WebSocketServer', () => {
});
it('should initialize the server', async () => {
- const cleanupSpy = jest.spyOn(WebSocketServer, 'cleanup').mockImplementationOnce(() => null);
- (WebSocketServer as any)._restServer = {};
(WebSocketServer as any)._servers = {};
(WebSocketServer as any)._sockets = {};
const mockRestServer = {
@@ -83,8 +82,13 @@ describe('WebSocketServer', () => {
expect(port).toBe(56273);
expect(mockRestServer.get).toHaveBeenCalledWith('/ws/:conversationId', jasmine.any(Function));
expect((WebSocketServer as any)._restServer).toEqual(mockRestServer);
- expect(cleanupSpy).toHaveBeenCalled();
- cleanupSpy.mockRestore();
+ });
+
+ it('should not re-initialize if already initialized', async () => {
+ (WebSocketServer as any)._restServer = {}; // server initialized
+ await WebSocketServer.init();
+
+ expect(mockCreateServer).not.toHaveBeenCalled();
});
it('should clean up the rest server, web sockets, and web socket servers', () => {
diff --git a/packages/app/main/src/server/webSocketServer.ts b/packages/app/main/src/server/webSocketServer.ts
index 2a7aaed15..119d5fd88 100644
--- a/packages/app/main/src/server/webSocketServer.ts
+++ b/packages/app/main/src/server/webSocketServer.ts
@@ -50,48 +50,50 @@ export class WebSocketServer {
return this._sockets[conversationId];
}
- public static async init(): Promise {
- if (this._restServer) {
- this.cleanup();
- }
- this._restServer = createServer({ handleUpgrades: true, name: 'Emulator-WebSocket-Host' });
- this._restServer.get('/ws/:conversationId', (req: Request, res: Response, next: Next) => {
- const conversationId = req.params.conversationId;
+ /** Initializes the server and returns the port it is listening on, or if already initialized,
+ * is a no-op.
+ */
+ public static async init(): Promise {
+ if (!this._restServer) {
+ this._restServer = createServer({ handleUpgrades: true, name: 'Emulator-WebSocket-Host' });
+ this._restServer.get('/ws/:conversationId', (req: Request, res: Response, next: Next) => {
+ const conversationId = req.params.conversationId;
- // initialize a new web socket server for each new conversation
- if (conversationId && !this._servers[conversationId]) {
- if (!(res as any).claimUpgrade) {
- return next(new Error('Connection must upgrade for web sockets.'));
- }
- const { head, socket } = (res as any).claimUpgrade();
- const wsServer = new WSServer({
- noServer: true,
- });
- wsServer.on('connection', (socket, req) => {
- this._sockets[conversationId] = socket;
- socket.on('close', (code, reason) => {
- delete this._servers[conversationId];
- delete this._sockets[conversationId];
+ // initialize a new web socket server for each new conversation
+ if (conversationId && !this._servers[conversationId]) {
+ if (!(res as any).claimUpgrade) {
+ return next(new Error('Connection must upgrade for web sockets.'));
+ }
+ const { head, socket } = (res as any).claimUpgrade();
+ const wsServer = new WSServer({
+ noServer: true,
});
+ wsServer.on('connection', (socket, req) => {
+ this._sockets[conversationId] = socket;
+ socket.on('close', (code, reason) => {
+ delete this._servers[conversationId];
+ delete this._sockets[conversationId];
+ });
+ });
+ // upgrade the connection to a ws connection
+ wsServer.handleUpgrade(req, socket, head, socket => {
+ wsServer.emit('connection', socket, req);
+ });
+ this._servers[conversationId] = wsServer;
+ }
+ });
+ // dynamically generate the web socket server port
+ const port = await new Promise((resolve, reject) => {
+ this._restServer.once('error', err => reject(err));
+ this._restServer.listen(null, () => {
+ resolve(this._restServer.address().port);
});
- // upgrade the connection to a ws connection
- wsServer.handleUpgrade(req, socket, head, socket => {
- wsServer.emit('connection', socket, req);
- });
- this._servers[conversationId] = wsServer;
- }
- });
- // dynamically generate the web socket server port
- const port = await new Promise((resolve, reject) => {
- this._restServer.once('error', err => reject(err));
- this._restServer.listen(null, () => {
- resolve(this._restServer.address().port);
});
- });
- this.port = port;
- // eslint-disable-next-line no-console
- console.log(`Web Socket host server listening on ${port}...`);
- return port;
+ this.port = port;
+ // eslint-disable-next-line no-console
+ console.log(`Web Socket host server listening on ${port}...`);
+ return port;
+ }
}
public static cleanup(): void {