Fix issue with application crashing on long sms without long sms processing enabled
This commit is contained in:
		| @@ -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; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| @@ -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> { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 David Majdandžić
					David Majdandžić