extra-disk-store 0.1.4 → 0.2.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 +58 -82
- package/lib/converters/index-key-converter.d.ts +2 -2
- package/lib/converters/json-key-converter.d.ts +2 -2
- package/lib/converters/json-value-converter.d.ts +2 -2
- package/lib/converters/lz4-value-converter.d.ts +4 -4
- package/lib/converters/lz4-value-converter.js +4 -4
- package/lib/converters/lz4-value-converter.js.map +1 -1
- package/lib/converters/passthrough-key-converter.d.ts +2 -2
- package/lib/converters/passthrough-value-converter.d.ts +2 -2
- package/lib/converters/prefix-key-converter.d.ts +2 -9
- package/lib/converters/prefix-key-converter.js +2 -22
- package/lib/converters/prefix-key-converter.js.map +1 -1
- package/lib/converters/zstandard-value-converter.d.ts +4 -4
- package/lib/converters/zstandard-value-converter.js +4 -4
- package/lib/converters/zstandard-value-converter.js.map +1 -1
- package/lib/disk-store-view.d.ts +18 -8
- package/lib/disk-store-view.js +14 -11
- package/lib/disk-store-view.js.map +1 -1
- package/lib/disk-store-with-cache.d.ts +25 -0
- package/lib/disk-store-with-cache.js +65 -0
- package/lib/disk-store-with-cache.js.map +1 -0
- package/lib/disk-store.d.ts +12 -11
- package/lib/disk-store.js +36 -81
- package/lib/disk-store.js.map +1 -1
- package/lib/index.d.ts +2 -3
- package/lib/index.js +5 -3
- package/lib/index.js.map +1 -1
- package/lib/types.d.ts +7 -9
- package/package.json +11 -12
- package/lib/disk-store-async-view.d.ts +0 -14
- package/lib/disk-store-async-view.js +0 -39
- package/lib/disk-store-async-view.js.map +0 -1
- package/migrations/001-initial.sql +0 -19
- package/migrations/schema.sql +0 -7
package/README.md
CHANGED
|
@@ -12,8 +12,8 @@ yarn add extra-disk-store
|
|
|
12
12
|
```ts
|
|
13
13
|
import { DiskStore } from 'extra-disk-store'
|
|
14
14
|
|
|
15
|
-
const store =
|
|
16
|
-
store.set('key', Buffer.from('value'))
|
|
15
|
+
const store = new DiskStore('/tmp/store')
|
|
16
|
+
await store.set('key', Buffer.from('value'))
|
|
17
17
|
const value = store.get('key')
|
|
18
18
|
```
|
|
19
19
|
|
|
@@ -21,148 +21,124 @@ const value = store.get('key')
|
|
|
21
21
|
### DiskStore
|
|
22
22
|
```ts
|
|
23
23
|
class DiskStore {
|
|
24
|
-
|
|
24
|
+
constructor(pathname: string)
|
|
25
25
|
|
|
26
|
-
close(): void
|
|
26
|
+
close(): Promise<void>
|
|
27
27
|
|
|
28
28
|
has(key: string): boolean
|
|
29
|
-
get(key: string):
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
set(key: string, value: Buffer): void
|
|
35
|
-
delete(key: string): void
|
|
36
|
-
clear(): void
|
|
29
|
+
get(key: string): Buffer | undefined
|
|
30
|
+
set(key: string, value: Buffer): Promise<void>
|
|
31
|
+
delete(key: string): Promise<void>
|
|
32
|
+
clear(): Promise<void>
|
|
33
|
+
|
|
37
34
|
keys(): IterableIterator<string>
|
|
38
35
|
}
|
|
39
36
|
```
|
|
40
37
|
|
|
41
|
-
###
|
|
38
|
+
### DiskStoreWithCache
|
|
42
39
|
```ts
|
|
43
|
-
interface
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
interface IValueConverter<T> {
|
|
49
|
-
toBuffer: (value: T) => Buffer
|
|
50
|
-
fromBuffer: (value: Buffer) => T
|
|
40
|
+
interface ICache {
|
|
41
|
+
set(key: string, value: Buffer | boolean | undefined): void
|
|
42
|
+
get(key: string): Buffer | boolean | undefined
|
|
43
|
+
delete(key: string): void
|
|
44
|
+
clear(): void
|
|
51
45
|
}
|
|
52
46
|
|
|
53
|
-
class
|
|
47
|
+
class DiskStoreWithCache {
|
|
54
48
|
constructor(
|
|
55
|
-
|
|
56
|
-
,
|
|
57
|
-
, private valueConverter: IValueConverter<V>
|
|
49
|
+
store: DiskStore
|
|
50
|
+
, cache: ICache
|
|
58
51
|
)
|
|
59
52
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
53
|
+
close(): Promise<void>
|
|
54
|
+
|
|
55
|
+
has(key: string): Promise<boolean>
|
|
56
|
+
get(key: string): Buffer | undefined
|
|
57
|
+
set(key: string, value: Buffer): Promise<void>
|
|
58
|
+
delete(key: string): Promise<void>
|
|
59
|
+
clear(): Promise<void>
|
|
60
|
+
|
|
61
|
+
keys(): IterableIterator<string>
|
|
66
62
|
}
|
|
67
63
|
```
|
|
68
64
|
|
|
69
|
-
###
|
|
65
|
+
### DiskStoreView
|
|
70
66
|
```ts
|
|
71
|
-
interface
|
|
67
|
+
interface IKeyConverter<T> {
|
|
72
68
|
toString: (value: T) => Awaitable<string>
|
|
73
69
|
fromString: (value: string) => Awaitable<T | undefined>
|
|
74
70
|
}
|
|
75
71
|
|
|
76
|
-
interface
|
|
72
|
+
interface IValueConverter<T> {
|
|
77
73
|
toBuffer: (value: T) => Awaitable<Buffer>
|
|
78
74
|
fromBuffer: (value: Buffer) => Awaitable<T>
|
|
79
75
|
}
|
|
80
76
|
|
|
81
|
-
class
|
|
77
|
+
class DiskStoreView<K, V> {
|
|
82
78
|
constructor(
|
|
83
|
-
store: DiskStore
|
|
84
|
-
, keyConverter:
|
|
85
|
-
, valueConverter:
|
|
86
|
-
)
|
|
79
|
+
store: DiskStore | DiskStoreWithCache
|
|
80
|
+
, keyConverter: IKeyConverter<K>
|
|
81
|
+
, valueConverter: IValueConverter<V>
|
|
82
|
+
) {}
|
|
87
83
|
|
|
88
84
|
has(key: K): Promise<boolean>
|
|
89
|
-
get(key: K): Promise<V | undefined>
|
|
85
|
+
get(key: K): Promise<V | undefined>
|
|
90
86
|
set(key: K, value: V): Promise<void>
|
|
91
87
|
delete(key: K): Promise<void>
|
|
92
|
-
clear(): void
|
|
93
|
-
|
|
88
|
+
clear(): Promise<void>
|
|
89
|
+
|
|
90
|
+
keys(): IterableIterator<K>
|
|
94
91
|
}
|
|
95
92
|
```
|
|
96
93
|
|
|
97
94
|
### Converters
|
|
98
|
-
####
|
|
95
|
+
#### IndexKeyConverter
|
|
99
96
|
```ts
|
|
100
|
-
class
|
|
97
|
+
class IndexKeyConverter implements IKeyConverter<number>
|
|
101
98
|
```
|
|
102
99
|
|
|
103
|
-
####
|
|
100
|
+
#### JSONKeyConverter
|
|
104
101
|
```ts
|
|
105
|
-
class
|
|
102
|
+
class JSONKeyConverter<T> implements IKeyConverter<T>
|
|
106
103
|
```
|
|
107
104
|
|
|
108
|
-
####
|
|
105
|
+
#### JSONValueConverter
|
|
109
106
|
```ts
|
|
110
|
-
class
|
|
111
|
-
constructor(
|
|
107
|
+
class JSONValueConverter<T> implements IValueConverter<T> {
|
|
108
|
+
constructor(encoding: BufferEncoding = 'utf-8')
|
|
112
109
|
}
|
|
113
110
|
```
|
|
114
111
|
|
|
115
|
-
####
|
|
112
|
+
#### PassthroughKeyConverter
|
|
116
113
|
```ts
|
|
117
|
-
class
|
|
114
|
+
class PassthroughKeyConverter implements IKeyConverter<string>
|
|
118
115
|
```
|
|
119
116
|
|
|
120
|
-
####
|
|
117
|
+
#### PassthroughValueConverter
|
|
121
118
|
```ts
|
|
122
|
-
class
|
|
123
|
-
|
|
119
|
+
class PassthroughValueConverter implements IValueConverter<Buffer>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### PrefixKeyConverter
|
|
123
|
+
```ts
|
|
124
|
+
class PrefixKeyConverter<T> implements IKeyConverter<T> {
|
|
125
|
+
constructor(keyConverter: IKeyConverter<T>, prefix: string)
|
|
124
126
|
}
|
|
125
127
|
```
|
|
126
128
|
|
|
127
129
|
#### LZ4ValueConverter
|
|
128
130
|
```ts
|
|
129
|
-
class LZ4ValueConverter<T> implements IValueConverter<T
|
|
131
|
+
class LZ4ValueConverter<T> implements IValueConverter<T> {
|
|
130
132
|
constructor(valueConverter: IValueConverter<T>)
|
|
131
133
|
}
|
|
132
134
|
```
|
|
133
135
|
|
|
134
136
|
#### ZstandardValueConverter
|
|
135
137
|
```ts
|
|
136
|
-
class ZstandardValueConverter<T> implements IValueConverter<T
|
|
138
|
+
class ZstandardValueConverter<T> implements IValueConverter<T> {
|
|
137
139
|
static create<T>(
|
|
138
140
|
valueConverter: IValueConverter<T>
|
|
139
141
|
, level: number
|
|
140
142
|
): Promise<ZstandardValueConverter<T>>
|
|
141
143
|
}
|
|
142
144
|
```
|
|
143
|
-
|
|
144
|
-
#### PrefixKeyConverter
|
|
145
|
-
```ts
|
|
146
|
-
class PrefixKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<T> {
|
|
147
|
-
constructor(
|
|
148
|
-
keyConverter: IKeyConverter<T>
|
|
149
|
-
, prefix: string
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
toString(value: T): string
|
|
153
|
-
fromString(value: string): T
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
#### PrefixKeyAsyncConverter
|
|
158
|
-
```ts
|
|
159
|
-
class PrefixKeyAsyncConverter<T> implements IKeyAsyncConverter<T> {
|
|
160
|
-
constructor(
|
|
161
|
-
keyConverter: IKeyConverter<T> | IKeyAsyncConverter<T>
|
|
162
|
-
, prefix: string
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
toString(value: T): Promise<string>
|
|
166
|
-
fromString(value: string): Promise<T>
|
|
167
|
-
}
|
|
168
|
-
```
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IKeyConverter
|
|
2
|
-
export declare class IndexKeyConverter implements IKeyConverter<number
|
|
1
|
+
import { IKeyConverter } from "../types";
|
|
2
|
+
export declare class IndexKeyConverter implements IKeyConverter<number> {
|
|
3
3
|
private radix;
|
|
4
4
|
constructor(radix?: number);
|
|
5
5
|
toString(value: number): string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IKeyConverter
|
|
2
|
-
export declare class JSONKeyConverter<T> implements IKeyConverter<T
|
|
1
|
+
import { IKeyConverter } from "../types";
|
|
2
|
+
export declare class JSONKeyConverter<T> implements IKeyConverter<T> {
|
|
3
3
|
fromString(value: string): T;
|
|
4
4
|
toString(value: T): string;
|
|
5
5
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { IValueConverter
|
|
3
|
-
export declare class JSONValueConverter<T> implements IValueConverter<T
|
|
2
|
+
import { IValueConverter } from "../types";
|
|
3
|
+
export declare class JSONValueConverter<T> implements IValueConverter<T> {
|
|
4
4
|
private encoding;
|
|
5
5
|
constructor(encoding?: BufferEncoding);
|
|
6
6
|
fromBuffer(buffer: Buffer): T;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { IValueConverter
|
|
3
|
-
export declare class LZ4ValueConverter<T> implements IValueConverter<T
|
|
2
|
+
import { IValueConverter } from "../types";
|
|
3
|
+
export declare class LZ4ValueConverter<T> implements IValueConverter<T> {
|
|
4
4
|
private valueConverter;
|
|
5
5
|
constructor(valueConverter: IValueConverter<T>);
|
|
6
|
-
toBuffer(value: T): Buffer
|
|
7
|
-
fromBuffer(value: Buffer): T
|
|
6
|
+
toBuffer(value: T): Promise<Buffer>;
|
|
7
|
+
fromBuffer(value: Buffer): Promise<T>;
|
|
8
8
|
}
|
|
@@ -29,13 +29,13 @@ class LZ4ValueConverter {
|
|
|
29
29
|
constructor(valueConverter) {
|
|
30
30
|
this.valueConverter = valueConverter;
|
|
31
31
|
}
|
|
32
|
-
toBuffer(value) {
|
|
33
|
-
const buffer = this.valueConverter.toBuffer(value);
|
|
32
|
+
async toBuffer(value) {
|
|
33
|
+
const buffer = await this.valueConverter.toBuffer(value);
|
|
34
34
|
return Buffer.from(lz4.compress(buffer));
|
|
35
35
|
}
|
|
36
|
-
fromBuffer(value) {
|
|
36
|
+
async fromBuffer(value) {
|
|
37
37
|
const buffer = Buffer.from(lz4.decompress(value));
|
|
38
|
-
return this.valueConverter.fromBuffer(buffer);
|
|
38
|
+
return await this.valueConverter.fromBuffer(buffer);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
exports.LZ4ValueConverter = LZ4ValueConverter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lz4-value-converter.js","sourceRoot":"","sources":["../../src/converters/lz4-value-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAsC;AAGtC,MAAa,iBAAiB;IAC5B,YACU,cAAkC;QAAlC,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,QAAQ,CAAC,KAAQ;
|
|
1
|
+
{"version":3,"file":"lz4-value-converter.js","sourceRoot":"","sources":["../../src/converters/lz4-value-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAsC;AAGtC,MAAa,iBAAiB;IAC5B,YACU,cAAkC;QAAlC,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,KAAQ;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QACjD,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrD,CAAC;CACF;AAdD,8CAcC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IKeyConverter
|
|
2
|
-
export declare class PassthroughKeyConverter implements IKeyConverter<string
|
|
1
|
+
import { IKeyConverter } from "../types";
|
|
2
|
+
export declare class PassthroughKeyConverter implements IKeyConverter<string> {
|
|
3
3
|
toString(value: string): string;
|
|
4
4
|
fromString(value: string): string;
|
|
5
5
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { IValueConverter
|
|
3
|
-
export declare class PassthroughValueConverter implements IValueConverter<Buffer
|
|
2
|
+
import { IValueConverter } from "../types";
|
|
3
|
+
export declare class PassthroughValueConverter implements IValueConverter<Buffer> {
|
|
4
4
|
toBuffer(value: Buffer): Buffer;
|
|
5
5
|
fromBuffer(value: Buffer): Buffer;
|
|
6
6
|
}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
import { IKeyConverter
|
|
2
|
-
export declare class PrefixKeyConverter<T> implements IKeyConverter<T
|
|
1
|
+
import { IKeyConverter } from "../types";
|
|
2
|
+
export declare class PrefixKeyConverter<T> implements IKeyConverter<T> {
|
|
3
3
|
private keyConverter;
|
|
4
4
|
private prefix;
|
|
5
5
|
constructor(keyConverter: IKeyConverter<T>, prefix: string);
|
|
6
|
-
toString(value: T): string;
|
|
7
|
-
fromString(value: string): T | undefined;
|
|
8
|
-
}
|
|
9
|
-
export declare class PrefixKeyAsyncConverter<T> implements IKeyAsyncConverter<T> {
|
|
10
|
-
private keyConverter;
|
|
11
|
-
private prefix;
|
|
12
|
-
constructor(keyConverter: IKeyConverter<T> | IKeyAsyncConverter<T>, prefix: string);
|
|
13
6
|
toString(value: T): Promise<string>;
|
|
14
7
|
fromString(value: string): Promise<T | undefined>;
|
|
15
8
|
}
|
|
@@ -1,27 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.PrefixKeyConverter = void 0;
|
|
4
4
|
class PrefixKeyConverter {
|
|
5
|
-
constructor(keyConverter, prefix) {
|
|
6
|
-
this.keyConverter = keyConverter;
|
|
7
|
-
this.prefix = prefix;
|
|
8
|
-
}
|
|
9
|
-
toString(value) {
|
|
10
|
-
const key = this.keyConverter.toString(value);
|
|
11
|
-
return this.prefix + key;
|
|
12
|
-
}
|
|
13
|
-
fromString(value) {
|
|
14
|
-
if (value.startsWith(this.prefix)) {
|
|
15
|
-
const key = this.keyConverter.fromString(value.slice(this.prefix.length));
|
|
16
|
-
return key;
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
exports.PrefixKeyConverter = PrefixKeyConverter;
|
|
24
|
-
class PrefixKeyAsyncConverter {
|
|
25
5
|
constructor(keyConverter, prefix) {
|
|
26
6
|
this.keyConverter = keyConverter;
|
|
27
7
|
this.prefix = prefix;
|
|
@@ -40,5 +20,5 @@ class PrefixKeyAsyncConverter {
|
|
|
40
20
|
}
|
|
41
21
|
}
|
|
42
22
|
}
|
|
43
|
-
exports.
|
|
23
|
+
exports.PrefixKeyConverter = PrefixKeyConverter;
|
|
44
24
|
//# sourceMappingURL=prefix-key-converter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefix-key-converter.js","sourceRoot":"","sources":["../../src/converters/prefix-key-converter.ts"],"names":[],"mappings":";;;AAEA,MAAa,kBAAkB;IAC7B,YACU,YAA8B,EAC9B,MAAc;QADd,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ,
|
|
1
|
+
{"version":3,"file":"prefix-key-converter.js","sourceRoot":"","sources":["../../src/converters/prefix-key-converter.ts"],"names":[],"mappings":";;;AAEA,MAAa,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;YACjC,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;SACX;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;CACF;AAnBD,gDAmBC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { IValueConverter
|
|
3
|
-
export declare class ZstandardValueConverter<T> implements IValueConverter<T
|
|
2
|
+
import { IValueConverter } from "../types";
|
|
3
|
+
export declare class ZstandardValueConverter<T> implements IValueConverter<T> {
|
|
4
4
|
private valueConverter;
|
|
5
5
|
private level;
|
|
6
6
|
private constructor();
|
|
7
7
|
static create<T>(valueConverter: IValueConverter<T>, level: number): Promise<ZstandardValueConverter<T>>;
|
|
8
|
-
toBuffer(value: T): Buffer
|
|
9
|
-
fromBuffer(value: Buffer): T
|
|
8
|
+
toBuffer(value: T): Promise<Buffer>;
|
|
9
|
+
fromBuffer(value: Buffer): Promise<T>;
|
|
10
10
|
}
|
|
@@ -34,13 +34,13 @@ class ZstandardValueConverter {
|
|
|
34
34
|
await zstd.init();
|
|
35
35
|
return new ZstandardValueConverter(valueConverter, level);
|
|
36
36
|
}
|
|
37
|
-
toBuffer(value) {
|
|
38
|
-
const buffer = this.valueConverter.toBuffer(value);
|
|
37
|
+
async toBuffer(value) {
|
|
38
|
+
const buffer = await this.valueConverter.toBuffer(value);
|
|
39
39
|
return Buffer.from(zstd.compress(buffer, this.level));
|
|
40
40
|
}
|
|
41
|
-
fromBuffer(value) {
|
|
41
|
+
async fromBuffer(value) {
|
|
42
42
|
const buffer = Buffer.from(zstd.decompress(value));
|
|
43
|
-
return this.valueConverter.fromBuffer(buffer);
|
|
43
|
+
return await this.valueConverter.fromBuffer(buffer);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
exports.ZstandardValueConverter = ZstandardValueConverter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zstandard-value-converter.js","sourceRoot":"","sources":["../../src/converters/zstandard-value-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yDAA0C;AAG1C,MAAa,uBAAuB;IAClC,YACU,cAAkC,EAClC,KAAa;QADb,mBAAc,GAAd,cAAc,CAAoB;QAClC,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,cAAkC,EAClC,KAAa;QAEb,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,OAAO,IAAI,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IAC3D,CAAC;IAED,QAAQ,CAAC,KAAQ;
|
|
1
|
+
{"version":3,"file":"zstandard-value-converter.js","sourceRoot":"","sources":["../../src/converters/zstandard-value-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yDAA0C;AAG1C,MAAa,uBAAuB;IAClC,YACU,cAAkC,EAClC,KAAa;QADb,mBAAc,GAAd,cAAc,CAAoB;QAClC,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,cAAkC,EAClC,KAAa;QAEb,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,OAAO,IAAI,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAQ;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrD,CAAC;CACF;AAvBD,0DAuBC"}
|
package/lib/disk-store-view.d.ts
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import { DiskStore } from "./disk-store";
|
|
2
|
-
import {
|
|
3
|
+
import { DiskStoreWithCache } from "./disk-store-with-cache";
|
|
4
|
+
import { Awaitable } from '@blackglory/prelude';
|
|
5
|
+
export interface IKeyConverter<T> {
|
|
6
|
+
toString: (value: T) => Awaitable<string>;
|
|
7
|
+
fromString: (value: string) => Awaitable<T | undefined>;
|
|
8
|
+
}
|
|
9
|
+
export interface IValueConverter<T> {
|
|
10
|
+
toBuffer: (value: T) => Awaitable<Buffer>;
|
|
11
|
+
fromBuffer: (value: Buffer) => Awaitable<T>;
|
|
12
|
+
}
|
|
3
13
|
export declare class DiskStoreView<K, V> {
|
|
4
14
|
private store;
|
|
5
15
|
private keyConverter;
|
|
6
16
|
private valueConverter;
|
|
7
|
-
constructor(store: DiskStore, keyConverter: IKeyConverter<K>, valueConverter: IValueConverter<V>);
|
|
8
|
-
has(key: K): boolean
|
|
9
|
-
get(key: K): V | undefined
|
|
10
|
-
set(key: K, value: V): void
|
|
11
|
-
delete(key: K): void
|
|
12
|
-
clear(): void
|
|
13
|
-
keys():
|
|
17
|
+
constructor(store: DiskStore | DiskStoreWithCache, keyConverter: IKeyConverter<K>, valueConverter: IValueConverter<V>);
|
|
18
|
+
has(key: K): Promise<boolean>;
|
|
19
|
+
get(key: K): Promise<V | undefined>;
|
|
20
|
+
set(key: K, value: V): Promise<void>;
|
|
21
|
+
delete(key: K): Promise<void>;
|
|
22
|
+
clear(): Promise<void>;
|
|
23
|
+
keys(): AsyncIterableIterator<K>;
|
|
14
24
|
}
|
package/lib/disk-store-view.js
CHANGED
|
@@ -10,11 +10,11 @@ class DiskStoreView {
|
|
|
10
10
|
this.keyConverter = keyConverter;
|
|
11
11
|
this.valueConverter = valueConverter;
|
|
12
12
|
}
|
|
13
|
-
has(key) {
|
|
14
|
-
return this.store.has(this.keyConverter.toString(key));
|
|
13
|
+
async has(key) {
|
|
14
|
+
return this.store.has(await this.keyConverter.toString(key));
|
|
15
15
|
}
|
|
16
|
-
get(key) {
|
|
17
|
-
const buffer = this.store.get(this.keyConverter.toString(key));
|
|
16
|
+
async get(key) {
|
|
17
|
+
const buffer = this.store.get(await this.keyConverter.toString(key));
|
|
18
18
|
if (buffer) {
|
|
19
19
|
return this.valueConverter.fromBuffer(buffer);
|
|
20
20
|
}
|
|
@@ -22,17 +22,20 @@ class DiskStoreView {
|
|
|
22
22
|
return undefined;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
set(key, value) {
|
|
26
|
-
this.store.set(
|
|
25
|
+
async set(key, value) {
|
|
26
|
+
await this.store.set(...await Promise.all([
|
|
27
|
+
await this.keyConverter.toString(key),
|
|
28
|
+
await this.valueConverter.toBuffer(value)
|
|
29
|
+
]));
|
|
27
30
|
}
|
|
28
|
-
delete(key) {
|
|
29
|
-
this.store.delete(this.keyConverter.toString(key));
|
|
31
|
+
async delete(key) {
|
|
32
|
+
await this.store.delete(await this.keyConverter.toString(key));
|
|
30
33
|
}
|
|
31
|
-
clear() {
|
|
32
|
-
this.store.clear();
|
|
34
|
+
async clear() {
|
|
35
|
+
await this.store.clear();
|
|
33
36
|
}
|
|
34
37
|
keys() {
|
|
35
|
-
return (0, extra_utils_1.pipe)(this.store.keys(), iter => (0, iterable_operator_1.
|
|
38
|
+
return (0, extra_utils_1.pipe)(this.store.keys(), iter => (0, iterable_operator_1.mapAsync)(iter, async (key) => await this.keyConverter.fromString(key)), iter => (0, iterable_operator_1.filterAsync)(iter, prelude_1.isntUndefined));
|
|
36
39
|
}
|
|
37
40
|
}
|
|
38
41
|
exports.DiskStoreView = DiskStoreView;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-store-view.js","sourceRoot":"","sources":["../src/disk-store-view.ts"],"names":[],"mappings":";;;AAEA,6CAAkC;AAClC,
|
|
1
|
+
{"version":3,"file":"disk-store-view.js","sourceRoot":"","sources":["../src/disk-store-view.ts"],"names":[],"mappings":";;;AAEA,6CAAkC;AAClC,yDAAyD;AACzD,iDAA8D;AAY9D,MAAa,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;YACV,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;SAC9C;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;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,IAAA,kBAAI,EACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACjB,IAAI,CAAC,EAAE,CAAC,IAAA,4BAAQ,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAC5E,IAAI,CAAC,EAAE,CAAC,IAAA,+BAAW,EAAC,IAAI,EAAE,uBAAa,CAAC,CACzC,CAAA;IACH,CAAC;CACF;AA7CD,sCA6CC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DiskStore } from './disk-store';
|
|
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
|
+
export declare enum CacheKeyType {
|
|
10
|
+
Exist = 0,
|
|
11
|
+
Value = 1
|
|
12
|
+
}
|
|
13
|
+
export declare class DiskStoreWithCache {
|
|
14
|
+
private store;
|
|
15
|
+
private cache;
|
|
16
|
+
constructor(store: DiskStore, cache: ICache);
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
has(key: string): Promise<boolean>;
|
|
19
|
+
get(key: string): Buffer | undefined;
|
|
20
|
+
set(key: string, value: Buffer): Promise<void>;
|
|
21
|
+
delete(key: string): Promise<void>;
|
|
22
|
+
clear(): Promise<void>;
|
|
23
|
+
keys(): IterableIterator<string>;
|
|
24
|
+
}
|
|
25
|
+
export declare function createCacheKey(type: CacheKeyType, key: string): string;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCacheKey = exports.DiskStoreWithCache = exports.CacheKeyType = void 0;
|
|
4
|
+
const prelude_1 = require("@blackglory/prelude");
|
|
5
|
+
var CacheKeyType;
|
|
6
|
+
(function (CacheKeyType) {
|
|
7
|
+
CacheKeyType[CacheKeyType["Exist"] = 0] = "Exist";
|
|
8
|
+
CacheKeyType[CacheKeyType["Value"] = 1] = "Value";
|
|
9
|
+
})(CacheKeyType = exports.CacheKeyType || (exports.CacheKeyType = {}));
|
|
10
|
+
class DiskStoreWithCache {
|
|
11
|
+
constructor(store, cache) {
|
|
12
|
+
this.store = store;
|
|
13
|
+
this.cache = cache;
|
|
14
|
+
}
|
|
15
|
+
async close() {
|
|
16
|
+
await this.store.close();
|
|
17
|
+
}
|
|
18
|
+
async has(key) {
|
|
19
|
+
const cacheKey = createCacheKey(CacheKeyType.Exist, key);
|
|
20
|
+
const result = this.cache.get(cacheKey);
|
|
21
|
+
if ((0, prelude_1.isBoolean)(result)) {
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
const result = this.store.has(key);
|
|
26
|
+
this.cache.set(cacheKey, result);
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
get(key) {
|
|
31
|
+
const cacheKey = createCacheKey(CacheKeyType.Value, key);
|
|
32
|
+
const result = this.cache.get(cacheKey);
|
|
33
|
+
if (result instanceof Buffer) {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const result = this.store.get(key);
|
|
38
|
+
this.cache.set(cacheKey, result);
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async set(key, value) {
|
|
43
|
+
var _a;
|
|
44
|
+
await this.store.set(key, value);
|
|
45
|
+
(_a = this.cache) === null || _a === void 0 ? void 0 : _a.delete(createCacheKey(CacheKeyType.Value, key));
|
|
46
|
+
}
|
|
47
|
+
async delete(key) {
|
|
48
|
+
await this.store.delete(key);
|
|
49
|
+
this.cache.delete(createCacheKey(CacheKeyType.Exist, key));
|
|
50
|
+
this.cache.delete(createCacheKey(CacheKeyType.Value, key));
|
|
51
|
+
}
|
|
52
|
+
async clear() {
|
|
53
|
+
await this.store.clear();
|
|
54
|
+
this.cache.clear();
|
|
55
|
+
}
|
|
56
|
+
keys() {
|
|
57
|
+
return this.store.keys();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.DiskStoreWithCache = DiskStoreWithCache;
|
|
61
|
+
function createCacheKey(type, key) {
|
|
62
|
+
return JSON.stringify([type, key]);
|
|
63
|
+
}
|
|
64
|
+
exports.createCacheKey = createCacheKey;
|
|
65
|
+
//# sourceMappingURL=disk-store-with-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disk-store-with-cache.js","sourceRoot":"","sources":["../src/disk-store-with-cache.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAU/C,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,iDAAK,CAAA;IACL,iDAAK,CAAA;AACP,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB;AAED,MAAa,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,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,EAAE;YACrB,OAAO,MAAM,CAAA;SACd;aAAM;YACL,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAChC,OAAO,MAAM,CAAA;SACd;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,MAAM,YAAY,MAAM,EAAE;YAC5B,OAAO,MAAM,CAAA;SACd;aAAM;YACL,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAChC,OAAO,MAAM,CAAA;SACd;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAEhC,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAC7D,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,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAC5D,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;AAxDD,gDAwDC;AAED,SAAgB,cAAc,CAAC,IAAkB,EAAE,GAAW;IAC5D,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;AACpC,CAAC;AAFD,wCAEC"}
|
package/lib/disk-store.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import
|
|
2
|
+
import LMDB from 'lmdb';
|
|
3
3
|
export declare class DiskStore {
|
|
4
|
-
_db:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
_db: LMDB.RootDatabase;
|
|
5
|
+
_pathname: string;
|
|
6
|
+
private isTempPathname;
|
|
7
|
+
constructor(pathname?: string);
|
|
8
|
+
close(): Promise<void>;
|
|
9
|
+
has(key: string): boolean;
|
|
10
|
+
get(key: string): Buffer | undefined;
|
|
11
|
+
set(key: string, value: Buffer): Promise<void>;
|
|
12
|
+
delete(key: string): Promise<void>;
|
|
13
|
+
clear(): Promise<void>;
|
|
14
|
+
keys(): IterableIterator<string>;
|
|
14
15
|
}
|
package/lib/disk-store.js
CHANGED
|
@@ -27,93 +27,48 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.DiskStore = void 0;
|
|
30
|
-
const path_1 = __importDefault(require("path"));
|
|
31
|
-
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
32
|
-
const migration_files_1 = require("migration-files");
|
|
33
|
-
const better_sqlite3_migrations_1 = require("@blackglory/better-sqlite3-migrations");
|
|
34
|
-
const prelude_1 = require("@blackglory/prelude");
|
|
35
|
-
const extra_promise_1 = require("extra-promise");
|
|
36
|
-
const extra_filesystem_1 = require("extra-filesystem");
|
|
37
30
|
const Iter = __importStar(require("iterable-operator"));
|
|
38
|
-
const
|
|
31
|
+
const lmdb_1 = __importDefault(require("lmdb"));
|
|
32
|
+
const extra_filesystem_1 = require("extra-filesystem");
|
|
33
|
+
const prelude_1 = require("@blackglory/prelude");
|
|
39
34
|
class DiskStore {
|
|
40
|
-
constructor(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
this.get = (0, extra_lazy_1.withLazyStatic)((key) => {
|
|
53
|
-
const row = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
54
|
-
SELECT value
|
|
55
|
-
FROM store
|
|
56
|
-
WHERE key = $key
|
|
57
|
-
`), [this._db]).get({ key });
|
|
58
|
-
if ((0, prelude_1.isUndefined)(row))
|
|
59
|
-
return undefined;
|
|
60
|
-
return row.value;
|
|
61
|
-
});
|
|
62
|
-
this.set = (0, extra_lazy_1.withLazyStatic)((key, value) => {
|
|
63
|
-
(0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
64
|
-
INSERT INTO store (
|
|
65
|
-
key
|
|
66
|
-
, value
|
|
67
|
-
)
|
|
68
|
-
VALUES ($key, $value)
|
|
69
|
-
ON CONFLICT(key)
|
|
70
|
-
DO UPDATE SET value = $value
|
|
71
|
-
`), [this._db]).run({ key, value });
|
|
72
|
-
});
|
|
73
|
-
this.delete = (0, extra_lazy_1.withLazyStatic)((key) => {
|
|
74
|
-
(0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
75
|
-
DELETE FROM store
|
|
76
|
-
WHERE key = $key
|
|
77
|
-
`), [this._db]).run({ key });
|
|
78
|
-
});
|
|
79
|
-
this.clear = (0, extra_lazy_1.withLazyStatic)(() => {
|
|
80
|
-
(0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
81
|
-
DELETE FROM store
|
|
82
|
-
`), [this._db]).run();
|
|
83
|
-
});
|
|
84
|
-
this.keys = (0, extra_lazy_1.withLazyStatic)(() => {
|
|
85
|
-
const iter = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
86
|
-
SELECT key
|
|
87
|
-
FROM store
|
|
88
|
-
`), [this._db]).iterate();
|
|
89
|
-
return Iter.map(iter, ({ key }) => key);
|
|
35
|
+
constructor(pathname) {
|
|
36
|
+
if ((0, prelude_1.isUndefined)(pathname)) {
|
|
37
|
+
this._pathname = (0, extra_filesystem_1.createTempNameSync)();
|
|
38
|
+
this.isTempPathname = true;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this._pathname = pathname;
|
|
42
|
+
this.isTempPathname = false;
|
|
43
|
+
}
|
|
44
|
+
this._db = lmdb_1.default.open(this._pathname, {
|
|
45
|
+
encoding: 'binary',
|
|
46
|
+
compression: false
|
|
90
47
|
});
|
|
91
48
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
await
|
|
96
|
-
db.unsafeMode(true);
|
|
97
|
-
return db;
|
|
98
|
-
});
|
|
99
|
-
const diskStore = new this(db);
|
|
100
|
-
return diskStore;
|
|
101
|
-
async function migrateDatabase(db) {
|
|
102
|
-
const packageFilename = await (0, extra_filesystem_1.findUpPackageFilename)(__dirname);
|
|
103
|
-
(0, prelude_1.assert)(packageFilename, 'package.json not found');
|
|
104
|
-
const packageRoot = path_1.default.dirname(packageFilename);
|
|
105
|
-
const migrationsPath = path_1.default.join(packageRoot, 'migrations');
|
|
106
|
-
const migrationFilenames = await (0, migration_files_1.findMigrationFilenames)(migrationsPath);
|
|
107
|
-
const migrations = await (0, extra_promise_1.map)(migrationFilenames, migration_files_1.readMigrationFile);
|
|
108
|
-
(0, better_sqlite3_migrations_1.migrate)(db, migrations);
|
|
49
|
+
async close() {
|
|
50
|
+
await this._db.close();
|
|
51
|
+
if (this.isTempPathname) {
|
|
52
|
+
await (0, extra_filesystem_1.remove)(this._pathname);
|
|
109
53
|
}
|
|
110
54
|
}
|
|
111
|
-
|
|
112
|
-
this._db.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
55
|
+
has(key) {
|
|
56
|
+
return this._db.doesExist(key);
|
|
57
|
+
}
|
|
58
|
+
get(key) {
|
|
59
|
+
return this._db.getBinary(key);
|
|
60
|
+
}
|
|
61
|
+
async set(key, value) {
|
|
62
|
+
await this._db.put(key, value);
|
|
63
|
+
}
|
|
64
|
+
async delete(key) {
|
|
65
|
+
await this._db.remove(key);
|
|
66
|
+
}
|
|
67
|
+
async clear() {
|
|
68
|
+
await this._db.clearAsync();
|
|
69
|
+
}
|
|
70
|
+
keys() {
|
|
71
|
+
return Iter.map(this._db.getKeys(), key => key);
|
|
117
72
|
}
|
|
118
73
|
}
|
|
119
74
|
exports.DiskStore = DiskStore;
|
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,gDAAuB;AACvB,
|
|
1
|
+
{"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../src/disk-store.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAyC;AACzC,gDAAuB;AACvB,uDAA6D;AAC7D,iDAAiD;AAEjD,MAAa,SAAS;IAKpB,YAAY,QAAiB;QAC3B,IAAI,IAAA,qBAAW,EAAC,QAAQ,CAAC,EAAE;YACzB,IAAI,CAAC,SAAS,GAAG,IAAA,qCAAkB,GAAE,CAAA;YACrC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;SAC3B;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;YACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;SAC5B;QAED,IAAI,CAAC,GAAG,GAAG,cAAI,CAAC,IAAI,CAAiB,IAAI,CAAC,SAAS,EAAE;YACnD,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;YACvB,MAAM,IAAA,yBAAM,EAAC,IAAI,CAAC,SAAS,CAAC,CAAA;SAC7B;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;AAnDD,8BAmDC"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export * from './disk-store';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export { DiskStoreWithCache, ICache } from './disk-store-with-cache';
|
|
3
|
+
export { DiskStoreView, IKeyConverter, IValueConverter } from './disk-store-view';
|
|
4
4
|
export * from './converters';
|
|
5
|
-
export * from './types';
|
package/lib/index.js
CHANGED
|
@@ -14,9 +14,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.DiskStoreView = exports.DiskStoreWithCache = void 0;
|
|
17
18
|
__exportStar(require("./disk-store"), exports);
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
var disk_store_with_cache_1 = require("./disk-store-with-cache");
|
|
20
|
+
Object.defineProperty(exports, "DiskStoreWithCache", { enumerable: true, get: function () { return disk_store_with_cache_1.DiskStoreWithCache; } });
|
|
21
|
+
var disk_store_view_1 = require("./disk-store-view");
|
|
22
|
+
Object.defineProperty(exports, "DiskStoreView", { enumerable: true, get: function () { return disk_store_view_1.DiskStoreView; } });
|
|
20
23
|
__exportStar(require("./converters"), exports);
|
|
21
|
-
__exportStar(require("./types"), exports);
|
|
22
24
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,iEAAoE;AAA3D,2HAAA,kBAAkB,OAAA;AAC3B,qDAAiF;AAAxE,gHAAA,aAAa,OAAA;AACtB,+CAA4B"}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Awaitable } from '@blackglory/prelude';
|
|
3
|
-
export interface
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
toBuffer: (value: T) => Buffer;
|
|
9
|
-
fromBuffer: (value: Buffer) => T;
|
|
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;
|
|
10
8
|
}
|
|
11
|
-
export interface
|
|
9
|
+
export interface IKeyConverter<T> {
|
|
12
10
|
toString: (value: T) => Awaitable<string>;
|
|
13
11
|
fromString: (value: string) => Awaitable<T | undefined>;
|
|
14
12
|
}
|
|
15
|
-
export interface
|
|
13
|
+
export interface IValueConverter<T> {
|
|
16
14
|
toBuffer: (value: T) => Awaitable<Buffer>;
|
|
17
15
|
fromBuffer: (value: Buffer) => Awaitable<T>;
|
|
18
16
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extra-disk-store",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"files": [
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"clean": "rimraf lib",
|
|
27
27
|
"build": "run-s build:*",
|
|
28
28
|
"build:compile": "tsc --project tsconfig.build.json --target es2018 --outDir lib",
|
|
29
|
+
"bench": "ts-node --require tsconfig-paths/register benches/index.ts",
|
|
29
30
|
"release": "standard-version"
|
|
30
31
|
},
|
|
31
32
|
"husky": {
|
|
@@ -38,35 +39,33 @@
|
|
|
38
39
|
"@blackglory/jest-matchers": "^0.5.0",
|
|
39
40
|
"@commitlint/cli": "^17.3.0",
|
|
40
41
|
"@commitlint/config-conventional": "^17.3.0",
|
|
41
|
-
"@types/
|
|
42
|
-
"@types/jest": "^29.2.3",
|
|
42
|
+
"@types/jest": "^29.2.4",
|
|
43
43
|
"@types/node": "14",
|
|
44
|
-
"@typescript-eslint/eslint-plugin": "^5.45.
|
|
45
|
-
"@typescript-eslint/parser": "^5.45.
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "^5.45.1",
|
|
45
|
+
"@typescript-eslint/parser": "^5.45.1",
|
|
46
46
|
"eslint": "^8.29.0",
|
|
47
47
|
"husky": "^4.3.0",
|
|
48
48
|
"jest": "^29.3.1",
|
|
49
49
|
"npm-run-all": "^4.1.5",
|
|
50
|
+
"pretty-bytes": "5",
|
|
50
51
|
"rimraf": "^3.0.2",
|
|
51
52
|
"standard-version": "^9.5.0",
|
|
52
53
|
"ts-jest": "^29.0.3",
|
|
54
|
+
"ts-node": "^10.9.1",
|
|
53
55
|
"ts-patch": "^2.0.2",
|
|
56
|
+
"tsconfig-paths": "^4.1.1",
|
|
54
57
|
"typescript": "4.8",
|
|
55
58
|
"typescript-transform-paths": "^3.4.4"
|
|
56
59
|
},
|
|
57
60
|
"dependencies": {
|
|
58
|
-
"@blackglory/better-sqlite3-migrations": "^0.1.16",
|
|
59
61
|
"@blackglory/prelude": "^0.1.8",
|
|
60
|
-
"@blackglory/types": "^1.4.0",
|
|
61
62
|
"@bokuweb/zstd-wasm": "^0.0.17",
|
|
62
|
-
"
|
|
63
|
+
"extra-benchmark": "^0.2.2",
|
|
63
64
|
"extra-filesystem": "^0.4.8",
|
|
64
|
-
"extra-lazy": "^1.3.1",
|
|
65
65
|
"extra-promise": "^4.4.0",
|
|
66
|
-
"extra-timers": "^0.2.5",
|
|
67
66
|
"extra-utils": "^3.5.1",
|
|
68
67
|
"iterable-operator": "^2.5.0",
|
|
69
|
-
"
|
|
70
|
-
"
|
|
68
|
+
"lmdb": "^2.7.3",
|
|
69
|
+
"lz4-wasm-nodejs": "^0.9.2"
|
|
71
70
|
}
|
|
72
71
|
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { DiskStore } from "./disk-store";
|
|
2
|
-
import { IKeyAsyncConverter, IValueAsyncConverter } from "./types";
|
|
3
|
-
export declare class DiskStoreAsyncView<K, V> {
|
|
4
|
-
private store;
|
|
5
|
-
private keyConverter;
|
|
6
|
-
private valueConverter;
|
|
7
|
-
constructor(store: DiskStore, keyConverter: IKeyAsyncConverter<K>, valueConverter: IValueAsyncConverter<V>);
|
|
8
|
-
has(key: K): Promise<boolean>;
|
|
9
|
-
get(key: K): Promise<V | undefined>;
|
|
10
|
-
set(key: K, value: V): Promise<void>;
|
|
11
|
-
delete(key: K): Promise<void>;
|
|
12
|
-
clear(): void;
|
|
13
|
-
keys(): AsyncIterableIterator<K>;
|
|
14
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DiskStoreAsyncView = void 0;
|
|
4
|
-
const extra_utils_1 = require("extra-utils");
|
|
5
|
-
const iterable_operator_1 = require("iterable-operator");
|
|
6
|
-
const prelude_1 = require("@blackglory/prelude");
|
|
7
|
-
class DiskStoreAsyncView {
|
|
8
|
-
constructor(store, keyConverter, valueConverter) {
|
|
9
|
-
this.store = store;
|
|
10
|
-
this.keyConverter = keyConverter;
|
|
11
|
-
this.valueConverter = valueConverter;
|
|
12
|
-
}
|
|
13
|
-
async has(key) {
|
|
14
|
-
return this.store.has(await this.keyConverter.toString(key));
|
|
15
|
-
}
|
|
16
|
-
async get(key) {
|
|
17
|
-
const buffer = this.store.get(await this.keyConverter.toString(key));
|
|
18
|
-
if (buffer) {
|
|
19
|
-
return await this.valueConverter.fromBuffer(buffer);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
return undefined;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
async set(key, value) {
|
|
26
|
-
this.store.set(await this.keyConverter.toString(key), await this.valueConverter.toBuffer(value));
|
|
27
|
-
}
|
|
28
|
-
async delete(key) {
|
|
29
|
-
this.store.delete(await this.keyConverter.toString(key));
|
|
30
|
-
}
|
|
31
|
-
clear() {
|
|
32
|
-
this.store.clear();
|
|
33
|
-
}
|
|
34
|
-
keys() {
|
|
35
|
-
return (0, extra_utils_1.pipe)(this.store.keys(), iter => (0, iterable_operator_1.mapAsync)(iter, key => this.keyConverter.fromString(key)), iter => (0, iterable_operator_1.filterAsync)(iter, prelude_1.isntUndefined));
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
exports.DiskStoreAsyncView = DiskStoreAsyncView;
|
|
39
|
-
//# sourceMappingURL=disk-store-async-view.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"disk-store-async-view.js","sourceRoot":"","sources":["../src/disk-store-async-view.ts"],"names":[],"mappings":";;;AAEA,6CAAkC;AAClC,yDAAyD;AACzD,iDAAmD;AAEnD,MAAa,kBAAkB;IAC7B,YACU,KAAgB,EAChB,YAAmC,EACnC,cAAuC;QAFvC,UAAK,GAAL,KAAK,CAAW;QAChB,iBAAY,GAAZ,YAAY,CAAuB;QACnC,mBAAc,GAAd,cAAc,CAAyB;IAC9C,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;YACV,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;SACpD;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAM,EAAE,KAAQ;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EACrC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC1C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAM;QACjB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,IAAI;QACF,OAAO,IAAA,kBAAI,EACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACjB,IAAI,CAAC,EAAE,CAAC,IAAA,4BAAQ,EAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAChE,IAAI,CAAC,EAAE,CAAC,IAAA,+BAAW,EAAC,IAAI,EAAE,uBAAa,CAAC,CACzC,CAAA;IACH,CAAC;CACF;AA3CD,gDA2CC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
--------------------------------------------------------------------------------
|
|
2
|
-
-- Up
|
|
3
|
-
--------------------------------------------------------------------------------
|
|
4
|
-
|
|
5
|
-
-- 在WAL模式下, better-sqlite3可充分发挥性能
|
|
6
|
-
PRAGMA journal_mode = WAL;
|
|
7
|
-
|
|
8
|
-
CREATE TABLE store (
|
|
9
|
-
key TEXT NOT NULL UNIQUE
|
|
10
|
-
, value BLOB NOT NULL
|
|
11
|
-
) STRICT;
|
|
12
|
-
|
|
13
|
-
--------------------------------------------------------------------------------
|
|
14
|
-
-- Down
|
|
15
|
-
--------------------------------------------------------------------------------
|
|
16
|
-
|
|
17
|
-
PRAGMA journal_mode = DELETE;
|
|
18
|
-
|
|
19
|
-
DROP TABLE store;
|