shellbase 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/session.js +18 -4
- package/package.json +1 -1
package/dist/session.js
CHANGED
|
@@ -65,14 +65,21 @@ export async function startSession(options) {
|
|
|
65
65
|
env: process.env,
|
|
66
66
|
});
|
|
67
67
|
// PTY 출력은 모아서 전송 — 서버가 전송 속도를 최소 100ms 간격으로 제한해서(RATE_LIMITED), 그보다
|
|
68
|
-
// 짧은 간격으로 보내면 출력이 많은 순간(로그 스크롤 등)에 전송이 거부될 수 있음.
|
|
69
|
-
//
|
|
68
|
+
// 짧은 간격으로 보내면 출력이 많은 순간(로그 스크롤 등)에 전송이 거부될 수 있음. 그렇다고 매번
|
|
69
|
+
// 고정 간격을 기다리면 한두 글자짜리 출력도 불필요하게 지연되니, "마지막 전송 후 이 간격이
|
|
70
|
+
// 지났으면 바로 보내고, 아니면 그만큼만 기다렸다 모아서 보낸다" 방식으로 평소 지연은 최소화하고
|
|
71
|
+
// 출력이 몰릴 때만 자동으로 묶이게 한다.
|
|
72
|
+
const MIN_SEND_INTERVAL_MS = 120;
|
|
70
73
|
let outBuffer = '';
|
|
74
|
+
let lastSentAt = 0;
|
|
75
|
+
let pendingFlush = null;
|
|
71
76
|
const flush = async () => {
|
|
77
|
+
pendingFlush = null;
|
|
72
78
|
if (!outBuffer)
|
|
73
79
|
return;
|
|
74
80
|
const chunk = outBuffer;
|
|
75
81
|
outBuffer = '';
|
|
82
|
+
lastSentAt = Date.now();
|
|
76
83
|
try {
|
|
77
84
|
await channel.send({
|
|
78
85
|
kind: 'output',
|
|
@@ -84,12 +91,18 @@ export async function startSession(options) {
|
|
|
84
91
|
console.error('출력 전송 실패:', err.message);
|
|
85
92
|
}
|
|
86
93
|
};
|
|
87
|
-
const
|
|
94
|
+
const scheduleFlush = () => {
|
|
95
|
+
if (pendingFlush !== null)
|
|
96
|
+
return;
|
|
97
|
+
const wait = Math.max(0, MIN_SEND_INTERVAL_MS - (Date.now() - lastSentAt));
|
|
98
|
+
pendingFlush = setTimeout(() => void flush(), wait);
|
|
99
|
+
};
|
|
88
100
|
// 최근 출력을 조금 들고 있다가, 모바일이 (재)접속했을 때 놓친 화면 대신 다시 보여줌
|
|
89
101
|
let scrollback = '';
|
|
90
102
|
ptyProcess.onData((data) => {
|
|
91
103
|
outBuffer += data;
|
|
92
104
|
scrollback = (scrollback + data).slice(-SCROLLBACK_MAX);
|
|
105
|
+
scheduleFlush();
|
|
93
106
|
});
|
|
94
107
|
// 모바일이 접속을 시도하면 데스크톱에서 승인해야만 입력이 먹힘 (읽기/출력은 항상 흐름 —
|
|
95
108
|
// 이미 같은 계정으로 로그인했다는 전제이므로, 승인은 "지금 이 순간 내가 타이핑을 넘겨줄지"
|
|
@@ -143,7 +156,8 @@ export async function startSession(options) {
|
|
|
143
156
|
if (shuttingDown)
|
|
144
157
|
return;
|
|
145
158
|
shuttingDown = true;
|
|
146
|
-
|
|
159
|
+
if (pendingFlush !== null)
|
|
160
|
+
clearTimeout(pendingFlush);
|
|
147
161
|
clearInterval(heartbeat);
|
|
148
162
|
await flush();
|
|
149
163
|
stopMessages();
|