gristlabs_grist-core/app/server/lib/sandboxUtil.js

59 lines
2.0 KiB
JavaScript
Raw Normal View History

/**
* Various utilities and constants for communicating with the python sandbox.
*/
var MemBuffer = require('app/common/MemBuffer');
var log = require('./log');
/**
* SandboxError is an error type for reporting errors forwarded from the sandbox.
*/
function SandboxError(message) {
// Poorly documented node feature, required to make the derived error keep a proper stack trace.
Error.captureStackTrace(this, this.constructor);
this.name = 'SandboxError';
this.message = "[Sandbox] " + (message || 'Python reported an error');
}
SandboxError.prototype = new Error();
// We need to set the .constructor property for Error.captureStackTrace to work correctly.
SandboxError.prototype.constructor = SandboxError;
exports.SandboxError = SandboxError;
/**
* Special msgCode values that precede msgBody to indicate what kind of message it is.
* These all cost one byte. If we needed more, we should probably switch to a number (5 bytes)
* CALL = call to the other side. The data must be an array of [func_name, arguments...]
* DATA = data must be a value to return to a call from the other side
* EXC = data must be an exception to return to a call from the other side
*/
exports.CALL = null;
exports.DATA = true;
exports.EXC = false;
/**
* Returns a function that takes data buffers and logs them to log.info() with the given prefix.
* The logged output is line-oriented, so that the prefix is only inserted at the start of a line.
* Binary data is encoded as with JSON.stringify.
*/
function makeLinePrefixer(prefix, logMeta) {
var partial = '';
return data => {
partial += MemBuffer.arrayToString(data);
var newline;
while ((newline = partial.indexOf("\n")) !== -1) {
var line = partial.slice(0, newline);
partial = partial.slice(newline + 1);
// Escape some parts of the string by serializing it to JSON (without the quotes).
log.rawInfo(prefix + JSON.stringify(line).slice(1, -1).replace(/\\"/g, '"')
.replace(/\\\\/g, '\\'),
logMeta);
}
};
}
exports.makeLinePrefixer = makeLinePrefixer;