From 7efaf092c854c0e77031ed54495018e7e3841086 Mon Sep 17 00:00:00 2001 From: Torjus Date: Thu, 26 Jul 2018 15:29:52 +0200 Subject: [PATCH 01/40] Initial work for file sharing using WebTorrent --- app/lib/components/Chat/Chat.jsx | 4 + app/lib/components/Chat/FileSharing.jsx | 61 ++ app/lib/components/Chat/MessageList.jsx | 34 +- app/lib/redux/reducers/chatmessages.js | 14 +- app/lib/redux/reducers/helper.js | 12 + app/lib/redux/requestActions.js | 13 +- app/lib/redux/stateActions.js | 8 + app/package-lock.json | 1263 +++++++++++++++++++++-- app/package.json | 4 +- 9 files changed, 1306 insertions(+), 107 deletions(-) create mode 100644 app/lib/components/Chat/FileSharing.jsx diff --git a/app/lib/components/Chat/Chat.jsx b/app/lib/components/Chat/Chat.jsx index 898bf75..87480ee 100644 --- a/app/lib/components/Chat/Chat.jsx +++ b/app/lib/components/Chat/Chat.jsx @@ -4,6 +4,7 @@ import PropTypes from 'prop-types'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import MessageList from './MessageList'; +import FileSharing from './FileSharing'; class Chat extends Component { @@ -21,6 +22,9 @@ class Chat extends Component return (
+ + +
{ onSendMessage(e, displayName, picture); }} diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx new file mode 100644 index 0000000..08142d7 --- /dev/null +++ b/app/lib/components/Chat/FileSharing.jsx @@ -0,0 +1,61 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import WebTorrent from 'webtorrent'; +import dragDrop from 'drag-drop'; +import * as stateActions from '../../redux/stateActions'; +import * as requestActions from '../../redux/requestActions'; + +class FileSharing extends Component { + notifyPeers = (file) => + { + this.props.notifyPeers( + file, + this.props.displayName, + this.props.picture + ); + }; + + componentDidMount() + { + this.client = new WebTorrent(); + + dragDrop('body', (files) => + { + this.client.seed(files, (torrent) => { + this.notifyPeers({ + magnet: torrent.magnetURI + }); + }); + }); + } + + render() + { + return ( +
+ drag & drop files to share them!!! +
+ ); + } +} + +const mapStateToProps = (state) => + ({ + displayName: state.me.displayName, + picture: state.me.picture + }); + +const mapDispatchToProps = (dispatch) => + ({ + notifyPeers: (file, displayName, picture) => + { + console.log(file) + dispatch(stateActions.addUserFile(file)); + dispatch(requestActions.sendChatFile(file, displayName, picture)); + } + }); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(FileSharing); \ No newline at end of file diff --git a/app/lib/components/Chat/MessageList.jsx b/app/lib/components/Chat/MessageList.jsx index 3f59d1a..9c1f8d9 100644 --- a/app/lib/components/Chat/MessageList.jsx +++ b/app/lib/components/Chat/MessageList.jsx @@ -48,30 +48,40 @@ class MessageList extends Component { chatmessages.map((message, i) => { + console.log(message); + const messageTime = new Date(message.time); const picture = (message.sender === 'response' ? message.picture : this.props.myPicture) || 'resources/images/avatar-empty.jpeg'; - + return (
-
+ {message.type === 'message' && ( +
+ )} - - {message.name} - {this.getTimeString(messageTime)} - + {message.type === 'file' && ( +
+ {message.file.magnet} +
+ )}
+ + + {message.name} - {this.getTimeString(messageTime)} +
); diff --git a/app/lib/redux/reducers/chatmessages.js b/app/lib/redux/reducers/chatmessages.js index 020908e..baf8761 100644 --- a/app/lib/redux/reducers/chatmessages.js +++ b/app/lib/redux/reducers/chatmessages.js @@ -1,6 +1,7 @@ import { - createNewMessage + createNewMessage, + createNewFile } from './helper'; const chatmessages = (state = [], action) => @@ -11,7 +12,16 @@ const chatmessages = (state = [], action) => { const { text } = action.payload; - const message = createNewMessage(text, 'client', 'Me'); + const message = createNewMessage(text, 'client', 'Me', undefined); + + return [ ...state, message ]; + } + + case 'ADD_NEW_USER_FILE': + { + const { file } = action.payload; + + const message = createNewFile(file, 'client', 'Me', undefined); return [ ...state, message ]; } diff --git a/app/lib/redux/reducers/helper.js b/app/lib/redux/reducers/helper.js index db17859..2ca3709 100644 --- a/app/lib/redux/reducers/helper.js +++ b/app/lib/redux/reducers/helper.js @@ -8,4 +8,16 @@ export function createNewMessage(text, sender, name, picture) sender, picture }; +} + +export function createNewFile(file, sender, name, picture) +{ + return { + type: 'file', + file, + time: Date.now(), + name, + sender, + picture + }; } \ No newline at end of file diff --git a/app/lib/redux/requestActions.js b/app/lib/redux/requestActions.js index 6fdb92a..e748d6d 100644 --- a/app/lib/redux/requestActions.js +++ b/app/lib/redux/requestActions.js @@ -2,7 +2,8 @@ import randomString from 'random-string'; import * as stateActions from './stateActions'; import { - createNewMessage + createNewMessage, + createNewFile } from './reducers/helper'; export const joinRoom = ( @@ -213,6 +214,16 @@ export const sendChatMessage = (text, name, picture) => }; }; +export const sendChatFile = (magnet, name, picture) => +{ + const message = createNewFile(magnet, 'response', name, picture); + + return { + type: 'SEND_CHAT_MESSAGE', + payload: { message } + }; +}; + // This returns a redux-thunk action (a function). export const notify = ({ type = 'info', text, timeout }) => { diff --git a/app/lib/redux/stateActions.js b/app/lib/redux/stateActions.js index e9c9fb7..5d4d87e 100644 --- a/app/lib/redux/stateActions.js +++ b/app/lib/redux/stateActions.js @@ -410,6 +410,14 @@ export const addUserMessage = (text) => }; }; +export const addUserFile = (file) => +{ + return { + type: 'ADD_NEW_USER_FILE', + payload: { file } + }; +}; + export const addResponseMessage = (message) => { return { diff --git a/app/package-lock.json b/app/package-lock.json index 7709cbd..514c844 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -244,6 +244,11 @@ "xtend": "^4.0.1" } }, + "addr-to-ip-port": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-1.4.3.tgz", + "integrity": "sha512-+KHTG8KSAFdKYmLNZp3VnKj94AZ94gDdu2ipAwxNuMmN9vpf5hdsQgk1hNXFqQOXfd+BMHokyDa1GwDAlGAtGQ==" + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -376,12 +381,28 @@ "buffer-equal": "^1.0.0" } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -656,8 +677,7 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "async-settle": { "version": "1.0.0", @@ -1868,8 +1888,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1978,6 +1997,14 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, + "bencode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.0.tgz", + "integrity": "sha512-wr2HwwrUpfB5c68zmAudOltC7rZ1G0+lQOcnuEcfIM3AWAVnB3rHI3nlgd/2CWTfQ3w3zagKt89zni/M+VLZ8g==", + "requires": { + "safe-buffer": "^5.1.1" + } + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1993,17 +2020,176 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "binary-search": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.4.tgz", + "integrity": "sha512-dPxU/vZLnH0tEVjVPgi015oSwqu6oLfCeHywuFRhBE0yM0mYocvleTl8qsdM1YFhRzTRhM1+VzS8XLDVrHPopg==" + }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", + "optional": true + }, + "bitfield": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bitfield/-/bitfield-2.0.0.tgz", + "integrity": "sha512-4xM4DYejOHQ/qWBfeqBXNA4mJ12PwcOibFYnH1kYh5U9BHciCqEJBqGNVnMJXUhm8mflujNRLSv7IiVQxovgjw==" + }, + "bittorrent-dht": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-8.4.0.tgz", + "integrity": "sha512-FRe/+MYBePev7Yb+BXSclkVuDxb/w+gUbao6nVHYQRaKO7aXE+ARRlL3phqm6Rdhw5CRVoLMbLd49nxmCuUhUQ==", + "requires": { + "bencode": "^2.0.0", + "buffer-equals": "^1.0.3", + "debug": "^3.1.0", + "inherits": "^2.0.1", + "k-bucket": "^4.0.0", + "k-rpc": "^5.0.0", + "last-one-wins": "^1.0.4", + "lru": "^3.1.0", + "randombytes": "^2.0.5", + "record-cache": "^1.0.2", + "safe-buffer": "^5.0.1", + "simple-sha1": "^2.1.0" + } + }, + "bittorrent-peerid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bittorrent-peerid/-/bittorrent-peerid-1.2.0.tgz", + "integrity": "sha1-n2dWEvDmr8bvNFDfulH/cjir83E=" + }, + "bittorrent-protocol": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bittorrent-protocol/-/bittorrent-protocol-2.4.2.tgz", + "integrity": "sha512-ZphU6H9B0Tf99P2noVmyKkT7Bf8FZG6T3VSurJva8ozvvCqSfLMnI7X4Khxn5qXXvw71/R9Vfq+aJvMgV9lquQ==", + "requires": { + "bencode": "^2.0.0", + "bitfield": "^2.0.0", + "debug": "^3.1.0", + "inherits": "^2.0.1", + "randombytes": "^2.0.5", + "readable-stream": "^2.3.2", + "safe-buffer": "^5.1.1", + "speedometer": "^1.0.0", + "unordered-array-remove": "^1.0.2", + "xtend": "^4.0.0" + } + }, + "bittorrent-tracker": { + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-9.9.1.tgz", + "integrity": "sha512-PdCrhMP0ajbutZEcw5FLd/pTvcxr7m5NTXEck3t1qS+UMcC9+pie2Zd59TSFefia2ipDlstOhVAUTOlaoZLlDQ==", + "requires": { + "bencode": "^2.0.0", + "bittorrent-peerid": "^1.0.2", + "bn.js": "^4.4.0", + "bufferutil": "^3.0.0", + "compact2string": "^1.2.0", + "debug": "^3.1.0", + "inherits": "^2.0.1", + "ip": "^1.0.1", + "lru": "^3.0.0", + "minimist": "^1.1.1", + "once": "^1.3.0", + "random-iterate": "^1.0.1", + "randombytes": "^2.0.3", + "run-parallel": "^1.1.2", + "run-series": "^1.0.2", + "safe-buffer": "^5.0.0", + "simple-get": "^3.0.0", + "simple-peer": "^9.0.0", + "simple-websocket": "^7.0.1", + "string2compact": "^1.1.1", + "uniq": "^1.0.1", + "unordered-array-remove": "^1.0.2", + "ws": "^5.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "optional": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "optional": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "blob": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", "dev": true }, + "blob-to-buffer": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/blob-to-buffer/-/blob-to-buffer-1.2.8.tgz", + "integrity": "sha512-re0AIxakF504MgeMtIyJkVcZ8T5aUxtp/QmTMlmjyb3P44E1BEv5x3LATBGApWAJATyXHtkXRD+gWTmeyYLiQA==" + }, + "block-stream2": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/block-stream2/-/block-stream2-1.1.0.tgz", + "integrity": "sha1-xzjjqRupd+u14f70MeE8oR2GOeI=", + "requires": { + "defined": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "bowser": { "version": "1.9.3", @@ -2014,7 +2200,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2229,6 +2414,11 @@ } } }, + "browserify-package-json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-package-json/-/browserify-package-json-1.0.1.tgz", + "integrity": "sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=" + }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", @@ -2289,17 +2479,40 @@ "ieee754": "^1.1.4" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, "buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, + "buffer-equals": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/buffer-equals/-/buffer-equals-1.0.4.tgz", + "integrity": "sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" }, "buffer-xor": { "version": "1.0.3", @@ -2313,6 +2526,25 @@ "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", "dev": true }, + "bufferutil": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-3.0.5.tgz", + "integrity": "sha512-0fUEthLqfCkYspEuP0vmiAe+PsXslE+AlILb2rmS9I4tAdm3SmpCI69M66zQL20GQEszdbXyVN6q+cpG/yhYlg==", + "optional": true, + "requires": { + "bindings": "~1.3.0", + "nan": "~2.10.0", + "prebuild-install": "~4.0.0" + }, + "dependencies": { + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "optional": true + } + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -2453,6 +2685,22 @@ "readdirp": "^2.0.0" } }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "optional": true + }, + "chunk-store-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chunk-store-stream/-/chunk-store-stream-2.1.0.tgz", + "integrity": "sha512-mVVfkjLW3E4wgBIMBw+5es+q0ShA/67r8dvGwy31o3CUo4kJ74bxWEK2WDHCJ5rTFWFbtQe5O2ZKFJgCnsOcWA==", + "requires": { + "block-stream2": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + } + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -2558,6 +2806,11 @@ "through2": "^2.0.1" } }, + "closest-to": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/closest-to/-/closest-to-2.0.0.tgz", + "integrity": "sha1-uyqGDtt3abYtBIIXSK5Q2iTb76o=" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -2567,8 +2820,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-map": { "version": "1.0.0", @@ -2658,6 +2910,14 @@ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true }, + "compact2string": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.0.tgz", + "integrity": "sha1-qZzZbqAAUlaEsmloOuIiLW7qe0k=", + "requires": { + "ipaddr.js": ">= 0.1.5" + } + }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -2679,8 +2939,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -2749,6 +3008,11 @@ "date-now": "^0.1.4" } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -2805,8 +3069,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "create-ecdh": { "version": "4.0.3", @@ -2845,6 +3108,34 @@ "sha.js": "^2.4.8" } }, + "create-torrent": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/create-torrent/-/create-torrent-3.32.0.tgz", + "integrity": "sha512-l9chXj5LLyVFfPF6nFCWlm5/Wt+04d+mXUpG5LJAogeyRruWfjnUozfmQspAi6iW91ibp7qKBuFMPJViz5lp1Q==", + "requires": { + "bencode": "^2.0.0", + "block-stream2": "^1.0.0", + "filestream": "^4.0.0", + "flatten": "^1.0.2", + "is-file": "^1.0.0", + "junk": "^2.1.0", + "minimist": "^1.1.0", + "multistream": "^2.0.2", + "once": "^1.3.0", + "piece-length": "^1.0.0", + "readable-stream": "^2.0.5", + "run-parallel": "^1.0.0", + "simple-sha1": "^2.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -2941,11 +3232,25 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "deep-diff": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "optional": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -3041,8 +3346,7 @@ "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "del": { "version": "3.0.0", @@ -3072,6 +3376,12 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -3121,6 +3431,12 @@ "repeating": "^2.0.0" } }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "optional": true + }, "detective": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", @@ -3182,6 +3498,16 @@ "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz", "integrity": "sha1-kfJS5Ze2Wvd+dFriTdAYXV4m1Yw=" }, + "drag-drop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/drag-drop/-/drag-drop-4.2.0.tgz", + "integrity": "sha512-RA8jXrxOlOFzkM5+tapHeavt0PIlh4FReYx4Ct9ECBRMxixPKUehRs4OQSruAPhQScClt1JaZ3M882FQdcZWaw==", + "requires": { + "blob-to-buffer": "^1.0.2", + "flatten": "^1.0.2", + "run-parallel": "^1.0.0" + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -3300,7 +3626,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "dev": true, "requires": { "once": "^1.4.0" } @@ -3878,6 +4203,12 @@ "fill-range": "^2.1.0" } }, + "expand-template": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", + "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==", + "optional": true + }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -4019,6 +4350,17 @@ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, + "filestream": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/filestream/-/filestream-4.1.3.tgz", + "integrity": "sha1-lI/KregiH3FfXsrdxUhi+qrMkyU=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5", + "typedarray-to-buffer": "^3.0.0", + "xtend": "^4.0.1" + } + }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", @@ -4442,6 +4784,11 @@ } } }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" + }, "flush-write-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", @@ -4526,6 +4873,25 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "fs-chunk-store": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/fs-chunk-store/-/fs-chunk-store-1.7.0.tgz", + "integrity": "sha512-KhjJmZAs2eqfhCb6PdPx4RcZtheGTz86tpTC5JTvqBn/xda+Nb+0C7dCyjOSN7T76H6a56LvH0SVXQMchLXDRw==", + "requires": { + "mkdirp": "^0.5.1", + "random-access-file": "^2.0.1", + "randombytes": "^2.0.3", + "rimraf": "^2.4.2", + "run-parallel": "^1.1.2", + "thunky": "^1.0.1" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "optional": true + }, "fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", @@ -4550,8 +4916,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fscreen": { "version": "1.0.2", @@ -4599,14 +4964,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4621,20 +4984,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -4751,8 +5111,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -4764,7 +5123,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4779,7 +5137,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4898,8 +5255,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -4911,7 +5267,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5033,7 +5388,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5117,18 +5471,44 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, "get-assigned-identifiers": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", "dev": true }, + "get-browser-rtc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz", + "integrity": "sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=" + }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -5144,11 +5524,16 @@ "assert-plus": "^1.0.0" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "optional": true + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6174,6 +6559,12 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -6365,6 +6756,11 @@ "integrity": "sha512-uoxnT7PYpyEnsja+yX+7v49B7LXxmzDJ2JALqHH3oEGzpM2U1IGcbfnOr8Dt57z3B/UWs7/iAgPFbmye8m4I0g==", "dev": true }, + "immediate-chunk-store": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/immediate-chunk-store/-/immediate-chunk-store-1.0.8.tgz", + "integrity": "sha1-Ds2tDFRjMmcte1tRGya7GM5W5z8=" + }, "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", @@ -6393,7 +6789,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -6402,14 +6797,12 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inline-source-map": { "version": "0.6.2", @@ -6532,6 +6925,24 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-set": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ip-set/-/ip-set-1.0.1.tgz", + "integrity": "sha1-Yztm0L1sjQ3paNBTJjyRINO2cn4=", + "requires": { + "ip": "^1.1.3" + } + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -6557,6 +6968,11 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-ascii": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-ascii/-/is-ascii-1.0.0.tgz", + "integrity": "sha1-8CrQJZoJIc0Zn/Ic4bCeD2tOOSk=" + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -6648,6 +7064,11 @@ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, + "is-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-file/-/is-file-1.0.0.tgz", + "integrity": "sha1-KKRM+9nT2xkwRfIrZfzo7fliBZY=" + }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", @@ -6661,7 +7082,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6828,8 +7248,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -6975,12 +7394,48 @@ "array-includes": "^3.0.3" } }, + "junk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-2.1.0.tgz", + "integrity": "sha1-9DG0t/By3FAKXxDOf07HGTDnATQ=" + }, "just-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", "dev": true }, + "k-bucket": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-4.0.1.tgz", + "integrity": "sha512-YvDpmY3waI999h1zZoW1rJ04fZrgZ+5PAlVmvwDHT6YO/Q1AOhdel07xsKy9eAvJjQ9xZV1wz3rXKqEfaWvlcQ==", + "requires": { + "inherits": "^2.0.1", + "randombytes": "^2.0.3" + } + }, + "k-rpc": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.0.0.tgz", + "integrity": "sha512-vCH2rQdfMOS+MlUuTSuar1pS2EMrltURf9LmAR9xR6Jik0XPlMX3vEixgqMn17wKmFVCublJqSJ4hJIP7oKZ3Q==", + "requires": { + "buffer-equals": "^1.0.3", + "k-bucket": "^4.0.0", + "k-rpc-socket": "^1.7.2", + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.1" + } + }, + "k-rpc-socket": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz", + "integrity": "sha512-f/9TynsO8YYjZ6JjNNtSSH7CJcIHcio1buy3zqByGxb/GX8AWLdL6FZEWTrN8V3/J7W4/E0ZTQQ+Jt2rVq7ELg==", + "requires": { + "bencode": "^2.0.0", + "buffer-equals": "^1.0.4", + "safe-buffer": "^5.1.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -7009,6 +7464,11 @@ } } }, + "last-one-wins": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", + "integrity": "sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=" + }, "last-run": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", @@ -7084,6 +7544,38 @@ "integrity": "sha512-zrycnIMsLw/3ZxTbW7HCez56rcFGecWTx5OZNplzcXUUmJLmoYArC6qdJzmAN5BWiNXGcpjhF9RQ1HSv5zebEw==", "dev": true }, + "load-ip-set": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/load-ip-set/-/load-ip-set-1.3.1.tgz", + "integrity": "sha1-z9BQxpFue6DKhdC1ZueFRxPrSV4=", + "requires": { + "ip-set": "^1.0.0", + "netmask": "^1.0.6", + "once": "^1.3.0", + "simple-get": "^2.0.0", + "split": "^1.0.0" + }, + "dependencies": { + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + } + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -7406,6 +7898,25 @@ "js-tokens": "^3.0.0" } }, + "lru": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", + "integrity": "sha1-6n+4VG2DczOWoTCR12z+tMBoN9U=", + "requires": { + "inherits": "^2.0.1" + } + }, + "magnet-uri": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-5.1.8.tgz", + "integrity": "sha512-rHCJ81C3W2MuLpb4c3JKshQtCbRZhgeKKNYy1YFBtLR3eAB0FjQ5thfCo16w/+VF9yN5tJDtDq4NHPtf9a328A==", + "requires": { + "safe-buffer": "^5.0.1", + "thirty-two": "^1.0.1", + "uniq": "^1.0.1", + "xtend": "^4.0.0" + } + }, "make-error": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", @@ -7797,6 +8308,21 @@ } } }, + "mediasource": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mediasource/-/mediasource-2.2.1.tgz", + "integrity": "sha512-WRtioPZW7FbuD4OvgrGZU3t5c0sp1F4rGJhrYp4pMIK1u8Hi5HS5aiVvQf24T2/NBg650xdWOXgx8yqTUM71lw==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5", + "to-arraybuffer": "^1.0.1" + } + }, + "memory-chunk-store": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz", + "integrity": "sha512-6LsOpHKKhxYrLhHmOJdBCUtSO7op5rUs1pag0fhjHo0QiXRyna0bwYf4EmQuL7InUeF2J7dUMPr6VMogRyf9NA==" + }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", @@ -7864,6 +8390,11 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -7880,7 +8411,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7888,8 +8418,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { "version": "1.3.1", @@ -7916,7 +8445,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -7944,6 +8472,28 @@ "xtend": "^4.0.0" } }, + "mp4-box-encoding": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mp4-box-encoding/-/mp4-box-encoding-1.2.0.tgz", + "integrity": "sha512-GV0Md+8XFTfyHap6D87SKNbrgsdj4au73PLUtAJHApp+ANz8WhrBM2vdonCKrw+fmpdMoUY/NE8yMwYhWD9rYw==", + "requires": { + "buffer-alloc": "^1.1.0", + "buffer-from": "^1.0.0", + "uint64be": "^1.0.1" + } + }, + "mp4-stream": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mp4-stream/-/mp4-stream-2.0.3.tgz", + "integrity": "sha512-5NzgI0+bGakoZEwnIYINXqB3mnewkt3Y7jcvkXsTubnCNUSdM8cpP0Vemxf6FLg0qUN8fydTgNMVAc3QU8B92g==", + "requires": { + "buffer-alloc": "^1.1.0", + "inherits": "^2.0.1", + "mp4-box-encoding": "^1.1.0", + "next-event": "^1.0.0", + "readable-stream": "^2.0.3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7993,6 +8543,15 @@ } } }, + "multistream": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", + "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + } + }, "mute-stdout": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", @@ -8068,6 +8627,16 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" + }, + "next-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-event/-/next-event-1.0.0.tgz", + "integrity": "sha1-53eKzeLlWALgrRh5w5z2917aYdg=" + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", @@ -8089,6 +8658,15 @@ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", "dev": true }, + "node-abi": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", + "integrity": "sha512-b656V5C0628gOOA2kwcpNA/bxdlqYF9FvxJ+qqVX0ctdXNVZpS8J6xEUYir3WAKc7U0BH/NRlSpNbGsy+azjeg==", + "optional": true, + "requires": { + "semver": "^5.4.1" + } + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -8098,6 +8676,12 @@ "is-stream": "^1.0.1" } }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "optional": true + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -8128,11 +8712,22 @@ "once": "^1.3.2" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.8.2", @@ -8333,7 +8928,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -8395,8 +8989,7 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "1.4.0", @@ -8452,6 +9045,14 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "package-json-versionify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/package-json-versionify/-/package-json-versionify-1.0.4.tgz", + "integrity": "sha1-WGBYepRIc6a35tJujlH/siMVvxc=", + "requires": { + "browserify-package-json": "^1.0.0" + } + }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -8512,12 +9113,31 @@ "error-ex": "^1.2.0" } }, + "parse-numeric-range": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", + "integrity": "sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=" + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parse-torrent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-6.0.1.tgz", + "integrity": "sha512-triz3PBolkV8kvyV2GEvVn3wne5HayJc+C1Px3L0o1UaNBO2qlv2u6seXDrbRicmL/qL2msZap+SuzMuzNb/Kg==", + "requires": { + "bencode": "^2.0.0", + "blob-to-buffer": "^1.2.6", + "get-stdin": "^6.0.0", + "magnet-uri": "^5.1.3", + "simple-get": "^3.0.1", + "simple-sha1": "^2.0.0", + "uniq": "^1.0.1" + } + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -8572,8 +9192,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -8653,6 +9272,14 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "piece-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/piece-length/-/piece-length-1.0.0.tgz", + "integrity": "sha1-TbcWcVf9af7xTK9yYs058YmyRQg=", + "requires": { + "closest-to": "~2.0.0" + } + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -8744,6 +9371,48 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "prebuild-install": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz", + "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==", + "optional": true, + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^1.0.2", + "github-from-package": "0.0.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "node-abi": "^2.2.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "os-homedir": "^1.0.1", + "pump": "^2.0.1", + "rc": "^1.1.6", + "simple-get": "^2.7.0", + "tar-fs": "^1.13.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "optional": true, + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + } + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -8777,8 +9446,7 @@ "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "progress": { "version": "2.0.0", @@ -8831,7 +9499,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -8891,6 +9558,28 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" }, + "random-access-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-2.0.1.tgz", + "integrity": "sha512-nb4fClpzoUY+v1SHrro+9yykN90eMA1rc+xM39tnZ5R3BgFY+J/NxPZ0KuUpishEsvnwou9Fvm2wa3cjeuG7vg==", + "requires": { + "mkdirp": "^0.5.1", + "random-access-storage": "^1.1.1" + } + }, + "random-access-storage": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-1.3.0.tgz", + "integrity": "sha512-pdS9Mcb9TB7oICypPRALlheaSuszuAKmLVEPKJMuYor7R/zDuHh5ALuQoS+ox31XRwQUL+tDwWH2GPdyspwelA==", + "requires": { + "inherits": "^2.0.3" + } + }, + "random-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz", + "integrity": "sha1-99l9kt7mZl7F9toIx/ljytSyrJk=" + }, "random-number": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/random-number/-/random-number-0.0.9.tgz", @@ -8930,7 +9619,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -8948,8 +9636,16 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "range-slice-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-slice-stream/-/range-slice-stream-1.2.0.tgz", + "integrity": "sha1-AbqVQnYFK3g5AOY9YRjY/POHXX8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + } }, "raw-body": { "version": "2.3.3", @@ -8974,6 +9670,26 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, "react": { "version": "16.4.1", "resolved": "https://registry.npmjs.org/react/-/react-16.4.1.tgz", @@ -9106,7 +9822,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9138,6 +9853,11 @@ "resolve": "^1.1.6" } }, + "record-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.1.0.tgz", + "integrity": "sha512-u8rbtLEJV7HRacl/ZYwSBFD8NFyB3PfTTfGLP37IW3hftQCwu6z4Q2RLyxo1YJUNRTEzJfpLpGwVuEYdaIkG9Q==" + }, "redux": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.0.tgz", @@ -9269,6 +9989,18 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, + "render-media": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/render-media/-/render-media-3.1.0.tgz", + "integrity": "sha512-rTNcgMHJ/MrQbt96bTTwlfBY1A87EqNx0buJ2pPHTuLGwk0Aw99e1BrHgr6SpB4D7Cb7AMdiL/Gzx+UYrHliVw==", + "requires": { + "debug": "^3.1.0", + "is-ascii": "^1.0.0", + "mediasource": "^2.1.0", + "stream-to-blob-url": "^2.0.0", + "videostream": "^2.3.0" + } + }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", @@ -9489,7 +10221,6 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -9513,6 +10244,26 @@ "is-promise": "^2.1.0" } }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "run-parallel-limit": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.0.5.tgz", + "integrity": "sha512-NsY+oDngvrvMxKB3G8ijBzIema6aYbQMD2bHOamvN52BysbIGTnEY2xsNyfrcr9GhY995/t/0nQN3R3oZvaDlg==" + }, + "run-series": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.8.tgz", + "integrity": "sha512-+GztYEPRpIsQoCSraWHDBs9WVy4eVME16zhOtDB4H9J4xN0XRhknnmLOl+4gRgZtu8dpp9N/utSPjKH/xmDzXg==" + }, + "rusha": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", + "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=" + }, "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", @@ -9539,8 +10290,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safe-regex": { "version": "1.1.0", @@ -9571,8 +10321,7 @@ "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" }, "semver-greatest-satisfied-range": { "version": "1.1.0", @@ -9668,8 +10417,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", @@ -9772,14 +10520,95 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "simple-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.0.2.tgz", + "integrity": "sha512-dU3TBVIGkP5Hzw6o74hJx+VzTBTX2rqIiLfugs0HdmdVQCQp76XGg2jlBCqfRJfW/n6/mUKTi+s3rnzX7SgbBA==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-peer": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.1.2.tgz", + "integrity": "sha512-MUWWno5o5cvISKOH4pYQ18PQJLpDaNWoKUbrPPKuspCLCkkh+zhtuQyTE8h2U2Ags+/OUN5wnUe92+9B8/Sm2Q==", + "requires": { + "debug": "^3.1.0", + "get-browser-rtc": "^1.0.0", + "inherits": "^2.0.1", + "randombytes": "^2.0.3", + "readable-stream": "^2.3.4" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "simple-sha1": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.1.tgz", + "integrity": "sha512-pFMPd+I/lQkpf4wFUeS/sED5IqdIG1lUlrQviBMV4u4mz8BRAcB5fvUx5Ckfg3kBigEglAjHg7E9k/yy2KlCqA==", + "requires": { + "rusha": "^0.8.1" + } + }, + "simple-websocket": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-7.0.2.tgz", + "integrity": "sha512-cAjSaqHMtO2qc1HHSrW44aTrb2Xa7wZzHajvH6An4IhCFjTuPUXfmSByd9Z0B5Bc6bmiwQ2bFHMUMA8vGC5Bug==", + "requires": { + "debug": "^3.1.0", + "inherits": "^2.0.1", + "randombytes": "^2.0.3", + "readable-stream": "^2.0.5", + "safe-buffer": "^5.0.1", + "ws": "^4.0.0" + }, + "dependencies": { + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + } + } }, "slash": { "version": "1.0.0", @@ -10114,6 +10943,11 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "speedometer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz", + "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==" + }, "split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -10294,11 +11128,34 @@ "limiter": "^1.0.5" } }, + "stream-to-blob": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-to-blob/-/stream-to-blob-1.0.1.tgz", + "integrity": "sha512-aRy4neA4rf+qMtLT9fCRLPGWdrsIKtCx4kUdNTIPgPQ2hkHkdxbViVAvABMx9oRM6yCWfngHx6pwXfbYkVuPuw==", + "requires": { + "once": "^1.3.3" + } + }, + "stream-to-blob-url": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/stream-to-blob-url/-/stream-to-blob-url-2.1.1.tgz", + "integrity": "sha512-DKJPEmCmIZoBfGVle9IhSfERiWaN5cuOtmfPxP2dZbLDRZxkBWZ4QbYxEJOSALk1Kf+WjBgedAMO6qkkf7Lmrg==", + "requires": { + "stream-to-blob": "^1.0.0" + } + }, + "stream-with-known-length-to-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-with-known-length-to-buffer/-/stream-with-known-length-to-buffer-1.0.2.tgz", + "integrity": "sha512-UxSISjxmguvfYzZdq6d4XAjc3gAocqTIOS1CjgwkDkkGT/LMTsIYiV8agIw42IHFFHf8k4lPOoroCCf4W9oqzg==", + "requires": { + "once": "^1.3.3" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -10326,11 +11183,19 @@ } } }, + "string2compact": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/string2compact/-/string2compact-1.2.5.tgz", + "integrity": "sha512-WujFln3AWQhpd/0UXjR8Ctcy/lCCb1jmED8h1Loa6938stww6LSSuP7FWqTMFlb4dxn/6l54jrAqlJhIAUlBWw==", + "requires": { + "addr-to-ip-port": "^1.0.1", + "ipaddr.js": "^1.0.1" + } + }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -10355,8 +11220,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "stylus": { "version": "0.54.5", @@ -10526,6 +11390,45 @@ } } }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "optional": true, + "requires": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + }, + "dependencies": { + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "optional": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" + } + }, "ternary-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", @@ -10554,11 +11457,15 @@ "object-path": "^0.9.0" } }, + "thirty-two": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", + "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno=" + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.3", @@ -10580,6 +11487,11 @@ "xtend": "~4.0.0" } }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=" + }, "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", @@ -10623,8 +11535,13 @@ "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "optional": true }, "to-fast-properties": { "version": "1.0.3", @@ -10687,6 +11604,24 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" }, + "torrent-discovery": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/torrent-discovery/-/torrent-discovery-8.4.1.tgz", + "integrity": "sha512-PHy/H+S2pxBMK8ZdiZxp16mIPfs50rdzYjOWJLJg974BCE/VbdxHirQv117kVl9STKKXKZWo5NADGAYfmIXH0w==", + "requires": { + "bittorrent-dht": "^8.0.1", + "bittorrent-tracker": "^9.0.0", + "debug": "^3.1.0", + "inherits": "^2.0.1", + "run-parallel": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "torrent-piece": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/torrent-piece/-/torrent-piece-1.1.2.tgz", + "integrity": "sha512-ElXPyXKKG73o+uziHJ8qlYE9EuyDVxnK2zWL+pW/2bma7RsLpSwFFIJAb8Qui7/tel2hsHQW1z3zBnfQNREpWA==" + }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", @@ -10712,7 +11647,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -10743,7 +11677,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "optional": true, "requires": { "is-typedarray": "^1.0.0" } @@ -10809,6 +11742,11 @@ "dev": true, "optional": true }, + "uint64be": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-1.0.1.tgz", + "integrity": "sha1-H3FUIC8qG4rzU4cd2mUb80zpPpU=" + }, "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", @@ -10897,6 +11835,11 @@ } } }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, "unique-stream": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", @@ -10913,6 +11856,11 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, + "unordered-array-remove": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", + "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -11027,6 +11975,30 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "ut_metadata": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/ut_metadata/-/ut_metadata-3.2.2.tgz", + "integrity": "sha512-PltK6kZ85DMscFl1gwyvOyja6UGROdyLI1ufWCTLsYnLfBaMyhtOEcbtgEgOwYEz8QuchR49qgHXTdJ2H05VHA==", + "requires": { + "bencode": "^2.0.0", + "bitfield": "^2.0.0", + "debug": "^3.1.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1", + "simple-sha1": "^2.0.0" + } + }, + "ut_pex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ut_pex/-/ut_pex-1.2.1.tgz", + "integrity": "sha512-ZrxMCbffYtxQDqvREN9kBXK2CB9tPnd5PylHoqQX9ai+3HV9/S39FnA5JnhLOC82dxIQQg0nTN2wmhtAdGNtOA==", + "requires": { + "bencode": "^2.0.0", + "compact2string": "^1.2.0", + "inherits": "^2.0.1", + "string2compact": "^1.2.5" + } + }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -11039,8 +12011,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -11090,6 +12061,32 @@ "extsprintf": "^1.2.0" } }, + "videostream": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/videostream/-/videostream-2.4.3.tgz", + "integrity": "sha512-8AkDc1SBg3kw8+hHImYKtSamjKfJxMHuCXIcXvCFOAWGU7IcW41hxx7K7bU/tC6zWEck/tgB1rXLxf6o5Pn79Q==", + "requires": { + "binary-search": "^1.2.0", + "inherits": "^2.0.1", + "mediasource": "^2.0.0", + "mp4-box-encoding": "^1.1.1", + "mp4-stream": "^2.0.0", + "multistream": "^2.0.2", + "pump": "^1.0.1", + "range-slice-stream": "^1.2.0" + }, + "dependencies": { + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", @@ -11282,6 +12279,72 @@ } } }, + "webtorrent": { + "version": "0.101.0", + "resolved": "https://registry.npmjs.org/webtorrent/-/webtorrent-0.101.0.tgz", + "integrity": "sha512-GV1m2Mm/TMj5pE6TjopSFpZm8DOJrqR8L8G58vLlh33zHDZmnwRnLp3lMcWLpUNpDqALwt3A8OaaOBUmJhSipg==", + "requires": { + "addr-to-ip-port": "^1.4.2", + "bitfield": "^2.0.0", + "bittorrent-dht": "^8.0.0", + "bittorrent-protocol": "^2.1.5", + "chunk-store-stream": "^2.0.2", + "create-torrent": "^3.24.5", + "debug": "^3.1.0", + "end-of-stream": "^1.1.0", + "fs-chunk-store": "^1.6.2", + "immediate-chunk-store": "^1.0.8", + "inherits": "^2.0.1", + "load-ip-set": "^1.2.7", + "memory-chunk-store": "^1.2.0", + "mime": "^2.2.0", + "multistream": "^2.0.5", + "package-json-versionify": "^1.0.2", + "parse-numeric-range": "^0.0.2", + "parse-torrent": "^6.0.0", + "pump": "^3.0.0", + "random-iterate": "^1.0.1", + "randombytes": "^2.0.3", + "range-parser": "^1.2.0", + "readable-stream": "^2.1.4", + "render-media": "^3.0.0", + "run-parallel": "^1.1.6", + "run-parallel-limit": "^1.0.3", + "safe-buffer": "^5.0.1", + "simple-concat": "^1.0.0", + "simple-get": "^3.0.1", + "simple-peer": "^9.0.0", + "simple-sha1": "^2.0.8", + "speedometer": "^1.0.0", + "stream-to-blob": "^1.0.0", + "stream-to-blob-url": "^2.1.0", + "stream-with-known-length-to-buffer": "^1.0.0", + "torrent-discovery": "^8.3.1", + "torrent-piece": "^1.1.0", + "uniq": "^1.0.1", + "unordered-array-remove": "^1.0.2", + "ut_metadata": "^3.0.8", + "ut_pex": "^1.1.1", + "xtend": "^4.0.1", + "zero-fill": "^2.2.3" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "whatwg-fetch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", @@ -11308,6 +12371,21 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "wildemitter": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/wildemitter/-/wildemitter-1.2.0.tgz", @@ -11338,8 +12416,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", @@ -11370,8 +12447,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", @@ -11437,6 +12513,11 @@ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "dev": true + }, + "zero-fill": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/zero-fill/-/zero-fill-2.2.3.tgz", + "integrity": "sha1-o97wa6XjmuZEhQu0yirUEStIVek=" } } } diff --git a/app/package.json b/app/package.json index 97890a2..dfc9b8e 100644 --- a/app/package.json +++ b/app/package.json @@ -11,6 +11,7 @@ "classnames": "^2.2.6", "debug": "^3.1.0", "domready": "^1.0.8", + "drag-drop": "^4.2.0", "fscreen": "^1.0.2", "hark": "^1.2.2", "js-cookie": "^2.2.0", @@ -33,7 +34,8 @@ "redux-thunk": "^2.3.0", "resize-observer-polyfill": "^1.5.0", "riek": "^1.1.0", - "url-parse": "^1.4.1" + "url-parse": "^1.4.1", + "webtorrent": "^0.101.0" }, "devDependencies": { "babel-core": "^6.26.3", From 7112880ac051e8918162a17bd1fa9a7a1b68a46d Mon Sep 17 00:00:00 2001 From: Torjus Date: Thu, 26 Jul 2018 16:23:42 +0200 Subject: [PATCH 02/40] Automatically save file when downloaded --- app/lib/components/Chat/FileChatEntry.jsx | 78 +++++++++++++++++++++++ app/lib/components/Chat/FileSharing.jsx | 1 - app/lib/components/Chat/MessageList.jsx | 5 +- app/package-lock.json | 5 ++ app/package.json | 1 + 5 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 app/lib/components/Chat/FileChatEntry.jsx diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx new file mode 100644 index 0000000..121caa4 --- /dev/null +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -0,0 +1,78 @@ +import React, { Component, Fragment } from 'react'; +import WebTorrent from 'webtorrent'; +import { saveAs } from 'file-saver/FileSaver'; + +class FileChatEntry extends Component +{ + constructor(props) + { + super(props); + + this.client = new WebTorrent(); + } + + state = { + active: false, + numPeers: 0, + progress: 0 + }; + + download = () => + { + this.setState({ + active: true + }); + + this.client.add(this.props.message.file.magnet, (torrent) => + { + const onProgress = () => + { + this.setState({ + numPeers: torrent.numPeers, + progress: Math.round(torrent.progress * 100 * 100) / 100 + }); + }; + + setInterval(onProgress, 500); + onProgress(); + + torrent.on('done', () => { + onProgress(); + + torrent.files.forEach((file) => { + file.getBlob((err, blob) => { + if (err) + { + console.error('webtorrent error!!!'); + return; + } + + saveAs(blob); + }); + }); + }); + }); + } + + render() + { + return ( + +
+ + + {this.state.active && ( +
+ peers: {this.state.numPeers} + progress: {this.state.progress} +
+ )} +
+
+ ); + } +} + +export default FileChatEntry; \ No newline at end of file diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index 08142d7..650dfec 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -49,7 +49,6 @@ const mapDispatchToProps = (dispatch) => ({ notifyPeers: (file, displayName, picture) => { - console.log(file) dispatch(stateActions.addUserFile(file)); dispatch(requestActions.sendChatFile(file, displayName, picture)); } diff --git a/app/lib/components/Chat/MessageList.jsx b/app/lib/components/Chat/MessageList.jsx index 9c1f8d9..ed38979 100644 --- a/app/lib/components/Chat/MessageList.jsx +++ b/app/lib/components/Chat/MessageList.jsx @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import marked from 'marked'; import { connect } from 'react-redux'; +import FileChatEntry from './FileChatEntry'; const scrollToBottom = () => { @@ -73,9 +74,7 @@ class MessageList extends Component )} {message.type === 'file' && ( -
- {message.file.magnet} -
+ )}
diff --git a/app/package-lock.json b/app/package-lock.json index 514c844..73e9b4b 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -4344,6 +4344,11 @@ "object-assign": "^4.0.1" } }, + "file-saver": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", + "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", diff --git a/app/package.json b/app/package.json index dfc9b8e..2a2dda2 100644 --- a/app/package.json +++ b/app/package.json @@ -12,6 +12,7 @@ "debug": "^3.1.0", "domready": "^1.0.8", "drag-drop": "^4.2.0", + "file-saver": "^1.3.8", "fscreen": "^1.0.2", "hark": "^1.2.2", "js-cookie": "^2.2.0", From f64ff1b030f202234c2b10683e634f52496746bb Mon Sep 17 00:00:00 2001 From: Torjus Date: Thu, 26 Jul 2018 16:33:20 +0200 Subject: [PATCH 03/40] Share WebTorrent client between multiple components --- app/lib/components/Chat/Chat.jsx | 12 ++++++++++-- app/lib/components/Chat/FileChatEntry.jsx | 9 +-------- app/lib/components/Chat/FileSharing.jsx | 4 +--- app/lib/components/Chat/MessageList.jsx | 2 +- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/app/lib/components/Chat/Chat.jsx b/app/lib/components/Chat/Chat.jsx index 87480ee..620e6e4 100644 --- a/app/lib/components/Chat/Chat.jsx +++ b/app/lib/components/Chat/Chat.jsx @@ -5,9 +5,17 @@ import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import MessageList from './MessageList'; import FileSharing from './FileSharing'; +import WebTorrent from 'webtorrent'; class Chat extends Component { + constructor(props) + { + super(props); + + this.client = new WebTorrent(); + } + render() { const { @@ -21,9 +29,9 @@ class Chat extends Component return (
- + - + + this.props.client.add(this.props.message.file.magnet, (torrent) => { const onProgress = () => { diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index 650dfec..f2d7514 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -17,11 +17,9 @@ class FileSharing extends Component { componentDidMount() { - this.client = new WebTorrent(); - dragDrop('body', (files) => { - this.client.seed(files, (torrent) => { + this.props.client.seed(files, (torrent) => { this.notifyPeers({ magnet: torrent.magnetURI }); diff --git a/app/lib/components/Chat/MessageList.jsx b/app/lib/components/Chat/MessageList.jsx index ed38979..4610b80 100644 --- a/app/lib/components/Chat/MessageList.jsx +++ b/app/lib/components/Chat/MessageList.jsx @@ -74,7 +74,7 @@ class MessageList extends Component )} {message.type === 'file' && ( - + )}
From 8129cc0753b9240d45375abba42a09b7e4a5fd81 Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 09:42:09 +0200 Subject: [PATCH 04/40] Add buttons to download specific files --- app/lib/components/Chat/FileChatEntry.jsx | 41 +++++++++++++++++------ 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index df3e8b8..07bec45 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -2,12 +2,28 @@ import React, { Component, Fragment } from 'react'; import WebTorrent from 'webtorrent'; import { saveAs } from 'file-saver/FileSaver'; +const saveFile = (file) => +{ + file.getBlob((err, blob) => + { + if (err) + { + console.error('WebTorrent error'); + return; + } + + console.log('TRYING TO SAVE BLOB', blob) + saveAs(blob, file.name); + }); +}; + class FileChatEntry extends Component { state = { active: false, numPeers: 0, - progress: 0 + progress: 0, + files: null }; download = () => @@ -31,17 +47,10 @@ class FileChatEntry extends Component torrent.on('done', () => { onProgress(); + clearInterval(onProgress); - torrent.files.forEach((file) => { - file.getBlob((err, blob) => { - if (err) - { - console.error('webtorrent error!!!'); - return; - } - - saveAs(blob); - }); + this.setState({ + files: torrent.files }); }); }); @@ -62,6 +71,16 @@ class FileChatEntry extends Component progress: {this.state.progress}
)} + + {this.state.files && ( +
+ {this.state.files.map((file, i) => ( +
+ +
+ ))} +
+ )}
); From 734bb1eb0a03d03e0c8cafd8f9f382ff09e0f7d6 Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 10:47:49 +0200 Subject: [PATCH 05/40] Add file select input in addition to drag n drop --- app/lib/components/Chat/Chat.jsx | 12 +--- app/lib/components/Chat/FileChatEntry.jsx | 4 +- app/lib/components/Chat/FileSharing.jsx | 73 ++++++++++------------- app/lib/components/Chat/MessageList.jsx | 2 +- app/lib/index.jsx | 46 +------------- app/lib/store.js | 48 +++++++++++++++ 6 files changed, 87 insertions(+), 98 deletions(-) create mode 100644 app/lib/store.js diff --git a/app/lib/components/Chat/Chat.jsx b/app/lib/components/Chat/Chat.jsx index 620e6e4..87480ee 100644 --- a/app/lib/components/Chat/Chat.jsx +++ b/app/lib/components/Chat/Chat.jsx @@ -5,17 +5,9 @@ import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import MessageList from './MessageList'; import FileSharing from './FileSharing'; -import WebTorrent from 'webtorrent'; class Chat extends Component { - constructor(props) - { - super(props); - - this.client = new WebTorrent(); - } - render() { const { @@ -29,9 +21,9 @@ class Chat extends Component return (
- + - + { @@ -32,7 +32,7 @@ class FileChatEntry extends Component active: true }); - this.props.client.add(this.props.message.file.magnet, (torrent) => + client.add(this.props.message.file.magnet, (torrent) => { const onProgress = () => { diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index f2d7514..51cc1a6 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -4,55 +4,48 @@ import WebTorrent from 'webtorrent'; import dragDrop from 'drag-drop'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; +import { store } from '../../store'; + +export const client = new WebTorrent(); + +const notifyPeers = (file) => +{ + const { displayName, picture } = store.getState().me; + store.dispatch(stateActions.addUserFile(file)); + store.dispatch(requestActions.sendChatFile(file, displayName, picture)); +}; + +const shareFiles = (files) => +{ + client.seed(files, (torrent) => { + notifyPeers({ + magnet: torrent.magnetURI + }); + }); +}; + +dragDrop('body', shareFiles); class FileSharing extends Component { - notifyPeers = (file) => + constructor(props) { - this.props.notifyPeers( - file, - this.props.displayName, - this.props.picture - ); - }; - - componentDidMount() - { - dragDrop('body', (files) => - { - this.props.client.seed(files, (torrent) => { - this.notifyPeers({ - magnet: torrent.magnetURI - }); - }); - }); + super(props); } + handleFileChange = (event) => + { + if (event.target.files.length > 0) + { + shareFiles(event.target.files); + } + }; + render() { return ( -
- drag & drop files to share them!!! -
+ ); } } -const mapStateToProps = (state) => - ({ - displayName: state.me.displayName, - picture: state.me.picture - }); - -const mapDispatchToProps = (dispatch) => - ({ - notifyPeers: (file, displayName, picture) => - { - dispatch(stateActions.addUserFile(file)); - dispatch(requestActions.sendChatFile(file, displayName, picture)); - } - }); - -export default connect( - mapStateToProps, - mapDispatchToProps -)(FileSharing); \ No newline at end of file +export default FileSharing; \ No newline at end of file diff --git a/app/lib/components/Chat/MessageList.jsx b/app/lib/components/Chat/MessageList.jsx index 4610b80..ed38979 100644 --- a/app/lib/components/Chat/MessageList.jsx +++ b/app/lib/components/Chat/MessageList.jsx @@ -74,7 +74,7 @@ class MessageList extends Component )} {message.type === 'file' && ( - + )}
diff --git a/app/lib/index.jsx b/app/lib/index.jsx index e4ba0fa..6ab6183 100644 --- a/app/lib/index.jsx +++ b/app/lib/index.jsx @@ -3,13 +3,6 @@ import UrlParse from 'url-parse'; import React from 'react'; import { render } from 'react-dom'; import { Provider } from 'react-redux'; -import { - applyMiddleware as applyReduxMiddleware, - createStore as createReduxStore, - compose as composeRedux -} from 'redux'; -import thunk from 'redux-thunk'; -import { createLogger as createReduxLogger } from 'redux-logger'; import { getDeviceInfo } from 'mediasoup-client'; import randomString from 'random-string'; import Logger from './Logger'; @@ -17,48 +10,11 @@ import * as utils from './utils'; import * as cookiesManager from './cookiesManager'; import * as requestActions from './redux/requestActions'; import * as stateActions from './redux/stateActions'; -import reducers from './redux/reducers'; -import roomClientMiddleware from './redux/roomClientMiddleware'; import Room from './components/Room'; import { loginEnabled } from '../config'; +import { store } from './store'; const logger = new Logger(); -const reduxMiddlewares = -[ - thunk, - roomClientMiddleware -]; - -if (process.env.NODE_ENV === 'development') -{ - const reduxLogger = createReduxLogger( - { - duration : true, - timestamp : false, - level : 'log', - logErrors : true - }); - - reduxMiddlewares.push(reduxLogger); -} - -const composeEnhancers = -typeof window === 'object' && -window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? - window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ - // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize... - }) : composeRedux; - -const enhancer = composeEnhancers( - applyReduxMiddleware(...reduxMiddlewares) - // other store enhancers if any -); - -const store = createReduxStore( - reducers, - undefined, - enhancer -); domready(() => { diff --git a/app/lib/store.js b/app/lib/store.js new file mode 100644 index 0000000..d4ee190 --- /dev/null +++ b/app/lib/store.js @@ -0,0 +1,48 @@ +import { + applyMiddleware, + createStore, + compose +} from 'redux'; +import thunk from 'redux-thunk'; +import { createLogger } from 'redux-logger'; +import reducers from './redux/reducers'; +import roomClientMiddleware from './redux/roomClientMiddleware'; + +const reduxMiddlewares = +[ + thunk, + roomClientMiddleware +]; + +if (process.env.NODE_ENV === 'development') +{ + const reduxLogger = createLogger( + { + duration : true, + timestamp : false, + level : 'log', + logErrors : true + }); + + reduxMiddlewares.push(reduxLogger); +} + +const composeEnhancers = +typeof window === 'object' && +window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? + window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ + // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize... + }) : compose; + +const enhancer = composeEnhancers( + applyMiddleware(...reduxMiddlewares) + // other store enhancers if any +); + +export const store = createStore( + reducers, + undefined, + enhancer +); + +console.log(store); \ No newline at end of file From 088f3ccc7cae2d7a0feae3829beae46134007ccf Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 11:06:42 +0200 Subject: [PATCH 06/40] Add notification when Blob converting fails --- app/lib/components/Chat/FileChatEntry.jsx | 160 ++++++++++++---------- app/lib/components/Chat/FileSharing.jsx | 58 ++++---- app/lib/redux/reducers/helper.js | 4 +- app/lib/redux/requestActions.js | 4 +- app/lib/redux/stateActions.js | 4 +- 5 files changed, 122 insertions(+), 108 deletions(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index 922a17e..d2d397d 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -1,90 +1,102 @@ import React, { Component, Fragment } from 'react'; +import { connect } from 'react-redux'; +import { notifyAction } from '../../redux/stateActions'; import { saveAs } from 'file-saver/FileSaver'; import { client } from './FileSharing'; -const saveFile = (file) => -{ - file.getBlob((err, blob) => - { - if (err) - { - console.error('WebTorrent error'); - return; - } - - console.log('TRYING TO SAVE BLOB', blob) - saveAs(blob, file.name); - }); -}; - class FileChatEntry extends Component { - state = { - active: false, - numPeers: 0, - progress: 0, - files: null - }; + state = { + active : false, + numPeers : 0, + progress : 0, + files : null + }; - download = () => - { - this.setState({ - active: true - }); + saveFile = (file) => + { + file.getBlob((err, blob) => + { + if (err) + { + return this.props.notify({ + text : 'An error occurred while saving a file' + }); + } + + saveAs(blob, file.name); + }); + }; - client.add(this.props.message.file.magnet, (torrent) => - { - const onProgress = () => - { - this.setState({ - numPeers: torrent.numPeers, - progress: Math.round(torrent.progress * 100 * 100) / 100 - }); - }; + download = () => + { + this.setState({ + active : true + }); - setInterval(onProgress, 500); - onProgress(); + client.add(this.props.message.file.magnet, (torrent) => + { + const onProgress = () => + { + this.setState({ + numPeers : torrent.numPeers, + progress : Math.round(torrent.progress * 100 * 100) / 100 + }); + }; - torrent.on('done', () => { - onProgress(); - clearInterval(onProgress); + setInterval(onProgress, 500); + onProgress(); - this.setState({ - files: torrent.files - }); - }); - }); - } + torrent.on('done', () => + { + onProgress(); + clearInterval(onProgress); - render() - { - return ( - -
- + this.setState({ + files : torrent.files + }); + }); + }); + } - {this.state.active && ( -
- peers: {this.state.numPeers} - progress: {this.state.progress} -
- )} + render() + { + return ( + +
+ - {this.state.files && ( -
- {this.state.files.map((file, i) => ( -
- -
- ))} -
- )} -
-
- ); - } + {this.state.active && ( +
+ peers: {this.state.numPeers} + progress: {this.state.progress} +
+ )} + + {this.state.files && ( +
+ {this.state.files.map((file, i) => ( +
+ +
+ ))} +
+ )} +
+
+ ); + } } -export default FileChatEntry; \ No newline at end of file +const mapDispatchToProps = { + notify : notifyAction +}; + +export default connect( + undefined, + mapDispatchToProps +)(FileChatEntry); \ No newline at end of file diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index 51cc1a6..9beaf37 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -1,51 +1,53 @@ import React, { Component } from 'react'; -import { connect } from 'react-redux'; import WebTorrent from 'webtorrent'; import dragDrop from 'drag-drop'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; -import { store } from '../../store'; +import { store } from '../../store'; export const client = new WebTorrent(); const notifyPeers = (file) => { - const { displayName, picture } = store.getState().me; - store.dispatch(stateActions.addUserFile(file)); - store.dispatch(requestActions.sendChatFile(file, displayName, picture)); + const { displayName, picture } = store.getState().me; + + store.dispatch(stateActions.addUserFile(file)); + store.dispatch(requestActions.sendChatFile(file, displayName, picture)); }; const shareFiles = (files) => { - client.seed(files, (torrent) => { - notifyPeers({ - magnet: torrent.magnetURI - }); - }); + client.seed(files, (torrent) => + { + notifyPeers({ + magnet : torrent.magnetURI + }); + }); }; dragDrop('body', shareFiles); -class FileSharing extends Component { - constructor(props) - { - super(props); - } +class FileSharing extends Component +{ + constructor(props) + { + super(props); + } - handleFileChange = (event) => - { - if (event.target.files.length > 0) - { - shareFiles(event.target.files); - } - }; + handleFileChange = (event) => + { + if (event.target.files.length > 0) + { + shareFiles(event.target.files); + } + }; - render() - { - return ( - - ); - } + render() + { + return ( + + ); + } } export default FileSharing; \ No newline at end of file diff --git a/app/lib/redux/reducers/helper.js b/app/lib/redux/reducers/helper.js index 2ca3709..eb7864e 100644 --- a/app/lib/redux/reducers/helper.js +++ b/app/lib/redux/reducers/helper.js @@ -13,9 +13,9 @@ export function createNewMessage(text, sender, name, picture) export function createNewFile(file, sender, name, picture) { return { - type: 'file', + type : 'file', file, - time: Date.now(), + time : Date.now(), name, sender, picture diff --git a/app/lib/redux/requestActions.js b/app/lib/redux/requestActions.js index e748d6d..465ef35 100644 --- a/app/lib/redux/requestActions.js +++ b/app/lib/redux/requestActions.js @@ -219,8 +219,8 @@ export const sendChatFile = (magnet, name, picture) => const message = createNewFile(magnet, 'response', name, picture); return { - type: 'SEND_CHAT_MESSAGE', - payload: { message } + type : 'SEND_CHAT_MESSAGE', + payload : { message } }; }; diff --git a/app/lib/redux/stateActions.js b/app/lib/redux/stateActions.js index 5d4d87e..27314eb 100644 --- a/app/lib/redux/stateActions.js +++ b/app/lib/redux/stateActions.js @@ -413,8 +413,8 @@ export const addUserMessage = (text) => export const addUserFile = (file) => { return { - type: 'ADD_NEW_USER_FILE', - payload: { file } + type : 'ADD_NEW_USER_FILE', + payload : { file } }; }; From 2cf1ea5069ca7350d2634ae53d473abb1392b7dc Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 11:20:14 +0200 Subject: [PATCH 07/40] Allow selecting multiple files in file input --- app/lib/components/Chat/FileSharing.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index 9beaf37..63a60db 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -45,7 +45,7 @@ class FileSharing extends Component render() { return ( - + ); } } From 9a72d6c09340205083344a7a041241128db37fcf Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 11:24:13 +0200 Subject: [PATCH 08/40] Use button for adding files instead of raw input element --- app/lib/components/Chat/FileSharing.jsx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index 63a60db..60bd479 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -32,6 +32,8 @@ class FileSharing extends Component constructor(props) { super(props); + + this.fileInput = React.createRef(); } handleFileChange = (event) => @@ -42,10 +44,27 @@ class FileSharing extends Component } }; + handleClick = () => + { + // We want to open the file dialog when we click a button + // instead of actually rendering the input element itself. + this.fileInput.current.click(); + }; + render() { return ( - +
+ + + +
); } } From fa9cc0468e0ee42fe70f94adc79f0585020c7073 Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 11:33:14 +0200 Subject: [PATCH 09/40] Fix chat styling --- app/lib/components/Chat/MessageList.jsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/lib/components/Chat/MessageList.jsx b/app/lib/components/Chat/MessageList.jsx index ed38979..f7d5523 100644 --- a/app/lib/components/Chat/MessageList.jsx +++ b/app/lib/components/Chat/MessageList.jsx @@ -49,8 +49,6 @@ class MessageList extends Component { chatmessages.map((message, i) => { - console.log(message); - const messageTime = new Date(message.time); const picture = (message.sender === 'response' ? @@ -76,11 +74,11 @@ class MessageList extends Component {message.type === 'file' && ( )} - - - {message.name} - {this.getTimeString(messageTime)} - + + {message.name} - {this.getTimeString(messageTime)} + + ); From 24f51cab8d85c87787fac9793f4bd2ffbd4064fa Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 12:02:53 +0200 Subject: [PATCH 10/40] Slightly improve downloading UI --- app/lib/components/Chat/FileChatEntry.jsx | 28 +++++++++++++++-------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index d2d397d..a0890ba 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -40,7 +40,7 @@ class FileChatEntry extends Component { this.setState({ numPeers : torrent.numPeers, - progress : Math.round(torrent.progress * 100 * 100) / 100 + progress : torrent.progress }); }; @@ -53,7 +53,8 @@ class FileChatEntry extends Component clearInterval(onProgress); this.setState({ - files : torrent.files + files : torrent.files, + active: false }); }); }); @@ -64,23 +65,32 @@ class FileChatEntry extends Component return (
- + {!this.state.active && !this.state.files && ( + +

A new file was shared.

- {this.state.active && ( + +
+ )} + + {this.state.active && this.state.numPeers === 0 && (
- peers: {this.state.numPeers} - progress: {this.state.progress} + Locating peers
)} + {this.state.active && this.state.numPeers > 0 && ( + + )} + {this.state.files && (
{this.state.files.map((file, i) => (
))} From 97a112ed12068040c1b76b600cdad6defe08d5cb Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 12:14:02 +0200 Subject: [PATCH 11/40] Move file sharing input inside form element --- app/lib/components/Chat/Chat.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/components/Chat/Chat.jsx b/app/lib/components/Chat/Chat.jsx index 87480ee..6a50433 100644 --- a/app/lib/components/Chat/Chat.jsx +++ b/app/lib/components/Chat/Chat.jsx @@ -23,12 +23,12 @@ class Chat extends Component
- - { onSendMessage(e, displayName, picture); }} > + + Date: Fri, 27 Jul 2018 12:44:35 +0200 Subject: [PATCH 12/40] Add notification when files are shared --- app/lib/RoomClient.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/lib/RoomClient.js b/app/lib/RoomClient.js index 7ac80e3..d22ce01 100644 --- a/app/lib/RoomClient.js +++ b/app/lib/RoomClient.js @@ -1117,6 +1117,16 @@ export default class RoomClient this._dispatch( stateActions.addResponseMessage({ ...chatMessage, peerName })); + const toolAreaState = this._getState().toolarea; + + // Notify about the new file, unless the chat is open. + if (chatMessage.file && !(toolAreaState.toolAreaOpen && toolAreaState.currentToolTab === 'chat')) + { + this._dispatch( + requestActions.notify({ text: `${chatMessage.name} shared a file` }) + ); + } + break; } From 9f9d2c1c655667f31efcaef59a0110e595db776c Mon Sep 17 00:00:00 2001 From: Torjus Date: Fri, 27 Jul 2018 15:11:53 +0200 Subject: [PATCH 13/40] Improve duplicate torrent handling --- app/lib/components/Chat/FileChatEntry.jsx | 71 ++++++++++++++++------- app/lib/components/Chat/FileSharing.jsx | 34 ++++++++--- app/package-lock.json | 6 +- app/package.json | 1 + 4 files changed, 80 insertions(+), 32 deletions(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index a0890ba..b36cf72 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -28,36 +28,63 @@ class FileChatEntry extends Component }); }; + handleTorrent = (torrent) => + { + // Torrent already done, this can happen if the + // same file was sent multiple times. + if (torrent.progress === 1) + { + this.setState({ + files: torrent.files, + numPeers: torrent.numPeers, + progress: 1, + active: false + }); + + return; + } + + const onProgress = () => + { + this.setState({ + numPeers : torrent.numPeers, + progress : torrent.progress + }); + }; + + onProgress(); + + setInterval(onProgress, 500); + + torrent.on('done', () => + { + onProgress(); + clearInterval(onProgress); + + this.setState({ + files : torrent.files, + active: false + }); + }); + }; + download = () => { this.setState({ active : true }); + + const magnet = this.props.message.file.magnet; - client.add(this.props.message.file.magnet, (torrent) => + const existingTorrent = client.get(magnet); + + if (existingTorrent) { - const onProgress = () => - { - this.setState({ - numPeers : torrent.numPeers, - progress : torrent.progress - }); - }; + // Never add duplicate torrents, use the existing one instead. + return this.handleTorrent(existingTorrent); + } - setInterval(onProgress, 500); - onProgress(); - - torrent.on('done', () => - { - onProgress(); - clearInterval(onProgress); - - this.setState({ - files : torrent.files, - active: false - }); - }); - }); + client.add(magnet, this.handleTorrent); } render() diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index 60bd479..f2b248a 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -1,9 +1,11 @@ import React, { Component } from 'react'; import WebTorrent from 'webtorrent'; +import createTorrent from 'create-torrent'; import dragDrop from 'drag-drop'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import { store } from '../../store'; +import { promisify } from 'util'; export const client = new WebTorrent(); @@ -15,17 +17,35 @@ const notifyPeers = (file) => store.dispatch(requestActions.sendChatFile(file, displayName, picture)); }; -const shareFiles = (files) => +const shareFiles = async (files) => { - client.seed(files, (torrent) => + createTorrent(files, (err, torrent) => { - notifyPeers({ - magnet : torrent.magnetURI + if (err) + { + console.error('Error creating torrent', err); + return; + } + + const existingTorrent = client.get(torrent); + + if (existingTorrent) + { + return notifyPeers({ + magnet: existingTorrent.magnetURI + }); + } + + client.seed(files, (newTorrent) => + { + notifyPeers({ + magnet : newTorrent.magnetURI + }); }); }); }; -dragDrop('body', shareFiles); +dragDrop('body', async (files) => await shareFiles(files)); class FileSharing extends Component { @@ -36,11 +56,11 @@ class FileSharing extends Component this.fileInput = React.createRef(); } - handleFileChange = (event) => + handleFileChange = async (event) => { if (event.target.files.length > 0) { - shareFiles(event.target.files); + await shareFiles(event.target.files); } }; diff --git a/app/package-lock.json b/app/package-lock.json index 73e9b4b..f40b840 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -3109,9 +3109,9 @@ } }, "create-torrent": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/create-torrent/-/create-torrent-3.32.0.tgz", - "integrity": "sha512-l9chXj5LLyVFfPF6nFCWlm5/Wt+04d+mXUpG5LJAogeyRruWfjnUozfmQspAi6iW91ibp7qKBuFMPJViz5lp1Q==", + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/create-torrent/-/create-torrent-3.32.1.tgz", + "integrity": "sha512-8spZUeFyVc+2mGnWBRTuLOhuHmHrmUomFWf7QvxztCEvTpn5SIrvF8F+HKdkzBPM9B7v/2w+f/65jqLWBXSndg==", "requires": { "bencode": "^2.0.0", "block-stream2": "^1.0.0", diff --git a/app/package.json b/app/package.json index 2a2dda2..45fb090 100644 --- a/app/package.json +++ b/app/package.json @@ -9,6 +9,7 @@ "dependencies": { "babel-runtime": "^6.26.0", "classnames": "^2.2.6", + "create-torrent": "^3.32.1", "debug": "^3.1.0", "domready": "^1.0.8", "drag-drop": "^4.2.0", From f912d820025b3bc142a0cdabcbc0e69c734142bd Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 09:38:06 +0200 Subject: [PATCH 14/40] Use TURN server in WebTorrent config --- app/lib/components/Chat/FileSharing.jsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index f2b248a..339b346 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -5,9 +5,15 @@ import dragDrop from 'drag-drop'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import { store } from '../../store'; -import { promisify } from 'util'; +import config from '../../../config'; -export const client = new WebTorrent(); +export const client = new WebTorrent({ + tracker: { + rtcConfig: { + iceServers: config.turnServers + } + } +}); const notifyPeers = (file) => { From a90c2879892650c95d6f2e9b072a5c41a9e28747 Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 11:19:36 +0200 Subject: [PATCH 15/40] Add notification while creating torrent file --- app/lib/components/Chat/FileChatEntry.jsx | 4 ++-- app/lib/components/Chat/FileSharing.jsx | 23 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index b36cf72..b0712ac 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -1,6 +1,6 @@ import React, { Component, Fragment } from 'react'; import { connect } from 'react-redux'; -import { notifyAction } from '../../redux/stateActions'; +import * as requestActions from '../../redux/requestActions'; import { saveAs } from 'file-saver/FileSaver'; import { client } from './FileSharing'; @@ -130,7 +130,7 @@ class FileChatEntry extends Component } const mapDispatchToProps = { - notify : notifyAction + notify : requestActions.notify }; export default connect( diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index 339b346..fe801a2 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import WebTorrent from 'webtorrent'; import createTorrent from 'create-torrent'; import dragDrop from 'drag-drop'; +import randomString from 'random-string'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import { store } from '../../store'; @@ -25,12 +26,22 @@ const notifyPeers = (file) => const shareFiles = async (files) => { + const notification = + { + id: randomString({ length: 6 }).toLowerCase(), + text: 'Creating torrent', + type: 'info' + }; + + store.dispatch(stateActions.addNotification(notification)); + createTorrent(files, (err, torrent) => { if (err) { - console.error('Error creating torrent', err); - return; + return store.dispatch(requestActions.notify({ + text: 'An error occured while uploading a file' + })); } const existingTorrent = client.get(torrent); @@ -41,9 +52,15 @@ const shareFiles = async (files) => magnet: existingTorrent.magnetURI }); } - + client.seed(files, (newTorrent) => { + store.dispatch(stateActions.removeNotification(notification.id)); + + store.dispatch(requestActions.notify({ + text: 'Torrent successfully created' + })) + notifyPeers({ magnet : newTorrent.magnetURI }); From c908fa8855429c2cd6c03707c54b89806bfbfe3a Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 11:29:37 +0200 Subject: [PATCH 16/40] Fix file dialog opening when sending chat messages --- app/lib/components/Chat/FileChatEntry.jsx | 12 ++++----- app/lib/components/Chat/FileSharing.jsx | 33 +++++++++++++---------- app/lib/redux/reducers/chatmessages.js | 2 +- app/lib/store.js | 4 +-- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index b0712ac..faced6f 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -35,10 +35,10 @@ class FileChatEntry extends Component if (torrent.progress === 1) { this.setState({ - files: torrent.files, - numPeers: torrent.numPeers, - progress: 1, - active: false + files : torrent.files, + numPeers : torrent.numPeers, + progress : 1, + active : false }); return; @@ -62,8 +62,8 @@ class FileChatEntry extends Component clearInterval(onProgress); this.setState({ - files : torrent.files, - active: false + files : torrent.files, + active : false }); }); }; diff --git a/app/lib/components/Chat/FileSharing.jsx b/app/lib/components/Chat/FileSharing.jsx index fe801a2..c09fef8 100644 --- a/app/lib/components/Chat/FileSharing.jsx +++ b/app/lib/components/Chat/FileSharing.jsx @@ -9,9 +9,9 @@ import { store } from '../../store'; import config from '../../../config'; export const client = new WebTorrent({ - tracker: { - rtcConfig: { - iceServers: config.turnServers + tracker : { + rtcConfig : { + iceServers : config.turnServers } } }); @@ -24,13 +24,13 @@ const notifyPeers = (file) => store.dispatch(requestActions.sendChatFile(file, displayName, picture)); }; -const shareFiles = async (files) => +const shareFiles = async(files) => { const notification = { - id: randomString({ length: 6 }).toLowerCase(), - text: 'Creating torrent', - type: 'info' + id : randomString({ length: 6 }).toLowerCase(), + text : 'Creating torrent', + type : 'info' }; store.dispatch(stateActions.addNotification(notification)); @@ -40,7 +40,7 @@ const shareFiles = async (files) => if (err) { return store.dispatch(requestActions.notify({ - text: 'An error occured while uploading a file' + text : 'An error occured while uploading a file' })); } @@ -49,7 +49,7 @@ const shareFiles = async (files) => if (existingTorrent) { return notifyPeers({ - magnet: existingTorrent.magnetURI + magnet : existingTorrent.magnetURI }); } @@ -58,8 +58,8 @@ const shareFiles = async (files) => store.dispatch(stateActions.removeNotification(notification.id)); store.dispatch(requestActions.notify({ - text: 'Torrent successfully created' - })) + text : 'Torrent successfully created' + })); notifyPeers({ magnet : newTorrent.magnetURI @@ -68,7 +68,7 @@ const shareFiles = async (files) => }); }; -dragDrop('body', async (files) => await shareFiles(files)); +dragDrop('body', async(files) => await shareFiles(files)); class FileSharing extends Component { @@ -79,7 +79,7 @@ class FileSharing extends Component this.fileInput = React.createRef(); } - handleFileChange = async (event) => + handleFileChange = async(event) => { if (event.target.files.length > 0) { @@ -106,7 +106,12 @@ class FileSharing extends Component multiple /> - +
); } diff --git a/app/lib/redux/reducers/chatmessages.js b/app/lib/redux/reducers/chatmessages.js index baf8761..923f81c 100644 --- a/app/lib/redux/reducers/chatmessages.js +++ b/app/lib/redux/reducers/chatmessages.js @@ -19,7 +19,7 @@ const chatmessages = (state = [], action) => case 'ADD_NEW_USER_FILE': { - const { file } = action.payload; + const { file } = action.payload; const message = createNewFile(file, 'client', 'Me', undefined); diff --git a/app/lib/store.js b/app/lib/store.js index d4ee190..cdff97d 100644 --- a/app/lib/store.js +++ b/app/lib/store.js @@ -43,6 +43,4 @@ export const store = createStore( reducers, undefined, enhancer -); - -console.log(store); \ No newline at end of file +); \ No newline at end of file From 37f7af3778b1f1afd7b976ed58d09b19913dbed7 Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 11:37:51 +0200 Subject: [PATCH 17/40] Show torrent file name based on magnet URI --- app/lib/components/Chat/FileChatEntry.jsx | 3 +++ app/package-lock.json | 7 +++---- app/package.json | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index faced6f..f0e0c40 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -1,5 +1,6 @@ import React, { Component, Fragment } from 'react'; import { connect } from 'react-redux'; +import magnet from 'magnet-uri'; import * as requestActions from '../../redux/requestActions'; import { saveAs } from 'file-saver/FileSaver'; import { client } from './FileSharing'; @@ -96,6 +97,8 @@ class FileChatEntry extends Component

A new file was shared.

+

{magnet.decode(this.props.message.file.magnet).dn}

+ diff --git a/app/package-lock.json b/app/package-lock.json index f40b840..2af90be 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -7912,11 +7912,10 @@ } }, "magnet-uri": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-5.1.8.tgz", - "integrity": "sha512-rHCJ81C3W2MuLpb4c3JKshQtCbRZhgeKKNYy1YFBtLR3eAB0FjQ5thfCo16w/+VF9yN5tJDtDq4NHPtf9a328A==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-5.2.3.tgz", + "integrity": "sha512-INWVwcpWfZTVM+Yb4EXVBpm0FTd8Q98Fn5x7nuHv1hkFDRELgdIM+eJ3zYLbNTFpFPYtHs6B+sx8exs29IYwgA==", "requires": { - "safe-buffer": "^5.0.1", "thirty-two": "^1.0.1", "uniq": "^1.0.1", "xtend": "^4.0.0" diff --git a/app/package.json b/app/package.json index 45fb090..db64637 100644 --- a/app/package.json +++ b/app/package.json @@ -17,6 +17,7 @@ "fscreen": "^1.0.2", "hark": "^1.2.2", "js-cookie": "^2.2.0", + "magnet-uri": "^5.2.3", "marked": "^0.4.0", "mediasoup-client": "^2.1.1", "prop-types": "^15.6.2", From 48b8cdf26c34de3f2d771b6afab2e3a82a478d4d Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 11:44:36 +0200 Subject: [PATCH 18/40] Distinguish between files sent by client and files sent in response --- app/lib/components/Chat/FileChatEntry.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index f0e0c40..e5c23f7 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -95,7 +95,11 @@ class FileChatEntry extends Component
{!this.state.active && !this.state.files && ( -

A new file was shared.

+ {this.props.message.sender === 'client' ? ( +

You shared a file.

+ ) : ( +

A new file was shared.

+ )}

{magnet.decode(this.props.message.file.magnet).dn}

From 730c4e23c7d2d33d996bf20db938af6a1173511a Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 12:47:02 +0200 Subject: [PATCH 19/40] Add message when torrent finishes downloading --- app/lib/components/Chat/FileChatEntry.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/Chat/FileChatEntry.jsx index e5c23f7..2e9d421 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/Chat/FileChatEntry.jsx @@ -121,10 +121,14 @@ class FileChatEntry extends Component {this.state.files && (
+

Torrent finished downloading.

+ {this.state.files.map((file, i) => (
+ {file.name} +
))} From 5138673fea16d96f409b673c9801a9cbe2b05e38 Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 14:47:57 +0200 Subject: [PATCH 20/40] Move file sharing into a separate tab --- app/lib/RoomClient.js | 27 ++++++++++ app/lib/components/Chat/Chat.jsx | 3 -- app/lib/components/Chat/MessageList.jsx | 23 +++----- .../FileEntry.jsx} | 12 ++--- .../FileSharing.jsx => FileSharing/index.jsx} | 52 +++++++++++++------ app/lib/components/ToolArea/ToolArea.jsx | 14 +++++ app/lib/redux/reducers/chatmessages.js | 9 ---- app/lib/redux/reducers/helper.js | 12 ----- app/lib/redux/reducers/index.js | 4 +- app/lib/redux/reducers/sharing.js | 16 ++++++ app/lib/redux/requestActions.js | 8 ++- app/lib/redux/roomClientMiddleware.js | 6 +++ app/lib/redux/stateActions.js | 8 +++ app/stylus/components/ToolArea.styl | 2 +- 14 files changed, 127 insertions(+), 69 deletions(-) rename app/lib/components/{Chat/FileChatEntry.jsx => FileSharing/FileEntry.jsx} (90%) rename app/lib/components/{Chat/FileSharing.jsx => FileSharing/index.jsx} (73%) create mode 100644 app/lib/redux/reducers/sharing.js diff --git a/app/lib/RoomClient.js b/app/lib/RoomClient.js index d22ce01..d537f7e 100644 --- a/app/lib/RoomClient.js +++ b/app/lib/RoomClient.js @@ -205,6 +205,22 @@ export default class RoomClient }); } + sendFile(file) + { + logger.debug('sendFile() [file: %o]', file); + + return this._protoo.send('send-file', { file }) + .catch((error) => + { + logger.error('sendFile() | failed: %o', error); + + this._dispatch(requestActions.notify({ + typ: 'error', + text: 'An error occurred while sharing a file' + })); + }); + } + getChatHistory() { logger.debug('getChatHistory()'); @@ -1146,6 +1162,17 @@ export default class RoomClient break; } + case 'file-receive': + { + accept(); + + const { file } = request.data; + + this._dispatch(stateActions.addFile(file)); + + break; + } + default: { logger.error('unknown protoo method "%s"', request.method); diff --git a/app/lib/components/Chat/Chat.jsx b/app/lib/components/Chat/Chat.jsx index 6a50433..aa12109 100644 --- a/app/lib/components/Chat/Chat.jsx +++ b/app/lib/components/Chat/Chat.jsx @@ -4,7 +4,6 @@ import PropTypes from 'prop-types'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import MessageList from './MessageList'; -import FileSharing from './FileSharing'; class Chat extends Component { @@ -27,8 +26,6 @@ class Chat extends Component data-component='Sender' onSubmit={(e) => { onSendMessage(e, displayName, picture); }} > - - { @@ -60,20 +59,14 @@ class MessageList extends Component
- {message.type === 'message' && ( -
- )} - - {message.type === 'file' && ( - - )} +
{message.name} - {this.getTimeString(messageTime)} diff --git a/app/lib/components/Chat/FileChatEntry.jsx b/app/lib/components/FileSharing/FileEntry.jsx similarity index 90% rename from app/lib/components/Chat/FileChatEntry.jsx rename to app/lib/components/FileSharing/FileEntry.jsx index 2e9d421..96af9d7 100644 --- a/app/lib/components/Chat/FileChatEntry.jsx +++ b/app/lib/components/FileSharing/FileEntry.jsx @@ -3,9 +3,9 @@ import { connect } from 'react-redux'; import magnet from 'magnet-uri'; import * as requestActions from '../../redux/requestActions'; import { saveAs } from 'file-saver/FileSaver'; -import { client } from './FileSharing'; +import { client } from './index'; -class FileChatEntry extends Component +class FileEntry extends Component { state = { active : false, @@ -75,7 +75,7 @@ class FileChatEntry extends Component active : true }); - const magnet = this.props.message.file.magnet; + const magnet = this.props.data.file.magnet; const existingTorrent = client.get(magnet); @@ -95,13 +95,13 @@ class FileChatEntry extends Component
{!this.state.active && !this.state.files && ( - {this.props.message.sender === 'client' ? ( + {this.props.data.me ? (

You shared a file.

) : (

A new file was shared.

)} -

{magnet.decode(this.props.message.file.magnet).dn}

+

{magnet.decode(this.props.data.file.magnet).dn}

+ +
+ +
+ {this.props.sharing.map((entry) => ( + + ))} +
); } } -export default FileSharing; \ No newline at end of file +const mapStateToProps = (state) => + ({ + sharing: state.sharing + }); + +export default connect( + mapStateToProps +)(FileSharing); \ No newline at end of file diff --git a/app/lib/components/ToolArea/ToolArea.jsx b/app/lib/components/ToolArea/ToolArea.jsx index 0a5a2d7..218dde4 100644 --- a/app/lib/components/ToolArea/ToolArea.jsx +++ b/app/lib/components/ToolArea/ToolArea.jsx @@ -5,6 +5,7 @@ import * as toolTabActions from '../../redux/stateActions'; import ParticipantList from '../ParticipantList/ParticipantList'; import Chat from '../Chat/Chat'; import Settings from '../Settings'; +import FileSharing from '../FileSharing'; class ToolArea extends React.Component { @@ -46,6 +47,19 @@ class ToolArea extends React.Component
+ setToolTab('files')} + checked={currentToolTab === 'files'} + /> + + +
+ +
+ return [ ...state, message ]; } - case 'ADD_NEW_USER_FILE': - { - const { file } = action.payload; - - const message = createNewFile(file, 'client', 'Me', undefined); - - return [ ...state, message ]; - } - case 'ADD_NEW_RESPONSE_MESSAGE': { const { message } = action.payload; diff --git a/app/lib/redux/reducers/helper.js b/app/lib/redux/reducers/helper.js index eb7864e..db17859 100644 --- a/app/lib/redux/reducers/helper.js +++ b/app/lib/redux/reducers/helper.js @@ -8,16 +8,4 @@ export function createNewMessage(text, sender, name, picture) sender, picture }; -} - -export function createNewFile(file, sender, name, picture) -{ - return { - type : 'file', - file, - time : Date.now(), - name, - sender, - picture - }; } \ No newline at end of file diff --git a/app/lib/redux/reducers/index.js b/app/lib/redux/reducers/index.js index e5c89a3..1f59ace 100644 --- a/app/lib/redux/reducers/index.js +++ b/app/lib/redux/reducers/index.js @@ -8,6 +8,7 @@ import notifications from './notifications'; import chatmessages from './chatmessages'; import chatbehavior from './chatbehavior'; import toolarea from './toolarea'; +import sharing from './sharing'; const reducers = combineReducers( { @@ -19,7 +20,8 @@ const reducers = combineReducers( notifications, chatmessages, chatbehavior, - toolarea + toolarea, + sharing }); export default reducers; diff --git a/app/lib/redux/reducers/sharing.js b/app/lib/redux/reducers/sharing.js new file mode 100644 index 0000000..7243b2d --- /dev/null +++ b/app/lib/redux/reducers/sharing.js @@ -0,0 +1,16 @@ +const sharing = (state = [], action) => +{ + switch (action.type) + { + case 'SEND_FILE': + return [ ...state, { ...action.payload, me: true }]; + + case 'ADD_FILE': + return [ ...state, action.payload ]; + + default: + return state; + } +}; + +export default sharing; \ No newline at end of file diff --git a/app/lib/redux/requestActions.js b/app/lib/redux/requestActions.js index 465ef35..e892bbf 100644 --- a/app/lib/redux/requestActions.js +++ b/app/lib/redux/requestActions.js @@ -214,13 +214,11 @@ export const sendChatMessage = (text, name, picture) => }; }; -export const sendChatFile = (magnet, name, picture) => +export const sendFile = (file, name, picture) => { - const message = createNewFile(magnet, 'response', name, picture); - return { - type : 'SEND_CHAT_MESSAGE', - payload : { message } + type: 'SEND_FILE', + payload: { file, name, picture } }; }; diff --git a/app/lib/redux/roomClientMiddleware.js b/app/lib/redux/roomClientMiddleware.js index 8a55ed7..b4e266c 100644 --- a/app/lib/redux/roomClientMiddleware.js +++ b/app/lib/redux/roomClientMiddleware.js @@ -231,6 +231,12 @@ export default ({ dispatch, getState }) => (next) => break; } + + case 'SEND_FILE': + { + client.sendFile(action.payload); + break; + } } return next(action); diff --git a/app/lib/redux/stateActions.js b/app/lib/redux/stateActions.js index 27314eb..832a55c 100644 --- a/app/lib/redux/stateActions.js +++ b/app/lib/redux/stateActions.js @@ -441,6 +441,14 @@ export const dropMessages = () => }; }; +export const addFile = (payload) => +{ + return { + type: 'ADD_FILE', + payload + }; +}; + export const setPicture = (picture) => ({ type : 'SET_PICTURE', diff --git a/app/stylus/components/ToolArea.styl b/app/stylus/components/ToolArea.styl index e424e8b..2ff7a13 100644 --- a/app/stylus/components/ToolArea.styl +++ b/app/stylus/components/ToolArea.styl @@ -89,7 +89,7 @@ font-weight: bold; transition: background ease 0.2s; text-align: center; - width: 33.33%; + width: 25%; font-size: 1.3vmin; height: 3vmin; From e6470d8e2e393453d824821f4634fa6562a48224 Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 14:50:19 +0200 Subject: [PATCH 21/40] Hide badge count when opening sidebar --- app/lib/components/ToolArea/ToolAreaButton.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/components/ToolArea/ToolAreaButton.jsx b/app/lib/components/ToolArea/ToolAreaButton.jsx index ea9fa09..4ebb256 100644 --- a/app/lib/components/ToolArea/ToolAreaButton.jsx +++ b/app/lib/components/ToolArea/ToolAreaButton.jsx @@ -27,7 +27,7 @@ class ToolAreaButton extends React.Component onClick={() => toggleToolArea()} /> - {unread > 0 && ( + {!toolAreaOpen && unread > 0 && ( = 10 })}> {unread} From 3404950069665f345cc08f1aadc6527ceb921a65 Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 14:57:32 +0200 Subject: [PATCH 22/40] Add files badge to the ToolArea --- app/lib/components/ToolArea/ToolArea.jsx | 21 +++++++++++----- .../components/ToolArea/ToolAreaButton.jsx | 2 +- app/lib/redux/reducers/toolarea.js | 24 ++++++++++++++----- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/app/lib/components/ToolArea/ToolArea.jsx b/app/lib/components/ToolArea/ToolArea.jsx index 218dde4..19545c0 100644 --- a/app/lib/components/ToolArea/ToolArea.jsx +++ b/app/lib/components/ToolArea/ToolArea.jsx @@ -18,7 +18,8 @@ class ToolArea extends React.Component { const { currentToolTab, - unread, + unreadMessages, + unreadFiles, setToolTab } = this.props; @@ -38,8 +39,8 @@ class ToolArea extends React.Component @@ -54,7 +55,13 @@ class ToolArea extends React.Component onChange={() => setToolTab('files')} checked={currentToolTab === 'files'} /> - +
@@ -102,12 +109,14 @@ ToolArea.propTypes = advancedMode : PropTypes.bool, currentToolTab : PropTypes.string.isRequired, setToolTab : PropTypes.func.isRequired, - unread : PropTypes.number.isRequired + unreadMessages : PropTypes.number.isRequired, + unreadFiles : PropTypes.number.isRequired }; const mapStateToProps = (state) => ({ currentToolTab : state.toolarea.currentToolTab, - unread : state.toolarea.unread + unreadMessages : state.toolarea.unreadMessages, + unreadFiles : state.toolarea.unreadFiles }); const mapDispatchToProps = { diff --git a/app/lib/components/ToolArea/ToolAreaButton.jsx b/app/lib/components/ToolArea/ToolAreaButton.jsx index 4ebb256..6c67c15 100644 --- a/app/lib/components/ToolArea/ToolAreaButton.jsx +++ b/app/lib/components/ToolArea/ToolAreaButton.jsx @@ -50,7 +50,7 @@ const mapStateToProps = (state) => return { toolAreaOpen : state.toolarea.toolAreaOpen, visible : state.room.toolbarsVisible, - unread : state.toolarea.unread + unread : state.toolarea.unreadMessages + state.toolarea.unreadFiles }; }; diff --git a/app/lib/redux/reducers/toolarea.js b/app/lib/redux/reducers/toolarea.js index 04654cb..fa5b0df 100644 --- a/app/lib/redux/reducers/toolarea.js +++ b/app/lib/redux/reducers/toolarea.js @@ -2,7 +2,8 @@ const initialState = { toolAreaOpen : false, currentToolTab : 'chat', // chat, settings, users - unread : 0 + unreadMessages : 0, + unreadFiles : 0 }; const toolarea = (state = initialState, action) => @@ -12,17 +13,18 @@ const toolarea = (state = initialState, action) => case 'TOGGLE_TOOL_AREA': { const toolAreaOpen = !state.toolAreaOpen; - const unread = toolAreaOpen && state.currentToolTab === 'chat' ? 0 : state.unread; + const unreadMessages = toolAreaOpen && state.currentToolTab === 'chat' ? 0 : state.unreadMessages; - return { ...state, toolAreaOpen, unread }; + return { ...state, toolAreaOpen, unreadMessages }; } case 'SET_TOOL_TAB': { const { toolTab } = action.payload; - const unread = toolTab === 'chat' ? 0 : state.unread; + const unreadMessages = toolTab === 'chat' ? 0 : state.unreadMessages; + const unreadFiles = toolTab === 'files' ? 0 : state.unreadFiles; - return { ...state, currentToolTab: toolTab, unread }; + return { ...state, currentToolTab: toolTab, unreadMessages, unreadFiles }; } case 'ADD_NEW_RESPONSE_MESSAGE': @@ -32,7 +34,17 @@ const toolarea = (state = initialState, action) => return state; } - return { ...state, unread: state.unread + 1 }; + return { ...state, unreadMessages: state.unreadMessages + 1 }; + } + + case 'ADD_FILE': + { + if (state.toolAreaOpen && state.currentToolTab === 'files') + { + return state; + } + + return { ...state, unreadFiles: state.unreadFiles + 1 }; } default: From 6042d305ac3915de6c50ec2623074a302e9c856c Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 15:05:20 +0200 Subject: [PATCH 23/40] Fix badge logic and add notification when receiving files --- app/lib/RoomClient.js | 8 ++++++-- app/lib/redux/reducers/toolarea.js | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/lib/RoomClient.js b/app/lib/RoomClient.js index d537f7e..c15bee4 100644 --- a/app/lib/RoomClient.js +++ b/app/lib/RoomClient.js @@ -1166,9 +1166,13 @@ export default class RoomClient { accept(); - const { file } = request.data; + const payload = request.data.file; - this._dispatch(stateActions.addFile(file)); + this._dispatch(stateActions.addFile(payload)); + + this._dispatch(requestActions.notify({ + text: `${payload.name} shared a file` + })); break; } diff --git a/app/lib/redux/reducers/toolarea.js b/app/lib/redux/reducers/toolarea.js index fa5b0df..0d25eca 100644 --- a/app/lib/redux/reducers/toolarea.js +++ b/app/lib/redux/reducers/toolarea.js @@ -14,8 +14,9 @@ const toolarea = (state = initialState, action) => { const toolAreaOpen = !state.toolAreaOpen; const unreadMessages = toolAreaOpen && state.currentToolTab === 'chat' ? 0 : state.unreadMessages; + const unreadFiles = toolAreaOpen && state.currentToolTab === 'files' ? 0 : state.unreadFiles; - return { ...state, toolAreaOpen, unreadMessages }; + return { ...state, toolAreaOpen, unreadMessages, unreadFiles }; } case 'SET_TOOL_TAB': From fbe509b9303c5d5cf618ed3a34c9ad0ccec77b4e Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 16:33:06 +0200 Subject: [PATCH 24/40] Minor styling improvements to the file sharing tab --- app/lib/RoomClient.js | 16 ++--- app/lib/components/FileSharing/FileEntry.jsx | 50 ++++++++-------- app/lib/components/FileSharing/index.jsx | 20 ++++--- app/lib/redux/reducers/chatmessages.js | 3 +- app/lib/redux/reducers/sharing.js | 18 +++--- app/lib/redux/requestActions.js | 7 +-- app/lib/redux/stateActions.js | 2 +- app/resources/images/download-icon.svg | 4 ++ app/resources/images/save-icon.svg | 4 ++ app/stylus/components/FileSharing.styl | 61 ++++++++++++++++++++ app/stylus/index.styl | 1 + 11 files changed, 130 insertions(+), 56 deletions(-) create mode 100644 app/resources/images/download-icon.svg create mode 100644 app/resources/images/save-icon.svg create mode 100644 app/stylus/components/FileSharing.styl diff --git a/app/lib/RoomClient.js b/app/lib/RoomClient.js index c15bee4..5ae52af 100644 --- a/app/lib/RoomClient.js +++ b/app/lib/RoomClient.js @@ -211,14 +211,14 @@ export default class RoomClient return this._protoo.send('send-file', { file }) .catch((error) => - { - logger.error('sendFile() | failed: %o', error); + { + logger.error('sendFile() | failed: %o', error); - this._dispatch(requestActions.notify({ - typ: 'error', - text: 'An error occurred while sharing a file' - })); - }); + this._dispatch(requestActions.notify({ + typ : 'error', + text : 'An error occurred while sharing a file' + })); + }); } getChatHistory() @@ -1171,7 +1171,7 @@ export default class RoomClient this._dispatch(stateActions.addFile(payload)); this._dispatch(requestActions.notify({ - text: `${payload.name} shared a file` + text : `${payload.name} shared a file` })); break; diff --git a/app/lib/components/FileSharing/FileEntry.jsx b/app/lib/components/FileSharing/FileEntry.jsx index 96af9d7..cbe5fc8 100644 --- a/app/lib/components/FileSharing/FileEntry.jsx +++ b/app/lib/components/FileSharing/FileEntry.jsx @@ -5,6 +5,8 @@ import * as requestActions from '../../redux/requestActions'; import { saveAs } from 'file-saver/FileSaver'; import { client } from './index'; +const DEFAULT_PICTURE = 'resources/images/avatar-empty.jpeg'; + class FileEntry extends Component { state = { @@ -91,28 +93,30 @@ class FileEntry extends Component render() { return ( - -
+
+ + +
+ {this.props.data.me ? ( +

You shared a file.

+ ) : ( +

{this.props.data.name} shared a file.

+ )} + {!this.state.active && !this.state.files && ( - - {this.props.data.me ? ( -

You shared a file.

- ) : ( -

A new file was shared.

- )} +
+ + +

{magnet.decode(this.props.data.file.magnet).dn}

- - - +
)} {this.state.active && this.state.numPeers === 0 && ( -
+

Locating peers -

+

)} {this.state.active && this.state.numPeers > 0 && ( @@ -120,22 +124,22 @@ class FileEntry extends Component )} {this.state.files && ( -
+

Torrent finished downloading.

{this.state.files.map((file, i) => ( -
- {file.name} +
+ this.saveFile(file)}> + + - +

{file.name}

))} -
+
)}
-
+
); } } diff --git a/app/lib/components/FileSharing/index.jsx b/app/lib/components/FileSharing/index.jsx index 3d93835..b1a46b7 100644 --- a/app/lib/components/FileSharing/index.jsx +++ b/app/lib/components/FileSharing/index.jsx @@ -25,7 +25,7 @@ const notifyPeers = (file) => store.dispatch(requestActions.sendFile(file, displayName, picture)); }; -const shareFiles = async (files) => +const shareFiles = async(files) => { const notification = { @@ -98,8 +98,8 @@ class FileSharing extends Component render() { return ( -
-
+
+
- + Share file +
-
- {this.props.sharing.map((entry) => ( +
+ {this.props.sharing.map((entry, i) => ( ))}
@@ -130,7 +132,7 @@ class FileSharing extends Component const mapStateToProps = (state) => ({ - sharing: state.sharing + sharing : state.sharing }); export default connect( diff --git a/app/lib/redux/reducers/chatmessages.js b/app/lib/redux/reducers/chatmessages.js index 7896ccb..e9ed22f 100644 --- a/app/lib/redux/reducers/chatmessages.js +++ b/app/lib/redux/reducers/chatmessages.js @@ -1,7 +1,6 @@ import { - createNewMessage, - createNewFile + createNewMessage } from './helper'; const chatmessages = (state = [], action) => diff --git a/app/lib/redux/reducers/sharing.js b/app/lib/redux/reducers/sharing.js index 7243b2d..270844f 100644 --- a/app/lib/redux/reducers/sharing.js +++ b/app/lib/redux/reducers/sharing.js @@ -1,16 +1,16 @@ const sharing = (state = [], action) => { - switch (action.type) - { - case 'SEND_FILE': - return [ ...state, { ...action.payload, me: true }]; + switch (action.type) + { + case 'SEND_FILE': + return [ ...state, { ...action.payload, me: true } ]; - case 'ADD_FILE': - return [ ...state, action.payload ]; + case 'ADD_FILE': + return [ ...state, action.payload ]; - default: - return state; - } + default: + return state; + } }; export default sharing; \ No newline at end of file diff --git a/app/lib/redux/requestActions.js b/app/lib/redux/requestActions.js index e892bbf..6ad7fbc 100644 --- a/app/lib/redux/requestActions.js +++ b/app/lib/redux/requestActions.js @@ -2,8 +2,7 @@ import randomString from 'random-string'; import * as stateActions from './stateActions'; import { - createNewMessage, - createNewFile + createNewMessage } from './reducers/helper'; export const joinRoom = ( @@ -217,8 +216,8 @@ export const sendChatMessage = (text, name, picture) => export const sendFile = (file, name, picture) => { return { - type: 'SEND_FILE', - payload: { file, name, picture } + type : 'SEND_FILE', + payload : { file, name, picture } }; }; diff --git a/app/lib/redux/stateActions.js b/app/lib/redux/stateActions.js index 832a55c..a83e25c 100644 --- a/app/lib/redux/stateActions.js +++ b/app/lib/redux/stateActions.js @@ -444,7 +444,7 @@ export const dropMessages = () => export const addFile = (payload) => { return { - type: 'ADD_FILE', + type : 'ADD_FILE', payload }; }; diff --git a/app/resources/images/download-icon.svg b/app/resources/images/download-icon.svg new file mode 100644 index 0000000..f97c18f --- /dev/null +++ b/app/resources/images/download-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/resources/images/save-icon.svg b/app/resources/images/save-icon.svg new file mode 100644 index 0000000..ecd9ab5 --- /dev/null +++ b/app/resources/images/save-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/stylus/components/FileSharing.styl b/app/stylus/components/FileSharing.styl new file mode 100644 index 0000000..5af968d --- /dev/null +++ b/app/stylus/components/FileSharing.styl @@ -0,0 +1,61 @@ +[data-component='FileSharing'] { + > .sharing-toolbar { + > .share-file { + cursor: pointer; + width: 100%; + background: #252525; + border: 1px solid #151515; + padding: 1rem; + border-bottom: 5px solid #151515; + border-radius: 3px 3px 0 0; + } + } + + > .shared-files { + > .file-entry { + background-color: rgba(0,0,0,0.1); + border-radius: 5px; + width: 100%; + padding: 0.5rem; + display: flex; + margin-top: 0.5rem; + + > .file-avatar { + height: 2rem; + border-radius: 50%; + } + + > .file-content { + flex-grow: 1; + padding-left: 0.5rem; + + > p:not(:first-child) { + margin-top: 0.5rem; + } + + > .file-info { + display: flex; + padding-top: 0.5rem; + align-items: center; + + > .button { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + background: #252525; + border: 1px solid #151515; + padding: 0.3rem; + border-bottom: 5px solid #151515; + border-radius: 3px 3px 0 0; + } + + > p { + flex-grow: 1; + padding-left: 0.5rem; + } + } + } + } + } +} \ No newline at end of file diff --git a/app/stylus/index.styl b/app/stylus/index.styl index 5e67e46..328df97 100644 --- a/app/stylus/index.styl +++ b/app/stylus/index.styl @@ -51,6 +51,7 @@ body { @import './components/FullScreenView'; @import './components/FullView'; @import './components/Filmstrip'; + @import './components/FileSharing'; } // Hack to detect in JS the current media query From 8b6ebe39b2f0c88a673450d7665d53727e15bd5c Mon Sep 17 00:00:00 2001 From: Torjus Date: Mon, 30 Jul 2018 16:43:05 +0200 Subject: [PATCH 25/40] Support sending files in server --- server/lib/Room.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/server/lib/Room.js b/server/lib/Room.js index 9b312fe..6d0b79c 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -272,6 +272,19 @@ class Room extends EventEmitter break; } + case 'send-file': + { + accept(); + + const { file } = request.data; + + this._protooRoom.spread('file-receive', { + file + }, [ protooPeer ]); + + break; + } + case 'raisehand-message': { accept(); From 35b3da155d7a3985e841f965d734e0fd86a1d1d2 Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 09:56:29 +0200 Subject: [PATCH 26/40] Store file upload history on server --- app/lib/RoomClient.js | 35 ++++++++++++++++++++++++++++++- app/lib/redux/reducers/sharing.js | 3 +++ app/lib/redux/stateActions.js | 8 +++++++ server/lib/Room.js | 15 +++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/app/lib/RoomClient.js b/app/lib/RoomClient.js index 5ae52af..6302710 100644 --- a/app/lib/RoomClient.js +++ b/app/lib/RoomClient.js @@ -238,6 +238,22 @@ export default class RoomClient }); } + getFileHistory() + { + logger.debug('getFileHistory()'); + + return this._protoo.send('file-history', {}) + .catch((error) => + { + logger.error('getFileHistory() | failed: %o', error); + + this._dispatch(requestActions.notify({ + type: 'error', + text: 'Could not get file history' + })); + }) + } + muteMic() { logger.debug('muteMic()'); @@ -1177,6 +1193,22 @@ export default class RoomClient break; } + case 'file-history-receive': + { + accept(); + + const files = request.data.fileHistory; + + if (files.length > 0) + { + logger.debug('Got files history'); + + this._dispatch(stateActions.addFileHistory(files)); + } + + break; + } + default: { logger.error('unknown protoo method "%s"', request.method); @@ -1314,7 +1346,8 @@ export default class RoomClient this._dispatch(stateActions.removeAllNotifications()); this.getChatHistory(); - + this.getFileHistory(); + this._dispatch(requestActions.notify( { text : 'You are in the room', diff --git a/app/lib/redux/reducers/sharing.js b/app/lib/redux/reducers/sharing.js index 270844f..299a155 100644 --- a/app/lib/redux/reducers/sharing.js +++ b/app/lib/redux/reducers/sharing.js @@ -8,6 +8,9 @@ const sharing = (state = [], action) => case 'ADD_FILE': return [ ...state, action.payload ]; + case 'ADD_FILE_HISTORY': + return [ ...action.payload.fileHistory, ...state ]; + default: return state; } diff --git a/app/lib/redux/stateActions.js b/app/lib/redux/stateActions.js index a83e25c..6843ed8 100644 --- a/app/lib/redux/stateActions.js +++ b/app/lib/redux/stateActions.js @@ -449,6 +449,14 @@ export const addFile = (payload) => }; }; +export const addFileHistory = (fileHistory) => +{ + return { + type: 'ADD_FILE_HISTORY', + payload: { fileHistory } + }; +}; + export const setPicture = (picture) => ({ type : 'SET_PICTURE', diff --git a/server/lib/Room.js b/server/lib/Room.js index 6d0b79c..5cf87f0 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -28,6 +28,8 @@ class Room extends EventEmitter this._chatHistory = []; + this._fileHistory = []; + try { // Protoo Room instance. @@ -278,6 +280,8 @@ class Room extends EventEmitter const { file } = request.data; + this._fileHistory.push(file); + this._protooRoom.spread('file-receive', { file }, [ protooPeer ]); @@ -285,6 +289,17 @@ class Room extends EventEmitter break; } + case 'file-history': + { + accept(); + + protooPeer.send('file-history-receive', { + fileHistory: this._fileHistory + }); + + break; + } + case 'raisehand-message': { accept(); From 0561ff64acb337802eb01245534c3be9457f9e94 Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 10:14:14 +0200 Subject: [PATCH 27/40] Add missing PropTypes --- app/lib/RoomClient.js | 6 ++--- app/lib/components/FileSharing/FileEntry.jsx | 27 +++++++++++++++----- app/lib/components/FileSharing/index.jsx | 7 ++++- app/lib/redux/stateActions.js | 4 +-- server/lib/Room.js | 2 +- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/app/lib/RoomClient.js b/app/lib/RoomClient.js index 6302710..0d1873b 100644 --- a/app/lib/RoomClient.js +++ b/app/lib/RoomClient.js @@ -248,10 +248,10 @@ export default class RoomClient logger.error('getFileHistory() | failed: %o', error); this._dispatch(requestActions.notify({ - type: 'error', - text: 'Could not get file history' + type : 'error', + text : 'Could not get file history' })); - }) + }); } muteMic() diff --git a/app/lib/components/FileSharing/FileEntry.jsx b/app/lib/components/FileSharing/FileEntry.jsx index cbe5fc8..c35d09b 100644 --- a/app/lib/components/FileSharing/FileEntry.jsx +++ b/app/lib/components/FileSharing/FileEntry.jsx @@ -1,9 +1,10 @@ import React, { Component, Fragment } from 'react'; -import { connect } from 'react-redux'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; import magnet from 'magnet-uri'; import * as requestActions from '../../redux/requestActions'; import { saveAs } from 'file-saver/FileSaver'; -import { client } from './index'; +import { client } from './index'; const DEFAULT_PICTURE = 'resources/images/avatar-empty.jpeg'; @@ -71,13 +72,13 @@ class FileEntry extends Component }); }; - download = () => + handleDownload = () => { this.setState({ active : true }); - const magnet = this.props.data.file.magnet; + const magnetURI = this.props.data.file.magnet; const existingTorrent = client.get(magnet); @@ -87,7 +88,7 @@ class FileEntry extends Component return this.handleTorrent(existingTorrent); } - client.add(magnet, this.handleTorrent); + client.add(magnetURI, this.handleTorrent); } render() @@ -105,7 +106,7 @@ class FileEntry extends Component {!this.state.active && !this.state.files && (
- + @@ -144,6 +145,20 @@ class FileEntry extends Component } } +export const FileEntryProps = { + data : PropTypes.shape({ + name : PropTypes.string.isRequired, + picture : PropTypes.string.isRequired, + file : PropTypes.shape({ + magnet : PropTypes.string.isRequired + }).isRequired, + me : PropTypes.bool + }).isRequired, + notify : PropTypes.func.isRequired +}; + +FileEntry.propTypes = FileEntryProps; + const mapDispatchToProps = { notify : requestActions.notify }; diff --git a/app/lib/components/FileSharing/index.jsx b/app/lib/components/FileSharing/index.jsx index b1a46b7..35c5cb1 100644 --- a/app/lib/components/FileSharing/index.jsx +++ b/app/lib/components/FileSharing/index.jsx @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import WebTorrent from 'webtorrent'; import createTorrent from 'create-torrent'; @@ -8,7 +9,7 @@ import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import { store } from '../../store'; import config from '../../../config'; -import FileEntry from './FileEntry'; +import FileEntry, { FileEntryProps } from './FileEntry'; export const client = new WebTorrent({ tracker : { @@ -130,6 +131,10 @@ class FileSharing extends Component } } +FileSharing.propTypes = { + sharing : PropTypes.arrayOf(FileEntryProps.data).isRequired +}; + const mapStateToProps = (state) => ({ sharing : state.sharing diff --git a/app/lib/redux/stateActions.js b/app/lib/redux/stateActions.js index 6843ed8..008d308 100644 --- a/app/lib/redux/stateActions.js +++ b/app/lib/redux/stateActions.js @@ -452,8 +452,8 @@ export const addFile = (payload) => export const addFileHistory = (fileHistory) => { return { - type: 'ADD_FILE_HISTORY', - payload: { fileHistory } + type : 'ADD_FILE_HISTORY', + payload : { fileHistory } }; }; diff --git a/server/lib/Room.js b/server/lib/Room.js index 5cf87f0..ca95d1b 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -294,7 +294,7 @@ class Room extends EventEmitter accept(); protooPeer.send('file-history-receive', { - fileHistory: this._fileHistory + fileHistory : this._fileHistory }); break; From 8bf2aed6de24e3e537dad6ed7db624ee996a7dff Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 10:36:32 +0200 Subject: [PATCH 28/40] Make the server seed all torrent files --- server/config.example.js | 11 +- server/lib/Room.js | 22 +- server/package-lock.json | 3404 ++++++++++++++++++++++++++------------ server/package.json | 3 +- 4 files changed, 2362 insertions(+), 1078 deletions(-) diff --git a/server/config.example.js b/server/config.example.js index d44f7b6..9615767 100644 --- a/server/config.example.js +++ b/server/config.example.js @@ -16,7 +16,16 @@ module.exports = }, // Listening port for https server. listeningPort : 3443, - mediasoup : + turnServers : [ + { + urls : [ + 'turn:example.com:443?transport=tcp' + ], + username : 'example', + credential : 'example' + } + ], + mediasoup : { // mediasoup Server settings. logLevel : 'warn', diff --git a/server/lib/Room.js b/server/lib/Room.js index ca95d1b..1d949ef 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -2,6 +2,7 @@ const EventEmitter = require('events').EventEmitter; const protooServer = require('protoo-server'); +const WebTorrent = require('webtorrent'); const Logger = require('./Logger'); const config = require('../config'); @@ -11,6 +12,14 @@ const BITRATE_FACTOR = 0.75; const logger = new Logger('Room'); +const torrentClient = new WebTorrent({ + tracker : { + rtcConfig : { + iceServers : config.turnServers + } + } +}); + class Room extends EventEmitter { constructor(roomId, mediaServer) @@ -278,12 +287,17 @@ class Room extends EventEmitter { accept(); - const { file } = request.data; + const fileData = request.data.file; + + this._fileHistory.push(fileData); + + if (!torrentClient.get(fileData.file.magnet)) + { + torrentClient.add(fileData.file.magnet); + } - this._fileHistory.push(file); - this._protooRoom.spread('file-receive', { - file + file : fileData }, [ protooPeer ]); break; diff --git a/server/package-lock.json b/server/package-lock.json index f6d4823..15fd9f7 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -9,7 +9,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.19", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -25,7 +25,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -36,15 +36,20 @@ } } }, + "addr-to-ip-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz", + "integrity": "sha512-bA+dyydTNuQtrEDJ0g9eR7XabNhvrM5yZY0hvTbNK3yvoeC73ZqMES6E1cEqH9WPxs4uMtMsOjfwS4FmluhsAA==" + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -59,7 +64,7 @@ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "ansi-wrap": "^0.1.0" } }, "ansi-cyan": { @@ -119,8 +124,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "append-buffer": { @@ -129,7 +134,7 @@ "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "dev": true, "requires": { - "buffer-equal": "1.0.0" + "buffer-equal": "^1.0.0" } }, "archy": { @@ -144,7 +149,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -159,7 +164,7 @@ "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", "dev": true, "requires": { - "make-iterator": "1.0.1" + "make-iterator": "^1.0.0" } }, "arr-flatten": { @@ -174,7 +179,7 @@ "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", "dev": true, "requires": { - "make-iterator": "1.0.1" + "make-iterator": "^1.0.0" } }, "arr-union": { @@ -206,8 +211,8 @@ "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", "dev": true, "requires": { - "array-slice": "1.1.0", - "is-number": "4.0.0" + "array-slice": "^1.0.0", + "is-number": "^4.0.0" } }, "array-last": { @@ -216,7 +221,7 @@ "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dev": true, "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" } }, "array-slice": { @@ -231,9 +236,9 @@ "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", "dev": true, "requires": { - "default-compare": "1.0.0", - "get-value": "2.0.6", - "kind-of": "5.1.0" + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" }, "dependencies": { "kind-of": { @@ -250,7 +255,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -293,10 +298,10 @@ "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0", - "process-nextick-args": "1.0.7", - "stream-exhaust": "1.0.2" + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^1.0.7", + "stream-exhaust": "^1.0.1" } }, "async-each": { @@ -305,13 +310,18 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, "async-settle": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", "dev": true, "requires": { - "async-done": "1.3.1" + "async-done": "^1.2.2" } }, "asynckit": { @@ -341,9 +351,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "chalk": { @@ -352,11 +362,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } } } @@ -367,22 +377,21 @@ "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", "dev": true, "requires": { - "arr-filter": "1.1.2", - "arr-flatten": "1.1.0", - "arr-map": "2.0.2", - "array-each": "1.0.1", - "array-initial": "1.1.0", - "array-last": "1.3.0", - "async-done": "1.3.1", - "async-settle": "1.0.0", - "now-and-later": "2.0.0" + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -390,13 +399,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -405,7 +414,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -414,7 +423,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -423,7 +432,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -432,9 +441,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -450,7 +459,15 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" + } + }, + "bencode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.0.tgz", + "integrity": "sha512-wr2HwwrUpfB5c68zmAudOltC7rZ1G0+lQOcnuEcfIM3AWAVnB3rHI3nlgd/2CWTfQ3w3zagKt89zni/M+VLZ8g==", + "requires": { + "safe-buffer": "^5.1.1" } }, "binary-extensions": { @@ -459,21 +476,212 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "binary-search": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.4.tgz", + "integrity": "sha512-dPxU/vZLnH0tEVjVPgi015oSwqu6oLfCeHywuFRhBE0yM0mYocvleTl8qsdM1YFhRzTRhM1+VzS8XLDVrHPopg==" + }, + "bitfield": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bitfield/-/bitfield-2.0.0.tgz", + "integrity": "sha512-4xM4DYejOHQ/qWBfeqBXNA4mJ12PwcOibFYnH1kYh5U9BHciCqEJBqGNVnMJXUhm8mflujNRLSv7IiVQxovgjw==" + }, + "bittorrent-dht": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-8.4.0.tgz", + "integrity": "sha512-FRe/+MYBePev7Yb+BXSclkVuDxb/w+gUbao6nVHYQRaKO7aXE+ARRlL3phqm6Rdhw5CRVoLMbLd49nxmCuUhUQ==", + "requires": { + "bencode": "^2.0.0", + "buffer-equals": "^1.0.3", + "debug": "^3.1.0", + "inherits": "^2.0.1", + "k-bucket": "^4.0.0", + "k-rpc": "^5.0.0", + "last-one-wins": "^1.0.4", + "lru": "^3.1.0", + "randombytes": "^2.0.5", + "record-cache": "^1.0.2", + "safe-buffer": "^5.0.1", + "simple-sha1": "^2.1.0" + } + }, + "bittorrent-peerid": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bittorrent-peerid/-/bittorrent-peerid-1.3.0.tgz", + "integrity": "sha512-SYd5H3RbN1ex+TrWAKXkEkASFWxAR7Tk6iLt9tfAT9ehBvZb/Y3AQDVRVJynlrixcWpnmsLYKI7tkRWgp7ORoQ==" + }, + "bittorrent-protocol": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bittorrent-protocol/-/bittorrent-protocol-3.0.1.tgz", + "integrity": "sha512-hnvOzAu9u+2H0OLLL5byoFdz6oz5f3bx5f7R+ItUohTHMq9TgUhEJfcjo7xWtQHSKOVciYWwYTJ4EjczF5RX2A==", + "requires": { + "bencode": "^2.0.0", + "bitfield": "^2.0.0", + "debug": "^3.1.0", + "randombytes": "^2.0.5", + "readable-stream": "^2.3.2", + "speedometer": "^1.0.0", + "unordered-array-remove": "^1.0.2", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "speedometer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz", + "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, + "bittorrent-tracker": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-9.10.0.tgz", + "integrity": "sha512-mL/hLX5aT9D0ywIcleksJ3vaggxguwzyBTWEYU/8s7f3x8rvtB2SDNaQ548/CezqfVVxGNAHlBxctw4EeXSp8Q==", + "requires": { + "bencode": "^2.0.0", + "bittorrent-peerid": "^1.0.2", + "bn.js": "^4.4.0", + "bufferutil": "^4.0.0", + "compact2string": "^1.2.0", + "debug": "^3.1.0", + "inherits": "^2.0.1", + "ip": "^1.0.1", + "lru": "^3.0.0", + "minimist": "^1.1.1", + "once": "^1.3.0", + "random-iterate": "^1.0.1", + "randombytes": "^2.0.3", + "run-parallel": "^1.1.2", + "run-series": "^1.0.2", + "safe-buffer": "^5.0.0", + "simple-get": "^3.0.0", + "simple-peer": "^9.0.0", + "simple-websocket": "^7.0.1", + "string2compact": "^1.1.1", + "uniq": "^1.0.1", + "unordered-array-remove": "^1.0.2", + "utf-8-validate": "^5.0.1", + "ws": "^6.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, + "blob-to-buffer": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/blob-to-buffer/-/blob-to-buffer-1.2.8.tgz", + "integrity": "sha512-re0AIxakF504MgeMtIyJkVcZ8T5aUxtp/QmTMlmjyb3P44E1BEv5x3LATBGApWAJATyXHtkXRD+gWTmeyYLiQA==" + }, + "block-stream2": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/block-stream2/-/block-stream2-1.1.0.tgz", + "integrity": "sha1-xzjjqRupd+u14f70MeE8oR2GOeI=", + "requires": { + "defined": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, "body-parser": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.16" + "type-is": "~1.6.15" }, "dependencies": { "debug": { @@ -490,9 +698,8 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -502,16 +709,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -520,22 +727,59 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, + "browserify-package-json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-package-json/-/browserify-package-json-1.0.1.tgz", + "integrity": "sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=" + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, "buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, + "buffer-equals": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/buffer-equals/-/buffer-equals-1.0.4.tgz", + "integrity": "sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + }, + "bufferutil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.0.tgz", + "integrity": "sha512-jpnqMVLo7sqfUY2W92RC4jjj9TuiOSkjB0k43TxPcrBSntZwXUOl8Krfd3eVEdApuScpSTwYKntm/dXU2T8gnw==", + "optional": true, + "requires": { + "node-gyp-build": "~3.4.0" + } }, "builtin-modules": { "version": "1.1.1", @@ -553,15 +797,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "caller-path": { @@ -570,7 +814,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -591,8 +835,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "optional": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "caseless": { @@ -606,9 +850,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "ansi-styles": { @@ -617,7 +861,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.2" + "color-convert": "^1.9.0" } }, "supports-color": { @@ -626,7 +870,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -648,19 +892,63 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "chunk-store-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chunk-store-stream/-/chunk-store-stream-2.1.0.tgz", + "integrity": "sha512-mVVfkjLW3E4wgBIMBw+5es+q0ShA/67r8dvGwy31o3CUo4kJ74bxWEK2WDHCJ5rTFWFbtQe5O2ZKFJgCnsOcWA==", + "requires": { + "block-stream2": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "circular-json": { @@ -675,10 +963,10 @@ "integrity": "sha1-8gINNlN2CMDPrQeuvglNmXMFkLM=", "optional": true, "requires": { - "home-path": "0.1.2", - "mkdirp": "0.5.1", - "nugget": "1.6.2", - "path-exists": "1.0.0" + "home-path": "^0.1.1", + "mkdirp": "^0.5.0", + "nugget": "^1.5.1", + "path-exists": "^1.0.0" } }, "class-utils": { @@ -687,10 +975,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -699,7 +987,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -710,7 +998,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -725,9 +1013,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone": { @@ -754,9 +1042,9 @@ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { - "inherits": "2.0.3", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" }, "dependencies": { "isarray": { @@ -777,13 +1065,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -792,11 +1080,16 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } }, + "closest-to": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/closest-to/-/closest-to-2.0.0.tgz", + "integrity": "sha1-uyqGDtt3abYtBIIXSK5Q2iTb76o=" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -814,9 +1107,9 @@ "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", "dev": true, "requires": { - "arr-map": "2.0.2", - "for-own": "1.0.0", - "make-iterator": "1.0.1" + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, "collection-visit": { @@ -825,8 +1118,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -860,7 +1153,15 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" + } + }, + "compact2string": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.0.tgz", + "integrity": "sha1-qZzZbqAAUlaEsmloOuIiLW7qe0k=", + "requires": { + "ipaddr.js": ">= 0.1.5" } }, "component-emitter": { @@ -872,8 +1173,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -881,10 +1181,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { "isarray": { @@ -905,13 +1205,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -920,7 +1220,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -963,8 +1263,8 @@ "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", "dev": true, "requires": { - "each-props": "1.3.2", - "is-plain-object": "2.0.4" + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" } }, "core-util-is": { @@ -972,15 +1272,80 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "create-torrent": { + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/create-torrent/-/create-torrent-3.32.1.tgz", + "integrity": "sha512-8spZUeFyVc+2mGnWBRTuLOhuHmHrmUomFWf7QvxztCEvTpn5SIrvF8F+HKdkzBPM9B7v/2w+f/65jqLWBXSndg==", + "requires": { + "bencode": "^2.0.0", + "block-stream2": "^1.0.0", + "filestream": "^4.0.0", + "flatten": "^1.0.2", + "is-file": "^1.0.0", + "junk": "^2.1.0", + "minimist": "^1.1.0", + "multistream": "^2.0.2", + "once": "^1.3.0", + "piece-length": "^1.0.0", + "readable-stream": "^2.0.5", + "run-parallel": "^1.0.0", + "simple-sha1": "^2.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "currently-unhandled": { @@ -989,7 +1354,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "optional": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "d": { @@ -998,7 +1363,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.45" + "es5-ext": "^0.10.9" } }, "dashdash": { @@ -1006,7 +1371,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -1028,6 +1393,14 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1040,7 +1413,7 @@ "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dev": true, "requires": { - "kind-of": "5.1.0" + "kind-of": "^5.0.2" }, "dependencies": { "kind-of": { @@ -1063,8 +1436,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.12" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" }, "dependencies": { "object-keys": { @@ -1081,8 +1454,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1091,7 +1464,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1100,7 +1473,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1109,26 +1482,31 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -1158,7 +1536,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "duplexify": { @@ -1167,10 +1545,10 @@ "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, "dependencies": { "isarray": { @@ -1191,13 +1569,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -1206,7 +1584,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -1217,8 +1595,8 @@ "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", "dev": true, "requires": { - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0" + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" } }, "ecc-jsbn": { @@ -1227,7 +1605,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -1244,9 +1622,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "error-ex": { @@ -1254,7 +1631,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es5-ext": { @@ -1263,9 +1640,9 @@ "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-iterator": { @@ -1274,9 +1651,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-symbol": { @@ -1285,8 +1662,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -1295,10 +1672,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -1318,44 +1695,44 @@ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "concat-stream": "1.6.2", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.3", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.4", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.7.0", - "ignore": "3.3.10", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "regexpp": "1.1.0", - "require-uncached": "1.0.3", - "semver": "5.5.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", "table": "4.0.2", - "text-table": "0.2.0" + "text-table": "~0.2.0" }, "dependencies": { "ansi-regex": { @@ -1370,7 +1747,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -1381,8 +1758,8 @@ "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-visitor-keys": { @@ -1397,8 +1774,8 @@ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "5.7.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -1413,7 +1790,7 @@ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -1422,7 +1799,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -1448,13 +1825,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "debug": { @@ -1472,7 +1849,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -1481,7 +1858,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1492,7 +1869,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "express": { @@ -1500,36 +1877,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", + "proxy-addr": "~2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "debug": { @@ -1553,8 +1930,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -1563,7 +1940,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -1574,9 +1951,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -1585,14 +1962,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1601,7 +1978,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -1610,7 +1987,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -1619,7 +1996,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1628,7 +2005,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1637,9 +2014,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -1655,9 +2032,9 @@ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", "dev": true, "requires": { - "ansi-gray": "0.1.1", - "color-support": "1.1.3", - "time-stamp": "1.1.0" + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" } }, "fast-deep-equal": { @@ -1682,7 +2059,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -1691,8 +2068,58 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "filestream": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/filestream/-/filestream-4.1.3.tgz", + "integrity": "sha1-lI/KregiH3FfXsrdxUhi+qrMkyU=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5", + "typedarray-to-buffer": "^3.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } } }, "fill-range": { @@ -1701,10 +2128,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -1713,7 +2140,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-number": { @@ -1722,7 +2149,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "kind-of": { @@ -1731,7 +2158,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1742,12 +2169,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" }, "dependencies": { "debug": { @@ -1765,8 +2192,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "path-exists": { @@ -1774,7 +2201,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } } } @@ -1785,10 +2212,10 @@ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { - "detect-file": "1.0.0", - "is-glob": "3.1.0", - "micromatch": "3.1.10", - "resolve-dir": "1.0.1" + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" }, "dependencies": { "is-glob": { @@ -1797,7 +2224,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -1808,11 +2235,11 @@ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.2" + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" } }, "flagged-respawn": { @@ -1827,20 +2254,25 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" + }, "flush-write-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" }, "dependencies": { "isarray": { @@ -1861,13 +2293,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -1876,7 +2308,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -1893,7 +2325,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -1912,9 +2344,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.19" + "mime-types": "^2.1.12" } }, "forwarded": { @@ -1928,7 +2360,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fresh": { @@ -1936,14 +2368,27 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs-chunk-store": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/fs-chunk-store/-/fs-chunk-store-1.7.0.tgz", + "integrity": "sha512-KhjJmZAs2eqfhCb6PdPx4RcZtheGTz86tpTC5JTvqBn/xda+Nb+0C7dCyjOSN7T76H6a56LvH0SVXQMchLXDRw==", + "requires": { + "mkdirp": "^0.5.1", + "random-access-file": "^2.0.1", + "randombytes": "^2.0.3", + "rimraf": "^2.4.2", + "run-parallel": "^1.1.2", + "thunky": "^1.0.1" + } + }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "through2": "2.0.3" + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" }, "dependencies": { "isarray": { @@ -1964,13 +2409,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -1979,7 +2424,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "through2": { @@ -1988,8 +2433,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "xtend": { @@ -2003,8 +2448,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.4", @@ -2013,8 +2457,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.10.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -2040,8 +2484,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { @@ -2118,7 +2562,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -2133,14 +2577,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -2149,12 +2593,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -2169,7 +2613,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } }, "ignore-walk": { @@ -2187,8 +2631,8 @@ "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2207,7 +2651,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -2234,8 +2678,8 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, "minizlib": { @@ -2244,7 +2688,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "mkdirp": { @@ -2267,9 +2711,9 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { @@ -2278,16 +2722,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -2296,8 +2740,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -2312,8 +2756,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -2322,10 +2766,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -2344,7 +2788,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -2365,8 +2809,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -2387,10 +2831,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -2407,13 +2851,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -2422,7 +2866,7 @@ "dev": true, "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -2465,9 +2909,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -2476,7 +2920,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -2484,7 +2928,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -2499,13 +2943,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, "util-deprecate": { @@ -2520,7 +2964,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -2547,6 +2991,11 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "get-browser-rtc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz", + "integrity": "sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=" + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -2569,21 +3018,20 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { @@ -2592,8 +3040,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -2602,7 +3050,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -2613,16 +3061,16 @@ "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "dev": true, "requires": { - "extend": "3.0.2", - "glob": "7.1.2", - "glob-parent": "3.1.0", - "is-negated-glob": "1.0.0", - "ordered-read-streams": "1.0.1", - "pumpify": "1.5.1", - "readable-stream": "2.3.6", - "remove-trailing-separator": "1.1.0", - "to-absolute-glob": "2.0.2", - "unique-stream": "2.2.1" + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" }, "dependencies": { "isarray": { @@ -2643,13 +3091,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -2658,7 +3106,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -2669,10 +3117,10 @@ "integrity": "sha512-fK92r2COMC199WCyGUblrZKhjra3cyVMDiypDdqg1vsSDmexnbYivK1kNR4QItiNXLKmGlqan469ks67RtNa2g==", "dev": true, "requires": { - "async-done": "1.3.1", - "chokidar": "2.0.4", - "just-debounce": "1.0.0", - "object.defaults": "1.1.0" + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" } }, "global-modules": { @@ -2681,9 +3129,9 @@ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -2692,11 +3140,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.1" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -2711,12 +3159,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "glogg": { @@ -2725,7 +3173,7 @@ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", "dev": true, "requires": { - "sparkles": "1.0.1" + "sparkles": "^1.0.0" } }, "graceful-fs": { @@ -2739,10 +3187,10 @@ "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=", "dev": true, "requires": { - "glob-watcher": "5.0.1", - "gulp-cli": "2.0.1", - "undertaker": "1.2.0", - "vinyl-fs": "3.0.3" + "glob-watcher": "^5.0.0", + "gulp-cli": "^2.0.0", + "undertaker": "^1.0.0", + "vinyl-fs": "^3.0.0" }, "dependencies": { "gulp-cli": { @@ -2751,24 +3199,24 @@ "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==", "dev": true, "requires": { - "ansi-colors": "1.1.0", - "archy": "1.0.0", - "array-sort": "1.0.0", - "color-support": "1.1.3", - "concat-stream": "1.6.2", - "copy-props": "2.0.4", - "fancy-log": "1.3.2", - "gulplog": "1.0.0", - "interpret": "1.1.0", - "isobject": "3.0.1", - "liftoff": "2.5.0", - "matchdep": "2.0.0", - "mute-stdout": "1.0.0", - "pretty-hrtime": "1.0.3", - "replace-homedir": "1.0.0", - "semver-greatest-satisfied-range": "1.1.0", - "v8flags": "3.1.1", - "yargs": "7.1.0" + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^2.5.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" } } } @@ -2779,9 +3227,9 @@ "integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==", "dev": true, "requires": { - "eslint": "4.19.1", - "fancy-log": "1.3.2", - "plugin-error": "1.0.1" + "eslint": "^4.0.0", + "fancy-log": "^1.3.2", + "plugin-error": "^1.0.0" } }, "gulp-plumber": { @@ -2790,10 +3238,10 @@ "integrity": "sha512-L/LJftsbKoHbVj6dN5pvMsyJn9jYI0wT0nMg3G6VZhDac4NesezecYTi8/48rHi+yEic3sUpw6jlSc7qNWh32A==", "dev": true, "requires": { - "chalk": "1.1.3", - "fancy-log": "1.3.2", - "plugin-error": "0.1.2", - "through2": "2.0.3" + "chalk": "^1.1.3", + "fancy-log": "^1.3.2", + "plugin-error": "^0.1.2", + "through2": "^2.0.3" }, "dependencies": { "arr-diff": { @@ -2802,8 +3250,8 @@ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-slice": "0.2.3" + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" } }, "arr-union": { @@ -2824,11 +3272,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "extend-shallow": { @@ -2837,7 +3285,7 @@ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", "dev": true, "requires": { - "kind-of": "1.1.0" + "kind-of": "^1.1.0" } }, "isarray": { @@ -2858,11 +3306,11 @@ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", "dev": true, "requires": { - "ansi-cyan": "0.1.1", - "ansi-red": "0.1.1", - "arr-diff": "1.1.0", - "arr-union": "2.1.0", - "extend-shallow": "1.1.4" + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" } }, "process-nextick-args": { @@ -2877,13 +3325,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -2892,7 +3340,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "through2": { @@ -2901,8 +3349,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "xtend": { @@ -2919,7 +3367,7 @@ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { - "glogg": "1.0.1" + "glogg": "^1.0.0" } }, "har-schema": { @@ -2932,8 +3380,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-ansi": { @@ -2942,7 +3390,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -2963,9 +3411,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -2974,8 +3422,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -2984,7 +3432,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -2993,7 +3441,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3004,7 +3452,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3021,7 +3469,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -3034,10 +3482,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.4.0" + "statuses": ">= 1.4.0 < 2" } }, "http-signature": { @@ -3045,9 +3493,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -3061,6 +3509,11 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "immediate-chunk-store": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/immediate-chunk-store/-/immediate-chunk-store-1.0.8.tgz", + "integrity": "sha1-Ds2tDFRjMmcte1tRGya7GM5W5z8=" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3073,17 +3526,16 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "optional": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3103,20 +3555,20 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -3137,8 +3589,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -3147,7 +3599,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -3164,6 +3616,19 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-set": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ip-set/-/ip-set-1.0.1.tgz", + "integrity": "sha1-Yztm0L1sjQ3paNBTJjyRINO2cn4=", + "requires": { + "ip": "^1.1.3" + } + }, "ipaddr.js": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", @@ -3175,8 +3640,8 @@ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { - "is-relative": "1.0.0", - "is-windows": "1.0.2" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, "is-accessor-descriptor": { @@ -3185,7 +3650,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3194,7 +3659,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3204,13 +3669,18 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "is-ascii": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-ascii/-/is-ascii-1.0.0.tgz", + "integrity": "sha1-8CrQJZoJIc0Zn/Ic4bCeD2tOOSk=" + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -3224,7 +3694,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-data-descriptor": { @@ -3233,7 +3703,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3242,7 +3712,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3253,9 +3723,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -3278,13 +3748,18 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-file/-/is-file-1.0.0.tgz", + "integrity": "sha1-KKRM+9nT2xkwRfIrZfzo7fliBZY=" + }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -3293,7 +3768,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -3302,7 +3777,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-negated-glob": { @@ -3328,7 +3803,7 @@ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -3337,7 +3812,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-object": { @@ -3346,7 +3821,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-promise": { @@ -3361,7 +3836,7 @@ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "requires": { - "is-unc-path": "1.0.0" + "is-unc-path": "^1.0.0" } }, "is-resolvable": { @@ -3381,7 +3856,7 @@ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.2" } }, "is-utf8": { @@ -3436,8 +3911,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -3462,7 +3937,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stable-stringify-without-jsonify": { @@ -3493,25 +3968,66 @@ "verror": "1.10.0" } }, + "junk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-2.1.0.tgz", + "integrity": "sha1-9DG0t/By3FAKXxDOf07HGTDnATQ=" + }, "just-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", "dev": true }, + "k-bucket": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-4.0.1.tgz", + "integrity": "sha512-YvDpmY3waI999h1zZoW1rJ04fZrgZ+5PAlVmvwDHT6YO/Q1AOhdel07xsKy9eAvJjQ9xZV1wz3rXKqEfaWvlcQ==", + "requires": { + "inherits": "^2.0.1", + "randombytes": "^2.0.3" + } + }, + "k-rpc": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.0.0.tgz", + "integrity": "sha512-vCH2rQdfMOS+MlUuTSuar1pS2EMrltURf9LmAR9xR6Jik0XPlMX3vEixgqMn17wKmFVCublJqSJ4hJIP7oKZ3Q==", + "requires": { + "buffer-equals": "^1.0.3", + "k-bucket": "^4.0.0", + "k-rpc-socket": "^1.7.2", + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.1" + } + }, + "k-rpc-socket": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz", + "integrity": "sha512-f/9TynsO8YYjZ6JjNNtSSH7CJcIHcio1buy3zqByGxb/GX8AWLdL6FZEWTrN8V3/J7W4/E0ZTQQ+Jt2rVq7ELg==", + "requires": { + "bencode": "^2.0.0", + "buffer-equals": "^1.0.4", + "safe-buffer": "^5.1.1" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, + "last-one-wins": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", + "integrity": "sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=" + }, "last-run": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "dev": true, "requires": { - "default-resolution": "2.0.0", - "es6-weak-map": "2.0.2" + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" } }, "lazystream": { @@ -3520,7 +4036,7 @@ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.5" }, "dependencies": { "isarray": { @@ -3541,13 +4057,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -3556,7 +4072,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -3567,7 +4083,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "lead": { @@ -3576,7 +4092,7 @@ "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { - "flush-write-stream": "1.0.3" + "flush-write-stream": "^1.0.2" } }, "levn": { @@ -3585,8 +4101,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "liftoff": { @@ -3595,14 +4111,26 @@ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", "dev": true, "requires": { - "extend": "3.0.2", - "findup-sync": "2.0.0", - "fined": "1.1.0", - "flagged-respawn": "1.0.0", - "is-plain-object": "2.0.4", - "object.map": "1.0.1", - "rechoir": "0.6.2", - "resolve": "1.8.1" + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-ip-set": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/load-ip-set/-/load-ip-set-2.1.0.tgz", + "integrity": "sha512-taz7U6B+F7Zq90dfIKwqsB1CrFKelSEmMGC68OUqem8Cgd1QZygQBYb2Fk9i6muBSfH4xwF/Pjt4KKlAdOyWZw==", + "requires": { + "ip-set": "^1.0.0", + "netmask": "^1.0.6", + "once": "^1.3.0", + "simple-get": "^3.0.0", + "split": "^1.0.0" } }, "load-json-file": { @@ -3610,11 +4138,11 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "lodash": { @@ -3635,8 +4163,16 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "optional": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", + "integrity": "sha1-6n+4VG2DczOWoTCR12z+tMBoN9U=", + "requires": { + "inherits": "^2.0.1" } }, "lru-cache": { @@ -3645,8 +4181,25 @@ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magnet-uri": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-5.2.3.tgz", + "integrity": "sha512-INWVwcpWfZTVM+Yb4EXVBpm0FTd8Q98Fn5x7nuHv1hkFDRELgdIM+eJ3zYLbNTFpFPYtHs6B+sx8exs29IYwgA==", + "requires": { + "thirty-two": "^1.0.1", + "uniq": "^1.0.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } } }, "make-iterator": { @@ -3655,7 +4208,7 @@ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" } }, "map-cache": { @@ -3675,7 +4228,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "matchdep": { @@ -3684,9 +4237,9 @@ "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "dev": true, "requires": { - "findup-sync": "2.0.0", - "micromatch": "3.1.10", - "resolve": "1.8.1", + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", "stack-trace": "0.0.10" } }, @@ -3705,30 +4258,79 @@ "resolved": "https://registry.npmjs.org/mediasoup/-/mediasoup-2.2.2.tgz", "integrity": "sha512-O38Im04CKgQrANCtLFw324sG2zsncYqiOm/X0pCEDXWAAERBs1aqq6RygJAW6A/DM81V5CcDJf8ixfUhkiVEGw==", "requires": { - "check-types": "7.4.0", - "clang-tools-prebuilt": "0.1.4", - "debug": "3.1.0", - "netstring": "0.3.0", + "check-types": "^7.4.0", + "clang-tools-prebuilt": "^0.1.4", + "debug": "^3.1.0", + "netstring": "^0.3.0", "random-number": "0.0.9", - "randomatic": "3.0.0" + "randomatic": "^3.0.0" } }, + "mediasource": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mediasource/-/mediasource-2.2.1.tgz", + "integrity": "sha512-WRtioPZW7FbuD4OvgrGZU3t5c0sp1F4rGJhrYp4pMIK1u8Hi5HS5aiVvQf24T2/NBg650xdWOXgx8yqTUM71lw==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5", + "to-arraybuffer": "^1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "memory-chunk-store": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz", + "integrity": "sha512-6LsOpHKKhxYrLhHmOJdBCUtSO7op5rUs1pag0fhjHo0QiXRyna0bwYf4EmQuL7InUeF2J7dUMPr6VMogRyf9NA==" + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "optional": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { "minimist": { @@ -3755,19 +4357,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "mime": { @@ -3785,7 +4387,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", "requires": { - "mime-db": "1.35.0" + "mime-db": "~1.35.0" } }, "mimic-fn": { @@ -3794,13 +4396,17 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3814,8 +4420,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -3824,7 +4430,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -3837,11 +4443,110 @@ "minimist": "0.0.8" } }, + "mp4-box-encoding": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mp4-box-encoding/-/mp4-box-encoding-1.3.0.tgz", + "integrity": "sha512-U4pMLpjT/UzB8d36dxj6Mf1bG9xypEvgbuRIa1fztRXNKKTCAtRxsnFZhNOd7YDFOKtjBgssYGvo4H/Q3ZY1MA==", + "requires": { + "buffer-alloc": "^1.2.0", + "buffer-from": "^1.1.0", + "uint64be": "^2.0.2" + } + }, + "mp4-stream": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mp4-stream/-/mp4-stream-2.0.3.tgz", + "integrity": "sha512-5NzgI0+bGakoZEwnIYINXqB3mnewkt3Y7jcvkXsTubnCNUSdM8cpP0Vemxf6FLg0qUN8fydTgNMVAc3QU8B92g==", + "requires": { + "buffer-alloc": "^1.1.0", + "inherits": "^2.0.1", + "mp4-box-encoding": "^1.1.0", + "next-event": "^1.0.0", + "readable-stream": "^2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multistream": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", + "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "mute-stdout": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", @@ -3865,17 +4570,17 @@ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, "natural-compare": { @@ -3889,26 +4594,42 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" + }, "netstring": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/netstring/-/netstring-0.3.0.tgz", "integrity": "sha1-ho3FsgxY0/cwVTHUk2jqqr0ZtxI=" }, + "next-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-event/-/next-event-1.0.0.tgz", + "integrity": "sha1-53eKzeLlWALgrRh5w5z2917aYdg=" + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "node-gyp-build": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.4.0.tgz", + "integrity": "sha512-YoviGBJYGrPdLOKDIQB0sKxuKy/EEsxzooNkOZak4vSTKT/qH0Pa6dj3t1MJjEQGsefih61IyHDmO1WW7xOFfw==", + "optional": true + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "2.7.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -3917,7 +4638,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "now-and-later": { @@ -3926,7 +4647,7 @@ "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.3.2" } }, "nugget": { @@ -3935,12 +4656,12 @@ "integrity": "sha1-iMpuA7pXBqmRc/XaCQJZPWvK4Qc=", "optional": true, "requires": { - "debug": "2.6.9", - "minimist": "1.2.0", - "pretty-bytes": "1.0.4", - "progress-stream": "1.2.0", - "request": "2.87.0", - "single-line-log": "0.4.1", + "debug": "^2.1.3", + "minimist": "^1.1.0", + "pretty-bytes": "^1.0.2", + "progress-stream": "^1.1.0", + "request": "^2.45.0", + "single-line-log": "^0.4.1", "throttleit": "0.0.2" }, "dependencies": { @@ -3987,9 +4708,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -3998,7 +4719,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "kind-of": { @@ -4007,7 +4728,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4024,7 +4745,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.assign": { @@ -4033,10 +4754,10 @@ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "object-keys": "1.0.12" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" }, "dependencies": { "object-keys": { @@ -4053,10 +4774,10 @@ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "array-each": "1.0.1", - "array-slice": "1.1.0", - "for-own": "1.0.0", - "isobject": "3.0.1" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" } }, "object.map": { @@ -4065,8 +4786,8 @@ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { - "for-own": "1.0.0", - "make-iterator": "1.0.1" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, "object.pick": { @@ -4075,7 +4796,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "object.reduce": { @@ -4084,8 +4805,8 @@ "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", "dev": true, "requires": { - "for-own": "1.0.0", - "make-iterator": "1.0.1" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, "on-finished": { @@ -4100,9 +4821,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -4111,7 +4831,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "optionator": { @@ -4120,12 +4840,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "ordered-read-streams": { @@ -4134,7 +4854,7 @@ "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.1" }, "dependencies": { "isarray": { @@ -4155,13 +4875,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -4170,7 +4890,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -4181,7 +4901,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -4190,15 +4910,23 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "package-json-versionify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/package-json-versionify/-/package-json-versionify-1.0.4.tgz", + "integrity": "sha1-WGBYepRIc6a35tJujlH/siMVvxc=", + "requires": { + "browserify-package-json": "^1.0.0" + } + }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { - "is-absolute": "1.0.0", - "map-cache": "0.2.2", - "path-root": "0.1.1" + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" } }, "parse-json": { @@ -4206,15 +4934,41 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "1.3.2" + "error-ex": "^1.2.0" } }, + "parse-numeric-range": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", + "integrity": "sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=" + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parse-torrent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-6.1.1.tgz", + "integrity": "sha512-VOQseFSgXOJE1tnwLJHA6GAILC62GaXRtoCkf3cOiTxMt2P/Xjz1Oe6TVJB7BCm4WkgOY7QS22bjqA7Z4ryuJA==", + "requires": { + "bencode": "^2.0.0", + "blob-to-buffer": "^1.2.6", + "get-stdin": "^6.0.0", + "magnet-uri": "^5.1.3", + "simple-get": "^3.0.1", + "simple-sha1": "^2.0.0", + "uniq": "^1.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" + } + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -4231,7 +4985,7 @@ "resolved": "https://registry.npmjs.org/passport/-/passport-0.3.2.tgz", "integrity": "sha1-ndAJ+RXo/glbASSgG4+C2gdRAQI=", "requires": { - "passport-strategy": "1.0.0", + "passport-strategy": "1.x.x", "pause": "0.0.1" } }, @@ -4240,10 +4994,10 @@ "resolved": "https://registry.npmjs.org/passport-dataporten/-/passport-dataporten-1.3.0.tgz", "integrity": "sha1-EGuHHMgksAi263FKpZUy6JjN7UE=", "requires": { - "passport": "0.3.2", - "passport-oauth": "1.0.0", - "pkginfo": "0.2.3", - "request": "2.87.0" + "passport": "~0.3.2", + "passport-oauth": "~1.0.0", + "pkginfo": "~0.2.x", + "request": "^2.69.0" } }, "passport-oauth": { @@ -4251,8 +5005,8 @@ "resolved": "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz", "integrity": "sha1-kK/2M4dUDwIImvKM2tOep/gNd98=", "requires": { - "passport-oauth1": "1.1.0", - "passport-oauth2": "1.4.0" + "passport-oauth1": "1.x.x", + "passport-oauth2": "1.x.x" } }, "passport-oauth1": { @@ -4260,9 +5014,9 @@ "resolved": "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.1.0.tgz", "integrity": "sha1-p96YiiEfnPRoc3cTDqdN8ycwyRg=", "requires": { - "oauth": "0.9.15", - "passport-strategy": "1.0.0", - "utils-merge": "1.0.1" + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "utils-merge": "1.x.x" } }, "passport-oauth2": { @@ -4270,10 +5024,10 @@ "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.4.0.tgz", "integrity": "sha1-9i+BWDy+EmCb585vFguTlaJ7hq0=", "requires": { - "oauth": "0.9.15", - "passport-strategy": "1.0.0", - "uid2": "0.0.3", - "utils-merge": "1.0.1" + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" } }, "passport-strategy": { @@ -4296,8 +5050,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -4317,7 +5070,7 @@ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "path-root-regex": "0.1.2" + "path-root-regex": "^0.1.0" } }, "path-root-regex": { @@ -4336,9 +5089,9 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pause": { @@ -4351,6 +5104,14 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "piece-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/piece-length/-/piece-length-1.0.0.tgz", + "integrity": "sha1-TbcWcVf9af7xTK9yYs058YmyRQg=", + "requires": { + "closest-to": "~2.0.0" + } + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4366,7 +5127,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkginfo": { @@ -4380,10 +5141,10 @@ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "ansi-colors": "1.1.0", - "arr-diff": "4.0.0", - "arr-union": "3.1.0", - "extend-shallow": "3.0.2" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" } }, "pluralize": { @@ -4410,8 +5171,8 @@ "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", "optional": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "meow": "^3.1.0" } }, "pretty-hrtime": { @@ -4438,8 +5199,8 @@ "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", "optional": true, "requires": { - "speedometer": "0.1.4", - "through2": "0.2.3" + "speedometer": "~0.1.2", + "through2": "~0.2.3" } }, "protoo-server": { @@ -4447,9 +5208,9 @@ "resolved": "https://registry.npmjs.org/protoo-server/-/protoo-server-2.0.7.tgz", "integrity": "sha512-eqwoNGyLMg9NqJVFoly/ACY+ZuL7WGVRTDFzn1LI2g1EkMfHflwTzOUjTms0M5V1KKPHI91AkjAGy5Yms6uoWA==", "requires": { - "debug": "3.1.0", - "random-number": "0.0.9", - "websocket": "1.0.26" + "debug": "^3.1.0", + "random-number": "^0.0.9", + "websocket": "^1.0.25" } }, "proxy-addr": { @@ -4457,7 +5218,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" } }, @@ -4473,8 +5234,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -4483,9 +5244,9 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.6.0", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { @@ -4498,6 +5259,28 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, + "random-access-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-2.0.1.tgz", + "integrity": "sha512-nb4fClpzoUY+v1SHrro+9yykN90eMA1rc+xM39tnZ5R3BgFY+J/NxPZ0KuUpishEsvnwou9Fvm2wa3cjeuG7vg==", + "requires": { + "mkdirp": "^0.5.1", + "random-access-storage": "^1.1.1" + } + }, + "random-access-storage": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-1.3.0.tgz", + "integrity": "sha512-pdS9Mcb9TB7oICypPRALlheaSuszuAKmLVEPKJMuYor7R/zDuHh5ALuQoS+ox31XRwQUL+tDwWH2GPdyspwelA==", + "requires": { + "inherits": "^2.0.3" + } + }, + "random-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz", + "integrity": "sha1-99l9kt7mZl7F9toIx/ljytSyrJk=" + }, "random-number": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/random-number/-/random-number-0.0.9.tgz", @@ -4508,9 +5291,17 @@ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "requires": { + "safe-buffer": "^5.1.0" } }, "range-parser": { @@ -4518,6 +5309,49 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, + "range-slice-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-slice-stream/-/range-slice-stream-1.2.0.tgz", + "integrity": "sha1-AbqVQnYFK3g5AOY9YRjY/POHXX8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "raw-body": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", @@ -4542,7 +5376,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": ">= 1.3.1 < 2" } }, "setprototypeof": { @@ -4557,9 +5391,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -4567,8 +5401,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -4577,10 +5411,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "readdirp": { @@ -4589,10 +5423,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" }, "dependencies": { "isarray": { @@ -4613,13 +5447,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -4628,7 +5462,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -4639,17 +5473,22 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.8.1" + "resolve": "^1.1.6" } }, + "record-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.1.0.tgz", + "integrity": "sha512-u8rbtLEJV7HRacl/ZYwSBFD8NFyB3PfTTfGLP37IW3hftQCwu6z4Q2RLyxo1YJUNRTEzJfpLpGwVuEYdaIkG9Q==" + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "optional": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "regex-not": { @@ -4658,8 +5497,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpp": { @@ -4674,8 +5513,8 @@ "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, "requires": { - "is-buffer": "1.1.6", - "is-utf8": "0.2.1" + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" } }, "remove-bom-stream": { @@ -4684,9 +5523,9 @@ "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", "dev": true, "requires": { - "remove-bom-buffer": "3.0.0", - "safe-buffer": "5.1.1", - "through2": "2.0.3" + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" }, "dependencies": { "isarray": { @@ -4707,13 +5546,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -4722,7 +5561,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "through2": { @@ -4731,8 +5570,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "xtend": { @@ -4749,6 +5588,18 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, + "render-media": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/render-media/-/render-media-3.1.2.tgz", + "integrity": "sha512-SZZ1i5qsPTLKIkYZ5SHHFUArtj5hGzvNGcwnQnJcjcNI9X3yptAhB4dBdglTO9ViYG/CXQDz/liaqYLNFBWA/A==", + "requires": { + "debug": "^3.1.0", + "is-ascii": "^1.0.0", + "mediasource": "^2.1.0", + "stream-to-blob-url": "^2.0.0", + "videostream": "^2.3.0" + } + }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", @@ -4767,7 +5618,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "optional": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { @@ -4782,9 +5633,9 @@ "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1", - "is-absolute": "1.0.0", - "remove-trailing-separator": "1.1.0" + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" } }, "request": { @@ -4792,26 +5643,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.19", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "require-directory": { @@ -4832,8 +5683,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve": { @@ -4842,7 +5693,7 @@ "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-dir": { @@ -4851,8 +5702,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -4867,7 +5718,7 @@ "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", "dev": true, "requires": { - "value-or-function": "3.0.0" + "value-or-function": "^3.0.0" } }, "resolve-url": { @@ -4882,8 +5733,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -4896,9 +5747,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "run-async": { @@ -4907,9 +5757,29 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "run-parallel-limit": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.0.5.tgz", + "integrity": "sha512-NsY+oDngvrvMxKB3G8ijBzIema6aYbQMD2bHOamvN52BysbIGTnEY2xsNyfrcr9GhY995/t/0nQN3R3oZvaDlg==" + }, + "run-series": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.8.tgz", + "integrity": "sha512-+GztYEPRpIsQoCSraWHDBs9WVy4eVME16zhOtDB4H9J4xN0XRhknnmLOl+4gRgZtu8dpp9N/utSPjKH/xmDzXg==" + }, + "rusha": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", + "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=" + }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -4922,7 +5792,7 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { @@ -4936,7 +5806,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -4955,7 +5825,7 @@ "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", "dev": true, "requires": { - "sver-compat": "1.5.0" + "sver-compat": "^1.5.0" } }, "send": { @@ -4964,18 +5834,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { "debug": { @@ -4993,9 +5863,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -5017,10 +5887,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -5029,7 +5899,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5045,7 +5915,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -5059,6 +5929,121 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.0.2.tgz", + "integrity": "sha512-dU3TBVIGkP5Hzw6o74hJx+VzTBTX2rqIiLfugs0HdmdVQCQp76XGg2jlBCqfRJfW/n6/mUKTi+s3rnzX7SgbBA==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-peer": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.1.2.tgz", + "integrity": "sha512-MUWWno5o5cvISKOH4pYQ18PQJLpDaNWoKUbrPPKuspCLCkkh+zhtuQyTE8h2U2Ags+/OUN5wnUe92+9B8/Sm2Q==", + "requires": { + "debug": "^3.1.0", + "get-browser-rtc": "^1.0.0", + "inherits": "^2.0.1", + "randombytes": "^2.0.3", + "readable-stream": "^2.3.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "simple-sha1": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.1.tgz", + "integrity": "sha512-pFMPd+I/lQkpf4wFUeS/sED5IqdIG1lUlrQviBMV4u4mz8BRAcB5fvUx5Ckfg3kBigEglAjHg7E9k/yy2KlCqA==", + "requires": { + "rusha": "^0.8.1" + } + }, + "simple-websocket": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-7.2.0.tgz", + "integrity": "sha512-wdxFg1fHw1yqFKWDcw+yNb4VIYqtl+vknZMlpLhvZSlR6l7/iVuwozqo+Qtl73mB1IH5QnXzonD1S+hAaLNTvQ==", + "requires": { + "debug": "^3.1.0", + "inherits": "^2.0.1", + "randombytes": "^2.0.3", + "readable-stream": "^2.0.5", + "ws": "^6.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "single-line-log": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-0.4.1.tgz", @@ -5071,7 +6056,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -5088,14 +6073,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "debug": { @@ -5113,7 +6098,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -5122,7 +6107,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5133,9 +6118,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -5144,7 +6129,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -5153,7 +6138,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -5162,7 +6147,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -5171,9 +6156,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -5184,7 +6169,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { @@ -5193,7 +6178,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5210,11 +6195,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-url": { @@ -5234,8 +6219,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -5248,8 +6233,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -5263,13 +6248,21 @@ "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", "optional": true }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -5283,15 +6276,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "stack-trace": { @@ -5306,8 +6299,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -5316,7 +6309,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -5338,15 +6331,48 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "stream-to-blob": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-to-blob/-/stream-to-blob-1.0.1.tgz", + "integrity": "sha512-aRy4neA4rf+qMtLT9fCRLPGWdrsIKtCx4kUdNTIPgPQ2hkHkdxbViVAvABMx9oRM6yCWfngHx6pwXfbYkVuPuw==", + "requires": { + "once": "^1.3.3" + } + }, + "stream-to-blob-url": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/stream-to-blob-url/-/stream-to-blob-url-2.1.1.tgz", + "integrity": "sha512-DKJPEmCmIZoBfGVle9IhSfERiWaN5cuOtmfPxP2dZbLDRZxkBWZ4QbYxEJOSALk1Kf+WjBgedAMO6qkkf7Lmrg==", + "requires": { + "stream-to-blob": "^1.0.0" + } + }, + "stream-with-known-length-to-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-with-known-length-to-buffer/-/stream-with-known-length-to-buffer-1.0.2.tgz", + "integrity": "sha512-UxSISjxmguvfYzZdq6d4XAjc3gAocqTIOS1CjgwkDkkGT/LMTsIYiV8agIw42IHFFHf8k4lPOoroCCf4W9oqzg==", + "requires": { + "once": "^1.3.3" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string2compact": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string2compact/-/string2compact-1.3.0.tgz", + "integrity": "sha512-004ulKKANDuQilQsNxy2lisrpMG0qUJxBU+2YCEF7KziRyNR0Nredm2qk0f1V82nva59H3y9GWeHXE63HzGRFw==", + "requires": { + "addr-to-ip-port": "^1.0.1", + "ipaddr.js": "^1.0.1" } }, "string_decoder": { @@ -5361,7 +6387,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -5369,7 +6395,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-indent": { @@ -5378,7 +6404,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "optional": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -5399,8 +6425,8 @@ "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "table": { @@ -5409,12 +6435,12 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.4.1", - "lodash": "4.17.10", + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ansi-regex": { @@ -5435,8 +6461,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -5445,7 +6471,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -5456,6 +6482,11 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "thirty-two": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", + "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno=" + }, "throttleit": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", @@ -5465,8 +6496,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "0.2.3", @@ -5474,8 +6504,8 @@ "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", "optional": true, "requires": { - "readable-stream": "1.1.14", - "xtend": "2.1.2" + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" } }, "through2-filter": { @@ -5484,8 +6514,8 @@ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", "dev": true, "requires": { - "through2": "2.0.3", - "xtend": "4.0.1" + "through2": "~2.0.0", + "xtend": "~4.0.0" }, "dependencies": { "isarray": { @@ -5506,13 +6536,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -5521,7 +6551,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "through2": { @@ -5530,8 +6560,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "xtend": { @@ -5542,6 +6572,11 @@ } } }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=" + }, "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", @@ -5554,7 +6589,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-absolute-glob": { @@ -5563,17 +6598,22 @@ "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "dev": true, "requires": { - "is-absolute": "1.0.0", - "is-negated-glob": "1.0.0" + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" } }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5582,7 +6622,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5593,10 +6633,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -5605,8 +6645,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -5615,7 +6655,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "kind-of": { @@ -5624,7 +6664,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5635,7 +6675,7 @@ "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", "dev": true, "requires": { - "through2": "2.0.3" + "through2": "^2.0.3" }, "dependencies": { "isarray": { @@ -5656,13 +6696,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -5671,7 +6711,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "through2": { @@ -5680,8 +6720,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "xtend": { @@ -5692,12 +6732,36 @@ } } }, + "torrent-discovery": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/torrent-discovery/-/torrent-discovery-9.0.2.tgz", + "integrity": "sha512-UpkOyi/QUXRAwts8vSsFu/jRQ1mwGkaqv2OxLTJGr4DJKCiXpLHZ1+A4rxabcOWinM9RiqmS5mAjDuFfPHiJvw==", + "requires": { + "bittorrent-dht": "^8.0.1", + "bittorrent-tracker": "^9.0.0", + "debug": "^3.1.0", + "run-parallel": "^1.1.2", + "xtend": "^4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, + "torrent-piece": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/torrent-piece/-/torrent-piece-2.0.0.tgz", + "integrity": "sha512-H/Z/yCuvZJj1vl1IQHI8dvF2QrUuXRJoptT5DW5967/dsLpXlCg+uyhFR5lfNj5mNaYePUbKtnL+qKWZGXv4Nw==" + }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "trim-newlines": { @@ -5711,7 +6775,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -5726,7 +6790,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-is": { @@ -5735,7 +6799,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.19" + "mime-types": "~2.1.18" } }, "typedarray": { @@ -5749,7 +6813,7 @@ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "requires": { - "is-typedarray": "1.0.0" + "is-typedarray": "^1.0.0" } }, "uid2": { @@ -5757,6 +6821,14 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "uint64be": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-2.0.2.tgz", + "integrity": "sha512-9QqdvpGQTXgxthP+lY4e/gIBy+RuqcBaC6JVwT5I3bDLgT/btL6twZMR0pI3/Fgah9G/pdwzIprE5gL6v9UvyQ==", + "requires": { + "buffer-alloc": "^1.1.0" + } + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -5769,15 +6841,15 @@ "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "arr-map": "2.0.2", - "bach": "1.2.0", - "collection-map": "1.0.0", - "es6-weak-map": "2.0.2", - "last-run": "1.1.1", - "object.defaults": "1.1.0", - "object.reduce": "1.0.1", - "undertaker-registry": "1.0.1" + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" } }, "undertaker-registry": { @@ -5792,10 +6864,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -5804,7 +6876,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -5813,24 +6885,34 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, "unique-stream": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", "dev": true, "requires": { - "json-stable-stringify": "1.0.1", - "through2-filter": "2.0.0" + "json-stable-stringify": "^1.0.0", + "through2-filter": "^2.0.0" } }, + "unordered-array-remove": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", + "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -5842,8 +6924,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -5852,9 +6934,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -5900,11 +6982,43 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "ut_metadata": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/ut_metadata/-/ut_metadata-3.2.2.tgz", + "integrity": "sha512-PltK6kZ85DMscFl1gwyvOyja6UGROdyLI1ufWCTLsYnLfBaMyhtOEcbtgEgOwYEz8QuchR49qgHXTdJ2H05VHA==", + "requires": { + "bencode": "^2.0.0", + "bitfield": "^2.0.0", + "debug": "^3.1.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1", + "simple-sha1": "^2.0.0" + } + }, + "ut_pex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ut_pex/-/ut_pex-1.2.1.tgz", + "integrity": "sha512-ZrxMCbffYtxQDqvREN9kBXK2CB9tPnd5PylHoqQX9ai+3HV9/S39FnA5JnhLOC82dxIQQg0nTN2wmhtAdGNtOA==", + "requires": { + "bencode": "^2.0.0", + "compact2string": "^1.2.0", + "inherits": "^2.0.1", + "string2compact": "^1.2.5" + } + }, + "utf-8-validate": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.1.tgz", + "integrity": "sha512-Qef1AuiWWxQeZ1Oa4DTV3ArRafpZvsK+CLrlB8khLfsV+9mwhj58hNSGmel0ns5jYP+3yEwav6vxxW7Gz85bVw==", + "optional": true, + "requires": { + "node-gyp-build": "~3.4.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -5922,7 +7036,7 @@ "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "validate-npm-package-license": { @@ -5930,8 +7044,8 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "value-or-function": { @@ -5950,9 +7064,35 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" + } + }, + "videostream": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/videostream/-/videostream-2.5.1.tgz", + "integrity": "sha512-S3f34WE6NB1d/YUAa/EYcTURTkGaxsUqcDmsGWV1jQpQQJxeagc79/XA7ygNjzBf3DoQQ1MKTD+SocPsWSniAg==", + "requires": { + "binary-search": "^1.3.4", + "inherits": "^2.0.1", + "mediasource": "^2.0.0", + "mp4-box-encoding": "^1.3.0", + "mp4-stream": "^2.0.0", + "multistream": "^2.0.2", + "pump": "^3.0.0", + "range-slice-stream": "^1.2.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "vinyl": { @@ -5961,12 +7101,12 @@ "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, "requires": { - "clone": "2.1.1", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } }, "vinyl-fs": { @@ -5975,23 +7115,23 @@ "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", "dev": true, "requires": { - "fs-mkdirp-stream": "1.0.0", - "glob-stream": "6.1.0", - "graceful-fs": "4.1.11", - "is-valid-glob": "1.0.0", - "lazystream": "1.0.0", - "lead": "1.0.0", - "object.assign": "4.1.0", - "pumpify": "1.5.1", - "readable-stream": "2.3.6", - "remove-bom-buffer": "3.0.0", - "remove-bom-stream": "1.2.0", - "resolve-options": "1.1.0", - "through2": "2.0.3", - "to-through": "2.0.0", - "value-or-function": "3.0.0", - "vinyl": "2.2.0", - "vinyl-sourcemap": "1.1.0" + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" }, "dependencies": { "isarray": { @@ -6012,13 +7152,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -6027,7 +7167,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "through2": { @@ -6036,8 +7176,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "xtend": { @@ -6054,13 +7194,13 @@ "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", "dev": true, "requires": { - "append-buffer": "1.0.2", - "convert-source-map": "1.5.1", - "graceful-fs": "4.1.11", - "normalize-path": "2.1.1", - "now-and-later": "2.0.0", - "remove-bom-buffer": "3.0.0", - "vinyl": "2.2.0" + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" } }, "websocket": { @@ -6068,10 +7208,10 @@ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.26.tgz", "integrity": "sha512-fjcrYDPIQxpTnqFQ9JjxUQcdvR89MFAOjPBlF+vjOt49w/XW4fJknUoMz/mDIn2eK1AdslVojcaOxOqyZZV8rw==", "requires": { - "debug": "2.6.9", - "nan": "2.10.0", - "typedarray-to-buffer": "3.1.5", - "yaeti": "0.0.6" + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" }, "dependencies": { "debug": { @@ -6084,13 +7224,121 @@ } } }, + "webtorrent": { + "version": "0.101.2", + "resolved": "https://registry.npmjs.org/webtorrent/-/webtorrent-0.101.2.tgz", + "integrity": "sha512-GEr6m98uiTNdPVvk4XQHd2cBYoqlpk07JHZAm/LoJOXJB5CGAu+/vIdwIb3DqciPoTKlNf0TOOFEjAkeRVLCQg==", + "requires": { + "addr-to-ip-port": "^1.4.2", + "bitfield": "^2.0.0", + "bittorrent-dht": "^8.0.0", + "bittorrent-protocol": "^3.0.0", + "chunk-store-stream": "^2.0.2", + "create-torrent": "^3.24.5", + "debug": "^3.1.0", + "end-of-stream": "^1.1.0", + "fs-chunk-store": "^1.6.2", + "immediate-chunk-store": "^1.0.8", + "inherits": "^2.0.1", + "load-ip-set": "^2.1.0", + "memory-chunk-store": "^1.2.0", + "mime": "^2.2.0", + "multistream": "^2.0.5", + "package-json-versionify": "^1.0.2", + "parse-numeric-range": "^0.0.2", + "parse-torrent": "^6.0.0", + "pump": "^3.0.0", + "random-iterate": "^1.0.1", + "randombytes": "^2.0.3", + "range-parser": "^1.2.0", + "readable-stream": "^2.1.4", + "render-media": "^3.0.0", + "run-parallel": "^1.1.6", + "run-parallel-limit": "^1.0.3", + "safe-buffer": "^5.0.1", + "simple-concat": "^1.0.0", + "simple-get": "^3.0.1", + "simple-peer": "^9.0.0", + "simple-sha1": "^2.0.8", + "speedometer": "^1.0.0", + "stream-to-blob": "^1.0.0", + "stream-to-blob-url": "^2.1.0", + "stream-with-known-length-to-buffer": "^1.0.0", + "torrent-discovery": "^9.0.2", + "torrent-piece": "^2.0.0", + "uniq": "^1.0.1", + "unordered-array-remove": "^1.0.2", + "ut_metadata": "^3.0.8", + "ut_pex": "^1.1.1", + "xtend": "^4.0.1", + "zero-fill": "^2.2.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "speedometer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz", + "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -6111,15 +7359,14 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", @@ -6127,7 +7374,15 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.0.0.tgz", + "integrity": "sha512-c2UlYcAZp1VS8AORtpq6y4RJIkJ9dQz18W32SpR/qXGfLDZ2jU4y4wKvvZwqbi7U6gxFQTeE+urMbXU/tsDy4w==", + "requires": { + "async-limiter": "~1.0.0" } }, "xtend": { @@ -6136,7 +7391,7 @@ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", "optional": true, "requires": { - "object-keys": "0.4.0" + "object-keys": "~0.4.0" } }, "y18n": { @@ -6162,19 +7417,19 @@ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "dev": true, "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" }, "dependencies": { "camelcase": { @@ -6191,7 +7446,7 @@ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { @@ -6201,6 +7456,11 @@ "dev": true } } + }, + "zero-fill": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/zero-fill/-/zero-fill-2.2.3.tgz", + "integrity": "sha1-o97wa6XjmuZEhQu0yirUEStIVek=" } } } diff --git a/server/package.json b/server/package.json index 273b577..dfbb4ef 100644 --- a/server/package.json +++ b/server/package.json @@ -13,7 +13,8 @@ "express": "^4.16.3", "mediasoup": "^2.1.0", "passport-dataporten": "^1.3.0", - "protoo-server": "^2.0.7" + "protoo-server": "^2.0.7", + "webtorrent": "^0.101.2" }, "devDependencies": { "gulp": "^4.0.0", From f6ca8376467688a4c9fc140555a21a20001e03d4 Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 10:39:01 +0200 Subject: [PATCH 29/40] Remove old notification functionality --- app/lib/RoomClient.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/lib/RoomClient.js b/app/lib/RoomClient.js index 0d1873b..094a82c 100644 --- a/app/lib/RoomClient.js +++ b/app/lib/RoomClient.js @@ -1149,16 +1149,6 @@ export default class RoomClient this._dispatch( stateActions.addResponseMessage({ ...chatMessage, peerName })); - const toolAreaState = this._getState().toolarea; - - // Notify about the new file, unless the chat is open. - if (chatMessage.file && !(toolAreaState.toolAreaOpen && toolAreaState.currentToolTab === 'chat')) - { - this._dispatch( - requestActions.notify({ text: `${chatMessage.name} shared a file` }) - ); - } - break; } From 31a0017e705c2094a4a3e1331d9565742d659240 Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 12:33:24 +0200 Subject: [PATCH 30/40] Use webtorrent-hybrid for server webtorrents --- app/lib/components/FileSharing/FileEntry.jsx | 2 +- server/lib/Room.js | 2 +- server/package-lock.json | 994 +++++++++++++++++-- server/package.json | 2 +- 4 files changed, 928 insertions(+), 72 deletions(-) diff --git a/app/lib/components/FileSharing/FileEntry.jsx b/app/lib/components/FileSharing/FileEntry.jsx index c35d09b..2f4c090 100644 --- a/app/lib/components/FileSharing/FileEntry.jsx +++ b/app/lib/components/FileSharing/FileEntry.jsx @@ -148,7 +148,7 @@ class FileEntry extends Component export const FileEntryProps = { data : PropTypes.shape({ name : PropTypes.string.isRequired, - picture : PropTypes.string.isRequired, + picture : PropTypes.string, file : PropTypes.shape({ magnet : PropTypes.string.isRequired }).isRequired, diff --git a/server/lib/Room.js b/server/lib/Room.js index 1d949ef..d3e71c6 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -2,7 +2,7 @@ const EventEmitter = require('events').EventEmitter; const protooServer = require('protoo-server'); -const WebTorrent = require('webtorrent'); +const WebTorrent = require('webtorrent-hybrid'); const Logger = require('./Logger'); const config = require('../config'); diff --git a/server/package-lock.json b/server/package-lock.json index 15fd9f7..897da1e 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/node": { + "version": "8.10.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.22.tgz", + "integrity": "sha512-HCJ1dUJEQVFRekwBAlyv9pJ+2rzxq9uimSmsK2q7YDYMbXR3b4BXcO9rsN+36ZBwSWQ5BNh5o8xdZijDSonS5A==" + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -41,6 +46,16 @@ "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz", "integrity": "sha512-bA+dyydTNuQtrEDJ0g9eR7XabNhvrM5yZY0hvTbNK3yvoeC73ZqMES6E1cEqH9WPxs4uMtMsOjfwS4FmluhsAA==" }, + "airplay-js": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/airplay-js/-/airplay-js-0.3.0.tgz", + "integrity": "sha1-FrrC75GzEkk4KSS/3uq63cnbc5g=", + "optional": true, + "requires": { + "mdns-js": "0.5.0", + "plist-with-patches": "0.5.1" + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -103,8 +118,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "2.2.1", @@ -197,8 +211,7 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "optional": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { "version": "1.1.1", @@ -276,6 +289,16 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "ascli": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-0.3.0.tgz", + "integrity": "sha1-XmYjDlIZ/j6JUqTvtPIPrllqgTo=", + "optional": true, + "requires": { + "colour": "^0.7.1", + "optjs": "^3.2.2" + } + }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -772,6 +795,12 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "optional": true + }, "bufferutil": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.0.tgz", @@ -781,11 +810,27 @@ "node-gyp-build": "~3.4.0" } }, + "bufferview": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bufferview/-/bufferview-1.0.1.tgz", + "integrity": "sha1-ev10pF+Tf6QiodM4wIu/3HbNcl0=", + "optional": true + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, + "bytebuffer": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-3.5.5.tgz", + "integrity": "sha1-em+vGhNRSwg/H8+VQcTJv75+f9M=", + "optional": true, + "requires": { + "bufferview": "~1", + "long": "~2 >=2.2.3" + } + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -826,14 +871,12 @@ "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "optional": true + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" }, "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "optional": true, "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" @@ -844,6 +887,48 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "castv2": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/castv2/-/castv2-0.1.9.tgz", + "integrity": "sha1-0LD6sf0GsNnMpjaIZxbsEpOlkFo=", + "optional": true, + "requires": { + "debug": "^2.2.0", + "protobufjs": "^3.2.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "castv2-client": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/castv2-client/-/castv2-client-1.2.0.tgz", + "integrity": "sha1-qRk7GlRIuMuaBBW9AhyIEe17BUQ=", + "optional": true, + "requires": { + "castv2": "~0.1.4", + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -907,6 +992,51 @@ "upath": "^1.0.5" } }, + "chromecasts": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/chromecasts/-/chromecasts-1.9.1.tgz", + "integrity": "sha512-nsXv7ufgrpC8s5DUm6FJEa2XJ2VvE9FmbTVi6r4zGreTFTTSRSJjvqVEqLUFX/fGo/zbSre3zdoV+Pu9DGLz0A==", + "optional": true, + "requires": { + "castv2-client": "^1.1.0", + "debug": "^2.1.3", + "dns-txt": "^2.0.2", + "mime": "^1.3.4", + "multicast-dns": "^6.0.1", + "node-ssdp": "^2.2.0", + "simple-get": "^2.0.0", + "thunky": "^0.1.0", + "xml2js": "^0.4.8" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "optional": true, + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "optional": true + } + } + }, "chunk-store-stream": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chunk-store-stream/-/chunk-store-stream-2.1.0.tgz", @@ -1018,6 +1148,11 @@ "wrap-ansi": "^2.0.0" } }, + "clivas": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clivas/-/clivas-0.2.0.tgz", + "integrity": "sha1-uNGRiLMkPjkPMCQQvQyxYi24Jkk=" + }, "clone": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", @@ -1098,8 +1233,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-map": { "version": "1.0.0", @@ -1148,6 +1282,12 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.1.tgz", "integrity": "sha512-jg/vxRmv430jixZrC+La5kMbUWqIg32/JsYNZb94+JEmzceYbWKTsv1OuTp+7EaqiaWRR2tPcykibwCRgclIsw==" }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", + "optional": true + }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -1179,7 +1319,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -1190,20 +1329,17 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1218,7 +1354,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -1341,7 +1476,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -1352,7 +1486,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "optional": true, "requires": { "array-find-index": "^1.0.1" } @@ -1401,6 +1534,11 @@ "mimic-response": "^1.0.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1530,6 +1668,65 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, + "dlnacasts": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dlnacasts/-/dlnacasts-0.1.0.tgz", + "integrity": "sha1-+AUhHcrHT2uzpNXVVBrXg7G2fSI=", + "requires": { + "debug": "^2.1.3", + "mime": "^1.3.4", + "node-ssdp": "^2.7.1", + "run-parallel": "^1.1.6", + "simple-get": "^2.1.0", + "thunky": "^0.1.0", + "upnp-mediarenderer-client": "^1.2.2", + "xml2js": "^0.4.8" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=" + } + } + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "optional": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "optional": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -1608,11 +1805,157 @@ "jsbn": "~0.1.0" } }, + "ecstatic": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.2.1.tgz", + "integrity": "sha512-BAdHx9LOCG1fwxY8MIydUBskl8UUQrYeC3WE14FA1DPlBzqoG1aOgEkypcSpmiiel8RAj8gW1s40RrclfrpGUg==", + "requires": { + "he": "^1.1.1", + "mime": "^1.6.0", + "minimist": "^1.1.0", + "url-join": "^2.0.5" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "electron": { + "version": "1.8.7", + "resolved": "https://registry.npmjs.org/electron/-/electron-1.8.7.tgz", + "integrity": "sha512-q6dn8bspX8u8z6tNU4bEas6ZrdNavnrjJ6d/oz49Nb4zFIPrdh8p29AFjFlSAavypGwAVR/PhYOAGwzZSQSSVQ==", + "requires": { + "@types/node": "^8.0.24", + "electron-download": "^3.0.1", + "extract-zip": "^1.0.3" + } + }, + "electron-download": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", + "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "requires": { + "debug": "^2.2.0", + "fs-extra": "^0.30.0", + "home-path": "^1.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.0", + "path-exists": "^2.1.0", + "rc": "^1.1.2", + "semver": "^5.3.0", + "sumchecker": "^1.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "home-path": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", + "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "requires": { + "debug": "^2.1.3", + "minimist": "^1.1.0", + "pretty-bytes": "^1.0.2", + "progress-stream": "^1.1.0", + "request": "^2.45.0", + "single-line-log": "^1.1.2", + "throttleit": "0.0.2" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "requires": { + "string-width": "^1.0.1" + } + } + } + }, + "electron-eval": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/electron-eval/-/electron-eval-0.9.10.tgz", + "integrity": "sha512-VrAw2MrAjCwM8EGQsY+n48/f9P4W+AH56adERtDEb9bl5Hw9aN+ectmuK9QIi2XA11g+owQlyj2N4AzvdT363A==", + "requires": { + "cross-spawn": "^5.1.0", + "electron": "^1.6.11", + "headless": "https://github.com/paulkernfeld/node-headless/tarball/master", + "ndjson": "^1.5.0" + } + }, + "electron-webrtc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-webrtc/-/electron-webrtc-0.3.0.tgz", + "integrity": "sha1-VG0cqBpEU0jDIGLLnaXnpKasrc8=", + "requires": { + "debug": "^2.2.0", + "electron-eval": "^0.9.0", + "get-browser-rtc": "^1.0.2", + "hat": "^0.0.3" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA=", + "requires": { + "sax": "1.1.4" + }, + "dependencies": { + "sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk=" + } + } + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1656,6 +1999,11 @@ "es6-symbol": "^3.1.1" } }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" + }, "es6-symbol": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", @@ -1819,6 +2167,14 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "requires": { + "pify": "^2.2.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2021,6 +2377,27 @@ } } }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -2053,6 +2430,14 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -2381,6 +2766,18 @@ "thunky": "^1.0.1" } }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -2491,14 +2888,16 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -2516,7 +2915,8 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", @@ -2622,7 +3022,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -2664,8 +3064,9 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3457,6 +3858,21 @@ } } }, + "hat": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", + "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "headless": { + "version": "https://github.com/paulkernfeld/node-headless/tarball/master", + "integrity": "sha512-Y+OAUntNS8dvU9cX0NHuTegMu7sDbd9KbPHF/pe9YO64UvuSE14AEKmMqzRqywQx83a3Y23inqC6iDvAd6PIYA==", + "optional": true + }, "home-path": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/home-path/-/home-path-0.1.2.tgz", @@ -3524,7 +3940,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "optional": true, "requires": { "repeating": "^2.0.0" } @@ -3546,8 +3961,7 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "3.3.0", @@ -3757,7 +4171,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3766,7 +4179,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3879,14 +4291,12 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "optional": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -3951,6 +4361,14 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -4015,6 +4433,14 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, "last-one-wins": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", @@ -4157,11 +4583,16 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, + "long": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", + "integrity": "sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8=", + "optional": true + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "optional": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" @@ -4179,7 +4610,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -4248,6 +4678,55 @@ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" }, + "mdns-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mdns-js/-/mdns-js-0.5.0.tgz", + "integrity": "sha1-TIq7a6fKvciS05Iow/qiVW4Jz4c=", + "optional": true, + "requires": { + "debug": "^2.1.1", + "mdns-js-packet": "~0.2.0", + "semver": "~5.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "semver": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.1.tgz", + "integrity": "sha1-oykqNz5vPgeY2gsgZBuanFvEfhk=", + "optional": true + } + } + }, + "mdns-js-packet": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdns-js-packet/-/mdns-js-packet-0.2.0.tgz", + "integrity": "sha1-ZCQJ6Bg8dWHMYGFbvRQg7C+tdhY=", + "optional": true, + "requires": { + "debug": "^2.1.0", + "qap": "^3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4319,7 +4798,6 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "optional": true, "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -4336,8 +4814,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -4443,6 +4920,11 @@ "minimist": "0.0.8" } }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, "mp4-box-encoding": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/mp4-box-encoding/-/mp4-box-encoding-1.3.0.tgz", @@ -4504,6 +4986,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "optional": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, "multistream": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", @@ -4589,6 +5081,70 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "ndjson": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz", + "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=", + "requires": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.0", + "split2": "^2.1.0", + "through2": "^2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -4604,6 +5160,11 @@ "resolved": "https://registry.npmjs.org/netstring/-/netstring-0.3.0.tgz", "integrity": "sha1-ho3FsgxY0/cwVTHUk2jqqr0ZtxI=" }, + "network-address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/network-address/-/network-address-1.1.2.tgz", + "integrity": "sha1-Sqe/1D8D8LgclwKxPWqFjdsybz4=" + }, "next-event": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-event/-/next-event-1.0.0.tgz", @@ -4621,6 +5182,34 @@ "integrity": "sha512-YoviGBJYGrPdLOKDIQB0sKxuKy/EEsxzooNkOZak4vSTKT/qH0Pa6dj3t1MJjEQGsefih61IyHDmO1WW7xOFfw==", "optional": true }, + "node-ssdp": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/node-ssdp/-/node-ssdp-2.9.1.tgz", + "integrity": "sha1-LWuo5+/5v1szhWT5H3rF1c3dxVs=", + "requires": { + "debug": "^2.2.0", + "ip": "^1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "nodebmc": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/nodebmc/-/nodebmc-0.0.7.tgz", + "integrity": "sha1-+uF5FlJlUJMCzvvr6r0pvUA1GE0=", + "optional": true, + "requires": { + "mdns-js": "0.5.0" + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -4736,8 +5325,7 @@ "object-keys": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "optional": true + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" }, "object-visit": { "version": "1.0.1", @@ -4834,6 +5422,11 @@ "mimic-fn": "^1.0.0" } }, + "open": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=" + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -4848,6 +5441,12 @@ "wordwrap": "~1.0.0" } }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=", + "optional": true + }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -5099,6 +5698,11 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5135,6 +5739,16 @@ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz", "integrity": "sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=" }, + "plist-with-patches": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/plist-with-patches/-/plist-with-patches-0.5.1.tgz", + "integrity": "sha1-hoquLg34mJsCZWKzXLwZz9i7eA0=", + "optional": true, + "requires": { + "xmlbuilder": "0.4.x", + "xmldom": "0.1.x" + } + }, "plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", @@ -5165,11 +5779,15 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prettier-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prettier-bytes/-/prettier-bytes-1.0.4.tgz", + "integrity": "sha1-mUsCqkb2mcULYle1+qp/4lV+YtY=" + }, "pretty-bytes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "optional": true, "requires": { "get-stdin": "^4.0.1", "meow": "^3.1.0" @@ -5197,12 +5815,21 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", - "optional": true, "requires": { "speedometer": "~0.1.2", "through2": "~0.2.3" } }, + "protobufjs": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-3.8.2.tgz", + "integrity": "sha1-vIJuNMOvRpfo0K96Zp5NYSrtzRc=", + "optional": true, + "requires": { + "ascli": "~0.3", + "bytebuffer": "~3 >=3.5" + } + }, "protoo-server": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/protoo-server/-/protoo-server-2.0.7.tgz", @@ -5225,8 +5852,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "pump": { "version": "2.0.1", @@ -5254,6 +5880,12 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "qap": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/qap/-/qap-3.3.1.tgz", + "integrity": "sha1-Efno+oiQ/ny5khDA9E0GE7c3LKw=", + "optional": true + }, "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", @@ -5386,6 +6018,24 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -5409,7 +6059,6 @@ "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -5485,7 +6134,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "optional": true, "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" @@ -5616,7 +6264,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "optional": true, "requires": { "is-finite": "^1.0.0" } @@ -5814,6 +6461,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -5913,7 +6565,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -5921,8 +6572,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "signal-exit": { "version": "3.0.2", @@ -6245,8 +6895,7 @@ "speedometer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", - "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", - "optional": true + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" }, "split": { "version": "1.0.1", @@ -6265,6 +6914,62 @@ "extend-shallow": "^3.0.0" } }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "requires": { + "through2": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6359,7 +7064,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6378,14 +7082,12 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "optional": true + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6402,7 +7104,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "optional": true, "requires": { "get-stdin": "^4.0.1" } @@ -6410,8 +7111,26 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "requires": { + "debug": "^2.2.0", + "es6-promise": "^4.0.5" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } }, "supports-color": { "version": "2.0.0", @@ -6490,8 +7209,7 @@ "throttleit": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", - "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", - "optional": true + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" }, "through": { "version": "2.3.8", @@ -6502,7 +7220,6 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "optional": true, "requires": { "readable-stream": "~1.1.9", "xtend": "~2.1.1" @@ -6767,8 +7484,7 @@ "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "optional": true + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "tunnel-agent": { "version": "0.6.0", @@ -6805,8 +7521,7 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typedarray-to-buffer": { "version": "3.1.5", @@ -6970,12 +7685,58 @@ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, + "upnp-device-client": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/upnp-device-client/-/upnp-device-client-1.0.2.tgz", + "integrity": "sha1-kfhHBfI0m/iQgoVf/04wBqxDUzc=", + "requires": { + "concat-stream": "^1.4.8", + "debug": "^2.1.3", + "elementtree": "~0.1.6", + "network-address": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "upnp-mediarenderer-client": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/upnp-mediarenderer-client/-/upnp-mediarenderer-client-1.2.4.tgz", + "integrity": "sha1-DGOlGAIIK2sDtZbEdcxk/B4Id8g=", + "requires": { + "debug": "^2.1.3", + "elementtree": "^0.1.6", + "upnp-device-client": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=" + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -7203,6 +7964,15 @@ "vinyl": "^2.0.0" } }, + "vlc-command": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vlc-command/-/vlc-command-1.1.1.tgz", + "integrity": "sha1-NJuF3vgx+YDNbuxWCxmQ/Zier5I=", + "requires": { + "run-parallel": "^1.1.6", + "winreg": "^1.2.1" + } + }, "websocket": { "version": "1.0.26", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.26.tgz", @@ -7332,11 +8102,58 @@ } } }, + "webtorrent-cli": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/webtorrent-cli/-/webtorrent-cli-1.12.3.tgz", + "integrity": "sha512-NnBAGkD64CRsl9edM9q0QU+ku6nCX32nM0U+YC8Gs/36c8y+5m9Tya3mWIux3oZKZ54yGiVtnok4tUpqDE5tMA==", + "requires": { + "airplay-js": "^0.3.0", + "chromecasts": "^1.5.3", + "clivas": "^0.2.0", + "create-torrent": "^3.23.1", + "dlnacasts": "^0.1.0", + "ecstatic": "^3.0.0", + "executable": "^4.0.0", + "mime": "^2.1.0", + "minimist": "^1.2.0", + "moment": "^2.12.0", + "network-address": "^1.1.0", + "nodebmc": "0.0.7", + "open": "0.0.5", + "parse-torrent": "^6.0.0", + "prettier-bytes": "^1.0.3", + "vlc-command": "^1.0.0", + "webtorrent": "0.x", + "winreg": "^1.0.1" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "webtorrent-hybrid": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/webtorrent-hybrid/-/webtorrent-hybrid-1.0.6.tgz", + "integrity": "sha1-g73p2aOai1hvSm8/NtTIVtslP0Q=", + "requires": { + "create-torrent": "^3.23.1", + "electron-webrtc": "^0.3.0", + "webtorrent": "0.x", + "webtorrent-cli": "^1.0.1" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -7347,6 +8164,11 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, + "winreg": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", + "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -7385,11 +8207,38 @@ "async-limiter": "~1.0.0" } }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + } + } + }, + "xmlbuilder": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.3.tgz", + "integrity": "sha1-xGFLp04K0ZbmCcknLNnh3bKKilg=", + "optional": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "optional": true + }, "xtend": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "optional": true, "requires": { "object-keys": "~0.4.0" } @@ -7408,8 +8257,7 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "7.1.0", @@ -7457,6 +8305,14 @@ } } }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "requires": { + "fd-slicer": "~1.0.1" + } + }, "zero-fill": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/zero-fill/-/zero-fill-2.2.3.tgz", diff --git a/server/package.json b/server/package.json index dfbb4ef..e4e72e7 100644 --- a/server/package.json +++ b/server/package.json @@ -14,7 +14,7 @@ "mediasoup": "^2.1.0", "passport-dataporten": "^1.3.0", "protoo-server": "^2.0.7", - "webtorrent": "^0.101.2" + "webtorrent-hybrid": "^1.0.6" }, "devDependencies": { "gulp": "^4.0.0", From 5ac91a25281648f7ee3429d6d9a1fb69edd5470c Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 12:39:53 +0200 Subject: [PATCH 31/40] Explain headless electron requirement in README --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 912f30c..45323b0 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,19 @@ $ cd server $ npm install ``` +In addition, the server requires a screen to be installed for the server +to be able to seed shared torrent files. This is because the headless +Electron instance used by WebTorrent expects one. This means that in order +to run the project on a server, you need to install a virtual screen +such as `xvfb` by running + +```bash +sudo apt install xvfb +``` + +See [webtorrent-hybrid](https://github.com/webtorrent/webtorrent-hybrid) for +more information about this. + * Copy `config.example.js` as `config.js` and customize it for your scenario: ```bash From 60c6221af72098ab69ab1278be2c63f1e0016cc4 Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 12:59:59 +0200 Subject: [PATCH 32/40] Use tabs for stylus file --- app/lib/components/Chat/Chat.jsx | 1 - app/lib/components/Chat/MessageList.jsx | 2 +- app/stylus/components/FileSharing.styl | 104 ++++++++++++------------ 3 files changed, 53 insertions(+), 54 deletions(-) diff --git a/app/lib/components/Chat/Chat.jsx b/app/lib/components/Chat/Chat.jsx index aa12109..898bf75 100644 --- a/app/lib/components/Chat/Chat.jsx +++ b/app/lib/components/Chat/Chat.jsx @@ -21,7 +21,6 @@ class Chat extends Component return (
- { onSendMessage(e, displayName, picture); }} diff --git a/app/lib/components/Chat/MessageList.jsx b/app/lib/components/Chat/MessageList.jsx index 1b43415..3f59d1a 100644 --- a/app/lib/components/Chat/MessageList.jsx +++ b/app/lib/components/Chat/MessageList.jsx @@ -52,7 +52,7 @@ class MessageList extends Component const picture = (message.sender === 'response' ? message.picture : this.props.myPicture) || 'resources/images/avatar-empty.jpeg'; - + return (
diff --git a/app/stylus/components/FileSharing.styl b/app/stylus/components/FileSharing.styl index 5af968d..736ff1b 100644 --- a/app/stylus/components/FileSharing.styl +++ b/app/stylus/components/FileSharing.styl @@ -1,61 +1,61 @@ [data-component='FileSharing'] { - > .sharing-toolbar { - > .share-file { - cursor: pointer; - width: 100%; - background: #252525; - border: 1px solid #151515; - padding: 1rem; - border-bottom: 5px solid #151515; - border-radius: 3px 3px 0 0; - } - } + > .sharing-toolbar { + > .share-file { + cursor: pointer; + width: 100%; + background: #252525; + border: 1px solid #151515; + padding: 1rem; + border-bottom: 5px solid #151515; + border-radius: 3px 3px 0 0; + } + } - > .shared-files { - > .file-entry { - background-color: rgba(0,0,0,0.1); - border-radius: 5px; - width: 100%; - padding: 0.5rem; - display: flex; - margin-top: 0.5rem; - - > .file-avatar { + > .shared-files { + > .file-entry { + background-color: rgba(0,0,0,0.1); + border-radius: 5px; + width: 100%; + padding: 0.5rem; + display: flex; + margin-top: 0.5rem; + + > .file-avatar { height: 2rem; border-radius: 50%; - } + } - > .file-content { - flex-grow: 1; - padding-left: 0.5rem; + > .file-content { + flex-grow: 1; + padding-left: 0.5rem; - > p:not(:first-child) { - margin-top: 0.5rem; - } + > p:not(:first-child) { + margin-top: 0.5rem; + } - > .file-info { - display: flex; - padding-top: 0.5rem; - align-items: center; - - > .button { - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - background: #252525; - border: 1px solid #151515; - padding: 0.3rem; - border-bottom: 5px solid #151515; - border-radius: 3px 3px 0 0; - } + > .file-info { + display: flex; + padding-top: 0.5rem; + align-items: center; + + > .button { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + background: #252525; + border: 1px solid #151515; + padding: 0.3rem; + border-bottom: 5px solid #151515; + border-radius: 3px 3px 0 0; + } - > p { - flex-grow: 1; - padding-left: 0.5rem; - } - } - } - } - } + > p { + flex-grow: 1; + padding-left: 0.5rem; + } + } + } + } + } } \ No newline at end of file From b3c45d004b3871a0d6f33cea20d7ea6f505653b1 Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 15:24:08 +0200 Subject: [PATCH 33/40] Add overlay when holding file above drop element --- .../FileSharing/DragDropSharing.jsx | 14 ++ app/lib/components/FileSharing/index.jsx | 5 +- app/lib/components/Room.jsx | 179 +++++++++--------- app/stylus/components/FileSharing.styl | 19 ++ app/stylus/index.styl | 36 ++-- 5 files changed, 145 insertions(+), 108 deletions(-) create mode 100644 app/lib/components/FileSharing/DragDropSharing.jsx diff --git a/app/lib/components/FileSharing/DragDropSharing.jsx b/app/lib/components/FileSharing/DragDropSharing.jsx new file mode 100644 index 0000000..20ceade --- /dev/null +++ b/app/lib/components/FileSharing/DragDropSharing.jsx @@ -0,0 +1,14 @@ +import React from 'react'; +import dragDrop from 'drag-drop'; +import { shareFiles } from './index'; + +export const configureDragDrop = () => +{ + dragDrop('body', async(files) => await shareFiles(files)); +}; + +export const HoldingOverlay = () => ( +
+ Drop files here to share them +
+); \ No newline at end of file diff --git a/app/lib/components/FileSharing/index.jsx b/app/lib/components/FileSharing/index.jsx index 35c5cb1..398d0b8 100644 --- a/app/lib/components/FileSharing/index.jsx +++ b/app/lib/components/FileSharing/index.jsx @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import WebTorrent from 'webtorrent'; import createTorrent from 'create-torrent'; -import dragDrop from 'drag-drop'; import randomString from 'random-string'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; @@ -26,7 +25,7 @@ const notifyPeers = (file) => store.dispatch(requestActions.sendFile(file, displayName, picture)); }; -const shareFiles = async(files) => +export const shareFiles = async(files) => { const notification = { @@ -70,8 +69,6 @@ const shareFiles = async(files) => }); }; -dragDrop('body', async(files) => await shareFiles(files)); - class FileSharing extends Component { constructor(props) diff --git a/app/lib/components/Room.jsx b/app/lib/components/Room.jsx index bfb12e9..a4d752a 100644 --- a/app/lib/components/Room.jsx +++ b/app/lib/components/Room.jsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { Fragment } from 'react'; import { connect } from 'react-redux'; import ReactTooltip from 'react-tooltip'; import PropTypes from 'prop-types'; @@ -18,6 +18,9 @@ import Draggable from 'react-draggable'; import { idle } from '../utils'; import Sidebar from './Sidebar'; import Filmstrip from './Filmstrip'; +import { configureDragDrop, HoldingOverlay } from './FileSharing/DragDropSharing'; + +configureDragDrop(); // Hide toolbars after 10 seconds of inactivity. const TIMEOUT = 10 * 1000; @@ -73,102 +76,106 @@ class Room extends React.Component }[room.mode]; return ( - -
- -
- + + - - - {room.advancedMode ? -
-
-

{room.state}

-
- :null - } - + + +
+ {toolAreaOpen ? + -
- - - - - + :null + } +
-
- {toolAreaOpen ? - - :null - } -
-
-
+ + ); } } diff --git a/app/stylus/components/FileSharing.styl b/app/stylus/components/FileSharing.styl index 736ff1b..dd158da 100644 --- a/app/stylus/components/FileSharing.styl +++ b/app/stylus/components/FileSharing.styl @@ -58,4 +58,23 @@ } } } +} + +#holding-overlay { + display: none; +} + +.drag #holding-overlay { + display: flex; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.6); + color: #FFF; + align-items: center; + justify-content: center; + font-size: 2rem; + z-index: 2000; } \ No newline at end of file diff --git a/app/stylus/index.styl b/app/stylus/index.styl index 328df97..3ae98ce 100644 --- a/app/stylus/index.styl +++ b/app/stylus/index.styl @@ -34,26 +34,26 @@ body { #multiparty-meeting { height: 100%; width: 100%; - - // Components - @import './components/Room'; - @import './components/Sidebar'; - @import './components/Me'; - @import './components/Peers'; - @import './components/Peer'; - @import './components/PeerView'; - @import './components/ScreenView'; - @import './components/Notifications'; - @import './components/Chat'; - @import './components/Settings'; - @import './components/ToolArea'; - @import './components/ParticipantList'; - @import './components/FullScreenView'; - @import './components/FullView'; - @import './components/Filmstrip'; - @import './components/FileSharing'; } +// Components +@import './components/Room'; +@import './components/Sidebar'; +@import './components/Me'; +@import './components/Peers'; +@import './components/Peer'; +@import './components/PeerView'; +@import './components/ScreenView'; +@import './components/Notifications'; +@import './components/Chat'; +@import './components/Settings'; +@import './components/ToolArea'; +@import './components/ParticipantList'; +@import './components/FullScreenView'; +@import './components/FullView'; +@import './components/Filmstrip'; +@import './components/FileSharing'; + // Hack to detect in JS the current media query #multiparty-meeting-media-query-detector { position: absolute; From 1686e3603f742ee386dce08b93c6f67abf0f9141 Mon Sep 17 00:00:00 2001 From: Torjus Date: Tue, 31 Jul 2018 15:30:51 +0200 Subject: [PATCH 34/40] Fix error when downloading your own files --- app/lib/components/FileSharing/DragDropSharing.jsx | 6 +++--- app/lib/components/FileSharing/FileEntry.jsx | 2 +- app/lib/components/Room.jsx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/lib/components/FileSharing/DragDropSharing.jsx b/app/lib/components/FileSharing/DragDropSharing.jsx index 20ceade..9802ca6 100644 --- a/app/lib/components/FileSharing/DragDropSharing.jsx +++ b/app/lib/components/FileSharing/DragDropSharing.jsx @@ -4,11 +4,11 @@ import { shareFiles } from './index'; export const configureDragDrop = () => { - dragDrop('body', async(files) => await shareFiles(files)); + dragDrop('body', async(files) => await shareFiles(files)); }; export const HoldingOverlay = () => ( -
+
Drop files here to share them -
+
); \ No newline at end of file diff --git a/app/lib/components/FileSharing/FileEntry.jsx b/app/lib/components/FileSharing/FileEntry.jsx index 2f4c090..c0fcdb3 100644 --- a/app/lib/components/FileSharing/FileEntry.jsx +++ b/app/lib/components/FileSharing/FileEntry.jsx @@ -80,7 +80,7 @@ class FileEntry extends Component const magnetURI = this.props.data.file.magnet; - const existingTorrent = client.get(magnet); + const existingTorrent = client.get(magnetURI); if (existingTorrent) { diff --git a/app/lib/components/Room.jsx b/app/lib/components/Room.jsx index a4d752a..b3ef2d6 100644 --- a/app/lib/components/Room.jsx +++ b/app/lib/components/Room.jsx @@ -1,4 +1,4 @@ -import React, { Fragment } from 'react'; +import React, { Fragment } from 'react'; import { connect } from 'react-redux'; import ReactTooltip from 'react-tooltip'; import PropTypes from 'prop-types'; @@ -18,7 +18,7 @@ import Draggable from 'react-draggable'; import { idle } from '../utils'; import Sidebar from './Sidebar'; import Filmstrip from './Filmstrip'; -import { configureDragDrop, HoldingOverlay } from './FileSharing/DragDropSharing'; +import { configureDragDrop, HoldingOverlay } from './FileSharing/DragDropSharing'; configureDragDrop(); From 57fba6c8edee16d0e9dea7a38fcfbcc21474a7b5 Mon Sep 17 00:00:00 2001 From: Torjus Date: Wed, 1 Aug 2018 13:06:56 +0200 Subject: [PATCH 35/40] Check if WebRTC is supported before enabling file sharing --- app/.eslintrc.js | 2 +- .../FileSharing/DragDropSharing.jsx | 8 ++++-- app/lib/components/FileSharing/FileEntry.jsx | 13 +++++++--- app/lib/components/FileSharing/index.jsx | 25 +++++++++++++------ app/package-lock.json | 23 ++++++++++++----- app/stylus/components/FileSharing.styl | 4 +++ 6 files changed, 55 insertions(+), 20 deletions(-) diff --git a/app/.eslintrc.js b/app/.eslintrc.js index 6d49fa4..6ec2ca4 100644 --- a/app/.eslintrc.js +++ b/app/.eslintrc.js @@ -172,7 +172,7 @@ module.exports = 'semi': [ 2, 'always' ], 'semi-spacing': 2, 'space-before-blocks': 2, - 'space-before-function-paren': [ 2, 'never' ], + 'space-before-function-paren': [ 2, { anonymous: 'never', named: 'never', 'asyncArrow': 'always'}], 'space-in-parens': [ 2, 'never' ], 'spaced-comment': [ 2, 'always' ], 'strict': 2, diff --git a/app/lib/components/FileSharing/DragDropSharing.jsx b/app/lib/components/FileSharing/DragDropSharing.jsx index 9802ca6..279989c 100644 --- a/app/lib/components/FileSharing/DragDropSharing.jsx +++ b/app/lib/components/FileSharing/DragDropSharing.jsx @@ -1,14 +1,18 @@ import React from 'react'; +import WebTorrent from 'webtorrent'; import dragDrop from 'drag-drop'; import { shareFiles } from './index'; export const configureDragDrop = () => { - dragDrop('body', async(files) => await shareFiles(files)); + if (WebTorrent.WEBRTC_SUPPORT) + { + dragDrop('body', async (files) => await shareFiles(files)); + } }; export const HoldingOverlay = () => (
- Drop files here to share them + Drop files here to share them
); \ No newline at end of file diff --git a/app/lib/components/FileSharing/FileEntry.jsx b/app/lib/components/FileSharing/FileEntry.jsx index c0fcdb3..4319cfa 100644 --- a/app/lib/components/FileSharing/FileEntry.jsx +++ b/app/lib/components/FileSharing/FileEntry.jsx @@ -2,6 +2,7 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import magnet from 'magnet-uri'; +import WebTorrent from 'webtorrent'; import * as requestActions from '../../redux/requestActions'; import { saveAs } from 'file-saver/FileSaver'; import { client } from './index'; @@ -106,9 +107,15 @@ class FileEntry extends Component {!this.state.active && !this.state.files && (
- - - + {WebTorrent.WEBRTC_SUPPORT ? ( + + + + ) : ( +

+ Your browser does not support downloading files using WebTorrent. +

+ )}

{magnet.decode(this.props.data.file.magnet).dn}

diff --git a/app/lib/components/FileSharing/index.jsx b/app/lib/components/FileSharing/index.jsx index 398d0b8..9eafbd0 100644 --- a/app/lib/components/FileSharing/index.jsx +++ b/app/lib/components/FileSharing/index.jsx @@ -4,13 +4,14 @@ import { connect } from 'react-redux'; import WebTorrent from 'webtorrent'; import createTorrent from 'create-torrent'; import randomString from 'random-string'; +import classNames from 'classnames'; import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import { store } from '../../store'; import config from '../../../config'; import FileEntry, { FileEntryProps } from './FileEntry'; -export const client = new WebTorrent({ +export const client = WebTorrent.WEBRTC_SUPPORT && new WebTorrent({ tracker : { rtcConfig : { iceServers : config.turnServers @@ -25,7 +26,7 @@ const notifyPeers = (file) => store.dispatch(requestActions.sendFile(file, displayName, picture)); }; -export const shareFiles = async(files) => +export const shareFiles = async (files) => { const notification = { @@ -78,7 +79,7 @@ class FileSharing extends Component this.fileInput = React.createRef(); } - handleFileChange = async(event) => + handleFileChange = async (event) => { if (event.target.files.length > 0) { @@ -88,13 +89,19 @@ class FileSharing extends Component handleClick = () => { - // We want to open the file dialog when we click a button - // instead of actually rendering the input element itself. - this.fileInput.current.click(); + if (WebTorrent.WEBRTC_SUPPORT) + { + // We want to open the file dialog when we click a button + // instead of actually rendering the input element itself. + this.fileInput.current.click(); + } }; render() { + const buttonDescription = WebTorrent.WEBRTC_SUPPORT ? + 'Share file' : 'File sharing not supported'; + return (
@@ -109,9 +116,11 @@ class FileSharing extends Component
- Share file + {buttonDescription}
diff --git a/app/package-lock.json b/app/package-lock.json index 2af90be..3173cc2 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -4969,12 +4969,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4989,17 +4991,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5116,7 +5121,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5128,6 +5134,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5142,6 +5149,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5260,7 +5268,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5272,6 +5281,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5393,6 +5403,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", diff --git a/app/stylus/components/FileSharing.styl b/app/stylus/components/FileSharing.styl index dd158da..c5b9bc7 100644 --- a/app/stylus/components/FileSharing.styl +++ b/app/stylus/components/FileSharing.styl @@ -8,6 +8,10 @@ padding: 1rem; border-bottom: 5px solid #151515; border-radius: 3px 3px 0 0; + + &.disabled { + cursor: not-allowed; + } } } From c5ba778b95ff964ba1d414027e981473b9813e4e Mon Sep 17 00:00:00 2001 From: Torjus Date: Wed, 1 Aug 2018 13:37:24 +0200 Subject: [PATCH 36/40] Add timeout message when searching for peers --- app/lib/components/FileSharing/FileEntry.jsx | 28 +++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/app/lib/components/FileSharing/FileEntry.jsx b/app/lib/components/FileSharing/FileEntry.jsx index 4319cfa..e8f17b0 100644 --- a/app/lib/components/FileSharing/FileEntry.jsx +++ b/app/lib/components/FileSharing/FileEntry.jsx @@ -43,7 +43,8 @@ class FileEntry extends Component files : torrent.files, numPeers : torrent.numPeers, progress : 1, - active : false + active : false, + timeout : false }); return; @@ -90,6 +91,16 @@ class FileEntry extends Component } client.add(magnetURI, this.handleTorrent); + + setTimeout(() => + { + if (this.state.active && this.state.numPeers === 0) + { + this.setState({ + timeout : true + }); + } + }, 10 * 1000); } render() @@ -122,9 +133,18 @@ class FileEntry extends Component )} {this.state.active && this.state.numPeers === 0 && ( -

- Locating peers -

+ +

+ Locating peers +

+ + {this.state.timeout && ( +

+ If this process takes a long time, there might not be anyone seeding + this torrent. Try asking someone to reupload the file that you want. +

+ )} +
)} {this.state.active && this.state.numPeers > 0 && ( From 14a70de5869512fab37c2b3c89116e436ed3595a Mon Sep 17 00:00:00 2001 From: Torjus Date: Wed, 1 Aug 2018 13:47:11 +0200 Subject: [PATCH 37/40] Bump sidebar size --- app/lib/components/Room.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/components/Room.jsx b/app/lib/components/Room.jsx index b3ef2d6..741d88f 100644 --- a/app/lib/components/Room.jsx +++ b/app/lib/components/Room.jsx @@ -85,7 +85,7 @@ class Room extends React.Component
@@ -163,7 +163,7 @@ class Room extends React.Component
{toolAreaOpen ? From d6ba237d57ae42d4b9fbeef81d1d6ff29c35d3bc Mon Sep 17 00:00:00 2001 From: Torjus Date: Wed, 1 Aug 2018 14:21:33 +0200 Subject: [PATCH 38/40] Add scrollbar when shared files overlap their container --- app/stylus/components/FileSharing.styl | 11 +++++++++++ server/package-lock.json | 8 ++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/stylus/components/FileSharing.styl b/app/stylus/components/FileSharing.styl index c5b9bc7..0091133 100644 --- a/app/stylus/components/FileSharing.styl +++ b/app/stylus/components/FileSharing.styl @@ -1,4 +1,8 @@ [data-component='FileSharing'] { + display: flex; + flex-direction: column; + height: 100%; + > .sharing-toolbar { > .share-file { cursor: pointer; @@ -16,6 +20,9 @@ } > .shared-files { + flex-grow: 1; + overflow-y: scroll; + > .file-entry { background-color: rgba(0,0,0,0.1); border-radius: 5px; @@ -24,6 +31,10 @@ display: flex; margin-top: 0.5rem; + &:last-child { + margin-bottom: 1.5rem; + } + > .file-avatar { height: 2rem; border-radius: 50%; diff --git a/server/package-lock.json b/server/package-lock.json index 897da1e..b534cb7 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -2888,14 +2888,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2915,8 +2913,7 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", @@ -3064,7 +3061,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } From 7b4e2f6a587f612cf6e6d6c38c46e9fbfed56a68 Mon Sep 17 00:00:00 2001 From: Torjus Date: Wed, 1 Aug 2018 15:09:58 +0200 Subject: [PATCH 39/40] Add basic scroll-to-bottom functionality --- .../FileSharing/SharedFilesList.jsx | 59 +++++++++++++++++++ app/lib/components/FileSharing/index.jsx | 26 +------- 2 files changed, 62 insertions(+), 23 deletions(-) create mode 100644 app/lib/components/FileSharing/SharedFilesList.jsx diff --git a/app/lib/components/FileSharing/SharedFilesList.jsx b/app/lib/components/FileSharing/SharedFilesList.jsx new file mode 100644 index 0000000..109b009 --- /dev/null +++ b/app/lib/components/FileSharing/SharedFilesList.jsx @@ -0,0 +1,59 @@ +import React, { PureComponent } from 'react'; +import { connect } from 'react-redux'; +import PropTypes from 'prop-types'; +import FileEntry, { FileEntryProps } from './FileEntry'; + +class SharedFilesList extends PureComponent +{ + constructor(props) + { + super(props); + + this.listRef = React.createRef(); + } + + scrollToBottom = () => + { + const elem = this.listRef.current; + + elem.scrollTop = elem.scrollHeight; + }; + + componentDidUpdate() + { + this.scrollToBottom(); + } + + render() + { + return ( +
+ {this.props.sharing.map((entry, i) => ( + + ))} +
+ ); + } +} + +SharedFilesList.propTypes = { + sharing : PropTypes.arrayOf(FileEntryProps.data).isRequired +}; + +const mapStateToProps = (state) => + ({ + sharing : state.sharing, + + // Included to scroll to the bottom when the user + // actually opens the tab. When the component first + // mounts, the component is not visible and so the + // component has no height which can be used for scrolling. + tabOpen : state.toolarea.currentToolTab === 'files' + }); + +export default connect( + mapStateToProps +)(SharedFilesList); \ No newline at end of file diff --git a/app/lib/components/FileSharing/index.jsx b/app/lib/components/FileSharing/index.jsx index 9eafbd0..fd41051 100644 --- a/app/lib/components/FileSharing/index.jsx +++ b/app/lib/components/FileSharing/index.jsx @@ -1,6 +1,4 @@ import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import WebTorrent from 'webtorrent'; import createTorrent from 'create-torrent'; import randomString from 'random-string'; @@ -9,7 +7,7 @@ import * as stateActions from '../../redux/stateActions'; import * as requestActions from '../../redux/requestActions'; import { store } from '../../store'; import config from '../../../config'; -import FileEntry, { FileEntryProps } from './FileEntry'; +import SharedFilesList from './SharedFilesList'; export const client = WebTorrent.WEBRTC_SUPPORT && new WebTorrent({ tracker : { @@ -124,28 +122,10 @@ class FileSharing extends Component
-
- {this.props.sharing.map((entry, i) => ( - - ))} -
+
); } } -FileSharing.propTypes = { - sharing : PropTypes.arrayOf(FileEntryProps.data).isRequired -}; - -const mapStateToProps = (state) => - ({ - sharing : state.sharing - }); - -export default connect( - mapStateToProps -)(FileSharing); \ No newline at end of file +export default FileSharing; \ No newline at end of file From 384203f9dcc8d7c0737f57eb0c79c996d7a79ca3 Mon Sep 17 00:00:00 2001 From: Torjus Date: Thu, 2 Aug 2018 09:59:59 +0200 Subject: [PATCH 40/40] Use HOC for handling auto-scroll in Files tab --- .../FileSharing/SharedFilesList.jsx | 38 +++++++------------ app/lib/components/FullScreenView.jsx | 4 +- app/package-lock.json | 23 +++-------- 3 files changed, 21 insertions(+), 44 deletions(-) diff --git a/app/lib/components/FileSharing/SharedFilesList.jsx b/app/lib/components/FileSharing/SharedFilesList.jsx index 109b009..9b2b6ce 100644 --- a/app/lib/components/FileSharing/SharedFilesList.jsx +++ b/app/lib/components/FileSharing/SharedFilesList.jsx @@ -1,33 +1,20 @@ -import React, { PureComponent } from 'react'; +import React, { Component } from 'react'; +import { compose } from 'redux'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import FileEntry, { FileEntryProps } from './FileEntry'; +import scrollToBottom from '../Chat/scrollToBottom'; -class SharedFilesList extends PureComponent +/** + * This component cannot be pure, as we need to use + * refs to scroll to the bottom when new files arrive. + */ +class SharedFilesList extends Component { - constructor(props) - { - super(props); - - this.listRef = React.createRef(); - } - - scrollToBottom = () => - { - const elem = this.listRef.current; - - elem.scrollTop = elem.scrollHeight; - }; - - componentDidUpdate() - { - this.scrollToBottom(); - } - render() { return ( -
+
{this.props.sharing.map((entry, i) => ( tabOpen : state.toolarea.currentToolTab === 'files' }); -export default connect( - mapStateToProps -)(SharedFilesList); \ No newline at end of file +export default compose( + connect(mapStateToProps), + scrollToBottom() +)(SharedFilesList); diff --git a/app/lib/components/FullScreenView.jsx b/app/lib/components/FullScreenView.jsx index ebf62f4..d47ffda 100644 --- a/app/lib/components/FullScreenView.jsx +++ b/app/lib/components/FullScreenView.jsx @@ -41,7 +41,7 @@ const FullScreenView = (props) =>
{ @@ -73,7 +73,7 @@ FullScreenView.propTypes = const mapStateToProps = (state) => { return { - consumer : state.consumers[state.room.fullScreenConsumer], + consumer : state.consumers[state.room.fullScreenConsumer], toolbarsVisible : state.room.toolbarsVisible }; }; diff --git a/app/package-lock.json b/app/package-lock.json index 3173cc2..2af90be 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -4969,14 +4969,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4991,20 +4989,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -5121,8 +5116,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -5134,7 +5128,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5149,7 +5142,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5268,8 +5260,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5281,7 +5272,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5403,7 +5393,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",