nodecore-kit 0.1.0 → 0.3.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/dist/index.cjs CHANGED
@@ -30,17 +30,214 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
- del: () => del,
34
- get: () => get,
33
+ AppError: () => AppError,
34
+ AuthenticationError: () => AuthenticationError,
35
+ AuthorizationError: () => AuthorizationError,
36
+ BadRequestError: () => BadRequestError,
37
+ ExistingError: () => ExistingError,
38
+ HTTP_STATUS: () => HTTP_STATUS,
39
+ HTTP_STATUS_CODE_ERROR: () => HTTP_STATUS_CODE_ERROR,
40
+ NoContent: () => NoContent,
41
+ NotFoundError: () => NotFoundError,
42
+ Redis: () => Redis,
43
+ SQS: () => SQS,
44
+ ServerError: () => ServerError,
45
+ TokenExpiredError: () => TokenExpiredError,
46
+ TokenInvalidError: () => TokenInvalidError,
47
+ ValidationError: () => ValidationError,
48
+ WinstonLogger: () => WinstonLogger,
49
+ capitalize: () => capitalize,
50
+ errorHandler: () => errorHandler,
51
+ expressErrorMiddleware: () => expressErrorMiddleware,
52
+ formatDate: () => formatDate,
53
+ isEmpty: () => isEmpty,
54
+ isObject: () => isObject,
55
+ joiValidator: () => joiValidator,
56
+ jwtService: () => jwtService,
35
57
  makeRequest: () => makeRequest,
36
58
  paginate: () => paginate,
37
- patch: () => patch,
38
- post: () => post,
39
- put: () => put
59
+ parseJSON: () => parseJSON,
60
+ sleep: () => sleep,
61
+ stringifyJSON: () => stringifyJSON,
62
+ uuid: () => uuid
40
63
  });
41
64
  module.exports = __toCommonJS(src_exports);
42
65
 
43
- // src/utils/index.ts
66
+ // src/transport/http.ts
67
+ var import_axios = __toESM(require("axios"), 1);
68
+ var makeRequest = async ({
69
+ url,
70
+ method = "GET",
71
+ headers = {},
72
+ token = void 0,
73
+ data = void 0
74
+ }) => {
75
+ try {
76
+ headers["X-Requested-With"] = "XMLHttpRequest";
77
+ token && (headers["Authorization"] = token);
78
+ const payload = {
79
+ method,
80
+ url,
81
+ headers
82
+ };
83
+ if (data)
84
+ payload.data = data;
85
+ const result = await (0, import_axios.default)(payload);
86
+ return result.data;
87
+ } catch (err) {
88
+ throw err.response ? { ...err.response.data, httpStatusCode: err.response.status } : err;
89
+ }
90
+ };
91
+
92
+ // src/core/error.ts
93
+ var HTTP_STATUS = {
94
+ OK: { code: 200, message: "OK" },
95
+ CREATED: { code: 201, message: "Created" },
96
+ NO_CONTENT: { code: 204, message: "No Content" },
97
+ BAD_REQUEST: { code: 400, message: "Bad Request" },
98
+ UNAUTHORIZED: { code: 401, message: "Unauthorized" },
99
+ FORBIDDEN: { code: 403, message: "Forbidden" },
100
+ NOT_FOUND: { code: 404, message: "Not Found" },
101
+ CONFLICT: { code: 409, message: "Conflict" },
102
+ UNPROCESSABLE_ENTITY: { code: 422, message: "Unprocessable Entity" },
103
+ TOKEN_EXPIRED: { code: 498, message: "Token Expired" },
104
+ TOKEN_INVALID: { code: 499, message: "Token Invalid" },
105
+ SERVER_ERROR: { code: 500, message: "Internal Server Error" }
106
+ };
107
+ var HTTP_STATUS_CODE_ERROR = {
108
+ 400: "VALIDATION_ERROR",
109
+ 401: "AUTHENTICATION_ERROR",
110
+ 402: "PAYMENT_REQUIRED_ERROR",
111
+ 403: "AUTHORIZATION_ERROR",
112
+ 404: "NOT_FOUND",
113
+ 409: "ENTRY_EXISTS",
114
+ 422: "VALIDATION_ERROR",
115
+ 498: "TOKEN_EXPIRED",
116
+ 499: "TOKEN_INVALID",
117
+ 500: "FATAL_ERROR"
118
+ };
119
+ var AppError = class extends Error {
120
+ constructor(status, message, errorCode, meta) {
121
+ super(message || status.message);
122
+ this.name = new.target.name;
123
+ this.statusCode = status.code;
124
+ this.statusMessage = status.message;
125
+ this.errorCode = errorCode;
126
+ this.meta = meta;
127
+ Error.captureStackTrace(this, new.target);
128
+ }
129
+ };
130
+ var ValidationError = class extends AppError {
131
+ constructor(message, meta) {
132
+ super(
133
+ HTTP_STATUS.UNPROCESSABLE_ENTITY,
134
+ message,
135
+ "VALIDATION_ERROR",
136
+ meta
137
+ );
138
+ }
139
+ };
140
+ var AuthenticationError = class extends AppError {
141
+ constructor(message, meta) {
142
+ super(
143
+ HTTP_STATUS.UNAUTHORIZED,
144
+ message,
145
+ "AUTHENTICATION_ERROR",
146
+ meta
147
+ );
148
+ }
149
+ };
150
+ var AuthorizationError = class extends AppError {
151
+ constructor(message, meta) {
152
+ super(HTTP_STATUS.FORBIDDEN, message, "AUTHORIZATION_ERROR", meta);
153
+ }
154
+ };
155
+ var NotFoundError = class extends AppError {
156
+ constructor(message, meta) {
157
+ super(HTTP_STATUS.NOT_FOUND, message, "NOT_FOUND", meta);
158
+ }
159
+ };
160
+ var TokenExpiredError = class extends AppError {
161
+ constructor(message, meta) {
162
+ super(HTTP_STATUS.TOKEN_EXPIRED, message, "TOKEN_EXPIRED", meta);
163
+ }
164
+ };
165
+ var TokenInvalidError = class extends AppError {
166
+ constructor(message, meta) {
167
+ super(HTTP_STATUS.TOKEN_INVALID, message, "TOKEN_INVALID", meta);
168
+ }
169
+ };
170
+ var BadRequestError = class extends AppError {
171
+ constructor(message, meta) {
172
+ super(HTTP_STATUS.BAD_REQUEST, message, "BAD_REQUEST", meta);
173
+ }
174
+ };
175
+ var ServerError = class extends AppError {
176
+ constructor(message, meta) {
177
+ super(HTTP_STATUS.SERVER_ERROR, message, "SERVER_ERROR", meta);
178
+ }
179
+ };
180
+ var ExistingError = class extends AppError {
181
+ constructor(message, meta) {
182
+ super(HTTP_STATUS.CONFLICT, message, "ENTRY_EXISTS", meta);
183
+ }
184
+ };
185
+ var NoContent = class extends AppError {
186
+ constructor(message, meta) {
187
+ super(HTTP_STATUS.NO_CONTENT, message, "NO_CONTENT", meta);
188
+ }
189
+ };
190
+ var errorHandler = (err, ERROR_TYPE = "FATAL_ERROR", service = "Unknown Service") => {
191
+ const response = {
192
+ success: false,
193
+ message: "Something went wrong",
194
+ error: ERROR_TYPE,
195
+ httpStatusCode: 500,
196
+ service
197
+ };
198
+ try {
199
+ if (!err)
200
+ return response;
201
+ if (err instanceof AppError) {
202
+ return {
203
+ ...response,
204
+ message: err.message,
205
+ error: err.errorCode || err.name,
206
+ httpStatusCode: err.statusCode
207
+ };
208
+ }
209
+ if (err.isAxiosError) {
210
+ return {
211
+ ...response,
212
+ message: err?.response?.data?.message || err.message || response.message,
213
+ error: err?.response?.data?.error || HTTP_STATUS_CODE_ERROR[err?.response?.status] || ERROR_TYPE,
214
+ httpStatusCode: err?.response?.status || 500
215
+ };
216
+ }
217
+ if (err instanceof Error) {
218
+ return {
219
+ ...response,
220
+ message: err.message,
221
+ error: err.name
222
+ };
223
+ }
224
+ if (typeof err === "string") {
225
+ return {
226
+ ...response,
227
+ message: err
228
+ };
229
+ }
230
+ return response;
231
+ } catch {
232
+ return response;
233
+ }
234
+ };
235
+ var expressErrorMiddleware = () => (err, req, res, next) => {
236
+ const error = errorHandler(err);
237
+ res.status(error.httpStatusCode).json(error);
238
+ };
239
+
240
+ // src/core/utils.ts
44
241
  var paginate = (totalCount, currentPage, perPage) => {
45
242
  const previousPage = currentPage - 1;
46
243
  return {
@@ -48,50 +245,487 @@ var paginate = (totalCount, currentPage, perPage) => {
48
245
  offset: currentPage > 1 ? previousPage * perPage : 0
49
246
  };
50
247
  };
248
+ var formatDate = (date) => {
249
+ const day = date.getDate().toString().padStart(2, "0");
250
+ const month = (date.getMonth() + 1).toString().padStart(2, "0");
251
+ const year = date.getFullYear();
252
+ return `${day}/${month}/${year}`;
253
+ };
254
+ var parseJSON = (value) => {
255
+ try {
256
+ return JSON.parse(value);
257
+ } catch (err) {
258
+ return value;
259
+ }
260
+ };
261
+ var stringifyJSON = (value) => {
262
+ try {
263
+ return JSON.stringify(value);
264
+ } catch (err) {
265
+ return value;
266
+ }
267
+ };
268
+ var isObject = (val) => val && typeof val === "object" && !Array.isArray(val);
269
+ var sleep = (ms) => new Promise((res) => setTimeout(res, ms));
270
+ var capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
271
+ var isEmpty = (val) => val === null || val === void 0 || typeof val === "object" && Object.keys(val).length === 0 || typeof val === "string" && val.trim() === "";
51
272
 
52
- // src/http/index.ts
53
- var import_axios = __toESM(require("axios"), 1);
54
- var makeRequest = async (options) => {
55
- const { url, method = "GET", token, headers = {}, ...rest } = options;
56
- const requestHeaders = {
57
- "X-Requested-With": "XMLHttpRequest",
58
- ...headers
273
+ // src/core/uuid.ts
274
+ var import_uuid = require("uuid");
275
+ var uuid = {
276
+ toBinary: (uuid2) => {
277
+ if (!uuid2)
278
+ uuid2 = (0, import_uuid.v1)();
279
+ else if (typeof uuid2 !== "string" && Buffer.isBuffer(uuid2))
280
+ return uuid2;
281
+ const buf = Buffer.from(uuid2.replace(/-/g, ""), "hex");
282
+ return Buffer.concat([
283
+ buf.subarray(6, 8),
284
+ buf.subarray(4, 6),
285
+ buf.subarray(0, 4),
286
+ buf.subarray(8, 16)
287
+ ]);
288
+ },
289
+ toString: (binary) => {
290
+ if (!binary)
291
+ throw new Error("Kindly supply binary UUID value");
292
+ if (typeof binary === "string")
293
+ return binary;
294
+ return [
295
+ binary.toString("hex", 4, 8),
296
+ binary.toString("hex", 2, 4),
297
+ binary.toString("hex", 0, 2),
298
+ binary.toString("hex", 8, 10),
299
+ binary.toString("hex", 10, 16)
300
+ ].join("-");
301
+ },
302
+ get: (version) => {
303
+ const uuid2 = {
304
+ v1: (0, import_uuid.v1)(),
305
+ v4: (0, import_uuid.v4)()
306
+ };
307
+ return uuid2[version || "v1"];
308
+ },
309
+ isValid: (uuid2) => (0, import_uuid.validate)(uuid2),
310
+ manyToString: (data, keys = []) => {
311
+ if (!data)
312
+ return;
313
+ keys.forEach((key) => {
314
+ if (data[key])
315
+ data[key] = uuid.toString(data[key]);
316
+ });
317
+ return data;
318
+ },
319
+ manyToBinary: (data, keys = []) => {
320
+ if (!data)
321
+ return;
322
+ keys.forEach((key) => {
323
+ if (data[key])
324
+ data[key] = uuid.toBinary(data[key]);
325
+ });
326
+ return data;
327
+ }
328
+ };
329
+
330
+ // src/transport/express/joiValidator.ts
331
+ var validate = (schema, object, option = { abortEarly: true, allowUnknown: false }) => {
332
+ const check = schema.validate(object, option);
333
+ if (check.error) {
334
+ throw new ValidationError(check.error.details[0].message);
335
+ }
336
+ return check.value;
337
+ };
338
+ function joiValidator(constraint, isMiddleware = true) {
339
+ if (!constraint)
340
+ throw new ValidationError(
341
+ "Kindly supply validation schema to joiValidator"
342
+ );
343
+ if (!isMiddleware) {
344
+ return validate(constraint.schema, constraint.data, constraint.option);
345
+ }
346
+ return async (req, res, next) => {
347
+ try {
348
+ if (constraint.body) {
349
+ req.body = validate(
350
+ constraint.body.schema,
351
+ req.body,
352
+ constraint.body.options
353
+ );
354
+ }
355
+ if (constraint.params)
356
+ req.params = validate(
357
+ constraint.params.schema,
358
+ req.params,
359
+ constraint.params.options
360
+ );
361
+ if (constraint.query)
362
+ req.query = validate(
363
+ constraint.query.schema,
364
+ req.query,
365
+ constraint.query.options
366
+ );
367
+ if (constraint.headers)
368
+ req.headers = validate(
369
+ constraint.headers.schema,
370
+ req.headers,
371
+ constraint.headers.options
372
+ );
373
+ return next();
374
+ } catch (err) {
375
+ next(err);
376
+ }
59
377
  };
60
- if (token) {
61
- requestHeaders["Authorization"] = token;
378
+ }
379
+
380
+ // src/adapters/redis.ts
381
+ var import_ioredis = __toESM(require("ioredis"), 1);
382
+ var Redis = class {
383
+ constructor(url, options = {}) {
384
+ if (!url)
385
+ throw new ValidationError("Redis connection URL is required");
386
+ this.client = new import_ioredis.default(url, {
387
+ maxRetriesPerRequest: 3,
388
+ enableReadyCheck: true,
389
+ lazyConnect: true,
390
+ ...options
391
+ });
392
+ this.registerListeners();
62
393
  }
63
- try {
64
- const response = await (0, import_axios.default)({
65
- url,
66
- method,
67
- headers: requestHeaders,
68
- ...rest
394
+ registerListeners() {
395
+ this.client.on("connect", () => {
396
+ console.info("\u{1F534} Redis connected");
69
397
  });
70
- return response.data;
71
- } catch (error) {
72
- if (error.response) {
73
- const enhancedError = {
74
- ...error.response.data,
75
- httpStatusCode: error.response.status,
76
- headers: error.response.headers
77
- };
78
- throw enhancedError;
398
+ this.client.on("ready", () => {
399
+ console.info("\u{1F7E2} Redis ready");
400
+ });
401
+ this.client.on("error", (err) => {
402
+ console.error("\u{1F534} Redis error:", err);
403
+ });
404
+ this.client.on("close", () => {
405
+ console.warn("\u{1F7E0} Redis connection closed");
406
+ });
407
+ this.client.on("reconnecting", () => {
408
+ console.warn("\u{1F7E1} Redis reconnecting...");
409
+ });
410
+ }
411
+ async start() {
412
+ try {
413
+ if (this.client.status === "ready")
414
+ return;
415
+ await this.client.connect();
416
+ } catch (err) {
417
+ throw new ServerError("Failed to connect to Redis", { cause: err });
418
+ }
419
+ }
420
+ async disconnect() {
421
+ try {
422
+ if (this.client.status !== "end") {
423
+ await this.client.quit();
424
+ }
425
+ } catch {
426
+ await this.client.disconnect();
427
+ }
428
+ }
429
+ async keys(pattern) {
430
+ if (!pattern || typeof pattern !== "string") {
431
+ throw new ValidationError("Redis key pattern must be a string");
432
+ }
433
+ return this.client.keys(pattern);
434
+ }
435
+ serialize(data) {
436
+ if (typeof data === "string")
437
+ return data;
438
+ if (typeof data === "number")
439
+ return String(data);
440
+ return JSON.stringify(data);
441
+ }
442
+ deserialize(data, parse = true) {
443
+ if (!parse || !data)
444
+ return data;
445
+ return parseJSON(data);
446
+ }
447
+ async set(key, data) {
448
+ if (!key || typeof key !== "string") {
449
+ throw new ValidationError("Redis key must be a string");
450
+ }
451
+ return this.client.set(key, this.serialize(data));
452
+ }
453
+ async setEx(key, data, duration) {
454
+ if (!key || typeof key !== "string") {
455
+ throw new ValidationError("Redis key must be a string");
456
+ }
457
+ const ttl = this.parseDuration(duration);
458
+ return this.client.setex(key, ttl, this.serialize(data));
459
+ }
460
+ async get(key, parse = true) {
461
+ if (!key || typeof key !== "string") {
462
+ throw new ValidationError("Redis key must be a string");
463
+ }
464
+ const data = await this.client.get(key);
465
+ return this.deserialize(data, parse);
466
+ }
467
+ async delete(key) {
468
+ if (!key || typeof key !== "string") {
469
+ throw new ValidationError("Redis key must be a string");
470
+ }
471
+ return Boolean(await this.client.del(key));
472
+ }
473
+ async deleteAll(prefix) {
474
+ const keys = await this.keys(prefix);
475
+ if (!keys.length)
476
+ return 0;
477
+ return this.client.del(...keys);
478
+ }
479
+ async exists(key) {
480
+ return Boolean(await this.client.exists(key));
481
+ }
482
+ async ttl(key) {
483
+ return this.client.ttl(key);
484
+ }
485
+ async expire(key, duration) {
486
+ const ttl = this.parseDuration(duration);
487
+ return Boolean(await this.client.expire(key, ttl));
488
+ }
489
+ async flush() {
490
+ await this.client.flushdb();
491
+ }
492
+ // ───────────────────────────────
493
+ // Auth Cache Helpers
494
+ // ───────────────────────────────
495
+ async getCachedUser(id, throwError = true) {
496
+ const userToken = `${id}-token`;
497
+ const user = await this.get(userToken);
498
+ if (!user && throwError) {
499
+ throw new AuthenticationError("Kindly login, user not found");
500
+ }
501
+ return user;
502
+ }
503
+ async cacheUser(user, ttl = "1 day") {
504
+ if (!user?.id || !user?.tokenRef) {
505
+ throw new ValidationError("Invalid user object for caching");
79
506
  }
80
- throw error;
507
+ await Promise.all([
508
+ this.setEx(user.tokenRef, user, ttl),
509
+ this.setEx(`${user.id}-token`, user, ttl)
510
+ ]);
511
+ }
512
+ async updateAuthData(userId, key, value, action = "ADD") {
513
+ const user = await this.getCachedUser(userId, false);
514
+ if (!user)
515
+ return null;
516
+ if (!Array.isArray(user[key]))
517
+ return user;
518
+ if (action === "ADD" && !user[key].includes(value)) {
519
+ user[key].push(value);
520
+ }
521
+ if (action === "REMOVE") {
522
+ user[key] = user[key].filter((v) => v !== value);
523
+ }
524
+ await this.cacheUser(user);
525
+ return user;
526
+ }
527
+ // ───────────────────────────────
528
+ // Helpers
529
+ // ───────────────────────────────
530
+ parseDuration(duration) {
531
+ if (typeof duration === "number")
532
+ return duration;
533
+ const [valueStr, unit] = duration.split(" ");
534
+ const value = Number(valueStr);
535
+ if (Number.isNaN(value)) {
536
+ throw new ValidationError(`Invalid duration format: ${duration}`);
537
+ }
538
+ switch (unit) {
539
+ case "days":
540
+ case "day":
541
+ return value * 86400;
542
+ case "hours":
543
+ case "hour":
544
+ return value * 3600;
545
+ case "minutes":
546
+ case "minute":
547
+ return value * 60;
548
+ case "seconds":
549
+ case "second":
550
+ return value;
551
+ default:
552
+ throw new ValidationError(`Invalid duration unit: ${unit}`);
553
+ }
554
+ }
555
+ };
556
+
557
+ // src/adapters/sqs.ts
558
+ var import_aws_sdk = __toESM(require("aws-sdk"), 1);
559
+ var SQS = class {
560
+ constructor(config, logger) {
561
+ this.logger = logger || {
562
+ info: (msg, meta) => console.info(msg, meta),
563
+ error: (msg, meta) => console.error(msg, meta),
564
+ warn: (msg, meta) => console.warn(msg, meta),
565
+ debug: (msg, meta) => console.debug(msg, meta)
566
+ };
567
+ this.client = new import_aws_sdk.default.SQS({
568
+ region: config.region,
569
+ accessKeyId: config.accessKeyId,
570
+ secretAccessKey: config.secretAccessKey
571
+ });
572
+ this.logger.info("SQS client initialized", { region: config.region });
573
+ }
574
+ async enqueue({ queueUrl, message }) {
575
+ try {
576
+ await this.client.sendMessage({
577
+ QueueUrl: queueUrl,
578
+ MessageBody: typeof message === "string" ? message : JSON.stringify(message)
579
+ }).promise();
580
+ this.logger.info("Message enqueued", { queueUrl });
581
+ return true;
582
+ } catch (err) {
583
+ this.logger.error("SQSEnqueueError", { err, queueUrl });
584
+ throw new ServerError("Failed to enqueue SQS message", { cause: err });
585
+ }
586
+ }
587
+ async dequeue(fields) {
588
+ const {
589
+ queueUrl,
590
+ consumerFunction,
591
+ dlqUrl,
592
+ maxNumberOfMessages = 10,
593
+ waitTimeSeconds = 20
594
+ } = fields;
595
+ while (true) {
596
+ try {
597
+ const { Messages } = await this.client.receiveMessage({
598
+ QueueUrl: queueUrl,
599
+ MaxNumberOfMessages: maxNumberOfMessages,
600
+ WaitTimeSeconds: waitTimeSeconds
601
+ }).promise();
602
+ if (Messages?.length) {
603
+ for (const { Body, ReceiptHandle } of Messages) {
604
+ if (!Body || !ReceiptHandle)
605
+ continue;
606
+ try {
607
+ const message = parseJSON(Body);
608
+ await consumerFunction(message);
609
+ } catch (err) {
610
+ this.logger.error("SQSConsumerError", { err, queueUrl });
611
+ if (dlqUrl) {
612
+ await this.enqueue({ queueUrl: dlqUrl, message: Body });
613
+ }
614
+ } finally {
615
+ await this.client.deleteMessage({
616
+ QueueUrl: queueUrl,
617
+ ReceiptHandle
618
+ }).promise();
619
+ }
620
+ }
621
+ }
622
+ } catch (err) {
623
+ this.logger.error("SQSPollingError", { err, queueUrl });
624
+ }
625
+ }
626
+ }
627
+ };
628
+
629
+ // src/adapters/loggers/winston.ts
630
+ var import_winston = __toESM(require("winston"), 1);
631
+ var WinstonLogger = class {
632
+ constructor() {
633
+ this.logger = import_winston.default.createLogger({
634
+ transports: [new import_winston.default.transports.Console()]
635
+ });
636
+ }
637
+ info(message, meta) {
638
+ this.logger.info(message, meta);
639
+ }
640
+ error(message, meta) {
641
+ this.logger.error(message, meta);
642
+ }
643
+ warn(message, meta) {
644
+ this.logger.warn(message, meta);
645
+ }
646
+ debug(message, meta) {
647
+ this.logger.debug(message, meta);
648
+ }
649
+ };
650
+
651
+ // src/security/jwt.ts
652
+ var import_jsonwebtoken = __toESM(require("jsonwebtoken"), 1);
653
+ var jwtService = {
654
+ async encode({
655
+ data,
656
+ secretKey,
657
+ expiresIn = "24h",
658
+ algorithm = "HS256"
659
+ }) {
660
+ if (!secretKey) {
661
+ throw new ValidationError("Secret key is required for JWT encoding");
662
+ }
663
+ const options = {
664
+ expiresIn,
665
+ algorithm
666
+ };
667
+ return new Promise((resolve, reject) => {
668
+ import_jsonwebtoken.default.sign(data, secretKey, options, (err, token) => {
669
+ if (err || !token)
670
+ return reject(err);
671
+ resolve(token);
672
+ });
673
+ });
674
+ },
675
+ async decode({
676
+ token,
677
+ secretKey,
678
+ algorithms
679
+ }) {
680
+ if (!secretKey) {
681
+ throw new ValidationError("Secret key is required for JWT verification");
682
+ }
683
+ if (!token) {
684
+ throw new ValidationError("JWT token is required");
685
+ }
686
+ const options = {};
687
+ if (algorithms) {
688
+ options.algorithms = algorithms;
689
+ }
690
+ return new Promise((resolve, reject) => {
691
+ import_jsonwebtoken.default.verify(token, secretKey, options, (err, decoded) => {
692
+ if (err)
693
+ return reject(err);
694
+ resolve(decoded);
695
+ });
696
+ });
81
697
  }
82
698
  };
83
- var get = (url, options) => makeRequest({ ...options, url, method: "GET" });
84
- var post = (url, data, options) => makeRequest({ ...options, url, method: "POST", data });
85
- var put = (url, data, options) => makeRequest({ ...options, url, method: "PUT", data });
86
- var patch = (url, data, options) => makeRequest({ ...options, url, method: "PATCH", data });
87
- var del = (url, options) => makeRequest({ ...options, url, method: "DELETE" });
88
699
  // Annotate the CommonJS export names for ESM import in node:
89
700
  0 && (module.exports = {
90
- del,
91
- get,
701
+ AppError,
702
+ AuthenticationError,
703
+ AuthorizationError,
704
+ BadRequestError,
705
+ ExistingError,
706
+ HTTP_STATUS,
707
+ HTTP_STATUS_CODE_ERROR,
708
+ NoContent,
709
+ NotFoundError,
710
+ Redis,
711
+ SQS,
712
+ ServerError,
713
+ TokenExpiredError,
714
+ TokenInvalidError,
715
+ ValidationError,
716
+ WinstonLogger,
717
+ capitalize,
718
+ errorHandler,
719
+ expressErrorMiddleware,
720
+ formatDate,
721
+ isEmpty,
722
+ isObject,
723
+ joiValidator,
724
+ jwtService,
92
725
  makeRequest,
93
726
  paginate,
94
- patch,
95
- post,
96
- put
727
+ parseJSON,
728
+ sleep,
729
+ stringifyJSON,
730
+ uuid
97
731
  });