diff --git a/src/lock/lockmanager.js b/src/lock/lockmanager.js index 18192be..ac3fe06 100644 --- a/src/lock/lockmanager.js +++ b/src/lock/lockmanager.js @@ -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', {