@edgebasejs/react-native 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.
- 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/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/package.json +4 -6
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# @edgebasejs/react-native
|
|
2
|
+
|
|
3
|
+
React Native SDK for EdgeBase.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @edgebasejs/react-native
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { EdgeBaseProvider, useQuery } from '@edgebasejs/react-native';
|
|
15
|
+
|
|
16
|
+
// Wrap your app
|
|
17
|
+
// <EdgeBaseProvider apiUrl="http://localhost:8787">...</EdgeBaseProvider>
|
|
18
|
+
```
|
|
@@ -3,4 +3,8 @@ export * from './outbox';
|
|
|
3
3
|
export * from './storage';
|
|
4
4
|
export * from './auth';
|
|
5
5
|
export * from './conflict';
|
|
6
|
+
export * from './realtime/subscription-handler';
|
|
7
|
+
export * from './realtime/realtime-sync-manager';
|
|
8
|
+
export * from './mutations/transaction-hook';
|
|
9
|
+
export * from './mutations/batch-processor-client';
|
|
6
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../client-core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../client-core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC"}
|
|
@@ -3,4 +3,8 @@ export * from './outbox';
|
|
|
3
3
|
export * from './storage';
|
|
4
4
|
export * from './auth';
|
|
5
5
|
export * from './conflict';
|
|
6
|
+
export * from './realtime/subscription-handler';
|
|
7
|
+
export * from './realtime/realtime-sync-manager';
|
|
8
|
+
export * from './mutations/transaction-hook';
|
|
9
|
+
export * from './mutations/batch-processor-client';
|
|
6
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../client-core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../client-core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side batch processor for coordinating batch mutations
|
|
3
|
+
*/
|
|
4
|
+
export interface BatchOperation {
|
|
5
|
+
entity: string;
|
|
6
|
+
id: string;
|
|
7
|
+
operation: 'create' | 'update' | 'delete';
|
|
8
|
+
data?: Record<string, any>;
|
|
9
|
+
version?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface BatchRequest {
|
|
12
|
+
create?: BatchOperation[];
|
|
13
|
+
update?: BatchOperation[];
|
|
14
|
+
delete?: BatchOperation[];
|
|
15
|
+
atomic?: boolean;
|
|
16
|
+
isolationLevel?: 'READ_UNCOMMITTED' | 'READ_COMMITTED' | 'SERIALIZABLE';
|
|
17
|
+
}
|
|
18
|
+
export interface BatchResult {
|
|
19
|
+
applied: Array<BatchOperation & {
|
|
20
|
+
version: number;
|
|
21
|
+
serverTimestamp: number;
|
|
22
|
+
}>;
|
|
23
|
+
conflicts: Array<{
|
|
24
|
+
entity: string;
|
|
25
|
+
id: string;
|
|
26
|
+
operation: string;
|
|
27
|
+
clientVersion?: number;
|
|
28
|
+
serverVersion: number;
|
|
29
|
+
serverData: Record<string, any>;
|
|
30
|
+
}>;
|
|
31
|
+
errors: Array<{
|
|
32
|
+
entity: string;
|
|
33
|
+
id: string;
|
|
34
|
+
operation: string;
|
|
35
|
+
error: string;
|
|
36
|
+
code: string;
|
|
37
|
+
}>;
|
|
38
|
+
appliedCount: number;
|
|
39
|
+
conflictCount: number;
|
|
40
|
+
errorCount: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Client-side batch processor for batch mutations
|
|
44
|
+
*/
|
|
45
|
+
export declare class ClientBatchProcessor {
|
|
46
|
+
private apiUrl;
|
|
47
|
+
private accessToken;
|
|
48
|
+
private batchListeners;
|
|
49
|
+
constructor(apiUrl: string, accessToken: string);
|
|
50
|
+
/**
|
|
51
|
+
* Process a batch of operations
|
|
52
|
+
*/
|
|
53
|
+
processBatch(request: BatchRequest): Promise<BatchResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Subscribe to batch operation results
|
|
56
|
+
*/
|
|
57
|
+
subscribe(listener: (result: BatchResult) => void): () => void;
|
|
58
|
+
/**
|
|
59
|
+
* Notify listeners of batch results
|
|
60
|
+
*/
|
|
61
|
+
private notifyListeners;
|
|
62
|
+
/**
|
|
63
|
+
* Reset processor state
|
|
64
|
+
*/
|
|
65
|
+
reset(): void;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=batch-processor-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-processor-client.d.ts","sourceRoot":"","sources":["../../../../../client-core/src/mutations/batch-processor-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,cAAc,CAAC;CACzE;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC,cAAc,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,SAAS,EAAE,KAAK,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACjC,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAA4C;gBAEtD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAK/C;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB/D;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAK9D;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side batch processor for coordinating batch mutations
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Client-side batch processor for batch mutations
|
|
6
|
+
*/
|
|
7
|
+
export class ClientBatchProcessor {
|
|
8
|
+
constructor(apiUrl, accessToken) {
|
|
9
|
+
this.batchListeners = new Set();
|
|
10
|
+
this.apiUrl = apiUrl;
|
|
11
|
+
this.accessToken = accessToken;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Process a batch of operations
|
|
15
|
+
*/
|
|
16
|
+
async processBatch(request) {
|
|
17
|
+
try {
|
|
18
|
+
const response = await fetch(`${this.apiUrl}/sync/batch`, {
|
|
19
|
+
method: 'POST',
|
|
20
|
+
headers: {
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
23
|
+
},
|
|
24
|
+
body: JSON.stringify(request),
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(`Failed to process batch: ${response.statusText}`);
|
|
28
|
+
}
|
|
29
|
+
const result = await response.json();
|
|
30
|
+
this.notifyListeners(result);
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new Error(`Batch processing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Subscribe to batch operation results
|
|
39
|
+
*/
|
|
40
|
+
subscribe(listener) {
|
|
41
|
+
this.batchListeners.add(listener);
|
|
42
|
+
return () => this.batchListeners.delete(listener);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Notify listeners of batch results
|
|
46
|
+
*/
|
|
47
|
+
notifyListeners(result) {
|
|
48
|
+
for (const listener of this.batchListeners) {
|
|
49
|
+
try {
|
|
50
|
+
listener(result);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('Listener error:', error);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reset processor state
|
|
59
|
+
*/
|
|
60
|
+
reset() {
|
|
61
|
+
this.batchListeners.clear();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=batch-processor-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-processor-client.js","sourceRoot":"","sources":["../../../../../client-core/src/mutations/batch-processor-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwCH;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAK/B,YAAY,MAAc,EAAE,WAAmB;QAFvC,mBAAc,GAAG,IAAI,GAAG,EAAiC,CAAC;QAGhE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAqB;QACtC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,aAAa,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;iBAC5C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,MAAM,GAAgB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAuC;QAC/C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,MAAmB;QACzC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side transaction management
|
|
3
|
+
* Provides useTransaction hook for ACID transactions
|
|
4
|
+
*/
|
|
5
|
+
export interface TransactionChange {
|
|
6
|
+
entity: string;
|
|
7
|
+
recordId: string;
|
|
8
|
+
operation: 'create' | 'update' | 'delete';
|
|
9
|
+
data: Record<string, any>;
|
|
10
|
+
}
|
|
11
|
+
export interface PendingTransaction {
|
|
12
|
+
id: string;
|
|
13
|
+
changes: TransactionChange[];
|
|
14
|
+
status: 'pending' | 'committing' | 'committed' | 'rolled_back' | 'failed';
|
|
15
|
+
error?: string;
|
|
16
|
+
appliedCount?: number;
|
|
17
|
+
conflictCount?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface TransactionOptions {
|
|
20
|
+
isolationLevel?: 'READ_UNCOMMITTED' | 'READ_COMMITTED' | 'SERIALIZABLE';
|
|
21
|
+
autoRetry?: boolean;
|
|
22
|
+
maxRetries?: number;
|
|
23
|
+
onStatusChange?: (status: string) => void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Transaction manager for coordinating client-side transactions
|
|
27
|
+
*/
|
|
28
|
+
export declare class ClientTransactionManager {
|
|
29
|
+
private apiUrl;
|
|
30
|
+
private accessToken;
|
|
31
|
+
private currentTransaction;
|
|
32
|
+
private transactionListeners;
|
|
33
|
+
constructor(apiUrl: string, accessToken: string);
|
|
34
|
+
/**
|
|
35
|
+
* Begin a new transaction
|
|
36
|
+
*/
|
|
37
|
+
begin(options?: TransactionOptions): Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Add a change to the current transaction
|
|
40
|
+
*/
|
|
41
|
+
addChange(entity: string, recordId: string, operation: 'create' | 'update' | 'delete', data: Record<string, any>): void;
|
|
42
|
+
/**
|
|
43
|
+
* Commit the current transaction
|
|
44
|
+
*/
|
|
45
|
+
commit(): Promise<{
|
|
46
|
+
success: boolean;
|
|
47
|
+
appliedCount: number;
|
|
48
|
+
errors: string[];
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Rollback the current transaction
|
|
52
|
+
*/
|
|
53
|
+
rollback(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Get current transaction status
|
|
56
|
+
*/
|
|
57
|
+
getStatus(): Promise<{
|
|
58
|
+
status: string;
|
|
59
|
+
changeCount: number;
|
|
60
|
+
appliedCount?: number;
|
|
61
|
+
conflictCount?: number;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Get current transaction
|
|
65
|
+
*/
|
|
66
|
+
getCurrentTransaction(): PendingTransaction | null;
|
|
67
|
+
/**
|
|
68
|
+
* Subscribe to transaction changes
|
|
69
|
+
*/
|
|
70
|
+
subscribe(listener: (txn: PendingTransaction) => void): () => void;
|
|
71
|
+
/**
|
|
72
|
+
* Notify listeners of transaction changes
|
|
73
|
+
*/
|
|
74
|
+
private notifyListeners;
|
|
75
|
+
/**
|
|
76
|
+
* Reset transaction state (useful for cleanup)
|
|
77
|
+
*/
|
|
78
|
+
reset(): void;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=transaction-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-hook.d.ts","sourceRoot":"","sources":["../../../../../client-core/src/mutations/transaction-hook.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,GAAG,QAAQ,CAAC;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED;;GAEG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,oBAAoB,CAAgD;gBAEhE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAK/C;;OAEG;IACG,KAAK,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsC9D;;OAEG;IACH,SAAS,CACP,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,IAAI;IAmBP;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC;QACtB,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IAiDF;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B/B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IA4BF;;OAEG;IACH,qBAAqB,IAAI,kBAAkB,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKlE;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side transaction management
|
|
3
|
+
* Provides useTransaction hook for ACID transactions
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Transaction manager for coordinating client-side transactions
|
|
7
|
+
*/
|
|
8
|
+
export class ClientTransactionManager {
|
|
9
|
+
constructor(apiUrl, accessToken) {
|
|
10
|
+
this.currentTransaction = null;
|
|
11
|
+
this.transactionListeners = new Set();
|
|
12
|
+
this.apiUrl = apiUrl;
|
|
13
|
+
this.accessToken = accessToken;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Begin a new transaction
|
|
17
|
+
*/
|
|
18
|
+
async begin(options = {}) {
|
|
19
|
+
if (this.currentTransaction && this.currentTransaction.status === 'pending') {
|
|
20
|
+
throw new Error('Transaction already in progress');
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch(`${this.apiUrl}/transactions/begin`, {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
headers: {
|
|
26
|
+
'Content-Type': 'application/json',
|
|
27
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
isolationLevel: options.isolationLevel || 'READ_COMMITTED',
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
throw new Error(`Failed to begin transaction: ${response.statusText}`);
|
|
35
|
+
}
|
|
36
|
+
const data = await response.json();
|
|
37
|
+
const transactionId = data.transactionId;
|
|
38
|
+
// Create pending transaction
|
|
39
|
+
this.currentTransaction = {
|
|
40
|
+
id: transactionId,
|
|
41
|
+
changes: [],
|
|
42
|
+
status: 'pending',
|
|
43
|
+
};
|
|
44
|
+
this.notifyListeners();
|
|
45
|
+
return transactionId;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw new Error(`Transaction begin failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Add a change to the current transaction
|
|
53
|
+
*/
|
|
54
|
+
addChange(entity, recordId, operation, data) {
|
|
55
|
+
if (!this.currentTransaction) {
|
|
56
|
+
throw new Error('No transaction in progress');
|
|
57
|
+
}
|
|
58
|
+
if (this.currentTransaction.status !== 'pending') {
|
|
59
|
+
throw new Error(`Cannot add changes to ${this.currentTransaction.status} transaction`);
|
|
60
|
+
}
|
|
61
|
+
this.currentTransaction.changes.push({
|
|
62
|
+
entity,
|
|
63
|
+
recordId,
|
|
64
|
+
operation,
|
|
65
|
+
data,
|
|
66
|
+
});
|
|
67
|
+
this.notifyListeners();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Commit the current transaction
|
|
71
|
+
*/
|
|
72
|
+
async commit() {
|
|
73
|
+
if (!this.currentTransaction) {
|
|
74
|
+
throw new Error('No transaction in progress');
|
|
75
|
+
}
|
|
76
|
+
const transactionId = this.currentTransaction.id;
|
|
77
|
+
try {
|
|
78
|
+
this.currentTransaction.status = 'committing';
|
|
79
|
+
this.notifyListeners();
|
|
80
|
+
const response = await fetch(`${this.apiUrl}/transactions/${transactionId}/commit`, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
headers: {
|
|
83
|
+
'Content-Type': 'application/json',
|
|
84
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
this.currentTransaction.status = 'failed';
|
|
89
|
+
const error = await response.text();
|
|
90
|
+
this.currentTransaction.error = error;
|
|
91
|
+
this.notifyListeners();
|
|
92
|
+
throw new Error(`Failed to commit transaction: ${response.statusText}`);
|
|
93
|
+
}
|
|
94
|
+
const data = await response.json();
|
|
95
|
+
this.currentTransaction.status = 'committed';
|
|
96
|
+
this.currentTransaction.appliedCount = data.appliedCount;
|
|
97
|
+
this.currentTransaction.conflictCount = data.errors?.length || 0;
|
|
98
|
+
this.notifyListeners();
|
|
99
|
+
const result = {
|
|
100
|
+
success: true,
|
|
101
|
+
appliedCount: data.appliedCount,
|
|
102
|
+
errors: data.errors || [],
|
|
103
|
+
};
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
this.currentTransaction.status = 'failed';
|
|
108
|
+
this.currentTransaction.error = error instanceof Error ? error.message : 'Unknown error';
|
|
109
|
+
this.notifyListeners();
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Rollback the current transaction
|
|
115
|
+
*/
|
|
116
|
+
async rollback() {
|
|
117
|
+
if (!this.currentTransaction) {
|
|
118
|
+
throw new Error('No transaction in progress');
|
|
119
|
+
}
|
|
120
|
+
const transactionId = this.currentTransaction.id;
|
|
121
|
+
try {
|
|
122
|
+
const response = await fetch(`${this.apiUrl}/transactions/${transactionId}/rollback`, {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
headers: {
|
|
125
|
+
'Content-Type': 'application/json',
|
|
126
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
throw new Error(`Failed to rollback transaction: ${response.statusText}`);
|
|
131
|
+
}
|
|
132
|
+
this.currentTransaction.status = 'rolled_back';
|
|
133
|
+
this.notifyListeners();
|
|
134
|
+
this.currentTransaction = null;
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw new Error(`Transaction rollback failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get current transaction status
|
|
142
|
+
*/
|
|
143
|
+
async getStatus() {
|
|
144
|
+
if (!this.currentTransaction) {
|
|
145
|
+
throw new Error('No transaction in progress');
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const response = await fetch(`${this.apiUrl}/transactions/${this.currentTransaction.id}`, {
|
|
149
|
+
headers: {
|
|
150
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
if (!response.ok) {
|
|
154
|
+
throw new Error(`Failed to get transaction status: ${response.statusText}`);
|
|
155
|
+
}
|
|
156
|
+
const data = await response.json();
|
|
157
|
+
return {
|
|
158
|
+
status: data.status,
|
|
159
|
+
changeCount: data.changeCount,
|
|
160
|
+
appliedCount: this.currentTransaction.appliedCount,
|
|
161
|
+
conflictCount: this.currentTransaction.conflictCount,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
throw new Error(`Failed to get status: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get current transaction
|
|
170
|
+
*/
|
|
171
|
+
getCurrentTransaction() {
|
|
172
|
+
return this.currentTransaction;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Subscribe to transaction changes
|
|
176
|
+
*/
|
|
177
|
+
subscribe(listener) {
|
|
178
|
+
this.transactionListeners.add(listener);
|
|
179
|
+
return () => this.transactionListeners.delete(listener);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Notify listeners of transaction changes
|
|
183
|
+
*/
|
|
184
|
+
notifyListeners() {
|
|
185
|
+
if (this.currentTransaction) {
|
|
186
|
+
for (const listener of this.transactionListeners) {
|
|
187
|
+
try {
|
|
188
|
+
listener(this.currentTransaction);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
console.error('Listener error:', error);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Reset transaction state (useful for cleanup)
|
|
198
|
+
*/
|
|
199
|
+
reset() {
|
|
200
|
+
this.currentTransaction = null;
|
|
201
|
+
this.transactionListeners.clear();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=transaction-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-hook.js","sourceRoot":"","sources":["../../../../../client-core/src/mutations/transaction-hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { IStorageAdapter } from '../storage';
|
|
2
|
+
import type { ChangeMessage } from '@edgebasejs/core';
|
|
3
|
+
/**
|
|
4
|
+
* Manages real-time sync between WebSocket changes and local storage
|
|
5
|
+
* Handles merging of server changes with local data
|
|
6
|
+
*/
|
|
7
|
+
export declare class RealtimeSyncManager {
|
|
8
|
+
private storage;
|
|
9
|
+
private changeListeners;
|
|
10
|
+
constructor(storage: IStorageAdapter);
|
|
11
|
+
/**
|
|
12
|
+
* Subscribe to changes for a specific entity
|
|
13
|
+
*/
|
|
14
|
+
onEntityChange(entity: string, listener: (change: ChangeMessage) => void): () => void;
|
|
15
|
+
/**
|
|
16
|
+
* Handle incoming WebSocket change message
|
|
17
|
+
* Merges with local storage using server-authoritative conflict resolution
|
|
18
|
+
*/
|
|
19
|
+
handleChange(change: ChangeMessage): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Notify listeners about a change
|
|
22
|
+
*/
|
|
23
|
+
private notifyListeners;
|
|
24
|
+
/**
|
|
25
|
+
* Get all data for an entity from local storage
|
|
26
|
+
*/
|
|
27
|
+
getEntityData<T = any>(entity: string): Promise<T[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Get a single record by ID
|
|
30
|
+
*/
|
|
31
|
+
getRecord<T = any>(entity: string, recordId: string): Promise<T | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Merge outbox changes with server updates
|
|
34
|
+
* Used during sync to detect conflicts
|
|
35
|
+
*/
|
|
36
|
+
mergeWithOutbox(entity: string, recordId: string, serverRecord: Record<string, any>, serverVersion: number): Promise<{
|
|
37
|
+
resolved: boolean;
|
|
38
|
+
data: Record<string, any>;
|
|
39
|
+
conflict?: boolean;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Clear all data for an entity
|
|
43
|
+
*/
|
|
44
|
+
clearEntity(entity: string): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Get sync metadata for entity
|
|
47
|
+
* Used to track which records have been synced
|
|
48
|
+
*/
|
|
49
|
+
getSyncStatus(entity: string): Promise<Record<string, any>>;
|
|
50
|
+
/**
|
|
51
|
+
* Listen for all changes across entities
|
|
52
|
+
*/
|
|
53
|
+
onAnyChange(listener: (entity: string, change: ChangeMessage) => void): () => void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=realtime-sync-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-sync-manager.d.ts","sourceRoot":"","sources":["../../../../../client-core/src/realtime/realtime-sync-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,qBAAa,mBAAmB;IAGlB,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,eAAe,CAA2D;gBAE9D,OAAO,EAAE,eAAe;IAE5C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAarF;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCxD;;OAEG;IACH,OAAO,CAAC,eAAe;IAavB;;OAEG;IACG,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAoB1D;;OAEG;IACG,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAc7E;;;OAGG;IACG,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAsChF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAsBjE;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;CASnF"}
|