Refactor LockManager to improve key handling and event broadcasting
- Updated constructor to use socketClient instead of socketManager for better clarity. - Changed key management methods to use a consistent naming convention for setting and deleting locks. - Enhanced event listener setup to utilize socketClient for broadcasting lock updates. - Improved logging for lock and unlock operations to provide clearer insights into the locking mechanism.
This commit is contained in:
parent
f5bfbe0d63
commit
d695772a3a
@ -11,8 +11,8 @@ logger.level = config.server.logLevel;
|
||||
* LockManager handles distributed locking using Etcd and broadcasts lock events via websockets.
|
||||
*/
|
||||
export class LockManager {
|
||||
constructor(socketManager) {
|
||||
this.socketManager = socketManager;
|
||||
constructor(socketClient) {
|
||||
this.socketClient = socketClient;
|
||||
this.setupLocksListeners();
|
||||
}
|
||||
|
||||
@ -20,7 +20,10 @@ export class LockManager {
|
||||
// Add a 'lock' event to the 'locks' stream
|
||||
logger.debug('Locking object:', object._id);
|
||||
try {
|
||||
await etcdServer.set(`/locks/${object.type}s/${object._id}`, object);
|
||||
await etcdServer.setKey(`/${object.type}s/${object._id}/lock`, {
|
||||
...object,
|
||||
locked: true
|
||||
});
|
||||
logger.info(`Lock event to id: ${object._id}`);
|
||||
return true;
|
||||
} catch (err) {
|
||||
@ -31,16 +34,15 @@ export class LockManager {
|
||||
|
||||
async unlockObject(object) {
|
||||
// Add an 'unlock' event to the 'locks' stream
|
||||
const key = `/locks/${object.type}s/${object._id}`;
|
||||
console.log('unlocking');
|
||||
const key = `/${object.type}s/${object._id}/lock`;
|
||||
try {
|
||||
logger.debug('Checking user can unlock:', object._id);
|
||||
|
||||
const lockEvent = await etcdServer.get(key);
|
||||
const lockEvent = await etcdServer.getKey(key);
|
||||
|
||||
if (lockEvent?.user === object.user) {
|
||||
logger.debug('Unlocking object:', object._id);
|
||||
await etcdServer.delete(key);
|
||||
await etcdServer.deleteKey(key);
|
||||
logger.info(`Unlocked object: ${object._id}`);
|
||||
return true;
|
||||
}
|
||||
@ -54,8 +56,8 @@ export class LockManager {
|
||||
// Get the current lock status of an object and broadcast it
|
||||
logger.info('Getting lock status for object:', object._id);
|
||||
try {
|
||||
const lockKey = `/locks/${object.type}s/${object._id}`;
|
||||
const lockValue = await etcdServer.get(lockKey);
|
||||
const lockKey = `/${object.type}s/${object._id}/lock`;
|
||||
const lockValue = await etcdServer.getKey(lockKey);
|
||||
|
||||
if (lockValue) {
|
||||
// Object is locked
|
||||
@ -79,15 +81,19 @@ export class LockManager {
|
||||
}
|
||||
|
||||
setupLocksListeners() {
|
||||
etcdServer.onPrefixPut('/locks', (key, value) => {
|
||||
const id = key.split('/').pop();
|
||||
logger.debug('Lock object event:', id);
|
||||
this.socketManager.broadcast('notify_lock_update', {
|
||||
...value,
|
||||
locked: true
|
||||
});
|
||||
});
|
||||
etcdServer.onPrefixDelete('/locks', key => {
|
||||
etcdServer.onPrefixPutEvent(
|
||||
'/locks',
|
||||
this.socketClient.id,
|
||||
(key, value) => {
|
||||
const id = key.split('/').pop();
|
||||
logger.debug('Lock object event:', id);
|
||||
this.socketManager.broadcast('notify_lock_update', {
|
||||
...value,
|
||||
locked: true
|
||||
});
|
||||
}
|
||||
);
|
||||
etcdServer.onPrefixDeleteEvent('/locks', this.socketClient.id, key => {
|
||||
const id = key.split('/').pop();
|
||||
logger.debug('Unlock object event:', id);
|
||||
this.socketManager.broadcast('notify_lock_update', {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user