diff --git a/.babelrc b/.babelrc index 002b4aa0d58ec481a2688d3c0b66e9069e5d6adb..4ffef06dbfb53d6210bc68ec4218f3b3d74108fc 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["env"] + "presets": ["env", "react"] } diff --git a/package.json b/package.json index 410167cc3bc3645b21b4e5199ede0071fe97e34d..69b31a5a3854a7672fed750b1b0ecf0cbf6fa2d0 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,16 @@ "networked-aframe": "https://github.com/netpro2k/networked-aframe#bugfix/chrome/audio", "nipplejs": "^0.6.7", "pleasejs": "^0.4.2", - "query-string": "^5.0.1" + "query-string": "^5.0.1", + "react": "^16.1.1", + "react-dom": "^16.1.1" }, "devDependencies": { "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-minify-webpack-plugin": "^0.2.0", "babel-preset-env": "^1.6.1", + "babel-preset-react": "^6.24.1", "css-loader": "^0.28.7", "eslint": "^4.10.0", "eslint-config-prettier": "^2.6.0", diff --git a/public/index.html b/public/index.html index bb54e9b9b67ee8fb37fade3f614b5aa809fe729b..cf44ab86425119cae127ff33f53694714ce7c29e 100644 --- a/public/index.html +++ b/public/index.html @@ -1,88 +1,17 @@ +<!DOCTYPE html> <html> - -<head> - <title>Mozilla Mixed Reality Social Client</title> - <script src="./app.bundle.js"></script> - <style> - .a-enter-vr { - top: 90px; - bottom: auto; - } - </style> -</head> - -<body> - <a-scene - networked-scene="adapter: janus; - room: 2; - serverURL: wss://quander.me:8989; - audio: true; - debug: true; - connectOnLoad: false;" - mute-mic="eventSrc: a-scene; toggleEvents: action_mute"> - - <a-assets> - <img id="grid" src="assets/grid.png" crossorigin="anonymous" /> - <img id="sky" src="https://cdn.aframe.io/360-image-gallery-boilerplate/img/sechelt.jpg" crossorigin="anonymous" /> - - <a-asset-item id="dodec-avatar-head" src="assets/avatars/dodec/DodecAvatarGLTF/DodecAvatar_Head.gltf"></a-asset-item> - - <a-asset-item id="watch-model" src="assets/hud/watch.gltf"></a-asset-item> - - <a-asset-item id="rock-island" src="assets/environments/RockIslandTest/RockIsland.gltf"></a-asset-item> - - <!-- Templates --> - <script id="head-template" type="text/html"> - <a-entity - class="head" - gltf-model="#dodec-avatar-head" - networked-audio-source - networked-audio-analyser - matcolor-audio-feedback="objectName: DodecAvatar_Head_0" - scale-audio-feedback - avatar-customization - personal-space-invader - ></a-entity> - </script> - - <script id="hand-template" type="text/html"> - <a-box class="hand" personal-space-invader scale="0.2 0.1 0.3"></a-box> - </script> - - <script id="nametag-template" type="text/html"> - <a-entity - class="nametag" - nametag-transform="follow: .head" - text="side:double;align:center;color:#555" - position="0 2.5 0" - scale="6 6 6"></a-entity> - </script> - </a-assets> - <a-entity id="player-rig" networked character-controller="pivot: #head"> - <a-sphere scale="0.1 0.1 0.1"></a-sphere> - <a-entity id="head" camera="userHeight: 1.6" personal-space-bubble look-controls networked="template:#head-template;showLocalTemplate:false;"></a-entity> - <a-entity id="nametag" networked="template:#nametag-template;showLocalTemplate:false;"></a-entity> - - <a-entity id="left-hand" split-axis-events hand-controls="left" hand-controls-visibility axis-dpad="centerZone: 1" networked="template:#hand-template;showLocalTemplate:false;"> - <a-entity id="watch" gltf-model="assets/hud/watch.gltf" position="0 0.0015 0.147" rotation="3.5 0 0"> - <a-circle mute-state-indicator scale-audio-feedback="analyserSrc: #head; minScale: 0.035; maxScale: 0.08;" position="0 0.023 0" - rotation="-90 0 0" scale="0.04 0.04 0.04" material="color:#d8eece;shader:flat"> - </a-circle> - </a-entity> - </a-entity> - - <a-entity id="right-hand" hand-controls="right" hand-controls-child-visibility axis-dpad teleport-controls="cameraRig: #player-rig; teleportOrigin: #head; hitEntity: #telepor-indicator; button: action_teleport_;" - networked="template:#hand-template;showLocalTemplate:false;"> - </a-entity> - </a-entity> - - <a-entity class="head" gltf-model="#rock-island" position="0 0 0"> - <a-sky color="#DDFFD9"></a-sky> - </a-entity> - </a-scene> - <script> - document.querySelector('a-scene').addEventListener('loaded', onSceneLoad) - </script> -</body> - + <head> + <title>Hello!</title> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + + <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"> +<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css"> +<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script> + </head> + <body> + <div id="root"></div> + <script src="./lobby.bundle.js"></script> + </body> </html> diff --git a/public/room.html b/public/room.html new file mode 100644 index 0000000000000000000000000000000000000000..bb54e9b9b67ee8fb37fade3f614b5aa809fe729b --- /dev/null +++ b/public/room.html @@ -0,0 +1,88 @@ +<html> + +<head> + <title>Mozilla Mixed Reality Social Client</title> + <script src="./app.bundle.js"></script> + <style> + .a-enter-vr { + top: 90px; + bottom: auto; + } + </style> +</head> + +<body> + <a-scene + networked-scene="adapter: janus; + room: 2; + serverURL: wss://quander.me:8989; + audio: true; + debug: true; + connectOnLoad: false;" + mute-mic="eventSrc: a-scene; toggleEvents: action_mute"> + + <a-assets> + <img id="grid" src="assets/grid.png" crossorigin="anonymous" /> + <img id="sky" src="https://cdn.aframe.io/360-image-gallery-boilerplate/img/sechelt.jpg" crossorigin="anonymous" /> + + <a-asset-item id="dodec-avatar-head" src="assets/avatars/dodec/DodecAvatarGLTF/DodecAvatar_Head.gltf"></a-asset-item> + + <a-asset-item id="watch-model" src="assets/hud/watch.gltf"></a-asset-item> + + <a-asset-item id="rock-island" src="assets/environments/RockIslandTest/RockIsland.gltf"></a-asset-item> + + <!-- Templates --> + <script id="head-template" type="text/html"> + <a-entity + class="head" + gltf-model="#dodec-avatar-head" + networked-audio-source + networked-audio-analyser + matcolor-audio-feedback="objectName: DodecAvatar_Head_0" + scale-audio-feedback + avatar-customization + personal-space-invader + ></a-entity> + </script> + + <script id="hand-template" type="text/html"> + <a-box class="hand" personal-space-invader scale="0.2 0.1 0.3"></a-box> + </script> + + <script id="nametag-template" type="text/html"> + <a-entity + class="nametag" + nametag-transform="follow: .head" + text="side:double;align:center;color:#555" + position="0 2.5 0" + scale="6 6 6"></a-entity> + </script> + </a-assets> + <a-entity id="player-rig" networked character-controller="pivot: #head"> + <a-sphere scale="0.1 0.1 0.1"></a-sphere> + <a-entity id="head" camera="userHeight: 1.6" personal-space-bubble look-controls networked="template:#head-template;showLocalTemplate:false;"></a-entity> + <a-entity id="nametag" networked="template:#nametag-template;showLocalTemplate:false;"></a-entity> + + <a-entity id="left-hand" split-axis-events hand-controls="left" hand-controls-visibility axis-dpad="centerZone: 1" networked="template:#hand-template;showLocalTemplate:false;"> + <a-entity id="watch" gltf-model="assets/hud/watch.gltf" position="0 0.0015 0.147" rotation="3.5 0 0"> + <a-circle mute-state-indicator scale-audio-feedback="analyserSrc: #head; minScale: 0.035; maxScale: 0.08;" position="0 0.023 0" + rotation="-90 0 0" scale="0.04 0.04 0.04" material="color:#d8eece;shader:flat"> + </a-circle> + </a-entity> + </a-entity> + + <a-entity id="right-hand" hand-controls="right" hand-controls-child-visibility axis-dpad teleport-controls="cameraRig: #player-rig; teleportOrigin: #head; hitEntity: #telepor-indicator; button: action_teleport_;" + networked="template:#hand-template;showLocalTemplate:false;"> + </a-entity> + </a-entity> + + <a-entity class="head" gltf-model="#rock-island" position="0 0 0"> + <a-sky color="#DDFFD9"></a-sky> + </a-entity> + </a-scene> + <script> + document.querySelector('a-scene').addEventListener('loaded', onSceneLoad) + </script> +</body> + +</html> diff --git a/src/lobby.css b/src/lobby.css new file mode 100644 index 0000000000000000000000000000000000000000..a6db36dd79089a3352490a0f67ba012be53568b3 --- /dev/null +++ b/src/lobby.css @@ -0,0 +1,31 @@ +* { + box-sizing: border-box; +} + +body { + margin: 0; + padding: 0; + background: black url(https://cdn.glitch.com/52bf1803-98d8-450b-83f4-f74024eb22e5%2Fwallpaper_HD_firefox.jpg?1510615261238) no-repeat right center; + background-size: auto 100%; +} + +.overlay { + display: flex; + background: rgba(0,0,0,0.4); + width: 100vw; + height: 100vh; + align-items: center; + padding: 100px 50px; +} + +.panel { + height: 100%; +} + +.room-item { + cursor: pointer; +} + +.room-item:hover { + background: #eaeaea; +} diff --git a/src/lobby.js b/src/lobby.js new file mode 100644 index 0000000000000000000000000000000000000000..af7ab57917d1de9780539ac95c6fd2e24d9593d2 --- /dev/null +++ b/src/lobby.js @@ -0,0 +1,117 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import mj from "minijanus"; + +import "./lobby.css"; + +const SERVER_URL = "wss://quander.me:8989"; + +class Lobby extends React.Component { + constructor() { + super(); + this.state = { rooms: [] }; + + this.onWebsocketOpen = this.onWebsocketOpen.bind(this); + this.onWebsocketMessage = this.onWebsocketMessage.bind(this); + this.updateRooms = this.updateRooms.bind(this); + } + + componentDidMount() { + this.ws = new WebSocket(SERVER_URL, "janus-protocol"); + this.session = new mj.JanusSession(this.ws.send.bind(this.ws)); + this.ws.addEventListener("open", this.onWebsocketOpen); + this.ws.addEventListener("message", this.onWebsocketMessage); + } + + componentWillUnmount() { + clearInterval(this.pollRoomsIntervalHandle); + this.ws.removeEventListener("open", this.onWebsocketOpen); + this.ws.removeEventListener("message", this.onWebsocketMessage); + } + + onWebsocketOpen() { + this.session + .create() + .then(() => { + this.handle = new mj.JanusPluginHandle(this.session); + return this.handle.attach("janus.plugin.sfu").then(this.updateRooms); + }) + .then(() => { + this.pollRoomsIntervalHandle = setInterval(this.updateRooms, 10000); + }); + } + + updateRooms() { + return this.fetchRooms().then(rooms => this.setState({ rooms })); + } + + fetchRooms() { + return this.handle + .sendMessage({ + kind: "listrooms" + }) + .then(signal => { + const roomIds = signal.plugindata.data.response.room_ids; + return Promise.all( + roomIds.map(room_id => { + return this.handle + .sendMessage({ + kind: "listusers", + room_id + }) + .then(signal => ({ + id: room_id, + limit: 12, + users: signal.plugindata.data.response.user_ids + })); + }) + ); + }); + } + + onWebsocketMessage(event) { + var message = JSON.parse(event.data); + this.session.receive(message); + } + + render() { + return ( + <div className="overlay"> + <RoomList rooms={this.state.rooms} /> + </div> + ); + } +} + +const goToRoom = roomId => { + window.open(`room.html?room=${roomId}`, "_blank"); +}; + +const RoomListItem = ({ room }) => { + return ( + <li + className="room-item mdl-list__item mdl-list__item--two-line" + onClick={() => goToRoom(room.id)} + > + <span className="mdl-list__item-primary-content"> + <i className="material-icons mdl-list__item-icon">room</i> + <span>Meeting room {room.id}</span> + <span className="mdl-list__item-sub-title"> + {room.users.length}/{room.limit} + </span> + </span> + </li> + ); +}; + +const RoomList = ({ rooms }) => { + return ( + <div className="mdl-card mdl-shadow--2dp panel"> + <ul className="demo-list-icon mdl-list"> + {rooms.map(room => <RoomListItem key={room.id} room={room} />)} + </ul> + </div> + ); +}; + +ReactDOM.render(<Lobby />, document.getElementById("root")); diff --git a/webpack.common.js b/webpack.common.js index 465b4247f30cfa50a9b4be7b2fc865017c2e226c..4c2d6c0406b45fe2c16ceba5164842a8fb225394 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -2,7 +2,8 @@ const path = require("path"); module.exports = { entry: { - app: path.join(__dirname, "src", "index") + app: path.join(__dirname, "src", "index"), + lobby: path.join(__dirname, "src", "lobby") }, output: { filename: "[name].bundle.js", diff --git a/yarn.lock b/yarn.lock index 7031fdc28d288887ceb6cea80425a0279b638a86..c60d2aea81572d59f6443c01eb9332a9f8670173 100644 --- a/yarn.lock +++ b/yarn.lock @@ -267,6 +267,10 @@ as-number@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/as-number/-/as-number-1.0.0.tgz#acb27e34f8f9d8ab0da9e376f3b8959860f80a66" +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + asn1.js@^4.0.0: version "4.9.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" @@ -391,6 +395,14 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" + babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" @@ -613,6 +625,14 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" @@ -801,6 +821,13 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + babel-plugin-transform-inline-consecutive-adds@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz#15dae78921057f4004f8eafd79e15ddc5f12f426" @@ -823,6 +850,34 @@ babel-plugin-transform-property-literals@^6.8.5: dependencies: esutils "^2.0.2" +babel-plugin-transform-react-display-name@^6.23.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-self@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -897,6 +952,12 @@ babel-preset-env@^1.6.1: invariant "^2.2.2" semver "^5.3.0" +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + babel-preset-minify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz#006566552d9b83834472273f306c0131062a0acc" @@ -925,6 +986,17 @@ babel-preset-minify@^0.2.0: babel-plugin-transform-undefined-to-void "^6.8.3" lodash.isplainobject "^4.0.6" +babel-preset-react@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + dependencies: + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-react-display-name "^6.23.0" + babel-plugin-transform-react-jsx "^6.24.1" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + babel-preset-flow "^6.23.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -1538,6 +1610,10 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + core-js@^2.4.0, core-js@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" @@ -1720,7 +1796,7 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.2.0, "debug@github:ngokevin/debug#noTimestamp": +debug@2.2.0, debug@ngokevin/debug#noTimestamp: version "2.2.0" resolved "https://codeload.github.com/ngokevin/debug/tar.gz/ef5f8e66d49ce8bc64c6f282c15f8b7164409e3a" @@ -1888,7 +1964,7 @@ doctrine@^2.0.0: esutils "^2.0.2" isarray "^1.0.0" -"document-register-element@github:dmarcos/document-register-element#8ccc532b7": +document-register-element@dmarcos/document-register-element#8ccc532b7: version "0.5.4" resolved "https://codeload.github.com/dmarcos/document-register-element/tar.gz/8ccc532b7f3744be954574caf3072a5fd260ca90" @@ -1950,6 +2026,12 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + engine.io-client@~1.8.4: version "1.8.4" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.4.tgz#9fe85dee25853ca6babe25bd2ad68710863e91c2" @@ -2382,6 +2464,18 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" +fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -2856,7 +2950,7 @@ https-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" -iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.5: +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.5, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -3119,7 +3213,7 @@ is-resolvable@^1.0.0: dependencies: tryit "^1.0.1" -is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3167,6 +3261,13 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -3389,7 +3490,7 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -3650,6 +3751,13 @@ nipplejs@^0.6.7: version "0.6.7" resolved "https://registry.yarnpkg.com/nipplejs/-/nipplejs-0.6.7.tgz#c634b63d0583868d033b5f34813e9388066cc9b6" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-forge@0.6.33: version "0.6.33" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" @@ -3775,7 +3883,7 @@ object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -4385,6 +4493,20 @@ promise-polyfill@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-3.1.0.tgz#62952b01d059b115b432763b7ef461b80f6df47d" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.6.0: + version "15.6.0" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" @@ -4510,6 +4632,24 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-dom@^16.1.1: + version "16.1.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.1.1.tgz#b2e331b6d752faf1a2d31399969399a41d8d45f8" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + +react@^16.1.1: + version "16.1.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.1.1.tgz#d5c4ef795507e3012282dd51261ff9c0e824fe1f" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -4865,7 +5005,7 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" -setimmediate@^1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -5395,6 +5535,10 @@ typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +ua-parser-js@^0.7.9: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -5636,6 +5780,10 @@ webvr-polyfill@^0.9.36: version "0.9.40" resolved "https://registry.yarnpkg.com/webvr-polyfill/-/webvr-polyfill-0.9.40.tgz#2cfa0ec0e0cc6ba7238c73a09cba4952fff59a63" +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"