@mhbdev/sms 0.0.0-stage → 0.2.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.
Files changed (79) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +146 -2
  4. package/dist/contracts/http.d.ts +10 -0
  5. package/dist/contracts/http.d.ts.map +1 -0
  6. package/dist/contracts/http.js +2 -0
  7. package/dist/contracts/http.js.map +1 -0
  8. package/dist/contracts/kavenegar.d.ts +53 -0
  9. package/dist/contracts/kavenegar.d.ts.map +1 -0
  10. package/dist/contracts/kavenegar.js +2 -0
  11. package/dist/contracts/kavenegar.js.map +1 -0
  12. package/dist/contracts/sms-ir.d.ts +55 -0
  13. package/dist/contracts/sms-ir.d.ts.map +1 -0
  14. package/dist/contracts/sms-ir.js +2 -0
  15. package/dist/contracts/sms-ir.js.map +1 -0
  16. package/dist/contracts/sms.d.ts +127 -0
  17. package/dist/contracts/sms.d.ts.map +1 -0
  18. package/dist/contracts/sms.js +2 -0
  19. package/dist/contracts/sms.js.map +1 -0
  20. package/dist/errors/kavenegar-error.d.ts +11 -0
  21. package/dist/errors/kavenegar-error.d.ts.map +1 -0
  22. package/dist/errors/kavenegar-error.js +11 -0
  23. package/dist/errors/kavenegar-error.js.map +1 -0
  24. package/dist/errors/sms-error.d.ts +24 -0
  25. package/dist/errors/sms-error.d.ts.map +1 -0
  26. package/dist/errors/sms-error.js +30 -0
  27. package/dist/errors/sms-error.js.map +1 -0
  28. package/dist/errors/sms-ir-error.d.ts +11 -0
  29. package/dist/errors/sms-ir-error.d.ts.map +1 -0
  30. package/dist/errors/sms-ir-error.js +11 -0
  31. package/dist/errors/sms-ir-error.js.map +1 -0
  32. package/dist/index.d.ts +13 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +8 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/kavenegar.d.ts +5 -0
  37. package/dist/kavenegar.d.ts.map +1 -0
  38. package/dist/kavenegar.js +4 -0
  39. package/dist/kavenegar.js.map +1 -0
  40. package/dist/providers/kavenegar/index.d.ts +5 -0
  41. package/dist/providers/kavenegar/index.d.ts.map +1 -0
  42. package/dist/providers/kavenegar/index.js +4 -0
  43. package/dist/providers/kavenegar/index.js.map +1 -0
  44. package/dist/providers/kavenegar/kavenegar-api.d.ts +14 -0
  45. package/dist/providers/kavenegar/kavenegar-api.d.ts.map +1 -0
  46. package/dist/providers/kavenegar/kavenegar-api.js +225 -0
  47. package/dist/providers/kavenegar/kavenegar-api.js.map +1 -0
  48. package/dist/providers/kavenegar/kavenegar-sms-provider.d.ts +35 -0
  49. package/dist/providers/kavenegar/kavenegar-sms-provider.d.ts.map +1 -0
  50. package/dist/providers/kavenegar/kavenegar-sms-provider.js +200 -0
  51. package/dist/providers/kavenegar/kavenegar-sms-provider.js.map +1 -0
  52. package/dist/providers/sms-ir/index.d.ts +5 -0
  53. package/dist/providers/sms-ir/index.d.ts.map +1 -0
  54. package/dist/providers/sms-ir/index.js +4 -0
  55. package/dist/providers/sms-ir/index.js.map +1 -0
  56. package/dist/providers/sms-ir/sms-ir-api.d.ts +15 -0
  57. package/dist/providers/sms-ir/sms-ir-api.d.ts.map +1 -0
  58. package/dist/providers/sms-ir/sms-ir-api.js +193 -0
  59. package/dist/providers/sms-ir/sms-ir-api.js.map +1 -0
  60. package/dist/providers/sms-ir/sms-ir-provider.d.ts +29 -0
  61. package/dist/providers/sms-ir/sms-ir-provider.d.ts.map +1 -0
  62. package/dist/providers/sms-ir/sms-ir-provider.js +165 -0
  63. package/dist/providers/sms-ir/sms-ir-provider.js.map +1 -0
  64. package/dist/sms-ir.d.ts +5 -0
  65. package/dist/sms-ir.d.ts.map +1 -0
  66. package/dist/sms-ir.js +4 -0
  67. package/dist/sms-ir.js.map +1 -0
  68. package/dist/transport/http.d.ts +37 -0
  69. package/dist/transport/http.d.ts.map +1 -0
  70. package/dist/transport/http.js +143 -0
  71. package/dist/transport/http.js.map +1 -0
  72. package/dist/validation/schemas.d.ts +174 -0
  73. package/dist/validation/schemas.d.ts.map +1 -0
  74. package/dist/validation/schemas.js +191 -0
  75. package/dist/validation/schemas.js.map +1 -0
  76. package/docs/architecture.md +73 -0
  77. package/docs/capabilities.md +27 -0
  78. package/docs/migration.md +39 -0
  79. package/package.json +85 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sms-ir-api.d.ts","sourceRoot":"","sources":["../../../src/providers/sms-ir/sms-ir-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,MAAM,2BAA2B,CAAC;AAGnC,KAAK,YAAY,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAiDnF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CA8BvF;AAED,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,GACjB,eAAe,CAgBjB;AAED,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,GACjB,eAAe,CAsBjB;AAED,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACb,uBAAuB,CAazB;AAED,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,GACjB,kBAAkB,CAGpB;AAED,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,GACjB,SAAS,gBAAgB,EAAE,CAgB7B;AAED,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,GACjB,SAAS,gBAAgB,EAAE,CAQ7B"}
@@ -0,0 +1,193 @@
1
+ import { z } from "zod";
2
+ import { SmsIrError } from "../../errors/sms-ir-error.js";
3
+ const stringLikeSchema = z.union([z.string(), z.number().finite()]);
4
+ const payloadSchema = z
5
+ .object({
6
+ status: z.number().finite(),
7
+ message: z.string().optional(),
8
+ data: z.unknown().optional(),
9
+ })
10
+ .loose();
11
+ const sendDataSchema = z
12
+ .object({
13
+ messageId: stringLikeSchema,
14
+ cost: z.number().finite().optional(),
15
+ })
16
+ .loose();
17
+ const bulkDataSchema = z
18
+ .object({
19
+ packId: stringLikeSchema,
20
+ messageIds: z.array(z.union([stringLikeSchema, z.null()])).optional(),
21
+ cost: z.number().finite().optional(),
22
+ })
23
+ .loose();
24
+ const messageDataSchema = z
25
+ .object({
26
+ messageId: stringLikeSchema,
27
+ mobile: stringLikeSchema,
28
+ messageText: z.string().optional(),
29
+ sendDateTime: z.number().finite().optional(),
30
+ lineNumber: z.number().finite().optional(),
31
+ cost: z.number().finite().optional(),
32
+ deliveryState: z.union([z.string(), z.number(), z.boolean()]).nullable().optional(),
33
+ deliveryDateTime: z.number().finite().optional(),
34
+ })
35
+ .loose();
36
+ const packSummarySchema = z
37
+ .object({
38
+ packId: stringLikeSchema,
39
+ recipientCount: z.number().finite(),
40
+ creationDateTime: z.number().finite(),
41
+ })
42
+ .loose();
43
+ const cancellationDataSchema = z
44
+ .object({
45
+ returnedCreditCount: z.number().finite().optional(),
46
+ smsCount: z.number().finite().optional(),
47
+ })
48
+ .loose();
49
+ export function parseSmsIrPayload(response, rawResponse) {
50
+ let value;
51
+ try {
52
+ value = JSON.parse(rawResponse);
53
+ }
54
+ catch (error) {
55
+ throw new SmsIrError("SMS.ir returned a non-JSON response", {
56
+ httpStatus: response.status,
57
+ cause: error,
58
+ });
59
+ }
60
+ const parsed = payloadSchema.safeParse(value);
61
+ if (!parsed.success) {
62
+ throw new SmsIrError("SMS.ir returned an invalid response payload", {
63
+ httpStatus: response.status,
64
+ cause: parsed.error,
65
+ });
66
+ }
67
+ const message = parsed.data.message;
68
+ if (!response.ok || parsed.data.status !== 1) {
69
+ throw new SmsIrError(message ?? "SMS.ir rejected the request", {
70
+ httpStatus: response.status,
71
+ providerStatus: parsed.data.status,
72
+ retryable: response.status === 429 || response.status >= 500,
73
+ });
74
+ }
75
+ return {
76
+ status: parsed.data.status,
77
+ ...(message === undefined ? {} : { message }),
78
+ ...(parsed.data.data === undefined ? {} : { data: parsed.data.data }),
79
+ };
80
+ }
81
+ export function parseSmsIrSendResult(response, rawResponse) {
82
+ const payload = parseSmsIrPayload(response, rawResponse);
83
+ const data = parseSmsIrData(sendDataSchema, payload.data, "SMS.ir response omitted send data");
84
+ const messageId = stringNumberValue(data.messageId, "messageId");
85
+ const cost = numberValueOptional(data.cost);
86
+ return {
87
+ provider: "sms.ir",
88
+ messageId,
89
+ status: "accepted",
90
+ ...(cost === undefined ? {} : { cost }),
91
+ ...(payload.message === undefined ? {} : { providerMessage: payload.message }),
92
+ };
93
+ }
94
+ export function parseSmsIrBulkResult(response, rawResponse) {
95
+ const payload = parseSmsIrPayload(response, rawResponse);
96
+ const data = parseSmsIrData(bulkDataSchema, payload.data, "SMS.ir response omitted bulk data");
97
+ const batchId = stringValue(data.packId, "packId");
98
+ const ids = data.messageIds
99
+ ? data.messageIds.map((value) => value === null ? null : stringNumberValue(value, "messageIds"))
100
+ : [];
101
+ const cost = numberValueOptional(data.cost);
102
+ return {
103
+ provider: "sms.ir",
104
+ messageId: ids[0] ?? null,
105
+ status: "accepted",
106
+ batchId,
107
+ messageIds: ids,
108
+ ...(cost === undefined ? {} : { cost }),
109
+ };
110
+ }
111
+ export function parseSmsIrCancellationResult(response, rawResponse, batchId) {
112
+ const payload = parseSmsIrPayload(response, rawResponse);
113
+ const data = parseSmsIrData(cancellationDataSchema, payload.data, "SMS.ir response omitted cancellation data");
114
+ return {
115
+ provider: "sms.ir",
116
+ batchId,
117
+ returnedCredit: numberValueOptional(data.returnedCreditCount),
118
+ statusText: payload.message,
119
+ };
120
+ }
121
+ export function parseSmsIrMessageStatus(response, rawResponse) {
122
+ const payload = parseSmsIrPayload(response, rawResponse);
123
+ return parseSmsIrMessageData(payload.data);
124
+ }
125
+ export function parseSmsIrPackSummaries(response, rawResponse) {
126
+ const payload = parseSmsIrPayload(response, rawResponse);
127
+ if (!Array.isArray(payload.data))
128
+ throw new SmsIrError("SMS.ir response omitted pack data");
129
+ return payload.data.map((value) => {
130
+ const entry = parseSmsIrData(packSummarySchema, value, "SMS.ir returned an invalid pack entry");
131
+ return {
132
+ packId: stringValue(entry.packId, "packId"),
133
+ recipientCount: numberValue(entry.recipientCount, "recipientCount"),
134
+ createdAt: numberValue(entry.creationDateTime, "creationDateTime"),
135
+ };
136
+ });
137
+ }
138
+ export function parseSmsIrPackMessages(response, rawResponse) {
139
+ const payload = parseSmsIrPayload(response, rawResponse);
140
+ if (!Array.isArray(payload.data))
141
+ throw new SmsIrError("SMS.ir response omitted pack message data");
142
+ return payload.data.map((value) => {
143
+ if (!isRecord(value))
144
+ throw new SmsIrError("SMS.ir returned an invalid pack message");
145
+ return parseSmsIrMessageData(value);
146
+ });
147
+ }
148
+ function parseSmsIrMessageData(data) {
149
+ const entry = parseSmsIrData(messageDataSchema, data, "SMS.ir response omitted message status data");
150
+ const sentAt = numberValueOptional(entry.sendDateTime);
151
+ const lineNumber = numberValueOptional(entry.lineNumber);
152
+ const cost = numberValueOptional(entry.cost);
153
+ const deliveredAt = numberValueOptional(entry.deliveryDateTime);
154
+ return {
155
+ messageId: stringNumberValue(entry.messageId, "messageId"),
156
+ recipient: stringNumberValue(entry.mobile, "mobile"),
157
+ ...(typeof entry.messageText === "string" ? { message: entry.messageText } : {}),
158
+ ...(sentAt === undefined ? {} : { sentAt }),
159
+ ...(lineNumber === undefined ? {} : { lineNumber: String(lineNumber) }),
160
+ ...(cost === undefined ? {} : { cost }),
161
+ ...(entry.deliveryState === null || entry.deliveryState === undefined
162
+ ? {}
163
+ : { deliveryStatus: String(entry.deliveryState) }),
164
+ ...(deliveredAt === undefined ? {} : { deliveredAt }),
165
+ };
166
+ }
167
+ function parseSmsIrData(schema, value, message) {
168
+ const result = schema.safeParse(value);
169
+ if (!result.success)
170
+ throw new SmsIrError(message, { cause: result.error });
171
+ return result.data;
172
+ }
173
+ function stringValue(value, field) {
174
+ const result = typeof value === "string" || typeof value === "number" ? String(value) : undefined;
175
+ if (!result)
176
+ throw new SmsIrError(`SMS.ir response omitted ${field}`);
177
+ return result;
178
+ }
179
+ function stringNumberValue(value, field) {
180
+ return stringValue(value, field);
181
+ }
182
+ function numberValue(value, field) {
183
+ if (typeof value !== "number" || !Number.isFinite(value))
184
+ throw new SmsIrError(`SMS.ir response omitted ${field}`);
185
+ return value;
186
+ }
187
+ function numberValueOptional(value) {
188
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
189
+ }
190
+ function isRecord(value) {
191
+ return typeof value === "object" && value !== null && !Array.isArray(value);
192
+ }
193
+ //# sourceMappingURL=sms-ir-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sms-ir-api.js","sourceRoot":"","sources":["../../../src/providers/sms-ir/sms-ir-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { SmsBulkSender, SmsDeliveryStatus, SmsDeliveryStatusReader, SmsMessageSender, SmsPackScheduler, SmsTemplateSender } from "../../contracts/sms.js";
2
+ import type { SmsIrBulkMessage, SmsIrBulkSendResult, SmsIrCancellationResult, SmsIrLikeToLikeMessage, SmsIrMessage, SmsIrMessageStatus, SmsIrPackMessage, SmsIrPackQuery, SmsIrPackSummary, SmsIrProviderOptions, SmsIrSendResult, SmsIrStatusQuery, SmsIrTemplateMessage } from "../../contracts/sms-ir.js";
3
+ export declare class SmsIrProvider implements SmsMessageSender<SmsIrMessage, SmsIrSendResult>, SmsTemplateSender<SmsIrTemplateMessage, SmsIrSendResult>, SmsBulkSender<SmsIrBulkMessage, SmsIrBulkSendResult>, SmsDeliveryStatusReader<SmsIrStatusQuery, readonly SmsDeliveryStatus[]>, SmsPackScheduler<SmsIrCancellationResult> {
4
+ readonly name = "sms.ir";
5
+ private readonly apiKey;
6
+ private readonly lineNumber;
7
+ private readonly baseUrl;
8
+ private readonly transport;
9
+ constructor(options: SmsIrProviderOptions);
10
+ sendMessage(input: SmsIrMessage): Promise<SmsIrSendResult>;
11
+ sendBulk(input: SmsIrBulkMessage): Promise<SmsIrBulkSendResult>;
12
+ sendLikeToLike(input: SmsIrLikeToLikeMessage): Promise<SmsIrBulkSendResult>;
13
+ sendTemplate(input: SmsIrTemplateMessage): Promise<SmsIrSendResult>;
14
+ cancelScheduled(packId: string): Promise<SmsIrCancellationResult>;
15
+ cancelScheduledPack(packId: string, options?: Readonly<{
16
+ signal?: AbortSignal;
17
+ }>): Promise<SmsIrCancellationResult>;
18
+ getMessageStatus(messageId: string | number, options?: Readonly<{
19
+ signal?: AbortSignal;
20
+ }>): Promise<SmsIrMessageStatus>;
21
+ getDeliveryStatus(query: SmsIrStatusQuery): Promise<readonly SmsDeliveryStatus[]>;
22
+ listPacks(input?: SmsIrPackQuery): Promise<readonly SmsIrPackSummary[]>;
23
+ getPack(packId: string, options?: Readonly<{
24
+ signal?: AbortSignal;
25
+ }>): Promise<readonly SmsIrPackMessage[]>;
26
+ private request;
27
+ private toBulkSendResult;
28
+ }
29
+ //# sourceMappingURL=sms-ir-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sms-ir-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/sms-ir/sms-ir-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACX,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAEhB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,2BAA2B,CAAC;AA+BnC,qBAAa,aACZ,YACC,gBAAgB,CAAC,YAAY,EAAE,eAAe,CAAC,EAC/C,iBAAiB,CAAC,oBAAoB,EAAE,eAAe,CAAC,EACxD,aAAa,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,EACpD,uBAAuB,CAAC,gBAAgB,EAAE,SAAS,iBAAiB,EAAE,CAAC,EACvE,gBAAgB,CAAC,uBAAuB,CAAC;IAE1C,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAE7C,YAAY,OAAO,EAAE,oBAAoB,EAiBxC;IAEK,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB/D;IAEK,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAYpE;IAEK,cAAc,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqBhF;IAEK,YAAY,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgBxE;IAEK,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAEtE;IAEK,mBAAmB,CACxB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,QAAQ,CAAC;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,CAAM,GAC9C,OAAO,CAAC,uBAAuB,CAAC,CAWlC;IAEK,gBAAgB,CACrB,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,OAAO,GAAE,QAAQ,CAAC;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,CAAM,GAC9C,OAAO,CAAC,kBAAkB,CAAC,CAW7B;IAEK,iBAAiB,CACtB,KAAK,EAAE,gBAAgB,GACrB,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAevC;IAEK,SAAS,CAAC,KAAK,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAYhF;IAEK,OAAO,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,QAAQ,CAAC;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,CAAM,GAC9C,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAWtC;YAEa,OAAO;IAgBrB,OAAO,CAAC,gBAAgB;CAmBxB"}
@@ -0,0 +1,165 @@
1
+ import { SmsIrError } from "../../errors/sms-ir-error.js";
2
+ import { SmsHttpTransport, toUnixSeconds, validateRecipients, validateRequiredString, } from "../../transport/http.js";
3
+ import { deliveryStatusQuerySchema, localIdSchema, packQuerySchema, parseInput, signalOptionsSchema, smsIrBulkMessageSchema, smsIrLikeToLikeSchema, smsIrMessageSchema, smsIrOptionsSchema, smsIrTemplateSchema, } from "../../validation/schemas.js";
4
+ import { parseSmsIrBulkResult, parseSmsIrCancellationResult, parseSmsIrMessageStatus, parseSmsIrPackMessages, parseSmsIrPackSummaries, parseSmsIrSendResult, } from "./sms-ir-api.js";
5
+ const DEFAULT_BASE_URL = "https://api.sms.ir/v1";
6
+ export class SmsIrProvider {
7
+ name = "sms.ir";
8
+ apiKey;
9
+ lineNumber;
10
+ baseUrl;
11
+ transport;
12
+ constructor(options) {
13
+ const validated = parseSmsIrInput(smsIrOptionsSchema, options);
14
+ this.apiKey = validated.apiKey;
15
+ this.lineNumber = String(validated.lineNumber);
16
+ validateRequiredString(this.lineNumber, "SMS.ir line number");
17
+ this.baseUrl = (validated.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
18
+ this.transport = new SmsHttpTransport({
19
+ fetcher: validated.fetcher ?? fetch,
20
+ timeoutMs: validated.timeoutMs ?? 10_000,
21
+ retry: validated.retry,
22
+ defaultHeaders: {
23
+ "X-API-KEY": this.apiKey,
24
+ Accept: "application/json",
25
+ "Content-Type": "application/json",
26
+ ...validated.defaultHeaders,
27
+ },
28
+ });
29
+ }
30
+ async sendMessage(input) {
31
+ input = parseSmsIrInput(smsIrMessageSchema, input);
32
+ const result = await this.sendBulk({
33
+ recipients: [input.recipient],
34
+ message: input.message,
35
+ sendAt: input.sendAt,
36
+ signal: input.signal,
37
+ });
38
+ const first = result.messages[0];
39
+ if (!first)
40
+ throw new SmsIrError("SMS.ir returned no message result");
41
+ return {
42
+ ...first,
43
+ provider: "sms.ir",
44
+ batchId: result.batchId,
45
+ messageIds: result.messages.map((item) => item.messageId),
46
+ };
47
+ }
48
+ async sendBulk(input) {
49
+ input = parseSmsIrInput(smsIrBulkMessageSchema, input);
50
+ validateRecipients(input.recipients);
51
+ const body = {
52
+ lineNumber: this.lineNumber,
53
+ messageText: validateRequiredString(input.message, "Message"),
54
+ mobiles: input.recipients,
55
+ sendDateTime: toUnixSeconds(input.sendAt) ?? null,
56
+ };
57
+ const response = await this.request("send/bulk", body, "POST", input.signal);
58
+ const result = parseSmsIrBulkResult(response, await response.text());
59
+ return this.toBulkSendResult(input.recipients, input.sendAt, result);
60
+ }
61
+ async sendLikeToLike(input) {
62
+ input = parseSmsIrInput(smsIrLikeToLikeSchema, input);
63
+ validateRecipients(input.recipients);
64
+ if (input.recipients.length !== input.messages.length) {
65
+ throw new SmsIrError("SMS.ir recipients and messages must have equal lengths");
66
+ }
67
+ const response = await this.request("send/likeToLike", {
68
+ lineNumber: this.lineNumber,
69
+ messageTexts: input.messages.map((message) => validateRequiredString(message, "Message")),
70
+ mobiles: input.recipients,
71
+ sendDateTime: toUnixSeconds(input.sendAt) ?? null,
72
+ }, "POST", input.signal);
73
+ const result = parseSmsIrBulkResult(response, await response.text());
74
+ return this.toBulkSendResult(input.recipients, input.sendAt, result);
75
+ }
76
+ async sendTemplate(input) {
77
+ input = parseSmsIrInput(smsIrTemplateSchema, input);
78
+ if (!Number.isSafeInteger(input.templateId) || input.templateId <= 0) {
79
+ throw new SmsIrError("SMS.ir templateId must be a positive integer");
80
+ }
81
+ const response = await this.request("send/verify", {
82
+ mobile: validateRequiredString(input.recipient, "Recipient"),
83
+ templateId: input.templateId,
84
+ parameters: input.parameters.map(validateParameter),
85
+ }, "POST", input.signal);
86
+ return parseSmsIrSendResult(response, await response.text());
87
+ }
88
+ async cancelScheduled(packId) {
89
+ return this.cancelScheduledPack(packId);
90
+ }
91
+ async cancelScheduledPack(packId, options = {}) {
92
+ packId = parseSmsIrInput(localIdSchema, packId).toString();
93
+ options = parseSmsIrInput(signalOptionsSchema, options);
94
+ const id = validateRequiredString(packId, "Pack ID");
95
+ const response = await this.request(`send/scheduled/${encodeURIComponent(id)}`, undefined, "DELETE", options.signal);
96
+ return parseSmsIrCancellationResult(response, await response.text(), id);
97
+ }
98
+ async getMessageStatus(messageId, options = {}) {
99
+ messageId = parseSmsIrInput(localIdSchema, messageId);
100
+ options = parseSmsIrInput(signalOptionsSchema, options);
101
+ const id = validateRequiredString(String(messageId), "Message ID");
102
+ const response = await this.request(`send/${encodeURIComponent(id)}`, undefined, "GET", options.signal);
103
+ return parseSmsIrMessageStatus(response, await response.text());
104
+ }
105
+ async getDeliveryStatus(query) {
106
+ query = parseSmsIrInput(deliveryStatusQuerySchema, query);
107
+ if (query.messageIds.length === 0)
108
+ throw new SmsIrError("messageIds must contain at least one identifier");
109
+ const statuses = await Promise.all(query.messageIds.map((messageId) => this.getMessageStatus(messageId, { signal: query.signal })));
110
+ return statuses.map((status) => ({
111
+ messageId: status.messageId,
112
+ providerStatus: status.deliveryStatus ?? "unknown",
113
+ ...(status.deliveredAt === undefined ? {} : { deliveredAt: status.deliveredAt }),
114
+ recipient: status.recipient,
115
+ }));
116
+ }
117
+ async listPacks(input = {}) {
118
+ input = parseSmsIrInput(packQuerySchema, input);
119
+ const query = new URLSearchParams();
120
+ if (input.pageNumber !== undefined)
121
+ query.set("pageNumber", String(input.pageNumber));
122
+ if (input.pageSize !== undefined)
123
+ query.set("pageSize", String(input.pageSize));
124
+ const response = await this.request(`send/pack${query.size ? `?${query}` : ""}`, undefined, "GET", input.signal);
125
+ return parseSmsIrPackSummaries(response, await response.text());
126
+ }
127
+ async getPack(packId, options = {}) {
128
+ packId = parseSmsIrInput(localIdSchema, packId).toString();
129
+ options = parseSmsIrInput(signalOptionsSchema, options);
130
+ const id = validateRequiredString(packId, "Pack ID");
131
+ const response = await this.request(`send/pack/${encodeURIComponent(id)}`, undefined, "GET", options.signal);
132
+ return parseSmsIrPackMessages(response, await response.text());
133
+ }
134
+ async request(path, body, method = "POST", signal) {
135
+ return this.transport.request(`${this.baseUrl}/${path}`, {
136
+ method,
137
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
138
+ }, { signal });
139
+ }
140
+ toBulkSendResult(recipients, sendAt, result) {
141
+ return {
142
+ provider: "sms.ir",
143
+ batchId: result.batchId,
144
+ cost: result.cost,
145
+ messages: (result.messageIds ?? []).map((messageId, index) => ({
146
+ provider: "sms.ir",
147
+ messageId,
148
+ status: sendAt === undefined ? "accepted" : "scheduled",
149
+ recipient: recipients[index],
150
+ batchId: result.batchId,
151
+ cost: result.cost,
152
+ })),
153
+ };
154
+ }
155
+ }
156
+ function parseSmsIrInput(schema, value) {
157
+ return parseInput(schema, value, (message, cause) => new SmsIrError(message, { cause }));
158
+ }
159
+ function validateParameter(parameter) {
160
+ return {
161
+ name: validateRequiredString(parameter.name, "Template parameter name"),
162
+ value: parameter.value,
163
+ };
164
+ }
165
+ //# sourceMappingURL=sms-ir-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sms-ir-provider.js","sourceRoot":"","sources":["../../../src/providers/sms-ir/sms-ir-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type * from "./contracts/sms-ir.js";
2
+ export { SmsIrError } from "./errors/sms-ir-error.js";
3
+ export { parseSmsIrBulkResult, parseSmsIrCancellationResult, parseSmsIrMessageStatus, parseSmsIrPackMessages, parseSmsIrPackSummaries, parseSmsIrPayload, parseSmsIrSendResult, } from "./providers/sms-ir/sms-ir-api.js";
4
+ export { SmsIrProvider, SmsIrProvider as SmsIrSmsProvider, } from "./providers/sms-ir/sms-ir-provider.js";
5
+ //# sourceMappingURL=sms-ir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sms-ir.d.ts","sourceRoot":"","sources":["../src/sms-ir.ts"],"names":[],"mappings":"AAAA,mBAAmB,uBAAuB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EACN,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,GACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACN,aAAa,EACb,aAAa,IAAI,gBAAgB,GACjC,MAAM,uCAAuC,CAAC"}
package/dist/sms-ir.js ADDED
@@ -0,0 +1,4 @@
1
+ export { SmsIrError } from "./errors/sms-ir-error.js";
2
+ export { parseSmsIrBulkResult, parseSmsIrCancellationResult, parseSmsIrMessageStatus, parseSmsIrPackMessages, parseSmsIrPackSummaries, parseSmsIrPayload, parseSmsIrSendResult, } from "./providers/sms-ir/sms-ir-api.js";
3
+ export { SmsIrProvider, SmsIrProvider as SmsIrSmsProvider, } from "./providers/sms-ir/sms-ir-provider.js";
4
+ //# sourceMappingURL=sms-ir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sms-ir.js","sourceRoot":"","sources":["../src/sms-ir.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EACN,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,GACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACN,aAAa,EACb,aAAa,IAAI,gBAAgB,GACjC,MAAM,uCAAuC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { SmsHttpFetcher } from "../contracts/http.js";
2
+ export type RetryContext = Readonly<{
3
+ attempt: number;
4
+ response?: Response;
5
+ error?: unknown;
6
+ }>;
7
+ export type RetryPolicy = Readonly<{
8
+ maxAttempts: number;
9
+ initialDelayMs?: number;
10
+ maxDelayMs?: number;
11
+ backoffMultiplier?: number;
12
+ retryOn?: (context: RetryContext) => boolean;
13
+ sleep?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
14
+ }>;
15
+ export type RequestOptions = Readonly<{
16
+ signal?: AbortSignal;
17
+ }>;
18
+ export declare class SmsHttpTransport {
19
+ private readonly fetcher;
20
+ private readonly timeoutMs;
21
+ private readonly retry?;
22
+ private readonly defaultHeaders;
23
+ constructor(options: Readonly<{
24
+ fetcher: SmsHttpFetcher;
25
+ timeoutMs: number;
26
+ retry?: RetryPolicy;
27
+ defaultHeaders?: Readonly<Record<string, string>>;
28
+ }>);
29
+ request(input: string | URL, init: RequestInit, options?: RequestOptions): Promise<Response>;
30
+ private fetchOnce;
31
+ private shouldRetry;
32
+ private waitBeforeRetry;
33
+ }
34
+ export declare function validateRequiredString(value: string, name: string): string;
35
+ export declare function validateRecipients(recipients: readonly string[]): void;
36
+ export declare function toUnixSeconds(value: number | Date | undefined): number | undefined;
37
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC;IAC7C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC,CAAC;AAIH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAElE,YACC,OAAO,EAAE,QAAQ,CAAC;QACjB,OAAO,EAAE,cAAc,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,WAAW,CAAC;QACpB,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;KAClD,CAAC,EAUF;IAEK,OAAO,CACZ,KAAK,EAAE,MAAM,GAAG,GAAG,EACnB,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAoBnB;YAEa,SAAS;IAsBvB,OAAO,CAAC,WAAW;YAWL,eAAe;CAmB7B;AA6CD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAItE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAOlF"}
@@ -0,0 +1,143 @@
1
+ import { SmsTransportError, SmsValidationError } from "../errors/sms-error.js";
2
+ const RETRYABLE_STATUS_CODES = new Set([408, 425, 429]);
3
+ export class SmsHttpTransport {
4
+ fetcher;
5
+ timeoutMs;
6
+ retry;
7
+ defaultHeaders;
8
+ constructor(options) {
9
+ if (!Number.isSafeInteger(options.timeoutMs) || options.timeoutMs <= 0) {
10
+ throw new SmsValidationError("SMS timeout must be a positive integer");
11
+ }
12
+ validateRetryPolicy(options.retry);
13
+ this.fetcher = options.fetcher;
14
+ this.timeoutMs = options.timeoutMs;
15
+ this.retry = options.retry;
16
+ this.defaultHeaders = options.defaultHeaders ?? {};
17
+ }
18
+ async request(input, init, options = {}) {
19
+ const maxAttempts = this.retry?.maxAttempts ?? 1;
20
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
21
+ try {
22
+ const response = await this.fetchOnce(input, init, options);
23
+ if (attempt < maxAttempts && this.shouldRetry({ attempt, response })) {
24
+ await this.waitBeforeRetry(attempt, response, options.signal);
25
+ continue;
26
+ }
27
+ return response;
28
+ }
29
+ catch (error) {
30
+ if (attempt < maxAttempts && this.shouldRetry({ attempt, error })) {
31
+ await this.waitBeforeRetry(attempt, undefined, options.signal);
32
+ continue;
33
+ }
34
+ if (error instanceof SmsTransportError)
35
+ throw error;
36
+ throw new SmsTransportError("SMS request failed to send", { cause: error });
37
+ }
38
+ }
39
+ throw new SmsTransportError("SMS request exhausted its retry policy");
40
+ }
41
+ async fetchOnce(input, init, options) {
42
+ const controller = new AbortController();
43
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
44
+ const externalAbort = () => controller.abort();
45
+ if (options.signal?.aborted)
46
+ controller.abort();
47
+ options.signal?.addEventListener("abort", externalAbort, { once: true });
48
+ try {
49
+ return await this.fetcher(input, {
50
+ ...init,
51
+ headers: { ...this.defaultHeaders, ...init.headers },
52
+ signal: controller.signal,
53
+ });
54
+ }
55
+ finally {
56
+ clearTimeout(timeout);
57
+ options.signal?.removeEventListener("abort", externalAbort);
58
+ }
59
+ }
60
+ shouldRetry(context) {
61
+ if (this.retry?.retryOn)
62
+ return this.retry.retryOn(context);
63
+ if (context.response) {
64
+ return (RETRYABLE_STATUS_CODES.has(context.response.status) ||
65
+ context.response.status >= 500);
66
+ }
67
+ return context.error !== undefined;
68
+ }
69
+ async waitBeforeRetry(attempt, response, signal) {
70
+ const policy = this.retry;
71
+ if (!policy)
72
+ return;
73
+ const initialDelayMs = policy.initialDelayMs ?? 100;
74
+ const maxDelayMs = policy.maxDelayMs ?? 5_000;
75
+ const multiplier = policy.backoffMultiplier ?? 2;
76
+ const retryAfter = response
77
+ ? parseRetryAfter(response.headers.get("retry-after"))
78
+ : undefined;
79
+ const backoff = Math.min(maxDelayMs, initialDelayMs * multiplier ** Math.max(0, attempt - 1));
80
+ await (policy.sleep ?? sleep)(retryAfter ?? backoff, signal);
81
+ }
82
+ }
83
+ function validateRetryPolicy(policy) {
84
+ if (!policy)
85
+ return;
86
+ if (!Number.isSafeInteger(policy.maxAttempts) || policy.maxAttempts < 1) {
87
+ throw new SmsValidationError("Retry maxAttempts must be a positive integer");
88
+ }
89
+ for (const [name, value] of [
90
+ ["initialDelayMs", policy.initialDelayMs],
91
+ ["maxDelayMs", policy.maxDelayMs],
92
+ ]) {
93
+ if (value !== undefined && (!Number.isFinite(value) || value < 0)) {
94
+ throw new SmsValidationError(`Retry ${name} must be a non-negative number`);
95
+ }
96
+ }
97
+ if (policy.backoffMultiplier !== undefined &&
98
+ (!Number.isFinite(policy.backoffMultiplier) || policy.backoffMultiplier < 1)) {
99
+ throw new SmsValidationError("Retry backoffMultiplier must be at least one");
100
+ }
101
+ }
102
+ function parseRetryAfter(value) {
103
+ if (!value)
104
+ return undefined;
105
+ const seconds = Number(value);
106
+ if (Number.isFinite(seconds))
107
+ return Math.max(0, seconds * 1_000);
108
+ const timestamp = Date.parse(value);
109
+ return Number.isNaN(timestamp) ? undefined : Math.max(0, timestamp - Date.now());
110
+ }
111
+ async function sleep(delayMs, signal) {
112
+ await new Promise((resolve, reject) => {
113
+ const timeout = setTimeout(resolve, delayMs);
114
+ const abort = () => {
115
+ clearTimeout(timeout);
116
+ reject(signal?.reason ?? new DOMException("The operation was aborted", "AbortError"));
117
+ };
118
+ if (signal?.aborted)
119
+ abort();
120
+ signal?.addEventListener("abort", abort, { once: true });
121
+ });
122
+ }
123
+ export function validateRequiredString(value, name) {
124
+ if (!value.trim())
125
+ throw new SmsValidationError(`${name} is required`);
126
+ return value;
127
+ }
128
+ export function validateRecipients(recipients) {
129
+ if (recipients.length === 0)
130
+ throw new SmsValidationError("At least one recipient is required");
131
+ for (const recipient of recipients)
132
+ validateRequiredString(recipient, "Recipient");
133
+ }
134
+ export function toUnixSeconds(value) {
135
+ if (value === undefined)
136
+ return undefined;
137
+ const seconds = value instanceof Date ? Math.floor(value.getTime() / 1_000) : value;
138
+ if (!Number.isSafeInteger(seconds) || seconds < 0) {
139
+ throw new SmsValidationError("sendAt must be a non-negative Unix timestamp");
140
+ }
141
+ return seconds;
142
+ }
143
+ //# sourceMappingURL=http.js.map