magfa-api
Version:
Magfa SMS API client for JS/TS/ESM/Node.js
1 lines • 17.8 kB
Source Map (JSON)
{"version":3,"file":"magfa.cjs","sources":["../src/magfa.ts"],"sourcesContent":["type IMagfaResponse = {\r\n\tstatus: number;\r\n\tmessages: any[];\r\n};\r\n\r\n/**\r\n * The Magfa API Class\r\n * @author Shahab Movahhedi\r\n * @see {@link https://shmovahhedi.com Shahab Movahhedi's Website}\r\n * @see {@link https://github.com/movahhedi/magfa-api magfa-api's Repository}\r\n * @license MIT\r\n */\r\nexport class Magfa {\r\n\tpublic readonly apiUrl = \"https://sms.magfa.com/api/http/sms/v2\";\r\n\tprivate username: string;\r\n\tprivate domain: string;\r\n\tprivate password: string;\r\n\tprivate from: string;\r\n\tprivate authHeader: string;\r\n\r\n\tconstructor(username: string, password: string, domain: string, from: string) {\r\n\t\tthis.username = username || \"\";\r\n\t\tthis.password = password;\r\n\t\tthis.domain = domain;\r\n\t\tthis.from = from;\r\n\r\n\t\tthis.authHeader =\r\n\t\t\t\"Basic \" +\r\n\t\t\tBuffer.from(`${this.username}/${this.domain}:${this.password}`).toString(\r\n\t\t\t\t\"base64\",\r\n\t\t\t);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * Make an API request to the Magfa API\r\n\t * @private\r\n\t * @param {string} urlSuffix - The URL suffix for the API endpoint\r\n\t * @param {(\"GET\"|\"POST\")} [method=\"GET\"] - The HTTP method to use for the request\r\n\t * @param {object|null} [data=null] - The data to send with the request\r\n\t * @returns {Promise} The response from the API\r\n\t */\r\n\tprivate async Api(\r\n\t\turlSuffix: string,\r\n\t\tmethod: \"GET\" | \"POST\" = \"GET\",\r\n\t\tdata?: object,\r\n\t): Promise<any> {\r\n\t\tlet response: Response, responseBody: any;\r\n\r\n\t\ttry {\r\n\t\t\tresponse = await fetch(`${this.apiUrl}/${urlSuffix}`, {\r\n\t\t\t\theaders: {\r\n\t\t\t\t\tAccept: \"application/json\",\r\n\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\tAuthorization: this.authHeader,\r\n\t\t\t\t},\r\n\t\t\t\tmethod,\r\n\t\t\t\tbody: data && JSON.stringify(data),\r\n\t\t\t});\r\n\t\t} catch (error) {\r\n\t\t\tthrow new MagfaError(undefined, \"Server connection failed\");\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tresponseBody = await response.json();\r\n\t\t} catch (error) {\r\n\t\t\tthrow new MagfaError(undefined, \"The server didn't respond correctly\");\r\n\t\t}\r\n\r\n\t\tif (typeof responseBody?.status === \"undefined\") {\r\n\t\t\tthrow new MagfaError(undefined, \"The server didn't respond correctly\");\r\n\t\t}\r\n\r\n\t\tif (responseBody.status === 0) {\r\n\t\t\treturn responseBody;\r\n\t\t}\r\n\r\n\t\tif (Object.keys(magfaErrors).includes(\"\" + responseBody.status)) {\r\n\t\t\tthrow new MagfaError(responseBody.status);\r\n\t\t}\r\n\r\n\t\treturn responseBody;\r\n\t}\r\n\r\n\tasync Send({\r\n\t\trecipients,\r\n\t\tmessages,\r\n\t\tencodings,\r\n\t\tuids,\r\n\t\tudhs,\r\n\t}: {\r\n\t\trecipients: string | string[];\r\n\t\tmessages: string | string[];\r\n\t\tencodings?: Encoding | Encoding[];\r\n\t\tuids?: number[];\r\n\t\tudhs?: string[];\r\n\t}): Promise<ISendResponseWithCount> {\r\n\t\tif (!recipients || !messages) {\r\n\t\t\tthrow new MagfaError(\r\n\t\t\t\tundefined,\r\n\t\t\t\t\"recipients and messages should not be empty\",\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (typeof recipients === \"string\") {\r\n\t\t\trecipients = [recipients];\r\n\t\t}\r\n\t\tif (typeof messages === \"string\") {\r\n\t\t\tmessages = [messages];\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t!messages.length ||\r\n\t\t\t(recipients.length !== messages.length && messages.length !== 1)\r\n\t\t) {\r\n\t\t\tthrow new MagfaError(\r\n\t\t\t\tundefined,\r\n\t\t\t\t\"recipients and messages should have the same length\",\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// const senders = messages.map(() => this.from);\r\n\t\tconst senders = Array(recipients.length).fill(this.from);\r\n\r\n\t\tif (encodings && !Array.isArray(encodings)) {\r\n\t\t\tencodings = Array(recipients.length).fill(encodings);\r\n\t\t}\r\n\r\n\t\tconst sendData = {\r\n\t\t\trecipients,\r\n\t\t\tmessages,\r\n\t\t\tsenders,\r\n\t\t\tencodings,\r\n\t\t\tuids,\r\n\t\t\tudhs,\r\n\t\t};\r\n\r\n\t\tconst result: IMagfaResponse_Send = await this.Api(\"send\", \"POST\", sendData);\r\n\r\n\t\tconst messagesMutated: ISentMessage[] = [];\r\n\r\n\t\tlet successCount: number = 0,\r\n\t\t\tfailCount: number = 0;\r\n\r\n\t\tresult.messages.map((messageResult: ISentMessage) => {\r\n\t\t\tif (messageResult.status === 0) {\r\n\t\t\t\tconst obj = { ...messageResult, message: \"پیام با موفقیت رسید\" };\r\n\t\t\t\tmessagesMutated.push(obj);\r\n\t\t\t\tsuccessCount++;\r\n\t\t\t} else {\r\n\t\t\t\tconst obj = {\r\n\t\t\t\t\t...messageResult,\r\n\t\t\t\t\tmessage: GetStatusText(messageResult.status),\r\n\t\t\t\t};\r\n\t\t\t\tmessagesMutated.push(obj);\r\n\t\t\t\tfailCount++;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn {\r\n\t\t\t...result,\r\n\t\t\tmessages: messagesMutated,\r\n\t\t\tcount: {\r\n\t\t\t\tsuccess: successCount,\r\n\t\t\t\tfail: failCount,\r\n\t\t\t},\r\n\t\t};\r\n\t}\r\n\r\n\tasync Statuses(mids: number[]): Promise<IMagfaResponse_Statuses> {\r\n\t\treturn await this.Api(`statuses/${mids.join(\",\")}`);\r\n\t}\r\n\r\n\tasync Mid(uid: number): Promise<IMagfaResponse_Mid> {\r\n\t\tconst result = (await this.Api(`mid/${uid}`)) as IMagfaResponse_Mid;\r\n\t\treturn {\r\n\t\t\t...result,\r\n\t\t\tmid: result.mid || undefined,\r\n\t\t};\r\n\t}\r\n\r\n\tasync Balance(): Promise<IMagfaResponse_Balance> {\r\n\t\treturn await this.Api(\"balance\");\r\n\t}\r\n\r\n\tasync ReceivedMessages(\r\n\t\tcount: number = 100,\r\n\t): Promise<IMagfaResponse_ReceivedMessages> {\r\n\t\treturn await this.Api(`messages/${count}`);\r\n\t}\r\n}\r\n\r\nexport class MagfaError extends Error {\r\n\tstatus: keyof typeof magfaErrors | undefined;\r\n\r\n\tconstructor(statusParam: number | undefined, messageParam?: string) {\r\n\t\tlet message: string, status: keyof typeof magfaErrors | undefined;\r\n\r\n\t\tif (statusParam && Object.keys(magfaErrors).includes(\"\" + statusParam)) {\r\n\t\t\tmessage = GetStatusText(statusParam);\r\n\t\t\tstatus = statusParam as any;\r\n\t\t} else {\r\n\t\t\tmessage = messageParam || \"Unknown Magfa error\";\r\n\t\t\tstatus = undefined;\r\n\t\t}\r\n\r\n\t\tsuper(message);\r\n\r\n\t\tthis.message = message;\r\n\t\tthis.status = status;\r\n\t}\r\n}\r\n\r\ntype IStatusCode = 0 | keyof typeof magfaErrors;\r\n\r\ninterface IMagfaResponse_Base {\r\n\tstatus: IStatusCode;\r\n}\r\n\r\ninterface IMagfaResponse_Balance extends IMagfaResponse_Base {\r\n\tbalance: number | null;\r\n}\r\n\r\ninterface IMagfaResponse_Send extends IMagfaResponse_Base {\r\n\tmessages: ISentMessage[];\r\n}\r\n\r\ninterface IMagfaResponse_Statuses extends IMagfaResponse_Base {\r\n\tdlrs: {\r\n\t\t/** شناسه یکتای پیامک */\r\n\t\tmid: number;\r\n\t\t/** وضعیت */\r\n\t\tstatus: number;\r\n\t\t/** `yyyy-mm-dd hh:mm:ss` */\r\n\t\tdate: string;\r\n\t}[];\r\n}\r\n\r\ninterface IMagfaResponse_ReceivedMessages extends IMagfaResponse_Base {\r\n\tmessages: {\r\n\t\t/** پیام */\r\n\t\tbody: string;\r\n\t\t/** فرستنده */\r\n\t\tsenderNumber: string;\r\n\t\t/** گیرنده */\r\n\t\trecipientNumber: string;\r\n\t\t/** `yyyy-mm-dd hh:mm:ss` */\r\n\t\tdate: string;\r\n\t}[];\r\n}\r\n\r\ninterface IMagfaResponse_Mid extends IMagfaResponse_Base {\r\n\tmid: number | undefined;\r\n}\r\n\r\ninterface ISendResponseWithCount extends IMagfaResponse_Send {\r\n\tcount: {\r\n\t\tsuccess: number;\r\n\t\tfail: number;\r\n\t};\r\n}\r\n\r\ninterface ISentMessage {\r\n\t/** نشانگر وضعیت درخواست. مقدار صفر به معنای انجام بدون خطای درخواست و هر عدد غیر از صفر کد خطای مربوطه است. */\r\n\tstatus: IStatusCode;\r\n\r\n\t/** شناسه یکتای پیامک */\r\n\tid: number;\r\n\r\n\t/** شناسهی یکتای کاربر */\r\n\tuserId: number;\r\n\r\n\t/** تعداد بخشهای پیامک */\r\n\tparts: number;\r\n\r\n\t/** تعرفه */\r\n\ttariff: number;\r\n\r\n\t/** `DEFAULT` for English (ASCII), `UCS2` for Persian */\r\n\talphabet: \"DEFAULT\" | \"UCS2\";\r\n\r\n\t/** گیرنده */\r\n\trecipient: string;\r\n}\r\n\r\nexport const enum Encoding {\r\n\t/** تشخیص خودکار زبان پیامک (پیش فرض) */\r\n\tAuto = 0,\r\n\t/** فارسی */\r\n\tPersian = 2,\r\n\t/** 8bit */\r\n\tEightBit = 5,\r\n\t/** Binary */\r\n\tBinary = 6,\r\n}\r\n\r\nexport function GetStatusText(status: number) {\r\n\tif (status === 0) {\r\n\t\treturn \"success\";\r\n\t}\r\n\tif (Object.keys(magfaErrors).includes(\"\" + status)) {\r\n\t\treturn magfaErrors[status];\r\n\t}\r\n\treturn \"\";\r\n}\r\n\r\nexport const magfaErrors = {\r\n\t1: \"شماره گیرنده نادرست است\",\r\n\t2: \"شماره فرستنده نادرست است\",\r\n\t3: \"پارامتر encoding نامعتبر است. (بررسی صحت و همخوانی متن پیامک با encoding انتخابی)\",\r\n\t4: \"پارامتر mclass نامعتبر است\",\r\n\t6: \"پارامتر UDH نامعتبر است\",\r\n\t13: \"محتویات پیامک (ترکیب UDH و متن) خالی است. (بررسی دوبارهی متن پیامک و پارامتر UDH)\",\r\n\t14: \"مانده اعتبار ریالی مورد نیاز برای ارسال پیامک کافی نیست\",\r\n\t15: \"سرور در هنگام ارسال پیام مشغول برطرف نمودن ایراد داخلی بوده است. (ارسال مجدد درخواست)\",\r\n\t16: \"حساب غیرفعال است. (تماس با واحد فروش سیستمهای ارتباطی)\",\r\n\t17: \"حساب منقضی شده است. (تماس با واحد فروش سیستمهای ارتباطی)\",\r\n\t18: \"نام کاربری و یا کلمه عبور نامعتبر است. (بررسی مجدد نام کاربری و کلمه عبور)\",\r\n\t19: \"درخواست معتبر نیست. (ترکیب نام کاربری، رمز عبور و دامنه اشتباه است. تماس با واحد فروش برای دریافت کلمه عبور جدید)\",\r\n\t20: \"شماره فرستنده به حساب تعلق ندارد\",\r\n\t22: \"این سرویس برای حساب فعال نشده است\",\r\n\t23: \"در حال حاضر امکان پردازش درخواست جدید وجود ندارد، لطفا دوباره سعی کنید. (ارسال مجدد درخواست)\",\r\n\t24: \"شناسه پیامک معتبر نیست. (ممکن است شناسه پیامک اشتباه و یا متعلق به پیامکی باشد که بیش از یک روز از ارسال آن گذشته)\",\r\n\t25: \"نام متد درخواستی معتبر نیست. (بررسی نگارش نام متد با توجه به بخش متدها در این راهنما)\",\r\n\t27: \"شماره گیرنده در لیست سیاه اپراتور قرار دارد. (ارسال پیامکهای تبلیغاتی برای این شماره امکانپذیر نیست)\",\r\n\t28: \"شماره گیرنده، بر اساس پیششماره در حال حاضر در مگفا مسدود است\",\r\n\t29: \"آدرس IP مبدا، اجازه دسترسی به این سرویس را ندارد\",\r\n\t30: \"تعداد بخشهای پیامک بیش از حد مجاز استاندارد (۲۶۵ عدد) است\",\r\n\t31: \"دادههای موردنیاز برای ارسال کافی نیستند. (اصلاح HTTP Request)\",\r\n\t101: \"طول آرایه پارامتر messageBodies با طول آرایه گیرندگان تطابق ندارد\",\r\n\t102: \"طول آرایه پارامتر messageClass با طول آرایه گیرندگان تطابق ندارد\",\r\n\t103: \"طول آرایه پارامتر senderNumbers با طول آرایه گیرندگان تطابق ندارد\",\r\n\t104: \"طول آرایه پارامتر udhs با طول آرایه گیرندگان تطابق ندارد\",\r\n\t105: \"طول آرایه پارامتر priorities با طول آرایه گیرندگان تطابق ندارد\",\r\n\t106: \"آرایهی گیرندگان خالی است\",\r\n\t107: \"طول آرایه پارامتر گیرندگان بیشتر از طول مجاز است\",\r\n\t108: \"آرایهی فرستندگان خالی است\",\r\n\t109: \"طول آرایه پارامتر encoding با طول آرایه گیرندگان تطابق ندارد\",\r\n\t110: \"طول آرایه پارامتر checkingMessageIds با طول آرایه گیرندگان تطابق ندارد\",\r\n} as const;\r\n\r\nexport const messageStatuses = {\r\n\t[-1]: \"شناسه موجود نیست (شناسه نادرست یا گذشت بیش از ۲۴ ساعت از ارسال پیامک)\",\r\n\t0: \"وضعیتی دریافت نشده\",\r\n\t1: \"رسیده به گوشی\",\r\n\t2: \"نرسیده به گوشی\",\r\n\t8: \"رسیده به مخابرات\",\r\n\t16: \"نرسیده به مخابرات\",\r\n} as const;\r\n\r\nexport default Magfa;\r\n"],"names":["Magfa","username","password","domain","from","this","apiUrl","authHeader","Buffer","toString","_proto","prototype","Api","urlSuffix","method","data","_temp4","response","responseBody","_result","_temp2","_result2","_responseBody","status","MagfaError","undefined","Object","keys","magfaErrors","includes","_temp","_catch","Promise","resolve","json","then","_response$json","_exit","_this","_temp3","fetch","headers","Accept","Authorization","body","JSON","stringify","_fetch","e","reject","Send","_ref","recipients","messages","encodings","uids","udhs","length","senders","Array","fill","isArray","result","messagesMutated","successCount","failCount","map","messageResult","obj","_extends","message","push","GetStatusText","count","success","fail","Statuses","mids","join","Mid","uid","mid","Balance","ReceivedMessages","_Error","statusParam","messageParam","_this7","call","_wrapNativeSuper","Error","messageStatuses","_messageStatuses"],"mappings":"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"}