mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
b57a211741
Summary: - Also converted sandboxUtil to typescript. - The issue with %s manifested when a Python traceback contained "%s" in the string; in that case the object with log metadata (e.g. docId) would confusingly replace %s as if it were part of the message from Python. Test Plan: Added a test case for the fix. Reviewers: alexmojaki Reviewed By: alexmojaki Differential Revision: https://phab.getgrist.com/D3486
50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
/**
|
|
* Various utilities and constants for communicating with the python sandbox.
|
|
*/
|
|
import * as MemBuffer from 'app/common/MemBuffer';
|
|
import * as log from 'app/server/lib/log';
|
|
|
|
|
|
/**
|
|
* SandboxError is an error type for reporting errors forwarded from the sandbox.
|
|
*/
|
|
export class SandboxError extends Error {
|
|
constructor(message: string) {
|
|
super("[Sandbox] " + (message || 'Python reported an error'));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 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
|
|
*/
|
|
export const CALL = null;
|
|
export const DATA = true;
|
|
export const 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.
|
|
*/
|
|
export function makeLinePrefixer(prefix: string, logMeta: object) {
|
|
let partial = '';
|
|
return (data: Uint8Array) => {
|
|
partial += MemBuffer.arrayToString(data);
|
|
let newline;
|
|
while ((newline = partial.indexOf("\n")) !== -1) {
|
|
const 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.origLog('info', "%s%s", prefix,
|
|
JSON.stringify(line).slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'),
|
|
logMeta);
|
|
}
|
|
};
|
|
}
|