@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.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/dist/billclaw.d.ts +76 -0
  4. package/dist/billclaw.d.ts.map +1 -0
  5. package/dist/billclaw.js +205 -0
  6. package/dist/billclaw.js.map +1 -0
  7. package/dist/credentials/index.d.ts +8 -0
  8. package/dist/credentials/index.d.ts.map +1 -0
  9. package/dist/credentials/index.js +8 -0
  10. package/dist/credentials/index.js.map +1 -0
  11. package/dist/credentials/keychain.d.ts +92 -0
  12. package/dist/credentials/keychain.d.ts.map +1 -0
  13. package/dist/credentials/keychain.js +172 -0
  14. package/dist/credentials/keychain.js.map +1 -0
  15. package/dist/credentials/store.d.ts +76 -0
  16. package/dist/credentials/store.d.ts.map +1 -0
  17. package/dist/credentials/store.js +144 -0
  18. package/dist/credentials/store.js.map +1 -0
  19. package/dist/errors/errors.d.ts +92 -0
  20. package/dist/errors/errors.d.ts.map +1 -0
  21. package/dist/errors/errors.js +315 -0
  22. package/dist/errors/errors.js.map +1 -0
  23. package/dist/errors/index.d.ts +7 -0
  24. package/dist/errors/index.d.ts.map +1 -0
  25. package/dist/errors/index.js +7 -0
  26. package/dist/errors/index.js.map +1 -0
  27. package/dist/exporters/beancount.d.ts +42 -0
  28. package/dist/exporters/beancount.d.ts.map +1 -0
  29. package/dist/exporters/beancount.js +141 -0
  30. package/dist/exporters/beancount.js.map +1 -0
  31. package/dist/exporters/index.d.ts +8 -0
  32. package/dist/exporters/index.d.ts.map +1 -0
  33. package/dist/exporters/index.js +8 -0
  34. package/dist/exporters/index.js.map +1 -0
  35. package/dist/exporters/ledger.d.ts +42 -0
  36. package/dist/exporters/ledger.d.ts.map +1 -0
  37. package/dist/exporters/ledger.js +139 -0
  38. package/dist/exporters/ledger.js.map +1 -0
  39. package/dist/index.d.ts +23 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +34 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/models/config.d.ts +552 -0
  44. package/dist/models/config.d.ts.map +1 -0
  45. package/dist/models/config.js +168 -0
  46. package/dist/models/config.js.map +1 -0
  47. package/dist/models/index.d.ts +7 -0
  48. package/dist/models/index.d.ts.map +1 -0
  49. package/dist/models/index.js +8 -0
  50. package/dist/models/index.js.map +1 -0
  51. package/dist/runtime/index.d.ts +7 -0
  52. package/dist/runtime/index.d.ts.map +1 -0
  53. package/dist/runtime/index.js +7 -0
  54. package/dist/runtime/index.js.map +1 -0
  55. package/dist/runtime/types.d.ts +110 -0
  56. package/dist/runtime/types.d.ts.map +1 -0
  57. package/dist/runtime/types.js +85 -0
  58. package/dist/runtime/types.js.map +1 -0
  59. package/dist/security/audit.d.ts +148 -0
  60. package/dist/security/audit.d.ts.map +1 -0
  61. package/dist/security/audit.js +286 -0
  62. package/dist/security/audit.js.map +1 -0
  63. package/dist/security/index.d.ts +7 -0
  64. package/dist/security/index.d.ts.map +1 -0
  65. package/dist/security/index.js +7 -0
  66. package/dist/security/index.js.map +1 -0
  67. package/dist/services/event-emitter.d.ts +171 -0
  68. package/dist/services/event-emitter.d.ts.map +1 -0
  69. package/dist/services/event-emitter.js +287 -0
  70. package/dist/services/event-emitter.js.map +1 -0
  71. package/dist/services/index.d.ts +8 -0
  72. package/dist/services/index.d.ts.map +1 -0
  73. package/dist/services/index.js +8 -0
  74. package/dist/services/index.js.map +1 -0
  75. package/dist/sources/gmail/bill-recognizer.d.ts +71 -0
  76. package/dist/sources/gmail/bill-recognizer.d.ts.map +1 -0
  77. package/dist/sources/gmail/bill-recognizer.js +341 -0
  78. package/dist/sources/gmail/bill-recognizer.js.map +1 -0
  79. package/dist/sources/gmail/email-parser.d.ts +68 -0
  80. package/dist/sources/gmail/email-parser.d.ts.map +1 -0
  81. package/dist/sources/gmail/email-parser.js +238 -0
  82. package/dist/sources/gmail/email-parser.js.map +1 -0
  83. package/dist/sources/gmail/gmail-fetch.d.ts +54 -0
  84. package/dist/sources/gmail/gmail-fetch.d.ts.map +1 -0
  85. package/dist/sources/gmail/gmail-fetch.js +300 -0
  86. package/dist/sources/gmail/gmail-fetch.js.map +1 -0
  87. package/dist/sources/gmail/index.d.ts +7 -0
  88. package/dist/sources/gmail/index.d.ts.map +1 -0
  89. package/dist/sources/gmail/index.js +7 -0
  90. package/dist/sources/gmail/index.js.map +1 -0
  91. package/dist/sources/index.d.ts +8 -0
  92. package/dist/sources/index.d.ts.map +1 -0
  93. package/dist/sources/index.js +8 -0
  94. package/dist/sources/index.js.map +1 -0
  95. package/dist/sources/plaid/index.d.ts +7 -0
  96. package/dist/sources/plaid/index.d.ts.map +1 -0
  97. package/dist/sources/plaid/index.js +7 -0
  98. package/dist/sources/plaid/index.js.map +1 -0
  99. package/dist/sources/plaid/plaid-sync.d.ts +42 -0
  100. package/dist/sources/plaid/plaid-sync.d.ts.map +1 -0
  101. package/dist/sources/plaid/plaid-sync.js +182 -0
  102. package/dist/sources/plaid/plaid-sync.js.map +1 -0
  103. package/dist/storage/cache.d.ts +134 -0
  104. package/dist/storage/cache.d.ts.map +1 -0
  105. package/dist/storage/cache.js +239 -0
  106. package/dist/storage/cache.js.map +1 -0
  107. package/dist/storage/index.d.ts +11 -0
  108. package/dist/storage/index.d.ts.map +1 -0
  109. package/dist/storage/index.js +11 -0
  110. package/dist/storage/index.js.map +1 -0
  111. package/dist/storage/indexes.d.ts +136 -0
  112. package/dist/storage/indexes.d.ts.map +1 -0
  113. package/dist/storage/indexes.js +294 -0
  114. package/dist/storage/indexes.js.map +1 -0
  115. package/dist/storage/locking.d.ts +103 -0
  116. package/dist/storage/locking.d.ts.map +1 -0
  117. package/dist/storage/locking.js +158 -0
  118. package/dist/storage/locking.js.map +1 -0
  119. package/dist/storage/streaming.d.ts +102 -0
  120. package/dist/storage/streaming.d.ts.map +1 -0
  121. package/dist/storage/streaming.js +245 -0
  122. package/dist/storage/streaming.js.map +1 -0
  123. package/dist/storage/transaction-storage.d.ts +101 -0
  124. package/dist/storage/transaction-storage.d.ts.map +1 -0
  125. package/dist/storage/transaction-storage.js +193 -0
  126. package/dist/storage/transaction-storage.js.map +1 -0
  127. package/dist/sync/index.d.ts +7 -0
  128. package/dist/sync/index.d.ts.map +1 -0
  129. package/dist/sync/index.js +7 -0
  130. package/dist/sync/index.js.map +1 -0
  131. package/dist/sync/sync-service.d.ts +42 -0
  132. package/dist/sync/sync-service.d.ts.map +1 -0
  133. package/dist/sync/sync-service.js +112 -0
  134. package/dist/sync/sync-service.js.map +1 -0
  135. package/dist/test-fixtures.d.ts +38 -0
  136. package/dist/test-fixtures.d.ts.map +1 -0
  137. package/dist/test-fixtures.js +137 -0
  138. package/dist/test-fixtures.js.map +1 -0
  139. 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,7 @@
1
+ /**
2
+ * Security utilities for BillClaw
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export * from "./audit.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * Security utilities for BillClaw
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export * from "./audit.js";
7
+ //# sourceMappingURL=index.js.map
@@ -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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"}