Skip to content

Commit 3058ec1

Browse files
committed
feat(CORS): add CORS middleware to allow all origins and update ws URL handling for dev
1 parent c36128d commit 3058ec1

File tree

24 files changed

+534
-434
lines changed

24 files changed

+534
-434
lines changed

app/.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VITE_PROXY_TARGET=http://127.0.0.1:9000
1+
VITE_PROXY_TARGET=http://127.0.0.1:9001

app/pnpm-lock.yaml

Lines changed: 103 additions & 103 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/composables/useSSE.ts

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,40 @@ export interface SSEOptions {
1717
reconnectInterval?: number
1818
}
1919

20+
/**
21+
* Build SSE URL based on environment
22+
*/
23+
function buildSSEUrl(url: string): string {
24+
// In development mode, connect directly to backend server
25+
if (import.meta.env.DEV) {
26+
const proxyTarget = import.meta.env.VITE_PROXY_TARGET || 'http://localhost:9000'
27+
28+
return urlJoin(proxyTarget, url)
29+
}
30+
31+
// In production mode, use relative path
32+
return urlJoin(window.location.pathname, url)
33+
}
34+
2035
/**
2136
* SSE Composable
2237
* Provide the ability to create, manage, and automatically clean up SSE connections
2338
*/
2439
export function useSSE() {
2540
const sseInstance = shallowRef<SSE>()
41+
const reconnectTimer = shallowRef<ReturnType<typeof setTimeout>>()
42+
const isReconnecting = ref(false)
43+
const currentOptions = shallowRef<SSEOptions>()
44+
45+
/**
46+
* Clear reconnect timer
47+
*/
48+
function clearReconnectTimer() {
49+
if (reconnectTimer.value) {
50+
clearTimeout(reconnectTimer.value)
51+
reconnectTimer.value = undefined
52+
}
53+
}
2654

2755
/**
2856
* Connect to SSE service
@@ -36,7 +64,18 @@ export function useSSE() {
3664
reconnectInterval = 5000,
3765
} = options
3866

39-
const fullUrl = urlJoin(window.location.pathname, url)
67+
// Store current options for reconnection
68+
currentOptions.value = options
69+
70+
// Clear any existing reconnect timer
71+
clearReconnectTimer()
72+
73+
// Disconnect existing connection before creating new one
74+
if (sseInstance.value) {
75+
sseInstance.value.close()
76+
}
77+
78+
const fullUrl = buildSSEUrl(url)
4079

4180
const headers: Record<string, string> = {}
4281

@@ -58,6 +97,9 @@ export function useSSE() {
5897
return
5998
}
6099

100+
// Reset reconnecting state on successful message
101+
isReconnecting.value = false
102+
61103
try {
62104
const parsedData = parseData ? JSON.parse(e.data) : e.data
63105
onMessage?.(parsedData)
@@ -71,10 +113,19 @@ export function useSSE() {
71113
sse.onerror = () => {
72114
onError?.()
73115

74-
// Reconnect logic
75-
setTimeout(() => {
76-
connect(options)
77-
}, reconnectInterval)
116+
// Only attempt reconnection if not already reconnecting and we have current options
117+
if (!isReconnecting.value && currentOptions.value) {
118+
isReconnecting.value = true
119+
120+
// Clear any existing timer before setting new one
121+
clearReconnectTimer()
122+
123+
reconnectTimer.value = setTimeout(() => {
124+
if (currentOptions.value && isReconnecting.value) {
125+
connect(currentOptions.value)
126+
}
127+
}, reconnectInterval)
128+
}
78129
}
79130

80131
sseInstance.value = sse
@@ -85,6 +136,11 @@ export function useSSE() {
85136
* Disconnect SSE connection
86137
*/
87138
function disconnect() {
139+
// Clear reconnect timer and state
140+
clearReconnectTimer()
141+
isReconnecting.value = false
142+
currentOptions.value = undefined
143+
88144
if (sseInstance.value) {
89145
sseInstance.value.close()
90146
sseInstance.value = undefined
@@ -102,5 +158,6 @@ export function useSSE() {
102158
connect,
103159
disconnect,
104160
sseInstance,
161+
isReconnecting: readonly(isReconnecting),
105162
}
106163
}

app/src/language/ar/app.po

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ msgstr "لا يمكن المقارنة: المحتوى المفقود"
638638
msgid "Cannot delete protected path: {0}"
639639
msgstr "لا يمكن حذف المسار المحمي: {0}"
640640

641-
#: src/views/dashboard/NginxDashBoard.vue:129
641+
#: src/views/dashboard/NginxDashBoard.vue:134
642642
msgid "Cannot get performance data in this state"
643643
msgstr "لا يمكن الحصول على بيانات الأداء في هذه الحالة"
644644

@@ -1064,7 +1064,7 @@ msgstr "تأكيد كلمة المرور الجديدة"
10641064
msgid "Connected"
10651065
msgstr "متصل"
10661066

1067-
#: src/views/dashboard/NginxDashBoard.vue:82
1067+
#: src/views/dashboard/NginxDashBoard.vue:87
10681068
msgid "Connection error, trying to reconnect..."
10691069
msgstr "خطأ في الاتصال، جاري محاولة إعادة الاتصال..."
10701070

@@ -1723,7 +1723,7 @@ msgstr "فشل تمكين الدفق %{name} على %{node}"
17231723
msgid "Enable stream %{name} on %{node} successfully"
17241724
msgstr "تم تمكين الدفق %{name} على %{node} بنجاح"
17251725

1726-
#: src/views/dashboard/NginxDashBoard.vue:147
1726+
#: src/views/dashboard/NginxDashBoard.vue:152
17271727
msgid "Enable stub_status module"
17281728
msgstr "تمكين وحدة stub_status"
17291729

@@ -2306,7 +2306,7 @@ msgstr "توليد مفتاح خاص لتسجيل الحساب"
23062306
msgid "Get acme user error: {0}"
23072307
msgstr "خطأ في الحصول على مستخدم ACME: {0}"
23082308

2309-
#: src/views/dashboard/NginxDashBoard.vue:138
2309+
#: src/views/dashboard/NginxDashBoard.vue:143
23102310
msgid "Get data failed"
23112311
msgstr "فشل الحصول على البيانات"
23122312

@@ -2637,7 +2637,7 @@ msgstr "وقت آخر نسخة احتياطية"
26372637
msgid "Last checked at"
26382638
msgstr "آخر فحص في"
26392639

2640-
#: src/views/dashboard/NginxDashBoard.vue:113
2640+
#: src/views/dashboard/NginxDashBoard.vue:118
26412641
msgid "Last update"
26422642
msgstr "آخر تحديث"
26432643

@@ -2724,7 +2724,7 @@ msgstr "وقت توقف المحمل"
27242724
msgid "Loader Threshold"
27252725
msgstr "عتبة المحمل"
27262726

2727-
#: src/views/dashboard/NginxDashBoard.vue:175
2727+
#: src/views/dashboard/NginxDashBoard.vue:180
27282728
msgid "Loading data..."
27292729
msgstr "جارٍ تحميل البيانات..."
27302730

@@ -2767,11 +2767,11 @@ msgstr ""
27672767
msgid "Log List"
27682768
msgstr "قائمة السجلات"
27692769

2770-
#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
2770+
#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
27712771
msgid "Login"
27722772
msgstr "تسجيل الدخول"
27732773

2774-
#: src/views/other/Login.vue:75
2774+
#: src/views/other/Login.vue:76
27752775
msgid "Login successful"
27762776
msgstr "تم تسجيل الدخول بنجاح"
27772777

@@ -3022,7 +3022,7 @@ msgstr "توجيه متعدد الأسطر"
30223022
msgid "Name"
30233023
msgstr "اسم"
30243024

3025-
#: src/views/dashboard/NginxDashBoard.vue:170
3025+
#: src/views/dashboard/NginxDashBoard.vue:175
30263026
msgid "Need to enable the stub_status module"
30273027
msgstr "يجب تمكين وحدة stub_status"
30283028

@@ -3174,8 +3174,8 @@ msgstr "خطأ في Nginx: {0}"
31743174

31753175
#: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
31763176
#: src/composables/useNginxPerformance.ts:43
3177-
#: src/views/dashboard/NginxDashBoard.vue:109
3178-
#: src/views/dashboard/NginxDashBoard.vue:128
3177+
#: src/views/dashboard/NginxDashBoard.vue:114
3178+
#: src/views/dashboard/NginxDashBoard.vue:133
31793179
#: src/views/dashboard/NginxDashBoard.vue:77
31803180
msgid "Nginx is not running"
31813181
msgstr "Nginx لا يعمل"
@@ -3184,7 +3184,7 @@ msgstr "Nginx لا يعمل"
31843184
msgid "Nginx is not running in another container"
31853185
msgstr "إن Nginx لا يعمل في حاوية أخرى"
31863186

3187-
#: src/views/dashboard/NginxDashBoard.vue:109
3187+
#: src/views/dashboard/NginxDashBoard.vue:114
31883188
msgid "Nginx is running"
31893189
msgstr "إن Nginx يعمل"
31903190

@@ -3296,7 +3296,7 @@ msgstr "لا"
32963296
msgid "No Action"
32973297
msgstr "لا إجراء"
32983298

3299-
#: src/views/dashboard/NginxDashBoard.vue:177
3299+
#: src/views/dashboard/NginxDashBoard.vue:182
33003300
msgid "No data"
33013301
msgstr "لا توجد بيانات"
33023302

@@ -3487,7 +3487,7 @@ msgstr "مفتوح"
34873487
msgid "OpenAI"
34883488
msgstr "أوبن أي آي"
34893489

3490-
#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
3490+
#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
34913491
msgid "Or"
34923492
msgstr "أو"
34933493

@@ -3560,7 +3560,7 @@ msgstr ""
35603560
"التعرف على الوجه أو كلمة مرور الجهاز أو رقم التعريف الشخصي. يمكن استخدامها "
35613561
"كبديل لكلمة المرور أو كطريقة للمصادقة الثنائية."
35623562

3563-
#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
3563+
#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
35643564
msgid "Password"
35653565
msgstr "كلمة المرور"
35663566

@@ -3622,7 +3622,7 @@ msgstr "خطأ في تنفيذ ترقية النواة"
36223622
msgid "Performance"
36233623
msgstr "الأداء"
36243624

3625-
#: src/views/dashboard/NginxDashBoard.vue:182
3625+
#: src/views/dashboard/NginxDashBoard.vue:187
36263626
msgid "Performance Metrics"
36273627
msgstr "مقاييس الأداء"
36283628

@@ -3646,7 +3646,7 @@ msgstr "مسار PID غير موجود"
36463646
msgid "Plain text is empty"
36473647
msgstr "النص العادي فارغ"
36483648

3649-
#: src/views/dashboard/NginxDashBoard.vue:171
3649+
#: src/views/dashboard/NginxDashBoard.vue:176
36503650
msgid ""
36513651
"Please enable the stub_status module to get request statistics, connection "
36523652
"count, etc."
@@ -4625,7 +4625,7 @@ msgstr "منطقة الذاكرة المشتركة"
46254625
msgid "Show"
46264626
msgstr "عرض"
46274627

4628-
#: src/views/other/Login.vue:281
4628+
#: src/views/other/Login.vue:285
46294629
msgid "Sign in with a passkey"
46304630
msgstr "تسجيل الدخول باستخدام مفتاح المرور"
46314631

@@ -4730,7 +4730,7 @@ msgstr "مسار مفتاح SSL"
47304730
msgid "SSL key path is required when HTTPS is enabled"
47314731
msgstr "مسار مفتاح SSL مطلوب عند تمكين HTTPS"
47324732

4733-
#: src/views/other/Login.vue:238
4733+
#: src/views/other/Login.vue:242
47344734
msgid "SSO Login"
47354735
msgstr "تسجيل الدخول عبر SSO"
47364736

@@ -5169,7 +5169,7 @@ msgid ""
51695169
"_./:"
51705170
msgstr "يجب أن يحتوي هذا الحقل على أحرف وأحرف يونيكود وأرقام و -_./: فقط"
51715171

5172-
#: src/views/dashboard/NginxDashBoard.vue:150
5172+
#: src/views/dashboard/NginxDashBoard.vue:155
51735173
msgid ""
51745174
"This module provides Nginx request statistics, connection count, etc. data. "
51755175
"After enabling it, you can view performance statistics"
@@ -5481,7 +5481,7 @@ msgstr "المستخدم لم يتم تفعيل OTP كعامل ثنائي"
54815481
msgid "User Profile"
54825482
msgstr "ملف المستخدم"
54835483

5484-
#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
5484+
#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
54855485
#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
54865486
msgid "Username"
54875487
msgstr "اسم المستخدم"

0 commit comments

Comments
 (0)