UNPKG

@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
/** * @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