UNPKG

@netgsm/sms

Version:

Netgsm API Client for SMS sending and reporting

281 lines (280 loc) 13.2 kB
"use strict"; /** * @module Netgsm * @description Netgsm SMS API client implementation */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const enums_1 = require("./enums"); /** * Validates if a code exists in an enum, returns "5000" if not found * @param code - The code to validate * @param enumObj - The enum object to check against (optional) * @returns Valid code or "5000" for undefined errors */ function normalizeErrorCode(code, enumObj) { if (!code || typeof code !== "string") { return "5000"; } // If enum provided, check if code exists in enum values if (enumObj && !Object.values(enumObj).includes(code)) { return "5000"; } return code; } /** * Netgsm API Client * * Provides methods to interact with Netgsm's REST API for sending SMS. */ class Netgsm { /** * Initialize the Netgsm client. * @param {NetgsmConfig} config - Configuration object containing username and password. */ constructor(config) { this.config = config; this.baseURL = "https://api.netgsm.com.tr"; if (!config.username || !config.password) { throw new Error("Username and password are required"); } const authToken = this.generateAuthToken(this.config.username, this.config.password); this.headers = { "Content-Type": "application/json", Authorization: `Basic ${authToken}`, }; // Eğer appname belirtilmişse, SDK için özel format oluştur if (config.appname) { this.sdkAppName = `${config.appname}-sdk-js`; } } /** * Generate Base64 encoded authorization token * @param {string} username - Username for authentication. * @param {string} password - Password for authentication. * @returns {string} - Base64 encoded token. */ generateAuthToken(username, password) { if (typeof window !== "undefined" && typeof btoa === "function") { // Browser return btoa(`${username}:${password}`); } else { // Server return Buffer.from(`${username}:${password}`).toString("base64"); } } /** * Send SMS using REST v2 API * @param {RestSmsPayload} payload - JSON payload for sending SMS. * @returns {Promise<RestSmsResponse>} - The API response. */ sendRestSms(payload) { return __awaiter(this, void 0, void 0, function* () { const response = yield fetch(`${this.baseURL}/sms/rest/v2/send`, { method: "POST", headers: this.headers, body: JSON.stringify(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ msgheader: payload.msgheader }, ((payload === null || payload === void 0 ? void 0 : payload.appname) ? { appname: payload.appname } : this.sdkAppName ? { appname: this.sdkAppName } : {})), ((payload === null || payload === void 0 ? void 0 : payload.iysfilter) && { iysfilter: payload.iysfilter })), ((payload === null || payload === void 0 ? void 0 : payload.partnercode) && { partnercode: payload.partnercode })), ((payload === null || payload === void 0 ? void 0 : payload.encoding) && { encoding: payload.encoding })), { messages: payload.messages }), ((payload === null || payload === void 0 ? void 0 : payload.startdate) && { startdate: payload.startdate })), ((payload === null || payload === void 0 ? void 0 : payload.stopdate) && { stopdate: payload.stopdate }))), }); return yield this.handleResponse(response, enums_1.SendSmsErrorCode); }); } /** * Send OTP SMS using REST v2 API * @param {OtpSmsPayload} payload - JSON payload for sending OTP SMS. * @returns {Promise<OtpSmsResponse>} - The API response. */ sendOtpSms(payload) { return __awaiter(this, void 0, void 0, function* () { const response = yield fetch(`${this.baseURL}/sms/rest/v2/otp`, { method: "POST", headers: this.headers, body: JSON.stringify(Object.assign(Object.assign({ msgheader: payload.msgheader }, ((payload === null || payload === void 0 ? void 0 : payload.appname) ? { appname: payload.appname } : this.sdkAppName ? { appname: this.sdkAppName } : {})), { msg: payload.msg, no: payload.no })), }); return yield this.handleResponse(response, enums_1.SendOtpSmsErrorCode); }); } /** * Cancel a scheduled SMS * @param {CancelSmsPayload} payload - JSON payload for cancelling SMS. * @returns {Promise<CancelSmsResponse>} - The API response. */ cancelSms(payload) { return __awaiter(this, void 0, void 0, function* () { const response = yield fetch(`${this.baseURL}/sms/rest/v2/cancel`, { method: "POST", headers: this.headers, body: JSON.stringify(Object.assign({ jobid: payload.jobid }, ((payload === null || payload === void 0 ? void 0 : payload.appname) ? { appname: payload.appname } : this.sdkAppName ? { appname: this.sdkAppName } : {}))), }); return yield this.handleResponse(response, enums_1.CancelErrorCode); }); } /** * Get SMS report using REST v2 API * @param {ReportPayload} payload - JSON payload for fetching SMS report. * @returns {Promise<ReportResponse>} - The API response containing report details. */ getReport(payload) { return __awaiter(this, void 0, void 0, function* () { const response = yield fetch(`${this.baseURL}/sms/rest/v2/report`, { method: "POST", headers: this.headers, body: JSON.stringify({ jobids: payload.bulkIds, startdate: payload.startdate, stopdate: payload.stopdate, appname: (payload === null || payload === void 0 ? void 0 : payload.appname) || this.sdkAppName, pagenumber: payload === null || payload === void 0 ? void 0 : payload.pageNumber, pagesize: payload === null || payload === void 0 ? void 0 : payload.pageSize, }), }); return yield this.handleResponse(response, enums_1.ReportErrorCode); }); } /** * Get SMS statistics using REST v2 API * @param {StatsPayload} payload - JSON payload for fetching SMS report. * @returns {Promise<StatsResponse>} - The API response containing report details. */ getStats(payload) { return __awaiter(this, void 0, void 0, function* () { const response = yield fetch(`${this.baseURL}/sms/rest/v2/stats`, { method: "POST", headers: this.headers, body: JSON.stringify({ jobid: payload.jobid, sendDate: payload === null || payload === void 0 ? void 0 : payload.senddate, appname: (payload === null || payload === void 0 ? void 0 : payload.appname) || this.sdkAppName, }), }); return yield this.handleResponse(response, enums_1.StatsErrorCode); }); } /** * Get registered sender IDs/headers using REST v2 API * @param {HeaderQueryPayload} payload - Optional payload for the query * @returns {Promise<HeaderQueryResponse>} - The API response containing header details. */ getHeaders(payload) { return __awaiter(this, void 0, void 0, function* () { const url = new URL(`${this.baseURL}/sms/rest/v2/msgheader`); if ((payload === null || payload === void 0 ? void 0 : payload.appname) || this.sdkAppName) { url.searchParams.append("appname", (payload === null || payload === void 0 ? void 0 : payload.appname) || this.sdkAppName || ""); } const response = yield fetch(url.toString(), { method: "GET", headers: this.headers, }); return yield this.handleResponse(response, enums_1.MsgHeaderErrorCode); }); } /** * Get inbox messages * @param {SmsInboxPayload} payload - Optional payload for the query * @returns {Promise<SmsInboxResponse>} - The API response containing inbox messages. */ getInbox(payload) { return __awaiter(this, void 0, void 0, function* () { const url = new URL(`${this.baseURL}/sms/rest/v2/inbox`); if ((payload === null || payload === void 0 ? void 0 : payload.appname) || this.sdkAppName) { url.searchParams.append("appname", (payload === null || payload === void 0 ? void 0 : payload.appname) || this.sdkAppName || ""); } if (payload === null || payload === void 0 ? void 0 : payload.startdate) { url.searchParams.append("startdate", payload.startdate); } if (payload === null || payload === void 0 ? void 0 : payload.stopdate) { url.searchParams.append("stopdate", payload.stopdate); } const response = yield fetch(url.toString(), { method: "GET", headers: this.headers, }); return yield this.handleResponse(response, enums_1.InboxErrorCode); }); } /** * Checks balance/package information * @param payload Balance query parameters * @returns Balance information */ checkBalance(payload) { return __awaiter(this, void 0, void 0, function* () { const url = `${this.baseURL}/balance`; const response = yield fetch(url, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(Object.assign({ usercode: this.config.username, password: this.config.password, stip: payload.stip }, ((payload === null || payload === void 0 ? void 0 : payload.appkey) && { appkey: payload.appkey }))), }); const data = yield response.json(); if (response.status !== 200) { throw Object.assign({ status: response.status }, data); } return data; }); } handleResponse(response, errorCodeEnum) { return __awaiter(this, void 0, void 0, function* () { // Try to parse JSON response let data; try { data = yield response.json(); } catch (error) { // If JSON parsing fails, throw HTTP error throw { status: response.status, code: "PARSE_ERROR", description: `Failed to parse JSON response: ${error instanceof Error ? error.message : "Unknown error"}`, }; } // Check if response is success status if (response.status === 200 || response.status === 406) { // Validate data structure if (typeof data !== "object" || data === null) { throw { status: response.status, code: "INVALID_RESPONSE", description: "Response is not a valid object", }; } // Normalize error code - if code is missing or not in enum, set to "5000" data.code = normalizeErrorCode(data.code, errorCodeEnum); // Check if API returned an error code if (data.code !== "00") { throw Object.assign({ status: response.status !== 200 ? response.status : 406 }, data); } // Success case return data; } // HTTP error cases (non-200/406 status codes) throw { status: response.status, code: normalizeErrorCode(data === null || data === void 0 ? void 0 : data.code, errorCodeEnum) || response.statusText, description: (data === null || data === void 0 ? void 0 : data.description) || "HTTP Error", }; }); } } exports.default = Netgsm;