Epic terminal complete!
parent
d3424662fd
commit
812130e22a
|
@ -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=
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
144
index.js
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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}}}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
215
yarn.lock
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue