From 5576de3f71170f61dc5955cac4f02258de460e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Majdand=C5=BEi=C4=87?= Date: Thu, 6 Apr 2023 20:14:47 +0200 Subject: [PATCH] Fix issue with application crashing on long sms without long sms processing enabled --- .../Preprocessor/Client/LongSmsProcessor.ts | 36 +++++++++++-------- src/SmppSession.ts | 10 ++++-- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/PDUProcessor/Preprocessor/Client/LongSmsProcessor.ts b/src/PDUProcessor/Preprocessor/Client/LongSmsProcessor.ts index de524ae..9cae1e7 100644 --- a/src/PDUProcessor/Preprocessor/Client/LongSmsProcessor.ts +++ b/src/PDUProcessor/Preprocessor/Client/LongSmsProcessor.ts @@ -6,6 +6,7 @@ const smpp = require('smpp'); export default class LongSmsProcessor extends Preprocessor { private iterator: number = 0; + static readonly maxMessageSizeBits = 1072; constructor(type: string) { // An sms can have a maximum length (short_message) of 1120 bits or 140 bytes. @@ -31,25 +32,12 @@ export default class LongSmsProcessor extends Preprocessor { processPdu(session: any, pdu: PDU, entity?: SmppSession | undefined): Promise { return new Promise((resolve, reject) => { if (!!pdu.short_message) { - let encoding: number | undefined = pdu.data_coding; - if (!encoding) { - encoding = 0; - } - let characterSizeBits: number = 0; - switch (encoding) { - case 0: - case 1: - characterSizeBits = 8; - break; - case 8: - characterSizeBits = 16; - break; - } + let characterSizeBits: number = LongSmsProcessor.getCharacterSizeForEncoding(pdu); + let maxMessageLength: number = LongSmsProcessor.maxMessageSizeBits / characterSizeBits; if (characterSizeBits) { let splitMessage: string[] = []; let message: string = pdu.short_message; let messageLength: number = message.length; - let maxMessageLength: number = 1072 / characterSizeBits; let messageCount: number = Math.ceil(messageLength / maxMessageLength); for (let i = 0; i < messageCount; i++) { splitMessage.push(message.substr(i * maxMessageLength, maxMessageLength)); @@ -77,4 +65,22 @@ export default class LongSmsProcessor extends Preprocessor { } }); } + + static getCharacterSizeForEncoding(pdu: PDU) { + let encoding: number | undefined = pdu.data_coding; + if (!encoding) { + encoding = 0; + } + let characterSizeBits: number = 0; + switch (encoding) { + case 0: + case 1: + characterSizeBits = 8; + break; + case 8: + characterSizeBits = 16; + break; + } + return characterSizeBits; + } } \ No newline at end of file diff --git a/src/SmppSession.ts b/src/SmppSession.ts index 296faa7..d8fc9ef 100644 --- a/src/SmppSession.ts +++ b/src/SmppSession.ts @@ -4,6 +4,7 @@ import Job from "./Job/Job"; import Logger from "./Logger"; import PduProcessor from "./PDUProcessor/PduProcessor"; import Postprocessor from "./PDUProcessor/Postprocessor/Postprocessor"; +import LongSmsProcessor from "./PDUProcessor/Preprocessor/Client/LongSmsProcessor"; import Preprocessor from "./PDUProcessor/Preprocessor/Preprocessor"; const NanoTimer = require("nanotimer"); @@ -114,9 +115,14 @@ export default abstract class SmppSession { doSendPdu(pdu: PDU, session: any): Promise { return new Promise((resolve, reject) => { - this.eventEmitter.emit(this.EVENT.ANY_PDU_TX, pdu); + let characterSizeBits: number = LongSmsProcessor.getCharacterSizeForEncoding(pdu); + let maxMessageLength: number = LongSmsProcessor.maxMessageSizeBits / characterSizeBits; + if (!!pdu.short_message && pdu.short_message.length > maxMessageLength) { + pdu.short_message = pdu.short_message.substring(0, maxMessageLength); + } session.send(pdu, (reply: any) => resolve(reply)); - }) + this.eventEmitter.emit(this.EVENT.ANY_PDU_TX, pdu); + }); } sendSingle(job: Job): Promise {