Files
3x-ui/frontend/src/schemas/defaults.ts
T
MHSanaei 7bcc5830c6 feat(online): use xray online-stats API for onlines and access-log-free IP limit
Adopt xray-core's statsUserOnline policy and GetUsersStats RPC so online
detection is connection-based and IP limiting no longer requires an access
log. Falls back to the legacy traffic-delta onlines and access-log parsing
when the running core lacks the RPCs (Unimplemented), probed lazily per
process so a panel-driven version switch re-evaluates automatically.

Backend:
- xray/api.go: GetOnlineUsers (one GetUsersStats call returns all online
  users and their source IPs) and IsUnimplementedErr.
- xray/process.go: per-process OnlineAPISupport tri-state capability cache.
- service/xray.go: ensureStatsPolicy injects statsUserOnline into every
  policy level of the generated config; XrayService.GetOnlineUsers probes
  and falls back.
- job/xray_traffic_job.go: union API onlines into the delta-derived active
  set; bump last_online for idle-but-connected clients.
- job/check_client_ip_job.go: API-first IP source with shared enforcement;
  live observations bypass the 30-min stale cutoff; access-log path
  unchanged for older cores.
- service/setting.go: GetIpLimitEnable always true; new accessLogEnable
  default for features that genuinely read the access log.

Frontend:
- Client form split into Basic and Config tabs; IP Limit and IP Log no
  longer gated on access log; compact Auto Renew next to Start After First
  Use; tabBasic/tabConfig added to all 13 locales.
- Xray logs button on the dashboard now gated on accessLogEnable.
2026-06-11 19:42:03 +02:00

24 lines
822 B
TypeScript

import { z } from 'zod';
export const DefaultsPayloadSchema = z.object({
expireDiff: z.number().optional(),
trafficDiff: z.number().optional(),
tgBotEnable: z.boolean().optional(),
subEnable: z.boolean().optional(),
subTitle: z.string().optional(),
subURI: z.string().optional(),
subJsonURI: z.string().optional(),
subJsonEnable: z.boolean().optional(),
subClashURI: z.string().optional(),
subClashEnable: z.boolean().optional(),
pageSize: z.number().optional(),
remarkModel: z.string().optional(),
datepicker: z.enum(['gregorian', 'jalalian']).optional(),
ipLimitEnable: z.boolean().optional(),
accessLogEnable: z.boolean().optional(),
webDomain: z.string().optional(),
subDomain: z.string().optional(),
}).loose();
export type DefaultsPayload = z.infer<typeof DefaultsPayloadSchema>;