Skip to main content

DI Integration

The fileStorageResolverDiFactory function creates an IFileStorageResolver whose underlying resolver is resolved from a DI container.

The returned proxy implements both IFileStorageResolver and IFileStorage:

  • use(adapterName?) selects an adapter on the resolved FileStorageResolver.
  • create(key) creates a file through the resolver's default adapter; clear() and removeMany() delegate as well.

The proxy is wired to the container during container.init(). Create it before calling init(); calling use() or create() before the container is initialized throws an error.

Initial configuration​

Set up the memory and filesystem file-storage adapters, create the container, then register the FileStorageResolver and wrap it with fileStorageResolverDiFactory:

1. Set up the memory file-storage adapter​

./samples/memory-file-storage-adapter.ts
import { MemoryFileStorageAdapter } from "eridu-tech/file-storage/memory-file-storage-adapter";
import { SignedFileStorageAdapter } from "eridu-tech/file-storage/signed-file-storage-adapter";

export const memoryFileStorageAdapter = new SignedFileStorageAdapter({
adapter: new MemoryFileStorageAdapter(),
urlAdapter: {},
});

2. Set up the filesystem file-storage adapter​

./samples/fs-file-storage-adapter.ts
import { FsFileStorageAdapter } from "eridu-tech/file-storage/fs-file-storage-adapter";
import { SignedFileStorageAdapter } from "eridu-tech/file-storage/signed-file-storage-adapter";

export const fsFileStorageAdapter = new SignedFileStorageAdapter({
adapter: new FsFileStorageAdapter({}),
urlAdapter: {},
});

3. Create the dependency injection container​

./samples/container.ts
import { Container } from "eridu-tech/di";
import { ExecutionContext } from "eridu-tech/execution-context";
import { AlsExecutionContextAdapter } from "eridu-tech/execution-context/als-execution-context-adapter";

export const executionContext = new ExecutionContext(
new AlsExecutionContextAdapter(),
);
export const container = new Container({ executionContext });

4. Register and initialize the file-storage resolver​

./samples/file-storage-resolver-di-factory.ts
import { FileStorageResolver } from "eridu-tech/file-storage";
import { ProxyFileStorageResolver } from "eridu-tech/file-storage/di";
import { container } from "./container.js";
import { fsFileStorageAdapter } from "./fs-file-storage-adapter.js";
import { memoryFileStorageAdapter } from "./memory-file-storage-adapter.js";

type Adapters = "memory" | "fs";

const fileStorageResolver = new FileStorageResolver<Adapters>({
adapters: {
memory: memoryFileStorageAdapter,
fs: fsFileStorageAdapter,
},
defaultAdapter: "memory",
});

await fileStorageResolver.init();

container.registerValue({
token: FileStorageResolver,
value: fileStorageResolver,
});

// Create the proxy before container.init()
export const fileStorage = new ProxyFileStorageResolver<Adapters>({
container,
resolverToken: FileStorageResolver,
});

await container.init();

Usage​

1. Using the default adapter​

./samples/file-storage-resolver-di-factory-default-adapter.ts
import { fileStorage } from "./file-storage-resolver-di-factory.js";

// Uses the adapter configured as the default (memory)
await fileStorage.create("file.txt").put({ data: "Text file content" });

2. Specifying an adapter explicitly​

./samples/file-storage-resolver-di-factory-specific-adapter.ts
import { fileStorage } from "./file-storage-resolver-di-factory.js";

// Uses the filesystem adapter
await fileStorage
.use("fs")
.create("file.txt")
.put({ data: "Text file content" });

Further information​

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