vesal
Version:
Armaghan Vesal SMS API client for JS/TS/ESM/Node.js
473 lines (368 loc) • 12 kB
Markdown
# Vesal
A modern TypeScript/JavaScript client for the Armaghan Vesal SMS API.
[](https://www.npmjs.com/package/vesal)
[](https://opensource.org/licenses/MIT)
## Features
- 🚀 Modern ESM/CommonJS support
- 📘 Full TypeScript support with type definitions
- 🔄 Promise-based API
- ✨ Simple and intuitive interface
- 🛡️ Built-in error handling
- 📱 Send SMS (one-to-many and many-to-many)
- 📊 Check message status
- 📥 Receive messages
- 👤 Account management
## Installation
```bash
npm install vesal
```
```bash
yarn add vesal
```
```bash
pnpm add vesal
```
## Quick Start
```typescript
import { Vesal } from 'vesal';
// Initialize the client
const client = new Vesal(
'your-username',
'your-password',
'your-sender-number'
);
// Send a simple SMS
const result = await client.Send({
recipients: '09123456789',
messages: 'Hello, World!'
});
console.log(`Sent ${result.count.success} messages successfully`);
```
## API Reference
### Constructor
```typescript
new Vesal(username: string, password: string, from: string)
```
Creates a new Vesal client instance.
**Parameters:**
- `username` - Your Vesal API username
- `password` - Your Vesal API password
- `from` - Default sender number
**Example:**
```typescript
const client = new Vesal('myusername', 'mypassword', '50002710000000');
```
### Send()
```typescript
async Send({
recipients,
messages,
from
}: {
recipients: string | string[];
messages: string | string[];
from?: string | string[];
}): Promise<IVesalResponse_Send_WithCount>
```
Sends SMS messages to one or multiple recipients.
**Parameters:**
- `recipients` - Phone number(s) to send to (e.g., `'09123456789'` or `['09123456789', '09987654321']`)
- `messages` - Message content(s) to send
- `from` - (Optional) Sender number(s), defaults to the number set in constructor
**Return Value:**
```typescript
{
references: (number | string)[], // Reference IDs for sent messages
count: {
success: number, // Number of successfully sent messages
fail: number // Number of failed messages
},
errorModel: {
errorCode: number,
timestamp: string | number | null
}
}
```
#### Send Methods
**One-to-Many (Same message to multiple recipients):**
```typescript
await client.Send({
recipients: ['09123456789', '09987654321'],
messages: 'Hello everyone!'
});
```
**Many-to-Many (Different messages to different recipients):**
```typescript
await client.Send({
recipients: ['09123456789', '09987654321'],
messages: ['Hello John!', 'Hello Jane!']
});
```
**Single message with custom sender:**
```typescript
await client.Send({
recipients: '09123456789',
messages: 'Your verification code is 1234',
from: '50002710000001'
});
```
### GetMessageStatus()
```typescript
async GetMessageStatus(referencesIds: number[]): Promise<IVesalResponse_MessageState>
```
Gets the delivery status of sent messages.
**Parameters:**
- `referencesIds` - Array of reference IDs returned from `Send()`
**Return Value:**
```typescript
{
states: Array<{
id: number, // Reference ID
state: number // Status code (see Message States below)
}>,
errorModel: {
errorCode: number,
timestamp: string | number | null
}
}
```
**Example:**
```typescript
const sendResult = await client.Send({
recipients: '09123456789',
messages: 'Test message'
});
// Wait a bit for delivery
await new Promise(resolve => setTimeout(resolve, 5000));
const statusResult = await client.GetMessageStatus(sendResult.references);
console.log(statusResult.states);
// Output: [{ id: 123456, state: 2 }]
```
### GetReceivedMessages()
```typescript
async GetReceivedMessages(): Promise<IVesalResponse_ReceivedMessages>
```
Retrieves all received messages.
**Return Value:**
```typescript
{
messageModels: Array<{
originator: string, // Sender's phone number
destination: string, // Your receiving number
content: string // Message content
}>,
errorModel: {
errorCode: number,
timestamp: string | number | null
}
}
```
**Example:**
```typescript
const received = await client.GetReceivedMessages();
received.messageModels.forEach(msg => {
console.log(`From: ${msg.originator}`);
console.log(`To: ${msg.destination}`);
console.log(`Message: ${msg.content}`);
});
```
### GetReceivedMessagesCount()
```typescript
async GetReceivedMessagesCount(): Promise<IVesalResponse_ReceivedMessagesCount>
```
Gets the count of received messages.
**Return Value:**
```typescript
{
count: number,
errorModel: {
errorCode: number,
timestamp: string | number | null
}
}
```
**Example:**
```typescript
const result = await client.GetReceivedMessagesCount();
console.log(`You have ${result.count} new messages`);
```
### GetUserInfo()
```typescript
async GetUserInfo(): Promise<IVesalResponse_UserInfo>
```
Retrieves user account information including credit balance, active numbers, and account status.
**Return Value:**
```typescript
{
user: {
credit: number, // Account credit balance
numbers: string[], // Your sender numbers
username: string,
active: boolean,
expirationDate: string,
// ... other account details
},
errorModel: {
errorCode: number,
timestamp: string | number | null
}
}
```
**Example:**
```typescript
const userInfo = await client.GetUserInfo();
console.log(`Credit: ${userInfo.user.credit}`);
console.log(`Active: ${userInfo.user.active}`);
console.log(`Numbers: ${userInfo.user.numbers.join(', ')}`);
console.log(`Expires: ${userInfo.user.expirationDate}`);
```
---
## Error Handling
The package includes a custom `VesalError` class for API errors:
```typescript
import { Vesal, VesalError } from 'vesal';
try {
await client.Send({
recipients: '09123456789',
messages: 'Test'
});
} catch (error) {
if (error instanceof VesalError) {
console.error(`Vesal Error ${error.status}: ${error.message}`);
} else {
console.error('Unexpected error:', error);
}
}
```
### Common Error Codes
| Code | Description (English) | توضیحات (فارسی) |
|------|----------------------|------------------|
| 0 | Success | عملیات با موفقیت انجام شد |
| -100 | Reference ID not found | refrenceId مورد نظر یافت نشد |
| -101 | Authentication failed | احراز هویت کاربر موفقیت آمیز نبود |
| -102 | Username not found | نام کاربری یافت نشد |
| -103 | Invalid originator number | شماره originator اشتباه یا در بازه شماره های کاربر نیست |
| -104 | Insufficient credit | اعتبار کم است |
| -105 | Invalid request format | فرمت درخواست اشتباه است |
| -107 | Invalid recipient number | شماره گیرنده پیامک اشتباه است |
| -109 | Account expired | تاریخ انقضای حساب کاربری فرارسیده است |
| -110 | IP not allowed | درخواست از ip مجاز کاربر ارسال نشده است |
| -111 | Number blacklisted | شماره گیرنده در بلک لیست قرار دارد |
| -112 | Account inactive | حساب مشتری فعال نیست |
| -119 | Access denied | کاربر به سرویس مورد نظر دسترسی ندارد |
| -120 | No valid recipients | پیام ارسال شده دارای هیچ شماره معتبری نیست |
| -137 | Forbidden content | پیام نباید حاوی کلمات غیرمجاز می باشد |
**Get error description:**
```typescript
import { GetStatusText } from 'vesal';
const errorMessage = GetStatusText(-104);
console.log(errorMessage); // "اعتبار کم است"
```
## Message States
After sending a message, you can check its delivery status:
| State | Description (English) | توضیحات (فارسی) |
|-------|----------------------|------------------|
| 0 | In queue | پیامک در صف ارسال قرار دارد |
| 1 | Sent to operator | ارسال شده |
| 2 | Delivered | پیامک به موبایل گیرنده تحویل شده است |
| 3 | Not delivered | پیامک به موبایل گیرنده تحویل نشده است |
| 4 | Unknown status | وضعیت نامشخص |
| 5 | Received by system | پیامک توسط وب سرویس به شرکت ارمغان راه طلایی رسیده است |
| 6 | Cancelled by operator | پیام از سمت اپراتور لغو شده است |
| 7 | Expired by operator | پیام از سمت اپراتور منقضی شده است |
| 8 | Rejected by operator | پیام از سمت اپراتور reject شده است |
**Access state descriptions:**
```typescript
import { messageStates } from 'vesal';
console.log(messageStates[2]); // "پیامک به موبایل گیرنده تحویل شده است"
```
## Complete Example
```typescript
import { Vesal, VesalError, messageStates } from 'vesal';
async function main() {
// Initialize client
const client = new Vesal(
'your-username',
'your-password',
'50002710000000'
);
try {
// Check account info
const userInfo = await client.GetUserInfo();
console.log(`Credit: ${userInfo.user.credit}`);
console.log(`Active: ${userInfo.user.active}`);
// Send SMS
const sendResult = await client.Send({
recipients: ['09123456789', '09987654321'],
messages: 'Hello from Vesal!'
});
console.log(`Successfully sent: ${sendResult.count.success}`);
console.log(`Failed: ${sendResult.count.fail}`);
// Check status after a delay
await new Promise(resolve => setTimeout(resolve, 10000));
const validRefs = sendResult.references.filter(
ref => typeof ref === 'number'
) as number[];
if (validRefs.length > 0) {
const status = await client.GetMessageStatus(validRefs);
status.states.forEach(state => {
console.log(
`Message ${state.id}: ${messageStates[state.state]}`
);
});
}
// Check received messages
const received = await client.GetReceivedMessages();
console.log(`Received ${received.messageModels.length} messages`);
} catch (error) {
if (error instanceof VesalError) {
console.error(`Error ${error.status}: ${error.message}`);
} else {
console.error('Unexpected error:', error);
}
}
}
main();
```
## TypeScript Support
The package includes full TypeScript definitions. All types are automatically available:
```typescript
import type {
IVesalResponse_Send_WithCount,
IVesalResponse_MessageState,
IVesalResponse_ReceivedMessages,
IVesalResponse_ReceivedMessagesCount,
IVesalResponse_UserInfo
} from 'vesal';
```
You can also import the source TypeScript directly:
```typescript
import { Vesal } from 'vesal/ts';
```
## API Endpoint
The package connects to: `http://vesal.armaghan.net:8080/rest`
## License
MIT © [Shahab Movahhedi](https://shmovahhedi.com)
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Support
- **Issues**: [GitHub Issues](https://github.com/movahhedi/vesal/issues)
- **Author**: [Shahab Movahhedi](https://shmovahhedi.com)
- **Email**: dev@shmovahhedi.com
## Links
- [npm Package](https://www.npmjs.com/package/vesal)
- [GitHub Repository](https://github.com/movahhedi/vesal)
- [Author's Website](https://shmovahhedi.com)