Skip to main content

SemaphoreFactoryResolver

The SemaphoreFactoryResolver class provides a flexible way to configure and switch between different semaphore adapters at runtime.

Initial configuration​

To begin using the ISemaphoreFactoryResolver, you will need to register all required adapters during initialization.

./samples/semaphore-factory-resolver-initial-config.ts
import { SemaphoreFactoryResolver } from "eridu-tech/semaphore";
import { MemorySemaphoreAdapter } from "eridu-tech/semaphore/memory-semaphore-adapter";
import { RedisSemaphoreAdapter } from "eridu-tech/semaphore/redis-semaphore-adapter";
import { Serde } from "eridu-tech/serde";
import { SuperJsonSerdeAdapter } from "eridu-tech/serde/super-json-serde-adapter";
import { Redis } from "ioredis";

const serde = new Serde(new SuperJsonSerdeAdapter());

export const semaphoreFactoryResolver = new SemaphoreFactoryResolver({
serde,
adapters: {
memory: new MemorySemaphoreAdapter(),
redis: new RedisSemaphoreAdapter(new Redis("YOUR_REDIS_CONNECTION")),
},
// You can set an optional default adapter
defaultAdapter: "memory",
});

Usage​

1. Using the default adapter​

./samples/semaphore-factory-resolver-default-adapter.ts
import { semaphoreFactoryResolver } from "./semaphore-factory-resolver-initial-config.js";

await semaphoreFactoryResolver
.use()
.create("shared-resource", {
limit: 2,
})
.runOrFail(async () => {
// code to run
});
danger

Note that if you dont set a default adapter, an error will be thrown.

2. Specifying an adapter explicitly​

./samples/semaphore-factory-resolver-specific-adapter.ts
import { semaphoreFactoryResolver } from "./semaphore-factory-resolver-initial-config.js";

await semaphoreFactoryResolver
.use("redis")
.create("shared-resource", {
limit: 2,
})
.runOrFail(async () => {
// code to run
});
danger

Note that if you specify a non-existent adapter, an error will be thrown.

3. Overriding default settings​

./samples/semaphore-factory-resolver-override-settings.ts
import { semaphoreFactoryResolver } from "./semaphore-factory-resolver-initial-config.js";

await semaphoreFactoryResolver
.use("redis")
.create("shared-resource", {
limit: 2,
})
.runOrFail(async () => {
// code to run
});
info

Note that the SemaphoreFactoryResolver is immutable, meaning any configuration override returns a new instance rather than modifying the existing one.

Further information​

For further information refer to eridu-tech/semaphore API docs.