49 lines
1.3 KiB
JavaScript
49 lines
1.3 KiB
JavaScript
#!/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 };
|