@edgebasejs/client-core 0.1.7 → 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.
Files changed (104) hide show
  1. package/README.md +15 -0
  2. package/dist/client-core/src/index.d.ts +4 -0
  3. package/dist/client-core/src/index.d.ts.map +1 -1
  4. package/dist/client-core/src/index.js +4 -0
  5. package/dist/client-core/src/index.js.map +1 -1
  6. package/dist/client-core/src/mutations/batch-processor-client.d.ts +67 -0
  7. package/dist/client-core/src/mutations/batch-processor-client.d.ts.map +1 -0
  8. package/dist/client-core/src/mutations/batch-processor-client.js +64 -0
  9. package/dist/client-core/src/mutations/batch-processor-client.js.map +1 -0
  10. package/dist/client-core/src/mutations/transaction-hook.d.ts +80 -0
  11. package/dist/client-core/src/mutations/transaction-hook.d.ts.map +1 -0
  12. package/dist/client-core/src/mutations/transaction-hook.js +204 -0
  13. package/dist/client-core/src/mutations/transaction-hook.js.map +1 -0
  14. package/dist/client-core/src/realtime/realtime-sync-manager.d.ts +55 -0
  15. package/dist/client-core/src/realtime/realtime-sync-manager.d.ts.map +1 -0
  16. package/dist/client-core/src/realtime/realtime-sync-manager.js +208 -0
  17. package/dist/client-core/src/realtime/realtime-sync-manager.js.map +1 -0
  18. package/dist/client-core/src/realtime/subscription-handler.d.ts +74 -0
  19. package/dist/client-core/src/realtime/subscription-handler.d.ts.map +1 -0
  20. package/dist/client-core/src/realtime/subscription-handler.js +224 -0
  21. package/dist/client-core/src/realtime/subscription-handler.js.map +1 -0
  22. package/dist/client-core/src/sync/sync-engine.d.ts +10 -0
  23. package/dist/client-core/src/sync/sync-engine.d.ts.map +1 -1
  24. package/dist/client-core/src/sync/sync-engine.js +37 -5
  25. package/dist/client-core/src/sync/sync-engine.js.map +1 -1
  26. package/dist/core/src/access-rules/column-security.d.ts +80 -0
  27. package/dist/core/src/access-rules/column-security.d.ts.map +1 -0
  28. package/dist/core/src/access-rules/column-security.js +191 -0
  29. package/dist/core/src/access-rules/column-security.js.map +1 -0
  30. package/dist/core/src/access-rules/engine.d.ts +26 -0
  31. package/dist/core/src/access-rules/engine.d.ts.map +1 -0
  32. package/dist/core/src/access-rules/engine.js +76 -0
  33. package/dist/core/src/access-rules/engine.js.map +1 -0
  34. package/dist/core/src/access-rules/index.d.ts +3 -0
  35. package/dist/core/src/access-rules/index.d.ts.map +1 -0
  36. package/dist/core/src/access-rules/index.js +3 -0
  37. package/dist/core/src/access-rules/index.js.map +1 -0
  38. package/dist/core/src/audit/audit-manager.d.ts +108 -0
  39. package/dist/core/src/audit/audit-manager.d.ts.map +1 -0
  40. package/dist/core/src/audit/audit-manager.js +265 -0
  41. package/dist/core/src/audit/audit-manager.js.map +1 -0
  42. package/dist/core/src/auth/auth-service.d.ts +71 -0
  43. package/dist/core/src/auth/auth-service.d.ts.map +1 -0
  44. package/dist/core/src/auth/auth-service.js +177 -0
  45. package/dist/core/src/auth/auth-service.js.map +1 -0
  46. package/dist/core/src/auth/index.d.ts +4 -0
  47. package/dist/core/src/auth/index.d.ts.map +1 -0
  48. package/dist/core/src/auth/index.js +4 -0
  49. package/dist/core/src/auth/index.js.map +1 -0
  50. package/dist/core/src/encryption/encryption-manager.d.ts +97 -0
  51. package/dist/core/src/encryption/encryption-manager.d.ts.map +1 -0
  52. package/dist/core/src/encryption/encryption-manager.js +224 -0
  53. package/dist/core/src/encryption/encryption-manager.js.map +1 -0
  54. package/dist/core/src/index.d.ts +16 -0
  55. package/dist/core/src/index.d.ts.map +1 -0
  56. package/dist/core/src/index.js +16 -0
  57. package/dist/core/src/index.js.map +1 -0
  58. package/dist/core/src/realtime/change-notifier.d.ts +50 -0
  59. package/dist/core/src/realtime/change-notifier.d.ts.map +1 -0
  60. package/dist/core/src/realtime/change-notifier.js +145 -0
  61. package/dist/core/src/realtime/change-notifier.js.map +1 -0
  62. package/dist/core/src/realtime/message-types.d.ts +39 -0
  63. package/dist/core/src/realtime/message-types.d.ts.map +1 -0
  64. package/dist/core/src/realtime/message-types.js +5 -0
  65. package/dist/core/src/realtime/message-types.js.map +1 -0
  66. package/dist/core/src/realtime/subscription-manager.d.ts +67 -0
  67. package/dist/core/src/realtime/subscription-manager.d.ts.map +1 -0
  68. package/dist/core/src/realtime/subscription-manager.js +229 -0
  69. package/dist/core/src/realtime/subscription-manager.js.map +1 -0
  70. package/dist/core/src/search/search-manager.d.ts +93 -0
  71. package/dist/core/src/search/search-manager.d.ts.map +1 -0
  72. package/dist/core/src/search/search-manager.js +258 -0
  73. package/dist/core/src/search/search-manager.js.map +1 -0
  74. package/dist/core/src/storage/file-manager.d.ts +138 -0
  75. package/dist/core/src/storage/file-manager.d.ts.map +1 -0
  76. package/dist/core/src/storage/file-manager.js +224 -0
  77. package/dist/core/src/storage/file-manager.js.map +1 -0
  78. package/dist/core/src/sync/batch-processor.d.ts +97 -0
  79. package/dist/core/src/sync/batch-processor.d.ts.map +1 -0
  80. package/dist/core/src/sync/batch-processor.js +313 -0
  81. package/dist/core/src/sync/batch-processor.js.map +1 -0
  82. package/dist/core/src/sync/csv-processor.d.ts +66 -0
  83. package/dist/core/src/sync/csv-processor.d.ts.map +1 -0
  84. package/dist/core/src/sync/csv-processor.js +223 -0
  85. package/dist/core/src/sync/csv-processor.js.map +1 -0
  86. package/dist/core/src/sync/index.d.ts +3 -0
  87. package/dist/core/src/sync/index.d.ts.map +1 -0
  88. package/dist/core/src/sync/index.js +3 -0
  89. package/dist/core/src/sync/index.js.map +1 -0
  90. package/dist/core/src/sync/sync-engine.d.ts +68 -0
  91. package/dist/core/src/sync/sync-engine.d.ts.map +1 -0
  92. package/dist/core/src/sync/sync-engine.js +317 -0
  93. package/dist/core/src/sync/sync-engine.js.map +1 -0
  94. package/dist/core/src/sync/transaction-manager.d.ts +83 -0
  95. package/dist/core/src/sync/transaction-manager.d.ts.map +1 -0
  96. package/dist/core/src/sync/transaction-manager.js +227 -0
  97. package/dist/core/src/sync/transaction-manager.js.map +1 -0
  98. package/dist/core/src/webhooks/webhook-manager.d.ts +137 -0
  99. package/dist/core/src/webhooks/webhook-manager.d.ts.map +1 -0
  100. package/dist/core/src/webhooks/webhook-manager.js +334 -0
  101. package/dist/core/src/webhooks/webhook-manager.js.map +1 -0
  102. package/dist/index.d.ts +0 -1
  103. package/dist/index.js +0 -1
  104. package/package.json +2 -2
@@ -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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"}