From 3447194e9999b6feead8a42cd45b2e7b5d192435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Majdand=C5=BEi=C4=87?= Date: Wed, 5 Apr 2023 21:18:47 +0200 Subject: [PATCH] Fix deleted centers not being deleted and do some work on delivery reports --- src/Center/Center.ts | 1 + .../Center/DeliveryReceiptProcessor.ts | 58 +++++++++++++++++++ .../Client/DeliveryReceiptRequestProcessor.ts | 18 ++++++ src/PDUProcessor/ProcessorManager.ts | 14 +++-- src/SessionManager.ts | 1 + src/main.ts | 8 +-- 6 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 src/PDUProcessor/Postprocessor/Center/DeliveryReceiptProcessor.ts create mode 100644 src/PDUProcessor/Preprocessor/Client/DeliveryReceiptRequestProcessor.ts diff --git a/src/Center/Center.ts b/src/Center/Center.ts index 316d640..73ebe8c 100644 --- a/src/Center/Center.ts +++ b/src/Center/Center.ts @@ -132,6 +132,7 @@ export default class Center extends SmppSession { close(): Promise { return new Promise((resolve, reject) => { this.logger.log1(`Center-${this.id} closing active connections`); + this.server.close(); this.sessions.forEach((session: any) => { session.close(); }); diff --git a/src/PDUProcessor/Postprocessor/Center/DeliveryReceiptProcessor.ts b/src/PDUProcessor/Postprocessor/Center/DeliveryReceiptProcessor.ts new file mode 100644 index 0000000..f1af6a7 --- /dev/null +++ b/src/PDUProcessor/Postprocessor/Center/DeliveryReceiptProcessor.ts @@ -0,0 +1,58 @@ +import SmppSession from "../../../SmppSession"; +import Postprocessor from "../Postprocessor"; + +const smpp = require("smpp"); + +export default class DeliveryReceiptProcessor extends Postprocessor { + constructor(type: string) { + super(type); + } + + processPdu(session: any, pdu: any, entity?: SmppSession | undefined): Promise { + return new Promise((resolve, reject) => { + if (!!pdu.command && pdu.command === "submit_sm" && pdu.registered_delivery) { + session.send(pdu.response()); + + let DRPdu = new smpp.PDU('deliver_sm', { + source_addr: pdu.destination_addr, + destination_addr: pdu.source_addr, + short_message: pdu.short_message + }); + console.log(pdu); + session.send(DRPdu); + + resolve(pdu); + } + }); + } +} + + + // private void sendDeliveryReceipt(Address mtDestinationAddress, Address mtSourceAddress, String messageId, String text) { + // SmppSession session = sessionRef.get(); + // + // DeliverSm deliver = new DeliverSm(); + // deliver.setEsmClass(SmppConstants.ESM_CLASS_MT_SMSC_DELIVERY_RECEIPT); + // deliver.setSourceAddress(mtSourceAddress); + // deliver.setDestAddress(mtDestinationAddress); + // deliver.setDataCoding(SmppConstants.DATA_CODING_GSM); + // + // DeliverReportStatus delivered = DeliverReportStatus.DELIVERED; + // + // DeliveryReceipt deliveryReceipt = new DeliveryReceipt(); + // deliveryReceipt.setDeliveredCount(1); + // deliveryReceipt.setDoneDate(DateTime.now()); + // deliveryReceipt.setRawErrorCode(delivered.getErrorCode()); + // deliveryReceipt.setMessageId(messageId); + // deliveryReceipt.setStateText(delivered.getStateText()); + // deliveryReceipt.setSubmitCount(1); + // deliveryReceipt.setSubmitDate(DateTime.now()); + // deliveryReceipt.setText(text); + // try { + // deliver.setShortMessage(deliveryReceipt.toShortMessage().getBytes()); + // } catch (SmppInvalidArgumentException e) { + // //should not be reached + // //ignore + // } + // sendRequestPdu(session, deliver); + // } \ No newline at end of file diff --git a/src/PDUProcessor/Preprocessor/Client/DeliveryReceiptRequestProcessor.ts b/src/PDUProcessor/Preprocessor/Client/DeliveryReceiptRequestProcessor.ts new file mode 100644 index 0000000..77b61b4 --- /dev/null +++ b/src/PDUProcessor/Preprocessor/Client/DeliveryReceiptRequestProcessor.ts @@ -0,0 +1,18 @@ +import SmppSession from "../../../SmppSession"; +import Preprocessor from "../Preprocessor"; + +export default class DeliveryReceiptRequestProcessor extends Preprocessor { + private iterator: number = 0; + + constructor(type: string) { + super(type); + } + + processPdu(session: any, pdu: any, entity?: SmppSession | undefined): Promise { + return new Promise((resolve, reject) => { + if (!!pdu.command && pdu.command === "submit_sm") { + pdu.registered_delivery = 1; + } + }); + } +} \ No newline at end of file diff --git a/src/PDUProcessor/ProcessorManager.ts b/src/PDUProcessor/ProcessorManager.ts index 1883b48..19dd10a 100644 --- a/src/PDUProcessor/ProcessorManager.ts +++ b/src/PDUProcessor/ProcessorManager.ts @@ -5,10 +5,12 @@ import SmppSession from "../SmppSession"; import PduProcessor from "./PduProcessor"; import BindTranscieverReplyProcessor from "./Postprocessor/Center/BindTranscieverReplyProcessor"; import DebugPduProcessor from "./Postprocessor/Center/DebugPduProcessor"; +import DeliveryReceiptProcessor from "./Postprocessor/Center/DeliveryReceiptProcessor"; import EchoPduProcessor from "./Postprocessor/Center/EchoPduProcessor"; import SubmitSmReplyProcessor from "./Postprocessor/Center/SubmitSmReplyProcessor"; import DeliverSmReplyProcessor from "./Postprocessor/Client/DeliverSmReplyProcessor"; import Postprocessor from "./Postprocessor/Postprocessor"; +import DeliveryReceiptRequestProcessor from "./Preprocessor/Client/DeliveryReceiptRequestProcessor"; import DestinationEnumeratorProcessor from "./Preprocessor/Client/DestinationEnumeratorProcessor"; import SourceEnumeratorProcessor from "./Preprocessor/Client/SourceEnumeratorProcessor"; import Preprocessor from "./Preprocessor/Preprocessor"; @@ -21,16 +23,18 @@ export default class ProcessorManager { constructor() { // This is an IDIOTIC solution, but it works // Try running eb22a43 to find out what's wrong with the previous approach - ProcessorManager.preprocessors = [ - new DestinationEnumeratorProcessor(Client.name), - new SourceEnumeratorProcessor(Client.name) - ]; ProcessorManager.postprocessors = [ new DebugPduProcessor(Center.name), new EchoPduProcessor(Center.name), new DeliverSmReplyProcessor(Client.name), new SubmitSmReplyProcessor(Center.name), - new BindTranscieverReplyProcessor(Center.name) + new BindTranscieverReplyProcessor(Center.name), + new DeliveryReceiptProcessor(Center.name) + ]; + ProcessorManager.preprocessors = [ + new DestinationEnumeratorProcessor(Client.name), + new SourceEnumeratorProcessor(Client.name), + new DeliveryReceiptRequestProcessor(Client.name) ]; } diff --git a/src/SessionManager.ts b/src/SessionManager.ts index 9377185..30b7acb 100644 --- a/src/SessionManager.ts +++ b/src/SessionManager.ts @@ -40,6 +40,7 @@ export default abstract class SessionManager { removeSession(session: SmppSession): Promise { return new Promise((resolve, reject) => { this.logger.log1(`Removing session with id ${session.id}`); + session.close(); this.sessions = this.sessions.filter(s => s.id !== session.id); resolve(); }); diff --git a/src/main.ts b/src/main.ts index 74a644f..109ed7a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -50,7 +50,7 @@ async function main() { main(); -process.on('exit', cleanup); -process.on('SIGINT', cleanup); -process.on('SIGUSR1', cleanup); -process.on('SIGUSR2', cleanup); \ No newline at end of file +// process.on('exit', cleanup); +// process.on('SIGINT', cleanup); +// process.on('SIGUSR1', cleanup); +// process.on('SIGUSR2', cleanup); \ No newline at end of file