@warlock.js/cache 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +527 -0
- package/cjs/cache-manager.d.ts +90 -0
- package/cjs/cache-manager.d.ts.map +1 -0
- package/cjs/cache-manager.js +148 -0
- package/cjs/cache-manager.js.map +1 -0
- package/cjs/drivers/base-cache-driver.d.ts +81 -0
- package/cjs/drivers/base-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/base-cache-driver.js +123 -0
- package/cjs/drivers/base-cache-driver.js.map +1 -0
- package/cjs/drivers/file-cache-driver.d.ts +42 -0
- package/cjs/drivers/file-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/file-cache-driver.js +106 -0
- package/cjs/drivers/file-cache-driver.js.map +1 -0
- package/cjs/drivers/index.d.ts +8 -0
- package/cjs/drivers/index.d.ts.map +1 -0
- package/cjs/drivers/lru-memory-cache-driver.d.ts +84 -0
- package/cjs/drivers/lru-memory-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/lru-memory-cache-driver.js +151 -0
- package/cjs/drivers/lru-memory-cache-driver.js.map +1 -0
- package/cjs/drivers/memory-cache-driver.d.ts +53 -0
- package/cjs/drivers/memory-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/memory-cache-driver.js +107 -0
- package/cjs/drivers/memory-cache-driver.js.map +1 -0
- package/cjs/drivers/memory-extended-cache-driver.d.ts +14 -0
- package/cjs/drivers/memory-extended-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/memory-extended-cache-driver.js +25 -0
- package/cjs/drivers/memory-extended-cache-driver.js.map +1 -0
- package/cjs/drivers/null-cache-driver.d.ts +58 -0
- package/cjs/drivers/null-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/null-cache-driver.js +84 -0
- package/cjs/drivers/null-cache-driver.js.map +1 -0
- package/cjs/drivers/redis-cache-driver.d.ts +39 -0
- package/cjs/drivers/redis-cache-driver.d.ts.map +1 -0
- package/cjs/drivers/redis-cache-driver.js +113 -0
- package/cjs/drivers/redis-cache-driver.js.map +1 -0
- package/cjs/index.d.ts +5 -0
- package/cjs/index.d.ts.map +1 -0
- package/cjs/index.js +1 -0
- package/cjs/index.js.map +1 -0
- package/cjs/types.d.ts +193 -0
- package/cjs/types.d.ts.map +1 -0
- package/cjs/utils.d.ts +20 -0
- package/cjs/utils.d.ts.map +1 -0
- package/cjs/utils.js +27 -0
- package/cjs/utils.js.map +1 -0
- package/esm/cache-manager.d.ts +90 -0
- package/esm/cache-manager.d.ts.map +1 -0
- package/esm/cache-manager.js +148 -0
- package/esm/cache-manager.js.map +1 -0
- package/esm/drivers/base-cache-driver.d.ts +81 -0
- package/esm/drivers/base-cache-driver.d.ts.map +1 -0
- package/esm/drivers/base-cache-driver.js +123 -0
- package/esm/drivers/base-cache-driver.js.map +1 -0
- package/esm/drivers/file-cache-driver.d.ts +42 -0
- package/esm/drivers/file-cache-driver.d.ts.map +1 -0
- package/esm/drivers/file-cache-driver.js +106 -0
- package/esm/drivers/file-cache-driver.js.map +1 -0
- package/esm/drivers/index.d.ts +8 -0
- package/esm/drivers/index.d.ts.map +1 -0
- package/esm/drivers/lru-memory-cache-driver.d.ts +84 -0
- package/esm/drivers/lru-memory-cache-driver.d.ts.map +1 -0
- package/esm/drivers/lru-memory-cache-driver.js +151 -0
- package/esm/drivers/lru-memory-cache-driver.js.map +1 -0
- package/esm/drivers/memory-cache-driver.d.ts +53 -0
- package/esm/drivers/memory-cache-driver.d.ts.map +1 -0
- package/esm/drivers/memory-cache-driver.js +107 -0
- package/esm/drivers/memory-cache-driver.js.map +1 -0
- package/esm/drivers/memory-extended-cache-driver.d.ts +14 -0
- package/esm/drivers/memory-extended-cache-driver.d.ts.map +1 -0
- package/esm/drivers/memory-extended-cache-driver.js +25 -0
- package/esm/drivers/memory-extended-cache-driver.js.map +1 -0
- package/esm/drivers/null-cache-driver.d.ts +58 -0
- package/esm/drivers/null-cache-driver.d.ts.map +1 -0
- package/esm/drivers/null-cache-driver.js +84 -0
- package/esm/drivers/null-cache-driver.js.map +1 -0
- package/esm/drivers/redis-cache-driver.d.ts +39 -0
- package/esm/drivers/redis-cache-driver.d.ts.map +1 -0
- package/esm/drivers/redis-cache-driver.js +113 -0
- package/esm/drivers/redis-cache-driver.js.map +1 -0
- package/esm/index.d.ts +5 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -0
- package/esm/types.d.ts +193 -0
- package/esm/types.d.ts.map +1 -0
- package/esm/utils.d.ts +20 -0
- package/esm/utils.d.ts.map +1 -0
- package/esm/utils.js +27 -0
- package/esm/utils.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { GenericObject } from "@mongez/reinforcements";
|
|
2
|
+
import { CacheData, CacheDriver, CacheOperationType } from "../types";
|
|
3
|
+
export declare abstract class BaseCacheDriver<ClientType, Options extends GenericObject> implements CacheDriver<ClientType, Options> {
|
|
4
|
+
/**
|
|
5
|
+
* CLient driver
|
|
6
|
+
*/
|
|
7
|
+
protected clientDriver: ClientType;
|
|
8
|
+
/**
|
|
9
|
+
* {@inheritdoc}
|
|
10
|
+
*/
|
|
11
|
+
get client(): ClientType;
|
|
12
|
+
/**
|
|
13
|
+
* Set client driver
|
|
14
|
+
*/
|
|
15
|
+
set client(client: ClientType);
|
|
16
|
+
/**
|
|
17
|
+
* Get the cache driver name
|
|
18
|
+
*/
|
|
19
|
+
abstract name: string;
|
|
20
|
+
/**
|
|
21
|
+
* Options list
|
|
22
|
+
*/
|
|
23
|
+
options: Options;
|
|
24
|
+
/**
|
|
25
|
+
* {@inheritdoc}
|
|
26
|
+
*/
|
|
27
|
+
parseKey(key: string | GenericObject): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* {@inheritdoc}
|
|
30
|
+
*/
|
|
31
|
+
setOptions(options: Options): this;
|
|
32
|
+
/**
|
|
33
|
+
* {@inheritdoc}
|
|
34
|
+
*/
|
|
35
|
+
abstract removeNamespace(namespace: string): Promise<any>;
|
|
36
|
+
/**
|
|
37
|
+
* {@inheritdoc}
|
|
38
|
+
*/
|
|
39
|
+
abstract set(key: string | GenericObject, value: any): Promise<any>;
|
|
40
|
+
/**
|
|
41
|
+
* {@inheritdoc}
|
|
42
|
+
*/
|
|
43
|
+
abstract get(key: string | GenericObject): Promise<any>;
|
|
44
|
+
/**
|
|
45
|
+
* {@inheritdoc}
|
|
46
|
+
*/
|
|
47
|
+
abstract remove(key: string | GenericObject): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* {@inheritdoc}
|
|
50
|
+
*/
|
|
51
|
+
abstract flush(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Log the operation
|
|
54
|
+
*/
|
|
55
|
+
protected log(operation: CacheOperationType, key?: string): any;
|
|
56
|
+
/**
|
|
57
|
+
* Get time to live value
|
|
58
|
+
*/
|
|
59
|
+
get ttl(): any;
|
|
60
|
+
/**
|
|
61
|
+
* Get time to live value in milliseconds
|
|
62
|
+
*/
|
|
63
|
+
getTtl(ttl?: number): number;
|
|
64
|
+
/**
|
|
65
|
+
* Prepare data for storage
|
|
66
|
+
*/
|
|
67
|
+
protected prepareDataForStorage(data: any, ttl?: number): CacheData;
|
|
68
|
+
/**
|
|
69
|
+
* Parse fetched data from cache
|
|
70
|
+
*/
|
|
71
|
+
protected parseCachedData(key: string, data: CacheData): Promise<any>;
|
|
72
|
+
/**
|
|
73
|
+
* {@inheritdoc}
|
|
74
|
+
*/
|
|
75
|
+
connect(): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* {@inheritdoc}
|
|
78
|
+
*/
|
|
79
|
+
disconnect(): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=base-cache-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-cache-driver.d.ts","sourceRoot":"","sources":["../../src/drivers/base-cache-driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAuBtE,8BAAsB,eAAe,CAAC,UAAU,EAAE,OAAO,SAAS,aAAa,CAC7E,YAAW,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC;IAE3C;;OAEG;IACH,SAAS,CAAC,YAAY,EAAG,UAAU,CAAC;IAEpC;;OAEG;IACH,IAAW,MAAM,IAOS,UAAU,CALnC;IAED;;OAEG;IACH,IAAW,MAAM,CAAC,MAAM,EAAE,UAAU,EAEnC;IAED;;OAEG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACI,OAAO,EAAE,OAAO,CAAa;IAEpC;;OAEG;IACU,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa;IAIjD;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,OAAO;IAKlC;;OAEG;aACa,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAEhE;;OAEG;aACa,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAE1E;;OAEG;aACa,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IAE9D;;OAEG;aACa,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAElE;;OAEG;aACa,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAEtC;;OAEG;IACH,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,CAAC,EAAE,MAAM;IA8BzD;;OAEG;IACH,IAAW,GAAG,QAEb;IAED;;OAEG;IACI,MAAM,CAAC,GAAG,GAAE,MAAiB;IAMpC;;OAEG;IACH,SAAS,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM;IAavD;;OAEG;cACa,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS;IAa5D;;OAEG;IACU,OAAO;IAKpB;;OAEG;IACU,UAAU;CAGxB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import {log}from'@warlock.js/logger';import {parseCacheKey}from'../utils.js';const messages = {
|
|
2
|
+
clearing: "Clearing namespace",
|
|
3
|
+
cleared: "Namespace cleared",
|
|
4
|
+
fetching: "Fetching key",
|
|
5
|
+
fetched: "Key fetched",
|
|
6
|
+
caching: "Caching key",
|
|
7
|
+
cached: "Key cached",
|
|
8
|
+
flushing: "Flushing cache",
|
|
9
|
+
flushed: "Cache flushed",
|
|
10
|
+
removing: "Removing key",
|
|
11
|
+
removed: "Key removed",
|
|
12
|
+
expired: "Key expired",
|
|
13
|
+
notFound: "Key not found",
|
|
14
|
+
connecting: "Connecting to the cache engine.",
|
|
15
|
+
connected: "Connected to the cache engine.",
|
|
16
|
+
disconnecting: "Disconnecting from the cache engine.",
|
|
17
|
+
disconnected: "Disconnected from the cache engine.",
|
|
18
|
+
error: "Error occurred",
|
|
19
|
+
};
|
|
20
|
+
class BaseCacheDriver {
|
|
21
|
+
/**
|
|
22
|
+
* CLient driver
|
|
23
|
+
*/
|
|
24
|
+
clientDriver;
|
|
25
|
+
/**
|
|
26
|
+
* {@inheritdoc}
|
|
27
|
+
*/
|
|
28
|
+
get client() {
|
|
29
|
+
return (this.clientDriver || this);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Set client driver
|
|
33
|
+
*/
|
|
34
|
+
set client(client) {
|
|
35
|
+
this.clientDriver = client;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Options list
|
|
39
|
+
*/
|
|
40
|
+
options = {};
|
|
41
|
+
/**
|
|
42
|
+
* {@inheritdoc}
|
|
43
|
+
*/
|
|
44
|
+
async parseKey(key) {
|
|
45
|
+
return await parseCacheKey(key, this.options);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* {@inheritdoc}
|
|
49
|
+
*/
|
|
50
|
+
setOptions(options) {
|
|
51
|
+
this.options = options || {};
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Log the operation
|
|
56
|
+
*/
|
|
57
|
+
log(operation, key) {
|
|
58
|
+
if (key) {
|
|
59
|
+
// this will be likely used with file cache driver as it will convert the dot to slash
|
|
60
|
+
// to make it consistent and not to confuse developers we will output the key by making sure it's a dot
|
|
61
|
+
key = key.replaceAll("/", ".");
|
|
62
|
+
}
|
|
63
|
+
if (operation == "notFound" || operation == "expired") {
|
|
64
|
+
return log.error("cache:" + this.name, operation, (key ? key + " " : "") + messages[operation]);
|
|
65
|
+
}
|
|
66
|
+
if (operation.endsWith("ed")) {
|
|
67
|
+
return log.success("cache:" + this.name, operation, (key ? key + " " : "") + messages[operation]);
|
|
68
|
+
}
|
|
69
|
+
log.info("cache:" + this.name, operation, (key ? key + " " : "") + messages[operation]);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get time to live value
|
|
73
|
+
*/
|
|
74
|
+
get ttl() {
|
|
75
|
+
return this.options.ttl !== undefined ? this.options.ttl : Infinity;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get time to live value in milliseconds
|
|
79
|
+
*/
|
|
80
|
+
getTtl(ttl = this.ttl) {
|
|
81
|
+
if (ttl) {
|
|
82
|
+
return new Date().getTime() + ttl * 1000;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Prepare data for storage
|
|
87
|
+
*/
|
|
88
|
+
prepareDataForStorage(data, ttl) {
|
|
89
|
+
const preparedData = {
|
|
90
|
+
data,
|
|
91
|
+
};
|
|
92
|
+
if (ttl) {
|
|
93
|
+
preparedData.ttl = ttl;
|
|
94
|
+
preparedData.expiresAt = this.getTtl(ttl);
|
|
95
|
+
}
|
|
96
|
+
return preparedData;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Parse fetched data from cache
|
|
100
|
+
*/
|
|
101
|
+
async parseCachedData(key, data) {
|
|
102
|
+
this.log("fetched", key);
|
|
103
|
+
if (data.expiresAt && data.expiresAt < Date.now()) {
|
|
104
|
+
console.log("Expired key", key);
|
|
105
|
+
this.remove(key);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return data.data || null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* {@inheritdoc}
|
|
112
|
+
*/
|
|
113
|
+
async connect() {
|
|
114
|
+
this.log("connecting");
|
|
115
|
+
this.log("connected");
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* {@inheritdoc}
|
|
119
|
+
*/
|
|
120
|
+
async disconnect() {
|
|
121
|
+
this.log("disconnected");
|
|
122
|
+
}
|
|
123
|
+
}export{BaseCacheDriver};//# sourceMappingURL=base-cache-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-cache-driver.js","sources":["../../src/drivers/base-cache-driver.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { GenericObject } from "@mongez/reinforcements";
|
|
2
|
+
import { CacheDriver, FileCacheOptions } from "../types";
|
|
3
|
+
import { BaseCacheDriver } from "./base-cache-driver";
|
|
4
|
+
export declare class FileCacheDriver extends BaseCacheDriver<FileCacheDriver, FileCacheOptions> implements CacheDriver<FileCacheDriver, FileCacheOptions> {
|
|
5
|
+
/**
|
|
6
|
+
* {@inheritdoc}
|
|
7
|
+
*/
|
|
8
|
+
name: string;
|
|
9
|
+
/**
|
|
10
|
+
* Get the cache directory
|
|
11
|
+
*/
|
|
12
|
+
get directory(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Get file name
|
|
15
|
+
*/
|
|
16
|
+
get fileName(): string;
|
|
17
|
+
/**
|
|
18
|
+
* {@inheritdoc}
|
|
19
|
+
*/
|
|
20
|
+
removeNamespace(namespace: string): Promise<this>;
|
|
21
|
+
/**
|
|
22
|
+
* {@inheritdoc}
|
|
23
|
+
*/
|
|
24
|
+
set(key: string | GenericObject, value: any, ttl?: number): Promise<this>;
|
|
25
|
+
/**
|
|
26
|
+
* {@inheritdoc}
|
|
27
|
+
*/
|
|
28
|
+
get(key: string | GenericObject): Promise<any>;
|
|
29
|
+
/**
|
|
30
|
+
* {@inheritdoc}
|
|
31
|
+
*/
|
|
32
|
+
remove(key: string | GenericObject): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* {@inheritdoc}
|
|
35
|
+
*/
|
|
36
|
+
flush(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* {@inheritdoc}
|
|
39
|
+
*/
|
|
40
|
+
connect(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=file-cache-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-cache-driver.d.ts","sourceRoot":"","sources":["../../src/drivers/file-cache-driver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,qBAAa,eACX,SAAQ,eAAe,CAAC,eAAe,EAAE,gBAAgB,CACzD,YAAW,WAAW,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAEzD;;OAEG;IACI,IAAI,SAAU;IAErB;;OAEG;IACH,IAAW,SAAS,WAUnB;IAED;;OAEG;IACH,IAAW,QAAQ,WAQlB;IAED;;OAEG;IACU,eAAe,CAAC,SAAS,EAAE,MAAM;IAc9C;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM;IAkBtE;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa;IAoB5C;;OAEG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa;IAe/C;;OAEG;IACU,KAAK;IAYlB;;OAEG;IACU,OAAO;CAKrB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import {removeDirectoryAsync,ensureDirectoryAsync,putJsonFileAsync,getJsonFileAsync}from'@mongez/fs';import path from'path';import {BaseCacheDriver}from'./base-cache-driver.js';class FileCacheDriver extends BaseCacheDriver {
|
|
2
|
+
/**
|
|
3
|
+
* {@inheritdoc}
|
|
4
|
+
*/
|
|
5
|
+
name = "file";
|
|
6
|
+
/**
|
|
7
|
+
* Get the cache directory
|
|
8
|
+
*/
|
|
9
|
+
get directory() {
|
|
10
|
+
const directory = this.options.directory;
|
|
11
|
+
if (typeof directory === "function") {
|
|
12
|
+
return directory();
|
|
13
|
+
}
|
|
14
|
+
throw new Error("Cache directory is not defined, please define it in the file driver options");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get file name
|
|
18
|
+
*/
|
|
19
|
+
get fileName() {
|
|
20
|
+
const fileName = this.options.fileName;
|
|
21
|
+
if (typeof fileName === "function") {
|
|
22
|
+
return fileName();
|
|
23
|
+
}
|
|
24
|
+
return "cache.json";
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* {@inheritdoc}
|
|
28
|
+
*/
|
|
29
|
+
async removeNamespace(namespace) {
|
|
30
|
+
this.log("cleared", namespace);
|
|
31
|
+
try {
|
|
32
|
+
await removeDirectoryAsync(path.resolve(this.directory, namespace));
|
|
33
|
+
this.log("cleared", namespace);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
//
|
|
37
|
+
}
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* {@inheritdoc}
|
|
42
|
+
*/
|
|
43
|
+
async set(key, value, ttl) {
|
|
44
|
+
key = await this.parseKey(key);
|
|
45
|
+
this.log("caching", key);
|
|
46
|
+
const data = this.prepareDataForStorage(value, ttl);
|
|
47
|
+
const fileDirectory = path.resolve(this.directory, key);
|
|
48
|
+
await ensureDirectoryAsync(fileDirectory);
|
|
49
|
+
await putJsonFileAsync(path.resolve(fileDirectory, this.fileName), data);
|
|
50
|
+
this.log("cached", key);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* {@inheritdoc}
|
|
55
|
+
*/
|
|
56
|
+
async get(key) {
|
|
57
|
+
const parsedKey = await this.parseKey(key);
|
|
58
|
+
this.log("fetching", parsedKey);
|
|
59
|
+
const fileDirectory = path.resolve(this.directory, parsedKey);
|
|
60
|
+
try {
|
|
61
|
+
const value = await getJsonFileAsync(path.resolve(fileDirectory, this.fileName));
|
|
62
|
+
return this.parseCachedData(parsedKey, value);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
this.log("notFound", parsedKey);
|
|
66
|
+
this.remove(key);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* {@inheritdoc}
|
|
72
|
+
*/
|
|
73
|
+
async remove(key) {
|
|
74
|
+
const parsedKey = await this.parseKey(key);
|
|
75
|
+
this.log("removing", parsedKey);
|
|
76
|
+
const fileDirectory = path.resolve(this.directory, parsedKey);
|
|
77
|
+
try {
|
|
78
|
+
await removeDirectoryAsync(fileDirectory);
|
|
79
|
+
this.log("removed", parsedKey);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
//
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* {@inheritdoc}
|
|
87
|
+
*/
|
|
88
|
+
async flush() {
|
|
89
|
+
this.log("flushing");
|
|
90
|
+
if (this.options.globalPrefix) {
|
|
91
|
+
await this.removeNamespace("");
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
await removeDirectoryAsync(this.directory);
|
|
95
|
+
}
|
|
96
|
+
this.log("flushed");
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* {@inheritdoc}
|
|
100
|
+
*/
|
|
101
|
+
async connect() {
|
|
102
|
+
this.log("connecting");
|
|
103
|
+
await ensureDirectoryAsync(this.directory);
|
|
104
|
+
this.log("connected");
|
|
105
|
+
}
|
|
106
|
+
}export{FileCacheDriver};//# sourceMappingURL=file-cache-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-cache-driver.js","sources":["../../src/drivers/file-cache-driver.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./base-cache-driver";
|
|
2
|
+
export * from "./file-cache-driver";
|
|
3
|
+
export * from "./lru-memory-cache-driver";
|
|
4
|
+
export * from "./memory-cache-driver";
|
|
5
|
+
export * from "./memory-extended-cache-driver";
|
|
6
|
+
export * from "./null-cache-driver";
|
|
7
|
+
export * from "./redis-cache-driver";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/drivers/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { GenericObject } from "@mongez/reinforcements";
|
|
2
|
+
import { CacheDriver, LRUMemoryCacheOptions } from "../types";
|
|
3
|
+
import { BaseCacheDriver } from "./base-cache-driver";
|
|
4
|
+
declare class CacheNode {
|
|
5
|
+
key: string;
|
|
6
|
+
value: any;
|
|
7
|
+
next: CacheNode | null;
|
|
8
|
+
prev: CacheNode | null;
|
|
9
|
+
constructor(key: string, value: any);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* LRU Memory Cache Driver
|
|
13
|
+
* The concept of LRU is to remove the least recently used data
|
|
14
|
+
* whenever the cache is full
|
|
15
|
+
* The question that resides here is how to tell the cache is full?
|
|
16
|
+
*/
|
|
17
|
+
export declare class LRUMemoryCacheDriver extends BaseCacheDriver<LRUMemoryCacheDriver, LRUMemoryCacheOptions> implements CacheDriver<LRUMemoryCacheDriver, LRUMemoryCacheOptions> {
|
|
18
|
+
/**
|
|
19
|
+
* {@inheritdoc}
|
|
20
|
+
*/
|
|
21
|
+
name: string;
|
|
22
|
+
/**
|
|
23
|
+
* Cache map
|
|
24
|
+
*/
|
|
25
|
+
protected cache: Map<string, CacheNode>;
|
|
26
|
+
/**
|
|
27
|
+
* Head of the cache
|
|
28
|
+
*/
|
|
29
|
+
protected head: CacheNode;
|
|
30
|
+
/**
|
|
31
|
+
* Tail of the cache
|
|
32
|
+
*/
|
|
33
|
+
protected tail: CacheNode;
|
|
34
|
+
/**
|
|
35
|
+
* {@inheritdoc}
|
|
36
|
+
*/
|
|
37
|
+
constructor();
|
|
38
|
+
/**
|
|
39
|
+
* Initialize the cache
|
|
40
|
+
*/
|
|
41
|
+
init(): void;
|
|
42
|
+
/**
|
|
43
|
+
* {@inheritdoc}
|
|
44
|
+
*/
|
|
45
|
+
removeNamespace(_namespace: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* {@inheritdoc}
|
|
48
|
+
*/
|
|
49
|
+
set(key: string | GenericObject, value: any, _ttl?: number): Promise<this>;
|
|
50
|
+
/**
|
|
51
|
+
* Move the node to the head
|
|
52
|
+
*/
|
|
53
|
+
protected moveHead(node: CacheNode): void;
|
|
54
|
+
/**
|
|
55
|
+
* Remove the node from the cache
|
|
56
|
+
*/
|
|
57
|
+
protected removeNode(node: CacheNode): void;
|
|
58
|
+
/**
|
|
59
|
+
* Add the node to the head
|
|
60
|
+
*/
|
|
61
|
+
protected addNode(node: CacheNode): void;
|
|
62
|
+
/**
|
|
63
|
+
* Remove the tail node
|
|
64
|
+
*/
|
|
65
|
+
protected removeTail(): void;
|
|
66
|
+
/**
|
|
67
|
+
* {@inheritdoc}
|
|
68
|
+
*/
|
|
69
|
+
get(key: string | GenericObject): Promise<any>;
|
|
70
|
+
/**
|
|
71
|
+
* {@inheritdoc}
|
|
72
|
+
*/
|
|
73
|
+
remove(key: string | GenericObject): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* {@inheritdoc}
|
|
76
|
+
*/
|
|
77
|
+
flush(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Get lru capacity
|
|
80
|
+
*/
|
|
81
|
+
get capacity(): number;
|
|
82
|
+
}
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=lru-memory-cache-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-memory-cache-driver.d.ts","sourceRoot":"","sources":["../../src/drivers/lru-memory-cache-driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,cAAM,SAAS;IAIJ,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,GAAG;IAJZ,IAAI,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC9B,IAAI,EAAE,SAAS,GAAG,IAAI,CAAQ;gBAE5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG;CAIpB;AAED;;;;;GAKG;AACH,qBAAa,oBACX,SAAQ,eAAe,CAAC,oBAAoB,EAAE,qBAAqB,CACnE,YAAW,WAAW,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;IAEnE;;OAEG;IACI,IAAI,SAAS;IAEpB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAa;IAEpD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,SAAS,CAA2B;IAEpD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,SAAS,CAA2B;IAEpD;;OAEG;;IAOH;;OAEG;IACI,IAAI;IAKX;;OAEG;IACU,eAAe,CAAC,UAAU,EAAE,MAAM;IAI/C;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM;IA2BvE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS;IAKlC;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS;IAKpC;;OAEG;IACH,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS;IAOjC;;OAEG;IACH,SAAS,CAAC,UAAU;IAQpB;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa;IAmB5C;;OAEG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa;IAe/C;;OAEG;IACU,KAAK;IAUlB;;OAEG;IACH,IAAW,QAAQ,WAElB;CACF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {BaseCacheDriver}from'./base-cache-driver.js';class CacheNode {
|
|
2
|
+
key;
|
|
3
|
+
value;
|
|
4
|
+
next = null;
|
|
5
|
+
prev = null;
|
|
6
|
+
constructor(key, value) {
|
|
7
|
+
this.key = key;
|
|
8
|
+
this.value = value;
|
|
9
|
+
//
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* LRU Memory Cache Driver
|
|
14
|
+
* The concept of LRU is to remove the least recently used data
|
|
15
|
+
* whenever the cache is full
|
|
16
|
+
* The question that resides here is how to tell the cache is full?
|
|
17
|
+
*/
|
|
18
|
+
class LRUMemoryCacheDriver extends BaseCacheDriver {
|
|
19
|
+
/**
|
|
20
|
+
* {@inheritdoc}
|
|
21
|
+
*/
|
|
22
|
+
name = "lru";
|
|
23
|
+
/**
|
|
24
|
+
* Cache map
|
|
25
|
+
*/
|
|
26
|
+
cache = new Map();
|
|
27
|
+
/**
|
|
28
|
+
* Head of the cache
|
|
29
|
+
*/
|
|
30
|
+
head = new CacheNode("", null);
|
|
31
|
+
/**
|
|
32
|
+
* Tail of the cache
|
|
33
|
+
*/
|
|
34
|
+
tail = new CacheNode("", null);
|
|
35
|
+
/**
|
|
36
|
+
* {@inheritdoc}
|
|
37
|
+
*/
|
|
38
|
+
constructor() {
|
|
39
|
+
super();
|
|
40
|
+
this.init();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Initialize the cache
|
|
44
|
+
*/
|
|
45
|
+
init() {
|
|
46
|
+
this.head.next = this.tail;
|
|
47
|
+
this.tail.prev = this.head;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* {@inheritdoc}
|
|
51
|
+
*/
|
|
52
|
+
async removeNamespace(_namespace) {
|
|
53
|
+
throw new Error("Namespace is not supported in LRU cache driver.");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* {@inheritdoc}
|
|
57
|
+
*/
|
|
58
|
+
async set(key, value, _ttl) {
|
|
59
|
+
key = await this.parseKey(key);
|
|
60
|
+
this.log("caching", key);
|
|
61
|
+
const node = this.cache.get(key);
|
|
62
|
+
if (node) {
|
|
63
|
+
node.value = value;
|
|
64
|
+
this.moveHead(node);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const node = new CacheNode(key, value);
|
|
68
|
+
this.cache.set(key, node);
|
|
69
|
+
this.addNode(node);
|
|
70
|
+
if (this.cache.size > this.capacity) {
|
|
71
|
+
this.removeTail();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
this.log("cached", key);
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Move the node to the head
|
|
79
|
+
*/
|
|
80
|
+
moveHead(node) {
|
|
81
|
+
this.removeNode(node);
|
|
82
|
+
this.addNode(node);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Remove the node from the cache
|
|
86
|
+
*/
|
|
87
|
+
removeNode(node) {
|
|
88
|
+
node.prev.next = node.next;
|
|
89
|
+
node.next.prev = node.prev;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Add the node to the head
|
|
93
|
+
*/
|
|
94
|
+
addNode(node) {
|
|
95
|
+
node.next = this.head.next;
|
|
96
|
+
node.prev = this.head;
|
|
97
|
+
this.head.next.prev = node;
|
|
98
|
+
this.head.next = node;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Remove the tail node
|
|
102
|
+
*/
|
|
103
|
+
removeTail() {
|
|
104
|
+
const node = this.tail.prev;
|
|
105
|
+
this.removeNode(node);
|
|
106
|
+
this.cache.delete(node.key);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* {@inheritdoc}
|
|
110
|
+
*/
|
|
111
|
+
async get(key) {
|
|
112
|
+
const parsedKey = await this.parseKey(key);
|
|
113
|
+
this.log("fetching", parsedKey);
|
|
114
|
+
const node = this.cache.get(parsedKey);
|
|
115
|
+
if (!node) {
|
|
116
|
+
this.log("notFound", parsedKey);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
this.moveHead(node);
|
|
120
|
+
this.log("fetched", parsedKey);
|
|
121
|
+
return node.value;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* {@inheritdoc}
|
|
125
|
+
*/
|
|
126
|
+
async remove(key) {
|
|
127
|
+
const parsedKey = await this.parseKey(key);
|
|
128
|
+
this.log("removing", parsedKey);
|
|
129
|
+
const node = this.cache.get(parsedKey);
|
|
130
|
+
if (node) {
|
|
131
|
+
this.removeNode(node);
|
|
132
|
+
this.cache.delete(parsedKey);
|
|
133
|
+
}
|
|
134
|
+
this.log("removed", parsedKey);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* {@inheritdoc}
|
|
138
|
+
*/
|
|
139
|
+
async flush() {
|
|
140
|
+
this.log("flushing");
|
|
141
|
+
this.cache.clear();
|
|
142
|
+
this.init();
|
|
143
|
+
this.log("flushed");
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get lru capacity
|
|
147
|
+
*/
|
|
148
|
+
get capacity() {
|
|
149
|
+
return this.options.capacity || 1000;
|
|
150
|
+
}
|
|
151
|
+
}export{LRUMemoryCacheDriver};//# sourceMappingURL=lru-memory-cache-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-memory-cache-driver.js","sources":["../../src/drivers/lru-memory-cache-driver.ts"],"sourcesContent":[null],"names":[],"mappings":"qDAIA,MAAM,SAAS,CAAA;AAIJ,IAAA,GAAA,CAAA;AACA,IAAA,KAAA,CAAA;IAJF,IAAI,GAAqB,IAAI,CAAC;IAC9B,IAAI,GAAqB,IAAI,CAAC;IACrC,WACS,CAAA,GAAW,EACX,KAAU,EAAA;QADV,IAAG,CAAA,GAAA,GAAH,GAAG,CAAQ;QACX,IAAK,CAAA,KAAA,GAAL,KAAK,CAAK;;KAGlB;AACF,CAAA;AAED;;;;;AAKG;AACG,MAAO,oBACX,SAAQ,eAA4D,CAAA;AAGpE;;AAEG;IACI,IAAI,GAAG,KAAK,CAAC;AAEpB;;AAEG;AACO,IAAA,KAAK,GAA2B,IAAI,GAAG,EAAE,CAAC;AAEpD;;AAEG;IACO,IAAI,GAAc,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAEpD;;AAEG;IACO,IAAI,GAAc,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAEpD;;AAEG;AACH,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,IAAI,EAAE,CAAC;KACb;AAED;;AAEG;IACI,IAAI,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;KAC5B;AAED;;AAEG;IACI,MAAM,eAAe,CAAC,UAAkB,EAAA;AAC7C,QAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;KACpE;AAED;;AAEG;AACI,IAAA,MAAM,GAAG,CAAC,GAA2B,EAAE,KAAU,EAAE,IAAa,EAAA;QACrE,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAE/B,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AAClC,QAAA,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AAEnB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACrB,SAAA;AAAM,aAAA;YACL,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAEvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAE1B,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEnB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;gBACnC,IAAI,CAAC,UAAU,EAAE,CAAC;AACnB,aAAA;AACF,SAAA;AAED,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAExB,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;AAEG;AACO,IAAA,QAAQ,CAAC,IAAe,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACpB;AAED;;AAEG;AACO,IAAA,UAAU,CAAC,IAAe,EAAA;QAClC,IAAI,CAAC,IAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;KAC7B;AAED;;AAEG;AACO,IAAA,OAAO,CAAC,IAAe,EAAA;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,GAAG,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;KACvB;AAED;;AAEG;IACO,UAAU,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC;AAE7B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC7B;AAED;;AAEG;IACI,MAAM,GAAG,CAAC,GAA2B,EAAA;QAC1C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAE3C,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAChC,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEpB,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE/B,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAED;;AAEG;IACI,MAAM,MAAM,CAAC,GAA2B,EAAA;QAC7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAE3C,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEvC,QAAA,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC9B,SAAA;AAED,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;KAChC;AAED;;AAEG;AACI,IAAA,MAAM,KAAK,GAAA;AAChB,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAErB,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,CAAC,IAAI,EAAE,CAAC;AAEZ,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;KACrB;AAED;;AAEG;AACH,IAAA,IAAW,QAAQ,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;KACtC;AACF"}
|