extra-disk-store 0.1.5 → 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.
Files changed (34) hide show
  1. package/README.md +58 -89
  2. package/lib/converters/index-key-converter.d.ts +2 -2
  3. package/lib/converters/json-key-converter.d.ts +2 -2
  4. package/lib/converters/json-value-converter.d.ts +2 -2
  5. package/lib/converters/lz4-value-converter.d.ts +4 -4
  6. package/lib/converters/lz4-value-converter.js +4 -4
  7. package/lib/converters/lz4-value-converter.js.map +1 -1
  8. package/lib/converters/passthrough-key-converter.d.ts +2 -2
  9. package/lib/converters/passthrough-value-converter.d.ts +2 -2
  10. package/lib/converters/prefix-key-converter.d.ts +2 -9
  11. package/lib/converters/prefix-key-converter.js +2 -22
  12. package/lib/converters/prefix-key-converter.js.map +1 -1
  13. package/lib/converters/zstandard-value-converter.d.ts +4 -4
  14. package/lib/converters/zstandard-value-converter.js +4 -4
  15. package/lib/converters/zstandard-value-converter.js.map +1 -1
  16. package/lib/disk-store-view.d.ts +18 -8
  17. package/lib/disk-store-view.js +14 -11
  18. package/lib/disk-store-view.js.map +1 -1
  19. package/lib/disk-store-with-cache.d.ts +25 -0
  20. package/lib/disk-store-with-cache.js +65 -0
  21. package/lib/disk-store-with-cache.js.map +1 -0
  22. package/lib/disk-store.d.ts +10 -21
  23. package/lib/disk-store.js +31 -138
  24. package/lib/disk-store.js.map +1 -1
  25. package/lib/index.d.ts +3 -4
  26. package/lib/index.js +6 -6
  27. package/lib/index.js.map +1 -1
  28. package/lib/types.d.ts +1 -9
  29. package/package.json +8 -9
  30. package/lib/disk-store-async-view.d.ts +0 -14
  31. package/lib/disk-store-async-view.js +0 -39
  32. package/lib/disk-store-async-view.js.map +0 -1
  33. package/migrations/001-initial.sql +0 -19
  34. package/migrations/schema.sql +0 -7
package/README.md CHANGED
@@ -12,164 +12,133 @@ yarn add extra-disk-store
12
12
  ```ts
13
13
  import { DiskStore } from 'extra-disk-store'
14
14
 
15
- const store = await DiskStore.create('/tmp/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
 
20
20
  ## API
21
21
  ### DiskStore
22
22
  ```ts
23
- interface ICache {
24
- set(key: string, value: Buffer | boolean | undefined): void
25
- get(key: string): Buffer | boolean | undefined
26
- delete(key: string): void
27
- clear(): void
28
- }
29
-
30
23
  class DiskStore {
31
- static create(filename?: string, cache?: ICache): Promise<DiskStore>
24
+ constructor(pathname: string)
32
25
 
33
- close(): void
26
+ close(): Promise<void>
34
27
 
35
28
  has(key: string): boolean
36
- get(key: string): {
37
- value: Buffer
38
- updatedAt: number
39
- timeToLive: number | null
40
- }
41
- set(key: string, value: Buffer): void
42
- delete(key: string): void
43
- 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
+
44
34
  keys(): IterableIterator<string>
45
35
  }
46
36
  ```
47
37
 
48
- ### DiskStoreView
38
+ ### DiskStoreWithCache
49
39
  ```ts
50
- interface IKeyConverter<T> {
51
- toString: (value: T) => string
52
- fromString: (value: string) => T | undefined
53
- }
54
-
55
- interface IValueConverter<T> {
56
- toBuffer: (value: T) => Buffer
57
- 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
58
45
  }
59
46
 
60
- class DiskStoreView<K, V> {
47
+ class DiskStoreWithCache {
61
48
  constructor(
62
- private store: DiskStore
63
- , private keyConverter: IKeyConverter<K>
64
- , private valueConverter: IValueConverter<V>
49
+ store: DiskStore
50
+ , cache: ICache
65
51
  )
66
52
 
67
- has(key: K): boolean
68
- get(key: K): V | undefined
69
- set(key: K, value: V): void
70
- clear(): void
71
- delete(key: K): void
72
- keys(): IterableIterator<K>
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>
73
62
  }
74
63
  ```
75
64
 
76
- ### DiskStoreAsyncView
65
+ ### DiskStoreView
77
66
  ```ts
78
- interface IKeyAsyncConverter<T> {
67
+ interface IKeyConverter<T> {
79
68
  toString: (value: T) => Awaitable<string>
80
69
  fromString: (value: string) => Awaitable<T | undefined>
81
70
  }
82
71
 
83
- interface IValueAsyncConverter<T> {
72
+ interface IValueConverter<T> {
84
73
  toBuffer: (value: T) => Awaitable<Buffer>
85
74
  fromBuffer: (value: Buffer) => Awaitable<T>
86
75
  }
87
76
 
88
- class DiskStoreAsyncView<K, V> {
77
+ class DiskStoreView<K, V> {
89
78
  constructor(
90
- store: DiskStore
91
- , keyConverter: IKeyAsyncConverter<K>
92
- , valueConverter: IValueAsyncConverter<V>
93
- )
79
+ store: DiskStore | DiskStoreWithCache
80
+ , keyConverter: IKeyConverter<K>
81
+ , valueConverter: IValueConverter<V>
82
+ ) {}
94
83
 
95
84
  has(key: K): Promise<boolean>
96
- get(key: K): Promise<V | undefined>
85
+ get(key: K): Promise<V | undefined>
97
86
  set(key: K, value: V): Promise<void>
98
87
  delete(key: K): Promise<void>
99
- clear(): void
100
- keys(): AsyncIterableIterator<K>
88
+ clear(): Promise<void>
89
+
90
+ keys(): IterableIterator<K>
101
91
  }
102
92
  ```
103
93
 
104
94
  ### Converters
105
- #### PassthroughKeyConverter
95
+ #### IndexKeyConverter
106
96
  ```ts
107
- class PassthroughKeyConverter implements IKeyConverter<string>, IKeyAsyncConverter<string>
97
+ class IndexKeyConverter implements IKeyConverter<number>
108
98
  ```
109
99
 
110
- #### PassthroughValueConverter
100
+ #### JSONKeyConverter
111
101
  ```ts
112
- class PassthroughValueConverter implements IValueConverter<Buffer>, IValueAsyncConverter<Buffer>
102
+ class JSONKeyConverter<T> implements IKeyConverter<T>
113
103
  ```
114
104
 
115
- #### IndexKeyConverter
105
+ #### JSONValueConverter
116
106
  ```ts
117
- class IndexKeyConverter implements IKeyConverter<number>, IKeyAsyncConverter<number> {
118
- constructor(radix: number = 10)
107
+ class JSONValueConverter<T> implements IValueConverter<T> {
108
+ constructor(encoding: BufferEncoding = 'utf-8')
119
109
  }
120
110
  ```
121
111
 
122
- #### JSONKeyConverter
112
+ #### PassthroughKeyConverter
123
113
  ```ts
124
- class JSONKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<T>
114
+ class PassthroughKeyConverter implements IKeyConverter<string>
125
115
  ```
126
116
 
127
- #### JSONValueConverter
117
+ #### PassthroughValueConverter
128
118
  ```ts
129
- class JSONValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
130
- constructor(encoding: BufferEncoding = 'utf-8')
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)
131
126
  }
132
127
  ```
133
128
 
134
129
  #### LZ4ValueConverter
135
130
  ```ts
136
- class LZ4ValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
131
+ class LZ4ValueConverter<T> implements IValueConverter<T> {
137
132
  constructor(valueConverter: IValueConverter<T>)
138
133
  }
139
134
  ```
140
135
 
141
136
  #### ZstandardValueConverter
142
137
  ```ts
143
- class ZstandardValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
138
+ class ZstandardValueConverter<T> implements IValueConverter<T> {
144
139
  static create<T>(
145
140
  valueConverter: IValueConverter<T>
146
141
  , level: number
147
142
  ): Promise<ZstandardValueConverter<T>>
148
143
  }
149
144
  ```
150
-
151
- #### PrefixKeyConverter
152
- ```ts
153
- class PrefixKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<T> {
154
- constructor(
155
- keyConverter: IKeyConverter<T>
156
- , prefix: string
157
- )
158
-
159
- toString(value: T): string
160
- fromString(value: string): T
161
- }
162
- ```
163
-
164
- #### PrefixKeyAsyncConverter
165
- ```ts
166
- class PrefixKeyAsyncConverter<T> implements IKeyAsyncConverter<T> {
167
- constructor(
168
- keyConverter: IKeyConverter<T> | IKeyAsyncConverter<T>
169
- , prefix: string
170
- )
171
-
172
- toString(value: T): Promise<string>
173
- fromString(value: string): Promise<T>
174
- }
175
- ```
@@ -1,5 +1,5 @@
1
- import { IKeyConverter, IKeyAsyncConverter } from "../types";
2
- export declare class IndexKeyConverter implements IKeyConverter<number>, IKeyAsyncConverter<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, IKeyAsyncConverter } from "../types";
2
- export declare class JSONKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<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, IValueAsyncConverter } from "../types";
3
- export declare class JSONValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<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, IValueAsyncConverter } from "../types";
3
- export declare class LZ4ValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<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;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QACjD,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/C,CAAC;CACF;AAdD,8CAcC"}
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, IKeyAsyncConverter } from "../types";
2
- export declare class PassthroughKeyConverter implements IKeyConverter<string>, IKeyAsyncConverter<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, IValueAsyncConverter } from "../types";
3
- export declare class PassthroughValueConverter implements IValueConverter<Buffer>, IValueAsyncConverter<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, IKeyAsyncConverter } from "../types";
2
- export declare class PrefixKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<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.PrefixKeyAsyncConverter = exports.PrefixKeyConverter = void 0;
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.PrefixKeyAsyncConverter = PrefixKeyAsyncConverter;
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,QAAQ,CAAC,KAAQ;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;IAC1B,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YACzE,OAAO,GAAG,CAAA;SACX;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;CACF;AAnBD,gDAmBC;AAED,MAAa,uBAAuB;IAClC,YACU,YAAsD,EACtD,MAAc;QADd,iBAAY,GAAZ,YAAY,CAA0C;QACtD,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,0DAmBC"}
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, IValueAsyncConverter } from "../types";
3
- export declare class ZstandardValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<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;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/C,CAAC;CACF;AAvBD,0DAuBC"}
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"}
@@ -1,14 +1,24 @@
1
+ /// <reference types="node" />
1
2
  import { DiskStore } from "./disk-store";
2
- import { IKeyConverter, IValueConverter } from "./types";
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(): IterableIterator<K>;
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
  }
@@ -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(this.keyConverter.toString(key), this.valueConverter.toBuffer(value));
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.map)(iter, key => this.keyConverter.fromString(key)), iter => (0, iterable_operator_1.filter)(iter, prelude_1.isntUndefined));
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,yDAA+C;AAC/C,iDAAmD;AAEnD,MAAa,aAAa;IACxB,YACU,KAAgB,EAChB,YAA8B,EAC9B,cAAkC;QAFlC,UAAK,GAAL,KAAK,CAAW;QAChB,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,GAAG,CAAC,GAAM;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAE9D,IAAI,MAAM,EAAE;YACV,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;SAC9C;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC/B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CACpC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAM;QACX,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,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,uBAAG,EAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAC3D,IAAI,CAAC,EAAE,CAAC,IAAA,0BAAM,EAAC,IAAI,EAAE,uBAAa,CAAC,CACpC,CAAA;IACH,CAAC;CACF;AA3CD,sCA2CC"}
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"}
@@ -1,26 +1,15 @@
1
1
  /// <reference types="node" />
2
- import { Database as IDatabase } from 'better-sqlite3';
3
- import { ICache } from './types';
4
- export declare enum CacheKeyType {
5
- Exist = 0,
6
- Value = 1
7
- }
2
+ import LMDB from 'lmdb';
8
3
  export declare class DiskStore {
9
- _db: IDatabase;
10
- cache?: ICache | undefined;
11
- protected constructor(_db: IDatabase, cache?: ICache | undefined);
12
- static create(filename?: string, cache?: ICache): Promise<DiskStore>;
13
- close(): void;
4
+ _db: LMDB.RootDatabase;
5
+ _pathname: string;
6
+ private isTempPathname;
7
+ constructor(pathname?: string);
8
+ close(): Promise<void>;
14
9
  has(key: string): boolean;
15
- private _has;
16
10
  get(key: string): Buffer | undefined;
17
- private _get;
18
- set(key: string, value: Buffer): void;
19
- private _set;
20
- delete(key: string): void;
21
- private _delete;
22
- clear(): void;
23
- private _clear;
24
- keys: () => IterableIterator<string>;
11
+ set(key: string, value: Buffer): Promise<void>;
12
+ delete(key: string): Promise<void>;
13
+ clear(): Promise<void>;
14
+ keys(): IterableIterator<string>;
25
15
  }
26
- export declare function createCacheKey(type: CacheKeyType, key: string): string;
package/lib/disk-store.js CHANGED
@@ -26,157 +26,50 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.createCacheKey = exports.DiskStore = exports.CacheKeyType = 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");
29
+ exports.DiskStore = void 0;
37
30
  const Iter = __importStar(require("iterable-operator"));
38
- const extra_lazy_1 = require("extra-lazy");
39
- var CacheKeyType;
40
- (function (CacheKeyType) {
41
- CacheKeyType[CacheKeyType["Exist"] = 0] = "Exist";
42
- CacheKeyType[CacheKeyType["Value"] = 1] = "Value";
43
- })(CacheKeyType = exports.CacheKeyType || (exports.CacheKeyType = {}));
31
+ const lmdb_1 = __importDefault(require("lmdb"));
32
+ const extra_filesystem_1 = require("extra-filesystem");
33
+ const prelude_1 = require("@blackglory/prelude");
44
34
  class DiskStore {
45
- constructor(_db, cache) {
46
- this._db = _db;
47
- this.cache = cache;
48
- this._has = (0, extra_lazy_1.withLazyStatic)((key) => {
49
- const row = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
50
- SELECT EXISTS(
51
- SELECT *
52
- FROM store
53
- WHERE key = $key
54
- ) AS item_exists
55
- `), [this._db]).get({ key });
56
- const result = row.item_exists === 1;
57
- return result;
58
- });
59
- this._get = (0, extra_lazy_1.withLazyStatic)((key) => {
60
- const row = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
61
- SELECT value
62
- FROM store
63
- WHERE key = $key
64
- `), [this._db]).get({ key });
65
- return (0, prelude_1.isUndefined)(row)
66
- ? undefined
67
- : row.value;
68
- });
69
- this._set = (0, extra_lazy_1.withLazyStatic)((key, value) => {
70
- (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
71
- INSERT INTO store (
72
- key
73
- , value
74
- )
75
- VALUES ($key, $value)
76
- ON CONFLICT(key)
77
- DO UPDATE SET value = $value
78
- `), [this._db]).run({ key, value });
79
- });
80
- this._delete = (0, extra_lazy_1.withLazyStatic)((key) => {
81
- (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
82
- DELETE FROM store
83
- WHERE key = $key
84
- `), [this._db]).run({ key });
85
- });
86
- this._clear = (0, extra_lazy_1.withLazyStatic)(() => {
87
- (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
88
- DELETE FROM store
89
- `), [this._db]).run();
90
- });
91
- this.keys = (0, extra_lazy_1.withLazyStatic)(() => {
92
- const iter = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
93
- SELECT key
94
- FROM store
95
- `), [this._db]).iterate();
96
- 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
97
47
  });
98
48
  }
99
- static async create(filename, cache) {
100
- const db = await (0, prelude_1.go)(async () => {
101
- const db = new better_sqlite3_1.default(filename !== null && filename !== void 0 ? filename : ':memory:');
102
- await migrateDatabase(db);
103
- db.unsafeMode(true);
104
- return db;
105
- });
106
- const diskStore = new this(db, cache);
107
- return diskStore;
108
- async function migrateDatabase(db) {
109
- const packageFilename = await (0, extra_filesystem_1.findUpPackageFilename)(__dirname);
110
- (0, prelude_1.assert)(packageFilename, 'package.json not found');
111
- const packageRoot = path_1.default.dirname(packageFilename);
112
- const migrationsPath = path_1.default.join(packageRoot, 'migrations');
113
- const migrationFilenames = await (0, migration_files_1.findMigrationFilenames)(migrationsPath);
114
- const migrations = await (0, extra_promise_1.map)(migrationFilenames, migration_files_1.readMigrationFile);
115
- (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);
116
53
  }
117
54
  }
118
- close() {
119
- this._db.exec(`
120
- PRAGMA analysis_limit=400;
121
- PRAGMA optimize;
122
- `);
123
- this._db.close();
124
- }
125
55
  has(key) {
126
- if (this.cache) {
127
- const cacheKey = createCacheKey(CacheKeyType.Exist, key);
128
- const result = this.cache.get(cacheKey);
129
- if ((0, prelude_1.isBoolean)(result)) {
130
- return result;
131
- }
132
- else {
133
- const result = this._has(key);
134
- this.cache.set(cacheKey, result);
135
- return result;
136
- }
137
- }
138
- else {
139
- return this._has(key);
140
- }
56
+ return this._db.doesExist(key);
141
57
  }
142
58
  get(key) {
143
- if (this.cache) {
144
- const cacheKey = createCacheKey(CacheKeyType.Value, key);
145
- const result = this.cache.get(cacheKey);
146
- if (result instanceof Buffer) {
147
- return result;
148
- }
149
- else {
150
- const result = this._get(key);
151
- this.cache.set(cacheKey, result);
152
- return result;
153
- }
154
- }
155
- else {
156
- return this._get(key);
157
- }
59
+ return this._db.getBinary(key);
158
60
  }
159
- set(key, value) {
160
- var _a;
161
- this._set(key, value);
162
- (_a = this.cache) === null || _a === void 0 ? void 0 : _a.delete(createCacheKey(CacheKeyType.Value, key));
61
+ async set(key, value) {
62
+ await this._db.put(key, value);
163
63
  }
164
- delete(key) {
165
- this._delete(key);
166
- if (this.cache) {
167
- this.cache.delete(createCacheKey(CacheKeyType.Exist, key));
168
- this.cache.delete(createCacheKey(CacheKeyType.Value, key));
169
- }
64
+ async delete(key) {
65
+ await this._db.remove(key);
170
66
  }
171
- clear() {
172
- var _a;
173
- this._clear();
174
- (_a = this.cache) === null || _a === void 0 ? void 0 : _a.clear();
67
+ async clear() {
68
+ await this._db.clearAsync();
69
+ }
70
+ keys() {
71
+ return Iter.map(this._db.getKeys(), key => key);
175
72
  }
176
73
  }
177
74
  exports.DiskStore = DiskStore;
178
- function createCacheKey(type, key) {
179
- return JSON.stringify([type, key]);
180
- }
181
- exports.createCacheKey = createCacheKey;
182
75
  //# sourceMappingURL=disk-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../src/disk-store.ts"],"names":[],"mappings":"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"}
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
- export { DiskStore } from './disk-store';
2
- export * from './disk-store-view';
3
- export * from './disk-store-async-view';
1
+ export * from './disk-store';
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,11 +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.DiskStore = void 0;
18
- var disk_store_1 = require("./disk-store");
19
- Object.defineProperty(exports, "DiskStore", { enumerable: true, get: function () { return disk_store_1.DiskStore; } });
20
- __exportStar(require("./disk-store-view"), exports);
21
- __exportStar(require("./disk-store-async-view"), exports);
17
+ exports.DiskStoreView = exports.DiskStoreWithCache = void 0;
18
+ __exportStar(require("./disk-store"), exports);
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; } });
22
23
  __exportStar(require("./converters"), exports);
23
- __exportStar(require("./types"), exports);
24
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":";;;;;;;;;;;;;;;;;AAAA,2CAAwC;AAA/B,uGAAA,SAAS,OAAA;AAClB,oDAAiC;AACjC,0DAAuC;AACvC,+CAA4B;AAC5B,0CAAuB"}
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
@@ -7,18 +7,10 @@ export interface ICache {
7
7
  clear(): void;
8
8
  }
9
9
  export interface IKeyConverter<T> {
10
- toString: (value: T) => string;
11
- fromString: (value: string) => T | undefined;
12
- }
13
- export interface IValueConverter<T> {
14
- toBuffer: (value: T) => Buffer;
15
- fromBuffer: (value: Buffer) => T;
16
- }
17
- export interface IKeyAsyncConverter<T> {
18
10
  toString: (value: T) => Awaitable<string>;
19
11
  fromString: (value: string) => Awaitable<T | undefined>;
20
12
  }
21
- export interface IValueAsyncConverter<T> {
13
+ export interface IValueConverter<T> {
22
14
  toBuffer: (value: T) => Awaitable<Buffer>;
23
15
  fromBuffer: (value: Buffer) => Awaitable<T>;
24
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-disk-store",
3
- "version": "0.1.5",
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,7 +39,6 @@
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/better-sqlite3": "^7.6.2",
42
42
  "@types/jest": "^29.2.4",
43
43
  "@types/node": "14",
44
44
  "@typescript-eslint/eslint-plugin": "^5.45.1",
@@ -47,26 +47,25 @@
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
- "better-sqlite3": "^8.0.1",
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
- "lz4-wasm-nodejs": "^0.9.2",
70
- "migration-files": "^0.4.0"
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;
@@ -1,7 +0,0 @@
1
- -- 在WAL模式下, better-sqlite3可充分发挥性能
2
- PRAGMA journal_mode = WAL;
3
-
4
- CREATE TABLE store (
5
- key TEXT NOT NULL UNIQUE
6
- , value BLOB NOT NULL
7
- ) STRICT;