@naturalcycles/db-lib 8.44.0 → 8.46.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.
@@ -93,7 +93,7 @@ class InMemoryDB {
93
93
  }
94
94
  async deleteByIds(_table, ids, _opt) {
95
95
  const table = this.cfg.tablesPrefix + _table;
96
- this.data[table] = this.data[table] || {};
96
+ this.data[table] ||= {};
97
97
  return ids
98
98
  .map(id => {
99
99
  const exists = !!this.data[table][id];
@@ -486,9 +486,6 @@ class CommonDao {
486
486
  }
487
487
  assignIdCreatedUpdated(obj, opt = {}) {
488
488
  const now = Math.floor(Date.now() / 1000);
489
- if (this.cfg.createId) {
490
- obj.id ||= this.cfg.hooks.createNaturalId?.(obj) || this.cfg.hooks.createRandomId();
491
- }
492
489
  if (this.cfg.created) {
493
490
  ;
494
491
  obj['created'] ||= obj['updated'] || now;
@@ -498,6 +495,9 @@ class CommonDao {
498
495
  obj['updated'] =
499
496
  opt.preserveUpdatedCreated && obj['updated'] ? obj['updated'] : now;
500
497
  }
498
+ if (this.cfg.createId) {
499
+ obj.id ||= this.cfg.hooks.createNaturalId?.(obj) || this.cfg.hooks.createRandomId();
500
+ }
501
501
  return obj;
502
502
  }
503
503
  // SAVE
@@ -3,7 +3,7 @@ import { KeyValueTuple } from '@naturalcycles/js-lib';
3
3
  import { ReadableTyped } from '@naturalcycles/nodejs-lib';
4
4
  import { CommonDaoLogLevel } from '../commondao/common.dao.model';
5
5
  import { CommonDBCreateOptions } from '../db.model';
6
- import { CommonKeyValueDB } from './commonKeyValueDB';
6
+ import { CommonKeyValueDB, KeyValueDBTuple } from './commonKeyValueDB';
7
7
  export interface CommonKeyValueDaoCfg<T> {
8
8
  db: CommonKeyValueDB;
9
9
  table: string;
@@ -39,15 +39,20 @@ export declare class CommonKeyValueDao<T> {
39
39
  createTable(opt?: CommonDBCreateOptions): Promise<void>;
40
40
  create(input?: Partial<T>): T;
41
41
  getById(id?: string): Promise<T | null>;
42
+ getByIdAsBuffer(id?: string): Promise<Buffer | null>;
42
43
  requireById(id: string): Promise<T>;
44
+ requireByIdAsBuffer(id: string): Promise<Buffer>;
43
45
  getByIdOrEmpty(id: string, part?: Partial<T>): Promise<T>;
44
46
  patch(id: string, patch: Partial<T>): Promise<T>;
45
47
  getByIds(ids: string[]): Promise<KeyValueTuple<string, T>[]>;
48
+ getByIdsAsBuffer(ids: string[]): Promise<KeyValueTuple<string, Buffer>[]>;
46
49
  save(id: string, value: T): Promise<void>;
50
+ saveAsBuffer(id: string, value: Buffer): Promise<void>;
47
51
  saveBatch(entries: KeyValueTuple<string, T>[]): Promise<void>;
52
+ saveBatchAsBuffer(entries: KeyValueDBTuple[]): Promise<void>;
48
53
  deleteByIds(ids: string[]): Promise<void>;
49
54
  deleteById(id: string): Promise<void>;
50
55
  streamIds(limit?: number): ReadableTyped<string>;
51
- streamValues(limit?: number): ReadableTyped<Buffer>;
56
+ streamValues(limit?: number): ReadableTyped<T>;
52
57
  streamEntries(limit?: number): ReadableTyped<KeyValueTuple<string, T>>;
53
58
  }
@@ -34,6 +34,12 @@ class CommonKeyValueDao {
34
34
  const [r] = await this.getByIds([id]);
35
35
  return r?.[1] || null;
36
36
  }
37
+ async getByIdAsBuffer(id) {
38
+ if (!id)
39
+ return null;
40
+ const [r] = await this.cfg.db.getByIds(this.cfg.table, [id]);
41
+ return r?.[1] || null;
42
+ }
37
43
  async requireById(id) {
38
44
  const [r] = await this.getByIds([id]);
39
45
  if (!r) {
@@ -46,6 +52,18 @@ class CommonKeyValueDao {
46
52
  }
47
53
  return r[1];
48
54
  }
55
+ async requireByIdAsBuffer(id) {
56
+ const [r] = await this.cfg.db.getByIds(this.cfg.table, [id]);
57
+ if (!r) {
58
+ const { table } = this.cfg;
59
+ throw new js_lib_1.AppError(`DB row required, but not found: ${table}.${id}`, {
60
+ code: cnst_1.DBLibError.DB_ROW_REQUIRED,
61
+ table,
62
+ id,
63
+ });
64
+ }
65
+ return r[1];
66
+ }
49
67
  async getByIdOrEmpty(id, part = {}) {
50
68
  const [r] = await this.getByIds([id]);
51
69
  if (r)
@@ -72,9 +90,15 @@ class CommonKeyValueDao {
72
90
  await this.cfg.hooks.mapBufferToValue(buf),
73
91
  ]);
74
92
  }
93
+ async getByIdsAsBuffer(ids) {
94
+ return await this.cfg.db.getByIds(this.cfg.table, ids);
95
+ }
75
96
  async save(id, value) {
76
97
  await this.saveBatch([[id, value]]);
77
98
  }
99
+ async saveAsBuffer(id, value) {
100
+ await this.cfg.db.saveBatch(this.cfg.table, [[id, value]]);
101
+ }
78
102
  async saveBatch(entries) {
79
103
  let bufferEntries = [];
80
104
  if (!this.cfg.hooks?.mapValueToBuffer) {
@@ -88,6 +112,9 @@ class CommonKeyValueDao {
88
112
  }
89
113
  await this.cfg.db.saveBatch(this.cfg.table, bufferEntries);
90
114
  }
115
+ async saveBatchAsBuffer(entries) {
116
+ await this.cfg.db.saveBatch(this.cfg.table, entries);
117
+ }
91
118
  async deleteByIds(ids) {
92
119
  await this.cfg.db.deleteByIds(this.cfg.table, ids);
93
120
  }
package/package.json CHANGED
@@ -41,7 +41,7 @@
41
41
  "engines": {
42
42
  "node": ">=14.15"
43
43
  },
44
- "version": "8.44.0",
44
+ "version": "8.46.0",
45
45
  "description": "Lowest Common Denominator API to supported Databases",
46
46
  "keywords": [
47
47
  "db",
@@ -189,7 +189,7 @@ export class InMemoryDB implements CommonDB {
189
189
  _opt?: CommonDBOptions,
190
190
  ): Promise<number> {
191
191
  const table = this.cfg.tablesPrefix + _table
192
- this.data[table] = this.data[table] || {}
192
+ this.data[table] ||= {}
193
193
 
194
194
  return ids
195
195
  .map(id => {
@@ -608,10 +608,6 @@ export class CommonDao<
608
608
  assignIdCreatedUpdated(obj: DBM | BM | Unsaved<BM>, opt: CommonDaoOptions = {}): DBM | Saved<BM> {
609
609
  const now = Math.floor(Date.now() / 1000)
610
610
 
611
- if (this.cfg.createId) {
612
- obj.id ||= this.cfg.hooks!.createNaturalId?.(obj as BM) || this.cfg.hooks!.createRandomId!()
613
- }
614
-
615
611
  if (this.cfg.created) {
616
612
  ;(obj as any)['created'] ||= (obj as any)['updated'] || now
617
613
  }
@@ -621,6 +617,10 @@ export class CommonDao<
621
617
  opt.preserveUpdatedCreated && (obj as any)['updated'] ? (obj as any)['updated'] : now
622
618
  }
623
619
 
620
+ if (this.cfg.createId) {
621
+ obj.id ||= this.cfg.hooks!.createNaturalId?.(obj as BM) || this.cfg.hooks!.createRandomId!()
622
+ }
623
+
624
624
  return obj as any
625
625
  }
626
626
 
@@ -79,6 +79,12 @@ export class CommonKeyValueDao<T> {
79
79
  return r?.[1] || null
80
80
  }
81
81
 
82
+ async getByIdAsBuffer(id?: string): Promise<Buffer | null> {
83
+ if (!id) return null
84
+ const [r] = await this.cfg.db.getByIds(this.cfg.table, [id])
85
+ return r?.[1] || null
86
+ }
87
+
82
88
  async requireById(id: string): Promise<T> {
83
89
  const [r] = await this.getByIds([id])
84
90
 
@@ -94,6 +100,21 @@ export class CommonKeyValueDao<T> {
94
100
  return r[1]
95
101
  }
96
102
 
103
+ async requireByIdAsBuffer(id: string): Promise<Buffer> {
104
+ const [r] = await this.cfg.db.getByIds(this.cfg.table, [id])
105
+
106
+ if (!r) {
107
+ const { table } = this.cfg
108
+ throw new AppError(`DB row required, but not found: ${table}.${id}`, {
109
+ code: DBLibError.DB_ROW_REQUIRED,
110
+ table,
111
+ id,
112
+ })
113
+ }
114
+
115
+ return r[1]
116
+ }
117
+
97
118
  async getByIdOrEmpty(id: string, part: Partial<T> = {}): Promise<T> {
98
119
  const [r] = await this.getByIds([id])
99
120
  if (r) return r[1]
@@ -125,10 +146,18 @@ export class CommonKeyValueDao<T> {
125
146
  ])
126
147
  }
127
148
 
149
+ async getByIdsAsBuffer(ids: string[]): Promise<KeyValueTuple<string, Buffer>[]> {
150
+ return await this.cfg.db.getByIds(this.cfg.table, ids)
151
+ }
152
+
128
153
  async save(id: string, value: T): Promise<void> {
129
154
  await this.saveBatch([[id, value]])
130
155
  }
131
156
 
157
+ async saveAsBuffer(id: string, value: Buffer): Promise<void> {
158
+ await this.cfg.db.saveBatch(this.cfg.table, [[id, value]])
159
+ }
160
+
132
161
  async saveBatch(entries: KeyValueTuple<string, T>[]): Promise<void> {
133
162
  let bufferEntries: KeyValueDBTuple[] = []
134
163
 
@@ -144,6 +173,10 @@ export class CommonKeyValueDao<T> {
144
173
  await this.cfg.db.saveBatch(this.cfg.table, bufferEntries)
145
174
  }
146
175
 
176
+ async saveBatchAsBuffer(entries: KeyValueDBTuple[]): Promise<void> {
177
+ await this.cfg.db.saveBatch(this.cfg.table, entries)
178
+ }
179
+
147
180
  async deleteByIds(ids: string[]): Promise<void> {
148
181
  await this.cfg.db.deleteByIds(this.cfg.table, ids)
149
182
  }
@@ -156,14 +189,14 @@ export class CommonKeyValueDao<T> {
156
189
  return this.cfg.db.streamIds(this.cfg.table, limit)
157
190
  }
158
191
 
159
- streamValues(limit?: number): ReadableTyped<Buffer> {
192
+ streamValues(limit?: number): ReadableTyped<T> {
160
193
  if (!this.cfg.hooks?.mapBufferToValue) {
161
194
  return this.cfg.db.streamValues(this.cfg.table, limit)
162
195
  }
163
196
 
164
197
  // todo: consider it when readableMap supports `errorMode: SUPPRESS`
165
198
  // readableMap(this.cfg.db.streamValues(this.cfg.table, limit), async buf => await this.cfg.hooks!.mapBufferToValue(buf))
166
- const stream: ReadableTyped<Buffer> = this.cfg.db
199
+ const stream: ReadableTyped<T> = this.cfg.db
167
200
  .streamValues(this.cfg.table, limit)
168
201
  .on('error', err => stream.emit('error', err))
169
202
  .pipe(