@powersync/service-core 1.19.2 → 1.20.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.
Files changed (94) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/api/diagnostics.js +11 -4
  3. package/dist/api/diagnostics.js.map +1 -1
  4. package/dist/entry/commands/compact-action.js +13 -2
  5. package/dist/entry/commands/compact-action.js.map +1 -1
  6. package/dist/entry/commands/config-command.js +2 -2
  7. package/dist/entry/commands/config-command.js.map +1 -1
  8. package/dist/replication/AbstractReplicator.js +2 -5
  9. package/dist/replication/AbstractReplicator.js.map +1 -1
  10. package/dist/routes/configure-fastify.d.ts +84 -0
  11. package/dist/routes/endpoints/admin.d.ts +168 -0
  12. package/dist/routes/endpoints/admin.js +34 -20
  13. package/dist/routes/endpoints/admin.js.map +1 -1
  14. package/dist/routes/endpoints/sync-rules.js +6 -9
  15. package/dist/routes/endpoints/sync-rules.js.map +1 -1
  16. package/dist/routes/endpoints/sync-stream.js +6 -1
  17. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  18. package/dist/storage/BucketStorageBatch.d.ts +21 -8
  19. package/dist/storage/BucketStorageBatch.js.map +1 -1
  20. package/dist/storage/BucketStorageFactory.d.ts +48 -15
  21. package/dist/storage/BucketStorageFactory.js +70 -1
  22. package/dist/storage/BucketStorageFactory.js.map +1 -1
  23. package/dist/storage/ChecksumCache.d.ts +5 -2
  24. package/dist/storage/ChecksumCache.js +8 -4
  25. package/dist/storage/ChecksumCache.js.map +1 -1
  26. package/dist/storage/PersistedSyncRulesContent.d.ts +33 -3
  27. package/dist/storage/PersistedSyncRulesContent.js +80 -1
  28. package/dist/storage/PersistedSyncRulesContent.js.map +1 -1
  29. package/dist/storage/SourceTable.d.ts +7 -2
  30. package/dist/storage/SourceTable.js.map +1 -1
  31. package/dist/storage/StorageVersionConfig.d.ts +53 -0
  32. package/dist/storage/StorageVersionConfig.js +53 -0
  33. package/dist/storage/StorageVersionConfig.js.map +1 -0
  34. package/dist/storage/SyncRulesBucketStorage.d.ts +14 -4
  35. package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
  36. package/dist/storage/storage-index.d.ts +1 -0
  37. package/dist/storage/storage-index.js +1 -0
  38. package/dist/storage/storage-index.js.map +1 -1
  39. package/dist/sync/BucketChecksumState.d.ts +8 -4
  40. package/dist/sync/BucketChecksumState.js +97 -52
  41. package/dist/sync/BucketChecksumState.js.map +1 -1
  42. package/dist/sync/sync.js.map +1 -1
  43. package/dist/sync/util.d.ts +1 -0
  44. package/dist/sync/util.js +10 -0
  45. package/dist/sync/util.js.map +1 -1
  46. package/dist/util/config/collectors/config-collector.js +13 -0
  47. package/dist/util/config/collectors/config-collector.js.map +1 -1
  48. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.d.ts +1 -1
  49. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js +4 -4
  50. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
  51. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.d.ts +1 -1
  52. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js +2 -2
  53. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
  54. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.d.ts +1 -1
  55. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js +3 -3
  56. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js.map +1 -1
  57. package/dist/util/config/types.d.ts +1 -1
  58. package/dist/util/config/types.js.map +1 -1
  59. package/dist/util/env.d.ts +1 -0
  60. package/dist/util/env.js +5 -0
  61. package/dist/util/env.js.map +1 -1
  62. package/package.json +6 -6
  63. package/src/api/diagnostics.ts +12 -4
  64. package/src/entry/commands/compact-action.ts +15 -2
  65. package/src/entry/commands/config-command.ts +3 -3
  66. package/src/replication/AbstractReplicator.ts +3 -5
  67. package/src/routes/endpoints/admin.ts +43 -25
  68. package/src/routes/endpoints/sync-rules.ts +14 -13
  69. package/src/routes/endpoints/sync-stream.ts +6 -1
  70. package/src/storage/BucketStorageBatch.ts +23 -9
  71. package/src/storage/BucketStorageFactory.ts +116 -19
  72. package/src/storage/ChecksumCache.ts +14 -6
  73. package/src/storage/PersistedSyncRulesContent.ts +119 -4
  74. package/src/storage/SourceTable.ts +7 -1
  75. package/src/storage/StorageVersionConfig.ts +78 -0
  76. package/src/storage/SyncRulesBucketStorage.ts +20 -4
  77. package/src/storage/storage-index.ts +1 -0
  78. package/src/sync/BucketChecksumState.ts +147 -65
  79. package/src/sync/sync.ts +9 -3
  80. package/src/sync/util.ts +10 -0
  81. package/src/util/config/collectors/config-collector.ts +16 -0
  82. package/src/util/config/sync-rules/impl/base64-sync-rules-collector.ts +5 -5
  83. package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +3 -3
  84. package/src/util/config/sync-rules/impl/inline-sync-rules-collector.ts +4 -4
  85. package/src/util/config/types.ts +1 -2
  86. package/src/util/env.ts +5 -0
  87. package/test/src/checksum_cache.test.ts +102 -57
  88. package/test/src/config.test.ts +115 -0
  89. package/test/src/routes/admin.test.ts +48 -0
  90. package/test/src/routes/mocks.ts +22 -1
  91. package/test/src/routes/stream.test.ts +3 -2
  92. package/test/src/sync/BucketChecksumState.test.ts +332 -93
  93. package/test/src/utils.ts +9 -0
  94. 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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"}
@@ -26,6 +26,16 @@ export class ConfigCollector {
26
26
  */
27
27
  const decoded = this.decode(serialized);
28
28
  this.validate(decoded);
29
+ /**
30
+ * For internal convenience, we duplicate sync_rules and sync_config. Making them interchangeable.
31
+ * Note, we only do this after validation (which only allows one option to be present)
32
+ */
33
+ if (decoded.sync_config) {
34
+ decoded.sync_rules = decoded.sync_config;
35
+ }
36
+ else if (decoded.sync_rules) {
37
+ decoded.sync_config = decoded.sync_rules;
38
+ }
29
39
  return decoded;
30
40
  }
31
41
  /**
@@ -37,6 +47,9 @@ export class ConfigCollector {
37
47
  if (!valid.valid) {
38
48
  throw new Error(`Failed to validate PowerSync config: ${valid.errors.join(', ')}`);
39
49
  }
50
+ if (config.sync_config && config.sync_rules) {
51
+ throw new Error('Both `sync_config` and `sync_rules` are present in the service configuration. Please consolidate into one sync_config.');
52
+ }
40
53
  }
41
54
  decode(encoded) {
42
55
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"config-collector.js","sourceRoot":"","sources":["../../../../src/util/config/collectors/config-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-collector.js","sourceRoot":"","sources":["../../../../src/util/config/collectors/config-collector.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import { RunnerConfig, SyncRulesConfig } from '../../types.js';
2
3
  import { SyncRulesCollector } from '../sync-collector.js';
3
- import { configFile } from '@powersync/service-types';
4
4
  export declare class Base64SyncRulesCollector extends SyncRulesCollector {
5
5
  get name(): string;
6
6
  collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null>;
@@ -4,14 +4,14 @@ export class Base64SyncRulesCollector extends SyncRulesCollector {
4
4
  return 'Base64';
5
5
  }
6
6
  async collect(baseConfig, runnerConfig) {
7
- const { sync_rules_base64 } = runnerConfig;
8
- if (!sync_rules_base64) {
7
+ const { sync_config_base64 } = runnerConfig;
8
+ if (!sync_config_base64) {
9
9
  return null;
10
10
  }
11
11
  return {
12
12
  present: true,
13
- exit_on_error: baseConfig.sync_rules?.exit_on_error ?? true,
14
- content: Buffer.from(sync_rules_base64, 'base64').toString()
13
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
14
+ content: Buffer.from(sync_config_base64, 'base64').toString()
15
15
  };
16
16
  }
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base64-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/base64-sync-rules-collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,EAAE,iBAAiB,EAAE,GAAG,YAAY,CAAC;QAC3C,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,UAAU,EAAE,aAAa,IAAI,IAAI;YAC3D,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE;SAC7D,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"base64-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/base64-sync-rules-collector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,EAAE,kBAAkB,EAAE,GAAG,YAAY,CAAC;QAC5C,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,aAAa,IAAI,IAAI;YAC5D,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE;SAC9D,CAAC;IACJ,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import { RunnerConfig, SyncRulesConfig } from '../../types.js';
2
3
  import { SyncRulesCollector } from '../sync-collector.js';
3
- import { configFile } from '@powersync/service-types';
4
4
  export declare class FileSystemSyncRulesCollector extends SyncRulesCollector {
5
5
  get name(): string;
6
6
  collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null>;
@@ -5,7 +5,7 @@ export class FileSystemSyncRulesCollector extends SyncRulesCollector {
5
5
  return 'FileSystem';
6
6
  }
7
7
  async collect(baseConfig, runnerConfig) {
8
- const sync_path = baseConfig.sync_rules?.path;
8
+ const sync_path = baseConfig.sync_config?.path;
9
9
  if (!sync_path) {
10
10
  return null;
11
11
  }
@@ -14,7 +14,7 @@ export class FileSystemSyncRulesCollector extends SyncRulesCollector {
14
14
  // Only persist the path here, and load on demand using `loadSyncRules()`.
15
15
  return {
16
16
  present: true,
17
- exit_on_error: baseConfig.sync_rules?.exit_on_error ?? true,
17
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
18
18
  path: config_path ? path.resolve(path.dirname(config_path), sync_path) : sync_path
19
19
  };
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,4BAA6B,SAAQ,kBAAkB;IAClE,IAAI,IAAI;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;QAErC,0EAA0E;QAC1E,0EAA0E;QAC1E,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,UAAU,EAAE,aAAa,IAAI,IAAI;YAC3D,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;SACnF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"filesystem-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,OAAO,4BAA6B,SAAQ,kBAAkB;IAClE,IAAI,IAAI;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;QAErC,0EAA0E;QAC1E,0EAA0E;QAC1E,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,aAAa,IAAI,IAAI;YAC5D,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;SACnF,CAAC;IACJ,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import { SyncRulesConfig } from '../../types.js';
2
3
  import { SyncRulesCollector } from '../sync-collector.js';
3
- import { configFile } from '@powersync/service-types';
4
4
  export declare class InlineSyncRulesCollector extends SyncRulesCollector {
5
5
  get name(): string;
6
6
  collect(baseConfig: configFile.PowerSyncConfig): Promise<SyncRulesConfig | null>;
@@ -4,14 +4,14 @@ export class InlineSyncRulesCollector extends SyncRulesCollector {
4
4
  return 'Inline';
5
5
  }
6
6
  async collect(baseConfig) {
7
- const content = baseConfig.sync_rules?.content;
7
+ const content = baseConfig?.sync_config?.content;
8
8
  if (!content) {
9
9
  return null;
10
10
  }
11
11
  return {
12
12
  present: true,
13
- exit_on_error: true,
14
- ...baseConfig.sync_rules
13
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
14
+ ...baseConfig.sync_config
15
15
  };
16
16
  }
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inline-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/inline-sync-rules-collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC;QAClD,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,IAAI;YACnB,GAAG,UAAU,CAAC,UAAU;SACzB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"inline-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/inline-sync-rules-collector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC;QAClD,MAAM,OAAO,GAAG,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,aAAa,IAAI,IAAI;YAC5D,GAAG,UAAU,CAAC,WAAW;SAC1B,CAAC;IACJ,CAAC;CACF"}
@@ -9,7 +9,7 @@ export declare enum ServiceRunner {
9
9
  export type RunnerConfig = {
10
10
  config_path?: string;
11
11
  config_base64?: string;
12
- sync_rules_base64?: string;
12
+ sync_config_base64?: string;
13
13
  };
14
14
  export type MigrationContext = {
15
15
  runner_config: RunnerConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/config/types.ts"],"names":[],"mappings":"AAKA,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4BAAW,CAAA;IACX,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/config/types.ts"],"names":[],"mappings":"AAIA,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4BAAW,CAAA;IACX,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
@@ -3,6 +3,7 @@ export declare const env: {
3
3
  POWERSYNC_CONFIG_PATH?: string | undefined;
4
4
  POWERSYNC_CONFIG_B64?: string | undefined;
5
5
  POWERSYNC_SYNC_RULES_B64?: string | undefined;
6
+ POWERSYNC_SYNC_CONFIG_B64?: string | undefined;
6
7
  NODE_ENV?: string | undefined;
7
8
  };
8
9
  export type Env = typeof env;
package/dist/util/env.js CHANGED
@@ -10,9 +10,14 @@ export const env = utils.collectEnvironmentVariables({
10
10
  */
11
11
  POWERSYNC_CONFIG_B64: utils.type.string.optional(),
12
12
  /**
13
+ * @deprecated use POWERSYNC_SYNC_CONFIG_B64 instead.
13
14
  * Base64 encoded contents of sync rules YAML
14
15
  */
15
16
  POWERSYNC_SYNC_RULES_B64: utils.type.string.optional(),
17
+ /**
18
+ * Base64 encoded contents of sync config YAML
19
+ */
20
+ POWERSYNC_SYNC_CONFIG_B64: utils.type.string.optional(),
16
21
  /**
17
22
  * Runner to be started in this process
18
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,2BAA2B,CAAC;IACnD;;OAEG;IACH,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACnD;;OAEG;IACH,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IAClD;;OAEG;IACH,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACtD;;OAEG;IACH,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;IAEhE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,2BAA2B,CAAC;IACnD;;OAEG;IACH,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACnD;;OAEG;IACH,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IAClD;;;OAGG;IACH,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACtD;;OAEG;IACH,yBAAyB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACvD;;OAEG;IACH,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;IAEhE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC"}
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
8
- "version": "1.19.2",
8
+ "version": "1.20.1",
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.8.2",
37
- "@powersync/service-rsocket-router": "0.2.14",
38
- "@powersync/service-sync-rules": "0.31.1",
39
- "@powersync/service-types": "0.14.0",
40
- "@powersync/service-jsonbig": "0.17.12"
36
+ "@powersync/lib-services-framework": "0.9.0",
37
+ "@powersync/service-jsonbig": "0.17.12",
38
+ "@powersync/service-rsocket-router": "0.2.16",
39
+ "@powersync/service-sync-rules": "0.33.0",
40
+ "@powersync/service-types": "0.15.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/async": "^3.2.24",
@@ -132,12 +132,20 @@ export async function getSyncRulesStatus(
132
132
  });
133
133
  }
134
134
  errors.push(
135
- ...syncRuleErrors.map((e) => {
136
- return {
137
- level: e.type,
138
- message: e.message,
135
+ ...syncRuleErrors.map(({ type, message, location }) => {
136
+ const error: ReplicationError = {
137
+ level: type,
138
+ message,
139
139
  ts: now
140
140
  };
141
+ if (location != null) {
142
+ error.location = {
143
+ start_offset: location.start,
144
+ end_offset: location.end
145
+ };
146
+ }
147
+
148
+ return error;
141
149
  })
142
150
  );
143
151
 
@@ -25,12 +25,25 @@ const COMPACT_MEMORY_LIMIT_MB = Math.min(HEAP_LIMIT / 1024 / 1024 - 128, 1024);
25
25
  export function registerCompactAction(program: Command) {
26
26
  const compactCommand = program
27
27
  .command(COMMAND_NAME)
28
- .option(`-b, --buckets [buckets]`, 'Bucket name (optional, comma-separate multiple names)');
28
+ .option(`-b, --buckets [buckets]`, 'Full bucket names, comma-separated (e.g., "global[],mybucket[\\"user1\\"]")');
29
29
 
30
30
  wrapConfigCommand(compactCommand);
31
31
 
32
32
  return compactCommand.description('Compact storage').action(async (options) => {
33
- const buckets = options.buckets?.split(',');
33
+ const buckets = options.buckets
34
+ ?.split(',')
35
+ .map((b: string) => b.trim())
36
+ .filter(Boolean);
37
+ if (buckets) {
38
+ const invalid = buckets.filter((b: string) => !b.includes('['));
39
+ if (invalid.length > 0) {
40
+ logger.error(
41
+ `Invalid bucket names: ${invalid.join(', ')}. ` +
42
+ `Pass full bucket names (e.g., "global[]"), not bucket definition names (e.g., "global").`
43
+ );
44
+ process.exit(1);
45
+ }
46
+ }
34
47
  if (buckets == null) {
35
48
  logger.info('Compacting storage for all buckets...');
36
49
  } else {
@@ -19,8 +19,8 @@ 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_RULES_B64',
23
- util.env.POWERSYNC_SYNC_RULES_B64
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
+ util.env.POWERSYNC_SYNC_CONFIG_B64 || util.env.POWERSYNC_SYNC_RULES_B64
24
24
  );
25
25
  }
26
26
 
@@ -31,6 +31,6 @@ export function extractRunnerOptions(options: any): util.RunnerConfig {
31
31
  return {
32
32
  config_path: options.configPath,
33
33
  config_base64: options.configBase64,
34
- sync_rules_base64: options.syncBase64
34
+ sync_config_base64: options.syncBase64
35
35
  };
36
36
  }
@@ -138,11 +138,9 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
138
138
  // Configure new sync rules, if they have changed.
139
139
  // In that case, also immediately take out a lock, so that another process doesn't start replication on it.
140
140
 
141
- const { lock } = await this.storage.configureSyncRules({
142
- content: syncRules,
143
- lock: true,
144
- validate: this.syncRuleProvider.exitOnError
145
- });
141
+ const { lock } = await this.storage.configureSyncRules(
142
+ storage.updateSyncRulesFromYaml(syncRules, { lock: true, validate: this.syncRuleProvider.exitOnError })
143
+ );
146
144
  if (lock) {
147
145
  configuredLock = lock;
148
146
  }
@@ -1,7 +1,8 @@
1
1
  import { ErrorCode, errors, router, schema } from '@powersync/lib-services-framework';
2
- import { SqlSyncRules, StaticSchema } from '@powersync/service-sync-rules';
2
+ import { SourceSchema, SqlSyncRules, StaticSchema } from '@powersync/service-sync-rules';
3
3
  import { internal_routes } from '@powersync/service-types';
4
4
 
5
+ import { DEFAULT_HYDRATION_STATE } from '@powersync/service-sync-rules';
5
6
  import * as api from '../../api/api-index.js';
6
7
  import * as storage from '../../storage/storage-index.js';
7
8
  import { authApi } from '../auth.js';
@@ -130,12 +131,13 @@ export const reprocess = routeDefinition({
130
131
  });
131
132
  }
132
133
 
133
- const new_rules = await activeBucketStorage.updateSyncRules({
134
- content: active.sync_rules.config.content,
135
- // These sync rules already passed validation. But if the rules are not valid anymore due
136
- // to a service change, we do want to report the error here.
137
- validate: true
138
- });
134
+ const new_rules = await activeBucketStorage.updateSyncRules(
135
+ storage.updateSyncRulesFromYaml(active.sync_rules.config.content, {
136
+ // These sync rules already passed validation. But if the rules are not valid anymore due
137
+ // to a service change, we do want to report the error here.
138
+ validate: true
139
+ })
140
+ );
139
141
 
140
142
  const baseConfig = await apiHandler.getSourceConfig();
141
143
 
@@ -152,6 +154,36 @@ export const reprocess = routeDefinition({
152
154
  }
153
155
  });
154
156
 
157
+ class FakeSyncRulesContentForValidation extends storage.PersistedSyncRulesContent {
158
+ constructor(
159
+ private readonly apiHandler: api.RouteAPI,
160
+ private readonly schema: SourceSchema,
161
+ data: storage.PersistedSyncRulesContentData
162
+ ) {
163
+ super(data);
164
+ }
165
+
166
+ current_lock: storage.ReplicationLock | null = null;
167
+
168
+ async lock(): Promise<storage.ReplicationLock> {
169
+ throw new Error('Lock not implemented');
170
+ }
171
+
172
+ parsed(options: storage.ParseSyncRulesOptions): storage.PersistedSyncRules {
173
+ return {
174
+ ...this,
175
+ sync_rules: SqlSyncRules.fromYaml(this.sync_rules_content, {
176
+ ...this.apiHandler.getParseSyncRulesOptions(),
177
+ schema: this.schema
178
+ }),
179
+ hydrationState: DEFAULT_HYDRATION_STATE,
180
+ hydratedSyncRules() {
181
+ return this.sync_rules.config.hydrate({ hydrationState: DEFAULT_HYDRATION_STATE });
182
+ }
183
+ };
184
+ }
185
+ }
186
+
155
187
  export const validate = routeDefinition({
156
188
  path: '/api/admin/v1/validate',
157
189
  method: router.HTTPMethod.POST,
@@ -167,30 +199,16 @@ export const validate = routeDefinition({
167
199
  const schemaData = await api.getConnectionsSchema(apiHandler);
168
200
  const schema = new StaticSchema(schemaData.connections);
169
201
 
170
- const sync_rules: storage.PersistedSyncRulesContent = {
202
+ const sync_rules = new FakeSyncRulesContentForValidation(apiHandler, schema, {
171
203
  // Dummy values
172
204
  id: 0,
173
205
  slot_name: '',
174
206
  active: false,
175
207
  last_checkpoint_lsn: '',
176
-
177
- parsed() {
178
- return {
179
- ...this,
180
- sync_rules: SqlSyncRules.fromYaml(content, {
181
- ...apiHandler.getParseSyncRulesOptions(),
182
- schema
183
- }),
184
- hydratedSyncRules() {
185
- return this.sync_rules.config.hydrate();
186
- }
187
- };
188
- },
208
+ storageVersion: storage.LEGACY_STORAGE_VERSION,
189
209
  sync_rules_content: content,
190
- async lock() {
191
- throw new Error('Lock not implemented');
192
- }
193
- };
210
+ compiled_plan: null
211
+ });
194
212
 
195
213
  const connectionStatus = await apiHandler.getConnectionStatus();
196
214
  if (!connectionStatus) {
@@ -1,11 +1,12 @@
1
1
  import { ErrorCode, errors, router, schema } from '@powersync/lib-services-framework';
2
- import { SqlSyncRules, SyncRulesErrors } from '@powersync/service-sync-rules';
2
+ import { SqlSyncRules, SyncConfigWithErrors, SyncRulesErrors } from '@powersync/service-sync-rules';
3
3
  import type { FastifyPluginAsync } from 'fastify';
4
4
  import * as t from 'ts-codec';
5
5
 
6
6
  import { RouteAPI } from '../../api/RouteAPI.js';
7
7
  import { authApi } from '../auth.js';
8
8
  import { routeDefinition } from '../router.js';
9
+ import { updateSyncRulesFromConfig, updateSyncRulesFromYaml } from '../../storage/BucketStorageFactory.js';
9
10
 
10
11
  const DeploySyncRulesRequest = t.object({
11
12
  content: t.string
@@ -51,10 +52,11 @@ export const deploySyncRules = routeDefinition({
51
52
  });
52
53
  }
53
54
  const content = payload.params.content;
55
+ let syncConfig: SyncConfigWithErrors;
54
56
 
55
57
  try {
56
58
  const apiHandler = service_context.routerEngine.getAPI();
57
- SqlSyncRules.fromYaml(payload.params.content, {
59
+ syncConfig = SqlSyncRules.fromYaml(payload.params.content, {
58
60
  ...apiHandler.getParseSyncRulesOptions(),
59
61
  // We don't do any schema-level validation at this point
60
62
  schema: undefined
@@ -68,11 +70,9 @@ export const deploySyncRules = routeDefinition({
68
70
  });
69
71
  }
70
72
 
71
- const sync_rules = await storageEngine.activeBucketStorage.updateSyncRules({
72
- content: content,
73
- // Aready validated above
74
- validate: false
75
- });
73
+ const sync_rules = await storageEngine.activeBucketStorage.updateSyncRules(
74
+ updateSyncRulesFromConfig(syncConfig.config)
75
+ );
76
76
 
77
77
  return {
78
78
  slot_name: sync_rules.slot_name
@@ -168,12 +168,13 @@ export const reprocessSyncRules = routeDefinition({
168
168
  });
169
169
  }
170
170
 
171
- const new_rules = await activeBucketStorage.updateSyncRules({
172
- content: sync_rules.sync_rules.config.content,
173
- // These sync rules already passed validation. But if the rules are not valid anymore due
174
- // to a service change, we do want to report the error here.
175
- validate: true
176
- });
171
+ const new_rules = await activeBucketStorage.updateSyncRules(
172
+ updateSyncRulesFromYaml(sync_rules.sync_rules.config.content, {
173
+ // These sync rules already passed validation. But if the rules are not valid anymore due
174
+ // to a service change, we do want to report the error here.
175
+ validate: true
176
+ })
177
+ );
177
178
  return {
178
179
  slot_name: new_rules.slot_name
179
180
  };
@@ -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) => {
@@ -45,19 +45,15 @@ export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageLis
45
45
  * Flush and commit any saved ops. This creates a new checkpoint by default.
46
46
  *
47
47
  * 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
48
  */
51
- commit(lsn: string, options?: BucketBatchCommitOptions): Promise<boolean>;
49
+ commit(lsn: string, options?: BucketBatchCommitOptions): Promise<CheckpointResult>;
52
50
 
53
51
  /**
54
52
  * Advance the checkpoint LSN position, without any associated op.
55
53
  *
56
54
  * 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
55
  */
60
- keepalive(lsn: string): Promise<boolean>;
56
+ keepalive(lsn: string): Promise<CheckpointResult>;
61
57
 
62
58
  /**
63
59
  * Set the LSN that replication should resume from.
@@ -83,9 +79,9 @@ export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageLis
83
79
  */
84
80
  resumeFromLsn: string | null;
85
81
 
86
- noCheckpointBeforeLsn: string;
87
-
88
- markSnapshotDone(tables: SourceTable[], no_checkpoint_before_lsn: string): Promise<SourceTable[]>;
82
+ markTableSnapshotDone(tables: SourceTable[], no_checkpoint_before_lsn?: string): Promise<SourceTable[]>;
83
+ markTableSnapshotRequired(table: SourceTable): Promise<void>;
84
+ markAllSnapshotDone(no_checkpoint_before_lsn: string): Promise<void>;
89
85
 
90
86
  updateTableProgress(table: SourceTable, progress: Partial<TableSnapshotStatus>): Promise<SourceTable>;
91
87
 
@@ -166,6 +162,24 @@ export interface SaveDelete {
166
162
  afterReplicaId?: undefined;
167
163
  }
168
164
 
165
+ export interface CheckpointResult {
166
+ /**
167
+ * True if any of these are true:
168
+ * 1. A snapshot is in progress.
169
+ * 2. The last checkpoint is older than "no_checkpoint_before" (if provided).
170
+ * 3. Replication was restarted with a lower LSN, and has not caught up yet.
171
+ */
172
+ checkpointBlocked: boolean;
173
+
174
+ /**
175
+ * True if a checkpoint was actually created by this operation. This can be false even if checkpointBlocked is false,
176
+ * if the checkpoint was empty.
177
+ *
178
+ * This is primarily used for testing.
179
+ */
180
+ checkpointCreated: boolean;
181
+ }
182
+
169
183
  export interface BucketBatchStorageListener {
170
184
  replicationEvent: (payload: ReplicationEventPayload) => void;
171
185
  }