Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .npmrc

This file was deleted.

2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v20.17.0
v24.14.1
7 changes: 7 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
shiny-server 1.5.24
--------------------------------------------------------------------------------

* Upgrade to Node.js v24.14.1.

* Replace `http-proxy` dependency with `http-proxy-3`, a maintained fork.

shiny-server 1.5.23
--------------------------------------------------------------------------------

Expand Down
187 changes: 86 additions & 101 deletions lib/core/python.js
Original file line number Diff line number Diff line change
@@ -1,107 +1,92 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
};
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolvePython_p = resolvePython_p;
var fs_promises = require("fs/promises");
var fs = require("fs");
var path = require("path");
var Q = require("q");
var fsutil = require("./fsutil");
function resolvePython_p(pythonPath, baseDir) {
return __awaiter(this, void 0, Q.Promise, function () {
var stat, binPath, _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
if (!path.isAbsolute(pythonPath)) return [3 /*break*/, 10];
return [4 /*yield*/, fs_promises.stat(pythonPath)];
case 1:
stat = _b.sent();
if (!stat.isDirectory()) return [3 /*break*/, 3];
binPath = path.join(pythonPath, "bin", "python");
return [4 /*yield*/, fsutil.exists_p(binPath)];
case 2:
if (!(_b.sent())) {
throw new Error("The python path '".concat(pythonPath, "' does not contain bin/python"));
}
return [2 /*return*/, {
exec: binPath,
path_prepend: path.join(pythonPath, "bin"),
env: {
virtual_env: pythonPath,
pythonhome: null,
},
}];
case 3:
if (!stat.isFile()) return [3 /*break*/, 8];
_b.label = 4;
case 4:
_b.trys.push([4, 6, , 7]);
return [4 /*yield*/, fs_promises.access(pythonPath, fs.constants.X_OK)];
case 5:
_b.sent();
return [3 /*break*/, 7];
case 6:
_a = _b.sent();
throw new Error("Can't execute the specified python binary: '".concat(pythonPath, "'"));
case 7:
// Assume that a direct path to a "real" python was provided.
return [2 /*return*/, {
exec: pythonPath,
}];
case 8:
// Make compiler happy
throw new Error("The python path '".concat(pythonPath, "' is not a file, directory, or symbolic link"));
case 9: return [3 /*break*/, 14];
case 10:
if (!!pythonPath.includes(path.sep)) return [3 /*break*/, 11];
// Ideally, we would search the path now, but I think we have to wait until
// we've switched to the runAs user, in case their path is different
return [2 /*return*/, {
command: pythonPath,
}];
case 11:
if (!(baseDir && path.isAbsolute(baseDir !== null && baseDir !== void 0 ? baseDir : ""))) return [3 /*break*/, 13];
return [4 /*yield*/, resolvePython_p(path.resolve(baseDir, pythonPath))];
case 12: return [2 /*return*/, _b.sent()];
case 13: throw new Error("Invalid python path specified: ".concat(pythonPath));
case 14: return [2 /*return*/];
const fs_promises = __importStar(require("fs/promises"));
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const fsutil = require("./fsutil");
async function resolvePython_p(pythonPath, baseDir) {
if (path.isAbsolute(pythonPath)) {
let stat = await fs_promises.stat(pythonPath);
if (stat.isDirectory()) {
// virtualenv/venv support. Assume that the directory is a virtual
// environment directory. Add its bin directory to the path, clear
// $PYTHONHOME, and add $VIRTUAL_ENV.
// https://github.com/python/cpython/blob/d7a5aca982def155a9255893cefcc1493c127c9c/Lib/venv/scripts/common/activate#L38-L54
const binPath = path.join(pythonPath, "bin", "python");
if (!await fsutil.exists_p(binPath)) {
throw new Error(`The python path '${pythonPath}' does not contain bin/python`);
}
return {
exec: binPath,
path_prepend: path.join(pythonPath, "bin"),
env: {
virtual_env: pythonPath,
pythonhome: null,
},
};
}
else if (stat.isFile()) {
try {
await fs_promises.access(pythonPath, fs.constants.X_OK);
}
});
});
catch {
throw new Error(`Can't execute the specified python binary: '${pythonPath}'`);
}
// Assume that a direct path to a "real" python was provided.
return {
exec: pythonPath,
};
}
else {
// Make compiler happy
throw new Error(`The python path '${pythonPath}' is not a file, directory, or symbolic link`);
}
}
else if (!pythonPath.includes(path.sep)) {
// Ideally, we would search the path now, but I think we have to wait until
// we've switched to the runAs user, in case their path is different
return {
command: pythonPath,
};
}
else if (baseDir && path.isAbsolute(baseDir ?? "")) {
return await resolvePython_p(path.resolve(baseDir, pythonPath));
}
else {
throw new Error(`Invalid python path specified: ${pythonPath}`);
}
}
2 changes: 1 addition & 1 deletion lib/core/python.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ interface PythonEnv {
env?: Record<string, string | null>;
}

export async function resolvePython_p(pythonPath: string, baseDir?: string): Q.Promise<PythonEnv> {
export async function resolvePython_p(pythonPath: string, baseDir?: string): Promise<PythonEnv> {
if (path.isAbsolute(pythonPath)) {
let stat = await fs_promises.stat(pythonPath);
if (stat.isDirectory()) {
Expand Down
4 changes: 2 additions & 2 deletions lib/proxy/http.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*/
var http = require('http');
var util = require('util');
var http_proxy = require('http-proxy');
var http_proxy = require('http-proxy-3');
var qs = require('qs');
var Q = require('q');
var _ = require('underscore');
Expand Down Expand Up @@ -58,7 +58,7 @@ function error500(req, res, errorText, detail, templateDir, consoleLogFile, appS

// All the http_proxy events we know about. They have a frustrating habit of
// changing these around.
var knownEvents = exports.knownEvents = ['open', 'close', 'proxyReq', 'proxyRes', 'proxySocket',
var knownEvents = exports.knownEvents = ['open', 'close', 'proxyReq', 'proxyRes',
'start', 'end', 'error',
// Known, but undocumented
'econnreset',
Expand Down
2 changes: 1 addition & 1 deletion lib/router/directory-router.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ var { AppSpec } = require('../worker/app-spec');
var configRouterUtil = require('../router/config-router-util');
var appConfig = require('../config/app-config');

send.mime.define({'text/R': ['r']});
require('mime-types').types['r'] = 'text/R';

module.exports = DirectoryRouter;
/**
Expand Down
16 changes: 10 additions & 6 deletions lib/worker/app-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,26 @@
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.AppSpec = void 0;
var AppSpec = /** @class */ (function () {
function AppSpec(appDir, runAs, prefix, logDir, settings) {
class AppSpec {
appDir;
runAs;
prefix;
logDir;
settings;
constructor(appDir, runAs, prefix, logDir, settings) {
this.appDir = appDir;
this.runAs = runAs;
this.prefix = prefix;
this.logDir = logDir;
this.settings = settings;
}
AppSpec.prototype.getKey = function () {
getKey() {
return this.appDir + "\n" +
this.runAs + "\n" +
this.prefix + "\n" +
this.logDir + "\n" +
JSON.stringify(this.settings);
};
}
;
return AppSpec;
}());
}
exports.AppSpec = AppSpec;
Loading