(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= this.countPackets()) throw new Error("Packet out of bounds"); var start = i * packetSize; var end = Math.min(start + packetSize, this.size); return this.blob.slice(start, end); } } }); return UploadFile; })(); module.exports = UploadFile; },{}],"/Users/alex/Projects/webdrop/client/actions/DownloadActions.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var alt = _interopRequire(require("../alt")); module.exports = alt.createActions(function DownloadActions() { _classCallCheck(this, DownloadActions); this.generateActions("beginDownload", "requestDownload", "cancelDownlaod", "setDownloadInfo"); }); },{"../alt":"/Users/alex/Projects/webdrop/client/alt.js"}],"/Users/alex/Projects/webdrop/client/actions/PeerActions.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var alt = _interopRequire(require("../alt")); module.exports = alt.createActions(function PeerActions() { _classCallCheck(this, PeerActions); this.generateActions("setPeerID"); }); },{"../alt":"/Users/alex/Projects/webdrop/client/alt.js"}],"/Users/alex/Projects/webdrop/client/actions/UploadActions.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var alt = _interopRequire(require("../alt")); module.exports = alt.createActions(function UploadActions() { _classCallCheck(this, UploadActions); this.generateActions("sendToDownloader", "setUploadToken", "uploadFile"); }); },{"../alt":"/Users/alex/Projects/webdrop/client/alt.js"}],"/Users/alex/Projects/webdrop/client/alt.js":[function(require,module,exports){ "use strict"; var Alt = require("alt"); module.exports = new Alt(); },{"alt":"/Users/alex/Projects/webdrop/node_modules/alt/dist/alt.js"}],"/Users/alex/Projects/webdrop/client/components/App.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var DownloadActions = _interopRequire(require("../actions/DownloadActions")); var DownloadStore = _interopRequire(require("../stores/DownloadStore")); var DropZone = _interopRequire(require("./DropZone")); var FileDescription = _interopRequire(require("./FileDescription")); var PeerStore = _interopRequire(require("../stores/PeerStore")); var React = _interopRequire(require("react")); var Tempalink = _interopRequire(require("./Tempalink")); var UploadActions = _interopRequire(require("../actions/UploadActions")); var UploadStore = _interopRequire(require("../stores/UploadStore")); function getState() { return { peerID: PeerStore.getPeerID(), readyToUpload: UploadStore.getState().status.isUploading(), uploadFile: UploadStore.getState().file, uploadToken: UploadStore.getState().token, downloadFile: DownloadStore.getState().file, downloadToken: DownloadStore.getState().token, readyToDownload: DownloadStore.getState().status.isReady() }; } var App = (function (_React$Component) { function App() { _classCallCheck(this, App); this.state = getState(); this._onChange = (function () { this.setState(getState()); }).bind(this); } _inherits(App, _React$Component); _createClass(App, { componentDidMount: { value: function componentDidMount() { PeerStore.listen(this._onChange); UploadStore.listen(this._onChange); DownloadStore.listen(this._onChange); } }, componentDidUnmount: { value: function componentDidUnmount() { PeerStore.unlisten(this._onChange); UploadStore.unlisten(this._onChange); DownloadStore.unlisten(this._onChange); } }, uploadFile: { value: function uploadFile(file) { UploadActions.uploadFile(file); } }, downloadFile: { value: function downloadFile() { DownloadActions.requestDownload(); } }, render: { value: function render() { if (this.state.readyToUpload) { return React.createElement( "div", null, React.createElement(FileDescription, { file: this.state.uploadFile }), React.createElement(Tempalink, { token: this.state.uploadToken }) ); } else if (this.state.readyToDownload) { return React.createElement( "div", null, React.createElement(FileDescription, { file: this.state.downloadFile }), React.createElement( "button", { onClick: this.downloadFile.bind(this) }, "Download" ) ); } else { return React.createElement(DropZone, { onDrop: this.uploadFile.bind(this) }); } } } }); return App; })(React.Component); module.exports = App; },{"../actions/DownloadActions":"/Users/alex/Projects/webdrop/client/actions/DownloadActions.js","../actions/UploadActions":"/Users/alex/Projects/webdrop/client/actions/UploadActions.js","../stores/DownloadStore":"/Users/alex/Projects/webdrop/client/stores/DownloadStore.js","../stores/PeerStore":"/Users/alex/Projects/webdrop/client/stores/PeerStore.js","../stores/UploadStore":"/Users/alex/Projects/webdrop/client/stores/UploadStore.js","./DropZone":"/Users/alex/Projects/webdrop/client/components/DropZone.js","./FileDescription":"/Users/alex/Projects/webdrop/client/components/FileDescription.js","./Tempalink":"/Users/alex/Projects/webdrop/client/components/Tempalink.js","react":"/Users/alex/Projects/webdrop/node_modules/react/react.js"}],"/Users/alex/Projects/webdrop/client/components/DropZone.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var React = _interopRequire(require("react")); var DropZone = (function (_React$Component) { function DropZone() { _classCallCheck(this, DropZone); if (_React$Component != null) { _React$Component.apply(this, arguments); } } _inherits(DropZone, _React$Component); _createClass(DropZone, { dragOver: { value: function dragOver(e) { e.preventDefault(); e.dataTransfer.dropEffect = "copy"; } }, drop: { value: function drop(e) { e.preventDefault(); var file = e.dataTransfer.files[0]; this.props.onDrop(file); } }, render: { value: function render() { return React.createElement( "div", { className: "drop-zone", onDragOver: this.dragOver.bind(this), onDrop: this.drop.bind(this) }, "Drop a file here." ); } } }); return DropZone; })(React.Component); module.exports = DropZone; },{"react":"/Users/alex/Projects/webdrop/node_modules/react/react.js"}],"/Users/alex/Projects/webdrop/client/components/FileDescription.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var React = _interopRequire(require("react")); var FileDescription = (function (_React$Component) { function FileDescription() { _classCallCheck(this, FileDescription); if (_React$Component != null) { _React$Component.apply(this, arguments); } } _inherits(FileDescription, _React$Component); _createClass(FileDescription, { render: { value: function render() { return React.createElement( "div", { className: "file-description" }, React.createElement( "span", { className: "file-name" }, this.props.file.name ), React.createElement( "span", { className: "file-size" }, this.props.file.size ), React.createElement( "span", { className: "file-type" }, this.props.file.type ) ); } } }); return FileDescription; })(React.Component); module.exports = FileDescription; },{"react":"/Users/alex/Projects/webdrop/node_modules/react/react.js"}],"/Users/alex/Projects/webdrop/client/components/Tempalink.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var React = _interopRequire(require("react")); var Tempalink = (function (_React$Component) { function Tempalink() { _classCallCheck(this, Tempalink); if (_React$Component != null) { _React$Component.apply(this, arguments); } } _inherits(Tempalink, _React$Component); _createClass(Tempalink, { render: { value: function render() { var url = window.location.origin + "/d/" + this.props.token; return React.createElement( "a", { href: url, className: "tempalink" }, url ); } } }); return Tempalink; })(React.Component); module.exports = Tempalink; },{"react":"/Users/alex/Projects/webdrop/node_modules/react/react.js"}],"/Users/alex/Projects/webdrop/client/index.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var App = _interopRequire(require("./components/App")); var React = _interopRequire(require("react")); var DownloadActions = _interopRequire(require("./actions/DownloadActions")); if (window.WebDrop) DownloadActions.setDownloadInfo({ token: window.WebDrop.token, name: window.WebDrop.metadata.name, size: window.WebDrop.metadata.size, type: window.WebDrop.metadata.type }); React.render(React.createElement(App, null), document.getElementById("app")); },{"./actions/DownloadActions":"/Users/alex/Projects/webdrop/client/actions/DownloadActions.js","./components/App":"/Users/alex/Projects/webdrop/client/components/App.js","react":"/Users/alex/Projects/webdrop/node_modules/react/react.js"}],"/Users/alex/Projects/webdrop/client/peer.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var DownloadActions = _interopRequire(require("./actions/DownloadActions")); var Peer = _interopRequire(require("peerjs")); var PeerActions = _interopRequire(require("./actions/PeerActions")); var peer = module.exports = new Peer({ key: "8w3x9m637e0o1or" }); peer.on("open", function () { PeerActions.setPeerID(peer.id); }); peer.on("connection", function (conn) { DownloadActions.beginDownload(conn); }); },{"./actions/DownloadActions":"/Users/alex/Projects/webdrop/client/actions/DownloadActions.js","./actions/PeerActions":"/Users/alex/Projects/webdrop/client/actions/PeerActions.js","peerjs":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/peer.js"}],"/Users/alex/Projects/webdrop/client/socket.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var io = _interopRequire(require("socket.io-client")); var UploadActions = _interopRequire(require("./actions/UploadActions")); var socket = module.exports = io.connect(); socket.on("download", function (peerID) { UploadActions.sendToDownloader(peerID); }); },{"./actions/UploadActions":"/Users/alex/Projects/webdrop/client/actions/UploadActions.js","socket.io-client":"/Users/alex/Projects/webdrop/node_modules/socket.io-client/index.js"}],"/Users/alex/Projects/webdrop/client/stores/DownloadStore.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var DownloadActions = _interopRequire(require("../actions/DownloadActions")); var DownloadFile = _interopRequire(require("../DownloadFile")); var PeerActions = _interopRequire(require("../actions/PeerActions")); var PeerStore = _interopRequire(require("./PeerStore")); var Status = _interopRequire(require("../Status")); var alt = _interopRequire(require("../alt")); var socket = _interopRequire(require("../socket")); var DownloadStatus = (function (_Status) { function DownloadStatus() { _classCallCheck(this, DownloadStatus); _get(Object.getPrototypeOf(DownloadStatus.prototype), "constructor", this).call(this, ["offline", "ready", "requesting", "downloading", "cancelled", "done"]); } _inherits(DownloadStatus, _Status); return DownloadStatus; })(Status); module.exports = alt.createStore((function () { function DownloadStore() { _classCallCheck(this, DownloadStore); this.bindActions(DownloadActions); this.bindActions(PeerActions); this.conn = null; this.token = null; this.file = null; this.status = new DownloadStatus(); } _createClass(DownloadStore, { onSetPeerID: { value: function onSetPeerID() { this.waitFor(PeerStore.dispatchToken); if (this.status.isOffline() && this.token) this.status.set("ready"); } }, onSetDownloadInfo: { value: function onSetDownloadInfo(info) { this.token = info.token; this.file = new DownloadFile(info.name, info.size, info.type); if (this.status.isOffline() && PeerStore.getPeerID()) this.status.set("ready"); } }, onRequestDownload: { value: function onRequestDownload() { if (!this.status.isReady()) { return; }this.status.set("requesting"); socket.emit("download", { peerID: PeerStore.getPeerID(), token: this.token }); } }, onBeginDownload: { value: function onBeginDownload(conn) { var _this = this; if (!this.status.isRequesting()) { return; }this.status.set("downloading"); this.conn = conn; var chunkSize = conn.metadata.chunkSize; var i = 0; conn.on("data", function (data) { if (!_this.status.isDownloading()) return; _this.file.addPacket(data); i++; if (_this.file.isComplete()) { _this.status.set("done"); _this.file.download(); conn.close(); } else if (i % chunkSize === 0) { conn.send("more"); } }); conn.on("close", function () { if (!_this.status.isDownloading()) return; _this._cancel(); }); } }, onCancelDownload: { value: function onCancelDownload() { if (!this.status.isRequesting() && !this.status.isDownloading()) { return; }this._cancel(); } }, _cancel: { value: function _cancel() { this.status.set("cancelled"); if (this.conn) this.conn.close(); this.conn = null; this.file.clearPackets(); } } }); return DownloadStore; })()); },{"../DownloadFile":"/Users/alex/Projects/webdrop/client/DownloadFile.js","../Status":"/Users/alex/Projects/webdrop/client/Status.js","../actions/DownloadActions":"/Users/alex/Projects/webdrop/client/actions/DownloadActions.js","../actions/PeerActions":"/Users/alex/Projects/webdrop/client/actions/PeerActions.js","../alt":"/Users/alex/Projects/webdrop/client/alt.js","../socket":"/Users/alex/Projects/webdrop/client/socket.js","./PeerStore":"/Users/alex/Projects/webdrop/client/stores/PeerStore.js"}],"/Users/alex/Projects/webdrop/client/stores/PeerStore.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var PeerActions = _interopRequire(require("../actions/PeerActions")); var alt = _interopRequire(require("../alt")); module.exports = alt.createStore((function () { function PeerStore() { _classCallCheck(this, PeerStore); this.bindActions(PeerActions); this.peerID = null; } _createClass(PeerStore, { onSetPeerID: { value: function onSetPeerID(id) { this.peerID = id; } } }, { getPeerID: { value: function getPeerID() { return this.getState().peerID; } } }); return PeerStore; })()); },{"../actions/PeerActions":"/Users/alex/Projects/webdrop/client/actions/PeerActions.js","../alt":"/Users/alex/Projects/webdrop/client/alt.js"}],"/Users/alex/Projects/webdrop/client/stores/UploadStore.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var PeerActions = _interopRequire(require("../actions/PeerActions")); var PeerStore = _interopRequire(require("./PeerStore")); var Status = _interopRequire(require("../Status")); var UploadActions = _interopRequire(require("../actions/UploadActions")); var UploadFile = _interopRequire(require("../UploadFile")); var alt = _interopRequire(require("../alt")); var peer = _interopRequire(require("../peer")); var socket = _interopRequire(require("../socket")); var chunkSize = 32; var UploadStatus = (function (_Status) { function UploadStatus() { _classCallCheck(this, UploadStatus); _get(Object.getPrototypeOf(UploadStatus.prototype), "constructor", this).call(this, ["offline", "ready", "processing", "uploading"]); } _inherits(UploadStatus, _Status); return UploadStatus; })(Status); module.exports = alt.createStore((function () { function UploadStore() { _classCallCheck(this, UploadStore); this.bindActions(PeerActions); this.bindActions(UploadActions); this.token = null; this.file = null; this.status = new UploadStatus(); } _createClass(UploadStore, { onSetPeerID: { value: function onSetPeerID(id) { this.waitFor(PeerStore.dispatchToken); if (this.status.isOffline()) this.status.set("ready"); } }, onUploadFile: { value: function onUploadFile(file) { var _this = this; if (!this.status.isReady()) { return; }this.status.set("processing"); this.file = new UploadFile(file); socket.emit("upload", { name: this.file.name, size: this.file.size, type: this.file.type }, function (token) { _this.status.set("uploading"); _this.token = token; _this.emitChange(); }); } }, onSendToDownloader: { value: function onSendToDownloader(peerID) { if (!this.status.isUploading()) { return; }var file = this.file; var conn = peer.connect(peerID, { reliable: true, metadata: { chunkSize: chunkSize } }); conn.on("open", function () { var packets = file.countPackets(); var packet = 0; function sendNextChunk() { for (var i = 0; i < chunkSize; i++) { if (packet >= packets) break; var b = file.getPacket(packet); conn.send(b); packet++; } } conn.on("data", function (data) { if (data === "more") sendNextChunk(); }); sendNextChunk(); }); } } }); return UploadStore; })()); },{"../Status":"/Users/alex/Projects/webdrop/client/Status.js","../UploadFile":"/Users/alex/Projects/webdrop/client/UploadFile.js","../actions/PeerActions":"/Users/alex/Projects/webdrop/client/actions/PeerActions.js","../actions/UploadActions":"/Users/alex/Projects/webdrop/client/actions/UploadActions.js","../alt":"/Users/alex/Projects/webdrop/client/alt.js","../peer":"/Users/alex/Projects/webdrop/client/peer.js","../socket":"/Users/alex/Projects/webdrop/client/socket.js","./PeerStore":"/Users/alex/Projects/webdrop/client/stores/PeerStore.js"}],"/Users/alex/Projects/webdrop/node_modules/alt/dist/alt.js":[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var Dispatcher = require("flux").Dispatcher; var EventEmitter = _interopRequire(require("eventemitter3")); var Symbol = _interopRequire(require("es-symbol")); var assign = _interopRequire(require("object-assign")); var ACTION_HANDLER = Symbol("action creator handler"); var ACTION_KEY = Symbol("holds the actions uid symbol for listening"); var ACTION_UID = Symbol("the actions uid name"); var EE = Symbol("event emitter instance"); var INIT_SNAPSHOT = Symbol("init snapshot storage"); var LAST_SNAPSHOT = Symbol("last snapshot storage"); var LIFECYCLE = Symbol("store lifecycle listeners"); var LISTENERS = Symbol("stores action listeners storage"); var PUBLIC_METHODS = Symbol("store public method storage"); var STATE_CONTAINER = Symbol("the state container"); function formatAsConstant(name) { return name.replace(/[a-z]([A-Z])/g, function (i) { return "" + i[0] + "_" + i[1].toLowerCase(); }).toUpperCase(); } function uid(container, name) { var count = 0; var key = name; while (Object.hasOwnProperty.call(container, key)) { key = name + String(++count); } return key; } /* istanbul ignore next */ function NoopClass() {} var builtIns = Object.getOwnPropertyNames(NoopClass); var builtInProto = Object.getOwnPropertyNames(NoopClass.prototype); var getInternalMethods = function (obj, excluded) { return Object.getOwnPropertyNames(obj).reduce(function (value, m) { if (excluded.indexOf(m) !== -1) { return value; } value[m] = obj[m]; return value; }, {}); }; var AltStore = (function () { function AltStore(dispatcher, model, state) { var _this8 = this; _classCallCheck(this, AltStore); this[EE] = new EventEmitter(); this[LIFECYCLE] = {}; this[STATE_CONTAINER] = state || model; assign(this[LIFECYCLE], model[LIFECYCLE]); assign(this, model[PUBLIC_METHODS]); // Register dispatcher this.dispatchToken = dispatcher.register(function (payload) { if (model[LISTENERS][payload.action]) { var result = model[LISTENERS][payload.action](payload.data); if (result !== false) { _this8.emitChange(); } } }); if (this[LIFECYCLE].init) { this[LIFECYCLE].init(); } } _createClass(AltStore, { getEventEmitter: { value: function getEventEmitter() { return this[EE]; } }, emitChange: { value: function emitChange() { this[EE].emit("change", this[STATE_CONTAINER]); } }, listen: { value: function listen(cb) { this[EE].on("change", cb); } }, unlisten: { value: function unlisten(cb) { this[EE].removeListener("change", cb); } }, getState: { value: function getState() { // Copy over state so it's RO. return assign({}, this[STATE_CONTAINER]); } } }); return AltStore; })(); var ActionCreator = (function () { function ActionCreator(alt, name, action, actions) { _classCallCheck(this, ActionCreator); this[ACTION_UID] = name; this[ACTION_HANDLER] = action.bind(this); this.actions = actions; this.alt = alt; } _createClass(ActionCreator, { dispatch: { value: function dispatch(data) { this.alt.dispatch(this[ACTION_UID], data); } } }); return ActionCreator; })(); var StoreMixinListeners = { on: function on(lifecycleEvent, handler) { this[LIFECYCLE][lifecycleEvent] = handler.bind(this); }, bindAction: function bindAction(symbol, handler) { if (!symbol) { throw new ReferenceError("Invalid action reference passed in"); } if (typeof handler !== "function") { throw new TypeError("bindAction expects a function"); } if (handler.length > 1) { throw new TypeError("Action handler in store " + this._storeName + " for " + ("" + (symbol[ACTION_KEY] || symbol).toString() + " was defined with 2 ") + "parameters. Only a single parameter is passed through the " + "dispatcher, did you mean to pass in an Object instead?"); } // You can pass in the constant or the function itself if (symbol[ACTION_KEY]) { this[LISTENERS][symbol[ACTION_KEY]] = handler.bind(this); } else { this[LISTENERS][symbol] = handler.bind(this); } }, bindActions: function bindActions(actions) { var _this8 = this; Object.keys(actions).forEach(function (action) { var symbol = actions[action]; var matchFirstCharacter = /./; var assumedEventHandler = action.replace(matchFirstCharacter, function (x) { return "on" + x[0].toUpperCase(); }); var handler = null; if (_this8[action] && _this8[assumedEventHandler]) { // If you have both action and onAction throw new ReferenceError("You have multiple action handlers bound to an action: " + ("" + action + " and " + assumedEventHandler)); } else if (_this8[action]) { // action handler = _this8[action]; } else if (_this8[assumedEventHandler]) { // onAction handler = _this8[assumedEventHandler]; } if (handler) { _this8.bindAction(symbol, handler); } }); }, bindListeners: function bindListeners(obj) { var _this8 = this; Object.keys(obj).forEach(function (methodName) { var symbol = obj[methodName]; var listener = _this8[methodName]; if (!listener) { throw new ReferenceError("" + methodName + " defined but does not exist in " + _this8._storeName); } if (Array.isArray(symbol)) { symbol.forEach(function (action) { _this8.bindAction(action, listener); }); } else { _this8.bindAction(symbol, listener); } }); } }; var StoreMixinEssentials = { waitFor: function waitFor(sources) { if (!sources) { throw new ReferenceError("Dispatch tokens not provided"); } if (arguments.length === 1) { sources = Array.isArray(sources) ? sources : [sources]; } else { sources = Array.prototype.slice.call(arguments); } var tokens = sources.map(function (source) { return source.dispatchToken || source; }); this.dispatcher.waitFor(tokens); }, exportPublicMethods: function exportPublicMethods(methods) { var _this8 = this; Object.keys(methods).forEach(function (methodName) { if (typeof methods[methodName] !== "function") { throw new TypeError("exportPublicMethods expects a function"); } _this8[PUBLIC_METHODS][methodName] = methods[methodName]; }); }, emitChange: function emitChange() { this.getInstance().emitChange(); } }; var setAppState = function (instance, data, onStore) { var obj = JSON.parse(data); Object.keys(obj).forEach(function (key) { var store = instance.stores[key]; if (store[LIFECYCLE].deserialize) { obj[key] = store[LIFECYCLE].deserialize(obj[key]) || obj[key]; } assign(store[STATE_CONTAINER], obj[key]); onStore(store); }); }; var snapshot = function (instance) { return JSON.stringify(Object.keys(instance.stores).reduce(function (obj, key) { var store = instance.stores[key]; var customSnapshot = store[LIFECYCLE].serialize && store[LIFECYCLE].serialize(); obj[key] = customSnapshot ? customSnapshot : store.getState(); return obj; }, {})); }; var saveInitialSnapshot = function (instance, key) { var state = instance.stores[key][STATE_CONTAINER]; var initial = JSON.parse(instance[INIT_SNAPSHOT]); initial[key] = state; instance[INIT_SNAPSHOT] = JSON.stringify(initial); }; var filterSnapshotOfStores = function (serializedSnapshot, storeNames) { var stores = JSON.parse(serializedSnapshot); var storesToReset = storeNames.reduce(function (obj, name) { if (!stores[name]) { throw new ReferenceError("" + name + " is not a valid store"); } obj[name] = stores[name]; return obj; }, {}); return JSON.stringify(storesToReset); }; var createStoreFromObject = function (alt, StoreModel, key, saveStore) { var storeInstance = undefined; var StoreProto = {}; StoreProto[LIFECYCLE] = {}; StoreProto[LISTENERS] = {}; assign(StoreProto, { _storeName: key, alt: alt, dispatcher: alt.dispatcher, getInstance: function getInstance() { return storeInstance; }, setState: function setState() { var values = arguments[0] === undefined ? {} : arguments[0]; assign(this.state, values); this.emitChange(); return false; } }, StoreMixinListeners, StoreMixinEssentials, StoreModel); // bind the store listeners /* istanbul ignore else */ if (StoreProto.bindListeners) { StoreMixinListeners.bindListeners.call(StoreProto, StoreProto.bindListeners); } // bind the lifecycle events /* istanbul ignore else */ if (StoreProto.lifecycle) { Object.keys(StoreProto.lifecycle).forEach(function (event) { StoreMixinListeners.on.call(StoreProto, event, StoreProto.lifecycle[event]); }); } // create the instance and assign the public methods to the instance storeInstance = assign(new AltStore(alt.dispatcher, StoreProto, StoreProto.state), StoreProto.publicMethods); /* istanbul ignore else */ if (saveStore) { alt.stores[key] = storeInstance; saveInitialSnapshot(alt, key); } return storeInstance; }; var Alt = (function () { function Alt() { _classCallCheck(this, Alt); this.dispatcher = new Dispatcher(); this.actions = {}; this.stores = {}; this[LAST_SNAPSHOT] = null; this[INIT_SNAPSHOT] = "{}"; } _createClass(Alt, { dispatch: { value: function dispatch(action, data) { this.dispatcher.dispatch({ action: action, data: data }); } }, createStore: { value: function createStore(StoreModel, iden) { var saveStore = arguments[2] === undefined ? true : arguments[2]; var storeInstance = undefined; var key = iden || StoreModel.name || StoreModel.displayName || ""; if (saveStore && (this.stores[key] || !key)) { /* istanbul ignore else */ if (typeof console !== "undefined") { if (this.stores[key]) { console.warn(new ReferenceError("A store named " + key + " already exists, double check your store " + "names or pass in your own custom identifier for each store")); } else { console.warn(new ReferenceError("Store name was not specified")); } } key = uid(this.stores, key); } if (typeof StoreModel === "object") { return createStoreFromObject(this, StoreModel, key, saveStore); } // Creating a class here so we don't overload the provided store's // prototype with the mixin behaviour and I'm extending from StoreModel // so we can inherit any extensions from the provided store. var Store = (function (_StoreModel) { function Store(alt) { _classCallCheck(this, Store); _get(Object.getPrototypeOf(Store.prototype), "constructor", this).call(this, alt); } _inherits(Store, _StoreModel); return Store; })(StoreModel); assign(Store.prototype, StoreMixinListeners, StoreMixinEssentials, { _storeName: key, alt: this, dispatcher: this.dispatcher, getInstance: function getInstance() { return storeInstance; }, setState: function setState() { var values = arguments[0] === undefined ? {} : arguments[0]; assign(this, values); this.emitChange(); return false; } }); Store.prototype[LIFECYCLE] = {}; Store.prototype[LISTENERS] = {}; Store.prototype[PUBLIC_METHODS] = {}; var store = new Store(this); storeInstance = assign(new AltStore(this.dispatcher, store), getInternalMethods(StoreModel, builtIns)); if (saveStore) { this.stores[key] = storeInstance; saveInitialSnapshot(this, key); } return storeInstance; } }, generateActions: { value: function generateActions() { for (var _len = arguments.length, actionNames = Array(_len), _key = 0; _key < _len; _key++) { actionNames[_key] = arguments[_key]; } return this.createActions(function () { this.generateActions.apply(this, actionNames); }); } }, createActions: { value: function createActions(ActionsClass) { var _this8 = this; var exportObj = arguments[1] === undefined ? {} : arguments[1]; var actions = assign({}, getInternalMethods(ActionsClass.prototype, builtInProto)); var key = ActionsClass.name || ActionsClass.displayName || ""; var ActionsGenerator = (function (_ActionsClass) { function ActionsGenerator(alt) { _classCallCheck(this, ActionsGenerator); _get(Object.getPrototypeOf(ActionsGenerator.prototype), "constructor", this).call(this, alt); } _inherits(ActionsGenerator, _ActionsClass); _createClass(ActionsGenerator, { generateActions: { value: function generateActions() { for (var _len = arguments.length, actionNames = Array(_len), _key = 0; _key < _len; _key++) { actionNames[_key] = arguments[_key]; } actionNames.forEach(function (actionName) { // This is a function so we can later bind this to ActionCreator actions[actionName] = function (x) { for (var _len2 = arguments.length, a = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { a[_key2 - 1] = arguments[_key2]; } this.dispatch(a.length ? [x].concat(a) : x); }; }); } } }); return ActionsGenerator; })(ActionsClass); new ActionsGenerator(this); return Object.keys(actions).reduce(function (obj, action) { var constant = formatAsConstant(action); var actionName = Symbol("" + key + "#" + action); // Wrap the action so we can provide a dispatch method var newAction = new ActionCreator(_this8, actionName, actions[action], obj); // Set all the properties on action obj[action] = newAction[ACTION_HANDLER]; obj[action].defer = function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } setTimeout(function () { newAction[ACTION_HANDLER].apply(null, args); }); }; obj[action][ACTION_KEY] = actionName; obj[constant] = actionName; return obj; }, exportObj); } }, takeSnapshot: { value: function takeSnapshot() { var state = snapshot(this); this[LAST_SNAPSHOT] = state; return state; } }, rollback: { value: function rollback() { setAppState(this, this[LAST_SNAPSHOT], function (store) { if (store[LIFECYCLE].rollback) { store[LIFECYCLE].rollback(); } }); } }, recycle: { value: function recycle() { for (var _len = arguments.length, storeNames = Array(_len), _key = 0; _key < _len; _key++) { storeNames[_key] = arguments[_key]; } var initialSnapshot = storeNames.length ? filterSnapshotOfStores(this[INIT_SNAPSHOT], storeNames) : this[INIT_SNAPSHOT]; setAppState(this, initialSnapshot, function (store) { if (store[LIFECYCLE].init) { store[LIFECYCLE].init(); } }); } }, flush: { value: function flush() { var state = snapshot(this); this.recycle(); return state; } }, bootstrap: { value: function bootstrap(data) { setAppState(this, data, function (store) { if (store[LIFECYCLE].bootstrap) { store[LIFECYCLE].bootstrap(); } }); } }, addActions: { // Instance type methods for injecting alt into your application as context value: function addActions(name, ActionsClass) { this.actions[name] = this.createActions(ActionsClass); } }, addStore: { value: function addStore(name, StoreModel, saveStore) { this.createStore(StoreModel, name, saveStore); } }, getActions: { value: function getActions(name) { return this.actions[name]; } }, getStore: { value: function getStore(name) { return this.stores[name]; } } }); return Alt; })(); module.exports = Alt; },{"es-symbol":"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/es-symbol/dist/symbol.js","eventemitter3":"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/eventemitter3/index.js","flux":"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/flux/index.js","object-assign":"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/object-assign/index.js"}],"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/es-symbol/dist/symbol.js":[function(require,module,exports){ "use strict"; var globalSymbolRegistryList = {}; // Aliases & Helpers var make = Object.create; var defProps = Object.defineProperties; var defProp = Object.defineProperty; var defValue = function (value) { var opts = arguments[1] === undefined ? {} : arguments[1]; return { value: value, configurable: !!opts.c, writable: !!opts.w, enumerable: !!opts.e }; }; var isSymbol = function (symbol) { return symbol && symbol[xSymbol.toStringTag] === "Symbol"; }; var supportsAccessors = undefined; try { var x = defProp({}, "y", { get: function () { return 1; } }); supportsAccessors = x.y === 1; } catch (e) { supportsAccessors = false; } var id = {}; var uid = function (desc) { desc = String(desc); var x = ""; var i = 0; while (id[desc + x]) { x = i += 1; } id[desc + x] = 1; var tag = "Symbol(" + desc + "" + x + ")"; /* istanbul ignore else */ if (supportsAccessors) { // Make the symbols hidden to pre-es6 code defProp(Object.prototype, tag, { get: undefined, set: function (value) { defProp(this, tag, defValue(value, { c: true, w: true })); }, configurable: true, enumerable: false }); } return tag; }; // The base symbol var SymbolProto = make(null); // 19.4.1.1 function xSymbol(descString) { if (this instanceof xSymbol) { throw new TypeError("Symbol is not a constructor"); } descString = descString === undefined ? "" : String(descString); var tag = uid(descString); /* istanbul ignore next */ if (!supportsAccessors) { return tag; } return make(SymbolProto, { __description__: defValue(descString), __tag__: defValue(tag) }); } defProps(xSymbol, { // 19.4.2.1 "for": defValue(function (key) { var stringKey = String(key); if (globalSymbolRegistryList[stringKey]) { return globalSymbolRegistryList[stringKey]; } var symbol = xSymbol(stringKey); globalSymbolRegistryList[stringKey] = symbol; return symbol; }), // 19.4.2.5 keyFor: defValue(function (sym) { if (!isSymbol(sym)) { throw new TypeError("" + sym + " is not a symbol"); } for (var key in globalSymbolRegistryList) { if (globalSymbolRegistryList[key] === sym) { return globalSymbolRegistryList[key].__description__; } } }) }); // 6.1.5.1 defProps(xSymbol, { hasInstance: defValue(xSymbol("hasInstance")), isConcatSpreadable: defValue(xSymbol("isConcatSpreadable")), iterator: defValue(xSymbol("iterator")), match: defValue(xSymbol("match")), replace: defValue(xSymbol("replace")), search: defValue(xSymbol("search")), species: defValue(xSymbol("species")), split: defValue(xSymbol("split")), toPrimitive: defValue(xSymbol("toPrimitive")), toStringTag: defValue(xSymbol("toStringTag")), unscopables: defValue(xSymbol("unscopables")) }); // 19.4.3 defProps(SymbolProto, { constructor: defValue(xSymbol), // 19.4.3.2 toString: defValue(function () { return this.__tag__; }), // 19.4.3.3 valueOf: defValue(function () { return "Symbol(" + this.__description__ + ")"; }) }); // 19.4.3.5 /* istanbul ignore else */ if (supportsAccessors) { defProp(SymbolProto, xSymbol.toStringTag, defValue("Symbol", { c: true })); } module.exports = typeof Symbol === "function" ? Symbol : xSymbol; },{}],"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/eventemitter3/index.js":[function(require,module,exports){ 'use strict'; /** * Representation of a single EventEmitter function. * * @param {Function} fn Event handler to be called. * @param {Mixed} context Context for function execution. * @param {Boolean} once Only emit once * @api private */ function EE(fn, context, once) { this.fn = fn; this.context = context; this.once = once || false; } /** * Minimal EventEmitter interface that is molded against the Node.js * EventEmitter interface. * * @constructor * @api public */ function EventEmitter() { /* Nothing to set */ } /** * Holds the assigned EventEmitters by name. * * @type {Object} * @private */ EventEmitter.prototype._events = undefined; /** * Return a list of assigned event listeners. * * @param {String} event The events that should be listed. * @returns {Array} * @api public */ EventEmitter.prototype.listeners = function listeners(event) { if (!this._events || !this._events[event]) return []; if (this._events[event].fn) return [this._events[event].fn]; for (var i = 0, l = this._events[event].length, ee = new Array(l); i < l; i++) { ee[i] = this._events[event][i].fn; } return ee; }; /** * Emit an event to all registered event listeners. * * @param {String} event The name of the event. * @returns {Boolean} Indication if we've emitted an event. * @api public */ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { if (!this._events || !this._events[event]) return false; var listeners = this._events[event] , len = arguments.length , args , i; if ('function' === typeof listeners.fn) { if (listeners.once) this.removeListener(event, listeners.fn, true); switch (len) { case 1: return listeners.fn.call(listeners.context), true; case 2: return listeners.fn.call(listeners.context, a1), true; case 3: return listeners.fn.call(listeners.context, a1, a2), true; case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; } for (i = 1, args = new Array(len -1); i < len; i++) { args[i - 1] = arguments[i]; } listeners.fn.apply(listeners.context, args); } else { var length = listeners.length , j; for (i = 0; i < length; i++) { if (listeners[i].once) this.removeListener(event, listeners[i].fn, true); switch (len) { case 1: listeners[i].fn.call(listeners[i].context); break; case 2: listeners[i].fn.call(listeners[i].context, a1); break; case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; default: if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { args[j - 1] = arguments[j]; } listeners[i].fn.apply(listeners[i].context, args); } } } return true; }; /** * Register a new EventListener for the given event. * * @param {String} event Name of the event. * @param {Functon} fn Callback function. * @param {Mixed} context The context of the function. * @api public */ EventEmitter.prototype.on = function on(event, fn, context) { var listener = new EE(fn, context || this); if (!this._events) this._events = {}; if (!this._events[event]) this._events[event] = listener; else { if (!this._events[event].fn) this._events[event].push(listener); else this._events[event] = [ this._events[event], listener ]; } return this; }; /** * Add an EventListener that's only called once. * * @param {String} event Name of the event. * @param {Function} fn Callback function. * @param {Mixed} context The context of the function. * @api public */ EventEmitter.prototype.once = function once(event, fn, context) { var listener = new EE(fn, context || this, true); if (!this._events) this._events = {}; if (!this._events[event]) this._events[event] = listener; else { if (!this._events[event].fn) this._events[event].push(listener); else this._events[event] = [ this._events[event], listener ]; } return this; }; /** * Remove event listeners. * * @param {String} event The event we want to remove. * @param {Function} fn The listener that we need to find. * @param {Boolean} once Only remove once listeners. * @api public */ EventEmitter.prototype.removeListener = function removeListener(event, fn, once) { if (!this._events || !this._events[event]) return this; var listeners = this._events[event] , events = []; if (fn) { if (listeners.fn && (listeners.fn !== fn || (once && !listeners.once))) { events.push(listeners); } if (!listeners.fn) for (var i = 0, length = listeners.length; i < length; i++) { if (listeners[i].fn !== fn || (once && !listeners[i].once)) { events.push(listeners[i]); } } } // // Reset the array, or remove it completely if we have no more listeners. // if (events.length) { this._events[event] = events.length === 1 ? events[0] : events; } else { delete this._events[event]; } return this; }; /** * Remove all listeners or only the listeners for the specified event. * * @param {String} event The event want to remove all listeners for. * @api public */ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { if (!this._events) return this; if (event) delete this._events[event]; else this._events = {}; return this; }; // // Alias methods names because people roll like that. // EventEmitter.prototype.off = EventEmitter.prototype.removeListener; EventEmitter.prototype.addListener = EventEmitter.prototype.on; // // This function doesn't apply anymore. // EventEmitter.prototype.setMaxListeners = function setMaxListeners() { return this; }; // // Expose the module. // EventEmitter.EventEmitter = EventEmitter; EventEmitter.EventEmitter2 = EventEmitter; EventEmitter.EventEmitter3 = EventEmitter; // // Expose the module. // module.exports = EventEmitter; },{}],"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/flux/index.js":[function(require,module,exports){ /** * Copyright (c) 2014, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ module.exports.Dispatcher = require('./lib/Dispatcher') },{"./lib/Dispatcher":"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/flux/lib/Dispatcher.js"}],"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/flux/lib/Dispatcher.js":[function(require,module,exports){ /* * Copyright (c) 2014, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule Dispatcher * @typechecks */ "use strict"; var invariant = require('./invariant'); var _lastID = 1; var _prefix = 'ID_'; /** * Dispatcher is used to broadcast payloads to registered callbacks. This is * different from generic pub-sub systems in two ways: * * 1) Callbacks are not subscribed to particular events. Every payload is * dispatched to every registered callback. * 2) Callbacks can be deferred in whole or part until other callbacks have * been executed. * * For example, consider this hypothetical flight destination form, which * selects a default city when a country is selected: * * var flightDispatcher = new Dispatcher(); * * // Keeps track of which country is selected * var CountryStore = {country: null}; * * // Keeps track of which city is selected * var CityStore = {city: null}; * * // Keeps track of the base flight price of the selected city * var FlightPriceStore = {price: null} * * When a user changes the selected city, we dispatch the payload: * * flightDispatcher.dispatch({ * actionType: 'city-update', * selectedCity: 'paris' * }); * * This payload is digested by `CityStore`: * * flightDispatcher.register(function(payload) { * if (payload.actionType === 'city-update') { * CityStore.city = payload.selectedCity; * } * }); * * When the user selects a country, we dispatch the payload: * * flightDispatcher.dispatch({ * actionType: 'country-update', * selectedCountry: 'australia' * }); * * This payload is digested by both stores: * * CountryStore.dispatchToken = flightDispatcher.register(function(payload) { * if (payload.actionType === 'country-update') { * CountryStore.country = payload.selectedCountry; * } * }); * * When the callback to update `CountryStore` is registered, we save a reference * to the returned token. Using this token with `waitFor()`, we can guarantee * that `CountryStore` is updated before the callback that updates `CityStore` * needs to query its data. * * CityStore.dispatchToken = flightDispatcher.register(function(payload) { * if (payload.actionType === 'country-update') { * // `CountryStore.country` may not be updated. * flightDispatcher.waitFor([CountryStore.dispatchToken]); * // `CountryStore.country` is now guaranteed to be updated. * * // Select the default city for the new country * CityStore.city = getDefaultCityForCountry(CountryStore.country); * } * }); * * The usage of `waitFor()` can be chained, for example: * * FlightPriceStore.dispatchToken = * flightDispatcher.register(function(payload) { * switch (payload.actionType) { * case 'country-update': * flightDispatcher.waitFor([CityStore.dispatchToken]); * FlightPriceStore.price = * getFlightPriceStore(CountryStore.country, CityStore.city); * break; * * case 'city-update': * FlightPriceStore.price = * FlightPriceStore(CountryStore.country, CityStore.city); * break; * } * }); * * The `country-update` payload will be guaranteed to invoke the stores' * registered callbacks in order: `CountryStore`, `CityStore`, then * `FlightPriceStore`. */ function Dispatcher() { this.$Dispatcher_callbacks = {}; this.$Dispatcher_isPending = {}; this.$Dispatcher_isHandled = {}; this.$Dispatcher_isDispatching = false; this.$Dispatcher_pendingPayload = null; } /** * Registers a callback to be invoked with every dispatched payload. Returns * a token that can be used with `waitFor()`. * * @param {function} callback * @return {string} */ Dispatcher.prototype.register=function(callback) { var id = _prefix + _lastID++; this.$Dispatcher_callbacks[id] = callback; return id; }; /** * Removes a callback based on its token. * * @param {string} id */ Dispatcher.prototype.unregister=function(id) { invariant( this.$Dispatcher_callbacks[id], 'Dispatcher.unregister(...): `%s` does not map to a registered callback.', id ); delete this.$Dispatcher_callbacks[id]; }; /** * Waits for the callbacks specified to be invoked before continuing execution * of the current callback. This method should only be used by a callback in * response to a dispatched payload. * * @param {array} ids */ Dispatcher.prototype.waitFor=function(ids) { invariant( this.$Dispatcher_isDispatching, 'Dispatcher.waitFor(...): Must be invoked while dispatching.' ); for (var ii = 0; ii < ids.length; ii++) { var id = ids[ii]; if (this.$Dispatcher_isPending[id]) { invariant( this.$Dispatcher_isHandled[id], 'Dispatcher.waitFor(...): Circular dependency detected while ' + 'waiting for `%s`.', id ); continue; } invariant( this.$Dispatcher_callbacks[id], 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.', id ); this.$Dispatcher_invokeCallback(id); } }; /** * Dispatches a payload to all registered callbacks. * * @param {object} payload */ Dispatcher.prototype.dispatch=function(payload) { invariant( !this.$Dispatcher_isDispatching, 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.' ); this.$Dispatcher_startDispatching(payload); try { for (var id in this.$Dispatcher_callbacks) { if (this.$Dispatcher_isPending[id]) { continue; } this.$Dispatcher_invokeCallback(id); } } finally { this.$Dispatcher_stopDispatching(); } }; /** * Is this Dispatcher currently dispatching. * * @return {boolean} */ Dispatcher.prototype.isDispatching=function() { return this.$Dispatcher_isDispatching; }; /** * Call the callback stored with the given id. Also do some internal * bookkeeping. * * @param {string} id * @internal */ Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) { this.$Dispatcher_isPending[id] = true; this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload); this.$Dispatcher_isHandled[id] = true; }; /** * Set up bookkeeping needed when dispatching. * * @param {object} payload * @internal */ Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) { for (var id in this.$Dispatcher_callbacks) { this.$Dispatcher_isPending[id] = false; this.$Dispatcher_isHandled[id] = false; } this.$Dispatcher_pendingPayload = payload; this.$Dispatcher_isDispatching = true; }; /** * Clear bookkeeping used for dispatching. * * @internal */ Dispatcher.prototype.$Dispatcher_stopDispatching=function() { this.$Dispatcher_pendingPayload = null; this.$Dispatcher_isDispatching = false; }; module.exports = Dispatcher; },{"./invariant":"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/flux/lib/invariant.js"}],"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/flux/lib/invariant.js":[function(require,module,exports){ /** * Copyright (c) 2014, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule invariant */ "use strict"; /** * Use invariant() to assert state which your program assumes to be true. * * Provide sprintf-style format (only %s is supported) and arguments * to provide information about what broke and what you were * expecting. * * The invariant message will be stripped in production, but the invariant * will remain to ensure logic does not differ in production. */ var invariant = function(condition, format, a, b, c, d, e, f) { if (false) { if (format === undefined) { throw new Error('invariant requires an error message argument'); } } if (!condition) { var error; if (format === undefined) { error = new Error( 'Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.' ); } else { var args = [a, b, c, d, e, f]; var argIndex = 0; error = new Error( 'Invariant Violation: ' + format.replace(/%s/g, function() { return args[argIndex++]; }) ); } error.framesToPop = 1; // we don't care about invariant's own frame throw error; } }; module.exports = invariant; },{}],"/Users/alex/Projects/webdrop/node_modules/alt/node_modules/object-assign/index.js":[function(require,module,exports){ 'use strict'; function ToObject(val) { if (val == null) { throw new TypeError('Object.assign cannot be called with null or undefined'); } return Object(val); } module.exports = Object.assign || function (target, source) { var from; var keys; var to = ToObject(target); for (var s = 1; s < arguments.length; s++) { from = arguments[s]; keys = Object.keys(Object(from)); for (var i = 0; i < keys.length; i++) { to[keys[i]] = from[keys[i]]; } } return to; }; },{}],"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js":[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; var queue = []; var draining = false; function drainQueue() { if (draining) { return; } draining = true; var currentQueue; var len = queue.length; while(len) { currentQueue = queue; queue = []; var i = -1; while (++i < len) { currentQueue[i](); } len = queue.length; } draining = false; } process.nextTick = function (fun) { queue.push(fun); if (!draining) { setTimeout(drainQueue, 0); } }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); }; // TODO(shtylman) process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/adapter.js":[function(require,module,exports){ module.exports.RTCSessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription; module.exports.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; module.exports.RTCIceCandidate = window.RTCIceCandidate || window.mozRTCIceCandidate; },{}],"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/dataconnection.js":[function(require,module,exports){ var util = require('./util'); var EventEmitter = require('eventemitter3'); var Negotiator = require('./negotiator'); var Reliable = require('reliable'); /** * Wraps a DataChannel between two Peers. */ function DataConnection(peer, provider, options) { if (!(this instanceof DataConnection)) return new DataConnection(peer, provider, options); EventEmitter.call(this); this.options = util.extend({ serialization: 'binary', reliable: false }, options); // Connection is not open yet. this.open = false; this.type = 'data'; this.peer = peer; this.provider = provider; this.id = this.options.connectionId || DataConnection._idPrefix + util.randomToken(); this.label = this.options.label || this.id; this.metadata = this.options.metadata; this.serialization = this.options.serialization; this.reliable = this.options.reliable; // Data channel buffering. this._buffer = []; this._buffering = false; this.bufferSize = 0; // For storing large data. this._chunkedData = {}; if (this.options._payload) { this._peerBrowser = this.options._payload.browser; } Negotiator.startConnection( this, this.options._payload || { originator: true } ); } util.inherits(DataConnection, EventEmitter); DataConnection._idPrefix = 'dc_'; /** Called by the Negotiator when the DataChannel is ready. */ DataConnection.prototype.initialize = function(dc) { this._dc = this.dataChannel = dc; this._configureDataChannel(); } DataConnection.prototype._configureDataChannel = function() { var self = this; if (util.supports.sctp) { this._dc.binaryType = 'arraybuffer'; } this._dc.onopen = function() { util.log('Data channel connection success'); self.open = true; self.emit('open'); } // Use the Reliable shim for non Firefox browsers if (!util.supports.sctp && this.reliable) { this._reliable = new Reliable(this._dc, util.debug); } if (this._reliable) { this._reliable.onmessage = function(msg) { self.emit('data', msg); }; } else { this._dc.onmessage = function(e) { self._handleDataMessage(e); }; } this._dc.onclose = function(e) { util.log('DataChannel closed for:', self.peer); self.close(); }; } // Handles a DataChannel message. DataConnection.prototype._handleDataMessage = function(e) { var self = this; var data = e.data; var datatype = data.constructor; if (this.serialization === 'binary' || this.serialization === 'binary-utf8') { if (datatype === Blob) { // Datatype should never be blob util.blobToArrayBuffer(data, function(ab) { data = util.unpack(ab); self.emit('data', data); }); return; } else if (datatype === ArrayBuffer) { data = util.unpack(data); } else if (datatype === String) { // String fallback for binary data for browsers that don't support binary yet var ab = util.binaryStringToArrayBuffer(data); data = util.unpack(ab); } } else if (this.serialization === 'json') { data = JSON.parse(data); } // Check if we've chunked--if so, piece things back together. // We're guaranteed that this isn't 0. if (data.__peerData) { var id = data.__peerData; var chunkInfo = this._chunkedData[id] || {data: [], count: 0, total: data.total}; chunkInfo.data[data.n] = data.data; chunkInfo.count += 1; if (chunkInfo.total === chunkInfo.count) { // Clean up before making the recursive call to `_handleDataMessage`. delete this._chunkedData[id]; // We've received all the chunks--time to construct the complete data. data = new Blob(chunkInfo.data); this._handleDataMessage({data: data}); } this._chunkedData[id] = chunkInfo; return; } this.emit('data', data); } /** * Exposed functionality for users. */ /** Allows user to close connection. */ DataConnection.prototype.close = function() { if (!this.open) { return; } this.open = false; Negotiator.cleanup(this); this.emit('close'); } /** Allows user to send data. */ DataConnection.prototype.send = function(data, chunked) { if (!this.open) { this.emit('error', new Error('Connection is not open. You should listen for the `open` event before sending messages.')); return; } if (this._reliable) { // Note: reliable shim sending will make it so that you cannot customize // serialization. this._reliable.send(data); return; } var self = this; if (this.serialization === 'json') { this._bufferedSend(JSON.stringify(data)); } else if (this.serialization === 'binary' || this.serialization === 'binary-utf8') { var blob = util.pack(data); // For Chrome-Firefox interoperability, we need to make Firefox "chunk" // the data it sends out. var needsChunking = util.chunkedBrowsers[this._peerBrowser] || util.chunkedBrowsers[util.browser]; if (needsChunking && !chunked && blob.size > util.chunkedMTU) { this._sendChunks(blob); return; } // DataChannel currently only supports strings. if (!util.supports.sctp) { util.blobToBinaryString(blob, function(str) { self._bufferedSend(str); }); } else if (!util.supports.binaryBlob) { // We only do this if we really need to (e.g. blobs are not supported), // because this conversion is costly. util.blobToArrayBuffer(blob, function(ab) { self._bufferedSend(ab); }); } else { this._bufferedSend(blob); } } else { this._bufferedSend(data); } } DataConnection.prototype._bufferedSend = function(msg) { if (this._buffering || !this._trySend(msg)) { this._buffer.push(msg); this.bufferSize = this._buffer.length; } } // Returns true if the send succeeds. DataConnection.prototype._trySend = function(msg) { try { this._dc.send(msg); } catch (e) { this._buffering = true; var self = this; setTimeout(function() { // Try again. self._buffering = false; self._tryBuffer(); }, 100); return false; } return true; } // Try to send the first message in the buffer. DataConnection.prototype._tryBuffer = function() { if (this._buffer.length === 0) { return; } var msg = this._buffer[0]; if (this._trySend(msg)) { this._buffer.shift(); this.bufferSize = this._buffer.length; this._tryBuffer(); } } DataConnection.prototype._sendChunks = function(blob) { var blobs = util.chunk(blob); for (var i = 0, ii = blobs.length; i < ii; i += 1) { var blob = blobs[i]; this.send(blob, true); } } DataConnection.prototype.handleMessage = function(message) { var payload = message.payload; switch (message.type) { case 'ANSWER': this._peerBrowser = payload.browser; // Forward to negotiator Negotiator.handleSDP(message.type, this, payload.sdp); break; case 'CANDIDATE': Negotiator.handleCandidate(this, payload.candidate); break; default: util.warn('Unrecognized message type:', message.type, 'from peer:', this.peer); break; } } module.exports = DataConnection; },{"./negotiator":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/negotiator.js","./util":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/util.js","eventemitter3":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/eventemitter3/index.js","reliable":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/reliable/lib/reliable.js"}],"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/mediaconnection.js":[function(require,module,exports){ var util = require('./util'); var EventEmitter = require('eventemitter3'); var Negotiator = require('./negotiator'); /** * Wraps the streaming interface between two Peers. */ function MediaConnection(peer, provider, options) { if (!(this instanceof MediaConnection)) return new MediaConnection(peer, provider, options); EventEmitter.call(this); this.options = util.extend({}, options); this.open = false; this.type = 'media'; this.peer = peer; this.provider = provider; this.metadata = this.options.metadata; this.localStream = this.options._stream; this.id = this.options.connectionId || MediaConnection._idPrefix + util.randomToken(); if (this.localStream) { Negotiator.startConnection( this, {_stream: this.localStream, originator: true} ); } }; util.inherits(MediaConnection, EventEmitter); MediaConnection._idPrefix = 'mc_'; MediaConnection.prototype.addStream = function(remoteStream) { util.log('Receiving stream', remoteStream); this.remoteStream = remoteStream; this.emit('stream', remoteStream); // Should we call this `open`? }; MediaConnection.prototype.handleMessage = function(message) { var payload = message.payload; switch (message.type) { case 'ANSWER': // Forward to negotiator Negotiator.handleSDP(message.type, this, payload.sdp); this.open = true; break; case 'CANDIDATE': Negotiator.handleCandidate(this, payload.candidate); break; default: util.warn('Unrecognized message type:', message.type, 'from peer:', this.peer); break; } } MediaConnection.prototype.answer = function(stream) { if (this.localStream) { util.warn('Local stream already exists on this MediaConnection. Are you answering a call twice?'); return; } this.options._payload._stream = stream; this.localStream = stream; Negotiator.startConnection( this, this.options._payload ) // Retrieve lost messages stored because PeerConnection not set up. var messages = this.provider._getMessages(this.id); for (var i = 0, ii = messages.length; i < ii; i += 1) { this.handleMessage(messages[i]); } this.open = true; }; /** * Exposed functionality for users. */ /** Allows user to close connection. */ MediaConnection.prototype.close = function() { if (!this.open) { return; } this.open = false; Negotiator.cleanup(this); this.emit('close') }; module.exports = MediaConnection; },{"./negotiator":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/negotiator.js","./util":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/util.js","eventemitter3":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/eventemitter3/index.js"}],"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/negotiator.js":[function(require,module,exports){ var util = require('./util'); var RTCPeerConnection = require('./adapter').RTCPeerConnection; var RTCSessionDescription = require('./adapter').RTCSessionDescription; var RTCIceCandidate = require('./adapter').RTCIceCandidate; /** * Manages all negotiations between Peers. */ var Negotiator = { pcs: { data: {}, media: {} }, // type => {peerId: {pc_id: pc}}. //providers: {}, // provider's id => providers (there may be multiple providers/client. queue: [] // connections that are delayed due to a PC being in use. } Negotiator._idPrefix = 'pc_'; /** Returns a PeerConnection object set up correctly (for data, media). */ Negotiator.startConnection = function(connection, options) { var pc = Negotiator._getPeerConnection(connection, options); if (connection.type === 'media' && options._stream) { // Add the stream. pc.addStream(options._stream); } // Set the connection's PC. connection.pc = connection.peerConnection = pc; // What do we need to do now? if (options.originator) { if (connection.type === 'data') { // Create the datachannel. var config = {}; // Dropping reliable:false support, since it seems to be crashing // Chrome. /*if (util.supports.sctp && !options.reliable) { // If we have canonical reliable support... config = {maxRetransmits: 0}; }*/ // Fallback to ensure older browsers don't crash. if (!util.supports.sctp) { config = {reliable: options.reliable}; } var dc = pc.createDataChannel(connection.label, config); connection.initialize(dc); } if (!util.supports.onnegotiationneeded) { Negotiator._makeOffer(connection); } } else { Negotiator.handleSDP('OFFER', connection, options.sdp); } } Negotiator._getPeerConnection = function(connection, options) { if (!Negotiator.pcs[connection.type]) { util.error(connection.type + ' is not a valid connection type. Maybe you overrode the `type` property somewhere.'); } if (!Negotiator.pcs[connection.type][connection.peer]) { Negotiator.pcs[connection.type][connection.peer] = {}; } var peerConnections = Negotiator.pcs[connection.type][connection.peer]; var pc; // Not multiplexing while FF and Chrome have not-great support for it. /*if (options.multiplex) { ids = Object.keys(peerConnections); for (var i = 0, ii = ids.length; i < ii; i += 1) { pc = peerConnections[ids[i]]; if (pc.signalingState === 'stable') { break; // We can go ahead and use this PC. } } } else */ if (options.pc) { // Simplest case: PC id already provided for us. pc = Negotiator.pcs[connection.type][connection.peer][options.pc]; } if (!pc || pc.signalingState !== 'stable') { pc = Negotiator._startPeerConnection(connection); } return pc; } /* Negotiator._addProvider = function(provider) { if ((!provider.id && !provider.disconnected) || !provider.socket.open) { // Wait for provider to obtain an ID. provider.on('open', function(id) { Negotiator._addProvider(provider); }); } else { Negotiator.providers[provider.id] = provider; } }*/ /** Start a PC. */ Negotiator._startPeerConnection = function(connection) { util.log('Creating RTCPeerConnection.'); var id = Negotiator._idPrefix + util.randomToken(); var optional = {}; if (connection.type === 'data' && !util.supports.sctp) { optional = {optional: [{RtpDataChannels: true}]}; } else if (connection.type === 'media') { // Interop req for chrome. optional = {optional: [{DtlsSrtpKeyAgreement: true}]}; } var pc = new RTCPeerConnection(connection.provider.options.config, optional); Negotiator.pcs[connection.type][connection.peer][id] = pc; Negotiator._setupListeners(connection, pc, id); return pc; } /** Set up various WebRTC listeners. */ Negotiator._setupListeners = function(connection, pc, pc_id) { var peerId = connection.peer; var connectionId = connection.id; var provider = connection.provider; // ICE CANDIDATES. util.log('Listening for ICE candidates.'); pc.onicecandidate = function(evt) { if (evt.candidate) { util.log('Received ICE candidates for:', connection.peer); provider.socket.send({ type: 'CANDIDATE', payload: { candidate: evt.candidate, type: connection.type, connectionId: connection.id }, dst: peerId }); } }; pc.oniceconnectionstatechange = function() { switch (pc.iceConnectionState) { case 'disconnected': case 'failed': util.log('iceConnectionState is disconnected, closing connections to ' + peerId); connection.close(); break; case 'completed': pc.onicecandidate = util.noop; break; } }; // Fallback for older Chrome impls. pc.onicechange = pc.oniceconnectionstatechange; // ONNEGOTIATIONNEEDED (Chrome) util.log('Listening for `negotiationneeded`'); pc.onnegotiationneeded = function() { util.log('`negotiationneeded` triggered'); if (pc.signalingState == 'stable') { Negotiator._makeOffer(connection); } else { util.log('onnegotiationneeded triggered when not stable. Is another connection being established?'); } }; // DATACONNECTION. util.log('Listening for data channel'); // Fired between offer and answer, so options should already be saved // in the options hash. pc.ondatachannel = function(evt) { util.log('Received data channel'); var dc = evt.channel; var connection = provider.getConnection(peerId, connectionId); connection.initialize(dc); }; // MEDIACONNECTION. util.log('Listening for remote stream'); pc.onaddstream = function(evt) { util.log('Received remote stream'); var stream = evt.stream; var connection = provider.getConnection(peerId, connectionId); // 10/10/2014: looks like in Chrome 38, onaddstream is triggered after // setting the remote description. Our connection object in these cases // is actually a DATA connection, so addStream fails. // TODO: This is hopefully just a temporary fix. We should try to // understand why this is happening. if (connection.type === 'media') { connection.addStream(stream); } }; } Negotiator.cleanup = function(connection) { util.log('Cleaning up PeerConnection to ' + connection.peer); var pc = connection.pc; if (!!pc && (pc.readyState !== 'closed' || pc.signalingState !== 'closed')) { pc.close(); connection.pc = null; } } Negotiator._makeOffer = function(connection) { var pc = connection.pc; pc.createOffer(function(offer) { util.log('Created offer.'); if (!util.supports.sctp && connection.type === 'data' && connection.reliable) { offer.sdp = Reliable.higherBandwidthSDP(offer.sdp); } pc.setLocalDescription(offer, function() { util.log('Set localDescription: offer', 'for:', connection.peer); connection.provider.socket.send({ type: 'OFFER', payload: { sdp: offer, type: connection.type, label: connection.label, connectionId: connection.id, reliable: connection.reliable, serialization: connection.serialization, metadata: connection.metadata, browser: util.browser }, dst: connection.peer }); }, function(err) { connection.provider.emitError('webrtc', err); util.log('Failed to setLocalDescription, ', err); }); }, function(err) { connection.provider.emitError('webrtc', err); util.log('Failed to createOffer, ', err); }, connection.options.constraints); } Negotiator._makeAnswer = function(connection) { var pc = connection.pc; pc.createAnswer(function(answer) { util.log('Created answer.'); if (!util.supports.sctp && connection.type === 'data' && connection.reliable) { answer.sdp = Reliable.higherBandwidthSDP(answer.sdp); } pc.setLocalDescription(answer, function() { util.log('Set localDescription: answer', 'for:', connection.peer); connection.provider.socket.send({ type: 'ANSWER', payload: { sdp: answer, type: connection.type, connectionId: connection.id, browser: util.browser }, dst: connection.peer }); }, function(err) { connection.provider.emitError('webrtc', err); util.log('Failed to setLocalDescription, ', err); }); }, function(err) { connection.provider.emitError('webrtc', err); util.log('Failed to create answer, ', err); }); } /** Handle an SDP. */ Negotiator.handleSDP = function(type, connection, sdp) { sdp = new RTCSessionDescription(sdp); var pc = connection.pc; util.log('Setting remote description', sdp); pc.setRemoteDescription(sdp, function() { util.log('Set remoteDescription:', type, 'for:', connection.peer); if (type === 'OFFER') { Negotiator._makeAnswer(connection); } }, function(err) { connection.provider.emitError('webrtc', err); util.log('Failed to setRemoteDescription, ', err); }); } /** Handle a candidate. */ Negotiator.handleCandidate = function(connection, ice) { var candidate = ice.candidate; var sdpMLineIndex = ice.sdpMLineIndex; connection.pc.addIceCandidate(new RTCIceCandidate({ sdpMLineIndex: sdpMLineIndex, candidate: candidate })); util.log('Added ICE candidate for:', connection.peer); } module.exports = Negotiator; },{"./adapter":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/adapter.js","./util":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/util.js"}],"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/peer.js":[function(require,module,exports){ var util = require('./util'); var EventEmitter = require('eventemitter3'); var Socket = require('./socket'); var MediaConnection = require('./mediaconnection'); var DataConnection = require('./dataconnection'); /** * A peer who can initiate connections with other peers. */ function Peer(id, options) { if (!(this instanceof Peer)) return new Peer(id, options); EventEmitter.call(this); // Deal with overloading if (id && id.constructor == Object) { options = id; id = undefined; } else if (id) { // Ensure id is a string id = id.toString(); } // // Configurize options options = util.extend({ debug: 0, // 1: Errors, 2: Warnings, 3: All logs host: util.CLOUD_HOST, port: util.CLOUD_PORT, key: 'peerjs', path: '/', token: util.randomToken(), config: util.defaultConfig }, options); this.options = options; // Detect relative URL host. if (options.host === '/') { options.host = window.location.hostname; } // Set path correctly. if (options.path[0] !== '/') { options.path = '/' + options.path; } if (options.path[options.path.length - 1] !== '/') { options.path += '/'; } // Set whether we use SSL to same as current host if (options.secure === undefined && options.host !== util.CLOUD_HOST) { options.secure = util.isSecure(); } // Set a custom log function if present if (options.logFunction) { util.setLogFunction(options.logFunction); } util.setLogLevel(options.debug); // // Sanity checks // Ensure WebRTC supported if (!util.supports.audioVideo && !util.supports.data ) { this._delayedAbort('browser-incompatible', 'The current browser does not support WebRTC'); return; } // Ensure alphanumeric id if (!util.validateId(id)) { this._delayedAbort('invalid-id', 'ID "' + id + '" is invalid'); return; } // Ensure valid key if (!util.validateKey(options.key)) { this._delayedAbort('invalid-key', 'API KEY "' + options.key + '" is invalid'); return; } // Ensure not using unsecure cloud server on SSL page if (options.secure && options.host === '0.peerjs.com') { this._delayedAbort('ssl-unavailable', 'The cloud server currently does not support HTTPS. Please run your own PeerServer to use HTTPS.'); return; } // // States. this.destroyed = false; // Connections have been killed this.disconnected = false; // Connection to PeerServer killed but P2P connections still active this.open = false; // Sockets and such are not yet open. // // References this.connections = {}; // DataConnections for this peer. this._lostMessages = {}; // src => [list of messages] // // Start the server connection this._initializeServerConnection(); if (id) { this._initialize(id); } else { this._retrieveId(); } // } util.inherits(Peer, EventEmitter); // Initialize the 'socket' (which is actually a mix of XHR streaming and // websockets.) Peer.prototype._initializeServerConnection = function() { var self = this; this.socket = new Socket(this.options.secure, this.options.host, this.options.port, this.options.path, this.options.key); this.socket.on('message', function(data) { self._handleMessage(data); }); this.socket.on('error', function(error) { self._abort('socket-error', error); }); this.socket.on('disconnected', function() { // If we haven't explicitly disconnected, emit error and disconnect. if (!self.disconnected) { self.emitError('network', 'Lost connection to server.'); self.disconnect(); } }); this.socket.on('close', function() { // If we haven't explicitly disconnected, emit error. if (!self.disconnected) { self._abort('socket-closed', 'Underlying socket is already closed.'); } }); }; /** Get a unique ID from the server via XHR. */ Peer.prototype._retrieveId = function(cb) { var self = this; var http = new XMLHttpRequest(); var protocol = this.options.secure ? 'https://' : 'http://'; var url = protocol + this.options.host + ':' + this.options.port + this.options.path + this.options.key + '/id'; var queryString = '?ts=' + new Date().getTime() + '' + Math.random(); url += queryString; // If there's no ID we need to wait for one before trying to init socket. http.open('get', url, true); http.onerror = function(e) { util.error('Error retrieving ID', e); var pathError = ''; if (self.options.path === '/' && self.options.host !== util.CLOUD_HOST) { pathError = ' If you passed in a `path` to your self-hosted PeerServer, ' + 'you\'ll also need to pass in that same path when creating a new ' + 'Peer.'; } self._abort('server-error', 'Could not get an ID from the server.' + pathError); }; http.onreadystatechange = function() { if (http.readyState !== 4) { return; } if (http.status !== 200) { http.onerror(); return; } self._initialize(http.responseText); }; http.send(null); }; /** Initialize a connection with the server. */ Peer.prototype._initialize = function(id) { this.id = id; this.socket.start(this.id, this.options.token); }; /** Handles messages from the server. */ Peer.prototype._handleMessage = function(message) { var type = message.type; var payload = message.payload; var peer = message.src; var connection; switch (type) { case 'OPEN': // The connection to the server is open. this.emit('open', this.id); this.open = true; break; case 'ERROR': // Server error. this._abort('server-error', payload.msg); break; case 'ID-TAKEN': // The selected ID is taken. this._abort('unavailable-id', 'ID `' + this.id + '` is taken'); break; case 'INVALID-KEY': // The given API key cannot be found. this._abort('invalid-key', 'API KEY "' + this.options.key + '" is invalid'); break; // case 'LEAVE': // Another peer has closed its connection to this peer. util.log('Received leave message from', peer); this._cleanupPeer(peer); break; case 'EXPIRE': // The offer sent to a peer has expired without response. this.emitError('peer-unavailable', 'Could not connect to peer ' + peer); break; case 'OFFER': // we should consider switching this to CALL/CONNECT, but this is the least breaking option. var connectionId = payload.connectionId; connection = this.getConnection(peer, connectionId); if (connection) { util.warn('Offer received for existing Connection ID:', connectionId); //connection.handleMessage(message); } else { // Create a new connection. if (payload.type === 'media') { connection = new MediaConnection(peer, this, { connectionId: connectionId, _payload: payload, metadata: payload.metadata }); this._addConnection(peer, connection); this.emit('call', connection); } else if (payload.type === 'data') { connection = new DataConnection(peer, this, { connectionId: connectionId, _payload: payload, metadata: payload.metadata, label: payload.label, serialization: payload.serialization, reliable: payload.reliable }); this._addConnection(peer, connection); this.emit('connection', connection); } else { util.warn('Received malformed connection type:', payload.type); return; } // Find messages. var messages = this._getMessages(connectionId); for (var i = 0, ii = messages.length; i < ii; i += 1) { connection.handleMessage(messages[i]); } } break; default: if (!payload) { util.warn('You received a malformed message from ' + peer + ' of type ' + type); return; } var id = payload.connectionId; connection = this.getConnection(peer, id); if (connection && connection.pc) { // Pass it on. connection.handleMessage(message); } else if (id) { // Store for possible later use this._storeMessage(id, message); } else { util.warn('You received an unrecognized message:', message); } break; } }; /** Stores messages without a set up connection, to be claimed later. */ Peer.prototype._storeMessage = function(connectionId, message) { if (!this._lostMessages[connectionId]) { this._lostMessages[connectionId] = []; } this._lostMessages[connectionId].push(message); }; /** Retrieve messages from lost message store */ Peer.prototype._getMessages = function(connectionId) { var messages = this._lostMessages[connectionId]; if (messages) { delete this._lostMessages[connectionId]; return messages; } else { return []; } }; /** * Returns a DataConnection to the specified peer. See documentation for a * complete list of options. */ Peer.prototype.connect = function(peer, options) { if (this.disconnected) { util.warn('You cannot connect to a new Peer because you called ' + '.disconnect() on this Peer and ended your connection with the ' + 'server. You can create a new Peer to reconnect, or call reconnect ' + 'on this peer if you believe its ID to still be available.'); this.emitError('disconnected', 'Cannot connect to new Peer after disconnecting from server.'); return; } var connection = new DataConnection(peer, this, options); this._addConnection(peer, connection); return connection; }; /** * Returns a MediaConnection to the specified peer. See documentation for a * complete list of options. */ Peer.prototype.call = function(peer, stream, options) { if (this.disconnected) { util.warn('You cannot connect to a new Peer because you called ' + '.disconnect() on this Peer and ended your connection with the ' + 'server. You can create a new Peer to reconnect.'); this.emitError('disconnected', 'Cannot connect to new Peer after disconnecting from server.'); return; } if (!stream) { util.error('To call a peer, you must provide a stream from your browser\'s `getUserMedia`.'); return; } options = options || {}; options._stream = stream; var call = new MediaConnection(peer, this, options); this._addConnection(peer, call); return call; }; /** Add a data/media connection to this peer. */ Peer.prototype._addConnection = function(peer, connection) { if (!this.connections[peer]) { this.connections[peer] = []; } this.connections[peer].push(connection); }; /** Retrieve a data/media connection for this peer. */ Peer.prototype.getConnection = function(peer, id) { var connections = this.connections[peer]; if (!connections) { return null; } for (var i = 0, ii = connections.length; i < ii; i++) { if (connections[i].id === id) { return connections[i]; } } return null; }; Peer.prototype._delayedAbort = function(type, message) { var self = this; util.setZeroTimeout(function(){ self._abort(type, message); }); }; /** * Destroys the Peer and emits an error message. * The Peer is not destroyed if it's in a disconnected state, in which case * it retains its disconnected state and its existing connections. */ Peer.prototype._abort = function(type, message) { util.error('Aborting!'); if (!this._lastServerId) { this.destroy(); } else { this.disconnect(); } this.emitError(type, message); }; /** Emits a typed error message. */ Peer.prototype.emitError = function(type, err) { util.error('Error:', err); if (typeof err === 'string') { err = new Error(err); } err.type = type; this.emit('error', err); }; /** * Destroys the Peer: closes all active connections as well as the connection * to the server. * Warning: The peer can no longer create or accept connections after being * destroyed. */ Peer.prototype.destroy = function() { if (!this.destroyed) { this._cleanup(); this.disconnect(); this.destroyed = true; } }; /** Disconnects every connection on this peer. */ Peer.prototype._cleanup = function() { if (this.connections) { var peers = Object.keys(this.connections); for (var i = 0, ii = peers.length; i < ii; i++) { this._cleanupPeer(peers[i]); } } this.emit('close'); }; /** Closes all connections to this peer. */ Peer.prototype._cleanupPeer = function(peer) { var connections = this.connections[peer]; for (var j = 0, jj = connections.length; j < jj; j += 1) { connections[j].close(); } }; /** * Disconnects the Peer's connection to the PeerServer. Does not close any * active connections. * Warning: The peer can no longer create or accept connections after being * disconnected. It also cannot reconnect to the server. */ Peer.prototype.disconnect = function() { var self = this; util.setZeroTimeout(function(){ if (!self.disconnected) { self.disconnected = true; self.open = false; if (self.socket) { self.socket.close(); } self.emit('disconnected', self.id); self._lastServerId = self.id; self.id = null; } }); }; /** Attempts to reconnect with the same ID. */ Peer.prototype.reconnect = function() { if (this.disconnected && !this.destroyed) { util.log('Attempting reconnection to server with ID ' + this._lastServerId); this.disconnected = false; this._initializeServerConnection(); this._initialize(this._lastServerId); } else if (this.destroyed) { throw new Error('This peer cannot reconnect to the server. It has already been destroyed.'); } else if (!this.disconnected && !this.open) { // Do nothing. We're still connecting the first time. util.error('In a hurry? We\'re still trying to make the initial connection!'); } else { throw new Error('Peer ' + this.id + ' cannot reconnect because it is not disconnected from the server!'); } }; /** * Get a list of available peer IDs. If you're running your own server, you'll * want to set allow_discovery: true in the PeerServer options. If you're using * the cloud server, email team@peerjs.com to get the functionality enabled for * your key. */ Peer.prototype.listAllPeers = function(cb) { cb = cb || function() {}; var self = this; var http = new XMLHttpRequest(); var protocol = this.options.secure ? 'https://' : 'http://'; var url = protocol + this.options.host + ':' + this.options.port + this.options.path + this.options.key + '/peers'; var queryString = '?ts=' + new Date().getTime() + '' + Math.random(); url += queryString; // If there's no ID we need to wait for one before trying to init socket. http.open('get', url, true); http.onerror = function(e) { self._abort('server-error', 'Could not get peers from the server.'); cb([]); }; http.onreadystatechange = function() { if (http.readyState !== 4) { return; } if (http.status === 401) { var helpfulError = ''; if (self.options.host !== util.CLOUD_HOST) { helpfulError = 'It looks like you\'re using the cloud server. You can email ' + 'team@peerjs.com to enable peer listing for your API key.'; } else { helpfulError = 'You need to enable `allow_discovery` on your self-hosted ' + 'PeerServer to use this feature.'; } cb([]); throw new Error('It doesn\'t look like you have permission to list peers IDs. ' + helpfulError); } else if (http.status !== 200) { cb([]); } else { cb(JSON.parse(http.responseText)); } }; http.send(null); }; module.exports = Peer; },{"./dataconnection":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/dataconnection.js","./mediaconnection":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/mediaconnection.js","./socket":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/socket.js","./util":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/util.js","eventemitter3":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/eventemitter3/index.js"}],"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/socket.js":[function(require,module,exports){ var util = require('./util'); var EventEmitter = require('eventemitter3'); /** * An abstraction on top of WebSockets and XHR streaming to provide fastest * possible connection for peers. */ function Socket(secure, host, port, path, key) { if (!(this instanceof Socket)) return new Socket(secure, host, port, path, key); EventEmitter.call(this); // Disconnected manually. this.disconnected = false; this._queue = []; var httpProtocol = secure ? 'https://' : 'http://'; var wsProtocol = secure ? 'wss://' : 'ws://'; this._httpUrl = httpProtocol + host + ':' + port + path + key; this._wsUrl = wsProtocol + host + ':' + port + path + 'peerjs?key=' + key; } util.inherits(Socket, EventEmitter); /** Check in with ID or get one from server. */ Socket.prototype.start = function(id, token) { this.id = id; this._httpUrl += '/' + id + '/' + token; this._wsUrl += '&id=' + id + '&token=' + token; this._startXhrStream(); this._startWebSocket(); } /** Start up websocket communications. */ Socket.prototype._startWebSocket = function(id) { var self = this; if (this._socket) { return; } this._socket = new WebSocket(this._wsUrl); this._socket.onmessage = function(event) { try { var data = JSON.parse(event.data); } catch(e) { util.log('Invalid server message', event.data); return; } self.emit('message', data); }; this._socket.onclose = function(event) { util.log('Socket closed.'); self.disconnected = true; self.emit('disconnected'); }; // Take care of the queue of connections if necessary and make sure Peer knows // socket is open. this._socket.onopen = function() { if (self._timeout) { clearTimeout(self._timeout); setTimeout(function(){ self._http.abort(); self._http = null; }, 5000); } self._sendQueuedMessages(); util.log('Socket open'); }; } /** Start XHR streaming. */ Socket.prototype._startXhrStream = function(n) { try { var self = this; this._http = new XMLHttpRequest(); this._http._index = 1; this._http._streamIndex = n || 0; this._http.open('post', this._httpUrl + '/id?i=' + this._http._streamIndex, true); this._http.onerror = function() { // If we get an error, likely something went wrong. // Stop streaming. clearTimeout(self._timeout); self.emit('disconnected'); } this._http.onreadystatechange = function() { if (this.readyState == 2 && this.old) { this.old.abort(); delete this.old; } else if (this.readyState > 2 && this.status === 200 && this.responseText) { self._handleStream(this); } }; this._http.send(null); this._setHTTPTimeout(); } catch(e) { util.log('XMLHttpRequest not available; defaulting to WebSockets'); } } /** Handles onreadystatechange response as a stream. */ Socket.prototype._handleStream = function(http) { // 3 and 4 are loading/done state. All others are not relevant. var messages = http.responseText.split('\n'); // Check to see if anything needs to be processed on buffer. if (http._buffer) { while (http._buffer.length > 0) { var index = http._buffer.shift(); var bufferedMessage = messages[index]; try { bufferedMessage = JSON.parse(bufferedMessage); } catch(e) { http._buffer.shift(index); break; } this.emit('message', bufferedMessage); } } var message = messages[http._index]; if (message) { http._index += 1; // Buffering--this message is incomplete and we'll get to it next time. // This checks if the httpResponse ended in a `\n`, in which case the last // element of messages should be the empty string. if (http._index === messages.length) { if (!http._buffer) { http._buffer = []; } http._buffer.push(http._index - 1); } else { try { message = JSON.parse(message); } catch(e) { util.log('Invalid server message', message); return; } this.emit('message', message); } } } Socket.prototype._setHTTPTimeout = function() { var self = this; this._timeout = setTimeout(function() { var old = self._http; if (!self._wsOpen()) { self._startXhrStream(old._streamIndex + 1); self._http.old = old; } else { old.abort(); } }, 25000); } /** Is the websocket currently open? */ Socket.prototype._wsOpen = function() { return this._socket && this._socket.readyState == 1; } /** Send queued messages. */ Socket.prototype._sendQueuedMessages = function() { for (var i = 0, ii = this._queue.length; i < ii; i += 1) { this.send(this._queue[i]); } } /** Exposed send for DC & Peer. */ Socket.prototype.send = function(data) { if (this.disconnected) { return; } // If we didn't get an ID yet, we can't yet send anything so we should queue // up these messages. if (!this.id) { this._queue.push(data); return; } if (!data.type) { this.emit('error', 'Invalid message'); return; } var message = JSON.stringify(data); if (this._wsOpen()) { this._socket.send(message); } else { var http = new XMLHttpRequest(); var url = this._httpUrl + '/' + data.type.toLowerCase(); http.open('post', url, true); http.setRequestHeader('Content-Type', 'application/json'); http.send(message); } } Socket.prototype.close = function() { if (!this.disconnected && this._wsOpen()) { this._socket.close(); this.disconnected = true; } } module.exports = Socket; },{"./util":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/util.js","eventemitter3":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/eventemitter3/index.js"}],"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/util.js":[function(require,module,exports){ var defaultConfig = {'iceServers': [{ 'url': 'stun:stun.l.google.com:19302' }]}; var dataCount = 1; var BinaryPack = require('js-binarypack'); var RTCPeerConnection = require('./adapter').RTCPeerConnection; var util = { noop: function() {}, CLOUD_HOST: '0.peerjs.com', CLOUD_PORT: 9000, // Browsers that need chunking: chunkedBrowsers: {'Chrome': 1}, chunkedMTU: 16300, // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is "cut off" after 16384 bytes and delivered individually. // Logging logic logLevel: 0, setLogLevel: function(level) { var debugLevel = parseInt(level, 10); if (!isNaN(parseInt(level, 10))) { util.logLevel = debugLevel; } else { // If they are using truthy/falsy values for debug util.logLevel = level ? 3 : 0; } util.log = util.warn = util.error = util.noop; if (util.logLevel > 0) { util.error = util._printWith('ERROR'); } if (util.logLevel > 1) { util.warn = util._printWith('WARNING'); } if (util.logLevel > 2) { util.log = util._print; } }, setLogFunction: function(fn) { if (fn.constructor !== Function) { util.warn('The log function you passed in is not a function. Defaulting to regular logs.'); } else { util._print = fn; } }, _printWith: function(prefix) { return function() { var copy = Array.prototype.slice.call(arguments); copy.unshift(prefix); util._print.apply(util, copy); }; }, _print: function () { var err = false; var copy = Array.prototype.slice.call(arguments); copy.unshift('PeerJS: '); for (var i = 0, l = copy.length; i < l; i++){ if (copy[i] instanceof Error) { copy[i] = '(' + copy[i].name + ') ' + copy[i].message; err = true; } } err ? console.error.apply(console, copy) : console.log.apply(console, copy); }, // // Returns browser-agnostic default config defaultConfig: defaultConfig, // // Returns the current browser. browser: (function() { if (window.mozRTCPeerConnection) { return 'Firefox'; } else if (window.webkitRTCPeerConnection) { return 'Chrome'; } else if (window.RTCPeerConnection) { return 'Supported'; } else { return 'Unsupported'; } })(), // // Lists which features are supported supports: (function() { if (typeof RTCPeerConnection === 'undefined') { return {}; } var data = true; var audioVideo = true; var binaryBlob = false; var sctp = false; var onnegotiationneeded = !!window.webkitRTCPeerConnection; var pc, dc; try { pc = new RTCPeerConnection(defaultConfig, {optional: [{RtpDataChannels: true}]}); } catch (e) { data = false; audioVideo = false; } if (data) { try { dc = pc.createDataChannel('_PEERJSTEST'); } catch (e) { data = false; } } if (data) { // Binary test try { dc.binaryType = 'blob'; binaryBlob = true; } catch (e) { } // Reliable test. // Unfortunately Chrome is a bit unreliable about whether or not they // support reliable. var reliablePC = new RTCPeerConnection(defaultConfig, {}); try { var reliableDC = reliablePC.createDataChannel('_PEERJSRELIABLETEST', {}); sctp = reliableDC.reliable; } catch (e) { } reliablePC.close(); } // FIXME: not really the best check... if (audioVideo) { audioVideo = !!pc.addStream; } // FIXME: this is not great because in theory it doesn't work for // av-only browsers (?). if (!onnegotiationneeded && data) { // sync default check. var negotiationPC = new RTCPeerConnection(defaultConfig, {optional: [{RtpDataChannels: true}]}); negotiationPC.onnegotiationneeded = function() { onnegotiationneeded = true; // async check. if (util && util.supports) { util.supports.onnegotiationneeded = true; } }; negotiationPC.createDataChannel('_PEERJSNEGOTIATIONTEST'); setTimeout(function() { negotiationPC.close(); }, 1000); } if (pc) { pc.close(); } return { audioVideo: audioVideo, data: data, binaryBlob: binaryBlob, binary: sctp, // deprecated; sctp implies binary support. reliable: sctp, // deprecated; sctp implies reliable data. sctp: sctp, onnegotiationneeded: onnegotiationneeded }; }()), // // Ensure alphanumeric ids validateId: function(id) { // Allow empty ids return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.exec(id); }, validateKey: function(key) { // Allow empty keys return !key || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.exec(key); }, debug: false, inherits: function(ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }, extend: function(dest, source) { for(var key in source) { if(source.hasOwnProperty(key)) { dest[key] = source[key]; } } return dest; }, pack: BinaryPack.pack, unpack: BinaryPack.unpack, log: function () { if (util.debug) { var err = false; var copy = Array.prototype.slice.call(arguments); copy.unshift('PeerJS: '); for (var i = 0, l = copy.length; i < l; i++){ if (copy[i] instanceof Error) { copy[i] = '(' + copy[i].name + ') ' + copy[i].message; err = true; } } err ? console.error.apply(console, copy) : console.log.apply(console, copy); } }, setZeroTimeout: (function(global) { var timeouts = []; var messageName = 'zero-timeout-message'; // Like setTimeout, but only takes a function argument. There's // no time argument (always zero) and no arguments (you have to // use a closure). function setZeroTimeoutPostMessage(fn) { timeouts.push(fn); global.postMessage(messageName, '*'); } function handleMessage(event) { if (event.source == global && event.data == messageName) { if (event.stopPropagation) { event.stopPropagation(); } if (timeouts.length) { timeouts.shift()(); } } } if (global.addEventListener) { global.addEventListener('message', handleMessage, true); } else if (global.attachEvent) { global.attachEvent('onmessage', handleMessage); } return setZeroTimeoutPostMessage; }(window)), // Binary stuff // chunks a blob. chunk: function(bl) { var chunks = []; var size = bl.size; var start = index = 0; var total = Math.ceil(size / util.chunkedMTU); while (start < size) { var end = Math.min(size, start + util.chunkedMTU); var b = bl.slice(start, end); var chunk = { __peerData: dataCount, n: index, data: b, total: total }; chunks.push(chunk); start = end; index += 1; } dataCount += 1; return chunks; }, blobToArrayBuffer: function(blob, cb){ var fr = new FileReader(); fr.onload = function(evt) { cb(evt.target.result); }; fr.readAsArrayBuffer(blob); }, blobToBinaryString: function(blob, cb){ var fr = new FileReader(); fr.onload = function(evt) { cb(evt.target.result); }; fr.readAsBinaryString(blob); }, binaryStringToArrayBuffer: function(binary) { var byteArray = new Uint8Array(binary.length); for (var i = 0; i < binary.length; i++) { byteArray[i] = binary.charCodeAt(i) & 0xff; } return byteArray.buffer; }, randomToken: function () { return Math.random().toString(36).substr(2); }, // isSecure: function() { return location.protocol === 'https:'; } }; module.exports = util; },{"./adapter":"/Users/alex/Projects/webdrop/node_modules/peerjs/lib/adapter.js","js-binarypack":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/js-binarypack/lib/binarypack.js"}],"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/eventemitter3/index.js":[function(require,module,exports){ arguments[4]["/Users/alex/Projects/webdrop/node_modules/alt/node_modules/eventemitter3/index.js"][0].apply(exports,arguments) },{}],"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/js-binarypack/lib/binarypack.js":[function(require,module,exports){ var BufferBuilder = require('./bufferbuilder').BufferBuilder; var binaryFeatures = require('./bufferbuilder').binaryFeatures; var BinaryPack = { unpack: function(data){ var unpacker = new Unpacker(data); return unpacker.unpack(); }, pack: function(data){ var packer = new Packer(); packer.pack(data); var buffer = packer.getBuffer(); return buffer; } }; module.exports = BinaryPack; function Unpacker (data){ // Data is ArrayBuffer this.index = 0; this.dataBuffer = data; this.dataView = new Uint8Array(this.dataBuffer); this.length = this.dataBuffer.byteLength; } Unpacker.prototype.unpack = function(){ var type = this.unpack_uint8(); if (type < 0x80){ var positive_fixnum = type; return positive_fixnum; } else if ((type ^ 0xe0) < 0x20){ var negative_fixnum = (type ^ 0xe0) - 0x20; return negative_fixnum; } var size; if ((size = type ^ 0xa0) <= 0x0f){ return this.unpack_raw(size); } else if ((size = type ^ 0xb0) <= 0x0f){ return this.unpack_string(size); } else if ((size = type ^ 0x90) <= 0x0f){ return this.unpack_array(size); } else if ((size = type ^ 0x80) <= 0x0f){ return this.unpack_map(size); } switch(type){ case 0xc0: return null; case 0xc1: return undefined; case 0xc2: return false; case 0xc3: return true; case 0xca: return this.unpack_float(); case 0xcb: return this.unpack_double(); case 0xcc: return this.unpack_uint8(); case 0xcd: return this.unpack_uint16(); case 0xce: return this.unpack_uint32(); case 0xcf: return this.unpack_uint64(); case 0xd0: return this.unpack_int8(); case 0xd1: return this.unpack_int16(); case 0xd2: return this.unpack_int32(); case 0xd3: return this.unpack_int64(); case 0xd4: return undefined; case 0xd5: return undefined; case 0xd6: return undefined; case 0xd7: return undefined; case 0xd8: size = this.unpack_uint16(); return this.unpack_string(size); case 0xd9: size = this.unpack_uint32(); return this.unpack_string(size); case 0xda: size = this.unpack_uint16(); return this.unpack_raw(size); case 0xdb: size = this.unpack_uint32(); return this.unpack_raw(size); case 0xdc: size = this.unpack_uint16(); return this.unpack_array(size); case 0xdd: size = this.unpack_uint32(); return this.unpack_array(size); case 0xde: size = this.unpack_uint16(); return this.unpack_map(size); case 0xdf: size = this.unpack_uint32(); return this.unpack_map(size); } } Unpacker.prototype.unpack_uint8 = function(){ var byte = this.dataView[this.index] & 0xff; this.index++; return byte; }; Unpacker.prototype.unpack_uint16 = function(){ var bytes = this.read(2); var uint16 = ((bytes[0] & 0xff) * 256) + (bytes[1] & 0xff); this.index += 2; return uint16; } Unpacker.prototype.unpack_uint32 = function(){ var bytes = this.read(4); var uint32 = ((bytes[0] * 256 + bytes[1]) * 256 + bytes[2]) * 256 + bytes[3]; this.index += 4; return uint32; } Unpacker.prototype.unpack_uint64 = function(){ var bytes = this.read(8); var uint64 = ((((((bytes[0] * 256 + bytes[1]) * 256 + bytes[2]) * 256 + bytes[3]) * 256 + bytes[4]) * 256 + bytes[5]) * 256 + bytes[6]) * 256 + bytes[7]; this.index += 8; return uint64; } Unpacker.prototype.unpack_int8 = function(){ var uint8 = this.unpack_uint8(); return (uint8 < 0x80 ) ? uint8 : uint8 - (1 << 8); }; Unpacker.prototype.unpack_int16 = function(){ var uint16 = this.unpack_uint16(); return (uint16 < 0x8000 ) ? uint16 : uint16 - (1 << 16); } Unpacker.prototype.unpack_int32 = function(){ var uint32 = this.unpack_uint32(); return (uint32 < Math.pow(2, 31) ) ? uint32 : uint32 - Math.pow(2, 32); } Unpacker.prototype.unpack_int64 = function(){ var uint64 = this.unpack_uint64(); return (uint64 < Math.pow(2, 63) ) ? uint64 : uint64 - Math.pow(2, 64); } Unpacker.prototype.unpack_raw = function(size){ if ( this.length < this.index + size){ throw new Error('BinaryPackFailure: index is out of range' + ' ' + this.index + ' ' + size + ' ' + this.length); } var buf = this.dataBuffer.slice(this.index, this.index + size); this.index += size; //buf = util.bufferToString(buf); return buf; } Unpacker.prototype.unpack_string = function(size){ var bytes = this.read(size); var i = 0, str = '', c, code; while(i < size){ c = bytes[i]; if ( c < 128){ str += String.fromCharCode(c); i++; } else if ((c ^ 0xc0) < 32){ code = ((c ^ 0xc0) << 6) | (bytes[i+1] & 63); str += String.fromCharCode(code); i += 2; } else { code = ((c & 15) << 12) | ((bytes[i+1] & 63) << 6) | (bytes[i+2] & 63); str += String.fromCharCode(code); i += 3; } } this.index += size; return str; } Unpacker.prototype.unpack_array = function(size){ var objects = new Array(size); for(var i = 0; i < size ; i++){ objects[i] = this.unpack(); } return objects; } Unpacker.prototype.unpack_map = function(size){ var map = {}; for(var i = 0; i < size ; i++){ var key = this.unpack(); var value = this.unpack(); map[key] = value; } return map; } Unpacker.prototype.unpack_float = function(){ var uint32 = this.unpack_uint32(); var sign = uint32 >> 31; var exp = ((uint32 >> 23) & 0xff) - 127; var fraction = ( uint32 & 0x7fffff ) | 0x800000; return (sign == 0 ? 1 : -1) * fraction * Math.pow(2, exp - 23); } Unpacker.prototype.unpack_double = function(){ var h32 = this.unpack_uint32(); var l32 = this.unpack_uint32(); var sign = h32 >> 31; var exp = ((h32 >> 20) & 0x7ff) - 1023; var hfrac = ( h32 & 0xfffff ) | 0x100000; var frac = hfrac * Math.pow(2, exp - 20) + l32 * Math.pow(2, exp - 52); return (sign == 0 ? 1 : -1) * frac; } Unpacker.prototype.read = function(length){ var j = this.index; if (j + length <= this.length) { return this.dataView.subarray(j, j + length); } else { throw new Error('BinaryPackFailure: read index out of range'); } } function Packer(){ this.bufferBuilder = new BufferBuilder(); } Packer.prototype.getBuffer = function(){ return this.bufferBuilder.getBuffer(); } Packer.prototype.pack = function(value){ var type = typeof(value); if (type == 'string'){ this.pack_string(value); } else if (type == 'number'){ if (Math.floor(value) === value){ this.pack_integer(value); } else{ this.pack_double(value); } } else if (type == 'boolean'){ if (value === true){ this.bufferBuilder.append(0xc3); } else if (value === false){ this.bufferBuilder.append(0xc2); } } else if (type == 'undefined'){ this.bufferBuilder.append(0xc0); } else if (type == 'object'){ if (value === null){ this.bufferBuilder.append(0xc0); } else { var constructor = value.constructor; if (constructor == Array){ this.pack_array(value); } else if (constructor == Blob || constructor == File) { this.pack_bin(value); } else if (constructor == ArrayBuffer) { if(binaryFeatures.useArrayBufferView) { this.pack_bin(new Uint8Array(value)); } else { this.pack_bin(value); } } else if ('BYTES_PER_ELEMENT' in value){ if(binaryFeatures.useArrayBufferView) { this.pack_bin(new Uint8Array(value.buffer)); } else { this.pack_bin(value.buffer); } } else if (constructor == Object){ this.pack_object(value); } else if (constructor == Date){ this.pack_string(value.toString()); } else if (typeof value.toBinaryPack == 'function'){ this.bufferBuilder.append(value.toBinaryPack()); } else { throw new Error('Type "' + constructor.toString() + '" not yet supported'); } } } else { throw new Error('Type "' + type + '" not yet supported'); } this.bufferBuilder.flush(); } Packer.prototype.pack_bin = function(blob){ var length = blob.length || blob.byteLength || blob.size; if (length <= 0x0f){ this.pack_uint8(0xa0 + length); } else if (length <= 0xffff){ this.bufferBuilder.append(0xda) ; this.pack_uint16(length); } else if (length <= 0xffffffff){ this.bufferBuilder.append(0xdb); this.pack_uint32(length); } else{ throw new Error('Invalid length'); } this.bufferBuilder.append(blob); } Packer.prototype.pack_string = function(str){ var length = utf8Length(str); if (length <= 0x0f){ this.pack_uint8(0xb0 + length); } else if (length <= 0xffff){ this.bufferBuilder.append(0xd8) ; this.pack_uint16(length); } else if (length <= 0xffffffff){ this.bufferBuilder.append(0xd9); this.pack_uint32(length); } else{ throw new Error('Invalid length'); } this.bufferBuilder.append(str); } Packer.prototype.pack_array = function(ary){ var length = ary.length; if (length <= 0x0f){ this.pack_uint8(0x90 + length); } else if (length <= 0xffff){ this.bufferBuilder.append(0xdc) this.pack_uint16(length); } else if (length <= 0xffffffff){ this.bufferBuilder.append(0xdd); this.pack_uint32(length); } else{ throw new Error('Invalid length'); } for(var i = 0; i < length ; i++){ this.pack(ary[i]); } } Packer.prototype.pack_integer = function(num){ if ( -0x20 <= num && num <= 0x7f){ this.bufferBuilder.append(num & 0xff); } else if (0x00 <= num && num <= 0xff){ this.bufferBuilder.append(0xcc); this.pack_uint8(num); } else if (-0x80 <= num && num <= 0x7f){ this.bufferBuilder.append(0xd0); this.pack_int8(num); } else if ( 0x0000 <= num && num <= 0xffff){ this.bufferBuilder.append(0xcd); this.pack_uint16(num); } else if (-0x8000 <= num && num <= 0x7fff){ this.bufferBuilder.append(0xd1); this.pack_int16(num); } else if ( 0x00000000 <= num && num <= 0xffffffff){ this.bufferBuilder.append(0xce); this.pack_uint32(num); } else if (-0x80000000 <= num && num <= 0x7fffffff){ this.bufferBuilder.append(0xd2); this.pack_int32(num); } else if (-0x8000000000000000 <= num && num <= 0x7FFFFFFFFFFFFFFF){ this.bufferBuilder.append(0xd3); this.pack_int64(num); } else if (0x0000000000000000 <= num && num <= 0xFFFFFFFFFFFFFFFF){ this.bufferBuilder.append(0xcf); this.pack_uint64(num); } else{ throw new Error('Invalid integer'); } } Packer.prototype.pack_double = function(num){ var sign = 0; if (num < 0){ sign = 1; num = -num; } var exp = Math.floor(Math.log(num) / Math.LN2); var frac0 = num / Math.pow(2, exp) - 1; var frac1 = Math.floor(frac0 * Math.pow(2, 52)); var b32 = Math.pow(2, 32); var h32 = (sign << 31) | ((exp+1023) << 20) | (frac1 / b32) & 0x0fffff; var l32 = frac1 % b32; this.bufferBuilder.append(0xcb); this.pack_int32(h32); this.pack_int32(l32); } Packer.prototype.pack_object = function(obj){ var keys = Object.keys(obj); var length = keys.length; if (length <= 0x0f){ this.pack_uint8(0x80 + length); } else if (length <= 0xffff){ this.bufferBuilder.append(0xde); this.pack_uint16(length); } else if (length <= 0xffffffff){ this.bufferBuilder.append(0xdf); this.pack_uint32(length); } else{ throw new Error('Invalid length'); } for(var prop in obj){ if (obj.hasOwnProperty(prop)){ this.pack(prop); this.pack(obj[prop]); } } } Packer.prototype.pack_uint8 = function(num){ this.bufferBuilder.append(num); } Packer.prototype.pack_uint16 = function(num){ this.bufferBuilder.append(num >> 8); this.bufferBuilder.append(num & 0xff); } Packer.prototype.pack_uint32 = function(num){ var n = num & 0xffffffff; this.bufferBuilder.append((n & 0xff000000) >>> 24); this.bufferBuilder.append((n & 0x00ff0000) >>> 16); this.bufferBuilder.append((n & 0x0000ff00) >>> 8); this.bufferBuilder.append((n & 0x000000ff)); } Packer.prototype.pack_uint64 = function(num){ var high = num / Math.pow(2, 32); var low = num % Math.pow(2, 32); this.bufferBuilder.append((high & 0xff000000) >>> 24); this.bufferBuilder.append((high & 0x00ff0000) >>> 16); this.bufferBuilder.append((high & 0x0000ff00) >>> 8); this.bufferBuilder.append((high & 0x000000ff)); this.bufferBuilder.append((low & 0xff000000) >>> 24); this.bufferBuilder.append((low & 0x00ff0000) >>> 16); this.bufferBuilder.append((low & 0x0000ff00) >>> 8); this.bufferBuilder.append((low & 0x000000ff)); } Packer.prototype.pack_int8 = function(num){ this.bufferBuilder.append(num & 0xff); } Packer.prototype.pack_int16 = function(num){ this.bufferBuilder.append((num & 0xff00) >> 8); this.bufferBuilder.append(num & 0xff); } Packer.prototype.pack_int32 = function(num){ this.bufferBuilder.append((num >>> 24) & 0xff); this.bufferBuilder.append((num & 0x00ff0000) >>> 16); this.bufferBuilder.append((num & 0x0000ff00) >>> 8); this.bufferBuilder.append((num & 0x000000ff)); } Packer.prototype.pack_int64 = function(num){ var high = Math.floor(num / Math.pow(2, 32)); var low = num % Math.pow(2, 32); this.bufferBuilder.append((high & 0xff000000) >>> 24); this.bufferBuilder.append((high & 0x00ff0000) >>> 16); this.bufferBuilder.append((high & 0x0000ff00) >>> 8); this.bufferBuilder.append((high & 0x000000ff)); this.bufferBuilder.append((low & 0xff000000) >>> 24); this.bufferBuilder.append((low & 0x00ff0000) >>> 16); this.bufferBuilder.append((low & 0x0000ff00) >>> 8); this.bufferBuilder.append((low & 0x000000ff)); } function _utf8Replace(m){ var code = m.charCodeAt(0); if(code <= 0x7ff) return '00'; if(code <= 0xffff) return '000'; if(code <= 0x1fffff) return '0000'; if(code <= 0x3ffffff) return '00000'; return '000000'; } function utf8Length(str){ if (str.length > 600) { // Blob method faster for large strings return (new Blob([str])).size; } else { return str.replace(/[^\u0000-\u007F]/g, _utf8Replace).length; } } },{"./bufferbuilder":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/js-binarypack/lib/bufferbuilder.js"}],"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/js-binarypack/lib/bufferbuilder.js":[function(require,module,exports){ var binaryFeatures = {}; binaryFeatures.useBlobBuilder = (function(){ try { new Blob([]); return false; } catch (e) { return true; } })(); binaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function(){ try { return (new Blob([new Uint8Array([])])).size === 0; } catch (e) { return true; } })(); module.exports.binaryFeatures = binaryFeatures; var BlobBuilder = module.exports.BlobBuilder; if (typeof window != 'undefined') { BlobBuilder = module.exports.BlobBuilder = window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder; } function BufferBuilder(){ this._pieces = []; this._parts = []; } BufferBuilder.prototype.append = function(data) { if(typeof data === 'number') { this._pieces.push(data); } else { this.flush(); this._parts.push(data); } }; BufferBuilder.prototype.flush = function() { if (this._pieces.length > 0) { var buf = new Uint8Array(this._pieces); if(!binaryFeatures.useArrayBufferView) { buf = buf.buffer; } this._parts.push(buf); this._pieces = []; } }; BufferBuilder.prototype.getBuffer = function() { this.flush(); if(binaryFeatures.useBlobBuilder) { var builder = new BlobBuilder(); for(var i = 0, ii = this._parts.length; i < ii; i++) { builder.append(this._parts[i]); } return builder.getBlob(); } else { return new Blob(this._parts); } }; module.exports.BufferBuilder = BufferBuilder; },{}],"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/reliable/lib/reliable.js":[function(require,module,exports){ var util = require('./util'); /** * Reliable transfer for Chrome Canary DataChannel impl. * Author: @michellebu */ function Reliable(dc, debug) { if (!(this instanceof Reliable)) return new Reliable(dc); this._dc = dc; util.debug = debug; // Messages sent/received so far. // id: { ack: n, chunks: [...] } this._outgoing = {}; // id: { ack: ['ack', id, n], chunks: [...] } this._incoming = {}; this._received = {}; // Window size. this._window = 1000; // MTU. this._mtu = 500; // Interval for setInterval. In ms. this._interval = 0; // Messages sent. this._count = 0; // Outgoing message queue. this._queue = []; this._setupDC(); }; // Send a message reliably. Reliable.prototype.send = function(msg) { // Determine if chunking is necessary. var bl = util.pack(msg); if (bl.size < this._mtu) { this._handleSend(['no', bl]); return; } this._outgoing[this._count] = { ack: 0, chunks: this._chunk(bl) }; if (util.debug) { this._outgoing[this._count].timer = new Date(); } // Send prelim window. this._sendWindowedChunks(this._count); this._count += 1; }; // Set up interval for processing queue. Reliable.prototype._setupInterval = function() { // TODO: fail gracefully. var self = this; this._timeout = setInterval(function() { // FIXME: String stuff makes things terribly async. var msg = self._queue.shift(); if (msg._multiple) { for (var i = 0, ii = msg.length; i < ii; i += 1) { self._intervalSend(msg[i]); } } else { self._intervalSend(msg); } }, this._interval); }; Reliable.prototype._intervalSend = function(msg) { var self = this; msg = util.pack(msg); util.blobToBinaryString(msg, function(str) { self._dc.send(str); }); if (self._queue.length === 0) { clearTimeout(self._timeout); self._timeout = null; //self._processAcks(); } }; // Go through ACKs to send missing pieces. Reliable.prototype._processAcks = function() { for (var id in this._outgoing) { if (this._outgoing.hasOwnProperty(id)) { this._sendWindowedChunks(id); } } }; // Handle sending a message. // FIXME: Don't wait for interval time for all messages... Reliable.prototype._handleSend = function(msg) { var push = true; for (var i = 0, ii = this._queue.length; i < ii; i += 1) { var item = this._queue[i]; if (item === msg) { push = false; } else if (item._multiple && item.indexOf(msg) !== -1) { push = false; } } if (push) { this._queue.push(msg); if (!this._timeout) { this._setupInterval(); } } }; // Set up DataChannel handlers. Reliable.prototype._setupDC = function() { // Handle various message types. var self = this; this._dc.onmessage = function(e) { var msg = e.data; var datatype = msg.constructor; // FIXME: msg is String until binary is supported. // Once that happens, this will have to be smarter. if (datatype === String) { var ab = util.binaryStringToArrayBuffer(msg); msg = util.unpack(ab); self._handleMessage(msg); } }; }; // Handles an incoming message. Reliable.prototype._handleMessage = function(msg) { var id = msg[1]; var idata = this._incoming[id]; var odata = this._outgoing[id]; var data; switch (msg[0]) { // No chunking was done. case 'no': var message = id; if (!!message) { this.onmessage(util.unpack(message)); } break; // Reached the end of the message. case 'end': data = idata; // In case end comes first. this._received[id] = msg[2]; if (!data) { break; } this._ack(id); break; case 'ack': data = odata; if (!!data) { var ack = msg[2]; // Take the larger ACK, for out of order messages. data.ack = Math.max(ack, data.ack); // Clean up when all chunks are ACKed. if (data.ack >= data.chunks.length) { util.log('Time: ', new Date() - data.timer); delete this._outgoing[id]; } else { this._processAcks(); } } // If !data, just ignore. break; // Received a chunk of data. case 'chunk': // Create a new entry if none exists. data = idata; if (!data) { var end = this._received[id]; if (end === true) { break; } data = { ack: ['ack', id, 0], chunks: [] }; this._incoming[id] = data; } var n = msg[2]; var chunk = msg[3]; data.chunks[n] = new Uint8Array(chunk); // If we get the chunk we're looking for, ACK for next missing. // Otherwise, ACK the same N again. if (n === data.ack[2]) { this._calculateNextAck(id); } this._ack(id); break; default: // Shouldn't happen, but would make sense for message to just go // through as is. this._handleSend(msg); break; } }; // Chunks BL into smaller messages. Reliable.prototype._chunk = function(bl) { var chunks = []; var size = bl.size; var start = 0; while (start < size) { var end = Math.min(size, start + this._mtu); var b = bl.slice(start, end); var chunk = { payload: b } chunks.push(chunk); start = end; } util.log('Created', chunks.length, 'chunks.'); return chunks; }; // Sends ACK N, expecting Nth blob chunk for message ID. Reliable.prototype._ack = function(id) { var ack = this._incoming[id].ack; // if ack is the end value, then call _complete. if (this._received[id] === ack[2]) { this._complete(id); this._received[id] = true; } this._handleSend(ack); }; // Calculates the next ACK number, given chunks. Reliable.prototype._calculateNextAck = function(id) { var data = this._incoming[id]; var chunks = data.chunks; for (var i = 0, ii = chunks.length; i < ii; i += 1) { // This chunk is missing!!! Better ACK for it. if (chunks[i] === undefined) { data.ack[2] = i; return; } } data.ack[2] = chunks.length; }; // Sends the next window of chunks. Reliable.prototype._sendWindowedChunks = function(id) { util.log('sendWindowedChunks for: ', id); var data = this._outgoing[id]; var ch = data.chunks; var chunks = []; var limit = Math.min(data.ack + this._window, ch.length); for (var i = data.ack; i < limit; i += 1) { if (!ch[i].sent || i === data.ack) { ch[i].sent = true; chunks.push(['chunk', id, i, ch[i].payload]); } } if (data.ack + this._window >= ch.length) { chunks.push(['end', id, ch.length]) } chunks._multiple = true; this._handleSend(chunks); }; // Puts together a message from chunks. Reliable.prototype._complete = function(id) { util.log('Completed called for', id); var self = this; var chunks = this._incoming[id].chunks; var bl = new Blob(chunks); util.blobToArrayBuffer(bl, function(ab) { self.onmessage(util.unpack(ab)); }); delete this._incoming[id]; }; // Ups bandwidth limit on SDP. Meant to be called during offer/answer. Reliable.higherBandwidthSDP = function(sdp) { // AS stands for Application-Specific Maximum. // Bandwidth number is in kilobits / sec. // See RFC for more info: http://www.ietf.org/rfc/rfc2327.txt // Chrome 31+ doesn't want us munging the SDP, so we'll let them have their // way. var version = navigator.appVersion.match(/Chrome\/(.*?) /); if (version) { version = parseInt(version[1].split('.').shift()); if (version < 31) { var parts = sdp.split('b=AS:30'); var replace = 'b=AS:102400'; // 100 Mbps if (parts.length > 1) { return parts[0] + replace + parts[1]; } } } return sdp; }; // Overwritten, typically. Reliable.prototype.onmessage = function(msg) {}; module.exports.Reliable = Reliable; },{"./util":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/reliable/lib/util.js"}],"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/reliable/lib/util.js":[function(require,module,exports){ var BinaryPack = require('js-binarypack'); var util = { debug: false, inherits: function(ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }, extend: function(dest, source) { for(var key in source) { if(source.hasOwnProperty(key)) { dest[key] = source[key]; } } return dest; }, pack: BinaryPack.pack, unpack: BinaryPack.unpack, log: function () { if (util.debug) { var copy = []; for (var i = 0; i < arguments.length; i++) { copy[i] = arguments[i]; } copy.unshift('Reliable: '); console.log.apply(console, copy); } }, setZeroTimeout: (function(global) { var timeouts = []; var messageName = 'zero-timeout-message'; // Like setTimeout, but only takes a function argument. There's // no time argument (always zero) and no arguments (you have to // use a closure). function setZeroTimeoutPostMessage(fn) { timeouts.push(fn); global.postMessage(messageName, '*'); } function handleMessage(event) { if (event.source == global && event.data == messageName) { if (event.stopPropagation) { event.stopPropagation(); } if (timeouts.length) { timeouts.shift()(); } } } if (global.addEventListener) { global.addEventListener('message', handleMessage, true); } else if (global.attachEvent) { global.attachEvent('onmessage', handleMessage); } return setZeroTimeoutPostMessage; }(this)), blobToArrayBuffer: function(blob, cb){ var fr = new FileReader(); fr.onload = function(evt) { cb(evt.target.result); }; fr.readAsArrayBuffer(blob); }, blobToBinaryString: function(blob, cb){ var fr = new FileReader(); fr.onload = function(evt) { cb(evt.target.result); }; fr.readAsBinaryString(blob); }, binaryStringToArrayBuffer: function(binary) { var byteArray = new Uint8Array(binary.length); for (var i = 0; i < binary.length; i++) { byteArray[i] = binary.charCodeAt(i) & 0xff; } return byteArray.buffer; }, randomToken: function () { return Math.random().toString(36).substr(2); } }; module.exports = util; },{"js-binarypack":"/Users/alex/Projects/webdrop/node_modules/peerjs/node_modules/js-binarypack/lib/binarypack.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/AutoFocusMixin.js":[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule AutoFocusMixin * @typechecks static-only */ 'use strict'; var focusNode = require("./focusNode"); var AutoFocusMixin = { componentDidMount: function() { if (this.props.autoFocus) { focusNode(this.getDOMNode()); } } }; module.exports = AutoFocusMixin; },{"./focusNode":"/Users/alex/Projects/webdrop/node_modules/react/lib/focusNode.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/BeforeInputEventPlugin.js":[function(require,module,exports){ /** * Copyright 2013-2015 Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule BeforeInputEventPlugin * @typechecks static-only */ 'use strict'; var EventConstants = require("./EventConstants"); var EventPropagators = require("./EventPropagators"); var ExecutionEnvironment = require("./ExecutionEnvironment"); var FallbackCompositionState = require("./FallbackCompositionState"); var SyntheticCompositionEvent = require("./SyntheticCompositionEvent"); var SyntheticInputEvent = require("./SyntheticInputEvent"); var keyOf = require("./keyOf"); var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space var START_KEYCODE = 229; var canUseCompositionEvent = ( ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window ); var documentMode = null; if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) { documentMode = document.documentMode; } // Webkit offers a very useful `textInput` event that can be used to // directly represent `beforeInput`. The IE `textinput` event is not as // useful, so we don't use it. var canUseTextInputEvent = ( ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto() ); // In IE9+, we have access to composition events, but the data supplied // by the native compositionend event may be incorrect. Japanese ideographic // spaces, for instance (\u3000) are not recorded correctly. var useFallbackCompositionData = ( ExecutionEnvironment.canUseDOM && ( (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11) ) ); /** * Opera <= 12 includes TextEvent in window, but does not fire * text input events. Rely on keypress instead. */ function isPresto() { var opera = window.opera; return ( typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12 ); } var SPACEBAR_CODE = 32; var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); var topLevelTypes = EventConstants.topLevelTypes; // Events and their corresponding property names. var eventTypes = { beforeInput: { phasedRegistrationNames: { bubbled: keyOf({onBeforeInput: null}), captured: keyOf({onBeforeInputCapture: null}) }, dependencies: [ topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste ] }, compositionEnd: { phasedRegistrationNames: { bubbled: keyOf({onCompositionEnd: null}), captured: keyOf({onCompositionEndCapture: null}) }, dependencies: [ topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown ] }, compositionStart: { phasedRegistrationNames: { bubbled: keyOf({onCompositionStart: null}), captured: keyOf({onCompositionStartCapture: null}) }, dependencies: [ topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown ] }, compositionUpdate: { phasedRegistrationNames: { bubbled: keyOf({onCompositionUpdate: null}), captured: keyOf({onCompositionUpdateCapture: null}) }, dependencies: [ topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown ] } }; // Track whether we've ever handled a keypress on the space key. var hasSpaceKeypress = false; /** * Return whether a native keypress event is assumed to be a command. * This is required because Firefox fires `keypress` events for key commands * (cut, copy, select-all, etc.) even though no character is inserted. */ function isKeypressCommand(nativeEvent) { return ( (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command. !(nativeEvent.ctrlKey && nativeEvent.altKey) ); } /** * Translate native top level events into event types. * * @param {string} topLevelType * @return {object} */ function getCompositionEventType(topLevelType) { switch (topLevelType) { case topLevelTypes.topCompositionStart: return eventTypes.compositionStart; case topLevelTypes.topCompositionEnd: return eventTypes.compositionEnd; case topLevelTypes.topCompositionUpdate: return eventTypes.compositionUpdate; } } /** * Does our fallback best-guess model think this event signifies that * composition has begun? * * @param {string} topLevelType * @param {object} nativeEvent * @return {boolean} */ function isFallbackCompositionStart(topLevelType, nativeEvent) { return ( topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE ); } /** * Does our fallback mode think that this event is the end of composition? * * @param {string} topLevelType * @param {object} nativeEvent * @return {boolean} */ function isFallbackCompositionEnd(topLevelType, nativeEvent) { switch (topLevelType) { case topLevelTypes.topKeyUp: // Command keys insert or clear IME input. return (END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1); case topLevelTypes.topKeyDown: // Expect IME keyCode on each keydown. If we get any other // code we must have exited earlier. return (nativeEvent.keyCode !== START_KEYCODE); case topLevelTypes.topKeyPress: case topLevelTypes.topMouseDown: case topLevelTypes.topBlur: // Events are not possible without cancelling IME. return true; default: return false; } } /** * Google Input Tools provides composition data via a CustomEvent, * with the `data` property populated in the `detail` object. If this * is available on the event object, use it. If not, this is a plain * composition event and we have nothing special to extract. * * @param {object} nativeEvent * @return {?string} */ function getDataFromCustomEvent(nativeEvent) { var detail = nativeEvent.detail; if (typeof detail === 'object' && 'data' in detail) { return detail.data; } return null; } // Track the current IME composition fallback object, if any. var currentComposition = null; /** * @param {string} topLevelType Record from `EventConstants`. * @param {DOMEventTarget} topLevelTarget The listening component root node. * @param {string} topLevelTargetID ID of `topLevelTarget`. * @param {object} nativeEvent Native browser event. * @return {?object} A SyntheticCompositionEvent. */ function extractCompositionEvent( topLevelType, topLevelTarget, topLevelTargetID, nativeEvent ) { var eventType; var fallbackData; if (canUseCompositionEvent) { eventType = getCompositionEventType(topLevelType); } else if (!currentComposition) { if (isFallbackCompositionStart(topLevelType, nativeEvent)) { eventType = eventTypes.compositionStart; } } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { eventType = eventTypes.compositionEnd; } if (!eventType) { return null; } if (useFallbackCompositionData) { // The current composition is stored statically and must not be // overwritten while composition continues. if (!currentComposition && eventType === eventTypes.compositionStart) { currentComposition = FallbackCompositionState.getPooled(topLevelTarget); } else if (eventType === eventTypes.compositionEnd) { if (currentComposition) { fallbackData = currentComposition.getData(); } } } var event = SyntheticCompositionEvent.getPooled( eventType, topLevelTargetID, nativeEvent ); if (fallbackData) { // Inject data generated from fallback path into the synthetic event. // This matches the property of native CompositionEventInterface. event.data = fallbackData; } else { var customData = getDataFromCustomEvent(nativeEvent); if (customData !== null) { event.data = customData; } } EventPropagators.accumulateTwoPhaseDispatches(event); return event; } /** * @param {string} topLevelType Record from `EventConstants`. * @param {object} nativeEvent Native browser event. * @return {?string} The string corresponding to this `beforeInput` event. */ function getNativeBeforeInputChars(topLevelType, nativeEvent) { switch (topLevelType) { case topLevelTypes.topCompositionEnd: return getDataFromCustomEvent(nativeEvent); case topLevelTypes.topKeyPress: /** * If native `textInput` events are available, our goal is to make * use of them. However, there is a special case: the spacebar key. * In Webkit, preventing default on a spacebar `textInput` event * cancels character insertion, but it *also* causes the browser * to fall back to its default spacebar behavior of scrolling the * page. * * Tracking at: * https://code.google.com/p/chromium/issues/detail?id=355103 * * To avoid this issue, use the keypress event as if no `textInput` * event is available. */ var which = nativeEvent.which; if (which !== SPACEBAR_CODE) { return null; } hasSpaceKeypress = true; return SPACEBAR_CHAR; case topLevelTypes.topTextInput: // Record the characters to be added to the DOM. var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled // it at the keypress level and bail immediately. Android Chrome // doesn't give us keycodes, so we need to blacklist it. if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { return null; } return chars; default: // For other native event types, do nothing. return null; } } /** * For browsers that do not provide the `textInput` event, extract the * appropriate string to use for SyntheticInputEvent. * * @param {string} topLevelType Record from `EventConstants`. * @param {object} nativeEvent Native browser event. * @return {?string} The fallback string for this `beforeInput` event. */ function getFallbackBeforeInputChars(topLevelType, nativeEvent) { // If we are currently composing (IME) and using a fallback to do so, // try to extract the composed characters from the fallback object. if (currentComposition) { if ( topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent) ) { var chars = currentComposition.getData(); FallbackCompositionState.release(currentComposition); currentComposition = null; return chars; } return null; } switch (topLevelType) { case topLevelTypes.topPaste: // If a paste event occurs after a keypress, throw out the input // chars. Paste events should not lead to BeforeInput events. return null; case topLevelTypes.topKeyPress: /** * As of v27, Firefox may fire keypress events even when no character * will be inserted. A few possibilities: * * - `which` is `0`. Arrow keys, Esc key, etc. * * - `which` is the pressed key code, but no char is available. * Ex: 'AltGr + d` in Polish. There is no modified character for * this key combination and no character is inserted into the * document, but FF fires the keypress for char code `100` anyway. * No `input` event will occur. * * - `which` is the pressed key code, but a command combination is * being used. Ex: `Cmd+C`. No character is inserted, and no * `input` event will occur. */ if (nativeEvent.which && !isKeypressCommand(nativeEvent)) { return String.fromCharCode(nativeEvent.which); } return null; case topLevelTypes.topCompositionEnd: return useFallbackCompositionData ? null : nativeEvent.data; default: return null; } } /** * Extract a SyntheticInputEvent for `beforeInput`, based on either native * `textInput` or fallback behavior. * * @param {string} topLevelType Record from `EventConstants`. * @param {DOMEventTarget} topLevelTarget The listening component root node. * @param {string} topLevelTargetID ID of `topLevelTarget`. * @param {object} nativeEvent Native browser event. * @return {?object} A SyntheticInputEvent. */ function extractBeforeInputEvent( topLevelType, topLevelTarget, topLevelTargetID, nativeEvent ) { var chars; if (canUseTextInputEvent) { chars = getNativeBeforeInputChars(topLevelType, nativeEvent); } else { chars = getFallbackBeforeInputChars(topLevelType, nativeEvent); } // If no characters are being inserted, no BeforeInput event should // be fired. if (!chars) { return null; } var event = SyntheticInputEvent.getPooled( eventTypes.beforeInput, topLevelTargetID, nativeEvent ); event.data = chars; EventPropagators.accumulateTwoPhaseDispatches(event); return event; } /** * Create an `onBeforeInput` event to match * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. * * This event plugin is based on the native `textInput` event * available in Chrome, Safari, Opera, and IE. This event fires after * `onKeyPress` and `onCompositionEnd`, but before `onInput`. * * `beforeInput` is spec'd but not implemented in any browsers, and * the `input` event does not provide any useful information about what has * actually been added, contrary to the spec. Thus, `textInput` is the best * available event to identify the characters that have actually been inserted * into the target node. * * This plugin is also responsible for emitting `composition` events, thus * allowing us to share composition fallback code for both `beforeInput` and * `composition` event types. */ var BeforeInputEventPlugin = { eventTypes: eventTypes, /** * @param {string} topLevelType Record from `EventConstants`. * @param {DOMEventTarget} topLevelTarget The listening component root node. * @param {string} topLevelTargetID ID of `topLevelTarget`. * @param {object} nativeEvent Native browser event. * @return {*} An accumulation of synthetic events. * @see {EventPluginHub.extractEvents} */ extractEvents: function( topLevelType, topLevelTarget, topLevelTargetID, nativeEvent ) { return [ extractCompositionEvent( topLevelType, topLevelTarget, topLevelTargetID, nativeEvent ), extractBeforeInputEvent( topLevelType, topLevelTarget, topLevelTargetID, nativeEvent ) ]; } }; module.exports = BeforeInputEventPlugin; },{"./EventConstants":"/Users/alex/Projects/webdrop/node_modules/react/lib/EventConstants.js","./EventPropagators":"/Users/alex/Projects/webdrop/node_modules/react/lib/EventPropagators.js","./ExecutionEnvironment":"/Users/alex/Projects/webdrop/node_modules/react/lib/ExecutionEnvironment.js","./FallbackCompositionState":"/Users/alex/Projects/webdrop/node_modules/react/lib/FallbackCompositionState.js","./SyntheticCompositionEvent":"/Users/alex/Projects/webdrop/node_modules/react/lib/SyntheticCompositionEvent.js","./SyntheticInputEvent":"/Users/alex/Projects/webdrop/node_modules/react/lib/SyntheticInputEvent.js","./keyOf":"/Users/alex/Projects/webdrop/node_modules/react/lib/keyOf.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/CSSProperty.js":[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule CSSProperty */ 'use strict'; /** * CSS properties which accept numbers but are not in units of "px". */ var isUnitlessNumber = { boxFlex: true, boxFlexGroup: true, columnCount: true, flex: true, flexGrow: true, flexShrink: true, fontWeight: true, lineClamp: true, lineHeight: true, opacity: true, order: true, orphans: true, widows: true, zIndex: true, zoom: true, // SVG-related properties fillOpacity: true, strokeOpacity: true }; /** * @param {string} prefix vendor-specific prefix, eg: Webkit * @param {string} key style name, eg: transitionDuration * @return {string} style name prefixed with `prefix`, properly camelCased, eg: * WebkitTransitionDuration */ function prefixKey(prefix, key) { return prefix + key.charAt(0).toUpperCase() + key.substring(1); } /** * Support style names that may come passed in prefixed by adding permutations * of vendor prefixes. */ var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an // infinite loop, because it iterates over the newly added props too. Object.keys(isUnitlessNumber).forEach(function(prop) { prefixes.forEach(function(prefix) { isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; }); }); /** * Most style properties can be unset by doing .style[prop] = '' but IE8 * doesn't like doing that with shorthand properties so for the properties that * IE8 breaks on, which are listed here, we instead unset each of the * individual properties. See http://bugs.jquery.com/ticket/12385. * The 4-value 'clock' properties like margin, padding, border-width seem to * behave without any problems. Curiously, list-style works too without any * special prodding. */ var shorthandPropertyExpansions = { background: { backgroundImage: true, backgroundPosition: true, backgroundRepeat: true, backgroundColor: true }, border: { borderWidth: true, borderStyle: true, borderColor: true }, borderBottom: { borderBottomWidth: true, borderBottomStyle: true, borderBottomColor: true }, borderLeft: { borderLeftWidth: true, borderLeftStyle: true, borderLeftColor: true }, borderRight: { borderRightWidth: true, borderRightStyle: true, borderRightColor: true }, borderTop: { borderTopWidth: true, borderTopStyle: true, borderTopColor: true }, font: { fontStyle: true, fontVariant: true, fontWeight: true, fontSize: true, lineHeight: true, fontFamily: true } }; var CSSProperty = { isUnitlessNumber: isUnitlessNumber, shorthandPropertyExpansions: shorthandPropertyExpansions }; module.exports = CSSProperty; },{}],"/Users/alex/Projects/webdrop/node_modules/react/lib/CSSPropertyOperations.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule CSSPropertyOperations * @typechecks static-only */ 'use strict'; var CSSProperty = require("./CSSProperty"); var ExecutionEnvironment = require("./ExecutionEnvironment"); var camelizeStyleName = require("./camelizeStyleName"); var dangerousStyleValue = require("./dangerousStyleValue"); var hyphenateStyleName = require("./hyphenateStyleName"); var memoizeStringOnly = require("./memoizeStringOnly"); var warning = require("./warning"); var processStyleName = memoizeStringOnly(function(styleName) { return hyphenateStyleName(styleName); }); var styleFloatAccessor = 'cssFloat'; if (ExecutionEnvironment.canUseDOM) { // IE8 only supports accessing cssFloat (standard) as styleFloat if (document.documentElement.style.cssFloat === undefined) { styleFloatAccessor = 'styleFloat'; } } if ("production" !== process.env.NODE_ENV) { // 'msTransform' is correct, but the other prefixes should be capitalized var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; // style values shouldn't contain a semicolon var badStyleValueWithSemicolonPattern = /;\s*$/; var warnedStyleNames = {}; var warnedStyleValues = {}; var warnHyphenatedStyleName = function(name) { if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { return; } warnedStyleNames[name] = true; ("production" !== process.env.NODE_ENV ? warning( false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name) ) : null); }; var warnBadVendoredStyleName = function(name) { if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { return; } warnedStyleNames[name] = true; ("production" !== process.env.NODE_ENV ? warning( false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1) ) : null); }; var warnStyleValueWithSemicolon = function(name, value) { if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { return; } warnedStyleValues[value] = true; ("production" !== process.env.NODE_ENV ? warning( false, 'Style property values shouldn\'t contain a semicolon. ' + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '') ) : null); }; /** * @param {string} name * @param {*} value */ var warnValidStyle = function(name, value) { if (name.indexOf('-') > -1) { warnHyphenatedStyleName(name); } else if (badVendoredStyleNamePattern.test(name)) { warnBadVendoredStyleName(name); } else if (badStyleValueWithSemicolonPattern.test(value)) { warnStyleValueWithSemicolon(name, value); } }; } /** * Operations for dealing with CSS properties. */ var CSSPropertyOperations = { /** * Serializes a mapping of style properties for use as inline styles: * * > createMarkupForStyles({width: '200px', height: 0}) * "width:200px;height:0;" * * Undefined values are ignored so that declarative programming is easier. * The result should be HTML-escaped before insertion into the DOM. * * @param {object} styles * @return {?string} */ createMarkupForStyles: function(styles) { var serialized = ''; for (var styleName in styles) { if (!styles.hasOwnProperty(styleName)) { continue; } var styleValue = styles[styleName]; if ("production" !== process.env.NODE_ENV) { warnValidStyle(styleName, styleValue); } if (styleValue != null) { serialized += processStyleName(styleName) + ':'; serialized += dangerousStyleValue(styleName, styleValue) + ';'; } } return serialized || null; }, /** * Sets the value for multiple styles on a node. If a value is specified as * '' (empty string), the corresponding style property will be unset. * * @param {DOMElement} node * @param {object} styles */ setValueForStyles: function(node, styles) { var style = node.style; for (var styleName in styles) { if (!styles.hasOwnProperty(styleName)) { continue; } if ("production" !== process.env.NODE_ENV) { warnValidStyle(styleName, styles[styleName]); } var styleValue = dangerousStyleValue(styleName, styles[styleName]); if (styleName === 'float') { styleName = styleFloatAccessor; } if (styleValue) { style[styleName] = styleValue; } else { var expansion = CSSProperty.shorthandPropertyExpansions[styleName]; if (expansion) { // Shorthand property that IE8 won't like unsetting, so unset each // component to placate it for (var individualStyleName in expansion) { style[individualStyleName] = ''; } } else { style[styleName] = ''; } } } } }; module.exports = CSSPropertyOperations; }).call(this,require('_process')) },{"./CSSProperty":"/Users/alex/Projects/webdrop/node_modules/react/lib/CSSProperty.js","./ExecutionEnvironment":"/Users/alex/Projects/webdrop/node_modules/react/lib/ExecutionEnvironment.js","./camelizeStyleName":"/Users/alex/Projects/webdrop/node_modules/react/lib/camelizeStyleName.js","./dangerousStyleValue":"/Users/alex/Projects/webdrop/node_modules/react/lib/dangerousStyleValue.js","./hyphenateStyleName":"/Users/alex/Projects/webdrop/node_modules/react/lib/hyphenateStyleName.js","./memoizeStringOnly":"/Users/alex/Projects/webdrop/node_modules/react/lib/memoizeStringOnly.js","./warning":"/Users/alex/Projects/webdrop/node_modules/react/lib/warning.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/CallbackQueue.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule CallbackQueue */ 'use strict'; var PooledClass = require("./PooledClass"); var assign = require("./Object.assign"); var invariant = require("./invariant"); /** * A specialized pseudo-event module to help keep track of components waiting to * be notified when their DOM representations are available for use. * * This implements `PooledClass`, so you should never need to instantiate this. * Instead, use `CallbackQueue.getPooled()`. * * @class ReactMountReady * @implements PooledClass * @internal */ function CallbackQueue() { this._callbacks = null; this._contexts = null; } assign(CallbackQueue.prototype, { /** * Enqueues a callback to be invoked when `notifyAll` is invoked. * * @param {function} callback Invoked when `notifyAll` is invoked. * @param {?object} context Context to call `callback` with. * @internal */ enqueue: function(callback, context) { this._callbacks = this._callbacks || []; this._contexts = this._contexts || []; this._callbacks.push(callback); this._contexts.push(context); }, /** * Invokes all enqueued callbacks and clears the queue. This is invoked after * the DOM representation of a component has been created or updated. * * @internal */ notifyAll: function() { var callbacks = this._callbacks; var contexts = this._contexts; if (callbacks) { ("production" !== process.env.NODE_ENV ? invariant( callbacks.length === contexts.length, 'Mismatched list of contexts in callback queue' ) : invariant(callbacks.length === contexts.length)); this._callbacks = null; this._contexts = null; for (var i = 0, l = callbacks.length; i < l; i++) { callbacks[i].call(contexts[i]); } callbacks.length = 0; contexts.length = 0; } }, /** * Resets the internal queue. * * @internal */ reset: function() { this._callbacks = null; this._contexts = null; }, /** * `PooledClass` looks for this. */ destructor: function() { this.reset(); } }); PooledClass.addPoolingTo(CallbackQueue); module.exports = CallbackQueue; }).call(this,require('_process')) },{"./Object.assign":"/Users/alex/Projects/webdrop/node_modules/react/lib/Object.assign.js","./PooledClass":"/Users/alex/Projects/webdrop/node_modules/react/lib/PooledClass.js","./invariant":"/Users/alex/Projects/webdrop/node_modules/react/lib/invariant.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ChangeEventPlugin.js":[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ChangeEventPlugin */ 'use strict'; var EventConstants = require("./EventConstants"); var EventPluginHub = require("./EventPluginHub"); var EventPropagators = require("./EventPropagators"); var ExecutionEnvironment = require("./ExecutionEnvironment"); var ReactUpdates = require("./ReactUpdates"); var SyntheticEvent = require("./SyntheticEvent"); var isEventSupported = require("./isEventSupported"); var isTextInputElement = require("./isTextInputElement"); var keyOf = require("./keyOf"); var topLevelTypes = EventConstants.topLevelTypes; var eventTypes = { change: { phasedRegistrationNames: { bubbled: keyOf({onChange: null}), captured: keyOf({onChangeCapture: null}) }, dependencies: [ topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange ] } }; /** * For IE shims */ var activeElement = null; var activeElementID = null; var activeElementValue = null; var activeElementValueProp = null; /** * SECTION: handle `change` event */ function shouldUseChangeEvent(elem) { return ( elem.nodeName === 'SELECT' || (elem.nodeName === 'INPUT' && elem.type === 'file') ); } var doesChangeEventBubble = false; if (ExecutionEnvironment.canUseDOM) { // See `handleChange` comment below doesChangeEventBubble = isEventSupported('change') && ( (!('documentMode' in document) || document.documentMode > 8) ); } function manualDispatchChangeEvent(nativeEvent) { var event = SyntheticEvent.getPooled( eventTypes.change, activeElementID, nativeEvent ); EventPropagators.accumulateTwoPhaseDispatches(event); // If change and propertychange bubbled, we'd just bind to it like all the // other events and have it go through ReactBrowserEventEmitter. Since it // doesn't, we manually listen for the events and so we have to enqueue and // process the abstract event manually. // // Batching is necessary here in order to ensure that all event handlers run // before the next rerender (including event handlers attached to ancestor // elements instead of directly on the input). Without this, controlled // components don't work properly in conjunction with event bubbling because // the component is rerendered and the value reverted before all the event // handlers can run. See https://github.com/facebook/react/issues/708. ReactUpdates.batchedUpdates(runEventInBatch, event); } function runEventInBatch(event) { EventPluginHub.enqueueEvents(event); EventPluginHub.processEventQueue(); } function startWatchingForChangeEventIE8(target, targetID) { activeElement = target; activeElementID = targetID; activeElement.attachEvent('onchange', manualDispatchChangeEvent); } function stopWatchingForChangeEventIE8() { if (!activeElement) { return; } activeElement.detachEvent('onchange', manualDispatchChangeEvent); activeElement = null; activeElementID = null; } function getTargetIDForChangeEvent( topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topChange) { return topLevelTargetID; } } function handleEventsForChangeEventIE8( topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topFocus) { // stopWatching() should be a noop here but we call it just in case we // missed a blur event somehow. stopWatchingForChangeEventIE8(); startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID); } else if (topLevelType === topLevelTypes.topBlur) { stopWatchingForChangeEventIE8(); } } /** * SECTION: handle `input` event */ var isInputEventSupported = false; if (ExecutionEnvironment.canUseDOM) { // IE9 claims to support the input event but fails to trigger it when // deleting text, so we ignore its input events isInputEventSupported = isEventSupported('input') && ( (!('documentMode' in document) || document.documentMode > 9) ); } /** * (For old IE.) Replacement getter/setter for the `value` property that gets * set on the active element. */ var newValueProp = { get: function() { return activeElementValueProp.get.call(this); }, set: function(val) { // Cast to a string so we can do equality checks. activeElementValue = '' + val; activeElementValueProp.set.call(this, val); } }; /** * (For old IE.) Starts tracking propertychange events on the passed-in element * and override the value property so that we can distinguish user events from * value changes in JS. */ function startWatchingForValueChange(target, targetID) { activeElement = target; activeElementID = targetID; activeElementValue = target.value; activeElementValueProp = Object.getOwnPropertyDescriptor( target.constructor.prototype, 'value' ); Object.defineProperty(activeElement, 'value', newValueProp); activeElement.attachEvent('onpropertychange', handlePropertyChange); } /** * (For old IE.) Removes the event listeners from the currently-tracked element, * if any exists. */ function stopWatchingForValueChange() { if (!activeElement) { return; } // delete restores the original property definition delete activeElement.value; activeElement.detachEvent('onpropertychange', handlePropertyChange); activeElement = null; activeElementID = null; activeElementValue = null; activeElementValueProp = null; } /** * (For old IE.) Handles a propertychange event, sending a `change` event if * the value of the active element has changed. */ function handlePropertyChange(nativeEvent) { if (nativeEvent.propertyName !== 'value') { return; } var value = nativeEvent.srcElement.value; if (value === activeElementValue) { return; } activeElementValue = value; manualDispatchChangeEvent(nativeEvent); } /** * If a `change` event should be fired, returns the target's ID. */ function getTargetIDForInputEvent( topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topInput) { // In modern browsers (i.e., not IE8 or IE9), the input event is exactly // what we want so fall through here and trigger an abstract event return topLevelTargetID; } } // For IE8 and IE9. function handleEventsForInputEventIE( topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topFocus) { // In IE8, we can capture almost all .value changes by adding a // propertychange handler and looking for events with propertyName // equal to 'value' // In IE9, propertychange fires for most input events but is buggy and // doesn't fire when text is deleted, but conveniently, selectionchange // appears to fire in all of the remaining cases so we catch those and // forward the event if the value has changed // In either case, we don't want to call the event handler if the value // is changed from JS so we redefine a setter for `.value` that updates // our activeElementValue variable, allowing us to ignore those changes // // stopWatching() should be a noop here but we call it just in case we // missed a blur event somehow. stopWatchingForValueChange(); startWatchingForValueChange(topLevelTarget, topLevelTargetID); } else if (topLevelType === topLevelTypes.topBlur) { stopWatchingForValueChange(); } } // For IE8 and IE9. function getTargetIDForInputEventIE( topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) { // On the selectionchange event, the target is just document which isn't // helpful for us so just check activeElement instead. // // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire // propertychange on the first input event after setting `value` from a // script and fires only keydown, keypress, keyup. Catching keyup usually // gets it and catching keydown lets us fire an event for the first // keystroke if user does a key repeat (it'll be a little delayed: right // before the second keystroke). Other input methods (e.g., paste) seem to // fire selectionchange normally. if (activeElement && activeElement.value !== activeElementValue) { activeElementValue = activeElement.value; return activeElementID; } } } /** * SECTION: handle `click` event */ function shouldUseClickEvent(elem) { // Use the `click` event to detect changes to checkbox and radio inputs. // This approach works across all browsers, whereas `change` does not fire // until `blur` in IE8. return ( elem.nodeName === 'INPUT' && (elem.type === 'checkbox' || elem.type === 'radio') ); } function getTargetIDForClickEvent( topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topClick) { return topLevelTargetID; } } /** * This plugin creates an `onChange` event that normalizes change events * across form elements. This event fires at a time when it's possible to * change the element's value without seeing a flicker. * * Supported elements are: * - input (see `isTextInputElement`) * - textarea * - select */ var ChangeEventPlugin = { eventTypes: eventTypes, /** * @param {string} topLevelType Record from `EventConstants`. * @param {DOMEventTarget} topLevelTarget The listening component root node. * @param {string} topLevelTargetID ID of `topLevelTarget`. * @param {object} nativeEvent Native browser event. * @return {*} An accumulation of synthetic events. * @see {EventPluginHub.extractEvents} */ extractEvents: function( topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { var getTargetIDFunc, handleEventFunc; if (shouldUseChangeEvent(topLevelTarget)) { if (doesChangeEventBubble) { getTargetIDFunc = getTargetIDForChangeEvent; } else { handleEventFunc = handleEventsForChangeEventIE8; } } else if (isTextInputElement(topLevelTarget)) { if (isInputEventSupported) { getTargetIDFunc = getTargetIDForInputEvent; } else { getTargetIDFunc = getTargetIDForInputEventIE; handleEventFunc = handleEventsForInputEventIE; } } else if (shouldUseClickEvent(topLevelTarget)) { getTargetIDFunc = getTargetIDForClickEvent; } if (getTargetIDFunc) { var targetID = getTargetIDFunc( topLevelType, topLevelTarget, topLevelTargetID ); if (targetID) { var event = SyntheticEvent.getPooled( eventTypes.change, targetID, nativeEvent ); EventPropagators.accumulateTwoPhaseDispatches(event); return event; } } if (handleEventFunc) { handleEventFunc( topLevelType, topLevelTarget, topLevelTargetID ); } } }; module.exports = ChangeEventPlugin; },{"./EventConstants":"/Users/alex/Projects/webdrop/node_modules/react/lib/EventConstants.js","./EventPluginHub":"/Users/alex/Projects/webdrop/node_modules/react/lib/EventPluginHub.js","./EventPropagators":"/Users/alex/Projects/webdrop/node_modules/react/lib/EventPropagators.js","./ExecutionEnvironment":"/Users/alex/Projects/webdrop/node_modules/react/lib/ExecutionEnvironment.js","./ReactUpdates":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactUpdates.js","./SyntheticEvent":"/Users/alex/Projects/webdrop/node_modules/react/lib/SyntheticEvent.js","./isEventSupported":"/Users/alex/Projects/webdrop/node_modules/react/lib/isEventSupported.js","./isTextInputElement":"/Users/alex/Projects/webdrop/node_modules/react/lib/isTextInputElement.js","./keyOf":"/Users/alex/Projects/webdrop/node_modules/react/lib/keyOf.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ClientReactRootIndex.js":[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ClientReactRootIndex * @typechecks */ 'use strict'; var nextReactRootIndex = 0; var ClientReactRootIndex = { createReactRootIndex: function() { return nextReactRootIndex++; } }; module.exports = ClientReactRootIndex; },{}],"/Users/alex/Projects/webdrop/node_modules/react/lib/DOMChildrenOperations.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule DOMChildrenOperations * @typechecks static-only */ 'use strict'; var Danger = require("./Danger"); var ReactMultiChildUpdateTypes = require("./ReactMultiChildUpdateTypes"); var setTextContent = require("./setTextContent"); var invariant = require("./invariant"); /** * Inserts `childNode` as a child of `parentNode` at the `index`. * * @param {DOMElement} parentNode Parent node in which to insert. * @param {DOMElement} childNode Child node to insert. * @param {number} index Index at which to insert the child. * @internal */ function insertChildAt(parentNode, childNode, index) { // By exploiting arrays returning `undefined` for an undefined index, we can // rely exclusively on `insertBefore(node, null)` instead of also using // `appendChild(node)`. However, using `undefined` is not allowed by all // browsers so we must replace it with `null`. parentNode.insertBefore( childNode, parentNode.childNodes[index] || null ); } /** * Operations for updating with DOM children. */ var DOMChildrenOperations = { dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup, updateTextContent: setTextContent, /** * Updates a component's children by processing a series of updates. The * update configurations are each expected to have a `parentNode` property. * * @param {array} updates List of update configurations. * @param {array} markupList List of markup strings. * @internal */ processUpdates: function(updates, markupList) { var update; // Mapping from parent IDs to initial child orderings. var initialChildren = null; // List of children that will be moved or removed. var updatedChildren = null; for (var i = 0; i < updates.length; i++) { update = updates[i]; if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING || update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) { var updatedIndex = update.fromIndex; var updatedChild = update.parentNode.childNodes[updatedIndex]; var parentID = update.parentID; ("production" !== process.env.NODE_ENV ? invariant( updatedChild, 'processUpdates(): Unable to find child %s of element. This ' + 'probably means the DOM was unexpectedly mutated (e.g., by the ' + 'browser), usually due to forgetting a when using tables, ' + 'nesting tags like
,

, or , or using non-SVG elements ' + 'in an parent. Try inspecting the child nodes of the element ' + 'with React ID `%s`.', updatedIndex, parentID ) : invariant(updatedChild)); initialChildren = initialChildren || {}; initialChildren[parentID] = initialChildren[parentID] || []; initialChildren[parentID][updatedIndex] = updatedChild; updatedChildren = updatedChildren || []; updatedChildren.push(updatedChild); } } var renderedMarkup = Danger.dangerouslyRenderMarkup(markupList); // Remove updated children first so that `toIndex` is consistent. if (updatedChildren) { for (var j = 0; j < updatedChildren.length; j++) { updatedChildren[j].parentNode.removeChild(updatedChildren[j]); } } for (var k = 0; k < updates.length; k++) { update = updates[k]; switch (update.type) { case ReactMultiChildUpdateTypes.INSERT_MARKUP: insertChildAt( update.parentNode, renderedMarkup[update.markupIndex], update.toIndex ); break; case ReactMultiChildUpdateTypes.MOVE_EXISTING: insertChildAt( update.parentNode, initialChildren[update.parentID][update.fromIndex], update.toIndex ); break; case ReactMultiChildUpdateTypes.TEXT_CONTENT: setTextContent( update.parentNode, update.textContent ); break; case ReactMultiChildUpdateTypes.REMOVE_NODE: // Already removed by the for-loop above. break; } } } }; module.exports = DOMChildrenOperations; }).call(this,require('_process')) },{"./Danger":"/Users/alex/Projects/webdrop/node_modules/react/lib/Danger.js","./ReactMultiChildUpdateTypes":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactMultiChildUpdateTypes.js","./invariant":"/Users/alex/Projects/webdrop/node_modules/react/lib/invariant.js","./setTextContent":"/Users/alex/Projects/webdrop/node_modules/react/lib/setTextContent.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/DOMProperty.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule DOMProperty * @typechecks static-only */ /*jslint bitwise: true */ 'use strict'; var invariant = require("./invariant"); function checkMask(value, bitmask) { return (value & bitmask) === bitmask; } var DOMPropertyInjection = { /** * Mapping from normalized, camelcased property names to a configuration that * specifies how the associated DOM property should be accessed or rendered. */ MUST_USE_ATTRIBUTE: 0x1, MUST_USE_PROPERTY: 0x2, HAS_SIDE_EFFECTS: 0x4, HAS_BOOLEAN_VALUE: 0x8, HAS_NUMERIC_VALUE: 0x10, HAS_POSITIVE_NUMERIC_VALUE: 0x20 | 0x10, HAS_OVERLOADED_BOOLEAN_VALUE: 0x40, /** * Inject some specialized knowledge about the DOM. This takes a config object * with the following properties: * * isCustomAttribute: function that given an attribute name will return true * if it can be inserted into the DOM verbatim. Useful for data-* or aria-* * attributes where it's impossible to enumerate all of the possible * attribute names, * * Properties: object mapping DOM property name to one of the * DOMPropertyInjection constants or null. If your attribute isn't in here, * it won't get written to the DOM. * * DOMAttributeNames: object mapping React attribute name to the DOM * attribute name. Attribute names not specified use the **lowercase** * normalized name. * * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties. * Property names not specified use the normalized name. * * DOMMutationMethods: Properties that require special mutation methods. If * `value` is undefined, the mutation method should unset the property. * * @param {object} domPropertyConfig the config as described above. */ injectDOMPropertyConfig: function(domPropertyConfig) { var Properties = domPropertyConfig.Properties || {}; var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {}; var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {}; var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {}; if (domPropertyConfig.isCustomAttribute) { DOMProperty._isCustomAttributeFunctions.push( domPropertyConfig.isCustomAttribute ); } for (var propName in Properties) { ("production" !== process.env.NODE_ENV ? invariant( !DOMProperty.isStandardName.hasOwnProperty(propName), 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property ' + '\'%s\' which has already been injected. You may be accidentally ' + 'injecting the same DOM property config twice, or you may be ' + 'injecting two configs that have conflicting property names.', propName ) : invariant(!DOMProperty.isStandardName.hasOwnProperty(propName))); DOMProperty.isStandardName[propName] = true; var lowerCased = propName.toLowerCase(); DOMProperty.getPossibleStandardName[lowerCased] = propName; if (DOMAttributeNames.hasOwnProperty(propName)) { var attributeName = DOMAttributeNames[propName]; DOMProperty.getPossibleStandardName[attributeName] = propName; DOMProperty.getAttributeName[propName] = attributeName; } else { DOMProperty.getAttributeName[propName] = lowerCased; } DOMProperty.getPropertyName[propName] = DOMPropertyNames.hasOwnProperty(propName) ? DOMPropertyNames[propName] : propName; if (DOMMutationMethods.hasOwnProperty(propName)) { DOMProperty.getMutationMethod[propName] = DOMMutationMethods[propName]; } else { DOMProperty.getMutationMethod[propName] = null; } var propConfig = Properties[propName]; DOMProperty.mustUseAttribute[propName] = checkMask(propConfig, DOMPropertyInjection.MUST_USE_ATTRIBUTE); DOMProperty.mustUseProperty[propName] = checkMask(propConfig, DOMPropertyInjection.MUST_USE_PROPERTY); DOMProperty.hasSideEffects[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_SIDE_EFFECTS); DOMProperty.hasBooleanValue[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_BOOLEAN_VALUE); DOMProperty.hasNumericValue[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_NUMERIC_VALUE); DOMProperty.hasPositiveNumericValue[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_POSITIVE_NUMERIC_VALUE); DOMProperty.hasOverloadedBooleanValue[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_OVERLOADED_BOOLEAN_VALUE); ("production" !== process.env.NODE_ENV ? invariant( !DOMProperty.mustUseAttribute[propName] || !DOMProperty.mustUseProperty[propName], 'DOMProperty: Cannot require using both attribute and property: %s', propName ) : invariant(!DOMProperty.mustUseAttribute[propName] || !DOMProperty.mustUseProperty[propName])); ("production" !== process.env.NODE_ENV ? invariant( DOMProperty.mustUseProperty[propName] || !DOMProperty.hasSideEffects[propName], 'DOMProperty: Properties that have side effects must use property: %s', propName ) : invariant(DOMProperty.mustUseProperty[propName] || !DOMProperty.hasSideEffects[propName])); ("production" !== process.env.NODE_ENV ? invariant( !!DOMProperty.hasBooleanValue[propName] + !!DOMProperty.hasNumericValue[propName] + !!DOMProperty.hasOverloadedBooleanValue[propName] <= 1, 'DOMProperty: Value can be one of boolean, overloaded boolean, or ' + 'numeric value, but not a combination: %s', propName ) : invariant(!!DOMProperty.hasBooleanValue[propName] + !!DOMProperty.hasNumericValue[propName] + !!DOMProperty.hasOverloadedBooleanValue[propName] <= 1)); } } }; var defaultValueCache = {}; /** * DOMProperty exports lookup objects that can be used like functions: * * > DOMProperty.isValid['id'] * true * > DOMProperty.isValid['foobar'] * undefined * * Although this may be confusing, it performs better in general. * * @see http://jsperf.com/key-exists * @see http://jsperf.com/key-missing */ var DOMProperty = { ID_ATTRIBUTE_NAME: 'data-reactid', /** * Checks whether a property name is a standard property. * @type {Object} */ isStandardName: {}, /** * Mapping from lowercase property names to the properly cased version, used * to warn in the case of missing properties. * @type {Object} */ getPossibleStandardName: {}, /** * Mapping from normalized names to attribute names that differ. Attribute * names are used when rendering markup or with `*Attribute()`. * @type {Object} */ getAttributeName: {}, /** * Mapping from normalized names to properties on DOM node instances. * (This includes properties that mutate due to external factors.) * @type {Object} */ getPropertyName: {}, /** * Mapping from normalized names to mutation methods. This will only exist if * mutation cannot be set simply by the property or `setAttribute()`. * @type {Object} */ getMutationMethod: {}, /** * Whether the property must be accessed and mutated as an object property. * @type {Object} */ mustUseAttribute: {}, /** * Whether the property must be accessed and mutated using `*Attribute()`. * (This includes anything that fails ` in `.) * @type {Object} */ mustUseProperty: {}, /** * Whether or not setting a value causes side effects such as triggering * resources to be loaded or text selection changes. We must ensure that * the value is only set if it has changed. * @type {Object} */ hasSideEffects: {}, /** * Whether the property should be removed when set to a falsey value. * @type {Object} */ hasBooleanValue: {}, /** * Whether the property must be numeric or parse as a * numeric and should be removed when set to a falsey value. * @type {Object} */ hasNumericValue: {}, /** * Whether the property must be positive numeric or parse as a positive * numeric and should be removed when set to a falsey value. * @type {Object} */ hasPositiveNumericValue: {}, /** * Whether the property can be used as a flag as well as with a value. Removed * when strictly equal to false; present without a value when strictly equal * to true; present with a value otherwise. * @type {Object} */ hasOverloadedBooleanValue: {}, /** * All of the isCustomAttribute() functions that have been injected. */ _isCustomAttributeFunctions: [], /** * Checks whether a property name is a custom attribute. * @method */ isCustomAttribute: function(attributeName) { for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) { var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i]; if (isCustomAttributeFn(attributeName)) { return true; } } return false; }, /** * Returns the default property value for a DOM property (i.e., not an * attribute). Most default values are '' or false, but not all. Worse yet, * some (in particular, `type`) vary depending on the type of element. * * TODO: Is it better to grab all the possible properties when creating an * element to avoid having to create the same element twice? */ getDefaultValueForProperty: function(nodeName, prop) { var nodeDefaults = defaultValueCache[nodeName]; var testElement; if (!nodeDefaults) { defaultValueCache[nodeName] = nodeDefaults = {}; } if (!(prop in nodeDefaults)) { testElement = document.createElement(nodeName); nodeDefaults[prop] = testElement[prop]; } return nodeDefaults[prop]; }, injection: DOMPropertyInjection }; module.exports = DOMProperty; }).call(this,require('_process')) },{"./invariant":"/Users/alex/Projects/webdrop/node_modules/react/lib/invariant.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/DOMPropertyOperations.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule DOMPropertyOperations * @typechecks static-only */ 'use strict'; var DOMProperty = require("./DOMProperty"); var quoteAttributeValueForBrowser = require("./quoteAttributeValueForBrowser"); var warning = require("./warning"); function shouldIgnoreValue(name, value) { return value == null || (DOMProperty.hasBooleanValue[name] && !value) || (DOMProperty.hasNumericValue[name] && isNaN(value)) || (DOMProperty.hasPositiveNumericValue[name] && (value < 1)) || (DOMProperty.hasOverloadedBooleanValue[name] && value === false); } if ("production" !== process.env.NODE_ENV) { var reactProps = { children: true, dangerouslySetInnerHTML: true, key: true, ref: true }; var warnedProperties = {}; var warnUnknownProperty = function(name) { if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) { return; } warnedProperties[name] = true; var lowerCasedName = name.toLowerCase(); // data-* attributes should be lowercase; suggest the lowercase version var standardName = ( DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null ); // For now, only warn when we have a suggested correction. This prevents // logging too much when using transferPropsTo. ("production" !== process.env.NODE_ENV ? warning( standardName == null, 'Unknown DOM property %s. Did you mean %s?', name, standardName ) : null); }; } /** * Operations for dealing with DOM properties. */ var DOMPropertyOperations = { /** * Creates markup for the ID property. * * @param {string} id Unescaped ID. * @return {string} Markup string. */ createMarkupForID: function(id) { return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id); }, /** * Creates markup for a property. * * @param {string} name * @param {*} value * @return {?string} Markup string, or null if the property was invalid. */ createMarkupForProperty: function(name, value) { if (DOMProperty.isStandardName.hasOwnProperty(name) && DOMProperty.isStandardName[name]) { if (shouldIgnoreValue(name, value)) { return ''; } var attributeName = DOMProperty.getAttributeName[name]; if (DOMProperty.hasBooleanValue[name] || (DOMProperty.hasOverloadedBooleanValue[name] && value === true)) { return attributeName; } return attributeName + '=' + quoteAttributeValueForBrowser(value); } else if (DOMProperty.isCustomAttribute(name)) { if (value == null) { return ''; } return name + '=' + quoteAttributeValueForBrowser(value); } else if ("production" !== process.env.NODE_ENV) { warnUnknownProperty(name); } return null; }, /** * Sets the value for a property on a node. * * @param {DOMElement} node * @param {string} name * @param {*} value */ setValueForProperty: function(node, name, value) { if (DOMProperty.isStandardName.hasOwnProperty(name) && DOMProperty.isStandardName[name]) { var mutationMethod = DOMProperty.getMutationMethod[name]; if (mutationMethod) { mutationMethod(node, value); } else if (shouldIgnoreValue(name, value)) { this.deleteValueForProperty(node, name); } else if (DOMProperty.mustUseAttribute[name]) { // `setAttribute` with objects becomes only `[object]` in IE8/9, // ('' + value) makes it output the correct toString()-value. node.setAttribute(DOMProperty.getAttributeName[name], '' + value); } else { var propName = DOMProperty.getPropertyName[name]; // Must explicitly cast values for HAS_SIDE_EFFECTS-properties to the // property type before comparing; only `value` does and is string. if (!DOMProperty.hasSideEffects[name] || ('' + node[propName]) !== ('' + value)) { // Contrary to `setAttribute`, object properties are properly // `toString`ed by IE8/9. node[propName] = value; } } } else if (DOMProperty.isCustomAttribute(name)) { if (value == null) { node.removeAttribute(name); } else { node.setAttribute(name, '' + value); } } else if ("production" !== process.env.NODE_ENV) { warnUnknownProperty(name); } }, /** * Deletes the value for a property on a node. * * @param {DOMElement} node * @param {string} name */ deleteValueForProperty: function(node, name) { if (DOMProperty.isStandardName.hasOwnProperty(name) && DOMProperty.isStandardName[name]) { var mutationMethod = DOMProperty.getMutationMethod[name]; if (mutationMethod) { mutationMethod(node, undefined); } else if (DOMProperty.mustUseAttribute[name]) { node.removeAttribute(DOMProperty.getAttributeName[name]); } else { var propName = DOMProperty.getPropertyName[name]; var defaultValue = DOMProperty.getDefaultValueForProperty( node.nodeName, propName ); if (!DOMProperty.hasSideEffects[name] || ('' + node[propName]) !== defaultValue) { node[propName] = defaultValue; } } } else if (DOMProperty.isCustomAttribute(name)) { node.removeAttribute(name); } else if ("production" !== process.env.NODE_ENV) { warnUnknownProperty(name); } } }; module.exports = DOMPropertyOperations; }).call(this,require('_process')) },{"./DOMProperty":"/Users/alex/Projects/webdrop/node_modules/react/lib/DOMProperty.js","./quoteAttributeValueForBrowser":"/Users/alex/Projects/webdrop/node_modules/react/lib/quoteAttributeValueForBrowser.js","./warning":"/Users/alex/Projects/webdrop/node_modules/react/lib/warning.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/Danger.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule Danger * @typechecks static-only */ /*jslint evil: true, sub: true */ 'use strict'; var ExecutionEnvironment = require("./ExecutionEnvironment"); var createNodesFromMarkup = require("./createNodesFromMarkup"); var emptyFunction = require("./emptyFunction"); var getMarkupWrap = require("./getMarkupWrap"); var invariant = require("./invariant"); var OPEN_TAG_NAME_EXP = /^(<[^ \/>]+)/; var RESULT_INDEX_ATTR = 'data-danger-index'; /** * Extracts the `nodeName` from a string of markup. * * NOTE: Extracting the `nodeName` does not require a regular expression match * because we make assumptions about React-generated markup (i.e. there are no * spaces surrounding the opening tag and there is at least one attribute). * * @param {string} markup String of markup. * @return {string} Node name of the supplied markup. * @see http://jsperf.com/extract-nodename */ function getNodeName(markup) { return markup.substring(1, markup.indexOf(' ')); } var Danger = { /** * Renders markup into an array of nodes. The markup is expected to render * into a list of root nodes. Also, the length of `resultList` and * `markupList` should be the same. * * @param {array} markupList List of markup strings to render. * @return {array} List of rendered nodes. * @internal */ dangerouslyRenderMarkup: function(markupList) { ("production" !== process.env.NODE_ENV ? invariant( ExecutionEnvironment.canUseDOM, 'dangerouslyRenderMarkup(...): Cannot render markup in a worker ' + 'thread. Make sure `window` and `document` are available globally ' + 'before requiring React when unit testing or use ' + 'React.renderToString for server rendering.' ) : invariant(ExecutionEnvironment.canUseDOM)); var nodeName; var markupByNodeName = {}; // Group markup by `nodeName` if a wrap is necessary, else by '*'. for (var i = 0; i < markupList.length; i++) { ("production" !== process.env.NODE_ENV ? invariant( markupList[i], 'dangerouslyRenderMarkup(...): Missing markup.' ) : invariant(markupList[i])); nodeName = getNodeName(markupList[i]); nodeName = getMarkupWrap(nodeName) ? nodeName : '*'; markupByNodeName[nodeName] = markupByNodeName[nodeName] || []; markupByNodeName[nodeName][i] = markupList[i]; } var resultList = []; var resultListAssignmentCount = 0; for (nodeName in markupByNodeName) { if (!markupByNodeName.hasOwnProperty(nodeName)) { continue; } var markupListByNodeName = markupByNodeName[nodeName]; // This for-in loop skips the holes of the sparse array. The order of // iteration should follow the order of assignment, which happens to match // numerical index order, but we don't rely on that. var resultIndex; for (resultIndex in markupListByNodeName) { if (markupListByNodeName.hasOwnProperty(resultIndex)) { var markup = markupListByNodeName[resultIndex]; // Push the requested markup with an additional RESULT_INDEX_ATTR // attribute. If the markup does not start with a < character, it // will be discarded below (with an appropriate console.error). markupListByNodeName[resultIndex] = markup.replace( OPEN_TAG_NAME_EXP, // This index will be parsed back out below. '$1 ' + RESULT_INDEX_ATTR + '="' + resultIndex + '" ' ); } } // Render each group of markup with similar wrapping `nodeName`. var renderNodes = createNodesFromMarkup( markupListByNodeName.join(''), emptyFunction // Do nothing special with

; * } * }); * * The class specification supports a specific protocol of methods that have * special meaning (e.g. `render`). See `ReactClassInterface` for * more the comprehensive protocol. Any other properties and methods in the * class specification will available on the prototype. * * @interface ReactClassInterface * @internal */ var ReactClassInterface = { /** * An array of Mixin objects to include when defining your component. * * @type {array} * @optional */ mixins: SpecPolicy.DEFINE_MANY, /** * An object containing properties and methods that should be defined on * the component's constructor instead of its prototype (static methods). * * @type {object} * @optional */ statics: SpecPolicy.DEFINE_MANY, /** * Definition of prop types for this component. * * @type {object} * @optional */ propTypes: SpecPolicy.DEFINE_MANY, /** * Definition of context types for this component. * * @type {object} * @optional */ contextTypes: SpecPolicy.DEFINE_MANY, /** * Definition of context types this component sets for its children. * * @type {object} * @optional */ childContextTypes: SpecPolicy.DEFINE_MANY, // ==== Definition methods ==== /** * Invoked when the component is mounted. Values in the mapping will be set on * `this.props` if that prop is not specified (i.e. using an `in` check). * * This method is invoked before `getInitialState` and therefore cannot rely * on `this.state` or use `this.setState`. * * @return {object} * @optional */ getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED, /** * Invoked once before the component is mounted. The return value will be used * as the initial value of `this.state`. * * getInitialState: function() { * return { * isOn: false, * fooBaz: new BazFoo() * } * } * * @return {object} * @optional */ getInitialState: SpecPolicy.DEFINE_MANY_MERGED, /** * @return {object} * @optional */ getChildContext: SpecPolicy.DEFINE_MANY_MERGED, /** * Uses props from `this.props` and state from `this.state` to render the * structure of the component. * * No guarantees are made about when or how often this method is invoked, so * it must not have side effects. * * render: function() { * var name = this.props.name; * return
Hello, {name}!
; * } * * @return {ReactComponent} * @nosideeffects * @required */ render: SpecPolicy.DEFINE_ONCE, // ==== Delegate methods ==== /** * Invoked when the component is initially created and about to be mounted. * This may have side effects, but any external subscriptions or data created * by this method must be cleaned up in `componentWillUnmount`. * * @optional */ componentWillMount: SpecPolicy.DEFINE_MANY, /** * Invoked when the component has been mounted and has a DOM representation. * However, there is no guarantee that the DOM node is in the document. * * Use this as an opportunity to operate on the DOM when the component has * been mounted (initialized and rendered) for the first time. * * @param {DOMElement} rootNode DOM element representing the component. * @optional */ componentDidMount: SpecPolicy.DEFINE_MANY, /** * Invoked before the component receives new props. * * Use this as an opportunity to react to a prop transition by updating the * state using `this.setState`. Current props are accessed via `this.props`. * * componentWillReceiveProps: function(nextProps, nextContext) { * this.setState({ * likesIncreasing: nextProps.likeCount > this.props.likeCount * }); * } * * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop * transition may cause a state change, but the opposite is not true. If you * need it, you are probably looking for `componentWillUpdate`. * * @param {object} nextProps * @optional */ componentWillReceiveProps: SpecPolicy.DEFINE_MANY, /** * Invoked while deciding if the component should be updated as a result of * receiving new props, state and/or context. * * Use this as an opportunity to `return false` when you're certain that the * transition to the new props/state/context will not require a component * update. * * shouldComponentUpdate: function(nextProps, nextState, nextContext) { * return !equal(nextProps, this.props) || * !equal(nextState, this.state) || * !equal(nextContext, this.context); * } * * @param {object} nextProps * @param {?object} nextState * @param {?object} nextContext * @return {boolean} True if the component should update. * @optional */ shouldComponentUpdate: SpecPolicy.DEFINE_ONCE, /** * Invoked when the component is about to update due to a transition from * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState` * and `nextContext`. * * Use this as an opportunity to perform preparation before an update occurs. * * NOTE: You **cannot** use `this.setState()` in this method. * * @param {object} nextProps * @param {?object} nextState * @param {?object} nextContext * @param {ReactReconcileTransaction} transaction * @optional */ componentWillUpdate: SpecPolicy.DEFINE_MANY, /** * Invoked when the component's DOM representation has been updated. * * Use this as an opportunity to operate on the DOM when the component has * been updated. * * @param {object} prevProps * @param {?object} prevState * @param {?object} prevContext * @param {DOMElement} rootNode DOM element representing the component. * @optional */ componentDidUpdate: SpecPolicy.DEFINE_MANY, /** * Invoked when the component is about to be removed from its parent and have * its DOM representation destroyed. * * Use this as an opportunity to deallocate any external resources. * * NOTE: There is no `componentDidUnmount` since your component will have been * destroyed by that point. * * @optional */ componentWillUnmount: SpecPolicy.DEFINE_MANY, // ==== Advanced methods ==== /** * Updates the component's currently mounted DOM representation. * * By default, this implements React's rendering and reconciliation algorithm. * Sophisticated clients may wish to override this. * * @param {ReactReconcileTransaction} transaction * @internal * @overridable */ updateComponent: SpecPolicy.OVERRIDE_BASE }; /** * Mapping from class specification keys to special processing functions. * * Although these are declared like instance properties in the specification * when defining classes using `React.createClass`, they are actually static * and are accessible on the constructor instead of the prototype. Despite * being static, they must be defined outside of the "statics" key under * which all other static methods are defined. */ var RESERVED_SPEC_KEYS = { displayName: function(Constructor, displayName) { Constructor.displayName = displayName; }, mixins: function(Constructor, mixins) { if (mixins) { for (var i = 0; i < mixins.length; i++) { mixSpecIntoComponent(Constructor, mixins[i]); } } }, childContextTypes: function(Constructor, childContextTypes) { if ("production" !== process.env.NODE_ENV) { validateTypeDef( Constructor, childContextTypes, ReactPropTypeLocations.childContext ); } Constructor.childContextTypes = assign( {}, Constructor.childContextTypes, childContextTypes ); }, contextTypes: function(Constructor, contextTypes) { if ("production" !== process.env.NODE_ENV) { validateTypeDef( Constructor, contextTypes, ReactPropTypeLocations.context ); } Constructor.contextTypes = assign( {}, Constructor.contextTypes, contextTypes ); }, /** * Special case getDefaultProps which should move into statics but requires * automatic merging. */ getDefaultProps: function(Constructor, getDefaultProps) { if (Constructor.getDefaultProps) { Constructor.getDefaultProps = createMergedResultFunction( Constructor.getDefaultProps, getDefaultProps ); } else { Constructor.getDefaultProps = getDefaultProps; } }, propTypes: function(Constructor, propTypes) { if ("production" !== process.env.NODE_ENV) { validateTypeDef( Constructor, propTypes, ReactPropTypeLocations.prop ); } Constructor.propTypes = assign( {}, Constructor.propTypes, propTypes ); }, statics: function(Constructor, statics) { mixStaticSpecIntoComponent(Constructor, statics); } }; function validateTypeDef(Constructor, typeDef, location) { for (var propName in typeDef) { if (typeDef.hasOwnProperty(propName)) { // use a warning instead of an invariant so components // don't show up in prod but not in __DEV__ ("production" !== process.env.NODE_ENV ? warning( typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName ) : null); } } } function validateMethodOverride(proto, name) { var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null; // Disallow overriding of base class methods unless explicitly allowed. if (ReactClassMixin.hasOwnProperty(name)) { ("production" !== process.env.NODE_ENV ? invariant( specPolicy === SpecPolicy.OVERRIDE_BASE, 'ReactClassInterface: You are attempting to override ' + '`%s` from your class specification. Ensure that your method names ' + 'do not overlap with React methods.', name ) : invariant(specPolicy === SpecPolicy.OVERRIDE_BASE)); } // Disallow defining methods more than once unless explicitly allowed. if (proto.hasOwnProperty(name)) { ("production" !== process.env.NODE_ENV ? invariant( specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name ) : invariant(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED)); } } /** * Mixin helper which handles policy validation and reserved * specification keys when building React classses. */ function mixSpecIntoComponent(Constructor, spec) { if (!spec) { return; } ("production" !== process.env.NODE_ENV ? invariant( typeof spec !== 'function', 'ReactClass: You\'re attempting to ' + 'use a component class as a mixin. Instead, just use a regular object.' ) : invariant(typeof spec !== 'function')); ("production" !== process.env.NODE_ENV ? invariant( !ReactElement.isValidElement(spec), 'ReactClass: You\'re attempting to ' + 'use a component as a mixin. Instead, just use a regular object.' ) : invariant(!ReactElement.isValidElement(spec))); var proto = Constructor.prototype; // By handling mixins before any other properties, we ensure the same // chaining order is applied to methods with DEFINE_MANY policy, whether // mixins are listed before or after these methods in the spec. if (spec.hasOwnProperty(MIXINS_KEY)) { RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins); } for (var name in spec) { if (!spec.hasOwnProperty(name)) { continue; } if (name === MIXINS_KEY) { // We have already handled mixins in a special case above continue; } var property = spec[name]; validateMethodOverride(proto, name); if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) { RESERVED_SPEC_KEYS[name](Constructor, property); } else { // Setup methods on prototype: // The following member methods should not be automatically bound: // 1. Expected ReactClass methods (in the "interface"). // 2. Overridden methods (that were mixed in). var isReactClassMethod = ReactClassInterface.hasOwnProperty(name); var isAlreadyDefined = proto.hasOwnProperty(name); var markedDontBind = property && property.__reactDontBind; var isFunction = typeof property === 'function'; var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && !markedDontBind; if (shouldAutoBind) { if (!proto.__reactAutoBindMap) { proto.__reactAutoBindMap = {}; } proto.__reactAutoBindMap[name] = property; proto[name] = property; } else { if (isAlreadyDefined) { var specPolicy = ReactClassInterface[name]; // These cases should already be caught by validateMethodOverride ("production" !== process.env.NODE_ENV ? invariant( isReactClassMethod && ( (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY) ), 'ReactClass: Unexpected spec policy %s for key %s ' + 'when mixing in component specs.', specPolicy, name ) : invariant(isReactClassMethod && ( (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY) ))); // For methods which are defined more than once, call the existing // methods before calling the new property, merging if appropriate. if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) { proto[name] = createMergedResultFunction(proto[name], property); } else if (specPolicy === SpecPolicy.DEFINE_MANY) { proto[name] = createChainedFunction(proto[name], property); } } else { proto[name] = property; if ("production" !== process.env.NODE_ENV) { // Add verbose displayName to the function, which helps when looking // at profiling tools. if (typeof property === 'function' && spec.displayName) { proto[name].displayName = spec.displayName + '_' + name; } } } } } } } function mixStaticSpecIntoComponent(Constructor, statics) { if (!statics) { return; } for (var name in statics) { var property = statics[name]; if (!statics.hasOwnProperty(name)) { continue; } var isReserved = name in RESERVED_SPEC_KEYS; ("production" !== process.env.NODE_ENV ? invariant( !isReserved, 'ReactClass: You are attempting to define a reserved ' + 'property, `%s`, that shouldn\'t be on the "statics" key. Define it ' + 'as an instance property instead; it will still be accessible on the ' + 'constructor.', name ) : invariant(!isReserved)); var isInherited = name in Constructor; ("production" !== process.env.NODE_ENV ? invariant( !isInherited, 'ReactClass: You are attempting to define ' + '`%s` on your component more than once. This conflict may be ' + 'due to a mixin.', name ) : invariant(!isInherited)); Constructor[name] = property; } } /** * Merge two objects, but throw if both contain the same key. * * @param {object} one The first object, which is mutated. * @param {object} two The second object * @return {object} one after it has been mutated to contain everything in two. */ function mergeIntoWithNoDuplicateKeys(one, two) { ("production" !== process.env.NODE_ENV ? invariant( one && two && typeof one === 'object' && typeof two === 'object', 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.' ) : invariant(one && two && typeof one === 'object' && typeof two === 'object')); for (var key in two) { if (two.hasOwnProperty(key)) { ("production" !== process.env.NODE_ENV ? invariant( one[key] === undefined, 'mergeIntoWithNoDuplicateKeys(): ' + 'Tried to merge two objects with the same key: `%s`. This conflict ' + 'may be due to a mixin; in particular, this may be caused by two ' + 'getInitialState() or getDefaultProps() methods returning objects ' + 'with clashing keys.', key ) : invariant(one[key] === undefined)); one[key] = two[key]; } } return one; } /** * Creates a function that invokes two functions and merges their return values. * * @param {function} one Function to invoke first. * @param {function} two Function to invoke second. * @return {function} Function that invokes the two argument functions. * @private */ function createMergedResultFunction(one, two) { return function mergedResult() { var a = one.apply(this, arguments); var b = two.apply(this, arguments); if (a == null) { return b; } else if (b == null) { return a; } var c = {}; mergeIntoWithNoDuplicateKeys(c, a); mergeIntoWithNoDuplicateKeys(c, b); return c; }; } /** * Creates a function that invokes two functions and ignores their return vales. * * @param {function} one Function to invoke first. * @param {function} two Function to invoke second. * @return {function} Function that invokes the two argument functions. * @private */ function createChainedFunction(one, two) { return function chainedFunction() { one.apply(this, arguments); two.apply(this, arguments); }; } /** * Binds a method to the component. * * @param {object} component Component whose method is going to be bound. * @param {function} method Method to be bound. * @return {function} The bound method. */ function bindAutoBindMethod(component, method) { var boundMethod = method.bind(component); if ("production" !== process.env.NODE_ENV) { boundMethod.__reactBoundContext = component; boundMethod.__reactBoundMethod = method; boundMethod.__reactBoundArguments = null; var componentName = component.constructor.displayName; var _bind = boundMethod.bind; /* eslint-disable block-scoped-var, no-undef */ boundMethod.bind = function(newThis ) {for (var args=[],$__0=1,$__1=arguments.length;$__0<$__1;$__0++) args.push(arguments[$__0]); // User is trying to bind() an autobound method; we effectively will // ignore the value of "this" that the user is trying to use, so // let's warn. if (newThis !== component && newThis !== null) { ("production" !== process.env.NODE_ENV ? warning( false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName ) : null); } else if (!args.length) { ("production" !== process.env.NODE_ENV ? warning( false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName ) : null); return boundMethod; } var reboundMethod = _bind.apply(boundMethod, arguments); reboundMethod.__reactBoundContext = component; reboundMethod.__reactBoundMethod = method; reboundMethod.__reactBoundArguments = args; return reboundMethod; /* eslint-enable */ }; } return boundMethod; } /** * Binds all auto-bound methods in a component. * * @param {object} component Component whose method is going to be bound. */ function bindAutoBindMethods(component) { for (var autoBindKey in component.__reactAutoBindMap) { if (component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) { var method = component.__reactAutoBindMap[autoBindKey]; component[autoBindKey] = bindAutoBindMethod( component, ReactErrorUtils.guard( method, component.constructor.displayName + '.' + autoBindKey ) ); } } } var typeDeprecationDescriptor = { enumerable: false, get: function() { var displayName = this.displayName || this.name || 'Component'; ("production" !== process.env.NODE_ENV ? warning( false, '%s.type is deprecated. Use %s directly to access the class.', displayName, displayName ) : null); Object.defineProperty(this, 'type', { value: this }); return this; } }; /** * Add more to the ReactClass base class. These are all legacy features and * therefore not already part of the modern ReactComponent. */ var ReactClassMixin = { /** * TODO: This will be deprecated because state should always keep a consistent * type signature and the only use case for this, is to avoid that. */ replaceState: function(newState, callback) { ReactUpdateQueue.enqueueReplaceState(this, newState); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } }, /** * Checks whether or not this composite component is mounted. * @return {boolean} True if mounted, false otherwise. * @protected * @final */ isMounted: function() { if ("production" !== process.env.NODE_ENV) { var owner = ReactCurrentOwner.current; if (owner !== null) { ("production" !== process.env.NODE_ENV ? warning( owner._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component' ) : null); owner._warnedAboutRefsInRender = true; } } var internalInstance = ReactInstanceMap.get(this); return ( internalInstance && internalInstance !== ReactLifeCycle.currentlyMountingInstance ); }, /** * Sets a subset of the props. * * @param {object} partialProps Subset of the next props. * @param {?function} callback Called after props are updated. * @final * @public * @deprecated */ setProps: function(partialProps, callback) { ReactUpdateQueue.enqueueSetProps(this, partialProps); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } }, /** * Replace all the props. * * @param {object} newProps Subset of the next props. * @param {?function} callback Called after props are updated. * @final * @public * @deprecated */ replaceProps: function(newProps, callback) { ReactUpdateQueue.enqueueReplaceProps(this, newProps); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } } }; var ReactClassComponent = function() {}; assign( ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin ); /** * Module for creating composite components. * * @class ReactClass */ var ReactClass = { /** * Creates a composite component class given a class specification. * * @param {object} spec Class specification (which must define `render`). * @return {function} Component constructor function. * @public */ createClass: function(spec) { var Constructor = function(props, context) { // This constructor is overridden by mocks. The argument is used // by mocks to assert on what gets mounted. if ("production" !== process.env.NODE_ENV) { ("production" !== process.env.NODE_ENV ? warning( this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: http://fb.me/react-legacyfactory' ) : null); } // Wire up auto-binding if (this.__reactAutoBindMap) { bindAutoBindMethods(this); } this.props = props; this.context = context; this.state = null; // ReactClasses doesn't have constructors. Instead, they use the // getInitialState and componentWillMount methods for initialization. var initialState = this.getInitialState ? this.getInitialState() : null; if ("production" !== process.env.NODE_ENV) { // We allow auto-mocks to proceed as if they're returning null. if (typeof initialState === 'undefined' && this.getInitialState._isMockFunction) { // This is probably bad practice. Consider warning here and // deprecating this convenience. initialState = null; } } ("production" !== process.env.NODE_ENV ? invariant( typeof initialState === 'object' && !Array.isArray(initialState), '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent' ) : invariant(typeof initialState === 'object' && !Array.isArray(initialState))); this.state = initialState; }; Constructor.prototype = new ReactClassComponent(); Constructor.prototype.constructor = Constructor; injectedMixins.forEach( mixSpecIntoComponent.bind(null, Constructor) ); mixSpecIntoComponent(Constructor, spec); // Initialize the defaultProps property after all mixins have been merged if (Constructor.getDefaultProps) { Constructor.defaultProps = Constructor.getDefaultProps(); } if ("production" !== process.env.NODE_ENV) { // This is a tag to indicate that the use of these method names is ok, // since it's used with createClass. If it's not, then it's likely a // mistake so we'll warn you to use the static property, property // initializer or constructor respectively. if (Constructor.getDefaultProps) { Constructor.getDefaultProps.isReactClassApproved = {}; } if (Constructor.prototype.getInitialState) { Constructor.prototype.getInitialState.isReactClassApproved = {}; } } ("production" !== process.env.NODE_ENV ? invariant( Constructor.prototype.render, 'createClass(...): Class specification must implement a `render` method.' ) : invariant(Constructor.prototype.render)); if ("production" !== process.env.NODE_ENV) { ("production" !== process.env.NODE_ENV ? warning( !Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component' ) : null); } // Reduce time spent doing lookups by setting these on the prototype. for (var methodName in ReactClassInterface) { if (!Constructor.prototype[methodName]) { Constructor.prototype[methodName] = null; } } // Legacy hook Constructor.type = Constructor; if ("production" !== process.env.NODE_ENV) { try { Object.defineProperty(Constructor, 'type', typeDeprecationDescriptor); } catch (x) { // IE will fail on defineProperty (es5-shim/sham too) } } return Constructor; }, injection: { injectMixin: function(mixin) { injectedMixins.push(mixin); } } }; module.exports = ReactClass; }).call(this,require('_process')) },{"./Object.assign":"/Users/alex/Projects/webdrop/node_modules/react/lib/Object.assign.js","./ReactComponent":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactComponent.js","./ReactCurrentOwner":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactCurrentOwner.js","./ReactElement":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactElement.js","./ReactErrorUtils":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactErrorUtils.js","./ReactInstanceMap":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactInstanceMap.js","./ReactLifeCycle":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactLifeCycle.js","./ReactPropTypeLocationNames":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactPropTypeLocationNames.js","./ReactPropTypeLocations":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactPropTypeLocations.js","./ReactUpdateQueue":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactUpdateQueue.js","./invariant":"/Users/alex/Projects/webdrop/node_modules/react/lib/invariant.js","./keyMirror":"/Users/alex/Projects/webdrop/node_modules/react/lib/keyMirror.js","./keyOf":"/Users/alex/Projects/webdrop/node_modules/react/lib/keyOf.js","./warning":"/Users/alex/Projects/webdrop/node_modules/react/lib/warning.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactComponent.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactComponent */ 'use strict'; var ReactUpdateQueue = require("./ReactUpdateQueue"); var invariant = require("./invariant"); var warning = require("./warning"); /** * Base class helpers for the updating state of a component. */ function ReactComponent(props, context) { this.props = props; this.context = context; } /** * Sets a subset of the state. Always use this to mutate * state. You should treat `this.state` as immutable. * * There is no guarantee that `this.state` will be immediately updated, so * accessing `this.state` after calling this method may return the old value. * * There is no guarantee that calls to `setState` will run synchronously, * as they may eventually be batched together. You can provide an optional * callback that will be executed when the call to setState is actually * completed. * * When a function is provided to setState, it will be called at some point in * the future (not synchronously). It will be called with the up to date * component arguments (state, props, context). These values can be different * from this.* because your function may be called after receiveProps but before * shouldComponentUpdate, and this new state, props, and context will not yet be * assigned to this. * * @param {object|function} partialState Next partial state or function to * produce next partial state to be merged with current state. * @param {?function} callback Called after state is updated. * @final * @protected */ ReactComponent.prototype.setState = function(partialState, callback) { ("production" !== process.env.NODE_ENV ? invariant( typeof partialState === 'object' || typeof partialState === 'function' || partialState == null, 'setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.' ) : invariant(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)); if ("production" !== process.env.NODE_ENV) { ("production" !== process.env.NODE_ENV ? warning( partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().' ) : null); } ReactUpdateQueue.enqueueSetState(this, partialState); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } }; /** * Forces an update. This should only be invoked when it is known with * certainty that we are **not** in a DOM transaction. * * You may want to call this when you know that some deeper aspect of the * component's state has changed but `setState` was not called. * * This will not invoke `shouldComponentUpdate`, but it will invoke * `componentWillUpdate` and `componentDidUpdate`. * * @param {?function} callback Called after update is complete. * @final * @protected */ ReactComponent.prototype.forceUpdate = function(callback) { ReactUpdateQueue.enqueueForceUpdate(this); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } }; /** * Deprecated APIs. These APIs used to exist on classic React classes but since * we would like to deprecate them, we're not going to move them over to this * modern base class. Instead, we define a getter that warns if it's accessed. */ if ("production" !== process.env.NODE_ENV) { var deprecatedAPIs = { getDOMNode: 'getDOMNode', isMounted: 'isMounted', replaceProps: 'replaceProps', replaceState: 'replaceState', setProps: 'setProps' }; var defineDeprecationWarning = function(methodName, displayName) { try { Object.defineProperty(ReactComponent.prototype, methodName, { get: function() { ("production" !== process.env.NODE_ENV ? warning( false, '%s(...) is deprecated in plain JavaScript React classes.', displayName ) : null); return undefined; } }); } catch (x) { // IE will fail on defineProperty (es5-shim/sham too) } }; for (var fnName in deprecatedAPIs) { if (deprecatedAPIs.hasOwnProperty(fnName)) { defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); } } } module.exports = ReactComponent; }).call(this,require('_process')) },{"./ReactUpdateQueue":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactUpdateQueue.js","./invariant":"/Users/alex/Projects/webdrop/node_modules/react/lib/invariant.js","./warning":"/Users/alex/Projects/webdrop/node_modules/react/lib/warning.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactComponentBrowserEnvironment.js":[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactComponentBrowserEnvironment */ /*jslint evil: true */ 'use strict'; var ReactDOMIDOperations = require("./ReactDOMIDOperations"); var ReactMount = require("./ReactMount"); /** * Abstracts away all functionality of the reconciler that requires knowledge of * the browser context. TODO: These callers should be refactored to avoid the * need for this injection. */ var ReactComponentBrowserEnvironment = { processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates, replaceNodeWithMarkupByID: ReactDOMIDOperations.dangerouslyReplaceNodeWithMarkupByID, /** * If a particular environment requires that some resources be cleaned up, * specify this in the injected Mixin. In the DOM, we would likely want to * purge any cached node ID lookups. * * @private */ unmountIDFromEnvironment: function(rootNodeID) { ReactMount.purgeID(rootNodeID); } }; module.exports = ReactComponentBrowserEnvironment; },{"./ReactDOMIDOperations":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactDOMIDOperations.js","./ReactMount":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactMount.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactComponentEnvironment.js":[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactComponentEnvironment */ 'use strict'; var invariant = require("./invariant"); var injected = false; var ReactComponentEnvironment = { /** * Optionally injectable environment dependent cleanup hook. (server vs. * browser etc). Example: A browser system caches DOM nodes based on component * ID and must remove that cache entry when this instance is unmounted. */ unmountIDFromEnvironment: null, /** * Optionally injectable hook for swapping out mount images in the middle of * the tree. */ replaceNodeWithMarkupByID: null, /** * Optionally injectable hook for processing a queue of child updates. Will * later move into MultiChildComponents. */ processChildrenUpdates: null, injection: { injectEnvironment: function(environment) { ("production" !== process.env.NODE_ENV ? invariant( !injected, 'ReactCompositeComponent: injectEnvironment() can only be called once.' ) : invariant(!injected)); ReactComponentEnvironment.unmountIDFromEnvironment = environment.unmountIDFromEnvironment; ReactComponentEnvironment.replaceNodeWithMarkupByID = environment.replaceNodeWithMarkupByID; ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates; injected = true; } } }; module.exports = ReactComponentEnvironment; }).call(this,require('_process')) },{"./invariant":"/Users/alex/Projects/webdrop/node_modules/react/lib/invariant.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactCompositeComponent.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactCompositeComponent */ 'use strict'; var ReactComponentEnvironment = require("./ReactComponentEnvironment"); var ReactContext = require("./ReactContext"); var ReactCurrentOwner = require("./ReactCurrentOwner"); var ReactElement = require("./ReactElement"); var ReactElementValidator = require("./ReactElementValidator"); var ReactInstanceMap = require("./ReactInstanceMap"); var ReactLifeCycle = require("./ReactLifeCycle"); var ReactNativeComponent = require("./ReactNativeComponent"); var ReactPerf = require("./ReactPerf"); var ReactPropTypeLocations = require("./ReactPropTypeLocations"); var ReactPropTypeLocationNames = require("./ReactPropTypeLocationNames"); var ReactReconciler = require("./ReactReconciler"); var ReactUpdates = require("./ReactUpdates"); var assign = require("./Object.assign"); var emptyObject = require("./emptyObject"); var invariant = require("./invariant"); var shouldUpdateReactComponent = require("./shouldUpdateReactComponent"); var warning = require("./warning"); function getDeclarationErrorAddendum(component) { var owner = component._currentElement._owner || null; if (owner) { var name = owner.getName(); if (name) { return ' Check the render method of `' + name + '`.'; } } return ''; } /** * ------------------ The Life-Cycle of a Composite Component ------------------ * * - constructor: Initialization of state. The instance is now retained. * - componentWillMount * - render * - [children's constructors] * - [children's componentWillMount and render] * - [children's componentDidMount] * - componentDidMount * * Update Phases: * - componentWillReceiveProps (only called if parent updated) * - shouldComponentUpdate * - componentWillUpdate * - render * - [children's constructors or receive props phases] * - componentDidUpdate * * - componentWillUnmount * - [children's componentWillUnmount] * - [children destroyed] * - (destroyed): The instance is now blank, released by React and ready for GC. * * ----------------------------------------------------------------------------- */ /** * An incrementing ID assigned to each component when it is mounted. This is * used to enforce the order in which `ReactUpdates` updates dirty components. * * @private */ var nextMountID = 1; /** * @lends {ReactCompositeComponent.prototype} */ var ReactCompositeComponentMixin = { /** * Base constructor for all composite component. * * @param {ReactElement} element * @final * @internal */ construct: function(element) { this._currentElement = element; this._rootNodeID = null; this._instance = null; // See ReactUpdateQueue this._pendingElement = null; this._pendingStateQueue = null; this._pendingReplaceState = false; this._pendingForceUpdate = false; this._renderedComponent = null; this._context = null; this._mountOrder = 0; this._isTopLevel = false; // See ReactUpdates and ReactUpdateQueue. this._pendingCallbacks = null; }, /** * Initializes the component, renders markup, and registers event listeners. * * @param {string} rootID DOM ID of the root node. * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction * @return {?string} Rendered markup to be inserted into the DOM. * @final * @internal */ mountComponent: function(rootID, transaction, context) { this._context = context; this._mountOrder = nextMountID++; this._rootNodeID = rootID; var publicProps = this._processProps(this._currentElement.props); var publicContext = this._processContext(this._currentElement._context); var Component = ReactNativeComponent.getComponentClassForElement( this._currentElement ); // Initialize the public class var inst = new Component(publicProps, publicContext); if ("production" !== process.env.NODE_ENV) { // This will throw later in _renderValidatedComponent, but add an early // warning now to help debugging ("production" !== process.env.NODE_ENV ? warning( inst.render != null, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render` in your ' + 'component or you may have accidentally tried to render an element ' + 'whose type is a function that isn\'t a React component.', Component.displayName || Component.name || 'Component' ) : null); } // These should be set up in the constructor, but as a convenience for // simpler class abstractions, we set them up after the fact. inst.props = publicProps; inst.context = publicContext; inst.refs = emptyObject; this._instance = inst; // Store a reference from the instance back to the internal representation ReactInstanceMap.set(inst, this); if ("production" !== process.env.NODE_ENV) { this._warnIfContextsDiffer(this._currentElement._context, context); } if ("production" !== process.env.NODE_ENV) { // Since plain JS classes are defined without any special initialization // logic, we can not catch common errors early. Therefore, we have to // catch them here, at initialization time, instead. ("production" !== process.env.NODE_ENV ? warning( !inst.getInitialState || inst.getInitialState.isReactClassApproved, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component' ) : null); ("production" !== process.env.NODE_ENV ? warning( !inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component' ) : null); ("production" !== process.env.NODE_ENV ? warning( !inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component' ) : null); ("production" !== process.env.NODE_ENV ? warning( typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', (this.getName() || 'A component') ) : null); } var initialState = inst.state; if (initialState === undefined) { inst.state = initialState = null; } ("production" !== process.env.NODE_ENV ? invariant( typeof initialState === 'object' && !Array.isArray(initialState), '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent' ) : invariant(typeof initialState === 'object' && !Array.isArray(initialState))); this._pendingStateQueue = null; this._pendingReplaceState = false; this._pendingForceUpdate = false; var renderedElement; var previouslyMounting = ReactLifeCycle.currentlyMountingInstance; ReactLifeCycle.currentlyMountingInstance = this; try { if (inst.componentWillMount) { inst.componentWillMount(); // When mounting, calls to `setState` by `componentWillMount` will set // `this._pendingStateQueue` without triggering a re-render. if (this._pendingStateQueue) { inst.state = this._processPendingState(inst.props, inst.context); } } renderedElement = this._renderValidatedComponent(); } finally { ReactLifeCycle.currentlyMountingInstance = previouslyMounting; } this._renderedComponent = this._instantiateReactComponent( renderedElement, this._currentElement.type // The wrapping type ); var markup = ReactReconciler.mountComponent( this._renderedComponent, rootID, transaction, this._processChildContext(context) ); if (inst.componentDidMount) { transaction.getReactMountReady().enqueue(inst.componentDidMount, inst); } return markup; }, /** * Releases any resources allocated by `mountComponent`. * * @final * @internal */ unmountComponent: function() { var inst = this._instance; if (inst.componentWillUnmount) { var previouslyUnmounting = ReactLifeCycle.currentlyUnmountingInstance; ReactLifeCycle.currentlyUnmountingInstance = this; try { inst.componentWillUnmount(); } finally { ReactLifeCycle.currentlyUnmountingInstance = previouslyUnmounting; } } ReactReconciler.unmountComponent(this._renderedComponent); this._renderedComponent = null; // Reset pending fields this._pendingStateQueue = null; this._pendingReplaceState = false; this._pendingForceUpdate = false; this._pendingCallbacks = null; this._pendingElement = null; // These fields do not really need to be reset since this object is no // longer accessible. this._context = null; this._rootNodeID = null; // Delete the reference from the instance to this internal representation // which allow the internals to be properly cleaned up even if the user // leaks a reference to the public instance. ReactInstanceMap.remove(inst); // Some existing components rely on inst.props even after they've been // destroyed (in event handlers). // TODO: inst.props = null; // TODO: inst.state = null; // TODO: inst.context = null; }, /** * Schedule a partial update to the props. Only used for internal testing. * * @param {object} partialProps Subset of the next props. * @param {?function} callback Called after props are updated. * @final * @internal */ _setPropsInternal: function(partialProps, callback) { // This is a deoptimized path. We optimize for always having an element. // This creates an extra internal element. var element = this._pendingElement || this._currentElement; this._pendingElement = ReactElement.cloneAndReplaceProps( element, assign({}, element.props, partialProps) ); ReactUpdates.enqueueUpdate(this, callback); }, /** * Filters the context object to only contain keys specified in * `contextTypes` * * @param {object} context * @return {?object} * @private */ _maskContext: function(context) { var maskedContext = null; // This really should be getting the component class for the element, // but we know that we're not going to need it for built-ins. if (typeof this._currentElement.type === 'string') { return emptyObject; } var contextTypes = this._currentElement.type.contextTypes; if (!contextTypes) { return emptyObject; } maskedContext = {}; for (var contextName in contextTypes) { maskedContext[contextName] = context[contextName]; } return maskedContext; }, /** * Filters the context object to only contain keys specified in * `contextTypes`, and asserts that they are valid. * * @param {object} context * @return {?object} * @private */ _processContext: function(context) { var maskedContext = this._maskContext(context); if ("production" !== process.env.NODE_ENV) { var Component = ReactNativeComponent.getComponentClassForElement( this._currentElement ); if (Component.contextTypes) { this._checkPropTypes( Component.contextTypes, maskedContext, ReactPropTypeLocations.context ); } } return maskedContext; }, /** * @param {object} currentContext * @return {object} * @private */ _processChildContext: function(currentContext) { var inst = this._instance; var childContext = inst.getChildContext && inst.getChildContext(); if (childContext) { ("production" !== process.env.NODE_ENV ? invariant( typeof inst.constructor.childContextTypes === 'object', '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', this.getName() || 'ReactCompositeComponent' ) : invariant(typeof inst.constructor.childContextTypes === 'object')); if ("production" !== process.env.NODE_ENV) { this._checkPropTypes( inst.constructor.childContextTypes, childContext, ReactPropTypeLocations.childContext ); } for (var name in childContext) { ("production" !== process.env.NODE_ENV ? invariant( name in inst.constructor.childContextTypes, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name ) : invariant(name in inst.constructor.childContextTypes)); } return assign({}, currentContext, childContext); } return currentContext; }, /** * Processes props by setting default values for unspecified props and * asserting that the props are valid. Does not mutate its argument; returns * a new props object with defaults merged in. * * @param {object} newProps * @return {object} * @private */ _processProps: function(newProps) { if ("production" !== process.env.NODE_ENV) { var Component = ReactNativeComponent.getComponentClassForElement( this._currentElement ); if (Component.propTypes) { this._checkPropTypes( Component.propTypes, newProps, ReactPropTypeLocations.prop ); } } return newProps; }, /** * Assert that the props are valid * * @param {object} propTypes Map of prop name to a ReactPropType * @param {object} props * @param {string} location e.g. "prop", "context", "child context" * @private */ _checkPropTypes: function(propTypes, props, location) { // TODO: Stop validating prop types here and only use the element // validation. var componentName = this.getName(); for (var propName in propTypes) { if (propTypes.hasOwnProperty(propName)) { var error; try { // This is intentionally an invariant that gets caught. It's the same // behavior as without this statement except with a better message. ("production" !== process.env.NODE_ENV ? invariant( typeof propTypes[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually ' + 'from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName ) : invariant(typeof propTypes[propName] === 'function')); error = propTypes[propName](props, propName, componentName, location); } catch (ex) { error = ex; } if (error instanceof Error) { // We may want to extend this logic for similar errors in // React.render calls, so I'm abstracting it away into // a function to minimize refactoring in the future var addendum = getDeclarationErrorAddendum(this); if (location === ReactPropTypeLocations.prop) { // Preface gives us something to blacklist in warning module ("production" !== process.env.NODE_ENV ? warning( false, 'Failed Composite propType: %s%s', error.message, addendum ) : null); } else { ("production" !== process.env.NODE_ENV ? warning( false, 'Failed Context Types: %s%s', error.message, addendum ) : null); } } } } }, receiveComponent: function(nextElement, transaction, nextContext) { var prevElement = this._currentElement; var prevContext = this._context; this._pendingElement = null; this.updateComponent( transaction, prevElement, nextElement, prevContext, nextContext ); }, /** * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate` * is set, update the component. * * @param {ReactReconcileTransaction} transaction * @internal */ performUpdateIfNecessary: function(transaction) { if (this._pendingElement != null) { ReactReconciler.receiveComponent( this, this._pendingElement || this._currentElement, transaction, this._context ); } if (this._pendingStateQueue !== null || this._pendingForceUpdate) { if ("production" !== process.env.NODE_ENV) { ReactElementValidator.checkAndWarnForMutatedProps( this._currentElement ); } this.updateComponent( transaction, this._currentElement, this._currentElement, this._context, this._context ); } }, /** * Compare two contexts, warning if they are different * TODO: Remove this check when owner-context is removed */ _warnIfContextsDiffer: function(ownerBasedContext, parentBasedContext) { ownerBasedContext = this._maskContext(ownerBasedContext); parentBasedContext = this._maskContext(parentBasedContext); var parentKeys = Object.keys(parentBasedContext).sort(); var displayName = this.getName() || 'ReactCompositeComponent'; for (var i = 0; i < parentKeys.length; i++) { var key = parentKeys[i]; ("production" !== process.env.NODE_ENV ? warning( ownerBasedContext[key] === parentBasedContext[key], 'owner-based and parent-based contexts differ ' + '(values: `%s` vs `%s`) for key (%s) while mounting %s ' + '(see: http://fb.me/react-context-by-parent)', ownerBasedContext[key], parentBasedContext[key], key, displayName ) : null); } }, /** * Perform an update to a mounted component. The componentWillReceiveProps and * shouldComponentUpdate methods are called, then (assuming the update isn't * skipped) the remaining update lifecycle methods are called and the DOM * representation is updated. * * By default, this implements React's rendering and reconciliation algorithm. * Sophisticated clients may wish to override this. * * @param {ReactReconcileTransaction} transaction * @param {ReactElement} prevParentElement * @param {ReactElement} nextParentElement * @internal * @overridable */ updateComponent: function( transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext ) { var inst = this._instance; var nextContext = inst.context; var nextProps = inst.props; // Distinguish between a props update versus a simple state update if (prevParentElement !== nextParentElement) { nextContext = this._processContext(nextParentElement._context); nextProps = this._processProps(nextParentElement.props); if ("production" !== process.env.NODE_ENV) { if (nextUnmaskedContext != null) { this._warnIfContextsDiffer( nextParentElement._context, nextUnmaskedContext ); } } // An update here will schedule an update but immediately set // _pendingStateQueue which will ensure that any state updates gets // immediately reconciled instead of waiting for the next batch. if (inst.componentWillReceiveProps) { inst.componentWillReceiveProps(nextProps, nextContext); } } var nextState = this._processPendingState(nextProps, nextContext); var shouldUpdate = this._pendingForceUpdate || !inst.shouldComponentUpdate || inst.shouldComponentUpdate(nextProps, nextState, nextContext); if ("production" !== process.env.NODE_ENV) { ("production" !== process.env.NODE_ENV ? warning( typeof shouldUpdate !== 'undefined', '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent' ) : null); } if (shouldUpdate) { this._pendingForceUpdate = false; // Will set `this.props`, `this.state` and `this.context`. this._performComponentUpdate( nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext ); } else { // If it's determined that a component should not update, we still want // to set props and state but we shortcut the rest of the update. this._currentElement = nextParentElement; this._context = nextUnmaskedContext; inst.props = nextProps; inst.state = nextState; inst.context = nextContext; } }, _processPendingState: function(props, context) { var inst = this._instance; var queue = this._pendingStateQueue; var replace = this._pendingReplaceState; this._pendingReplaceState = false; this._pendingStateQueue = null; if (!queue) { return inst.state; } var nextState = assign({}, replace ? queue[0] : inst.state); for (var i = replace ? 1 : 0; i < queue.length; i++) { var partial = queue[i]; assign( nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial ); } return nextState; }, /** * Merges new props and state, notifies delegate methods of update and * performs update. * * @param {ReactElement} nextElement Next element * @param {object} nextProps Next public object to set as properties. * @param {?object} nextState Next object to set as state. * @param {?object} nextContext Next public object to set as context. * @param {ReactReconcileTransaction} transaction * @param {?object} unmaskedContext * @private */ _performComponentUpdate: function( nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext ) { var inst = this._instance; var prevProps = inst.props; var prevState = inst.state; var prevContext = inst.context; if (inst.componentWillUpdate) { inst.componentWillUpdate(nextProps, nextState, nextContext); } this._currentElement = nextElement; this._context = unmaskedContext; inst.props = nextProps; inst.state = nextState; inst.context = nextContext; this._updateRenderedComponent(transaction, unmaskedContext); if (inst.componentDidUpdate) { transaction.getReactMountReady().enqueue( inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst ); } }, /** * Call the component's `render` method and update the DOM accordingly. * * @param {ReactReconcileTransaction} transaction * @internal */ _updateRenderedComponent: function(transaction, context) { var prevComponentInstance = this._renderedComponent; var prevRenderedElement = prevComponentInstance._currentElement; var nextRenderedElement = this._renderValidatedComponent(); if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) { ReactReconciler.receiveComponent( prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context) ); } else { // These two IDs are actually the same! But nothing should rely on that. var thisID = this._rootNodeID; var prevComponentID = prevComponentInstance._rootNodeID; ReactReconciler.unmountComponent(prevComponentInstance); this._renderedComponent = this._instantiateReactComponent( nextRenderedElement, this._currentElement.type ); var nextMarkup = ReactReconciler.mountComponent( this._renderedComponent, thisID, transaction, context ); this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup); } }, /** * @protected */ _replaceNodeWithMarkupByID: function(prevComponentID, nextMarkup) { ReactComponentEnvironment.replaceNodeWithMarkupByID( prevComponentID, nextMarkup ); }, /** * @protected */ _renderValidatedComponentWithoutOwnerOrContext: function() { var inst = this._instance; var renderedComponent = inst.render(); if ("production" !== process.env.NODE_ENV) { // We allow auto-mocks to proceed as if they're returning null. if (typeof renderedComponent === 'undefined' && inst.render._isMockFunction) { // This is probably bad practice. Consider warning here and // deprecating this convenience. renderedComponent = null; } } return renderedComponent; }, /** * @private */ _renderValidatedComponent: function() { var renderedComponent; var previousContext = ReactContext.current; ReactContext.current = this._processChildContext( this._currentElement._context ); ReactCurrentOwner.current = this; try { renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext(); } finally { ReactContext.current = previousContext; ReactCurrentOwner.current = null; } ("production" !== process.env.NODE_ENV ? invariant( // TODO: An `isValidNode` function would probably be more appropriate renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent), '%s.render(): A valid ReactComponent must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent' ) : invariant(// TODO: An `isValidNode` function would probably be more appropriate renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent))); return renderedComponent; }, /** * Lazily allocates the refs object and stores `component` as `ref`. * * @param {string} ref Reference name. * @param {component} component Component to store as `ref`. * @final * @private */ attachRef: function(ref, component) { var inst = this.getPublicInstance(); var refs = inst.refs === emptyObject ? (inst.refs = {}) : inst.refs; refs[ref] = component.getPublicInstance(); }, /** * Detaches a reference name. * * @param {string} ref Name to dereference. * @final * @private */ detachRef: function(ref) { var refs = this.getPublicInstance().refs; delete refs[ref]; }, /** * Get a text description of the component that can be used to identify it * in error messages. * @return {string} The name or null. * @internal */ getName: function() { var type = this._currentElement.type; var constructor = this._instance && this._instance.constructor; return ( type.displayName || (constructor && constructor.displayName) || type.name || (constructor && constructor.name) || null ); }, /** * Get the publicly accessible representation of this component - i.e. what * is exposed by refs and returned by React.render. Can be null for stateless * components. * * @return {ReactComponent} the public component instance. * @internal */ getPublicInstance: function() { return this._instance; }, // Stub _instantiateReactComponent: null }; ReactPerf.measureMethods( ReactCompositeComponentMixin, 'ReactCompositeComponent', { mountComponent: 'mountComponent', updateComponent: 'updateComponent', _renderValidatedComponent: '_renderValidatedComponent' } ); var ReactCompositeComponent = { Mixin: ReactCompositeComponentMixin }; module.exports = ReactCompositeComponent; }).call(this,require('_process')) },{"./Object.assign":"/Users/alex/Projects/webdrop/node_modules/react/lib/Object.assign.js","./ReactComponentEnvironment":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactComponentEnvironment.js","./ReactContext":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactContext.js","./ReactCurrentOwner":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactCurrentOwner.js","./ReactElement":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactElement.js","./ReactElementValidator":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactElementValidator.js","./ReactInstanceMap":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactInstanceMap.js","./ReactLifeCycle":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactLifeCycle.js","./ReactNativeComponent":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactNativeComponent.js","./ReactPerf":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactPerf.js","./ReactPropTypeLocationNames":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactPropTypeLocationNames.js","./ReactPropTypeLocations":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactPropTypeLocations.js","./ReactReconciler":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactReconciler.js","./ReactUpdates":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactUpdates.js","./emptyObject":"/Users/alex/Projects/webdrop/node_modules/react/lib/emptyObject.js","./invariant":"/Users/alex/Projects/webdrop/node_modules/react/lib/invariant.js","./shouldUpdateReactComponent":"/Users/alex/Projects/webdrop/node_modules/react/lib/shouldUpdateReactComponent.js","./warning":"/Users/alex/Projects/webdrop/node_modules/react/lib/warning.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactContext.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactContext */ 'use strict'; var assign = require("./Object.assign"); var emptyObject = require("./emptyObject"); var warning = require("./warning"); var didWarn = false; /** * Keeps track of the current context. * * The context is automatically passed down the component ownership hierarchy * and is accessible via `this.context` on ReactCompositeComponents. */ var ReactContext = { /** * @internal * @type {object} */ current: emptyObject, /** * Temporarily extends the current context while executing scopedCallback. * * A typical use case might look like * * render: function() { * var children = ReactContext.withContext({foo: 'foo'}, () => ( * * )); * return
{children}
; * } * * @param {object} newContext New context to merge into the existing context * @param {function} scopedCallback Callback to run with the new context * @return {ReactComponent|array} */ withContext: function(newContext, scopedCallback) { if ("production" !== process.env.NODE_ENV) { ("production" !== process.env.NODE_ENV ? warning( didWarn, 'withContext is deprecated and will be removed in a future version. ' + 'Use a wrapper component with getChildContext instead.' ) : null); didWarn = true; } var result; var previousContext = ReactContext.current; ReactContext.current = assign({}, previousContext, newContext); try { result = scopedCallback(); } finally { ReactContext.current = previousContext; } return result; } }; module.exports = ReactContext; }).call(this,require('_process')) },{"./Object.assign":"/Users/alex/Projects/webdrop/node_modules/react/lib/Object.assign.js","./emptyObject":"/Users/alex/Projects/webdrop/node_modules/react/lib/emptyObject.js","./warning":"/Users/alex/Projects/webdrop/node_modules/react/lib/warning.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactCurrentOwner.js":[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactCurrentOwner */ 'use strict'; /** * Keeps track of the current owner. * * The current owner is the component who should own any components that are * currently being constructed. * * The depth indicate how many composite components are above this render level. */ var ReactCurrentOwner = { /** * @internal * @type {ReactComponent} */ current: null }; module.exports = ReactCurrentOwner; },{}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactDOM.js":[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactDOM * @typechecks static-only */ 'use strict'; var ReactElement = require("./ReactElement"); var ReactElementValidator = require("./ReactElementValidator"); var mapObject = require("./mapObject"); /** * Create a factory that creates HTML tag elements. * * @param {string} tag Tag name (e.g. `div`). * @private */ function createDOMFactory(tag) { if ("production" !== process.env.NODE_ENV) { return ReactElementValidator.createFactory(tag); } return ReactElement.createFactory(tag); } /** * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes. * This is also accessible via `React.DOM`. * * @public */ var ReactDOM = mapObject({ a: 'a', abbr: 'abbr', address: 'address', area: 'area', article: 'article', aside: 'aside', audio: 'audio', b: 'b', base: 'base', bdi: 'bdi', bdo: 'bdo', big: 'big', blockquote: 'blockquote', body: 'body', br: 'br', button: 'button', canvas: 'canvas', caption: 'caption', cite: 'cite', code: 'code', col: 'col', colgroup: 'colgroup', data: 'data', datalist: 'datalist', dd: 'dd', del: 'del', details: 'details', dfn: 'dfn', dialog: 'dialog', div: 'div', dl: 'dl', dt: 'dt', em: 'em', embed: 'embed', fieldset: 'fieldset', figcaption: 'figcaption', figure: 'figure', footer: 'footer', form: 'form', h1: 'h1', h2: 'h2', h3: 'h3', h4: 'h4', h5: 'h5', h6: 'h6', head: 'head', header: 'header', hr: 'hr', html: 'html', i: 'i', iframe: 'iframe', img: 'img', input: 'input', ins: 'ins', kbd: 'kbd', keygen: 'keygen', label: 'label', legend: 'legend', li: 'li', link: 'link', main: 'main', map: 'map', mark: 'mark', menu: 'menu', menuitem: 'menuitem', meta: 'meta', meter: 'meter', nav: 'nav', noscript: 'noscript', object: 'object', ol: 'ol', optgroup: 'optgroup', option: 'option', output: 'output', p: 'p', param: 'param', picture: 'picture', pre: 'pre', progress: 'progress', q: 'q', rp: 'rp', rt: 'rt', ruby: 'ruby', s: 's', samp: 'samp', script: 'script', section: 'section', select: 'select', small: 'small', source: 'source', span: 'span', strong: 'strong', style: 'style', sub: 'sub', summary: 'summary', sup: 'sup', table: 'table', tbody: 'tbody', td: 'td', textarea: 'textarea', tfoot: 'tfoot', th: 'th', thead: 'thead', time: 'time', title: 'title', tr: 'tr', track: 'track', u: 'u', ul: 'ul', 'var': 'var', video: 'video', wbr: 'wbr', // SVG circle: 'circle', defs: 'defs', ellipse: 'ellipse', g: 'g', line: 'line', linearGradient: 'linearGradient', mask: 'mask', path: 'path', pattern: 'pattern', polygon: 'polygon', polyline: 'polyline', radialGradient: 'radialGradient', rect: 'rect', stop: 'stop', svg: 'svg', text: 'text', tspan: 'tspan' }, createDOMFactory); module.exports = ReactDOM; }).call(this,require('_process')) },{"./ReactElement":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactElement.js","./ReactElementValidator":"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactElementValidator.js","./mapObject":"/Users/alex/Projects/webdrop/node_modules/react/lib/mapObject.js","_process":"/Users/alex/Projects/webdrop/node_modules/browserify/node_modules/process/browser.js"}],"/Users/alex/Projects/webdrop/node_modules/react/lib/ReactDOMButton.js":[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactDOMButton */ 'use strict'; var AutoFocusMixin = require("./AutoFocusMixin"); var ReactBrowserComponentMixin = require("./ReactBrowserComponentMixin"); var ReactClass = require("./ReactClass"); var ReactElement = require("./ReactElement"); var keyMirror = require("./keyMirror"); var button = ReactElement.createFactory('button'); var mouseListenerNames = keyMirror({ onClick: true, onDoubleClick: true, onMouseDown: true, onMouseMove: true, onMouseUp: true, onClickCapture: true, onDoubleClickCapture: true, onMouseDownCapture: true, onMouseMoveCapture: true, onMouseUpCapture: true }); /** * Implements a