Repository navigation
Expand file tree
/
Copy pathCodexAppServerClient.h
More file actions
78 lines (66 loc) · 2.66 KB
/
Copy pathCodexAppServerClient.h
File metadata and controls
78 lines (66 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#pragma once
#include <QObject>
#include <QProcess>
#include <QTimer>
#include <QHash>
#include <QDateTime>
#include <QJsonObject>
class CodexRateLimitModel;
class CodexAppServerClient : public QObject
{
Q_OBJECT
Q_PROPERTY(QString status READ status NOTIFY statusChanged)
Q_PROPERTY(QString lastError READ lastError NOTIFY lastErrorChanged)
Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
Q_PROPERTY(QDateTime lastUpdated READ lastUpdated NOTIFY lastUpdatedChanged)
Q_PROPERTY(int refreshSeconds READ refreshSeconds WRITE setRefreshSeconds NOTIFY refreshSecondsChanged)
public:
explicit CodexAppServerClient(CodexRateLimitModel *model, QObject *parent = nullptr);
QString status() const;
QString lastError() const { return tr(m_lastError.toUtf8().constData()); }
bool connected() const { return m_initialized && m_process.state() == QProcess::Running; }
QDateTime lastUpdated() const { return m_lastUpdated; }
int refreshSeconds() const { return m_refreshSeconds; }
void setRefreshSeconds(int seconds);
Q_INVOKABLE void start();
Q_INVOKABLE void stop();
Q_INVOKABLE void refresh();
signals:
void statusChanged();
void lastErrorChanged();
void connectedChanged();
void lastUpdatedChanged();
void refreshSecondsChanged();
private slots:
void onReadyReadStdout();
void onReadyReadStderr();
void onProcessError(QProcess::ProcessError error);
void onProcessFinished(int exitCode, QProcess::ExitStatus status);
private:
enum class RequestKind { Initialize, RateLimits };
qint64 sendRequest(const QString &method, const QJsonObject ¶ms = {}, bool includeParams = false);
void sendNotification(const QString &method, const QJsonObject ¶ms = {}, bool includeParams = false);
void writeJsonLine(const QJsonObject &object);
void processLine(const QByteArray &line);
void processMessage(const QJsonObject &message);
void handleResponse(qint64 id, const QJsonObject &message);
void handleNotification(const QString &method, const QJsonObject ¶ms);
void setStatus(const QString &status);
void setError(const QString &error);
QString resolveCodexProgram(QStringList &arguments) const;
void scheduleRestart();
CodexRateLimitModel *m_model = nullptr;
QProcess m_process;
QTimer m_refreshTimer;
QTimer m_restartTimer;
QByteArray m_stdoutBuffer;
QHash<qint64, RequestKind> m_pending;
qint64 m_nextId = 1;
bool m_initialized = false;
bool m_stopping = false;
int m_refreshSeconds = 60;
QString m_status = QStringLiteral("Idle");
QString m_lastError;
int m_exitCode = 0;
QDateTime m_lastUpdated;
};