@edgebasejs/react-native 0.1.8 → 0.1.9
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/README.md +18 -0
- package/dist/client-core/src/index.d.ts +4 -0
- package/dist/client-core/src/index.d.ts.map +1 -1
- package/dist/client-core/src/index.js +4 -0
- package/dist/client-core/src/index.js.map +1 -1
- package/dist/client-core/src/mutations/batch-processor-client.d.ts +67 -0
- package/dist/client-core/src/mutations/batch-processor-client.d.ts.map +1 -0
- package/dist/client-core/src/mutations/batch-processor-client.js +64 -0
- package/dist/client-core/src/mutations/batch-processor-client.js.map +1 -0
- package/dist/client-core/src/mutations/transaction-hook.d.ts +80 -0
- package/dist/client-core/src/mutations/transaction-hook.d.ts.map +1 -0
- package/dist/client-core/src/mutations/transaction-hook.js +204 -0
- package/dist/client-core/src/mutations/transaction-hook.js.map +1 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.d.ts +55 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.d.ts.map +1 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.js +208 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.js.map +1 -0
- package/dist/client-core/src/realtime/subscription-handler.d.ts +74 -0
- package/dist/client-core/src/realtime/subscription-handler.d.ts.map +1 -0
- package/dist/client-core/src/realtime/subscription-handler.js +224 -0
- package/dist/client-core/src/realtime/subscription-handler.js.map +1 -0
- package/dist/client-core/src/sync/sync-engine.d.ts +10 -0
- package/dist/client-core/src/sync/sync-engine.d.ts.map +1 -1
- package/dist/client-core/src/sync/sync-engine.js +37 -5
- package/dist/client-core/src/sync/sync-engine.js.map +1 -1
- package/dist/client-react-native/src/hooks/index.d.ts +10 -0
- package/dist/client-react-native/src/hooks/index.d.ts.map +1 -1
- package/dist/client-react-native/src/hooks/index.js +8 -0
- package/dist/client-react-native/src/hooks/index.js.map +1 -1
- package/dist/client-react-native/src/hooks/use-audit.d.ts +65 -0
- package/dist/client-react-native/src/hooks/use-audit.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-audit.js +201 -0
- package/dist/client-react-native/src/hooks/use-audit.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.d.ts +56 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.js +95 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-encryption.d.ts +45 -0
- package/dist/client-react-native/src/hooks/use-encryption.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-encryption.js +143 -0
- package/dist/client-react-native/src/hooks/use-encryption.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-manager.d.ts +38 -0
- package/dist/client-react-native/src/hooks/use-file-manager.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-manager.js +174 -0
- package/dist/client-react-native/src/hooks/use-file-manager.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-upload.d.ts +34 -0
- package/dist/client-react-native/src/hooks/use-file-upload.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-upload.js +85 -0
- package/dist/client-react-native/src/hooks/use-file-upload.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-mutation.d.ts.map +1 -1
- package/dist/client-react-native/src/hooks/use-mutation.js +34 -6
- package/dist/client-react-native/src/hooks/use-mutation.js.map +1 -1
- package/dist/client-react-native/src/hooks/use-search.d.ts +33 -0
- package/dist/client-react-native/src/hooks/use-search.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-search.js +174 -0
- package/dist/client-react-native/src/hooks/use-search.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-subscribe.d.ts +14 -0
- package/dist/client-react-native/src/hooks/use-subscribe.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-subscribe.js +165 -0
- package/dist/client-react-native/src/hooks/use-subscribe.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-transaction.d.ts +27 -0
- package/dist/client-react-native/src/hooks/use-transaction.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-transaction.js +160 -0
- package/dist/client-react-native/src/hooks/use-transaction.js.map +1 -0
- package/dist/client-react-native/src/provider.d.ts +5 -2
- package/dist/client-react-native/src/provider.d.ts.map +1 -1
- package/dist/client-react-native/src/provider.js +23 -23
- package/dist/client-react-native/src/provider.js.map +1 -1
- package/dist/core/src/access-rules/column-security.d.ts +80 -0
- package/dist/core/src/access-rules/column-security.d.ts.map +1 -0
- package/dist/core/src/access-rules/column-security.js +191 -0
- package/dist/core/src/access-rules/column-security.js.map +1 -0
- package/dist/core/src/access-rules/engine.d.ts +26 -0
- package/dist/core/src/access-rules/engine.d.ts.map +1 -0
- package/dist/core/src/access-rules/engine.js +76 -0
- package/dist/core/src/access-rules/engine.js.map +1 -0
- package/dist/core/src/access-rules/index.d.ts +3 -0
- package/dist/core/src/access-rules/index.d.ts.map +1 -0
- package/dist/core/src/access-rules/index.js +3 -0
- package/dist/core/src/access-rules/index.js.map +1 -0
- package/dist/core/src/audit/audit-manager.d.ts +108 -0
- package/dist/core/src/audit/audit-manager.d.ts.map +1 -0
- package/dist/core/src/audit/audit-manager.js +265 -0
- package/dist/core/src/audit/audit-manager.js.map +1 -0
- package/dist/core/src/auth/auth-service.d.ts +71 -0
- package/dist/core/src/auth/auth-service.d.ts.map +1 -0
- package/dist/core/src/auth/auth-service.js +177 -0
- package/dist/core/src/auth/auth-service.js.map +1 -0
- package/dist/core/src/auth/index.d.ts +4 -0
- package/dist/core/src/auth/index.d.ts.map +1 -0
- package/dist/core/src/auth/index.js +4 -0
- package/dist/core/src/auth/index.js.map +1 -0
- package/dist/core/src/encryption/encryption-manager.d.ts +97 -0
- package/dist/core/src/encryption/encryption-manager.d.ts.map +1 -0
- package/dist/core/src/encryption/encryption-manager.js +224 -0
- package/dist/core/src/encryption/encryption-manager.js.map +1 -0
- package/dist/core/src/index.d.ts +16 -0
- package/dist/core/src/index.d.ts.map +1 -0
- package/dist/core/src/index.js +16 -0
- package/dist/core/src/index.js.map +1 -0
- package/dist/core/src/realtime/change-notifier.d.ts +50 -0
- package/dist/core/src/realtime/change-notifier.d.ts.map +1 -0
- package/dist/core/src/realtime/change-notifier.js +145 -0
- package/dist/core/src/realtime/change-notifier.js.map +1 -0
- package/dist/core/src/realtime/message-types.d.ts +39 -0
- package/dist/core/src/realtime/message-types.d.ts.map +1 -0
- package/dist/core/src/realtime/message-types.js +5 -0
- package/dist/core/src/realtime/message-types.js.map +1 -0
- package/dist/core/src/realtime/subscription-manager.d.ts +67 -0
- package/dist/core/src/realtime/subscription-manager.d.ts.map +1 -0
- package/dist/core/src/realtime/subscription-manager.js +229 -0
- package/dist/core/src/realtime/subscription-manager.js.map +1 -0
- package/dist/core/src/search/search-manager.d.ts +93 -0
- package/dist/core/src/search/search-manager.d.ts.map +1 -0
- package/dist/core/src/search/search-manager.js +258 -0
- package/dist/core/src/search/search-manager.js.map +1 -0
- package/dist/core/src/storage/file-manager.d.ts +138 -0
- package/dist/core/src/storage/file-manager.d.ts.map +1 -0
- package/dist/core/src/storage/file-manager.js +224 -0
- package/dist/core/src/storage/file-manager.js.map +1 -0
- package/dist/core/src/sync/batch-processor.d.ts +97 -0
- package/dist/core/src/sync/batch-processor.d.ts.map +1 -0
- package/dist/core/src/sync/batch-processor.js +313 -0
- package/dist/core/src/sync/batch-processor.js.map +1 -0
- package/dist/core/src/sync/csv-processor.d.ts +66 -0
- package/dist/core/src/sync/csv-processor.d.ts.map +1 -0
- package/dist/core/src/sync/csv-processor.js +223 -0
- package/dist/core/src/sync/csv-processor.js.map +1 -0
- package/dist/core/src/sync/index.d.ts +3 -0
- package/dist/core/src/sync/index.d.ts.map +1 -0
- package/dist/core/src/sync/index.js +3 -0
- package/dist/core/src/sync/index.js.map +1 -0
- package/dist/core/src/sync/sync-engine.d.ts +68 -0
- package/dist/core/src/sync/sync-engine.d.ts.map +1 -0
- package/dist/core/src/sync/sync-engine.js +317 -0
- package/dist/core/src/sync/sync-engine.js.map +1 -0
- package/dist/core/src/sync/transaction-manager.d.ts +83 -0
- package/dist/core/src/sync/transaction-manager.d.ts.map +1 -0
- package/dist/core/src/sync/transaction-manager.js +227 -0
- package/dist/core/src/sync/transaction-manager.js.map +1 -0
- package/dist/core/src/webhooks/webhook-manager.d.ts +137 -0
- package/dist/core/src/webhooks/webhook-manager.d.ts.map +1 -0
- package/dist/core/src/webhooks/webhook-manager.js +334 -0
- package/dist/core/src/webhooks/webhook-manager.js.map +1 -0
- package/package.json +4 -6
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages database transactions with ACID guarantees
|
|
3
|
+
* Handles begin, commit, and rollback operations
|
|
4
|
+
*/
|
|
5
|
+
export class TransactionManager {
|
|
6
|
+
constructor(db) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
this.activeTransactions = new Map();
|
|
9
|
+
this.transactionTimeout = 300000; // 5 minutes
|
|
10
|
+
this.maxRetries = 3;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Begin a new transaction
|
|
14
|
+
*/
|
|
15
|
+
async begin(user, isolationLevel = 'READ_COMMITTED') {
|
|
16
|
+
const transactionId = `txn_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
const expiresAt = now + this.transactionTimeout;
|
|
19
|
+
const transaction = {
|
|
20
|
+
id: transactionId,
|
|
21
|
+
userId: user.id,
|
|
22
|
+
status: 'active',
|
|
23
|
+
isolationLevel,
|
|
24
|
+
createdAt: now,
|
|
25
|
+
expiresAt,
|
|
26
|
+
changes: [],
|
|
27
|
+
};
|
|
28
|
+
// Store in memory
|
|
29
|
+
this.activeTransactions.set(transactionId, transaction);
|
|
30
|
+
// Persist to database
|
|
31
|
+
await this.db.run(`INSERT INTO transactions (id, user_id, status, isolation_level, created_at, expires_at)
|
|
32
|
+
VALUES (?, ?, ?, ?, ?, ?)`, [transactionId, user.id, 'active', isolationLevel, now, expiresAt]);
|
|
33
|
+
return transactionId;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Add a change to a transaction
|
|
37
|
+
*/
|
|
38
|
+
async addChange(transactionId, entity, recordId, operation, data, version) {
|
|
39
|
+
const transaction = this.activeTransactions.get(transactionId);
|
|
40
|
+
if (!transaction) {
|
|
41
|
+
throw new Error(`Transaction not found: ${transactionId}`);
|
|
42
|
+
}
|
|
43
|
+
if (transaction.status !== 'active') {
|
|
44
|
+
throw new Error(`Cannot add changes to ${transaction.status} transaction`);
|
|
45
|
+
}
|
|
46
|
+
// Check if transaction has expired
|
|
47
|
+
if (Date.now() > transaction.expiresAt) {
|
|
48
|
+
await this.rollback(transactionId);
|
|
49
|
+
throw new Error('Transaction has expired');
|
|
50
|
+
}
|
|
51
|
+
const changeId = `change_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
52
|
+
const change = {
|
|
53
|
+
id: changeId,
|
|
54
|
+
entity,
|
|
55
|
+
recordId,
|
|
56
|
+
operation,
|
|
57
|
+
data,
|
|
58
|
+
version,
|
|
59
|
+
};
|
|
60
|
+
// Add to transaction in memory
|
|
61
|
+
transaction.changes.push(change);
|
|
62
|
+
// Persist to database
|
|
63
|
+
await this.db.run(`INSERT INTO transaction_changes (id, transaction_id, entity, record_id, operation, data, version, created_at)
|
|
64
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [changeId, transactionId, entity, recordId, operation, JSON.stringify(data), version, Date.now()]);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get a transaction by ID
|
|
68
|
+
*/
|
|
69
|
+
getTransaction(transactionId) {
|
|
70
|
+
return this.activeTransactions.get(transactionId);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Commit a transaction
|
|
74
|
+
* Applies all changes atomically
|
|
75
|
+
*/
|
|
76
|
+
async commit(transactionId) {
|
|
77
|
+
const transaction = this.activeTransactions.get(transactionId);
|
|
78
|
+
if (!transaction) {
|
|
79
|
+
throw new Error(`Transaction not found: ${transactionId}`);
|
|
80
|
+
}
|
|
81
|
+
if (transaction.status !== 'active') {
|
|
82
|
+
throw new Error(`Cannot commit ${transaction.status} transaction`);
|
|
83
|
+
}
|
|
84
|
+
// Check if transaction has expired
|
|
85
|
+
if (Date.now() > transaction.expiresAt) {
|
|
86
|
+
await this.rollback(transactionId);
|
|
87
|
+
throw new Error('Transaction has expired');
|
|
88
|
+
}
|
|
89
|
+
const appliedChanges = [];
|
|
90
|
+
const errors = [];
|
|
91
|
+
try {
|
|
92
|
+
// Apply all changes with conflict detection
|
|
93
|
+
for (const change of transaction.changes) {
|
|
94
|
+
try {
|
|
95
|
+
// Check for conflicts based on isolation level
|
|
96
|
+
const conflict = await this.detectConflict(change.entity, change.recordId, change.version, transaction.isolationLevel);
|
|
97
|
+
if (conflict) {
|
|
98
|
+
errors.push(`Conflict on ${change.entity}:${change.recordId} (version mismatch)`);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
// Apply the change
|
|
102
|
+
await this.applyChange(change);
|
|
103
|
+
appliedChanges.push(change);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
errors.push(`Error applying change to ${change.entity}:${change.recordId}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Mark transaction as committed
|
|
110
|
+
transaction.status = 'committed';
|
|
111
|
+
transaction.completedAt = Date.now();
|
|
112
|
+
await this.db.run(`UPDATE transactions SET status = ?, completed_at = ? WHERE id = ?`, ['committed', Date.now(), transactionId]);
|
|
113
|
+
return {
|
|
114
|
+
appliedCount: appliedChanges.length,
|
|
115
|
+
errors,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
// Rollback on error
|
|
120
|
+
await this.rollback(transactionId);
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Rollback a transaction
|
|
126
|
+
* Reverts all changes
|
|
127
|
+
*/
|
|
128
|
+
async rollback(transactionId) {
|
|
129
|
+
const transaction = this.activeTransactions.get(transactionId);
|
|
130
|
+
if (!transaction) {
|
|
131
|
+
throw new Error(`Transaction not found: ${transactionId}`);
|
|
132
|
+
}
|
|
133
|
+
// Mark as rolled back
|
|
134
|
+
transaction.status = 'rolled_back';
|
|
135
|
+
transaction.completedAt = Date.now();
|
|
136
|
+
// Update database
|
|
137
|
+
await this.db.run(`UPDATE transactions SET status = ?, completed_at = ? WHERE id = ?`, ['rolled_back', Date.now(), transactionId]);
|
|
138
|
+
// Remove from active transactions
|
|
139
|
+
this.activeTransactions.delete(transactionId);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Detect conflicts for a record
|
|
143
|
+
*/
|
|
144
|
+
async detectConflict(entity, recordId, clientVersion, isolationLevel) {
|
|
145
|
+
if (clientVersion === undefined) {
|
|
146
|
+
return false; // No version provided, assume no conflict
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const result = await this.db.getOne(`SELECT version FROM sync_metadata WHERE entity = ? AND record_id = ?`, [entity, recordId]);
|
|
150
|
+
if (!result) {
|
|
151
|
+
// Record doesn't exist yet, no conflict
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
const serverVersion = result.version;
|
|
155
|
+
// Check for version mismatch based on isolation level
|
|
156
|
+
switch (isolationLevel) {
|
|
157
|
+
case 'SERIALIZABLE':
|
|
158
|
+
// Strict: any change by others = conflict
|
|
159
|
+
return serverVersion !== clientVersion;
|
|
160
|
+
case 'READ_COMMITTED':
|
|
161
|
+
// Normal: only dirty reads avoided
|
|
162
|
+
return serverVersion !== clientVersion;
|
|
163
|
+
case 'READ_UNCOMMITTED':
|
|
164
|
+
// Lenient: allow reads of uncommitted data
|
|
165
|
+
return false;
|
|
166
|
+
default:
|
|
167
|
+
return serverVersion !== clientVersion;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
console.error('Error detecting conflict:', error);
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Apply a single change to the database
|
|
177
|
+
*/
|
|
178
|
+
async applyChange(change) {
|
|
179
|
+
switch (change.operation) {
|
|
180
|
+
case 'create':
|
|
181
|
+
case 'update':
|
|
182
|
+
// Insert or update record
|
|
183
|
+
const now = Date.now();
|
|
184
|
+
await this.db.run(`INSERT INTO sync_metadata (entity, record_id, version, updated_at) VALUES (?, ?, ?, ?)
|
|
185
|
+
ON CONFLICT(entity, record_id) DO UPDATE SET version = version + 1, updated_at = ?`, [change.entity, change.recordId, 1, now, now]);
|
|
186
|
+
break;
|
|
187
|
+
case 'delete':
|
|
188
|
+
// Mark as deleted
|
|
189
|
+
const deletedAt = Date.now();
|
|
190
|
+
await this.db.run(`UPDATE sync_metadata SET deleted_at = ? WHERE entity = ? AND record_id = ?`, [deletedAt, change.entity, change.recordId]);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get all active transactions for a user
|
|
196
|
+
*/
|
|
197
|
+
getActiveTransactions(userId) {
|
|
198
|
+
return Array.from(this.activeTransactions.values()).filter((txn) => txn.userId === userId && txn.status === 'active');
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Cleanup expired transactions
|
|
202
|
+
*/
|
|
203
|
+
async cleanup() {
|
|
204
|
+
const now = Date.now();
|
|
205
|
+
const expired = [];
|
|
206
|
+
for (const [id, txn] of this.activeTransactions.entries()) {
|
|
207
|
+
if (now > txn.expiresAt) {
|
|
208
|
+
expired.push(id);
|
|
209
|
+
await this.rollback(id);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (expired.length > 0) {
|
|
213
|
+
console.log(`Cleaned up ${expired.length} expired transactions`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get transaction statistics
|
|
218
|
+
*/
|
|
219
|
+
getStats() {
|
|
220
|
+
return {
|
|
221
|
+
activeTransactions: Array.from(this.activeTransactions.values()).filter((txn) => txn.status === 'active').length,
|
|
222
|
+
committedTransactions: Array.from(this.activeTransactions.values()).filter((txn) => txn.status === 'committed').length,
|
|
223
|
+
rolledBackTransactions: Array.from(this.activeTransactions.values()).filter((txn) => txn.status === 'rolled_back').length,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=transaction-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-manager.js","sourceRoot":"","sources":["../../../../../core/src/sync/transaction-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook manager for event-driven integrations
|
|
3
|
+
* Handles webhook registration, event triggering, and delivery with retry logic
|
|
4
|
+
*/
|
|
5
|
+
import type { User } from '@edgebasejs/types';
|
|
6
|
+
export interface Webhook {
|
|
7
|
+
id: string;
|
|
8
|
+
userId: string;
|
|
9
|
+
url: string;
|
|
10
|
+
events: string[];
|
|
11
|
+
secret: string;
|
|
12
|
+
isActive: boolean;
|
|
13
|
+
description?: string;
|
|
14
|
+
headers?: Record<string, string>;
|
|
15
|
+
createdAt: number;
|
|
16
|
+
updatedAt: number;
|
|
17
|
+
}
|
|
18
|
+
export interface WebhookEvent {
|
|
19
|
+
id: string;
|
|
20
|
+
webhookId: string;
|
|
21
|
+
eventType: string;
|
|
22
|
+
payload: Record<string, any>;
|
|
23
|
+
signature: string;
|
|
24
|
+
attempts: number;
|
|
25
|
+
maxAttempts: number;
|
|
26
|
+
nextRetryAt?: number;
|
|
27
|
+
deliveredAt?: number;
|
|
28
|
+
failedAt?: number;
|
|
29
|
+
error?: string;
|
|
30
|
+
createdAt: number;
|
|
31
|
+
}
|
|
32
|
+
export interface WebhookDelivery {
|
|
33
|
+
id: string;
|
|
34
|
+
webhookId: string;
|
|
35
|
+
eventId: string;
|
|
36
|
+
url: string;
|
|
37
|
+
eventType: string;
|
|
38
|
+
statusCode?: number;
|
|
39
|
+
responseBody?: string;
|
|
40
|
+
error?: string;
|
|
41
|
+
duration: number;
|
|
42
|
+
createdAt: number;
|
|
43
|
+
}
|
|
44
|
+
export interface RegisterWebhookOptions {
|
|
45
|
+
url: string;
|
|
46
|
+
events: string[];
|
|
47
|
+
description?: string;
|
|
48
|
+
headers?: Record<string, string>;
|
|
49
|
+
}
|
|
50
|
+
export interface TriggerEventOptions {
|
|
51
|
+
eventType: string;
|
|
52
|
+
entity?: string;
|
|
53
|
+
recordId?: string;
|
|
54
|
+
operation?: 'create' | 'update' | 'delete';
|
|
55
|
+
data?: Record<string, any>;
|
|
56
|
+
userId?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface WebhookDatabase {
|
|
59
|
+
run(sql: string, params: any[]): Promise<any>;
|
|
60
|
+
getOne(sql: string, params: any[]): Promise<any>;
|
|
61
|
+
getAll(sql: string, params: any[]): Promise<any[]>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Webhook manager
|
|
65
|
+
*/
|
|
66
|
+
export declare class WebhookManager {
|
|
67
|
+
private db;
|
|
68
|
+
private maxRetries;
|
|
69
|
+
private retryDelays;
|
|
70
|
+
constructor(db: WebhookDatabase, options?: {
|
|
71
|
+
maxRetries?: number;
|
|
72
|
+
retryDelays?: number[];
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* Register a new webhook
|
|
76
|
+
*/
|
|
77
|
+
registerWebhook(user: User, options: RegisterWebhookOptions): Promise<Webhook>;
|
|
78
|
+
/**
|
|
79
|
+
* Get a webhook by ID
|
|
80
|
+
*/
|
|
81
|
+
getWebhook(webhookId: string, userId?: string): Promise<Webhook | null>;
|
|
82
|
+
/**
|
|
83
|
+
* List webhooks for a user
|
|
84
|
+
*/
|
|
85
|
+
listWebhooks(userId: string): Promise<Webhook[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Update a webhook
|
|
88
|
+
*/
|
|
89
|
+
updateWebhook(webhookId: string, userId: string, updates: {
|
|
90
|
+
url?: string;
|
|
91
|
+
events?: string[];
|
|
92
|
+
isActive?: boolean;
|
|
93
|
+
description?: string;
|
|
94
|
+
headers?: Record<string, string>;
|
|
95
|
+
}): Promise<Webhook>;
|
|
96
|
+
/**
|
|
97
|
+
* Delete a webhook
|
|
98
|
+
*/
|
|
99
|
+
deleteWebhook(webhookId: string, userId: string): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Trigger an event and queue it for delivery
|
|
102
|
+
*/
|
|
103
|
+
triggerEvent(options: TriggerEventOptions): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Process pending webhook events
|
|
106
|
+
*/
|
|
107
|
+
processPendingEvents(): Promise<number>;
|
|
108
|
+
/**
|
|
109
|
+
* Deliver a webhook event
|
|
110
|
+
*/
|
|
111
|
+
private deliverEvent;
|
|
112
|
+
/**
|
|
113
|
+
* Schedule a retry for a failed event
|
|
114
|
+
*/
|
|
115
|
+
private scheduleRetry;
|
|
116
|
+
/**
|
|
117
|
+
* Find webhooks matching an event type
|
|
118
|
+
*/
|
|
119
|
+
private findMatchingWebhooks;
|
|
120
|
+
/**
|
|
121
|
+
* Match an event type against a pattern (supports wildcards)
|
|
122
|
+
*/
|
|
123
|
+
private matchEventPattern;
|
|
124
|
+
/**
|
|
125
|
+
* Sign a payload with HMAC-SHA256
|
|
126
|
+
*/
|
|
127
|
+
private signPayload;
|
|
128
|
+
/**
|
|
129
|
+
* Generate a random secret
|
|
130
|
+
*/
|
|
131
|
+
private generateSecret;
|
|
132
|
+
/**
|
|
133
|
+
* Convert database row to Webhook object
|
|
134
|
+
*/
|
|
135
|
+
private rowToWebhook;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=webhook-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-manager.d.ts","sourceRoot":"","sources":["../../../../../core/src/webhooks/webhook-manager.ts"],"names":[],"mappings":"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"}
|