shoonya-sdk 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -68,4 +68,5 @@ wsClient.connect();
68
68
  - Auto Refresh Access Token When it is expired
69
69
  - Sync Credentials and Tokens between Rest and WS Clients
70
70
  - Reconnect with Shoonya WS at fixed time interval, which is configurable
71
+ - Configurable heartbeat timer to keep connection alive
71
72
  - and more...
package/dist/index.cjs CHANGED
@@ -773,6 +773,8 @@ var WebsocketClient = class extends import_events.EventEmitter {
773
773
  logger;
774
774
  retryCount = 0;
775
775
  maxRetryAttempt;
776
+ isHeartbeatStarted = false;
777
+ heartbeatInterval;
776
778
  /**
777
779
  *
778
780
  * @param params
@@ -785,9 +787,11 @@ var WebsocketClient = class extends import_events.EventEmitter {
785
787
  cred,
786
788
  logging = false,
787
789
  logFileType = "SEPARATE",
788
- maxRetryAttempt = 3
790
+ maxRetryAttempt = 3,
791
+ heartbeatInterval = 15e3
789
792
  } = params || {};
790
793
  this.maxRetryAttempt = maxRetryAttempt;
794
+ this.heartbeatInterval = heartbeatInterval;
791
795
  this.logger = new logger_default(
792
796
  "shoonya_ws-client",
793
797
  1024 * 1024 * 10,
@@ -840,6 +844,7 @@ var WebsocketClient = class extends import_events.EventEmitter {
840
844
  if (result.t === "ck" && result.s.toLowerCase() === "ok") {
841
845
  setTimeout(() => {
842
846
  this.logger.log("|WSClient| Connected with Shoonya WS.");
847
+ this.sendHeartbeat(this.heartbeatInterval);
843
848
  this.emit("connected");
844
849
  this.resubscribe();
845
850
  }, 3e3);
@@ -927,6 +932,9 @@ var WebsocketClient = class extends import_events.EventEmitter {
927
932
  close() {
928
933
  this.ws.close(0);
929
934
  }
935
+ isWsOpen() {
936
+ return this.ws.OPEN === this.ws.readyState;
937
+ }
930
938
  resubscribe() {
931
939
  if (this.subscribedTokens.length) {
932
940
  const tokensToSub = Array.from(new Set(this.subscribedTokens));
@@ -1009,9 +1017,6 @@ var WebsocketClient = class extends import_events.EventEmitter {
1009
1017
  }
1010
1018
  return null;
1011
1019
  }
1012
- isWsOpen() {
1013
- return this.ws.OPEN === this.ws.readyState;
1014
- }
1015
1020
  refreshAccessToken() {
1016
1021
  this.logger.log("Trying to refresh the Access Token");
1017
1022
  refreshAccessToken().then(() => {
@@ -1038,6 +1043,16 @@ var WebsocketClient = class extends import_events.EventEmitter {
1038
1043
  }
1039
1044
  return targetDate.getTime() - dateNow.getTime();
1040
1045
  }
1046
+ sendHeartbeat(interval) {
1047
+ if (this.isHeartbeatStarted)
1048
+ return;
1049
+ this.isHeartbeatStarted = true;
1050
+ setInterval(() => {
1051
+ if (this.isWsOpen()) {
1052
+ this.ws.ping("ping");
1053
+ }
1054
+ }, interval);
1055
+ }
1041
1056
  };
1042
1057
  // Annotate the CommonJS export names for ESM import in node:
1043
1058
  0 && (module.exports = {
package/dist/index.d.cts CHANGED
@@ -914,6 +914,8 @@ declare class WebsocketClient extends EventEmitter {
914
914
  private logger;
915
915
  private retryCount;
916
916
  private maxRetryAttempt;
917
+ private isHeartbeatStarted;
918
+ private heartbeatInterval;
917
919
  /**
918
920
  *
919
921
  * @param params
@@ -926,6 +928,7 @@ declare class WebsocketClient extends EventEmitter {
926
928
  cred?: UserCred;
927
929
  logFileType?: LoggerType;
928
930
  maxRetryAttempt?: number;
931
+ heartbeatInterval?: number;
929
932
  });
930
933
  connect(): void;
931
934
  private wsOpenEvent;
@@ -935,15 +938,16 @@ declare class WebsocketClient extends EventEmitter {
935
938
  subscribe(scrips: string | string[], feedType?: FeedType): void;
936
939
  unsubscribe(scrips: string | string[]): void;
937
940
  close(): void;
941
+ isWsOpen(): boolean;
938
942
  private resubscribe;
939
943
  private send;
940
944
  private refreshEveryMorning;
941
945
  private parseDailyRefreshTime;
942
946
  private validateTimezoneString;
943
947
  private validateFeedType;
944
- private isWsOpen;
945
948
  private refreshAccessToken;
946
949
  private calculateNextRefreshDelay;
950
+ private sendHeartbeat;
947
951
  }
948
952
 
949
953
  export { AddScripToWatchlist, BaseType, BaseTypeFail, BaseTypeSuccess, BaseTypeWithoutTime, BasketMargin, CancelOrder, ChangePassword, DailyTimeString, DepthSubscriptionUpdate, ExchMessage, Exchange, ExitSNOOrder, FeedType, ForgotPassword, GetClientDetails, GetHSToken, GetLimitsParam, GetListOfPredefinedMW, GetListOfPredefinedMWScrip, GetSecurityInfo, GetTokenExpiry, GetUserDetails, GetWatchlist, GetWatchlistNames, HistoricData, Holdings, IndexList, Limits, Login, LoginWithDevicePin, LogoutResponse, MakeKeysRequired, ModifyOrder, OptionChain, Order, OrderBook, OrderInput, OrderMargin, Path, PlaceOrder, PositionBook, ProductConversion, ProductType, RemoveScripFromWatchlist, RestClient, ScripInfo, SearchScrip, Segment, SetDevicePin, SingleOrderHistory, SingleOrderStatus, TopIndexList, TopIndexListNames, TradeBook, UserCred, ValidateHSToken, WebsocketClient, getQuotes, paths };
package/dist/index.d.ts CHANGED
@@ -914,6 +914,8 @@ declare class WebsocketClient extends EventEmitter {
914
914
  private logger;
915
915
  private retryCount;
916
916
  private maxRetryAttempt;
917
+ private isHeartbeatStarted;
918
+ private heartbeatInterval;
917
919
  /**
918
920
  *
919
921
  * @param params
@@ -926,6 +928,7 @@ declare class WebsocketClient extends EventEmitter {
926
928
  cred?: UserCred;
927
929
  logFileType?: LoggerType;
928
930
  maxRetryAttempt?: number;
931
+ heartbeatInterval?: number;
929
932
  });
930
933
  connect(): void;
931
934
  private wsOpenEvent;
@@ -935,15 +938,16 @@ declare class WebsocketClient extends EventEmitter {
935
938
  subscribe(scrips: string | string[], feedType?: FeedType): void;
936
939
  unsubscribe(scrips: string | string[]): void;
937
940
  close(): void;
941
+ isWsOpen(): boolean;
938
942
  private resubscribe;
939
943
  private send;
940
944
  private refreshEveryMorning;
941
945
  private parseDailyRefreshTime;
942
946
  private validateTimezoneString;
943
947
  private validateFeedType;
944
- private isWsOpen;
945
948
  private refreshAccessToken;
946
949
  private calculateNextRefreshDelay;
950
+ private sendHeartbeat;
947
951
  }
948
952
 
949
953
  export { AddScripToWatchlist, BaseType, BaseTypeFail, BaseTypeSuccess, BaseTypeWithoutTime, BasketMargin, CancelOrder, ChangePassword, DailyTimeString, DepthSubscriptionUpdate, ExchMessage, Exchange, ExitSNOOrder, FeedType, ForgotPassword, GetClientDetails, GetHSToken, GetLimitsParam, GetListOfPredefinedMW, GetListOfPredefinedMWScrip, GetSecurityInfo, GetTokenExpiry, GetUserDetails, GetWatchlist, GetWatchlistNames, HistoricData, Holdings, IndexList, Limits, Login, LoginWithDevicePin, LogoutResponse, MakeKeysRequired, ModifyOrder, OptionChain, Order, OrderBook, OrderInput, OrderMargin, Path, PlaceOrder, PositionBook, ProductConversion, ProductType, RemoveScripFromWatchlist, RestClient, ScripInfo, SearchScrip, Segment, SetDevicePin, SingleOrderHistory, SingleOrderStatus, TopIndexList, TopIndexListNames, TradeBook, UserCred, ValidateHSToken, WebsocketClient, getQuotes, paths };
package/dist/index.js CHANGED
@@ -745,6 +745,8 @@ var WebsocketClient = class extends EventEmitter {
745
745
  logger;
746
746
  retryCount = 0;
747
747
  maxRetryAttempt;
748
+ isHeartbeatStarted = false;
749
+ heartbeatInterval;
748
750
  /**
749
751
  *
750
752
  * @param params
@@ -757,9 +759,11 @@ var WebsocketClient = class extends EventEmitter {
757
759
  cred,
758
760
  logging = false,
759
761
  logFileType = "SEPARATE",
760
- maxRetryAttempt = 3
762
+ maxRetryAttempt = 3,
763
+ heartbeatInterval = 15e3
761
764
  } = params || {};
762
765
  this.maxRetryAttempt = maxRetryAttempt;
766
+ this.heartbeatInterval = heartbeatInterval;
763
767
  this.logger = new logger_default(
764
768
  "shoonya_ws-client",
765
769
  1024 * 1024 * 10,
@@ -812,6 +816,7 @@ var WebsocketClient = class extends EventEmitter {
812
816
  if (result.t === "ck" && result.s.toLowerCase() === "ok") {
813
817
  setTimeout(() => {
814
818
  this.logger.log("|WSClient| Connected with Shoonya WS.");
819
+ this.sendHeartbeat(this.heartbeatInterval);
815
820
  this.emit("connected");
816
821
  this.resubscribe();
817
822
  }, 3e3);
@@ -899,6 +904,9 @@ var WebsocketClient = class extends EventEmitter {
899
904
  close() {
900
905
  this.ws.close(0);
901
906
  }
907
+ isWsOpen() {
908
+ return this.ws.OPEN === this.ws.readyState;
909
+ }
902
910
  resubscribe() {
903
911
  if (this.subscribedTokens.length) {
904
912
  const tokensToSub = Array.from(new Set(this.subscribedTokens));
@@ -981,9 +989,6 @@ var WebsocketClient = class extends EventEmitter {
981
989
  }
982
990
  return null;
983
991
  }
984
- isWsOpen() {
985
- return this.ws.OPEN === this.ws.readyState;
986
- }
987
992
  refreshAccessToken() {
988
993
  this.logger.log("Trying to refresh the Access Token");
989
994
  refreshAccessToken().then(() => {
@@ -1010,6 +1015,16 @@ var WebsocketClient = class extends EventEmitter {
1010
1015
  }
1011
1016
  return targetDate.getTime() - dateNow.getTime();
1012
1017
  }
1018
+ sendHeartbeat(interval) {
1019
+ if (this.isHeartbeatStarted)
1020
+ return;
1021
+ this.isHeartbeatStarted = true;
1022
+ setInterval(() => {
1023
+ if (this.isWsOpen()) {
1024
+ this.ws.ping("ping");
1025
+ }
1026
+ }, interval);
1027
+ }
1013
1028
  };
1014
1029
  export {
1015
1030
  RestClient,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shoonya-sdk",
3
- "version": "1.1.3",
3
+ "version": "1.2.0",
4
4
  "description": "Wrapper around Shoonya API",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",