@firela/billclaw-core 0.1.3
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/LICENSE +21 -0
- package/README.md +109 -0
- package/dist/billclaw.d.ts +76 -0
- package/dist/billclaw.d.ts.map +1 -0
- package/dist/billclaw.js +205 -0
- package/dist/billclaw.js.map +1 -0
- package/dist/credentials/index.d.ts +8 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +8 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/keychain.d.ts +92 -0
- package/dist/credentials/keychain.d.ts.map +1 -0
- package/dist/credentials/keychain.js +172 -0
- package/dist/credentials/keychain.js.map +1 -0
- package/dist/credentials/store.d.ts +76 -0
- package/dist/credentials/store.d.ts.map +1 -0
- package/dist/credentials/store.js +144 -0
- package/dist/credentials/store.js.map +1 -0
- package/dist/errors/errors.d.ts +92 -0
- package/dist/errors/errors.d.ts.map +1 -0
- package/dist/errors/errors.js +315 -0
- package/dist/errors/errors.js.map +1 -0
- package/dist/errors/index.d.ts +7 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/exporters/beancount.d.ts +42 -0
- package/dist/exporters/beancount.d.ts.map +1 -0
- package/dist/exporters/beancount.js +141 -0
- package/dist/exporters/beancount.js.map +1 -0
- package/dist/exporters/index.d.ts +8 -0
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +8 -0
- package/dist/exporters/index.js.map +1 -0
- package/dist/exporters/ledger.d.ts +42 -0
- package/dist/exporters/ledger.d.ts.map +1 -0
- package/dist/exporters/ledger.js +139 -0
- package/dist/exporters/ledger.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/models/config.d.ts +552 -0
- package/dist/models/config.d.ts.map +1 -0
- package/dist/models/config.js +168 -0
- package/dist/models/config.js.map +1 -0
- package/dist/models/index.d.ts +7 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +8 -0
- package/dist/models/index.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +7 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/types.d.ts +110 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +85 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/security/audit.d.ts +148 -0
- package/dist/security/audit.d.ts.map +1 -0
- package/dist/security/audit.js +286 -0
- package/dist/security/audit.js.map +1 -0
- package/dist/security/index.d.ts +7 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +7 -0
- package/dist/security/index.js.map +1 -0
- package/dist/services/event-emitter.d.ts +171 -0
- package/dist/services/event-emitter.d.ts.map +1 -0
- package/dist/services/event-emitter.js +287 -0
- package/dist/services/event-emitter.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/sources/gmail/bill-recognizer.d.ts +71 -0
- package/dist/sources/gmail/bill-recognizer.d.ts.map +1 -0
- package/dist/sources/gmail/bill-recognizer.js +341 -0
- package/dist/sources/gmail/bill-recognizer.js.map +1 -0
- package/dist/sources/gmail/email-parser.d.ts +68 -0
- package/dist/sources/gmail/email-parser.d.ts.map +1 -0
- package/dist/sources/gmail/email-parser.js +238 -0
- package/dist/sources/gmail/email-parser.js.map +1 -0
- package/dist/sources/gmail/gmail-fetch.d.ts +54 -0
- package/dist/sources/gmail/gmail-fetch.d.ts.map +1 -0
- package/dist/sources/gmail/gmail-fetch.js +300 -0
- package/dist/sources/gmail/gmail-fetch.js.map +1 -0
- package/dist/sources/gmail/index.d.ts +7 -0
- package/dist/sources/gmail/index.d.ts.map +1 -0
- package/dist/sources/gmail/index.js +7 -0
- package/dist/sources/gmail/index.js.map +1 -0
- package/dist/sources/index.d.ts +8 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +8 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/plaid/index.d.ts +7 -0
- package/dist/sources/plaid/index.d.ts.map +1 -0
- package/dist/sources/plaid/index.js +7 -0
- package/dist/sources/plaid/index.js.map +1 -0
- package/dist/sources/plaid/plaid-sync.d.ts +42 -0
- package/dist/sources/plaid/plaid-sync.d.ts.map +1 -0
- package/dist/sources/plaid/plaid-sync.js +182 -0
- package/dist/sources/plaid/plaid-sync.js.map +1 -0
- package/dist/storage/cache.d.ts +134 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +239 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexes.d.ts +136 -0
- package/dist/storage/indexes.d.ts.map +1 -0
- package/dist/storage/indexes.js +294 -0
- package/dist/storage/indexes.js.map +1 -0
- package/dist/storage/locking.d.ts +103 -0
- package/dist/storage/locking.d.ts.map +1 -0
- package/dist/storage/locking.js +158 -0
- package/dist/storage/locking.js.map +1 -0
- package/dist/storage/streaming.d.ts +102 -0
- package/dist/storage/streaming.d.ts.map +1 -0
- package/dist/storage/streaming.js +245 -0
- package/dist/storage/streaming.js.map +1 -0
- package/dist/storage/transaction-storage.d.ts +101 -0
- package/dist/storage/transaction-storage.d.ts.map +1 -0
- package/dist/storage/transaction-storage.js +193 -0
- package/dist/storage/transaction-storage.js.map +1 -0
- package/dist/sync/index.d.ts +7 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +7 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/sync-service.d.ts +42 -0
- package/dist/sync/sync-service.d.ts.map +1 -0
- package/dist/sync/sync-service.js +112 -0
- package/dist/sync/sync-service.js.map +1 -0
- package/dist/test-fixtures.d.ts +38 -0
- package/dist/test-fixtures.d.ts.map +1 -0
- package/dist/test-fixtures.js +137 -0
- package/dist/test-fixtures.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security audit logging for BillClaw
|
|
3
|
+
*
|
|
4
|
+
* Provides audit logging for all credential operations:
|
|
5
|
+
* - Credential access (read/write/delete)
|
|
6
|
+
* - Account linking/unlinking
|
|
7
|
+
* - Sync operations
|
|
8
|
+
* - Configuration changes
|
|
9
|
+
*
|
|
10
|
+
* Audit logs are stored locally and can be exported for compliance.
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from "node:fs/promises";
|
|
13
|
+
import * as path from "node:path";
|
|
14
|
+
import * as os from "node:os";
|
|
15
|
+
/**
|
|
16
|
+
* Audit event types
|
|
17
|
+
*/
|
|
18
|
+
export var AuditEventType;
|
|
19
|
+
(function (AuditEventType) {
|
|
20
|
+
// Credential operations
|
|
21
|
+
AuditEventType["CREDENTIAL_CREATED"] = "credential.created";
|
|
22
|
+
AuditEventType["CREDENTIAL_READ"] = "credential.read";
|
|
23
|
+
AuditEventType["CREDENTIAL_WRITE"] = "credential.write";
|
|
24
|
+
AuditEventType["CREDENTIAL_UPDATED"] = "credential.updated";
|
|
25
|
+
AuditEventType["CREDENTIAL_DELETED"] = "credential.deleted";
|
|
26
|
+
AuditEventType["CREDENTIAL_DELETE"] = "credential.delete";
|
|
27
|
+
AuditEventType["CREDENTIAL_EXPORTED"] = "credential.exported";
|
|
28
|
+
// Account operations
|
|
29
|
+
AuditEventType["ACCOUNT_LINKED"] = "account.linked";
|
|
30
|
+
AuditEventType["ACCOUNT_UNLINKED"] = "account.unlinked";
|
|
31
|
+
AuditEventType["ACCOUNT_SYNCED"] = "account.synced";
|
|
32
|
+
AuditEventType["ACCOUNT_SYNC_FAILED"] = "account.sync_failed";
|
|
33
|
+
// Configuration operations
|
|
34
|
+
AuditEventType["CONFIG_UPDATED"] = "config.updated";
|
|
35
|
+
AuditEventType["CONFIG_READ"] = "config.read";
|
|
36
|
+
// Authentication operations
|
|
37
|
+
AuditEventType["AUTH_SUCCESS"] = "auth.success";
|
|
38
|
+
AuditEventType["AUTH_FAILED"] = "auth.failed";
|
|
39
|
+
AuditEventType["AUTH_REFRESHED"] = "auth.refreshed";
|
|
40
|
+
// Data operations
|
|
41
|
+
AuditEventType["DATA_EXPORTED"] = "data.exported";
|
|
42
|
+
AuditEventType["DATA_IMPORTED"] = "data.imported";
|
|
43
|
+
AuditEventType["DATA_DELETED"] = "data.deleted";
|
|
44
|
+
// Legacy aliases for backward compatibility
|
|
45
|
+
AuditEventType["ACCOUNT_ACCESS"] = "account.access";
|
|
46
|
+
AuditEventType["SYNC_STARTED"] = "sync.started";
|
|
47
|
+
AuditEventType["SYNC_COMPLETED"] = "sync.completed";
|
|
48
|
+
AuditEventType["SYNC_FAILED"] = "sync.failed";
|
|
49
|
+
AuditEventType["CONFIG_CHANGE"] = "config.change";
|
|
50
|
+
})(AuditEventType || (AuditEventType = {}));
|
|
51
|
+
/**
|
|
52
|
+
* Audit event severity
|
|
53
|
+
*/
|
|
54
|
+
export var AuditSeverity;
|
|
55
|
+
(function (AuditSeverity) {
|
|
56
|
+
AuditSeverity["INFO"] = "info";
|
|
57
|
+
AuditSeverity["LOW"] = "low";
|
|
58
|
+
AuditSeverity["MEDIUM"] = "medium";
|
|
59
|
+
AuditSeverity["HIGH"] = "high";
|
|
60
|
+
AuditSeverity["WARNING"] = "warning";
|
|
61
|
+
AuditSeverity["ERROR"] = "error";
|
|
62
|
+
AuditSeverity["CRITICAL"] = "critical";
|
|
63
|
+
})(AuditSeverity || (AuditSeverity = {}));
|
|
64
|
+
/**
|
|
65
|
+
* Default audit configuration
|
|
66
|
+
*/
|
|
67
|
+
const DEFAULT_AUDIT_CONFIG = {
|
|
68
|
+
dataDir: "~/.billclaw",
|
|
69
|
+
maxEntries: 10000,
|
|
70
|
+
retentionDays: 90,
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Audit logger class
|
|
74
|
+
*/
|
|
75
|
+
export class AuditLogger {
|
|
76
|
+
config;
|
|
77
|
+
baseDir;
|
|
78
|
+
logFilePath;
|
|
79
|
+
logger;
|
|
80
|
+
constructor(configOrPath = {}, logger) {
|
|
81
|
+
// Support both old API (string path) and new API (config object)
|
|
82
|
+
if (typeof configOrPath === "string") {
|
|
83
|
+
// Old API: constructor(logFilePath: string, logger?: Logger)
|
|
84
|
+
this.logFilePath = configOrPath;
|
|
85
|
+
this.baseDir = path.dirname(configOrPath);
|
|
86
|
+
this.config = DEFAULT_AUDIT_CONFIG;
|
|
87
|
+
this.logger = logger;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// New API: constructor(config?: AuditConfig, logger?: Logger)
|
|
91
|
+
this.config = { ...DEFAULT_AUDIT_CONFIG, ...configOrPath };
|
|
92
|
+
this.baseDir = this.config.dataDir.replace(/^~/, os.homedir());
|
|
93
|
+
this.logFilePath = path.join(this.baseDir, "audit.log");
|
|
94
|
+
this.logger = logger;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the audit log file path
|
|
99
|
+
*/
|
|
100
|
+
getAuditFilePath() {
|
|
101
|
+
return this.logFilePath;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Ensure audit directory exists
|
|
105
|
+
*/
|
|
106
|
+
async ensureAuditDir() {
|
|
107
|
+
await fs.mkdir(this.baseDir, { recursive: true });
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Rotate audit logs if they exceed max entries
|
|
111
|
+
*/
|
|
112
|
+
async rotateIfNeeded() {
|
|
113
|
+
try {
|
|
114
|
+
const filePath = this.getAuditFilePath();
|
|
115
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
116
|
+
const lines = content.trim().split("\n");
|
|
117
|
+
if (lines.length > this.config.maxEntries) {
|
|
118
|
+
// Keep only the most recent entries
|
|
119
|
+
const recentLines = lines.slice(-this.config.maxEntries);
|
|
120
|
+
await fs.writeFile(filePath, recentLines.join("\n"), "utf-8");
|
|
121
|
+
}
|
|
122
|
+
// Clean up old entries based on retention
|
|
123
|
+
const cutoffDate = new Date();
|
|
124
|
+
cutoffDate.setDate(cutoffDate.getDate() - this.config.retentionDays);
|
|
125
|
+
const filteredLines = lines.filter((line) => {
|
|
126
|
+
try {
|
|
127
|
+
const event = JSON.parse(line);
|
|
128
|
+
const eventDate = new Date(event.timestamp);
|
|
129
|
+
return eventDate >= cutoffDate;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return true; // Keep lines that can't be parsed
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
if (filteredLines.length < lines.length) {
|
|
136
|
+
await fs.writeFile(filePath, filteredLines.join("\n"), "utf-8");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// File doesn't exist yet, which is fine
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Log an audit event
|
|
145
|
+
*/
|
|
146
|
+
async log(type, message, details, severity = AuditSeverity.INFO) {
|
|
147
|
+
await this.ensureAuditDir();
|
|
148
|
+
const event = {
|
|
149
|
+
id: this.generateEventId(),
|
|
150
|
+
timestamp: new Date().toISOString(),
|
|
151
|
+
type,
|
|
152
|
+
severity,
|
|
153
|
+
message,
|
|
154
|
+
details,
|
|
155
|
+
};
|
|
156
|
+
const filePath = this.getAuditFilePath();
|
|
157
|
+
try {
|
|
158
|
+
await this.rotateIfNeeded();
|
|
159
|
+
const logEntry = JSON.stringify(event) + "\n";
|
|
160
|
+
await fs.appendFile(filePath, logEntry, "utf-8");
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
this.logger?.error?.("Failed to write audit log:", error);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Generate a unique event ID
|
|
168
|
+
*/
|
|
169
|
+
generateEventId() {
|
|
170
|
+
return `audit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Read all audit events
|
|
174
|
+
*/
|
|
175
|
+
async readEvents(limit) {
|
|
176
|
+
const filePath = this.getAuditFilePath();
|
|
177
|
+
try {
|
|
178
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
179
|
+
const lines = content.trim().split("\n");
|
|
180
|
+
const events = [];
|
|
181
|
+
for (const line of lines) {
|
|
182
|
+
try {
|
|
183
|
+
events.push(JSON.parse(line));
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Skip malformed lines
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Return most recent first
|
|
190
|
+
events.reverse();
|
|
191
|
+
if (limit) {
|
|
192
|
+
return events.slice(0, limit);
|
|
193
|
+
}
|
|
194
|
+
return events;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Query audit events by type
|
|
202
|
+
*/
|
|
203
|
+
async queryByType(type, limit) {
|
|
204
|
+
const events = await this.readEvents();
|
|
205
|
+
const filtered = events.filter((e) => e.type === type);
|
|
206
|
+
return limit ? filtered.slice(0, limit) : filtered;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Query audit events by severity
|
|
210
|
+
*/
|
|
211
|
+
async queryBySeverity(severity, limit) {
|
|
212
|
+
const events = await this.readEvents();
|
|
213
|
+
const filtered = events.filter((e) => e.severity === severity);
|
|
214
|
+
return limit ? filtered.slice(0, limit) : filtered;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Clear all audit events
|
|
218
|
+
*/
|
|
219
|
+
async clear() {
|
|
220
|
+
const filePath = this.getAuditFilePath();
|
|
221
|
+
try {
|
|
222
|
+
await fs.unlink(filePath);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// File doesn't exist, which is fine
|
|
226
|
+
}
|
|
227
|
+
// Create empty file
|
|
228
|
+
await this.ensureAuditDir();
|
|
229
|
+
await fs.writeFile(filePath, "", "utf-8");
|
|
230
|
+
this.logger?.info?.("Audit log cleared");
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get audit log statistics
|
|
234
|
+
*/
|
|
235
|
+
async getStats() {
|
|
236
|
+
const events = await this.readEvents();
|
|
237
|
+
const byType = {};
|
|
238
|
+
const bySeverity = {};
|
|
239
|
+
for (const event of events) {
|
|
240
|
+
byType[event.type] = (byType[event.type] || 0) + 1;
|
|
241
|
+
bySeverity[event.severity] = (bySeverity[event.severity] || 0) + 1;
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
totalEvents: events.length,
|
|
245
|
+
byType,
|
|
246
|
+
bySeverity,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Create an audit logger with the given configuration
|
|
252
|
+
*/
|
|
253
|
+
export function createAuditLogger(config, logger) {
|
|
254
|
+
return new AuditLogger(config, logger);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Convenience functions for common audit events
|
|
258
|
+
*/
|
|
259
|
+
export class AuditHelpers {
|
|
260
|
+
audit;
|
|
261
|
+
constructor(audit) {
|
|
262
|
+
this.audit = audit;
|
|
263
|
+
}
|
|
264
|
+
async logCredentialCreated(credentialType, accountId) {
|
|
265
|
+
await this.audit.log(AuditEventType.CREDENTIAL_CREATED, `Credential created for ${credentialType}`, { credentialType, accountId }, AuditSeverity.INFO);
|
|
266
|
+
}
|
|
267
|
+
async logCredentialRead(credentialType, accountId) {
|
|
268
|
+
await this.audit.log(AuditEventType.CREDENTIAL_READ, `Credential read for ${credentialType}`, { credentialType, accountId }, AuditSeverity.INFO);
|
|
269
|
+
}
|
|
270
|
+
async logCredentialDeleted(credentialType, accountId) {
|
|
271
|
+
await this.audit.log(AuditEventType.CREDENTIAL_DELETED, `Credential deleted for ${credentialType}`, { credentialType, accountId }, AuditSeverity.WARNING);
|
|
272
|
+
}
|
|
273
|
+
async logAccountLinked(accountType, accountId) {
|
|
274
|
+
await this.audit.log(AuditEventType.ACCOUNT_LINKED, `Account linked: ${accountType}`, { accountType, accountId }, AuditSeverity.INFO);
|
|
275
|
+
}
|
|
276
|
+
async logAccountUnlinked(accountType, accountId) {
|
|
277
|
+
await this.audit.log(AuditEventType.ACCOUNT_UNLINKED, `Account unlinked: ${accountType}`, { accountType, accountId }, AuditSeverity.WARNING);
|
|
278
|
+
}
|
|
279
|
+
async logAuthFailed(accountType, reason) {
|
|
280
|
+
await this.audit.log(AuditEventType.AUTH_FAILED, `Authentication failed for ${accountType}`, { accountType, reason }, AuditSeverity.ERROR);
|
|
281
|
+
}
|
|
282
|
+
async logDataExported(dataType, count) {
|
|
283
|
+
await this.audit.log(AuditEventType.DATA_EXPORTED, `Data exported: ${dataType}`, { dataType, count }, AuditSeverity.INFO);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/security/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event emitter for BillClaw webhook events
|
|
3
|
+
*
|
|
4
|
+
* This module provides a centralized way to emit and forward webhook events
|
|
5
|
+
* to configured external webhook endpoints.
|
|
6
|
+
*
|
|
7
|
+
* Framework-agnostic: Uses Logger interface instead of framework-specific APIs.
|
|
8
|
+
*/
|
|
9
|
+
import type { Logger } from "../errors/errors.js";
|
|
10
|
+
import type { WebhookEventType, WebhookConfig } from "../models/config.js";
|
|
11
|
+
/**
|
|
12
|
+
* Base event interface for all BillClaw webhook events
|
|
13
|
+
*/
|
|
14
|
+
export interface BillclawEvent {
|
|
15
|
+
id: string;
|
|
16
|
+
event: WebhookEventType;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
version: string;
|
|
19
|
+
data: unknown;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Transaction event data
|
|
23
|
+
*/
|
|
24
|
+
export interface TransactionEventData {
|
|
25
|
+
accountId: string;
|
|
26
|
+
transactionId: string;
|
|
27
|
+
date: string;
|
|
28
|
+
amount: number;
|
|
29
|
+
currency: string;
|
|
30
|
+
merchantName?: string;
|
|
31
|
+
category?: string[];
|
|
32
|
+
source: "plaid" | "gmail" | "gocardless" | "manual";
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Sync event data
|
|
36
|
+
*/
|
|
37
|
+
export interface SyncEventData {
|
|
38
|
+
accountId: string;
|
|
39
|
+
syncId: string;
|
|
40
|
+
status: "started" | "completed" | "failed";
|
|
41
|
+
transactionsAdded?: number;
|
|
42
|
+
transactionsUpdated?: number;
|
|
43
|
+
error?: string;
|
|
44
|
+
duration?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Account event data
|
|
48
|
+
*/
|
|
49
|
+
export interface AccountEventData {
|
|
50
|
+
accountId: string;
|
|
51
|
+
accountType: "plaid" | "gmail" | "gocardless";
|
|
52
|
+
status: "connected" | "disconnected" | "error";
|
|
53
|
+
error?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Webhook test event data
|
|
57
|
+
*/
|
|
58
|
+
export interface WebhookTestData {
|
|
59
|
+
message: string;
|
|
60
|
+
triggeredBy: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Event payload sent to external webhooks
|
|
64
|
+
*/
|
|
65
|
+
export interface WebhookPayload {
|
|
66
|
+
id: string;
|
|
67
|
+
event: WebhookEventType;
|
|
68
|
+
timestamp: string;
|
|
69
|
+
version: string;
|
|
70
|
+
data: unknown;
|
|
71
|
+
signature?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Options for webhook retry policy
|
|
75
|
+
*/
|
|
76
|
+
export interface RetryPolicy {
|
|
77
|
+
maxRetries: number;
|
|
78
|
+
initialDelay: number;
|
|
79
|
+
maxDelay: number;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Emit a BillClaw event
|
|
83
|
+
*
|
|
84
|
+
* This function creates a standardized event and forwards it to all
|
|
85
|
+
* configured external webhooks that are subscribed to this event type.
|
|
86
|
+
*
|
|
87
|
+
* @param logger - Logger instance for logging
|
|
88
|
+
* @param webhooks - Array of webhook configurations
|
|
89
|
+
* @param eventType - Type of event to emit
|
|
90
|
+
* @param data - Event data
|
|
91
|
+
*/
|
|
92
|
+
export declare function emitEvent(logger: Logger, webhooks: WebhookConfig[], eventType: WebhookEventType, data: unknown): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Emit transaction.new event
|
|
95
|
+
*/
|
|
96
|
+
export declare function emitTransactionNew(logger: Logger, webhooks: WebhookConfig[], transaction: TransactionEventData): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Emit transaction.updated event
|
|
99
|
+
*/
|
|
100
|
+
export declare function emitTransactionUpdated(logger: Logger, webhooks: WebhookConfig[], transaction: TransactionEventData): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Emit transaction.deleted event
|
|
103
|
+
*/
|
|
104
|
+
export declare function emitTransactionDeleted(logger: Logger, webhooks: WebhookConfig[], transactionId: string, accountId: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Emit sync.started event
|
|
107
|
+
*/
|
|
108
|
+
export declare function emitSyncStarted(logger: Logger, webhooks: WebhookConfig[], accountId: string, syncId: string): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Emit sync.completed event
|
|
111
|
+
*/
|
|
112
|
+
export declare function emitSyncCompleted(logger: Logger, webhooks: WebhookConfig[], syncData: SyncEventData): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Emit sync.failed event
|
|
115
|
+
*/
|
|
116
|
+
export declare function emitSyncFailed(logger: Logger, webhooks: WebhookConfig[], accountId: string, syncId: string, error: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Emit account.connected event
|
|
119
|
+
*/
|
|
120
|
+
export declare function emitAccountConnected(logger: Logger, webhooks: WebhookConfig[], accountId: string, accountType: "plaid" | "gmail" | "gocardless"): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Emit account.disconnected event
|
|
123
|
+
*/
|
|
124
|
+
export declare function emitAccountDisconnected(logger: Logger, webhooks: WebhookConfig[], accountId: string, accountType: "plaid" | "gmail" | "gocardless"): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Emit account.error event
|
|
127
|
+
*/
|
|
128
|
+
export declare function emitAccountError(logger: Logger, webhooks: WebhookConfig[], accountId: string, accountType: "plaid" | "gmail" | "gocardless", error: string): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Emit webhook.test event
|
|
131
|
+
*/
|
|
132
|
+
export declare function emitWebhookTest(logger: Logger, webhooks: WebhookConfig[], message?: string): Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* Generate HMAC-SHA256 signature for webhook payload
|
|
135
|
+
*
|
|
136
|
+
* @param event - Event to sign
|
|
137
|
+
* @param secret - Secret key for HMAC
|
|
138
|
+
* @returns Signature in format "sha256=<hex>"
|
|
139
|
+
*/
|
|
140
|
+
export declare function generateSignature(event: BillclawEvent, secret: string): string;
|
|
141
|
+
/**
|
|
142
|
+
* Verify webhook signature
|
|
143
|
+
*
|
|
144
|
+
* Returns true if the signature matches the computed signature.
|
|
145
|
+
* Uses timing-safe comparison to prevent timing attacks.
|
|
146
|
+
*
|
|
147
|
+
* @param payload - JSON string payload
|
|
148
|
+
* @param signature - Signature to verify (format: "sha256=<hex>")
|
|
149
|
+
* @param secret - Secret key for HMAC
|
|
150
|
+
* @returns True if signature is valid
|
|
151
|
+
*/
|
|
152
|
+
export declare function verifySignature(payload: string, signature: string, secret: string): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* Type guard to check if an event is a transaction event
|
|
155
|
+
*/
|
|
156
|
+
export declare function isTransactionEvent(event: BillclawEvent): event is BillclawEvent & {
|
|
157
|
+
data: TransactionEventData;
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* Type guard to check if an event is a sync event
|
|
161
|
+
*/
|
|
162
|
+
export declare function isSyncEvent(event: BillclawEvent): event is BillclawEvent & {
|
|
163
|
+
data: SyncEventData;
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Type guard to check if an event is an account event
|
|
167
|
+
*/
|
|
168
|
+
export declare function isAccountEvent(event: BillclawEvent): event is BillclawEvent & {
|
|
169
|
+
data: AccountEventData;
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/services/event-emitter.ts"],"names":[],"mappings":"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"}
|