lmcs-db 1.0.3 → 2.0.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 +247 -68
- package/dist/LmcsDB.d.ts +13 -0
- package/dist/LmcsDB.js +20 -5
- package/dist/LmcsDB.js.map +1 -1
- package/dist/core/collection.d.ts +33 -0
- package/dist/core/collection.js +287 -0
- package/dist/core/database.d.ts +35 -0
- package/dist/core/database.js +165 -0
- package/dist/core/indexer.d.ts +20 -0
- package/dist/core/indexer.js +89 -0
- package/dist/core/transaction-context.d.ts +13 -0
- package/dist/core/transaction-context.js +48 -0
- package/dist/core/transaction.d.ts +25 -0
- package/dist/core/transaction.js +122 -0
- package/dist/crypto/key-derivation.d.ts +0 -0
- package/dist/crypto/key-derivation.js +1 -0
- package/dist/crypto/manager.d.ts +22 -0
- package/dist/crypto/manager.js +76 -0
- package/dist/crypto/vault.d.ts +18 -0
- package/dist/crypto/vault.js +44 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +12 -9
- package/dist/persistence/AsyncWriteWorker.d.ts +30 -0
- package/dist/persistence/AsyncWriteWorker.js +76 -0
- package/dist/persistence/AsyncWriteWorker.js.map +1 -0
- package/dist/storage/BinaryStorage.d.ts +3 -0
- package/dist/storage/BinaryStorage.js +43 -5
- package/dist/storage/BinaryStorage.js.map +1 -1
- package/dist/storage/aol.d.ts +26 -0
- package/dist/storage/aol.js +166 -0
- package/dist/storage/base.d.ts +36 -0
- package/dist/storage/base.js +13 -0
- package/dist/storage/binary.d.ts +21 -0
- package/dist/storage/binary.js +124 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +13 -0
- package/dist/storage/json.d.ts +18 -0
- package/dist/storage/json.js +153 -0
- package/dist/storage/memory.d.ts +14 -0
- package/dist/storage/memory.js +42 -0
- package/dist/utils/checksum.d.ts +0 -0
- package/dist/utils/checksum.js +1 -0
- package/dist/utils/errors.d.ts +16 -0
- package/dist/utils/errors.js +37 -0
- package/dist/utils/lock.d.ts +9 -0
- package/dist/utils/lock.js +75 -0
- package/package.json +11 -5
package/README.md
CHANGED
|
@@ -1,102 +1,281 @@
|
|
|
1
|
-
#
|
|
1
|
+
# LMCS-DB v2.0
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://typescriptlang.org)
|
|
4
|
+
[](https://nodejs.org)
|
|
5
|
+
[](LICENSE)
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
**Lightweight Modular Collection Storage** — A high-performance, file-based NoSQL database for Node.js with multiple storage engines, ACID transactions, and military-grade encryption.
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
## ✨ Features
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
- 🔄 Operações CRUD com sintaxe assíncrona
|
|
17
|
-
|
|
18
|
-
---
|
|
11
|
+
- **🗄️ Multiple Storage Engines**: Memory, JSON, Binary, and Append-Only Log (AOL)
|
|
12
|
+
- **🔐 Built-in Encryption**: AES-256-GCM with PBKDF2 key derivation
|
|
13
|
+
- **🔄 ACID Transactions**: Multi-document transactions with rollback support
|
|
14
|
+
- **⚡ High Performance**: In-memory indexes, streaming queries, and batch operations
|
|
15
|
+
- **🔍 Advanced Queries**: MongoDB-like operators ($gt, $lt, $or, $and, $in)
|
|
16
|
+
- **📦 Zero Dependencies**: Lightweight with minimal footprint
|
|
17
|
+
- **🧪 Full TypeScript**: Type-safe collections with IntelliSense support
|
|
19
18
|
|
|
19
|
+
## 🚀 Quick Start
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
npm install lmcs-db
|
|
23
|
-
|
|
24
|
-
yarn add lmcs-db
|
|
23
|
+
```
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
import {
|
|
25
|
+
```typescript
|
|
26
|
+
import { Database, StorageType } from "lmcs-db";
|
|
28
27
|
|
|
29
28
|
interface User {
|
|
30
|
-
_id
|
|
29
|
+
_id?: string;
|
|
31
30
|
name: string;
|
|
32
31
|
email: string;
|
|
33
32
|
age: number;
|
|
34
|
-
active: boolean;
|
|
35
33
|
}
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
// Create database
|
|
36
|
+
const db = await Database.create({
|
|
37
|
+
storageType: StorageType.Binary,
|
|
38
|
+
databaseName: "myapp",
|
|
39
|
+
encryptionKey: "your-secret-key-32-chars!!", // Optional
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const users = db.collection<User>("users");
|
|
43
|
+
|
|
44
|
+
// Insert
|
|
45
|
+
await users.insert({ name: "Alice", email: "alice@test.com", age: 30 });
|
|
46
|
+
|
|
47
|
+
// Query
|
|
48
|
+
const adults = await users.findAll({
|
|
49
|
+
filter: { age: { $gte: 18 } },
|
|
50
|
+
sort: { name: 1 },
|
|
51
|
+
limit: 10,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Transaction
|
|
55
|
+
await db.transaction(async (trx) => {
|
|
56
|
+
await trx.insert("users", { name: "Bob", age: 25 });
|
|
57
|
+
await trx.update("users", "alice-id", { age: 31 });
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
💾 Storage Engines
|
|
62
|
+
| Engine | Persistence | Speed | Use Case | Compression |
|
|
63
|
+
| ---------- | ----------- | ------------- | ------------------------------------- | -------------- |
|
|
64
|
+
| **Memory** | ❌ Volatile | ⚡ Ultra-fast | Cache, testing, temporary data | N/A |
|
|
65
|
+
| **JSON** | ✅ File | 🐢 Moderate | Config files, small datasets (<10MB) | None (text) |
|
|
66
|
+
| **Binary** | ✅ File | 🚀 Fast | General purpose, medium datasets | Binary packing |
|
|
67
|
+
| **AOL** | ✅ File | ⚡ Fast writes | Logs, event sourcing, high throughput | Compaction |
|
|
68
|
+
|
|
69
|
+
Engine Details
|
|
70
|
+
|
|
71
|
+
Memory Storage
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
const db = await createDatabase({
|
|
75
|
+
storageType: "memory",
|
|
76
|
+
databaseName: "cache",
|
|
77
|
+
});
|
|
78
|
+
// Data lost on process exit. Fastest option.
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
JSON Storage
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const db = await createDatabase({
|
|
85
|
+
storageType: "json",
|
|
86
|
+
databaseName: "config",
|
|
87
|
+
});
|
|
88
|
+
// Human-readable, but slower than binary.
|
|
89
|
+
```
|
|
44
90
|
|
|
45
|
-
|
|
91
|
+
Binary Storage
|
|
46
92
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
93
|
+
```typescript
|
|
94
|
+
const db = await createDatabase({
|
|
95
|
+
storageType: "binary",
|
|
96
|
+
databaseName: "data",
|
|
97
|
+
encryptionKey: "secret", // Optional encryption
|
|
98
|
+
});
|
|
99
|
+
// Compact binary format with CRC32 checksums
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
AOL (Append-Only Log)
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
const db = await Database.create({
|
|
106
|
+
storageType: StorageType.AOL,
|
|
107
|
+
databaseName: "events",
|
|
108
|
+
bufferSize: 1000, // Buffer before fsync
|
|
109
|
+
compactionInterval: 60000, // Automatic cleanup every 60s
|
|
110
|
+
});
|
|
111
|
+
// O(1) writes, perfect for event sourcing
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
🔍 Query API
|
|
115
|
+
|
|
116
|
+
Basic Queries
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
// Find one
|
|
120
|
+
const user = await users.findOne({ email: "alice@test.com" });
|
|
121
|
+
|
|
122
|
+
// Find all
|
|
123
|
+
const all = await users.findAll();
|
|
124
|
+
|
|
125
|
+
// Count
|
|
126
|
+
const total = await users.count();
|
|
127
|
+
```
|
|
53
128
|
|
|
54
|
-
|
|
55
|
-
filter: { active: true }
|
|
56
|
-
});
|
|
129
|
+
Advanced Filtering
|
|
57
130
|
|
|
58
|
-
|
|
131
|
+
```typescript
|
|
132
|
+
// Comparison operators
|
|
133
|
+
const adults = await users.findAll({ filter: { age: { $gte: 18 } } });
|
|
134
|
+
const rich = await users.findAll({ filter: { salary: { $gt: 100000 } } });
|
|
135
|
+
|
|
136
|
+
// Logical operators
|
|
137
|
+
const result = await users.findAll({
|
|
138
|
+
filter: {
|
|
139
|
+
$or: [{ age: { $lt: 18 } }, { vip: true }],
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// Array operators (if field is array)
|
|
144
|
+
const tagged = await posts.findAll({
|
|
145
|
+
filter: { tags: { $in: ["typescript", "nodejs"] } },
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Sorting and Pagination
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
const page = await users.findAll({
|
|
153
|
+
filter: { active: true },
|
|
154
|
+
sort: { createdAt: -1 }, // -1 = descending, 1 = ascending
|
|
155
|
+
skip: 20, // Offset
|
|
156
|
+
limit: 10, // Page size
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Streaming (Memory Efficient)
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// Process millions of records without loading into memory
|
|
164
|
+
const stream = logs.findStream({ filter: { level: "error" } });
|
|
165
|
+
|
|
166
|
+
for await (const error of stream) {
|
|
167
|
+
await sendAlert(error);
|
|
59
168
|
}
|
|
169
|
+
```
|
|
60
170
|
|
|
61
|
-
|
|
171
|
+
🔄 Transactions
|
|
172
|
+
ACID transactions ensure data consistency across multiple operations:
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
await db.transaction(async (trx) => {
|
|
176
|
+
// All operations succeed or all rollback
|
|
177
|
+
const order = await trx.insert("orders", { total: 100, status: "pending" });
|
|
178
|
+
await trx.insert("order_items", { orderId: order._id, product: "Laptop" });
|
|
179
|
+
await trx.update("inventory", "laptop-123", { stock: { $dec: 1 } });
|
|
180
|
+
|
|
181
|
+
if (somethingWrong) {
|
|
182
|
+
throw new Error("Rollback everything");
|
|
183
|
+
}
|
|
184
|
+
});
|
|
62
185
|
```
|
|
63
186
|
|
|
187
|
+
🔐 Security
|
|
188
|
+
Encryption
|
|
189
|
+
Algorithm: AES-256-GCM
|
|
190
|
+
Key Derivation: PBKDF2 with 100,000 iterations
|
|
191
|
+
Unique IV per encryption operation
|
|
192
|
+
Authentication tag prevents tampering
|
|
64
193
|
|
|
65
|
-
|
|
66
|
-
|
|
194
|
+
```typescript
|
|
195
|
+
const db = await Database.create({
|
|
196
|
+
storageType: StorageType.Binary,
|
|
197
|
+
databaseName: "secrets",
|
|
198
|
+
encryptionKey: process.env.DB_KEY, // Load from secure source
|
|
199
|
+
});
|
|
67
200
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
- encryptionKey: string (opcional) Chave usada para criptografia AES
|
|
72
|
-
- customPath: string (opcional) Path de onde será criado o arquivo de armazenamento
|
|
201
|
+
// All data transparently encrypted on disk
|
|
202
|
+
await secrets.insert({ password: "super-secret" });
|
|
203
|
+
```
|
|
73
204
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
- insert
|
|
77
|
-
- find
|
|
78
|
-
- findAll
|
|
79
|
-
- update
|
|
80
|
-
- delete
|
|
81
|
-
- count
|
|
205
|
+
Indexing
|
|
206
|
+
Create indexes for fast queries:
|
|
82
207
|
|
|
83
|
-
|
|
208
|
+
```typescript
|
|
209
|
+
// Single field
|
|
210
|
+
users.createIndex("email", { unique: true });
|
|
84
211
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
A persistência é automática após alterações, garantindo integridade dos dados em disco.
|
|
212
|
+
// Compound
|
|
213
|
+
orders.createIndex(["userId", "createdAt"]);
|
|
88
214
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
215
|
+
// Sparse (skip null values)
|
|
216
|
+
users.createIndex("phone", { sparse: true });
|
|
217
|
+
```
|
|
218
|
+
📊 Performance Tips
|
|
219
|
+
1. Use Memory storage for unit tests (10x faster)
|
|
220
|
+
2. Batch inserts instead of individual awaits
|
|
221
|
+
3. Create indexes on frequently queried fields
|
|
222
|
+
4. Use streaming for large datasets (>10k records)
|
|
223
|
+
5. Compact AOL periodically to reclaim space
|
|
224
|
+
6. Enable checksums for critical data integrity
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// Batch insert (much faster)
|
|
228
|
+
await Promise.all(
|
|
229
|
+
items.map(item => collection.insert(item))
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
// Compact AOL storage
|
|
233
|
+
await db.compact();
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
🧪 Testing
|
|
237
|
+
```bash
|
|
238
|
+
# Run all tests
|
|
239
|
+
npm test
|
|
92
240
|
|
|
93
|
-
|
|
241
|
+
# Run specific suite
|
|
242
|
+
npm test -- storage.test.ts
|
|
243
|
+
|
|
244
|
+
# With coverage
|
|
245
|
+
npm run test:coverage
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
📁 Project Structure
|
|
249
|
+
```bash
|
|
250
|
+
data/
|
|
251
|
+
├── myapp.bin # Binary storage file
|
|
252
|
+
├── myapp.json # JSON storage file
|
|
253
|
+
└── myapp.aol # Append-only log
|
|
254
|
+
|
|
255
|
+
src/
|
|
256
|
+
├── core/
|
|
257
|
+
│ ├── database.ts # Main database class
|
|
258
|
+
│ ├── collection.ts # Collection operations
|
|
259
|
+
│ ├── transaction.ts # ACID transactions
|
|
260
|
+
│ └── indexer.ts # Index management
|
|
261
|
+
├── storage/
|
|
262
|
+
│ ├── base.ts # Storage interface
|
|
263
|
+
│ ├── memory.ts # In-memory storage
|
|
264
|
+
│ ├── json.ts # JSON file storage
|
|
265
|
+
│ ├── binary.ts # Binary storage
|
|
266
|
+
│ └── aol.ts # Append-only log
|
|
267
|
+
└── crypto/
|
|
268
|
+
└── manager.ts # Encryption utilities
|
|
269
|
+
```
|
|
94
270
|
|
|
95
|
-
|
|
96
|
-
|
|
271
|
+
🤝 Contributing
|
|
272
|
+
1. Fork the repository
|
|
273
|
+
2. Create your feature branch (git checkout -b feature/amazing)
|
|
274
|
+
3. Commit changes (git commit -m 'Add amazing feature')
|
|
275
|
+
4. Push to branch (git push origin feature/amazing)
|
|
276
|
+
5. Open a Pull Request
|
|
97
277
|
|
|
98
|
-
📄
|
|
99
|
-
MIT
|
|
278
|
+
📄 License
|
|
279
|
+
[MIT License](LICENSE) - see [LICENSE](LICENSE) file.
|
|
100
280
|
|
|
101
|
-
|
|
102
|
-
Desenvolvido por Leandro A da Silva.
|
|
281
|
+
Made with ❤️ by Leandro A. da Silva
|
package/dist/LmcsDB.d.ts
CHANGED
|
@@ -4,9 +4,22 @@ declare class LmcsDB {
|
|
|
4
4
|
private schema;
|
|
5
5
|
private encryptionService?;
|
|
6
6
|
private config;
|
|
7
|
+
private writeWorker?;
|
|
7
8
|
constructor(config: DatabaseConfig);
|
|
8
9
|
initialize(): Promise<void>;
|
|
9
10
|
save(): Promise<void>;
|
|
11
|
+
flush(): Promise<void>;
|
|
12
|
+
getPersistenceStats(): {
|
|
13
|
+
enqueuedCount: number;
|
|
14
|
+
writesCount: number;
|
|
15
|
+
inFlight: boolean;
|
|
16
|
+
hasPending: boolean;
|
|
17
|
+
lastDurationMs: number;
|
|
18
|
+
lastBytes: number;
|
|
19
|
+
totalBytes: number;
|
|
20
|
+
lastStartedAt: number | undefined;
|
|
21
|
+
lastFinishedAt: number | undefined;
|
|
22
|
+
} | undefined;
|
|
10
23
|
collection<T extends DatabaseDocument>(name: string): {
|
|
11
24
|
insert: (document: Omit<T, "_id">) => Promise<T>;
|
|
12
25
|
find: (id: string) => Promise<T | null>;
|
package/dist/LmcsDB.js
CHANGED
|
@@ -8,6 +8,7 @@ const EncryptionService_1 = __importDefault(require("./EncryptionService"));
|
|
|
8
8
|
const InMemoryStorage_1 = __importDefault(require("./storage/InMemoryStorage"));
|
|
9
9
|
const JsonStorage_1 = __importDefault(require("./storage/JsonStorage"));
|
|
10
10
|
const BinaryStorage_1 = __importDefault(require("./storage/BinaryStorage"));
|
|
11
|
+
const AsyncWriteWorker_1 = __importDefault(require("./persistence/AsyncWriteWorker"));
|
|
11
12
|
class LmcsDB {
|
|
12
13
|
constructor(config) {
|
|
13
14
|
this.schema = { collections: {} };
|
|
@@ -30,6 +31,9 @@ class LmcsDB {
|
|
|
30
31
|
if (config.encryptionKey) {
|
|
31
32
|
this.encryptionService = new EncryptionService_1.default(config.encryptionKey);
|
|
32
33
|
}
|
|
34
|
+
this.writeWorker = new AsyncWriteWorker_1.default(async (raw) => {
|
|
35
|
+
await this.storage.save(raw);
|
|
36
|
+
});
|
|
33
37
|
}
|
|
34
38
|
async initialize() {
|
|
35
39
|
let rawData = await this.storage.load();
|
|
@@ -54,13 +58,24 @@ class LmcsDB {
|
|
|
54
58
|
}
|
|
55
59
|
async save() {
|
|
56
60
|
let rawData = JSON.stringify(this.schema);
|
|
57
|
-
// Criptografar dados se necessário
|
|
58
61
|
if (this.encryptionService) {
|
|
59
62
|
rawData = this.encryptionService.encrypt(rawData);
|
|
60
63
|
}
|
|
61
|
-
|
|
64
|
+
if (this.writeWorker) {
|
|
65
|
+
this.writeWorker.enqueue(rawData);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
62
68
|
await this.storage.save(rawData);
|
|
63
69
|
}
|
|
70
|
+
async flush() {
|
|
71
|
+
await this.save();
|
|
72
|
+
if (this.writeWorker) {
|
|
73
|
+
await this.writeWorker.flush();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
getPersistenceStats() {
|
|
77
|
+
return this.writeWorker ? this.writeWorker.getStats() : undefined;
|
|
78
|
+
}
|
|
64
79
|
collection(name) {
|
|
65
80
|
return {
|
|
66
81
|
insert: async (document) => {
|
|
@@ -73,7 +88,7 @@ class LmcsDB {
|
|
|
73
88
|
const id = (0, uuid_1.v4)();
|
|
74
89
|
const newDoc = { _id: id, ...document };
|
|
75
90
|
this.schema.collections[name].documents[id] = newDoc;
|
|
76
|
-
|
|
91
|
+
this.save().catch(() => { });
|
|
77
92
|
return newDoc;
|
|
78
93
|
},
|
|
79
94
|
find: async (id) => {
|
|
@@ -153,7 +168,7 @@ class LmcsDB {
|
|
|
153
168
|
_id: id // Garantir que o ID não seja alterado
|
|
154
169
|
};
|
|
155
170
|
collection.documents[id] = updatedDoc;
|
|
156
|
-
|
|
171
|
+
this.save().catch(() => { });
|
|
157
172
|
return updatedDoc;
|
|
158
173
|
},
|
|
159
174
|
delete: async (id) => {
|
|
@@ -165,7 +180,7 @@ class LmcsDB {
|
|
|
165
180
|
if (Object.keys(collection.documents).length === 0) {
|
|
166
181
|
delete this.schema.collections[name];
|
|
167
182
|
}
|
|
168
|
-
|
|
183
|
+
this.save().catch(() => { });
|
|
169
184
|
return true;
|
|
170
185
|
},
|
|
171
186
|
count: async (options) => {
|
package/dist/LmcsDB.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LmcsDB.js","sourceRoot":"","sources":["../src/LmcsDB.ts"],"names":[],"mappings":";;;;;AAAA,+BAAoC;AACpC,4EAAoD;AACpD,gFAAwD;AACxD,wEAAgD;AAChD,4EAAoD;
|
|
1
|
+
{"version":3,"file":"LmcsDB.js","sourceRoot":"","sources":["../src/LmcsDB.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BaseStorage, LogEntry } from "../storage";
|
|
2
|
+
export interface QueryOptions {
|
|
3
|
+
filter?: Record<string, any>;
|
|
4
|
+
sort?: Record<string, 1 | -1>;
|
|
5
|
+
limit?: number;
|
|
6
|
+
skip?: number;
|
|
7
|
+
batchSize?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class Collection<T extends Record<string, any>> {
|
|
10
|
+
private name;
|
|
11
|
+
private storage;
|
|
12
|
+
private data;
|
|
13
|
+
private indexes;
|
|
14
|
+
private crypto;
|
|
15
|
+
constructor(name: string, storage: BaseStorage);
|
|
16
|
+
private loadFromStorage;
|
|
17
|
+
applyLogEntry(entry: LogEntry): void;
|
|
18
|
+
private addToIndexes;
|
|
19
|
+
private removeFromIndexes;
|
|
20
|
+
insert(doc: Omit<T, "_id"> & {
|
|
21
|
+
_id?: string;
|
|
22
|
+
}): Promise<T>;
|
|
23
|
+
update(filter: Partial<T>, updates: Partial<T>): Promise<number>;
|
|
24
|
+
delete(filter: Partial<T>): Promise<number>;
|
|
25
|
+
findOne(filter: Partial<T>): Promise<T | null>;
|
|
26
|
+
findAll(options?: QueryOptions): Promise<T[]>;
|
|
27
|
+
findStream(options?: QueryOptions): AsyncGenerator<T>;
|
|
28
|
+
createIndex(field: keyof T): void;
|
|
29
|
+
private matchesFilter;
|
|
30
|
+
private getNestedValue;
|
|
31
|
+
private queryByIndex;
|
|
32
|
+
count(): number;
|
|
33
|
+
}
|