@kissesses/xtls-sdk 0.16.0
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.
- package/LICENCE +661 -0
- package/README.md +217 -0
- package/build/index.d.ts +17 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +19 -0
- package/build/src/common/errors/handler/handler.errors.d.ts +23 -0
- package/build/src/common/errors/handler/handler.errors.d.ts.map +1 -0
- package/build/src/common/errors/handler/handler.errors.js +22 -0
- package/build/src/common/errors/handler/index.d.ts +2 -0
- package/build/src/common/errors/handler/index.d.ts.map +1 -0
- package/build/src/common/errors/handler/index.js +17 -0
- package/build/src/common/errors/index.d.ts +3 -0
- package/build/src/common/errors/index.d.ts.map +1 -0
- package/build/src/common/errors/index.js +18 -0
- package/build/src/common/errors/router/index.d.ts +2 -0
- package/build/src/common/errors/router/index.d.ts.map +1 -0
- package/build/src/common/errors/router/index.js +17 -0
- package/build/src/common/errors/router/router.errors.d.ts +15 -0
- package/build/src/common/errors/router/router.errors.d.ts.map +1 -0
- package/build/src/common/errors/router/router.errors.js +14 -0
- package/build/src/common/errors/stats/index.d.ts +2 -0
- package/build/src/common/errors/stats/index.d.ts.map +1 -0
- package/build/src/common/errors/stats/index.js +17 -0
- package/build/src/common/errors/stats/stats.errors.d.ts +43 -0
- package/build/src/common/errors/stats/stats.errors.d.ts.map +1 -0
- package/build/src/common/errors/stats/stats.errors.js +42 -0
- package/build/src/common/types/index.d.ts +2 -0
- package/build/src/common/types/index.d.ts.map +1 -0
- package/build/src/common/types/index.js +17 -0
- package/build/src/common/types/sdk-response.d.ts +6 -0
- package/build/src/common/types/sdk-response.d.ts.map +1 -0
- package/build/src/common/types/sdk-response.js +2 -0
- package/build/src/common/utils/create-typed-message/create-typed-message.d.ts +5 -0
- package/build/src/common/utils/create-typed-message/create-typed-message.d.ts.map +1 -0
- package/build/src/common/utils/create-typed-message/create-typed-message.js +10 -0
- package/build/src/common/utils/decode-user/constants/account-types.d.ts +39 -0
- package/build/src/common/utils/decode-user/constants/account-types.d.ts.map +1 -0
- package/build/src/common/utils/decode-user/constants/account-types.js +65 -0
- package/build/src/common/utils/decode-user/constants/index.d.ts +2 -0
- package/build/src/common/utils/decode-user/constants/index.d.ts.map +1 -0
- package/build/src/common/utils/decode-user/constants/index.js +17 -0
- package/build/src/common/utils/decode-user/decode-user.d.ts +37 -0
- package/build/src/common/utils/decode-user/decode-user.d.ts.map +1 -0
- package/build/src/common/utils/decode-user/decode-user.js +55 -0
- package/build/src/common/utils/decode-user/types/account-type-keys.type.d.ts +3 -0
- package/build/src/common/utils/decode-user/types/account-type-keys.type.d.ts.map +1 -0
- package/build/src/common/utils/decode-user/types/account-type-keys.type.js +2 -0
- package/build/src/common/utils/decode-user/types/account-type-mapping.type.d.ts +4 -0
- package/build/src/common/utils/decode-user/types/account-type-mapping.type.d.ts.map +1 -0
- package/build/src/common/utils/decode-user/types/account-type-mapping.type.js +2 -0
- package/build/src/common/utils/decode-user/types/decoded-user.type.d.ts +18 -0
- package/build/src/common/utils/decode-user/types/decoded-user.type.d.ts.map +1 -0
- package/build/src/common/utils/decode-user/types/decoded-user.type.js +2 -0
- package/build/src/common/utils/decode-user/types/index.d.ts +4 -0
- package/build/src/common/utils/decode-user/types/index.d.ts.map +1 -0
- package/build/src/common/utils/decode-user/types/index.js +19 -0
- package/build/src/handler/handler.service.d.ts +155 -0
- package/build/src/handler/handler.service.d.ts.map +1 -0
- package/build/src/handler/handler.service.js +523 -0
- package/build/src/handler/interfaces/add-user/add-http-user.interface.d.ts +8 -0
- package/build/src/handler/interfaces/add-user/add-http-user.interface.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/add-http-user.interface.js +2 -0
- package/build/src/handler/interfaces/add-user/add-hysteria-user.interface.d.ts +7 -0
- package/build/src/handler/interfaces/add-user/add-hysteria-user.interface.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/add-hysteria-user.interface.js +2 -0
- package/build/src/handler/interfaces/add-user/add-shadowsocks-user.interface.d.ts +10 -0
- package/build/src/handler/interfaces/add-user/add-shadowsocks-user.interface.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/add-shadowsocks-user.interface.js +2 -0
- package/build/src/handler/interfaces/add-user/add-shadowsocks2022-user.interface.d.ts +7 -0
- package/build/src/handler/interfaces/add-user/add-shadowsocks2022-user.interface.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/add-shadowsocks2022-user.interface.js +2 -0
- package/build/src/handler/interfaces/add-user/add-socks-user.interface.d.ts +8 -0
- package/build/src/handler/interfaces/add-user/add-socks-user.interface.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/add-socks-user.interface.js +2 -0
- package/build/src/handler/interfaces/add-user/add-trojan-user.interface.d.ts +7 -0
- package/build/src/handler/interfaces/add-user/add-trojan-user.interface.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/add-trojan-user.interface.js +2 -0
- package/build/src/handler/interfaces/add-user/add-vless-user.interface.d.ts +8 -0
- package/build/src/handler/interfaces/add-user/add-vless-user.interface.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/add-vless-user.interface.js +2 -0
- package/build/src/handler/interfaces/add-user/add-wireguard-user.interface.d.ts +8 -0
- package/build/src/handler/interfaces/add-user/add-wireguard-user.interface.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/add-wireguard-user.interface.js +2 -0
- package/build/src/handler/interfaces/add-user/index.d.ts +9 -0
- package/build/src/handler/interfaces/add-user/index.d.ts.map +1 -0
- package/build/src/handler/interfaces/add-user/index.js +24 -0
- package/build/src/handler/interfaces/index.d.ts +2 -0
- package/build/src/handler/interfaces/index.d.ts.map +1 -0
- package/build/src/handler/interfaces/index.js +17 -0
- package/build/src/handler/models/add-user/add-user.response.model.d.ts +5 -0
- package/build/src/handler/models/add-user/add-user.response.model.d.ts.map +1 -0
- package/build/src/handler/models/add-user/add-user.response.model.js +9 -0
- package/build/src/handler/models/add-user/index.d.ts +2 -0
- package/build/src/handler/models/add-user/index.d.ts.map +1 -0
- package/build/src/handler/models/add-user/index.js +17 -0
- package/build/src/handler/models/get-inbound-users/get-inbound-users.response.model.d.ts +7 -0
- package/build/src/handler/models/get-inbound-users/get-inbound-users.response.model.d.ts.map +1 -0
- package/build/src/handler/models/get-inbound-users/get-inbound-users.response.model.js +10 -0
- package/build/src/handler/models/get-inbound-users/index.d.ts +2 -0
- package/build/src/handler/models/get-inbound-users/index.d.ts.map +1 -0
- package/build/src/handler/models/get-inbound-users/index.js +17 -0
- package/build/src/handler/models/index.d.ts +4 -0
- package/build/src/handler/models/index.d.ts.map +1 -0
- package/build/src/handler/models/index.js +19 -0
- package/build/src/handler/models/remove-user/index.d.ts +2 -0
- package/build/src/handler/models/remove-user/index.d.ts.map +1 -0
- package/build/src/handler/models/remove-user/index.js +17 -0
- package/build/src/handler/models/remove-user/remove-user.response.model.d.ts +5 -0
- package/build/src/handler/models/remove-user/remove-user.response.model.d.ts.map +1 -0
- package/build/src/handler/models/remove-user/remove-user.response.model.js +9 -0
- package/build/src/router/interfaces/index.d.ts +2 -0
- package/build/src/router/interfaces/index.d.ts.map +1 -0
- package/build/src/router/interfaces/index.js +17 -0
- package/build/src/router/interfaces/remove-rule-by-rule-tag.interface.d.ts +4 -0
- package/build/src/router/interfaces/remove-rule-by-rule-tag.interface.d.ts.map +1 -0
- package/build/src/router/interfaces/remove-rule-by-rule-tag.interface.js +2 -0
- package/build/src/router/models/index.d.ts +2 -0
- package/build/src/router/models/index.d.ts.map +1 -0
- package/build/src/router/models/index.js +17 -0
- package/build/src/router/models/remove-rule-by-rule-tag/index.d.ts +2 -0
- package/build/src/router/models/remove-rule-by-rule-tag/index.d.ts.map +1 -0
- package/build/src/router/models/remove-rule-by-rule-tag/index.js +17 -0
- package/build/src/router/models/remove-rule-by-rule-tag/remove-rule-by-rule-tag.response.model.d.ts +5 -0
- package/build/src/router/models/remove-rule-by-rule-tag/remove-rule-by-rule-tag.response.model.d.ts.map +1 -0
- package/build/src/router/models/remove-rule-by-rule-tag/remove-rule-by-rule-tag.response.model.js +9 -0
- package/build/src/router/router.service.d.ts +31 -0
- package/build/src/router/router.service.d.ts.map +1 -0
- package/build/src/router/router.service.js +56 -0
- package/build/src/stats/models/get-all-inbounds-stats/get-all-inbounds-stats.response.model.d.ts +21 -0
- package/build/src/stats/models/get-all-inbounds-stats/get-all-inbounds-stats.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-all-inbounds-stats/get-all-inbounds-stats.response.model.js +42 -0
- package/build/src/stats/models/get-all-inbounds-stats/index.d.ts +2 -0
- package/build/src/stats/models/get-all-inbounds-stats/index.d.ts.map +1 -0
- package/build/src/stats/models/get-all-inbounds-stats/index.js +17 -0
- package/build/src/stats/models/get-all-inbounds-stats/interfaces/inbound.interface.d.ts +6 -0
- package/build/src/stats/models/get-all-inbounds-stats/interfaces/inbound.interface.d.ts.map +1 -0
- package/build/src/stats/models/get-all-inbounds-stats/interfaces/inbound.interface.js +2 -0
- package/build/src/stats/models/get-all-inbounds-stats/interfaces/index.d.ts +2 -0
- package/build/src/stats/models/get-all-inbounds-stats/interfaces/index.d.ts.map +1 -0
- package/build/src/stats/models/get-all-inbounds-stats/interfaces/index.js +17 -0
- package/build/src/stats/models/get-all-outbounds-stats/get-all-outbounds-stats.response.model.d.ts +21 -0
- package/build/src/stats/models/get-all-outbounds-stats/get-all-outbounds-stats.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-all-outbounds-stats/get-all-outbounds-stats.response.model.js +42 -0
- package/build/src/stats/models/get-all-outbounds-stats/index.d.ts +2 -0
- package/build/src/stats/models/get-all-outbounds-stats/index.d.ts.map +1 -0
- package/build/src/stats/models/get-all-outbounds-stats/index.js +17 -0
- package/build/src/stats/models/get-all-outbounds-stats/interfaces/index.d.ts +2 -0
- package/build/src/stats/models/get-all-outbounds-stats/interfaces/index.d.ts.map +1 -0
- package/build/src/stats/models/get-all-outbounds-stats/interfaces/index.js +17 -0
- package/build/src/stats/models/get-all-outbounds-stats/interfaces/outbound.interface.d.ts +6 -0
- package/build/src/stats/models/get-all-outbounds-stats/interfaces/outbound.interface.d.ts.map +1 -0
- package/build/src/stats/models/get-all-outbounds-stats/interfaces/outbound.interface.js +2 -0
- package/build/src/stats/models/get-all-users-stats/get-all-users-stats.response.model.d.ts +21 -0
- package/build/src/stats/models/get-all-users-stats/get-all-users-stats.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-all-users-stats/get-all-users-stats.response.model.js +42 -0
- package/build/src/stats/models/get-all-users-stats/index.d.ts +2 -0
- package/build/src/stats/models/get-all-users-stats/index.d.ts.map +1 -0
- package/build/src/stats/models/get-all-users-stats/index.js +17 -0
- package/build/src/stats/models/get-all-users-stats/interfaces/index.d.ts +2 -0
- package/build/src/stats/models/get-all-users-stats/interfaces/index.d.ts.map +1 -0
- package/build/src/stats/models/get-all-users-stats/interfaces/index.js +17 -0
- package/build/src/stats/models/get-all-users-stats/interfaces/user.interface.d.ts +6 -0
- package/build/src/stats/models/get-all-users-stats/interfaces/user.interface.d.ts.map +1 -0
- package/build/src/stats/models/get-all-users-stats/interfaces/user.interface.js +2 -0
- package/build/src/stats/models/get-inbound-stats/get-inbound-stats.response.model.d.ts +27 -0
- package/build/src/stats/models/get-inbound-stats/get-inbound-stats.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-inbound-stats/get-inbound-stats.response.model.js +46 -0
- package/build/src/stats/models/get-inbound-stats/index.d.ts +2 -0
- package/build/src/stats/models/get-inbound-stats/index.d.ts.map +1 -0
- package/build/src/stats/models/get-inbound-stats/index.js +17 -0
- package/build/src/stats/models/get-inbound-stats/interfaces/inbound.interface.d.ts +6 -0
- package/build/src/stats/models/get-inbound-stats/interfaces/inbound.interface.d.ts.map +1 -0
- package/build/src/stats/models/get-inbound-stats/interfaces/inbound.interface.js +2 -0
- package/build/src/stats/models/get-inbound-stats/interfaces/index.d.ts +2 -0
- package/build/src/stats/models/get-inbound-stats/interfaces/index.d.ts.map +1 -0
- package/build/src/stats/models/get-inbound-stats/interfaces/index.js +17 -0
- package/build/src/stats/models/get-outbound-stats/get-outbound-stats.response.model.d.ts +27 -0
- package/build/src/stats/models/get-outbound-stats/get-outbound-stats.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-outbound-stats/get-outbound-stats.response.model.js +46 -0
- package/build/src/stats/models/get-outbound-stats/index.d.ts +2 -0
- package/build/src/stats/models/get-outbound-stats/index.d.ts.map +1 -0
- package/build/src/stats/models/get-outbound-stats/index.js +17 -0
- package/build/src/stats/models/get-outbound-stats/interfaces/index.d.ts +2 -0
- package/build/src/stats/models/get-outbound-stats/interfaces/index.d.ts.map +1 -0
- package/build/src/stats/models/get-outbound-stats/interfaces/index.js +17 -0
- package/build/src/stats/models/get-outbound-stats/interfaces/outbound.d.ts +6 -0
- package/build/src/stats/models/get-outbound-stats/interfaces/outbound.d.ts.map +1 -0
- package/build/src/stats/models/get-outbound-stats/interfaces/outbound.js +2 -0
- package/build/src/stats/models/get-sys-stats/get-sys-stats.response.model.d.ts +15 -0
- package/build/src/stats/models/get-sys-stats/get-sys-stats.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-sys-stats/get-sys-stats.response.model.js +22 -0
- package/build/src/stats/models/get-sys-stats/index.d.ts +2 -0
- package/build/src/stats/models/get-sys-stats/index.d.ts.map +1 -0
- package/build/src/stats/models/get-sys-stats/index.js +17 -0
- package/build/src/stats/models/get-user-online-status/get-user-online-status.response.model.d.ts +5 -0
- package/build/src/stats/models/get-user-online-status/get-user-online-status.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-user-online-status/get-user-online-status.response.model.js +9 -0
- package/build/src/stats/models/get-user-online-status/index.d.ts +2 -0
- package/build/src/stats/models/get-user-online-status/index.d.ts.map +1 -0
- package/build/src/stats/models/get-user-online-status/index.js +17 -0
- package/build/src/stats/models/get-user-stats/get-user-stats.response.model.d.ts +26 -0
- package/build/src/stats/models/get-user-stats/get-user-stats.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-user-stats/get-user-stats.response.model.js +46 -0
- package/build/src/stats/models/get-user-stats/index.d.ts +2 -0
- package/build/src/stats/models/get-user-stats/index.d.ts.map +1 -0
- package/build/src/stats/models/get-user-stats/index.js +17 -0
- package/build/src/stats/models/get-user-stats/interfaces/index.d.ts +2 -0
- package/build/src/stats/models/get-user-stats/interfaces/index.d.ts.map +1 -0
- package/build/src/stats/models/get-user-stats/interfaces/index.js +17 -0
- package/build/src/stats/models/get-user-stats/interfaces/user.interface.d.ts +6 -0
- package/build/src/stats/models/get-user-stats/interfaces/user.interface.d.ts.map +1 -0
- package/build/src/stats/models/get-user-stats/interfaces/user.interface.js +2 -0
- package/build/src/stats/models/get-users-stats/get-users-stats.response.model.d.ts +50 -0
- package/build/src/stats/models/get-users-stats/get-users-stats.response.model.d.ts.map +1 -0
- package/build/src/stats/models/get-users-stats/get-users-stats.response.model.js +52 -0
- package/build/src/stats/models/get-users-stats/index.d.ts +2 -0
- package/build/src/stats/models/get-users-stats/index.d.ts.map +1 -0
- package/build/src/stats/models/get-users-stats/index.js +17 -0
- package/build/src/stats/models/index.d.ts +10 -0
- package/build/src/stats/models/index.d.ts.map +1 -0
- package/build/src/stats/models/index.js +25 -0
- package/build/src/stats/stats.service.d.ts +271 -0
- package/build/src/stats/stats.service.d.ts.map +1 -0
- package/build/src/stats/stats.service.js +527 -0
- package/build/src/xray-protos/app/commander/config.d.ts +37 -0
- package/build/src/xray-protos/app/commander/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/commander/config.js +143 -0
- package/build/src/xray-protos/app/dispatcher/config.d.ts +26 -0
- package/build/src/xray-protos/app/dispatcher/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/dispatcher/config.js +112 -0
- package/build/src/xray-protos/app/geodata/config.d.ts +30 -0
- package/build/src/xray-protos/app/geodata/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/geodata/config.js +172 -0
- package/build/src/xray-protos/app/log/command/config.d.ts +51 -0
- package/build/src/xray-protos/app/log/command/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/log/command/config.js +143 -0
- package/build/src/xray-protos/app/log/config.d.ts +38 -0
- package/build/src/xray-protos/app/log/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/log/config.js +244 -0
- package/build/src/xray-protos/app/metrics/config.d.ts +25 -0
- package/build/src/xray-protos/app/metrics/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/metrics/config.js +86 -0
- package/build/src/xray-protos/app/policy/config.d.ts +78 -0
- package/build/src/xray-protos/app/policy/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/policy/config.js +790 -0
- package/build/src/xray-protos/app/proxyman/command/command.d.ts +237 -0
- package/build/src/xray-protos/app/proxyman/command/command.d.ts.map +1 -0
- package/build/src/xray-protos/app/proxyman/command/command.js +1255 -0
- package/build/src/xray-protos/app/proxyman/config.d.ts +91 -0
- package/build/src/xray-protos/app/proxyman/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/proxyman/config.js +779 -0
- package/build/src/xray-protos/app/reverse/config.d.ts +48 -0
- package/build/src/xray-protos/app/reverse/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/reverse/config.js +365 -0
- package/build/src/xray-protos/app/router/command/command.d.ts +250 -0
- package/build/src/xray-protos/app/router/command/command.d.ts.map +1 -0
- package/build/src/xray-protos/app/router/command/command.js +1461 -0
- package/build/src/xray-protos/app/stats/command/command.d.ts +204 -0
- package/build/src/xray-protos/app/stats/command/command.d.ts.map +1 -0
- package/build/src/xray-protos/app/stats/command/command.js +1318 -0
- package/build/src/xray-protos/app/stats/config.d.ts +28 -0
- package/build/src/xray-protos/app/stats/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/stats/config.js +140 -0
- package/build/src/xray-protos/app/version/config.d.ts +24 -0
- package/build/src/xray-protos/app/version/config.d.ts.map +1 -0
- package/build/src/xray-protos/app/version/config.js +113 -0
- package/build/src/xray-protos/common/geodata/geodat.d.ts +111 -0
- package/build/src/xray-protos/common/geodata/geodat.d.ts.map +1 -0
- package/build/src/xray-protos/common/geodata/geodat.js +1027 -0
- package/build/src/xray-protos/common/log/log.d.ts +12 -0
- package/build/src/xray-protos/common/log/log.d.ts.map +1 -0
- package/build/src/xray-protos/common/log/log.js +61 -0
- package/build/src/xray-protos/common/net/address.d.ts +29 -0
- package/build/src/xray-protos/common/net/address.d.ts.map +1 -0
- package/build/src/xray-protos/common/net/address.js +111 -0
- package/build/src/xray-protos/common/net/destination.d.ts +27 -0
- package/build/src/xray-protos/common/net/destination.d.ts.map +1 -0
- package/build/src/xray-protos/common/net/destination.js +105 -0
- package/build/src/xray-protos/common/net/network.d.ts +32 -0
- package/build/src/xray-protos/common/net/network.d.ts.map +1 -0
- package/build/src/xray-protos/common/net/network.js +122 -0
- package/build/src/xray-protos/common/net/port.d.ts +32 -0
- package/build/src/xray-protos/common/net/port.d.ts.map +1 -0
- package/build/src/xray-protos/common/net/port.js +142 -0
- package/build/src/xray-protos/common/protocol/headers.d.ts +34 -0
- package/build/src/xray-protos/common/protocol/headers.d.ts.map +1 -0
- package/build/src/xray-protos/common/protocol/headers.js +126 -0
- package/build/src/xray-protos/common/protocol/server_spec.d.ts +26 -0
- package/build/src/xray-protos/common/protocol/server_spec.d.ts.map +1 -0
- package/build/src/xray-protos/common/protocol/server_spec.js +105 -0
- package/build/src/xray-protos/common/protocol/user.d.ts +30 -0
- package/build/src/xray-protos/common/protocol/user.d.ts.map +1 -0
- package/build/src/xray-protos/common/protocol/user.js +104 -0
- package/build/src/xray-protos/common/serial/typed_message.d.ts +26 -0
- package/build/src/xray-protos/common/serial/typed_message.d.ts.map +1 -0
- package/build/src/xray-protos/common/serial/typed_message.js +111 -0
- package/build/src/xray-protos/core/config.d.ts +74 -0
- package/build/src/xray-protos/core/config.d.ts.map +1 -0
- package/build/src/xray-protos/core/config.js +366 -0
- package/build/src/xray-protos/proxy/blackhole/config.d.ts +31 -0
- package/build/src/xray-protos/proxy/blackhole/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/blackhole/config.js +152 -0
- package/build/src/xray-protos/proxy/dns/config.d.ts +43 -0
- package/build/src/xray-protos/proxy/dns/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/dns/config.js +276 -0
- package/build/src/xray-protos/proxy/dokodemo/config.d.ts +38 -0
- package/build/src/xray-protos/proxy/dokodemo/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/dokodemo/config.js +285 -0
- package/build/src/xray-protos/proxy/freedom/config.d.ts +82 -0
- package/build/src/xray-protos/proxy/freedom/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/freedom/config.js +902 -0
- package/build/src/xray-protos/proxy/http/config.d.ts +54 -0
- package/build/src/xray-protos/proxy/http/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/http/config.js +418 -0
- package/build/src/xray-protos/proxy/hysteria/account/config.d.ts +22 -0
- package/build/src/xray-protos/proxy/hysteria/account/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/hysteria/account/config.js +68 -0
- package/build/src/xray-protos/proxy/hysteria/config.d.ts +29 -0
- package/build/src/xray-protos/proxy/hysteria/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/hysteria/config.js +131 -0
- package/build/src/xray-protos/proxy/loopback/config.d.ts +24 -0
- package/build/src/xray-protos/proxy/loopback/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/loopback/config.js +93 -0
- package/build/src/xray-protos/proxy/shadowsocks/config.d.ts +49 -0
- package/build/src/xray-protos/proxy/shadowsocks/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/shadowsocks/config.js +307 -0
- package/build/src/xray-protos/proxy/shadowsocks_2022/config.d.ts +67 -0
- package/build/src/xray-protos/proxy/shadowsocks_2022/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/shadowsocks_2022/config.js +646 -0
- package/build/src/xray-protos/proxy/socks/config.d.ts +61 -0
- package/build/src/xray-protos/proxy/socks/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/socks/config.js +416 -0
- package/build/src/xray-protos/proxy/trojan/config.d.ts +45 -0
- package/build/src/xray-protos/proxy/trojan/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/trojan/config.js +342 -0
- package/build/src/xray-protos/proxy/tun/config.d.ts +28 -0
- package/build/src/xray-protos/proxy/tun/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/tun/config.js +182 -0
- package/build/src/xray-protos/proxy/vless/account.d.ts +39 -0
- package/build/src/xray-protos/proxy/vless/account.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/vless/account.js +287 -0
- package/build/src/xray-protos/proxy/vless/encoding/addons.d.ts +23 -0
- package/build/src/xray-protos/proxy/vless/encoding/addons.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/vless/encoding/addons.js +111 -0
- package/build/src/xray-protos/proxy/vless/inbound/config.d.ts +39 -0
- package/build/src/xray-protos/proxy/vless/inbound/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/vless/inbound/config.js +322 -0
- package/build/src/xray-protos/proxy/vless/outbound/config.d.ts +23 -0
- package/build/src/xray-protos/proxy/vless/outbound/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/vless/outbound/config.js +71 -0
- package/build/src/xray-protos/proxy/vmess/account.d.ts +31 -0
- package/build/src/xray-protos/proxy/vmess/account.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/vmess/account.js +112 -0
- package/build/src/xray-protos/proxy/vmess/inbound/config.d.ts +34 -0
- package/build/src/xray-protos/proxy/vmess/inbound/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/vmess/inbound/config.js +195 -0
- package/build/src/xray-protos/proxy/vmess/outbound/config.d.ts +23 -0
- package/build/src/xray-protos/proxy/vmess/outbound/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/vmess/outbound/config.js +74 -0
- package/build/src/xray-protos/proxy/wireguard/config.d.ts +50 -0
- package/build/src/xray-protos/proxy/wireguard/config.d.ts.map +1 -0
- package/build/src/xray-protos/proxy/wireguard/config.js +434 -0
- package/build/src/xray-protos/transport/internet/config.d.ts +164 -0
- package/build/src/xray-protos/transport/internet/config.d.ts.map +1 -0
- package/build/src/xray-protos/transport/internet/config.js +1705 -0
- package/build/src/xray-protos/typeRegistry.d.ts +19 -0
- package/build/src/xray-protos/typeRegistry.d.ts.map +1 -0
- package/build/src/xray-protos/typeRegistry.js +8 -0
- package/package.json +60 -0
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StatsService = void 0;
|
|
4
|
+
const nice_grpc_1 = require("nice-grpc");
|
|
5
|
+
const models_1 = require("./models");
|
|
6
|
+
const command_1 = require("../xray-protos/app/stats/command/command");
|
|
7
|
+
const errors_1 = require("../common/errors");
|
|
8
|
+
/**
|
|
9
|
+
* Service class for interacting with Xray server statistics.
|
|
10
|
+
* Provides methods to retrieve system and user statistics.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // Create a new StatsService instance
|
|
15
|
+
* const stats = new StatsService(channel);
|
|
16
|
+
*
|
|
17
|
+
* // Get system stats
|
|
18
|
+
* const sysStats = await stats.getSysStats();
|
|
19
|
+
*
|
|
20
|
+
* // Get all users stats
|
|
21
|
+
* const allUsersStats = await stats.getAllUsersStats();
|
|
22
|
+
*
|
|
23
|
+
* // Get specific user stats
|
|
24
|
+
* const userStats = await stats.getUserStats('username123');
|
|
25
|
+
*
|
|
26
|
+
* // Check if user is online
|
|
27
|
+
* const isOnline = await stats.getUserOnlineStatus('username123');
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
class StatsService {
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new StatsService instance
|
|
33
|
+
* @param channel - The gRPC channel to use for communication with the Xray server
|
|
34
|
+
*/
|
|
35
|
+
constructor(channel) {
|
|
36
|
+
this.channel = channel;
|
|
37
|
+
/**
|
|
38
|
+
* Cached flag indicating whether the remote Xray server supports the
|
|
39
|
+
* `GetUsersStats` unary method. `null` means "not probed yet", `true` means
|
|
40
|
+
* the method is available, `false` means the legacy fallback should be used.
|
|
41
|
+
*
|
|
42
|
+
* The flag is cached for the lifetime of this instance — if the Xray core
|
|
43
|
+
* is upgraded without re-creating the SDK, a manual re-instantiation is
|
|
44
|
+
* required to re-detect support.
|
|
45
|
+
* @private
|
|
46
|
+
*/
|
|
47
|
+
this.supportsGetUsersStats = null;
|
|
48
|
+
this.client = (0, nice_grpc_1.createClient)(command_1.StatsServiceDefinition, channel);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Retrieves system statistics from the Xray server.
|
|
52
|
+
* This includes information about the system's overall performance and resource usage.
|
|
53
|
+
*
|
|
54
|
+
* @returns {Promise<ISdkResponse<GetSysStatsResponseModel>>} A promise that resolves to:
|
|
55
|
+
* - On success: An object with `isOk: true` and `data` containing the system stats
|
|
56
|
+
* - On failure: An object with `isOk: false` and error details from STATS_ERRORS
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const stats = new StatsService(channel);
|
|
61
|
+
* const response = await stats.getSysStats();
|
|
62
|
+
*
|
|
63
|
+
* if (response.isOk) {
|
|
64
|
+
* console.log(response.data); // GetSysStatsResponseModel
|
|
65
|
+
* } else {
|
|
66
|
+
* console.error(response.message); // Error message
|
|
67
|
+
* }
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
async getSysStats() {
|
|
71
|
+
try {
|
|
72
|
+
const response = await this.client.getSysStats({});
|
|
73
|
+
return {
|
|
74
|
+
isOk: true,
|
|
75
|
+
data: new models_1.GetSysStatsResponseModel(response),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
let message = '';
|
|
80
|
+
if (error instanceof Error) {
|
|
81
|
+
message = error.message;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
isOk: false,
|
|
85
|
+
...errors_1.STATS_ERRORS.GET_SYS_STATS_ERROR(message),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Retrieves statistics for all users from the Xray server.
|
|
91
|
+
* This provides a comprehensive view of all user activities and their resource usage.
|
|
92
|
+
*
|
|
93
|
+
* @param {boolean} reset - Whether to reset the statistics after retrieving them. Defaults to false.
|
|
94
|
+
* @returns {Promise<ISdkResponse<GetAllUsersStatsResponseModel>>} A promise that resolves to:
|
|
95
|
+
* - On success: An object with `isOk: true` and `data` containing user stats
|
|
96
|
+
* - On failure: An object with `isOk: false` and error details from STATS_ERRORS
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const stats = new StatsService(channel);
|
|
101
|
+
*
|
|
102
|
+
* // Get stats without resetting
|
|
103
|
+
* const response = await stats.getAllUsersStats();
|
|
104
|
+
*
|
|
105
|
+
* // Get stats and reset them
|
|
106
|
+
* const responseWithReset = await stats.getAllUsersStats(true);
|
|
107
|
+
*
|
|
108
|
+
* if (response.isOk) {
|
|
109
|
+
* console.log(response.data.users); // Array of user statistics
|
|
110
|
+
* } else {
|
|
111
|
+
* console.error(response.message); // Error message
|
|
112
|
+
* }
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
async getAllUsersStats(reset = false) {
|
|
116
|
+
try {
|
|
117
|
+
const response = await this.client.queryStats({
|
|
118
|
+
pattern: 'user>>>',
|
|
119
|
+
reset,
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
isOk: true,
|
|
123
|
+
data: new models_1.GetAllUsersStatsResponseModel(response),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
let message = '';
|
|
128
|
+
if (error instanceof Error) {
|
|
129
|
+
message = error.message;
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
isOk: false,
|
|
133
|
+
...errors_1.STATS_ERRORS.GET_ALL_USERS_STATS_ERROR(message),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Retrieves statistics for a specific user from the Xray server.
|
|
139
|
+
* This includes detailed information about the user's network usage, connections, and other metrics.
|
|
140
|
+
*
|
|
141
|
+
* @param {string} username - The username to get statistics for
|
|
142
|
+
* @param {boolean} reset - Whether to reset the statistics after retrieving them. Defaults to false.
|
|
143
|
+
* @returns {Promise<ISdkResponse<GetUserStatsResponseModel>>} A promise that resolves to:
|
|
144
|
+
* - On success: An object with `isOk: true` and `data` containing the user's stats
|
|
145
|
+
* - On failure: An object with `isOk: false` and error details from STATS_ERRORS
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* const stats = new StatsService(channel);
|
|
150
|
+
*
|
|
151
|
+
* // Get user stats without resetting
|
|
152
|
+
* const response = await stats.getUserStats('username123');
|
|
153
|
+
*
|
|
154
|
+
* // Get user stats and reset them
|
|
155
|
+
* const responseWithReset = await stats.getUserStats('username123', true);
|
|
156
|
+
*
|
|
157
|
+
* if (response.isOk) {
|
|
158
|
+
* console.log(response.data.user); // User statistics
|
|
159
|
+
* } else {
|
|
160
|
+
* console.error(response.message); // Error message
|
|
161
|
+
* }
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
async getUserStats(username, reset = false) {
|
|
165
|
+
try {
|
|
166
|
+
const response = await this.client.queryStats({
|
|
167
|
+
pattern: `user>>>${username}>>>`,
|
|
168
|
+
reset,
|
|
169
|
+
});
|
|
170
|
+
return {
|
|
171
|
+
isOk: true,
|
|
172
|
+
data: new models_1.GetUserStatsResponseModel(response),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
let message = '';
|
|
177
|
+
if (error instanceof Error) {
|
|
178
|
+
message = error.message;
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
isOk: false,
|
|
182
|
+
...errors_1.STATS_ERRORS.GET_USER_STATS_ERROR(message),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Checks if a specific user is currently online on the Xray server.
|
|
188
|
+
* This method queries the server's real-time connection status for the specified user.
|
|
189
|
+
*
|
|
190
|
+
* @param {string} username - The username to check online status for
|
|
191
|
+
* @returns {Promise<ISdkResponse<GetUserOnlineStatusResponseModel>>} A promise that resolves to:
|
|
192
|
+
* - On success: An object with `isOk: true` and `data` containing the user's online status (`data.online`)
|
|
193
|
+
* - On failure: An object with `isOk: false` and error details from STATS_ERRORS
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* const stats = new StatsService(channel);
|
|
198
|
+
* const response = await stats.getUserOnlineStatus('username123');
|
|
199
|
+
*
|
|
200
|
+
* if (response.isOk) {
|
|
201
|
+
* if (response.data.online) {
|
|
202
|
+
* console.log('User is online');
|
|
203
|
+
* } else {
|
|
204
|
+
* console.log('User is offline');
|
|
205
|
+
* }
|
|
206
|
+
* } else {
|
|
207
|
+
* console.error(response.message); // Error message
|
|
208
|
+
* }
|
|
209
|
+
* ```
|
|
210
|
+
*/
|
|
211
|
+
async getUserOnlineStatus(username) {
|
|
212
|
+
try {
|
|
213
|
+
await this.client.getStatsOnline({
|
|
214
|
+
name: `user>>>${username}>>>online`,
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
isOk: true,
|
|
218
|
+
data: new models_1.GetUserOnlineStatusResponseModel(true),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
let message = '';
|
|
223
|
+
if (error instanceof Error) {
|
|
224
|
+
message = error.message;
|
|
225
|
+
}
|
|
226
|
+
const isNotFound = message.includes('online not found.');
|
|
227
|
+
if (isNotFound) {
|
|
228
|
+
return {
|
|
229
|
+
isOk: true,
|
|
230
|
+
data: new models_1.GetUserOnlineStatusResponseModel(false),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
isOk: false,
|
|
235
|
+
...errors_1.STATS_ERRORS.GET_USER_ONLINE_STATUS_ERROR(message),
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Gets statistics for all inbound connections.
|
|
241
|
+
*
|
|
242
|
+
* @param reset - Whether to reset the statistics after retrieving them. Defaults to false.
|
|
243
|
+
* @returns A promise that resolves to an ISdkResponse containing:
|
|
244
|
+
* - On success: An object with `isOk: true` and data containing an array of inbound stats
|
|
245
|
+
* - On failure: An object with `isOk: false` and error details from STATS_ERRORS
|
|
246
|
+
*
|
|
247
|
+
* @example
|
|
248
|
+
* ```typescript
|
|
249
|
+
* const stats = new StatsService(channel);
|
|
250
|
+
* const response = await stats.getAllInboundsStats();
|
|
251
|
+
*
|
|
252
|
+
* if (response.isOk) {
|
|
253
|
+
* console.log('Inbound stats:', response.data.inbounds);
|
|
254
|
+
* } else {
|
|
255
|
+
* console.error(response.message); // Error message
|
|
256
|
+
* }
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
async getAllInboundsStats(reset = false) {
|
|
260
|
+
try {
|
|
261
|
+
const response = await this.client.queryStats({
|
|
262
|
+
pattern: 'inbound>>>',
|
|
263
|
+
reset,
|
|
264
|
+
});
|
|
265
|
+
return {
|
|
266
|
+
isOk: true,
|
|
267
|
+
data: new models_1.GetAllInboundsStatsResponseModel(response),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
let message = '';
|
|
272
|
+
if (error instanceof Error) {
|
|
273
|
+
message = error.message;
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
isOk: false,
|
|
277
|
+
...errors_1.STATS_ERRORS.GET_ALL_INBOUNDS_STATS_ERROR(message),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Gets statistics for a specific inbound connection.
|
|
283
|
+
*
|
|
284
|
+
* @param inbound - The name/tag of the inbound connection to get stats for
|
|
285
|
+
* @param reset - Whether to reset the statistics after retrieving them. Defaults to false.
|
|
286
|
+
* @returns A promise that resolves to an ISdkResponse containing:
|
|
287
|
+
* - On success: An object with `isOk: true` and data containing the inbound stats
|
|
288
|
+
* - On failure: An object with `isOk: false` and error details from STATS_ERRORS
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* ```typescript
|
|
292
|
+
* const stats = new StatsService(channel);
|
|
293
|
+
* const response = await stats.getInboundStats('http_in');
|
|
294
|
+
*
|
|
295
|
+
* if (response.isOk) {
|
|
296
|
+
* console.log('Inbound stats:', response.data.stats);
|
|
297
|
+
* } else {
|
|
298
|
+
* console.error(response.message); // Error message
|
|
299
|
+
* }
|
|
300
|
+
* ```
|
|
301
|
+
*/
|
|
302
|
+
async getInboundStats(inbound, reset = false) {
|
|
303
|
+
try {
|
|
304
|
+
const response = await this.client.queryStats({
|
|
305
|
+
pattern: `inbound>>>${inbound}>>>`,
|
|
306
|
+
reset,
|
|
307
|
+
});
|
|
308
|
+
return {
|
|
309
|
+
isOk: true,
|
|
310
|
+
data: new models_1.GetInboundStatsResponseModel(response),
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
let message = '';
|
|
315
|
+
if (error instanceof Error) {
|
|
316
|
+
message = error.message;
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
isOk: false,
|
|
320
|
+
...errors_1.STATS_ERRORS.GET_INBOUND_STATS_ERROR(message),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Gets statistics for all outbound connections.
|
|
326
|
+
*
|
|
327
|
+
* @param reset - Whether to reset the statistics after retrieving them. Defaults to false.
|
|
328
|
+
* @returns A promise that resolves to an ISdkResponse containing:
|
|
329
|
+
* - On success: An object with `isOk: true` and data containing an array of outbound stats
|
|
330
|
+
* - On failure: An object with `isOk: false` and error details from STATS_ERRORS
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```typescript
|
|
334
|
+
* const stats = new StatsService(channel);
|
|
335
|
+
* const response = await stats.getAllOutboundsStats();
|
|
336
|
+
*
|
|
337
|
+
* if (response.isOk) {
|
|
338
|
+
* console.log('Outbound stats:', response.data.outbounds);
|
|
339
|
+
* } else {
|
|
340
|
+
* console.error(response.message); // Error message
|
|
341
|
+
* }
|
|
342
|
+
* ```
|
|
343
|
+
*/
|
|
344
|
+
async getAllOutboundsStats(reset = false) {
|
|
345
|
+
try {
|
|
346
|
+
const response = await this.client.queryStats({
|
|
347
|
+
pattern: 'outbound>>>',
|
|
348
|
+
reset,
|
|
349
|
+
});
|
|
350
|
+
return {
|
|
351
|
+
isOk: true,
|
|
352
|
+
data: new models_1.GetAllOutboundsStatsResponseModel(response),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
let message = '';
|
|
357
|
+
if (error instanceof Error) {
|
|
358
|
+
message = error.message;
|
|
359
|
+
}
|
|
360
|
+
return {
|
|
361
|
+
isOk: false,
|
|
362
|
+
...errors_1.STATS_ERRORS.GET_ALL_OUTBOUNDS_STATS_ERROR(message),
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Gets statistics for a specific outbound connection.
|
|
368
|
+
*
|
|
369
|
+
* @param outbound - The name/tag of the outbound connection to get stats for
|
|
370
|
+
* @param reset - Whether to reset the statistics after retrieving them. Defaults to false.
|
|
371
|
+
* @returns A promise that resolves to an ISdkResponse containing:
|
|
372
|
+
* - On success: An object with `isOk: true` and data containing the outbound stats
|
|
373
|
+
* - On failure: An object with `isOk: false` and error details from STATS_ERRORS
|
|
374
|
+
*
|
|
375
|
+
* @example
|
|
376
|
+
* ```typescript
|
|
377
|
+
* const stats = new StatsService(channel);
|
|
378
|
+
* const response = await stats.getOutboundStats('http_out');
|
|
379
|
+
*
|
|
380
|
+
* if (response.isOk) {
|
|
381
|
+
* console.log('Outbound stats:', response.data.stats);
|
|
382
|
+
* } else {
|
|
383
|
+
* console.error(response.message); // Error message
|
|
384
|
+
* }
|
|
385
|
+
* ```
|
|
386
|
+
*/
|
|
387
|
+
async getOutboundStats(outbound, reset = false) {
|
|
388
|
+
try {
|
|
389
|
+
const response = await this.client.queryStats({
|
|
390
|
+
pattern: `outbound>>>${outbound}>>>`,
|
|
391
|
+
reset,
|
|
392
|
+
});
|
|
393
|
+
return {
|
|
394
|
+
isOk: true,
|
|
395
|
+
data: new models_1.GetOutboundStatsResponseModel(response),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
let message = '';
|
|
400
|
+
if (error instanceof Error) {
|
|
401
|
+
message = error.message;
|
|
402
|
+
}
|
|
403
|
+
return {
|
|
404
|
+
isOk: false,
|
|
405
|
+
...errors_1.STATS_ERRORS.GET_OUTBOUND_STATS_ERROR(message),
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Retrieves per-user statistics (online IP list and, optionally, traffic)
|
|
411
|
+
* from the Xray server.
|
|
412
|
+
*
|
|
413
|
+
* Prefers the native `GetUsersStats` gRPC method introduced in recent
|
|
414
|
+
* Xray-core versions. If the server replies with `UNIMPLEMENTED` (i.e. the
|
|
415
|
+
* method is missing), transparently falls back to the legacy approach of
|
|
416
|
+
* combining `GetAllOnlineUsers` + `GetStatsOnlineIpList`. The detection
|
|
417
|
+
* result is cached for the lifetime of this service instance, so the
|
|
418
|
+
* `UNIMPLEMENTED` round-trip happens at most once.
|
|
419
|
+
*
|
|
420
|
+
* Note: the `includeTraffic` flag is honored only on the native path. In
|
|
421
|
+
* legacy mode traffic is always returned as `undefined`, since the old
|
|
422
|
+
* endpoints do not expose per-user traffic in a single call.
|
|
423
|
+
*
|
|
424
|
+
* @param includeTraffic - Whether to request traffic counters alongside IPs (native path only).
|
|
425
|
+
* @param reset - Whether to reset the stats after retrieving them.
|
|
426
|
+
*/
|
|
427
|
+
async getUsersStats(includeTraffic = false, reset = false) {
|
|
428
|
+
if (this.supportsGetUsersStats === false) {
|
|
429
|
+
return this.getUsersStatsLegacy(reset);
|
|
430
|
+
}
|
|
431
|
+
try {
|
|
432
|
+
const response = await this.client.getUsersStats({
|
|
433
|
+
includeTraffic,
|
|
434
|
+
reset,
|
|
435
|
+
});
|
|
436
|
+
this.supportsGetUsersStats = true;
|
|
437
|
+
return {
|
|
438
|
+
isOk: true,
|
|
439
|
+
data: new models_1.GetUsersStatsResponseModel(response),
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
if (error instanceof nice_grpc_1.ClientError && error.code === nice_grpc_1.Status.UNIMPLEMENTED) {
|
|
444
|
+
this.supportsGetUsersStats = false;
|
|
445
|
+
return this.getUsersStatsLegacy(reset);
|
|
446
|
+
}
|
|
447
|
+
let message = '';
|
|
448
|
+
if (error instanceof Error) {
|
|
449
|
+
message = error.message;
|
|
450
|
+
}
|
|
451
|
+
return {
|
|
452
|
+
isOk: false,
|
|
453
|
+
...errors_1.STATS_ERRORS.GET_USERS_STATS_ERROR(message),
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Legacy fallback for {@link getUsersStats}. Uses `GetAllOnlineUsers` to
|
|
459
|
+
* enumerate currently connected users and then queries
|
|
460
|
+
* `GetStatsOnlineIpList` for each of them in parallel with a bounded
|
|
461
|
+
* worker pool. Always returns `traffic: undefined` for every user.
|
|
462
|
+
* @private
|
|
463
|
+
*/
|
|
464
|
+
async getUsersStatsLegacy(reset) {
|
|
465
|
+
try {
|
|
466
|
+
const { users: onlineUsers } = await this.client.getAllOnlineUsers({});
|
|
467
|
+
const onlinePairs = Array.from(new Set(onlineUsers)).map((metricName) => ({
|
|
468
|
+
metricName,
|
|
469
|
+
email: metricName.slice('user>>>'.length, -'>>>online'.length),
|
|
470
|
+
}));
|
|
471
|
+
const results = new Array(onlinePairs.length);
|
|
472
|
+
const concurrency = Math.min(50, onlinePairs.length);
|
|
473
|
+
let cursor = 0;
|
|
474
|
+
const worker = async () => {
|
|
475
|
+
while (true) {
|
|
476
|
+
const index = cursor++;
|
|
477
|
+
if (index >= onlinePairs.length)
|
|
478
|
+
return;
|
|
479
|
+
const { metricName, email } = onlinePairs[index];
|
|
480
|
+
let ips = [];
|
|
481
|
+
try {
|
|
482
|
+
const ipListResponse = await this.client.getStatsOnlineIpList({
|
|
483
|
+
name: metricName,
|
|
484
|
+
reset,
|
|
485
|
+
});
|
|
486
|
+
ips = Object.entries(ipListResponse.ips).map(([ip, lastSeen]) => ({
|
|
487
|
+
ip,
|
|
488
|
+
lastSeen: new Date(lastSeen * 1000),
|
|
489
|
+
}));
|
|
490
|
+
}
|
|
491
|
+
catch {
|
|
492
|
+
// ignore
|
|
493
|
+
}
|
|
494
|
+
results[index] = { userId: email, ips, traffic: undefined };
|
|
495
|
+
}
|
|
496
|
+
};
|
|
497
|
+
const workers = [];
|
|
498
|
+
for (let i = 0; i < concurrency; i++) {
|
|
499
|
+
workers.push(worker());
|
|
500
|
+
}
|
|
501
|
+
await Promise.all(workers);
|
|
502
|
+
const filtered = results.filter((user) => user.ips.length > 0);
|
|
503
|
+
return {
|
|
504
|
+
isOk: true,
|
|
505
|
+
data: models_1.GetUsersStatsResponseModel.fromUserStats(filtered),
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
catch (error) {
|
|
509
|
+
let message = '';
|
|
510
|
+
if (error instanceof Error) {
|
|
511
|
+
message = error.message;
|
|
512
|
+
}
|
|
513
|
+
return {
|
|
514
|
+
isOk: false,
|
|
515
|
+
...errors_1.STATS_ERRORS.GET_USERS_STATS_ERROR(message),
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Gets the raw gRPC client for direct access to all stats service methods
|
|
521
|
+
* @returns The underlying StatsServiceClient instance
|
|
522
|
+
*/
|
|
523
|
+
get rawClient() {
|
|
524
|
+
return this.client;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
exports.StatsService = StatsService;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
|
|
2
|
+
import { TypedMessage } from "../../common/serial/typed_message";
|
|
3
|
+
export declare const protobufPackage = "xray.app.commander";
|
|
4
|
+
/** Config is the settings for Commander. */
|
|
5
|
+
export interface Config {
|
|
6
|
+
$type: "xray.app.commander.Config";
|
|
7
|
+
/** Tag of the outbound handler that handles grpc connections. */
|
|
8
|
+
tag: string;
|
|
9
|
+
/** Network address of commander grpc service. */
|
|
10
|
+
listen: string;
|
|
11
|
+
/**
|
|
12
|
+
* Services that supported by this server. All services must implement Service
|
|
13
|
+
* interface.
|
|
14
|
+
*/
|
|
15
|
+
service: TypedMessage[];
|
|
16
|
+
}
|
|
17
|
+
/** ReflectionConfig is the placeholder config for ReflectionService. */
|
|
18
|
+
export interface ReflectionConfig {
|
|
19
|
+
$type: "xray.app.commander.ReflectionConfig";
|
|
20
|
+
}
|
|
21
|
+
export declare const Config: MessageFns<Config, "xray.app.commander.Config">;
|
|
22
|
+
export declare const ReflectionConfig: MessageFns<ReflectionConfig, "xray.app.commander.ReflectionConfig">;
|
|
23
|
+
type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
|
|
24
|
+
export type DeepPartial<T> = T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {} ? {
|
|
25
|
+
[K in Exclude<keyof T, "$type">]?: DeepPartial<T[K]>;
|
|
26
|
+
} : Partial<T>;
|
|
27
|
+
export interface MessageFns<T, V extends string> {
|
|
28
|
+
readonly $type: V;
|
|
29
|
+
encode(message: T, writer?: BinaryWriter): BinaryWriter;
|
|
30
|
+
decode(input: BinaryReader | Uint8Array, length?: number): T;
|
|
31
|
+
fromJSON(object: any): T;
|
|
32
|
+
toJSON(message: T): unknown;
|
|
33
|
+
create(base?: DeepPartial<T>): T;
|
|
34
|
+
fromPartial(object: DeepPartial<T>): T;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../src/xray-protos/app/commander/config.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,4CAA4C;AAC5C,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,2BAA2B,CAAC;IACnC,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,qCAAqC,CAAC;CAC9C;AAMD,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,2BAA2B,CA2FlE,CAAC;AAQF,eAAO,MAAM,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,EAAE,qCAAqC,CAuChG,CAAC;AAIF,KAAK,OAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,CAAC,GAC9C,CAAC,SAAS,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACtE,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAChE,CAAC,SAAS,EAAE,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACvE,OAAO,CAAC,CAAC,CAAC,CAAC;AAMf,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM;IAC7C,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;IACxD,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IACzB,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACxC"}
|