Implement shared processors (processors that can be used on clients and centers)

This commit is contained in:
2023-05-05 10:25:31 +02:00
parent 5a5debb249
commit 0e016438a1
7 changed files with 54 additions and 52 deletions

View File

@@ -43,9 +43,9 @@ export default class Center extends SmppSession {
this._defaultSingleJob = Job.createEmptySingle('deliver_sm'); this._defaultSingleJob = Job.createEmptySingle('deliver_sm');
this._defaultMultipleJob = Job.createEmptyMultiple('deliver_sm'); this._defaultMultipleJob = Job.createEmptyMultiple('deliver_sm');
ProcessorManager.attachProcessor(this, ProcessorManager.getProcessor(SubmitSmReplyProcessor.name)); ProcessorManager.attachProcessors(this, ProcessorManager.getProcessors(SubmitSmReplyProcessor.name));
ProcessorManager.attachProcessor(this, ProcessorManager.getProcessor(BindTranscieverReplyProcessor.name)); ProcessorManager.attachProcessors(this, ProcessorManager.getProcessors(BindTranscieverReplyProcessor.name));
ProcessorManager.attachProcessor(this, ProcessorManager.getProcessor(EnquireLinkReplyProcessor.name)); ProcessorManager.attachProcessors(this, ProcessorManager.getProcessors(EnquireLinkReplyProcessor.name));
this.logger = new Logger(`Center-${id}`); this.logger = new Logger(`Center-${id}`);

View File

@@ -42,7 +42,7 @@ export default class Client extends SmppSession {
this._defaultSingleJob = Job.createEmptySingle('submit_sm'); this._defaultSingleJob = Job.createEmptySingle('submit_sm');
this._defaultMultipleJob = Job.createEmptyMultiple('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}`); this.logger = new Logger(`Client-${id}`);
} }

View File

@@ -31,16 +31,16 @@ export default class CenterRequestHandler extends RequestHandler {
doAddProcessor(req: any, res: any): void { doAddProcessor(req: any, res: any): void {
this.sessionManager.getSession(req.params.id).then((session: SmppSession) => { this.sessionManager.getSession(req.params.id).then((session: SmppSession) => {
let processor: PduProcessor = ProcessorManager.getProcessor(req.body.name); let processors: PduProcessor[] = ProcessorManager.getProcessors(req.body.name);
ProcessorManager.attachProcessor(session, processor); ProcessorManager.attachProcessors(session, processors);
res.send(session.serialize()); res.send(session.serialize());
}, this.handleSessionNotFound.bind(this, req, res)); }, this.handleSessionNotFound.bind(this, req, res));
} }
doRemoveProcessor(req: any, res: any): void { doRemoveProcessor(req: any, res: any): void {
this.sessionManager.getSession(req.params.id).then((session: SmppSession) => { this.sessionManager.getSession(req.params.id).then((session: SmppSession) => {
let processor: PduProcessor = ProcessorManager.getProcessor(req.body.name); let processors: PduProcessor[] = ProcessorManager.getProcessors(req.body.name);
ProcessorManager.detachProcessor(session, processor); ProcessorManager.detachProcessors(session, processors);
res.send(session.serialize()); res.send(session.serialize());
}, this.handleSessionNotFound.bind(this, req, res)); }, this.handleSessionNotFound.bind(this, req, res));
} }

View File

@@ -31,16 +31,16 @@ export default class ClientRequestHandler extends RequestHandler {
doAddProcessor(req: any, res: any): void { doAddProcessor(req: any, res: any): void {
this.sessionManager.getSession(req.params.id).then((session: SmppSession) => { this.sessionManager.getSession(req.params.id).then((session: SmppSession) => {
let processor: PduProcessor = ProcessorManager.getProcessor(req.body.name); let processors: PduProcessor[] = ProcessorManager.getProcessors(req.body.name);
ProcessorManager.attachProcessor(session, processor); ProcessorManager.attachProcessors(session, processors);
res.send(session.serialize()); res.send(session.serialize());
}, this.handleSessionNotFound.bind(this, req, res)); }, this.handleSessionNotFound.bind(this, req, res));
} }
doRemoveProcessor(req: any, res: any): void { doRemoveProcessor(req: any, res: any): void {
this.sessionManager.getSession(req.params.id).then((session: SmppSession) => { this.sessionManager.getSession(req.params.id).then((session: SmppSession) => {
let processor: PduProcessor = ProcessorManager.getProcessor(req.body.name); let processors: PduProcessor[] = ProcessorManager.getProcessors(req.body.name);
ProcessorManager.detachProcessor(session, processor); ProcessorManager.detachProcessors(session, processors);
res.send(session.serialize()); res.send(session.serialize());
}, this.handleSessionNotFound.bind(this, req, res)); }, this.handleSessionNotFound.bind(this, req, res));
} }

View File

@@ -35,6 +35,8 @@ export default class ProcessorManager {
ProcessorManager.preprocessors = [ ProcessorManager.preprocessors = [
new DestinationEnumeratorProcessor(Client.name), new DestinationEnumeratorProcessor(Client.name),
new SourceEnumeratorProcessor(Client.name), new SourceEnumeratorProcessor(Client.name),
new DestinationEnumeratorProcessor(Center.name),
new SourceEnumeratorProcessor(Center.name),
new DeliveryReceiptRequestProcessor(Client.name), new DeliveryReceiptRequestProcessor(Client.name),
new LongSmsProcessor(Client.name) new LongSmsProcessor(Client.name)
]; ];
@@ -44,20 +46,16 @@ export default class ProcessorManager {
return this.preprocessors.concat(this.postprocessors); 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}...`); this.logger.log1(`Looking for processor with name ${name}...`);
let pduProcessor: PduProcessor | undefined = this.processors.find((processor: PduProcessor) => processor.name === name); let pduProcessors: PduProcessor[] = this.processors.filter((processor: PduProcessor) => processor.name === name);
if (pduProcessor) { this.logger.log1(`Found ${pduProcessors.length} processor(s) with name ${name}`);
this.logger.log1(`Found processor with name ${name}`); return pduProcessors;
return pduProcessor;
} else {
this.logger.log1(`Processor with name ${name} not found`);
return this.processors[0];
}
} }
static attachProcessor(session: SmppSession, processor: PduProcessor): void { static attachProcessors(session: SmppSession, processors: PduProcessor[]): void {
this.logger.log1(`Trying to attach preprocessor ${processor.name} to session ${session.constructor.name}-${session.id}`); 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)) { if (this.areCompatible(session, processor)) {
// This could be done a little better but this is OK for now // This could be done a little better but this is OK for now
switch (processor.type) { switch (processor.type) {
@@ -73,9 +71,11 @@ export default class ProcessorManager {
} }
} }
} }
}
static detachProcessor(session: SmppSession, processor: PduProcessor): void { static detachProcessors(session: SmppSession, processors: PduProcessor[]): void {
this.logger.log1(`Trying to detach processor ${processor.name} from session ${session.constructor.name}-${session.id}`); this.logger.log1(`Trying to detach processors ${processors.toString()} from session ${session.constructor.name}-${session.id}`);
for (const processor of processors) {
switch (processor.type) { switch (processor.type) {
case Preprocessor.name: case Preprocessor.name:
session.detachPreprocessor(processor); session.detachPreprocessor(processor);
@@ -88,6 +88,7 @@ export default class ProcessorManager {
break; break;
} }
} }
}
static areCompatible(session: SmppSession, processor: PduProcessor): boolean { static areCompatible(session: SmppSession, processor: PduProcessor): boolean {
this.logger.log1(`Checking compatibility between session ${session.constructor.name}-${session.id} and processor ${processor.name}`); this.logger.log1(`Checking compatibility between session ${session.constructor.name}-${session.id} and processor ${processor.name}`);

View File

@@ -74,13 +74,12 @@ export default abstract class SessionManager {
let loadedProcessors: PduProcessor[] = session.preprocessors.concat(session.postprocessors); let loadedProcessors: PduProcessor[] = session.preprocessors.concat(session.postprocessors);
sessionObj.appliedProcessors.forEach((processor: PduProcessor) => { sessionObj.appliedProcessors.forEach((processor: PduProcessor) => {
if (!loadedProcessors.find(p => p.name === processor.name)) { let processorsToDetach: PduProcessor[] = loadedProcessors.filter(p => p.name === processor.name);
ProcessorManager.detachProcessor(sessionObj, processor); ProcessorManager.detachProcessors(sessionObj, processorsToDetach);
}
}); });
loadedProcessors.forEach((processor: PduProcessor) => { loadedProcessors.forEach((processor: PduProcessor) => {
if (!sessionObj.appliedProcessors.find(p => p.name === processor.name)) { if (!sessionObj.appliedProcessors.find(p => p.name === processor.name)) {
ProcessorManager.attachProcessor(sessionObj, ProcessorManager.getProcessor(processor.name)); ProcessorManager.attachProcessors(sessionObj, ProcessorManager.getProcessors(processor.name));
} }
}); });
}); });

View File

@@ -227,10 +227,12 @@ export default abstract class SmppSession {
} }
private detachProcessor(processor: PduProcessor, array: PduProcessor[]): void { private detachProcessor(processor: PduProcessor, array: PduProcessor[]): void {
if (array.indexOf(processor) >= 0) {
array.splice(array.indexOf(processor), 1); array.splice(array.indexOf(processor), 1);
this.logger.log1(`Detaching PDU processor: ${processor.constructor.name}-${this.id}, now active: ${array.length} processors`); 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()); this.eventEmitter.emit(this.EVENT.STATE_CHANGED, this.serialize());
} }
}
private attachProcessor(processor: PduProcessor, array: PduProcessor[]): void { private attachProcessor(processor: PduProcessor, array: PduProcessor[]): void {
if (array.indexOf(processor) === -1) { if (array.indexOf(processor) === -1) {