import type { IGroupableLockProvider } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
You can listen to different events of all locks created by LockProvider class instance.
Refer to LockEvents, to se all events dispatched by LockProvider class instance. Refer to IEventListenable for details on how the method works.
import { type IGroupableLockProvider, type LockEvents, KeyAcquiredLockEvent } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import type { Invokable} from "@daiso-tech/core/event-bus/contracts";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
const listener: Invokable<LockEvents> = event => {
console.log(event);
}
await lockProvider.addListener(KeyAcquiredLockEvent, listener);
await lockProvider.removeListener(KeyAcquiredLockEvent, listener);
await lockProvider.create("a").acquire();
You can listen to different events of all locks created by LockProvider class instance.
Refer to LockEvents, to se all events dispatched by LockProvider class instance. Refer to IEventListenable for details on how the method works.
import { type IGroupableLockProvider, type LockEvents, KeyAcquiredLockEvent } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import type { Invokable} from "@daiso-tech/core/event-bus/contracts";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
const listener: Invokable<LockEvents> = event => {
console.log(event);
}
await lockProvider.addListenerMany([KeyAcquiredLockEvent], listener);
await lockProvider.removeListenerMany([KeyAcquiredLockEvent], listener);
await lockProvider.create("a").acquire();
The asPromise method returns LazyPromise objecet that resolves once the BaseEvent is dispatched.
import type { IGroupableLockProvider } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
import { TimeSpan } from "@daiso-tech/core/utilities";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
// You can use the lock
const lockA = lockProvider.create("a");
// You can provide ttl
const lockB = lockProvider.create("b", {
ttl: TimeSpan.fromMinutes(2),
});
// You can provide a custom owner. By default the owner will be unique random value.
const lockC = lockProvider.create("b", {
owner: "user-1"
});
import type { IGroupableLockProvider } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
// Will print "@global"
console.log(lockProvider.getGroup());
You can listen to different events of all locks created by LockProvider class instance.
Refer to LockEvents, to se all events dispatched by LockProvider class instance. Refer to IEventListenable for details on how the method works.
import { type IGroupableLockProvider, type LockEvents, KeyAcquiredLockEvent } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import type { Invokable} from "@daiso-tech/core/event-bus/contracts";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
const listener: Invokable<LockEvents> = event => {
console.log(event);
}
await lockProvider.listenOnce(KeyAcquiredLockEvent, listener);
await lockProvider.create("a").acquire();
You can listen to different events of all locks created by LockProvider class instance.
Refer to LockEvents, to se all events dispatched by LockProvider class instance. Refer to IEventListenable for details on how the method works.
import { type IGroupableLockProvider, type LockEvents, KeyAcquiredLockEvent } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import type { Invokable} from "@daiso-tech/core/event-bus/contracts";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
const listener: Invokable<LockEvents> = event => {
console.log(event);
}
await lockProvider.addListener(KeyAcquiredLockEvent, listener);
await lockProvider.removeListener(KeyAcquiredLockEvent, listener);
await lockProvider.create("a").acquire();
You can listen to different events of all locks created by LockProvider class instance.
Refer to LockEvents, to se all events dispatched by LockProvider class instance. Refer to IEventListenable for details on how the method works.
import { type IGroupableLockProvider, type LockEvents, KeyAcquiredLockEvent } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import type { Invokable} from "@daiso-tech/core/event-bus/contracts";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
const listener: Invokable<LockEvents> = event => {
console.log(event);
}
await lockProvider.addListenerMany(KeyAcquiredLockEvent, listener);
await lockProvider.removeListenerMany([KeyAcquiredLockEvent], listener);
await lockProvider.create("a").acquire();
You can listen to different events of all locks created by LockProvider class instance.
Refer to LockEvents, to se all events dispatched by LockProvider class instance. Refer to IEventListenable for details on how the method works.
import { type IGroupableLockProvider, type LockEvents, KeyAcquiredLockEvent } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import type { Invokable} from "@daiso-tech/core/event-bus/contracts";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
const listener: Invokable<LockEvents> = event => {
console.log(event);
}
const unsubscribe = await lockProvider.subscribe(KeyAcquiredLockEvent, listener);
await lockProvider.create("a").acquire();
await unsubscribe();
You can listen to different events of all locks created by LockProvider class instance.
Refer to LockEvents, to se all events dispatched by LockProvider class instance. Refer to IEventListenable for details on how the method works.
import { type IGroupableLockProvider, type LockEvents, KeyAcquiredLockEvent } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import type { Invokable} from "@daiso-tech/core/event-bus/contracts";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
const listener: Invokable<LockEvents> = event => {
console.log(event);
}
const unsubscribe = await lockProvider.subscribeMany([KeyAcquiredLockEvent], listener);
await lockProvider.create("a").acquire();
await unsubscribe();
import type { IGroupableLockProvider, ILockProvider } from "@daiso-tech/core/lock/contracts";
import { LockProvider } from "@daiso-tech/core/lock/implementations/derivables";
import { MemoryLockAdapter } from "@daiso-tech/core/lock/implementations/adapters";
import { EventBus } from "@daiso-tech/core/event-bus/implementations/derivables";
import { MemoryEventBusAdapter } from "@daiso-tech/core/event-bus/implementations/adapters";
import { Serde } from "@daiso-tech/core/serde/implementations/derivables";
import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/implementations/adapters";
const eventBus = new EventBus({
adapter: new MemoryEventBusAdapter({ rootGroup: "@global" })
});
const serde = new Serde(SuperJsonSerdeAdapter);
const lockProvider: IGroupableLockProvider = new LockProvider({
serde,
adapter: new MemoryLockAdapter({
rootGroup: "@global"
}),
eventBus,
});
// Will print "@global"
console.log(lockProvider.getGroup());
const groupedLockProvider: ILockProvider = lockProvider.withGroup("company-1");
// Will print "@global/company-1"
console.log(groupedLockProvider.getGroup());
LockProvider class can be derived from any ILockAdapter or IDatabaseLockAdapter.
Note the ILock instances created by the LockProvider class are serializable and deserializable, allowing them to be seamlessly transferred across different servers, processes, and databases. This can be done directly using IFlexibleSerde or indirectly through components that rely on IFlexibleSerde internally.
IMPORT_PATH:
"@daiso-tech/core/lock/implementations/derivables"