@serve.zone/dcrouter 11.0.9 → 11.0.22
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 +2 -2
- package/package.json +2 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/logger.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/classes.cert-provision-scheduler.d.ts +0 -53
- package/dist_ts/classes.cert-provision-scheduler.js +0 -110
- package/dist_ts/classes.storage-cert-manager.d.ts +0 -18
- package/dist_ts/classes.storage-cert-manager.js +0 -43
- 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-1772718493077.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.22',
|
|
7
7
|
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
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.22",
|
|
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.13",
|
|
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
package/ts/logger.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.9',
|
|
7
|
-
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import type { StorageManager } from './storage/index.js';
|
|
2
|
-
/**
|
|
3
|
-
* Manages certificate provisioning scheduling with:
|
|
4
|
-
* - Per-domain exponential backoff persisted in StorageManager
|
|
5
|
-
*
|
|
6
|
-
* Note: Serial stagger queue was removed — smartacme v9 handles
|
|
7
|
-
* concurrency, per-domain dedup, and rate limiting internally.
|
|
8
|
-
*/
|
|
9
|
-
export declare class CertProvisionScheduler {
|
|
10
|
-
private storageManager;
|
|
11
|
-
private maxBackoffHours;
|
|
12
|
-
private backoffCache;
|
|
13
|
-
constructor(storageManager: StorageManager, options?: {
|
|
14
|
-
maxBackoffHours?: number;
|
|
15
|
-
});
|
|
16
|
-
/**
|
|
17
|
-
* Storage key for a domain's backoff entry
|
|
18
|
-
*/
|
|
19
|
-
private backoffKey;
|
|
20
|
-
/**
|
|
21
|
-
* Load backoff entry from storage (with in-memory cache)
|
|
22
|
-
*/
|
|
23
|
-
private loadBackoff;
|
|
24
|
-
/**
|
|
25
|
-
* Save backoff entry to both cache and storage
|
|
26
|
-
*/
|
|
27
|
-
private saveBackoff;
|
|
28
|
-
/**
|
|
29
|
-
* Check if a domain is currently in backoff
|
|
30
|
-
*/
|
|
31
|
-
isInBackoff(domain: string): Promise<boolean>;
|
|
32
|
-
/**
|
|
33
|
-
* Record a provisioning failure for a domain.
|
|
34
|
-
* Sets exponential backoff: min(failures^2 * 1h, maxBackoffHours)
|
|
35
|
-
*/
|
|
36
|
-
recordFailure(domain: string, error?: string): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Clear backoff for a domain (on success or manual override)
|
|
39
|
-
*/
|
|
40
|
-
clearBackoff(domain: string): Promise<void>;
|
|
41
|
-
/**
|
|
42
|
-
* Clear all in-memory backoff cache entries
|
|
43
|
-
*/
|
|
44
|
-
clear(): void;
|
|
45
|
-
/**
|
|
46
|
-
* Get backoff info for UI display
|
|
47
|
-
*/
|
|
48
|
-
getBackoffInfo(domain: string): Promise<{
|
|
49
|
-
failures: number;
|
|
50
|
-
retryAfter?: string;
|
|
51
|
-
lastError?: string;
|
|
52
|
-
} | null>;
|
|
53
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { logger } from './logger.js';
|
|
2
|
-
/**
|
|
3
|
-
* Manages certificate provisioning scheduling with:
|
|
4
|
-
* - Per-domain exponential backoff persisted in StorageManager
|
|
5
|
-
*
|
|
6
|
-
* Note: Serial stagger queue was removed — smartacme v9 handles
|
|
7
|
-
* concurrency, per-domain dedup, and rate limiting internally.
|
|
8
|
-
*/
|
|
9
|
-
export class CertProvisionScheduler {
|
|
10
|
-
storageManager;
|
|
11
|
-
maxBackoffHours;
|
|
12
|
-
// In-memory backoff cache (mirrors storage for fast lookups)
|
|
13
|
-
backoffCache = new Map();
|
|
14
|
-
constructor(storageManager, options) {
|
|
15
|
-
this.storageManager = storageManager;
|
|
16
|
-
this.maxBackoffHours = options?.maxBackoffHours ?? 24;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Storage key for a domain's backoff entry
|
|
20
|
-
*/
|
|
21
|
-
backoffKey(domain) {
|
|
22
|
-
const clean = domain.replace(/\*/g, '_wildcard_').replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
23
|
-
return `/cert-backoff/${clean}`;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Load backoff entry from storage (with in-memory cache)
|
|
27
|
-
*/
|
|
28
|
-
async loadBackoff(domain) {
|
|
29
|
-
const cached = this.backoffCache.get(domain);
|
|
30
|
-
if (cached)
|
|
31
|
-
return cached;
|
|
32
|
-
const entry = await this.storageManager.getJSON(this.backoffKey(domain));
|
|
33
|
-
if (entry) {
|
|
34
|
-
this.backoffCache.set(domain, entry);
|
|
35
|
-
}
|
|
36
|
-
return entry;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Save backoff entry to both cache and storage
|
|
40
|
-
*/
|
|
41
|
-
async saveBackoff(domain, entry) {
|
|
42
|
-
this.backoffCache.set(domain, entry);
|
|
43
|
-
await this.storageManager.setJSON(this.backoffKey(domain), entry);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Check if a domain is currently in backoff
|
|
47
|
-
*/
|
|
48
|
-
async isInBackoff(domain) {
|
|
49
|
-
const entry = await this.loadBackoff(domain);
|
|
50
|
-
if (!entry)
|
|
51
|
-
return false;
|
|
52
|
-
const retryAfter = new Date(entry.retryAfter);
|
|
53
|
-
return retryAfter.getTime() > Date.now();
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Record a provisioning failure for a domain.
|
|
57
|
-
* Sets exponential backoff: min(failures^2 * 1h, maxBackoffHours)
|
|
58
|
-
*/
|
|
59
|
-
async recordFailure(domain, error) {
|
|
60
|
-
const existing = await this.loadBackoff(domain);
|
|
61
|
-
const failures = (existing?.failures ?? 0) + 1;
|
|
62
|
-
// Exponential backoff: failures^2 hours, capped
|
|
63
|
-
const backoffHours = Math.min(failures * failures, this.maxBackoffHours);
|
|
64
|
-
const retryAfter = new Date(Date.now() + backoffHours * 60 * 60 * 1000);
|
|
65
|
-
const entry = {
|
|
66
|
-
failures,
|
|
67
|
-
lastFailure: new Date().toISOString(),
|
|
68
|
-
retryAfter: retryAfter.toISOString(),
|
|
69
|
-
lastError: error,
|
|
70
|
-
};
|
|
71
|
-
await this.saveBackoff(domain, entry);
|
|
72
|
-
logger.log('warn', `Cert backoff for ${domain}: ${failures} failures, retry after ${retryAfter.toISOString()}`);
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Clear backoff for a domain (on success or manual override)
|
|
76
|
-
*/
|
|
77
|
-
async clearBackoff(domain) {
|
|
78
|
-
this.backoffCache.delete(domain);
|
|
79
|
-
try {
|
|
80
|
-
await this.storageManager.delete(this.backoffKey(domain));
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
// Ignore delete errors (key may not exist)
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Clear all in-memory backoff cache entries
|
|
88
|
-
*/
|
|
89
|
-
clear() {
|
|
90
|
-
this.backoffCache.clear();
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Get backoff info for UI display
|
|
94
|
-
*/
|
|
95
|
-
async getBackoffInfo(domain) {
|
|
96
|
-
const entry = await this.loadBackoff(domain);
|
|
97
|
-
if (!entry)
|
|
98
|
-
return null;
|
|
99
|
-
// Only return if still in backoff
|
|
100
|
-
const retryAfter = new Date(entry.retryAfter);
|
|
101
|
-
if (retryAfter.getTime() <= Date.now())
|
|
102
|
-
return null;
|
|
103
|
-
return {
|
|
104
|
-
failures: entry.failures,
|
|
105
|
-
retryAfter: entry.retryAfter,
|
|
106
|
-
lastError: entry.lastError,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jZXJ0LXByb3Zpc2lvbi1zY2hlZHVsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmNlcnQtcHJvdmlzaW9uLXNjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBVXJDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFDekIsY0FBYyxDQUFpQjtJQUMvQixlQUFlLENBQVM7SUFFaEMsNkRBQTZEO0lBQ3JELFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUV4RCxZQUNFLGNBQThCLEVBQzlCLE9BQXNDO1FBRXRDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLE1BQWM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLE9BQU8saUJBQWlCLEtBQUssRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBYztRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxJQUFJLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUUxQixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEYsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQWMsRUFBRSxLQUFvQjtRQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBYztRQUM5QixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV6QixNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsT0FBTyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQWMsRUFBRSxLQUFjO1FBQ2hELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRS9DLGdEQUFnRDtRQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUV4RSxNQUFNLEtBQUssR0FBa0I7WUFDM0IsUUFBUTtZQUNSLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNyQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRTtZQUNwQyxTQUFTLEVBQUUsS0FBSztTQUNqQixDQUFDO1FBRUYsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsTUFBTSxLQUFLLFFBQVEsMEJBQTBCLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyQ0FBMkM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBYztRQUtqQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4QixrQ0FBa0M7UUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVwRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7U0FDM0IsQ0FBQztJQUNKLENBQUM7Q0FDRiJ9
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
import { StorageManager } from './storage/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* ICertManager implementation backed by StorageManager.
|
|
5
|
-
* Persists SmartAcme certificates under a /certs/ key prefix so they
|
|
6
|
-
* survive process restarts without re-hitting ACME.
|
|
7
|
-
*/
|
|
8
|
-
export declare class StorageBackedCertManager implements plugins.smartacme.ICertManager {
|
|
9
|
-
private storageManager;
|
|
10
|
-
private keyPrefix;
|
|
11
|
-
constructor(storageManager: StorageManager);
|
|
12
|
-
init(): Promise<void>;
|
|
13
|
-
retrieveCertificate(domainName: string): Promise<plugins.smartacme.Cert | null>;
|
|
14
|
-
storeCertificate(cert: plugins.smartacme.Cert): Promise<void>;
|
|
15
|
-
deleteCertificate(domainName: string): Promise<void>;
|
|
16
|
-
close(): Promise<void>;
|
|
17
|
-
wipe(): Promise<void>;
|
|
18
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
import { StorageManager } from './storage/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* ICertManager implementation backed by StorageManager.
|
|
5
|
-
* Persists SmartAcme certificates under a /certs/ key prefix so they
|
|
6
|
-
* survive process restarts without re-hitting ACME.
|
|
7
|
-
*/
|
|
8
|
-
export class StorageBackedCertManager {
|
|
9
|
-
storageManager;
|
|
10
|
-
keyPrefix = '/certs/';
|
|
11
|
-
constructor(storageManager) {
|
|
12
|
-
this.storageManager = storageManager;
|
|
13
|
-
}
|
|
14
|
-
async init() { }
|
|
15
|
-
async retrieveCertificate(domainName) {
|
|
16
|
-
const data = await this.storageManager.getJSON(this.keyPrefix + domainName);
|
|
17
|
-
if (!data)
|
|
18
|
-
return null;
|
|
19
|
-
return new plugins.smartacme.Cert(data);
|
|
20
|
-
}
|
|
21
|
-
async storeCertificate(cert) {
|
|
22
|
-
await this.storageManager.setJSON(this.keyPrefix + cert.domainName, {
|
|
23
|
-
id: cert.id,
|
|
24
|
-
domainName: cert.domainName,
|
|
25
|
-
created: cert.created,
|
|
26
|
-
privateKey: cert.privateKey,
|
|
27
|
-
publicKey: cert.publicKey,
|
|
28
|
-
csr: cert.csr,
|
|
29
|
-
validUntil: cert.validUntil,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
async deleteCertificate(domainName) {
|
|
33
|
-
await this.storageManager.delete(this.keyPrefix + domainName);
|
|
34
|
-
}
|
|
35
|
-
async close() { }
|
|
36
|
-
async wipe() {
|
|
37
|
-
const keys = await this.storageManager.list(this.keyPrefix);
|
|
38
|
-
for (const key of keys) {
|
|
39
|
-
await this.storageManager.delete(key);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlLWNlcnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuc3RvcmFnZS1jZXJ0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBR2Y7SUFGWixTQUFTLEdBQUcsU0FBUyxDQUFDO0lBRTlCLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUFHLENBQUM7SUFFdEQsS0FBSyxDQUFDLElBQUksS0FBbUIsQ0FBQztJQUU5QixLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBa0I7UUFDMUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBNEI7UUFDakQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssS0FBbUIsQ0FBQztJQUUvQixLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
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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
|