@powersync/service-core 0.0.0-dev-20260225093637 → 0.0.0-dev-20260313100403
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 +42 -7
- package/dist/auth/utils.d.ts +2 -1
- package/dist/auth/utils.js +1 -1
- package/dist/auth/utils.js.map +1 -1
- package/dist/entry/commands/config-command.js +1 -1
- package/dist/entry/commands/config-command.js.map +1 -1
- package/dist/routes/endpoints/admin.js +3 -1
- package/dist/routes/endpoints/admin.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.js +6 -1
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/storage/BucketStorageBatch.d.ts +29 -8
- package/dist/storage/BucketStorageBatch.js.map +1 -1
- package/dist/storage/BucketStorageFactory.d.ts +27 -8
- package/dist/storage/BucketStorageFactory.js +14 -2
- package/dist/storage/BucketStorageFactory.js.map +1 -1
- package/dist/storage/ChecksumCache.d.ts +5 -2
- package/dist/storage/ChecksumCache.js +8 -4
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/PersistedSyncRulesContent.d.ts +8 -2
- package/dist/storage/PersistedSyncRulesContent.js +31 -7
- package/dist/storage/PersistedSyncRulesContent.js.map +1 -1
- package/dist/storage/ReportStorage.d.ts +3 -3
- package/dist/storage/SourceTable.d.ts +7 -2
- package/dist/storage/SourceTable.js.map +1 -1
- package/dist/storage/StorageVersionConfig.d.ts +33 -0
- package/dist/storage/StorageVersionConfig.js +39 -6
- package/dist/storage/StorageVersionConfig.js.map +1 -1
- package/dist/storage/SyncRulesBucketStorage.d.ts +26 -6
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
- package/dist/sync/BucketChecksumState.d.ts +3 -3
- package/dist/sync/BucketChecksumState.js +12 -42
- package/dist/sync/BucketChecksumState.js.map +1 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.d.ts +1 -0
- package/dist/sync/util.js +10 -0
- package/dist/sync/util.js.map +1 -1
- package/dist/util/env.js +1 -1
- package/package.json +5 -5
- package/src/auth/utils.ts +5 -2
- package/src/entry/commands/config-command.ts +1 -1
- package/src/routes/endpoints/admin.ts +3 -1
- package/src/routes/endpoints/sync-stream.ts +6 -1
- package/src/storage/BucketStorageBatch.ts +33 -9
- package/src/storage/BucketStorageFactory.ts +53 -4
- package/src/storage/ChecksumCache.ts +14 -6
- package/src/storage/PersistedSyncRulesContent.ts +45 -7
- package/src/storage/ReportStorage.ts +3 -3
- package/src/storage/SourceTable.ts +7 -1
- package/src/storage/StorageVersionConfig.ts +54 -6
- package/src/storage/SyncRulesBucketStorage.ts +33 -6
- package/src/sync/BucketChecksumState.ts +18 -49
- package/src/sync/sync.ts +9 -3
- package/src/sync/util.ts +10 -0
- package/src/util/env.ts +1 -1
- package/test/src/auth.test.ts +20 -1
- package/test/src/checksum_cache.test.ts +102 -57
- package/test/src/config.test.ts +1 -0
- package/test/src/sync/BucketChecksumState.test.ts +53 -21
- package/test/src/utils.ts +9 -0
- package/tsconfig.tsbuildinfo +1 -1
package/dist/sync/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/sync/util.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/sync/util.ts"],"names":[],"mappings":"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"}
|
package/dist/util/env.js
CHANGED
|
@@ -15,7 +15,7 @@ export const env = utils.collectEnvironmentVariables({
|
|
|
15
15
|
*/
|
|
16
16
|
POWERSYNC_SYNC_RULES_B64: utils.type.string.optional(),
|
|
17
17
|
/**
|
|
18
|
-
* Base64 encoded contents of sync
|
|
18
|
+
* Base64 encoded contents of sync config YAML
|
|
19
19
|
*/
|
|
20
20
|
POWERSYNC_SYNC_CONFIG_B64: utils.type.string.optional(),
|
|
21
21
|
/**
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.0.0-dev-
|
|
8
|
+
"version": "0.0.0-dev-20260313100403",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-ALv2",
|
|
11
11
|
"type": "module",
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
"uuid": "^11.1.0",
|
|
34
34
|
"winston": "^3.13.0",
|
|
35
35
|
"yaml": "^2.3.2",
|
|
36
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
36
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20260313100403",
|
|
37
37
|
"@powersync/service-jsonbig": "0.17.12",
|
|
38
|
-
"@powersync/service-rsocket-router": "0.0.0-dev-
|
|
39
|
-
"@powersync/service-sync-rules": "0.0.0-dev-
|
|
40
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
38
|
+
"@powersync/service-rsocket-router": "0.0.0-dev-20260313100403",
|
|
39
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20260313100403",
|
|
40
|
+
"@powersync/service-types": "0.0.0-dev-20260313100403"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/async": "^3.2.24",
|
package/src/auth/utils.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AuthorizationError, ErrorCode } from '@powersync/lib-services-framework';
|
|
2
|
+
import { configFile } from '@powersync/service-types';
|
|
2
3
|
import * as jose from 'jose';
|
|
3
4
|
import * as urijs from 'uri-js';
|
|
4
5
|
import * as uuid from 'uuid';
|
|
@@ -124,7 +125,9 @@ export interface SupabaseAuthDetails {
|
|
|
124
125
|
hostname: string;
|
|
125
126
|
}
|
|
126
127
|
|
|
127
|
-
export function getSupabaseJwksUrl(
|
|
128
|
+
export function getSupabaseJwksUrl(
|
|
129
|
+
connection: configFile.GenericDataSourceConfig | undefined
|
|
130
|
+
): SupabaseAuthDetails | null {
|
|
128
131
|
if (connection == null) {
|
|
129
132
|
return null;
|
|
130
133
|
} else if (connection.type != 'postgresql') {
|
|
@@ -139,7 +142,7 @@ export function getSupabaseJwksUrl(connection: any): SupabaseAuthDetails | null
|
|
|
139
142
|
return null;
|
|
140
143
|
}
|
|
141
144
|
|
|
142
|
-
const match =
|
|
145
|
+
const match = /^db\.(\w+)\.supabase\.co$/.exec(hostname);
|
|
143
146
|
if (match == null) {
|
|
144
147
|
return null;
|
|
145
148
|
}
|
|
@@ -19,7 +19,7 @@ export function wrapConfigCommand(command: Command) {
|
|
|
19
19
|
)
|
|
20
20
|
.option(
|
|
21
21
|
`-sync64, --sync-base64 [base64]`,
|
|
22
|
-
'Base64 encoded YAML Sync
|
|
22
|
+
'Base64 encoded YAML Sync Config. Defaults to process.env.POWERSYNC_SYNC_CONFIG_B64 or process.env.POWERSYNC_SYNC_RULES_B64 for backwards compatility.',
|
|
23
23
|
util.env.POWERSYNC_SYNC_CONFIG_B64 || util.env.POWERSYNC_SYNC_RULES_B64
|
|
24
24
|
);
|
|
25
25
|
}
|
|
@@ -176,6 +176,7 @@ class FakeSyncRulesContentForValidation extends storage.PersistedSyncRulesConten
|
|
|
176
176
|
...this.apiHandler.getParseSyncRulesOptions(),
|
|
177
177
|
schema: this.schema
|
|
178
178
|
}),
|
|
179
|
+
hydrationState: DEFAULT_HYDRATION_STATE,
|
|
179
180
|
hydratedSyncRules() {
|
|
180
181
|
return this.sync_rules.config.hydrate({ hydrationState: DEFAULT_HYDRATION_STATE });
|
|
181
182
|
}
|
|
@@ -205,7 +206,8 @@ export const validate = routeDefinition({
|
|
|
205
206
|
active: false,
|
|
206
207
|
last_checkpoint_lsn: '',
|
|
207
208
|
storageVersion: storage.LEGACY_STORAGE_VERSION,
|
|
208
|
-
sync_rules_content: content
|
|
209
|
+
sync_rules_content: content,
|
|
210
|
+
compiled_plan: null
|
|
209
211
|
});
|
|
210
212
|
|
|
211
213
|
const connectionStatus = await apiHandler.getConnectionStatus();
|
|
@@ -142,7 +142,12 @@ export const syncStreamed = routeDefinition({
|
|
|
142
142
|
status: 200,
|
|
143
143
|
headers: {
|
|
144
144
|
'Content-Type': useBson ? concatenatedBsonContentType : ndJsonContentType,
|
|
145
|
-
...encodingHeaders
|
|
145
|
+
...encodingHeaders,
|
|
146
|
+
// If the service is behind an nginx reverse-proxy with the default configuration, the response we're about to
|
|
147
|
+
// send would be buffered. This is not what we want for this streaming endpoint, and this behavior keeps
|
|
148
|
+
// breaking users. Setting this unconditionally isn't great, but we don't have a reliable way of checking
|
|
149
|
+
// whether we're behind nginx and we just want the default config to work.
|
|
150
|
+
'X-Accel-Buffering': 'no'
|
|
146
151
|
},
|
|
147
152
|
data: stream,
|
|
148
153
|
afterSend: async (details) => {
|
|
@@ -12,6 +12,16 @@ export const DEFAULT_BUCKET_BATCH_COMMIT_OPTIONS: ResolvedBucketBatchCommitOptio
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageListener>, AsyncDisposable {
|
|
15
|
+
/**
|
|
16
|
+
* Alias for [Symbol.asyncDispose]
|
|
17
|
+
*/
|
|
18
|
+
dispose(): Promise<void>;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Last written op, if any. This may not reflect a consistent checkpoint.
|
|
22
|
+
*/
|
|
23
|
+
last_flushed_op: InternalOpId | null;
|
|
24
|
+
|
|
15
25
|
/**
|
|
16
26
|
* Save an op, and potentially flush.
|
|
17
27
|
*
|
|
@@ -45,19 +55,15 @@ export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageLis
|
|
|
45
55
|
* Flush and commit any saved ops. This creates a new checkpoint by default.
|
|
46
56
|
*
|
|
47
57
|
* Only call this after a transaction.
|
|
48
|
-
*
|
|
49
|
-
* Returns true if either (1) a new checkpoint was created, or (2) there are no changes to commit.
|
|
50
58
|
*/
|
|
51
|
-
commit(lsn: string, options?: BucketBatchCommitOptions): Promise<
|
|
59
|
+
commit(lsn: string, options?: BucketBatchCommitOptions): Promise<CheckpointResult>;
|
|
52
60
|
|
|
53
61
|
/**
|
|
54
62
|
* Advance the checkpoint LSN position, without any associated op.
|
|
55
63
|
*
|
|
56
64
|
* This must only be called when not inside a transaction.
|
|
57
|
-
*
|
|
58
|
-
* @returns true if the checkpoint was advanced, false if this was a no-op
|
|
59
65
|
*/
|
|
60
|
-
keepalive(lsn: string): Promise<
|
|
66
|
+
keepalive(lsn: string): Promise<CheckpointResult>;
|
|
61
67
|
|
|
62
68
|
/**
|
|
63
69
|
* Set the LSN that replication should resume from.
|
|
@@ -83,9 +89,9 @@ export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageLis
|
|
|
83
89
|
*/
|
|
84
90
|
resumeFromLsn: string | null;
|
|
85
91
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
markTableSnapshotDone(tables: SourceTable[], no_checkpoint_before_lsn?: string): Promise<SourceTable[]>;
|
|
93
|
+
markTableSnapshotRequired(table: SourceTable): Promise<void>;
|
|
94
|
+
markAllSnapshotDone(no_checkpoint_before_lsn: string): Promise<void>;
|
|
89
95
|
|
|
90
96
|
updateTableProgress(table: SourceTable, progress: Partial<TableSnapshotStatus>): Promise<SourceTable>;
|
|
91
97
|
|
|
@@ -166,6 +172,24 @@ export interface SaveDelete {
|
|
|
166
172
|
afterReplicaId?: undefined;
|
|
167
173
|
}
|
|
168
174
|
|
|
175
|
+
export interface CheckpointResult {
|
|
176
|
+
/**
|
|
177
|
+
* True if any of these are true:
|
|
178
|
+
* 1. A snapshot is in progress.
|
|
179
|
+
* 2. The last checkpoint is older than "no_checkpoint_before" (if provided).
|
|
180
|
+
* 3. Replication was restarted with a lower LSN, and has not caught up yet.
|
|
181
|
+
*/
|
|
182
|
+
checkpointBlocked: boolean;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* True if a checkpoint was actually created by this operation. This can be false even if checkpointBlocked is false,
|
|
186
|
+
* if the checkpoint was empty.
|
|
187
|
+
*
|
|
188
|
+
* This is primarily used for testing.
|
|
189
|
+
*/
|
|
190
|
+
checkpointCreated: boolean;
|
|
191
|
+
}
|
|
192
|
+
|
|
169
193
|
export interface BucketBatchStorageListener {
|
|
170
194
|
replicationEvent: (payload: ReplicationEventPayload) => void;
|
|
171
195
|
}
|
|
@@ -4,7 +4,13 @@ import { ReplicationEventPayload } from './ReplicationEventPayload.js';
|
|
|
4
4
|
import { ReplicationLock } from './ReplicationLock.js';
|
|
5
5
|
import { SyncRulesBucketStorage } from './SyncRulesBucketStorage.js';
|
|
6
6
|
import { ReportStorage } from './ReportStorage.js';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
PrecompiledSyncConfig,
|
|
9
|
+
SerializedCompatibilityContext,
|
|
10
|
+
serializeSyncPlan,
|
|
11
|
+
SqlSyncRules,
|
|
12
|
+
SyncConfig
|
|
13
|
+
} from '@powersync/service-sync-rules';
|
|
8
14
|
|
|
9
15
|
/**
|
|
10
16
|
* Represents a configured storage provider.
|
|
@@ -148,12 +154,32 @@ export interface StorageMetrics {
|
|
|
148
154
|
export interface UpdateSyncRulesOptions {
|
|
149
155
|
config: {
|
|
150
156
|
yaml: string;
|
|
151
|
-
|
|
157
|
+
/**
|
|
158
|
+
* The serialized sync plan for the sync configuration, or `null` for configurations not using the sync stream
|
|
159
|
+
* compiler.
|
|
160
|
+
*/
|
|
161
|
+
plan: SerializedSyncPlan | null;
|
|
152
162
|
};
|
|
153
163
|
lock?: boolean;
|
|
154
164
|
storageVersion?: number;
|
|
155
165
|
}
|
|
156
166
|
|
|
167
|
+
export interface SerializedSyncPlan {
|
|
168
|
+
/**
|
|
169
|
+
* The serialized plan, from {@link serializeSyncPlan}.
|
|
170
|
+
*/
|
|
171
|
+
plan: unknown;
|
|
172
|
+
compatibility: SerializedCompatibilityContext;
|
|
173
|
+
/**
|
|
174
|
+
* Event descriptors are not currently represented in the sync plan because they don't use the sync streams compiler
|
|
175
|
+
* yet.
|
|
176
|
+
*
|
|
177
|
+
* We might revisit that in the future, but for now we store SQL text of their definitions here to be able to restore
|
|
178
|
+
* them.
|
|
179
|
+
*/
|
|
180
|
+
eventDescriptors: Record<string, string[]>;
|
|
181
|
+
}
|
|
182
|
+
|
|
157
183
|
export function updateSyncRulesFromYaml(
|
|
158
184
|
content: string,
|
|
159
185
|
options?: Omit<UpdateSyncRulesOptions, 'config'> & { validate?: boolean }
|
|
@@ -168,8 +194,25 @@ export function updateSyncRulesFromYaml(
|
|
|
168
194
|
return updateSyncRulesFromConfig(config, options);
|
|
169
195
|
}
|
|
170
196
|
|
|
171
|
-
export function updateSyncRulesFromConfig(
|
|
172
|
-
|
|
197
|
+
export function updateSyncRulesFromConfig(
|
|
198
|
+
parsed: SyncConfig,
|
|
199
|
+
options?: Omit<UpdateSyncRulesOptions, 'config'>
|
|
200
|
+
): UpdateSyncRulesOptions {
|
|
201
|
+
let plan: SerializedSyncPlan | null = null;
|
|
202
|
+
if (parsed instanceof PrecompiledSyncConfig) {
|
|
203
|
+
const eventDescriptors: Record<string, string[]> = {};
|
|
204
|
+
for (const event of parsed.eventDescriptors) {
|
|
205
|
+
eventDescriptors[event.name] = event.sourceQueries.map((q) => q.sql);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
plan = {
|
|
209
|
+
compatibility: parsed.compatibility.serialize(),
|
|
210
|
+
plan: serializeSyncPlan(parsed.plan),
|
|
211
|
+
eventDescriptors
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return { config: { yaml: parsed.content, plan }, ...options };
|
|
173
216
|
}
|
|
174
217
|
|
|
175
218
|
export interface GetIntanceOptions {
|
|
@@ -214,3 +257,9 @@ export interface TestStorageOptions {
|
|
|
214
257
|
}
|
|
215
258
|
export type TestStorageFactory = (options?: TestStorageOptions) => Promise<BucketStorageFactory>;
|
|
216
259
|
export type TestReportStorageFactory = (options?: TestStorageOptions) => Promise<ReportStorage>;
|
|
260
|
+
|
|
261
|
+
export interface TestStorageConfig {
|
|
262
|
+
factory: TestStorageFactory;
|
|
263
|
+
tableIdStrings: boolean;
|
|
264
|
+
storageVersion?: number;
|
|
265
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { OrderedSet } from '@js-sdsl/ordered-set';
|
|
2
2
|
import { LRUCache } from 'lru-cache/min';
|
|
3
|
+
import { BucketDataSource } from '@powersync/service-sync-rules';
|
|
3
4
|
import { BucketChecksum } from '../util/protocol-types.js';
|
|
4
5
|
import { addBucketChecksums, ChecksumMap, InternalOpId, PartialChecksum } from '../util/utils.js';
|
|
6
|
+
import { BucketChecksumRequest } from './SyncRulesBucketStorage.js';
|
|
5
7
|
|
|
6
8
|
interface ChecksumFetchContext {
|
|
7
9
|
fetch(bucket: string): Promise<BucketChecksum>;
|
|
@@ -10,6 +12,7 @@ interface ChecksumFetchContext {
|
|
|
10
12
|
|
|
11
13
|
export interface FetchPartialBucketChecksum {
|
|
12
14
|
bucket: string;
|
|
15
|
+
source: BucketDataSource;
|
|
13
16
|
start?: InternalOpId;
|
|
14
17
|
end: InternalOpId;
|
|
15
18
|
}
|
|
@@ -113,10 +116,10 @@ export class ChecksumCache {
|
|
|
113
116
|
this.bucketCheckpoints.clear();
|
|
114
117
|
}
|
|
115
118
|
|
|
116
|
-
async getChecksums(checkpoint: InternalOpId, buckets:
|
|
119
|
+
async getChecksums(checkpoint: InternalOpId, buckets: BucketChecksumRequest[]): Promise<BucketChecksum[]> {
|
|
117
120
|
const checksums = await this.getChecksumMap(checkpoint, buckets);
|
|
118
121
|
// Return results in the same order as the request
|
|
119
|
-
return buckets.map((bucket) => checksums.get(bucket)!);
|
|
122
|
+
return buckets.map((bucket) => checksums.get(bucket.bucket)!);
|
|
120
123
|
}
|
|
121
124
|
|
|
122
125
|
/**
|
|
@@ -126,7 +129,7 @@ export class ChecksumCache {
|
|
|
126
129
|
*
|
|
127
130
|
* @returns a Map with exactly one entry for each bucket requested
|
|
128
131
|
*/
|
|
129
|
-
async getChecksumMap(checkpoint: InternalOpId, buckets:
|
|
132
|
+
async getChecksumMap(checkpoint: InternalOpId, buckets: BucketChecksumRequest[]): Promise<ChecksumMap> {
|
|
130
133
|
// Buckets that don't have a cached checksum for this checkpoint yet
|
|
131
134
|
let toFetch = new Set<string>();
|
|
132
135
|
|
|
@@ -164,19 +167,21 @@ export class ChecksumCache {
|
|
|
164
167
|
// One promise to await to ensure all fetch requests completed.
|
|
165
168
|
let settledPromise: Promise<PromiseSettledResult<void>[]> | null = null;
|
|
166
169
|
|
|
170
|
+
const sourceMap = new Map<string, BucketDataSource>();
|
|
171
|
+
|
|
167
172
|
try {
|
|
168
173
|
// Individual cache fetch promises
|
|
169
174
|
let cacheFetchPromises: Promise<void>[] = [];
|
|
170
175
|
|
|
171
176
|
for (let bucket of buckets) {
|
|
172
|
-
const cacheKey = makeCacheKey(checkpoint, bucket);
|
|
177
|
+
const cacheKey = makeCacheKey(checkpoint, bucket.bucket);
|
|
173
178
|
let status: LRUCache.Status<BucketChecksum> = {};
|
|
174
179
|
const p = this.cache.fetch(cacheKey, { context: context, status: status }).then((checksums) => {
|
|
175
180
|
if (checksums == null) {
|
|
176
181
|
// Should never happen
|
|
177
182
|
throw new Error(`Failed to get checksums for ${cacheKey}`);
|
|
178
183
|
}
|
|
179
|
-
finalResults.set(bucket, checksums);
|
|
184
|
+
finalResults.set(bucket.bucket, checksums);
|
|
180
185
|
});
|
|
181
186
|
cacheFetchPromises.push(p);
|
|
182
187
|
if (status.fetch == 'hit' || status.fetch == 'inflight') {
|
|
@@ -185,7 +190,8 @@ export class ChecksumCache {
|
|
|
185
190
|
// In either case, we don't need to fetch a new checksum.
|
|
186
191
|
} else {
|
|
187
192
|
// We need a new request for this checksum.
|
|
188
|
-
toFetch.add(bucket);
|
|
193
|
+
toFetch.add(bucket.bucket);
|
|
194
|
+
sourceMap.set(bucket.bucket, bucket.source);
|
|
189
195
|
}
|
|
190
196
|
}
|
|
191
197
|
// We do this directly after creating the promises, otherwise
|
|
@@ -220,6 +226,7 @@ export class ChecksumCache {
|
|
|
220
226
|
// Partial checksum found - make a partial checksum request
|
|
221
227
|
bucketRequest = {
|
|
222
228
|
bucket,
|
|
229
|
+
source: sourceMap.get(bucket)!,
|
|
223
230
|
start: cp,
|
|
224
231
|
end: checkpoint
|
|
225
232
|
};
|
|
@@ -240,6 +247,7 @@ export class ChecksumCache {
|
|
|
240
247
|
// No partial checksum found - make a new full checksum request
|
|
241
248
|
bucketRequest = {
|
|
242
249
|
bucket,
|
|
250
|
+
source: sourceMap.get(bucket)!,
|
|
243
251
|
end: checkpoint
|
|
244
252
|
};
|
|
245
253
|
add.set(bucket, {
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
+
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
1
2
|
import {
|
|
3
|
+
CompatibilityContext,
|
|
2
4
|
CompatibilityOption,
|
|
3
5
|
DEFAULT_HYDRATION_STATE,
|
|
6
|
+
deserializeSyncPlan,
|
|
4
7
|
HydratedSyncRules,
|
|
5
8
|
HydrationState,
|
|
9
|
+
javaScriptExpressionEngine,
|
|
10
|
+
PrecompiledSyncConfig,
|
|
11
|
+
SqlEventDescriptor,
|
|
6
12
|
SqlSyncRules,
|
|
7
13
|
SyncConfigWithErrors,
|
|
8
14
|
versionedHydrationState
|
|
9
15
|
} from '@powersync/service-sync-rules';
|
|
16
|
+
import { SerializedSyncPlan, UpdateSyncRulesOptions } from './BucketStorageFactory.js';
|
|
10
17
|
import { ReplicationLock } from './ReplicationLock.js';
|
|
11
18
|
import { STORAGE_VERSION_CONFIG, StorageVersionConfig } from './StorageVersionConfig.js';
|
|
12
|
-
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
13
|
-
import { UpdateSyncRulesOptions } from './BucketStorageFactory.js';
|
|
14
19
|
|
|
15
20
|
export interface ParseSyncRulesOptions {
|
|
16
21
|
defaultSchema: string;
|
|
@@ -19,6 +24,7 @@ export interface ParseSyncRulesOptions {
|
|
|
19
24
|
export interface PersistedSyncRulesContentData {
|
|
20
25
|
readonly id: number;
|
|
21
26
|
readonly sync_rules_content: string;
|
|
27
|
+
readonly compiled_plan: SerializedSyncPlan | null;
|
|
22
28
|
readonly slot_name: string;
|
|
23
29
|
/**
|
|
24
30
|
* True if this is the "active" copy of the sync rules.
|
|
@@ -37,6 +43,7 @@ export interface PersistedSyncRulesContentData {
|
|
|
37
43
|
export abstract class PersistedSyncRulesContent implements PersistedSyncRulesContentData {
|
|
38
44
|
readonly id!: number;
|
|
39
45
|
readonly sync_rules_content!: string;
|
|
46
|
+
readonly compiled_plan!: SerializedSyncPlan | null;
|
|
40
47
|
readonly slot_name!: string;
|
|
41
48
|
readonly active!: boolean;
|
|
42
49
|
readonly storageVersion!: number;
|
|
@@ -72,11 +79,37 @@ export abstract class PersistedSyncRulesContent implements PersistedSyncRulesCon
|
|
|
72
79
|
|
|
73
80
|
parsed(options: ParseSyncRulesOptions): PersistedSyncRules {
|
|
74
81
|
let hydrationState: HydrationState;
|
|
75
|
-
|
|
82
|
+
|
|
83
|
+
// Do we have a compiled sync plan? If so, restore from there instead of parsing everything again.
|
|
84
|
+
let config: SyncConfigWithErrors;
|
|
85
|
+
if (this.compiled_plan != null) {
|
|
86
|
+
const plan = deserializeSyncPlan(this.compiled_plan.plan);
|
|
87
|
+
const compatibility = CompatibilityContext.deserialize(this.compiled_plan.compatibility);
|
|
88
|
+
const eventDefinitions: SqlEventDescriptor[] = [];
|
|
89
|
+
for (const [name, queries] of Object.entries(this.compiled_plan.eventDescriptors)) {
|
|
90
|
+
const descriptor = new SqlEventDescriptor(name, compatibility);
|
|
91
|
+
for (const query of queries) {
|
|
92
|
+
descriptor.addSourceQuery(query, options);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
eventDefinitions.push(descriptor);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const precompiled = new PrecompiledSyncConfig(plan, compatibility, eventDefinitions, {
|
|
99
|
+
defaultSchema: options.defaultSchema,
|
|
100
|
+
engine: javaScriptExpressionEngine(compatibility),
|
|
101
|
+
sourceText: this.sync_rules_content
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
config = { config: precompiled, errors: [] };
|
|
105
|
+
} else {
|
|
106
|
+
config = SqlSyncRules.fromYaml(this.sync_rules_content, options);
|
|
107
|
+
}
|
|
108
|
+
|
|
76
109
|
const storageConfig = this.getStorageConfig();
|
|
77
110
|
if (
|
|
78
111
|
storageConfig.versionedBuckets ||
|
|
79
|
-
|
|
112
|
+
config.config.compatibility.isEnabled(CompatibilityOption.versionedBucketIds)
|
|
80
113
|
) {
|
|
81
114
|
hydrationState = versionedHydrationState(this.id);
|
|
82
115
|
} else {
|
|
@@ -86,16 +119,17 @@ export abstract class PersistedSyncRulesContent implements PersistedSyncRulesCon
|
|
|
86
119
|
return {
|
|
87
120
|
id: this.id,
|
|
88
121
|
slot_name: this.slot_name,
|
|
89
|
-
sync_rules:
|
|
122
|
+
sync_rules: config,
|
|
123
|
+
hydrationState,
|
|
90
124
|
hydratedSyncRules: () => {
|
|
91
|
-
return
|
|
125
|
+
return config.config.hydrate({ hydrationState });
|
|
92
126
|
}
|
|
93
127
|
};
|
|
94
128
|
}
|
|
95
129
|
|
|
96
130
|
asUpdateOptions(options?: Omit<UpdateSyncRulesOptions, 'config'>): UpdateSyncRulesOptions {
|
|
97
131
|
return {
|
|
98
|
-
config: { yaml: this.sync_rules_content },
|
|
132
|
+
config: { yaml: this.sync_rules_content, plan: this.compiled_plan },
|
|
99
133
|
...options
|
|
100
134
|
};
|
|
101
135
|
}
|
|
@@ -107,6 +141,10 @@ export interface PersistedSyncRules {
|
|
|
107
141
|
readonly id: number;
|
|
108
142
|
readonly sync_rules: SyncConfigWithErrors;
|
|
109
143
|
readonly slot_name: string;
|
|
144
|
+
/**
|
|
145
|
+
* For testing only.
|
|
146
|
+
*/
|
|
147
|
+
readonly hydrationState: HydrationState;
|
|
110
148
|
|
|
111
149
|
hydratedSyncRules(): HydratedSyncRules;
|
|
112
150
|
}
|
|
@@ -21,21 +21,21 @@ export interface ReportStorage extends AsyncDisposable {
|
|
|
21
21
|
* This will return any short or long term connected clients.
|
|
22
22
|
* Clients that have no disconnected_at timestamp and that have a valid jwt_exp timestamp are considered connected.
|
|
23
23
|
*/
|
|
24
|
-
|
|
24
|
+
getCurrentConnections(): Promise<event_types.ClientConnectionReportResponse>;
|
|
25
25
|
/**
|
|
26
26
|
* Get a report of client connections over a day, week or month.
|
|
27
27
|
* This is internally used to generate reports over it always returns the previous day, week or month.
|
|
28
28
|
* Usually this is call on the start of the new day, week or month. It will return all unique completed connections
|
|
29
29
|
* as well as uniques currently connected clients.
|
|
30
30
|
*/
|
|
31
|
-
|
|
31
|
+
getClientConnectionsSummary(
|
|
32
32
|
data: event_types.ClientConnectionReportRequest
|
|
33
33
|
): Promise<event_types.ClientConnectionReportResponse>;
|
|
34
34
|
/**
|
|
35
35
|
* Get a paginated list of client connection events
|
|
36
36
|
* This will return a paginated list of connections for a client/ user ID or all if neither is provided, within a date range if provided
|
|
37
37
|
*/
|
|
38
|
-
|
|
38
|
+
getClientSessions(
|
|
39
39
|
data: event_types.ClientConnectionAnalyticsRequest
|
|
40
40
|
): Promise<event_types.PaginatedResponse<event_types.ClientConnection>>;
|
|
41
41
|
/**
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { DEFAULT_TAG } from '@powersync/service-sync-rules';
|
|
2
2
|
import * as util from '../util/util-index.js';
|
|
3
3
|
import { ColumnDescriptor, SourceEntityDescriptor } from './SourceEntity.js';
|
|
4
|
+
import { bson } from '../index.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Format of the id depends on the bucket storage module. It should be consistent within the module.
|
|
8
|
+
*/
|
|
9
|
+
export type SourceTableId = string | bson.ObjectId;
|
|
4
10
|
|
|
5
11
|
export interface SourceTableOptions {
|
|
6
|
-
id:
|
|
12
|
+
id: SourceTableId;
|
|
7
13
|
connectionTag: string;
|
|
8
14
|
objectId: number | string | undefined;
|
|
9
15
|
schema: string;
|
|
@@ -1,30 +1,78 @@
|
|
|
1
1
|
export interface StorageVersionConfig {
|
|
2
|
+
version: number;
|
|
3
|
+
|
|
2
4
|
/**
|
|
3
5
|
* Whether versioned bucket names are automatically enabled.
|
|
4
6
|
*
|
|
5
7
|
* If this is false, bucket names may still be versioned depending on the sync config.
|
|
8
|
+
*
|
|
9
|
+
* Introduced in STORAGE_VERSION_2.
|
|
6
10
|
*/
|
|
7
11
|
versionedBuckets: boolean;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Whether to use soft deletes for current_data, improving replication concurrency support.
|
|
15
|
+
*
|
|
16
|
+
* Introduced in STORAGE_VERSION_3.
|
|
17
|
+
*/
|
|
18
|
+
softDeleteCurrentData: boolean;
|
|
8
19
|
}
|
|
9
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Corresponds to the storage version initially used, before we started explicitly versioning storage.
|
|
23
|
+
*/
|
|
24
|
+
export const STORAGE_VERSION_1 = 1;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* First new storage version.
|
|
28
|
+
*
|
|
29
|
+
* Uses versioned bucket names.
|
|
30
|
+
*
|
|
31
|
+
* On MongoDB storage, this always uses Long for checksums.
|
|
32
|
+
*/
|
|
33
|
+
export const STORAGE_VERSION_2 = 2;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* This version is currently unstable, and not enabled by default yet.
|
|
37
|
+
*
|
|
38
|
+
* This is used to build towards incremental reprocessing.
|
|
39
|
+
*/
|
|
40
|
+
export const STORAGE_VERSION_3 = 3;
|
|
41
|
+
|
|
10
42
|
/**
|
|
11
43
|
* Oldest supported storage version.
|
|
12
44
|
*/
|
|
13
|
-
export const LEGACY_STORAGE_VERSION =
|
|
45
|
+
export const LEGACY_STORAGE_VERSION = STORAGE_VERSION_1;
|
|
14
46
|
|
|
15
47
|
/**
|
|
16
48
|
* Default storage version for newly persisted sync rules.
|
|
17
49
|
*/
|
|
18
|
-
export const CURRENT_STORAGE_VERSION =
|
|
50
|
+
export const CURRENT_STORAGE_VERSION = STORAGE_VERSION_2;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* All versions that can be loaded.
|
|
54
|
+
*
|
|
55
|
+
* This includes unstable versions.
|
|
56
|
+
*/
|
|
57
|
+
export const SUPPORTED_STORAGE_VERSIONS = [STORAGE_VERSION_1, STORAGE_VERSION_2, STORAGE_VERSION_3];
|
|
19
58
|
|
|
20
59
|
/**
|
|
21
60
|
* Shared storage-version behavior across storage implementations.
|
|
22
61
|
*/
|
|
23
62
|
export const STORAGE_VERSION_CONFIG: Record<number, StorageVersionConfig | undefined> = {
|
|
24
|
-
[
|
|
25
|
-
|
|
63
|
+
[STORAGE_VERSION_1]: {
|
|
64
|
+
version: STORAGE_VERSION_1,
|
|
65
|
+
versionedBuckets: false,
|
|
66
|
+
softDeleteCurrentData: false
|
|
67
|
+
},
|
|
68
|
+
[STORAGE_VERSION_2]: {
|
|
69
|
+
version: STORAGE_VERSION_2,
|
|
70
|
+
versionedBuckets: true,
|
|
71
|
+
softDeleteCurrentData: false
|
|
26
72
|
},
|
|
27
|
-
[
|
|
28
|
-
|
|
73
|
+
[STORAGE_VERSION_3]: {
|
|
74
|
+
version: STORAGE_VERSION_3,
|
|
75
|
+
versionedBuckets: true,
|
|
76
|
+
softDeleteCurrentData: true
|
|
29
77
|
}
|
|
30
78
|
};
|