Fix issue with application crashing on long sms without long sms processing enabled

This commit is contained in:
David Majdandžić
2023-04-06 20:14:47 +02:00
parent 12dd92e980
commit 5576de3f71
2 changed files with 29 additions and 17 deletions

View File

@@ -6,6 +6,7 @@ const smpp = require('smpp');
export default class LongSmsProcessor extends Preprocessor { export default class LongSmsProcessor extends Preprocessor {
private iterator: number = 0; private iterator: number = 0;
static readonly maxMessageSizeBits = 1072;
constructor(type: string) { constructor(type: string) {
// An sms can have a maximum length (short_message) of 1120 bits or 140 bytes. // 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<any> { processPdu(session: any, pdu: PDU, entity?: SmppSession | undefined): Promise<any> {
return new Promise<any>((resolve, reject) => { return new Promise<any>((resolve, reject) => {
if (!!pdu.short_message) { if (!!pdu.short_message) {
let encoding: number | undefined = pdu.data_coding; let characterSizeBits: number = LongSmsProcessor.getCharacterSizeForEncoding(pdu);
if (!encoding) { let maxMessageLength: number = LongSmsProcessor.maxMessageSizeBits / characterSizeBits;
encoding = 0;
}
let characterSizeBits: number = 0;
switch (encoding) {
case 0:
case 1:
characterSizeBits = 8;
break;
case 8:
characterSizeBits = 16;
break;
}
if (characterSizeBits) { if (characterSizeBits) {
let splitMessage: string[] = []; let splitMessage: string[] = [];
let message: string = pdu.short_message; let message: string = pdu.short_message;
let messageLength: number = message.length; let messageLength: number = message.length;
let maxMessageLength: number = 1072 / characterSizeBits;
let messageCount: number = Math.ceil(messageLength / maxMessageLength); let messageCount: number = Math.ceil(messageLength / maxMessageLength);
for (let i = 0; i < messageCount; i++) { for (let i = 0; i < messageCount; i++) {
splitMessage.push(message.substr(i * maxMessageLength, maxMessageLength)); 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;
}
} }

View File

@@ -4,6 +4,7 @@ import Job from "./Job/Job";
import Logger from "./Logger"; import Logger from "./Logger";
import PduProcessor from "./PDUProcessor/PduProcessor"; import PduProcessor from "./PDUProcessor/PduProcessor";
import Postprocessor from "./PDUProcessor/Postprocessor/Postprocessor"; import Postprocessor from "./PDUProcessor/Postprocessor/Postprocessor";
import LongSmsProcessor from "./PDUProcessor/Preprocessor/Client/LongSmsProcessor";
import Preprocessor from "./PDUProcessor/Preprocessor/Preprocessor"; import Preprocessor from "./PDUProcessor/Preprocessor/Preprocessor";
const NanoTimer = require("nanotimer"); const NanoTimer = require("nanotimer");
@@ -114,9 +115,14 @@ export default abstract class SmppSession {
doSendPdu(pdu: PDU, session: any): Promise<any> { doSendPdu(pdu: PDU, session: any): Promise<any> {
return new Promise<any>((resolve, reject) => { return new Promise<any>((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)); session.send(pdu, (reply: any) => resolve(reply));
}) this.eventEmitter.emit(this.EVENT.ANY_PDU_TX, pdu);
});
} }
sendSingle(job: Job): Promise<object> { sendSingle(job: Job): Promise<object> {