fyers-api-v3 1.3.4 → 1.4.2

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.
@@ -1,995 +1,1026 @@
1
- "use strict";
2
- let { Config } = require("../config/config");
3
- let errorHandler = require("../errorHandler/errorHandler");
4
- let axios = require("axios")
5
- const crypto = require('crypto');
6
- let Logger = require("../logger/log.js")
7
-
8
- /**
9
- * Class to access Fyers API.
10
- * @class
11
- */
12
- class FyersApi {
13
- /**
14
- * Create a new DataSocket object to acess symboldata websocket.
15
- * @constructor
16
- * @param {Object} params - The parameters for initializing the DataSocket.
17
- * @param {string} params.AccessToken - The access token for authentication.
18
- * @param {string} params.AppID - AppID of user.
19
- * @param {string} params.RedirectURL - Redirect URL provided while creating the APP.
20
- * @param {boolean} params.enableLogging - Flag to enable or disable logging.
21
- * @param {string} [params.Version="2.0"] - the version of API you want your output format in.
22
- */
23
- constructor(params) {
24
- var self = this;
25
-
26
- /**
27
- * AccessToken of user.
28
- * @type {String}
29
- */
30
- self.AccessToken = params?.AccessToken ?? null;;
31
-
32
- /**
33
- * RedirectURL of provided by user.
34
- * @type {String}
35
- */
36
- self.RedirectURL = params?.RedirectURL ?? null;
37
-
38
- /**
39
- * APPID provided by user.
40
- * @type {String}
41
- */
42
- self.AppID = params?.AppID ?? null;
43
- /**
44
- * API version provided by client.
45
- * @type {String}
46
- */
47
- self.Version = params?.Version ?? "2.0";
48
-
49
- /**
50
- * filepath where are logs are to be saved.
51
- * @type {string}
52
- */
53
- self.LogPath = params?.path ?? undefined;
54
-
55
- /**
56
- * Flag to enable or disable logging.
57
- * @type {boolean}
58
- */
59
- self.LoggingFlag = params?.enableLogging ?? true;
60
-
61
- /**
62
- * object used to write logs.
63
- * @type {Logger}
64
- */
65
- self.Logger = new Logger(this.LogPath,this.LoggingFlag)
66
- }
67
-
68
- /**
69
- * sets the APPID.
70
- * @param {string} req - APPID in format xxxxxx-xxx.
71
- */
72
- setAppId = function (req) {
73
- this.AppID = req
74
- }
75
-
76
- /**
77
- * sets the RedirectURL.
78
- * @param {string} req - pass redirect URL set during creation of APP.
79
- */
80
- setRedirectUrl = function (req) {
81
- this.RedirectURL = req
82
- }
83
-
84
- /**
85
- * sets the AccessToken.
86
- * @param {string} req - pass Access token.
87
- */
88
- setAccessToken = function (req) {
89
- if (this.AppID == null) {
90
- console.log("Please set APPID using setAppId function")
91
- }
92
- else {
93
- this.AccessToken = this.AppID + ":" + req
94
- }
95
- }
96
-
97
- /**
98
- * get generate-authcode URL to login and generate authcode.
99
- * @param {Object} req - defines for what the callback function is.
100
- * @param {string} req.client_id - AppID of user.
101
- * @param {string} req.redirect_uri - RedirectURL provided by user.
102
- * @param {string} [req.state] - state value.
103
- * @returns {string} generate authcode url
104
- */
105
- generateAuthCode = function (req) {
106
- var funcname = 'generateAuthCode'
107
- var logger = this.Logger
108
- const client_id = (req && req.client_id) || this.AppID;
109
- const redirect_uri = (req && req.redirect_uri) || this.RedirectURL;
110
- const state = (req && req.state) || "sample_state";
111
- logger.debug('generate authcode response', `${Config.API}generate-authcode?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=code&state=${state}`, funcname);
112
- return `${Config.SYNC_API}/generate-authcode?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=code&state=${state}`
113
- }
114
-
115
- /**
116
- * generate access token to use the API's.
117
- * @param {Object} req - defines for what the callback function is.
118
- * @param {string} req.client_id - AppID of user.
119
- * @param {string} req.secret_key - App Secret of user.
120
- * @param {string} req.auth_code - authcode generated after use of generateAuthCode and login.
121
- * @param {string} [req.code_verifier] - code verifier.
122
- * @returns {Object} Object with access token and refresh token if successful
123
- */
124
- generate_access_token = async (req) => {
125
- var funcname = 'generateAuthCode'
126
- var logger = this.Logger
127
- const code_verifier = req.code_verifier || "";
128
- const auth_code = req.auth_code || "";
129
- const client_id = req.client_id || this.AppID;
130
- const secret_key = req.secret_key || "";
131
- const sha256 = getSHA256Hash(`${client_id}:${secret_key}`)
132
- logger.debug("generate_access_token inputs", { "code_verifier": code_verifier, "auth_code": auth_code, "client_id": client_id, "secret_key": secret_key, "sha256": sha256 }, funcname)
133
- try {
134
-
135
- if (code_verifier === "") {
136
-
137
- const access_token = await axios.post(`${Config.SYNC_API}/validate-authcode`, {
138
- grant_type: "authorization_code",
139
- code: req.auth_code,
140
- appIdHash: sha256
141
-
142
- })
143
- return access_token.data;
144
- }
145
- else {
146
-
147
- const access_token = await axios.post(`${Config.API}/validate-authcode`, {
148
- grant_type: "authorization_code",
149
- code_verifier: req.code_verifier,
150
- code: req.auth_code,
151
-
152
-
153
- })
154
- return access_token.data;
155
- }
156
-
157
- }
158
- catch (e) {
159
- var err = new errorHandler(e).getError()
160
- logger.error("error generating access token", err, funcname)
161
- return err
162
- }
163
- }
164
-
165
- /**
166
- * get profile data.
167
- * @returns {Promise} returns profile data on resolve or error message and error code on failure
168
- */
169
- get_profile = async (req) => {
170
- var funcname = 'get_profile'
171
- var logger = this.Logger
172
- let AuthrizationToken = this.AccessToken
173
- let vers = this.Version
174
- return new Promise(async function (resolve, reject) {
175
- try {
176
- var url = Config.SYNC_API + Config["get_profile"]
177
- await axios.get((url), {
178
- headers: {
179
- Authorization: AuthrizationToken,
180
- version: vers
181
- }
182
- })
183
- .then(Response => {
184
- logger.debug(`${funcname} response`, Response.data, funcname)
185
- resolve(Response.data)
186
- })
187
- }
188
- catch (e) {
189
- var err = new errorHandler(e).getError()
190
- logger.error(`${funcname} response`, err, funcname)
191
- reject(err)
192
- }
193
- })
194
- }
195
-
196
- /**
197
- * get funds detail.
198
- * @returns {Promise} returns funds detail on resolve or error message and error code on failure
199
- */
200
- get_funds = async (req) => {
201
- var funcname = 'get_funds'
202
- var logger = this.Logger
203
- let AuthrizationToken = this.AccessToken
204
- let vers = this.Version
205
- return new Promise(async function (resolve, reject) {
206
- try {
207
- var url = Config.SYNC_API + Config["funds"]
208
- await axios.get((url), {
209
- headers: {
210
- Authorization: AuthrizationToken,
211
- version: vers
212
- }
213
- })
214
- .then(Response => {
215
- logger.debug(`${funcname} response`, Response.data, funcname)
216
- resolve(Response.data)
217
- })
218
- }
219
- catch (e) {
220
- var err = new errorHandler(e).getError()
221
- logger.error(`${funcname} response`, err, funcname)
222
- reject(err)
223
- }
224
- })
225
- }
226
-
227
- /**
228
- * get holdings detail.
229
- * @returns {Promise} returns holdings detail on resolve or error message and error code on failure
230
- */
231
- get_holdings = async (req) => {
232
- var funcname = 'get_holdings'
233
- var logger = this.Logger
234
- let AuthrizationToken = this.AccessToken
235
- let vers = this.Version
236
- return new Promise(async function (resolve, reject) {
237
- try {
238
- var url = Config.SYNC_API + Config["holdings"]
239
- await axios.get((url), {
240
- headers: {
241
- Authorization: AuthrizationToken,
242
- version: vers
243
- }
244
- })
245
- .then(Response => {
246
- logger.debug(`${funcname} response`, Response.data, funcname)
247
- resolve(Response.data)
248
- })
249
- }
250
- catch (e) {
251
- var err = new errorHandler(e).getError()
252
- logger.error(`${funcname} response`, err, funcname)
253
- reject(err)
254
- }
255
- })
256
- }
257
-
258
-
259
- /**
260
- * get orderbook to get order details of order placed on current day.
261
- * @returns {Promise} returns orderbook detail on resolve or error message and error code on failure
262
- */
263
- get_orders = async (req) => {
264
- var funcname = 'get_orders'
265
- var logger = this.Logger
266
- let AuthrizationToken = this.AccessToken
267
- let vers = this.Version
268
- return new Promise(async function (resolve, reject) {
269
- try {
270
- var url = Config.SYNC_API + Config["orders"]
271
- await axios.get((url), {
272
- headers: {
273
- Authorization: AuthrizationToken,
274
- version: vers
275
- }
276
- })
277
- .then(Response => {
278
- logger.debug(`${funcname} response`, Response.data, funcname)
279
- resolve(Response.data)
280
- })
281
- }
282
- catch (e) {
283
- var err = new errorHandler(e).getError()
284
- logger.error(`${funcname} response`, err, funcname)
285
- reject(err)
286
- }
287
- })
288
- }
289
-
290
- /**
291
- * get orderbook to get order details of gtt order placed on current day.
292
- * @returns {Promise} returns orderbook detail on resolve or error message and error code on failure
293
- */
294
- get_gtt_orders = async (req) => {
295
- var funcname = 'get_gtt_orders'
296
- var logger = this.Logger
297
- let AuthrizationToken = this.AccessToken
298
- let vers = this.Version
299
- return new Promise(async function (resolve, reject) {
300
- try {
301
- var url = Config.SYNC_API + Config["gtt_orders"]
302
- await axios.get((url), {
303
- headers: {
304
- Authorization: AuthrizationToken,
305
- version: vers
306
- }
307
- })
308
- .then(Response => {
309
- logger.debug(`${funcname} response`, Response.data, funcname)
310
- resolve(Response.data)
311
- })
312
- }
313
- catch (e) {
314
- var err = new errorHandler(e).getError()
315
- logger.error(`${funcname} response`, err, funcname)
316
- reject(err)
317
- }
318
- })
319
- }
320
-
321
- /**
322
- * get orderbook for a specific order ID.
323
- * @param {Object} req - defines for what the callback function is.
324
- * @param {string} req.order_id - orderID for which orderbook is required for.
325
- * @returns {Promise} returns orderbook detail of passed order ID on resolve or error message and error code on failure
326
- */
327
- get_filtered_orders = async (req) => {
328
- var funcname = 'get_filtered_orders'
329
- var logger = this.Logger
330
- let AuthrizationToken = this.AccessToken
331
- let vers = this.Version
332
- return new Promise(async function (resolve, reject) {
333
- try {
334
- var url = Config.SYNC_API + Config["orders"] + `?id=${req.order_id}`
335
- await axios.get((url), {
336
- headers: {
337
- Authorization: AuthrizationToken,
338
- version: vers
339
- }
340
- })
341
- .then(Response => {
342
- logger.debug(`${funcname} response`, Response.data, funcname)
343
- resolve(Response.data)
344
- })
345
- }
346
- catch (e) {
347
- var err = new errorHandler(e).getError()
348
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
349
- reject(err)
350
- }
351
- })
352
- }
353
-
354
- /**
355
- * get positionbook to get position details.
356
- * @returns {Promise} returns positionbook detail on resolve or error message and error code on failure
357
- */
358
- get_positions = async (req) => {
359
- var funcname = 'get_positions'
360
- var logger = this.Logger
361
- let AuthrizationToken = this.AccessToken
362
- let vers = this.Version
363
- return new Promise(async function (resolve, reject) {
364
- try {
365
- var url = Config.SYNC_API + Config["positions"]
366
- await axios.get((url), {
367
- headers: {
368
- Authorization: AuthrizationToken,
369
- version: vers
370
- }
371
- })
372
- .then(Response => {
373
- logger.debug(`${funcname} response`, Response.data, funcname)
374
- resolve(Response.data)
375
- })
376
- }
377
- catch (e) {
378
- var err = new errorHandler(e).getError()
379
- logger.error(`${funcname} response`, err, funcname)
380
- reject(err)
381
- }
382
- })
383
- }
384
-
385
- /**
386
- * get tradebook to get trade details.
387
- * @returns {Promise} returns tradebook detail on resolve or error message and error code on failure
388
- */
389
- get_tradebook = async (req) => {
390
- var funcname = 'get_tradebook'
391
- var logger = this.Logger
392
- let AuthrizationToken = this.AccessToken
393
- let vers = this.Version
394
- return new Promise(async function (resolve, reject) {
395
- try {
396
- var url = Config.SYNC_API + Config["tradebook"]
397
- await axios.get((url), {
398
- headers: {
399
- Authorization: AuthrizationToken,
400
- version: vers
401
- }
402
- })
403
- .then(Response => {
404
- logger.debug(`${funcname} response`, Response.data, funcname)
405
- resolve(Response.data)
406
- })
407
- }
408
- catch (e) {
409
- var err = new errorHandler(e).getError()
410
- logger.error(`${funcname} response`, err, funcname)
411
- reject(err)
412
- }
413
- })
414
- }
415
-
416
- /**
417
- * use to place order.
418
- * @param {Object} req - request data.
419
- * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
420
- */
421
- place_order = async (req) => {
422
- var funcname = 'place_order'
423
- var logger = this.Logger
424
- let AuthrizationToken = this.AccessToken
425
- let vers = this.Version
426
- return new Promise(async function (resolve, reject) {
427
- try {
428
- var url = Config.SYNC_API + Config["orders_sync"]
429
- await axios.post((url), req, {
430
- headers: {
431
- Authorization: AuthrizationToken,
432
- version: vers
433
- }
434
- })
435
- .then(Response => {
436
- logger.debug(`${funcname} response`, Response.data, funcname)
437
- resolve(Response.data)
438
- })
439
-
440
- }
441
- catch (e) {
442
- var err = new errorHandler(e).getError()
443
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
444
- reject(err)
445
- }
446
- })
447
- }
448
-
449
- /**
450
- * use to place gtt order.
451
- * @param {Object} req - request data.
452
- * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
453
- */
454
- place_gtt_order = async (req) => {
455
- var funcname = 'place_gtt_order'
456
- var logger = this.Logger
457
- let AuthrizationToken = this.AccessToken
458
- let vers = this.Version
459
- return new Promise(async function (resolve, reject) {
460
- try {
461
- var url = Config.SYNC_API + Config["gtt_orders_sync"]
462
- await axios.post((url), req, {
463
- headers: {
464
- Authorization: AuthrizationToken,
465
- }
466
- }).then(Response => {
467
- logger.debug(`${funcname} response`, Response.data, funcname)
468
- resolve(Response.data)
469
- })
470
- }
471
- catch (e) {
472
- var err = new errorHandler(e).getError()
473
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
474
- reject(err)
475
- }
476
- })
477
- }
478
-
479
- /**
480
- * used to place multileg order.
481
- * @param {Object} req - request data.
482
- * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
483
- */
484
- place_multileg_order = async (req) => {
485
- var funcname = 'place_multileg_order'
486
- var logger = this.Logger
487
- let AuthrizationToken = this.AccessToken
488
- let vers = this.Version
489
- return new Promise(async function (resolve, reject) {
490
- try {
491
- var url = Config.SYNC_API + Config["multileg_orders_sync"]
492
- await axios.post((url), req, {
493
- headers: {
494
- Authorization: AuthrizationToken,
495
- version: vers
496
- }
497
- })
498
- .then(Response => {
499
- logger.debug(`${funcname} response`, Response.data, funcname)
500
- resolve(Response.data)
501
- })
502
-
503
- }
504
- catch (e) {
505
- var err = new errorHandler(e).getError()
506
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
507
- reject(err)
508
- }
509
- })
510
- }
511
-
512
- /**
513
- * use to place multiple order.
514
- * @param {Object[]} req - request data.
515
- * @returns {Promise} returns orderID of all placed and if they are failed or successful on resolve or error message and error code on failure
516
- */
517
- place_multi_order = async (req) => {
518
- var funcname = 'place_multi_order'
519
- var logger = this.Logger
520
- let AuthrizationToken = this.AccessToken
521
- let vers = this.Version
522
- return new Promise(async function (resolve, reject) {
523
- try {
524
- var url = Config.SYNC_API + Config["multi_orders"]
525
- await axios.post((url), req, {
526
- headers: {
527
- Authorization: AuthrizationToken,
528
- version: vers
529
- }
530
- })
531
- .then(Response => {
532
- logger.debug(`${funcname} response`, Response.data, funcname)
533
- resolve(Response.data)
534
- })
535
- }
536
- catch (e) {
537
- var err = new errorHandler(e).getError()
538
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
539
- reject(err)
540
- }
541
- })
542
- }
543
-
544
- /**
545
- * use to modify placed orders which are not traded yet.
546
- * @param {Object} req - request data.
547
- * @returns {Promise} returns orderID of passed order ID and if modification was successful or not resolve or error message and error code on failure
548
- */
549
- modify_order = async (req) => {
550
- var funcname = 'modify_order'
551
- var logger = this.Logger
552
- let AuthrizationToken = this.AccessToken
553
- let vers = this.Version
554
- return new Promise(async function (resolve, reject) {
555
- try {
556
- var url = Config.SYNC_API + Config["orders_sync"]
557
- await axios.patch((url), req, {
558
- headers: {
559
- Authorization: AuthrizationToken,
560
- version: vers
561
- }
562
- })
563
- .then(Response => {
564
- logger.debug(`${funcname} response`, Response.data, funcname)
565
- resolve(Response.data)
566
- })
567
- }
568
- catch (e) {
569
- var err = new errorHandler(e).getError()
570
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
571
- reject(err)
572
- }
573
- })
574
- }
575
-
576
- /**
577
- * use to modify placed gtt orders which are not traded yet.
578
- * @param {Object} req - request data.
579
- * @returns {Promise} returns orderID of passed order ID and if modification was successful or not resolve or error message and error code on failure
580
- */
581
- gtt_modify_order = async (req) => {
582
- var funcname = 'gtt_modify_order'
583
- var logger = this.Logger
584
- let AuthrizationToken = this.AccessToken
585
- let vers = this.Version
586
- return new Promise(async function (resolve, reject) {
587
- try {
588
- var url = Config.SYNC_API + Config["gtt_orders_sync"]
589
- await axios.patch((url), req, {
590
- headers: {
591
- Authorization: AuthrizationToken,
592
- version: vers
593
- }
594
- })
595
- .then(Response => {
596
- logger.debug(`${funcname} response`, Response.data, funcname)
597
- resolve(Response.data)
598
- })
599
- }
600
- catch (e) {
601
- var err = new errorHandler(e).getError()
602
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
603
- reject(err)
604
- }
605
- })
606
- }
607
-
608
- /**
609
- * use to modify multiple placed orders which are not traded yet.
610
- * @param {Object[]} req - request data.
611
- * @returns {Promise} returns orderID of passed order ID and if modification was successful or not on resolve or error message and error code on failure
612
- */
613
- modify_multi_order = async (req) => {
614
- var funcname = 'modify_multi_order'
615
- var logger = this.Logger
616
- let AuthrizationToken = this.AccessToken
617
- let vers = this.Version
618
- return new Promise(async function (resolve, reject) {
619
- try {
620
- var url = Config.SYNC_API + Config["multi_orders"]
621
- await axios.patch((url), req, {
622
- headers: {
623
- Authorization: AuthrizationToken,
624
- version: vers
625
- }
626
- })
627
- .then(Response => {
628
- logger.debug(`${funcname} response`, Response.data, funcname)
629
- resolve(Response.data)
630
- })
631
- }
632
- catch (e) {
633
- var err = new errorHandler(e).getError()
634
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
635
- reject(err)
636
- }
637
- })
638
- }
639
-
640
- /**
641
- * use to cancel placed orders which are not traded yet.
642
- * @param {Object} req - request data.
643
- * @returns {Promise} returns orderID of passed order ID and if cancellation was successful or not on resolve or error message and error code on failure
644
- */
645
- cancel_order = async (req) => {
646
- var funcname = 'cancel_order'
647
- var logger = this.Logger
648
- let AuthrizationToken = this.AccessToken
649
- let vers = this.Version
650
- return new Promise(async function (resolve, reject) {
651
- try {
652
- var url = Config.SYNC_API + Config["orders_sync"]
653
- await axios.delete((url), {
654
- headers: {
655
- Authorization: AuthrizationToken,
656
- version: vers
657
- },
658
- data:req
659
- })
660
- .then(Response => {
661
- logger.debug(`${funcname} response`, Response.data, funcname)
662
- resolve(Response.data)
663
- })
664
- }
665
- catch (e) {
666
- var err = new errorHandler(e).getError()
667
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
668
- reject(err)
669
- }
670
- })
671
- }
672
-
673
- /**
674
- * use to cancel placed gtt orders which are not traded yet.
675
- * @param {Object} req - request data.
676
- * @returns {Promise} returns orderID of passed order ID and if cancellation was successful or not on resolve or error message and error code on failure
677
- */
678
- gtt_cancel_order = async (req) => {
679
- var funcname = 'gtt_cancel_order'
680
- var logger = this.Logger
681
- let AuthrizationToken = this.AccessToken
682
- let vers = this.Version
683
- return new Promise(async function (resolve, reject) {
684
- try {
685
- var url = Config.SYNC_API + Config["gtt_orders_sync"]
686
- await axios.delete((url), {
687
- headers: {
688
- Authorization: AuthrizationToken,
689
- version: vers
690
- },
691
- data:req
692
- })
693
- .then(Response => {
694
- logger.debug(`${funcname} response`, Response.data, funcname)
695
- resolve(Response.data)
696
- })
697
- }
698
- catch (e) {
699
- var err = new errorHandler(e).getError()
700
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
701
- reject(err)
702
- }
703
- })
704
- }
705
-
706
- /**
707
- * use to cancel multiple placed orders which are not traded yet.
708
- * @param {Object[]} req - request data.
709
- * @returns {Promise} returns orderID of passed order ID and if cancellation was successful or not on resolve or error message and error code on failure
710
- */
711
- cancel_multi_order = async (req) => {
712
- var funcname = 'cancel_multi_order'
713
- var logger = this.Logger
714
- let AuthrizationToken = this.AccessToken
715
- let vers = this.Version
716
- return new Promise(async function (resolve, reject) {
717
- try {
718
- var url = Config.SYNC_API + Config["multi_orders"]
719
- await axios.delete((url), {
720
- headers: {
721
- Authorization: AuthrizationToken,
722
- version: vers
723
- },
724
- data:req
725
- })
726
- .then(Response => {
727
- logger.debug(`${funcname} response`, Response.data, funcname)
728
- resolve(Response.data)
729
- })
730
- }
731
- catch (e) {
732
- var err = new errorHandler(e).getError()
733
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
734
- reject(err)
735
- }
736
- })
737
- }
738
-
739
- /**
740
- * use to exit all positions.
741
- * @param {Object} req - request data.
742
- * @returns {Promise} returns success message on resolve or error message and error code on failure
743
- */
744
- exit_position = async (req) => {
745
- var funcname = 'exit_position'
746
- var logger = this.Logger
747
- let AuthrizationToken = this.AccessToken
748
- let vers = this.Version
749
- return new Promise(async function (resolve, reject) {
750
- try {
751
- var url = Config.SYNC_API + Config["positions"]
752
- await axios.delete((url), {
753
- headers: {
754
- Authorization: AuthrizationToken,
755
- version: vers
756
- },
757
- data: req
758
- })
759
- .then(Response => {
760
- logger.debug(`${funcname} response`, Response.data, funcname)
761
- resolve(Response.data)
762
- })
763
- }
764
- catch (e) {
765
- var err = new errorHandler(e).getError()
766
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
767
- reject(err)
768
- }
769
- })
770
- }
771
-
772
- /**
773
- * use to convert open positions.
774
- * @param {Object} req - request data.
775
- * @returns {Promise} returns success message on resolve or error message and error code on failure
776
- */
777
- convert_position = async (req) => {
778
- var funcname = 'convert_position'
779
- var logger = this.Logger
780
- let AuthrizationToken = this.AccessToken
781
- let vers = this.Version
782
- return new Promise(async function (resolve, reject) {
783
- try {
784
- var url = Config.SYNC_API + Config["positions"]
785
- await axios.post((url), req, {
786
- headers: {
787
- Authorization: AuthrizationToken,
788
- version: vers
789
- }
790
- })
791
- .then(Response => {
792
- logger.debug(`${funcname} response`, Response.data, funcname)
793
- resolve(Response.data)
794
- })
795
- }
796
- catch (e) {
797
- var err = new errorHandler(e).getError()
798
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
799
- reject(err)
800
- }
801
- })
802
- }
803
-
804
- /**
805
- * use to get market status.
806
- * @returns {Promise} returns success message on resolve or error message and error code on failure
807
- */
808
- market_status = async (req) => {
809
- var funcname = 'market_status'
810
- var logger = this.Logger
811
- let AuthrizationToken = this.AccessToken
812
- let vers = this.Version
813
- return new Promise(async function (resolve, reject) {
814
- try {
815
- var url = Config.data_Api1 + Config["marketStatus"]
816
- const profile = await axios.get((url), {
817
- headers: {
818
- Authorization: AuthrizationToken,
819
- version: vers
820
- }
821
- })
822
- .then(Response => {
823
- logger.debug(`${funcname} response`, Response.data, funcname)
824
- resolve(Response.data)
825
- })
826
- }
827
- catch (e) {
828
- var err = new errorHandler(e).getError()
829
- logger.error(`${funcname} response`, err, funcname)
830
- reject(err)
831
- }
832
- })
833
- }
834
-
835
- /**
836
- * use to get historic data of symbol.
837
- * @param {Object} req - request data.
838
- * @returns {Promise} returns success message on resolve or error message and error code on failure
839
- */
840
- getHistory = async (req) => {
841
- var funcname = 'getHistory'
842
- var logger = this.Logger
843
- let AuthrizationToken = this.AccessToken
844
- let vers = this.Version
845
- return new Promise(async function (resolve, reject) {
846
- try {
847
- var url = Config.data_Api1 + Config["history"]
848
- url = generateUrl(url, req)
849
- await axios.get((url), {
850
- headers: {
851
- Authorization: AuthrizationToken,
852
- version: vers
853
- }
854
- })
855
- .then(Response => {
856
- logger.debug(`${funcname} response`, Response.data, funcname)
857
- resolve(Response.data)
858
- })
859
- }
860
- catch (e) {
861
- var err = new errorHandler(e).getError()
862
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
863
- reject(err)
864
- }
865
- })
866
- }
867
-
868
- /**
869
- * use to get quotes data of symbols.
870
- * @param {Array} req - array of symbols.
871
- * @returns {Promise} returns success message on resolve or error message and error code on failure
872
- */
873
- getQuotes = async (req) => {
874
- var funcname = 'getQuotes'
875
- var logger = this.Logger
876
- let AuthrizationToken = this.AccessToken
877
- let vers = this.Version
878
- return new Promise(async function (resolve, reject) {
879
- try {
880
- var url = Config.data_Api1 + Config["quotes"]
881
- var symbolstring = ""
882
- req.forEach(function (element) {
883
- symbolstring = symbolstring + element + ','
884
- })
885
- symbolstring = symbolstring.slice(0, -1)//remove last ','
886
- var data = { "symbols": symbolstring }
887
- const urlParams = new URLSearchParams(data);
888
- url = url + '?' + urlParams
889
- await axios.get((url), {
890
- headers: {
891
- Authorization: AuthrizationToken,
892
- version: vers
893
- }
894
- })
895
- .then(Response => {
896
- logger.debug(`${funcname} response`, Response.data, funcname)
897
- resolve(Response.data)
898
- })
899
- }
900
- catch (e) {
901
- var err = new errorHandler(e).getError()
902
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
903
- reject(err)
904
- }
905
- })
906
- }
907
-
908
- /**
909
- * use to get market depth data of symbols.
910
- * @param {Array} req - array of symbols.
911
- * @returns {Promise} returns success message on resolve or error message and error code on failure
912
- */
913
- getMarketDepth = async (req) => {
914
- var funcname = 'getQuotes'
915
- var logger = this.Logger
916
- let AuthrizationToken = this.AccessToken
917
- let vers = this.Version
918
- return new Promise(async function (resolve, reject) {
919
- try {
920
- var url = Config.data_Api1 + Config["market_depth"]
921
- var symbolstring = ""
922
- req.symbol.forEach(function (element) {
923
- symbolstring = symbolstring + element + ','
924
- })
925
- symbolstring = symbolstring.slice(0, -1)//remove last ','
926
- var data = { "symbol": symbolstring, "ohlcv_flag": req.ohlcv_flag }
927
- const urlParams = new URLSearchParams(data);
928
- url = url + '?' + urlParams
929
- await axios.get((url), {
930
- headers: {
931
- Authorization: AuthrizationToken,
932
- version: vers
933
- }
934
- })
935
- .then(Response => {
936
- logger.debug(`${funcname} response`, Response.data, funcname)
937
- resolve(Response.data)
938
- })
939
- }
940
- catch (e) {
941
- var err = new errorHandler(e).getError()
942
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
943
- reject(err)
944
- }
945
- })
946
- }
947
-
948
- /**
949
- * use to get option chain data of symbols.
950
- * @param {Object} req - symbol is mandatory, timestamp and strikecount is optional with default value of current expiry and 50 respectively
951
- * @returns {Promise} returns success message on resolve or error message and error code on failure
952
- */
953
- getOptionChain = async (req) => {
954
- var funcname = 'getOptionChain'
955
- var logger = this.Logger
956
- let AuthrizationToken = this.AccessToken
957
- let vers = this.Version
958
- return new Promise(async function (resolve, reject) {
959
- try {
960
- var url = Config.data_Api1 + Config["optionChain"]
961
- url = generateUrl(url, req)
962
- await axios.get((url), {
963
- headers: {
964
- Authorization: AuthrizationToken,
965
- version: vers
966
- }
967
- })
968
- .then(Response => {
969
- logger.debug(`${funcname} response`, Response.data, funcname)
970
- resolve(Response.data)
971
- })
972
- }
973
- catch (e) {
974
- var err = new errorHandler(e).getError()
975
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
976
- reject(err)
977
- }
978
- })
979
- }
980
- }
981
-
982
- function generateUrl(url, queryObject) {
983
- let finalUrl = url + "?";
984
- for (let key in queryObject) {
985
- finalUrl += encodeURIComponent(key) + "=" + encodeURIComponent(queryObject[key]) + "&";
986
- }
987
- return finalUrl.slice(0, -1); // Remove the trailing "&"
988
- }
989
-
990
- function getSHA256Hash(inputString) {
991
- const hash = crypto.createHash('sha256');
992
- hash.update(inputString);
993
- return hash.digest('hex');
994
- }
995
- module.exports = FyersApi;
1
+ "use strict";
2
+ let { Config } = require("../config/config");
3
+ let errorHandler = require("../errorHandler/errorHandler");
4
+ let axios = require("axios")
5
+ const crypto = require('crypto');
6
+ let Logger = require("../logger/log.js")
7
+
8
+ /**
9
+ * Class to access Fyers API.
10
+ * @class
11
+ */
12
+ class FyersApi {
13
+ /**
14
+ * Create a new DataSocket object to acess symboldata websocket.
15
+ * @constructor
16
+ * @param {Object} params - The parameters for initializing the DataSocket.
17
+ * @param {string} params.AccessToken - The access token for authentication.
18
+ * @param {string} params.AppID - AppID of user.
19
+ * @param {string} params.RedirectURL - Redirect URL provided while creating the APP.
20
+ * @param {boolean} params.enableLogging - Flag to enable or disable logging.
21
+ * @param {string} [params.Version="2.0"] - the version of API you want your output format in.
22
+ */
23
+ constructor(params) {
24
+ var self = this;
25
+
26
+ /**
27
+ * AccessToken of user.
28
+ * @type {String}
29
+ */
30
+ self.AccessToken = params?.AccessToken ?? null;;
31
+
32
+ /**
33
+ * RedirectURL of provided by user.
34
+ * @type {String}
35
+ */
36
+ self.RedirectURL = params?.RedirectURL ?? null;
37
+
38
+ /**
39
+ * APPID provided by user.
40
+ * @type {String}
41
+ */
42
+ self.AppID = params?.AppID ?? null;
43
+ /**
44
+ * API version provided by client.
45
+ * @type {String}
46
+ */
47
+ self.Version = params?.Version ?? "2.0";
48
+
49
+ /**
50
+ * filepath where are logs are to be saved.
51
+ * @type {string}
52
+ */
53
+ self.LogPath = params?.path ?? undefined;
54
+
55
+ /**
56
+ * Flag to enable or disable logging.
57
+ * @type {boolean}
58
+ */
59
+ self.LoggingFlag = params?.enableLogging ?? true;
60
+
61
+ /**
62
+ * object used to write logs.
63
+ * @type {Logger}
64
+ */
65
+ self.Logger = new Logger(this.LogPath,this.LoggingFlag)
66
+ }
67
+
68
+ /**
69
+ * sets the APPID.
70
+ * @param {string} req - APPID in format xxxxxx-xxx.
71
+ */
72
+ setAppId = function (req) {
73
+ this.AppID = req
74
+ }
75
+
76
+ /**
77
+ * sets the RedirectURL.
78
+ * @param {string} req - pass redirect URL set during creation of APP.
79
+ */
80
+ setRedirectUrl = function (req) {
81
+ this.RedirectURL = req
82
+ }
83
+
84
+ /**
85
+ * sets the AccessToken.
86
+ * @param {string} req - pass Access token.
87
+ */
88
+ setAccessToken = function (req) {
89
+ if (this.AppID == null) {
90
+ console.log("Please set APPID using setAppId function")
91
+ }
92
+ else {
93
+ this.AccessToken = this.AppID + ":" + req
94
+ }
95
+ }
96
+
97
+ /**
98
+ * get generate-authcode URL to login and generate authcode.
99
+ * @param {Object} req - defines for what the callback function is.
100
+ * @param {string} req.client_id - AppID of user.
101
+ * @param {string} req.redirect_uri - RedirectURL provided by user.
102
+ * @param {string} [req.state] - state value.
103
+ * @returns {string} generate authcode url
104
+ */
105
+ generateAuthCode = function (req) {
106
+ var funcname = 'generateAuthCode'
107
+ var logger = this.Logger
108
+ const client_id = (req && req.client_id) || this.AppID;
109
+ const redirect_uri = (req && req.redirect_uri) || this.RedirectURL;
110
+ const state = (req && req.state) || "sample_state";
111
+ logger.debug('generate authcode response', `${Config.API}generate-authcode?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=code&state=${state}`, funcname);
112
+ return `${Config.SYNC_API}/generate-authcode?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=code&state=${state}`
113
+ }
114
+
115
+ /**
116
+ * generate access token to use the API's.
117
+ * @param {Object} req - defines for what the callback function is.
118
+ * @param {string} req.client_id - AppID of user.
119
+ * @param {string} req.secret_key - App Secret of user.
120
+ * @param {string} req.auth_code - authcode generated after use of generateAuthCode and login.
121
+ * @param {string} [req.code_verifier] - code verifier.
122
+ * @returns {Object} Object with access token and refresh token if successful
123
+ */
124
+ generate_access_token = async (req) => {
125
+ var funcname = 'generateAuthCode'
126
+ var logger = this.Logger
127
+ const code_verifier = req.code_verifier || "";
128
+ const auth_code = req.auth_code || "";
129
+ const client_id = req.client_id || this.AppID;
130
+ const secret_key = req.secret_key || "";
131
+ const sha256 = getSHA256Hash(`${client_id}:${secret_key}`)
132
+ logger.debug("generate_access_token inputs", { "code_verifier": code_verifier, "auth_code": auth_code, "client_id": client_id, "secret_key": secret_key, "sha256": sha256 }, funcname)
133
+ try {
134
+
135
+ if (code_verifier === "") {
136
+
137
+ const access_token = await axios.post(`${Config.SYNC_API}/validate-authcode`, {
138
+ grant_type: "authorization_code",
139
+ code: req.auth_code,
140
+ appIdHash: sha256
141
+
142
+ })
143
+ return access_token.data;
144
+ }
145
+ else {
146
+
147
+ const access_token = await axios.post(`${Config.API}/validate-authcode`, {
148
+ grant_type: "authorization_code",
149
+ code_verifier: req.code_verifier,
150
+ code: req.auth_code,
151
+
152
+
153
+ })
154
+ return access_token.data;
155
+ }
156
+
157
+ }
158
+ catch (e) {
159
+ var err = new errorHandler(e).getError()
160
+ logger.error("error generating access token", err, funcname)
161
+ return err
162
+ }
163
+ }
164
+
165
+ /**
166
+ * get profile data.
167
+ * @returns {Promise} returns profile data on resolve or error message and error code on failure
168
+ */
169
+ get_profile = async (req) => {
170
+ var funcname = 'get_profile'
171
+ var logger = this.Logger
172
+ let AuthrizationToken = this.AccessToken
173
+ let vers = this.Version
174
+ return new Promise(async function (resolve, reject) {
175
+ try {
176
+ var url = Config.SYNC_API + Config["get_profile"]
177
+ await axios.get((url), {
178
+ headers: {
179
+ Authorization: AuthrizationToken,
180
+ version: vers
181
+ }
182
+ })
183
+ .then(Response => {
184
+ logger.debug(`${funcname} response`, Response.data, funcname)
185
+ resolve(Response.data)
186
+ })
187
+ }
188
+ catch (e) {
189
+ var err = new errorHandler(e).getError()
190
+ logger.error(`${funcname} response`, err, funcname)
191
+ reject(err)
192
+ }
193
+ })
194
+ }
195
+
196
+ /**
197
+ * get funds detail.
198
+ * @returns {Promise} returns funds detail on resolve or error message and error code on failure
199
+ */
200
+ get_funds = async (req) => {
201
+ var funcname = 'get_funds'
202
+ var logger = this.Logger
203
+ let AuthrizationToken = this.AccessToken
204
+ let vers = this.Version
205
+ return new Promise(async function (resolve, reject) {
206
+ try {
207
+ var url = Config.SYNC_API + Config["funds"]
208
+ await axios.get((url), {
209
+ headers: {
210
+ Authorization: AuthrizationToken,
211
+ version: vers
212
+ }
213
+ })
214
+ .then(Response => {
215
+ logger.debug(`${funcname} response`, Response.data, funcname)
216
+ resolve(Response.data)
217
+ })
218
+ }
219
+ catch (e) {
220
+ var err = new errorHandler(e).getError()
221
+ logger.error(`${funcname} response`, err, funcname)
222
+ reject(err)
223
+ }
224
+ })
225
+ }
226
+
227
+ /**
228
+ * get holdings detail.
229
+ * @returns {Promise} returns holdings detail on resolve or error message and error code on failure
230
+ */
231
+ get_holdings = async (req) => {
232
+ var funcname = 'get_holdings'
233
+ var logger = this.Logger
234
+ let AuthrizationToken = this.AccessToken
235
+ let vers = this.Version
236
+ return new Promise(async function (resolve, reject) {
237
+ try {
238
+ var url = Config.SYNC_API + Config["holdings"]
239
+ await axios.get((url), {
240
+ headers: {
241
+ Authorization: AuthrizationToken,
242
+ version: vers
243
+ }
244
+ })
245
+ .then(Response => {
246
+ logger.debug(`${funcname} response`, Response.data, funcname)
247
+ resolve(Response.data)
248
+ })
249
+ }
250
+ catch (e) {
251
+ var err = new errorHandler(e).getError()
252
+ logger.error(`${funcname} response`, err, funcname)
253
+ reject(err)
254
+ }
255
+ })
256
+ }
257
+
258
+ /**
259
+ * logout API.
260
+ * @returns {Promise} This invalidates the access token
261
+ */
262
+ logout_user = async (req) => {
263
+ var funcname = 'logout_user'
264
+ var logger = this.Logger
265
+ let AuthrizationToken = this.AccessToken
266
+ let vers = this.Version
267
+ return new Promise(async function (resolve, reject) {
268
+ try {
269
+ var url = Config.SYNC_API + Config["logout"]
270
+ await axios.post((url), req, {
271
+ headers: {
272
+ Authorization: AuthrizationToken,
273
+ version: vers
274
+ }
275
+ })
276
+ .then(Response => {
277
+ logger.debug(`${funcname} response`, Response.data, funcname)
278
+ resolve(Response.data)
279
+ })
280
+
281
+ }
282
+ catch (e) {
283
+ var err = new errorHandler(e).getError()
284
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
285
+ reject(err)
286
+ }
287
+ })
288
+ }
289
+
290
+ /**
291
+ * get orderbook to get order details of order placed on current day.
292
+ * @returns {Promise} returns orderbook detail on resolve or error message and error code on failure
293
+ */
294
+ get_orders = async (req) => {
295
+ var funcname = 'get_orders'
296
+ var logger = this.Logger
297
+ let AuthrizationToken = this.AccessToken
298
+ let vers = this.Version
299
+ return new Promise(async function (resolve, reject) {
300
+ try {
301
+ var url = Config.SYNC_API + Config["orders"]
302
+ await axios.get((url), {
303
+ headers: {
304
+ Authorization: AuthrizationToken,
305
+ version: vers
306
+ }
307
+ })
308
+ .then(Response => {
309
+ logger.debug(`${funcname} response`, Response.data, funcname)
310
+ resolve(Response.data)
311
+ })
312
+ }
313
+ catch (e) {
314
+ var err = new errorHandler(e).getError()
315
+ logger.error(`${funcname} response`, err, funcname)
316
+ reject(err)
317
+ }
318
+ })
319
+ }
320
+
321
+ /**
322
+ * get orderbook to get order details of gtt order placed on current day.
323
+ * @returns {Promise} returns orderbook detail on resolve or error message and error code on failure
324
+ */
325
+ get_gtt_orders = async (req) => {
326
+ var funcname = 'get_gtt_orders'
327
+ var logger = this.Logger
328
+ let AuthrizationToken = this.AccessToken
329
+ let vers = this.Version
330
+ return new Promise(async function (resolve, reject) {
331
+ try {
332
+ var url = Config.SYNC_API + Config["gtt_orders"]
333
+ await axios.get((url), {
334
+ headers: {
335
+ Authorization: AuthrizationToken,
336
+ version: vers
337
+ }
338
+ })
339
+ .then(Response => {
340
+ logger.debug(`${funcname} response`, Response.data, funcname)
341
+ resolve(Response.data)
342
+ })
343
+ }
344
+ catch (e) {
345
+ var err = new errorHandler(e).getError()
346
+ logger.error(`${funcname} response`, err, funcname)
347
+ reject(err)
348
+ }
349
+ })
350
+ }
351
+
352
+ /**
353
+ * get orderbook for a specific order ID.
354
+ * @param {Object} req - defines for what the callback function is.
355
+ * @param {string} req.order_id - orderID for which orderbook is required for.
356
+ * @returns {Promise} returns orderbook detail of passed order ID on resolve or error message and error code on failure
357
+ */
358
+ get_filtered_orders = async (req) => {
359
+ var funcname = 'get_filtered_orders'
360
+ var logger = this.Logger
361
+ let AuthrizationToken = this.AccessToken
362
+ let vers = this.Version
363
+ return new Promise(async function (resolve, reject) {
364
+ try {
365
+ var url = Config.SYNC_API + Config["orders"] + `?id=${req.order_id}`
366
+ await axios.get((url), {
367
+ headers: {
368
+ Authorization: AuthrizationToken,
369
+ version: vers
370
+ }
371
+ })
372
+ .then(Response => {
373
+ logger.debug(`${funcname} response`, Response.data, funcname)
374
+ resolve(Response.data)
375
+ })
376
+ }
377
+ catch (e) {
378
+ var err = new errorHandler(e).getError()
379
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
380
+ reject(err)
381
+ }
382
+ })
383
+ }
384
+
385
+ /**
386
+ * get positionbook to get position details.
387
+ * @returns {Promise} returns positionbook detail on resolve or error message and error code on failure
388
+ */
389
+ get_positions = async (req) => {
390
+ var funcname = 'get_positions'
391
+ var logger = this.Logger
392
+ let AuthrizationToken = this.AccessToken
393
+ let vers = this.Version
394
+ return new Promise(async function (resolve, reject) {
395
+ try {
396
+ var url = Config.SYNC_API + Config["positions"]
397
+ await axios.get((url), {
398
+ headers: {
399
+ Authorization: AuthrizationToken,
400
+ version: vers
401
+ }
402
+ })
403
+ .then(Response => {
404
+ logger.debug(`${funcname} response`, Response.data, funcname)
405
+ resolve(Response.data)
406
+ })
407
+ }
408
+ catch (e) {
409
+ var err = new errorHandler(e).getError()
410
+ logger.error(`${funcname} response`, err, funcname)
411
+ reject(err)
412
+ }
413
+ })
414
+ }
415
+
416
+ /**
417
+ * get tradebook to get trade details.
418
+ * @returns {Promise} returns tradebook detail on resolve or error message and error code on failure
419
+ */
420
+ get_tradebook = async (req) => {
421
+ var funcname = 'get_tradebook'
422
+ var logger = this.Logger
423
+ let AuthrizationToken = this.AccessToken
424
+ let vers = this.Version
425
+ return new Promise(async function (resolve, reject) {
426
+ try {
427
+ var url = Config.SYNC_API + Config["tradebook"]
428
+ await axios.get((url), {
429
+ headers: {
430
+ Authorization: AuthrizationToken,
431
+ version: vers
432
+ }
433
+ })
434
+ .then(Response => {
435
+ logger.debug(`${funcname} response`, Response.data, funcname)
436
+ resolve(Response.data)
437
+ })
438
+ }
439
+ catch (e) {
440
+ var err = new errorHandler(e).getError()
441
+ logger.error(`${funcname} response`, err, funcname)
442
+ reject(err)
443
+ }
444
+ })
445
+ }
446
+
447
+ /**
448
+ * use to place order.
449
+ * @param {Object} req - request data.
450
+ * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
451
+ */
452
+ place_order = async (req) => {
453
+ var funcname = 'place_order'
454
+ var logger = this.Logger
455
+ let AuthrizationToken = this.AccessToken
456
+ let vers = this.Version
457
+ return new Promise(async function (resolve, reject) {
458
+ try {
459
+ var url = Config.SYNC_API + Config["orders_sync"]
460
+ await axios.post((url), req, {
461
+ headers: {
462
+ Authorization: AuthrizationToken,
463
+ version: vers
464
+ }
465
+ })
466
+ .then(Response => {
467
+ logger.debug(`${funcname} response`, Response.data, funcname)
468
+ resolve(Response.data)
469
+ })
470
+
471
+ }
472
+ catch (e) {
473
+ var err = new errorHandler(e).getError()
474
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
475
+ reject(err)
476
+ }
477
+ })
478
+ }
479
+
480
+ /**
481
+ * use to place gtt order.
482
+ * @param {Object} req - request data.
483
+ * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
484
+ */
485
+ place_gtt_order = async (req) => {
486
+ var funcname = 'place_gtt_order'
487
+ var logger = this.Logger
488
+ let AuthrizationToken = this.AccessToken
489
+ let vers = this.Version
490
+ return new Promise(async function (resolve, reject) {
491
+ try {
492
+ var url = Config.SYNC_API + Config["gtt_orders_sync"]
493
+ await axios.post((url), req, {
494
+ headers: {
495
+ Authorization: AuthrizationToken,
496
+ }
497
+ }).then(Response => {
498
+ logger.debug(`${funcname} response`, Response.data, funcname)
499
+ resolve(Response.data)
500
+ })
501
+ }
502
+ catch (e) {
503
+ var err = new errorHandler(e).getError()
504
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
505
+ reject(err)
506
+ }
507
+ })
508
+ }
509
+
510
+ /**
511
+ * used to place multileg order.
512
+ * @param {Object} req - request data.
513
+ * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
514
+ */
515
+ place_multileg_order = async (req) => {
516
+ var funcname = 'place_multileg_order'
517
+ var logger = this.Logger
518
+ let AuthrizationToken = this.AccessToken
519
+ let vers = this.Version
520
+ return new Promise(async function (resolve, reject) {
521
+ try {
522
+ var url = Config.SYNC_API + Config["multileg_orders_sync"]
523
+ await axios.post((url), req, {
524
+ headers: {
525
+ Authorization: AuthrizationToken,
526
+ version: vers
527
+ }
528
+ })
529
+ .then(Response => {
530
+ logger.debug(`${funcname} response`, Response.data, funcname)
531
+ resolve(Response.data)
532
+ })
533
+
534
+ }
535
+ catch (e) {
536
+ var err = new errorHandler(e).getError()
537
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
538
+ reject(err)
539
+ }
540
+ })
541
+ }
542
+
543
+ /**
544
+ * use to place multiple order.
545
+ * @param {Object[]} req - request data.
546
+ * @returns {Promise} returns orderID of all placed and if they are failed or successful on resolve or error message and error code on failure
547
+ */
548
+ place_multi_order = async (req) => {
549
+ var funcname = 'place_multi_order'
550
+ var logger = this.Logger
551
+ let AuthrizationToken = this.AccessToken
552
+ let vers = this.Version
553
+ return new Promise(async function (resolve, reject) {
554
+ try {
555
+ var url = Config.SYNC_API + Config["multi_orders"]
556
+ await axios.post((url), req, {
557
+ headers: {
558
+ Authorization: AuthrizationToken,
559
+ version: vers
560
+ }
561
+ })
562
+ .then(Response => {
563
+ logger.debug(`${funcname} response`, Response.data, funcname)
564
+ resolve(Response.data)
565
+ })
566
+ }
567
+ catch (e) {
568
+ var err = new errorHandler(e).getError()
569
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
570
+ reject(err)
571
+ }
572
+ })
573
+ }
574
+
575
+ /**
576
+ * use to modify placed orders which are not traded yet.
577
+ * @param {Object} req - request data.
578
+ * @returns {Promise} returns orderID of passed order ID and if modification was successful or not resolve or error message and error code on failure
579
+ */
580
+ modify_order = async (req) => {
581
+ var funcname = 'modify_order'
582
+ var logger = this.Logger
583
+ let AuthrizationToken = this.AccessToken
584
+ let vers = this.Version
585
+ return new Promise(async function (resolve, reject) {
586
+ try {
587
+ var url = Config.SYNC_API + Config["orders_sync"]
588
+ await axios.patch((url), req, {
589
+ headers: {
590
+ Authorization: AuthrizationToken,
591
+ version: vers
592
+ }
593
+ })
594
+ .then(Response => {
595
+ logger.debug(`${funcname} response`, Response.data, funcname)
596
+ resolve(Response.data)
597
+ })
598
+ }
599
+ catch (e) {
600
+ var err = new errorHandler(e).getError()
601
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
602
+ reject(err)
603
+ }
604
+ })
605
+ }
606
+
607
+ /**
608
+ * use to modify placed gtt orders which are not traded yet.
609
+ * @param {Object} req - request data.
610
+ * @returns {Promise} returns orderID of passed order ID and if modification was successful or not resolve or error message and error code on failure
611
+ */
612
+ gtt_modify_order = async (req) => {
613
+ var funcname = 'gtt_modify_order'
614
+ var logger = this.Logger
615
+ let AuthrizationToken = this.AccessToken
616
+ let vers = this.Version
617
+ return new Promise(async function (resolve, reject) {
618
+ try {
619
+ var url = Config.SYNC_API + Config["gtt_orders_sync"]
620
+ await axios.patch((url), req, {
621
+ headers: {
622
+ Authorization: AuthrizationToken,
623
+ version: vers
624
+ }
625
+ })
626
+ .then(Response => {
627
+ logger.debug(`${funcname} response`, Response.data, funcname)
628
+ resolve(Response.data)
629
+ })
630
+ }
631
+ catch (e) {
632
+ var err = new errorHandler(e).getError()
633
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
634
+ reject(err)
635
+ }
636
+ })
637
+ }
638
+
639
+ /**
640
+ * use to modify multiple placed orders which are not traded yet.
641
+ * @param {Object[]} req - request data.
642
+ * @returns {Promise} returns orderID of passed order ID and if modification was successful or not on resolve or error message and error code on failure
643
+ */
644
+ modify_multi_order = async (req) => {
645
+ var funcname = 'modify_multi_order'
646
+ var logger = this.Logger
647
+ let AuthrizationToken = this.AccessToken
648
+ let vers = this.Version
649
+ return new Promise(async function (resolve, reject) {
650
+ try {
651
+ var url = Config.SYNC_API + Config["multi_orders"]
652
+ await axios.patch((url), req, {
653
+ headers: {
654
+ Authorization: AuthrizationToken,
655
+ version: vers
656
+ }
657
+ })
658
+ .then(Response => {
659
+ logger.debug(`${funcname} response`, Response.data, funcname)
660
+ resolve(Response.data)
661
+ })
662
+ }
663
+ catch (e) {
664
+ var err = new errorHandler(e).getError()
665
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
666
+ reject(err)
667
+ }
668
+ })
669
+ }
670
+
671
+ /**
672
+ * use to cancel placed orders which are not traded yet.
673
+ * @param {Object} req - request data.
674
+ * @returns {Promise} returns orderID of passed order ID and if cancellation was successful or not on resolve or error message and error code on failure
675
+ */
676
+ cancel_order = async (req) => {
677
+ var funcname = 'cancel_order'
678
+ var logger = this.Logger
679
+ let AuthrizationToken = this.AccessToken
680
+ let vers = this.Version
681
+ return new Promise(async function (resolve, reject) {
682
+ try {
683
+ var url = Config.SYNC_API + Config["orders_sync"]
684
+ await axios.delete((url), {
685
+ headers: {
686
+ Authorization: AuthrizationToken,
687
+ version: vers
688
+ },
689
+ data:req
690
+ })
691
+ .then(Response => {
692
+ logger.debug(`${funcname} response`, Response.data, funcname)
693
+ resolve(Response.data)
694
+ })
695
+ }
696
+ catch (e) {
697
+ var err = new errorHandler(e).getError()
698
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
699
+ reject(err)
700
+ }
701
+ })
702
+ }
703
+
704
+ /**
705
+ * use to cancel placed gtt orders which are not traded yet.
706
+ * @param {Object} req - request data.
707
+ * @returns {Promise} returns orderID of passed order ID and if cancellation was successful or not on resolve or error message and error code on failure
708
+ */
709
+ gtt_cancel_order = async (req) => {
710
+ var funcname = 'gtt_cancel_order'
711
+ var logger = this.Logger
712
+ let AuthrizationToken = this.AccessToken
713
+ let vers = this.Version
714
+ return new Promise(async function (resolve, reject) {
715
+ try {
716
+ var url = Config.SYNC_API + Config["gtt_orders_sync"]
717
+ await axios.delete((url), {
718
+ headers: {
719
+ Authorization: AuthrizationToken,
720
+ version: vers
721
+ },
722
+ data:req
723
+ })
724
+ .then(Response => {
725
+ logger.debug(`${funcname} response`, Response.data, funcname)
726
+ resolve(Response.data)
727
+ })
728
+ }
729
+ catch (e) {
730
+ var err = new errorHandler(e).getError()
731
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
732
+ reject(err)
733
+ }
734
+ })
735
+ }
736
+
737
+ /**
738
+ * use to cancel multiple placed orders which are not traded yet.
739
+ * @param {Object[]} req - request data.
740
+ * @returns {Promise} returns orderID of passed order ID and if cancellation was successful or not on resolve or error message and error code on failure
741
+ */
742
+ cancel_multi_order = async (req) => {
743
+ var funcname = 'cancel_multi_order'
744
+ var logger = this.Logger
745
+ let AuthrizationToken = this.AccessToken
746
+ let vers = this.Version
747
+ return new Promise(async function (resolve, reject) {
748
+ try {
749
+ var url = Config.SYNC_API + Config["multi_orders"]
750
+ await axios.delete((url), {
751
+ headers: {
752
+ Authorization: AuthrizationToken,
753
+ version: vers
754
+ },
755
+ data:req
756
+ })
757
+ .then(Response => {
758
+ logger.debug(`${funcname} response`, Response.data, funcname)
759
+ resolve(Response.data)
760
+ })
761
+ }
762
+ catch (e) {
763
+ var err = new errorHandler(e).getError()
764
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
765
+ reject(err)
766
+ }
767
+ })
768
+ }
769
+
770
+ /**
771
+ * use to exit all positions.
772
+ * @param {Object} req - request data.
773
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
774
+ */
775
+ exit_position = async (req) => {
776
+ var funcname = 'exit_position'
777
+ var logger = this.Logger
778
+ let AuthrizationToken = this.AccessToken
779
+ let vers = this.Version
780
+ return new Promise(async function (resolve, reject) {
781
+ try {
782
+ var url = Config.SYNC_API + Config["positions"]
783
+ await axios.delete((url), {
784
+ headers: {
785
+ Authorization: AuthrizationToken,
786
+ version: vers
787
+ },
788
+ data: req
789
+ })
790
+ .then(Response => {
791
+ logger.debug(`${funcname} response`, Response.data, funcname)
792
+ resolve(Response.data)
793
+ })
794
+ }
795
+ catch (e) {
796
+ var err = new errorHandler(e).getError()
797
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
798
+ reject(err)
799
+ }
800
+ })
801
+ }
802
+
803
+ /**
804
+ * use to convert open positions.
805
+ * @param {Object} req - request data.
806
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
807
+ */
808
+ convert_position = async (req) => {
809
+ var funcname = 'convert_position'
810
+ var logger = this.Logger
811
+ let AuthrizationToken = this.AccessToken
812
+ let vers = this.Version
813
+ return new Promise(async function (resolve, reject) {
814
+ try {
815
+ var url = Config.SYNC_API + Config["positions"]
816
+ await axios.post((url), req, {
817
+ headers: {
818
+ Authorization: AuthrizationToken,
819
+ version: vers
820
+ }
821
+ })
822
+ .then(Response => {
823
+ logger.debug(`${funcname} response`, Response.data, funcname)
824
+ resolve(Response.data)
825
+ })
826
+ }
827
+ catch (e) {
828
+ var err = new errorHandler(e).getError()
829
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
830
+ reject(err)
831
+ }
832
+ })
833
+ }
834
+
835
+ /**
836
+ * use to get market status.
837
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
838
+ */
839
+ market_status = async (req) => {
840
+ var funcname = 'market_status'
841
+ var logger = this.Logger
842
+ let AuthrizationToken = this.AccessToken
843
+ let vers = this.Version
844
+ return new Promise(async function (resolve, reject) {
845
+ try {
846
+ var url = Config.data_Api1 + Config["marketStatus"]
847
+ const profile = await axios.get((url), {
848
+ headers: {
849
+ Authorization: AuthrizationToken,
850
+ version: vers
851
+ }
852
+ })
853
+ .then(Response => {
854
+ logger.debug(`${funcname} response`, Response.data, funcname)
855
+ resolve(Response.data)
856
+ })
857
+ }
858
+ catch (e) {
859
+ var err = new errorHandler(e).getError()
860
+ logger.error(`${funcname} response`, err, funcname)
861
+ reject(err)
862
+ }
863
+ })
864
+ }
865
+
866
+ /**
867
+ * use to get historic data of symbol.
868
+ * @param {Object} req - request data.
869
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
870
+ */
871
+ getHistory = async (req) => {
872
+ var funcname = 'getHistory'
873
+ var logger = this.Logger
874
+ let AuthrizationToken = this.AccessToken
875
+ let vers = this.Version
876
+ return new Promise(async function (resolve, reject) {
877
+ try {
878
+ var url = Config.data_Api1 + Config["history"]
879
+ url = generateUrl(url, req)
880
+ await axios.get((url), {
881
+ headers: {
882
+ Authorization: AuthrizationToken,
883
+ version: vers
884
+ }
885
+ })
886
+ .then(Response => {
887
+ logger.debug(`${funcname} response`, Response.data, funcname)
888
+ resolve(Response.data)
889
+ })
890
+ }
891
+ catch (e) {
892
+ var err = new errorHandler(e).getError()
893
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
894
+ reject(err)
895
+ }
896
+ })
897
+ }
898
+
899
+ /**
900
+ * use to get quotes data of symbols.
901
+ * @param {Array} req - array of symbols.
902
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
903
+ */
904
+ getQuotes = async (req) => {
905
+ var funcname = 'getQuotes'
906
+ var logger = this.Logger
907
+ let AuthrizationToken = this.AccessToken
908
+ let vers = this.Version
909
+ return new Promise(async function (resolve, reject) {
910
+ try {
911
+ var url = Config.data_Api1 + Config["quotes"]
912
+ var symbolstring = ""
913
+ req.forEach(function (element) {
914
+ symbolstring = symbolstring + element + ','
915
+ })
916
+ symbolstring = symbolstring.slice(0, -1)//remove last ','
917
+ var data = { "symbols": symbolstring }
918
+ const urlParams = new URLSearchParams(data);
919
+ url = url + '?' + urlParams
920
+ await axios.get((url), {
921
+ headers: {
922
+ Authorization: AuthrizationToken,
923
+ version: vers
924
+ }
925
+ })
926
+ .then(Response => {
927
+ logger.debug(`${funcname} response`, Response.data, funcname)
928
+ resolve(Response.data)
929
+ })
930
+ }
931
+ catch (e) {
932
+ var err = new errorHandler(e).getError()
933
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
934
+ reject(err)
935
+ }
936
+ })
937
+ }
938
+
939
+ /**
940
+ * use to get market depth data of symbols.
941
+ * @param {Array} req - array of symbols.
942
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
943
+ */
944
+ getMarketDepth = async (req) => {
945
+ var funcname = 'getQuotes'
946
+ var logger = this.Logger
947
+ let AuthrizationToken = this.AccessToken
948
+ let vers = this.Version
949
+ return new Promise(async function (resolve, reject) {
950
+ try {
951
+ var url = Config.data_Api1 + Config["market_depth"]
952
+ var symbolstring = ""
953
+ req.symbol.forEach(function (element) {
954
+ symbolstring = symbolstring + element + ','
955
+ })
956
+ symbolstring = symbolstring.slice(0, -1)//remove last ','
957
+ var data = { "symbol": symbolstring, "ohlcv_flag": req.ohlcv_flag }
958
+ const urlParams = new URLSearchParams(data);
959
+ url = url + '?' + urlParams
960
+ await axios.get((url), {
961
+ headers: {
962
+ Authorization: AuthrizationToken,
963
+ version: vers
964
+ }
965
+ })
966
+ .then(Response => {
967
+ logger.debug(`${funcname} response`, Response.data, funcname)
968
+ resolve(Response.data)
969
+ })
970
+ }
971
+ catch (e) {
972
+ var err = new errorHandler(e).getError()
973
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
974
+ reject(err)
975
+ }
976
+ })
977
+ }
978
+
979
+ /**
980
+ * use to get option chain data of symbols.
981
+ * @param {Object} req - symbol is mandatory, timestamp and strikecount is optional with default value of current expiry and 50 respectively
982
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
983
+ */
984
+ getOptionChain = async (req) => {
985
+ var funcname = 'getOptionChain'
986
+ var logger = this.Logger
987
+ let AuthrizationToken = this.AccessToken
988
+ let vers = this.Version
989
+ return new Promise(async function (resolve, reject) {
990
+ try {
991
+ var url = Config.data_Api1 + Config["optionChain"]
992
+ url = generateUrl(url, req)
993
+ await axios.get((url), {
994
+ headers: {
995
+ Authorization: AuthrizationToken,
996
+ version: vers
997
+ }
998
+ })
999
+ .then(Response => {
1000
+ logger.debug(`${funcname} response`, Response.data, funcname)
1001
+ resolve(Response.data)
1002
+ })
1003
+ }
1004
+ catch (e) {
1005
+ var err = new errorHandler(e).getError()
1006
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
1007
+ reject(err)
1008
+ }
1009
+ })
1010
+ }
1011
+ }
1012
+
1013
+ function generateUrl(url, queryObject) {
1014
+ let finalUrl = url + "?";
1015
+ for (let key in queryObject) {
1016
+ finalUrl += encodeURIComponent(key) + "=" + encodeURIComponent(queryObject[key]) + "&";
1017
+ }
1018
+ return finalUrl.slice(0, -1); // Remove the trailing "&"
1019
+ }
1020
+
1021
+ function getSHA256Hash(inputString) {
1022
+ const hash = crypto.createHash('sha256');
1023
+ hash.update(inputString);
1024
+ return hash.digest('hex');
1025
+ }
1026
+ module.exports = FyersApi;