@@ -6,7 +6,7 @@ import { Message, JSONfn } from "./Messages/Message";
66import { User } from "./User" ;
77import { DatabaseConnection , mapFunc , reduceFunc , finalizeFunc } from "./DatabaseConnection" ;
88import { Config } from "./Config" ;
9- import { amqp_consumer } from "./amqp_consumer" ;
9+ // import { amqp_consumer } from "./amqp_consumer";
1010import { QueueMessage } from "./Messages/QueueMessage" ;
1111import { QueryMessage } from "./Messages/QueryMessage" ;
1212import { MapReduceMessage } from "./Messages/MapReduceMessage" ;
@@ -16,6 +16,7 @@ import { DeleteOneMessage } from "./Messages/DeleteOneMessage";
1616import { Base } from "./base" ;
1717import { UpdateManyMessage } from "./Messages/UpdateManyMessage" ;
1818import { Util } from "./Util" ;
19+ import { amqpwrapper } from "./amqpwrapper" ;
1920
2021interface IHashTable < T > {
2122 [ key : string ] : T ;
@@ -42,8 +43,11 @@ export class WebSocketClient {
4243 public clientagent : string ;
4344 public clientversion : string ;
4445
46+
4547 user : User ;
46- public consumers : amqp_consumer [ ] = [ ] ;
48+ // public consumers: amqp_consumer[] = [];
49+ private queues : IHashTable < string > = { } ;
50+
4751 constructor ( logger : winston . Logger , socketObject : WebSocket ) {
4852 this . _logger = logger ;
4953 this . _socketObject = socketObject ;
@@ -81,88 +85,94 @@ export class WebSocketClient {
8185 }
8286 }
8387 public async CloseConsumers ( ) : Promise < void > {
84- for ( let i = 0 ; i < this . consumers . length ; i ++ ) {
88+ var keys = Object . keys ( this . queues ) ;
89+ for ( let i = 0 ; i < keys . length ; i ++ ) {
8590 try {
86- this . consumers [ i ] . OnMessage = null ;
87- await this . consumers [ i ] . close ( ) ;
91+ await this . CloseConsumer ( keys [ i ] ) ;
8892 } catch ( error ) {
8993 this . _logger . error ( "WebSocketclient::closeconsumers " + error ) ;
9094 }
9195 }
92- this . consumers = [ ] ;
9396 }
9497 public async Close ( ) : Promise < void > {
98+ await this . CloseConsumers ( ) ;
9599 if ( this . _socketObject != null ) {
96- await this . CloseConsumers ( ) ;
97100 try {
98101 this . _socketObject . close ( ) ;
99102 } catch ( error ) {
100103 this . _logger . error ( "WebSocketclient::Close " + error ) ;
101104 }
102105 }
103-
104- }
105- public async CreateConsumer ( queuename : string ) : Promise < void > {
106- var autoDelete : boolean = false ;
107-
108- if ( Util . IsNullEmpty ( queuename ) ) { queuename = "web." + Math . random ( ) . toString ( 36 ) . substr ( 2 , 9 ) ; autoDelete = true ; }
109- var consumer = new amqp_consumer ( this . _logger , Config . amqp_url , queuename ) ;
110- consumer . OnMessage = this . OnMessage . bind ( this ) ;
111- this . consumers . push ( consumer ) ;
112- await consumer . connect ( false , autoDelete ) ;
113106 }
114107 public async CloseConsumer ( queuename : string ) : Promise < void > {
115- var index = - 1 ;
116- for ( let i = 0 ; i < this . consumers . length ; i ++ ) {
117- if ( this . consumers [ i ] . queue == queuename ) index = i ;
118- }
119- if ( index == - 1 ) return ;
120- var consumer : amqp_consumer = this . consumers [ index ] ;
121- this . consumers = this . consumers . splice ( index , 1 ) ;
122- consumer . OnMessage = null ;
123- await consumer . close ( ) ;
124- }
125- public async sendQueueReply ( msg : QueueMessage ) {
126- try {
127- var index = - 1 ;
128- for ( let i = 0 ; i < this . consumers . length ; i ++ ) {
129- if ( this . consumers [ i ] . queue == msg . queuename ) index = i ;
108+ if ( this . queues [ queuename ] != null ) {
109+ try {
110+ await amqpwrapper . Instance ( ) . RemoveQueueConsumer ( queuename ) ;
111+ delete this . queues [ queuename ] ;
112+ } catch ( error ) {
113+ this . _logger . error ( "WebSocketclient::CloseConsumer " + error ) ;
130114 }
131- if ( index == - 1 ) return ;
132- this . consumers [ index ] . sendToQueue ( msg . replyto , msg . correlationId , msg . data ) ;
133- } catch ( error ) {
134- this . _logger . error ( "WebSocketclient::WebSocket error encountered " + error ) ;
135115 }
136116 }
137- public async sendToQueue ( msg : QueueMessage ) {
138- if ( Util . IsNullEmpty ( msg . queuename ) ) { throw new Error ( "sendToQueue, queuename is mandatory" ) }
139- if ( this . consumers . length === 0 ) { throw new Error ( "No consumers for client available to send message through" ) }
140- // var result = this.consumers[0].sendToQueue(msg.queuename, msg.correlationId, { payload: msg.data, jwt: this.jwt, user: this.user });
141- var result = this . consumers [ 0 ] . sendToQueue ( msg . queuename , msg . correlationId , msg . data ) ;
117+ public async CreateConsumer ( queuename : string ) : Promise < string > {
118+ var autoDelete : boolean = false ; // Should we keep the queue around ? for robots and roles
119+ if ( Util . IsNullEmpty ( queuename ) ) { queuename = "web." + Math . random ( ) . toString ( 36 ) . substr ( 2 , 9 ) ; autoDelete = true ; }
120+
121+ var queuename = await amqpwrapper . Instance ( ) . AddQueueConsumer ( queuename , { autoDelete : autoDelete } , async ( msg : any , ack : any , correlationId : string , replyTo : string , done : any ) => {
122+ var _data = msg ;
123+ try {
124+ _data = await this . Queue ( msg , replyTo , correlationId , queuename ) ;
125+ ack ( ) ;
126+ done ( _data ) ;
127+ } catch ( error ) {
128+ ack ( false ) ;
129+ done ( _data ) ;
130+ }
131+ } ) ;
132+ this . queues [ queuename ] = queuename ;
133+ return queuename ;
142134 }
135+ // public async sendQueueReply(msg: QueueMessage, expiration: Number) {
136+ // try {
137+ // var index = -1;
138+ // for (let i = 0; i < this.consumers.length; i++) {
139+ // if (this.consumers[i].queue == msg.queuename) index = i;
140+ // }
141+ // if (index == -1) return;
142+ // this.consumers[index].sendToQueue(msg.replyto, msg.correlationId, msg.data, expiration);
143+ // } catch (error) {
144+ // this._logger.error("WebSocketclient::WebSocket error encountered " + error);
145+ // }
146+ // }
147+ // public async sendToQueue(msg: QueueMessage, expiration: Number) {
148+ // if (Util.IsNullEmpty(msg.queuename)) { throw new Error("sendToQueue, queuename is mandatory") }
149+ // if (this.consumers.length === 0) { throw new Error("No consumers for client available to send message through") }
150+ // // var result = this.consumers[0].sendToQueue(msg.queuename, msg.correlationId, { payload: msg.data, jwt: this.jwt, user: this.user });
151+ // var result = this.consumers[0].sendToQueue(msg.queuename, msg.correlationId, msg.data, expiration);
152+ // }
143153 sleep ( ms ) {
144154 return new Promise ( resolve => {
145155 setTimeout ( resolve , ms )
146156 } )
147157 }
148- async OnMessage ( sender : amqp_consumer , msg : amqplib . ConsumeMessage ) {
149- try {
150- this . _logger . debug ( "WebSocketclient::WebSocket Send message to socketclient, from " + msg . properties . replyTo + " correlationId: " + msg . properties . correlationId ) ;
151- var _data = msg . content . toString ( ) ;
152- var data = await this . Queue ( _data , msg . properties . replyTo , msg . properties . correlationId , sender . queue ) ;
153- this . _logger . debug ( "WebSocketclient::WebSocket ack message in queue " + sender . queue ) ;
154- sender . channel . ack ( msg ) ;
155- } catch ( error ) {
156- this . _logger . error ( "WebSocketclient::WebSocket error in queue " + sender . queue + " / " + error ) ;
157- setTimeout ( ( ) => {
158- try {
159- sender . channel . nack ( msg ) ;
160- } catch ( error ) {
161- this . _logger . error ( "WebSocketclient::WebSocket nack message in queue " + sender . queue ) ;
162- }
163- } , 2000 ) ;
164- }
165- }
158+ // async OnMessage(sender: amqp_consumer, msg: amqplib.ConsumeMessage) {
159+ // try {
160+ // this._logger.debug("WebSocketclient::WebSocket Send message to socketclient, from " + msg.properties.replyTo + " correlationId: " + msg.properties.correlationId);
161+ // var _data = msg.content.toString();
162+ // var data = await this.Queue(_data, msg.properties.replyTo, msg.properties.correlationId, sender.queue);
163+ // this._logger.debug("WebSocketclient::WebSocket ack message in queue " + sender.queue);
164+ // sender.channel.ack(msg);
165+ // } catch (error) {
166+ // this._logger.error("WebSocketclient::WebSocket error in queue " + sender.queue + " / " + error);
167+ // setTimeout(() => {
168+ // try {
169+ // sender.channel.nack(msg);
170+ // } catch (error) {
171+ // this._logger.error("WebSocketclient::WebSocket nack message in queue " + sender.queue);
172+ // }
173+ // }, 2000);
174+ // }
175+ // }
166176 public ping ( ) : boolean {
167177 try {
168178 let msg : SocketMessage = SocketMessage . fromcommand ( "ping" ) ;
0 commit comments