1
0
Fork 0

Epic terminal complete!

pull/2/head
Ambrose Chua 2018-03-12 00:15:39 +09:00
parent d3424662fd
commit 812130e22a
9 changed files with 20063 additions and 56 deletions

View File

@ -50,9 +50,9 @@ file-manager
Options are currently only suppliable via ENV variables.
### ENABLE_SHELL=
### SHELL=
Set to `true` to enable remote command execution. Be careful when enabling this feature.
Set to `login` to enable accessing a login shell, or your shell binary (example: `bash`). Be careful when enabling this feature.
### PORT=

19633
assets/hterm_all.js Normal file

File diff suppressed because it is too large Load Diff

93
assets/shell.js Normal file
View File

@ -0,0 +1,93 @@
/* jshint esversion: 6 */
$(document).ready(() => {
let $shell = $("#shell");
if (!$shell) {
return;
}
let closeTimeout = null;
// excerpt from wetty
let socket = io("?path=" + encodeURIComponent($shell.data("path")));
let term = null;
let buf = "";
function Wetty(argv) {
this.argv_ = argv;
this.io = null;
this.pid_ = -1;
}
Wetty.prototype.run = function () {
this.io = this.argv_.io.push();
this.io.onVTKeystroke = this.sendString_.bind(this);
this.io.sendString = this.sendString_.bind(this);
this.io.onTerminalResize = this.onTerminalResize.bind(this);
};
Wetty.prototype.sendString_ = function (str) {
socket.emit("input", str);
// cancel close timeout
if (closeTimeout != null) {
clearTimeout(closeTimeout);
term.io.writeUTF16("\r\nkeyboard input detected. timeout canceled");
closeTimeout = null;
}
};
Wetty.prototype.onTerminalResize = function (col, row) {
socket.emit("resize", { col: col, row: row });
};
socket.on("connect", () => {
console.log("socket.io connection established");
lib.init(() => {
hterm.defaultStorage = new lib.Storage.Local();
term = new hterm.Terminal();
window.term = term;
term.decorate(document.getElementById("shell"));
// force custom size
$shell.find("iframe").css("height", "calc(100% - 52px * 2)");
term.setCursorPosition(0, 0);
term.setCursorVisible(true);
term.prefs_.set("ctrl-c-copy", true);
term.prefs_.set("ctrl-v-paste", true);
term.prefs_.set("use-default-window-copy", true);
term.runCommandClass(Wetty);
socket.emit("resize", {
col: term.screenSize.width,
row: term.screenSize.height,
});
if (buf && buf != "") {
term.io.writeUTF16(buf);
buf = "";
}
});
});
socket.on("output", (data) => {
if (!term) {
buf += data;
return;
}
term.io.writeUTF16(data);
});
socket.on("disconnect", () => {
console.log("socket.io connection closed");
});
// end excerpt from wetty
socket.on("disconnect", () => {
term.io.writeUTF16("\r\n\r\nclosing shell in 2 seconds...");
closeTimeout = setTimeout(() => {
window.location.pathname = window.location.pathname.replace("@shell", "");
}, 2000);
});
});

144
index.js
View File

@ -22,6 +22,7 @@ const path = require("path");
const filesize = require("filesize");
let app = express();
let http = app.listen(process.env.PORT || 8080);
app.set("views", path.join(__dirname, "views"));
app.engine("handlebars", hbs({
@ -72,10 +73,10 @@ app.get("/@logout", (req, res) => {
req.session.login = false;
req.flash("success", "Signed out.");
res.redirect("/@login");
return
return
}
req.flash("error", "You were never logged in...");
res.redirect("back");
req.flash("error", "You were never logged in...");
res.redirect("back");
});
app.get("/@login", (req, res) => {
@ -87,10 +88,10 @@ app.post("/@login", (req, res) => {
if (pass) {
req.session.login = true;
res.redirect("/");
return;
return;
}
req.flash("error", "Bad token.");
res.redirect("/@login");
req.flash("error", "Bad token.");
res.redirect("/@login");
});
app.use((req, res, next) => {
@ -100,8 +101,8 @@ app.use((req, res, next) => {
if (req.session.login === true) {
return next();
}
req.flash("error", "Please sign in.");
res.redirect("/@login");
req.flash("error", "Please sign in.");
res.redirect("/@login");
});
function relative(...paths) {
@ -130,7 +131,7 @@ app.all("/*", (req, res, next) => {
res.filename = req.params[0];
let fileExists = new Promise((resolve, reject) => {
// Check if file exists
// check if file exists
fs.stat(relative(res.filename), (err, stats) => {
if (err) {
return reject(err);
@ -148,7 +149,7 @@ app.all("/*", (req, res, next) => {
});
});
// Currently unused
// currently unused
app.put("/*", (req, res) => {
if (res.stats.error) {
req.busboy.on("file", (key, file, filename) => {
@ -203,7 +204,7 @@ app.post("/*@upload", (req, res) => {
return res.status(400).end();
}
let fileExists = new Promise((resolve, reject) => {
// Check if file exists
// check if file exists
fs.stat(relative(res.filename, saveas), (err, stats) => {
if (err) {
return reject(err);
@ -265,7 +266,7 @@ app.post("/*@mkdir", (req, res) => {
if (err) {
req.flash("error", err);
res.redirect("back");
return;
return;
}
req.flash("success", "Folder created. ");
res.redirect("back");
@ -377,16 +378,90 @@ app.get("/*@download", (req, res) => {
zip.finalize();
}).catch((err) => {
console.log(err);
console.log(err);
req.flash("error", err);
res.redirect("back");
});
});
const shellable = process.env.SHELL != "false" && process.env.SHELL;
if (shellable) {
const exec = process.env.SHELL == "login" ? "/usr/bin/env" : process.env.SHELL;
const args = process.env.SHELL == "login" ? ["login"] : [];
const child_process = require("child_process");
// currently unused
app.post("/*@cmd", (req, res) => {
res.filename = req.params[0];
let cmd = req.body.cmd;
if (!cmd || cmd.length < 1) {
return res.status(400).end();
}
child_process.exec(cmd, {
shell: shell,
cwd: res.filename,
timeout: 60 * 1000,
}, (err, stdout, stderr) => {
if (err) {
req.flash("error", "Command failed due to non-zero exit code");
}
res.render("cmd", flashify(req, {
path: res.filename,
cmd: cmd,
stdout: stdout,
stderr: stderr,
}));
});
});
const pty = require("pty.js");
const io = require("socket.io")(http);
app.get("/*@shell", (req, res) => {
res.filename = req.params[0];
res.render("shell", flashify(req, {
path: res.filename,
}));
});
io.on("connection", (socket) => {
let cwd = socket.handshake.query.path;
let term = pty.spawn(exec, args, {
name: "xterm-256color",
cols: 80,
rows: 30,
cwd: cwd,
});
console.log("pid " + term.pid + " shell " + process.env.SHELL + " started in " + cwd);
term.on("data", (data) => {
socket.emit("output", data);
});
term.on("exit", (code) => {
console.log("pid " + term.pid + " ended")
socket.disconnect();
});
socket.on("resize", (data) => {
term.resize(data.col, data.row);
});
socket.on("input", (data) => {
term.write(data);
});
socket.on("disconnect", () => {
term.end();
});
});
}
app.get("/*", (req, res) => {
if (res.stats.error) {
res.render("list", flashify(req, {
shellable: shellable,
shellable: shellable,
path: res.filename,
errors: [
res.stats.error
@ -425,13 +500,13 @@ app.get("/*", (req, res) => {
Promise.all(promises).then((files) => {
res.render("list", flashify(req, {
shellable: shellable,
shellable: shellable,
path: res.filename,
files: files,
}));
}).catch((err) => {
res.render("list", flashify(req, {
shellable: shellable,
shellable: shellable,
path: res.filename,
errors: [
err
@ -440,7 +515,7 @@ app.get("/*", (req, res) => {
});
}).catch((err) => {
res.render("list", flashify(req, {
shellable: shellable,
shellable: shellable,
path: res.filename,
errors: [
err
@ -453,38 +528,3 @@ app.get("/*", (req, res) => {
}
});
// shell
const shellable = process.env.ENABLE_SHELL == "true" ? true : false;
if (shellable) {
const child_process = require("child_process");
app.post("/*@cmd", (req, res) => {
res.filename = req.params[0];
let cmd = req.body.cmd;
if (!cmd || cmd.length < 1) {
return res.status(400).end();
}
child_process.exec(cmd, {
cwd: res.filename,
timeout: 60 * 1000,
}, (err, stdout, stderr) => {
if (err) {
req.flash("error", "Command failed due to non-zero exit code");
}
res.render("cmd", flashify(req, {
path: res.filename,
cmd: cmd,
stdout: stdout,
stderr: stderr,
}));
});
});
}
// startup
app.listen(process.env.PORT || 8080);

View File

@ -18,6 +18,8 @@
"jquery": "^3.1.1",
"notp": "^2.0.3",
"octicons": "^4.4.0",
"pty.js": "^0.3.1",
"socket.io": "^2.0.4",
"thirty-two": "^1.0.2"
}
}

View File

@ -18,6 +18,10 @@
<link rel="stylesheet" href="/assets/login.css" />
<script src="/assets/login.js"></script>
<link rel="stylesheet" href="/assets/cmd.css" />
<link rel="stylesheet" href="/assets/shell.css" />
<script src="/socket.io/socket.io.js"></script>
<script src="/assets/hterm_all.js"></script>
<script src="/assets/shell.js"></script>
</head>
<body>
{{{body}}}

View File

@ -9,9 +9,13 @@
New folder
</a>
{{#if shellable}}
<a class="btn btn-warning" href="@cmd" data-toggle="modal" data-target="#cmd">
{{!-- <a class="btn btn-warning" href="@cmd" data-toggle="modal" data-target="#cmd">
<span class="octicon octicon-terminal"></span>
Run command
</a> --}}
<a class="btn btn-warning" href="@shell">
<span class="octicon octicon-terminal"></span>
Open shell
</a>
{{/if}}
</div>

18
views/shell.handlebars Normal file
View File

@ -0,0 +1,18 @@
{{> navbar}}
<div style="padding-top: 56px; padding-bottom: 56px;">
<main id="shell" data-path="/{{path}}"></main>
</div>
<nav class="navbar navbar-light bg-light fixed-bottom justify-content-between">
<div class="btn-group mr-auto" role="group">
<a class="btn btn-primary" href="/{{path}}">
<span class="octicon octicon-chevron-left"></span>
Close shell
</a>
<a class="btn btn-warning" href="@shell" target="_blank">
<span class="octicon octicon-terminal"></span>
New shell
</a>
</div>
</nav>

215
yarn.lock
View File

@ -9,6 +9,10 @@ accepts@~1.3.4:
mime-types "~2.1.18"
negotiator "0.6.1"
after@0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
align-text@^0.1.1, align-text@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@ -50,10 +54,18 @@ array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
arraybuffer.slice@~0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
asap@~2.0.3:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
async-limiter@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
async@^1.4.0:
version "1.5.2"
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
@ -64,16 +76,38 @@ async@^2.0.0:
dependencies:
lodash "^4.14.0"
backo2@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
base64-arraybuffer@0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
base64id@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
better-assert@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
dependencies:
callsite "1.0.0"
bl@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
dependencies:
readable-stream "^2.0.5"
blob@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
body-parser@1.18.2, body-parser@^1.15.2:
version "1.18.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
@ -115,6 +149,10 @@ bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
callsite@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
camelcase@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
@ -134,6 +172,18 @@ cliui@^2.1.0:
right-align "^0.1.1"
wordwrap "0.0.2"
component-bind@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
component-emitter@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
component-inherit@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
compress-commons@^1.2.0:
version "1.2.2"
resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f"
@ -192,12 +242,18 @@ crc@^3.4.4:
version "3.5.0"
resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964"
debug@2.6.9:
debug@2.6.9, debug@~2.6.4, debug@~2.6.6:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
ms "2.0.0"
debug@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"
decamelize@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@ -242,6 +298,45 @@ end-of-stream@^1.0.0:
dependencies:
once "^1.4.0"
engine.io-client@~3.1.0:
version "3.1.6"
resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.6.tgz#5bdeb130f8b94a50ac5cbeb72583e7a4a063ddfd"
dependencies:
component-emitter "1.2.1"
component-inherit "0.0.3"
debug "~3.1.0"
engine.io-parser "~2.1.1"
has-cors "1.1.0"
indexof "0.0.1"
parseqs "0.0.5"
parseuri "0.0.5"
ws "~3.3.1"
xmlhttprequest-ssl "~1.5.4"
yeast "0.1.2"
engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196"
dependencies:
after "0.8.2"
arraybuffer.slice "~0.0.7"
base64-arraybuffer "0.1.5"
blob "0.0.4"
has-binary2 "~1.0.2"
engine.io@~3.1.0:
version "3.1.5"
resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.1.5.tgz#0e7ef9d690eb0b35597f1d4ad02a26ca2dba3845"
dependencies:
accepts "~1.3.4"
base64id "1.0.0"
cookie "0.3.1"
debug "~3.1.0"
engine.io-parser "~2.1.0"
ws "~3.3.1"
optionalDependencies:
uws "~9.14.0"
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@ -309,6 +404,10 @@ express@^4.14.0:
utils-merge "1.0.1"
vary "~1.1.2"
extend@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-1.2.1.tgz#a0f5fd6cfc83a5fe49ef698d60ec8a624dd4576c"
filesize@^3.3.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa"
@ -380,6 +479,16 @@ handlebars@^4.0.5:
optionalDependencies:
uglify-js "^2.6"
has-binary2@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.2.tgz#e83dba49f0b9be4d026d27365350d9f03f54be98"
dependencies:
isarray "2.0.1"
has-cors@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
has-symbols@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
@ -397,6 +506,10 @@ iconv-lite@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
indexof@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@ -420,6 +533,10 @@ isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
isarray@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@ -492,6 +609,10 @@ ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
nan@2.3.5:
version "2.3.5"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.3.5.tgz#822a0dc266290ce4cd3a12282ca3e7e364668a08"
negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
@ -506,6 +627,10 @@ notp@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/notp/-/notp-2.0.3.tgz#a9fd11e25cfe1ccb39fc6689544ee4c10ef9a577"
object-component@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
object-keys@^1.0.11, object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
@ -546,6 +671,18 @@ optimist@^0.6.1:
minimist "~0.0.1"
wordwrap "~0.0.2"
parseqs@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
dependencies:
better-assert "~1.0.0"
parseuri@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
dependencies:
better-assert "~1.0.0"
parseurl@~1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
@ -575,6 +712,13 @@ proxy-addr@~2.0.2:
forwarded "~0.1.2"
ipaddr.js "1.6.0"
pty.js@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/pty.js/-/pty.js-0.3.1.tgz#81f5bed332d6e5e7ab685688d1ba0373410d51b5"
dependencies:
extend "~1.2.1"
nan "2.3.5"
qs@6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
@ -670,6 +814,47 @@ setprototypeof@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
socket.io-adapter@~1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
socket.io-client@2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.4.tgz#0918a552406dc5e540b380dcd97afc4a64332f8e"
dependencies:
backo2 "1.0.2"
base64-arraybuffer "0.1.5"
component-bind "1.0.0"
component-emitter "1.2.1"
debug "~2.6.4"
engine.io-client "~3.1.0"
has-cors "1.1.0"
indexof "0.0.1"
object-component "0.0.3"
parseqs "0.0.5"
parseuri "0.0.5"
socket.io-parser "~3.1.1"
to-array "0.1.4"
socket.io-parser@~3.1.1:
version "3.1.3"
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.1.3.tgz#ed2da5ee79f10955036e3da413bfd7f1e4d86c8e"
dependencies:
component-emitter "1.2.1"
debug "~3.1.0"
has-binary2 "~1.0.2"
isarray "2.0.1"
socket.io@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.0.4.tgz#c1a4590ceff87ecf13c72652f046f716b29e6014"
dependencies:
debug "~2.6.6"
engine.io "~3.1.0"
socket.io-adapter "~1.1.0"
socket.io-client "2.0.4"
socket.io-parser "~3.1.1"
source-map@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
@ -715,6 +900,10 @@ thirty-two@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a"
to-array@0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
type-is@~1.6.15:
version "1.6.16"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
@ -741,6 +930,10 @@ uid-safe@~2.1.5:
dependencies:
random-bytes "~1.0.0"
ultron@~1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@ -753,6 +946,10 @@ utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
uws@~9.14.0:
version "9.14.0"
resolved "https://registry.yarnpkg.com/uws/-/uws-9.14.0.tgz#fac8386befc33a7a3705cbd58dc47b430ca4dd95"
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@ -777,6 +974,18 @@ wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
ws@~3.3.1:
version "3.3.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
dependencies:
async-limiter "~1.0.0"
safe-buffer "~5.1.0"
ultron "~1.1.0"
xmlhttprequest-ssl@~1.5.4:
version "1.5.5"
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
@ -790,6 +999,10 @@ yargs@~3.10.0:
decamelize "^1.0.0"
window-size "0.1.0"
yeast@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
zip-stream@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"