extra-disk-store 0.5.0 → 0.6.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/lib/converters/prefix-key-converter.js.map +1 -1
- package/lib/disk-store-view.js +1 -1
- package/lib/disk-store-view.js.map +1 -1
- package/lib/disk-store-with-cache.js.map +1 -1
- package/lib/disk-store.js.map +1 -1
- package/package.json +30 -30
- package/src/converters/index-key-converter.ts +13 -0
- package/src/converters/index.ts +11 -0
- package/src/converters/json-key-converter.ts +11 -0
- package/src/converters/json-value-converter.ts +13 -0
- package/src/converters/lz4-value-converter.ts +18 -0
- package/src/converters/passthrough-key-converter.ts +11 -0
- package/src/converters/passthrough-value-converter.ts +11 -0
- package/src/converters/prefix-key-converter.ts +22 -0
- package/src/converters/zstandard-value-converter.ts +19 -0
- package/src/disk-store-view.ts +62 -0
- package/src/disk-store-with-cache.ts +78 -0
- package/src/disk-store.ts +59 -0
- package/src/index.ts +4 -0
- package/src/types.ts +18 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefix-key-converter.js","sourceRoot":"","sources":["../../src/converters/prefix-key-converter.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IAC7B,YACU,YAA8B,EAC9B,MAAc;QADd,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,KAAQ;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACnD,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"prefix-key-converter.js","sourceRoot":"","sources":["../../src/converters/prefix-key-converter.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IAC7B,YACU,YAA8B,EAC9B,MAAc;QADd,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,KAAQ;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACnD,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YAC/E,OAAO,GAAG,CAAA;QACZ,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;CACF"}
|
package/lib/disk-store-view.js
CHANGED
|
@@ -32,7 +32,7 @@ export class DiskStoreView {
|
|
|
32
32
|
await this.store.clear();
|
|
33
33
|
}
|
|
34
34
|
keys() {
|
|
35
|
-
return pipe(this.store.keys(), iter => mapAsync(iter,
|
|
35
|
+
return pipe(this.store.keys(), iter => mapAsync(iter, key => this.keyConverter.fromString(key)), iter => filterAsync(iter, isntUndefined));
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
//# sourceMappingURL=disk-store-view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-store-view.js","sourceRoot":"","sources":["../src/disk-store-view.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAa,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAY9D,MAAM,OAAO,aAAa;IACxB,YACU,KAAqC,EACrC,YAA8B,EAC9B,cAAkC;QAFlC,UAAK,GAAL,KAAK,CAAgC;QACrC,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAM;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAM;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAEpE,IAAI,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"disk-store-view.js","sourceRoot":"","sources":["../src/disk-store-view.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAa,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAY9D,MAAM,OAAO,aAAa;IACxB,YACU,KAAqC,EACrC,YAA8B,EAC9B,cAAkC;QAFlC,UAAK,GAAL,KAAK,CAAgC;QACrC,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAM;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAM;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAEpE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAM,EAAE,KAAQ;QACxB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACnB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;YACrC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC;SAC1C,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAM;QACjB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACjB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAChE,IAAI,CAAC,EAAE,CAAC,WAAW,CAA8C,IAAI,EAAE,aAAa,CAAC,CACtF,CAAA;IACH,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-store-with-cache.js","sourceRoot":"","sources":["../src/disk-store-with-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAUnD,MAAM,OAAO,kBAAkB;IAC7B,YACU,KAAgB,EAChB,KAAa;QADb,UAAK,GAAL,KAAK,CAAW;QAChB,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,MAAM,KAAK,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"disk-store-with-cache.js","sourceRoot":"","sources":["../src/disk-store-with-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAUnD,MAAM,OAAO,kBAAkB;IAC7B,YACU,KAAgB,EAChB,KAAa;QADb,UAAK,GAAL,KAAK,CAAW;QAChB,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,MAAM,CAAA;QACf,CAAC;aAAM,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAA;QACb,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;gBAC3B,OAAO,IAAI,CAAA;YACb,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;gBAC1B,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,SAAS,CAAA;QAClB,CAAC;aAAM,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,MAAM,CAAA;QACf,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;gBAC3B,OAAO,MAAM,CAAA;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;gBAC1B,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAEhC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAE5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAExB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF"}
|
package/lib/disk-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../src/disk-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAA;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,OAAO,SAAS;IAKpB,YAAY,OAAgB;QAC1B,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../src/disk-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAA;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,OAAO,SAAS;IAKpB,YAAY,OAAgB;QAC1B,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,kBAAkB,EAAE,CAAA;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;YACvB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;QAC7B,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAiB,IAAI,CAAC,QAAQ,EAAE;YAGlD,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,KAAK;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QAEtB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,GAAa,CAAC,CAAA;IAC3D,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extra-disk-store",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"files": [
|
|
7
|
-
"lib"
|
|
7
|
+
"lib",
|
|
8
|
+
"src"
|
|
8
9
|
],
|
|
9
10
|
"type": "module",
|
|
10
11
|
"main": "lib/index.js",
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
"license": "MIT",
|
|
15
16
|
"sideEffects": false,
|
|
16
17
|
"engines": {
|
|
17
|
-
"node": ">=
|
|
18
|
+
"node": ">=18.17.0"
|
|
18
19
|
},
|
|
19
20
|
"scripts": {
|
|
20
21
|
"prepare": "ts-patch install -s",
|
|
@@ -24,7 +25,7 @@
|
|
|
24
25
|
"prepublishOnly": "run-s prepare clean build",
|
|
25
26
|
"clean": "rimraf lib",
|
|
26
27
|
"build": "tsc --project tsconfig.build.json",
|
|
27
|
-
"bench": "
|
|
28
|
+
"bench": "tsx benches/index.ts",
|
|
28
29
|
"release": "standard-version"
|
|
29
30
|
},
|
|
30
31
|
"husky": {
|
|
@@ -34,39 +35,38 @@
|
|
|
34
35
|
}
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
37
|
-
"@blackglory/jest-resolver": "^0.3.
|
|
38
|
-
"@blackglory/structures": "^0.13.
|
|
39
|
-
"@commitlint/cli": "^
|
|
40
|
-
"@commitlint/config-conventional": "^
|
|
41
|
-
"@types/jest": "^29.
|
|
42
|
-
"@types/node": "
|
|
43
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
44
|
-
"@typescript-eslint/parser": "^
|
|
38
|
+
"@blackglory/jest-resolver": "^0.3.1",
|
|
39
|
+
"@blackglory/structures": "^0.13.4",
|
|
40
|
+
"@commitlint/cli": "^18.6.1",
|
|
41
|
+
"@commitlint/config-conventional": "^18.6.2",
|
|
42
|
+
"@types/jest": "^29.5.12",
|
|
43
|
+
"@types/node": "18",
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "^7.0.1",
|
|
45
|
+
"@typescript-eslint/parser": "^7.0.1",
|
|
45
46
|
"cross-env": "^7.0.3",
|
|
46
|
-
"eslint": "^8.
|
|
47
|
+
"eslint": "^8.56.0",
|
|
47
48
|
"husky": "^4.3.0",
|
|
48
|
-
"jest": "^29.
|
|
49
|
-
"jest-resolve": "^29.
|
|
49
|
+
"jest": "^29.7.0",
|
|
50
|
+
"jest-resolve": "^29.7.0",
|
|
50
51
|
"npm-run-all": "^4.1.5",
|
|
51
|
-
"pretty-bytes": "6.1.
|
|
52
|
-
"rimraf": "^
|
|
52
|
+
"pretty-bytes": "6.1.1",
|
|
53
|
+
"rimraf": "^5.0.5",
|
|
53
54
|
"standard-version": "^9.5.0",
|
|
54
|
-
"ts-jest": "^29.
|
|
55
|
-
"ts-
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"typescript": "4.8",
|
|
55
|
+
"ts-jest": "^29.1.2",
|
|
56
|
+
"ts-patch": "^3.1.2",
|
|
57
|
+
"tsx": "^4.7.1",
|
|
58
|
+
"typescript": "5.3.3",
|
|
59
59
|
"typescript-transform-paths": "^3.4.6"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@blackglory/prelude": "^0.3.
|
|
63
|
-
"@mongodb-js/zstd": "^1.
|
|
64
|
-
"extra-benchmark": "^0.2.
|
|
65
|
-
"extra-filesystem": "^0.
|
|
66
|
-
"extra-promise": "^6.0
|
|
67
|
-
"extra-utils": "^5.
|
|
68
|
-
"iterable-operator": "^
|
|
69
|
-
"lmdb": "^2.
|
|
62
|
+
"@blackglory/prelude": "^0.3.4",
|
|
63
|
+
"@mongodb-js/zstd": "^1.2.0",
|
|
64
|
+
"extra-benchmark": "^0.2.3",
|
|
65
|
+
"extra-filesystem": "^0.5.1",
|
|
66
|
+
"extra-promise": "^6.2.0",
|
|
67
|
+
"extra-utils": "^5.6.0",
|
|
68
|
+
"iterable-operator": "^5.0.0",
|
|
69
|
+
"lmdb": "^2.9.2",
|
|
70
70
|
"lz4-wasm-nodejs": "^0.9.2"
|
|
71
71
|
}
|
|
72
72
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IKeyConverter } from '@src/types.js'
|
|
2
|
+
|
|
3
|
+
export class IndexKeyConverter implements IKeyConverter<number> {
|
|
4
|
+
constructor(private radix: number = 10) {}
|
|
5
|
+
|
|
6
|
+
toString(value: number): string {
|
|
7
|
+
return value.toString(this.radix)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
fromString(value: string): number {
|
|
11
|
+
return Number.parseInt(value, this.radix)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './json-key-converter.js'
|
|
2
|
+
export * from './json-value-converter.js'
|
|
3
|
+
|
|
4
|
+
export * from './passthrough-key-converter.js'
|
|
5
|
+
export * from './passthrough-value-converter.js'
|
|
6
|
+
|
|
7
|
+
export * from './index-key-converter.js'
|
|
8
|
+
export * from './prefix-key-converter.js'
|
|
9
|
+
|
|
10
|
+
export * from './lz4-value-converter.js'
|
|
11
|
+
export * from './zstandard-value-converter.js'
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IValueConverter } from '@src/types.js'
|
|
2
|
+
|
|
3
|
+
export class JSONValueConverter<T> implements IValueConverter<T> {
|
|
4
|
+
constructor(private encoding: BufferEncoding = 'utf-8') {}
|
|
5
|
+
|
|
6
|
+
fromBuffer(buffer: Buffer): T {
|
|
7
|
+
return JSON.parse(buffer.toString(this.encoding))
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
toBuffer(value: T): Buffer {
|
|
11
|
+
return Buffer.from(JSON.stringify(value), this.encoding)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as lz4 from 'lz4-wasm-nodejs'
|
|
2
|
+
import { IValueConverter } from '@src/types.js'
|
|
3
|
+
|
|
4
|
+
export class LZ4ValueConverter<T> implements IValueConverter<T> {
|
|
5
|
+
constructor(
|
|
6
|
+
private valueConverter: IValueConverter<T>
|
|
7
|
+
) {}
|
|
8
|
+
|
|
9
|
+
async toBuffer(value: T): Promise<Buffer> {
|
|
10
|
+
const buffer = await this.valueConverter.toBuffer(value)
|
|
11
|
+
return Buffer.from(lz4.compress(buffer))
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async fromBuffer(value: Buffer): Promise<T> {
|
|
15
|
+
const buffer = Buffer.from(lz4.decompress(value))
|
|
16
|
+
return await this.valueConverter.fromBuffer(buffer)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IKeyConverter } from '@src/types.js'
|
|
2
|
+
|
|
3
|
+
export class PrefixKeyConverter<T> implements IKeyConverter<T> {
|
|
4
|
+
constructor(
|
|
5
|
+
private keyConverter: IKeyConverter<T>
|
|
6
|
+
, private prefix: string
|
|
7
|
+
) {}
|
|
8
|
+
|
|
9
|
+
async toString(value: T): Promise<string> {
|
|
10
|
+
const key = await this.keyConverter.toString(value)
|
|
11
|
+
return this.prefix + key
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async fromString(value: string): Promise<T | undefined> {
|
|
15
|
+
if (value.startsWith(this.prefix)) {
|
|
16
|
+
const key = await this.keyConverter.fromString(value.slice(this.prefix.length))
|
|
17
|
+
return key
|
|
18
|
+
} else {
|
|
19
|
+
return undefined
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as zstd from '@mongodb-js/zstd'
|
|
2
|
+
import { IValueConverter } from '@src/types.js'
|
|
3
|
+
|
|
4
|
+
export class ZstandardValueConverter<T> implements IValueConverter<T> {
|
|
5
|
+
constructor(
|
|
6
|
+
private valueConverter: IValueConverter<T>
|
|
7
|
+
, private level: number
|
|
8
|
+
) {}
|
|
9
|
+
|
|
10
|
+
async toBuffer(value: T): Promise<Buffer> {
|
|
11
|
+
const buffer = await this.valueConverter.toBuffer(value)
|
|
12
|
+
return Buffer.from(await zstd.compress(buffer, this.level))
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async fromBuffer(value: Buffer): Promise<T> {
|
|
16
|
+
const buffer = Buffer.from(await zstd.decompress(value))
|
|
17
|
+
return await this.valueConverter.fromBuffer(buffer)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { DiskStore } from '@src/disk-store.js'
|
|
2
|
+
import { DiskStoreWithCache } from '@src/disk-store-with-cache.js'
|
|
3
|
+
import { pipe } from 'extra-utils'
|
|
4
|
+
import { mapAsync, filterAsync } from 'iterable-operator'
|
|
5
|
+
import { Awaitable, isntUndefined } from '@blackglory/prelude'
|
|
6
|
+
|
|
7
|
+
export interface IKeyConverter<T> {
|
|
8
|
+
toString: (value: T) => Awaitable<string>
|
|
9
|
+
fromString: (value: string) => Awaitable<T | undefined>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface IValueConverter<T> {
|
|
13
|
+
toBuffer: (value: T) => Awaitable<Buffer>
|
|
14
|
+
fromBuffer: (value: Buffer) => Awaitable<T>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class DiskStoreView<K, V> {
|
|
18
|
+
constructor(
|
|
19
|
+
private store: DiskStore | DiskStoreWithCache
|
|
20
|
+
, private keyConverter: IKeyConverter<K>
|
|
21
|
+
, private valueConverter: IValueConverter<V>
|
|
22
|
+
) {}
|
|
23
|
+
|
|
24
|
+
async has(key: K): Promise<boolean> {
|
|
25
|
+
return this.store.has(await this.keyConverter.toString(key))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async get(key: K): Promise<V | undefined> {
|
|
29
|
+
const buffer = this.store.get(await this.keyConverter.toString(key))
|
|
30
|
+
|
|
31
|
+
if (buffer) {
|
|
32
|
+
return this.valueConverter.fromBuffer(buffer)
|
|
33
|
+
} else {
|
|
34
|
+
return undefined
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async set(key: K, value: V): Promise<void> {
|
|
39
|
+
await this.store.set(
|
|
40
|
+
...await Promise.all([
|
|
41
|
+
await this.keyConverter.toString(key)
|
|
42
|
+
, await this.valueConverter.toBuffer(value)
|
|
43
|
+
])
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async delete(key: K): Promise<void> {
|
|
48
|
+
await this.store.delete(await this.keyConverter.toString(key))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async clear(): Promise<void> {
|
|
52
|
+
await this.store.clear()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
keys(): AsyncIterableIterator<K> {
|
|
56
|
+
return pipe(
|
|
57
|
+
this.store.keys()
|
|
58
|
+
, iter => mapAsync(iter, key => this.keyConverter.fromString(key))
|
|
59
|
+
, iter => filterAsync<Awaited<K> | undefined, Awaited<Awaited<K>>>(iter, isntUndefined)
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { isntUndefined } from '@blackglory/prelude'
|
|
2
|
+
import { DiskStore } from './disk-store.js'
|
|
3
|
+
|
|
4
|
+
export interface ICache {
|
|
5
|
+
set(key: string, value: Buffer | false): void
|
|
6
|
+
get(key: string): Buffer | false | undefined
|
|
7
|
+
delete(key: string): void
|
|
8
|
+
clear(): void
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class DiskStoreWithCache {
|
|
12
|
+
constructor(
|
|
13
|
+
private store: DiskStore
|
|
14
|
+
, private cache: ICache
|
|
15
|
+
) {}
|
|
16
|
+
|
|
17
|
+
async close(): Promise<void> {
|
|
18
|
+
await this.store.close()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
has(key: string): boolean {
|
|
22
|
+
const result = this.cache.get(key)
|
|
23
|
+
if (result === false) {
|
|
24
|
+
return result
|
|
25
|
+
} else if (isntUndefined(result)) {
|
|
26
|
+
return true
|
|
27
|
+
} else {
|
|
28
|
+
const result = this.store.get(key)
|
|
29
|
+
if (result) {
|
|
30
|
+
this.cache.set(key, result)
|
|
31
|
+
return true
|
|
32
|
+
} else {
|
|
33
|
+
this.cache.set(key, false)
|
|
34
|
+
return false
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
get(key: string): Buffer | undefined {
|
|
40
|
+
const result = this.cache.get(key)
|
|
41
|
+
if (result === false) {
|
|
42
|
+
return undefined
|
|
43
|
+
} else if (isntUndefined(result)) {
|
|
44
|
+
return result
|
|
45
|
+
} else {
|
|
46
|
+
const result = this.store.get(key)
|
|
47
|
+
if (result) {
|
|
48
|
+
this.cache.set(key, result)
|
|
49
|
+
return result
|
|
50
|
+
} else {
|
|
51
|
+
this.cache.set(key, false)
|
|
52
|
+
return result
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async set(key: string, value: Buffer): Promise<void> {
|
|
58
|
+
await this.store.set(key, value)
|
|
59
|
+
|
|
60
|
+
this.cache.delete(key)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async delete(key: string): Promise<void> {
|
|
64
|
+
await this.store.delete(key)
|
|
65
|
+
|
|
66
|
+
this.cache.delete(key)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async clear(): Promise<void> {
|
|
70
|
+
await this.store.clear()
|
|
71
|
+
|
|
72
|
+
this.cache.clear()
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
keys(): IterableIterator<string> {
|
|
76
|
+
return this.store.keys()
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as Iter from 'iterable-operator'
|
|
2
|
+
import * as LMDB from 'lmdb'
|
|
3
|
+
import { createTempNameSync, remove } from 'extra-filesystem'
|
|
4
|
+
import { isUndefined } from '@blackglory/prelude'
|
|
5
|
+
|
|
6
|
+
export class DiskStore {
|
|
7
|
+
public _db: LMDB.RootDatabase
|
|
8
|
+
public _dirname: string
|
|
9
|
+
private isTempPathname: boolean
|
|
10
|
+
|
|
11
|
+
constructor(dirname?: string) {
|
|
12
|
+
if (isUndefined(dirname)) {
|
|
13
|
+
this._dirname = createTempNameSync()
|
|
14
|
+
this.isTempPathname = true
|
|
15
|
+
} else {
|
|
16
|
+
this._dirname = dirname
|
|
17
|
+
this.isTempPathname = false
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
this._db = LMDB.open<Buffer, string>(this._dirname, {
|
|
21
|
+
// 采用其他编码方式可能遇到错误.
|
|
22
|
+
// 尤其是采用与lmdb-js同作者的msgpackr一定会出现错误, 因为它是一个有问题的实现.
|
|
23
|
+
encoding: 'binary'
|
|
24
|
+
, compression: false
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async close(): Promise<void> {
|
|
29
|
+
await this._db.close()
|
|
30
|
+
|
|
31
|
+
if (this.isTempPathname) {
|
|
32
|
+
await remove(this._dirname)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
has(key: string): boolean {
|
|
37
|
+
return this._db.doesExist(key)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get(key: string): Buffer | undefined {
|
|
41
|
+
return this._db.getBinary(key)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async set(key: string, value: Buffer): Promise<void> {
|
|
45
|
+
await this._db.put(key, value)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async delete(key: string): Promise<void> {
|
|
49
|
+
await this._db.remove(key)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async clear(): Promise<void> {
|
|
53
|
+
await this._db.clearAsync()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
keys(): IterableIterator<string> {
|
|
57
|
+
return Iter.map(this._db.getKeys(), key => key as string)
|
|
58
|
+
}
|
|
59
|
+
}
|
package/src/index.ts
ADDED
package/src/types.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Awaitable } from '@blackglory/prelude'
|
|
2
|
+
|
|
3
|
+
export interface ICache {
|
|
4
|
+
set(key: string, value: Buffer | boolean | undefined): void
|
|
5
|
+
get(key: string): Buffer | boolean | undefined
|
|
6
|
+
delete(key: string): void
|
|
7
|
+
clear(): void
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface IKeyConverter<T> {
|
|
11
|
+
toString: (value: T) => Awaitable<string>
|
|
12
|
+
fromString: (value: string) => Awaitable<T | undefined>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface IValueConverter<T> {
|
|
16
|
+
toBuffer: (value: T) => Awaitable<Buffer>
|
|
17
|
+
fromBuffer: (value: Buffer) => Awaitable<T>
|
|
18
|
+
}
|