@dzhechkov/memory 0.2.2 → 0.2.3
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/dist/json-backend.d.ts +12 -0
- package/dist/json-backend.d.ts.map +1 -1
- package/dist/json-backend.js +25 -3
- package/dist/json-backend.js.map +1 -1
- package/package.json +1 -1
- package/src/json-backend.ts +29 -3
package/dist/json-backend.d.ts
CHANGED
|
@@ -21,13 +21,25 @@ export declare class JsonFileBackend implements MemoryBackend {
|
|
|
21
21
|
constructor(options?: JsonFileBackendOptions);
|
|
22
22
|
/** Create a backend and load any records already persisted at `filePath`. */
|
|
23
23
|
static open(filePath: string): Promise<JsonFileBackend>;
|
|
24
|
+
/**
|
|
25
|
+
* Synchronous counterpart to {@link JsonFileBackend.open}. Because this backend
|
|
26
|
+
* is physically synchronous (in-memory map + sync `fs`), a hot sync path (e.g.
|
|
27
|
+
* a recommender) can read the store without an async ripple.
|
|
28
|
+
*/
|
|
29
|
+
static openSync(filePath: string): JsonFileBackend;
|
|
24
30
|
put(record: MemoryRecord): Promise<void>;
|
|
25
31
|
query(query: MemoryQuery): Promise<MemoryRecord[]>;
|
|
32
|
+
/** Synchronous {@link JsonFileBackend.query} — same ranking, no Promise. */
|
|
33
|
+
querySync(query: MemoryQuery): MemoryRecord[];
|
|
26
34
|
all(): Promise<MemoryRecord[]>;
|
|
35
|
+
/** Synchronous {@link JsonFileBackend.all}. */
|
|
36
|
+
allSync(): MemoryRecord[];
|
|
27
37
|
count(): Promise<number>;
|
|
28
38
|
/** Persist every record to `filePath`. No-op when no path is configured. */
|
|
29
39
|
save(): Promise<void>;
|
|
30
40
|
/** Load records from `filePath`. No-op when no path is set or the file is absent. */
|
|
31
41
|
load(): Promise<void>;
|
|
42
|
+
/** Synchronous {@link JsonFileBackend.load}. */
|
|
43
|
+
loadSync(): void;
|
|
32
44
|
}
|
|
33
45
|
//# sourceMappingURL=json-backend.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-backend.d.ts","sourceRoot":"","sources":["../src/json-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAuB7E,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,sFAAsF;AACtF,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;gBAElC,OAAO,GAAE,sBAA2B;IAIhD,6EAA6E;WAChE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAM7D,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"json-backend.d.ts","sourceRoot":"","sources":["../src/json-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAuB7E,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,sFAAsF;AACtF,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;gBAElC,OAAO,GAAE,sBAA2B;IAIhD,6EAA6E;WAChE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAM7D;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAMlD,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAIlD,4EAA4E;IAC5E,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,EAAE;IAkB7C,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAI9B,+CAA+C;IAC/C,OAAO,IAAI,YAAY,EAAE;IAIzB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxB,4EAA4E;IAC5E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,qFAAqF;IACrF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,gDAAgD;IAChD,QAAQ,IAAI,IAAI;CAMjB"}
|
package/dist/json-backend.js
CHANGED
|
@@ -43,11 +43,25 @@ export class JsonFileBackend {
|
|
|
43
43
|
await backend.load();
|
|
44
44
|
return backend;
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Synchronous counterpart to {@link JsonFileBackend.open}. Because this backend
|
|
48
|
+
* is physically synchronous (in-memory map + sync `fs`), a hot sync path (e.g.
|
|
49
|
+
* a recommender) can read the store without an async ripple.
|
|
50
|
+
*/
|
|
51
|
+
static openSync(filePath) {
|
|
52
|
+
const backend = new JsonFileBackend({ filePath });
|
|
53
|
+
backend.loadSync();
|
|
54
|
+
return backend;
|
|
55
|
+
}
|
|
46
56
|
put(record) {
|
|
47
57
|
this.records.set(record.id, record);
|
|
48
58
|
return Promise.resolve();
|
|
49
59
|
}
|
|
50
60
|
query(query) {
|
|
61
|
+
return Promise.resolve(this.querySync(query));
|
|
62
|
+
}
|
|
63
|
+
/** Synchronous {@link JsonFileBackend.query} — same ranking, no Promise. */
|
|
64
|
+
querySync(query) {
|
|
51
65
|
const limit = query.limit ?? DEFAULT_LIMIT;
|
|
52
66
|
const terms = query.text !== undefined ? tokenize(query.text) : [];
|
|
53
67
|
let candidates = [...this.records.values()];
|
|
@@ -59,10 +73,14 @@ export class JsonFileBackend {
|
|
|
59
73
|
.sort((a, b) => b.relevance - a.relevance ||
|
|
60
74
|
b.record.score - a.record.score ||
|
|
61
75
|
b.record.timestamp.localeCompare(a.record.timestamp));
|
|
62
|
-
return
|
|
76
|
+
return ranked.slice(0, limit).map((entry) => entry.record);
|
|
63
77
|
}
|
|
64
78
|
all() {
|
|
65
|
-
return Promise.resolve(
|
|
79
|
+
return Promise.resolve(this.allSync());
|
|
80
|
+
}
|
|
81
|
+
/** Synchronous {@link JsonFileBackend.all}. */
|
|
82
|
+
allSync() {
|
|
83
|
+
return [...this.records.values()];
|
|
66
84
|
}
|
|
67
85
|
count() {
|
|
68
86
|
return Promise.resolve(this.records.size);
|
|
@@ -77,12 +95,16 @@ export class JsonFileBackend {
|
|
|
77
95
|
}
|
|
78
96
|
/** Load records from `filePath`. No-op when no path is set or the file is absent. */
|
|
79
97
|
load() {
|
|
98
|
+
this.loadSync();
|
|
99
|
+
return Promise.resolve();
|
|
100
|
+
}
|
|
101
|
+
/** Synchronous {@link JsonFileBackend.load}. */
|
|
102
|
+
loadSync() {
|
|
80
103
|
if (this.filePath !== undefined && existsSync(this.filePath)) {
|
|
81
104
|
const data = JSON.parse(readFileSync(this.filePath, 'utf-8'));
|
|
82
105
|
for (const record of data)
|
|
83
106
|
this.records.set(record.id, record);
|
|
84
107
|
}
|
|
85
|
-
return Promise.resolve();
|
|
86
108
|
}
|
|
87
109
|
}
|
|
88
110
|
//# sourceMappingURL=json-backend.js.map
|
package/dist/json-backend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-backend.js","sourceRoot":"","sources":["../src/json-backend.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"json-backend.js","sourceRoot":"","sources":["../src/json-backend.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/json-backend.ts
CHANGED
|
@@ -58,12 +58,28 @@ export class JsonFileBackend implements MemoryBackend {
|
|
|
58
58
|
return backend;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Synchronous counterpart to {@link JsonFileBackend.open}. Because this backend
|
|
63
|
+
* is physically synchronous (in-memory map + sync `fs`), a hot sync path (e.g.
|
|
64
|
+
* a recommender) can read the store without an async ripple.
|
|
65
|
+
*/
|
|
66
|
+
static openSync(filePath: string): JsonFileBackend {
|
|
67
|
+
const backend = new JsonFileBackend({ filePath });
|
|
68
|
+
backend.loadSync();
|
|
69
|
+
return backend;
|
|
70
|
+
}
|
|
71
|
+
|
|
61
72
|
put(record: MemoryRecord): Promise<void> {
|
|
62
73
|
this.records.set(record.id, record);
|
|
63
74
|
return Promise.resolve();
|
|
64
75
|
}
|
|
65
76
|
|
|
66
77
|
query(query: MemoryQuery): Promise<MemoryRecord[]> {
|
|
78
|
+
return Promise.resolve(this.querySync(query));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Synchronous {@link JsonFileBackend.query} — same ranking, no Promise. */
|
|
82
|
+
querySync(query: MemoryQuery): MemoryRecord[] {
|
|
67
83
|
const limit = query.limit ?? DEFAULT_LIMIT;
|
|
68
84
|
const terms = query.text !== undefined ? tokenize(query.text) : [];
|
|
69
85
|
let candidates = [...this.records.values()];
|
|
@@ -78,11 +94,16 @@ export class JsonFileBackend implements MemoryBackend {
|
|
|
78
94
|
b.record.score - a.record.score ||
|
|
79
95
|
b.record.timestamp.localeCompare(a.record.timestamp),
|
|
80
96
|
);
|
|
81
|
-
return
|
|
97
|
+
return ranked.slice(0, limit).map((entry) => entry.record);
|
|
82
98
|
}
|
|
83
99
|
|
|
84
100
|
all(): Promise<MemoryRecord[]> {
|
|
85
|
-
return Promise.resolve(
|
|
101
|
+
return Promise.resolve(this.allSync());
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Synchronous {@link JsonFileBackend.all}. */
|
|
105
|
+
allSync(): MemoryRecord[] {
|
|
106
|
+
return [...this.records.values()];
|
|
86
107
|
}
|
|
87
108
|
|
|
88
109
|
count(): Promise<number> {
|
|
@@ -100,10 +121,15 @@ export class JsonFileBackend implements MemoryBackend {
|
|
|
100
121
|
|
|
101
122
|
/** Load records from `filePath`. No-op when no path is set or the file is absent. */
|
|
102
123
|
load(): Promise<void> {
|
|
124
|
+
this.loadSync();
|
|
125
|
+
return Promise.resolve();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Synchronous {@link JsonFileBackend.load}. */
|
|
129
|
+
loadSync(): void {
|
|
103
130
|
if (this.filePath !== undefined && existsSync(this.filePath)) {
|
|
104
131
|
const data = JSON.parse(readFileSync(this.filePath, 'utf-8')) as MemoryRecord[];
|
|
105
132
|
for (const record of data) this.records.set(record.id, record);
|
|
106
133
|
}
|
|
107
|
-
return Promise.resolve();
|
|
108
134
|
}
|
|
109
135
|
}
|