@mhbdev/sms 0.2.3 → 0.2.4
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/CHANGELOG.md +6 -0
- package/README.md +55 -54
- package/docs/capabilities.md +11 -11
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 0.2.4
|
|
6
|
+
|
|
7
|
+
### Patch Changes
|
|
8
|
+
|
|
9
|
+
- [#16](https://github.com/mhbdev/sms/pull/16) [`d248189`](https://github.com/mhbdev/sms/commit/d24818936f4b5be4362f7dce72d59e4c586e5625) Thanks [@dependabot](https://github.com/apps/dependabot)! - Update the runtime Zod dependency to 4.6.7 to include upstream security fixes.
|
|
10
|
+
|
|
5
11
|
## 0.2.3
|
|
6
12
|
|
|
7
13
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -21,19 +21,19 @@ npm install @mhbdev/sms
|
|
|
21
21
|
import { KavenegarSmsProvider } from "@mhbdev/sms/kavenegar";
|
|
22
22
|
|
|
23
23
|
const sms = new KavenegarSmsProvider({
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
apiKey: process.env.KAVENEGAR_API_KEY!,
|
|
25
|
+
sender: "90005738",
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
await sms.sendMessage({
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
recipient: "+989121234567",
|
|
30
|
+
message: "Your order is ready.",
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
await sms.sendTemplate({
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
recipient: "+989121234567",
|
|
35
|
+
template: "my-otp-pattern",
|
|
36
|
+
parameters: ["123456"],
|
|
37
37
|
});
|
|
38
38
|
```
|
|
39
39
|
|
|
@@ -42,9 +42,9 @@ options is the default sender number. A message-level `sender` overrides it:
|
|
|
42
42
|
|
|
43
43
|
```ts
|
|
44
44
|
await sms.sendMessage({
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
recipient: "+989121234567",
|
|
46
|
+
message: "Sent from a specific line.",
|
|
47
|
+
sender: "10004346",
|
|
48
48
|
});
|
|
49
49
|
```
|
|
50
50
|
|
|
@@ -58,19 +58,19 @@ returned by Kavenegar is preserved in the normalized result when provided.
|
|
|
58
58
|
import { SmsIrProvider } from "@mhbdev/sms/sms-ir";
|
|
59
59
|
|
|
60
60
|
const sms = new SmsIrProvider({
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
apiKey: process.env.SMS_IR_API_KEY!,
|
|
62
|
+
lineNumber: "300000000000",
|
|
63
63
|
});
|
|
64
64
|
|
|
65
65
|
await sms.sendMessage({
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
recipient: "09121234567",
|
|
67
|
+
message: "Your order is ready.",
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
await sms.sendTemplate({
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
recipient: "09121234567",
|
|
72
|
+
templateId: 123456,
|
|
73
|
+
parameters: [{ name: "CODE", value: "123456" }],
|
|
74
74
|
});
|
|
75
75
|
```
|
|
76
76
|
|
|
@@ -106,13 +106,13 @@ because retrying after an unknown provider response can duplicate a paid SMS.
|
|
|
106
106
|
|
|
107
107
|
```ts
|
|
108
108
|
const sms = new SmsIrProvider({
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
109
|
+
apiKey: process.env.SMS_IR_API_KEY!,
|
|
110
|
+
lineNumber: "300000000000",
|
|
111
|
+
retry: {
|
|
112
|
+
maxAttempts: 3,
|
|
113
|
+
initialDelayMs: 250,
|
|
114
|
+
maxDelayMs: 2_000,
|
|
115
|
+
},
|
|
116
116
|
});
|
|
117
117
|
```
|
|
118
118
|
|
|
@@ -135,46 +135,47 @@ operation is skipped.
|
|
|
135
135
|
|
|
136
136
|
```ts
|
|
137
137
|
import {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
138
|
+
PriorityRoutingStrategy,
|
|
139
|
+
SmsProviderPool,
|
|
140
|
+
WeightedRoundRobinStrategy,
|
|
141
141
|
} from "@mhbdev/sms";
|
|
142
142
|
import { KavenegarSmsProvider } from "@mhbdev/sms/kavenegar";
|
|
143
143
|
import { SmsIrProvider } from "@mhbdev/sms/sms-ir";
|
|
144
144
|
|
|
145
145
|
const kavenegar = new KavenegarSmsProvider({
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
apiKey: process.env.KAVENEGAR_API_KEY!,
|
|
147
|
+
sender: "90005738",
|
|
148
148
|
});
|
|
149
149
|
const smsIr = new SmsIrProvider({
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
apiKey: process.env.SMS_IR_API_KEY!,
|
|
151
|
+
lineNumber: "300000000000",
|
|
152
152
|
});
|
|
153
153
|
|
|
154
154
|
const pool = new SmsProviderPool({
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
155
|
+
strategy: new PriorityRoutingStrategy(), // Or new WeightedRoundRobinStrategy()
|
|
156
|
+
providers: [
|
|
157
|
+
{
|
|
158
|
+
name: "kavenegar",
|
|
159
|
+
priority: 1,
|
|
160
|
+
sendMessage: (message) => kavenegar.sendMessage(message),
|
|
161
|
+
sendTemplate: (message) => kavenegar.sendTemplate(message),
|
|
162
|
+
sendBulk: (message) => kavenegar.sendBulk(message),
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: "sms.ir",
|
|
166
|
+
priority: 2,
|
|
167
|
+
weight: 2,
|
|
168
|
+
sendMessage: (message) =>
|
|
169
|
+
smsIr.sendMessage({
|
|
170
|
+
recipient: message.recipient,
|
|
171
|
+
message: message.message,
|
|
172
|
+
sendAt: message.sendAt,
|
|
173
|
+
signal: message.signal,
|
|
174
|
+
}),
|
|
175
|
+
// Map portable template fields to SMS.ir's templateId and named parameters here.
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
circuitBreaker: { failureThreshold: 3, cooldownMs: 30_000 },
|
|
178
179
|
});
|
|
179
180
|
|
|
180
181
|
await pool.sendMessage({ recipient: "09121234567", message: "Your order is ready." });
|
package/docs/capabilities.md
CHANGED
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
The package keeps the portable contracts small and exposes provider-specific
|
|
4
4
|
operations on the concrete clients where the upstream APIs differ.
|
|
5
5
|
|
|
6
|
-
| Capability
|
|
7
|
-
|
|
|
8
|
-
| Raw message
|
|
9
|
-
| Template/verify
|
|
10
|
-
| Bulk delivery
|
|
11
|
-
| Per-recipient delivery | `sendArray`
|
|
12
|
-
| Scheduling
|
|
13
|
-
| Scheduled cancellation | `SmsMessageScheduler.cancelScheduled` by message IDs
|
|
14
|
-
| Delivery status
|
|
15
|
-
| Outbound reporting
|
|
16
|
-
| Inbound SMS
|
|
6
|
+
| Capability | Kavenegar | SMS.ir |
|
|
7
|
+
| ---------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
8
|
+
| Raw message | `sendMessage` | `sendMessage` |
|
|
9
|
+
| Template/verify | `sendTemplate` with ordered tokens | `sendTemplate` with numeric template ID and named parameters |
|
|
10
|
+
| Bulk delivery | `sendBulk` | `sendBulk` |
|
|
11
|
+
| Per-recipient delivery | `sendArray` | `sendLikeToLike` |
|
|
12
|
+
| Scheduling | `sendAt` on raw/bulk messages | `sendAt` on bulk/like-to-like messages |
|
|
13
|
+
| Scheduled cancellation | `SmsMessageScheduler.cancelScheduled` by message IDs | `SmsPackScheduler.cancelScheduledPack` by pack ID; `cancelScheduled` remains as a compatibility alias |
|
|
14
|
+
| Delivery status | `getDeliveryStatus`, `getStatusByLocalId` | `getMessageStatus`, `getDeliveryStatus` |
|
|
15
|
+
| Outbound reporting | `getSentMessages`, `listSentMessages`, `getLatestSentMessages`, `countSentMessages` | `listPacks`, `getPack` |
|
|
16
|
+
| Inbound SMS | `getReceivedMessages`, `countReceivedMessages` | Not provided by the documented REST surface |
|
|
17
17
|
|
|
18
18
|
All provider clients accept an injected `fetcher`, timeout, custom base URL,
|
|
19
19
|
additional headers, and an optional retry policy. Retry is disabled unless
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mhbdev/sms",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Provider-neutral SMS delivery clients for Kavenegar and SMS.ir.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -75,12 +75,12 @@
|
|
|
75
75
|
"@biomejs/biome": "^2.5.6",
|
|
76
76
|
"@changesets/changelog-github": "^1.0.1",
|
|
77
77
|
"@changesets/cli": "^3.0.3",
|
|
78
|
-
"@types/node": "26.6.
|
|
78
|
+
"@types/node": "26.6.6",
|
|
79
79
|
"publint": "^0.3.25",
|
|
80
80
|
"typescript": "7.0.2",
|
|
81
81
|
"vitest": "^4.1.11"
|
|
82
82
|
},
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"zod": "4.6.
|
|
84
|
+
"zod": "4.6.7"
|
|
85
85
|
}
|
|
86
86
|
}
|