@serve.zone/dcrouter 11.0.36 → 11.0.38
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_web/00_commitinfo_data.js +1 -1
- package/package.json +2 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/dist_ts/00_commitinfo_data.d.ts +0 -8
- package/dist_ts/00_commitinfo_data.js +0 -9
- package/dist_ts/cache/classes.cached.document.d.ts +0 -76
- package/dist_ts/cache/classes.cached.document.js +0 -100
- package/dist_ts/cache/classes.cachedb.d.ts +0 -60
- package/dist_ts/cache/classes.cachedb.js +0 -126
- package/dist_ts/logger.d.ts +0 -21
- package/dist_ts/logger.js +0 -81
- package/dist_ts/paths.d.ts +0 -26
- package/dist_ts/paths.js +0 -45
- package/dist_ts/plugins.d.ts +0 -79
- package/dist_ts/plugins.js +0 -113
package/dist_serve/bundle.js
CHANGED
|
@@ -39328,4 +39328,4 @@ ibantools/jsnext/ibantools.js:
|
|
|
39328
39328
|
* @preferred
|
|
39329
39329
|
*)
|
|
39330
39330
|
*/
|
|
39331
|
-
//# sourceMappingURL=bundle-
|
|
39331
|
+
//# sourceMappingURL=bundle-1772723500635.js.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/dcrouter',
|
|
6
|
-
version: '11.0.
|
|
6
|
+
version: '11.0.38',
|
|
7
7
|
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFdBQVcsRUFBRSwwRUFBMEU7Q0FDeEYsQ0FBQSJ9
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serve.zone/dcrouter",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "11.0.
|
|
4
|
+
"version": "11.0.38",
|
|
5
5
|
"description": "A multifaceted routing service handling mail and SMS delivery functions.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"watch": "tswatch"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@git.zone/tsbuild": "^4.1.
|
|
22
|
+
"@git.zone/tsbuild": "^4.1.24",
|
|
23
23
|
"@git.zone/tsbundle": "^2.9.0",
|
|
24
24
|
"@git.zone/tsrun": "^2.0.1",
|
|
25
25
|
"@git.zone/tstest": "^3.2.0",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* autocreated commitinfo by @push.rocks/commitinfo
|
|
3
|
-
*/
|
|
4
|
-
export const commitinfo = {
|
|
5
|
-
name: '@serve.zone/dcrouter',
|
|
6
|
-
version: '11.0.36',
|
|
7
|
-
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
/**
|
|
3
|
-
* Base class for all cached documents with TTL support
|
|
4
|
-
*
|
|
5
|
-
* Extends smartdata's SmartDataDbDoc to add:
|
|
6
|
-
* - Automatic timestamps (createdAt, lastAccessedAt)
|
|
7
|
-
* - TTL/expiration support (expiresAt)
|
|
8
|
-
* - Helper methods for TTL management
|
|
9
|
-
*
|
|
10
|
-
* NOTE: Subclasses MUST add @svDb() decorators to createdAt, expiresAt, and lastAccessedAt
|
|
11
|
-
* since decorators on abstract classes don't propagate correctly.
|
|
12
|
-
*/
|
|
13
|
-
export declare abstract class CachedDocument<T extends CachedDocument<T>> extends plugins.smartdata.SmartDataDbDoc<T, T> {
|
|
14
|
-
/**
|
|
15
|
-
* Timestamp when the document was created
|
|
16
|
-
* NOTE: Subclasses must add @svDb() decorator
|
|
17
|
-
*/
|
|
18
|
-
createdAt: Date;
|
|
19
|
-
/**
|
|
20
|
-
* Timestamp when the document expires and should be cleaned up
|
|
21
|
-
* NOTE: Subclasses must add @svDb() decorator
|
|
22
|
-
*/
|
|
23
|
-
expiresAt: Date;
|
|
24
|
-
/**
|
|
25
|
-
* Timestamp of last access (for LRU-style eviction if needed)
|
|
26
|
-
* NOTE: Subclasses must add @svDb() decorator
|
|
27
|
-
*/
|
|
28
|
-
lastAccessedAt: Date;
|
|
29
|
-
/**
|
|
30
|
-
* Set the TTL (time to live) for this document
|
|
31
|
-
* @param ttlMs Time to live in milliseconds
|
|
32
|
-
*/
|
|
33
|
-
setTTL(ttlMs: number): void;
|
|
34
|
-
/**
|
|
35
|
-
* Set TTL using days
|
|
36
|
-
* @param days Number of days until expiration
|
|
37
|
-
*/
|
|
38
|
-
setTTLDays(days: number): void;
|
|
39
|
-
/**
|
|
40
|
-
* Set TTL using hours
|
|
41
|
-
* @param hours Number of hours until expiration
|
|
42
|
-
*/
|
|
43
|
-
setTTLHours(hours: number): void;
|
|
44
|
-
/**
|
|
45
|
-
* Check if this document has expired
|
|
46
|
-
*/
|
|
47
|
-
isExpired(): boolean;
|
|
48
|
-
/**
|
|
49
|
-
* Update the lastAccessedAt timestamp
|
|
50
|
-
*/
|
|
51
|
-
touch(): void;
|
|
52
|
-
/**
|
|
53
|
-
* Get remaining TTL in milliseconds
|
|
54
|
-
* Returns 0 if expired, -1 if no expiration set
|
|
55
|
-
*/
|
|
56
|
-
getRemainingTTL(): number;
|
|
57
|
-
/**
|
|
58
|
-
* Extend the TTL by the specified milliseconds from now
|
|
59
|
-
* @param ttlMs Additional time to live in milliseconds
|
|
60
|
-
*/
|
|
61
|
-
extendTTL(ttlMs: number): void;
|
|
62
|
-
/**
|
|
63
|
-
* Set the document to never expire (100 years in the future)
|
|
64
|
-
*/
|
|
65
|
-
setNeverExpires(): void;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* TTL constants in milliseconds
|
|
69
|
-
*/
|
|
70
|
-
export declare const TTL: {
|
|
71
|
-
readonly HOURS_1: number;
|
|
72
|
-
readonly HOURS_24: number;
|
|
73
|
-
readonly DAYS_7: number;
|
|
74
|
-
readonly DAYS_30: number;
|
|
75
|
-
readonly DAYS_90: number;
|
|
76
|
-
};
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
/**
|
|
3
|
-
* Base class for all cached documents with TTL support
|
|
4
|
-
*
|
|
5
|
-
* Extends smartdata's SmartDataDbDoc to add:
|
|
6
|
-
* - Automatic timestamps (createdAt, lastAccessedAt)
|
|
7
|
-
* - TTL/expiration support (expiresAt)
|
|
8
|
-
* - Helper methods for TTL management
|
|
9
|
-
*
|
|
10
|
-
* NOTE: Subclasses MUST add @svDb() decorators to createdAt, expiresAt, and lastAccessedAt
|
|
11
|
-
* since decorators on abstract classes don't propagate correctly.
|
|
12
|
-
*/
|
|
13
|
-
export class CachedDocument extends plugins.smartdata.SmartDataDbDoc {
|
|
14
|
-
/**
|
|
15
|
-
* Timestamp when the document was created
|
|
16
|
-
* NOTE: Subclasses must add @svDb() decorator
|
|
17
|
-
*/
|
|
18
|
-
createdAt = new Date();
|
|
19
|
-
/**
|
|
20
|
-
* Timestamp when the document expires and should be cleaned up
|
|
21
|
-
* NOTE: Subclasses must add @svDb() decorator
|
|
22
|
-
*/
|
|
23
|
-
expiresAt;
|
|
24
|
-
/**
|
|
25
|
-
* Timestamp of last access (for LRU-style eviction if needed)
|
|
26
|
-
* NOTE: Subclasses must add @svDb() decorator
|
|
27
|
-
*/
|
|
28
|
-
lastAccessedAt = new Date();
|
|
29
|
-
/**
|
|
30
|
-
* Set the TTL (time to live) for this document
|
|
31
|
-
* @param ttlMs Time to live in milliseconds
|
|
32
|
-
*/
|
|
33
|
-
setTTL(ttlMs) {
|
|
34
|
-
this.expiresAt = new Date(Date.now() + ttlMs);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Set TTL using days
|
|
38
|
-
* @param days Number of days until expiration
|
|
39
|
-
*/
|
|
40
|
-
setTTLDays(days) {
|
|
41
|
-
this.setTTL(days * 24 * 60 * 60 * 1000);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Set TTL using hours
|
|
45
|
-
* @param hours Number of hours until expiration
|
|
46
|
-
*/
|
|
47
|
-
setTTLHours(hours) {
|
|
48
|
-
this.setTTL(hours * 60 * 60 * 1000);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Check if this document has expired
|
|
52
|
-
*/
|
|
53
|
-
isExpired() {
|
|
54
|
-
if (!this.expiresAt) {
|
|
55
|
-
return false; // No expiration set
|
|
56
|
-
}
|
|
57
|
-
return new Date() > this.expiresAt;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Update the lastAccessedAt timestamp
|
|
61
|
-
*/
|
|
62
|
-
touch() {
|
|
63
|
-
this.lastAccessedAt = new Date();
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Get remaining TTL in milliseconds
|
|
67
|
-
* Returns 0 if expired, -1 if no expiration set
|
|
68
|
-
*/
|
|
69
|
-
getRemainingTTL() {
|
|
70
|
-
if (!this.expiresAt) {
|
|
71
|
-
return -1;
|
|
72
|
-
}
|
|
73
|
-
const remaining = this.expiresAt.getTime() - Date.now();
|
|
74
|
-
return remaining > 0 ? remaining : 0;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Extend the TTL by the specified milliseconds from now
|
|
78
|
-
* @param ttlMs Additional time to live in milliseconds
|
|
79
|
-
*/
|
|
80
|
-
extendTTL(ttlMs) {
|
|
81
|
-
this.expiresAt = new Date(Date.now() + ttlMs);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Set the document to never expire (100 years in the future)
|
|
85
|
-
*/
|
|
86
|
-
setNeverExpires() {
|
|
87
|
-
this.expiresAt = new Date(Date.now() + 100 * 365 * 24 * 60 * 60 * 1000);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* TTL constants in milliseconds
|
|
92
|
-
*/
|
|
93
|
-
export const TTL = {
|
|
94
|
-
HOURS_1: 1 * 60 * 60 * 1000,
|
|
95
|
-
HOURS_24: 24 * 60 * 60 * 1000,
|
|
96
|
-
DAYS_7: 7 * 24 * 60 * 60 * 1000,
|
|
97
|
-
DAYS_30: 30 * 24 * 60 * 60 * 1000,
|
|
98
|
-
DAYS_90: 90 * 24 * 60 * 60 * 1000,
|
|
99
|
-
};
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZWQuZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jYWNoZS9jbGFzc2VzLmNhY2hlZC5kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFnQixjQUE0QyxTQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBb0I7SUFDOUc7OztPQUdHO0lBQ0ksU0FBUyxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFFcEM7OztPQUdHO0lBQ0ksU0FBUyxDQUFPO0lBRXZCOzs7T0FHRztJQUNJLGNBQWMsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBRXpDOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixPQUFPLEtBQUssQ0FBQyxDQUFDLG9CQUFvQjtRQUNwQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZUFBZTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEQsT0FBTyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksU0FBUyxDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHO0lBQ2pCLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQzNCLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQzdCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUMvQixPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDakMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0NBQ3pCLENBQUMifQ==
|
|
@@ -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 LocalTsmDb and smartdata
|
|
15
|
-
*
|
|
16
|
-
* Provides persistent caching using smartdata as the ORM layer
|
|
17
|
-
* and LocalTsmDb as the embedded database engine.
|
|
18
|
-
*/
|
|
19
|
-
export declare class CacheDb {
|
|
20
|
-
private static instance;
|
|
21
|
-
private localTsmDb;
|
|
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 LocalTsmDb with file persistence
|
|
37
|
-
* - Connects smartdata to the LocalTsmDb 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 LocalTsmDb and smartdata
|
|
6
|
-
*
|
|
7
|
-
* Provides persistent caching using smartdata as the ORM layer
|
|
8
|
-
* and LocalTsmDb as the embedded database engine.
|
|
9
|
-
*/
|
|
10
|
-
export class CacheDb {
|
|
11
|
-
static instance = null;
|
|
12
|
-
localTsmDb;
|
|
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 LocalTsmDb with file persistence
|
|
41
|
-
* - Connects smartdata to the LocalTsmDb 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 LocalTsmDb instance
|
|
52
|
-
this.localTsmDb = new plugins.smartmongo.LocalTsmDb({
|
|
53
|
-
folderPath: this.options.storagePath,
|
|
54
|
-
});
|
|
55
|
-
// Start LocalTsmDb and get connection info
|
|
56
|
-
const connectionInfo = await this.localTsmDb.start();
|
|
57
|
-
if (this.options.debug) {
|
|
58
|
-
logger.log('debug', `LocalTsmDb 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 LocalTsmDb
|
|
87
|
-
if (this.localTsmDb) {
|
|
88
|
-
await this.localTsmDb.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZWRiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY2FjaGUvY2xhc3Nlcy5jYWNoZWRiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBYy9DOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFDVixNQUFNLENBQUMsUUFBUSxHQUFtQixJQUFJLENBQUM7SUFFdkMsVUFBVSxDQUFnQztJQUMxQyxXQUFXLENBQWdDO0lBQzNDLE9BQU8sQ0FBNEI7SUFDbkMsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUVuQyxZQUFZLFVBQTJCLEVBQUU7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLGdCQUFnQjtZQUNwRCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxVQUFVO1lBQ3BDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUs7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBeUI7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGFBQWE7UUFDekIsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixJ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
|
package/dist_ts/logger.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
import { SmartlogDestinationBuffer } from '@push.rocks/smartlog/destination-buffer';
|
|
3
|
-
export declare const logBuffer: SmartlogDestinationBuffer;
|
|
4
|
-
export declare const baseLogger: plugins.smartlog.Smartlog;
|
|
5
|
-
declare class StandardLogger {
|
|
6
|
-
private defaultContext;
|
|
7
|
-
private correlationId;
|
|
8
|
-
constructor();
|
|
9
|
-
log(level: 'error' | 'warn' | 'info' | 'success' | 'debug', message: string, context?: Record<string, any>): void;
|
|
10
|
-
error(message: string, context?: Record<string, any>): void;
|
|
11
|
-
warn(message: string, context?: Record<string, any>): void;
|
|
12
|
-
info(message: string, context?: Record<string, any>): void;
|
|
13
|
-
success(message: string, context?: Record<string, any>): void;
|
|
14
|
-
debug(message: string, context?: Record<string, any>): void;
|
|
15
|
-
setContext(context: Record<string, any>, overwrite?: boolean): void;
|
|
16
|
-
setCorrelationId(id?: string | null): string;
|
|
17
|
-
getCorrelationId(): string | null;
|
|
18
|
-
clearCorrelationId(): void;
|
|
19
|
-
}
|
|
20
|
-
export declare const logger: StandardLogger;
|
|
21
|
-
export {};
|
package/dist_ts/logger.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
import { randomUUID } from 'node:crypto';
|
|
3
|
-
import { SmartlogDestinationBuffer } from '@push.rocks/smartlog/destination-buffer';
|
|
4
|
-
// Map NODE_ENV to valid TEnvironment
|
|
5
|
-
const nodeEnv = process.env.NODE_ENV || 'production';
|
|
6
|
-
const envMap = {
|
|
7
|
-
'development': 'local',
|
|
8
|
-
'test': 'test',
|
|
9
|
-
'staging': 'staging',
|
|
10
|
-
'production': 'production'
|
|
11
|
-
};
|
|
12
|
-
// In-memory log buffer for the OpsServer UI
|
|
13
|
-
export const logBuffer = new SmartlogDestinationBuffer({ maxEntries: 2000 });
|
|
14
|
-
// Default Smartlog instance (exported so OpsServer can add push destinations)
|
|
15
|
-
export const baseLogger = new plugins.smartlog.Smartlog({
|
|
16
|
-
logContext: {
|
|
17
|
-
environment: envMap[nodeEnv] || 'production',
|
|
18
|
-
runtime: 'node',
|
|
19
|
-
zone: 'serve.zone',
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
// Wire the buffer destination so all logs are captured
|
|
23
|
-
baseLogger.addLogDestination(logBuffer);
|
|
24
|
-
// Extended logger compatible with the original enhanced logger API
|
|
25
|
-
class StandardLogger {
|
|
26
|
-
defaultContext = {};
|
|
27
|
-
correlationId = null;
|
|
28
|
-
constructor() { }
|
|
29
|
-
// Log methods
|
|
30
|
-
log(level, message, context = {}) {
|
|
31
|
-
const combinedContext = {
|
|
32
|
-
...this.defaultContext,
|
|
33
|
-
...context
|
|
34
|
-
};
|
|
35
|
-
if (this.correlationId) {
|
|
36
|
-
combinedContext.correlation_id = this.correlationId;
|
|
37
|
-
}
|
|
38
|
-
baseLogger.log(level, message, combinedContext);
|
|
39
|
-
}
|
|
40
|
-
error(message, context = {}) {
|
|
41
|
-
this.log('error', message, context);
|
|
42
|
-
}
|
|
43
|
-
warn(message, context = {}) {
|
|
44
|
-
this.log('warn', message, context);
|
|
45
|
-
}
|
|
46
|
-
info(message, context = {}) {
|
|
47
|
-
this.log('info', message, context);
|
|
48
|
-
}
|
|
49
|
-
success(message, context = {}) {
|
|
50
|
-
this.log('success', message, context);
|
|
51
|
-
}
|
|
52
|
-
debug(message, context = {}) {
|
|
53
|
-
this.log('debug', message, context);
|
|
54
|
-
}
|
|
55
|
-
// Context management
|
|
56
|
-
setContext(context, overwrite = false) {
|
|
57
|
-
if (overwrite) {
|
|
58
|
-
this.defaultContext = context;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
this.defaultContext = {
|
|
62
|
-
...this.defaultContext,
|
|
63
|
-
...context
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
// Correlation ID management
|
|
68
|
-
setCorrelationId(id = null) {
|
|
69
|
-
this.correlationId = id || randomUUID();
|
|
70
|
-
return this.correlationId;
|
|
71
|
-
}
|
|
72
|
-
getCorrelationId() {
|
|
73
|
-
return this.correlationId;
|
|
74
|
-
}
|
|
75
|
-
clearCorrelationId() {
|
|
76
|
-
this.correlationId = null;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// Export a singleton instance
|
|
80
|
-
export const logger = new StandardLogger();
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFcEYscUNBQXFDO0FBQ3JDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQztBQUNyRCxNQUFNLE1BQU0sR0FBZ0U7SUFDMUUsYUFBYSxFQUFFLE9BQU87SUFDdEIsTUFBTSxFQUFFLE1BQU07SUFDZCxTQUFTLEVBQUUsU0FBUztJQUNwQixZQUFZLEVBQUUsWUFBWTtDQUMzQixDQUFDO0FBRUYsNENBQTRDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLHlCQUF5QixDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFFN0UsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQ3RELFVBQVUsRUFBRTtRQUNWLFdBQVcsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksWUFBWTtRQUM1QyxPQUFPLEVBQUUsTUFBTTtRQUNmLElBQUksRUFBRSxZQUFZO0tBQ25CO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsdURBQXVEO0FBQ3ZELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV4QyxtRUFBbUU7QUFDbkUsTUFBTSxjQUFjO0lBQ1YsY0FBYyxHQUF3QixFQUFFLENBQUM7SUFDekMsYUFBYSxHQUFrQixJQUFJLENBQUM7SUFFNUMsZ0JBQWUsQ0FBQztJQUVoQixjQUFjO0lBQ1AsR0FBRyxDQUFDLEtBQXNELEVBQUUsT0FBZSxFQUFFLFVBQStCLEVBQUU7UUFDbkgsTUFBTSxlQUFlLEdBQUc7WUFDdEIsR0FBRyxJQUFJLENBQUMsY0FBYztZQUN0QixHQUFHLE9BQU87U0FDWCxDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsZUFBZSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RELENBQUM7UUFFRCxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFlLEVBQUUsVUFBK0IsRUFBRTtRQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFlLEVBQUUsVUFBK0IsRUFBRTtRQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFlLEVBQUUsVUFBK0IsRUFBRTtRQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUFlLEVBQUUsVUFBK0IsRUFBRTtRQUMvRCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFlLEVBQUUsVUFBK0IsRUFBRTtRQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELHFCQUFxQjtJQUNkLFVBQVUsQ0FBQyxPQUE0QixFQUFFLFlBQXFCLEtBQUs7UUFDeEUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQ2hDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGNBQWMsR0FBRztnQkFDcEIsR0FBRyxJQUFJLENBQUMsY0FBYztnQkFDdEIsR0FBRyxPQUFPO2FBQ1gsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsNEJBQTRCO0lBQ3JCLGdCQUFnQixDQUFDLEtBQW9CLElBQUk7UUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLElBQUksVUFBVSxFQUFFLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBRUQsOEJBQThCO0FBQzlCLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDIn0=
|
package/dist_ts/paths.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export declare const packageDir: string;
|
|
2
|
-
export declare const distServe: string;
|
|
3
|
-
export declare const dcrouterHomeDir: string;
|
|
4
|
-
export declare const dataDir: string;
|
|
5
|
-
export declare const defaultTsmDbPath: string;
|
|
6
|
-
export declare const dnsRecordsDir: string;
|
|
7
|
-
/**
|
|
8
|
-
* Resolve all data paths from a given baseDir.
|
|
9
|
-
* When no baseDir is provided, falls back to ~/.serve.zone/dcrouter.
|
|
10
|
-
* Specific overrides (e.g. DATA_DIR env) take precedence.
|
|
11
|
-
*/
|
|
12
|
-
export declare function resolvePaths(baseDir?: string): {
|
|
13
|
-
dcrouterHomeDir: string;
|
|
14
|
-
dataDir: string;
|
|
15
|
-
defaultTsmDbPath: string;
|
|
16
|
-
defaultStoragePath: string;
|
|
17
|
-
dnsRecordsDir: string;
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Ensure only the data directories that are actually used exist.
|
|
21
|
-
*/
|
|
22
|
-
export declare function ensureDataDirectories(resolvedPaths: ReturnType<typeof resolvePaths>): void;
|
|
23
|
-
/**
|
|
24
|
-
* Legacy wrapper — delegates to ensureDataDirectories with module-level defaults.
|
|
25
|
-
*/
|
|
26
|
-
export declare function ensureDirectories(): void;
|
package/dist_ts/paths.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
// Code/asset paths (not affected by baseDir)
|
|
3
|
-
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
|
4
|
-
export const distServe = plugins.path.join(packageDir, './dist_serve');
|
|
5
|
-
// Default base for all dcrouter data (always user-writable)
|
|
6
|
-
export const dcrouterHomeDir = plugins.path.join(plugins.os.homedir(), '.serve.zone', 'dcrouter');
|
|
7
|
-
// Configure data directory with environment variable or default to ~/.serve.zone/dcrouter/data
|
|
8
|
-
const DEFAULT_DATA_PATH = plugins.path.join(dcrouterHomeDir, 'data');
|
|
9
|
-
export const dataDir = process.env.DATA_DIR
|
|
10
|
-
? process.env.DATA_DIR
|
|
11
|
-
: DEFAULT_DATA_PATH;
|
|
12
|
-
// Default TsmDB path for CacheDb
|
|
13
|
-
export const defaultTsmDbPath = plugins.path.join(dcrouterHomeDir, 'tsmdb');
|
|
14
|
-
// DNS records directory (only surviving MTA directory reference)
|
|
15
|
-
export const dnsRecordsDir = plugins.path.join(dataDir, 'dns');
|
|
16
|
-
/**
|
|
17
|
-
* Resolve all data paths from a given baseDir.
|
|
18
|
-
* When no baseDir is provided, falls back to ~/.serve.zone/dcrouter.
|
|
19
|
-
* Specific overrides (e.g. DATA_DIR env) take precedence.
|
|
20
|
-
*/
|
|
21
|
-
export function resolvePaths(baseDir) {
|
|
22
|
-
const root = baseDir ?? plugins.path.join(plugins.os.homedir(), '.serve.zone', 'dcrouter');
|
|
23
|
-
const resolvedDataDir = process.env.DATA_DIR ?? plugins.path.join(root, 'data');
|
|
24
|
-
return {
|
|
25
|
-
dcrouterHomeDir: root,
|
|
26
|
-
dataDir: resolvedDataDir,
|
|
27
|
-
defaultTsmDbPath: plugins.path.join(root, 'tsmdb'),
|
|
28
|
-
defaultStoragePath: plugins.path.join(root, 'storage'),
|
|
29
|
-
dnsRecordsDir: plugins.path.join(resolvedDataDir, 'dns'),
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Ensure only the data directories that are actually used exist.
|
|
34
|
-
*/
|
|
35
|
-
export function ensureDataDirectories(resolvedPaths) {
|
|
36
|
-
plugins.fsUtils.ensureDirSync(resolvedPaths.dataDir);
|
|
37
|
-
plugins.fsUtils.ensureDirSync(resolvedPaths.dnsRecordsDir);
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Legacy wrapper — delegates to ensureDataDirectories with module-level defaults.
|
|
41
|
-
*/
|
|
42
|
-
export function ensureDirectories() {
|
|
43
|
-
ensureDataDirectories(resolvePaths());
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qyw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN6QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUMvRCxLQUFLLENBQ04sQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFFdkUsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUVsRywrRkFBK0Y7QUFDL0YsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDckUsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtJQUN6QyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO0lBQ3RCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUV0QixpQ0FBaUM7QUFDakMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRTVFLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRS9EOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE9BQWdCO0lBQzNDLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEYsT0FBTztRQUNMLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7UUFDbEQsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztRQUN0RCxhQUFhLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQztLQUN6RCxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLGFBQThDO0lBQ2xGLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUMifQ==
|
package/dist_ts/plugins.d.ts
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import * as dns from 'dns';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as crypto from 'crypto';
|
|
4
|
-
import * as http from 'http';
|
|
5
|
-
import * as net from 'net';
|
|
6
|
-
import * as os from 'os';
|
|
7
|
-
import * as path from 'path';
|
|
8
|
-
import * as tls from 'tls';
|
|
9
|
-
import * as util from 'util';
|
|
10
|
-
export { dns, fs, crypto, http, net, os, path, tls, util, };
|
|
11
|
-
import * as servezoneInterfaces from '@serve.zone/interfaces';
|
|
12
|
-
import * as remoteingress from '@serve.zone/remoteingress';
|
|
13
|
-
export { servezoneInterfaces, remoteingress, };
|
|
14
|
-
import * as typedrequest from '@api.global/typedrequest';
|
|
15
|
-
import * as typedserver from '@api.global/typedserver';
|
|
16
|
-
import * as typedsocket from '@api.global/typedsocket';
|
|
17
|
-
export { typedrequest, typedserver, typedsocket, };
|
|
18
|
-
import * as projectinfo from '@push.rocks/projectinfo';
|
|
19
|
-
import * as qenv from '@push.rocks/qenv';
|
|
20
|
-
import * as smartacme from '@push.rocks/smartacme';
|
|
21
|
-
import * as smartdata from '@push.rocks/smartdata';
|
|
22
|
-
import * as smartdns from '@push.rocks/smartdns';
|
|
23
|
-
import * as smartfile from '@push.rocks/smartfile';
|
|
24
|
-
import * as smartguard from '@push.rocks/smartguard';
|
|
25
|
-
import * as smartjwt from '@push.rocks/smartjwt';
|
|
26
|
-
import * as smartlog from '@push.rocks/smartlog';
|
|
27
|
-
import * as smartmetrics from '@push.rocks/smartmetrics';
|
|
28
|
-
import * as smartmta from '@push.rocks/smartmta';
|
|
29
|
-
import * as smartmongo from '@push.rocks/smartmongo';
|
|
30
|
-
import * as smartnetwork from '@push.rocks/smartnetwork';
|
|
31
|
-
import * as smartpath from '@push.rocks/smartpath';
|
|
32
|
-
import * as smartproxy from '@push.rocks/smartproxy';
|
|
33
|
-
import * as smartpromise from '@push.rocks/smartpromise';
|
|
34
|
-
import * as smartradius from '@push.rocks/smartradius';
|
|
35
|
-
import * as smartrequest from '@push.rocks/smartrequest';
|
|
36
|
-
import * as smartrx from '@push.rocks/smartrx';
|
|
37
|
-
import * as smartunique from '@push.rocks/smartunique';
|
|
38
|
-
export { projectinfo, qenv, smartacme, smartdata, smartdns, smartfile, smartguard, smartjwt, smartlog, smartmetrics, smartmongo, smartmta, smartnetwork, smartpath, smartproxy, smartpromise, smartradius, smartrequest, smartrx, smartunique };
|
|
39
|
-
export type TLogLevel = 'error' | 'warn' | 'info' | 'success' | 'debug';
|
|
40
|
-
import * as cloudflare from '@apiclient.xyz/cloudflare';
|
|
41
|
-
export { cloudflare, };
|
|
42
|
-
import * as tsclass from '@tsclass/tsclass';
|
|
43
|
-
export { tsclass, };
|
|
44
|
-
import * as uuid from 'uuid';
|
|
45
|
-
export { uuid, };
|
|
46
|
-
export declare const fsUtils: {
|
|
47
|
-
/**
|
|
48
|
-
* Ensure a directory exists, creating it recursively if needed (sync)
|
|
49
|
-
*/
|
|
50
|
-
ensureDirSync: (dirPath: string) => void;
|
|
51
|
-
/**
|
|
52
|
-
* Ensure a directory exists, creating it recursively if needed (async)
|
|
53
|
-
*/
|
|
54
|
-
ensureDir: (dirPath: string) => Promise<void>;
|
|
55
|
-
/**
|
|
56
|
-
* Write JSON content to a file synchronously
|
|
57
|
-
*/
|
|
58
|
-
toFsSync: (content: any, filePath: string) => void;
|
|
59
|
-
/**
|
|
60
|
-
* Write JSON content to a file asynchronously
|
|
61
|
-
*/
|
|
62
|
-
toFs: (content: any, filePath: string) => Promise<void>;
|
|
63
|
-
/**
|
|
64
|
-
* Check if a file or directory exists
|
|
65
|
-
*/
|
|
66
|
-
fileExistsSync: (filePath: string) => boolean;
|
|
67
|
-
/**
|
|
68
|
-
* Check if a file or directory exists (async)
|
|
69
|
-
*/
|
|
70
|
-
fileExists: (filePath: string) => Promise<boolean>;
|
|
71
|
-
/**
|
|
72
|
-
* Read a JSON file synchronously
|
|
73
|
-
*/
|
|
74
|
-
toObjectSync: <T = any>(filePath: string) => T;
|
|
75
|
-
/**
|
|
76
|
-
* Read a JSON file asynchronously
|
|
77
|
-
*/
|
|
78
|
-
toObject: <T = any>(filePath: string) => Promise<T>;
|
|
79
|
-
};
|
package/dist_ts/plugins.js
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
// node native
|
|
2
|
-
import * as dns from 'dns';
|
|
3
|
-
import * as fs from 'fs';
|
|
4
|
-
import * as crypto from 'crypto';
|
|
5
|
-
import * as http from 'http';
|
|
6
|
-
import * as net from 'net';
|
|
7
|
-
import * as os from 'os';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
import * as tls from 'tls';
|
|
10
|
-
import * as util from 'util';
|
|
11
|
-
export { dns, fs, crypto, http, net, os, path, tls, util, };
|
|
12
|
-
// @serve.zone scope
|
|
13
|
-
import * as servezoneInterfaces from '@serve.zone/interfaces';
|
|
14
|
-
import * as remoteingress from '@serve.zone/remoteingress';
|
|
15
|
-
export { servezoneInterfaces, remoteingress, };
|
|
16
|
-
// @api.global scope
|
|
17
|
-
import * as typedrequest from '@api.global/typedrequest';
|
|
18
|
-
import * as typedserver from '@api.global/typedserver';
|
|
19
|
-
import * as typedsocket from '@api.global/typedsocket';
|
|
20
|
-
export { typedrequest, typedserver, typedsocket, };
|
|
21
|
-
// @push.rocks scope
|
|
22
|
-
import * as projectinfo from '@push.rocks/projectinfo';
|
|
23
|
-
import * as qenv from '@push.rocks/qenv';
|
|
24
|
-
import * as smartacme from '@push.rocks/smartacme';
|
|
25
|
-
import * as smartdata from '@push.rocks/smartdata';
|
|
26
|
-
import * as smartdns from '@push.rocks/smartdns';
|
|
27
|
-
import * as smartfile from '@push.rocks/smartfile';
|
|
28
|
-
import * as smartguard from '@push.rocks/smartguard';
|
|
29
|
-
import * as smartjwt from '@push.rocks/smartjwt';
|
|
30
|
-
import * as smartlog from '@push.rocks/smartlog';
|
|
31
|
-
import * as smartmetrics from '@push.rocks/smartmetrics';
|
|
32
|
-
import * as smartmta from '@push.rocks/smartmta';
|
|
33
|
-
import * as smartmongo from '@push.rocks/smartmongo';
|
|
34
|
-
import * as smartnetwork from '@push.rocks/smartnetwork';
|
|
35
|
-
import * as smartpath from '@push.rocks/smartpath';
|
|
36
|
-
import * as smartproxy from '@push.rocks/smartproxy';
|
|
37
|
-
import * as smartpromise from '@push.rocks/smartpromise';
|
|
38
|
-
import * as smartradius from '@push.rocks/smartradius';
|
|
39
|
-
import * as smartrequest from '@push.rocks/smartrequest';
|
|
40
|
-
import * as smartrx from '@push.rocks/smartrx';
|
|
41
|
-
import * as smartunique from '@push.rocks/smartunique';
|
|
42
|
-
export { projectinfo, qenv, smartacme, smartdata, smartdns, smartfile, smartguard, smartjwt, smartlog, smartmetrics, smartmongo, smartmta, smartnetwork, smartpath, smartproxy, smartpromise, smartradius, smartrequest, smartrx, smartunique };
|
|
43
|
-
// apiclient.xyz scope
|
|
44
|
-
import * as cloudflare from '@apiclient.xyz/cloudflare';
|
|
45
|
-
export { cloudflare, };
|
|
46
|
-
// tsclass scope
|
|
47
|
-
import * as tsclass from '@tsclass/tsclass';
|
|
48
|
-
export { tsclass, };
|
|
49
|
-
// third party
|
|
50
|
-
import * as uuid from 'uuid';
|
|
51
|
-
export { uuid, };
|
|
52
|
-
// Filesystem utilities (compatibility helpers for smartfile v13+)
|
|
53
|
-
export const fsUtils = {
|
|
54
|
-
/**
|
|
55
|
-
* Ensure a directory exists, creating it recursively if needed (sync)
|
|
56
|
-
*/
|
|
57
|
-
ensureDirSync: (dirPath) => {
|
|
58
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
59
|
-
},
|
|
60
|
-
/**
|
|
61
|
-
* Ensure a directory exists, creating it recursively if needed (async)
|
|
62
|
-
*/
|
|
63
|
-
ensureDir: async (dirPath) => {
|
|
64
|
-
await fs.promises.mkdir(dirPath, { recursive: true });
|
|
65
|
-
},
|
|
66
|
-
/**
|
|
67
|
-
* Write JSON content to a file synchronously
|
|
68
|
-
*/
|
|
69
|
-
toFsSync: (content, filePath) => {
|
|
70
|
-
const data = typeof content === 'string' ? content : JSON.stringify(content, null, 2);
|
|
71
|
-
fs.writeFileSync(filePath, data);
|
|
72
|
-
},
|
|
73
|
-
/**
|
|
74
|
-
* Write JSON content to a file asynchronously
|
|
75
|
-
*/
|
|
76
|
-
toFs: async (content, filePath) => {
|
|
77
|
-
const data = typeof content === 'string' ? content : JSON.stringify(content, null, 2);
|
|
78
|
-
await fs.promises.writeFile(filePath, data);
|
|
79
|
-
},
|
|
80
|
-
/**
|
|
81
|
-
* Check if a file or directory exists
|
|
82
|
-
*/
|
|
83
|
-
fileExistsSync: (filePath) => {
|
|
84
|
-
return fs.existsSync(filePath);
|
|
85
|
-
},
|
|
86
|
-
/**
|
|
87
|
-
* Check if a file or directory exists (async)
|
|
88
|
-
*/
|
|
89
|
-
fileExists: async (filePath) => {
|
|
90
|
-
try {
|
|
91
|
-
await fs.promises.access(filePath);
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
/**
|
|
99
|
-
* Read a JSON file synchronously
|
|
100
|
-
*/
|
|
101
|
-
toObjectSync: (filePath) => {
|
|
102
|
-
const content = fs.readFileSync(filePath, 'utf8');
|
|
103
|
-
return JSON.parse(content);
|
|
104
|
-
},
|
|
105
|
-
/**
|
|
106
|
-
* Read a JSON file asynchronously
|
|
107
|
-
*/
|
|
108
|
-
toObject: async (filePath) => {
|
|
109
|
-
const content = await fs.promises.readFile(filePath, 'utf8');
|
|
110
|
-
return JSON.parse(content);
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsRUFBRSxFQUNGLE1BQU0sRUFDTixJQUFJLEVBQ0osR0FBRyxFQUNILEVBQUUsRUFDRixJQUFJLEVBQ0osR0FBRyxFQUNILElBQUksR0FDTCxDQUFBO0FBRUQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsYUFBYSxHQUNkLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsV0FBVyxHQUNaLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFdBQVcsTUFBTSx5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
|