
Research
Supply Chain Attack on Axios Pulls Malicious Dependency from npm
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.
@localzet/xtls-sdk
Advanced tools
A TypeScript SDK for interacting with XRAY (XTLS) Core via gRPC API. This package provides a type-safe interface for managing and monitoring your XRAY server, including statistics, user management, and connection information.
npm install @localzet/xtls-sdk
import { XtlsApi } from '@localzet/xtls-sdk';
// Initialize the API client
const api = new XtlsApi('127.0.0.1', '10085');
// Example: Get system statistics
const stats = await api.stats.getSysStats();
if (stats.isOk) {
console.log('System Stats:', stats.data);
}
// System Statistics
const sysStats = await api.stats.getSysStats();
// User Statistics
const userStats = await api.stats.getUserStats('username');
const allUsers = await api.stats.getAllUsersStats();
const isOnline = await api.stats.getUserOnlineStatus('username');
// Traffic Statistics
const inbounds = await api.stats.getAllInboundsStats();
const outbounds = await api.stats.getAllOutboundsStats();
All API methods return a standardized response format:
interface ISdkResponse<T> {
isOk: boolean;
data?: T;
message?: string;
code?: string;
}
Example usage:
const response = await api.stats.getSysStats();
if (response.isOk) {
// Success case
console.log('Stats:', response.data);
} else {
// Error case
console.error(`Error ${response.code}: ${response.message}`);
}
Many methods support statistics reset functionality:
// Get stats and reset counters
const stats = await api.stats.getUserStats('username', true);
Main client class for interacting with the XRAY server.
const api = new XtlsApi(ip: string, port: string);
Service for managing inbound handlers and their users.
| Method | Description | Parameters |
|---|---|---|
getInboundUsers(tag: string) | Get all users from an inbound | tag: Inbound handler tag |
getInboundUsersCount(tag: string) | Get count of users in an inbound | tag: Inbound handler tag |
removeUser(tag: string, username: string) | Remove a user from an inbound | tag: Inbound handler tagusername: User to remove |
| Method | Description | Parameters |
|---|---|---|
addTrojanUser(data: IAddTrojanUser) | Add Trojan user | data: { tag, username, password, level } |
addVlessUser(data: IAddVlessUser) | Add VLESS user | data: { tag, username, uuid, flow, level } |
addShadowsocksUser(data: IAddShadowsocksUser) | Add Shadowsocks user | data: { tag, username, password, cipherType, ivCheck, level } |
addShadowsocks2022User(data: IAddShadowsocks2022User) | Add Shadowsocks 2022 user | data: { tag, username, key, level } |
addSocksUser(data: IAddSocksUser) | Add SOCKS user | data: { tag, username, socks_username, socks_password, level } |
addHttpUser(data: IAddHttpUser) | Add HTTP user | data: { tag, username, http_username, http_password, level } |
Example usage:
// Get all users in an inbound
const users = await api.handler.getInboundUsers('main-inbound');
if (users.isOk) {
console.log('Users:', users.data.users);
}
// Add a new Trojan user
const newUser = await api.handler.addTrojanUser({
tag: 'main-inbound',
username: 'user@example.com',
password: 'secure-password',
level: 0,
});
// Remove a user
const removed = await api.handler.removeUser('main-inbound', 'user@example.com');
// Get user count
const count = await api.handler.getInboundUsersCount('main-inbound');
if (count.isOk) {
console.log('Total users:', count.data);
}
Statistics management service.
| Method | Description | Parameters |
|---|---|---|
getSysStats() | Get system statistics | None |
getAllUsersStats(reset?: boolean) | Get all users' statistics | reset: Reset stats after retrieval |
getUserStats(username: string, reset?: boolean) | Get specific user statistics | username: Target userreset: Reset stats after retrieval |
getUserOnlineStatus(username: string) | Check user online status | username: Target user |
getAllInboundsStats(reset?: boolean) | Get all inbound statistics | reset: Reset stats after retrieval |
getInboundStats(inbound: string, reset?: boolean) | Get specific inbound statistics | inbound: Inbound tagreset: Reset stats after retrieval |
getAllOutboundsStats(reset?: boolean) | Get all outbound statistics | reset: Reset stats after retrieval |
getOutboundStats(outbound: string, reset?: boolean) | Get specific outbound statistics | outbound: Outbound tagreset: Reset stats after retrieval |
The SDK provides detailed error information through the response object:
try {
const response = await api.stats.getUserStats('username');
if (!response.isOk) {
console.error(`Operation failed: ${response.message}`);
console.error(`Error code: ${response.code}`);
}
} catch (error) {
console.error('Unexpected error:', error);
}
FAQs
TypeScript SDK for XRAY/AURA Core
We found that @localzet/xtls-sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.

Security News
TeamPCP is partnering with ransomware group Vect to turn open source supply chain attacks on tools like Trivy and LiteLLM into large-scale ransomware operations.