sms-panel-manager 0.0.0-stage → 0.1.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.
@@ -0,0 +1,433 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+ var axios = require('axios');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
9
+
10
+ // src/providers/farazsms.ts
11
+
12
+ // src/core/phone.ts
13
+ var IRAN_MOBILE_LOCAL = /^09\d{9}$/;
14
+ var InvalidIranianMobileNumberError = class extends TypeError {
15
+ code = "invalid_recipient";
16
+ constructor() {
17
+ super("Recipient must be a valid Iranian mobile number.");
18
+ this.name = "InvalidIranianMobileNumberError";
19
+ }
20
+ };
21
+ function normalizeIranianMobile(input) {
22
+ const normalized = input.trim().replace(/^0098/, "0").replace(/^\+98/, "0").replace(/^98/, "0");
23
+ if (!IRAN_MOBILE_LOCAL.test(normalized)) {
24
+ throw new InvalidIranianMobileNumberError();
25
+ }
26
+ return `+98${normalized.slice(1)}`;
27
+ }
28
+ function toIranianLocalMobile(input) {
29
+ const canonical = normalizeIranianMobile(input);
30
+ return `0${canonical.slice(3)}`;
31
+ }
32
+ var AxiosProviderHttpClient = class {
33
+ constructor(instance) {
34
+ this.instance = instance;
35
+ }
36
+ instance;
37
+ async request(config) {
38
+ const response = await this.instance.request(config);
39
+ return { status: response.status, data: response.data };
40
+ }
41
+ };
42
+ function createProviderHttpClient(options) {
43
+ const url = new URL(options.baseURL);
44
+ if (url.protocol !== "https:") {
45
+ throw new TypeError("Provider base URL must use HTTPS.");
46
+ }
47
+ const timeout = options.timeoutMs ?? 1e4;
48
+ if (!Number.isSafeInteger(timeout) || timeout <= 0) {
49
+ throw new TypeError("Provider timeout must be a positive integer.");
50
+ }
51
+ return new AxiosProviderHttpClient(
52
+ axios__default.default.create({
53
+ baseURL: url.toString(),
54
+ timeout,
55
+ maxRedirects: 0,
56
+ responseType: "json",
57
+ validateStatus: () => true,
58
+ headers: { Accept: "application/json" }
59
+ })
60
+ );
61
+ }
62
+
63
+ // src/providers/shared.ts
64
+ function unavailableVerification() {
65
+ return { status: "unavailable", retryable: true };
66
+ }
67
+ function invalidVerification() {
68
+ return { status: "invalid", code: "invalid_credentials" };
69
+ }
70
+ function verified(method) {
71
+ return { status: "verified", method, verifiedAt: /* @__PURE__ */ new Date() };
72
+ }
73
+ function unknownSubmission() {
74
+ return { status: "unknown", code: "unknown_outcome" };
75
+ }
76
+ function rejected(code) {
77
+ return { status: "rejected", code, retryable: false };
78
+ }
79
+
80
+ // src/providers/farazsms.ts
81
+ var farazSmsCredentialsSchema = zod.z.object({ apiKey: zod.z.string().min(1), lineNumber: zod.z.string().min(1) }).strict();
82
+ var responseSchema = zod.z.object({
83
+ status: zod.z.string(),
84
+ data: zod.z.unknown().optional(),
85
+ messages: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional()
86
+ });
87
+ var FarazSmsAdapter = class {
88
+ constructor(http = createProviderHttpClient({
89
+ baseURL: "https://api.iranpayamak.com"
90
+ })) {
91
+ this.http = http;
92
+ }
93
+ http;
94
+ id = "farazsms";
95
+ credentialSchema = farazSmsCredentialsSchema;
96
+ capabilities = {
97
+ credentialVerification: { mode: "credit" },
98
+ templates: {
99
+ binding: "named",
100
+ canList: true,
101
+ canInspect: true,
102
+ canCreate: true
103
+ },
104
+ deliveryStatus: "poll",
105
+ providerIdempotency: false
106
+ };
107
+ async verifyCredentials(credentials, context) {
108
+ try {
109
+ const response = await this.http.request({
110
+ method: "GET",
111
+ url: "/ws/v1/account/balance",
112
+ headers: { "Api-Key": credentials.apiKey },
113
+ ...context.signal === void 0 ? {} : { signal: context.signal }
114
+ });
115
+ if (response.status === 401 || response.status === 403) {
116
+ return invalidVerification();
117
+ }
118
+ const parsed = responseSchema.safeParse(response.data);
119
+ if (!parsed.success) return unavailableVerification();
120
+ if (parsed.data.status !== "success") {
121
+ return invalidVerification();
122
+ }
123
+ return verified("credit");
124
+ } catch {
125
+ return unavailableVerification();
126
+ }
127
+ }
128
+ async sendTemplate(credentials, input, context) {
129
+ try {
130
+ const response = await this.http.request({
131
+ method: "POST",
132
+ url: "/ws/v1/sms/pattern",
133
+ headers: {
134
+ "Api-Key": credentials.apiKey,
135
+ "Content-Type": "application/json"
136
+ },
137
+ data: {
138
+ code: input.template,
139
+ attributes: input.parameters,
140
+ recipient: toIranianLocalMobile(input.recipient),
141
+ line_number: credentials.lineNumber,
142
+ number_format: "english"
143
+ },
144
+ ...context.signal === void 0 ? {} : { signal: context.signal }
145
+ });
146
+ const parsed = responseSchema.safeParse(response.data);
147
+ if (!parsed.success) return unknownSubmission();
148
+ if (parsed.data.status !== "success")
149
+ return rejected("farazsms_rejected");
150
+ if (typeof parsed.data.data !== "string" && typeof parsed.data.data !== "number") {
151
+ return unknownSubmission();
152
+ }
153
+ return {
154
+ status: "accepted",
155
+ providerMessageId: String(parsed.data.data)
156
+ };
157
+ } catch {
158
+ return unknownSubmission();
159
+ }
160
+ }
161
+ };
162
+ var ghasedakCredentialsSchema = zod.z.object({ apiKey: zod.z.string().min(1) }).strict();
163
+ var accountResponseSchema = zod.z.object({
164
+ IsSuccess: zod.z.boolean(),
165
+ StatusCode: zod.z.number()
166
+ });
167
+ var sendResponseSchema = zod.z.object({
168
+ IsSuccess: zod.z.boolean(),
169
+ StatusCode: zod.z.number(),
170
+ Data: zod.z.object({ MessageId: zod.z.union([zod.z.string(), zod.z.number()]) }).optional()
171
+ });
172
+ var GhasedakAdapter = class {
173
+ constructor(http = createProviderHttpClient({
174
+ baseURL: "https://gateway.ghasedak.me"
175
+ })) {
176
+ this.http = http;
177
+ }
178
+ http;
179
+ id = "ghasedak";
180
+ credentialSchema = ghasedakCredentialsSchema;
181
+ capabilities = {
182
+ credentialVerification: { mode: "account" },
183
+ templates: {
184
+ binding: "ordered",
185
+ canList: false,
186
+ canInspect: true,
187
+ canCreate: false
188
+ },
189
+ deliveryStatus: "poll",
190
+ providerIdempotency: true
191
+ };
192
+ async verifyCredentials(credentials, context) {
193
+ try {
194
+ const response = await this.http.request({
195
+ method: "GET",
196
+ url: "/rest/api/v1/WebService/GetAccountInformation",
197
+ headers: { ApiKey: credentials.apiKey },
198
+ ...context.signal === void 0 ? {} : { signal: context.signal }
199
+ });
200
+ if (response.status === 401 || response.status === 403) {
201
+ return invalidVerification();
202
+ }
203
+ const parsed = accountResponseSchema.safeParse(response.data);
204
+ if (!parsed.success) return unavailableVerification();
205
+ if (!parsed.data.IsSuccess) {
206
+ return invalidVerification();
207
+ }
208
+ return verified("account");
209
+ } catch {
210
+ return unavailableVerification();
211
+ }
212
+ }
213
+ async sendTemplate(credentials, input, context) {
214
+ if (input.parameters.length < 1 || input.parameters.length > 10) {
215
+ return rejected("template_binding_invalid");
216
+ }
217
+ const body = {
218
+ receptors: [toIranianLocalMobile(input.recipient)],
219
+ templateName: input.template,
220
+ ...input.clientReferenceId === void 0 ? {} : { clientReferenceId: input.clientReferenceId }
221
+ };
222
+ input.parameters.forEach((value, index) => {
223
+ body[`param${String(index + 1)}`] = String(value);
224
+ });
225
+ try {
226
+ const response = await this.http.request({
227
+ method: "POST",
228
+ url: "/rest/api/v1/WebService/SendOtpWithParams",
229
+ headers: {
230
+ ApiKey: credentials.apiKey,
231
+ "Content-Type": "application/json"
232
+ },
233
+ data: body,
234
+ ...context.signal === void 0 ? {} : { signal: context.signal }
235
+ });
236
+ const parsed = sendResponseSchema.safeParse(response.data);
237
+ if (!parsed.success) return unknownSubmission();
238
+ if (!parsed.data.IsSuccess || parsed.data.Data === void 0) {
239
+ return rejected(`ghasedak_${String(parsed.data.StatusCode)}`);
240
+ }
241
+ return {
242
+ status: "accepted",
243
+ providerMessageId: String(parsed.data.Data.MessageId)
244
+ };
245
+ } catch {
246
+ return unknownSubmission();
247
+ }
248
+ }
249
+ };
250
+ var ipPanelCredentialsSchema = zod.z.object({
251
+ apiToken: zod.z.string().min(1),
252
+ fromNumber: zod.z.string().regex(/^\+98\S+$/)
253
+ }).strict();
254
+ var envelopeSchema = zod.z.object({
255
+ meta: zod.z.object({
256
+ status: zod.z.boolean(),
257
+ message_code: zod.z.string()
258
+ }),
259
+ data: zod.z.unknown()
260
+ });
261
+ var sendDataSchema = zod.z.object({
262
+ message_outbox_ids: zod.z.array(zod.z.union([zod.z.string(), zod.z.number()])).min(1)
263
+ });
264
+ var IpPanelAdapter = class {
265
+ constructor(http = createProviderHttpClient({
266
+ baseURL: "https://edge.ippanel.com"
267
+ })) {
268
+ this.http = http;
269
+ }
270
+ http;
271
+ id = "ippanel";
272
+ credentialSchema = ipPanelCredentialsSchema;
273
+ capabilities = {
274
+ credentialVerification: { mode: "profile" },
275
+ templates: {
276
+ binding: "named",
277
+ canList: true,
278
+ canInspect: true,
279
+ canCreate: true
280
+ },
281
+ deliveryStatus: "poll",
282
+ providerIdempotency: false
283
+ };
284
+ async verifyCredentials(credentials, context) {
285
+ try {
286
+ const response = await this.http.request({
287
+ method: "GET",
288
+ url: "/v1/api/acl/auth/check_token",
289
+ headers: { Authorization: credentials.apiToken },
290
+ ...context.signal === void 0 ? {} : { signal: context.signal }
291
+ });
292
+ if (response.status === 401 || response.status === 403) {
293
+ return invalidVerification();
294
+ }
295
+ const parsed = envelopeSchema.safeParse(response.data);
296
+ if (!parsed.success) return unavailableVerification();
297
+ if (!parsed.data.meta.status) {
298
+ return invalidVerification();
299
+ }
300
+ return verified("profile");
301
+ } catch {
302
+ return unavailableVerification();
303
+ }
304
+ }
305
+ async sendTemplate(credentials, input, context) {
306
+ try {
307
+ const response = await this.http.request({
308
+ method: "POST",
309
+ url: "/v1/api/send",
310
+ headers: {
311
+ Authorization: credentials.apiToken,
312
+ "Content-Type": "application/json"
313
+ },
314
+ data: {
315
+ sending_type: "pattern",
316
+ from_number: credentials.fromNumber,
317
+ code: input.template,
318
+ recipients: [input.recipient],
319
+ params: input.parameters
320
+ },
321
+ ...context.signal === void 0 ? {} : { signal: context.signal }
322
+ });
323
+ const envelope = envelopeSchema.safeParse(response.data);
324
+ if (!envelope.success) return unknownSubmission();
325
+ if (!envelope.data.meta.status) {
326
+ return rejected(`ippanel_${envelope.data.meta.message_code}`);
327
+ }
328
+ const data = sendDataSchema.safeParse(envelope.data.data);
329
+ if (!data.success) return unknownSubmission();
330
+ return {
331
+ status: "accepted",
332
+ providerMessageId: String(data.data.message_outbox_ids[0])
333
+ };
334
+ } catch {
335
+ return unknownSubmission();
336
+ }
337
+ }
338
+ };
339
+ var kavenegarCredentialsSchema = zod.z.object({ apiKey: zod.z.string().min(1) }).strict();
340
+ var responseSchema2 = zod.z.object({
341
+ return: zod.z.object({ status: zod.z.number(), message: zod.z.string() }),
342
+ entries: zod.z.array(zod.z.record(zod.z.string(), zod.z.unknown())).optional()
343
+ });
344
+ var KavenegarAdapter = class {
345
+ constructor(http = createProviderHttpClient({
346
+ baseURL: "https://api.kavenegar.com"
347
+ })) {
348
+ this.http = http;
349
+ }
350
+ http;
351
+ id = "kavenegar";
352
+ credentialSchema = kavenegarCredentialsSchema;
353
+ capabilities = {
354
+ credentialVerification: { mode: "account" },
355
+ templates: {
356
+ binding: "fixed-slots",
357
+ slots: ["token", "token2", "token3", "token10", "token20"],
358
+ canList: false,
359
+ canInspect: false,
360
+ canCreate: false
361
+ },
362
+ deliveryStatus: "poll",
363
+ providerIdempotency: false
364
+ };
365
+ path(apiKey, operation) {
366
+ return `/v1/${encodeURIComponent(apiKey)}/${operation}.json`;
367
+ }
368
+ async verifyCredentials(credentials, context) {
369
+ try {
370
+ const response = await this.http.request({
371
+ method: "GET",
372
+ url: this.path(credentials.apiKey, "account/info"),
373
+ ...context.signal === void 0 ? {} : { signal: context.signal }
374
+ });
375
+ if (response.status === 401 || response.status === 403) {
376
+ return invalidVerification();
377
+ }
378
+ const parsed = responseSchema2.safeParse(response.data);
379
+ if (!parsed.success) return unavailableVerification();
380
+ if (parsed.data.return.status !== 200) {
381
+ return invalidVerification();
382
+ }
383
+ return verified("account");
384
+ } catch {
385
+ return unavailableVerification();
386
+ }
387
+ }
388
+ async sendTemplate(credentials, input, context) {
389
+ if (input.parameters.token === void 0)
390
+ return rejected("template_binding_invalid");
391
+ try {
392
+ const response = await this.http.request({
393
+ method: "GET",
394
+ url: this.path(credentials.apiKey, "verify/lookup"),
395
+ params: {
396
+ receptor: toIranianLocalMobile(input.recipient),
397
+ template: input.template,
398
+ ...Object.fromEntries(
399
+ Object.entries(input.parameters).map(([key, value]) => [
400
+ key,
401
+ String(value)
402
+ ])
403
+ )
404
+ },
405
+ ...context.signal === void 0 ? {} : { signal: context.signal }
406
+ });
407
+ const parsed = responseSchema2.safeParse(response.data);
408
+ if (!parsed.success) return unknownSubmission();
409
+ if (parsed.data.return.status !== 200) {
410
+ return rejected(`kavenegar_${String(parsed.data.return.status)}`);
411
+ }
412
+ const messageId = parsed.data.entries?.[0]?.messageid;
413
+ if (typeof messageId !== "string" && typeof messageId !== "number") {
414
+ return unknownSubmission();
415
+ }
416
+ return { status: "accepted", providerMessageId: String(messageId) };
417
+ } catch {
418
+ return unknownSubmission();
419
+ }
420
+ }
421
+ };
422
+
423
+ exports.FarazSmsAdapter = FarazSmsAdapter;
424
+ exports.GhasedakAdapter = GhasedakAdapter;
425
+ exports.IpPanelAdapter = IpPanelAdapter;
426
+ exports.KavenegarAdapter = KavenegarAdapter;
427
+ exports.createProviderHttpClient = createProviderHttpClient;
428
+ exports.farazSmsCredentialsSchema = farazSmsCredentialsSchema;
429
+ exports.ghasedakCredentialsSchema = ghasedakCredentialsSchema;
430
+ exports.ipPanelCredentialsSchema = ipPanelCredentialsSchema;
431
+ exports.kavenegarCredentialsSchema = kavenegarCredentialsSchema;
432
+ //# sourceMappingURL=providers.cjs.map
433
+ //# sourceMappingURL=providers.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/phone.ts","../src/providers/http.ts","../src/providers/shared.ts","../src/providers/farazsms.ts","../src/providers/ghasedak.ts","../src/providers/ippanel.ts","../src/providers/kavenegar.ts"],"names":["axios","z","responseSchema"],"mappings":"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","file":"providers.cjs","sourcesContent":["const IRAN_MOBILE_LOCAL = /^09\\d{9}$/;\n\nexport class InvalidIranianMobileNumberError extends TypeError {\n readonly code = \"invalid_recipient\";\n\n constructor() {\n super(\"Recipient must be a valid Iranian mobile number.\");\n this.name = \"InvalidIranianMobileNumberError\";\n }\n}\n\nexport function normalizeIranianMobile(input: string): `+98${string}` {\n const normalized = input\n .trim()\n .replace(/^0098/, \"0\")\n .replace(/^\\+98/, \"0\")\n .replace(/^98/, \"0\");\n\n if (!IRAN_MOBILE_LOCAL.test(normalized)) {\n throw new InvalidIranianMobileNumberError();\n }\n\n return `+98${normalized.slice(1)}`;\n}\n\nexport function toIranianLocalMobile(input: string): `09${string}` {\n const canonical = normalizeIranianMobile(input);\n return `0${canonical.slice(3)}` as `09${string}`;\n}\n","import axios, {\n type AxiosInstance,\n type AxiosRequestConfig,\n type AxiosResponse,\n} from \"axios\";\n\nexport interface ProviderHttpResponse {\n readonly status: number;\n readonly data: unknown;\n}\n\nexport interface ProviderHttpClient {\n request(config: AxiosRequestConfig): Promise<ProviderHttpResponse>;\n}\n\nclass AxiosProviderHttpClient implements ProviderHttpClient {\n constructor(private readonly instance: AxiosInstance) {}\n\n async request(config: AxiosRequestConfig): Promise<ProviderHttpResponse> {\n const response: AxiosResponse<unknown> =\n await this.instance.request(config);\n return { status: response.status, data: response.data };\n }\n}\n\nexport function createProviderHttpClient(options: {\n readonly baseURL: string;\n readonly timeoutMs?: number;\n}): ProviderHttpClient {\n const url = new URL(options.baseURL);\n if (url.protocol !== \"https:\") {\n throw new TypeError(\"Provider base URL must use HTTPS.\");\n }\n const timeout = options.timeoutMs ?? 10_000;\n if (!Number.isSafeInteger(timeout) || timeout <= 0) {\n throw new TypeError(\"Provider timeout must be a positive integer.\");\n }\n\n return new AxiosProviderHttpClient(\n axios.create({\n baseURL: url.toString(),\n timeout,\n maxRedirects: 0,\n responseType: \"json\",\n validateStatus: () => true,\n headers: { Accept: \"application/json\" },\n }),\n );\n}\n","import type {\n CredentialVerificationResult,\n ProviderSubmissionResult,\n} from \"../core/provider.js\";\n\nexport function unavailableVerification(): CredentialVerificationResult {\n return { status: \"unavailable\", retryable: true };\n}\n\nexport function invalidVerification(): CredentialVerificationResult {\n return { status: \"invalid\", code: \"invalid_credentials\" };\n}\n\nexport function verified(\n method: \"account\" | \"credit\" | \"profile\" | \"lines\",\n): CredentialVerificationResult {\n return { status: \"verified\", method, verifiedAt: new Date() };\n}\n\nexport function unknownSubmission(): ProviderSubmissionResult {\n return { status: \"unknown\", code: \"unknown_outcome\" };\n}\n\nexport function rejected(code: string): ProviderSubmissionResult {\n return { status: \"rejected\", code, retryable: false };\n}\n","import { z } from \"zod\";\n\nimport type {\n ProviderCallContext,\n ProviderSubmissionResult,\n ProviderTemplateSendInput,\n SmsProviderAdapter,\n} from \"../core/provider.js\";\nimport { toIranianLocalMobile } from \"../core/phone.js\";\nimport { createProviderHttpClient, type ProviderHttpClient } from \"./http.js\";\nimport {\n invalidVerification,\n rejected,\n unavailableVerification,\n unknownSubmission,\n verified,\n} from \"./shared.js\";\n\nexport const farazSmsCredentialsSchema = z\n .object({ apiKey: z.string().min(1), lineNumber: z.string().min(1) })\n .strict();\nexport type FarazSmsCredentials = z.infer<typeof farazSmsCredentialsSchema>;\nexport type FarazSmsParameters = Readonly<Record<string, unknown>>;\n\nconst responseSchema = z.object({\n status: z.string(),\n data: z.unknown().optional(),\n messages: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nexport class FarazSmsAdapter implements SmsProviderAdapter<\n FarazSmsCredentials,\n string,\n FarazSmsParameters\n> {\n readonly id = \"farazsms\";\n readonly credentialSchema = farazSmsCredentialsSchema;\n readonly capabilities = {\n credentialVerification: { mode: \"credit\" },\n templates: {\n binding: \"named\",\n canList: true,\n canInspect: true,\n canCreate: true,\n },\n deliveryStatus: \"poll\",\n providerIdempotency: false,\n } as const;\n\n constructor(\n private readonly http: ProviderHttpClient = createProviderHttpClient({\n baseURL: \"https://api.iranpayamak.com\",\n }),\n ) {}\n\n async verifyCredentials(\n credentials: FarazSmsCredentials,\n context: ProviderCallContext,\n ) {\n try {\n const response = await this.http.request({\n method: \"GET\",\n url: \"/ws/v1/account/balance\",\n headers: { \"Api-Key\": credentials.apiKey },\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n if (response.status === 401 || response.status === 403) {\n return invalidVerification();\n }\n const parsed = responseSchema.safeParse(response.data);\n if (!parsed.success) return unavailableVerification();\n if (parsed.data.status !== \"success\") {\n return invalidVerification();\n }\n return verified(\"credit\");\n } catch {\n return unavailableVerification();\n }\n }\n\n async sendTemplate(\n credentials: FarazSmsCredentials,\n input: ProviderTemplateSendInput<string, FarazSmsParameters>,\n context: ProviderCallContext,\n ): Promise<ProviderSubmissionResult> {\n try {\n const response = await this.http.request({\n method: \"POST\",\n url: \"/ws/v1/sms/pattern\",\n headers: {\n \"Api-Key\": credentials.apiKey,\n \"Content-Type\": \"application/json\",\n },\n data: {\n code: input.template,\n attributes: input.parameters,\n recipient: toIranianLocalMobile(input.recipient),\n line_number: credentials.lineNumber,\n number_format: \"english\",\n },\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n const parsed = responseSchema.safeParse(response.data);\n if (!parsed.success) return unknownSubmission();\n if (parsed.data.status !== \"success\")\n return rejected(\"farazsms_rejected\");\n if (\n typeof parsed.data.data !== \"string\" &&\n typeof parsed.data.data !== \"number\"\n ) {\n return unknownSubmission();\n }\n return {\n status: \"accepted\",\n providerMessageId: String(parsed.data.data),\n };\n } catch {\n return unknownSubmission();\n }\n }\n}\n","import { z } from \"zod\";\n\nimport type {\n ProviderCallContext,\n ProviderSubmissionResult,\n ProviderTemplateSendInput,\n SmsProviderAdapter,\n} from \"../core/provider.js\";\nimport { toIranianLocalMobile } from \"../core/phone.js\";\nimport { createProviderHttpClient, type ProviderHttpClient } from \"./http.js\";\nimport {\n invalidVerification,\n rejected,\n unavailableVerification,\n unknownSubmission,\n verified,\n} from \"./shared.js\";\n\nexport const ghasedakCredentialsSchema = z\n .object({ apiKey: z.string().min(1) })\n .strict();\nexport type GhasedakCredentials = z.infer<typeof ghasedakCredentialsSchema>;\n\nconst accountResponseSchema = z.object({\n IsSuccess: z.boolean(),\n StatusCode: z.number(),\n});\nconst sendResponseSchema = z.object({\n IsSuccess: z.boolean(),\n StatusCode: z.number(),\n Data: z.object({ MessageId: z.union([z.string(), z.number()]) }).optional(),\n});\n\nexport class GhasedakAdapter implements SmsProviderAdapter<\n GhasedakCredentials,\n string,\n readonly unknown[]\n> {\n readonly id = \"ghasedak\";\n readonly credentialSchema = ghasedakCredentialsSchema;\n readonly capabilities = {\n credentialVerification: { mode: \"account\" },\n templates: {\n binding: \"ordered\",\n canList: false,\n canInspect: true,\n canCreate: false,\n },\n deliveryStatus: \"poll\",\n providerIdempotency: true,\n } as const;\n\n constructor(\n private readonly http: ProviderHttpClient = createProviderHttpClient({\n baseURL: \"https://gateway.ghasedak.me\",\n }),\n ) {}\n\n async verifyCredentials(\n credentials: GhasedakCredentials,\n context: ProviderCallContext,\n ) {\n try {\n const response = await this.http.request({\n method: \"GET\",\n url: \"/rest/api/v1/WebService/GetAccountInformation\",\n headers: { ApiKey: credentials.apiKey },\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n if (response.status === 401 || response.status === 403) {\n return invalidVerification();\n }\n const parsed = accountResponseSchema.safeParse(response.data);\n if (!parsed.success) return unavailableVerification();\n if (!parsed.data.IsSuccess) {\n return invalidVerification();\n }\n return verified(\"account\");\n } catch {\n return unavailableVerification();\n }\n }\n\n async sendTemplate(\n credentials: GhasedakCredentials,\n input: ProviderTemplateSendInput<string, readonly unknown[]>,\n context: ProviderCallContext,\n ): Promise<ProviderSubmissionResult> {\n if (input.parameters.length < 1 || input.parameters.length > 10) {\n return rejected(\"template_binding_invalid\");\n }\n const body: Record<string, unknown> = {\n receptors: [toIranianLocalMobile(input.recipient)],\n templateName: input.template,\n ...(input.clientReferenceId === undefined\n ? {}\n : { clientReferenceId: input.clientReferenceId }),\n };\n input.parameters.forEach((value, index) => {\n body[`param${String(index + 1)}`] = String(value);\n });\n\n try {\n const response = await this.http.request({\n method: \"POST\",\n url: \"/rest/api/v1/WebService/SendOtpWithParams\",\n headers: {\n ApiKey: credentials.apiKey,\n \"Content-Type\": \"application/json\",\n },\n data: body,\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n const parsed = sendResponseSchema.safeParse(response.data);\n if (!parsed.success) return unknownSubmission();\n if (!parsed.data.IsSuccess || parsed.data.Data === undefined) {\n return rejected(`ghasedak_${String(parsed.data.StatusCode)}`);\n }\n return {\n status: \"accepted\",\n providerMessageId: String(parsed.data.Data.MessageId),\n };\n } catch {\n return unknownSubmission();\n }\n }\n}\n","import { z } from \"zod\";\n\nimport type {\n ProviderCallContext,\n ProviderSubmissionResult,\n ProviderTemplateSendInput,\n SmsProviderAdapter,\n} from \"../core/provider.js\";\nimport { createProviderHttpClient, type ProviderHttpClient } from \"./http.js\";\nimport {\n invalidVerification,\n rejected,\n unavailableVerification,\n unknownSubmission,\n verified,\n} from \"./shared.js\";\n\nexport const ipPanelCredentialsSchema = z\n .object({\n apiToken: z.string().min(1),\n fromNumber: z.string().regex(/^\\+98\\S+$/),\n })\n .strict();\nexport type IpPanelCredentials = z.infer<typeof ipPanelCredentialsSchema>;\nexport type IpPanelParameters = Readonly<Record<string, unknown>>;\n\nconst envelopeSchema = z.object({\n meta: z.object({\n status: z.boolean(),\n message_code: z.string(),\n }),\n data: z.unknown(),\n});\nconst sendDataSchema = z.object({\n message_outbox_ids: z.array(z.union([z.string(), z.number()])).min(1),\n});\n\nexport class IpPanelAdapter implements SmsProviderAdapter<\n IpPanelCredentials,\n string,\n IpPanelParameters\n> {\n readonly id = \"ippanel\";\n readonly credentialSchema = ipPanelCredentialsSchema;\n readonly capabilities = {\n credentialVerification: { mode: \"profile\" },\n templates: {\n binding: \"named\",\n canList: true,\n canInspect: true,\n canCreate: true,\n },\n deliveryStatus: \"poll\",\n providerIdempotency: false,\n } as const;\n\n constructor(\n private readonly http: ProviderHttpClient = createProviderHttpClient({\n baseURL: \"https://edge.ippanel.com\",\n }),\n ) {}\n\n async verifyCredentials(\n credentials: IpPanelCredentials,\n context: ProviderCallContext,\n ) {\n try {\n const response = await this.http.request({\n method: \"GET\",\n url: \"/v1/api/acl/auth/check_token\",\n headers: { Authorization: credentials.apiToken },\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n if (response.status === 401 || response.status === 403) {\n return invalidVerification();\n }\n const parsed = envelopeSchema.safeParse(response.data);\n if (!parsed.success) return unavailableVerification();\n if (!parsed.data.meta.status) {\n return invalidVerification();\n }\n return verified(\"profile\");\n } catch {\n return unavailableVerification();\n }\n }\n\n async sendTemplate(\n credentials: IpPanelCredentials,\n input: ProviderTemplateSendInput<string, IpPanelParameters>,\n context: ProviderCallContext,\n ): Promise<ProviderSubmissionResult> {\n try {\n const response = await this.http.request({\n method: \"POST\",\n url: \"/v1/api/send\",\n headers: {\n Authorization: credentials.apiToken,\n \"Content-Type\": \"application/json\",\n },\n data: {\n sending_type: \"pattern\",\n from_number: credentials.fromNumber,\n code: input.template,\n recipients: [input.recipient],\n params: input.parameters,\n },\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n const envelope = envelopeSchema.safeParse(response.data);\n if (!envelope.success) return unknownSubmission();\n if (!envelope.data.meta.status) {\n return rejected(`ippanel_${envelope.data.meta.message_code}`);\n }\n const data = sendDataSchema.safeParse(envelope.data.data);\n if (!data.success) return unknownSubmission();\n return {\n status: \"accepted\",\n providerMessageId: String(data.data.message_outbox_ids[0]),\n };\n } catch {\n return unknownSubmission();\n }\n }\n}\n","import { z } from \"zod\";\n\nimport type {\n ProviderCallContext,\n ProviderSubmissionResult,\n ProviderTemplateSendInput,\n SmsProviderAdapter,\n} from \"../core/provider.js\";\nimport { toIranianLocalMobile } from \"../core/phone.js\";\nimport { createProviderHttpClient, type ProviderHttpClient } from \"./http.js\";\nimport {\n invalidVerification,\n rejected,\n unavailableVerification,\n unknownSubmission,\n verified,\n} from \"./shared.js\";\n\nexport const kavenegarCredentialsSchema = z\n .object({ apiKey: z.string().min(1) })\n .strict();\nexport type KavenegarCredentials = z.infer<typeof kavenegarCredentialsSchema>;\nexport type KavenegarParameters = Partial<\n Record<\"token\" | \"token2\" | \"token3\" | \"token10\" | \"token20\", unknown>\n>;\n\nconst responseSchema = z.object({\n return: z.object({ status: z.number(), message: z.string() }),\n entries: z.array(z.record(z.string(), z.unknown())).optional(),\n});\n\nexport class KavenegarAdapter implements SmsProviderAdapter<\n KavenegarCredentials,\n string,\n KavenegarParameters\n> {\n readonly id = \"kavenegar\";\n readonly credentialSchema = kavenegarCredentialsSchema;\n readonly capabilities = {\n credentialVerification: { mode: \"account\" },\n templates: {\n binding: \"fixed-slots\",\n slots: [\"token\", \"token2\", \"token3\", \"token10\", \"token20\"],\n canList: false,\n canInspect: false,\n canCreate: false,\n },\n deliveryStatus: \"poll\",\n providerIdempotency: false,\n } as const;\n\n constructor(\n private readonly http: ProviderHttpClient = createProviderHttpClient({\n baseURL: \"https://api.kavenegar.com\",\n }),\n ) {}\n\n private path(apiKey: string, operation: string): string {\n return `/v1/${encodeURIComponent(apiKey)}/${operation}.json`;\n }\n\n async verifyCredentials(\n credentials: KavenegarCredentials,\n context: ProviderCallContext,\n ) {\n try {\n const response = await this.http.request({\n method: \"GET\",\n url: this.path(credentials.apiKey, \"account/info\"),\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n if (response.status === 401 || response.status === 403) {\n return invalidVerification();\n }\n const parsed = responseSchema.safeParse(response.data);\n if (!parsed.success) return unavailableVerification();\n if (parsed.data.return.status !== 200) {\n return invalidVerification();\n }\n return verified(\"account\");\n } catch {\n return unavailableVerification();\n }\n }\n\n async sendTemplate(\n credentials: KavenegarCredentials,\n input: ProviderTemplateSendInput<string, KavenegarParameters>,\n context: ProviderCallContext,\n ): Promise<ProviderSubmissionResult> {\n if (input.parameters.token === undefined)\n return rejected(\"template_binding_invalid\");\n try {\n const response = await this.http.request({\n method: \"GET\",\n url: this.path(credentials.apiKey, \"verify/lookup\"),\n params: {\n receptor: toIranianLocalMobile(input.recipient),\n template: input.template,\n ...Object.fromEntries(\n Object.entries(input.parameters).map(([key, value]) => [\n key,\n String(value),\n ]),\n ),\n },\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n const parsed = responseSchema.safeParse(response.data);\n if (!parsed.success) return unknownSubmission();\n if (parsed.data.return.status !== 200) {\n return rejected(`kavenegar_${String(parsed.data.return.status)}`);\n }\n const messageId = parsed.data.entries?.[0]?.messageid;\n if (typeof messageId !== \"string\" && typeof messageId !== \"number\") {\n return unknownSubmission();\n }\n return { status: \"accepted\", providerMessageId: String(messageId) };\n } catch {\n return unknownSubmission();\n }\n }\n}\n"]}
@@ -0,0 +1,139 @@
1
+ import { SmsProviderAdapter, ProviderCallContext, CredentialVerificationResult, ProviderTemplateSendInput, ProviderSubmissionResult } from './index.cjs';
2
+ import { z } from 'zod';
3
+ import { AxiosRequestConfig } from 'axios';
4
+
5
+ interface ProviderHttpResponse {
6
+ readonly status: number;
7
+ readonly data: unknown;
8
+ }
9
+ interface ProviderHttpClient {
10
+ request(config: AxiosRequestConfig): Promise<ProviderHttpResponse>;
11
+ }
12
+ declare function createProviderHttpClient(options: {
13
+ readonly baseURL: string;
14
+ readonly timeoutMs?: number;
15
+ }): ProviderHttpClient;
16
+
17
+ declare const farazSmsCredentialsSchema: z.ZodObject<{
18
+ apiKey: z.ZodString;
19
+ lineNumber: z.ZodString;
20
+ }, z.core.$strict>;
21
+ type FarazSmsCredentials = z.infer<typeof farazSmsCredentialsSchema>;
22
+ type FarazSmsParameters = Readonly<Record<string, unknown>>;
23
+ declare class FarazSmsAdapter implements SmsProviderAdapter<FarazSmsCredentials, string, FarazSmsParameters> {
24
+ private readonly http;
25
+ readonly id = "farazsms";
26
+ readonly credentialSchema: z.ZodObject<{
27
+ apiKey: z.ZodString;
28
+ lineNumber: z.ZodString;
29
+ }, z.core.$strict>;
30
+ readonly capabilities: {
31
+ readonly credentialVerification: {
32
+ readonly mode: "credit";
33
+ };
34
+ readonly templates: {
35
+ readonly binding: "named";
36
+ readonly canList: true;
37
+ readonly canInspect: true;
38
+ readonly canCreate: true;
39
+ };
40
+ readonly deliveryStatus: "poll";
41
+ readonly providerIdempotency: false;
42
+ };
43
+ constructor(http?: ProviderHttpClient);
44
+ verifyCredentials(credentials: FarazSmsCredentials, context: ProviderCallContext): Promise<CredentialVerificationResult>;
45
+ sendTemplate(credentials: FarazSmsCredentials, input: ProviderTemplateSendInput<string, FarazSmsParameters>, context: ProviderCallContext): Promise<ProviderSubmissionResult>;
46
+ }
47
+
48
+ declare const ghasedakCredentialsSchema: z.ZodObject<{
49
+ apiKey: z.ZodString;
50
+ }, z.core.$strict>;
51
+ type GhasedakCredentials = z.infer<typeof ghasedakCredentialsSchema>;
52
+ declare class GhasedakAdapter implements SmsProviderAdapter<GhasedakCredentials, string, readonly unknown[]> {
53
+ private readonly http;
54
+ readonly id = "ghasedak";
55
+ readonly credentialSchema: z.ZodObject<{
56
+ apiKey: z.ZodString;
57
+ }, z.core.$strict>;
58
+ readonly capabilities: {
59
+ readonly credentialVerification: {
60
+ readonly mode: "account";
61
+ };
62
+ readonly templates: {
63
+ readonly binding: "ordered";
64
+ readonly canList: false;
65
+ readonly canInspect: true;
66
+ readonly canCreate: false;
67
+ };
68
+ readonly deliveryStatus: "poll";
69
+ readonly providerIdempotency: true;
70
+ };
71
+ constructor(http?: ProviderHttpClient);
72
+ verifyCredentials(credentials: GhasedakCredentials, context: ProviderCallContext): Promise<CredentialVerificationResult>;
73
+ sendTemplate(credentials: GhasedakCredentials, input: ProviderTemplateSendInput<string, readonly unknown[]>, context: ProviderCallContext): Promise<ProviderSubmissionResult>;
74
+ }
75
+
76
+ declare const ipPanelCredentialsSchema: z.ZodObject<{
77
+ apiToken: z.ZodString;
78
+ fromNumber: z.ZodString;
79
+ }, z.core.$strict>;
80
+ type IpPanelCredentials = z.infer<typeof ipPanelCredentialsSchema>;
81
+ type IpPanelParameters = Readonly<Record<string, unknown>>;
82
+ declare class IpPanelAdapter implements SmsProviderAdapter<IpPanelCredentials, string, IpPanelParameters> {
83
+ private readonly http;
84
+ readonly id = "ippanel";
85
+ readonly credentialSchema: z.ZodObject<{
86
+ apiToken: z.ZodString;
87
+ fromNumber: z.ZodString;
88
+ }, z.core.$strict>;
89
+ readonly capabilities: {
90
+ readonly credentialVerification: {
91
+ readonly mode: "profile";
92
+ };
93
+ readonly templates: {
94
+ readonly binding: "named";
95
+ readonly canList: true;
96
+ readonly canInspect: true;
97
+ readonly canCreate: true;
98
+ };
99
+ readonly deliveryStatus: "poll";
100
+ readonly providerIdempotency: false;
101
+ };
102
+ constructor(http?: ProviderHttpClient);
103
+ verifyCredentials(credentials: IpPanelCredentials, context: ProviderCallContext): Promise<CredentialVerificationResult>;
104
+ sendTemplate(credentials: IpPanelCredentials, input: ProviderTemplateSendInput<string, IpPanelParameters>, context: ProviderCallContext): Promise<ProviderSubmissionResult>;
105
+ }
106
+
107
+ declare const kavenegarCredentialsSchema: z.ZodObject<{
108
+ apiKey: z.ZodString;
109
+ }, z.core.$strict>;
110
+ type KavenegarCredentials = z.infer<typeof kavenegarCredentialsSchema>;
111
+ type KavenegarParameters = Partial<Record<"token" | "token2" | "token3" | "token10" | "token20", unknown>>;
112
+ declare class KavenegarAdapter implements SmsProviderAdapter<KavenegarCredentials, string, KavenegarParameters> {
113
+ private readonly http;
114
+ readonly id = "kavenegar";
115
+ readonly credentialSchema: z.ZodObject<{
116
+ apiKey: z.ZodString;
117
+ }, z.core.$strict>;
118
+ readonly capabilities: {
119
+ readonly credentialVerification: {
120
+ readonly mode: "account";
121
+ };
122
+ readonly templates: {
123
+ readonly binding: "fixed-slots";
124
+ readonly slots: readonly ["token", "token2", "token3", "token10", "token20"];
125
+ readonly canList: false;
126
+ readonly canInspect: false;
127
+ readonly canCreate: false;
128
+ };
129
+ readonly deliveryStatus: "poll";
130
+ readonly providerIdempotency: false;
131
+ };
132
+ constructor(http?: ProviderHttpClient);
133
+ private path;
134
+ verifyCredentials(credentials: KavenegarCredentials, context: ProviderCallContext): Promise<CredentialVerificationResult>;
135
+ sendTemplate(credentials: KavenegarCredentials, input: ProviderTemplateSendInput<string, KavenegarParameters>, context: ProviderCallContext): Promise<ProviderSubmissionResult>;
136
+ }
137
+
138
+ export { FarazSmsAdapter, GhasedakAdapter, IpPanelAdapter, KavenegarAdapter, createProviderHttpClient, farazSmsCredentialsSchema, ghasedakCredentialsSchema, ipPanelCredentialsSchema, kavenegarCredentialsSchema };
139
+ export type { FarazSmsCredentials, FarazSmsParameters, GhasedakCredentials, IpPanelCredentials, IpPanelParameters, KavenegarCredentials, KavenegarParameters, ProviderHttpClient, ProviderHttpResponse };