UNPKG

vesal

Version:

Armaghan Vesal SMS API client for JS/TS/ESM/Node.js

1 lines 14.5 kB
{"version":3,"file":"vesal.cjs","sources":["../src/vesal.ts"],"sourcesContent":["/**\r\n * The Vesal 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/vesal vesal's Repository}\r\n * @license MIT\r\n */\r\nexport class Vesal {\r\n\tpublic readonly apiUrl = \"http://vesal.armaghan.net:8080/rest\";\r\n\tprivate username: string;\r\n\tprivate password: string;\r\n\tprivate from: string;\r\n\r\n\tconstructor(username: string, password: string, from: string) {\r\n\t\tthis.username = username || \"\";\r\n\t\tthis.password = password;\r\n\t\tthis.from = from;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * Make an API request to the Vesal 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\" = \"POST\",\r\n\t\tdata?: object,\r\n\t): Promise<any> {\r\n\t\tlet response: Response, responseBody: any;\r\n\r\n\t\tdata = {\r\n\t\t\t...data,\r\n\t\t\tusername: this.username,\r\n\t\t\tpassword: this.password,\r\n\t\t};\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},\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 VesalError(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 VesalError(undefined, \"The server didn't respond correctly\");\r\n\t\t}\r\n\r\n\t\tif (!responseBody.references) {\r\n\t\t\tthrow new VesalError(undefined, \"The server didn't respond correctly\");\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\tfrom,\r\n\t}: {\r\n\t\trecipients: string | string[];\r\n\t\tmessages: string | string[];\r\n\t\tfrom?: string | string[];\r\n\t}): Promise<IVesalResponse_Send_WithCount> {\r\n\t\tif (!recipients || !messages) {\r\n\t\t\tthrow new VesalError(\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\r\n\t\tif (!from) {\r\n\t\t\tfrom = this.from;\r\n\t\t}\r\n\r\n\t\tconst isManyToMany = Array.isArray(messages) || Array.isArray(from);\r\n\r\n\t\tif (isManyToMany) {\r\n\t\t\tif (!recipients.length) {\r\n\t\t\t\tthrow new VesalError(\r\n\t\t\t\t\tundefined,\r\n\t\t\t\t\t\"recipients and messages should have the same length\",\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tif (Array.isArray(messages) && !messages.length) {\r\n\t\t\t\tthrow new VesalError(\r\n\t\t\t\t\tundefined,\r\n\t\t\t\t\t\"recipients and messages should have the same length\",\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tif (typeof messages === \"string\") {\r\n\t\t\t\t// messages = recipients.map(() => messages);\r\n\t\t\t\tmessages = Array(recipients.length).fill(messages);\r\n\t\t\t}\r\n\t\t\tif (typeof from === \"string\") {\r\n\t\t\t\t// from = recipients.map(() => from);\r\n\t\t\t\tfrom = Array(recipients.length).fill(from);\r\n\t\t\t}\r\n\r\n\t\t\tif (\r\n\t\t\t\trecipients.length !== messages.length ||\r\n\t\t\t\trecipients.length !== from.length\r\n\t\t\t) {\r\n\t\t\t\tthrow new VesalError(\r\n\t\t\t\t\tundefined,\r\n\t\t\t\t\t\"recipients and messages should have the same length\",\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst sendData = {\r\n\t\t\tdestinations: recipients,\r\n\t\t\t...(isManyToMany ? { originators: from } : { originator: from }),\r\n\t\t\t...(isManyToMany ? { contents: messages } : { content: messages }),\r\n\t\t};\r\n\r\n\t\tconst result: IVesalResponse_Send = await this.Api(\r\n\t\t\tisManyToMany ? \"ManyToMany\" : \"OneToMany\",\r\n\t\t\t\"POST\",\r\n\t\t\tsendData,\r\n\t\t);\r\n\r\n\t\tlet successCount: number = 0,\r\n\t\t\tfailCount: number = 0;\r\n\r\n\t\tresult.references?.map((messageResult) => {\r\n\t\t\tif (messageResult) {\r\n\t\t\t\tsuccessCount++;\r\n\t\t\t} else {\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\treferences: result.references || [],\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 GetMessageStatus(\r\n\t\treferencesIds: number[],\r\n\t): Promise<IVesalResponse_MessageState> {\r\n\t\treturn await this.Api(\"messageState\", \"POST\", {\r\n\t\t\treferenceids: referencesIds,\r\n\t\t});\r\n\t}\r\n\r\n\tasync GetReceivedMessages(): Promise<IVesalResponse_ReceivedMessages> {\r\n\t\treturn await this.Api(\"pullReceivedMessages\");\r\n\t}\r\n\r\n\tasync GetReceivedMessagesCount(): Promise<IVesalResponse_ReceivedMessagesCount> {\r\n\t\treturn await this.Api(\"receivedMessageCount\");\r\n\t}\r\n\r\n\tasync GetUserInfo(): Promise<IVesalResponse_UserInfo> {\r\n\t\treturn await this.Api(\"userInfo\");\r\n\t}\r\n}\r\n\r\nexport class VesalError extends Error {\r\n\tstatus: keyof typeof vesalErrors | undefined;\r\n\r\n\tconstructor(statusParam: number | undefined, messageParam?: string) {\r\n\t\tlet message: string, status: keyof typeof vesalErrors | undefined;\r\n\r\n\t\tif (statusParam && Object.keys(vesalErrors).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 Vesal 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\ninterface IVesalResponse_Base {\r\n\terrorModel: {\r\n\t\terrorCode: number;\r\n\t\ttimestamp: string | number | null;\r\n\t};\r\n}\r\n\r\ninterface IVesalResponse_Send extends IVesalResponse_Base {\r\n\treferences: (number | Omit<keyof typeof vesalErrors, 0>)[];\r\n}\r\n\r\ninterface IVesalResponse_Send_WithCount extends IVesalResponse_Send {\r\n\tcount: {\r\n\t\tsuccess: number;\r\n\t\tfail: number;\r\n\t};\r\n}\r\n\r\ninterface IVesalResponse_MessageState extends IVesalResponse_Base {\r\n\tstates: {\r\n\t\tid: number;\r\n\t\tstate: number;\r\n\t}[];\r\n}\r\ninterface IVesalResponse_ReceivedMessages extends IVesalResponse_Base {\r\n\tmessageModels: {\r\n\t\toriginator: string;\r\n\t\tdestination: string;\r\n\t\tcontent: string;\r\n\t}[];\r\n}\r\ninterface IVesalResponse_ReceivedMessagesCount extends IVesalResponse_Base {\r\n\tcount: number;\r\n}\r\ninterface IVesalResponse_UserInfo extends IVesalResponse_Base {\r\n\tuser: {\r\n\t\tcredit: number;\r\n\t\tdeliveryUrl: unknown;\r\n\t\treceiveUrl: unknown;\r\n\t\tiPs: string[];\r\n\t\tnumbers: string[];\r\n\t\tid: number;\r\n\t\tusername: string;\r\n\t\tpassword: unknown;\r\n\t\tfirstName: unknown;\r\n\t\tlastName: unknown;\r\n\t\tmobile: unknown;\r\n\t\temail: unknown;\r\n\t\tnationalId: number;\r\n\t\texpirationDate: string;\r\n\t\tactive: boolean;\r\n\t\tdeleted: boolean;\r\n\t\tdbProxyStandalone: boolean;\r\n\t\tinsertDate: unknown;\r\n\t\tupdateDate: unknown;\r\n\t\tcustomer: unknown;\r\n\t\troles: unknown;\r\n\t};\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(vesalErrors).includes(\"\" + status)) {\r\n\t\treturn vesalErrors[status];\r\n\t}\r\n\treturn \"\";\r\n}\r\n\r\nexport const messageStates = {\r\n\t0: \"پیامک در صف ارسال قرار دارد\",\r\n\t1: \"ارسال شده\",\r\n\t2: \"پیامک به موبایل گیرنده تحویل شده است\",\r\n\t3: \"پیامک به موبایل گیرنده تحویل نشده است\",\r\n\t4: \"وضعیت نامشخص\",\r\n\t5: \"پیامک توسط وب سرویس به شرکت ارمغان راه طلایی رسیده است\",\r\n\t6: \"پیام از سمت اپراتور لغو شده است\",\r\n\t7: \"پیام از سمت اپراتور منقضی شده است\",\r\n\t8: \"پیام از سمت اپراتور reject شده است\",\r\n} as const;\r\n\r\nexport const vesalErrors = {\r\n\t0: \"عملیات با موفقیت انجام شد\",\r\n\t[-100]: \"refrenceId مورد نظر یافت نشد\",\r\n\t[-101]: \"احراز هویت کاربر موفقیت آمیز نبود\",\r\n\t[-102]: \"نام کاربری یافت نشد\",\r\n\t[-103]: \"شماره originator اشتباه یا در بازه شماره های کاربر نیست\",\r\n\t[-104]: \"اعتبار کم است\",\r\n\t[-105]: \"فرمت درخواست اشتباه است\",\r\n\t[-106]: \"تعداد refrenceId ها بیش از 1000 عدد است\",\r\n\t[-107]: \"شماره گیرنده پیامک اشتباه است\",\r\n\t[-109]: \"تاریخ انقضای حساب کاربری فرارسیده است\",\r\n\t[-110]: \"درخواست از ip مجاز کاربر ارسال نشده است\",\r\n\t[-111]: \"شماره گیرنده در بلک لیست قرار دارد\",\r\n\t[-112]: \"حساب مشتری فعال نیست\",\r\n\t[-115]: \"فرمت UDH اشتباه است\",\r\n\t[-117]: \"مقدار mclass وارد شده اشتباه است\",\r\n\t[-118]: \"شماره پورت وارد شده صحیح نیست\",\r\n\t[-119]: \"کاربر به سرویس مورد نظر دسترسی ندارد\",\r\n\t[-120]: \"پیام ارسال شده دارای هیچ شماره معتبری نیست\",\r\n\t[-200]: \"خطای داخلی در پایگاه داده رخ داده است\",\r\n\t[-201]: \"خطای نامشخص داخل پایگاه داده\",\r\n\t[-137]: \"پیام نباید حاوی کلمات غیرمجاز می باشد\",\r\n} as const;\r\n\r\nexport default Vesal;\r\n"],"names":["Vesal","username","password","from","this","apiUrl","_proto","prototype","Api","urlSuffix","method","data","response","responseBody","_temp4","_result","_temp2","_result2","references","VesalError","undefined","_temp","_catch","Promise","resolve","json","then","_response$json","_exit","_this","_extends","_temp3","fetch","headers","Accept","body","JSON","stringify","_fetch","e","reject","Send","_ref","recipients","messages","isManyToMany","Array","isArray","length","fill","sendData","destinations","originators","originator","contents","content","result","_result$references","successCount","failCount","map","messageResult","count","success","fail","GetMessageStatus","referencesIds","referenceids","GetReceivedMessages","GetReceivedMessagesCount","GetUserInfo","_Error","statusParam","messageParam","_this7","message","status","Object","keys","vesalErrors","includes","GetStatusText","call","_wrapNativeSuper","Error","_vesalErrors"],"mappings":"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"}