UNPKG

@netgsm/sms

Version:

Netgsm API Client for SMS sending and reporting

219 lines (218 loc) 10.3 kB
/** * @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()); }); }; import { ApiErrorCode } from "./enums.mjs"; /** * 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); }); } /** * 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 } : {}))), }); const data = yield response.json(); // cancelSms için özel hata kontrolü if (data.code && data.code !== ApiErrorCode.SUCCESS && data.code !== "00") { throw { status: response.status !== 200 ? response.status : 406, code: data.code, jobid: data.jobid || null, description: data.description || "API Error", }; } return data; }); } /** * 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); }); } /** * 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); }); } /** * 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); }); } /** * 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) { return __awaiter(this, void 0, void 0, function* () { var _a; const data = yield response.json(); // Successful report response case if (((_a = data.response) === null || _a === void 0 ? void 0 : _a.job) || data.jobid || response.status === 200) { return data; } // API error codes (30, 40, 60, 70, etc.) if (!data.response && data.code !== ApiErrorCode.SUCCESS) { // Throw object containing HTTP status and API error details const error = Object.assign({ status: response.status !== 200 ? response.status : 406 }, data); throw error; } // HTTP error cases if (!response.ok) { const error = { status: response.status, code: response.statusText, description: "HTTP Error", }; throw error; } return data; }); } } export default Netgsm;