@serve.zone/dcrouter 11.23.4 → 12.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/dist_serve/bundle.js +1 -1
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/classes.cert-provision-scheduler.d.ts +6 -8
- package/dist_ts/classes.cert-provision-scheduler.js +37 -17
- package/dist_ts/classes.dcrouter.d.ts +15 -29
- package/dist_ts/classes.dcrouter.js +96 -91
- package/dist_ts/classes.storage-cert-manager.d.ts +3 -6
- package/dist_ts/classes.storage-cert-manager.js +35 -25
- package/dist_ts/config/classes.api-token-manager.d.ts +1 -3
- package/dist_ts/config/classes.api-token-manager.js +45 -15
- package/dist_ts/config/classes.route-config-manager.d.ts +1 -3
- package/dist_ts/config/classes.route-config-manager.js +63 -25
- package/dist_ts/{cache → db}/classes.cache.cleaner.d.ts +3 -3
- package/dist_ts/db/classes.cache.cleaner.js +130 -0
- package/dist_ts/{cache → db}/classes.cached.document.js +1 -1
- package/dist_ts/db/classes.dcrouter-db.d.ts +70 -0
- package/dist_ts/db/classes.dcrouter-db.js +146 -0
- package/dist_ts/db/documents/classes.accounting-session.doc.d.ts +32 -0
- package/dist_ts/db/documents/classes.accounting-session.doc.js +214 -0
- package/dist_ts/db/documents/classes.acme-cert.doc.d.ts +13 -0
- package/dist_ts/db/documents/classes.acme-cert.doc.js +109 -0
- package/dist_ts/db/documents/classes.api-token.doc.d.ts +18 -0
- package/dist_ts/db/documents/classes.api-token.doc.js +127 -0
- package/dist_ts/{cache → db}/documents/classes.cached.email.js +3 -3
- package/dist_ts/{cache → db}/documents/classes.cached.ip.reputation.js +3 -3
- package/dist_ts/db/documents/classes.cert-backoff.doc.d.ts +11 -0
- package/dist_ts/db/documents/classes.cert-backoff.doc.js +97 -0
- package/dist_ts/db/documents/classes.proxy-cert.doc.d.ts +12 -0
- package/dist_ts/db/documents/classes.proxy-cert.doc.js +103 -0
- package/dist_ts/db/documents/classes.remote-ingress-edge.doc.d.ts +17 -0
- package/dist_ts/db/documents/classes.remote-ingress-edge.doc.js +130 -0
- package/dist_ts/db/documents/classes.route-override.doc.d.ts +10 -0
- package/dist_ts/db/documents/classes.route-override.doc.js +91 -0
- package/dist_ts/db/documents/classes.stored-route.doc.d.ts +12 -0
- package/dist_ts/db/documents/classes.stored-route.doc.js +103 -0
- package/dist_ts/db/documents/classes.vlan-mappings.doc.d.ts +15 -0
- package/dist_ts/db/documents/classes.vlan-mappings.doc.js +77 -0
- package/dist_ts/db/documents/classes.vpn-client.doc.d.ts +18 -0
- package/dist_ts/db/documents/classes.vpn-client.doc.js +136 -0
- package/dist_ts/db/documents/classes.vpn-server-keys.doc.d.ts +10 -0
- package/dist_ts/db/documents/classes.vpn-server-keys.doc.js +94 -0
- package/dist_ts/db/documents/index.d.ts +13 -0
- package/dist_ts/db/documents/index.js +20 -0
- package/dist_ts/{cache → db}/index.d.ts +1 -1
- package/dist_ts/db/index.js +9 -0
- package/dist_ts/opsserver/handlers/certificate.handler.js +66 -66
- package/dist_ts/opsserver/handlers/config.handler.js +14 -15
- package/dist_ts/paths.d.ts +0 -1
- package/dist_ts/paths.js +1 -2
- package/dist_ts/radius/classes.accounting.manager.d.ts +4 -12
- package/dist_ts/radius/classes.accounting.manager.js +80 -93
- package/dist_ts/radius/classes.radius.server.d.ts +1 -3
- package/dist_ts/radius/classes.radius.server.js +4 -6
- package/dist_ts/radius/classes.vlan.manager.d.ts +3 -7
- package/dist_ts/radius/classes.vlan.manager.js +21 -28
- package/dist_ts/radius/index.d.ts +1 -1
- package/dist_ts/radius/index.js +1 -1
- package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +3 -5
- package/dist_ts/remoteingress/classes.remoteingress-manager.js +41 -21
- package/dist_ts/security/classes.ipreputationchecker.d.ts +6 -21
- package/dist_ts/security/classes.ipreputationchecker.js +59 -138
- package/dist_ts/vpn/classes.vpn-manager.d.ts +4 -22
- package/dist_ts/vpn/classes.vpn-manager.js +40 -45
- package/dist_ts_oci_container/index.js +4 -4
- package/dist_ts_web/00_commitinfo_data.js +2 -2
- package/package.json +1 -1
- package/readme.storage.md +55 -91
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.cert-provision-scheduler.ts +35 -17
- package/ts/classes.dcrouter.ts +113 -125
- package/ts/classes.storage-cert-manager.ts +34 -22
- package/ts/config/classes.api-token-manager.ts +42 -11
- package/ts/config/classes.route-config-manager.ts +57 -22
- package/ts/{cache → db}/classes.cache.cleaner.ts +6 -6
- package/ts/db/classes.dcrouter-db.ts +179 -0
- package/ts/db/documents/classes.accounting-session.doc.ts +106 -0
- package/ts/db/documents/classes.acme-cert.doc.ts +41 -0
- package/ts/db/documents/classes.api-token.doc.ts +56 -0
- package/ts/{cache → db}/documents/classes.cached.email.ts +2 -2
- package/ts/{cache → db}/documents/classes.cached.ip.reputation.ts +2 -2
- package/ts/db/documents/classes.cert-backoff.doc.ts +35 -0
- package/ts/db/documents/classes.proxy-cert.doc.ts +38 -0
- package/ts/db/documents/classes.remote-ingress-edge.doc.ts +54 -0
- package/ts/db/documents/classes.route-override.doc.ts +32 -0
- package/ts/db/documents/classes.stored-route.doc.ts +38 -0
- package/ts/db/documents/classes.vlan-mappings.doc.ts +32 -0
- package/ts/db/documents/classes.vpn-client.doc.ts +57 -0
- package/ts/db/documents/classes.vpn-server-keys.doc.ts +31 -0
- package/ts/db/documents/index.ts +24 -0
- package/ts/{cache → db}/index.ts +6 -2
- package/ts/opsserver/handlers/certificate.handler.ts +67 -65
- package/ts/opsserver/handlers/config.handler.ts +13 -14
- package/ts/paths.ts +0 -1
- package/ts/radius/classes.accounting.manager.ts +81 -103
- package/ts/radius/classes.radius.server.ts +3 -6
- package/ts/radius/classes.vlan.manager.ts +20 -32
- package/ts/radius/index.ts +1 -1
- package/ts/remoteingress/classes.remoteingress-manager.ts +40 -22
- package/ts/security/classes.ipreputationchecker.ts +103 -196
- package/ts/vpn/classes.vpn-manager.ts +44 -75
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/dist_ts/cache/classes.cache.cleaner.js +0 -130
- package/dist_ts/cache/classes.cachedb.d.ts +0 -60
- package/dist_ts/cache/classes.cachedb.js +0 -126
- package/dist_ts/cache/documents/index.d.ts +0 -2
- package/dist_ts/cache/documents/index.js +0 -3
- package/dist_ts/cache/index.js +0 -7
- package/dist_ts/storage/classes.storagemanager.d.ts +0 -83
- package/dist_ts/storage/classes.storagemanager.js +0 -348
- package/dist_ts/storage/index.d.ts +0 -1
- package/dist_ts/storage/index.js +0 -3
- package/ts/cache/classes.cachedb.ts +0 -155
- package/ts/cache/documents/index.ts +0 -2
- package/ts/storage/classes.storagemanager.ts +0 -404
- package/ts/storage/index.ts +0 -2
- /package/dist_ts/{cache → db}/classes.cached.document.d.ts +0 -0
- /package/dist_ts/{cache → db}/documents/classes.cached.email.d.ts +0 -0
- /package/dist_ts/{cache → db}/documents/classes.cached.ip.reputation.d.ts +0 -0
- /package/ts/{cache → db}/classes.cached.document.ts +0 -0
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { logger } from '../logger.js';
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
const STORAGE_PREFIX_KEYS = '/vpn/server-keys';
|
|
6
|
-
const STORAGE_PREFIX_CLIENTS = '/vpn/clients/';
|
|
3
|
+
import { VpnServerKeysDoc, VpnClientDoc } from '../db/index.js';
|
|
7
4
|
|
|
8
5
|
export interface IVpnManagerConfig {
|
|
9
6
|
/** VPN subnet CIDR (default: '10.8.0.0/24') */
|
|
@@ -35,43 +32,17 @@ export interface IVpnManagerConfig {
|
|
|
35
32
|
getClientAllowedIPs?: (clientTags: string[]) => Promise<string[]>;
|
|
36
33
|
}
|
|
37
34
|
|
|
38
|
-
interface IPersistedServerKeys {
|
|
39
|
-
noisePrivateKey: string;
|
|
40
|
-
noisePublicKey: string;
|
|
41
|
-
wgPrivateKey: string;
|
|
42
|
-
wgPublicKey: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
interface IPersistedClient {
|
|
46
|
-
clientId: string;
|
|
47
|
-
enabled: boolean;
|
|
48
|
-
serverDefinedClientTags?: string[];
|
|
49
|
-
description?: string;
|
|
50
|
-
assignedIp?: string;
|
|
51
|
-
noisePublicKey: string;
|
|
52
|
-
wgPublicKey: string;
|
|
53
|
-
/** WireGuard private key — stored so exports and QR codes produce valid configs */
|
|
54
|
-
wgPrivateKey?: string;
|
|
55
|
-
createdAt: number;
|
|
56
|
-
updatedAt: number;
|
|
57
|
-
expiresAt?: string;
|
|
58
|
-
/** @deprecated Legacy field — migrated to serverDefinedClientTags on load */
|
|
59
|
-
tags?: string[];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
35
|
/**
|
|
63
36
|
* Manages the SmartVPN server lifecycle and VPN client CRUD.
|
|
64
|
-
* Persists server keys and client registrations via
|
|
37
|
+
* Persists server keys and client registrations via smartdata document classes.
|
|
65
38
|
*/
|
|
66
39
|
export class VpnManager {
|
|
67
|
-
private storageManager: StorageManager;
|
|
68
40
|
private config: IVpnManagerConfig;
|
|
69
41
|
private vpnServer?: plugins.smartvpn.VpnServer;
|
|
70
|
-
private clients: Map<string,
|
|
71
|
-
private serverKeys?:
|
|
42
|
+
private clients: Map<string, VpnClientDoc> = new Map();
|
|
43
|
+
private serverKeys?: VpnServerKeysDoc;
|
|
72
44
|
|
|
73
|
-
constructor(
|
|
74
|
-
this.storageManager = storageManager;
|
|
45
|
+
constructor(config: IVpnManagerConfig) {
|
|
75
46
|
this.config = config;
|
|
76
47
|
}
|
|
77
48
|
|
|
@@ -204,22 +175,21 @@ export class VpnManager {
|
|
|
204
175
|
}
|
|
205
176
|
|
|
206
177
|
// Persist client entry (including WG private key for export/QR)
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
this.
|
|
222
|
-
await this.persistClient(persisted);
|
|
178
|
+
const doc = new VpnClientDoc();
|
|
179
|
+
doc.clientId = bundle.entry.clientId;
|
|
180
|
+
doc.enabled = bundle.entry.enabled ?? true;
|
|
181
|
+
doc.serverDefinedClientTags = bundle.entry.serverDefinedClientTags;
|
|
182
|
+
doc.description = bundle.entry.description;
|
|
183
|
+
doc.assignedIp = bundle.entry.assignedIp;
|
|
184
|
+
doc.noisePublicKey = bundle.entry.publicKey;
|
|
185
|
+
doc.wgPublicKey = bundle.entry.wgPublicKey || '';
|
|
186
|
+
doc.wgPrivateKey = bundle.secrets?.wgPrivateKey
|
|
187
|
+
|| bundle.wireguardConfig?.match(/PrivateKey\s*=\s*(.+)/)?.[1]?.trim();
|
|
188
|
+
doc.createdAt = Date.now();
|
|
189
|
+
doc.updatedAt = Date.now();
|
|
190
|
+
doc.expiresAt = bundle.entry.expiresAt;
|
|
191
|
+
this.clients.set(doc.clientId, doc);
|
|
192
|
+
await this.persistClient(doc);
|
|
223
193
|
|
|
224
194
|
this.config.onClientChanged?.();
|
|
225
195
|
return bundle;
|
|
@@ -233,15 +203,18 @@ export class VpnManager {
|
|
|
233
203
|
throw new Error('VPN server not running');
|
|
234
204
|
}
|
|
235
205
|
await this.vpnServer.removeClient(clientId);
|
|
206
|
+
const doc = this.clients.get(clientId);
|
|
236
207
|
this.clients.delete(clientId);
|
|
237
|
-
|
|
208
|
+
if (doc) {
|
|
209
|
+
await doc.delete();
|
|
210
|
+
}
|
|
238
211
|
this.config.onClientChanged?.();
|
|
239
212
|
}
|
|
240
213
|
|
|
241
214
|
/**
|
|
242
215
|
* List all registered clients (without secrets).
|
|
243
216
|
*/
|
|
244
|
-
public listClients():
|
|
217
|
+
public listClients(): VpnClientDoc[] {
|
|
245
218
|
return [...this.clients.values()];
|
|
246
219
|
}
|
|
247
220
|
|
|
@@ -407,8 +380,8 @@ export class VpnManager {
|
|
|
407
380
|
|
|
408
381
|
// ── Private helpers ────────────────────────────────────────────────────
|
|
409
382
|
|
|
410
|
-
private async loadOrGenerateServerKeys(): Promise<
|
|
411
|
-
const stored = await
|
|
383
|
+
private async loadOrGenerateServerKeys(): Promise<VpnServerKeysDoc> {
|
|
384
|
+
const stored = await VpnServerKeysDoc.load();
|
|
412
385
|
if (stored?.noisePrivateKey && stored?.wgPrivateKey) {
|
|
413
386
|
logger.log('info', 'Loaded VPN server keys from storage');
|
|
414
387
|
return stored;
|
|
@@ -424,38 +397,34 @@ export class VpnManager {
|
|
|
424
397
|
const wgKeys = await tempServer.generateWgKeypair();
|
|
425
398
|
tempServer.stop();
|
|
426
399
|
|
|
427
|
-
const
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
400
|
+
const doc = stored || new VpnServerKeysDoc();
|
|
401
|
+
doc.noisePrivateKey = noiseKeys.privateKey;
|
|
402
|
+
doc.noisePublicKey = noiseKeys.publicKey;
|
|
403
|
+
doc.wgPrivateKey = wgKeys.privateKey;
|
|
404
|
+
doc.wgPublicKey = wgKeys.publicKey;
|
|
405
|
+
await doc.save();
|
|
433
406
|
|
|
434
|
-
await this.storageManager.setJSON(STORAGE_PREFIX_KEYS, keys);
|
|
435
407
|
logger.log('info', 'Generated and persisted new VPN server keys');
|
|
436
|
-
return
|
|
408
|
+
return doc;
|
|
437
409
|
}
|
|
438
410
|
|
|
439
411
|
private async loadPersistedClients(): Promise<void> {
|
|
440
|
-
const
|
|
441
|
-
for (const
|
|
442
|
-
|
|
443
|
-
if (
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
delete client.tags;
|
|
448
|
-
await this.persistClient(client);
|
|
449
|
-
}
|
|
450
|
-
this.clients.set(client.clientId, client);
|
|
412
|
+
const docs = await VpnClientDoc.findAll();
|
|
413
|
+
for (const doc of docs) {
|
|
414
|
+
// Migrate legacy `tags` → `serverDefinedClientTags`
|
|
415
|
+
if (!doc.serverDefinedClientTags && (doc as any).tags) {
|
|
416
|
+
doc.serverDefinedClientTags = (doc as any).tags;
|
|
417
|
+
(doc as any).tags = undefined;
|
|
418
|
+
await doc.save();
|
|
451
419
|
}
|
|
420
|
+
this.clients.set(doc.clientId, doc);
|
|
452
421
|
}
|
|
453
422
|
if (this.clients.size > 0) {
|
|
454
423
|
logger.log('info', `Loaded ${this.clients.size} persisted VPN client(s)`);
|
|
455
424
|
}
|
|
456
425
|
}
|
|
457
426
|
|
|
458
|
-
private async persistClient(client:
|
|
459
|
-
await
|
|
427
|
+
private async persistClient(client: VpnClientDoc): Promise<void> {
|
|
428
|
+
await client.save();
|
|
460
429
|
}
|
|
461
430
|
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
import { logger } from '../logger.js';
|
|
3
|
-
import { CacheDb } from './classes.cachedb.js';
|
|
4
|
-
// Import document classes for cleanup
|
|
5
|
-
import { CachedEmail } from './documents/classes.cached.email.js';
|
|
6
|
-
import { CachedIPReputation } from './documents/classes.cached.ip.reputation.js';
|
|
7
|
-
/**
|
|
8
|
-
* CacheCleaner - Periodically removes expired documents from the cache
|
|
9
|
-
*
|
|
10
|
-
* Runs on a configurable interval (default: hourly) and queries each
|
|
11
|
-
* collection for documents where expiresAt < now(), then deletes them.
|
|
12
|
-
*/
|
|
13
|
-
export class CacheCleaner {
|
|
14
|
-
cleanupInterval = null;
|
|
15
|
-
isRunning = false;
|
|
16
|
-
options;
|
|
17
|
-
cacheDb;
|
|
18
|
-
constructor(cacheDb, options = {}) {
|
|
19
|
-
this.cacheDb = cacheDb;
|
|
20
|
-
this.options = {
|
|
21
|
-
intervalMs: options.intervalMs || 60 * 60 * 1000, // 1 hour default
|
|
22
|
-
verbose: options.verbose || false,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Start the periodic cleanup process
|
|
27
|
-
*/
|
|
28
|
-
start() {
|
|
29
|
-
if (this.isRunning) {
|
|
30
|
-
logger.log('warn', 'CacheCleaner already running');
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
this.isRunning = true;
|
|
34
|
-
// Run cleanup immediately on start
|
|
35
|
-
this.runCleanup().catch((error) => {
|
|
36
|
-
logger.log('error', `Initial cache cleanup failed: ${error.message}`);
|
|
37
|
-
});
|
|
38
|
-
// Schedule periodic cleanup
|
|
39
|
-
this.cleanupInterval = setInterval(() => {
|
|
40
|
-
this.runCleanup().catch((error) => {
|
|
41
|
-
logger.log('error', `Cache cleanup failed: ${error.message}`);
|
|
42
|
-
});
|
|
43
|
-
}, this.options.intervalMs);
|
|
44
|
-
logger.log('info', `CacheCleaner started with interval: ${this.options.intervalMs / 1000 / 60} minutes`);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Stop the periodic cleanup process
|
|
48
|
-
*/
|
|
49
|
-
stop() {
|
|
50
|
-
if (!this.isRunning) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
if (this.cleanupInterval) {
|
|
54
|
-
clearInterval(this.cleanupInterval);
|
|
55
|
-
this.cleanupInterval = null;
|
|
56
|
-
}
|
|
57
|
-
this.isRunning = false;
|
|
58
|
-
logger.log('info', 'CacheCleaner stopped');
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Run a single cleanup cycle
|
|
62
|
-
*/
|
|
63
|
-
async runCleanup() {
|
|
64
|
-
if (!this.cacheDb.isReady()) {
|
|
65
|
-
logger.log('warn', 'CacheDb not ready, skipping cleanup');
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const now = new Date();
|
|
69
|
-
const results = [];
|
|
70
|
-
try {
|
|
71
|
-
const emailsDeleted = await this.cleanExpiredDocuments(CachedEmail, now);
|
|
72
|
-
results.push({ collection: 'CachedEmail', deleted: emailsDeleted });
|
|
73
|
-
const ipReputationDeleted = await this.cleanExpiredDocuments(CachedIPReputation, now);
|
|
74
|
-
results.push({ collection: 'CachedIPReputation', deleted: ipReputationDeleted });
|
|
75
|
-
// Log results
|
|
76
|
-
const totalDeleted = results.reduce((sum, r) => sum + r.deleted, 0);
|
|
77
|
-
if (totalDeleted > 0 || this.options.verbose) {
|
|
78
|
-
const summary = results
|
|
79
|
-
.filter((r) => r.deleted > 0)
|
|
80
|
-
.map((r) => `${r.collection}: ${r.deleted}`)
|
|
81
|
-
.join(', ');
|
|
82
|
-
logger.log('info', `Cache cleanup completed. Deleted ${totalDeleted} expired documents. ${summary || 'No deletions.'}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
logger.log('error', `Cache cleanup error: ${error.message}`);
|
|
87
|
-
throw error;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Clean expired documents from a specific collection using smartdata API
|
|
92
|
-
*/
|
|
93
|
-
async cleanExpiredDocuments(documentClass, now) {
|
|
94
|
-
try {
|
|
95
|
-
// Find all expired documents
|
|
96
|
-
const expiredDocs = await documentClass.getInstances({
|
|
97
|
-
expiresAt: { $lt: now },
|
|
98
|
-
});
|
|
99
|
-
// Delete each expired document
|
|
100
|
-
let deletedCount = 0;
|
|
101
|
-
for (const doc of expiredDocs) {
|
|
102
|
-
try {
|
|
103
|
-
await doc.delete();
|
|
104
|
-
deletedCount++;
|
|
105
|
-
}
|
|
106
|
-
catch (deleteError) {
|
|
107
|
-
logger.log('warn', `Failed to delete expired document: ${deleteError.message}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return deletedCount;
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
logger.log('error', `Error cleaning collection: ${error.message}`);
|
|
114
|
-
return 0;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Check if the cleaner is running
|
|
119
|
-
*/
|
|
120
|
-
isActive() {
|
|
121
|
-
return this.isRunning;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Get the cleanup interval in milliseconds
|
|
125
|
-
*/
|
|
126
|
-
getIntervalMs() {
|
|
127
|
-
return this.options.intervalMs;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZS5jbGVhbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY2FjaGUvY2xhc3Nlcy5jYWNoZS5jbGVhbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9DLHNDQUFzQztBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFZakY7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLGVBQWUsR0FBMEMsSUFBSSxDQUFDO0lBQzlELFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsT0FBTyxDQUFpQztJQUN4QyxPQUFPLENBQVU7SUFFekIsWUFBWSxPQUFnQixFQUFFLFVBQWdDLEVBQUU7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLGlCQUFpQjtZQUNuRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxLQUFLO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLENBQUMsQ0FBQztZQUNuRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLG1DQUFtQztRQUNuQyxJQUFJ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
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
/**
|
|
3
|
-
* Configuration options for CacheDb
|
|
4
|
-
*/
|
|
5
|
-
export interface ICacheDbOptions {
|
|
6
|
-
/** Base storage path for TsmDB data (default: ~/.serve.zone/dcrouter/tsmdb) */
|
|
7
|
-
storagePath?: string;
|
|
8
|
-
/** Database name (default: dcrouter) */
|
|
9
|
-
dbName?: string;
|
|
10
|
-
/** Enable debug logging */
|
|
11
|
-
debug?: boolean;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* CacheDb - Wrapper around LocalSmartDb and smartdata
|
|
15
|
-
*
|
|
16
|
-
* Provides persistent caching using smartdata as the ORM layer
|
|
17
|
-
* and LocalSmartDb as the embedded database engine.
|
|
18
|
-
*/
|
|
19
|
-
export declare class CacheDb {
|
|
20
|
-
private static instance;
|
|
21
|
-
private localSmartDb;
|
|
22
|
-
private smartdataDb;
|
|
23
|
-
private options;
|
|
24
|
-
private isStarted;
|
|
25
|
-
constructor(options?: ICacheDbOptions);
|
|
26
|
-
/**
|
|
27
|
-
* Get or create the singleton instance
|
|
28
|
-
*/
|
|
29
|
-
static getInstance(options?: ICacheDbOptions): CacheDb;
|
|
30
|
-
/**
|
|
31
|
-
* Reset the singleton instance (useful for testing)
|
|
32
|
-
*/
|
|
33
|
-
static resetInstance(): void;
|
|
34
|
-
/**
|
|
35
|
-
* Start the cache database
|
|
36
|
-
* - Initializes LocalSmartDb with file persistence
|
|
37
|
-
* - Connects smartdata to the LocalSmartDb via Unix socket
|
|
38
|
-
*/
|
|
39
|
-
start(): Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Stop the cache database
|
|
42
|
-
*/
|
|
43
|
-
stop(): Promise<void>;
|
|
44
|
-
/**
|
|
45
|
-
* Get the smartdata database instance
|
|
46
|
-
*/
|
|
47
|
-
getDb(): plugins.smartdata.SmartdataDb;
|
|
48
|
-
/**
|
|
49
|
-
* Check if the database is ready
|
|
50
|
-
*/
|
|
51
|
-
isReady(): boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Get the storage path
|
|
54
|
-
*/
|
|
55
|
-
getStoragePath(): string;
|
|
56
|
-
/**
|
|
57
|
-
* Get the database name
|
|
58
|
-
*/
|
|
59
|
-
getDbName(): string;
|
|
60
|
-
}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
import { logger } from '../logger.js';
|
|
3
|
-
import { defaultTsmDbPath } from '../paths.js';
|
|
4
|
-
/**
|
|
5
|
-
* CacheDb - Wrapper around LocalSmartDb and smartdata
|
|
6
|
-
*
|
|
7
|
-
* Provides persistent caching using smartdata as the ORM layer
|
|
8
|
-
* and LocalSmartDb as the embedded database engine.
|
|
9
|
-
*/
|
|
10
|
-
export class CacheDb {
|
|
11
|
-
static instance = null;
|
|
12
|
-
localSmartDb;
|
|
13
|
-
smartdataDb;
|
|
14
|
-
options;
|
|
15
|
-
isStarted = false;
|
|
16
|
-
constructor(options = {}) {
|
|
17
|
-
this.options = {
|
|
18
|
-
storagePath: options.storagePath || defaultTsmDbPath,
|
|
19
|
-
dbName: options.dbName || 'dcrouter',
|
|
20
|
-
debug: options.debug || false,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Get or create the singleton instance
|
|
25
|
-
*/
|
|
26
|
-
static getInstance(options) {
|
|
27
|
-
if (!CacheDb.instance) {
|
|
28
|
-
CacheDb.instance = new CacheDb(options);
|
|
29
|
-
}
|
|
30
|
-
return CacheDb.instance;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Reset the singleton instance (useful for testing)
|
|
34
|
-
*/
|
|
35
|
-
static resetInstance() {
|
|
36
|
-
CacheDb.instance = null;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Start the cache database
|
|
40
|
-
* - Initializes LocalSmartDb with file persistence
|
|
41
|
-
* - Connects smartdata to the LocalSmartDb via Unix socket
|
|
42
|
-
*/
|
|
43
|
-
async start() {
|
|
44
|
-
if (this.isStarted) {
|
|
45
|
-
logger.log('warn', 'CacheDb already started');
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
// Ensure storage directory exists
|
|
50
|
-
await plugins.fsUtils.ensureDir(this.options.storagePath);
|
|
51
|
-
// Create LocalSmartDb instance
|
|
52
|
-
this.localSmartDb = new plugins.smartdb.LocalSmartDb({
|
|
53
|
-
folderPath: this.options.storagePath,
|
|
54
|
-
});
|
|
55
|
-
// Start LocalSmartDb and get connection info
|
|
56
|
-
const connectionInfo = await this.localSmartDb.start();
|
|
57
|
-
if (this.options.debug) {
|
|
58
|
-
logger.log('debug', `LocalSmartDb started with URI: ${connectionInfo.connectionUri}`);
|
|
59
|
-
}
|
|
60
|
-
// Initialize smartdata with the connection URI
|
|
61
|
-
this.smartdataDb = new plugins.smartdata.SmartdataDb({
|
|
62
|
-
mongoDbUrl: connectionInfo.connectionUri,
|
|
63
|
-
mongoDbName: this.options.dbName,
|
|
64
|
-
});
|
|
65
|
-
await this.smartdataDb.init();
|
|
66
|
-
this.isStarted = true;
|
|
67
|
-
logger.log('info', `CacheDb started at ${this.options.storagePath}`);
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
logger.log('error', `Failed to start CacheDb: ${error.message}`);
|
|
71
|
-
throw error;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Stop the cache database
|
|
76
|
-
*/
|
|
77
|
-
async stop() {
|
|
78
|
-
if (!this.isStarted) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
try {
|
|
82
|
-
// Close smartdata connection
|
|
83
|
-
if (this.smartdataDb) {
|
|
84
|
-
await this.smartdataDb.close();
|
|
85
|
-
}
|
|
86
|
-
// Stop LocalSmartDb
|
|
87
|
-
if (this.localSmartDb) {
|
|
88
|
-
await this.localSmartDb.stop();
|
|
89
|
-
}
|
|
90
|
-
this.isStarted = false;
|
|
91
|
-
logger.log('info', 'CacheDb stopped');
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
logger.log('error', `Error stopping CacheDb: ${error.message}`);
|
|
95
|
-
throw error;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Get the smartdata database instance
|
|
100
|
-
*/
|
|
101
|
-
getDb() {
|
|
102
|
-
if (!this.isStarted) {
|
|
103
|
-
throw new Error('CacheDb not started. Call start() first.');
|
|
104
|
-
}
|
|
105
|
-
return this.smartdataDb;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Check if the database is ready
|
|
109
|
-
*/
|
|
110
|
-
isReady() {
|
|
111
|
-
return this.isStarted;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Get the storage path
|
|
115
|
-
*/
|
|
116
|
-
getStoragePath() {
|
|
117
|
-
return this.options.storagePath;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Get the database name
|
|
121
|
-
*/
|
|
122
|
-
getDbName() {
|
|
123
|
-
return this.options.dbName;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZWRiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY2FjaGUvY2xhc3Nlcy5jYWNoZWRiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBYy9DOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFDVixNQUFNLENBQUMsUUFBUSxHQUFtQixJQUFJLENBQUM7SUFFdkMsWUFBWSxDQUFnQztJQUM1QyxXQUFXLENBQWlDO0lBQzVDLE9BQU8sQ0FBNEI7SUFDbkMsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUVuQyxZQUFZLFVBQTJCLEVBQUU7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLGdCQUFnQjtZQUNwRCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxVQUFVO1lBQ3BDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUs7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBeUI7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGFBQWE7UUFDekIsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixJ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
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * from './classes.cached.email.js';
|
|
2
|
-
export * from './classes.cached.ip.reputation.js';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9jYWNoZS9kb2N1bWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLG1DQUFtQyxDQUFDIn0=
|
package/dist_ts/cache/index.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// Core cache infrastructure
|
|
2
|
-
export * from './classes.cachedb.js';
|
|
3
|
-
export * from './classes.cached.document.js';
|
|
4
|
-
export * from './classes.cache.cleaner.js';
|
|
5
|
-
// Document classes
|
|
6
|
-
export * from './documents/index.js';
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jYWNoZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsNEJBQTRCLENBQUM7QUFFM0MsbUJBQW1CO0FBQ25CLGNBQWMsc0JBQXNCLENBQUMifQ==
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Storage configuration interface
|
|
3
|
-
*/
|
|
4
|
-
export interface IStorageConfig {
|
|
5
|
-
/** Filesystem path for storage */
|
|
6
|
-
fsPath?: string;
|
|
7
|
-
/** Custom read function */
|
|
8
|
-
readFunction?: (key: string) => Promise<string | null>;
|
|
9
|
-
/** Custom write function */
|
|
10
|
-
writeFunction?: (key: string, value: string) => Promise<void>;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Storage backend type
|
|
14
|
-
*/
|
|
15
|
-
export type StorageBackend = 'filesystem' | 'custom' | 'memory';
|
|
16
|
-
/**
|
|
17
|
-
* Central storage manager for DcRouter
|
|
18
|
-
* Provides unified key-value storage with multiple backend support
|
|
19
|
-
*/
|
|
20
|
-
export declare class StorageManager {
|
|
21
|
-
private static readonly MAX_MEMORY_ENTRIES;
|
|
22
|
-
private backend;
|
|
23
|
-
private memoryStore;
|
|
24
|
-
private config;
|
|
25
|
-
private fsBasePath?;
|
|
26
|
-
constructor(config?: IStorageConfig);
|
|
27
|
-
/**
|
|
28
|
-
* Show warning when using memory backend
|
|
29
|
-
*/
|
|
30
|
-
private showMemoryWarning;
|
|
31
|
-
/**
|
|
32
|
-
* Ensure directory exists for filesystem backend
|
|
33
|
-
*/
|
|
34
|
-
private ensureDirectory;
|
|
35
|
-
/**
|
|
36
|
-
* Validate and sanitize storage key
|
|
37
|
-
*/
|
|
38
|
-
private validateKey;
|
|
39
|
-
/**
|
|
40
|
-
* Convert key to filesystem path
|
|
41
|
-
*/
|
|
42
|
-
private keyToPath;
|
|
43
|
-
/**
|
|
44
|
-
* Internal filesystem read function
|
|
45
|
-
*/
|
|
46
|
-
private fsRead;
|
|
47
|
-
/**
|
|
48
|
-
* Internal filesystem write function
|
|
49
|
-
*/
|
|
50
|
-
private fsWrite;
|
|
51
|
-
/**
|
|
52
|
-
* Get value by key
|
|
53
|
-
*/
|
|
54
|
-
get(key: string): Promise<string | null>;
|
|
55
|
-
/**
|
|
56
|
-
* Set value by key
|
|
57
|
-
*/
|
|
58
|
-
set(key: string, value: string): Promise<void>;
|
|
59
|
-
/**
|
|
60
|
-
* Delete value by key
|
|
61
|
-
*/
|
|
62
|
-
delete(key: string): Promise<void>;
|
|
63
|
-
/**
|
|
64
|
-
* List keys by prefix
|
|
65
|
-
*/
|
|
66
|
-
list(prefix?: string): Promise<string[]>;
|
|
67
|
-
/**
|
|
68
|
-
* Check if key exists
|
|
69
|
-
*/
|
|
70
|
-
exists(key: string): Promise<boolean>;
|
|
71
|
-
/**
|
|
72
|
-
* Get storage backend type
|
|
73
|
-
*/
|
|
74
|
-
getBackend(): StorageBackend;
|
|
75
|
-
/**
|
|
76
|
-
* JSON helper: Get and parse JSON value
|
|
77
|
-
*/
|
|
78
|
-
getJSON<T = any>(key: string): Promise<T | null>;
|
|
79
|
-
/**
|
|
80
|
-
* JSON helper: Set value as JSON
|
|
81
|
-
*/
|
|
82
|
-
setJSON(key: string, value: any): Promise<void>;
|
|
83
|
-
}
|