pg-transactional-outbox
Version:
A PostgreSQL based transactional outbox and inbox pattern implementation to support exactly once message processing (with at least once message delivery).
45 lines • 2.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createReplicationMultiConcurrencyController = void 0;
const create_full_concurrency_controller_1 = require("./create-full-concurrency-controller");
const create_mutex_concurrency_controller_1 = require("./create-mutex-concurrency-controller");
const create_segment_mutex_concurrency_controller_1 = require("./create-segment-mutex-concurrency-controller");
const create_semaphore_concurrency_controller_1 = require("./create-semaphore-concurrency-controller");
/**
* Use different mutex controllers depending on the desired concurrency level
* for different messages. If a semaphore concurrency controller should be used,
* the `maxSemaphoreParallelism` should be set.
* @param getConcurrencyType Implements the logic which concurrency controller should be used e.g. based on the aggregate and message type
* @returns The controller to acquire and release the mutex
*/
const createReplicationMultiConcurrencyController = (getConcurrencyType, settings) => {
var _a;
const fullConcurrencyController = (0, create_full_concurrency_controller_1.createReplicationFullConcurrencyController)();
const mutexController = (0, create_mutex_concurrency_controller_1.createReplicationMutexConcurrencyController)();
const segmentMutexController = (0, create_segment_mutex_concurrency_controller_1.createReplicationSegmentMutexConcurrencyController)();
const semaphore = (0, create_semaphore_concurrency_controller_1.createReplicationSemaphoreConcurrencyController)((_a = settings === null || settings === void 0 ? void 0 : settings.maxSemaphoreParallelism) !== null && _a !== void 0 ? _a : 5);
return {
/** Acquire a lock (if any) and return a function to release it. */
acquire: (message) => {
switch (getConcurrencyType(message)) {
case 'full-concurrency':
return fullConcurrencyController.acquire(message);
case 'mutex':
return mutexController.acquire(message);
case 'semaphore':
return semaphore.acquire(message);
case 'segment-mutex':
return segmentMutexController.acquire(message);
}
},
/** Cancel all controllers. */
cancel: () => {
fullConcurrencyController.cancel();
mutexController.cancel();
segmentMutexController === null || segmentMutexController === void 0 ? void 0 : segmentMutexController.cancel();
semaphore.cancel();
},
};
};
exports.createReplicationMultiConcurrencyController = createReplicationMultiConcurrencyController;
//# sourceMappingURL=create-multi-concurrency-controller.js.map