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.
Files changed (2) hide show
  1. package/dist/session.js +18 -4
  2. 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 flushTimer = setInterval(() => void flush(), 120);
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
- clearInterval(flushTimer);
159
+ if (pendingFlush !== null)
160
+ clearTimeout(pendingFlush);
147
161
  clearInterval(heartbeat);
148
162
  await flush();
149
163
  stopMessages();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shellbase",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "내 컴퓨터 터미널(특히 Claude Code 세션)을 폰 브라우저로 실시간 접속하게 해주는 데스크톱 에이전트",
5
5
  "type": "module",
6
6
  "bin": {