@6thbridge/utils 1.9.0-1 → 1.9.0-2
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/lib/actions/database-session.action.d.ts +13 -0
- package/lib/actions/database-session.action.js +77 -0
- package/lib/actions/database-session.action.js.map +1 -0
- package/lib/actions/database-session.action.test.d.ts +1 -0
- package/lib/actions/database-session.action.test.js +137 -0
- package/lib/actions/database-session.action.test.js.map +1 -0
- package/lib/actions/index.d.ts +2 -0
- package/lib/actions/index.js +2 -0
- package/lib/actions/index.js.map +1 -1
- package/lib/actions/lock.action.d.ts +16 -0
- package/lib/actions/lock.action.js +171 -0
- package/lib/actions/lock.action.js.map +1 -0
- package/lib/actions/lock.action.test.d.ts +1 -0
- package/lib/actions/lock.action.test.js +63 -0
- package/lib/actions/lock.action.test.js.map +1 -0
- package/lib/data/rabbitmq/index.d.ts +3 -2
- package/lib/data/rabbitmq/index.js +3 -0
- package/lib/data/rabbitmq/index.js.map +1 -1
- package/lib/database/MongoDBRepository.d.ts +27 -120
- package/lib/database/MongoDBRepository.js +49 -41
- package/lib/database/MongoDBRepository.js.map +1 -1
- package/lib/database/MongoDBTypeRepository.d.ts +51 -0
- package/lib/database/MongoDBTypeRepository.js +90 -0
- package/lib/database/MongoDBTypeRepository.js.map +1 -0
- package/lib/database/index.d.ts +2 -0
- package/lib/database/index.js +4 -0
- package/lib/database/index.js.map +1 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.js +25 -16
- package/lib/index.js.map +1 -1
- package/lib/logger/batching.d.ts +7 -0
- package/lib/logger/batching.js +90 -0
- package/lib/logger/batching.js.map +1 -0
- package/lib/logger/batching.spec.d.ts +1 -0
- package/lib/logger/batching.spec.js +108 -0
- package/lib/logger/batching.spec.js.map +1 -0
- package/lib/logger/index.d.ts +1 -0
- package/lib/logger/index.js +5 -1
- package/lib/logger/index.js.map +1 -1
- package/lib/logger/logger-test.js +53 -24
- package/lib/logger/logger-test.js.map +1 -1
- package/lib/logger/logger.js +8 -23
- package/lib/logger/logger.js.map +1 -1
- package/lib/logger/redact.js +1 -1
- package/lib/logger/redact.js.map +1 -1
- package/lib/logger/test.spec.js +57 -0
- package/lib/logger/test.spec.js.map +1 -1
- package/lib/middlewares/common.js +7 -7
- package/lib/middlewares/common.js.map +1 -1
- package/lib/middlewares/error.middleware.d.ts +12 -0
- package/lib/middlewares/error.middleware.js +57 -0
- package/lib/middlewares/error.middleware.js.map +1 -0
- package/lib/middlewares/error.middleware.test.d.ts +1 -0
- package/lib/middlewares/error.middleware.test.js +45 -0
- package/lib/middlewares/error.middleware.test.js.map +1 -0
- package/lib/middlewares/express.d.ts +1 -0
- package/lib/middlewares/express.js +43 -9
- package/lib/middlewares/express.js.map +1 -1
- package/lib/middlewares/index.js +17 -7
- package/lib/middlewares/index.js.map +1 -1
- package/lib/monitoring/index.js +3 -3
- package/lib/monitoring/index.js.map +1 -1
- package/lib/monitoring/rollbar.js +2 -2
- package/lib/monitoring/rollbar.js.map +1 -1
- package/lib/pipelines/index.d.ts +3 -0
- package/lib/pipelines/index.js +20 -0
- package/lib/pipelines/index.js.map +1 -0
- package/lib/pipelines/parallel-pipeline.d.ts +7 -0
- package/lib/pipelines/parallel-pipeline.js +49 -0
- package/lib/pipelines/parallel-pipeline.js.map +1 -0
- package/lib/pipelines/pipeline-step.d.ts +5 -0
- package/lib/pipelines/pipeline-step.js +3 -0
- package/lib/pipelines/pipeline-step.js.map +1 -0
- package/lib/pipelines/pipeline.example.d.ts +2 -0
- package/lib/pipelines/pipeline.example.js +96 -0
- package/lib/pipelines/pipeline.example.js.map +1 -0
- package/lib/pipelines/pipelines.test.d.ts +1 -0
- package/lib/pipelines/pipelines.test.js +204 -0
- package/lib/pipelines/pipelines.test.js.map +1 -0
- package/lib/pipelines/pipelines.typecheck.d.ts +1 -0
- package/lib/pipelines/pipelines.typecheck.js +68 -0
- package/lib/pipelines/pipelines.typecheck.js.map +1 -0
- package/lib/pipelines/serial-pipeline.d.ts +7 -0
- package/lib/pipelines/serial-pipeline.js +39 -0
- package/lib/pipelines/serial-pipeline.js.map +1 -0
- package/lib/responses/express.d.ts +1 -1
- package/lib/responses/express.js +4 -4
- package/lib/responses/express.js.map +1 -1
- package/lib/responses/index.js +17 -7
- package/lib/responses/index.js.map +1 -1
- package/lib/schemas/country.schema.d.ts +5 -0
- package/lib/schemas/country.schema.js +15 -0
- package/lib/schemas/country.schema.js.map +1 -0
- package/lib/schemas/index.d.ts +2 -0
- package/lib/schemas/index.js +21 -0
- package/lib/schemas/index.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types/context.entity.d.ts +20 -0
- package/lib/types/context.entity.js +64 -8
- package/lib/types/context.entity.js.map +1 -1
- package/lib/types/integrations/credential.entity.d.ts +1 -0
- package/lib/types/integrations/credential.entity.js +5 -0
- package/lib/types/integrations/credential.entity.js.map +1 -1
- package/lib/types/integrations/integration.entity.d.ts +5 -1
- package/lib/types/integrations/integration.entity.js +10 -1
- package/lib/types/integrations/integration.entity.js.map +1 -1
- package/lib/types/route.entity.d.ts +1 -1
- package/lib/utils/amount.js +0 -1
- package/lib/utils/amount.js.map +1 -1
- package/lib/utils/database.d.ts +2 -0
- package/lib/utils/database.js +35 -6
- package/lib/utils/database.js.map +1 -1
- package/lib/utils/database.spec.js +229 -185
- package/lib/utils/database.spec.js.map +1 -1
- package/lib/utils/file.d.ts +3 -2
- package/lib/utils/file.js.map +1 -1
- package/lib/utils/helper.d.ts +2 -0
- package/lib/utils/helper.js +20 -0
- package/lib/utils/helper.js.map +1 -1
- package/lib/utils/helper.spec.js +56 -0
- package/lib/utils/helper.spec.js.map +1 -1
- package/lib/utils/http.d.ts +3 -4
- package/lib/utils/http.js +68 -44
- package/lib/utils/http.js.map +1 -1
- package/lib/utils/http.spec.d.ts +1 -0
- package/lib/utils/http.spec.js +121 -0
- package/lib/utils/http.spec.js.map +1 -0
- package/lib/utils/phoneNumber.d.ts +2 -2
- package/lib/utils/phoneNumber.js +17 -7
- package/lib/utils/phoneNumber.js.map +1 -1
- package/lib/utils/phoneNumber.spec.js +20 -0
- package/lib/utils/phoneNumber.spec.js.map +1 -1
- package/lib/utils/validator.d.ts +3 -2
- package/lib/utils/validator.js +40 -14
- package/lib/utils/validator.js.map +1 -1
- package/lib/utils/validator.spec.js +130 -14
- package/lib/utils/validator.spec.js.map +1 -1
- package/package.json +30 -23
- package/readme.md +37 -2
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ContextEntity } from '../types';
|
|
2
|
+
import type { ClientSession, Model } from 'mongoose';
|
|
3
|
+
import type { Lock } from 'redlock';
|
|
4
|
+
export type DatabaseSessionActionOptions = {
|
|
5
|
+
lockKey?: string[];
|
|
6
|
+
lockTTLInSeconds?: number;
|
|
7
|
+
};
|
|
8
|
+
export declare class DatabaseSessionAction {
|
|
9
|
+
private static model;
|
|
10
|
+
static configure(model: Model<any>): void;
|
|
11
|
+
static withTransaction<T>(context: ContextEntity, action: (session: ClientSession | null, lock: Lock | null) => Promise<T>, options?: DatabaseSessionActionOptions): Promise<T>;
|
|
12
|
+
private static getModel;
|
|
13
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DatabaseSessionAction = void 0;
|
|
13
|
+
const lock_action_1 = require("./lock.action");
|
|
14
|
+
class DatabaseSessionAction {
|
|
15
|
+
static configure(model) {
|
|
16
|
+
this.model = model;
|
|
17
|
+
}
|
|
18
|
+
static withTransaction(context, action, options) {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
let lock = null;
|
|
22
|
+
let session = null;
|
|
23
|
+
try {
|
|
24
|
+
if ((_a = options === null || options === void 0 ? void 0 : options.lockKey) === null || _a === void 0 ? void 0 : _a.length) {
|
|
25
|
+
lock = yield lock_action_1.LockAction.acquireMultipleLocks(context, options.lockKey, options.lockTTLInSeconds || 10);
|
|
26
|
+
}
|
|
27
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
28
|
+
console.log('!!! Database session is not started in non-production env');
|
|
29
|
+
return yield action(null, lock);
|
|
30
|
+
}
|
|
31
|
+
console.log('!!! Using Database session in prod env');
|
|
32
|
+
session = yield this.getModel().startSession();
|
|
33
|
+
session.startTransaction();
|
|
34
|
+
const response = yield action(session, lock);
|
|
35
|
+
yield session.commitTransaction();
|
|
36
|
+
return response;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (session) {
|
|
40
|
+
try {
|
|
41
|
+
yield session.abortTransaction();
|
|
42
|
+
}
|
|
43
|
+
catch (cleanupError) {
|
|
44
|
+
context.logger.exception(cleanupError, { operation: 'endSession' });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
if (session) {
|
|
51
|
+
try {
|
|
52
|
+
yield session.endSession();
|
|
53
|
+
}
|
|
54
|
+
catch (cleanupError) {
|
|
55
|
+
context.logger.exception(cleanupError, { operation: 'endSession' });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (lock && ((_b = options === null || options === void 0 ? void 0 : options.lockKey) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
59
|
+
try {
|
|
60
|
+
yield lock_action_1.LockAction.releaseMultipleLock(context, lock, options.lockKey);
|
|
61
|
+
}
|
|
62
|
+
catch (cleanupError) {
|
|
63
|
+
context.logger.exception(cleanupError, { operation: 'releaseMultipleLock', keys: options.lockKey });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
static getModel() {
|
|
70
|
+
if (!this.model)
|
|
71
|
+
throw new Error('DatabaseSessionAction has not been configured');
|
|
72
|
+
return this.model;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.DatabaseSessionAction = DatabaseSessionAction;
|
|
76
|
+
DatabaseSessionAction.model = null;
|
|
77
|
+
//# sourceMappingURL=database-session.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-session.action.js","sourceRoot":"","sources":["../../src/actions/database-session.action.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,+CAA2C;AAO3C,MAAa,qBAAqB;IAGhC,MAAM,CAAC,SAAS,CAAC,KAAiB;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAO,eAAe,CAC1B,OAAsB,EACtB,MAAwE,EACxE,OAAsC;;;YAEtC,IAAI,IAAI,GAAgB,IAAI,CAAC;YAC7B,IAAI,OAAO,GAAyB,IAAI,CAAC;YAEzC,IAAI,CAAC;gBACH,IAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,MAAM,EAAE,CAAC;oBAC7B,IAAI,GAAG,MAAM,wBAAU,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;gBACzG,CAAC;gBAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;oBAC1C,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;oBACzE,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAClC,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;gBACtD,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,EAAE,CAAC;gBAC/C,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAE3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7C,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAClC,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC;wBACH,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBACnC,CAAC;oBAAC,OAAO,YAAY,EAAE,CAAC;wBACtB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,YAAqB,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;oBAC/E,CAAC;gBACH,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC;wBACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC7B,CAAC;oBAAC,OAAO,YAAY,EAAE,CAAC;wBACtB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,YAAqB,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;oBAC/E,CAAC;gBACH,CAAC;gBAED,IAAI,IAAI,KAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,MAAM,CAAA,EAAE,CAAC;oBACrC,IAAI,CAAC;wBACH,MAAM,wBAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBACvE,CAAC;oBAAC,OAAO,YAAY,EAAE,CAAC;wBACtB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,YAAqB,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC/G,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAEO,MAAM,CAAC,QAAQ;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAElF,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;;AAhEH,sDAiEC;AAhEgB,2BAAK,GAAsB,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const types_1 = require("../types");
|
|
16
|
+
const database_session_action_1 = require("./database-session.action");
|
|
17
|
+
const redlock_1 = __importDefault(require("redlock"));
|
|
18
|
+
const lock_action_1 = require("./lock.action");
|
|
19
|
+
const createLogger = () => ({
|
|
20
|
+
exception: jest.fn(),
|
|
21
|
+
});
|
|
22
|
+
const createContext = (logger) => {
|
|
23
|
+
const context = new types_1.ContextEntity();
|
|
24
|
+
context.logger = logger;
|
|
25
|
+
return context;
|
|
26
|
+
};
|
|
27
|
+
const createSession = (events) => ({
|
|
28
|
+
startTransaction: jest.fn(() => { events.push('start'); }),
|
|
29
|
+
commitTransaction: jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { events.push('commit'); })),
|
|
30
|
+
abortTransaction: jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { events.push('abort'); })),
|
|
31
|
+
endSession: jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { events.push('end'); })),
|
|
32
|
+
});
|
|
33
|
+
const configureActions = (session, events) => {
|
|
34
|
+
const lock = { release: jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { events.push('release'); })) };
|
|
35
|
+
const redisClient = { getRedisCommander: jest.fn().mockReturnValue({}) };
|
|
36
|
+
lock_action_1.LockAction.configure(redisClient);
|
|
37
|
+
jest.spyOn(redlock_1.default.prototype, 'acquire').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
38
|
+
events.push('acquire');
|
|
39
|
+
return lock;
|
|
40
|
+
}));
|
|
41
|
+
const model = {
|
|
42
|
+
startSession: jest.fn(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
43
|
+
events.push('session');
|
|
44
|
+
return session;
|
|
45
|
+
})),
|
|
46
|
+
};
|
|
47
|
+
database_session_action_1.DatabaseSessionAction.configure(model);
|
|
48
|
+
return { redisClient };
|
|
49
|
+
};
|
|
50
|
+
describe('DatabaseSessionAction', () => {
|
|
51
|
+
const originalNodeEnv = process.env.NODE_ENV;
|
|
52
|
+
beforeEach(() => {
|
|
53
|
+
process.env.NODE_ENV = 'production';
|
|
54
|
+
});
|
|
55
|
+
afterEach(() => jest.restoreAllMocks());
|
|
56
|
+
afterAll(() => {
|
|
57
|
+
process.env.NODE_ENV = originalNodeEnv;
|
|
58
|
+
});
|
|
59
|
+
it('commits the callback result and cleans up its session and lock once', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
+
const events = [];
|
|
61
|
+
const session = createSession(events);
|
|
62
|
+
configureActions(session, events);
|
|
63
|
+
yield expect(database_session_action_1.DatabaseSessionAction.withTransaction(createContext(createLogger()), (activeSession) => __awaiter(void 0, void 0, void 0, function* () {
|
|
64
|
+
expect(activeSession).toBe(session);
|
|
65
|
+
events.push('action');
|
|
66
|
+
return 'done';
|
|
67
|
+
}), { lockKey: ['wallet:1'], lockTTLInSeconds: 5 })).resolves.toBe('done');
|
|
68
|
+
expect(events).toEqual(['acquire', 'session', 'start', 'action', 'commit', 'end', 'release']);
|
|
69
|
+
expect(session.abortTransaction).not.toHaveBeenCalled();
|
|
70
|
+
}));
|
|
71
|
+
it('skips sessions outside production while preserving the configured lock', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
72
|
+
process.env.NODE_ENV = 'development';
|
|
73
|
+
const events = [];
|
|
74
|
+
const session = createSession(events);
|
|
75
|
+
configureActions(session, events);
|
|
76
|
+
yield expect(database_session_action_1.DatabaseSessionAction.withTransaction(createContext(createLogger()), (activeSession) => __awaiter(void 0, void 0, void 0, function* () {
|
|
77
|
+
expect(activeSession).toBeNull();
|
|
78
|
+
events.push('action');
|
|
79
|
+
return 'done';
|
|
80
|
+
}), { lockKey: ['wallet:1'] })).resolves.toBe('done');
|
|
81
|
+
expect(events).toEqual(['acquire', 'action', 'release']);
|
|
82
|
+
expect(session.startTransaction).not.toHaveBeenCalled();
|
|
83
|
+
}));
|
|
84
|
+
it('aborts the transaction and still cleans up when the callback fails', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
85
|
+
const events = [];
|
|
86
|
+
const session = createSession(events);
|
|
87
|
+
configureActions(session, events);
|
|
88
|
+
const error = new Error('write failed');
|
|
89
|
+
yield expect(database_session_action_1.DatabaseSessionAction.withTransaction(createContext(createLogger()), () => __awaiter(void 0, void 0, void 0, function* () {
|
|
90
|
+
events.push('action');
|
|
91
|
+
throw error;
|
|
92
|
+
}), { lockKey: ['wallet:1'] })).rejects.toThrow(error);
|
|
93
|
+
expect(events).toEqual(['acquire', 'session', 'start', 'action', 'abort', 'end', 'release']);
|
|
94
|
+
}));
|
|
95
|
+
it('aborts and cleans up when commit fails', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
96
|
+
const events = [];
|
|
97
|
+
const session = createSession(events);
|
|
98
|
+
const error = new Error('commit failed');
|
|
99
|
+
session.commitTransaction.mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
100
|
+
events.push('commit');
|
|
101
|
+
throw error;
|
|
102
|
+
}));
|
|
103
|
+
configureActions(session, events);
|
|
104
|
+
yield expect(database_session_action_1.DatabaseSessionAction.withTransaction(createContext(createLogger()), () => __awaiter(void 0, void 0, void 0, function* () { return 'done'; }))).rejects.toThrow(error);
|
|
105
|
+
expect(events).toEqual(['session', 'start', 'commit', 'abort', 'end']);
|
|
106
|
+
}));
|
|
107
|
+
it('releases the lock when session creation fails', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
108
|
+
const events = [];
|
|
109
|
+
const session = createSession(events);
|
|
110
|
+
configureActions(session, events);
|
|
111
|
+
const error = new Error('session unavailable');
|
|
112
|
+
const model = { startSession: jest.fn().mockRejectedValue(error) };
|
|
113
|
+
database_session_action_1.DatabaseSessionAction.configure(model);
|
|
114
|
+
yield expect(database_session_action_1.DatabaseSessionAction.withTransaction(createContext(createLogger()), () => __awaiter(void 0, void 0, void 0, function* () { return 'done'; }), { lockKey: ['wallet:1'] })).rejects.toThrow(error);
|
|
115
|
+
expect(events).toEqual(['acquire', 'release']);
|
|
116
|
+
}));
|
|
117
|
+
it('logs cleanup failures with the caller context logger without replacing the callback result', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
118
|
+
const events = [];
|
|
119
|
+
const session = createSession(events);
|
|
120
|
+
const endError = new Error('end failed');
|
|
121
|
+
const releaseError = new Error('release failed');
|
|
122
|
+
session.endSession.mockRejectedValue(endError);
|
|
123
|
+
const logger = createLogger();
|
|
124
|
+
const lock = { release: jest.fn().mockRejectedValue(releaseError) };
|
|
125
|
+
const redisClient = { getRedisCommander: jest.fn().mockReturnValue({}) };
|
|
126
|
+
const model = { startSession: jest.fn().mockResolvedValue(session) };
|
|
127
|
+
lock_action_1.LockAction.configure(redisClient);
|
|
128
|
+
jest.spyOn(redlock_1.default.prototype, 'acquire').mockResolvedValue(lock);
|
|
129
|
+
database_session_action_1.DatabaseSessionAction.configure(model);
|
|
130
|
+
yield expect(database_session_action_1.DatabaseSessionAction.withTransaction(createContext(logger), () => __awaiter(void 0, void 0, void 0, function* () { return 'done'; }), { lockKey: ['wallet:1'] })).resolves.toBe('done');
|
|
131
|
+
expect(logger.exception).toHaveBeenCalledWith(endError, { operation: 'endSession' });
|
|
132
|
+
expect(logger.exception).toHaveBeenCalledWith(releaseError, expect.objectContaining({
|
|
133
|
+
errorCode: 'ResourceLockError',
|
|
134
|
+
}));
|
|
135
|
+
}));
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=database-session.action.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-session.action.test.js","sourceRoot":"","sources":["../../src/actions/database-session.action.test.ts"],"names":[],"mappings":"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"}
|
package/lib/actions/index.d.ts
CHANGED
package/lib/actions/index.js
CHANGED
|
@@ -14,6 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./database-session.action"), exports);
|
|
18
|
+
__exportStar(require("./lock.action"), exports);
|
|
17
19
|
__exportStar(require("./charge.action"), exports);
|
|
18
20
|
__exportStar(require("./charge.action"), exports);
|
|
19
21
|
__exportStar(require("./permission.action"), exports);
|
package/lib/actions/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,kDAAiC;AACjC,sDAAqC;AACrC,iDAAgC;AAEhC,uDAAqC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,gDAA8B;AAC9B,kDAAgC;AAChC,kDAAiC;AACjC,sDAAqC;AACrC,iDAAgC;AAEhC,uDAAqC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ContextEntity } from '../types';
|
|
2
|
+
import { RedisClient } from '../data/redis';
|
|
3
|
+
import Redlock from 'redlock';
|
|
4
|
+
import type { Lock } from 'redlock';
|
|
5
|
+
export type LockActionConfiguration = {
|
|
6
|
+
client: Redlock;
|
|
7
|
+
};
|
|
8
|
+
export declare class LockAction {
|
|
9
|
+
private static configuration;
|
|
10
|
+
static configure(redisClient: RedisClient): void;
|
|
11
|
+
static acquireMultipleLocks(context: ContextEntity, keys: string[], durationInSeconds: number): Promise<Lock>;
|
|
12
|
+
static getLock(context: ContextEntity, key: string, durationInSeconds: number): Promise<Lock>;
|
|
13
|
+
static releaseLock(context: ContextEntity, lock: Lock, key?: string): Promise<Lock>;
|
|
14
|
+
static releaseMultipleLock(context: ContextEntity, lock: Lock, keys: string[]): Promise<Lock>;
|
|
15
|
+
private static getConfiguration;
|
|
16
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
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
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.LockAction = void 0;
|
|
46
|
+
const types_1 = require("../types");
|
|
47
|
+
const logger_1 = require("../logger");
|
|
48
|
+
const redlock_1 = __importStar(require("redlock"));
|
|
49
|
+
class LockAction {
|
|
50
|
+
static configure(redisClient) {
|
|
51
|
+
const client = new redlock_1.default([redisClient.getRedisCommander()], {
|
|
52
|
+
driftFactor: 0.01,
|
|
53
|
+
retryCount: 20,
|
|
54
|
+
retryDelay: 2000,
|
|
55
|
+
retryJitter: 200,
|
|
56
|
+
automaticExtensionThreshold: 500,
|
|
57
|
+
});
|
|
58
|
+
client.on('error', (error) => {
|
|
59
|
+
if (error instanceof redlock_1.ResourceLockedError) {
|
|
60
|
+
logger_1.logger.error('ResourceLockedError', {
|
|
61
|
+
logType: 'resource-locked-error',
|
|
62
|
+
message: error.message,
|
|
63
|
+
stack: new Error('resource-locked-error').stack,
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
logger_1.logger.exception(error, {
|
|
68
|
+
tag: 'redlock-exception',
|
|
69
|
+
stack: new Error('redlock-exception').stack,
|
|
70
|
+
status: 400,
|
|
71
|
+
});
|
|
72
|
+
logger_1.logger.error('RedLockError', {
|
|
73
|
+
logType: 'red-lock-error',
|
|
74
|
+
message: error.message,
|
|
75
|
+
stack: new Error('red-lock-error').stack,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
this.configuration = { client };
|
|
79
|
+
}
|
|
80
|
+
static acquireMultipleLocks(context, keys, durationInSeconds) {
|
|
81
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
const uniqueKeys = [...new Set(keys)];
|
|
83
|
+
const { client } = this.getConfiguration();
|
|
84
|
+
try {
|
|
85
|
+
return yield client.acquire(uniqueKeys, durationInSeconds * 1000);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
context.logger.exception(error, {
|
|
89
|
+
logType: 'RedlockSecurityException',
|
|
90
|
+
errorCode: 'ResourceLockError',
|
|
91
|
+
keys,
|
|
92
|
+
durationInSeconds,
|
|
93
|
+
});
|
|
94
|
+
throw new types_1.CustomException({
|
|
95
|
+
message: `Security Exception: Oops! We are unable to get resources lock on ${keys.join('|')}. Please try again`,
|
|
96
|
+
errorCode: 'ResourceLockError',
|
|
97
|
+
statusCode: 400,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
static getLock(context, key, durationInSeconds) {
|
|
103
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
104
|
+
const { client } = this.getConfiguration();
|
|
105
|
+
try {
|
|
106
|
+
return yield client.acquire([key], durationInSeconds * 1000);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
context.logger.exception(error, {
|
|
110
|
+
logType: 'RedlockSecurityException',
|
|
111
|
+
errorCode: 'ResourceLockError',
|
|
112
|
+
message: `Security Exception: Oops! We are unable to release lock for resource ${key}. Please try again`,
|
|
113
|
+
key,
|
|
114
|
+
durationInSeconds,
|
|
115
|
+
status: 499,
|
|
116
|
+
});
|
|
117
|
+
throw new types_1.CustomException({
|
|
118
|
+
message: `Security Exception: Oops! We are unable to get resource lock on ${key}. Please try again`,
|
|
119
|
+
errorCode: 'ResourceLockError',
|
|
120
|
+
statusCode: 400,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
static releaseLock(context, lock, key) {
|
|
126
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
this.getConfiguration();
|
|
128
|
+
try {
|
|
129
|
+
yield lock.release();
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
context.logger.exception(error, {
|
|
133
|
+
logType: 'RedlockSecurityException',
|
|
134
|
+
key,
|
|
135
|
+
message: `Security Exception: Oops! We are unable to release lock for resource ${key}. Please try again`,
|
|
136
|
+
errorCode: 'ResourceLockError',
|
|
137
|
+
tag: 'releaseWalletLock',
|
|
138
|
+
status: 499,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return lock;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
static releaseMultipleLock(context, lock, keys) {
|
|
145
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
146
|
+
this.getConfiguration();
|
|
147
|
+
try {
|
|
148
|
+
yield lock.release();
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
context.logger.exception(error, {
|
|
152
|
+
logType: 'RedlockSecurityException',
|
|
153
|
+
keys,
|
|
154
|
+
message: `Security Exception: Oops! We are unable to release lock for resources ${keys.join('|')}. Please try again`,
|
|
155
|
+
errorCode: 'ResourceLockError',
|
|
156
|
+
tag: 'releaseWalletLock',
|
|
157
|
+
status: 499,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return lock;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
static getConfiguration() {
|
|
164
|
+
if (!this.configuration)
|
|
165
|
+
throw new Error('LockAction has not been configured');
|
|
166
|
+
return this.configuration;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.LockAction = LockAction;
|
|
170
|
+
LockAction.configuration = null;
|
|
171
|
+
//# sourceMappingURL=lock.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.action.js","sourceRoot":"","sources":["../../src/actions/lock.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const types_1 = require("../types");
|
|
16
|
+
const redlock_1 = __importDefault(require("redlock"));
|
|
17
|
+
const lock_action_1 = require("./lock.action");
|
|
18
|
+
const createLogger = () => ({
|
|
19
|
+
exception: jest.fn(),
|
|
20
|
+
});
|
|
21
|
+
const createContext = (logger) => {
|
|
22
|
+
const context = new types_1.ContextEntity();
|
|
23
|
+
context.logger = logger;
|
|
24
|
+
return context;
|
|
25
|
+
};
|
|
26
|
+
const configureLockAction = () => {
|
|
27
|
+
const redisClient = { getRedisCommander: jest.fn().mockReturnValue({}) };
|
|
28
|
+
lock_action_1.LockAction.configure(redisClient);
|
|
29
|
+
return jest.spyOn(redlock_1.default.prototype, 'acquire');
|
|
30
|
+
};
|
|
31
|
+
describe('LockAction', () => {
|
|
32
|
+
afterEach(() => jest.restoreAllMocks());
|
|
33
|
+
it('requires configuration before use', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
+
yield expect(lock_action_1.LockAction.getLock(createContext(createLogger()), 'wallet:1', 5)).rejects.toThrow('LockAction has not been configured');
|
|
35
|
+
}));
|
|
36
|
+
it('deduplicates keys and converts the TTL to milliseconds', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
|
+
const lock = { release: jest.fn() };
|
|
38
|
+
const acquire = configureLockAction().mockResolvedValue(lock);
|
|
39
|
+
yield expect(lock_action_1.LockAction.acquireMultipleLocks(createContext(createLogger()), ['wallet:1', 'wallet:1', 'wallet:2'], 5)).resolves.toBe(lock);
|
|
40
|
+
expect(acquire).toHaveBeenCalledWith(['wallet:1', 'wallet:2'], 5000);
|
|
41
|
+
}));
|
|
42
|
+
it('logs acquisition failures with the caller context logger', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
43
|
+
const error = new Error('locked');
|
|
44
|
+
const logger = createLogger();
|
|
45
|
+
configureLockAction().mockRejectedValue(error);
|
|
46
|
+
yield expect(lock_action_1.LockAction.getLock(createContext(logger), 'wallet:1', 5)).rejects.toEqual(expect.any(types_1.CustomException));
|
|
47
|
+
expect(logger.exception).toHaveBeenCalledWith(error, expect.objectContaining({
|
|
48
|
+
errorCode: 'ResourceLockError',
|
|
49
|
+
key: 'wallet:1',
|
|
50
|
+
}));
|
|
51
|
+
}));
|
|
52
|
+
it('logs a release failure with the caller context logger and returns the lock', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
const error = new Error('release failed');
|
|
54
|
+
const lock = { release: jest.fn().mockRejectedValue(error) };
|
|
55
|
+
const logger = createLogger();
|
|
56
|
+
configureLockAction();
|
|
57
|
+
yield expect(lock_action_1.LockAction.releaseMultipleLock(createContext(logger), lock, ['wallet:1', 'wallet:1'])).resolves.toBe(lock);
|
|
58
|
+
expect(logger.exception).toHaveBeenCalledWith(error, expect.objectContaining({
|
|
59
|
+
keys: ['wallet:1', 'wallet:1'],
|
|
60
|
+
}));
|
|
61
|
+
}));
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=lock.action.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.action.test.js","sourceRoot":"","sources":["../../src/actions/lock.action.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@ export declare class RabbitMQClient {
|
|
|
31
31
|
private connection;
|
|
32
32
|
private retryCountBeforeExit;
|
|
33
33
|
private connectConfig;
|
|
34
|
+
static hasInstance(): boolean;
|
|
34
35
|
/**
|
|
35
36
|
* Get the singleton instance of RabbitMQ
|
|
36
37
|
* @returns {RabbitMQClient} The singleton instance
|
|
@@ -50,8 +51,8 @@ export declare class RabbitMQClient {
|
|
|
50
51
|
publishToExchange(exchangeName: string, routeKey: string | undefined, payload: any, options?: PublishOptions): Promise<boolean>;
|
|
51
52
|
static publishToExchange(exchangeName: string, routeKey: string | undefined, payload: any, options?: PublishOptions): Promise<boolean>;
|
|
52
53
|
static sendToDeadLetter(deadLetterEntity: BrokerDeadLetterPayloadEntity): Promise<boolean>;
|
|
53
|
-
listen(queueName: string, options: any, callback: (payload: string, options: Record<string, any>) => void): Promise<void>;
|
|
54
|
-
static listen(queueName: string, options: any, callback: (payload: string, options: Record<string, any>) => void): Promise<void>;
|
|
54
|
+
listen(queueName: string, options: any | undefined, callback: (payload: string, options: Record<string, any>) => void): Promise<void>;
|
|
55
|
+
static listen(queueName: string, options: any | undefined, callback: (payload: string, options: Record<string, any>) => void): Promise<void>;
|
|
55
56
|
static requeueDeadLetter(deadLetterQueueName: string, queueOptions?: any): Promise<void>;
|
|
56
57
|
static sendToRetry(brokerPayload: BrokerRetryEntity): Promise<boolean>;
|
|
57
58
|
close(): void;
|
|
@@ -18,6 +18,9 @@ const __1 = require("../../");
|
|
|
18
18
|
const lodash_1 = require("lodash");
|
|
19
19
|
const types_1 = require("../../types");
|
|
20
20
|
class RabbitMQClient {
|
|
21
|
+
static hasInstance() {
|
|
22
|
+
return RabbitMQClient.instance !== null;
|
|
23
|
+
}
|
|
21
24
|
/**
|
|
22
25
|
* Get the singleton instance of RabbitMQ
|
|
23
26
|
* @returns {RabbitMQClient} The singleton instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/rabbitmq/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;AACb,sFAKiC;AACjC,8BAA8B;AAC9B,mCAA+B;AAE/B,uCAA6G;AA8B7G,MAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/rabbitmq/index.ts"],"names":[],"mappings":"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"}
|