@edgebasejs/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 (63) hide show
  1. package/README.md +15 -0
  2. package/dist/core/src/access-rules/column-security.d.ts +80 -0
  3. package/dist/core/src/access-rules/column-security.d.ts.map +1 -0
  4. package/dist/core/src/access-rules/column-security.js +191 -0
  5. package/dist/core/src/access-rules/column-security.js.map +1 -0
  6. package/dist/core/src/access-rules/engine.d.ts.map +1 -1
  7. package/dist/core/src/access-rules/engine.js +2 -1
  8. package/dist/core/src/access-rules/engine.js.map +1 -1
  9. package/dist/core/src/audit/audit-manager.d.ts +108 -0
  10. package/dist/core/src/audit/audit-manager.d.ts.map +1 -0
  11. package/dist/core/src/audit/audit-manager.js +265 -0
  12. package/dist/core/src/audit/audit-manager.js.map +1 -0
  13. package/dist/core/src/encryption/encryption-manager.d.ts +97 -0
  14. package/dist/core/src/encryption/encryption-manager.d.ts.map +1 -0
  15. package/dist/core/src/encryption/encryption-manager.js +224 -0
  16. package/dist/core/src/encryption/encryption-manager.js.map +1 -0
  17. package/dist/core/src/index.d.ts +12 -0
  18. package/dist/core/src/index.d.ts.map +1 -1
  19. package/dist/core/src/index.js +12 -0
  20. package/dist/core/src/index.js.map +1 -1
  21. package/dist/core/src/realtime/change-notifier.d.ts +50 -0
  22. package/dist/core/src/realtime/change-notifier.d.ts.map +1 -0
  23. package/dist/core/src/realtime/change-notifier.js +145 -0
  24. package/dist/core/src/realtime/change-notifier.js.map +1 -0
  25. package/dist/core/src/realtime/message-types.d.ts +39 -0
  26. package/dist/core/src/realtime/message-types.d.ts.map +1 -0
  27. package/dist/core/src/realtime/message-types.js +5 -0
  28. package/dist/core/src/realtime/message-types.js.map +1 -0
  29. package/dist/core/src/realtime/subscription-manager.d.ts +67 -0
  30. package/dist/core/src/realtime/subscription-manager.d.ts.map +1 -0
  31. package/dist/core/src/realtime/subscription-manager.js +229 -0
  32. package/dist/core/src/realtime/subscription-manager.js.map +1 -0
  33. package/dist/core/src/search/search-manager.d.ts +93 -0
  34. package/dist/core/src/search/search-manager.d.ts.map +1 -0
  35. package/dist/core/src/search/search-manager.js +258 -0
  36. package/dist/core/src/search/search-manager.js.map +1 -0
  37. package/dist/core/src/storage/file-manager.d.ts +138 -0
  38. package/dist/core/src/storage/file-manager.d.ts.map +1 -0
  39. package/dist/core/src/storage/file-manager.js +224 -0
  40. package/dist/core/src/storage/file-manager.js.map +1 -0
  41. package/dist/core/src/sync/batch-processor.d.ts +97 -0
  42. package/dist/core/src/sync/batch-processor.d.ts.map +1 -0
  43. package/dist/core/src/sync/batch-processor.js +313 -0
  44. package/dist/core/src/sync/batch-processor.js.map +1 -0
  45. package/dist/core/src/sync/csv-processor.d.ts +66 -0
  46. package/dist/core/src/sync/csv-processor.d.ts.map +1 -0
  47. package/dist/core/src/sync/csv-processor.js +223 -0
  48. package/dist/core/src/sync/csv-processor.js.map +1 -0
  49. package/dist/core/src/sync/sync-engine.d.ts +22 -0
  50. package/dist/core/src/sync/sync-engine.d.ts.map +1 -1
  51. package/dist/core/src/sync/sync-engine.js +123 -10
  52. package/dist/core/src/sync/sync-engine.js.map +1 -1
  53. package/dist/core/src/sync/transaction-manager.d.ts +83 -0
  54. package/dist/core/src/sync/transaction-manager.d.ts.map +1 -0
  55. package/dist/core/src/sync/transaction-manager.js +227 -0
  56. package/dist/core/src/sync/transaction-manager.js.map +1 -0
  57. package/dist/core/src/webhooks/webhook-manager.d.ts +137 -0
  58. package/dist/core/src/webhooks/webhook-manager.d.ts.map +1 -0
  59. package/dist/core/src/webhooks/webhook-manager.js +334 -0
  60. package/dist/core/src/webhooks/webhook-manager.js.map +1 -0
  61. package/dist/index.d.ts +0 -1
  62. package/dist/index.js +0 -1
  63. package/package.json +2 -2
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Audit trail manager for change tracking and compliance
3
+ * Tracks all data changes with user attribution and timestamps
4
+ */
5
+ /**
6
+ * Audit manager for tracking data changes
7
+ */
8
+ export class AuditManager {
9
+ constructor(db, options) {
10
+ this.db = db;
11
+ this.options = {
12
+ trackBefore: options?.trackBefore !== false,
13
+ trackAfter: options?.trackAfter !== false,
14
+ trackChanges: options?.trackChanges !== false,
15
+ excludeFields: options?.excludeFields || ['password', 'password_hash', 'secret', 'token'],
16
+ maxRetentionDays: options?.maxRetentionDays || 90,
17
+ };
18
+ }
19
+ /**
20
+ * Log a data change
21
+ */
22
+ async logChange(user, entity, recordId, operation, before, after, metadata) {
23
+ const now = Date.now();
24
+ const auditId = `aud_${now}_${Math.random().toString(36).substring(2, 15)}`;
25
+ // Filter sensitive fields
26
+ const filteredBefore = before ? this.filterSensitiveFields(before) : undefined;
27
+ const filteredAfter = after ? this.filterSensitiveFields(after) : undefined;
28
+ // Calculate field-level changes for updates
29
+ let changes;
30
+ if (this.options.trackChanges && operation === 'update' && filteredBefore && filteredAfter) {
31
+ changes = this.calculateChanges(filteredBefore, filteredAfter);
32
+ }
33
+ const auditLog = {
34
+ id: auditId,
35
+ userId: user.id,
36
+ entity,
37
+ recordId,
38
+ operation,
39
+ before: this.options.trackBefore && (operation === 'update' || operation === 'delete') ? filteredBefore : undefined,
40
+ after: this.options.trackAfter && (operation === 'create' || operation === 'update') ? filteredAfter : undefined,
41
+ changes,
42
+ metadata,
43
+ createdAt: now,
44
+ };
45
+ // Store in database
46
+ await this.db.run(`INSERT INTO audit_logs (id, user_id, entity, record_id, operation, before_data, after_data, changes, metadata, created_at)
47
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
48
+ auditLog.id,
49
+ auditLog.userId,
50
+ auditLog.entity,
51
+ auditLog.recordId,
52
+ auditLog.operation,
53
+ auditLog.before ? JSON.stringify(auditLog.before) : null,
54
+ auditLog.after ? JSON.stringify(auditLog.after) : null,
55
+ auditLog.changes ? JSON.stringify(auditLog.changes) : null,
56
+ auditLog.metadata ? JSON.stringify(auditLog.metadata) : null,
57
+ auditLog.createdAt,
58
+ ]);
59
+ return auditLog;
60
+ }
61
+ /**
62
+ * Query audit logs
63
+ */
64
+ async queryLogs(query) {
65
+ const limit = query.limit || 50;
66
+ const offset = query.offset || 0;
67
+ // Build WHERE clause
68
+ const conditions = [];
69
+ const params = [];
70
+ if (query.entity) {
71
+ conditions.push('entity = ?');
72
+ params.push(query.entity);
73
+ }
74
+ if (query.recordId) {
75
+ conditions.push('record_id = ?');
76
+ params.push(query.recordId);
77
+ }
78
+ if (query.userId) {
79
+ conditions.push('user_id = ?');
80
+ params.push(query.userId);
81
+ }
82
+ if (query.operation) {
83
+ conditions.push('operation = ?');
84
+ params.push(query.operation);
85
+ }
86
+ if (query.startDate) {
87
+ conditions.push('created_at >= ?');
88
+ params.push(query.startDate);
89
+ }
90
+ if (query.endDate) {
91
+ conditions.push('created_at <= ?');
92
+ params.push(query.endDate);
93
+ }
94
+ const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
95
+ // Get logs
96
+ const sql = `
97
+ SELECT * FROM audit_logs
98
+ ${whereClause}
99
+ ORDER BY created_at DESC
100
+ LIMIT ? OFFSET ?
101
+ `;
102
+ const rows = await this.db.getAll(sql, [...params, limit + 1, offset]);
103
+ // Check if there are more results
104
+ const hasMore = rows.length > limit;
105
+ const trimmedRows = hasMore ? rows.slice(0, limit) : rows;
106
+ // Get total count
107
+ const countSql = `SELECT COUNT(*) as total FROM audit_logs ${whereClause}`;
108
+ const countResult = await this.db.getOne(countSql, params);
109
+ const total = countResult?.total || 0;
110
+ // Parse JSON fields
111
+ const logs = trimmedRows.map((row) => ({
112
+ id: row.id,
113
+ userId: row.user_id,
114
+ entity: row.entity,
115
+ recordId: row.record_id,
116
+ operation: row.operation,
117
+ before: row.before_data ? JSON.parse(row.before_data) : undefined,
118
+ after: row.after_data ? JSON.parse(row.after_data) : undefined,
119
+ changes: row.changes ? JSON.parse(row.changes) : undefined,
120
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
121
+ createdAt: row.created_at,
122
+ }));
123
+ return {
124
+ logs,
125
+ total,
126
+ hasMore,
127
+ };
128
+ }
129
+ /**
130
+ * Get audit log by ID
131
+ */
132
+ async getLog(auditId) {
133
+ const row = await this.db.getOne('SELECT * FROM audit_logs WHERE id = ?', [auditId]);
134
+ if (!row) {
135
+ return null;
136
+ }
137
+ return {
138
+ id: row.id,
139
+ userId: row.user_id,
140
+ entity: row.entity,
141
+ recordId: row.record_id,
142
+ operation: row.operation,
143
+ before: row.before_data ? JSON.parse(row.before_data) : undefined,
144
+ after: row.after_data ? JSON.parse(row.after_data) : undefined,
145
+ changes: row.changes ? JSON.parse(row.changes) : undefined,
146
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
147
+ createdAt: row.created_at,
148
+ };
149
+ }
150
+ /**
151
+ * Get audit history for a specific record
152
+ */
153
+ async getRecordHistory(entity, recordId) {
154
+ const rows = await this.db.getAll('SELECT * FROM audit_logs WHERE entity = ? AND record_id = ? ORDER BY created_at DESC', [entity, recordId]);
155
+ return rows.map((row) => ({
156
+ id: row.id,
157
+ userId: row.user_id,
158
+ entity: row.entity,
159
+ recordId: row.record_id,
160
+ operation: row.operation,
161
+ before: row.before_data ? JSON.parse(row.before_data) : undefined,
162
+ after: row.after_data ? JSON.parse(row.after_data) : undefined,
163
+ changes: row.changes ? JSON.parse(row.changes) : undefined,
164
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
165
+ createdAt: row.created_at,
166
+ }));
167
+ }
168
+ /**
169
+ * Get summary statistics for audit logs
170
+ */
171
+ async getStatistics(options) {
172
+ const conditions = [];
173
+ const params = [];
174
+ if (options?.entity) {
175
+ conditions.push('entity = ?');
176
+ params.push(options.entity);
177
+ }
178
+ if (options?.userId) {
179
+ conditions.push('user_id = ?');
180
+ params.push(options.userId);
181
+ }
182
+ if (options?.startDate) {
183
+ conditions.push('created_at >= ?');
184
+ params.push(options.startDate);
185
+ }
186
+ if (options?.endDate) {
187
+ conditions.push('created_at <= ?');
188
+ params.push(options.endDate);
189
+ }
190
+ const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
191
+ // Total changes
192
+ const totalResult = await this.db.getOne(`SELECT COUNT(*) as total FROM audit_logs ${whereClause}`, params);
193
+ const totalChanges = totalResult?.total || 0;
194
+ // Changes by operation
195
+ const operationRows = await this.db.getAll(`SELECT operation, COUNT(*) as count FROM audit_logs ${whereClause} GROUP BY operation`, params);
196
+ const changesByOperation = operationRows.map((row) => ({
197
+ operation: row.operation,
198
+ count: row.count,
199
+ }));
200
+ // Changes by entity
201
+ const entityRows = await this.db.getAll(`SELECT entity, COUNT(*) as count FROM audit_logs ${whereClause} GROUP BY entity ORDER BY count DESC LIMIT 10`, params);
202
+ const changesByEntity = entityRows.map((row) => ({
203
+ entity: row.entity,
204
+ count: row.count,
205
+ }));
206
+ // Changes by user
207
+ const userRows = await this.db.getAll(`SELECT user_id, COUNT(*) as count FROM audit_logs ${whereClause} GROUP BY user_id ORDER BY count DESC LIMIT 10`, params);
208
+ const changesByUser = userRows.map((row) => ({
209
+ userId: row.user_id,
210
+ count: row.count,
211
+ }));
212
+ return {
213
+ totalChanges,
214
+ changesByOperation,
215
+ changesByEntity,
216
+ changesByUser,
217
+ };
218
+ }
219
+ /**
220
+ * Clean up old audit logs based on retention policy
221
+ */
222
+ async cleanupOldLogs() {
223
+ const cutoffDate = Date.now() - this.options.maxRetentionDays * 24 * 60 * 60 * 1000;
224
+ const result = await this.db.getOne('SELECT COUNT(*) as count FROM audit_logs WHERE created_at < ?', [cutoffDate]);
225
+ const count = result?.count || 0;
226
+ if (count > 0) {
227
+ await this.db.run('DELETE FROM audit_logs WHERE created_at < ?', [cutoffDate]);
228
+ }
229
+ return count;
230
+ }
231
+ /**
232
+ * Filter sensitive fields from data
233
+ */
234
+ filterSensitiveFields(data) {
235
+ const filtered = {};
236
+ for (const [key, value] of Object.entries(data)) {
237
+ if (!this.options.excludeFields.includes(key.toLowerCase())) {
238
+ filtered[key] = value;
239
+ }
240
+ }
241
+ return filtered;
242
+ }
243
+ /**
244
+ * Calculate field-level changes between before and after states
245
+ */
246
+ calculateChanges(before, after) {
247
+ const changes = [];
248
+ // Check for changed and new fields
249
+ for (const [field, afterValue] of Object.entries(after)) {
250
+ const beforeValue = before[field];
251
+ // Compare values (handle different types)
252
+ if (JSON.stringify(beforeValue) !== JSON.stringify(afterValue)) {
253
+ changes.push({ field, before: beforeValue, after: afterValue });
254
+ }
255
+ }
256
+ // Check for deleted fields
257
+ for (const field of Object.keys(before)) {
258
+ if (!(field in after)) {
259
+ changes.push({ field, before: before[field], after: undefined });
260
+ }
261
+ }
262
+ return changes;
263
+ }
264
+ }
265
+ //# sourceMappingURL=audit-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-manager.js","sourceRoot":"","sources":["../../../../src/audit/audit-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Encryption manager for field-level data encryption
3
+ * Handles encryption/decryption of sensitive fields at rest
4
+ */
5
+ export interface EncryptionConfig {
6
+ entity: string;
7
+ fields: string[];
8
+ algorithm?: 'AES-GCM' | 'AES-CBC';
9
+ keyRotation?: boolean;
10
+ }
11
+ export interface EncryptedValue {
12
+ ciphertext: string;
13
+ iv: string;
14
+ algorithm: string;
15
+ keyVersion?: number;
16
+ }
17
+ export interface EncryptionKey {
18
+ id: string;
19
+ key: CryptoKey;
20
+ version: number;
21
+ algorithm: string;
22
+ createdAt: number;
23
+ }
24
+ /**
25
+ * Encryption manager for field-level encryption
26
+ */
27
+ export declare class EncryptionManager {
28
+ private configs;
29
+ private currentKey;
30
+ private keyHistory;
31
+ constructor();
32
+ /**
33
+ * Register encryption configuration for an entity
34
+ */
35
+ registerConfig(config: EncryptionConfig): void;
36
+ /**
37
+ * Get encryption configuration for an entity
38
+ */
39
+ getConfig(entity: string): EncryptionConfig | undefined;
40
+ /**
41
+ * Initialize encryption key from master key
42
+ */
43
+ initializeKey(masterKey: string, version?: number): Promise<void>;
44
+ /**
45
+ * Rotate encryption key (for key rotation support)
46
+ */
47
+ rotateKey(newMasterKey: string): Promise<void>;
48
+ /**
49
+ * Encrypt a value
50
+ */
51
+ encrypt(value: any): Promise<EncryptedValue>;
52
+ /**
53
+ * Decrypt a value
54
+ */
55
+ decrypt(encrypted: EncryptedValue): Promise<any>;
56
+ /**
57
+ * Encrypt fields in a record based on entity configuration
58
+ */
59
+ encryptRecord(entity: string, record: Record<string, any>): Promise<Record<string, any>>;
60
+ /**
61
+ * Decrypt fields in a record based on entity configuration
62
+ */
63
+ decryptRecord(entity: string, record: Record<string, any>): Promise<Record<string, any>>;
64
+ /**
65
+ * Check if a field should be encrypted
66
+ */
67
+ shouldEncrypt(entity: string, field: string): boolean;
68
+ /**
69
+ * Get all encrypted fields for an entity
70
+ */
71
+ getEncryptedFields(entity: string): string[];
72
+ /**
73
+ * Re-encrypt a record with a new key (for key rotation)
74
+ */
75
+ reencryptRecord(entity: string, record: Record<string, any>): Promise<Record<string, any>>;
76
+ /**
77
+ * Derive key material from master key
78
+ */
79
+ private deriveKeyMaterial;
80
+ /**
81
+ * Convert ArrayBuffer to Base64
82
+ */
83
+ private arrayBufferToBase64;
84
+ /**
85
+ * Convert Base64 to ArrayBuffer
86
+ */
87
+ private base64ToArrayBuffer;
88
+ /**
89
+ * Clear all encryption keys (security)
90
+ */
91
+ clear(): void;
92
+ }
93
+ /**
94
+ * Global encryption manager instance
95
+ */
96
+ export declare const encryptionManager: EncryptionManager;
97
+ //# sourceMappingURL=encryption-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption-manager.d.ts","sourceRoot":"","sources":["../../../../src/encryption/encryption-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,UAAU,CAAyC;;IAI3D;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI9C;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIvD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B1E;;OAEG;IACG,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;IAiClD;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAkCtD;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAqB9F;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IA+B9F;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAKrD;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAK5C;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAQhG;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,KAAK,IAAI,IAAI;CAId;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Encryption manager for field-level data encryption
3
+ * Handles encryption/decryption of sensitive fields at rest
4
+ */
5
+ /**
6
+ * Encryption manager for field-level encryption
7
+ */
8
+ export class EncryptionManager {
9
+ constructor() {
10
+ this.configs = new Map();
11
+ this.currentKey = null;
12
+ this.keyHistory = new Map();
13
+ }
14
+ /**
15
+ * Register encryption configuration for an entity
16
+ */
17
+ registerConfig(config) {
18
+ this.configs.set(config.entity, config);
19
+ }
20
+ /**
21
+ * Get encryption configuration for an entity
22
+ */
23
+ getConfig(entity) {
24
+ return this.configs.get(entity);
25
+ }
26
+ /**
27
+ * Initialize encryption key from master key
28
+ */
29
+ async initializeKey(masterKey, version = 1) {
30
+ const algorithm = 'AES-GCM';
31
+ // Derive key from master key using PBKDF2
32
+ const keyMaterial = await this.deriveKeyMaterial(masterKey);
33
+ const cryptoKey = await crypto.subtle.deriveKey({
34
+ name: 'PBKDF2',
35
+ salt: new TextEncoder().encode('edgebase-salt-v1'), // In production, use unique salt
36
+ iterations: 100000,
37
+ hash: 'SHA-256',
38
+ }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, // Not extractable
39
+ ['encrypt', 'decrypt']);
40
+ const encryptionKey = {
41
+ id: `key_${version}_${Date.now()}`,
42
+ key: cryptoKey,
43
+ version,
44
+ algorithm,
45
+ createdAt: Date.now(),
46
+ };
47
+ this.currentKey = encryptionKey;
48
+ this.keyHistory.set(version, encryptionKey);
49
+ }
50
+ /**
51
+ * Rotate encryption key (for key rotation support)
52
+ */
53
+ async rotateKey(newMasterKey) {
54
+ const newVersion = this.currentKey ? this.currentKey.version + 1 : 1;
55
+ await this.initializeKey(newMasterKey, newVersion);
56
+ }
57
+ /**
58
+ * Encrypt a value
59
+ */
60
+ async encrypt(value) {
61
+ if (!this.currentKey) {
62
+ throw new Error('Encryption key not initialized');
63
+ }
64
+ // Convert value to string
65
+ const plaintext = typeof value === 'string' ? value : JSON.stringify(value);
66
+ const plaintextBytes = new TextEncoder().encode(plaintext);
67
+ // Generate random IV
68
+ const iv = crypto.getRandomValues(new Uint8Array(12)); // 12 bytes for GCM
69
+ // Encrypt
70
+ const ciphertextBuffer = await crypto.subtle.encrypt({
71
+ name: 'AES-GCM',
72
+ iv,
73
+ }, this.currentKey.key, plaintextBytes);
74
+ const ciphertext = this.arrayBufferToBase64(ciphertextBuffer);
75
+ const ivBase64 = this.arrayBufferToBase64(iv);
76
+ return {
77
+ ciphertext,
78
+ iv: ivBase64,
79
+ algorithm: this.currentKey.algorithm,
80
+ keyVersion: this.currentKey.version,
81
+ };
82
+ }
83
+ /**
84
+ * Decrypt a value
85
+ */
86
+ async decrypt(encrypted) {
87
+ // Get appropriate key for decryption (supports key rotation)
88
+ const key = encrypted.keyVersion
89
+ ? this.keyHistory.get(encrypted.keyVersion)
90
+ : this.currentKey;
91
+ if (!key) {
92
+ throw new Error(`Encryption key for version ${encrypted.keyVersion} not found`);
93
+ }
94
+ // Decode base64
95
+ const ciphertextBuffer = this.base64ToArrayBuffer(encrypted.ciphertext);
96
+ const iv = this.base64ToArrayBuffer(encrypted.iv);
97
+ // Decrypt
98
+ const plaintextBuffer = await crypto.subtle.decrypt({
99
+ name: encrypted.algorithm,
100
+ iv: iv,
101
+ }, key.key, ciphertextBuffer);
102
+ const plaintext = new TextDecoder().decode(plaintextBuffer);
103
+ // Try to parse as JSON (for objects/arrays)
104
+ try {
105
+ return JSON.parse(plaintext);
106
+ }
107
+ catch {
108
+ return plaintext;
109
+ }
110
+ }
111
+ /**
112
+ * Encrypt fields in a record based on entity configuration
113
+ */
114
+ async encryptRecord(entity, record) {
115
+ const config = this.configs.get(entity);
116
+ if (!config) {
117
+ return record; // No encryption config
118
+ }
119
+ const encrypted = { ...record };
120
+ for (const field of config.fields) {
121
+ if (field in record && record[field] !== null && record[field] !== undefined) {
122
+ // Encrypt the field
123
+ const encryptedValue = await this.encrypt(record[field]);
124
+ // Store as JSON string
125
+ encrypted[field] = JSON.stringify(encryptedValue);
126
+ }
127
+ }
128
+ return encrypted;
129
+ }
130
+ /**
131
+ * Decrypt fields in a record based on entity configuration
132
+ */
133
+ async decryptRecord(entity, record) {
134
+ const config = this.configs.get(entity);
135
+ if (!config) {
136
+ return record; // No encryption config
137
+ }
138
+ const decrypted = { ...record };
139
+ for (const field of config.fields) {
140
+ if (field in record && record[field] !== null && record[field] !== undefined) {
141
+ try {
142
+ // Parse encrypted value
143
+ const encryptedValue = typeof record[field] === 'string'
144
+ ? JSON.parse(record[field])
145
+ : record[field];
146
+ // Check if it's actually encrypted (has ciphertext and iv)
147
+ if (encryptedValue.ciphertext && encryptedValue.iv) {
148
+ // Decrypt the field
149
+ decrypted[field] = await this.decrypt(encryptedValue);
150
+ }
151
+ }
152
+ catch (error) {
153
+ console.error(`Failed to decrypt field ${field}:`, error);
154
+ // Keep original value if decryption fails
155
+ }
156
+ }
157
+ }
158
+ return decrypted;
159
+ }
160
+ /**
161
+ * Check if a field should be encrypted
162
+ */
163
+ shouldEncrypt(entity, field) {
164
+ const config = this.configs.get(entity);
165
+ return config ? config.fields.includes(field) : false;
166
+ }
167
+ /**
168
+ * Get all encrypted fields for an entity
169
+ */
170
+ getEncryptedFields(entity) {
171
+ const config = this.configs.get(entity);
172
+ return config ? config.fields : [];
173
+ }
174
+ /**
175
+ * Re-encrypt a record with a new key (for key rotation)
176
+ */
177
+ async reencryptRecord(entity, record) {
178
+ // First decrypt with old keys
179
+ const decrypted = await this.decryptRecord(entity, record);
180
+ // Then encrypt with current key
181
+ return await this.encryptRecord(entity, decrypted);
182
+ }
183
+ /**
184
+ * Derive key material from master key
185
+ */
186
+ async deriveKeyMaterial(masterKey) {
187
+ const keyBytes = new TextEncoder().encode(masterKey);
188
+ return await crypto.subtle.importKey('raw', keyBytes, 'PBKDF2', false, ['deriveKey']);
189
+ }
190
+ /**
191
+ * Convert ArrayBuffer to Base64
192
+ */
193
+ arrayBufferToBase64(buffer) {
194
+ const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
195
+ let binary = '';
196
+ for (let i = 0; i < bytes.length; i++) {
197
+ binary += String.fromCharCode(bytes[i]);
198
+ }
199
+ return btoa(binary);
200
+ }
201
+ /**
202
+ * Convert Base64 to ArrayBuffer
203
+ */
204
+ base64ToArrayBuffer(base64) {
205
+ const binary = atob(base64);
206
+ const bytes = new Uint8Array(binary.length);
207
+ for (let i = 0; i < binary.length; i++) {
208
+ bytes[i] = binary.charCodeAt(i);
209
+ }
210
+ return bytes;
211
+ }
212
+ /**
213
+ * Clear all encryption keys (security)
214
+ */
215
+ clear() {
216
+ this.currentKey = null;
217
+ this.keyHistory.clear();
218
+ }
219
+ }
220
+ /**
221
+ * Global encryption manager instance
222
+ */
223
+ export const encryptionManager = new EncryptionManager();
224
+ //# sourceMappingURL=encryption-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption-manager.js","sourceRoot":"","sources":["../../../../src/encryption/encryption-manager.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,16 @@
1
1
  export * from './auth';
2
2
  export * from './sync';
3
3
  export * from './access-rules';
4
+ export * from './access-rules/column-security';
5
+ export * from './realtime/subscription-manager';
6
+ export * from './realtime/change-notifier';
7
+ export * from './realtime/message-types';
8
+ export * from './sync/transaction-manager';
9
+ export * from './sync/batch-processor';
10
+ export * from './sync/csv-processor';
11
+ export * from './storage/file-manager';
12
+ export * from './webhooks/webhook-manager';
13
+ export * from './search/search-manager';
14
+ export * from './audit/audit-manager';
15
+ export * from './encryption/encryption-manager';
4
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC"}
@@ -1,4 +1,16 @@
1
1
  export * from './auth';
2
2
  export * from './sync';
3
3
  export * from './access-rules';
4
+ export * from './access-rules/column-security';
5
+ export * from './realtime/subscription-manager';
6
+ export * from './realtime/change-notifier';
7
+ export * from './realtime/message-types';
8
+ export * from './sync/transaction-manager';
9
+ export * from './sync/batch-processor';
10
+ export * from './sync/csv-processor';
11
+ export * from './storage/file-manager';
12
+ export * from './webhooks/webhook-manager';
13
+ export * from './search/search-manager';
14
+ export * from './audit/audit-manager';
15
+ export * from './encryption/encryption-manager';
4
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC"}