@@ -6,6 +6,12 @@ import { Config } from "./Config";
66import { amqpwrapper , QueueMessageOptions , amqpqueue } from "./amqpwrapper" ;
77import { NoderedUtil , Base , InsertOneMessage , QueueMessage , MapReduceMessage , QueryMessage , UpdateOneMessage , UpdateManyMessage , DeleteOneMessage , User , mapFunc , reduceFunc , finalizeFunc , QueuedMessage , QueuedMessageCallback , WatchEventMessage } from "openflow-api" ;
88import { ChangeStream } from "mongodb" ;
9+ const { RateLimiterMemory } = require ( 'rate-limiter-flexible' )
10+
11+ const BaseRateLimiter = new RateLimiterMemory ( {
12+ points : Config . socket_rate_limit_points ,
13+ duration : Config . socket_rate_limit_duration ,
14+ } ) ;
915
1016interface IHashTable < T > {
1117 [ key : string ] : T ;
@@ -70,7 +76,7 @@ export class WebSocketServerClient {
7076 }
7177 logger . info ( "new client " + this . id + " from " + this . remoteip ) ;
7278 socketObject . on ( "open" , ( e : Event ) : void => this . open ( e ) ) ;
73- socketObject . on ( "message" , ( e : string ) : void => this . message ( e ) ) ; // e: MessageEvent
79+ socketObject . on ( "message" , ( e : string ) : void => ( this . message ( e ) as any ) ) ; // e: MessageEvent
7480 socketObject . on ( "error" , ( e : Event ) : void => this . error ( e ) ) ;
7581 socketObject . on ( "close" , ( e : CloseEvent ) : void => this . close ( e ) ) ;
7682 }
@@ -129,15 +135,30 @@ export class WebSocketServerClient {
129135 }
130136 }
131137 }
132- private message ( message : string ) : void { // e: MessageEvent
138+ private _message ( message : string ) : void {
139+ //this._logger.silly("WebSocket message received " + message);
140+ let msg : SocketMessage = SocketMessage . fromjson ( message ) ;
141+ this . _logger . silly ( "WebSocket message received id: " + msg . id + " index: " + msg . index + " count: " + msg . count ) ;
142+ this . _receiveQueue . push ( msg ) ;
143+ if ( ( msg . index + 1 ) >= msg . count ) this . ProcessQueue ( ) ;
144+ }
145+ private async message ( message : string ) : Promise < void > {
146+ let username : string = "Unknown" ;
133147 try {
134- //this._logger.silly("WebSocket message received " + message);
135- let msg : SocketMessage = SocketMessage . fromjson ( message ) ;
136- this . _logger . silly ( "WebSocket message received id: " + msg . id + " index: " + msg . index + " count: " + msg . count ) ;
137- this . _receiveQueue . push ( msg ) ;
138- this . ProcessQueue ( ) ;
148+ try {
149+
150+ if ( ! NoderedUtil . IsNullUndefinded ( this . user ) ) { username = this . user . username ; }
151+
152+ // await this.consume("me");
153+ var res = await BaseRateLimiter . consume ( "me" ) ;
154+ // console.log("SOCKET_NO_RATE_LIMIT consumedPoints: " + res.consumedPoints + " remainingPoints: " + res.remainingPoints);
155+ this . _message ( message ) ;
156+ } catch ( error ) {
157+ this . _logger . debug ( "[" + username + "/" + this . clientagent + "/" + this . id + "] SOCKET_RATE_LIMIT consumedPoints: " + error . consumedPoints + " remainingPoints: " + error . remainingPoints + " msBeforeNext: " + error . msBeforeNext ) ;
158+ setTimeout ( ( ) => { this . message ( message ) ; } , Math . floor ( Math . random ( ) * 10 ) * 100 ) ;
159+ }
139160 } catch ( error ) {
140- this . _logger . error ( "WebSocket error encountered " + ( error . message ? error . message : error ) ) ;
161+ this . _logger . error ( "[" + username + "/" + this . clientagent + "/" + this . id + "] WebSocket error encountered " + ( error . message ? error . message : error ) ) ;
141162 const errormessage : Message = new Message ( ) ; errormessage . command = "error" ; errormessage . data = ( error . message ? error . message : error ) ;
142163 this . _socketObject . send ( JSON . stringify ( errormessage ) ) ;
143164 }
@@ -163,7 +184,7 @@ export class WebSocketServerClient {
163184 if ( this . _socketObject != null ) {
164185 try {
165186 this . _socketObject . removeListener ( "open" , ( e : Event ) : void => this . open ( e ) ) ;
166- this . _socketObject . removeListener ( "message" , ( e : string ) : void => this . message ( e ) ) ; // e: MessageEvent
187+ this . _socketObject . removeListener ( "message" , ( e : string ) : void => ( this . message ( e ) as any ) ) ; // e: MessageEvent
167188 this . _socketObject . removeListener ( "error" , ( e : Event ) : void => this . error ( e ) ) ;
168189 this . _socketObject . removeListener ( "close" , ( e : CloseEvent ) : void => this . close ( e ) ) ;
169190 } catch ( error ) {
0 commit comments