Skip to content

Commit d581cd7

Browse files
Update update.sh
1 parent ef7afbe commit d581cd7

File tree

2 files changed

+49
-60
lines changed

2 files changed

+49
-60
lines changed

src/app/_components/VersionDisplay.tsx

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -98,28 +98,25 @@ export function VersionDisplay() {
9898
}
9999
});
100100

101-
// Subscribe to update progress
102-
api.version.streamUpdateProgress.useSubscription(undefined, {
101+
// Poll for update logs
102+
const { data: updateLogsData, refetch: refetchLogs } = api.version.getUpdateLogs.useQuery(undefined, {
103103
enabled: shouldSubscribe,
104-
onData: (data) => {
104+
refetchInterval: 1000, // Poll every second
105+
refetchIntervalInBackground: true,
106+
});
107+
108+
// Update logs when data changes
109+
useEffect(() => {
110+
if (updateLogsData?.success && updateLogsData.logs) {
105111
lastLogTimeRef.current = Date.now();
112+
setUpdateLogs(updateLogsData.logs);
106113

107-
if (data.type === 'log') {
108-
setUpdateLogs(prev => [...prev, data.message]);
109-
} else if (data.type === 'complete') {
114+
if (updateLogsData.isComplete) {
110115
setUpdateLogs(prev => [...prev, 'Update complete! Server restarting...']);
111116
setIsNetworkError(true);
112-
} else if (data.type === 'error') {
113-
setUpdateLogs(prev => [...prev, `Error: ${data.message}`]);
114117
}
115-
},
116-
onError: () => {
117-
// Connection lost - likely server restarted
118-
console.log('Update stream connection lost, server likely restarting');
119-
setIsNetworkError(true);
120-
setUpdateLogs(prev => [...prev, 'Connection lost - server restarting...']);
121-
},
122-
});
118+
}
119+
}, [updateLogsData]);
123120

124121
// Monitor for server connection loss and auto-reload
125122
useEffect(() => {

src/server/api/routers/version.ts

Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import { readFile, writeFile } from "fs/promises";
33
import { join } from "path";
44
import { spawn } from "child_process";
55
import { env } from "~/env";
6-
import { observable } from '@trpc/server/observable';
7-
import { existsSync, statSync, createWriteStream } from "fs";
6+
import { existsSync, createWriteStream } from "fs";
87

98
interface GitHubRelease {
109
tag_name: string;
@@ -127,52 +126,45 @@ export const versionRouter = createTRPCRouter({
127126
}
128127
}),
129128

130-
// Stream update progress by monitoring the log file
131-
streamUpdateProgress: publicProcedure
132-
.subscription(() => {
133-
return observable<{ type: 'log' | 'complete' | 'error'; message: string }>((emit) => {
129+
// Get update logs from the log file
130+
getUpdateLogs: publicProcedure
131+
.query(async () => {
132+
try {
134133
const logPath = join(process.cwd(), 'update.log');
135-
let lastSize = 0;
136-
137-
const checkLogFile = async () => {
138-
try {
139-
if (!existsSync(logPath)) {
140-
return;
141-
}
142-
143-
const stats = statSync(logPath);
144-
const currentSize = stats.size;
145-
146-
if (currentSize > lastSize) {
147-
// Read only the new content
148-
const fileHandle = await readFile(logPath, 'utf-8');
149-
const newContent = fileHandle.slice(lastSize);
150-
lastSize = currentSize;
151-
152-
// Emit new log lines
153-
const lines = newContent.split('\n').filter(line => line.trim());
154-
for (const line of lines) {
155-
emit.next({ type: 'log', message: line });
156-
}
157-
}
158-
} catch {
159-
// File might be being written to, ignore errors
160-
}
161-
};
162-
163-
// Start monitoring the log file
164-
const checkInterval = setInterval(() => {
165-
void checkLogFile();
166-
}, 500);
134+
135+
if (!existsSync(logPath)) {
136+
return {
137+
success: true,
138+
logs: [],
139+
isComplete: false
140+
};
141+
}
167142

168-
// Also check immediately
169-
void checkLogFile();
143+
const logs = await readFile(logPath, 'utf-8');
144+
const logLines = logs.split('\n').filter(line => line.trim());
145+
146+
// Check if update is complete by looking for completion indicators
147+
const isComplete = logLines.some(line =>
148+
line.includes('Update complete') ||
149+
line.includes('Server restarting') ||
150+
line.includes('npm start') ||
151+
line.includes('Restarting server')
152+
);
170153

171-
// Cleanup function
172-
return () => {
173-
clearInterval(checkInterval);
154+
return {
155+
success: true,
156+
logs: logLines,
157+
isComplete
174158
};
175-
});
159+
} catch (error) {
160+
console.error('Error reading update logs:', error);
161+
return {
162+
success: false,
163+
error: error instanceof Error ? error.message : 'Failed to read update logs',
164+
logs: [],
165+
isComplete: false
166+
};
167+
}
176168
}),
177169

178170
// Execute update script

0 commit comments

Comments
 (0)