@powersync/service-module-postgres-storage 0.12.0 → 0.13.1
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/CHANGELOG.md +45 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/migrations/scripts/1771424826685-current-data-pending-deletes.d.ts +3 -0
- package/dist/@types/storage/PostgresBucketStorageFactory.d.ts +4 -0
- package/dist/@types/storage/PostgresCompactor.d.ts +8 -2
- package/dist/@types/storage/PostgresSyncRulesStorage.d.ts +10 -4
- package/dist/@types/storage/batch/OperationBatch.d.ts +2 -2
- package/dist/@types/storage/batch/PostgresBucketBatch.d.ts +13 -9
- package/dist/@types/storage/batch/PostgresPersistedBatch.d.ts +17 -5
- package/dist/@types/storage/current-data-store.d.ts +85 -0
- package/dist/@types/storage/current-data-table.d.ts +9 -0
- package/dist/@types/storage/table-id.d.ts +2 -0
- package/dist/@types/types/models/CurrentData.d.ts +18 -3
- package/dist/@types/utils/bson.d.ts +1 -1
- package/dist/@types/utils/test-utils.d.ts +1 -1
- package/dist/migrations/scripts/1771424826685-current-data-pending-deletes.js +8 -0
- package/dist/migrations/scripts/1771424826685-current-data-pending-deletes.js.map +1 -0
- package/dist/storage/PostgresBucketStorageFactory.js +41 -4
- package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
- package/dist/storage/PostgresCompactor.js +14 -6
- package/dist/storage/PostgresCompactor.js.map +1 -1
- package/dist/storage/PostgresSyncRulesStorage.js +98 -24
- package/dist/storage/PostgresSyncRulesStorage.js.map +1 -1
- package/dist/storage/batch/OperationBatch.js +2 -1
- package/dist/storage/batch/OperationBatch.js.map +1 -1
- package/dist/storage/batch/PostgresBucketBatch.js +295 -213
- package/dist/storage/batch/PostgresBucketBatch.js.map +1 -1
- package/dist/storage/batch/PostgresPersistedBatch.js +86 -81
- package/dist/storage/batch/PostgresPersistedBatch.js.map +1 -1
- package/dist/storage/current-data-store.js +270 -0
- package/dist/storage/current-data-store.js.map +1 -0
- package/dist/storage/current-data-table.js +22 -0
- package/dist/storage/current-data-table.js.map +1 -0
- package/dist/storage/table-id.js +8 -0
- package/dist/storage/table-id.js.map +1 -0
- package/dist/types/models/CurrentData.js +11 -2
- package/dist/types/models/CurrentData.js.map +1 -1
- package/dist/utils/bson.js.map +1 -1
- package/dist/utils/db.js +9 -0
- package/dist/utils/db.js.map +1 -1
- package/dist/utils/test-utils.js +13 -6
- package/dist/utils/test-utils.js.map +1 -1
- package/package.json +8 -8
- package/src/migrations/scripts/1771424826685-current-data-pending-deletes.ts +10 -0
- package/src/storage/PostgresBucketStorageFactory.ts +53 -5
- package/src/storage/PostgresCompactor.ts +17 -8
- package/src/storage/PostgresSyncRulesStorage.ts +47 -31
- package/src/storage/batch/OperationBatch.ts +4 -3
- package/src/storage/batch/PostgresBucketBatch.ts +316 -238
- package/src/storage/batch/PostgresPersistedBatch.ts +92 -84
- package/src/storage/current-data-store.ts +326 -0
- package/src/storage/current-data-table.ts +26 -0
- package/src/storage/table-id.ts +9 -0
- package/src/types/models/CurrentData.ts +17 -4
- package/src/utils/bson.ts +1 -1
- package/src/utils/db.ts +10 -0
- package/src/utils/test-utils.ts +14 -7
- package/test/src/__snapshots__/storage.test.ts.snap +151 -0
- package/test/src/__snapshots__/storage_compacting.test.ts.snap +17 -0
- package/test/src/__snapshots__/storage_sync.test.ts.snap +1111 -16
- package/test/src/env.ts +1 -1
- package/test/src/migrations.test.ts +1 -1
- package/test/src/storage.test.ts +138 -131
- package/test/src/storage_compacting.test.ts +80 -11
- package/test/src/storage_sync.test.ts +57 -54
- package/test/src/util.ts +4 -4
|
@@ -20,6 +20,10 @@ export declare class PostgresBucketStorageFactory extends storage.BucketStorageF
|
|
|
20
20
|
getPowerSyncInstanceId(): Promise<string>;
|
|
21
21
|
getSystemIdentifier(): Promise<storage.BucketStorageSystemIdentifier>;
|
|
22
22
|
updateSyncRules(options: storage.UpdateSyncRulesOptions): Promise<PostgresPersistedSyncRulesContent>;
|
|
23
|
+
/**
|
|
24
|
+
* Lazy-initializes storage-version-specific structures, if needed.
|
|
25
|
+
*/
|
|
26
|
+
private initializeStorageVersion;
|
|
23
27
|
restartReplication(sync_rules_group_id: number): Promise<void>;
|
|
24
28
|
getActiveSyncRulesContent(): Promise<storage.PersistedSyncRulesContent | null>;
|
|
25
29
|
getNextSyncRulesContent(): Promise<storage.PersistedSyncRulesContent | null>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
2
|
-
import { storage } from '@powersync/service-core';
|
|
2
|
+
import { InternalOpId, storage } from '@powersync/service-core';
|
|
3
3
|
/**
|
|
4
4
|
* Additional options, primarily for testing.
|
|
5
5
|
*/
|
|
@@ -15,7 +15,7 @@ export declare class PostgresCompactor {
|
|
|
15
15
|
private clearBatchLimit;
|
|
16
16
|
private maxOpId;
|
|
17
17
|
private buckets;
|
|
18
|
-
constructor(db: lib_postgres.DatabaseClient, group_id: number, options
|
|
18
|
+
constructor(db: lib_postgres.DatabaseClient, group_id: number, options: PostgresCompactOptions);
|
|
19
19
|
/**
|
|
20
20
|
* Compact buckets by converting operations into MOVE and/or CLEAR operations.
|
|
21
21
|
*
|
|
@@ -25,6 +25,12 @@ export declare class PostgresCompactor {
|
|
|
25
25
|
private compactAllBuckets;
|
|
26
26
|
private compactSingleBucket;
|
|
27
27
|
private flush;
|
|
28
|
+
/**
|
|
29
|
+
* Expose the internal clearBucket() method to tests.
|
|
30
|
+
*
|
|
31
|
+
* @deprecated Only for tests
|
|
32
|
+
*/
|
|
33
|
+
clearBucketForTests(bucket: string, op: InternalOpId): Promise<void>;
|
|
28
34
|
/**
|
|
29
35
|
* Perform a CLEAR compact for a bucket.
|
|
30
36
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
2
|
-
import { CheckpointChanges, GetCheckpointChangesOptions, InternalOpId, PopulateChecksumCacheOptions, PopulateChecksumCacheResults, ReplicationCheckpoint, storage, utils, WatchWriteCheckpointOptions } from '@powersync/service-core';
|
|
2
|
+
import { CheckpointChanges, GetCheckpointChangesOptions, InternalOpId, PopulateChecksumCacheOptions, PopulateChecksumCacheResults, ReplicationCheckpoint, storage, StorageVersionConfig, utils, WatchWriteCheckpointOptions } from '@powersync/service-core';
|
|
3
3
|
import * as sync_rules from '@powersync/service-sync-rules';
|
|
4
4
|
import { RequiredOperationBatchLimits } from '../types/types.js';
|
|
5
5
|
import * as framework from '@powersync/lib-services-framework';
|
|
@@ -18,9 +18,11 @@ export declare class PostgresSyncRulesStorage extends framework.BaseObserver<sto
|
|
|
18
18
|
readonly sync_rules: storage.PersistedSyncRulesContent;
|
|
19
19
|
readonly slot_name: string;
|
|
20
20
|
readonly factory: PostgresBucketStorageFactory;
|
|
21
|
+
readonly storageConfig: StorageVersionConfig;
|
|
21
22
|
private sharedIterator;
|
|
22
23
|
protected db: lib_postgres.DatabaseClient;
|
|
23
24
|
protected writeCheckpointAPI: PostgresWriteCheckpointAPI;
|
|
25
|
+
private readonly currentDataStore;
|
|
24
26
|
private parsedSyncRulesCache;
|
|
25
27
|
private _checksumCache;
|
|
26
28
|
constructor(options: PostgresSyncRulesStorageOptions);
|
|
@@ -40,10 +42,14 @@ export declare class PostgresSyncRulesStorage extends framework.BaseObserver<sto
|
|
|
40
42
|
createManagedWriteCheckpoint(checkpoint: storage.ManagedWriteCheckpointOptions): Promise<bigint>;
|
|
41
43
|
getCheckpoint(): Promise<storage.ReplicationCheckpoint>;
|
|
42
44
|
resolveTable(options: storage.ResolveTableOptions): Promise<storage.ResolveTableResult>;
|
|
43
|
-
|
|
45
|
+
createWriter(options: storage.CreateWriterOptions): Promise<storage.BucketStorageBatch>;
|
|
46
|
+
/**
|
|
47
|
+
* @deprecated Use `createWriter()` with `await using` instead.
|
|
48
|
+
*/
|
|
49
|
+
startBatch(options: storage.CreateWriterOptions, callback: (batch: storage.BucketStorageBatch) => Promise<void>): Promise<storage.FlushedResult | null>;
|
|
44
50
|
getParameterSets(checkpoint: ReplicationCheckpoint, lookups: sync_rules.ScopedParameterLookup[]): Promise<sync_rules.SqliteJsonRow[]>;
|
|
45
|
-
getBucketDataBatch(checkpoint: InternalOpId, dataBuckets:
|
|
46
|
-
getChecksums(checkpoint: utils.InternalOpId, buckets:
|
|
51
|
+
getBucketDataBatch(checkpoint: InternalOpId, dataBuckets: storage.BucketDataRequest[], options?: storage.BucketDataBatchOptions): AsyncIterable<storage.SyncBucketDataChunk>;
|
|
52
|
+
getChecksums(checkpoint: utils.InternalOpId, buckets: storage.BucketChecksumRequest[]): Promise<utils.ChecksumMap>;
|
|
47
53
|
clearChecksumCache(): void;
|
|
48
54
|
terminate(options?: storage.TerminateOptions): Promise<void>;
|
|
49
55
|
getStatus(): Promise<storage.SyncRuleStatus>;
|
|
@@ -40,8 +40,8 @@ export declare class RecordOperation {
|
|
|
40
40
|
/**
|
|
41
41
|
* In-memory cache key - must not be persisted.
|
|
42
42
|
*/
|
|
43
|
-
export declare function cacheKey(sourceTableId:
|
|
43
|
+
export declare function cacheKey(sourceTableId: storage.SourceTableId, id: storage.ReplicaId): string;
|
|
44
44
|
/**
|
|
45
45
|
* Calculates a cache key for a stored ReplicaId. This is usually stored as a bytea/Buffer.
|
|
46
46
|
*/
|
|
47
|
-
export declare function encodedCacheKey(sourceTableId:
|
|
47
|
+
export declare function encodedCacheKey(sourceTableId: storage.SourceTableId, storedKey: Buffer): string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
2
2
|
import { BaseObserver, Logger } from '@powersync/lib-services-framework';
|
|
3
|
-
import { BucketStorageMarkRecordUnavailable, InternalOpId, storage } from '@powersync/service-core';
|
|
3
|
+
import { BucketStorageMarkRecordUnavailable, CheckpointResult, InternalOpId, storage } from '@powersync/service-core';
|
|
4
4
|
import * as sync_rules from '@powersync/service-sync-rules';
|
|
5
5
|
import * as t from 'ts-codec';
|
|
6
|
-
import {
|
|
6
|
+
import { V3CurrentDataDecoded } from '../../types/models/CurrentData.js';
|
|
7
7
|
import { RequiredOperationBatchLimits } from '../../types/types.js';
|
|
8
8
|
import { OperationBatch, RecordOperation } from './OperationBatch.js';
|
|
9
9
|
import { PostgresPersistedBatch } from './PostgresPersistedBatch.js';
|
|
@@ -14,7 +14,6 @@ export interface PostgresBucketBatchOptions {
|
|
|
14
14
|
group_id: number;
|
|
15
15
|
slot_name: string;
|
|
16
16
|
last_checkpoint_lsn: string | null;
|
|
17
|
-
no_checkpoint_before_lsn: string;
|
|
18
17
|
store_current_data: boolean;
|
|
19
18
|
keep_alive_op?: InternalOpId | null;
|
|
20
19
|
resumeFromLsn: string | null;
|
|
@@ -24,6 +23,7 @@ export interface PostgresBucketBatchOptions {
|
|
|
24
23
|
skip_existing_rows: boolean;
|
|
25
24
|
batch_limits: RequiredOperationBatchLimits;
|
|
26
25
|
markRecordUnavailable: BucketStorageMarkRecordUnavailable | undefined;
|
|
26
|
+
storageConfig: storage.StorageVersionConfig;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* Intermediate type which helps for only watching the active sync rules
|
|
@@ -49,7 +49,6 @@ export declare class PostgresBucketBatch extends BaseObserver<storage.BucketBatc
|
|
|
49
49
|
protected db: lib_postgres.DatabaseClient;
|
|
50
50
|
protected group_id: number;
|
|
51
51
|
protected last_checkpoint_lsn: string | null;
|
|
52
|
-
protected no_checkpoint_before_lsn: string;
|
|
53
52
|
protected persisted_op: InternalOpId | null;
|
|
54
53
|
protected write_checkpoint_batch: storage.CustomWriteCheckpointOptions[];
|
|
55
54
|
protected readonly sync_rules: sync_rules.HydratedSyncRules;
|
|
@@ -58,24 +57,28 @@ export declare class PostgresBucketBatch extends BaseObserver<storage.BucketBatc
|
|
|
58
57
|
private markRecordUnavailable;
|
|
59
58
|
private needsActivation;
|
|
60
59
|
private clearedError;
|
|
60
|
+
private readonly storageConfig;
|
|
61
|
+
private readonly currentDataStore;
|
|
61
62
|
constructor(options: PostgresBucketBatchOptions);
|
|
62
63
|
get lastCheckpointLsn(): string | null;
|
|
63
|
-
get noCheckpointBeforeLsn(): string;
|
|
64
64
|
[Symbol.asyncDispose](): Promise<void>;
|
|
65
|
+
dispose(): Promise<void>;
|
|
65
66
|
save(record: storage.SaveOptions): Promise<storage.FlushedResult | null>;
|
|
66
67
|
truncate(sourceTables: storage.SourceTable[]): Promise<storage.FlushedResult | null>;
|
|
67
68
|
protected truncateSingle(sourceTable: storage.SourceTable): Promise<bigint | null>;
|
|
68
69
|
drop(sourceTables: storage.SourceTable[]): Promise<storage.FlushedResult | null>;
|
|
69
70
|
flush(): Promise<storage.FlushedResult | null>;
|
|
70
71
|
private flushInner;
|
|
71
|
-
commit(lsn: string, options?: storage.BucketBatchCommitOptions): Promise<
|
|
72
|
-
keepalive(lsn: string): Promise<
|
|
72
|
+
commit(lsn: string, options?: storage.BucketBatchCommitOptions): Promise<CheckpointResult>;
|
|
73
|
+
keepalive(lsn: string): Promise<CheckpointResult>;
|
|
73
74
|
setResumeLsn(lsn: string): Promise<void>;
|
|
74
|
-
|
|
75
|
+
markAllSnapshotDone(no_checkpoint_before_lsn: string): Promise<void>;
|
|
76
|
+
markTableSnapshotRequired(table: storage.SourceTable): Promise<void>;
|
|
77
|
+
markTableSnapshotDone(tables: storage.SourceTable[], no_checkpoint_before_lsn?: string): Promise<storage.SourceTable[]>;
|
|
75
78
|
updateTableProgress(table: storage.SourceTable, progress: Partial<storage.TableSnapshotStatus>): Promise<storage.SourceTable>;
|
|
76
79
|
addCustomWriteCheckpoint(checkpoint: storage.BatchedCustomWriteCheckpointOptions): void;
|
|
77
80
|
protected replicateBatch(db: lib_postgres.WrappedConnection, batch: OperationBatch): Promise<OperationBatch | null>;
|
|
78
|
-
protected saveOperation(persistedBatch: PostgresPersistedBatch, operation: RecordOperation, currentData?:
|
|
81
|
+
protected saveOperation(persistedBatch: PostgresPersistedBatch, operation: RecordOperation, currentData?: V3CurrentDataDecoded | null): Promise<{
|
|
79
82
|
group_id: number;
|
|
80
83
|
source_table: string;
|
|
81
84
|
source_key: Buffer<ArrayBuffer>;
|
|
@@ -86,6 +89,7 @@ export declare class PostgresBucketBatch extends BaseObserver<storage.BucketBatc
|
|
|
86
89
|
table: string;
|
|
87
90
|
}[];
|
|
88
91
|
lookups: Buffer<ArrayBuffer>[];
|
|
92
|
+
pending_delete: bigint | null;
|
|
89
93
|
} | null>;
|
|
90
94
|
/**
|
|
91
95
|
* Switch from processing -> active if relevant.
|
|
@@ -18,7 +18,7 @@ export type SaveParameterDataOptions = {
|
|
|
18
18
|
existing_lookups: Buffer[];
|
|
19
19
|
};
|
|
20
20
|
export type DeleteCurrentDataOptions = {
|
|
21
|
-
source_table_id:
|
|
21
|
+
source_table_id: string;
|
|
22
22
|
/**
|
|
23
23
|
* ReplicaID which needs to be serialized in order to be queried
|
|
24
24
|
* or inserted into the DB
|
|
@@ -28,12 +28,19 @@ export type DeleteCurrentDataOptions = {
|
|
|
28
28
|
* Optionally provide the serialized source key directly
|
|
29
29
|
*/
|
|
30
30
|
serialized_source_key?: Buffer;
|
|
31
|
+
/**
|
|
32
|
+
* Streaming replication needs soft deletes, while truncating tables can use a hard delete directly.
|
|
33
|
+
*/
|
|
34
|
+
soft: boolean;
|
|
31
35
|
};
|
|
32
36
|
export type PostgresPersistedBatchOptions = RequiredOperationBatchLimits & {
|
|
33
37
|
group_id: number;
|
|
38
|
+
storageConfig: storage.StorageVersionConfig;
|
|
34
39
|
};
|
|
35
40
|
export declare class PostgresPersistedBatch {
|
|
36
41
|
group_id: number;
|
|
42
|
+
private readonly storageConfig;
|
|
43
|
+
private readonly currentDataStore;
|
|
37
44
|
/**
|
|
38
45
|
* Very rough estimate of current operations size in bytes
|
|
39
46
|
*/
|
|
@@ -45,16 +52,21 @@ export declare class PostgresPersistedBatch {
|
|
|
45
52
|
*/
|
|
46
53
|
protected bucketDataInserts: models.BucketData[];
|
|
47
54
|
protected parameterDataInserts: models.BucketParameters[];
|
|
48
|
-
protected currentDataDeletes: Pick<models.CurrentData, 'group_id' | 'source_key' | 'source_table'>[];
|
|
49
55
|
/**
|
|
50
|
-
* This is stored as a map to avoid multiple inserts (or conflicts) for the same key
|
|
56
|
+
* This is stored as a map to avoid multiple inserts (or conflicts) for the same key.
|
|
57
|
+
*
|
|
58
|
+
* Each key may only occur in one of these two maps.
|
|
51
59
|
*/
|
|
52
|
-
protected currentDataInserts: Map<string, models.
|
|
60
|
+
protected currentDataInserts: Map<string, models.V3CurrentData>;
|
|
61
|
+
protected currentDataDeletes: Map<string, {
|
|
62
|
+
source_key_hex: string;
|
|
63
|
+
source_table: string;
|
|
64
|
+
}>;
|
|
53
65
|
constructor(options: PostgresPersistedBatchOptions);
|
|
54
66
|
saveBucketData(options: SaveBucketDataOptions): void;
|
|
55
67
|
saveParameterData(options: SaveParameterDataOptions): void;
|
|
56
68
|
deleteCurrentData(options: DeleteCurrentDataOptions): void;
|
|
57
|
-
upsertCurrentData(options: models.
|
|
69
|
+
upsertCurrentData(options: models.V3CurrentDataDecoded, serialized_source_key?: Buffer): void;
|
|
58
70
|
shouldFlushTransaction(): boolean;
|
|
59
71
|
flush(db: lib_postgres.WrappedConnection): Promise<{
|
|
60
72
|
flushedAny: boolean;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
2
|
+
import { storage } from '@powersync/service-core';
|
|
3
|
+
import * as t from 'ts-codec';
|
|
4
|
+
import * as models from '../types/models/CurrentData.js';
|
|
5
|
+
type Queryable = Pick<lib_postgres.DatabaseClient, 'sql' | 'streamRows'>;
|
|
6
|
+
declare const TruncateCurrentDataCodec: t.ObjectCodec<Pick<{
|
|
7
|
+
buckets: t.Codec<{
|
|
8
|
+
id: string;
|
|
9
|
+
bucket: string;
|
|
10
|
+
table: string;
|
|
11
|
+
}[], string, string, t.CodecProps>;
|
|
12
|
+
data: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
|
|
13
|
+
group_id: t.Codec<number, number, "pg_number", t.CodecProps>;
|
|
14
|
+
lookups: t.ArrayCodec<t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>>;
|
|
15
|
+
source_key: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
|
|
16
|
+
source_table: t.IdentityCodec<t.CodecType.String>;
|
|
17
|
+
}, "source_key" | "buckets" | "lookups">>;
|
|
18
|
+
declare const LookupKeyCodec: t.ObjectCodec<Pick<{
|
|
19
|
+
buckets: t.Codec<{
|
|
20
|
+
id: string;
|
|
21
|
+
bucket: string;
|
|
22
|
+
table: string;
|
|
23
|
+
}[], string, string, t.CodecProps>;
|
|
24
|
+
data: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
|
|
25
|
+
group_id: t.Codec<number, number, "pg_number", t.CodecProps>;
|
|
26
|
+
lookups: t.ArrayCodec<t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>>;
|
|
27
|
+
source_key: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
|
|
28
|
+
source_table: t.IdentityCodec<t.CodecType.String>;
|
|
29
|
+
}, "source_table" | "source_key">>;
|
|
30
|
+
export type TruncateCurrentDataRow = t.Decoded<typeof TruncateCurrentDataCodec>;
|
|
31
|
+
export type CurrentDataLookupRow = t.Decoded<typeof LookupKeyCodec> | t.Decoded<typeof models.V1CurrentData> | t.Decoded<typeof models.V3CurrentData>;
|
|
32
|
+
export declare const V1_CURRENT_DATA_TABLE = "current_data";
|
|
33
|
+
export declare const V3_CURRENT_DATA_TABLE = "v3_current_data";
|
|
34
|
+
export declare class PostgresCurrentDataStore {
|
|
35
|
+
readonly table: string;
|
|
36
|
+
readonly softDeleteEnabled: boolean;
|
|
37
|
+
constructor(storageConfig: storage.StorageVersionConfig);
|
|
38
|
+
streamTruncateRows(db: Queryable, options: {
|
|
39
|
+
groupId: number;
|
|
40
|
+
sourceTableId: string;
|
|
41
|
+
limit: number;
|
|
42
|
+
}): AsyncIterableIterator<{
|
|
43
|
+
source_key: string;
|
|
44
|
+
buckets: string;
|
|
45
|
+
lookups: string[];
|
|
46
|
+
}[]>;
|
|
47
|
+
decodeTruncateRow(row: t.Encoded<typeof TruncateCurrentDataCodec>): TruncateCurrentDataRow;
|
|
48
|
+
streamSizeRows(db: Queryable, options: {
|
|
49
|
+
groupId: number;
|
|
50
|
+
lookups: {
|
|
51
|
+
source_table: string;
|
|
52
|
+
source_key: string;
|
|
53
|
+
}[];
|
|
54
|
+
}): AsyncIterableIterator<{
|
|
55
|
+
source_table: string;
|
|
56
|
+
source_key: storage.ReplicaId;
|
|
57
|
+
data_size: number;
|
|
58
|
+
}[]>;
|
|
59
|
+
streamLookupRows(db: Queryable, options: {
|
|
60
|
+
groupId: number;
|
|
61
|
+
lookups: {
|
|
62
|
+
source_table: string;
|
|
63
|
+
source_key: string;
|
|
64
|
+
}[];
|
|
65
|
+
skipExistingRows: boolean;
|
|
66
|
+
}): AsyncIterableIterator<any[]>;
|
|
67
|
+
decodeLookupRow(row: any, skipExistingRows: boolean): CurrentDataLookupRow;
|
|
68
|
+
flushUpserts(db: Queryable, updates: models.V3CurrentData[]): Promise<void>;
|
|
69
|
+
flushDeletes(db: Queryable, options: {
|
|
70
|
+
groupId: number;
|
|
71
|
+
deletes: {
|
|
72
|
+
source_key_hex: string;
|
|
73
|
+
source_table: string;
|
|
74
|
+
}[];
|
|
75
|
+
}): Promise<void>;
|
|
76
|
+
cleanupPendingDeletes(db: Queryable, options: {
|
|
77
|
+
groupId: number;
|
|
78
|
+
lastCheckpoint: bigint;
|
|
79
|
+
}): Promise<void>;
|
|
80
|
+
deleteGroupRows(db: Queryable, options: {
|
|
81
|
+
groupId: number;
|
|
82
|
+
}): Promise<void>;
|
|
83
|
+
private wherePendingDelete;
|
|
84
|
+
}
|
|
85
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { storage } from '@powersync/service-core';
|
|
2
|
+
export declare const V1_CURRENT_DATA_TABLE = "current_data";
|
|
3
|
+
export declare const V3_CURRENT_DATA_TABLE = "v3_current_data";
|
|
4
|
+
/**
|
|
5
|
+
* The table used by a specific storage version for general current_data access.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getCommonCurrentDataTable(storageConfig: storage.StorageVersionConfig): "current_data" | "v3_current_data";
|
|
8
|
+
export declare function getV1CurrentDataTable(storageConfig: storage.StorageVersionConfig): string;
|
|
9
|
+
export declare function getV3CurrentDataTable(storageConfig: storage.StorageVersionConfig): string;
|
|
@@ -6,7 +6,7 @@ export declare const CurrentBucket: t.ObjectCodec<{
|
|
|
6
6
|
}>;
|
|
7
7
|
export type CurrentBucket = t.Encoded<typeof CurrentBucket>;
|
|
8
8
|
export type CurrentBucketDecoded = t.Decoded<typeof CurrentBucket>;
|
|
9
|
-
export declare const
|
|
9
|
+
export declare const V1CurrentData: t.ObjectCodec<{
|
|
10
10
|
buckets: t.Codec<{
|
|
11
11
|
id: string;
|
|
12
12
|
bucket: string;
|
|
@@ -18,5 +18,20 @@ export declare const CurrentData: t.ObjectCodec<{
|
|
|
18
18
|
source_key: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
|
|
19
19
|
source_table: t.IdentityCodec<t.CodecType.String>;
|
|
20
20
|
}>;
|
|
21
|
-
export
|
|
22
|
-
|
|
21
|
+
export declare const V3CurrentData: t.ObjectCodec<{
|
|
22
|
+
buckets: t.Codec<{
|
|
23
|
+
id: string;
|
|
24
|
+
bucket: string;
|
|
25
|
+
table: string;
|
|
26
|
+
}[], string, string, t.CodecProps>;
|
|
27
|
+
data: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
|
|
28
|
+
group_id: t.Codec<number, number, "pg_number", t.CodecProps>;
|
|
29
|
+
lookups: t.ArrayCodec<t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>>;
|
|
30
|
+
source_key: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
|
|
31
|
+
source_table: t.IdentityCodec<t.CodecType.String>;
|
|
32
|
+
pending_delete: t.Union<t.Codec<null, null, string, t.CodecProps>, t.Codec<bigint, string | number, string, t.CodecProps>>;
|
|
33
|
+
}>;
|
|
34
|
+
export type V1CurrentData = t.Encoded<typeof V1CurrentData>;
|
|
35
|
+
export type V1CurrentDataDecoded = t.Decoded<typeof V1CurrentData>;
|
|
36
|
+
export type V3CurrentData = t.Encoded<typeof V3CurrentData>;
|
|
37
|
+
export type V3CurrentDataDecoded = t.Decoded<typeof V3CurrentData>;
|
|
@@ -3,4 +3,4 @@ import { storage } from '@powersync/service-core';
|
|
|
3
3
|
* BSON is used to serialize certain documents for storage in BYTEA columns.
|
|
4
4
|
* JSONB columns do not directly support storing binary data which could be required in future.
|
|
5
5
|
*/
|
|
6
|
-
export declare function replicaIdToSubkey(tableId:
|
|
6
|
+
export declare function replicaIdToSubkey(tableId: storage.SourceTableId, id: storage.ReplicaId): string;
|
|
@@ -15,5 +15,5 @@ export declare function postgresTestSetup(factoryOptions: PostgresTestStorageOpt
|
|
|
15
15
|
reportFactory: (options?: TestStorageOptions) => Promise<PostgresReportStorage>;
|
|
16
16
|
factory: (options?: TestStorageOptions) => Promise<PostgresBucketStorageFactory>;
|
|
17
17
|
migrate: (direction: framework.migrations.Direction) => Promise<void>;
|
|
18
|
+
tableIdStrings: boolean;
|
|
18
19
|
};
|
|
19
|
-
export declare function postgresTestStorageFactoryGenerator(factoryOptions: PostgresTestStorageOptions): (options?: TestStorageOptions) => Promise<PostgresBucketStorageFactory>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const up = async (_context) => {
|
|
2
|
+
// No-op.
|
|
3
|
+
// Pending-delete support is now storage-version specific and initialized when v3 sync rules are deployed.
|
|
4
|
+
};
|
|
5
|
+
export const down = async (_context) => {
|
|
6
|
+
// No-op.
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=1771424826685-current-data-pending-deletes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1771424826685-current-data-pending-deletes.js","sourceRoot":"","sources":["../../../src/migrations/scripts/1771424826685-current-data-pending-deletes.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAA0C,KAAK,EAAE,QAAQ,EAAE,EAAE;IAC1E,SAAS;IACT,0GAA0G;AAC5G,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAA0C,KAAK,EAAE,QAAQ,EAAE,EAAE;IAC5E,SAAS;AACX,CAAC,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { storage } from '@powersync/service-core';
|
|
1
|
+
import { framework, storage } from '@powersync/service-core';
|
|
2
2
|
import crypto from 'crypto';
|
|
3
3
|
import * as uuid from 'uuid';
|
|
4
4
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
5
5
|
import { models } from '../types/types.js';
|
|
6
|
+
import { getStorageApplicationName } from '../utils/application-name.js';
|
|
6
7
|
import { NOTIFICATION_CHANNEL, STORAGE_SCHEMA_NAME } from '../utils/db.js';
|
|
7
8
|
import { notifySyncRulesUpdate } from './batch/PostgresBucketBatch.js';
|
|
8
9
|
import { PostgresSyncRulesStorage } from './PostgresSyncRulesStorage.js';
|
|
9
10
|
import { PostgresPersistedSyncRulesContent } from './sync-rules/PostgresPersistedSyncRulesContent.js';
|
|
10
|
-
import { getStorageApplicationName } from '../utils/application-name.js';
|
|
11
11
|
export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
12
12
|
options;
|
|
13
13
|
db;
|
|
@@ -64,14 +64,21 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
64
64
|
}
|
|
65
65
|
const sizes = await this.db.sql `
|
|
66
66
|
SELECT
|
|
67
|
-
|
|
67
|
+
COALESCE(
|
|
68
|
+
pg_total_relation_size(to_regclass('current_data')),
|
|
69
|
+
0
|
|
70
|
+
) AS v1_current_size_bytes,
|
|
71
|
+
COALESCE(
|
|
72
|
+
pg_total_relation_size(to_regclass('v3_current_data')),
|
|
73
|
+
0
|
|
74
|
+
) AS v3_current_size_bytes,
|
|
68
75
|
pg_total_relation_size('bucket_parameters') AS parameter_size_bytes,
|
|
69
76
|
pg_total_relation_size('bucket_data') AS operations_size_bytes;
|
|
70
77
|
`.first();
|
|
71
78
|
return {
|
|
72
79
|
operations_size_bytes: Number(sizes.operations_size_bytes),
|
|
73
80
|
parameters_size_bytes: Number(sizes.parameter_size_bytes),
|
|
74
|
-
replication_size_bytes: Number(sizes.
|
|
81
|
+
replication_size_bytes: Number(sizes.v1_current_size_bytes) + Number(sizes.v3_current_size_bytes)
|
|
75
82
|
};
|
|
76
83
|
}
|
|
77
84
|
async getPowerSyncInstanceId() {
|
|
@@ -117,6 +124,11 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
117
124
|
}
|
|
118
125
|
async updateSyncRules(options) {
|
|
119
126
|
const storageVersion = options.storageVersion ?? storage.CURRENT_STORAGE_VERSION;
|
|
127
|
+
const storageConfig = storage.STORAGE_VERSION_CONFIG[storageVersion];
|
|
128
|
+
if (storageConfig == null) {
|
|
129
|
+
throw new framework.ServiceError(framework.ErrorCode.PSYNC_S1005, `Unsupported storage version ${storageVersion}`);
|
|
130
|
+
}
|
|
131
|
+
await this.initializeStorageVersion(storageConfig);
|
|
120
132
|
return this.db.transaction(async (db) => {
|
|
121
133
|
await db.sql `
|
|
122
134
|
UPDATE sync_rules
|
|
@@ -173,6 +185,31 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
173
185
|
return new PostgresPersistedSyncRulesContent(this.db, newSyncRulesRow);
|
|
174
186
|
});
|
|
175
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Lazy-initializes storage-version-specific structures, if needed.
|
|
190
|
+
*/
|
|
191
|
+
async initializeStorageVersion(storageConfig) {
|
|
192
|
+
if (!storageConfig.softDeleteCurrentData) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
await this.db.sql `
|
|
196
|
+
CREATE TABLE IF NOT EXISTS v3_current_data (
|
|
197
|
+
group_id integer NOT NULL,
|
|
198
|
+
source_table TEXT NOT NULL,
|
|
199
|
+
source_key bytea NOT NULL,
|
|
200
|
+
CONSTRAINT unique_v3_current_data_id PRIMARY KEY (group_id, source_table, source_key),
|
|
201
|
+
buckets jsonb NOT NULL,
|
|
202
|
+
data bytea NOT NULL,
|
|
203
|
+
lookups bytea[] NOT NULL,
|
|
204
|
+
pending_delete BIGINT NULL
|
|
205
|
+
)
|
|
206
|
+
`.execute();
|
|
207
|
+
await this.db.sql `
|
|
208
|
+
CREATE INDEX IF NOT EXISTS v3_current_data_pending_deletes ON v3_current_data (group_id, pending_delete)
|
|
209
|
+
WHERE
|
|
210
|
+
pending_delete IS NOT NULL
|
|
211
|
+
`.execute();
|
|
212
|
+
}
|
|
176
213
|
async restartReplication(sync_rules_group_id) {
|
|
177
214
|
const next = await this.getNextSyncRulesContent();
|
|
178
215
|
const active = await this.getActiveSyncRulesContent();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresBucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresBucketStorageFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,OAAO,EAA0B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"PostgresBucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresBucketStorageFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,12 +23,12 @@ export class PostgresCompactor {
|
|
|
23
23
|
constructor(db, group_id, options) {
|
|
24
24
|
this.db = db;
|
|
25
25
|
this.group_id = group_id;
|
|
26
|
-
this.idLimitBytes = (options
|
|
27
|
-
this.moveBatchLimit = options
|
|
28
|
-
this.moveBatchQueryLimit = options
|
|
29
|
-
this.clearBatchLimit = options
|
|
30
|
-
this.maxOpId = options
|
|
31
|
-
this.buckets = options
|
|
26
|
+
this.idLimitBytes = (options.memoryLimitMB ?? DEFAULT_MEMORY_LIMIT_MB) * 1024 * 1024;
|
|
27
|
+
this.moveBatchLimit = options.moveBatchLimit ?? DEFAULT_MOVE_BATCH_LIMIT;
|
|
28
|
+
this.moveBatchQueryLimit = options.moveBatchQueryLimit ?? DEFAULT_MOVE_BATCH_QUERY_LIMIT;
|
|
29
|
+
this.clearBatchLimit = options.clearBatchLimit ?? DEFAULT_CLEAR_BATCH_LIMIT;
|
|
30
|
+
this.maxOpId = options.maxOpId ?? 0n;
|
|
31
|
+
this.buckets = options.compactBuckets;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
34
|
* Compact buckets by converting operations into MOVE and/or CLEAR operations.
|
|
@@ -183,6 +183,14 @@ export class PostgresCompactor {
|
|
|
183
183
|
this.updates = [];
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Expose the internal clearBucket() method to tests.
|
|
188
|
+
*
|
|
189
|
+
* @deprecated Only for tests
|
|
190
|
+
*/
|
|
191
|
+
clearBucketForTests(bucket, op) {
|
|
192
|
+
return this.clearBucket(bucket, op);
|
|
193
|
+
}
|
|
186
194
|
/**
|
|
187
195
|
* Perform a CLEAR compact for a bucket.
|
|
188
196
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresCompactor.js","sourceRoot":"","sources":["../../src/storage/PostgresCompactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAyB,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAGvE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA8B5D,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,8BAA8B,GAAG,MAAM,CAAC;AAE9C,2CAA2C;AAC3C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,MAAM,OAAO,iBAAiB;IAWlB;IACA;IAXF,OAAO,GAAuB,EAAE,CAAC;IAEjC,YAAY,CAAS;IACrB,cAAc,CAAS;IACvB,mBAAmB,CAAS;IAC5B,eAAe,CAAS;IACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"PostgresCompactor.js","sourceRoot":"","sources":["../../src/storage/PostgresCompactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAyB,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAGvE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA8B5D,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,8BAA8B,GAAG,MAAM,CAAC;AAE9C,2CAA2C;AAC3C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,MAAM,OAAO,iBAAiB;IAWlB;IACA;IAXF,OAAO,GAAuB,EAAE,CAAC;IAEjC,YAAY,CAAS;IACrB,cAAc,CAAS;IACvB,mBAAmB,CAAS;IAC5B,eAAe,CAAS;IACxB,OAAO,CAAe;IACtB,OAAO,CAAuB;IAEtC,YACU,EAA+B,EAC/B,QAAgB,EACxB,OAA+B;QAFvB,OAAE,GAAF,EAAE,CAA6B;QAC/B,aAAQ,GAAR,QAAQ,CAAQ;QAGxB,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,uBAAuB,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QACrF,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,wBAAwB,CAAC;QACzE,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,8BAA8B,CAAC;QACzF,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,yBAAyB,CAAC;QAC5E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,oBAAoB,GAAG,GAAG,CAAC;QACjC,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAA;;;;;;uBAMpB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;8BAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;;;;YAIxD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE;OAClD,CAAC,IAAI,EAAE,CAA8B,CAAC;YAEvC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM;YACR,CAAC;YAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAClD,CAAC;YAED,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,MAAc;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAEvC,IAAI,YAAY,GAAuB;YACrC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,GAAG,EAAE;YACf,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,CAAC;SACf,CAAC;QAEF,IAAI,cAAc,GAAG,UAAU,CAAC;QAEhC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;uBAYd,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;8BAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;wBACxC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE;;;;YAInD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE;OACtD;iBACE,OAAO,CACN,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAC9G;iBACA,IAAI,EAAE,CAAC;YAEV,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,wBAAwB;gBACxB,MAAM;YACR,CAAC;YAED,oCAAoC;YACpC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9C,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC;YAErC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;oBACrD,SAAS;gBACX,CAAC;gBAED,IAAI,eAAe,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC;gBAEtC,IAAI,GAAG,CAAC,EAAE,IAAI,QAAQ,IAAI,GAAG,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;oBAC1C,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,YAAa,EAAE,GAAG,CAAC,UAAW,CAAC,EAAE,CAAC;oBACrG,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC3D,IAAI,QAAQ,EAAE,CAAC;wBACb,8CAA8C;wBAC9C,eAAe,GAAG,KAAK,CAAC;wBAExB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAA;;;;8BAIH,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;;;;;;;6BAOlC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;oCAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE;8BACjD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;aACnD,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,IAAI,YAAY,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;4BAC9C,wBAAwB;4BACxB,6CAA6C;wBAC/C,CAAC;6BAAM,CAAC;4BACN,4DAA4D;4BAC5D,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;4BACrD,6BAA6B;4BAC7B,oBAAoB;4BACpB,sBAAsB;4BACtB,6BAA6B;4BAC7B,YAAY,CAAC,YAAY,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;wBAChD,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,eAAe,EAAE,CAAC;oBACpB,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC;oBAC/B,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC/B,CAAC;qBAAM,IAAI,GAAG,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC;oBAC7B,IAAI,YAAY,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;wBACpC,YAAY,CAAC,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC;oBACtC,CAAC;oBACD,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC;gBAChC,CAAC;gBAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC/C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,YAAY,CAAC,UAAU,IAAI,IAAI,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACpE,MAAM,CAAC,IAAI,CACT,sBAAsB,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,UAAU,cAAc,YAAY,CAAC,WAAW,aAAa,CACzI,CAAC;YACF,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CAAC,MAAc,EAAE,EAAgB;QAClD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,EAAgB;QACxD;;;WAGG;QACH,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,OAAO,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBACxC;;;mBAGG;gBACH,MAAM,EAAE,CAAC,GAAG,CAAA,mDAAmD,CAAC,OAAO,EAAE,CAAC;gBAE1E,IAAI,CAAC;oBACH,IAAI,QAAQ,GAAG,CAAC,CAAC;oBACjB,IAAI,QAAQ,GAAwB,IAAI,CAAC;oBACzC,IAAI,QAAQ,GAAwB,IAAI,CAAC;oBACzC,IAAI,OAAO,GAAG,KAAK,CAAC;oBAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC9G,IAAI,KAAK,EAAE,MAAM,UAAU,IAAI,EAAE,CAAC,UAAU,CAA0B,GAAG,CAAA;;;;;;;;;;;2BAWxD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;kCAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;6BACvC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;;;;gBAIxC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE;WAClD,CAAC,EAAE,CAAC;wBACH,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1D,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;4BAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;gCACpF,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gCAC7D,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC;gCACpB,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oCACjC,OAAO,GAAG,IAAI,CAAC;gCACjB,CAAC;gCACD,IAAI,EAAE,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;oCACzB,IAAI,QAAQ,IAAI,IAAI,IAAI,EAAE,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;wCAChD,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC;oCAC1B,CAAC;gCACH,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,MAAM,IAAI,yBAAyB,CACjC,cAAc,EAAE,CAAC,EAAE,iBAAiB,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,EAAE,CAC1E,CAAC;4BACJ,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,MAAM,EAAE,CAAC,GAAG,CAAA,QAAQ,CAAC,OAAO,EAAE,CAAC;wBAC/B,IAAI,GAAG,IAAI,CAAC;wBACZ,OAAO;oBACT,CAAC;oBAED,MAAM,CAAC,IAAI,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;oBAE7C,MAAM,EAAE,CAAC,GAAG,CAAA;;;2BAGK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;kCAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;6BACvC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;WACnD,CAAC,OAAO,EAAE,CAAC;oBAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;kBAYJ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;kBACtC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;kBAClC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;kBACjC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;kBAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;kBACjC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;;WAExC,CAAC,OAAO,EAAE,CAAC;oBAEZ,MAAM,EAAE,CAAC,GAAG,CAAA,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACjC,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;oBACZ,MAAM,EAAE,CAAC,GAAG,CAAA,UAAU,CAAC,OAAO,EAAE,CAAC;oBACjC,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|