From 0e016438a17f9f01b1ebd360264bfa3cb7b6c15c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Majdand=C5=BEi=C4=87?= Date: Fri, 5 May 2023 10:25:31 +0200 Subject: [PATCH] Implement shared processors (processors that can be used on clients and centers) --- src/Center/Center.ts | 6 +-- src/Client/Client.ts | 2 +- src/HttpServer/CenterRequestHandler.ts | 10 ++--- src/HttpServer/ClientRequestHandler.ts | 10 ++--- src/PDUProcessor/ProcessorManager.ts | 61 +++++++++++++------------- src/SessionManager.ts | 9 ++-- src/SmppSession.ts | 8 ++-- 7 files changed, 54 insertions(+), 52 deletions(-) diff --git a/src/Center/Center.ts b/src/Center/Center.ts index c91e0bc..3b5c9e3 100644 --- a/src/Center/Center.ts +++ b/src/Center/Center.ts @@ -43,9 +43,9 @@ export default class Center extends SmppSession { this._defaultSingleJob = Job.createEmptySingle('deliver_sm'); this._defaultMultipleJob = Job.createEmptyMultiple('deliver_sm'); - ProcessorManager.attachProcessor(this, ProcessorManager.getProcessor(SubmitSmReplyProcessor.name)); - ProcessorManager.attachProcessor(this, ProcessorManager.getProcessor(BindTranscieverReplyProcessor.name)); - ProcessorManager.attachProcessor(this, ProcessorManager.getProcessor(EnquireLinkReplyProcessor.name)); + ProcessorManager.attachProcessors(this, ProcessorManager.getProcessors(SubmitSmReplyProcessor.name)); + ProcessorManager.attachProcessors(this, ProcessorManager.getProcessors(BindTranscieverReplyProcessor.name)); + ProcessorManager.attachProcessors(this, ProcessorManager.getProcessors(EnquireLinkReplyProcessor.name)); this.logger = new Logger(`Center-${id}`); diff --git a/src/Client/Client.ts b/src/Client/Client.ts index bfaa695..2421ec3 100644 --- a/src/Client/Client.ts +++ b/src/Client/Client.ts @@ -42,7 +42,7 @@ export default class Client extends SmppSession { this._defaultSingleJob = Job.createEmptySingle('submit_sm'); this._defaultMultipleJob = Job.createEmptyMultiple('submit_sm'); - ProcessorManager.attachProcessor(this, ProcessorManager.getProcessor(DeliverSmReplyProcessor.name)); + ProcessorManager.attachProcessors(this, ProcessorManager.getProcessors(DeliverSmReplyProcessor.name)); this.logger = new Logger(`Client-${id}`); } diff --git a/src/HttpServer/CenterRequestHandler.ts b/src/HttpServer/CenterRequestHandler.ts index 9d5632e..00ca7be 100644 --- a/src/HttpServer/CenterRequestHandler.ts +++ b/src/HttpServer/CenterRequestHandler.ts @@ -31,16 +31,16 @@ export default class CenterRequestHandler extends RequestHandler { doAddProcessor(req: any, res: any): void { this.sessionManager.getSession(req.params.id).then((session: SmppSession) => { - let processor: PduProcessor = ProcessorManager.getProcessor(req.body.name); - ProcessorManager.attachProcessor(session, processor); + let processors: PduProcessor[] = ProcessorManager.getProcessors(req.body.name); + ProcessorManager.attachProcessors(session, processors); res.send(session.serialize()); }, this.handleSessionNotFound.bind(this, req, res)); } doRemoveProcessor(req: any, res: any): void { this.sessionManager.getSession(req.params.id).then((session: SmppSession) => { - let processor: PduProcessor = ProcessorManager.getProcessor(req.body.name); - ProcessorManager.detachProcessor(session, processor); + let processors: PduProcessor[] = ProcessorManager.getProcessors(req.body.name); + ProcessorManager.detachProcessors(session, processors); res.send(session.serialize()); }, this.handleSessionNotFound.bind(this, req, res)); } @@ -62,4 +62,4 @@ export default class CenterRequestHandler extends RequestHandler { doBind(req: any, res: any): void { throw new Error("Method not implemented."); } -} \ No newline at end of file +} diff --git a/src/HttpServer/ClientRequestHandler.ts b/src/HttpServer/ClientRequestHandler.ts index e5990ab..db0efa2 100644 --- a/src/HttpServer/ClientRequestHandler.ts +++ b/src/HttpServer/ClientRequestHandler.ts @@ -31,16 +31,16 @@ export default class ClientRequestHandler extends RequestHandler { doAddProcessor(req: any, res: any): void { this.sessionManager.getSession(req.params.id).then((session: SmppSession) => { - let processor: PduProcessor = ProcessorManager.getProcessor(req.body.name); - ProcessorManager.attachProcessor(session, processor); + let processors: PduProcessor[] = ProcessorManager.getProcessors(req.body.name); + ProcessorManager.attachProcessors(session, processors); res.send(session.serialize()); }, this.handleSessionNotFound.bind(this, req, res)); } doRemoveProcessor(req: any, res: any): void { this.sessionManager.getSession(req.params.id).then((session: SmppSession) => { - let processor: PduProcessor = ProcessorManager.getProcessor(req.body.name); - ProcessorManager.detachProcessor(session, processor); + let processors: PduProcessor[] = ProcessorManager.getProcessors(req.body.name); + ProcessorManager.detachProcessors(session, processors); res.send(session.serialize()); }, this.handleSessionNotFound.bind(this, req, res)); } @@ -80,4 +80,4 @@ export default class ClientRequestHandler extends RequestHandler { })); }, this.handleSessionNotFound.bind(this, req, res)); } -} \ No newline at end of file +} diff --git a/src/PDUProcessor/ProcessorManager.ts b/src/PDUProcessor/ProcessorManager.ts index 5b8dcd9..79792fc 100644 --- a/src/PDUProcessor/ProcessorManager.ts +++ b/src/PDUProcessor/ProcessorManager.ts @@ -35,6 +35,8 @@ export default class ProcessorManager { ProcessorManager.preprocessors = [ new DestinationEnumeratorProcessor(Client.name), new SourceEnumeratorProcessor(Client.name), + new DestinationEnumeratorProcessor(Center.name), + new SourceEnumeratorProcessor(Center.name), new DeliveryReceiptRequestProcessor(Client.name), new LongSmsProcessor(Client.name) ]; @@ -44,28 +46,42 @@ export default class ProcessorManager { return this.preprocessors.concat(this.postprocessors); } - static getProcessor(name: string): PduProcessor { + static getProcessors(name: string): PduProcessor[] { this.logger.log1(`Looking for processor with name ${name}...`); - let pduProcessor: PduProcessor | undefined = this.processors.find((processor: PduProcessor) => processor.name === name); - if (pduProcessor) { - this.logger.log1(`Found processor with name ${name}`); - return pduProcessor; - } else { - this.logger.log1(`Processor with name ${name} not found`); - return this.processors[0]; + let pduProcessors: PduProcessor[] = this.processors.filter((processor: PduProcessor) => processor.name === name); + this.logger.log1(`Found ${pduProcessors.length} processor(s) with name ${name}`); + return pduProcessors; + } + + static attachProcessors(session: SmppSession, processors: PduProcessor[]): void { + this.logger.log1(`Trying to attach processor ${processors.toString()} to session ${session.constructor.name}-${session.id}`); + for (const processor of processors) { + if (this.areCompatible(session, processor)) { + // This could be done a little better but this is OK for now + switch (processor.type) { + case Preprocessor.name: + session.attachPreprocessor(processor); + break; + case Postprocessor.name: + session.attachPostprocessor(processor); + break; + default: + this.logger.log1(`Processor ${processor.name} is not a preprocessor or a postprocessor`); + break; + } + } } } - static attachProcessor(session: SmppSession, processor: PduProcessor): void { - this.logger.log1(`Trying to attach preprocessor ${processor.name} to session ${session.constructor.name}-${session.id}`); - if (this.areCompatible(session, processor)) { - // This could be done a little better but this is OK for now + static detachProcessors(session: SmppSession, processors: PduProcessor[]): void { + this.logger.log1(`Trying to detach processors ${processors.toString()} from session ${session.constructor.name}-${session.id}`); + for (const processor of processors) { switch (processor.type) { case Preprocessor.name: - session.attachPreprocessor(processor); + session.detachPreprocessor(processor); break; case Postprocessor.name: - session.attachPostprocessor(processor); + session.detachPostprocessor(processor); break; default: this.logger.log1(`Processor ${processor.name} is not a preprocessor or a postprocessor`); @@ -74,21 +90,6 @@ export default class ProcessorManager { } } - static detachProcessor(session: SmppSession, processor: PduProcessor): void { - this.logger.log1(`Trying to detach processor ${processor.name} from session ${session.constructor.name}-${session.id}`); - switch (processor.type) { - case Preprocessor.name: - session.detachPreprocessor(processor); - break; - case Postprocessor.name: - session.detachPostprocessor(processor); - break; - default: - this.logger.log1(`Processor ${processor.name} is not a preprocessor or a postprocessor`); - break; - } - } - static areCompatible(session: SmppSession, processor: PduProcessor): boolean { this.logger.log1(`Checking compatibility between session ${session.constructor.name}-${session.id} and processor ${processor.name}`); return session.constructor.name === processor.sessionType; @@ -105,4 +106,4 @@ export default class ProcessorManager { static getPostprocessorsForType(type: string): PduProcessor[] { return this.postprocessors.filter((processor: PduProcessor) => processor.sessionType === type); } -} \ No newline at end of file +} diff --git a/src/SessionManager.ts b/src/SessionManager.ts index 2385b31..5fa11b1 100644 --- a/src/SessionManager.ts +++ b/src/SessionManager.ts @@ -74,13 +74,12 @@ export default abstract class SessionManager { let loadedProcessors: PduProcessor[] = session.preprocessors.concat(session.postprocessors); sessionObj.appliedProcessors.forEach((processor: PduProcessor) => { - if (!loadedProcessors.find(p => p.name === processor.name)) { - ProcessorManager.detachProcessor(sessionObj, processor); - } + let processorsToDetach: PduProcessor[] = loadedProcessors.filter(p => p.name === processor.name); + ProcessorManager.detachProcessors(sessionObj, processorsToDetach); }); loadedProcessors.forEach((processor: PduProcessor) => { if (!sessionObj.appliedProcessors.find(p => p.name === processor.name)) { - ProcessorManager.attachProcessor(sessionObj, ProcessorManager.getProcessor(processor.name)); + ProcessorManager.attachProcessors(sessionObj, ProcessorManager.getProcessors(processor.name)); } }); }); @@ -142,4 +141,4 @@ export default abstract class SessionManager { } }); } -} \ No newline at end of file +} diff --git a/src/SmppSession.ts b/src/SmppSession.ts index 0c53159..975485e 100644 --- a/src/SmppSession.ts +++ b/src/SmppSession.ts @@ -227,9 +227,11 @@ export default abstract class SmppSession { } private detachProcessor(processor: PduProcessor, array: PduProcessor[]): void { - array.splice(array.indexOf(processor), 1); - this.logger.log1(`Detaching PDU processor: ${processor.constructor.name}-${this.id}, now active: ${array.length} processors`); - this.eventEmitter.emit(this.EVENT.STATE_CHANGED, this.serialize()); + if (array.indexOf(processor) >= 0) { + array.splice(array.indexOf(processor), 1); + this.logger.log1(`Detaching PDU processor: ${processor.constructor.name}-${this.id}, now active: ${array.length} processors`); + this.eventEmitter.emit(this.EVENT.STATE_CHANGED, this.serialize()); + } } private attachProcessor(processor: PduProcessor, array: PduProcessor[]): void {