@daiso-tech/core
Version:
The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.
148 lines • 6.79 kB
JavaScript
/**
* @module Lock
*/
import { v4 } from "uuid";
import {} from "../../../../event-bus/contracts/_module.js";
import { NoOpEventBusAdapter } from "../../../../event-bus/implementations/adapters/_module.js";
import { resolveEventBusInput, } from "../../../../event-bus/implementations/derivables/_module.js";
import {} from "../../../../execution-context/contracts/_module.js";
import { NoOpExecutionContextAdapter } from "../../../../execution-context/implementations/adapters/no-op-execution-context-adapter/_module.js";
import { ExecutionContext } from "../../../../execution-context/implementations/derivables/_module.js";
import {} from "../../../../lock/contracts/_module.js";
import { LockSerdeTransformer } from "../../../../lock/implementations/derivables/lock-factory/lock-serde-transformer.js";
import { Lock } from "../../../../lock/implementations/derivables/lock-factory/lock.js";
import { resolveLockAdapter } from "../../../../lock/implementations/derivables/lock-factory/resolve-lock-adapter.js";
import {} from "../../../../middleware/contracts/_module.js";
import { useFactory } from "../../../../middleware/implementations/_module.js";
import {} from "../../../../namespace/contracts/_module.js";
import { NoOpNamespace } from "../../../../namespace/implementations/_module.js";
import {} from "../../../../serde/contracts/_module.js";
import { NoOpSerdeAdapter } from "../../../../serde/implementations/adapters/_module.js";
import { Serde } from "../../../../serde/implementations/derivables/_module.js";
import {} from "../../../../time-span/contracts/_module.js";
import { TimeSpan } from "../../../../time-span/implementations/_module.js";
import { CORE, resolveOneOrMore, callInvokable, defaultWaitUntil, } from "../../../../utilities/_module.js";
/**
* `LockFactory` class can be derived from any {@link ILockAdapter | `ILockAdapter`} or {@link IDatabaseLockAdapter | `IDatabaseLockAdapter`}.
*
* Note the {@link ILock | `ILock`} instances created by the `LockFactory` class are serializable and deserializable,
* allowing them to be seamlessly transferred across different servers, processes, and databases.
* This can be done directly using {@link ISerderRegister | `ISerderRegister`} or indirectly through components that rely on {@link ISerderRegister | `ISerderRegister`} internally.
*
* IMPORT_PATH: `"@daiso-tech/core/lock"`
* @group Derivables
*/
export class LockFactory {
eventBus;
originalAdapter;
adapter;
namespace;
creatLockId;
defaultTtl;
defaultRefreshTime;
serde;
serdeTransformerName;
waitUntil;
executionContext;
use;
/**
* @example
* ```ts
* import { KyselyLockAdapter } from "@daiso-tech/core/lock/kysely-lock-adapter";
* import { LockFactory } from "@daiso-tech/core/lock";
* import { Serde } from "@daiso-tech/core/serde";
* import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/super-json-serde-adapter";
* import Sqlite from "better-sqlite3";
* import { Kysely, SqliteDialect } from "kysely";
*
* const lockAdapter = new KyselyLockAdapter({
* kysely: new Kysely({
* dialect: new SqliteDialect({
* database: new Sqlite("local.db"),
* }),
* });
* });
* // You need initialize the adapter once before using it.
* await lockAdapter.init();
*
* const serde = new Serde(new SuperJsonSerdeAdapter())
* const lockFactory = new LockFactory({
* serde,
* adapter: lockAdapter,
* });
* ```
*/
constructor(settings) {
const { defaultTtl = TimeSpan.fromMinutes(5), defaultRefreshTime = TimeSpan.fromMinutes(5), createLockId = () => v4(), serde = new Serde(new NoOpSerdeAdapter()), namespace = new NoOpNamespace(), adapter, eventBus = new NoOpEventBusAdapter(), serdeTransformerName = "", waitUntil = defaultWaitUntil, executionContext = new ExecutionContext(new NoOpExecutionContextAdapter()), } = settings;
this.use = useFactory({ executionContext });
this.executionContext = executionContext;
this.waitUntil = waitUntil;
this.serde = serde;
this.defaultRefreshTime = TimeSpan.fromTimeSpan(defaultRefreshTime);
this.creatLockId = createLockId;
this.namespace = namespace;
this.defaultTtl =
defaultTtl === null ? null : TimeSpan.fromTimeSpan(defaultTtl);
this.eventBus = resolveEventBusInput(namespace, eventBus);
this.serdeTransformerName = serdeTransformerName;
this.originalAdapter = adapter;
this.adapter = resolveLockAdapter(adapter);
this.registerToSerde();
}
registerToSerde() {
const transformer = new LockSerdeTransformer({
use: this.use,
executionContext: this.executionContext,
waitUntil: this.waitUntil,
originalAdapter: this.originalAdapter,
adapter: this.adapter,
defaultRefreshTime: this.defaultRefreshTime,
eventBus: this.eventBus,
namespace: this.namespace,
serdeTransformerName: this.serdeTransformerName,
});
for (const serde of resolveOneOrMore(this.serde)) {
serde.registerCustom(transformer, CORE);
}
}
get events() {
return this.eventBus;
}
/**
* @example
* ```ts
* import { LockFactory } from "@daiso-tech/core/lock";
* import { MemoryLockAdapter } from "@daiso-tech/core/lock/memory-lock-adapter";
* import { Namespace } from "@daiso-tech/core/namespace";
* import { Serde } from "@daiso-tech/core/serde";
* import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/super-json-serde-adapter";
*
* const lockFactory = new LockFactory({
* adapter: new MemoryLockAdapter(),
* namespace: new Namespace("lock"),
* serde: new Serde(new SuperJsonSerdeAdapter())
* });
*
* const lock = lockFactory.create("a");
* ```
*/
create(key, settings = {}) {
const { ttl = this.defaultTtl, lockId = callInvokable(this.creatLockId), } = settings;
const keyObj = this.namespace.create(key);
return new Lock({
use: this.use,
executionContext: this.executionContext,
waitUntil: this.waitUntil,
namespace: this.namespace,
adapter: this.adapter,
originalAdapter: this.originalAdapter,
eventDispatcher: this.eventBus,
key: keyObj,
lockId,
ttl: ttl === null ? null : TimeSpan.fromTimeSpan(ttl),
serdeTransformerName: this.serdeTransformerName,
defaultRefreshTime: this.defaultRefreshTime,
});
}
}
//# sourceMappingURL=lock-factory.js.map