Skip to content

Commit c4a8b70

Browse files
authored
feat(core-kernel): dispatch cache events
1 parent b3aab12 commit c4a8b70

File tree

4 files changed

+61
-4
lines changed

4 files changed

+61
-4
lines changed

__tests__/unit/core-kernel/services/cache/drivers/memory.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import "jest-extended";
2+
3+
import { Application } from "@packages/core-kernel/src/application";
4+
import { Container, Identifiers } from "@packages/core-kernel/src/ioc";
25
import { MemoryCacheStore } from "@packages/core-kernel/src/services/cache/drivers/memory";
36
import { NotImplemented } from "@packages/core-kernel/src/exceptions/runtime";
7+
import { MemoryEventDispatcher } from "@packages/core-kernel/src/services/events/drivers/memory";
48

59
const items: Record<string, number> = {
610
"1": 1,
@@ -14,8 +18,17 @@ const itemsBool: boolean[] = new Array(5).fill(true);
1418
const itemsTruthy: boolean[] = new Array(5).fill(true);
1519
const itemsFalsey: boolean[] = new Array(5).fill(false);
1620

21+
let app: Application;
1722
let store: MemoryCacheStore<string, number>;
18-
beforeEach(() => (store = new MemoryCacheStore<string, number>()));
23+
beforeEach(() => {
24+
app = new Application(new Container());
25+
26+
app.bind(Identifiers.EventDispatcherService)
27+
.to(MemoryEventDispatcher)
28+
.inSingletonScope();
29+
30+
store = app.resolve(MemoryCacheStore);
31+
});
1932

2033
describe("MemoryCacheStore", () => {
2134
it("should make a new instance", async () => {

__tests__/unit/core-kernel/services/cache/service-provider.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,16 @@ import { Application } from "@packages/core-kernel/src/application";
44
import { Container, Identifiers } from "@packages/core-kernel/src/ioc";
55
import { ServiceProvider } from "@packages/core-kernel/src/services/cache";
66
import { MemoryCacheStore } from "@packages/core-kernel/src/services/cache/drivers/memory";
7+
import { MemoryEventDispatcher } from "@packages/core-kernel/src/services/events/drivers/memory";
78

89
let app: Application;
10+
beforeEach(() => {
11+
app = new Application(new Container());
912

10-
beforeEach(() => (app = new Application(new Container())));
13+
app.bind(Identifiers.EventDispatcherService)
14+
.to(MemoryEventDispatcher)
15+
.inSingletonScope();
16+
});
1117

1218
describe("CacheServiceProvider", () => {
1319
it(".register", async () => {

packages/core-kernel/src/enums/events.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@ export enum KernelEvent {
1212
ServiceProviderRegistered = "kernel.serviceProvider.registered",
1313
}
1414

15+
/**
16+
* @export
17+
* @enum {number}
18+
*/
19+
export enum CacheEvent {
20+
Flushed = "cache.flushed",
21+
Forgotten = "cache.forgotten",
22+
Hit = "cache.hit",
23+
Missed = "cache.missed",
24+
Written = "cache.written",
25+
}
26+
1527
/**
1628
* @export
1729
* @enum {number}

packages/core-kernel/src/services/cache/drivers/memory.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import { EventDispatcher } from "../../../contracts/kernel";
12
import { CacheStore } from "../../../contracts/kernel/cache";
3+
import { CacheEvent } from "../../../enums";
24
import { NotImplemented } from "../../../exceptions/runtime";
3-
import { injectable } from "../../../ioc";
5+
import { Identifiers, inject, injectable } from "../../../ioc";
46

57
/**
68
* @export
@@ -9,6 +11,14 @@ import { injectable } from "../../../ioc";
911
*/
1012
@injectable()
1113
export class MemoryCacheStore<K, T> implements CacheStore<K, T> {
14+
/**
15+
* @private
16+
* @type {EventDispatcher}
17+
* @memberof BlockJob
18+
*/
19+
@inject(Identifiers.EventDispatcherService)
20+
private readonly eventDispatcher!: EventDispatcher;
21+
1222
/**
1323
* @private
1424
* @type {Map<K, T>}
@@ -65,7 +75,13 @@ export class MemoryCacheStore<K, T> implements CacheStore<K, T> {
6575
* @memberof MemoryCacheStore
6676
*/
6777
public async get(key: K): Promise<T | undefined> {
68-
return this.store.get(key);
78+
const value: T | undefined = this.store.get(key);
79+
80+
value
81+
? this.eventDispatcher.dispatch(CacheEvent.Hit, { key, value })
82+
: this.eventDispatcher.dispatch(CacheEvent.Missed, { key });
83+
84+
return value;
6985
}
7086

7187
/**
@@ -91,6 +107,10 @@ export class MemoryCacheStore<K, T> implements CacheStore<K, T> {
91107
public async put(key: K, value: T, seconds?: number): Promise<boolean> {
92108
this.store.set(key, value);
93109

110+
if (this.has(key)) {
111+
this.eventDispatcher.dispatch(CacheEvent.Written, { key, value, seconds });
112+
}
113+
94114
return this.has(key);
95115
}
96116

@@ -183,6 +203,10 @@ export class MemoryCacheStore<K, T> implements CacheStore<K, T> {
183203
public async forget(key: K): Promise<boolean> {
184204
this.store.delete(key);
185205

206+
if (this.missing(key)) {
207+
this.eventDispatcher.dispatch(CacheEvent.Forgotten, { key });
208+
}
209+
186210
return this.missing(key);
187211
}
188212

@@ -206,6 +230,8 @@ export class MemoryCacheStore<K, T> implements CacheStore<K, T> {
206230
public async flush(): Promise<boolean> {
207231
this.store.clear();
208232

233+
this.eventDispatcher.dispatch(CacheEvent.Flushed);
234+
209235
return this.store.size === 0;
210236
}
211237

0 commit comments

Comments
 (0)