mconnectb 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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +351 -0
  3. package/dist/constants/index.d.ts +158 -0
  4. package/dist/constants/index.d.ts.map +1 -0
  5. package/dist/constants/index.js +161 -0
  6. package/dist/constants/index.js.map +1 -0
  7. package/dist/constants/routes.d.ts +109 -0
  8. package/dist/constants/routes.d.ts.map +1 -0
  9. package/dist/constants/routes.js +120 -0
  10. package/dist/constants/routes.js.map +1 -0
  11. package/dist/example/example.d.ts +44 -0
  12. package/dist/example/example.d.ts.map +1 -0
  13. package/dist/example/example.js +727 -0
  14. package/dist/example/example.js.map +1 -0
  15. package/dist/example/websocket-stream.d.ts +2 -0
  16. package/dist/example/websocket-stream.d.ts.map +1 -0
  17. package/dist/example/websocket-stream.js +116 -0
  18. package/dist/example/websocket-stream.js.map +1 -0
  19. package/dist/lib/connect.d.ts +306 -0
  20. package/dist/lib/connect.d.ts.map +1 -0
  21. package/dist/lib/connect.js +514 -0
  22. package/dist/lib/connect.js.map +1 -0
  23. package/dist/lib/index.d.ts +5 -0
  24. package/dist/lib/index.d.ts.map +1 -0
  25. package/dist/lib/index.js +27 -0
  26. package/dist/lib/index.js.map +1 -0
  27. package/dist/lib/response-logger.d.ts +15 -0
  28. package/dist/lib/response-logger.d.ts.map +1 -0
  29. package/dist/lib/response-logger.js +73 -0
  30. package/dist/lib/response-logger.js.map +1 -0
  31. package/dist/lib/ticker.d.ts +43 -0
  32. package/dist/lib/ticker.d.ts.map +1 -0
  33. package/dist/lib/ticker.js +362 -0
  34. package/dist/lib/ticker.js.map +1 -0
  35. package/dist/lib/utils.d.ts +36 -0
  36. package/dist/lib/utils.d.ts.map +1 -0
  37. package/dist/lib/utils.js +75 -0
  38. package/dist/lib/utils.js.map +1 -0
  39. package/dist/test/test-websocket.d.ts +2 -0
  40. package/dist/test/test-websocket.d.ts.map +1 -0
  41. package/dist/test/test-websocket.js +116 -0
  42. package/dist/test/test-websocket.js.map +1 -0
  43. package/dist/test/test.d.ts +2 -0
  44. package/dist/test/test.d.ts.map +1 -0
  45. package/dist/test/test.js +892 -0
  46. package/dist/test/test.js.map +1 -0
  47. package/dist/types/config.d.ts +138 -0
  48. package/dist/types/config.d.ts.map +1 -0
  49. package/dist/types/config.js +12 -0
  50. package/dist/types/config.js.map +1 -0
  51. package/dist/types/index.d.ts +631 -0
  52. package/dist/types/index.d.ts.map +1 -0
  53. package/dist/types/index.js +12 -0
  54. package/dist/types/index.js.map +1 -0
  55. package/package.json +91 -0
@@ -0,0 +1,514 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MConnect = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const routes_1 = require("../constants/routes");
9
+ const constants_1 = require("../constants");
10
+ /**
11
+ * REST API Client for TypeB Trading API
12
+ *
13
+ * This class provides a comprehensive interface for interacting with the TypeB trading API.
14
+ * It handles authentication, order management, portfolio operations, market data retrieval,
15
+ * and other trading functionalities through RESTful endpoints.
16
+ *
17
+ * @class MConnect
18
+ * @example
19
+ * ```typescript
20
+ * const client = new MConnect('https://api.mstock.trade', 'your-api-key');
21
+ * await client.login({ clientcode: 'user', password: 'pass', totp: '123456', state: 'state' });
22
+ * ```
23
+ */
24
+ class MConnect {
25
+ /**
26
+ * Creates an instance of MConnect
27
+ *
28
+ * @param {string} baseUrl - Base URL for the API (defaults to https://api.mstock.trade)
29
+ * @param {string} apiKey - API key for authentication
30
+ * @param {string | null} [jwtToken=null] - JWT token for authenticated requests
31
+ */
32
+ constructor(baseUrl, apiKey, jwtToken = null) {
33
+ this.baseURL = baseUrl || constants_1.DEFAULTS.API_BASE_URL;
34
+ this.apiKey = apiKey;
35
+ this.jwtToken = jwtToken;
36
+ this.httpClient = axios_1.default.create({ baseURL: this.baseURL });
37
+ }
38
+ /**
39
+ * Sets the access token for authenticated requests
40
+ *
41
+ * @param {string} jwtToken - JWT token received after successful login
42
+ */
43
+ setAccessToken(jwtToken) {
44
+ this.jwtToken = jwtToken;
45
+ }
46
+ /**
47
+ * Executes an HTTP request with proper authentication headers
48
+ *
49
+ * @private
50
+ * @template T - Expected response type
51
+ * @param {AxiosRequestConfig} config - Request configuration
52
+ * @returns {Promise<T>} Promise resolving to the response data
53
+ * @throws {Error} Throws error if request fails
54
+ */
55
+ async executeRequest(config) {
56
+ try {
57
+ const headers = {
58
+ 'Authorization': `Bearer ${this.jwtToken}`,
59
+ 'X-PrivateKey': this.apiKey,
60
+ 'X-Mirae-Version': '1',
61
+ 'Accept': 'application/json',
62
+ ...config.headers,
63
+ };
64
+ const finalConfig = { ...config, headers };
65
+ const response = await this.httpClient(finalConfig);
66
+ return response.data;
67
+ }
68
+ catch (error) {
69
+ if (axios_1.default.isAxiosError(error) && error.response) {
70
+ throw new Error(`API Error: ${error.response.status} ${error.response.data?.message || error.message}`);
71
+ }
72
+ throw error;
73
+ }
74
+ }
75
+ /**
76
+ * User login endpoint
77
+ *
78
+ * Authenticates user credentials and returns access tokens
79
+ *
80
+ * @param {LoginReq} params - Login credentials
81
+ * @returns {Promise<APIResponse<TypeBToken>>} Authentication response with tokens
82
+ */
83
+ async login(params) {
84
+ const route = routes_1.ROUTES.login;
85
+ return this.executeRequest({
86
+ method: 'POST',
87
+ url: route,
88
+ data: params,
89
+ headers: { 'Content-Type': 'application/json' },
90
+ });
91
+ }
92
+ /**
93
+ * Verify OTP for session token
94
+ *
95
+ * @param {string} refreshToken - Refresh token from login
96
+ * @param {string} otp - One-time password
97
+ * @returns {Promise<APIResponse<TypeBToken>>} Updated authentication tokens
98
+ */
99
+ async verifyOTP(refreshToken, otp) {
100
+ const params = { refreshToken, otp };
101
+ return this.executeRequest({
102
+ method: 'POST',
103
+ url: routes_1.ROUTES.sessionToken,
104
+ data: params,
105
+ headers: { 'Content-Type': 'application/json' },
106
+ });
107
+ }
108
+ /**
109
+ * Verify TOTP for two-factor authentication
110
+ *
111
+ * @param {string} refreshToken - Refresh token
112
+ * @param {string} totp - Time-based one-time password
113
+ * @returns {Promise<APIResponse<TypeBToken>>} Authentication response
114
+ */
115
+ async verifyTOTP(refreshToken, totp) {
116
+ const params = { refreshToken, totp };
117
+ return this.executeRequest({
118
+ method: 'POST',
119
+ url: routes_1.ROUTES.verifyTOTP,
120
+ data: params,
121
+ headers: { 'Content-Type': 'application/json' },
122
+ });
123
+ }
124
+ /**
125
+ * Place a new order
126
+ *
127
+ * Submits a new order to the exchange
128
+ *
129
+ * @param {PlaceOrderParams} params - Order parameters
130
+ * @returns {Promise<APIResponse<{ orderid: string }>>} Order placement response
131
+ */
132
+ async placeOrder(params) {
133
+ return this.executeRequest({
134
+ method: 'POST',
135
+ url: routes_1.ROUTES.placeOrder,
136
+ data: params,
137
+ headers: { 'Content-Type': 'application/json' },
138
+ });
139
+ }
140
+ /**
141
+ * Modify an existing order
142
+ *
143
+ * Updates order parameters for an existing order
144
+ *
145
+ * @param {ModifyOrderParams} params - Order modification parameters
146
+ * @returns {Promise<APIResponse<{ orderid: string }>>} Modification response
147
+ */
148
+ async modifyOrder(params) {
149
+ const route = routes_1.ROUTES.modifyOrder.replace('{orderid}', params.orderid);
150
+ return this.executeRequest({
151
+ method: 'PUT',
152
+ url: route,
153
+ data: params,
154
+ headers: { 'Content-Type': 'application/json' },
155
+ });
156
+ }
157
+ /**
158
+ * Cancel an existing order
159
+ *
160
+ * Cancels a pending or partially filled order
161
+ *
162
+ * @param {CancelOrderParams} params - Order cancellation parameters
163
+ * @returns {Promise<APIResponse<{ orderid: string }>>} Cancellation response
164
+ */
165
+ async cancelOrder(params) {
166
+ const route = routes_1.ROUTES.cancelOrder.replace('{orderid}', params.orderid);
167
+ return this.executeRequest({
168
+ method: 'DELETE',
169
+ url: route,
170
+ data: params,
171
+ headers: { 'Content-Type': 'application/json' }
172
+ });
173
+ }
174
+ /**
175
+ * Get detailed order information
176
+ *
177
+ * Retrieves comprehensive details for a specific order
178
+ *
179
+ * @param {OrderDetailsReq} params - Order details request parameters
180
+ * @returns {Promise<OrderDetails[]>} Detailed order information
181
+ */
182
+ async getOrderDetails(params) {
183
+ const route = routes_1.ROUTES.getorderdetails;
184
+ return this.executeRequest({
185
+ method: 'POST',
186
+ url: route,
187
+ data: params,
188
+ headers: { 'Content-Type': 'application/json' }
189
+ });
190
+ }
191
+ /**
192
+ * Get trade history
193
+ *
194
+ * Retrieves historical trades for a date range
195
+ *
196
+ * @param {TradeHistoryReq} params - Trade history parameters
197
+ * @returns {Promise<any[]>} Array of trade records
198
+ */
199
+ async getTradeHistory(params) {
200
+ const route = routes_1.ROUTES.trades;
201
+ return this.executeRequest({
202
+ method: 'POST',
203
+ url: route,
204
+ data: params,
205
+ headers: { 'Content-Type': 'application/json' }
206
+ });
207
+ }
208
+ /**
209
+ * Calculate order margin
210
+ *
211
+ * Calculates the required margin for placing orders
212
+ *
213
+ * @param {OrderMarginReq} params - Order margin calculation parameters
214
+ * @returns {Promise<any[]>} Margin calculation results
215
+ */
216
+ async orderMargin(params) {
217
+ const route = routes_1.ROUTES.ordermargin;
218
+ return this.executeRequest({
219
+ method: 'POST',
220
+ url: route,
221
+ data: params,
222
+ headers: { 'Content-Type': 'application/json' }
223
+ });
224
+ }
225
+ /**
226
+ * Get top losers and gainers
227
+ *
228
+ * Retrieves market data for top performing and underperforming securities
229
+ *
230
+ * @param {LoserGainer} params - Loser/gainer request parameters
231
+ * @returns {Promise<any[]>} Array of market performance data
232
+ */
233
+ async loserGainer(params) {
234
+ const route = routes_1.ROUTES.losergainer;
235
+ return this.executeRequest({
236
+ method: 'POST',
237
+ url: route,
238
+ data: params,
239
+ headers: { 'Content-Type': 'application/json' }
240
+ });
241
+ }
242
+ /**
243
+ * Cancel all open orders
244
+ *
245
+ * Cancels all pending orders across all segments
246
+ *
247
+ * @returns {Promise<any>} Cancellation response
248
+ */
249
+ async cancelAllOrders() {
250
+ return this.executeRequest({ method: 'POST', url: routes_1.ROUTES.cancelAll });
251
+ }
252
+ /**
253
+ * Get fund summary
254
+ *
255
+ * Retrieves account balance and fund summary
256
+ *
257
+ * @returns {Promise<any>} Fund summary data
258
+ */
259
+ async getFundSummary() {
260
+ return this.executeRequest({ method: 'GET', url: routes_1.ROUTES.fundSummary });
261
+ }
262
+ /**
263
+ * Get order book
264
+ *
265
+ * Retrieves all orders including pending, executed, and cancelled orders
266
+ *
267
+ * @returns {Promise<APIResponse<OrderBookData[]>>} Order book data
268
+ */
269
+ async getOrderBook() {
270
+ return this.executeRequest({ method: 'GET', url: routes_1.ROUTES.getOrders });
271
+ }
272
+ /**
273
+ * Get open positions
274
+ *
275
+ * Retrieves current open positions across all segments
276
+ *
277
+ * @returns {Promise<APIResponse<PositionData[]>>} Position data
278
+ */
279
+ async getPositions() {
280
+ return this.executeRequest({ method: 'GET', url: routes_1.ROUTES.getPositions });
281
+ }
282
+ /**
283
+ * Get portfolio holdings
284
+ *
285
+ * Retrieves current portfolio holdings
286
+ *
287
+ * @returns {Promise<APIResponse<TypeBHolding[]>>} Holdings data
288
+ */
289
+ async getHoldings() {
290
+ return this.executeRequest({ method: 'GET', url: routes_1.ROUTES.getHoldings });
291
+ }
292
+ /**
293
+ * Get historical candlestick data
294
+ *
295
+ * Retrieves historical price data in OHLC format
296
+ *
297
+ * @param {HistoricalDataParams} params - Historical data parameters
298
+ * @returns {Promise<APIResponse<[string, number, number, number, number, number][]>>} Historical data
299
+ */
300
+ async getHistoricalData(params) {
301
+ return this.executeRequest({
302
+ method: 'POST',
303
+ url: routes_1.ROUTES.historicalData,
304
+ data: params,
305
+ headers: { 'Content-Type': 'application/json' },
306
+ });
307
+ }
308
+ /**
309
+ * Get intraday chart data
310
+ *
311
+ * Retrieves intraday price data for charting
312
+ *
313
+ * @param {IntradyChartDataParams} params - Intraday data parameters
314
+ * @returns {Promise<APIResponse<[string, number, number, number, number, number][]>>} Intraday data
315
+ */
316
+ async getIntradayChartData(params) {
317
+ return this.executeRequest({
318
+ method: 'POST',
319
+ url: routes_1.ROUTES.intradayChartData,
320
+ data: params,
321
+ headers: { 'Content-Type': 'application/json' },
322
+ });
323
+ }
324
+ /**
325
+ * Get instrument master data
326
+ *
327
+ * Retrieves complete instrument master data in CSV format
328
+ *
329
+ * @returns {Promise<string>} CSV formatted instrument data
330
+ */
331
+ async getInstrumentMaster() {
332
+ return this.executeRequest({
333
+ method: 'GET',
334
+ url: routes_1.ROUTES.scriptMaster,
335
+ headers: {
336
+ 'Accept': 'text/csv, application/json'
337
+ }
338
+ });
339
+ }
340
+ /**
341
+ * Get real-time quotes
342
+ *
343
+ * Retrieves real-time quotes for specified instruments
344
+ *
345
+ * @param {QuoteParams} params - Quote request parameters
346
+ * @returns {Promise<APIResponse<QuoteData<FetchedLtp | FetchedOhlc>>>} Quote data
347
+ */
348
+ async getQuote(params) {
349
+ return this.executeRequest({
350
+ method: 'POST',
351
+ url: routes_1.ROUTES.quote,
352
+ data: params,
353
+ headers: { 'Content-Type': 'application/json' },
354
+ });
355
+ }
356
+ /**
357
+ * Convert position type
358
+ *
359
+ * Converts position from one product type to another (e.g., intraday to delivery)
360
+ *
361
+ * @param {ConvertPositionParams} params - Position conversion parameters
362
+ * @returns {Promise<APIResponse<any>>} Conversion response
363
+ */
364
+ async convertPosition(params) {
365
+ return this.executeRequest({
366
+ method: 'POST',
367
+ url: routes_1.ROUTES.convertPosition,
368
+ data: params,
369
+ headers: { 'Content-Type': 'application/json' },
370
+ });
371
+ }
372
+ /**
373
+ * Get trade book
374
+ *
375
+ * Retrieves trade book with all executed trades
376
+ *
377
+ * @returns {Promise<APIResponse<any>>} Trade book data
378
+ */
379
+ async getTradeBook() {
380
+ return this.executeRequest({ method: 'GET', url: routes_1.ROUTES.tradeBook });
381
+ }
382
+ /**
383
+ * User logout
384
+ *
385
+ * Logs out the current user and invalidates the session
386
+ *
387
+ * @param {string} clientCode - Client code
388
+ * @param {string} jwtToken - JWT token
389
+ * @returns {Promise<APIResponse<any>>} Logout response
390
+ */
391
+ async logout(clientCode, jwtToken) {
392
+ return this.executeRequest({
393
+ method: 'GET',
394
+ url: routes_1.ROUTES.logout,
395
+ headers: { 'Content-Type': 'application/json' },
396
+ });
397
+ }
398
+ /**
399
+ * Fetch basket orders
400
+ *
401
+ * Retrieves all basket orders
402
+ *
403
+ * @returns {Promise<FetchBasket[]>} Array of basket orders
404
+ */
405
+ async fetchBasket() {
406
+ return this.executeRequest({ method: 'GET', url: routes_1.ROUTES.fetchbasket });
407
+ }
408
+ /**
409
+ * Create basket order
410
+ *
411
+ * Creates a new basket order
412
+ *
413
+ * @param {CreateBasket} params - Basket creation parameters
414
+ * @returns {Promise<any[]>} Creation response
415
+ */
416
+ async createBasket(params) {
417
+ const route = routes_1.ROUTES.createbasket;
418
+ return this.executeRequest({
419
+ method: 'POST',
420
+ url: route,
421
+ data: params,
422
+ headers: { 'Content-Type': 'application/json' },
423
+ });
424
+ }
425
+ /**
426
+ * Rename basket order
427
+ *
428
+ * Renames an existing basket order
429
+ *
430
+ * @param {RenameBasket} params - Basket rename parameters
431
+ * @returns {Promise<any[]>} Rename response
432
+ */
433
+ async renameBasket(params) {
434
+ const route = routes_1.ROUTES.renamebasket;
435
+ return this.executeRequest({
436
+ method: 'PUT',
437
+ url: route,
438
+ data: params,
439
+ headers: { 'Content-Type': 'application/json' },
440
+ });
441
+ }
442
+ /**
443
+ * Delete basket order
444
+ *
445
+ * Deletes an existing basket order
446
+ *
447
+ * @param {DeleteBasket} params - Basket deletion parameters
448
+ * @returns {Promise<any[]>} Deletion response
449
+ */
450
+ async deleteBasket(params) {
451
+ const route = routes_1.ROUTES.deletebasket;
452
+ return this.executeRequest({
453
+ method: 'DELETE',
454
+ url: route,
455
+ data: params,
456
+ headers: { 'Content-Type': 'application/json' },
457
+ });
458
+ }
459
+ /**
460
+ * Calculate basket order
461
+ *
462
+ * Calculates basket order details including margin requirements
463
+ *
464
+ * @param {CalcualteBasket} params - Basket calculation parameters
465
+ * @returns {Promise<any[]>} Calculation results
466
+ */
467
+ async calculateBasket(params) {
468
+ const route = routes_1.ROUTES.calculatebasket;
469
+ return this.executeRequest({
470
+ method: 'POST',
471
+ url: route,
472
+ data: params,
473
+ headers: { 'Content-Type': 'application/json' },
474
+ });
475
+ }
476
+ /**
477
+ * Get option chain master data
478
+ *
479
+ * Retrieves option chain master data for a specific exchange
480
+ *
481
+ * @param {string} exchange - Exchange identifier
482
+ * @returns {Promise<any>} Option chain master data
483
+ */
484
+ async getOptionChainMaster(exchange) {
485
+ const route = routes_1.ROUTES.optionchainmaster
486
+ .replace('{exchange}', String(exchange));
487
+ return this.executeRequest({
488
+ method: 'GET',
489
+ url: route
490
+ });
491
+ }
492
+ /**
493
+ * Get option chain data
494
+ *
495
+ * Retrieves detailed option chain data for specific expiry and token
496
+ *
497
+ * @param {string} exchange - Exchange identifier
498
+ * @param {string} expiry - Expiry date
499
+ * @param {string} token - Symbol token
500
+ * @returns {Promise<any>} Option chain data
501
+ */
502
+ async getOptionChain(exchange, expiry, token) {
503
+ const route = routes_1.ROUTES.optionchain
504
+ .replace('{exchange}', exchange)
505
+ .replace('{expiry}', expiry)
506
+ .replace('{token}', token);
507
+ return this.executeRequest({
508
+ method: 'GET',
509
+ url: route
510
+ });
511
+ }
512
+ }
513
+ exports.MConnect = MConnect;
514
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../lib/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { MConnect } from './connect';
2
+ export { MTicker } from './ticker';
3
+ export { ResponseLogger } from './response-logger';
4
+ export * from '../types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,cAAc,UAAU,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ResponseLogger = exports.MTicker = exports.MConnect = void 0;
18
+ // Main exports for the TypeB Trading API SDK
19
+ var connect_1 = require("./connect");
20
+ Object.defineProperty(exports, "MConnect", { enumerable: true, get: function () { return connect_1.MConnect; } });
21
+ var ticker_1 = require("./ticker");
22
+ Object.defineProperty(exports, "MTicker", { enumerable: true, get: function () { return ticker_1.MTicker; } });
23
+ var response_logger_1 = require("./response-logger");
24
+ Object.defineProperty(exports, "ResponseLogger", { enumerable: true, get: function () { return response_logger_1.ResponseLogger; } });
25
+ // Export types and interfaces
26
+ __exportStar(require("../types"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA6C;AAC7C,qCAAqC;AAA5B,mGAAA,QAAQ,OAAA;AACjB,mCAAmC;AAA1B,iGAAA,OAAO,OAAA;AAChB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,8BAA8B;AAC9B,2CAAyB"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ResponseLogger class for logging API responses to a file.
3
+ *
4
+ * This class handles the creation and management of a log file
5
+ * for recording API responses with timestamps in IST.
6
+ */
7
+ export declare class ResponseLogger {
8
+ private logFile;
9
+ constructor(logFileName?: string);
10
+ private initLog;
11
+ logResponse(operation: string, response: any): void;
12
+ private getISTTime;
13
+ getLogPath(): string;
14
+ }
15
+ //# sourceMappingURL=response-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-logger.d.ts","sourceRoot":"","sources":["../../lib/response-logger.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,GAAE,MAA4B;IAKrD,OAAO,CAAC,OAAO;IAKR,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG;IAWnD,OAAO,CAAC,UAAU;IAKX,UAAU,IAAI,MAAM;CAG9B"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ResponseLogger = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * ResponseLogger class for logging API responses to a file.
41
+ *
42
+ * This class handles the creation and management of a log file
43
+ * for recording API responses with timestamps in IST.
44
+ */
45
+ class ResponseLogger {
46
+ constructor(logFileName = 'api-responses.log') {
47
+ this.logFile = path.join(process.cwd(), logFileName);
48
+ this.initLog();
49
+ }
50
+ initLog() {
51
+ const initEntry = `=== API Response Log Started at ${this.getISTTime()} ===\n\n`;
52
+ fs.writeFileSync(this.logFile, initEntry);
53
+ }
54
+ logResponse(operation, response) {
55
+ const timestamp = this.getISTTime();
56
+ const logEntry = `[${timestamp}] ${operation}:\n${JSON.stringify(response, null, 2)}\n\n`;
57
+ try {
58
+ fs.appendFileSync(this.logFile, logEntry);
59
+ }
60
+ catch (error) {
61
+ console.error('Failed to write response log:', error);
62
+ }
63
+ }
64
+ getISTTime() {
65
+ const options = { timeZone: 'Asia/Kolkata', hour12: false };
66
+ return new Date().toLocaleString('en-IN', options);
67
+ }
68
+ getLogPath() {
69
+ return this.logFile;
70
+ }
71
+ }
72
+ exports.ResponseLogger = ResponseLogger;
73
+ //# sourceMappingURL=response-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-logger.js","sourceRoot":"","sources":["../../lib/response-logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAE7B;;;;;GAKG;AACH,MAAa,cAAc;IAGvB,YAAY,cAAsB,mBAAmB;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAEO,OAAO;QACX,MAAM,SAAS,GAAG,mCAAmC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;QACjF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAEM,WAAW,CAAC,SAAiB,EAAE,QAAa;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,SAAS,KAAK,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAE1F,IAAI,CAAC;YACD,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAEO,UAAU;QACd,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC5D,OAAO,IAAI,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAEM,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ;AAhCD,wCAgCC"}