fyers-api-v3 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,794 @@
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 {string} [params.Version="2.0"] - the version of API you want your output format in.
21
+ */
22
+ constructor(params) {
23
+ var self = this;
24
+
25
+ /**
26
+ * AccessToken of user.
27
+ * @type {String}
28
+ */
29
+ self.AccessToken = params?.AccessToken ?? null;;
30
+
31
+ /**
32
+ * RedirectURL of provided by user.
33
+ * @type {String}
34
+ */
35
+ self.RedirectURL = params?.RedirectURL ?? null;
36
+
37
+ /**
38
+ * APPID provided by user.
39
+ * @type {String}
40
+ */
41
+ self.AppID = params?.AppID ?? null;
42
+ /**
43
+ * API version provided by client.
44
+ * @type {String}
45
+ */
46
+ self.Version = params?.Version ?? "2.0";
47
+
48
+ /**
49
+ * filepath where are logs are to be saved.
50
+ * @type {string}
51
+ */
52
+ self.LogPath = params?.path ?? undefined;
53
+
54
+ /**
55
+ * object used to write logs.
56
+ * @type {Logger}
57
+ */
58
+ self.Logger = new Logger(this.LogPath)
59
+ }
60
+
61
+ /**
62
+ * sets the APPID.
63
+ * @param {string} req - APPID in format xxxxxx-xxx.
64
+ */
65
+ setAppId = function (req) {
66
+ this.AppID = req
67
+ }
68
+
69
+ /**
70
+ * sets the RedirectURL.
71
+ * @param {string} req - pass redirect URL set during creation of APP.
72
+ */
73
+ setRedirectUrl = function (req) {
74
+ this.RedirectURL = req
75
+ }
76
+
77
+ /**
78
+ * sets the AccessToken.
79
+ * @param {string} req - pass Access token.
80
+ */
81
+ setAccessToken = function (req) {
82
+ if (this.AppID == null) {
83
+ console.log("Please set APPID using setAppId function")
84
+ }
85
+ else {
86
+ this.AccessToken = this.AppID + ":" + req
87
+ }
88
+ }
89
+
90
+ /**
91
+ * get generate-authcode URL to login and generate authcode.
92
+ * @param {Object} req - defines for what the callback function is.
93
+ * @param {string} req.client_id - AppID of user.
94
+ * @param {string} req.redirect_uri - RedirectURL provided by user.
95
+ * @param {string} [req.state] - state value.
96
+ * @returns {string} generate authcode url
97
+ */
98
+ generateAuthCode = function (req) {
99
+ var funcname = 'generateAuthCode'
100
+ var logger = this.Logger
101
+ const client_id = (req && req.client_id) || this.AppID;
102
+ const redirect_uri = (req && req.redirect_uri) || this.RedirectURL;
103
+ const state = (req && req.state) || "sample_state";
104
+ logger.debug('generate authcode response', `${Config.API}generate-authcode?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=code&state=${state}`, funcname);
105
+ return `${Config.SYNC_API}/generate-authcode?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=code&state=${state}`
106
+ }
107
+
108
+ /**
109
+ * generate access token to use the API's.
110
+ * @param {Object} req - defines for what the callback function is.
111
+ * @param {string} req.client_id - AppID of user.
112
+ * @param {string} req.secret_key - App Secret of user.
113
+ * @param {string} req.auth_code - authcode generated after use of generateAuthCode and login.
114
+ * @param {string} [req.code_verifier] - code verifier.
115
+ * @returns {Object} Object with access token and refresh token if successful
116
+ */
117
+ generate_access_token = async (req) => {
118
+ var funcname = 'generateAuthCode'
119
+ var logger = this.Logger
120
+ const code_verifier = req.code_verifier || "";
121
+ const auth_code = req.auth_code || "";
122
+ const client_id = req.client_id || this.AppID;
123
+ const secret_key = req.secret_key || "";
124
+ const sha256 = getSHA256Hash(`${client_id}:${secret_key}`)
125
+ 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)
126
+ try {
127
+
128
+ if (code_verifier === "") {
129
+
130
+ const access_token = await axios.post(`${Config.SYNC_API}/validate-authcode`, {
131
+ grant_type: "authorization_code",
132
+ code: req.auth_code,
133
+ appIdHash: sha256
134
+
135
+ })
136
+ return access_token.data;
137
+ }
138
+ else {
139
+
140
+ const access_token = await axios.post(`${Config.API}/validate-authcode`, {
141
+ grant_type: "authorization_code",
142
+ code_verifier: req.code_verifier,
143
+ code: req.auth_code,
144
+
145
+
146
+ })
147
+ return access_token.data;
148
+ }
149
+
150
+ }
151
+ catch (e) {
152
+ var err = new errorHandler(e).getError()
153
+ logger.error("error generating access token", err, funcname)
154
+ return err
155
+ }
156
+ }
157
+
158
+ /**
159
+ * get profile data.
160
+ * @returns {Promise} returns profile data on resolve or error message and error code on failure
161
+ */
162
+ get_profile = async (req) => {
163
+ var funcname = 'get_profile'
164
+ var logger = this.Logger
165
+ let AuthrizationToken = this.AccessToken
166
+ let vers = this.Version
167
+ return new Promise(async function (resolve, reject) {
168
+ try {
169
+ var url = Config.SYNC_API + Config["get_profile"]
170
+ await axios.get((url), {
171
+ headers: {
172
+ Authorization: AuthrizationToken,
173
+ version: vers
174
+ }
175
+ })
176
+ .then(Response => {
177
+ logger.debug(`${funcname} response`, Response.data, funcname)
178
+ resolve(Response.data)
179
+ })
180
+ }
181
+ catch (e) {
182
+ var err = new errorHandler(e).getError()
183
+ logger.error(`${funcname} response`, err, funcname)
184
+ reject(err)
185
+ }
186
+ })
187
+ }
188
+
189
+ /**
190
+ * get funds detail.
191
+ * @returns {Promise} returns funds detail on resolve or error message and error code on failure
192
+ */
193
+ get_funds = async (req) => {
194
+ var funcname = 'get_funds'
195
+ var logger = this.Logger
196
+ let AuthrizationToken = this.AccessToken
197
+ let vers = this.Version
198
+ return new Promise(async function (resolve, reject) {
199
+ try {
200
+ var url = Config.SYNC_API + Config["funds"]
201
+ await axios.get((url), {
202
+ headers: {
203
+ Authorization: AuthrizationToken,
204
+ version: vers
205
+ }
206
+ })
207
+ .then(Response => {
208
+ logger.debug(`${funcname} response`, Response.data, funcname)
209
+ resolve(Response.data)
210
+ })
211
+ }
212
+ catch (e) {
213
+ var err = new errorHandler(e).getError()
214
+ logger.error(`${funcname} response`, err, funcname)
215
+ reject(err)
216
+ }
217
+ })
218
+ }
219
+
220
+ /**
221
+ * get holdings detail.
222
+ * @returns {Promise} returns holdings detail on resolve or error message and error code on failure
223
+ */
224
+ get_holdings = async (req) => {
225
+ var funcname = 'get_holdings'
226
+ var logger = this.Logger
227
+ let AuthrizationToken = this.AccessToken
228
+ let vers = this.Version
229
+ return new Promise(async function (resolve, reject) {
230
+ try {
231
+ var url = Config.SYNC_API + Config["holdings"]
232
+ await axios.get((url), {
233
+ headers: {
234
+ Authorization: AuthrizationToken,
235
+ version: vers
236
+ }
237
+ })
238
+ .then(Response => {
239
+ logger.debug(`${funcname} response`, Response.data, funcname)
240
+ resolve(Response.data)
241
+ })
242
+ }
243
+ catch (e) {
244
+ var err = new errorHandler(e).getError()
245
+ logger.error(`${funcname} response`, err, funcname)
246
+ reject(err)
247
+ }
248
+ })
249
+ }
250
+
251
+
252
+ /**
253
+ * get orderbook to get order details of order placed on current day.
254
+ * @returns {Promise} returns orderbook detail on resolve or error message and error code on failure
255
+ */
256
+ get_orders = async (req) => {
257
+ var funcname = 'get_orders'
258
+ var logger = this.Logger
259
+ let AuthrizationToken = this.AccessToken
260
+ let vers = this.Version
261
+ return new Promise(async function (resolve, reject) {
262
+ try {
263
+ var url = Config.SYNC_API + Config["orders"]
264
+ await axios.get((url), {
265
+ headers: {
266
+ Authorization: AuthrizationToken,
267
+ version: vers
268
+ }
269
+ })
270
+ .then(Response => {
271
+ logger.debug(`${funcname} response`, Response.data, funcname)
272
+ resolve(Response.data)
273
+ })
274
+ }
275
+ catch (e) {
276
+ var err = new errorHandler(e).getError()
277
+ logger.error(`${funcname} response`, err, funcname)
278
+ reject(err)
279
+ }
280
+ })
281
+ }
282
+
283
+ /**
284
+ * get orderbook for a specific order ID.
285
+ * @param {Object} req - defines for what the callback function is.
286
+ * @param {string} req.order_id - orderID for which orderbook is required for.
287
+ * @returns {Promise} returns orderbook detail of passed order ID on resolve or error message and error code on failure
288
+ */
289
+ get_filtered_orders = async (req) => {
290
+ var funcname = 'get_filtered_orders'
291
+ var logger = this.Logger
292
+ let AuthrizationToken = this.AccessToken
293
+ let vers = this.Version
294
+ return new Promise(async function (resolve, reject) {
295
+ try {
296
+ var url = Config.SYNC_API + Config["orders"] + `?id=${req.order_id}`
297
+ await axios.get((url), {
298
+ headers: {
299
+ Authorization: AuthrizationToken,
300
+ version: vers
301
+ }
302
+ })
303
+ .then(Response => {
304
+ logger.debug(`${funcname} response`, Response.data, funcname)
305
+ resolve(Response.data)
306
+ })
307
+ }
308
+ catch (e) {
309
+ var err = new errorHandler(e).getError()
310
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
311
+ reject(err)
312
+ }
313
+ })
314
+ }
315
+
316
+ /**
317
+ * get positionbook to get position details.
318
+ * @returns {Promise} returns positionbook detail on resolve or error message and error code on failure
319
+ */
320
+ get_positions = async (req) => {
321
+ var funcname = 'get_positions'
322
+ var logger = this.Logger
323
+ let AuthrizationToken = this.AccessToken
324
+ let vers = this.Version
325
+ return new Promise(async function (resolve, reject) {
326
+ try {
327
+ var url = Config.SYNC_API + Config["positions"]
328
+ await axios.get((url), {
329
+ headers: {
330
+ Authorization: AuthrizationToken,
331
+ version: vers
332
+ }
333
+ })
334
+ .then(Response => {
335
+ logger.debug(`${funcname} response`, Response.data, funcname)
336
+ resolve(Response.data)
337
+ })
338
+ }
339
+ catch (e) {
340
+ var err = new errorHandler(e).getError()
341
+ logger.error(`${funcname} response`, err, funcname)
342
+ reject(err)
343
+ }
344
+ })
345
+ }
346
+
347
+ /**
348
+ * get tradebook to get trade details.
349
+ * @returns {Promise} returns tradebook detail on resolve or error message and error code on failure
350
+ */
351
+ get_tradebook = async (req) => {
352
+ var funcname = 'get_tradebook'
353
+ var logger = this.Logger
354
+ let AuthrizationToken = this.AccessToken
355
+ let vers = this.Version
356
+ return new Promise(async function (resolve, reject) {
357
+ try {
358
+ var url = Config.SYNC_API + Config["tradebook"]
359
+ await axios.get((url), {
360
+ headers: {
361
+ Authorization: AuthrizationToken,
362
+ version: vers
363
+ }
364
+ })
365
+ .then(Response => {
366
+ logger.debug(`${funcname} response`, Response.data, funcname)
367
+ resolve(Response.data)
368
+ })
369
+ }
370
+ catch (e) {
371
+ var err = new errorHandler(e).getError()
372
+ logger.error(`${funcname} response`, err, funcname)
373
+ reject(err)
374
+ }
375
+ })
376
+ }
377
+
378
+ /**
379
+ * use to place order.
380
+ * @param {Object} req - request data.
381
+ * @returns {Promise} returns orderID of placed order on resolve or error message and error code on failure
382
+ */
383
+ place_order = async (req) => {
384
+ var funcname = 'place_order'
385
+ var logger = this.Logger
386
+ let AuthrizationToken = this.AccessToken
387
+ let vers = this.Version
388
+ return new Promise(async function (resolve, reject) {
389
+ try {
390
+ var url = Config.SYNC_API + Config["orders_sync"]
391
+ await axios.post((url), req, {
392
+ headers: {
393
+ Authorization: AuthrizationToken,
394
+ version: vers
395
+ }
396
+ })
397
+ .then(Response => {
398
+ logger.debug(`${funcname} response`, Response.data, funcname)
399
+ resolve(Response.data)
400
+ })
401
+
402
+ }
403
+ catch (e) {
404
+ var err = new errorHandler(e).getError()
405
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
406
+ reject(err)
407
+ }
408
+ })
409
+ }
410
+
411
+ /**
412
+ * use to place multiple order.
413
+ * @param {Object[]} req - request data.
414
+ * @returns {Promise} returns orderID of all placed and if they are failed or successful on resolve or error message and error code on failure
415
+ */
416
+ place_multi_order = async (req) => {
417
+ var funcname = 'place_multi_order'
418
+ var logger = this.Logger
419
+ let AuthrizationToken = this.AccessToken
420
+ let vers = this.Version
421
+ return new Promise(async function (resolve, reject) {
422
+ try {
423
+ var url = Config.SYNC_API + Config["multi_orders"]
424
+ await axios.post((url), req, {
425
+ headers: {
426
+ Authorization: AuthrizationToken,
427
+ version: vers
428
+ }
429
+ })
430
+ .then(Response => {
431
+ logger.debug(`${funcname} response`, Response.data, funcname)
432
+ resolve(Response.data)
433
+ })
434
+ }
435
+ catch (e) {
436
+ var err = new errorHandler(e).getError()
437
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
438
+ reject(err)
439
+ }
440
+ })
441
+ }
442
+
443
+ /**
444
+ * use to modify placed orders which are not traded yet.
445
+ * @param {Object} req - request data.
446
+ * @returns {Promise} returns orderID of passed order ID and if modification was successful or not resolve or error message and error code on failure
447
+ */
448
+ modify_order = async (req) => {
449
+ var funcname = 'modify_order'
450
+ var logger = this.Logger
451
+ let AuthrizationToken = this.AccessToken
452
+ let vers = this.Version
453
+ return new Promise(async function (resolve, reject) {
454
+ try {
455
+ var url = Config.SYNC_API + Config["orders_sync"]
456
+ await axios.patch((url), req, {
457
+ headers: {
458
+ Authorization: AuthrizationToken,
459
+ version: vers
460
+ }
461
+ })
462
+ .then(Response => {
463
+ logger.debug(`${funcname} response`, Response.data, funcname)
464
+ resolve(Response.data)
465
+ })
466
+ }
467
+ catch (e) {
468
+ var err = new errorHandler(e).getError()
469
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
470
+ reject(err)
471
+ }
472
+ })
473
+ }
474
+
475
+ /**
476
+ * use to modify multiple placed orders which are not traded yet.
477
+ * @param {Object[]} req - request data.
478
+ * @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
479
+ */
480
+ modify_multi_order = async (req) => {
481
+ var funcname = 'modify_multi_order'
482
+ var logger = this.Logger
483
+ let AuthrizationToken = this.AccessToken
484
+ let vers = this.Version
485
+ return new Promise(async function (resolve, reject) {
486
+ try {
487
+ var url = Config.SYNC_API + Config["multi_orders"]
488
+ await axios.patch((url), req, {
489
+ headers: {
490
+ Authorization: AuthrizationToken,
491
+ version: vers
492
+ }
493
+ })
494
+ .then(Response => {
495
+ logger.debug(`${funcname} response`, Response.data, funcname)
496
+ resolve(Response.data)
497
+ })
498
+ }
499
+ catch (e) {
500
+ var err = new errorHandler(e).getError()
501
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
502
+ reject(err)
503
+ }
504
+ })
505
+ }
506
+
507
+ /**
508
+ * use to cancel placed orders which are not traded yet.
509
+ * @param {Object} req - request data.
510
+ * @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
511
+ */
512
+ cancel_order = async (req) => {
513
+ var funcname = 'cancel_order'
514
+ var logger = this.Logger
515
+ let AuthrizationToken = this.AccessToken
516
+ let vers = this.Version
517
+ return new Promise(async function (resolve, reject) {
518
+ try {
519
+ var url = Config.SYNC_API + Config["orders_sync"]
520
+ await axios.delete((url), req, {
521
+ headers: {
522
+ Authorization: AuthrizationToken,
523
+ version: vers
524
+ }
525
+ })
526
+ .then(Response => {
527
+ logger.debug(`${funcname} response`, Response.data, funcname)
528
+ resolve(Response.data)
529
+ })
530
+ }
531
+ catch (e) {
532
+ var err = new errorHandler(e).getError()
533
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
534
+ reject(err)
535
+ }
536
+ })
537
+ }
538
+
539
+ /**
540
+ * use to cancel multiple placed orders which are not traded yet.
541
+ * @param {Object[]} req - request data.
542
+ * @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
543
+ */
544
+ cancel_multi_order = async (req) => {
545
+ var funcname = 'cancel_multi_order'
546
+ var logger = this.Logger
547
+ let AuthrizationToken = this.AccessToken
548
+ let vers = this.Version
549
+ return new Promise(async function (resolve, reject) {
550
+ try {
551
+ var url = Config.SYNC_API + Config["multi_orders"]
552
+ await axios.delete((url), req, {
553
+ headers: {
554
+ Authorization: AuthrizationToken,
555
+ version: vers
556
+ }
557
+ })
558
+ .then(Response => {
559
+ logger.debug(`${funcname} response`, Response.data, funcname)
560
+ resolve(Response.data)
561
+ })
562
+ }
563
+ catch (e) {
564
+ var err = new errorHandler(e).getError()
565
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
566
+ reject(err)
567
+ }
568
+ })
569
+ }
570
+
571
+ /**
572
+ * use to exit all positions.
573
+ * @param {Object} req - request data.
574
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
575
+ */
576
+ exit_position = async (req) => {
577
+ var funcname = 'exit_position'
578
+ var logger = this.Logger
579
+ let AuthrizationToken = this.AccessToken
580
+ let vers = this.Version
581
+ return new Promise(async function (resolve, reject) {
582
+ try {
583
+ var url = Config.SYNC_API + Config["positions"]
584
+ await axios.delete((url), {
585
+ headers: {
586
+ Authorization: AuthrizationToken,
587
+ version: vers
588
+ },
589
+ data: req
590
+ })
591
+ .then(Response => {
592
+ logger.debug(`${funcname} response`, Response.data, funcname)
593
+ resolve(Response.data)
594
+ })
595
+ }
596
+ catch (e) {
597
+ var err = new errorHandler(e).getError()
598
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
599
+ reject(err)
600
+ }
601
+ })
602
+ }
603
+
604
+ /**
605
+ * use to convert open positions.
606
+ * @param {Object} req - request data.
607
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
608
+ */
609
+ convert_position = async (req) => {
610
+ var funcname = 'convert_position'
611
+ var logger = this.Logger
612
+ let AuthrizationToken = this.AccessToken
613
+ let vers = this.Version
614
+ return new Promise(async function (resolve, reject) {
615
+ try {
616
+ var url = Config.SYNC_API + Config["positions"]
617
+ await axios.post((url), req, {
618
+ headers: {
619
+ Authorization: AuthrizationToken,
620
+ version: vers
621
+ }
622
+ })
623
+ .then(Response => {
624
+ logger.debug(`${funcname} response`, Response.data, funcname)
625
+ resolve(Response.data)
626
+ })
627
+ }
628
+ catch (e) {
629
+ var err = new errorHandler(e).getError()
630
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
631
+ reject(err)
632
+ }
633
+ })
634
+ }
635
+
636
+ /**
637
+ * use to get market status.
638
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
639
+ */
640
+ market_status = async (req) => {
641
+ var funcname = 'market_status'
642
+ var logger = this.Logger
643
+ let AuthrizationToken = this.AccessToken
644
+ let vers = this.Version
645
+ return new Promise(async function (resolve, reject) {
646
+ try {
647
+ var url = Config.data_Api1 + Config["marketStatus"]
648
+ const profile = await axios.get((url), {
649
+ headers: {
650
+ Authorization: AuthrizationToken,
651
+ version: vers
652
+ }
653
+ })
654
+ .then(Response => {
655
+ logger.debug(`${funcname} response`, Response.data, funcname)
656
+ resolve(Response.data)
657
+ })
658
+ }
659
+ catch (e) {
660
+ var err = new errorHandler(e).getError()
661
+ logger.error(`${funcname} response`, err, funcname)
662
+ reject(err)
663
+ }
664
+ })
665
+ }
666
+
667
+ /**
668
+ * use to get historic data of symbol.
669
+ * @param {Object} req - request data.
670
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
671
+ */
672
+ getHistory = async (req) => {
673
+ var funcname = 'getHistory'
674
+ var logger = this.Logger
675
+ let AuthrizationToken = this.AccessToken
676
+ let vers = this.Version
677
+ return new Promise(async function (resolve, reject) {
678
+ try {
679
+ var url = Config.data_Api1 + Config["history"]
680
+ url = generateUrl(url, req)
681
+ await axios.get((url), {
682
+ headers: {
683
+ Authorization: AuthrizationToken,
684
+ version: vers
685
+ }
686
+ })
687
+ .then(Response => {
688
+ logger.debug(`${funcname} response`, Response.data, funcname)
689
+ resolve(Response.data)
690
+ })
691
+ }
692
+ catch (e) {
693
+ var err = new errorHandler(e).getError()
694
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
695
+ reject(err)
696
+ }
697
+ })
698
+ }
699
+
700
+ /**
701
+ * use to get quotes data of symbols.
702
+ * @param {Array} req - array of symbols.
703
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
704
+ */
705
+ getQuotes = async (req) => {
706
+ var funcname = 'getQuotes'
707
+ var logger = this.Logger
708
+ let AuthrizationToken = this.AccessToken
709
+ let vers = this.Version
710
+ return new Promise(async function (resolve, reject) {
711
+ try {
712
+ var url = Config.data_Api1 + Config["quotes"]
713
+ var symbolstring = ""
714
+ req.forEach(function (element) {
715
+ symbolstring = symbolstring + element + ','
716
+ })
717
+ symbolstring = symbolstring.slice(0, -1)//remove last ','
718
+ var data = { "symbols": symbolstring }
719
+ const urlParams = new URLSearchParams(data);
720
+ url = url + '?' + urlParams
721
+ await axios.get((url), {
722
+ headers: {
723
+ Authorization: AuthrizationToken,
724
+ version: vers
725
+ }
726
+ })
727
+ .then(Response => {
728
+ logger.debug(`${funcname} response`, Response.data, funcname)
729
+ resolve(Response.data)
730
+ })
731
+ }
732
+ catch (e) {
733
+ var err = new errorHandler(e).getError()
734
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
735
+ reject(err)
736
+ }
737
+ })
738
+ }
739
+
740
+ /**
741
+ * use to get market depth data of symbols.
742
+ * @param {Array} req - array of symbols.
743
+ * @returns {Promise} returns success message on resolve or error message and error code on failure
744
+ */
745
+ getMarketDepth = async (req) => {
746
+ var funcname = 'getQuotes'
747
+ var logger = this.Logger
748
+ let AuthrizationToken = this.AccessToken
749
+ let vers = this.Version
750
+ return new Promise(async function (resolve, reject) {
751
+ try {
752
+ var url = Config.data_Api1 + Config["market_depth"]
753
+ var symbolstring = ""
754
+ req.symbol.forEach(function (element) {
755
+ symbolstring = symbolstring + element + ','
756
+ })
757
+ symbolstring = symbolstring.slice(0, -1)//remove last ','
758
+ var data = { "symbol": symbolstring, "ohlcv_flag": req.ohlcv_flag }
759
+ const urlParams = new URLSearchParams(data);
760
+ url = url + '?' + urlParams
761
+ await axios.get((url), {
762
+ headers: {
763
+ Authorization: AuthrizationToken,
764
+ version: vers
765
+ }
766
+ })
767
+ .then(Response => {
768
+ logger.debug(`${funcname} response`, Response.data, funcname)
769
+ resolve(Response.data)
770
+ })
771
+ }
772
+ catch (e) {
773
+ var err = new errorHandler(e).getError()
774
+ logger.error(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
775
+ reject(err)
776
+ }
777
+ })
778
+ }
779
+ }
780
+
781
+ function generateUrl(url, queryObject) {
782
+ let finalUrl = url + "?"
783
+ for (let key in queryObject) {
784
+ finalUrl = finalUrl + key + "=" + queryObject[key] + "&"
785
+ }
786
+ return finalUrl.substring(0, finalUrl.length - 1);
787
+ }
788
+
789
+ function getSHA256Hash(inputString) {
790
+ const hash = crypto.createHash('sha256');
791
+ hash.update(inputString);
792
+ return hash.digest('hex');
793
+ }
794
+ module.exports = FyersApi;