-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathLocalCacheDriver.ts
More file actions
89 lines (72 loc) · 1.95 KB
/
LocalCacheDriver.ts
File metadata and controls
89 lines (72 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { createCancelablePromise, MaybeCancelablePromise } from '@cubejs-backend/shared';
import { CacheDriverInterface } from '@cubejs-backend/base-driver';
interface ItemBucket {
value: any,
exp: number,
}
const store: Record<string, ItemBucket> = {};
export class LocalCacheDriver implements CacheDriverInterface {
protected readonly store: Record<string, any>;
public constructor() {
this.store = store;
}
public async get(key: string) {
if (this.store[key] && this.store[key].exp < new Date().getTime()) {
delete this.store[key];
}
return this.store[key] && this.store[key].value;
}
public async set(key: string, value, expiration) {
this.store[key] = {
value,
exp: new Date().getTime() + expiration * 1000
};
return {
key,
bytes: Buffer.byteLength(JSON.stringify(value)),
};
}
public async remove(key: string) {
delete this.store[key];
}
public async keysStartingWith(prefix: string) {
return Object.keys(this.store)
.filter(k => k.indexOf(prefix) === 0 && this.store[k].exp > new Date().getTime());
}
public async cleanup(): Promise<void> {
// Nothing to do
}
public reset(): void {
for (const key of Object.keys(this.store)) {
delete this.store[key];
}
}
public async testConnection(): Promise<void> {
// Nothing to do
}
public withLock = (
key: string,
cb: () => MaybeCancelablePromise<any>,
expiration: number = 60,
freeAfter: boolean = true,
) => createCancelablePromise(async (tkn) => {
if (key in this.store) {
if (this.store[key].exp < new Date().getTime()) {
delete this.store[key];
}
return false;
}
try {
this.store[key] = {
value: Math.random(),
exp: new Date().getTime() + expiration * 1000
};
await tkn.with(cb());
return true;
} finally {
if (freeAfter) {
delete this.store[key];
}
}
});
}