fyers-api-v3 1.3.0 → 1.3.3

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,869 +1,869 @@
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 for a specific order ID.
292
- * @param {Object} req - defines for what the callback function is.
293
- * @param {string} req.order_id - orderID for which orderbook is required for.
294
- * @returns {Promise} returns orderbook detail of passed order ID on resolve or error message and error code on failure
295
- */
296
- get_filtered_orders = async (req) => {
297
- var funcname = 'get_filtered_orders'
298
- var logger = this.Logger
299
- let AuthrizationToken = this.AccessToken
300
- let vers = this.Version
301
- return new Promise(async function (resolve, reject) {
302
- try {
303
- var url = Config.SYNC_API + Config["orders"] + `?id=${req.order_id}`
304
- await axios.get((url), {
305
- headers: {
306
- Authorization: AuthrizationToken,
307
- version: vers
308
- }
309
- })
310
- .then(Response => {
311
- logger.debug(`${funcname} response`, Response.data, funcname)
312
- resolve(Response.data)
313
- })
314
- }
315
- catch (e) {
316
- var err = new errorHandler(e).getError()
317
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
318
- reject(err)
319
- }
320
- })
321
- }
322
-
323
- /**
324
- * get positionbook to get position details.
325
- * @returns {Promise} returns positionbook detail on resolve or error message and error code on failure
326
- */
327
- get_positions = async (req) => {
328
- var funcname = 'get_positions'
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["positions"]
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`, err, funcname)
349
- reject(err)
350
- }
351
- })
352
- }
353
-
354
- /**
355
- * get tradebook to get trade details.
356
- * @returns {Promise} returns tradebook detail on resolve or error message and error code on failure
357
- */
358
- get_tradebook = async (req) => {
359
- var funcname = 'get_tradebook'
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["tradebook"]
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
- * use to place order.
387
- * @param {Object} req - request data.
388
- * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
389
- */
390
- place_order = async (req) => {
391
- var funcname = 'place_order'
392
- var logger = this.Logger
393
- let AuthrizationToken = this.AccessToken
394
- let vers = this.Version
395
- return new Promise(async function (resolve, reject) {
396
- try {
397
- var url = Config.SYNC_API + Config["orders_sync"]
398
- await axios.post((url), req, {
399
- headers: {
400
- Authorization: AuthrizationToken,
401
- version: vers
402
- }
403
- })
404
- .then(Response => {
405
- logger.debug(`${funcname} response`, Response.data, funcname)
406
- resolve(Response.data)
407
- })
408
-
409
- }
410
- catch (e) {
411
- var err = new errorHandler(e).getError()
412
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
413
- reject(err)
414
- }
415
- })
416
- }
417
-
418
- /**
419
- * used to place multileg order.
420
- * @param {Object} req - request data.
421
- * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
422
- */
423
- place_multileg_order = async (req) => {
424
- var funcname = 'place_multileg_order'
425
- var logger = this.Logger
426
- let AuthrizationToken = this.AccessToken
427
- let vers = this.Version
428
- return new Promise(async function (resolve, reject) {
429
- try {
430
- var url = Config.SYNC_API + Config["multileg_orders_sync"]
431
- await axios.post((url), req, {
432
- headers: {
433
- Authorization: AuthrizationToken,
434
- version: vers
435
- }
436
- })
437
- .then(Response => {
438
- logger.debug(`${funcname} response`, Response.data, funcname)
439
- resolve(Response.data)
440
- })
441
-
442
- }
443
- catch (e) {
444
- var err = new errorHandler(e).getError()
445
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
446
- reject(err)
447
- }
448
- })
449
- }
450
-
451
- /**
452
- * use to place multiple order.
453
- * @param {Object[]} req - request data.
454
- * @returns {Promise} returns orderID of all placed and if they are failed or successful on resolve or error message and error code on failure
455
- */
456
- place_multi_order = async (req) => {
457
- var funcname = 'place_multi_order'
458
- var logger = this.Logger
459
- let AuthrizationToken = this.AccessToken
460
- let vers = this.Version
461
- return new Promise(async function (resolve, reject) {
462
- try {
463
- var url = Config.SYNC_API + Config["multi_orders"]
464
- await axios.post((url), req, {
465
- headers: {
466
- Authorization: AuthrizationToken,
467
- version: vers
468
- }
469
- })
470
- .then(Response => {
471
- logger.debug(`${funcname} response`, Response.data, funcname)
472
- resolve(Response.data)
473
- })
474
- }
475
- catch (e) {
476
- var err = new errorHandler(e).getError()
477
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
478
- reject(err)
479
- }
480
- })
481
- }
482
-
483
- /**
484
- * use to modify placed orders which are not traded yet.
485
- * @param {Object} req - request data.
486
- * @returns {Promise} returns orderID of passed order ID and if modification was successful or not resolve or error message and error code on failure
487
- */
488
- modify_order = async (req) => {
489
- var funcname = 'modify_order'
490
- var logger = this.Logger
491
- let AuthrizationToken = this.AccessToken
492
- let vers = this.Version
493
- return new Promise(async function (resolve, reject) {
494
- try {
495
- var url = Config.SYNC_API + Config["orders_sync"]
496
- await axios.patch((url), req, {
497
- headers: {
498
- Authorization: AuthrizationToken,
499
- version: vers
500
- }
501
- })
502
- .then(Response => {
503
- logger.debug(`${funcname} response`, Response.data, funcname)
504
- resolve(Response.data)
505
- })
506
- }
507
- catch (e) {
508
- var err = new errorHandler(e).getError()
509
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
510
- reject(err)
511
- }
512
- })
513
- }
514
-
515
- /**
516
- * use to modify multiple placed orders which are not traded yet.
517
- * @param {Object[]} req - request data.
518
- * @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
519
- */
520
- modify_multi_order = async (req) => {
521
- var funcname = 'modify_multi_order'
522
- var logger = this.Logger
523
- let AuthrizationToken = this.AccessToken
524
- let vers = this.Version
525
- return new Promise(async function (resolve, reject) {
526
- try {
527
- var url = Config.SYNC_API + Config["multi_orders"]
528
- await axios.patch((url), req, {
529
- headers: {
530
- Authorization: AuthrizationToken,
531
- version: vers
532
- }
533
- })
534
- .then(Response => {
535
- logger.debug(`${funcname} response`, Response.data, funcname)
536
- resolve(Response.data)
537
- })
538
- }
539
- catch (e) {
540
- var err = new errorHandler(e).getError()
541
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
542
- reject(err)
543
- }
544
- })
545
- }
546
-
547
- /**
548
- * use to cancel placed orders which are not traded yet.
549
- * @param {Object} req - request data.
550
- * @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
551
- */
552
- cancel_order = async (req) => {
553
- var funcname = 'cancel_order'
554
- var logger = this.Logger
555
- let AuthrizationToken = this.AccessToken
556
- let vers = this.Version
557
- return new Promise(async function (resolve, reject) {
558
- try {
559
- var url = Config.SYNC_API + Config["orders_sync"]
560
- await axios.delete((url), {
561
- headers: {
562
- Authorization: AuthrizationToken,
563
- version: vers
564
- },
565
- data:req
566
- })
567
- .then(Response => {
568
- logger.debug(`${funcname} response`, Response.data, funcname)
569
- resolve(Response.data)
570
- })
571
- }
572
- catch (e) {
573
- var err = new errorHandler(e).getError()
574
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
575
- reject(err)
576
- }
577
- })
578
- }
579
-
580
- /**
581
- * use to cancel multiple placed orders which are not traded yet.
582
- * @param {Object[]} req - request data.
583
- * @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
584
- */
585
- cancel_multi_order = async (req) => {
586
- var funcname = 'cancel_multi_order'
587
- var logger = this.Logger
588
- let AuthrizationToken = this.AccessToken
589
- let vers = this.Version
590
- return new Promise(async function (resolve, reject) {
591
- try {
592
- var url = Config.SYNC_API + Config["multi_orders"]
593
- await axios.delete((url), {
594
- headers: {
595
- Authorization: AuthrizationToken,
596
- version: vers
597
- },
598
- data:req
599
- })
600
- .then(Response => {
601
- logger.debug(`${funcname} response`, Response.data, funcname)
602
- resolve(Response.data)
603
- })
604
- }
605
- catch (e) {
606
- var err = new errorHandler(e).getError()
607
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
608
- reject(err)
609
- }
610
- })
611
- }
612
-
613
- /**
614
- * use to exit all positions.
615
- * @param {Object} req - request data.
616
- * @returns {Promise} returns success message on resolve or error message and error code on failure
617
- */
618
- exit_position = async (req) => {
619
- var funcname = 'exit_position'
620
- var logger = this.Logger
621
- let AuthrizationToken = this.AccessToken
622
- let vers = this.Version
623
- return new Promise(async function (resolve, reject) {
624
- try {
625
- var url = Config.SYNC_API + Config["positions"]
626
- await axios.delete((url), {
627
- headers: {
628
- Authorization: AuthrizationToken,
629
- version: vers
630
- },
631
- data: req
632
- })
633
- .then(Response => {
634
- logger.debug(`${funcname} response`, Response.data, funcname)
635
- resolve(Response.data)
636
- })
637
- }
638
- catch (e) {
639
- var err = new errorHandler(e).getError()
640
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
641
- reject(err)
642
- }
643
- })
644
- }
645
-
646
- /**
647
- * use to convert open positions.
648
- * @param {Object} req - request data.
649
- * @returns {Promise} returns success message on resolve or error message and error code on failure
650
- */
651
- convert_position = async (req) => {
652
- var funcname = 'convert_position'
653
- var logger = this.Logger
654
- let AuthrizationToken = this.AccessToken
655
- let vers = this.Version
656
- return new Promise(async function (resolve, reject) {
657
- try {
658
- var url = Config.SYNC_API + Config["positions"]
659
- await axios.post((url), req, {
660
- headers: {
661
- Authorization: AuthrizationToken,
662
- version: vers
663
- }
664
- })
665
- .then(Response => {
666
- logger.debug(`${funcname} response`, Response.data, funcname)
667
- resolve(Response.data)
668
- })
669
- }
670
- catch (e) {
671
- var err = new errorHandler(e).getError()
672
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
673
- reject(err)
674
- }
675
- })
676
- }
677
-
678
- /**
679
- * use to get market status.
680
- * @returns {Promise} returns success message on resolve or error message and error code on failure
681
- */
682
- market_status = async (req) => {
683
- var funcname = 'market_status'
684
- var logger = this.Logger
685
- let AuthrizationToken = this.AccessToken
686
- let vers = this.Version
687
- return new Promise(async function (resolve, reject) {
688
- try {
689
- var url = Config.data_Api1 + Config["marketStatus"]
690
- const profile = await axios.get((url), {
691
- headers: {
692
- Authorization: AuthrizationToken,
693
- version: vers
694
- }
695
- })
696
- .then(Response => {
697
- logger.debug(`${funcname} response`, Response.data, funcname)
698
- resolve(Response.data)
699
- })
700
- }
701
- catch (e) {
702
- var err = new errorHandler(e).getError()
703
- logger.error(`${funcname} response`, err, funcname)
704
- reject(err)
705
- }
706
- })
707
- }
708
-
709
- /**
710
- * use to get historic data of symbol.
711
- * @param {Object} req - request data.
712
- * @returns {Promise} returns success message on resolve or error message and error code on failure
713
- */
714
- getHistory = async (req) => {
715
- var funcname = 'getHistory'
716
- var logger = this.Logger
717
- let AuthrizationToken = this.AccessToken
718
- let vers = this.Version
719
- return new Promise(async function (resolve, reject) {
720
- try {
721
- var url = Config.data_Api1 + Config["history"]
722
- url = generateUrl(url, req)
723
- await axios.get((url), {
724
- headers: {
725
- Authorization: AuthrizationToken,
726
- version: vers
727
- }
728
- })
729
- .then(Response => {
730
- logger.debug(`${funcname} response`, Response.data, funcname)
731
- resolve(Response.data)
732
- })
733
- }
734
- catch (e) {
735
- var err = new errorHandler(e).getError()
736
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
737
- reject(err)
738
- }
739
- })
740
- }
741
-
742
- /**
743
- * use to get quotes data of symbols.
744
- * @param {Array} req - array of symbols.
745
- * @returns {Promise} returns success message on resolve or error message and error code on failure
746
- */
747
- getQuotes = async (req) => {
748
- var funcname = 'getQuotes'
749
- var logger = this.Logger
750
- let AuthrizationToken = this.AccessToken
751
- let vers = this.Version
752
- return new Promise(async function (resolve, reject) {
753
- try {
754
- var url = Config.data_Api1 + Config["quotes"]
755
- var symbolstring = ""
756
- req.forEach(function (element) {
757
- symbolstring = symbolstring + element + ','
758
- })
759
- symbolstring = symbolstring.slice(0, -1)//remove last ','
760
- var data = { "symbols": symbolstring }
761
- const urlParams = new URLSearchParams(data);
762
- url = url + '?' + urlParams
763
- await axios.get((url), {
764
- headers: {
765
- Authorization: AuthrizationToken,
766
- version: vers
767
- }
768
- })
769
- .then(Response => {
770
- logger.debug(`${funcname} response`, Response.data, funcname)
771
- resolve(Response.data)
772
- })
773
- }
774
- catch (e) {
775
- var err = new errorHandler(e).getError()
776
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
777
- reject(err)
778
- }
779
- })
780
- }
781
-
782
- /**
783
- * use to get market depth data of symbols.
784
- * @param {Array} req - array of symbols.
785
- * @returns {Promise} returns success message on resolve or error message and error code on failure
786
- */
787
- getMarketDepth = async (req) => {
788
- var funcname = 'getQuotes'
789
- var logger = this.Logger
790
- let AuthrizationToken = this.AccessToken
791
- let vers = this.Version
792
- return new Promise(async function (resolve, reject) {
793
- try {
794
- var url = Config.data_Api1 + Config["market_depth"]
795
- var symbolstring = ""
796
- req.symbol.forEach(function (element) {
797
- symbolstring = symbolstring + element + ','
798
- })
799
- symbolstring = symbolstring.slice(0, -1)//remove last ','
800
- var data = { "symbol": symbolstring, "ohlcv_flag": req.ohlcv_flag }
801
- const urlParams = new URLSearchParams(data);
802
- url = url + '?' + urlParams
803
- await axios.get((url), {
804
- headers: {
805
- Authorization: AuthrizationToken,
806
- version: vers
807
- }
808
- })
809
- .then(Response => {
810
- logger.debug(`${funcname} response`, Response.data, funcname)
811
- resolve(Response.data)
812
- })
813
- }
814
- catch (e) {
815
- var err = new errorHandler(e).getError()
816
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
817
- reject(err)
818
- }
819
- })
820
- }
821
-
822
- /**
823
- * use to get option chain data of symbols.
824
- * @param {Object} req - symbol is mandatory, timestamp and strikecount is optional with default value of current expiry and 50 respectively
825
- * @returns {Promise} returns success message on resolve or error message and error code on failure
826
- */
827
- getOptionChain = async (req) => {
828
- var funcname = 'getOptionChain'
829
- var logger = this.Logger
830
- let AuthrizationToken = this.AccessToken
831
- let vers = this.Version
832
- return new Promise(async function (resolve, reject) {
833
- try {
834
- var url = Config.data_Api1 + Config["optionChain"]
835
- url = generateUrl(url, req)
836
- await axios.get((url), {
837
- headers: {
838
- Authorization: AuthrizationToken,
839
- version: vers
840
- }
841
- })
842
- .then(Response => {
843
- logger.debug(`${funcname} response`, Response.data, funcname)
844
- resolve(Response.data)
845
- })
846
- }
847
- catch (e) {
848
- var err = new errorHandler(e).getError()
849
- logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
850
- reject(err)
851
- }
852
- })
853
- }
854
- }
855
-
856
- function generateUrl(url, queryObject) {
857
- let finalUrl = url + "?"
858
- for (let key in queryObject) {
859
- finalUrl = finalUrl + key + "=" + queryObject[key] + "&"
860
- }
861
- return finalUrl.substring(0, finalUrl.length - 1);
862
- }
863
-
864
- function getSHA256Hash(inputString) {
865
- const hash = crypto.createHash('sha256');
866
- hash.update(inputString);
867
- return hash.digest('hex');
868
- }
869
- 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
+ /**
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 for a specific order ID.
292
+ * @param {Object} req - defines for what the callback function is.
293
+ * @param {string} req.order_id - orderID for which orderbook is required for.
294
+ * @returns {Promise} returns orderbook detail of passed order ID on resolve or error message and error code on failure
295
+ */
296
+ get_filtered_orders = async (req) => {
297
+ var funcname = 'get_filtered_orders'
298
+ var logger = this.Logger
299
+ let AuthrizationToken = this.AccessToken
300
+ let vers = this.Version
301
+ return new Promise(async function (resolve, reject) {
302
+ try {
303
+ var url = Config.SYNC_API + Config["orders"] + `?id=${req.order_id}`
304
+ await axios.get((url), {
305
+ headers: {
306
+ Authorization: AuthrizationToken,
307
+ version: vers
308
+ }
309
+ })
310
+ .then(Response => {
311
+ logger.debug(`${funcname} response`, Response.data, funcname)
312
+ resolve(Response.data)
313
+ })
314
+ }
315
+ catch (e) {
316
+ var err = new errorHandler(e).getError()
317
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
318
+ reject(err)
319
+ }
320
+ })
321
+ }
322
+
323
+ /**
324
+ * get positionbook to get position details.
325
+ * @returns {Promise} returns positionbook detail on resolve or error message and error code on failure
326
+ */
327
+ get_positions = async (req) => {
328
+ var funcname = 'get_positions'
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["positions"]
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`, err, funcname)
349
+ reject(err)
350
+ }
351
+ })
352
+ }
353
+
354
+ /**
355
+ * get tradebook to get trade details.
356
+ * @returns {Promise} returns tradebook detail on resolve or error message and error code on failure
357
+ */
358
+ get_tradebook = async (req) => {
359
+ var funcname = 'get_tradebook'
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["tradebook"]
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
+ * use to place order.
387
+ * @param {Object} req - request data.
388
+ * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
389
+ */
390
+ place_order = async (req) => {
391
+ var funcname = 'place_order'
392
+ var logger = this.Logger
393
+ let AuthrizationToken = this.AccessToken
394
+ let vers = this.Version
395
+ return new Promise(async function (resolve, reject) {
396
+ try {
397
+ var url = Config.SYNC_API + Config["orders_sync"]
398
+ await axios.post((url), req, {
399
+ headers: {
400
+ Authorization: AuthrizationToken,
401
+ version: vers
402
+ }
403
+ })
404
+ .then(Response => {
405
+ logger.debug(`${funcname} response`, Response.data, funcname)
406
+ resolve(Response.data)
407
+ })
408
+
409
+ }
410
+ catch (e) {
411
+ var err = new errorHandler(e).getError()
412
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
413
+ reject(err)
414
+ }
415
+ })
416
+ }
417
+
418
+ /**
419
+ * used to place multileg order.
420
+ * @param {Object} req - request data.
421
+ * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
422
+ */
423
+ place_multileg_order = async (req) => {
424
+ var funcname = 'place_multileg_order'
425
+ var logger = this.Logger
426
+ let AuthrizationToken = this.AccessToken
427
+ let vers = this.Version
428
+ return new Promise(async function (resolve, reject) {
429
+ try {
430
+ var url = Config.SYNC_API + Config["multileg_orders_sync"]
431
+ await axios.post((url), req, {
432
+ headers: {
433
+ Authorization: AuthrizationToken,
434
+ version: vers
435
+ }
436
+ })
437
+ .then(Response => {
438
+ logger.debug(`${funcname} response`, Response.data, funcname)
439
+ resolve(Response.data)
440
+ })
441
+
442
+ }
443
+ catch (e) {
444
+ var err = new errorHandler(e).getError()
445
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
446
+ reject(err)
447
+ }
448
+ })
449
+ }
450
+
451
+ /**
452
+ * use to place multiple order.
453
+ * @param {Object[]} req - request data.
454
+ * @returns {Promise} returns orderID of all placed and if they are failed or successful on resolve or error message and error code on failure
455
+ */
456
+ place_multi_order = async (req) => {
457
+ var funcname = 'place_multi_order'
458
+ var logger = this.Logger
459
+ let AuthrizationToken = this.AccessToken
460
+ let vers = this.Version
461
+ return new Promise(async function (resolve, reject) {
462
+ try {
463
+ var url = Config.SYNC_API + Config["multi_orders"]
464
+ await axios.post((url), req, {
465
+ headers: {
466
+ Authorization: AuthrizationToken,
467
+ version: vers
468
+ }
469
+ })
470
+ .then(Response => {
471
+ logger.debug(`${funcname} response`, Response.data, funcname)
472
+ resolve(Response.data)
473
+ })
474
+ }
475
+ catch (e) {
476
+ var err = new errorHandler(e).getError()
477
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
478
+ reject(err)
479
+ }
480
+ })
481
+ }
482
+
483
+ /**
484
+ * use to modify placed orders which are not traded yet.
485
+ * @param {Object} req - request data.
486
+ * @returns {Promise} returns orderID of passed order ID and if modification was successful or not resolve or error message and error code on failure
487
+ */
488
+ modify_order = async (req) => {
489
+ var funcname = 'modify_order'
490
+ var logger = this.Logger
491
+ let AuthrizationToken = this.AccessToken
492
+ let vers = this.Version
493
+ return new Promise(async function (resolve, reject) {
494
+ try {
495
+ var url = Config.SYNC_API + Config["orders_sync"]
496
+ await axios.patch((url), req, {
497
+ headers: {
498
+ Authorization: AuthrizationToken,
499
+ version: vers
500
+ }
501
+ })
502
+ .then(Response => {
503
+ logger.debug(`${funcname} response`, Response.data, funcname)
504
+ resolve(Response.data)
505
+ })
506
+ }
507
+ catch (e) {
508
+ var err = new errorHandler(e).getError()
509
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
510
+ reject(err)
511
+ }
512
+ })
513
+ }
514
+
515
+ /**
516
+ * use to modify multiple placed orders which are not traded yet.
517
+ * @param {Object[]} req - request data.
518
+ * @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
519
+ */
520
+ modify_multi_order = async (req) => {
521
+ var funcname = 'modify_multi_order'
522
+ var logger = this.Logger
523
+ let AuthrizationToken = this.AccessToken
524
+ let vers = this.Version
525
+ return new Promise(async function (resolve, reject) {
526
+ try {
527
+ var url = Config.SYNC_API + Config["multi_orders"]
528
+ await axios.patch((url), req, {
529
+ headers: {
530
+ Authorization: AuthrizationToken,
531
+ version: vers
532
+ }
533
+ })
534
+ .then(Response => {
535
+ logger.debug(`${funcname} response`, Response.data, funcname)
536
+ resolve(Response.data)
537
+ })
538
+ }
539
+ catch (e) {
540
+ var err = new errorHandler(e).getError()
541
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
542
+ reject(err)
543
+ }
544
+ })
545
+ }
546
+
547
+ /**
548
+ * use to cancel placed orders which are not traded yet.
549
+ * @param {Object} req - request data.
550
+ * @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
551
+ */
552
+ cancel_order = async (req) => {
553
+ var funcname = 'cancel_order'
554
+ var logger = this.Logger
555
+ let AuthrizationToken = this.AccessToken
556
+ let vers = this.Version
557
+ return new Promise(async function (resolve, reject) {
558
+ try {
559
+ var url = Config.SYNC_API + Config["orders_sync"]
560
+ await axios.delete((url), {
561
+ headers: {
562
+ Authorization: AuthrizationToken,
563
+ version: vers
564
+ },
565
+ data:req
566
+ })
567
+ .then(Response => {
568
+ logger.debug(`${funcname} response`, Response.data, funcname)
569
+ resolve(Response.data)
570
+ })
571
+ }
572
+ catch (e) {
573
+ var err = new errorHandler(e).getError()
574
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
575
+ reject(err)
576
+ }
577
+ })
578
+ }
579
+
580
+ /**
581
+ * use to cancel multiple placed orders which are not traded yet.
582
+ * @param {Object[]} req - request data.
583
+ * @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
584
+ */
585
+ cancel_multi_order = async (req) => {
586
+ var funcname = 'cancel_multi_order'
587
+ var logger = this.Logger
588
+ let AuthrizationToken = this.AccessToken
589
+ let vers = this.Version
590
+ return new Promise(async function (resolve, reject) {
591
+ try {
592
+ var url = Config.SYNC_API + Config["multi_orders"]
593
+ await axios.delete((url), {
594
+ headers: {
595
+ Authorization: AuthrizationToken,
596
+ version: vers
597
+ },
598
+ data:req
599
+ })
600
+ .then(Response => {
601
+ logger.debug(`${funcname} response`, Response.data, funcname)
602
+ resolve(Response.data)
603
+ })
604
+ }
605
+ catch (e) {
606
+ var err = new errorHandler(e).getError()
607
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
608
+ reject(err)
609
+ }
610
+ })
611
+ }
612
+
613
+ /**
614
+ * use to exit all positions.
615
+ * @param {Object} req - request data.
616
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
617
+ */
618
+ exit_position = async (req) => {
619
+ var funcname = 'exit_position'
620
+ var logger = this.Logger
621
+ let AuthrizationToken = this.AccessToken
622
+ let vers = this.Version
623
+ return new Promise(async function (resolve, reject) {
624
+ try {
625
+ var url = Config.SYNC_API + Config["positions"]
626
+ await axios.delete((url), {
627
+ headers: {
628
+ Authorization: AuthrizationToken,
629
+ version: vers
630
+ },
631
+ data: req
632
+ })
633
+ .then(Response => {
634
+ logger.debug(`${funcname} response`, Response.data, funcname)
635
+ resolve(Response.data)
636
+ })
637
+ }
638
+ catch (e) {
639
+ var err = new errorHandler(e).getError()
640
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
641
+ reject(err)
642
+ }
643
+ })
644
+ }
645
+
646
+ /**
647
+ * use to convert open positions.
648
+ * @param {Object} req - request data.
649
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
650
+ */
651
+ convert_position = async (req) => {
652
+ var funcname = 'convert_position'
653
+ var logger = this.Logger
654
+ let AuthrizationToken = this.AccessToken
655
+ let vers = this.Version
656
+ return new Promise(async function (resolve, reject) {
657
+ try {
658
+ var url = Config.SYNC_API + Config["positions"]
659
+ await axios.post((url), req, {
660
+ headers: {
661
+ Authorization: AuthrizationToken,
662
+ version: vers
663
+ }
664
+ })
665
+ .then(Response => {
666
+ logger.debug(`${funcname} response`, Response.data, funcname)
667
+ resolve(Response.data)
668
+ })
669
+ }
670
+ catch (e) {
671
+ var err = new errorHandler(e).getError()
672
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
673
+ reject(err)
674
+ }
675
+ })
676
+ }
677
+
678
+ /**
679
+ * use to get market status.
680
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
681
+ */
682
+ market_status = async (req) => {
683
+ var funcname = 'market_status'
684
+ var logger = this.Logger
685
+ let AuthrizationToken = this.AccessToken
686
+ let vers = this.Version
687
+ return new Promise(async function (resolve, reject) {
688
+ try {
689
+ var url = Config.data_Api1 + Config["marketStatus"]
690
+ const profile = await axios.get((url), {
691
+ headers: {
692
+ Authorization: AuthrizationToken,
693
+ version: vers
694
+ }
695
+ })
696
+ .then(Response => {
697
+ logger.debug(`${funcname} response`, Response.data, funcname)
698
+ resolve(Response.data)
699
+ })
700
+ }
701
+ catch (e) {
702
+ var err = new errorHandler(e).getError()
703
+ logger.error(`${funcname} response`, err, funcname)
704
+ reject(err)
705
+ }
706
+ })
707
+ }
708
+
709
+ /**
710
+ * use to get historic data of symbol.
711
+ * @param {Object} req - request data.
712
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
713
+ */
714
+ getHistory = async (req) => {
715
+ var funcname = 'getHistory'
716
+ var logger = this.Logger
717
+ let AuthrizationToken = this.AccessToken
718
+ let vers = this.Version
719
+ return new Promise(async function (resolve, reject) {
720
+ try {
721
+ var url = Config.data_Api1 + Config["history"]
722
+ url = generateUrl(url, req)
723
+ await axios.get((url), {
724
+ headers: {
725
+ Authorization: AuthrizationToken,
726
+ version: vers
727
+ }
728
+ })
729
+ .then(Response => {
730
+ logger.debug(`${funcname} response`, Response.data, funcname)
731
+ resolve(Response.data)
732
+ })
733
+ }
734
+ catch (e) {
735
+ var err = new errorHandler(e).getError()
736
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
737
+ reject(err)
738
+ }
739
+ })
740
+ }
741
+
742
+ /**
743
+ * use to get quotes data of symbols.
744
+ * @param {Array} req - array of symbols.
745
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
746
+ */
747
+ getQuotes = async (req) => {
748
+ var funcname = 'getQuotes'
749
+ var logger = this.Logger
750
+ let AuthrizationToken = this.AccessToken
751
+ let vers = this.Version
752
+ return new Promise(async function (resolve, reject) {
753
+ try {
754
+ var url = Config.data_Api1 + Config["quotes"]
755
+ var symbolstring = ""
756
+ req.forEach(function (element) {
757
+ symbolstring = symbolstring + element + ','
758
+ })
759
+ symbolstring = symbolstring.slice(0, -1)//remove last ','
760
+ var data = { "symbols": symbolstring }
761
+ const urlParams = new URLSearchParams(data);
762
+ url = url + '?' + urlParams
763
+ await axios.get((url), {
764
+ headers: {
765
+ Authorization: AuthrizationToken,
766
+ version: vers
767
+ }
768
+ })
769
+ .then(Response => {
770
+ logger.debug(`${funcname} response`, Response.data, funcname)
771
+ resolve(Response.data)
772
+ })
773
+ }
774
+ catch (e) {
775
+ var err = new errorHandler(e).getError()
776
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
777
+ reject(err)
778
+ }
779
+ })
780
+ }
781
+
782
+ /**
783
+ * use to get market depth data of symbols.
784
+ * @param {Array} req - array of symbols.
785
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
786
+ */
787
+ getMarketDepth = async (req) => {
788
+ var funcname = 'getQuotes'
789
+ var logger = this.Logger
790
+ let AuthrizationToken = this.AccessToken
791
+ let vers = this.Version
792
+ return new Promise(async function (resolve, reject) {
793
+ try {
794
+ var url = Config.data_Api1 + Config["market_depth"]
795
+ var symbolstring = ""
796
+ req.symbol.forEach(function (element) {
797
+ symbolstring = symbolstring + element + ','
798
+ })
799
+ symbolstring = symbolstring.slice(0, -1)//remove last ','
800
+ var data = { "symbol": symbolstring, "ohlcv_flag": req.ohlcv_flag }
801
+ const urlParams = new URLSearchParams(data);
802
+ url = url + '?' + urlParams
803
+ await axios.get((url), {
804
+ headers: {
805
+ Authorization: AuthrizationToken,
806
+ version: vers
807
+ }
808
+ })
809
+ .then(Response => {
810
+ logger.debug(`${funcname} response`, Response.data, funcname)
811
+ resolve(Response.data)
812
+ })
813
+ }
814
+ catch (e) {
815
+ var err = new errorHandler(e).getError()
816
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
817
+ reject(err)
818
+ }
819
+ })
820
+ }
821
+
822
+ /**
823
+ * use to get option chain data of symbols.
824
+ * @param {Object} req - symbol is mandatory, timestamp and strikecount is optional with default value of current expiry and 50 respectively
825
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
826
+ */
827
+ getOptionChain = async (req) => {
828
+ var funcname = 'getOptionChain'
829
+ var logger = this.Logger
830
+ let AuthrizationToken = this.AccessToken
831
+ let vers = this.Version
832
+ return new Promise(async function (resolve, reject) {
833
+ try {
834
+ var url = Config.data_Api1 + Config["optionChain"]
835
+ url = generateUrl(url, req)
836
+ await axios.get((url), {
837
+ headers: {
838
+ Authorization: AuthrizationToken,
839
+ version: vers
840
+ }
841
+ })
842
+ .then(Response => {
843
+ logger.debug(`${funcname} response`, Response.data, funcname)
844
+ resolve(Response.data)
845
+ })
846
+ }
847
+ catch (e) {
848
+ var err = new errorHandler(e).getError()
849
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
850
+ reject(err)
851
+ }
852
+ })
853
+ }
854
+ }
855
+
856
+ function generateUrl(url, queryObject) {
857
+ let finalUrl = url + "?";
858
+ for (let key in queryObject) {
859
+ finalUrl += encodeURIComponent(key) + "=" + encodeURIComponent(queryObject[key]) + "&";
860
+ }
861
+ return finalUrl.slice(0, -1); // Remove the trailing "&"
862
+ }
863
+
864
+ function getSHA256Hash(inputString) {
865
+ const hash = crypto.createHash('sha256');
866
+ hash.update(inputString);
867
+ return hash.digest('hex');
868
+ }
869
+ module.exports = FyersApi;