@push.rocks/smartacme 6.1.3 → 7.2.1

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.
Files changed (42) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/certmanagers/index.d.ts +2 -0
  3. package/dist_ts/certmanagers/index.js +3 -0
  4. package/dist_ts/certmanagers/memory.d.ts +18 -0
  5. package/dist_ts/certmanagers/memory.js +33 -0
  6. package/dist_ts/certmanagers/mongo.d.ts +23 -0
  7. package/dist_ts/certmanagers/mongo.js +40 -0
  8. package/dist_ts/certmanagers.d.ts +42 -0
  9. package/dist_ts/certmanagers.js +86 -0
  10. package/dist_ts/handlers/Dns01Handler.js +1 -3
  11. package/dist_ts/handlers/Http01Handler.d.ts +3 -3
  12. package/dist_ts/handlers/Http01Handler.js +1 -1
  13. package/dist_ts/handlers/Http01MemoryHandler.d.ts +26 -0
  14. package/dist_ts/handlers/Http01MemoryHandler.js +51 -0
  15. package/dist_ts/handlers/index.d.ts +2 -1
  16. package/dist_ts/handlers/index.js +3 -2
  17. package/dist_ts/index.d.ts +2 -0
  18. package/dist_ts/index.js +2 -1
  19. package/dist_ts/interfaces/certmanager.d.ts +33 -0
  20. package/dist_ts/interfaces/certmanager.js +2 -0
  21. package/dist_ts/smartacme.classes.cert.d.ts +11 -4
  22. package/dist_ts/smartacme.classes.cert.js +23 -68
  23. package/dist_ts/smartacme.classes.certmanager.d.ts +18 -0
  24. package/dist_ts/smartacme.classes.certmanager.js +40 -1
  25. package/dist_ts/smartacme.classes.smartacme.d.ts +10 -3
  26. package/dist_ts/smartacme.classes.smartacme.js +65 -29
  27. package/package.json +2 -2
  28. package/readme.md +19 -6
  29. package/readme.plan.md +16 -0
  30. package/ts/00_commitinfo_data.ts +1 -1
  31. package/ts/certmanagers/index.ts +2 -0
  32. package/ts/certmanagers/memory.ts +38 -0
  33. package/ts/certmanagers/mongo.ts +52 -0
  34. package/ts/handlers/Dns01Handler.ts +0 -8
  35. package/ts/handlers/Http01Handler.ts +3 -3
  36. package/ts/handlers/Http01MemoryHandler.ts +67 -0
  37. package/ts/handlers/index.ts +2 -1
  38. package/ts/index.ts +2 -0
  39. package/ts/interfaces/certmanager.ts +36 -0
  40. package/ts/smartacme.classes.cert.ts +22 -47
  41. package/ts/smartacme.classes.smartacme.ts +90 -33
  42. package/ts/smartacme.classes.certmanager.ts +0 -77
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartacme',
6
- version: '6.1.3',
6
+ version: '7.2.1',
7
7
  description: 'A TypeScript-based ACME client for LetsEncrypt certificate management with a focus on simplicity and power.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx1QkFBdUI7SUFDN0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDZHQUE2RztDQUMzSCxDQUFBIn0=
@@ -0,0 +1,2 @@
1
+ export * from './memory.js';
2
+ export * from './mongo.js';
@@ -0,0 +1,3 @@
1
+ export * from './memory.js';
2
+ export * from './mongo.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jZXJ0bWFuYWdlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUMifQ==
@@ -0,0 +1,18 @@
1
+ import type { ICertManager } from '../interfaces/certmanager.js';
2
+ import { SmartacmeCert } from '../smartacme.classes.cert.js';
3
+ /**
4
+ * In-memory certificate manager for mongoless mode.
5
+ * Stores certificates in memory only and does not connect to MongoDB.
6
+ */
7
+ export declare class MemoryCertManager implements ICertManager {
8
+ private certs;
9
+ init(): Promise<void>;
10
+ retrieveCertificate(domainName: string): Promise<SmartacmeCert | null>;
11
+ storeCertificate(cert: SmartacmeCert): Promise<void>;
12
+ deleteCertificate(domainName: string): Promise<void>;
13
+ close(): Promise<void>;
14
+ /**
15
+ * Wipe all certificates from the in-memory store (for testing)
16
+ */
17
+ wipe(): Promise<void>;
18
+ }
@@ -0,0 +1,33 @@
1
+ import * as plugins from '../smartacme.plugins.js';
2
+ import { SmartacmeCert } from '../smartacme.classes.cert.js';
3
+ /**
4
+ * In-memory certificate manager for mongoless mode.
5
+ * Stores certificates in memory only and does not connect to MongoDB.
6
+ */
7
+ export class MemoryCertManager {
8
+ constructor() {
9
+ this.certs = new Map();
10
+ }
11
+ async init() {
12
+ // no-op for in-memory store
13
+ }
14
+ async retrieveCertificate(domainName) {
15
+ return this.certs.get(domainName) ?? null;
16
+ }
17
+ async storeCertificate(cert) {
18
+ this.certs.set(cert.domainName, cert);
19
+ }
20
+ async deleteCertificate(domainName) {
21
+ this.certs.delete(domainName);
22
+ }
23
+ async close() {
24
+ // no-op
25
+ }
26
+ /**
27
+ * Wipe all certificates from the in-memory store (for testing)
28
+ */
29
+ async wipe() {
30
+ this.certs.clear();
31
+ }
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2VydG1hbmFnZXJzL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU3RDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQTlCO1FBQ1UsVUFBSyxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBNEJ4RCxDQUFDO0lBekJRLEtBQUssQ0FBQyxJQUFJO1FBQ2YsNEJBQTRCO0lBQzlCLENBQUM7SUFFTSxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBa0I7UUFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFtQjtRQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBa0I7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLFFBQVE7SUFDVixDQUFDO0lBQ0Q7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztDQUNGIn0=
@@ -0,0 +1,23 @@
1
+ import * as plugins from '../smartacme.plugins.js';
2
+ import type { ICertManager } from '../interfaces/certmanager.js';
3
+ import { SmartacmeCert } from '../smartacme.classes.cert.js';
4
+ /**
5
+ * MongoDB-backed certificate manager using EasyStore from smartdata.
6
+ */
7
+ export declare class MongoCertManager implements ICertManager {
8
+ private db;
9
+ private store;
10
+ /**
11
+ * @param mongoDescriptor MongoDB connection settings
12
+ */
13
+ constructor(mongoDescriptor: plugins.smartdata.IMongoDescriptor);
14
+ init(): Promise<void>;
15
+ retrieveCertificate(domainName: string): Promise<SmartacmeCert | null>;
16
+ storeCertificate(cert: SmartacmeCert): Promise<void>;
17
+ deleteCertificate(domainName: string): Promise<void>;
18
+ close(): Promise<void>;
19
+ /**
20
+ * Wipe all certificates from the persistent store (for integration testing)
21
+ */
22
+ wipe(): Promise<void>;
23
+ }
@@ -0,0 +1,40 @@
1
+ import * as plugins from '../smartacme.plugins.js';
2
+ import { SmartacmeCert } from '../smartacme.classes.cert.js';
3
+ /**
4
+ * MongoDB-backed certificate manager using EasyStore from smartdata.
5
+ */
6
+ export class MongoCertManager {
7
+ /**
8
+ * @param mongoDescriptor MongoDB connection settings
9
+ */
10
+ constructor(mongoDescriptor) {
11
+ this.db = new plugins.smartdata.SmartdataDb(mongoDescriptor);
12
+ // Use a single EasyStore document to hold all certs keyed by domainName
13
+ this.store = new plugins.smartdata.EasyStore('smartacme-certs', this.db);
14
+ }
15
+ async init() {
16
+ await this.db.init();
17
+ }
18
+ async retrieveCertificate(domainName) {
19
+ const data = await this.store.readKey(domainName);
20
+ return data ? new SmartacmeCert(data) : null;
21
+ }
22
+ async storeCertificate(cert) {
23
+ // write plain object for persistence
24
+ await this.store.writeKey(cert.domainName, { ...cert });
25
+ }
26
+ async deleteCertificate(domainName) {
27
+ await this.store.deleteKey(domainName);
28
+ }
29
+ async close() {
30
+ await this.db.close();
31
+ }
32
+ /**
33
+ * Wipe all certificates from the persistent store (for integration testing)
34
+ */
35
+ async wipe() {
36
+ // clear all keys in the easy store
37
+ await this.store.wipe();
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jZXJ0bWFuYWdlcnMvbW9uZ28udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx5QkFBeUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFN0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTNCOztPQUVHO0lBQ0gsWUFBWSxlQUFtRDtRQUM3RCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0Qsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FDMUMsaUJBQWlCLEVBQ2pCLElBQUksQ0FBQyxFQUFFLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0sS0FBSyxDQUFDLG1CQUFtQixDQUFDLFVBQWtCO1FBQ2pELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0MsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFtQjtRQUMvQyxxQ0FBcUM7UUFDckMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBa0I7UUFDL0MsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFDRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsbUNBQW1DO1FBQ25DLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,42 @@
1
+ import * as plugins from './smartacme.plugins.js';
2
+ import type { ICertManager } from './interfaces/certmanager.js';
3
+ import { SmartacmeCert } from './smartacme.classes.cert.js';
4
+ /**
5
+ * In-memory certificate manager for mongoless mode.
6
+ * Stores certificates in memory only and does not connect to MongoDB.
7
+ */
8
+ export declare class MemoryCertManager implements ICertManager {
9
+ interestMap: plugins.lik.InterestMap<string, SmartacmeCert>;
10
+ private certs;
11
+ constructor();
12
+ init(): Promise<void>;
13
+ retrieveCertificate(domainName: string): Promise<SmartacmeCert | null>;
14
+ storeCertificate(cert: SmartacmeCert): Promise<void>;
15
+ deleteCertificate(domainName: string): Promise<void>;
16
+ close(): Promise<void>;
17
+ /**
18
+ * Wipe all certificates from the in-memory store (for testing)
19
+ */
20
+ wipe(): Promise<void>;
21
+ }
22
+ /**
23
+ * MongoDB-backed certificate manager using EasyStore from smartdata.
24
+ */
25
+ export declare class MongoCertManager implements ICertManager {
26
+ interestMap: plugins.lik.InterestMap<string, SmartacmeCert>;
27
+ private db;
28
+ private store;
29
+ /**
30
+ * @param mongoDescriptor MongoDB connection settings
31
+ */
32
+ constructor(mongoDescriptor: plugins.smartdata.IMongoDescriptor);
33
+ init(): Promise<void>;
34
+ retrieveCertificate(domainName: string): Promise<SmartacmeCert | null>;
35
+ storeCertificate(cert: SmartacmeCert): Promise<void>;
36
+ deleteCertificate(domainName: string): Promise<void>;
37
+ close(): Promise<void>;
38
+ /**
39
+ * Wipe all certificates from the persistent store (for integration testing)
40
+ */
41
+ wipe(): Promise<void>;
42
+ }
@@ -0,0 +1,86 @@
1
+ import * as plugins from './smartacme.plugins.js';
2
+ import { SmartacmeCert } from './smartacme.classes.cert.js';
3
+ /**
4
+ * In-memory certificate manager for mongoless mode.
5
+ * Stores certificates in memory only and does not connect to MongoDB.
6
+ */
7
+ export class MemoryCertManager {
8
+ constructor() {
9
+ this.certs = new Map();
10
+ this.interestMap = new plugins.lik.InterestMap((domain) => domain);
11
+ }
12
+ async init() {
13
+ // no-op for in-memory store
14
+ }
15
+ async retrieveCertificate(domainName) {
16
+ return this.certs.get(domainName) ?? null;
17
+ }
18
+ async storeCertificate(cert) {
19
+ this.certs.set(cert.domainName, cert);
20
+ const interest = this.interestMap.findInterest(cert.domainName);
21
+ if (interest) {
22
+ interest.fullfillInterest(cert);
23
+ interest.markLost();
24
+ }
25
+ }
26
+ async deleteCertificate(domainName) {
27
+ this.certs.delete(domainName);
28
+ }
29
+ async close() {
30
+ // no-op
31
+ }
32
+ /**
33
+ * Wipe all certificates from the in-memory store (for testing)
34
+ */
35
+ async wipe() {
36
+ this.certs.clear();
37
+ // reset interest map
38
+ this.interestMap = new plugins.lik.InterestMap((domain) => domain);
39
+ }
40
+ }
41
+ /**
42
+ * MongoDB-backed certificate manager using EasyStore from smartdata.
43
+ */
44
+ export class MongoCertManager {
45
+ /**
46
+ * @param mongoDescriptor MongoDB connection settings
47
+ */
48
+ constructor(mongoDescriptor) {
49
+ this.db = new plugins.smartdata.SmartdataDb(mongoDescriptor);
50
+ // Use a single EasyStore document to hold all certs keyed by domainName
51
+ this.store = new plugins.smartdata.EasyStore('smartacme-certs', this.db);
52
+ this.interestMap = new plugins.lik.InterestMap((domain) => domain);
53
+ }
54
+ async init() {
55
+ await this.db.init();
56
+ }
57
+ async retrieveCertificate(domainName) {
58
+ const data = await this.store.readKey(domainName);
59
+ return data ? new SmartacmeCert(data) : null;
60
+ }
61
+ async storeCertificate(cert) {
62
+ // write plain object for persistence
63
+ await this.store.writeKey(cert.domainName, { ...cert });
64
+ const interest = this.interestMap.findInterest(cert.domainName);
65
+ if (interest) {
66
+ interest.fullfillInterest(cert);
67
+ interest.markLost();
68
+ }
69
+ }
70
+ async deleteCertificate(domainName) {
71
+ await this.store.deleteKey(domainName);
72
+ }
73
+ async close() {
74
+ await this.db.close();
75
+ }
76
+ /**
77
+ * Wipe all certificates from the persistent store (for integration testing)
78
+ */
79
+ async wipe() {
80
+ // clear all keys in the easy store
81
+ await this.store.wipe();
82
+ // reset interest map
83
+ this.interestMap = new plugins.lik.InterestMap((domain) => domain);
84
+ }
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydG1hbmFnZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2VydG1hbmFnZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFJNUI7UUFGUSxVQUFLLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFHcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZiw0QkFBNEI7SUFDOUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxVQUFrQjtRQUNqRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQW1CO1FBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCO1FBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxD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
@@ -13,8 +13,6 @@ export class Dns01Handler {
13
13
  async prepare(ch) {
14
14
  // set DNS TXT record
15
15
  await this.cf.convenience.acmeSetDnsChallenge(ch);
16
- // wait for DNS propagation
17
- await this.smartdns.checkUntilAvailable(ch.hostName, 'TXT', ch.challenge, 100, 5000);
18
16
  }
19
17
  async cleanup(ch) {
20
18
  // remove DNS TXT record
@@ -24,4 +22,4 @@ export class Dns01Handler {
24
22
  return this.cf.convenience.isDomainSupported(domainArg);
25
23
  }
26
24
  }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG5zMDFIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvaGFuZGxlcnMvRG5zMDFIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUM7QUFHbkQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUNFLHFCQUFxRSxFQUNyRSxnQkFBa0Q7UUFFbEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFnQixJQUFJLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBeUM7UUFDNUQscUJBQXFCO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsMkJBQTJCO1FBQzNCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDckMsRUFBRSxDQUFDLFFBQVEsRUFDWCxLQUFLLEVBQ0wsRUFBRSxDQUFDLFNBQVMsRUFDWixHQUFHLEVBQ0gsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUF5QztRQUM1RCx3QkFBd0I7UUFDeEIsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLFNBQWlCO1FBQ3pELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNGIn0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG5zMDFIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvaGFuZGxlcnMvRG5zMDFIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUM7QUFHbkQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUNFLHFCQUFxRSxFQUNyRSxnQkFBa0Q7UUFFbEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFnQixJQUFJLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBeUM7UUFDNUQscUJBQXFCO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBeUM7UUFDNUQsd0JBQXdCO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxTQUFpQjtRQUN6RCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDRiJ9
@@ -3,20 +3,20 @@ import type { IChallengeHandler } from './IChallengeHandler.js';
3
3
  * HTTP-01 ACME challenge handler using file-system webroot.
4
4
  * Writes and removes the challenge file under <webroot>/.well-known/acme-challenge/.
5
5
  */
6
- export interface Http01HandlerOptions {
6
+ export interface Http01WebrootOptions {
7
7
  /**
8
8
  * Directory that serves HTTP requests for /.well-known/acme-challenge
9
9
  */
10
10
  webroot: string;
11
11
  }
12
- export declare class Http01Handler implements IChallengeHandler<{
12
+ export declare class Http01Webroot implements IChallengeHandler<{
13
13
  type: string;
14
14
  token: string;
15
15
  keyAuthorization: string;
16
16
  webPath: string;
17
17
  }> {
18
18
  private webroot;
19
- constructor(options: Http01HandlerOptions);
19
+ constructor(options: Http01WebrootOptions);
20
20
  getSupportedTypes(): string[];
21
21
  prepare(ch: {
22
22
  token: string;
@@ -1,6 +1,6 @@
1
1
  import { promises as fs } from 'fs';
2
2
  import * as path from 'path';
3
- export class Http01Handler {
3
+ export class Http01Webroot {
4
4
  constructor(options) {
5
5
  this.webroot = options.webroot;
6
6
  }
@@ -0,0 +1,26 @@
1
+ import type { IChallengeHandler } from './IChallengeHandler.js';
2
+ /**
3
+ * HTTP-01 ACME challenge handler using in-memory storage.
4
+ * Stores challenge tokens and key authorizations in memory
5
+ * and serves them via handleRequest for arbitrary HTTP servers.
6
+ */
7
+ export interface Http01MemoryHandlerChallenge {
8
+ type: string;
9
+ token: string;
10
+ keyAuthorization: string;
11
+ webPath: string;
12
+ }
13
+ export declare class Http01MemoryHandler implements IChallengeHandler<Http01MemoryHandlerChallenge> {
14
+ private store;
15
+ getSupportedTypes(): string[];
16
+ prepare(ch: Http01MemoryHandlerChallenge): Promise<void>;
17
+ verify(_ch: Http01MemoryHandlerChallenge): Promise<void>;
18
+ cleanup(ch: Http01MemoryHandlerChallenge): Promise<void>;
19
+ /**
20
+ * HTTP request handler for serving ACME HTTP-01 challenges.
21
+ * @param req HTTP request object (should have url property)
22
+ * @param res HTTP response object
23
+ * @param next Optional next() callback for Express-style fallthrough
24
+ */
25
+ handleRequest(req: any, res: any, next?: () => void): void;
26
+ }
@@ -0,0 +1,51 @@
1
+ export class Http01MemoryHandler {
2
+ constructor() {
3
+ this.store = new Map();
4
+ }
5
+ getSupportedTypes() {
6
+ return ['http-01'];
7
+ }
8
+ async prepare(ch) {
9
+ this.store.set(ch.token, ch.keyAuthorization);
10
+ }
11
+ async verify(_ch) {
12
+ // No-op
13
+ return;
14
+ }
15
+ async cleanup(ch) {
16
+ this.store.delete(ch.token);
17
+ }
18
+ /**
19
+ * HTTP request handler for serving ACME HTTP-01 challenges.
20
+ * @param req HTTP request object (should have url property)
21
+ * @param res HTTP response object
22
+ * @param next Optional next() callback for Express-style fallthrough
23
+ */
24
+ handleRequest(req, res, next) {
25
+ const url = req.url || '';
26
+ const prefix = '/.well-known/acme-challenge/';
27
+ if (!url.startsWith(prefix)) {
28
+ if (next) {
29
+ return next();
30
+ }
31
+ res.statusCode = 404;
32
+ return res.end();
33
+ }
34
+ const token = url.slice(prefix.length);
35
+ const keyAuth = this.store.get(token);
36
+ if (keyAuth !== undefined) {
37
+ if (typeof res.status === 'function' && typeof res.send === 'function') {
38
+ return res.status(200).send(keyAuth);
39
+ }
40
+ res.statusCode = 200;
41
+ res.setHeader('content-type', 'text/plain');
42
+ return res.end(keyAuth);
43
+ }
44
+ if (next) {
45
+ return next();
46
+ }
47
+ res.statusCode = 404;
48
+ return res.end();
49
+ }
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cDAxTWVtb3J5SGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2hhbmRsZXJzL0h0dHAwMU1lbW9yeUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsTUFBTSxPQUFPLG1CQUFtQjtJQUFoQztRQUNVLFVBQUssR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQW1EakQsQ0FBQztJQWpEUSxpQkFBaUI7UUFDdEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQWdDO1FBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBaUM7UUFDbkQsUUFBUTtRQUNSLE9BQU87SUFDVCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFnQztRQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLEdBQVEsRUFBRSxHQUFRLEVBQUUsSUFBaUI7UUFDeEQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsOEJBQThCLENBQUM7UUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1QixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDaEIsQ0FBQztZQUNELEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixJQUFJLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxVQUFVLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN2RSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztZQUNyQixHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM1QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUNyQixPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDO0NBQ0YifQ==
@@ -1,3 +1,4 @@
1
1
  export type { IChallengeHandler } from './IChallengeHandler.js';
2
2
  export { Dns01Handler } from './Dns01Handler.js';
3
- export { Http01Handler } from './Http01Handler.js';
3
+ export { Http01Webroot } from './Http01Handler.js';
4
+ export { Http01MemoryHandler } from './Http01MemoryHandler.js';
@@ -1,4 +1,5 @@
1
1
  // Removed legacy handler adapter
2
2
  export { Dns01Handler } from './Dns01Handler.js';
3
- export { Http01Handler } from './Http01Handler.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9oYW5kbGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxpQ0FBaUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyJ9
3
+ export { Http01Webroot } from './Http01Handler.js';
4
+ export { Http01MemoryHandler } from './Http01MemoryHandler.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9oYW5kbGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxpQ0FBaUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQyJ9
@@ -1,2 +1,4 @@
1
1
  export * from './smartacme.classes.smartacme.js';
2
2
  export { SmartacmeCert as Cert } from './smartacme.classes.cert.js';
3
+ export type { ICertManager } from './interfaces/certmanager.js';
4
+ export { MemoryCertManager, MongoCertManager } from './certmanagers/index.js';
package/dist_ts/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './smartacme.classes.smartacme.js';
2
2
  export { SmartacmeCert as Cert } from './smartacme.classes.cert.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLElBQUksSUFBSSxFQUFFLE1BQU0sNkJBQTZCLENBQUMifQ==
3
+ export { MemoryCertManager, MongoCertManager } from './certmanagers/index.js';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLElBQUksSUFBSSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUMifQ==
@@ -0,0 +1,33 @@
1
+ import type { SmartacmeCert } from '../smartacme.classes.cert.js';
2
+ /**
3
+ * Interface for certificate storage managers.
4
+ * Users can implement this to provide custom persistence (in-memory,
5
+ * file-based, Redis, etc.).
6
+ */
7
+ export interface ICertManager {
8
+ /**
9
+ * Initialize the store (e.g., connect to database).
10
+ */
11
+ init(): Promise<void>;
12
+ /**
13
+ * Retrieve a certificate record by domain name.
14
+ * Returns null if none found.
15
+ */
16
+ retrieveCertificate(domainName: string): Promise<SmartacmeCert | null>;
17
+ /**
18
+ * Store a certificate record. Fulfills any pending interests.
19
+ */
20
+ storeCertificate(cert: SmartacmeCert): Promise<void>;
21
+ /**
22
+ * Delete a certificate record by domain name.
23
+ */
24
+ deleteCertificate(domainName: string): Promise<void>;
25
+ /**
26
+ * Close the store (e.g., disconnect database).
27
+ */
28
+ close(): Promise<void>;
29
+ /**
30
+ * Optional: wipe all stored certificates (e.g., for integration testing)
31
+ */
32
+ wipe(): Promise<void>;
33
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydG1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9pbnRlcmZhY2VzL2NlcnRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -1,5 +1,7 @@
1
- import * as plugins from './smartacme.plugins.js';
2
- export declare class SmartacmeCert extends plugins.smartdata.SmartDataDbDoc<SmartacmeCert, plugins.tsclass.network.ICert> implements plugins.tsclass.network.ICert {
1
+ /**
2
+ * Plain certificate record.
3
+ */
4
+ export declare class SmartacmeCert {
3
5
  id: string;
4
6
  domainName: string;
5
7
  created: number;
@@ -7,8 +9,13 @@ export declare class SmartacmeCert extends plugins.smartdata.SmartDataDbDoc<Smar
7
9
  publicKey: string;
8
10
  csr: string;
9
11
  validUntil: number;
12
+ constructor(data?: Partial<SmartacmeCert>);
13
+ /**
14
+ * Check if certificate is still valid.
15
+ */
10
16
  isStillValid(): boolean;
17
+ /**
18
+ * Check if certificate needs renewal (e.g., expires in <10 days).
19
+ */
11
20
  shouldBeRenewed(): boolean;
12
- update(certDataArg: plugins.tsclass.network.ICert): void;
13
- constructor(optionsArg: plugins.tsclass.network.ICert);
14
21
  }
@@ -1,74 +1,29 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
1
  import * as plugins from './smartacme.plugins.js';
11
- import * as interfaces from './interfaces/index.js';
12
- import { SmartacmeCertManager } from './smartacme.classes.certmanager.js';
13
- import { Collection, svDb, unI } from '@push.rocks/smartdata';
14
- let SmartacmeCert = class SmartacmeCert extends plugins.smartdata.SmartDataDbDoc {
2
+ /**
3
+ * Plain certificate record.
4
+ */
5
+ export class SmartacmeCert {
6
+ constructor(data = {}) {
7
+ this.id = data.id || '';
8
+ this.domainName = data.domainName || '';
9
+ this.created = data.created || Date.now();
10
+ this.privateKey = data.privateKey || '';
11
+ this.publicKey = data.publicKey || '';
12
+ this.csr = data.csr || '';
13
+ this.validUntil = data.validUntil || 0;
14
+ }
15
+ /**
16
+ * Check if certificate is still valid.
17
+ */
15
18
  isStillValid() {
16
19
  return this.validUntil >= Date.now();
17
20
  }
21
+ /**
22
+ * Check if certificate needs renewal (e.g., expires in <10 days).
23
+ */
18
24
  shouldBeRenewed() {
19
- const shouldBeValidAtLeastUntil = Date.now() +
20
- plugins.smarttime.getMilliSecondsFromUnits({
21
- days: 10,
22
- });
23
- return !(this.validUntil >= shouldBeValidAtLeastUntil);
24
- }
25
- update(certDataArg) {
26
- Object.keys(certDataArg).forEach((key) => {
27
- this[key] = certDataArg[key];
28
- });
29
- }
30
- constructor(optionsArg) {
31
- super();
32
- if (optionsArg) {
33
- Object.keys(optionsArg).forEach((key) => {
34
- this[key] = optionsArg[key];
35
- });
36
- }
25
+ const threshold = Date.now() + plugins.smarttime.getMilliSecondsFromUnits({ days: 10 });
26
+ return this.validUntil < threshold;
37
27
  }
38
- };
39
- __decorate([
40
- unI(),
41
- __metadata("design:type", String)
42
- ], SmartacmeCert.prototype, "id", void 0);
43
- __decorate([
44
- svDb(),
45
- __metadata("design:type", String)
46
- ], SmartacmeCert.prototype, "domainName", void 0);
47
- __decorate([
48
- svDb(),
49
- __metadata("design:type", Number)
50
- ], SmartacmeCert.prototype, "created", void 0);
51
- __decorate([
52
- svDb(),
53
- __metadata("design:type", String)
54
- ], SmartacmeCert.prototype, "privateKey", void 0);
55
- __decorate([
56
- svDb(),
57
- __metadata("design:type", String)
58
- ], SmartacmeCert.prototype, "publicKey", void 0);
59
- __decorate([
60
- svDb(),
61
- __metadata("design:type", String)
62
- ], SmartacmeCert.prototype, "csr", void 0);
63
- __decorate([
64
- svDb(),
65
- __metadata("design:type", Number)
66
- ], SmartacmeCert.prototype, "validUntil", void 0);
67
- SmartacmeCert = __decorate([
68
- plugins.smartdata.Collection(() => {
69
- return SmartacmeCertManager.activeDB;
70
- }),
71
- __metadata("design:paramtypes", [Object])
72
- ], SmartacmeCert);
73
- export { SmartacmeCert };
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuY2VydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWNtZS5jbGFzc2VzLmNlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUVsRCxPQUFPLEtBQUssVUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBS3ZELElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQ1gsU0FBUSxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQTREO0lBd0IvRSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVNLGVBQWU7UUFDcEIsTUFBTSx5QkFBeUIsR0FDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNWLE9BQU8sQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3pDLElBQUksRUFBRSxFQUFFO2FBQ1QsQ0FBQyxDQUFDO1FBQ0wsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxNQUFNLENBQUMsV0FBMEM7UUFDdEQsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksVUFBeUM7UUFDbkQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQS9DUTtJQUROLEdBQUcsRUFBRTs7eUNBQ1k7QUFHWDtJQUROLElBQUksRUFBRTs7aURBQ21CO0FBR25CO0lBRE4sSUFBSSxFQUFFOzs4Q0FDZ0I7QUFHaEI7SUFETixJQUFJLEVBQUU7O2lEQUNtQjtBQUduQjtJQUROLElBQUksRUFBRTs7Z0RBQ2tCO0FBR2xCO0lBRE4sSUFBSSxFQUFFOzswQ0FDWTtBQUdaO0lBRE4sSUFBSSxFQUFFOztpREFDbUI7QUF2QmYsYUFBYTtJQUh6QixPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDakMsT0FBTyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7SUFDdkMsQ0FBQyxDQUFDOztHQUNXLGFBQWEsQ0FvRHpCIn0=
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuY2VydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWNtZS5jbGFzc2VzLmNlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUVsRDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBU3hCLFlBQVksT0FBK0IsRUFBRTtRQUMzQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEYsT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0NBQ0YifQ==
@@ -22,4 +22,22 @@ export declare class SmartacmeCertManager {
22
22
  */
23
23
  storeCertificate(optionsArg: plugins.tsclass.network.ICert): Promise<void>;
24
24
  deleteCertificate(certDomainNameArg: string): Promise<void>;
25
+ /**
26
+ * Close underlying MongoDB connection
27
+ */
28
+ close(): Promise<void>;
29
+ }
30
+ /**
31
+ * In-memory certificate manager for mongoless mode.
32
+ * Stores certificates in memory only and does not connect to MongoDB.
33
+ */
34
+ export declare class MemoryCertManager {
35
+ interestMap: plugins.lik.InterestMap<string, SmartacmeCert>;
36
+ private certs;
37
+ constructor();
38
+ init(): Promise<void>;
39
+ retrieveCertificate(certDomainName: string): Promise<SmartacmeCert>;
40
+ storeCertificate(optionsArg: plugins.tsclass.network.ICert): Promise<void>;
41
+ deleteCertificate(certDomainName: string): Promise<void>;
42
+ close(): Promise<void>;
25
43
  }