bookworm-smart-assistant/scripts/hook-stdin.js

49 lines
1.3 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/**
* 共享 stdin 读取模块 hooks 使用
* 用法:
* const { readStdin } = require('../scripts/hook-stdin.js');
* readStdin(MAX_SIZE).then(input => { ... }).catch(() => process.exit(0));
*/
'use strict';
/**
* 异步读取 stdin 并解析 JSON
* @param {number} maxSize - 最大允许大小 (字节)
* @returns {Promise<object>} 解析后的 JSON 对象
*/
function readStdin(maxSize = 512 * 1024) {
return new Promise((resolve, reject) => {
let raw = '';
process.stdin.setEncoding('utf8');
process.stdin.on('data', (chunk) => {
raw += chunk;
if (raw.length > maxSize) {
reject(new Error('stdin overflow: ' + raw.length + ' > ' + maxSize));
}
});
process.stdin.on('end', () => {
try {
resolve(JSON.parse(raw));
} catch (e) {
reject(e);
}
});
process.stdin.on('error', reject);
});
}
/**
* 同步风格的 stdin 读取 (回调模式, 兼容现有 hooks)
* @param {number} maxSize - 最大允许大小
* @param {function} callback - (error, input) => void
*/
function readStdinSync(maxSize, callback) {
readStdin(maxSize).then(
input => callback(null, input),
err => callback(err, null)
);
}
module.exports = { readStdin, readStdinSync };