fyers-web-sdk-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.
- package/HSM/datasocket.min.js +1 -0
- package/HSM/mapper.js +221 -0
- package/HSM_Package/hslib.js +5 -0
- package/README.md +1 -0
- package/apiService/apiService.js +811 -0
- package/config/config.js +26 -0
- package/errorHandler/errorHandler.js +37 -0
- package/index.js +7 -0
- package/logger/log.js +62 -0
- package/obfuscate.js +25 -0
- package/ordersocket/fyersSocket.js +325 -0
- package/ordersocket/mapper.js +79 -0
- package/package.json +14 -0
- package/sample/api.js +46 -0
- package/sample/datasocket.js +25 -0
- package/sample/index.html +15 -0
- package/sample/index.js +72 -0
- package/sample/ordersocket.js +29 -0
- package/temp.js +0 -0
|
@@ -0,0 +1,811 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import {Config} from "../config/config.js"
|
|
3
|
+
import {ErrorHandler} from "../errorHandler/errorHandler.js"
|
|
4
|
+
const errorHandler = ErrorHandler
|
|
5
|
+
import axios from 'https://cdn.skypack.dev/axios';
|
|
6
|
+
/**
|
|
7
|
+
* Class to access Fyers API.
|
|
8
|
+
* @class
|
|
9
|
+
*/
|
|
10
|
+
class FyersApi {
|
|
11
|
+
/**
|
|
12
|
+
* Create a new DataSocket object to acess symboldata websocket.
|
|
13
|
+
* @constructor
|
|
14
|
+
* @param {Object} params - The parameters for initializing the DataSocket.
|
|
15
|
+
* @param {string} params.AccessToken - The access token for authentication.
|
|
16
|
+
* @param {string} params.AppID - AppID of user.
|
|
17
|
+
* @param {string} params.RedirectURL - Redirect URL provided while creating the APP.
|
|
18
|
+
* @param {boolean} params.enableLogging - Flag to enable or disable logging.
|
|
19
|
+
* @param {string} [params.Version="2.0"] - the version of API you want your output format in.
|
|
20
|
+
*/
|
|
21
|
+
constructor(params) {
|
|
22
|
+
var self = this;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* AccessToken of user.
|
|
26
|
+
* @type {String}
|
|
27
|
+
*/
|
|
28
|
+
self.AccessToken = params?.AccessToken ?? null;;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* RedirectURL of provided by user.
|
|
32
|
+
* @type {String}
|
|
33
|
+
*/
|
|
34
|
+
self.RedirectURL = params?.RedirectURL ?? null;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* APPID provided by user.
|
|
38
|
+
* @type {String}
|
|
39
|
+
*/
|
|
40
|
+
self.AppID = params?.AppID ?? null;
|
|
41
|
+
/**
|
|
42
|
+
* API version provided by client.
|
|
43
|
+
* @type {String}
|
|
44
|
+
*/
|
|
45
|
+
self.Version = params?.Version ?? "2.0";
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* filepath where are logs are to be saved.
|
|
49
|
+
* @type {string}
|
|
50
|
+
*/
|
|
51
|
+
self.LogPath = params?.path ?? undefined;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Flag to enable or disable logging.
|
|
55
|
+
* @type {boolean}
|
|
56
|
+
*/
|
|
57
|
+
self.LoggingFlag = params?.enableLogging ?? true;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* object used to write logs.
|
|
61
|
+
* @type {Logger}
|
|
62
|
+
*/
|
|
63
|
+
// self.Logger = new Logger(this.LogPath,this.LoggingFlag)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* sets the APPID.
|
|
68
|
+
* @param {string} req - APPID in format xxxxxx-xxx.
|
|
69
|
+
*/
|
|
70
|
+
setAppId = function (req) {
|
|
71
|
+
this.AppID = req
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* sets the RedirectURL.
|
|
76
|
+
* @param {string} req - pass redirect URL set during creation of APP.
|
|
77
|
+
*/
|
|
78
|
+
setRedirectUrl = function (req) {
|
|
79
|
+
this.RedirectURL = req
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* sets the AccessToken.
|
|
84
|
+
* @param {string} req - pass Access token.
|
|
85
|
+
*/
|
|
86
|
+
setAccessToken = function (req) {
|
|
87
|
+
if (this.AppID == null) {
|
|
88
|
+
console.log("Please set APPID using setAppId function")
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.AccessToken = this.AppID + ":" + req
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* get generate-authcode URL to login and generate authcode.
|
|
97
|
+
* @param {Object} req - defines for what the callback function is.
|
|
98
|
+
* @param {string} req.client_id - AppID of user.
|
|
99
|
+
* @param {string} req.redirect_uri - RedirectURL provided by user.
|
|
100
|
+
* @param {string} [req.state] - state value.
|
|
101
|
+
* @returns {string} generate authcode url
|
|
102
|
+
*/
|
|
103
|
+
generateAuthCode = function (req) {
|
|
104
|
+
var funcname = 'generateAuthCode'
|
|
105
|
+
// var logger = this.Logger
|
|
106
|
+
const client_id = (req && req.client_id) || this.AppID;
|
|
107
|
+
const redirect_uri = (req && req.redirect_uri) || this.RedirectURL;
|
|
108
|
+
const state = (req && req.state) || "sample_state";
|
|
109
|
+
console.log('generate authcode response', `${Config.API}generate-authcode?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=code&state=${state}`, funcname);
|
|
110
|
+
return `${Config.SYNC_API}/generate-authcode?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=code&state=${state}`
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* generate access token to use the API's.
|
|
115
|
+
* @param {Object} req - defines for what the callback function is.
|
|
116
|
+
* @param {string} req.client_id - AppID of user.
|
|
117
|
+
* @param {string} req.secret_key - App Secret of user.
|
|
118
|
+
* @param {string} req.auth_code - authcode generated after use of generateAuthCode and login.
|
|
119
|
+
* @param {string} [req.code_verifier] - code verifier.
|
|
120
|
+
* @returns {Object} Object with access token and refresh token if successful
|
|
121
|
+
*/
|
|
122
|
+
generate_access_token = async (req) => {
|
|
123
|
+
var funcname = 'generateAuthCode'
|
|
124
|
+
// var logger = this.Logger
|
|
125
|
+
const code_verifier = req.code_verifier || "";
|
|
126
|
+
const auth_code = req.auth_code || "";
|
|
127
|
+
const client_id = req.client_id || this.AppID;
|
|
128
|
+
const secret_key = req.secret_key || "";
|
|
129
|
+
const sha256 = await getSHA256Hash(`${client_id}:${secret_key}`)
|
|
130
|
+
// const sha256 = "c0521792b38c43632a5682579ce78c7eac8fd5e8c5dbe56890c2b338a180fcb4"
|
|
131
|
+
console.log("generate_access_token inputs", { "code_verifier": code_verifier, "auth_code": auth_code, "client_id": client_id, "secret_key": secret_key, "sha256": sha256 }, funcname)
|
|
132
|
+
try {
|
|
133
|
+
|
|
134
|
+
if (code_verifier === "") {
|
|
135
|
+
|
|
136
|
+
const access_token = await axios.post(`${Config.SYNC_API}/validate-authcode`, {
|
|
137
|
+
grant_type: "authorization_code",
|
|
138
|
+
code: req.auth_code,
|
|
139
|
+
appIdHash: sha256
|
|
140
|
+
|
|
141
|
+
})
|
|
142
|
+
return access_token.data;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
|
|
146
|
+
const access_token = await axios.post(`${Config.API}/validate-authcode`, {
|
|
147
|
+
grant_type: "authorization_code",
|
|
148
|
+
code_verifier: req.code_verifier,
|
|
149
|
+
code: req.auth_code,
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
})
|
|
153
|
+
return access_token.data;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
var err = new errorHandler(e).getError()
|
|
159
|
+
console.log("error generating access token", err, funcname)
|
|
160
|
+
return err
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* get profile data.
|
|
166
|
+
* @returns {Promise} returns profile data on resolve or error message and error code on failure
|
|
167
|
+
*/
|
|
168
|
+
get_profile = async (req) => {
|
|
169
|
+
var funcname = 'get_profile'
|
|
170
|
+
// var logger = this.Logger
|
|
171
|
+
let AuthrizationToken = this.AccessToken
|
|
172
|
+
let vers = this.Version
|
|
173
|
+
return new Promise(async function (resolve, reject) {
|
|
174
|
+
try {
|
|
175
|
+
var url = Config.SYNC_API + Config["get_profile"]
|
|
176
|
+
console.log(url)
|
|
177
|
+
await axios.get((url), {
|
|
178
|
+
headers: {
|
|
179
|
+
Authorization: AuthrizationToken,
|
|
180
|
+
// version: vers
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
.then(Response => {
|
|
184
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
185
|
+
resolve(Response.data)
|
|
186
|
+
})
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
var err = new errorHandler(e).getError()
|
|
190
|
+
console.log(`${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
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
216
|
+
resolve(Response.data)
|
|
217
|
+
})
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
var err = new errorHandler(e).getError()
|
|
221
|
+
console.log(`${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
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
247
|
+
resolve(Response.data)
|
|
248
|
+
})
|
|
249
|
+
}
|
|
250
|
+
catch (e) {
|
|
251
|
+
var err = new errorHandler(e).getError()
|
|
252
|
+
console.log(`${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
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
279
|
+
resolve(Response.data)
|
|
280
|
+
})
|
|
281
|
+
}
|
|
282
|
+
catch (e) {
|
|
283
|
+
var err = new errorHandler(e).getError()
|
|
284
|
+
console.log(`${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
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
312
|
+
resolve(Response.data)
|
|
313
|
+
})
|
|
314
|
+
}
|
|
315
|
+
catch (e) {
|
|
316
|
+
var err = new errorHandler(e).getError()
|
|
317
|
+
console.log(`${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
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
343
|
+
resolve(Response.data)
|
|
344
|
+
})
|
|
345
|
+
}
|
|
346
|
+
catch (e) {
|
|
347
|
+
var err = new errorHandler(e).getError()
|
|
348
|
+
console.log(`${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
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
374
|
+
resolve(Response.data)
|
|
375
|
+
})
|
|
376
|
+
}
|
|
377
|
+
catch (e) {
|
|
378
|
+
var err = new errorHandler(e).getError()
|
|
379
|
+
console.log(`${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
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
406
|
+
resolve(Response.data)
|
|
407
|
+
})
|
|
408
|
+
|
|
409
|
+
}
|
|
410
|
+
catch (e) {
|
|
411
|
+
var err = new errorHandler(e).getError()
|
|
412
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
413
|
+
reject(err)
|
|
414
|
+
}
|
|
415
|
+
})
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* use to place multiple order.
|
|
420
|
+
* @param {Object[]} req - request data.
|
|
421
|
+
* @returns {Promise} returns orderID of all placed and if they are failed or successful on resolve or error message and error code on failure
|
|
422
|
+
*/
|
|
423
|
+
place_multi_order = async (req) => {
|
|
424
|
+
var funcname = 'place_multi_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["multi_orders"]
|
|
431
|
+
await axios.post((url), req, {
|
|
432
|
+
headers: {
|
|
433
|
+
Authorization: AuthrizationToken,
|
|
434
|
+
// version: vers
|
|
435
|
+
}
|
|
436
|
+
})
|
|
437
|
+
.then(Response => {
|
|
438
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
439
|
+
resolve(Response.data)
|
|
440
|
+
})
|
|
441
|
+
}
|
|
442
|
+
catch (e) {
|
|
443
|
+
var err = new errorHandler(e).getError()
|
|
444
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
445
|
+
reject(err)
|
|
446
|
+
}
|
|
447
|
+
})
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* use to modify placed orders which are not traded yet.
|
|
452
|
+
* @param {Object} req - request data.
|
|
453
|
+
* @returns {Promise} returns orderID of passed order ID and if modification was successful or not resolve or error message and error code on failure
|
|
454
|
+
*/
|
|
455
|
+
modify_order = async (req) => {
|
|
456
|
+
var funcname = 'modify_order'
|
|
457
|
+
// var logger = this.Logger
|
|
458
|
+
let AuthrizationToken = this.AccessToken
|
|
459
|
+
let vers = this.Version
|
|
460
|
+
return new Promise(async function (resolve, reject) {
|
|
461
|
+
try {
|
|
462
|
+
var url = Config.SYNC_API + Config["orders_sync"]
|
|
463
|
+
await axios.patch((url), req, {
|
|
464
|
+
headers: {
|
|
465
|
+
Authorization: AuthrizationToken,
|
|
466
|
+
// version: vers
|
|
467
|
+
}
|
|
468
|
+
})
|
|
469
|
+
.then(Response => {
|
|
470
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
471
|
+
resolve(Response.data)
|
|
472
|
+
})
|
|
473
|
+
}
|
|
474
|
+
catch (e) {
|
|
475
|
+
var err = new errorHandler(e).getError()
|
|
476
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
477
|
+
reject(err)
|
|
478
|
+
}
|
|
479
|
+
})
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* use to modify multiple placed orders which are not traded yet.
|
|
484
|
+
* @param {Object[]} req - request data.
|
|
485
|
+
* @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
|
|
486
|
+
*/
|
|
487
|
+
modify_multi_order = async (req) => {
|
|
488
|
+
var funcname = 'modify_multi_order'
|
|
489
|
+
// var logger = this.Logger
|
|
490
|
+
let AuthrizationToken = this.AccessToken
|
|
491
|
+
let vers = this.Version
|
|
492
|
+
return new Promise(async function (resolve, reject) {
|
|
493
|
+
try {
|
|
494
|
+
var url = Config.SYNC_API + Config["multi_orders"]
|
|
495
|
+
await axios.patch((url), req, {
|
|
496
|
+
headers: {
|
|
497
|
+
Authorization: AuthrizationToken,
|
|
498
|
+
// version: vers
|
|
499
|
+
}
|
|
500
|
+
})
|
|
501
|
+
.then(Response => {
|
|
502
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
503
|
+
resolve(Response.data)
|
|
504
|
+
})
|
|
505
|
+
}
|
|
506
|
+
catch (e) {
|
|
507
|
+
var err = new errorHandler(e).getError()
|
|
508
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
509
|
+
reject(err)
|
|
510
|
+
}
|
|
511
|
+
})
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* use to cancel placed orders which are not traded yet.
|
|
516
|
+
* @param {Object} req - request data.
|
|
517
|
+
* @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
|
|
518
|
+
*/
|
|
519
|
+
cancel_order = async (req) => {
|
|
520
|
+
var funcname = 'cancel_order'
|
|
521
|
+
// var logger = this.Logger
|
|
522
|
+
let AuthrizationToken = this.AccessToken
|
|
523
|
+
let vers = this.Version
|
|
524
|
+
return new Promise(async function (resolve, reject) {
|
|
525
|
+
try {
|
|
526
|
+
var url = Config.SYNC_API + Config["orders_sync"]
|
|
527
|
+
await axios.delete((url), {
|
|
528
|
+
headers: {
|
|
529
|
+
Authorization: AuthrizationToken,
|
|
530
|
+
// version: vers
|
|
531
|
+
},
|
|
532
|
+
data:req
|
|
533
|
+
})
|
|
534
|
+
.then(Response => {
|
|
535
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
536
|
+
resolve(Response.data)
|
|
537
|
+
})
|
|
538
|
+
}
|
|
539
|
+
catch (e) {
|
|
540
|
+
var err = new errorHandler(e).getError()
|
|
541
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
542
|
+
reject(err)
|
|
543
|
+
}
|
|
544
|
+
})
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* use to cancel multiple 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_multi_order = async (req) => {
|
|
553
|
+
var funcname = 'cancel_multi_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["multi_orders"]
|
|
560
|
+
await axios.delete((url), {
|
|
561
|
+
headers: {
|
|
562
|
+
Authorization: AuthrizationToken,
|
|
563
|
+
// version: vers
|
|
564
|
+
},
|
|
565
|
+
data:req
|
|
566
|
+
})
|
|
567
|
+
.then(Response => {
|
|
568
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
569
|
+
resolve(Response.data)
|
|
570
|
+
})
|
|
571
|
+
}
|
|
572
|
+
catch (e) {
|
|
573
|
+
var err = new errorHandler(e).getError()
|
|
574
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
575
|
+
reject(err)
|
|
576
|
+
}
|
|
577
|
+
})
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* use to exit all positions.
|
|
582
|
+
* @param {Object} req - request data.
|
|
583
|
+
* @returns {Promise} returns success message on resolve or error message and error code on failure
|
|
584
|
+
*/
|
|
585
|
+
exit_position = async (req) => {
|
|
586
|
+
var funcname = 'exit_position'
|
|
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["positions"]
|
|
593
|
+
await axios.delete((url), {
|
|
594
|
+
headers: {
|
|
595
|
+
Authorization: AuthrizationToken,
|
|
596
|
+
// version: vers
|
|
597
|
+
},
|
|
598
|
+
data: req
|
|
599
|
+
})
|
|
600
|
+
.then(Response => {
|
|
601
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
602
|
+
resolve(Response.data)
|
|
603
|
+
})
|
|
604
|
+
}
|
|
605
|
+
catch (e) {
|
|
606
|
+
var err = new errorHandler(e).getError()
|
|
607
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
608
|
+
reject(err)
|
|
609
|
+
}
|
|
610
|
+
})
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* use to convert open 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
|
+
convert_position = async (req) => {
|
|
619
|
+
var funcname = 'convert_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.post((url), req, {
|
|
627
|
+
headers: {
|
|
628
|
+
Authorization: AuthrizationToken,
|
|
629
|
+
// version: vers
|
|
630
|
+
}
|
|
631
|
+
})
|
|
632
|
+
.then(Response => {
|
|
633
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
634
|
+
resolve(Response.data)
|
|
635
|
+
})
|
|
636
|
+
}
|
|
637
|
+
catch (e) {
|
|
638
|
+
var err = new errorHandler(e).getError()
|
|
639
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
640
|
+
reject(err)
|
|
641
|
+
}
|
|
642
|
+
})
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* use to get market status.
|
|
647
|
+
* @returns {Promise} returns success message on resolve or error message and error code on failure
|
|
648
|
+
*/
|
|
649
|
+
market_status = async (req) => {
|
|
650
|
+
var funcname = 'market_status'
|
|
651
|
+
// var logger = this.Logger
|
|
652
|
+
let AuthrizationToken = this.AccessToken
|
|
653
|
+
let vers = this.Version
|
|
654
|
+
return new Promise(async function (resolve, reject) {
|
|
655
|
+
try {
|
|
656
|
+
var url = Config.data_Api1 + Config["marketStatus"]
|
|
657
|
+
const profile = await axios.get((url), {
|
|
658
|
+
headers: {
|
|
659
|
+
Authorization: AuthrizationToken,
|
|
660
|
+
// version: vers
|
|
661
|
+
}
|
|
662
|
+
})
|
|
663
|
+
.then(Response => {
|
|
664
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
665
|
+
resolve(Response.data)
|
|
666
|
+
})
|
|
667
|
+
}
|
|
668
|
+
catch (e) {
|
|
669
|
+
var err = new errorHandler(e).getError()
|
|
670
|
+
console.log(`${funcname} response`, err, funcname)
|
|
671
|
+
reject(err)
|
|
672
|
+
}
|
|
673
|
+
})
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
* use to get historic data of symbol.
|
|
678
|
+
* @param {Object} req - request data.
|
|
679
|
+
* @returns {Promise} returns success message on resolve or error message and error code on failure
|
|
680
|
+
*/
|
|
681
|
+
getHistory = async (req) => {
|
|
682
|
+
var funcname = 'getHistory'
|
|
683
|
+
// var logger = this.Logger
|
|
684
|
+
let AuthrizationToken = this.AccessToken
|
|
685
|
+
let vers = this.Version
|
|
686
|
+
return new Promise(async function (resolve, reject) {
|
|
687
|
+
try {
|
|
688
|
+
var url = Config.data_Api1 + Config["history"]
|
|
689
|
+
url = generateUrl(url, req)
|
|
690
|
+
await axios.get((url), {
|
|
691
|
+
headers: {
|
|
692
|
+
Authorization: AuthrizationToken,
|
|
693
|
+
// version: vers
|
|
694
|
+
}
|
|
695
|
+
})
|
|
696
|
+
.then(Response => {
|
|
697
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
698
|
+
resolve(Response.data)
|
|
699
|
+
})
|
|
700
|
+
}
|
|
701
|
+
catch (e) {
|
|
702
|
+
var err = new errorHandler(e).getError()
|
|
703
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
704
|
+
reject(err)
|
|
705
|
+
}
|
|
706
|
+
})
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/**
|
|
710
|
+
* use to get quotes data of symbols.
|
|
711
|
+
* @param {Array} req - array of symbols.
|
|
712
|
+
* @returns {Promise} returns success message on resolve or error message and error code on failure
|
|
713
|
+
*/
|
|
714
|
+
getQuotes = async (req) => {
|
|
715
|
+
var funcname = 'getQuotes'
|
|
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["quotes"]
|
|
722
|
+
var symbolstring = ""
|
|
723
|
+
req.forEach(function (element) {
|
|
724
|
+
symbolstring = symbolstring + element + ','
|
|
725
|
+
})
|
|
726
|
+
symbolstring = symbolstring.slice(0, -1)//remove last ','
|
|
727
|
+
var data = { "symbols": symbolstring }
|
|
728
|
+
const urlParams = new URLSearchParams(data);
|
|
729
|
+
url = url + '?' + urlParams
|
|
730
|
+
await axios.get((url), {
|
|
731
|
+
headers: {
|
|
732
|
+
Authorization: AuthrizationToken,
|
|
733
|
+
// version: vers
|
|
734
|
+
}
|
|
735
|
+
})
|
|
736
|
+
.then(Response => {
|
|
737
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
738
|
+
resolve(Response.data)
|
|
739
|
+
})
|
|
740
|
+
}
|
|
741
|
+
catch (e) {
|
|
742
|
+
var err = new errorHandler(e).getError()
|
|
743
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
744
|
+
reject(err)
|
|
745
|
+
}
|
|
746
|
+
})
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* use to get market depth data of symbols.
|
|
751
|
+
* @param {Array} req - array of symbols.
|
|
752
|
+
* @returns {Promise} returns success message on resolve or error message and error code on failure
|
|
753
|
+
*/
|
|
754
|
+
getMarketDepth = async (req) => {
|
|
755
|
+
var funcname = 'getQuotes'
|
|
756
|
+
// var logger = this.Logger
|
|
757
|
+
let AuthrizationToken = this.AccessToken
|
|
758
|
+
let vers = this.Version
|
|
759
|
+
return new Promise(async function (resolve, reject) {
|
|
760
|
+
try {
|
|
761
|
+
var url = Config.data_Api1 + Config["market_depth"]
|
|
762
|
+
var symbolstring = ""
|
|
763
|
+
req.symbol.forEach(function (element) {
|
|
764
|
+
symbolstring = symbolstring + element + ','
|
|
765
|
+
})
|
|
766
|
+
symbolstring = symbolstring.slice(0, -1)//remove last ','
|
|
767
|
+
var data = { "symbol": symbolstring, "ohlcv_flag": req.ohlcv_flag }
|
|
768
|
+
const urlParams = new URLSearchParams(data);
|
|
769
|
+
url = url + '?' + urlParams
|
|
770
|
+
await axios.get((url), {
|
|
771
|
+
headers: {
|
|
772
|
+
Authorization: AuthrizationToken,
|
|
773
|
+
// version: vers
|
|
774
|
+
}
|
|
775
|
+
})
|
|
776
|
+
.then(Response => {
|
|
777
|
+
console.log(`${funcname} response`, Response.data, funcname)
|
|
778
|
+
resolve(Response.data)
|
|
779
|
+
})
|
|
780
|
+
}
|
|
781
|
+
catch (e) {
|
|
782
|
+
var err = new errorHandler(e).getError()
|
|
783
|
+
console.log(`${funcname} response`, { "Error": err, "inputs": req }, funcname)
|
|
784
|
+
reject(err)
|
|
785
|
+
}
|
|
786
|
+
})
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
function generateUrl(url, queryObject) {
|
|
791
|
+
let finalUrl = url + "?"
|
|
792
|
+
for (let key in queryObject) {
|
|
793
|
+
finalUrl = finalUrl + key + "=" + queryObject[key] + "&"
|
|
794
|
+
}
|
|
795
|
+
return finalUrl.substring(0, finalUrl.length - 1);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
async function getSHA256Hash(inputString) {
|
|
799
|
+
const encoder = new TextEncoder();
|
|
800
|
+
const data = encoder.encode(inputString);
|
|
801
|
+
|
|
802
|
+
// Generate the SHA-256 hash
|
|
803
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
804
|
+
|
|
805
|
+
// Convert the buffer to a hex string
|
|
806
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
807
|
+
const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('');
|
|
808
|
+
|
|
809
|
+
return hashHex;
|
|
810
|
+
}
|
|
811
|
+
export {FyersApi}
|