@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.
Files changed (60) hide show
  1. package/CHANGELOG.md +42 -7
  2. package/dist/auth/utils.d.ts +2 -1
  3. package/dist/auth/utils.js +1 -1
  4. package/dist/auth/utils.js.map +1 -1
  5. package/dist/entry/commands/config-command.js +1 -1
  6. package/dist/entry/commands/config-command.js.map +1 -1
  7. package/dist/routes/endpoints/admin.js +3 -1
  8. package/dist/routes/endpoints/admin.js.map +1 -1
  9. package/dist/routes/endpoints/sync-stream.js +6 -1
  10. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  11. package/dist/storage/BucketStorageBatch.d.ts +29 -8
  12. package/dist/storage/BucketStorageBatch.js.map +1 -1
  13. package/dist/storage/BucketStorageFactory.d.ts +27 -8
  14. package/dist/storage/BucketStorageFactory.js +14 -2
  15. package/dist/storage/BucketStorageFactory.js.map +1 -1
  16. package/dist/storage/ChecksumCache.d.ts +5 -2
  17. package/dist/storage/ChecksumCache.js +8 -4
  18. package/dist/storage/ChecksumCache.js.map +1 -1
  19. package/dist/storage/PersistedSyncRulesContent.d.ts +8 -2
  20. package/dist/storage/PersistedSyncRulesContent.js +31 -7
  21. package/dist/storage/PersistedSyncRulesContent.js.map +1 -1
  22. package/dist/storage/ReportStorage.d.ts +3 -3
  23. package/dist/storage/SourceTable.d.ts +7 -2
  24. package/dist/storage/SourceTable.js.map +1 -1
  25. package/dist/storage/StorageVersionConfig.d.ts +33 -0
  26. package/dist/storage/StorageVersionConfig.js +39 -6
  27. package/dist/storage/StorageVersionConfig.js.map +1 -1
  28. package/dist/storage/SyncRulesBucketStorage.d.ts +26 -6
  29. package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
  30. package/dist/sync/BucketChecksumState.d.ts +3 -3
  31. package/dist/sync/BucketChecksumState.js +12 -42
  32. package/dist/sync/BucketChecksumState.js.map +1 -1
  33. package/dist/sync/sync.js.map +1 -1
  34. package/dist/sync/util.d.ts +1 -0
  35. package/dist/sync/util.js +10 -0
  36. package/dist/sync/util.js.map +1 -1
  37. package/dist/util/env.js +1 -1
  38. package/package.json +5 -5
  39. package/src/auth/utils.ts +5 -2
  40. package/src/entry/commands/config-command.ts +1 -1
  41. package/src/routes/endpoints/admin.ts +3 -1
  42. package/src/routes/endpoints/sync-stream.ts +6 -1
  43. package/src/storage/BucketStorageBatch.ts +33 -9
  44. package/src/storage/BucketStorageFactory.ts +53 -4
  45. package/src/storage/ChecksumCache.ts +14 -6
  46. package/src/storage/PersistedSyncRulesContent.ts +45 -7
  47. package/src/storage/ReportStorage.ts +3 -3
  48. package/src/storage/SourceTable.ts +7 -1
  49. package/src/storage/StorageVersionConfig.ts +54 -6
  50. package/src/storage/SyncRulesBucketStorage.ts +33 -6
  51. package/src/sync/BucketChecksumState.ts +18 -49
  52. package/src/sync/sync.ts +9 -3
  53. package/src/sync/util.ts +10 -0
  54. package/src/util/env.ts +1 -1
  55. package/test/src/auth.test.ts +20 -1
  56. package/test/src/checksum_cache.test.ts +102 -57
  57. package/test/src/config.test.ts +1 -0
  58. package/test/src/sync/BucketChecksumState.test.ts +53 -21
  59. package/test/src/utils.ts +9 -0
  60. package/tsconfig.tsbuildinfo +1 -1
@@ -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 rules YAML
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-20260225093637",
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-20260225093637",
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-20260225093637",
39
- "@powersync/service-sync-rules": "0.0.0-dev-20260225093637",
40
- "@powersync/service-types": "0.0.0-dev-20260225093637"
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(connection: any): SupabaseAuthDetails | null {
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 = /db.(\w+).supabase.co/.exec(hostname);
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 Rules. Defaults to process.env.POWERSYNC_SYNC_CONFIG_B64 or process.env.POWERSYNC_SYNC_RULES_B64 for backwards compatility.',
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<boolean>;
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<boolean>;
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
- noCheckpointBeforeLsn: string;
87
-
88
- markSnapshotDone(tables: SourceTable[], no_checkpoint_before_lsn: string): Promise<SourceTable[]>;
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 { SqlSyncRules, SyncConfig } from '@powersync/service-sync-rules';
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
- // TODO: Add serialized sync plan if available
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(parsed: SyncConfig, options?: Omit<UpdateSyncRulesOptions, 'config'>) {
172
- return { config: { yaml: parsed.content }, ...options };
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: string[]): Promise<BucketChecksum[]> {
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: string[]): Promise<ChecksumMap> {
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
- const syncRules = SqlSyncRules.fromYaml(this.sync_rules_content, options);
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
- syncRules.config.compatibility.isEnabled(CompatibilityOption.versionedBucketIds)
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: syncRules,
122
+ sync_rules: config,
123
+ hydrationState,
90
124
  hydratedSyncRules: () => {
91
- return syncRules.config.hydrate({ hydrationState });
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
- getConnectedClients(): Promise<event_types.ClientConnectionReportResponse>;
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
- getClientConnectionReports(
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
- getGeneralClientConnectionAnalytics(
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: any;
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 = 1;
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 = 2;
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
- [LEGACY_STORAGE_VERSION]: {
25
- versionedBuckets: false
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
- [CURRENT_STORAGE_VERSION]: {
28
- versionedBuckets: true
73
+ [STORAGE_VERSION_3]: {
74
+ version: STORAGE_VERSION_3,
75
+ versionedBuckets: true,
76
+ softDeleteCurrentData: true
29
77
  }
30
78
  };