nsekit 0.3.0 → 0.3.1
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 +4 -4
- package/dist/brokers/dhan/DhanBroker.d.ts.map +1 -1
- package/dist/brokers/dhan/dhan-socket.d.ts +33 -3
- package/dist/brokers/dhan/dhan-socket.d.ts.map +1 -1
- package/dist/brokers/finvasia/FinvasiaBroker.d.ts.map +1 -1
- package/dist/brokers/finvasia/finvasia-constants.d.ts +1 -1
- package/dist/brokers/finvasia/finvasia-constants.d.ts.map +1 -1
- package/dist/brokers/finvasia/finvasia-socket.d.ts.map +1 -1
- package/dist/index.js +145 -73
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ await broker.sync();
|
|
|
63
63
|
// => { instrumentCount: 184302, source: 'network' }
|
|
64
64
|
|
|
65
65
|
// Resolve, search, or trade — all on the broker
|
|
66
|
-
const inst = broker.resolve('NIFTY-24000-CE-27FEB26'); //
|
|
66
|
+
const inst = broker.resolve('NIFTY-24000-CE-27FEB26'); // unified nsekit symbol lookup
|
|
67
67
|
const results = broker.search('NIFTY', 'NFO', 'CE', 10); // fuzzy search
|
|
68
68
|
```
|
|
69
69
|
|
|
@@ -130,9 +130,9 @@ await imaster.syncBroker('finvasia', finvasiaBroker.instruments);
|
|
|
130
130
|
// NIFTY-24000-CE-27FEB26 now has both zerodha and finvasia tokens
|
|
131
131
|
```
|
|
132
132
|
|
|
133
|
-
###
|
|
133
|
+
### Unified nsekit symbol format
|
|
134
134
|
|
|
135
|
-
All instruments are indexed using a
|
|
135
|
+
All instruments are indexed using a unified nsekit symbol format, regardless of which broker provided them:
|
|
136
136
|
|
|
137
137
|
```
|
|
138
138
|
EQ: TATAMOTORS (just underlying)
|
|
@@ -200,7 +200,7 @@ const order = unwrap(result);
|
|
|
200
200
|
|
|
201
201
|
### Instrument Master
|
|
202
202
|
|
|
203
|
-
See the [Instrument Master](#instrument-master) section above for full usage. In short: each broker implements `IBrokerInstruments` with `streamDump()` and `normalize()`. The `normalize()` function sets `underlying`, `instrumentType`, `strike`, and `expiry` — `InstrumentMaster` builds
|
|
203
|
+
See the [Instrument Master](#instrument-master) section above for full usage. In short: each broker implements `IBrokerInstruments` with `streamDump()` and `normalize()`. The `normalize()` function sets `underlying`, `instrumentType`, `strike`, and `expiry` — `InstrumentMaster` builds unified nsekit symbols automatically and merges entries across brokers.
|
|
204
204
|
|
|
205
205
|
### Paper Broker
|
|
206
206
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DhanBroker.d.ts","sourceRoot":"","sources":["../../../src/brokers/dhan/DhanBroker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,cAAc,EAEd,KAAK,EACL,cAAc,EACd,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAoB,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAU1G,qBAAa,UAAW,YAAW,OAAO;IACxC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAU;IAC/B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAO9B;IAEF,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;gBAEhC,OAAO,CAAC,EAAE,aAAa;IAQ7B,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAUpE,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAIxE,cAAc,IAAI,OAAO;IAIzB,gBAAgB,IAAI,IAAI,GAAG,IAAI;IAOzB,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAItD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAIjD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAM1G,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAkCpE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DhanBroker.d.ts","sourceRoot":"","sources":["../../../src/brokers/dhan/DhanBroker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,cAAc,EAEd,KAAK,EACL,cAAc,EACd,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAoB,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAU1G,qBAAa,UAAW,YAAW,OAAO;IACxC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAU;IAC/B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAO9B;IAEF,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;gBAEhC,OAAO,CAAC,EAAE,aAAa;IAQ7B,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAUpE,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAIxE,cAAc,IAAI,OAAO;IAIzB,gBAAgB,IAAI,IAAI,GAAG,IAAI;IAOzB,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAItD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAIjD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAM1G,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAkCpE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAkChF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAc3D,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAU5C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAsBhE,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;IAUlD,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IAiBhD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IA0C/D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAyChE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IAuCnF,UAAU,CACd,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAC7D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAgD5B,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,GAAG,YAAY;IAKhE,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAMzC,kBAAkB,IAAI,iBAAiB;IAMjC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAsBzC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAiBrC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAmC/D,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAMzD,OAAO;IAyBrB,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dhan WebSocket adapter.
|
|
3
|
-
* Connects to the Dhan Market Feed WebSocket for live tick data.
|
|
4
|
-
*
|
|
3
|
+
* Connects to the Dhan Market Feed v2 WebSocket for live tick data.
|
|
4
|
+
*
|
|
5
|
+
* Protocol:
|
|
6
|
+
* - Subscribe/unsubscribe requests are JSON.
|
|
7
|
+
* - Tick responses are binary (little-endian).
|
|
8
|
+
* - 8-byte response header: [code(1), msgLen(2), exchSeg(1), securityId(4)]
|
|
5
9
|
*/
|
|
6
10
|
import type { WSConnectionState } from '../../types/common';
|
|
7
11
|
import type { TickCallback, Subscription } from '../../types/broker';
|
|
@@ -24,7 +28,7 @@ export declare class DhanSocket {
|
|
|
24
28
|
disconnect(): void;
|
|
25
29
|
/**
|
|
26
30
|
* Subscribe to securityIds.
|
|
27
|
-
* Tokens should be in "EXCHANGE_SEGMENT
|
|
31
|
+
* Tokens should be in "EXCHANGE_SEGMENT|SECURITY_ID" format (e.g. "NSE_EQ|1333").
|
|
28
32
|
*/
|
|
29
33
|
subscribe(tokens: string[], callback: TickCallback, symbolMap?: Map<string, string>): Subscription;
|
|
30
34
|
/** Unsubscribe from a subscription. */
|
|
@@ -33,6 +37,32 @@ export declare class DhanSocket {
|
|
|
33
37
|
getConnectionState(): WSConnectionState;
|
|
34
38
|
/** Register symbol lookups. */
|
|
35
39
|
setSymbolMap(map: Map<string, string>): void;
|
|
40
|
+
/**
|
|
41
|
+
* Parse a Dhan Market Feed v2 binary response.
|
|
42
|
+
*
|
|
43
|
+
* Header (8 bytes):
|
|
44
|
+
* Byte 0: Feed response code
|
|
45
|
+
* Bytes 1-2: Message length (int16 LE)
|
|
46
|
+
* Byte 3: Exchange segment (numeric)
|
|
47
|
+
* Bytes 4-7: Security ID (int32 LE)
|
|
48
|
+
*
|
|
49
|
+
* Ticker (code 2) — 16 bytes total:
|
|
50
|
+
* Bytes 8-11: LTP (float32 LE)
|
|
51
|
+
* Bytes 12-15: Last Trade Time epoch (int32 LE)
|
|
52
|
+
*
|
|
53
|
+
* Quote (code 4) — 50 bytes total:
|
|
54
|
+
* Bytes 8-11: LTP (float32 LE)
|
|
55
|
+
* Bytes 12-13: Last Traded Qty (int16 LE)
|
|
56
|
+
* Bytes 14-17: Last Trade Time (int32 LE)
|
|
57
|
+
* Bytes 18-21: Avg Traded Price (float32 LE)
|
|
58
|
+
* Bytes 22-25: Volume (int32 LE)
|
|
59
|
+
* Bytes 26-29: Total Sell Qty (int32 LE)
|
|
60
|
+
* Bytes 30-33: Total Buy Qty (int32 LE)
|
|
61
|
+
* Bytes 34-37: Day Open (float32 LE)
|
|
62
|
+
* Bytes 38-41: Day Close (float32 LE)
|
|
63
|
+
* Bytes 42-45: Day High (float32 LE)
|
|
64
|
+
* Bytes 46-49: Day Low (float32 LE)
|
|
65
|
+
*/
|
|
36
66
|
private handleBinaryMessage;
|
|
37
67
|
private handleJsonMessage;
|
|
38
68
|
private sendSubscribe;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dhan-socket.d.ts","sourceRoot":"","sources":["../../../src/brokers/dhan/dhan-socket.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dhan-socket.d.ts","sourceRoot":"","sources":["../../../src/brokers/dhan/dhan-socket.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAe,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAgDlF,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA+C;gBAEzD,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAKjD,8CAA8C;IAC9C,OAAO,IAAI,IAAI;IAwDf,6BAA6B;IAC7B,UAAU,IAAI,IAAI;IAYlB;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY;IAuBlG,uCAAuC;IACvC,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAsBpC,gCAAgC;IAChC,kBAAkB,IAAI,iBAAiB;IAIvC,+BAA+B;IAC/B,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQ5C;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,OAAO,CAAC,mBAAmB;IAkE3B,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,mBAAmB;CAM5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FinvasiaBroker.d.ts","sourceRoot":"","sources":["../../../src/brokers/finvasia/FinvasiaBroker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,cAAc,EAEd,KAAK,EACL,cAAc,EACd,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAoB,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAU1G,qBAAa,cAAe,YAAW,OAAO;IAC5C,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAc;IACnC,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAO9B;IAEF,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;gBAEhC,OAAO,CAAC,EAAE,aAAa;IAQ7B,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IASpE,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAIxE,cAAc,IAAI,OAAO;IAIzB,gBAAgB,IAAI,IAAI,GAAG,IAAI;IAOzB,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAItD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAIjD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAM1G,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAuCpE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IA+
|
|
1
|
+
{"version":3,"file":"FinvasiaBroker.d.ts","sourceRoot":"","sources":["../../../src/brokers/finvasia/FinvasiaBroker.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ export declare const STATUS_FROM_SHOONYA: Record<string, OrderStatus>;
|
|
|
15
15
|
export declare const VALIDITY_TO_SHOONYA: Record<Validity, string>;
|
|
16
16
|
export declare const VALIDITY_FROM_SHOONYA: Record<string, Validity>;
|
|
17
17
|
export declare const SHOONYA_API_BASE = "https://api.shoonya.com/NorenWClientTP";
|
|
18
|
-
export declare const SHOONYA_WS_URL = "wss://api.shoonya.com/NorenWSTP";
|
|
18
|
+
export declare const SHOONYA_WS_URL = "wss://api.shoonya.com/NorenWSTP/";
|
|
19
19
|
export declare const SHOONYA_INSTRUMENTS_BASE = "https://api.shoonya.com/";
|
|
20
20
|
export declare const SHOONYA_INSTRUMENT_FILES: Record<string, string>;
|
|
21
21
|
export declare const CANDLE_INTERVAL_TO_SHOONYA: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finvasia-constants.d.ts","sourceRoot":"","sources":["../../../src/brokers/finvasia/finvasia-constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI9F,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAOxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAO1D,CAAC;AAIF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAItD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAIxD,CAAC;AAIF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAK3D,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAK7D,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE,MAAM,CAG1D,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAG5D,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAQ3D,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAGxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAG1D,CAAC;AAIF,eAAO,MAAM,gBAAgB,2CAA2C,CAAC;AACzE,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"finvasia-constants.d.ts","sourceRoot":"","sources":["../../../src/brokers/finvasia/finvasia-constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI9F,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAOxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAO1D,CAAC;AAIF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAItD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAIxD,CAAC;AAIF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAK3D,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAK7D,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE,MAAM,CAG1D,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAG5D,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAQ3D,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAGxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAG1D,CAAC;AAIF,eAAO,MAAM,gBAAgB,2CAA2C,CAAC;AACzE,eAAO,MAAM,cAAc,qCAAqC,CAAC;AACjE,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAInE,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAO3D,CAAC;AAIF,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM7D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finvasia-socket.d.ts","sourceRoot":"","sources":["../../../src/brokers/finvasia/finvasia-socket.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"finvasia-socket.d.ts","sourceRoot":"","sources":["../../../src/brokers/finvasia/finvasia-socket.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAe,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAelF,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAA8C;gBAExD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAK/C,iDAAiD;IACjD,OAAO,IAAI,IAAI;IAgDf,6BAA6B;IAC7B,UAAU,IAAI,IAAI;IAWlB;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY;IAuBlG,0DAA0D;IAC1D,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAuBpC,gCAAgC;IAChC,kBAAkB,IAAI,iBAAiB;IAIvC,oDAAoD;IACpD,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQ5C,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,mBAAmB;CAM5B"}
|
package/dist/index.js
CHANGED
|
@@ -21012,7 +21012,7 @@ var VALIDITY_FROM_SHOONYA = {
|
|
|
21012
21012
|
IOC: "IOC"
|
|
21013
21013
|
};
|
|
21014
21014
|
var SHOONYA_API_BASE = "https://api.shoonya.com/NorenWClientTP";
|
|
21015
|
-
var SHOONYA_WS_URL = "wss://api.shoonya.com/NorenWSTP";
|
|
21015
|
+
var SHOONYA_WS_URL = "wss://api.shoonya.com/NorenWSTP/";
|
|
21016
21016
|
var SHOONYA_INSTRUMENTS_BASE = "https://api.shoonya.com/";
|
|
21017
21017
|
var SHOONYA_INSTRUMENT_FILES = {
|
|
21018
21018
|
NSE: "NSE_symbols.txt.zip",
|
|
@@ -21312,6 +21312,7 @@ function fromQuote2(quote) {
|
|
|
21312
21312
|
}
|
|
21313
21313
|
|
|
21314
21314
|
// src/brokers/finvasia/finvasia-socket.ts
|
|
21315
|
+
import WS from "ws";
|
|
21315
21316
|
var subIdCounter3 = 0;
|
|
21316
21317
|
function nextSubId3() {
|
|
21317
21318
|
subIdCounter3 += 1;
|
|
@@ -21338,12 +21339,13 @@ class FinvasiaSocket {
|
|
|
21338
21339
|
return;
|
|
21339
21340
|
this.state = "CONNECTING";
|
|
21340
21341
|
try {
|
|
21341
|
-
this.ws = new
|
|
21342
|
+
this.ws = new WS(SHOONYA_WS_URL);
|
|
21342
21343
|
} catch {
|
|
21343
21344
|
this.state = "DISCONNECTED";
|
|
21344
21345
|
return;
|
|
21345
21346
|
}
|
|
21346
|
-
this.ws.
|
|
21347
|
+
this.ws.on("open", () => {
|
|
21348
|
+
console.log(`[FinvasiaSocket] WS open, sending auth for uid=${this.userId}`);
|
|
21347
21349
|
const authMsg = JSON.stringify({
|
|
21348
21350
|
t: "c",
|
|
21349
21351
|
uid: this.userId,
|
|
@@ -21352,18 +21354,23 @@ class FinvasiaSocket {
|
|
|
21352
21354
|
source: "API"
|
|
21353
21355
|
});
|
|
21354
21356
|
this.ws.send(authMsg);
|
|
21355
|
-
};
|
|
21356
|
-
this.ws.
|
|
21357
|
+
});
|
|
21358
|
+
this.ws.on("message", (raw) => {
|
|
21357
21359
|
try {
|
|
21358
|
-
const
|
|
21360
|
+
const text = raw.toString();
|
|
21361
|
+
console.log(`[FinvasiaSocket] WS msg: ${text.slice(0, 200)}`);
|
|
21362
|
+
const data = JSON.parse(text);
|
|
21359
21363
|
this.handleMessage(data);
|
|
21360
21364
|
} catch {}
|
|
21361
|
-
};
|
|
21362
|
-
this.ws.
|
|
21365
|
+
});
|
|
21366
|
+
this.ws.on("close", (code, reason) => {
|
|
21367
|
+
console.error(`[FinvasiaSocket] WS closed: code=${code}, reason=${reason.toString()}`);
|
|
21363
21368
|
this.state = "DISCONNECTED";
|
|
21364
21369
|
this.attemptReconnect();
|
|
21365
|
-
};
|
|
21366
|
-
this.ws.
|
|
21370
|
+
});
|
|
21371
|
+
this.ws.on("error", (err) => {
|
|
21372
|
+
console.error(`[FinvasiaSocket] WS error:`, err.message);
|
|
21373
|
+
});
|
|
21367
21374
|
}
|
|
21368
21375
|
disconnect() {
|
|
21369
21376
|
this.clearReconnectTimer();
|
|
@@ -21434,9 +21441,12 @@ class FinvasiaSocket {
|
|
|
21434
21441
|
}
|
|
21435
21442
|
if (type === "tf" || type === "tk" || type === "dk" || type === "df") {
|
|
21436
21443
|
const tick = data;
|
|
21437
|
-
const
|
|
21438
|
-
const
|
|
21444
|
+
const rawToken = tick.tk;
|
|
21445
|
+
const exch = data["e"] ?? "";
|
|
21446
|
+
const fullKey = exch ? `${exch}|${rawToken}` : rawToken;
|
|
21447
|
+
const symbol = this.tokenToSymbol.get(fullKey) ?? this.tokenToSymbol.get(rawToken);
|
|
21439
21448
|
const unified = fromTick2(tick, symbol);
|
|
21449
|
+
unified.token = fullKey;
|
|
21440
21450
|
this.dispatchTick(unified);
|
|
21441
21451
|
return;
|
|
21442
21452
|
}
|
|
@@ -21756,20 +21766,28 @@ class FinvasiaBroker {
|
|
|
21756
21766
|
async modifyOrder(orderId, params) {
|
|
21757
21767
|
try {
|
|
21758
21768
|
const uid = this.session?.userId ?? "";
|
|
21759
|
-
const
|
|
21769
|
+
const histRaw = await this.post("SingleOrdHist", {
|
|
21760
21770
|
uid,
|
|
21761
21771
|
norenordno: orderId
|
|
21772
|
+
});
|
|
21773
|
+
if (!Array.isArray(histRaw) || histRaw.length === 0) {
|
|
21774
|
+
return Err(new Error(`Cannot modify order ${orderId}: order not found`));
|
|
21775
|
+
}
|
|
21776
|
+
const latestOrder = histRaw[histRaw.length - 1];
|
|
21777
|
+
const payload = {
|
|
21778
|
+
uid,
|
|
21779
|
+
norenordno: orderId,
|
|
21780
|
+
exch: latestOrder.exch,
|
|
21781
|
+
tsym: latestOrder.tsym,
|
|
21782
|
+
prctyp: latestOrder.prctyp,
|
|
21783
|
+
prc: String(params.price ?? latestOrder.prc),
|
|
21784
|
+
qty: String(params.quantity ?? latestOrder.qty),
|
|
21785
|
+
ret: params.validity ?? latestOrder.ret
|
|
21762
21786
|
};
|
|
21763
|
-
if (params.price !== undefined)
|
|
21764
|
-
payload["prc"] = String(params.price);
|
|
21765
|
-
if (params.quantity !== undefined)
|
|
21766
|
-
payload["qty"] = String(params.quantity);
|
|
21767
21787
|
if (params.triggerPrice !== undefined)
|
|
21768
21788
|
payload["trgprc"] = String(params.triggerPrice);
|
|
21769
21789
|
if (params.type !== undefined)
|
|
21770
21790
|
payload["prctyp"] = params.type;
|
|
21771
|
-
if (params.validity !== undefined)
|
|
21772
|
-
payload["ret"] = params.validity;
|
|
21773
21791
|
const res = await this.post("ModifyOrder", payload);
|
|
21774
21792
|
if (res.stat !== "Ok") {
|
|
21775
21793
|
return Err(new Error(`Order modification failed: ${res.emsg ?? "Unknown error"}`));
|
|
@@ -21839,7 +21857,7 @@ class FinvasiaBroker {
|
|
|
21839
21857
|
async getPositions() {
|
|
21840
21858
|
try {
|
|
21841
21859
|
const uid = this.session?.userId ?? "";
|
|
21842
|
-
const raw = await this.post("PositionBook", { uid });
|
|
21860
|
+
const raw = await this.post("PositionBook", { uid, actid: uid });
|
|
21843
21861
|
if (!Array.isArray(raw))
|
|
21844
21862
|
return Ok([]);
|
|
21845
21863
|
return Ok(raw.map(fromPosition2));
|
|
@@ -22113,7 +22131,7 @@ var EXCHANGE_FROM_DHAN = {
|
|
|
22113
22131
|
NSE_CURRENCY: "CDS"
|
|
22114
22132
|
};
|
|
22115
22133
|
var PRODUCT_TO_DHAN = {
|
|
22116
|
-
INTRADAY: "
|
|
22134
|
+
INTRADAY: "INTRADAY",
|
|
22117
22135
|
DELIVERY: "CNC",
|
|
22118
22136
|
NORMAL: "MARGIN"
|
|
22119
22137
|
};
|
|
@@ -22391,11 +22409,28 @@ function fromQuote3(quote, symbol, exchange) {
|
|
|
22391
22409
|
}
|
|
22392
22410
|
|
|
22393
22411
|
// src/brokers/dhan/dhan-socket.ts
|
|
22412
|
+
import WS2 from "ws";
|
|
22394
22413
|
var subIdCounter4 = 0;
|
|
22395
22414
|
function nextSubId4() {
|
|
22396
22415
|
subIdCounter4 += 1;
|
|
22397
22416
|
return `dsub_${subIdCounter4}`;
|
|
22398
22417
|
}
|
|
22418
|
+
var EXCH_SEG_FROM_BYTE = {
|
|
22419
|
+
0: "IDX",
|
|
22420
|
+
1: "NSE_EQ",
|
|
22421
|
+
2: "NSE_FNO",
|
|
22422
|
+
3: "NSE_CURRENCY",
|
|
22423
|
+
4: "BSE_EQ",
|
|
22424
|
+
5: "BSE_FNO",
|
|
22425
|
+
6: "MCX_COMM"
|
|
22426
|
+
};
|
|
22427
|
+
function splitToken(token) {
|
|
22428
|
+
const sep = token.includes("|") ? "|" : ":";
|
|
22429
|
+
const idx = token.indexOf(sep);
|
|
22430
|
+
if (idx === -1)
|
|
22431
|
+
return ["NSE_EQ", token];
|
|
22432
|
+
return [token.slice(0, idx), token.slice(idx + 1)];
|
|
22433
|
+
}
|
|
22399
22434
|
|
|
22400
22435
|
class DhanSocket {
|
|
22401
22436
|
ws = null;
|
|
@@ -22419,36 +22454,36 @@ class DhanSocket {
|
|
|
22419
22454
|
this.state = "CONNECTING";
|
|
22420
22455
|
try {
|
|
22421
22456
|
const url = `${DHAN_WS_URL}?version=2&token=${this.accessToken}&clientId=${this.clientId}&authType=2`;
|
|
22422
|
-
this.ws = new
|
|
22423
|
-
this.ws.binaryType = "arraybuffer";
|
|
22457
|
+
this.ws = new WS2(url);
|
|
22424
22458
|
} catch {
|
|
22425
22459
|
this.state = "DISCONNECTED";
|
|
22426
22460
|
return;
|
|
22427
22461
|
}
|
|
22428
|
-
this.ws.
|
|
22462
|
+
this.ws.on("open", () => {
|
|
22429
22463
|
this.state = "CONNECTED";
|
|
22430
22464
|
this.reconnectAttempts = 0;
|
|
22431
22465
|
this.startHeartbeat();
|
|
22432
22466
|
if (this.subscribedTokens.size > 0) {
|
|
22433
22467
|
this.sendSubscribe(Array.from(this.subscribedTokens));
|
|
22434
22468
|
}
|
|
22435
|
-
};
|
|
22436
|
-
this.ws.
|
|
22469
|
+
});
|
|
22470
|
+
this.ws.on("message", (raw, isBinary) => {
|
|
22437
22471
|
try {
|
|
22438
|
-
if (
|
|
22439
|
-
|
|
22472
|
+
if (isBinary) {
|
|
22473
|
+
const buf = raw instanceof ArrayBuffer ? Buffer.from(raw) : Buffer.isBuffer(raw) ? raw : Array.isArray(raw) ? Buffer.concat(raw) : Buffer.from(raw);
|
|
22474
|
+
this.handleBinaryMessage(buf);
|
|
22440
22475
|
} else {
|
|
22441
|
-
const data = JSON.parse(
|
|
22476
|
+
const data = JSON.parse(raw.toString());
|
|
22442
22477
|
this.handleJsonMessage(data);
|
|
22443
22478
|
}
|
|
22444
22479
|
} catch {}
|
|
22445
|
-
};
|
|
22446
|
-
this.ws.
|
|
22480
|
+
});
|
|
22481
|
+
this.ws.on("close", () => {
|
|
22447
22482
|
this.state = "DISCONNECTED";
|
|
22448
22483
|
this.stopHeartbeat();
|
|
22449
22484
|
this.attemptReconnect();
|
|
22450
|
-
};
|
|
22451
|
-
this.ws.
|
|
22485
|
+
});
|
|
22486
|
+
this.ws.on("error", () => {});
|
|
22452
22487
|
}
|
|
22453
22488
|
disconnect() {
|
|
22454
22489
|
this.clearReconnectTimer();
|
|
@@ -22506,39 +22541,74 @@ class DhanSocket {
|
|
|
22506
22541
|
this.tokenToSymbol.set(token, symbol);
|
|
22507
22542
|
}
|
|
22508
22543
|
}
|
|
22509
|
-
handleBinaryMessage(
|
|
22510
|
-
|
|
22511
|
-
if (buffer.byteLength < 48)
|
|
22544
|
+
handleBinaryMessage(data) {
|
|
22545
|
+
if (data.length < 8)
|
|
22512
22546
|
return;
|
|
22513
|
-
|
|
22547
|
+
const responseCode = data.readUInt8(0);
|
|
22548
|
+
const exchSegByte = data.readUInt8(3);
|
|
22549
|
+
const securityId = data.readInt32LE(4);
|
|
22550
|
+
const exchangeSegment = EXCH_SEG_FROM_BYTE[exchSegByte] ?? "NSE_EQ";
|
|
22551
|
+
const fullKey = `${exchangeSegment}|${securityId}`;
|
|
22552
|
+
if (responseCode === 2 && data.length >= 16) {
|
|
22553
|
+
const ltp = data.readFloatLE(8);
|
|
22554
|
+
const ltt = data.readInt32LE(12);
|
|
22514
22555
|
const tick = {
|
|
22515
|
-
securityId
|
|
22516
|
-
LTP:
|
|
22517
|
-
open:
|
|
22518
|
-
high:
|
|
22519
|
-
low:
|
|
22520
|
-
close:
|
|
22521
|
-
volume:
|
|
22522
|
-
|
|
22523
|
-
|
|
22524
|
-
|
|
22525
|
-
|
|
22526
|
-
|
|
22527
|
-
|
|
22528
|
-
timestamp: Date.now()
|
|
22556
|
+
securityId,
|
|
22557
|
+
LTP: ltp,
|
|
22558
|
+
open: 0,
|
|
22559
|
+
high: 0,
|
|
22560
|
+
low: 0,
|
|
22561
|
+
close: 0,
|
|
22562
|
+
volume: 0,
|
|
22563
|
+
bestBidPrice: 0,
|
|
22564
|
+
bestAskPrice: 0,
|
|
22565
|
+
bestBidQty: 0,
|
|
22566
|
+
bestAskQty: 0,
|
|
22567
|
+
exchangeSegment,
|
|
22568
|
+
timestamp: ltt > 0 ? ltt * 1000 : Date.now()
|
|
22529
22569
|
};
|
|
22530
|
-
const
|
|
22531
|
-
const symbol = this.tokenToSymbol.get(tokenStr);
|
|
22570
|
+
const symbol = this.tokenToSymbol.get(fullKey) ?? this.tokenToSymbol.get(String(securityId));
|
|
22532
22571
|
const unified = fromTick3(tick, symbol);
|
|
22572
|
+
unified.token = fullKey;
|
|
22533
22573
|
this.dispatchTick(unified);
|
|
22534
|
-
}
|
|
22574
|
+
} else if (responseCode === 4 && data.length >= 50) {
|
|
22575
|
+
const ltp = data.readFloatLE(8);
|
|
22576
|
+
const ltt = data.readInt32LE(14);
|
|
22577
|
+
const volume = data.readInt32LE(22);
|
|
22578
|
+
const totalSellQty = data.readInt32LE(26);
|
|
22579
|
+
const totalBuyQty = data.readInt32LE(30);
|
|
22580
|
+
const open = data.readFloatLE(34);
|
|
22581
|
+
const close = data.readFloatLE(38);
|
|
22582
|
+
const high = data.readFloatLE(42);
|
|
22583
|
+
const low = data.readFloatLE(46);
|
|
22584
|
+
const tick = {
|
|
22585
|
+
securityId,
|
|
22586
|
+
LTP: ltp,
|
|
22587
|
+
open,
|
|
22588
|
+
high,
|
|
22589
|
+
low,
|
|
22590
|
+
close,
|
|
22591
|
+
volume,
|
|
22592
|
+
bestBidPrice: 0,
|
|
22593
|
+
bestAskPrice: 0,
|
|
22594
|
+
bestBidQty: totalBuyQty,
|
|
22595
|
+
bestAskQty: totalSellQty,
|
|
22596
|
+
exchangeSegment,
|
|
22597
|
+
timestamp: ltt > 0 ? ltt * 1000 : Date.now()
|
|
22598
|
+
};
|
|
22599
|
+
const symbol = this.tokenToSymbol.get(fullKey) ?? this.tokenToSymbol.get(String(securityId));
|
|
22600
|
+
const unified = fromTick3(tick, symbol);
|
|
22601
|
+
unified.token = fullKey;
|
|
22602
|
+
this.dispatchTick(unified);
|
|
22603
|
+
}
|
|
22535
22604
|
}
|
|
22536
22605
|
handleJsonMessage(data) {
|
|
22537
22606
|
if (data["type"] === "ticker_data") {
|
|
22538
22607
|
const tick = data;
|
|
22539
|
-
const
|
|
22540
|
-
const symbol = this.tokenToSymbol.get(
|
|
22608
|
+
const fullKey = tick.exchangeSegment ? `${tick.exchangeSegment}|${tick.securityId}` : String(tick.securityId);
|
|
22609
|
+
const symbol = this.tokenToSymbol.get(fullKey) ?? this.tokenToSymbol.get(String(tick.securityId));
|
|
22541
22610
|
const unified = fromTick3(tick, symbol);
|
|
22611
|
+
unified.token = fullKey;
|
|
22542
22612
|
this.dispatchTick(unified);
|
|
22543
22613
|
}
|
|
22544
22614
|
}
|
|
@@ -22546,10 +22616,10 @@ class DhanSocket {
|
|
|
22546
22616
|
if (!this.ws || this.state !== "CONNECTED")
|
|
22547
22617
|
return;
|
|
22548
22618
|
const instruments = tokens.map((t) => {
|
|
22549
|
-
const
|
|
22619
|
+
const [segment, id] = splitToken(t);
|
|
22550
22620
|
return {
|
|
22551
|
-
ExchangeSegment:
|
|
22552
|
-
SecurityId:
|
|
22621
|
+
ExchangeSegment: segment,
|
|
22622
|
+
SecurityId: id
|
|
22553
22623
|
};
|
|
22554
22624
|
});
|
|
22555
22625
|
const request = {
|
|
@@ -22563,10 +22633,10 @@ class DhanSocket {
|
|
|
22563
22633
|
if (!this.ws || this.state !== "CONNECTED")
|
|
22564
22634
|
return;
|
|
22565
22635
|
const instruments = tokens.map((t) => {
|
|
22566
|
-
const
|
|
22636
|
+
const [segment, id] = splitToken(t);
|
|
22567
22637
|
return {
|
|
22568
|
-
ExchangeSegment:
|
|
22569
|
-
SecurityId:
|
|
22638
|
+
ExchangeSegment: segment,
|
|
22639
|
+
SecurityId: id
|
|
22570
22640
|
};
|
|
22571
22641
|
});
|
|
22572
22642
|
const request = {
|
|
@@ -22590,7 +22660,7 @@ class DhanSocket {
|
|
|
22590
22660
|
this.heartbeatTimer = setInterval(() => {
|
|
22591
22661
|
if (this.ws && this.state === "CONNECTED") {
|
|
22592
22662
|
try {
|
|
22593
|
-
this.ws.
|
|
22663
|
+
this.ws.ping();
|
|
22594
22664
|
} catch {}
|
|
22595
22665
|
}
|
|
22596
22666
|
}, 30000);
|
|
@@ -22902,20 +22972,18 @@ class DhanBroker {
|
|
|
22902
22972
|
}
|
|
22903
22973
|
async modifyOrder(orderId, params) {
|
|
22904
22974
|
try {
|
|
22975
|
+
const rawOrder = await this.request("GET", `/orders/${orderId}`);
|
|
22976
|
+
const original = Array.isArray(rawOrder) ? rawOrder[0] : rawOrder;
|
|
22905
22977
|
const payload = {
|
|
22906
22978
|
dhanClientId: this.clientId,
|
|
22907
|
-
orderId
|
|
22979
|
+
orderId,
|
|
22980
|
+
orderType: params.type ? ORDER_TYPE_TO_DHAN[params.type] ?? original.orderType : original.orderType,
|
|
22981
|
+
validity: params.validity ?? original.validity ?? "DAY",
|
|
22982
|
+
quantity: params.quantity ?? original.quantity,
|
|
22983
|
+
price: params.price ?? original.price
|
|
22908
22984
|
};
|
|
22909
|
-
if (params.price !== undefined)
|
|
22910
|
-
payload["price"] = params.price;
|
|
22911
|
-
if (params.quantity !== undefined)
|
|
22912
|
-
payload["quantity"] = params.quantity;
|
|
22913
22985
|
if (params.triggerPrice !== undefined)
|
|
22914
22986
|
payload["triggerPrice"] = params.triggerPrice;
|
|
22915
|
-
if (params.type !== undefined)
|
|
22916
|
-
payload["orderType"] = params.type;
|
|
22917
|
-
if (params.validity !== undefined)
|
|
22918
|
-
payload["validity"] = params.validity;
|
|
22919
22987
|
const res = await this.request("PUT", `/orders/${orderId}`, payload);
|
|
22920
22988
|
return Ok({
|
|
22921
22989
|
orderId: res.orderId ?? orderId,
|
|
@@ -22982,7 +23050,11 @@ class DhanBroker {
|
|
|
22982
23050
|
return Ok([]);
|
|
22983
23051
|
return Ok(raw.map((h) => fromHolding3(h)));
|
|
22984
23052
|
} catch (err) {
|
|
22985
|
-
|
|
23053
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
23054
|
+
if (msg.includes("No holdings available") || msg.includes("DH-1111")) {
|
|
23055
|
+
return Ok([]);
|
|
23056
|
+
}
|
|
23057
|
+
return Err(err instanceof Error ? err : new Error(msg));
|
|
22986
23058
|
}
|
|
22987
23059
|
}
|
|
22988
23060
|
async getLTP(symbols) {
|