diff --git a/packages/common/infra/package.json b/packages/common/infra/package.json index da8b549e7ef27..0822fb91dd840 100644 --- a/packages/common/infra/package.json +++ b/packages/common/infra/package.json @@ -10,6 +10,7 @@ "./di": "./src/di/index.ts", "./livedata": "./src/livedata/index.ts", "./storage": "./src/storage/index.ts", + "./lifecycle": "./src/lifecycle/index.ts", ".": "./src/index.ts" }, "dependencies": { diff --git a/packages/common/infra/src/index.ts b/packages/common/infra/src/index.ts index fe3362374dc2d..d228f9670c8b4 100644 --- a/packages/common/infra/src/index.ts +++ b/packages/common/infra/src/index.ts @@ -5,3 +5,17 @@ export * from './command'; export * from './di'; export * from './livedata'; export * from './storage'; + +import type { ServiceCollection } from './di'; +import { CleanupService } from './lifecycle'; +import { GlobalCache, GlobalState, MemoryMemento } from './storage'; + +export function configureInfraServices(services: ServiceCollection) { + services.add(CleanupService); +} + +export function configureTestingInfraServices(services: ServiceCollection) { + configureInfraServices(services); + services.addImpl(GlobalCache, MemoryMemento); + services.addImpl(GlobalState, MemoryMemento); +} diff --git a/packages/common/infra/src/lifecycle/__test__/lifecycle.spec.ts b/packages/common/infra/src/lifecycle/__test__/lifecycle.spec.ts new file mode 100644 index 0000000000000..e615d7b2ff16a --- /dev/null +++ b/packages/common/infra/src/lifecycle/__test__/lifecycle.spec.ts @@ -0,0 +1,15 @@ +import { describe, expect, test } from 'vitest'; + +import { CleanupService } from '..'; + +describe('lifecycle', () => { + test('cleanup', () => { + const cleanup = new CleanupService(); + let cleaned = false; + cleanup.add(() => { + cleaned = true; + }); + cleanup.cleanup(); + expect(cleaned).toBe(true); + }); +}); diff --git a/packages/common/infra/src/lifecycle/index.ts b/packages/common/infra/src/lifecycle/index.ts new file mode 100644 index 0000000000000..77ce5ebf30b47 --- /dev/null +++ b/packages/common/infra/src/lifecycle/index.ts @@ -0,0 +1,10 @@ +export class CleanupService { + private readonly cleanupCallbacks: (() => void)[] = []; + constructor() {} + add(fn: () => void) { + this.cleanupCallbacks.push(fn); + } + cleanup() { + this.cleanupCallbacks.forEach(fn => fn()); + } +}