@serve.zone/dcrouter 11.0.4 → 11.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_serve/bundle.js +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +19 -11
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/dist_ts/cache/classes.cache.cleaner.js +0 -130
- package/dist_ts/cache/documents/classes.cached.email.d.ts +0 -125
- package/dist_ts/cache/documents/classes.cached.email.js +0 -337
- package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +0 -119
- package/dist_ts/cache/documents/classes.cached.ip.reputation.js +0 -323
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-1772609852355.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.5',
|
|
7
7
|
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
|
|
@@ -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.5',
|
|
7
7
|
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFdBQVcsRUFBRSwwRUFBMEU7Q0FDeEYsQ0FBQSJ9
|
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.6",
|
|
5
5
|
"description": "A multifaceted routing service handling mail and SMS delivery functions.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
@@ -10,6 +10,14 @@
|
|
|
10
10
|
},
|
|
11
11
|
"author": "Task Venture Capital GmbH",
|
|
12
12
|
"license": "MIT",
|
|
13
|
+
"scripts": {
|
|
14
|
+
"test": "(tstest test/ --logfile --timeout 60)",
|
|
15
|
+
"start": "(node --max_old_space_size=250 ./cli.js)",
|
|
16
|
+
"startTs": "(node cli.ts.js)",
|
|
17
|
+
"build": "(tsbuild tsfolders --allowimplicitany && npm run bundle)",
|
|
18
|
+
"bundle": "(tsbundle)",
|
|
19
|
+
"watch": "tswatch"
|
|
20
|
+
},
|
|
13
21
|
"devDependencies": {
|
|
14
22
|
"@git.zone/tsbuild": "^4.1.2",
|
|
15
23
|
"@git.zone/tsbundle": "^2.9.0",
|
|
@@ -81,6 +89,14 @@
|
|
|
81
89
|
"VLAN assignment",
|
|
82
90
|
"MAC authentication"
|
|
83
91
|
],
|
|
92
|
+
"pnpm": {
|
|
93
|
+
"onlyBuiltDependencies": [
|
|
94
|
+
"esbuild",
|
|
95
|
+
"mongodb-memory-server",
|
|
96
|
+
"puppeteer"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
"packageManager": "pnpm@10.11.0",
|
|
84
100
|
"files": [
|
|
85
101
|
"ts/**/*",
|
|
86
102
|
"ts_web/**/*",
|
|
@@ -92,13 +108,5 @@
|
|
|
92
108
|
"cli.js",
|
|
93
109
|
"npmextra.json",
|
|
94
110
|
"readme.md"
|
|
95
|
-
]
|
|
96
|
-
|
|
97
|
-
"test": "(tstest test/ --logfile --timeout 60)",
|
|
98
|
-
"start": "(node --max_old_space_size=250 ./cli.js)",
|
|
99
|
-
"startTs": "(node cli.ts.js)",
|
|
100
|
-
"build": "(tsbuild tsfolders --allowimplicitany && npm run bundle)",
|
|
101
|
-
"bundle": "(tsbundle)",
|
|
102
|
-
"watch": "tswatch"
|
|
103
|
-
}
|
|
104
|
-
}
|
|
111
|
+
]
|
|
112
|
+
}
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
import { logger } from '../logger.js';
|
|
3
|
-
import { CacheDb } from './classes.cachedb.js';
|
|
4
|
-
// Import document classes for cleanup
|
|
5
|
-
import { CachedEmail } from './documents/classes.cached.email.js';
|
|
6
|
-
import { CachedIPReputation } from './documents/classes.cached.ip.reputation.js';
|
|
7
|
-
/**
|
|
8
|
-
* CacheCleaner - Periodically removes expired documents from the cache
|
|
9
|
-
*
|
|
10
|
-
* Runs on a configurable interval (default: hourly) and queries each
|
|
11
|
-
* collection for documents where expiresAt < now(), then deletes them.
|
|
12
|
-
*/
|
|
13
|
-
export class CacheCleaner {
|
|
14
|
-
cleanupInterval = null;
|
|
15
|
-
isRunning = false;
|
|
16
|
-
options;
|
|
17
|
-
cacheDb;
|
|
18
|
-
constructor(cacheDb, options = {}) {
|
|
19
|
-
this.cacheDb = cacheDb;
|
|
20
|
-
this.options = {
|
|
21
|
-
intervalMs: options.intervalMs || 60 * 60 * 1000, // 1 hour default
|
|
22
|
-
verbose: options.verbose || false,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Start the periodic cleanup process
|
|
27
|
-
*/
|
|
28
|
-
start() {
|
|
29
|
-
if (this.isRunning) {
|
|
30
|
-
logger.log('warn', 'CacheCleaner already running');
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
this.isRunning = true;
|
|
34
|
-
// Run cleanup immediately on start
|
|
35
|
-
this.runCleanup().catch((error) => {
|
|
36
|
-
logger.log('error', `Initial cache cleanup failed: ${error.message}`);
|
|
37
|
-
});
|
|
38
|
-
// Schedule periodic cleanup
|
|
39
|
-
this.cleanupInterval = setInterval(() => {
|
|
40
|
-
this.runCleanup().catch((error) => {
|
|
41
|
-
logger.log('error', `Cache cleanup failed: ${error.message}`);
|
|
42
|
-
});
|
|
43
|
-
}, this.options.intervalMs);
|
|
44
|
-
logger.log('info', `CacheCleaner started with interval: ${this.options.intervalMs / 1000 / 60} minutes`);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Stop the periodic cleanup process
|
|
48
|
-
*/
|
|
49
|
-
stop() {
|
|
50
|
-
if (!this.isRunning) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
if (this.cleanupInterval) {
|
|
54
|
-
clearInterval(this.cleanupInterval);
|
|
55
|
-
this.cleanupInterval = null;
|
|
56
|
-
}
|
|
57
|
-
this.isRunning = false;
|
|
58
|
-
logger.log('info', 'CacheCleaner stopped');
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Run a single cleanup cycle
|
|
62
|
-
*/
|
|
63
|
-
async runCleanup() {
|
|
64
|
-
if (!this.cacheDb.isReady()) {
|
|
65
|
-
logger.log('warn', 'CacheDb not ready, skipping cleanup');
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const now = new Date();
|
|
69
|
-
const results = [];
|
|
70
|
-
try {
|
|
71
|
-
const emailsDeleted = await this.cleanExpiredDocuments(CachedEmail, now);
|
|
72
|
-
results.push({ collection: 'CachedEmail', deleted: emailsDeleted });
|
|
73
|
-
const ipReputationDeleted = await this.cleanExpiredDocuments(CachedIPReputation, now);
|
|
74
|
-
results.push({ collection: 'CachedIPReputation', deleted: ipReputationDeleted });
|
|
75
|
-
// Log results
|
|
76
|
-
const totalDeleted = results.reduce((sum, r) => sum + r.deleted, 0);
|
|
77
|
-
if (totalDeleted > 0 || this.options.verbose) {
|
|
78
|
-
const summary = results
|
|
79
|
-
.filter((r) => r.deleted > 0)
|
|
80
|
-
.map((r) => `${r.collection}: ${r.deleted}`)
|
|
81
|
-
.join(', ');
|
|
82
|
-
logger.log('info', `Cache cleanup completed. Deleted ${totalDeleted} expired documents. ${summary || 'No deletions.'}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
logger.log('error', `Cache cleanup error: ${error.message}`);
|
|
87
|
-
throw error;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Clean expired documents from a specific collection using smartdata API
|
|
92
|
-
*/
|
|
93
|
-
async cleanExpiredDocuments(documentClass, now) {
|
|
94
|
-
try {
|
|
95
|
-
// Find all expired documents
|
|
96
|
-
const expiredDocs = await documentClass.getInstances({
|
|
97
|
-
expiresAt: { $lt: now },
|
|
98
|
-
});
|
|
99
|
-
// Delete each expired document
|
|
100
|
-
let deletedCount = 0;
|
|
101
|
-
for (const doc of expiredDocs) {
|
|
102
|
-
try {
|
|
103
|
-
await doc.delete();
|
|
104
|
-
deletedCount++;
|
|
105
|
-
}
|
|
106
|
-
catch (deleteError) {
|
|
107
|
-
logger.log('warn', `Failed to delete expired document: ${deleteError.message}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return deletedCount;
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
logger.log('error', `Error cleaning collection: ${error.message}`);
|
|
114
|
-
return 0;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Check if the cleaner is running
|
|
119
|
-
*/
|
|
120
|
-
isActive() {
|
|
121
|
-
return this.isRunning;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Get the cleanup interval in milliseconds
|
|
125
|
-
*/
|
|
126
|
-
getIntervalMs() {
|
|
127
|
-
return this.options.intervalMs;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZS5jbGVhbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY2FjaGUvY2xhc3Nlcy5jYWNoZS5jbGVhbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9DLHNDQUFzQztBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFZakY7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLGVBQWUsR0FBMEMsSUFBSSxDQUFDO0lBQzlELFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsT0FBTyxDQUFpQztJQUN4QyxPQUFPLENBQVU7SUFFekIsWUFBWSxPQUFnQixFQUFFLFVBQWdDLEVBQUU7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLGlCQUFpQjtZQUNuRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxLQUFLO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLENBQUMsQ0FBQztZQUNuRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLG1DQUFtQztRQUNuQyxJQUFJ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
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { CachedDocument } from '../classes.cached.document.js';
|
|
2
|
-
/**
|
|
3
|
-
* Email status in the cache
|
|
4
|
-
*/
|
|
5
|
-
export type TCachedEmailStatus = 'pending' | 'processing' | 'delivered' | 'failed' | 'deferred';
|
|
6
|
-
/**
|
|
7
|
-
* CachedEmail - Stores email queue items in the cache
|
|
8
|
-
*
|
|
9
|
-
* Used for persistent email queue storage, tracking delivery status,
|
|
10
|
-
* and maintaining email history for the configured TTL period.
|
|
11
|
-
*/
|
|
12
|
-
export declare class CachedEmail extends CachedDocument<CachedEmail> {
|
|
13
|
-
createdAt: Date;
|
|
14
|
-
expiresAt: Date;
|
|
15
|
-
lastAccessedAt: Date;
|
|
16
|
-
/**
|
|
17
|
-
* Unique identifier for this email
|
|
18
|
-
*/
|
|
19
|
-
id: string;
|
|
20
|
-
/**
|
|
21
|
-
* Email message ID (RFC 822 Message-ID header)
|
|
22
|
-
*/
|
|
23
|
-
messageId: string;
|
|
24
|
-
/**
|
|
25
|
-
* Sender email address (envelope from)
|
|
26
|
-
*/
|
|
27
|
-
from: string;
|
|
28
|
-
/**
|
|
29
|
-
* Recipient email addresses
|
|
30
|
-
*/
|
|
31
|
-
to: string[];
|
|
32
|
-
/**
|
|
33
|
-
* CC recipients
|
|
34
|
-
*/
|
|
35
|
-
cc: string[];
|
|
36
|
-
/**
|
|
37
|
-
* BCC recipients
|
|
38
|
-
*/
|
|
39
|
-
bcc: string[];
|
|
40
|
-
/**
|
|
41
|
-
* Email subject
|
|
42
|
-
*/
|
|
43
|
-
subject: string;
|
|
44
|
-
/**
|
|
45
|
-
* Raw RFC822 email content
|
|
46
|
-
*/
|
|
47
|
-
rawContent: string;
|
|
48
|
-
/**
|
|
49
|
-
* Current status of the email
|
|
50
|
-
*/
|
|
51
|
-
status: TCachedEmailStatus;
|
|
52
|
-
/**
|
|
53
|
-
* Number of delivery attempts
|
|
54
|
-
*/
|
|
55
|
-
attempts: number;
|
|
56
|
-
/**
|
|
57
|
-
* Maximum number of delivery attempts
|
|
58
|
-
*/
|
|
59
|
-
maxAttempts: number;
|
|
60
|
-
/**
|
|
61
|
-
* Timestamp for next delivery attempt
|
|
62
|
-
*/
|
|
63
|
-
nextAttempt: Date;
|
|
64
|
-
/**
|
|
65
|
-
* Last error message if delivery failed
|
|
66
|
-
*/
|
|
67
|
-
lastError: string;
|
|
68
|
-
/**
|
|
69
|
-
* Timestamp when the email was successfully delivered
|
|
70
|
-
*/
|
|
71
|
-
deliveredAt: Date;
|
|
72
|
-
/**
|
|
73
|
-
* Sender domain (for querying/filtering)
|
|
74
|
-
*/
|
|
75
|
-
senderDomain: string;
|
|
76
|
-
/**
|
|
77
|
-
* Priority level (higher = more important)
|
|
78
|
-
*/
|
|
79
|
-
priority: number;
|
|
80
|
-
/**
|
|
81
|
-
* JSON-serialized route data
|
|
82
|
-
*/
|
|
83
|
-
routeData: string;
|
|
84
|
-
/**
|
|
85
|
-
* DKIM signature status
|
|
86
|
-
*/
|
|
87
|
-
dkimSigned: boolean;
|
|
88
|
-
constructor();
|
|
89
|
-
/**
|
|
90
|
-
* Create a new CachedEmail with a unique ID
|
|
91
|
-
*/
|
|
92
|
-
static createNew(): CachedEmail;
|
|
93
|
-
/**
|
|
94
|
-
* Find an email by ID
|
|
95
|
-
*/
|
|
96
|
-
static findById(id: string): Promise<CachedEmail | null>;
|
|
97
|
-
/**
|
|
98
|
-
* Find all emails with a specific status
|
|
99
|
-
*/
|
|
100
|
-
static findByStatus(status: TCachedEmailStatus): Promise<CachedEmail[]>;
|
|
101
|
-
/**
|
|
102
|
-
* Find all emails pending delivery (status = pending and nextAttempt <= now)
|
|
103
|
-
*/
|
|
104
|
-
static findPendingForDelivery(): Promise<CachedEmail[]>;
|
|
105
|
-
/**
|
|
106
|
-
* Find emails by sender domain
|
|
107
|
-
*/
|
|
108
|
-
static findBySenderDomain(domain: string): Promise<CachedEmail[]>;
|
|
109
|
-
/**
|
|
110
|
-
* Mark as delivered
|
|
111
|
-
*/
|
|
112
|
-
markDelivered(): void;
|
|
113
|
-
/**
|
|
114
|
-
* Mark as failed with error
|
|
115
|
-
*/
|
|
116
|
-
markFailed(error: string): void;
|
|
117
|
-
/**
|
|
118
|
-
* Increment attempt counter and schedule next attempt
|
|
119
|
-
*/
|
|
120
|
-
scheduleRetry(delayMs?: number): void;
|
|
121
|
-
/**
|
|
122
|
-
* Extract sender domain from email address
|
|
123
|
-
*/
|
|
124
|
-
updateSenderDomain(): void;
|
|
125
|
-
}
|
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
-
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
-
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
-
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
-
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
-
var _, done = false;
|
|
7
|
-
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
-
var context = {};
|
|
9
|
-
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
-
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
-
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
-
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
-
if (kind === "accessor") {
|
|
14
|
-
if (result === void 0) continue;
|
|
15
|
-
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
-
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
-
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
-
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
-
}
|
|
20
|
-
else if (_ = accept(result)) {
|
|
21
|
-
if (kind === "field") initializers.unshift(_);
|
|
22
|
-
else descriptor[key] = _;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
-
done = true;
|
|
27
|
-
};
|
|
28
|
-
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
-
var useValue = arguments.length > 2;
|
|
30
|
-
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
-
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
-
}
|
|
33
|
-
return useValue ? value : void 0;
|
|
34
|
-
};
|
|
35
|
-
import * as plugins from '../../plugins.js';
|
|
36
|
-
import { CachedDocument, TTL } from '../classes.cached.document.js';
|
|
37
|
-
import { CacheDb } from '../classes.cachedb.js';
|
|
38
|
-
/**
|
|
39
|
-
* Helper to get the smartdata database instance
|
|
40
|
-
*/
|
|
41
|
-
const getDb = () => CacheDb.getInstance().getDb();
|
|
42
|
-
/**
|
|
43
|
-
* CachedEmail - Stores email queue items in the cache
|
|
44
|
-
*
|
|
45
|
-
* Used for persistent email queue storage, tracking delivery status,
|
|
46
|
-
* and maintaining email history for the configured TTL period.
|
|
47
|
-
*/
|
|
48
|
-
let CachedEmail = (() => {
|
|
49
|
-
let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
|
|
50
|
-
let _classDescriptor;
|
|
51
|
-
let _classExtraInitializers = [];
|
|
52
|
-
let _classThis;
|
|
53
|
-
let _classSuper = CachedDocument;
|
|
54
|
-
let _createdAt_decorators;
|
|
55
|
-
let _createdAt_initializers = [];
|
|
56
|
-
let _createdAt_extraInitializers = [];
|
|
57
|
-
let _expiresAt_decorators;
|
|
58
|
-
let _expiresAt_initializers = [];
|
|
59
|
-
let _expiresAt_extraInitializers = [];
|
|
60
|
-
let _lastAccessedAt_decorators;
|
|
61
|
-
let _lastAccessedAt_initializers = [];
|
|
62
|
-
let _lastAccessedAt_extraInitializers = [];
|
|
63
|
-
let _id_decorators;
|
|
64
|
-
let _id_initializers = [];
|
|
65
|
-
let _id_extraInitializers = [];
|
|
66
|
-
let _messageId_decorators;
|
|
67
|
-
let _messageId_initializers = [];
|
|
68
|
-
let _messageId_extraInitializers = [];
|
|
69
|
-
let _from_decorators;
|
|
70
|
-
let _from_initializers = [];
|
|
71
|
-
let _from_extraInitializers = [];
|
|
72
|
-
let _to_decorators;
|
|
73
|
-
let _to_initializers = [];
|
|
74
|
-
let _to_extraInitializers = [];
|
|
75
|
-
let _cc_decorators;
|
|
76
|
-
let _cc_initializers = [];
|
|
77
|
-
let _cc_extraInitializers = [];
|
|
78
|
-
let _bcc_decorators;
|
|
79
|
-
let _bcc_initializers = [];
|
|
80
|
-
let _bcc_extraInitializers = [];
|
|
81
|
-
let _subject_decorators;
|
|
82
|
-
let _subject_initializers = [];
|
|
83
|
-
let _subject_extraInitializers = [];
|
|
84
|
-
let _rawContent_decorators;
|
|
85
|
-
let _rawContent_initializers = [];
|
|
86
|
-
let _rawContent_extraInitializers = [];
|
|
87
|
-
let _status_decorators;
|
|
88
|
-
let _status_initializers = [];
|
|
89
|
-
let _status_extraInitializers = [];
|
|
90
|
-
let _attempts_decorators;
|
|
91
|
-
let _attempts_initializers = [];
|
|
92
|
-
let _attempts_extraInitializers = [];
|
|
93
|
-
let _maxAttempts_decorators;
|
|
94
|
-
let _maxAttempts_initializers = [];
|
|
95
|
-
let _maxAttempts_extraInitializers = [];
|
|
96
|
-
let _nextAttempt_decorators;
|
|
97
|
-
let _nextAttempt_initializers = [];
|
|
98
|
-
let _nextAttempt_extraInitializers = [];
|
|
99
|
-
let _lastError_decorators;
|
|
100
|
-
let _lastError_initializers = [];
|
|
101
|
-
let _lastError_extraInitializers = [];
|
|
102
|
-
let _deliveredAt_decorators;
|
|
103
|
-
let _deliveredAt_initializers = [];
|
|
104
|
-
let _deliveredAt_extraInitializers = [];
|
|
105
|
-
let _senderDomain_decorators;
|
|
106
|
-
let _senderDomain_initializers = [];
|
|
107
|
-
let _senderDomain_extraInitializers = [];
|
|
108
|
-
let _priority_decorators;
|
|
109
|
-
let _priority_initializers = [];
|
|
110
|
-
let _priority_extraInitializers = [];
|
|
111
|
-
let _routeData_decorators;
|
|
112
|
-
let _routeData_initializers = [];
|
|
113
|
-
let _routeData_extraInitializers = [];
|
|
114
|
-
let _dkimSigned_decorators;
|
|
115
|
-
let _dkimSigned_initializers = [];
|
|
116
|
-
let _dkimSigned_extraInitializers = [];
|
|
117
|
-
var CachedEmail = class extends _classSuper {
|
|
118
|
-
static { _classThis = this; }
|
|
119
|
-
static {
|
|
120
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
121
|
-
_createdAt_decorators = [plugins.smartdata.svDb()];
|
|
122
|
-
_expiresAt_decorators = [plugins.smartdata.svDb()];
|
|
123
|
-
_lastAccessedAt_decorators = [plugins.smartdata.svDb()];
|
|
124
|
-
_id_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
|
|
125
|
-
_messageId_decorators = [plugins.smartdata.svDb()];
|
|
126
|
-
_from_decorators = [plugins.smartdata.svDb()];
|
|
127
|
-
_to_decorators = [plugins.smartdata.svDb()];
|
|
128
|
-
_cc_decorators = [plugins.smartdata.svDb()];
|
|
129
|
-
_bcc_decorators = [plugins.smartdata.svDb()];
|
|
130
|
-
_subject_decorators = [plugins.smartdata.svDb()];
|
|
131
|
-
_rawContent_decorators = [plugins.smartdata.svDb()];
|
|
132
|
-
_status_decorators = [plugins.smartdata.svDb()];
|
|
133
|
-
_attempts_decorators = [plugins.smartdata.svDb()];
|
|
134
|
-
_maxAttempts_decorators = [plugins.smartdata.svDb()];
|
|
135
|
-
_nextAttempt_decorators = [plugins.smartdata.svDb()];
|
|
136
|
-
_lastError_decorators = [plugins.smartdata.svDb()];
|
|
137
|
-
_deliveredAt_decorators = [plugins.smartdata.svDb()];
|
|
138
|
-
_senderDomain_decorators = [plugins.smartdata.svDb()];
|
|
139
|
-
_priority_decorators = [plugins.smartdata.svDb()];
|
|
140
|
-
_routeData_decorators = [plugins.smartdata.svDb()];
|
|
141
|
-
_dkimSigned_decorators = [plugins.smartdata.svDb()];
|
|
142
|
-
__esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
|
|
143
|
-
__esDecorate(null, null, _expiresAt_decorators, { kind: "field", name: "expiresAt", static: false, private: false, access: { has: obj => "expiresAt" in obj, get: obj => obj.expiresAt, set: (obj, value) => { obj.expiresAt = value; } }, metadata: _metadata }, _expiresAt_initializers, _expiresAt_extraInitializers);
|
|
144
|
-
__esDecorate(null, null, _lastAccessedAt_decorators, { kind: "field", name: "lastAccessedAt", static: false, private: false, access: { has: obj => "lastAccessedAt" in obj, get: obj => obj.lastAccessedAt, set: (obj, value) => { obj.lastAccessedAt = value; } }, metadata: _metadata }, _lastAccessedAt_initializers, _lastAccessedAt_extraInitializers);
|
|
145
|
-
__esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
|
|
146
|
-
__esDecorate(null, null, _messageId_decorators, { kind: "field", name: "messageId", static: false, private: false, access: { has: obj => "messageId" in obj, get: obj => obj.messageId, set: (obj, value) => { obj.messageId = value; } }, metadata: _metadata }, _messageId_initializers, _messageId_extraInitializers);
|
|
147
|
-
__esDecorate(null, null, _from_decorators, { kind: "field", name: "from", static: false, private: false, access: { has: obj => "from" in obj, get: obj => obj.from, set: (obj, value) => { obj.from = value; } }, metadata: _metadata }, _from_initializers, _from_extraInitializers);
|
|
148
|
-
__esDecorate(null, null, _to_decorators, { kind: "field", name: "to", static: false, private: false, access: { has: obj => "to" in obj, get: obj => obj.to, set: (obj, value) => { obj.to = value; } }, metadata: _metadata }, _to_initializers, _to_extraInitializers);
|
|
149
|
-
__esDecorate(null, null, _cc_decorators, { kind: "field", name: "cc", static: false, private: false, access: { has: obj => "cc" in obj, get: obj => obj.cc, set: (obj, value) => { obj.cc = value; } }, metadata: _metadata }, _cc_initializers, _cc_extraInitializers);
|
|
150
|
-
__esDecorate(null, null, _bcc_decorators, { kind: "field", name: "bcc", static: false, private: false, access: { has: obj => "bcc" in obj, get: obj => obj.bcc, set: (obj, value) => { obj.bcc = value; } }, metadata: _metadata }, _bcc_initializers, _bcc_extraInitializers);
|
|
151
|
-
__esDecorate(null, null, _subject_decorators, { kind: "field", name: "subject", static: false, private: false, access: { has: obj => "subject" in obj, get: obj => obj.subject, set: (obj, value) => { obj.subject = value; } }, metadata: _metadata }, _subject_initializers, _subject_extraInitializers);
|
|
152
|
-
__esDecorate(null, null, _rawContent_decorators, { kind: "field", name: "rawContent", static: false, private: false, access: { has: obj => "rawContent" in obj, get: obj => obj.rawContent, set: (obj, value) => { obj.rawContent = value; } }, metadata: _metadata }, _rawContent_initializers, _rawContent_extraInitializers);
|
|
153
|
-
__esDecorate(null, null, _status_decorators, { kind: "field", name: "status", static: false, private: false, access: { has: obj => "status" in obj, get: obj => obj.status, set: (obj, value) => { obj.status = value; } }, metadata: _metadata }, _status_initializers, _status_extraInitializers);
|
|
154
|
-
__esDecorate(null, null, _attempts_decorators, { kind: "field", name: "attempts", static: false, private: false, access: { has: obj => "attempts" in obj, get: obj => obj.attempts, set: (obj, value) => { obj.attempts = value; } }, metadata: _metadata }, _attempts_initializers, _attempts_extraInitializers);
|
|
155
|
-
__esDecorate(null, null, _maxAttempts_decorators, { kind: "field", name: "maxAttempts", static: false, private: false, access: { has: obj => "maxAttempts" in obj, get: obj => obj.maxAttempts, set: (obj, value) => { obj.maxAttempts = value; } }, metadata: _metadata }, _maxAttempts_initializers, _maxAttempts_extraInitializers);
|
|
156
|
-
__esDecorate(null, null, _nextAttempt_decorators, { kind: "field", name: "nextAttempt", static: false, private: false, access: { has: obj => "nextAttempt" in obj, get: obj => obj.nextAttempt, set: (obj, value) => { obj.nextAttempt = value; } }, metadata: _metadata }, _nextAttempt_initializers, _nextAttempt_extraInitializers);
|
|
157
|
-
__esDecorate(null, null, _lastError_decorators, { kind: "field", name: "lastError", static: false, private: false, access: { has: obj => "lastError" in obj, get: obj => obj.lastError, set: (obj, value) => { obj.lastError = value; } }, metadata: _metadata }, _lastError_initializers, _lastError_extraInitializers);
|
|
158
|
-
__esDecorate(null, null, _deliveredAt_decorators, { kind: "field", name: "deliveredAt", static: false, private: false, access: { has: obj => "deliveredAt" in obj, get: obj => obj.deliveredAt, set: (obj, value) => { obj.deliveredAt = value; } }, metadata: _metadata }, _deliveredAt_initializers, _deliveredAt_extraInitializers);
|
|
159
|
-
__esDecorate(null, null, _senderDomain_decorators, { kind: "field", name: "senderDomain", static: false, private: false, access: { has: obj => "senderDomain" in obj, get: obj => obj.senderDomain, set: (obj, value) => { obj.senderDomain = value; } }, metadata: _metadata }, _senderDomain_initializers, _senderDomain_extraInitializers);
|
|
160
|
-
__esDecorate(null, null, _priority_decorators, { kind: "field", name: "priority", static: false, private: false, access: { has: obj => "priority" in obj, get: obj => obj.priority, set: (obj, value) => { obj.priority = value; } }, metadata: _metadata }, _priority_initializers, _priority_extraInitializers);
|
|
161
|
-
__esDecorate(null, null, _routeData_decorators, { kind: "field", name: "routeData", static: false, private: false, access: { has: obj => "routeData" in obj, get: obj => obj.routeData, set: (obj, value) => { obj.routeData = value; } }, metadata: _metadata }, _routeData_initializers, _routeData_extraInitializers);
|
|
162
|
-
__esDecorate(null, null, _dkimSigned_decorators, { kind: "field", name: "dkimSigned", static: false, private: false, access: { has: obj => "dkimSigned" in obj, get: obj => obj.dkimSigned, set: (obj, value) => { obj.dkimSigned = value; } }, metadata: _metadata }, _dkimSigned_initializers, _dkimSigned_extraInitializers);
|
|
163
|
-
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
164
|
-
CachedEmail = _classThis = _classDescriptor.value;
|
|
165
|
-
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
166
|
-
__runInitializers(_classThis, _classExtraInitializers);
|
|
167
|
-
}
|
|
168
|
-
// TTL fields from base class (decorators required on concrete class)
|
|
169
|
-
createdAt = __runInitializers(this, _createdAt_initializers, new Date());
|
|
170
|
-
expiresAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _expiresAt_initializers, new Date(Date.now() + TTL.DAYS_30)));
|
|
171
|
-
lastAccessedAt = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _lastAccessedAt_initializers, new Date()));
|
|
172
|
-
/**
|
|
173
|
-
* Unique identifier for this email
|
|
174
|
-
*/
|
|
175
|
-
id = (__runInitializers(this, _lastAccessedAt_extraInitializers), __runInitializers(this, _id_initializers, void 0));
|
|
176
|
-
/**
|
|
177
|
-
* Email message ID (RFC 822 Message-ID header)
|
|
178
|
-
*/
|
|
179
|
-
messageId = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _messageId_initializers, void 0));
|
|
180
|
-
/**
|
|
181
|
-
* Sender email address (envelope from)
|
|
182
|
-
*/
|
|
183
|
-
from = (__runInitializers(this, _messageId_extraInitializers), __runInitializers(this, _from_initializers, void 0));
|
|
184
|
-
/**
|
|
185
|
-
* Recipient email addresses
|
|
186
|
-
*/
|
|
187
|
-
to = (__runInitializers(this, _from_extraInitializers), __runInitializers(this, _to_initializers, void 0));
|
|
188
|
-
/**
|
|
189
|
-
* CC recipients
|
|
190
|
-
*/
|
|
191
|
-
cc = (__runInitializers(this, _to_extraInitializers), __runInitializers(this, _cc_initializers, void 0));
|
|
192
|
-
/**
|
|
193
|
-
* BCC recipients
|
|
194
|
-
*/
|
|
195
|
-
bcc = (__runInitializers(this, _cc_extraInitializers), __runInitializers(this, _bcc_initializers, void 0));
|
|
196
|
-
/**
|
|
197
|
-
* Email subject
|
|
198
|
-
*/
|
|
199
|
-
subject = (__runInitializers(this, _bcc_extraInitializers), __runInitializers(this, _subject_initializers, void 0));
|
|
200
|
-
/**
|
|
201
|
-
* Raw RFC822 email content
|
|
202
|
-
*/
|
|
203
|
-
rawContent = (__runInitializers(this, _subject_extraInitializers), __runInitializers(this, _rawContent_initializers, void 0));
|
|
204
|
-
/**
|
|
205
|
-
* Current status of the email
|
|
206
|
-
*/
|
|
207
|
-
status = (__runInitializers(this, _rawContent_extraInitializers), __runInitializers(this, _status_initializers, void 0));
|
|
208
|
-
/**
|
|
209
|
-
* Number of delivery attempts
|
|
210
|
-
*/
|
|
211
|
-
attempts = (__runInitializers(this, _status_extraInitializers), __runInitializers(this, _attempts_initializers, 0));
|
|
212
|
-
/**
|
|
213
|
-
* Maximum number of delivery attempts
|
|
214
|
-
*/
|
|
215
|
-
maxAttempts = (__runInitializers(this, _attempts_extraInitializers), __runInitializers(this, _maxAttempts_initializers, 3));
|
|
216
|
-
/**
|
|
217
|
-
* Timestamp for next delivery attempt
|
|
218
|
-
*/
|
|
219
|
-
nextAttempt = (__runInitializers(this, _maxAttempts_extraInitializers), __runInitializers(this, _nextAttempt_initializers, void 0));
|
|
220
|
-
/**
|
|
221
|
-
* Last error message if delivery failed
|
|
222
|
-
*/
|
|
223
|
-
lastError = (__runInitializers(this, _nextAttempt_extraInitializers), __runInitializers(this, _lastError_initializers, void 0));
|
|
224
|
-
/**
|
|
225
|
-
* Timestamp when the email was successfully delivered
|
|
226
|
-
*/
|
|
227
|
-
deliveredAt = (__runInitializers(this, _lastError_extraInitializers), __runInitializers(this, _deliveredAt_initializers, void 0));
|
|
228
|
-
/**
|
|
229
|
-
* Sender domain (for querying/filtering)
|
|
230
|
-
*/
|
|
231
|
-
senderDomain = (__runInitializers(this, _deliveredAt_extraInitializers), __runInitializers(this, _senderDomain_initializers, void 0));
|
|
232
|
-
/**
|
|
233
|
-
* Priority level (higher = more important)
|
|
234
|
-
*/
|
|
235
|
-
priority = (__runInitializers(this, _senderDomain_extraInitializers), __runInitializers(this, _priority_initializers, 0));
|
|
236
|
-
/**
|
|
237
|
-
* JSON-serialized route data
|
|
238
|
-
*/
|
|
239
|
-
routeData = (__runInitializers(this, _priority_extraInitializers), __runInitializers(this, _routeData_initializers, void 0));
|
|
240
|
-
/**
|
|
241
|
-
* DKIM signature status
|
|
242
|
-
*/
|
|
243
|
-
dkimSigned = (__runInitializers(this, _routeData_extraInitializers), __runInitializers(this, _dkimSigned_initializers, false));
|
|
244
|
-
constructor() {
|
|
245
|
-
super();
|
|
246
|
-
__runInitializers(this, _dkimSigned_extraInitializers);
|
|
247
|
-
this.setTTL(TTL.DAYS_30); // Default 30-day TTL
|
|
248
|
-
this.status = 'pending';
|
|
249
|
-
this.to = [];
|
|
250
|
-
this.cc = [];
|
|
251
|
-
this.bcc = [];
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Create a new CachedEmail with a unique ID
|
|
255
|
-
*/
|
|
256
|
-
static createNew() {
|
|
257
|
-
const email = new CachedEmail();
|
|
258
|
-
email.id = plugins.uuid.v4();
|
|
259
|
-
return email;
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Find an email by ID
|
|
263
|
-
*/
|
|
264
|
-
static async findById(id) {
|
|
265
|
-
return await CachedEmail.getInstance({
|
|
266
|
-
id,
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Find all emails with a specific status
|
|
271
|
-
*/
|
|
272
|
-
static async findByStatus(status) {
|
|
273
|
-
return await CachedEmail.getInstances({
|
|
274
|
-
status,
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Find all emails pending delivery (status = pending and nextAttempt <= now)
|
|
279
|
-
*/
|
|
280
|
-
static async findPendingForDelivery() {
|
|
281
|
-
const now = new Date();
|
|
282
|
-
return await CachedEmail.getInstances({
|
|
283
|
-
status: 'pending',
|
|
284
|
-
nextAttempt: { $lte: now },
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Find emails by sender domain
|
|
289
|
-
*/
|
|
290
|
-
static async findBySenderDomain(domain) {
|
|
291
|
-
return await CachedEmail.getInstances({
|
|
292
|
-
senderDomain: domain,
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Mark as delivered
|
|
297
|
-
*/
|
|
298
|
-
markDelivered() {
|
|
299
|
-
this.status = 'delivered';
|
|
300
|
-
this.deliveredAt = new Date();
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Mark as failed with error
|
|
304
|
-
*/
|
|
305
|
-
markFailed(error) {
|
|
306
|
-
this.status = 'failed';
|
|
307
|
-
this.lastError = error;
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Increment attempt counter and schedule next attempt
|
|
311
|
-
*/
|
|
312
|
-
scheduleRetry(delayMs = 5 * 60 * 1000) {
|
|
313
|
-
this.attempts++;
|
|
314
|
-
this.status = 'deferred';
|
|
315
|
-
this.nextAttempt = new Date(Date.now() + delayMs);
|
|
316
|
-
// If max attempts reached, mark as failed
|
|
317
|
-
if (this.attempts >= this.maxAttempts) {
|
|
318
|
-
this.status = 'failed';
|
|
319
|
-
this.lastError = `Max attempts (${this.maxAttempts}) reached`;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Extract sender domain from email address
|
|
324
|
-
*/
|
|
325
|
-
updateSenderDomain() {
|
|
326
|
-
if (this.from) {
|
|
327
|
-
const match = this.from.match(/@([^>]+)>?$/);
|
|
328
|
-
if (match) {
|
|
329
|
-
this.senderDomain = match[1].toLowerCase();
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
};
|
|
334
|
-
return CachedEmail = _classThis;
|
|
335
|
-
})();
|
|
336
|
-
export { CachedEmail };
|
|
337
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZWQuZW1haWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9jYWNoZS9kb2N1bWVudHMvY2xhc3Nlcy5jYWNoZWQuZW1haWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPaEQ7O0dBRUc7QUFDSCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFbEQ7Ozs7O0dBS0c7SUFFVSxXQUFXOzRCQUR2QixPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7OztzQkFDWCxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJCQUF0QixTQUFRLFdBQTJCOzs7O3FDQUV6RCxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7MENBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOzhCQU14QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FNeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7Z0NBTXhCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOzhCQU14QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs4QkFNeEIs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
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { CachedDocument } from '../classes.cached.document.js';
|
|
2
|
-
/**
|
|
3
|
-
* IP reputation result data
|
|
4
|
-
*/
|
|
5
|
-
export interface IIPReputationData {
|
|
6
|
-
score: number;
|
|
7
|
-
isSpam: boolean;
|
|
8
|
-
isProxy: boolean;
|
|
9
|
-
isTor: boolean;
|
|
10
|
-
isVPN: boolean;
|
|
11
|
-
country?: string;
|
|
12
|
-
asn?: string;
|
|
13
|
-
org?: string;
|
|
14
|
-
blacklists?: string[];
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* CachedIPReputation - Stores IP reputation lookup results
|
|
18
|
-
*
|
|
19
|
-
* Caches the results of IP reputation checks to avoid repeated
|
|
20
|
-
* external API calls. Default TTL is 24 hours.
|
|
21
|
-
*/
|
|
22
|
-
export declare class CachedIPReputation extends CachedDocument<CachedIPReputation> {
|
|
23
|
-
createdAt: Date;
|
|
24
|
-
expiresAt: Date;
|
|
25
|
-
lastAccessedAt: Date;
|
|
26
|
-
/**
|
|
27
|
-
* IP address (unique identifier)
|
|
28
|
-
*/
|
|
29
|
-
ipAddress: string;
|
|
30
|
-
/**
|
|
31
|
-
* Reputation score (0-100, higher = better)
|
|
32
|
-
*/
|
|
33
|
-
score: number;
|
|
34
|
-
/**
|
|
35
|
-
* Whether the IP is flagged as spam source
|
|
36
|
-
*/
|
|
37
|
-
isSpam: boolean;
|
|
38
|
-
/**
|
|
39
|
-
* Whether the IP is a known proxy
|
|
40
|
-
*/
|
|
41
|
-
isProxy: boolean;
|
|
42
|
-
/**
|
|
43
|
-
* Whether the IP is a Tor exit node
|
|
44
|
-
*/
|
|
45
|
-
isTor: boolean;
|
|
46
|
-
/**
|
|
47
|
-
* Whether the IP is a VPN endpoint
|
|
48
|
-
*/
|
|
49
|
-
isVPN: boolean;
|
|
50
|
-
/**
|
|
51
|
-
* Country code (ISO 3166-1 alpha-2)
|
|
52
|
-
*/
|
|
53
|
-
country: string;
|
|
54
|
-
/**
|
|
55
|
-
* Autonomous System Number
|
|
56
|
-
*/
|
|
57
|
-
asn: string;
|
|
58
|
-
/**
|
|
59
|
-
* Organization name
|
|
60
|
-
*/
|
|
61
|
-
org: string;
|
|
62
|
-
/**
|
|
63
|
-
* List of blacklists the IP appears on
|
|
64
|
-
*/
|
|
65
|
-
blacklists: string[];
|
|
66
|
-
/**
|
|
67
|
-
* Number of times this IP has been checked
|
|
68
|
-
*/
|
|
69
|
-
checkCount: number;
|
|
70
|
-
/**
|
|
71
|
-
* Number of connections from this IP
|
|
72
|
-
*/
|
|
73
|
-
connectionCount: number;
|
|
74
|
-
/**
|
|
75
|
-
* Number of emails received from this IP
|
|
76
|
-
*/
|
|
77
|
-
emailCount: number;
|
|
78
|
-
/**
|
|
79
|
-
* Number of spam emails from this IP
|
|
80
|
-
*/
|
|
81
|
-
spamCount: number;
|
|
82
|
-
constructor();
|
|
83
|
-
/**
|
|
84
|
-
* Create from reputation data
|
|
85
|
-
*/
|
|
86
|
-
static fromReputationData(ipAddress: string, data: IIPReputationData): CachedIPReputation;
|
|
87
|
-
/**
|
|
88
|
-
* Convert to reputation data object
|
|
89
|
-
*/
|
|
90
|
-
toReputationData(): IIPReputationData;
|
|
91
|
-
/**
|
|
92
|
-
* Find by IP address
|
|
93
|
-
*/
|
|
94
|
-
static findByIP(ipAddress: string): Promise<CachedIPReputation | null>;
|
|
95
|
-
/**
|
|
96
|
-
* Find all IPs flagged as spam
|
|
97
|
-
*/
|
|
98
|
-
static findSpamIPs(): Promise<CachedIPReputation[]>;
|
|
99
|
-
/**
|
|
100
|
-
* Find IPs with score below threshold
|
|
101
|
-
*/
|
|
102
|
-
static findLowScoreIPs(threshold: number): Promise<CachedIPReputation[]>;
|
|
103
|
-
/**
|
|
104
|
-
* Record a connection from this IP
|
|
105
|
-
*/
|
|
106
|
-
recordConnection(): void;
|
|
107
|
-
/**
|
|
108
|
-
* Record an email from this IP
|
|
109
|
-
*/
|
|
110
|
-
recordEmail(isSpam?: boolean): void;
|
|
111
|
-
/**
|
|
112
|
-
* Update the reputation data
|
|
113
|
-
*/
|
|
114
|
-
updateReputation(data: IIPReputationData): void;
|
|
115
|
-
/**
|
|
116
|
-
* Check if this IP should be blocked
|
|
117
|
-
*/
|
|
118
|
-
shouldBlock(): boolean;
|
|
119
|
-
}
|
|
@@ -1,323 +0,0 @@
|
|
|
1
|
-
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
-
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
-
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
-
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
-
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
-
var _, done = false;
|
|
7
|
-
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
-
var context = {};
|
|
9
|
-
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
-
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
-
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
-
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
-
if (kind === "accessor") {
|
|
14
|
-
if (result === void 0) continue;
|
|
15
|
-
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
-
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
-
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
-
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
-
}
|
|
20
|
-
else if (_ = accept(result)) {
|
|
21
|
-
if (kind === "field") initializers.unshift(_);
|
|
22
|
-
else descriptor[key] = _;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
-
done = true;
|
|
27
|
-
};
|
|
28
|
-
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
-
var useValue = arguments.length > 2;
|
|
30
|
-
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
-
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
-
}
|
|
33
|
-
return useValue ? value : void 0;
|
|
34
|
-
};
|
|
35
|
-
import * as plugins from '../../plugins.js';
|
|
36
|
-
import { CachedDocument, TTL } from '../classes.cached.document.js';
|
|
37
|
-
import { CacheDb } from '../classes.cachedb.js';
|
|
38
|
-
/**
|
|
39
|
-
* Helper to get the smartdata database instance
|
|
40
|
-
*/
|
|
41
|
-
const getDb = () => CacheDb.getInstance().getDb();
|
|
42
|
-
/**
|
|
43
|
-
* CachedIPReputation - Stores IP reputation lookup results
|
|
44
|
-
*
|
|
45
|
-
* Caches the results of IP reputation checks to avoid repeated
|
|
46
|
-
* external API calls. Default TTL is 24 hours.
|
|
47
|
-
*/
|
|
48
|
-
let CachedIPReputation = (() => {
|
|
49
|
-
let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
|
|
50
|
-
let _classDescriptor;
|
|
51
|
-
let _classExtraInitializers = [];
|
|
52
|
-
let _classThis;
|
|
53
|
-
let _classSuper = CachedDocument;
|
|
54
|
-
let _createdAt_decorators;
|
|
55
|
-
let _createdAt_initializers = [];
|
|
56
|
-
let _createdAt_extraInitializers = [];
|
|
57
|
-
let _expiresAt_decorators;
|
|
58
|
-
let _expiresAt_initializers = [];
|
|
59
|
-
let _expiresAt_extraInitializers = [];
|
|
60
|
-
let _lastAccessedAt_decorators;
|
|
61
|
-
let _lastAccessedAt_initializers = [];
|
|
62
|
-
let _lastAccessedAt_extraInitializers = [];
|
|
63
|
-
let _ipAddress_decorators;
|
|
64
|
-
let _ipAddress_initializers = [];
|
|
65
|
-
let _ipAddress_extraInitializers = [];
|
|
66
|
-
let _score_decorators;
|
|
67
|
-
let _score_initializers = [];
|
|
68
|
-
let _score_extraInitializers = [];
|
|
69
|
-
let _isSpam_decorators;
|
|
70
|
-
let _isSpam_initializers = [];
|
|
71
|
-
let _isSpam_extraInitializers = [];
|
|
72
|
-
let _isProxy_decorators;
|
|
73
|
-
let _isProxy_initializers = [];
|
|
74
|
-
let _isProxy_extraInitializers = [];
|
|
75
|
-
let _isTor_decorators;
|
|
76
|
-
let _isTor_initializers = [];
|
|
77
|
-
let _isTor_extraInitializers = [];
|
|
78
|
-
let _isVPN_decorators;
|
|
79
|
-
let _isVPN_initializers = [];
|
|
80
|
-
let _isVPN_extraInitializers = [];
|
|
81
|
-
let _country_decorators;
|
|
82
|
-
let _country_initializers = [];
|
|
83
|
-
let _country_extraInitializers = [];
|
|
84
|
-
let _asn_decorators;
|
|
85
|
-
let _asn_initializers = [];
|
|
86
|
-
let _asn_extraInitializers = [];
|
|
87
|
-
let _org_decorators;
|
|
88
|
-
let _org_initializers = [];
|
|
89
|
-
let _org_extraInitializers = [];
|
|
90
|
-
let _blacklists_decorators;
|
|
91
|
-
let _blacklists_initializers = [];
|
|
92
|
-
let _blacklists_extraInitializers = [];
|
|
93
|
-
let _checkCount_decorators;
|
|
94
|
-
let _checkCount_initializers = [];
|
|
95
|
-
let _checkCount_extraInitializers = [];
|
|
96
|
-
let _connectionCount_decorators;
|
|
97
|
-
let _connectionCount_initializers = [];
|
|
98
|
-
let _connectionCount_extraInitializers = [];
|
|
99
|
-
let _emailCount_decorators;
|
|
100
|
-
let _emailCount_initializers = [];
|
|
101
|
-
let _emailCount_extraInitializers = [];
|
|
102
|
-
let _spamCount_decorators;
|
|
103
|
-
let _spamCount_initializers = [];
|
|
104
|
-
let _spamCount_extraInitializers = [];
|
|
105
|
-
var CachedIPReputation = class extends _classSuper {
|
|
106
|
-
static { _classThis = this; }
|
|
107
|
-
static {
|
|
108
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
109
|
-
_createdAt_decorators = [plugins.smartdata.svDb()];
|
|
110
|
-
_expiresAt_decorators = [plugins.smartdata.svDb()];
|
|
111
|
-
_lastAccessedAt_decorators = [plugins.smartdata.svDb()];
|
|
112
|
-
_ipAddress_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
|
|
113
|
-
_score_decorators = [plugins.smartdata.svDb()];
|
|
114
|
-
_isSpam_decorators = [plugins.smartdata.svDb()];
|
|
115
|
-
_isProxy_decorators = [plugins.smartdata.svDb()];
|
|
116
|
-
_isTor_decorators = [plugins.smartdata.svDb()];
|
|
117
|
-
_isVPN_decorators = [plugins.smartdata.svDb()];
|
|
118
|
-
_country_decorators = [plugins.smartdata.svDb()];
|
|
119
|
-
_asn_decorators = [plugins.smartdata.svDb()];
|
|
120
|
-
_org_decorators = [plugins.smartdata.svDb()];
|
|
121
|
-
_blacklists_decorators = [plugins.smartdata.svDb()];
|
|
122
|
-
_checkCount_decorators = [plugins.smartdata.svDb()];
|
|
123
|
-
_connectionCount_decorators = [plugins.smartdata.svDb()];
|
|
124
|
-
_emailCount_decorators = [plugins.smartdata.svDb()];
|
|
125
|
-
_spamCount_decorators = [plugins.smartdata.svDb()];
|
|
126
|
-
__esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
|
|
127
|
-
__esDecorate(null, null, _expiresAt_decorators, { kind: "field", name: "expiresAt", static: false, private: false, access: { has: obj => "expiresAt" in obj, get: obj => obj.expiresAt, set: (obj, value) => { obj.expiresAt = value; } }, metadata: _metadata }, _expiresAt_initializers, _expiresAt_extraInitializers);
|
|
128
|
-
__esDecorate(null, null, _lastAccessedAt_decorators, { kind: "field", name: "lastAccessedAt", static: false, private: false, access: { has: obj => "lastAccessedAt" in obj, get: obj => obj.lastAccessedAt, set: (obj, value) => { obj.lastAccessedAt = value; } }, metadata: _metadata }, _lastAccessedAt_initializers, _lastAccessedAt_extraInitializers);
|
|
129
|
-
__esDecorate(null, null, _ipAddress_decorators, { kind: "field", name: "ipAddress", static: false, private: false, access: { has: obj => "ipAddress" in obj, get: obj => obj.ipAddress, set: (obj, value) => { obj.ipAddress = value; } }, metadata: _metadata }, _ipAddress_initializers, _ipAddress_extraInitializers);
|
|
130
|
-
__esDecorate(null, null, _score_decorators, { kind: "field", name: "score", static: false, private: false, access: { has: obj => "score" in obj, get: obj => obj.score, set: (obj, value) => { obj.score = value; } }, metadata: _metadata }, _score_initializers, _score_extraInitializers);
|
|
131
|
-
__esDecorate(null, null, _isSpam_decorators, { kind: "field", name: "isSpam", static: false, private: false, access: { has: obj => "isSpam" in obj, get: obj => obj.isSpam, set: (obj, value) => { obj.isSpam = value; } }, metadata: _metadata }, _isSpam_initializers, _isSpam_extraInitializers);
|
|
132
|
-
__esDecorate(null, null, _isProxy_decorators, { kind: "field", name: "isProxy", static: false, private: false, access: { has: obj => "isProxy" in obj, get: obj => obj.isProxy, set: (obj, value) => { obj.isProxy = value; } }, metadata: _metadata }, _isProxy_initializers, _isProxy_extraInitializers);
|
|
133
|
-
__esDecorate(null, null, _isTor_decorators, { kind: "field", name: "isTor", static: false, private: false, access: { has: obj => "isTor" in obj, get: obj => obj.isTor, set: (obj, value) => { obj.isTor = value; } }, metadata: _metadata }, _isTor_initializers, _isTor_extraInitializers);
|
|
134
|
-
__esDecorate(null, null, _isVPN_decorators, { kind: "field", name: "isVPN", static: false, private: false, access: { has: obj => "isVPN" in obj, get: obj => obj.isVPN, set: (obj, value) => { obj.isVPN = value; } }, metadata: _metadata }, _isVPN_initializers, _isVPN_extraInitializers);
|
|
135
|
-
__esDecorate(null, null, _country_decorators, { kind: "field", name: "country", static: false, private: false, access: { has: obj => "country" in obj, get: obj => obj.country, set: (obj, value) => { obj.country = value; } }, metadata: _metadata }, _country_initializers, _country_extraInitializers);
|
|
136
|
-
__esDecorate(null, null, _asn_decorators, { kind: "field", name: "asn", static: false, private: false, access: { has: obj => "asn" in obj, get: obj => obj.asn, set: (obj, value) => { obj.asn = value; } }, metadata: _metadata }, _asn_initializers, _asn_extraInitializers);
|
|
137
|
-
__esDecorate(null, null, _org_decorators, { kind: "field", name: "org", static: false, private: false, access: { has: obj => "org" in obj, get: obj => obj.org, set: (obj, value) => { obj.org = value; } }, metadata: _metadata }, _org_initializers, _org_extraInitializers);
|
|
138
|
-
__esDecorate(null, null, _blacklists_decorators, { kind: "field", name: "blacklists", static: false, private: false, access: { has: obj => "blacklists" in obj, get: obj => obj.blacklists, set: (obj, value) => { obj.blacklists = value; } }, metadata: _metadata }, _blacklists_initializers, _blacklists_extraInitializers);
|
|
139
|
-
__esDecorate(null, null, _checkCount_decorators, { kind: "field", name: "checkCount", static: false, private: false, access: { has: obj => "checkCount" in obj, get: obj => obj.checkCount, set: (obj, value) => { obj.checkCount = value; } }, metadata: _metadata }, _checkCount_initializers, _checkCount_extraInitializers);
|
|
140
|
-
__esDecorate(null, null, _connectionCount_decorators, { kind: "field", name: "connectionCount", static: false, private: false, access: { has: obj => "connectionCount" in obj, get: obj => obj.connectionCount, set: (obj, value) => { obj.connectionCount = value; } }, metadata: _metadata }, _connectionCount_initializers, _connectionCount_extraInitializers);
|
|
141
|
-
__esDecorate(null, null, _emailCount_decorators, { kind: "field", name: "emailCount", static: false, private: false, access: { has: obj => "emailCount" in obj, get: obj => obj.emailCount, set: (obj, value) => { obj.emailCount = value; } }, metadata: _metadata }, _emailCount_initializers, _emailCount_extraInitializers);
|
|
142
|
-
__esDecorate(null, null, _spamCount_decorators, { kind: "field", name: "spamCount", static: false, private: false, access: { has: obj => "spamCount" in obj, get: obj => obj.spamCount, set: (obj, value) => { obj.spamCount = value; } }, metadata: _metadata }, _spamCount_initializers, _spamCount_extraInitializers);
|
|
143
|
-
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
144
|
-
CachedIPReputation = _classThis = _classDescriptor.value;
|
|
145
|
-
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
146
|
-
__runInitializers(_classThis, _classExtraInitializers);
|
|
147
|
-
}
|
|
148
|
-
// TTL fields from base class (decorators required on concrete class)
|
|
149
|
-
createdAt = __runInitializers(this, _createdAt_initializers, new Date());
|
|
150
|
-
expiresAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _expiresAt_initializers, new Date(Date.now() + TTL.HOURS_24)));
|
|
151
|
-
lastAccessedAt = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _lastAccessedAt_initializers, new Date()));
|
|
152
|
-
/**
|
|
153
|
-
* IP address (unique identifier)
|
|
154
|
-
*/
|
|
155
|
-
ipAddress = (__runInitializers(this, _lastAccessedAt_extraInitializers), __runInitializers(this, _ipAddress_initializers, void 0));
|
|
156
|
-
/**
|
|
157
|
-
* Reputation score (0-100, higher = better)
|
|
158
|
-
*/
|
|
159
|
-
score = (__runInitializers(this, _ipAddress_extraInitializers), __runInitializers(this, _score_initializers, void 0));
|
|
160
|
-
/**
|
|
161
|
-
* Whether the IP is flagged as spam source
|
|
162
|
-
*/
|
|
163
|
-
isSpam = (__runInitializers(this, _score_extraInitializers), __runInitializers(this, _isSpam_initializers, void 0));
|
|
164
|
-
/**
|
|
165
|
-
* Whether the IP is a known proxy
|
|
166
|
-
*/
|
|
167
|
-
isProxy = (__runInitializers(this, _isSpam_extraInitializers), __runInitializers(this, _isProxy_initializers, void 0));
|
|
168
|
-
/**
|
|
169
|
-
* Whether the IP is a Tor exit node
|
|
170
|
-
*/
|
|
171
|
-
isTor = (__runInitializers(this, _isProxy_extraInitializers), __runInitializers(this, _isTor_initializers, void 0));
|
|
172
|
-
/**
|
|
173
|
-
* Whether the IP is a VPN endpoint
|
|
174
|
-
*/
|
|
175
|
-
isVPN = (__runInitializers(this, _isTor_extraInitializers), __runInitializers(this, _isVPN_initializers, void 0));
|
|
176
|
-
/**
|
|
177
|
-
* Country code (ISO 3166-1 alpha-2)
|
|
178
|
-
*/
|
|
179
|
-
country = (__runInitializers(this, _isVPN_extraInitializers), __runInitializers(this, _country_initializers, void 0));
|
|
180
|
-
/**
|
|
181
|
-
* Autonomous System Number
|
|
182
|
-
*/
|
|
183
|
-
asn = (__runInitializers(this, _country_extraInitializers), __runInitializers(this, _asn_initializers, void 0));
|
|
184
|
-
/**
|
|
185
|
-
* Organization name
|
|
186
|
-
*/
|
|
187
|
-
org = (__runInitializers(this, _asn_extraInitializers), __runInitializers(this, _org_initializers, void 0));
|
|
188
|
-
/**
|
|
189
|
-
* List of blacklists the IP appears on
|
|
190
|
-
*/
|
|
191
|
-
blacklists = (__runInitializers(this, _org_extraInitializers), __runInitializers(this, _blacklists_initializers, void 0));
|
|
192
|
-
/**
|
|
193
|
-
* Number of times this IP has been checked
|
|
194
|
-
*/
|
|
195
|
-
checkCount = (__runInitializers(this, _blacklists_extraInitializers), __runInitializers(this, _checkCount_initializers, 0));
|
|
196
|
-
/**
|
|
197
|
-
* Number of connections from this IP
|
|
198
|
-
*/
|
|
199
|
-
connectionCount = (__runInitializers(this, _checkCount_extraInitializers), __runInitializers(this, _connectionCount_initializers, 0));
|
|
200
|
-
/**
|
|
201
|
-
* Number of emails received from this IP
|
|
202
|
-
*/
|
|
203
|
-
emailCount = (__runInitializers(this, _connectionCount_extraInitializers), __runInitializers(this, _emailCount_initializers, 0));
|
|
204
|
-
/**
|
|
205
|
-
* Number of spam emails from this IP
|
|
206
|
-
*/
|
|
207
|
-
spamCount = (__runInitializers(this, _emailCount_extraInitializers), __runInitializers(this, _spamCount_initializers, 0));
|
|
208
|
-
constructor() {
|
|
209
|
-
super();
|
|
210
|
-
__runInitializers(this, _spamCount_extraInitializers);
|
|
211
|
-
this.setTTL(TTL.HOURS_24); // Default 24-hour TTL
|
|
212
|
-
this.blacklists = [];
|
|
213
|
-
this.score = 50; // Default neutral score
|
|
214
|
-
this.isSpam = false;
|
|
215
|
-
this.isProxy = false;
|
|
216
|
-
this.isTor = false;
|
|
217
|
-
this.isVPN = false;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Create from reputation data
|
|
221
|
-
*/
|
|
222
|
-
static fromReputationData(ipAddress, data) {
|
|
223
|
-
const cached = new CachedIPReputation();
|
|
224
|
-
cached.ipAddress = ipAddress;
|
|
225
|
-
cached.score = data.score;
|
|
226
|
-
cached.isSpam = data.isSpam;
|
|
227
|
-
cached.isProxy = data.isProxy;
|
|
228
|
-
cached.isTor = data.isTor;
|
|
229
|
-
cached.isVPN = data.isVPN;
|
|
230
|
-
cached.country = data.country || '';
|
|
231
|
-
cached.asn = data.asn || '';
|
|
232
|
-
cached.org = data.org || '';
|
|
233
|
-
cached.blacklists = data.blacklists || [];
|
|
234
|
-
cached.checkCount = 1;
|
|
235
|
-
return cached;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Convert to reputation data object
|
|
239
|
-
*/
|
|
240
|
-
toReputationData() {
|
|
241
|
-
this.touch();
|
|
242
|
-
return {
|
|
243
|
-
score: this.score,
|
|
244
|
-
isSpam: this.isSpam,
|
|
245
|
-
isProxy: this.isProxy,
|
|
246
|
-
isTor: this.isTor,
|
|
247
|
-
isVPN: this.isVPN,
|
|
248
|
-
country: this.country,
|
|
249
|
-
asn: this.asn,
|
|
250
|
-
org: this.org,
|
|
251
|
-
blacklists: this.blacklists,
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Find by IP address
|
|
256
|
-
*/
|
|
257
|
-
static async findByIP(ipAddress) {
|
|
258
|
-
return await CachedIPReputation.getInstance({
|
|
259
|
-
ipAddress,
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Find all IPs flagged as spam
|
|
264
|
-
*/
|
|
265
|
-
static async findSpamIPs() {
|
|
266
|
-
return await CachedIPReputation.getInstances({
|
|
267
|
-
isSpam: true,
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Find IPs with score below threshold
|
|
272
|
-
*/
|
|
273
|
-
static async findLowScoreIPs(threshold) {
|
|
274
|
-
return await CachedIPReputation.getInstances({
|
|
275
|
-
score: { $lt: threshold },
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Record a connection from this IP
|
|
280
|
-
*/
|
|
281
|
-
recordConnection() {
|
|
282
|
-
this.connectionCount++;
|
|
283
|
-
this.touch();
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Record an email from this IP
|
|
287
|
-
*/
|
|
288
|
-
recordEmail(isSpam = false) {
|
|
289
|
-
this.emailCount++;
|
|
290
|
-
if (isSpam) {
|
|
291
|
-
this.spamCount++;
|
|
292
|
-
}
|
|
293
|
-
this.touch();
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Update the reputation data
|
|
297
|
-
*/
|
|
298
|
-
updateReputation(data) {
|
|
299
|
-
this.score = data.score;
|
|
300
|
-
this.isSpam = data.isSpam;
|
|
301
|
-
this.isProxy = data.isProxy;
|
|
302
|
-
this.isTor = data.isTor;
|
|
303
|
-
this.isVPN = data.isVPN;
|
|
304
|
-
this.country = data.country || this.country;
|
|
305
|
-
this.asn = data.asn || this.asn;
|
|
306
|
-
this.org = data.org || this.org;
|
|
307
|
-
this.blacklists = data.blacklists || this.blacklists;
|
|
308
|
-
this.checkCount++;
|
|
309
|
-
this.touch();
|
|
310
|
-
// Refresh TTL on update
|
|
311
|
-
this.setTTL(TTL.HOURS_24);
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Check if this IP should be blocked
|
|
315
|
-
*/
|
|
316
|
-
shouldBlock() {
|
|
317
|
-
return this.isSpam || this.score < 20 || this.blacklists.length > 2;
|
|
318
|
-
}
|
|
319
|
-
};
|
|
320
|
-
return CachedIPReputation = _classThis;
|
|
321
|
-
})();
|
|
322
|
-
export { CachedIPReputation };
|
|
323
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZWQuaXAucmVwdXRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2NhY2hlL2RvY3VtZW50cy9jbGFzc2VzLmNhY2hlZC5pcC5yZXB1dGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWhEOztHQUVHO0FBQ0gsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBaUJsRDs7Ozs7R0FLRztJQUVVLGtCQUFrQjs0QkFEOUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0osY0FBYzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FBdEIsU0FBUSxXQUFrQzs7OztxQ0FFdkUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7cUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOzBDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FNeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7aUNBTXhCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2tDQU14QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FNeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7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
|