@powersync/service-core 1.20.1 → 1.20.2
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 +20 -0
- 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/compact-action.js +26 -5
- package/dist/entry/commands/compact-action.js.map +1 -1
- package/dist/storage/BucketStorageBatch.d.ts +8 -0
- package/dist/storage/BucketStorageBatch.js.map +1 -1
- package/dist/storage/SyncRulesBucketStorage.d.ts +14 -3
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
- package/package.json +4 -4
- package/src/auth/utils.ts +5 -2
- package/src/entry/commands/compact-action.ts +29 -5
- package/src/storage/BucketStorageBatch.ts +10 -0
- package/src/storage/SyncRulesBucketStorage.ts +15 -3
- package/test/src/auth.test.ts +20 -1
- package/test/src/config.test.ts +1 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @powersync/service-core
|
|
2
2
|
|
|
3
|
+
## 1.20.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7ee87d4: [MongoDB Storage] Add option to explicitly enable/disable parameter compacting, and improve abort behavior when compacting.
|
|
8
|
+
- 4c92c24: [Internal] Add a createWriter() API to replace startBatch().
|
|
9
|
+
- 206633f: [MongoDB Storage] Fix compact failing for buckets over 2GB in size.
|
|
10
|
+
- 275fd5f: Tighten Supabase URI regular expression.
|
|
11
|
+
- Updated dependencies [224c35e]
|
|
12
|
+
- Updated dependencies [acf1486]
|
|
13
|
+
- Updated dependencies [391c5ef]
|
|
14
|
+
- Updated dependencies [99de8be]
|
|
15
|
+
- Updated dependencies [9daf965]
|
|
16
|
+
- Updated dependencies [3d230c2]
|
|
17
|
+
- Updated dependencies [3a0627e]
|
|
18
|
+
- Updated dependencies [7ce1b8e]
|
|
19
|
+
- @powersync/service-sync-rules@0.34.0
|
|
20
|
+
- @powersync/lib-services-framework@0.9.1
|
|
21
|
+
- @powersync/service-rsocket-router@0.2.17
|
|
22
|
+
|
|
3
23
|
## 1.20.1
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/dist/auth/utils.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AuthorizationError } from '@powersync/lib-services-framework';
|
|
2
|
+
import { configFile } from '@powersync/service-types';
|
|
2
3
|
import * as jose from 'jose';
|
|
3
4
|
import { KeySpec } from './KeySpec.js';
|
|
4
5
|
import { KeyStore } from './KeyStore.js';
|
|
@@ -18,7 +19,7 @@ export interface SupabaseAuthDetails {
|
|
|
18
19
|
url: string;
|
|
19
20
|
hostname: string;
|
|
20
21
|
}
|
|
21
|
-
export declare function getSupabaseJwksUrl(connection:
|
|
22
|
+
export declare function getSupabaseJwksUrl(connection: configFile.GenericDataSourceConfig | undefined): SupabaseAuthDetails | null;
|
|
22
23
|
export declare function debugKeyNotFound(keyStore: KeyStore, keys: KeySpec[], token: string): {
|
|
23
24
|
configurationDetails: string;
|
|
24
25
|
tokenDetails: string;
|
package/dist/auth/utils.js
CHANGED
|
@@ -121,7 +121,7 @@ export function getSupabaseJwksUrl(connection) {
|
|
|
121
121
|
if (hostname == null) {
|
|
122
122
|
return null;
|
|
123
123
|
}
|
|
124
|
-
const match =
|
|
124
|
+
const match = /^db\.(\w+)\.supabase\.co$/.exec(hostname);
|
|
125
125
|
if (match == null) {
|
|
126
126
|
return null;
|
|
127
127
|
}
|
package/dist/auth/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/auth/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/auth/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,9 @@ const COMPACT_MEMORY_LIMIT_MB = Math.min(HEAP_LIMIT / 1024 / 1024 - 128, 1024);
|
|
|
18
18
|
export function registerCompactAction(program) {
|
|
19
19
|
const compactCommand = program
|
|
20
20
|
.command(COMMAND_NAME)
|
|
21
|
-
.option(`-b, --buckets [buckets]`, 'Full bucket names, comma-separated (e.g., "global[],mybucket[\\"user1\\"]")')
|
|
21
|
+
.option(`-b, --buckets [buckets]`, 'Full bucket names, comma-separated (e.g., "global[],mybucket[\\"user1\\"]")')
|
|
22
|
+
.option('-p, --parameter-indexes', 'Compacting parameter indexes. Defaults to set unless --buckets is provided.')
|
|
23
|
+
.option('--no-parameter-indexes', 'Disabling compacting parameter indexes.');
|
|
22
24
|
wrapConfigCommand(compactCommand);
|
|
23
25
|
return compactCommand.description('Compact storage').action(async (options) => {
|
|
24
26
|
const buckets = options.buckets
|
|
@@ -33,9 +35,13 @@ export function registerCompactAction(program) {
|
|
|
33
35
|
process.exit(1);
|
|
34
36
|
}
|
|
35
37
|
}
|
|
38
|
+
let compactParameters = options.parameterIndexes;
|
|
36
39
|
if (buckets == null) {
|
|
37
40
|
logger.info('Compacting storage for all buckets...');
|
|
38
41
|
}
|
|
42
|
+
else if (buckets.length == 0) {
|
|
43
|
+
logger.info('Skipping bucket compaction');
|
|
44
|
+
}
|
|
39
45
|
else {
|
|
40
46
|
logger.info(`Compacting storage for ${buckets?.join(', ')}...`);
|
|
41
47
|
}
|
|
@@ -44,6 +50,14 @@ export function registerCompactAction(program) {
|
|
|
44
50
|
serviceMode: system.ServiceContextMode.COMPACT,
|
|
45
51
|
configuration: config
|
|
46
52
|
});
|
|
53
|
+
const abortController = new AbortController();
|
|
54
|
+
const completion = Promise.withResolvers();
|
|
55
|
+
serviceContext.lifeCycleEngine.withLifecycle(null, {
|
|
56
|
+
stop: async () => {
|
|
57
|
+
abortController.abort();
|
|
58
|
+
await completion.promise;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
47
61
|
// Register modules in order to allow custom module compacting
|
|
48
62
|
const moduleManager = container.getImplementation(modules.ModuleManager);
|
|
49
63
|
await moduleManager.initialize(serviceContext);
|
|
@@ -57,25 +71,32 @@ export function registerCompactAction(program) {
|
|
|
57
71
|
logger.info('No active instance to compact');
|
|
58
72
|
return;
|
|
59
73
|
}
|
|
60
|
-
logger.info('Performing compaction...');
|
|
61
74
|
if (buckets != null) {
|
|
75
|
+
logger.info('Performing compaction...');
|
|
62
76
|
await active.compact({
|
|
63
77
|
memoryLimitMB: COMPACT_MEMORY_LIMIT_MB,
|
|
64
78
|
compactBuckets: buckets,
|
|
65
|
-
compactParameterData: false
|
|
79
|
+
compactParameterData: compactParameters ?? false,
|
|
80
|
+
signal: abortController.signal
|
|
66
81
|
});
|
|
67
82
|
}
|
|
68
83
|
else {
|
|
69
|
-
await active.compact({
|
|
84
|
+
await active.compact({
|
|
85
|
+
memoryLimitMB: COMPACT_MEMORY_LIMIT_MB,
|
|
86
|
+
compactParameterData: compactParameters ?? true,
|
|
87
|
+
signal: abortController.signal
|
|
88
|
+
});
|
|
70
89
|
}
|
|
71
90
|
logger.info('Successfully compacted storage.');
|
|
72
91
|
}
|
|
73
92
|
catch (e) {
|
|
74
|
-
logger.error(`Failed to compact
|
|
93
|
+
logger.error(`Failed to compact:`, e);
|
|
75
94
|
// Indirectly triggers lifeCycleEngine.stop
|
|
76
95
|
process.exit(1);
|
|
77
96
|
}
|
|
78
97
|
finally {
|
|
98
|
+
// No need to propagate errors on completion - this merely signals that the process can exit.
|
|
99
|
+
completion.resolve();
|
|
79
100
|
// Indirectly triggers lifeCycleEngine.stop
|
|
80
101
|
process.exit(0);
|
|
81
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact-action.js","sourceRoot":"","sources":["../../../src/entry/commands/compact-action.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC,eAAe,CAAC;AAE1D;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;AAE/E,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,cAAc,GAAG,OAAO;SAC3B,OAAO,CAAC,YAAY,CAAC;SACrB,MAAM,CAAC,yBAAyB,EAAE,6EAA6E,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"compact-action.js","sourceRoot":"","sources":["../../../src/entry/commands/compact-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,14 @@ import { BatchedCustomWriteCheckpointOptions } from './storage-index.js';
|
|
|
7
7
|
import { InternalOpId } from '../util/utils.js';
|
|
8
8
|
export declare const DEFAULT_BUCKET_BATCH_COMMIT_OPTIONS: ResolvedBucketBatchCommitOptions;
|
|
9
9
|
export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageListener>, AsyncDisposable {
|
|
10
|
+
/**
|
|
11
|
+
* Alias for [Symbol.asyncDispose]
|
|
12
|
+
*/
|
|
13
|
+
dispose(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Last written op, if any. This may not reflect a consistent checkpoint.
|
|
16
|
+
*/
|
|
17
|
+
last_flushed_op: InternalOpId | null;
|
|
10
18
|
/**
|
|
11
19
|
* Save an op, and potentially flush.
|
|
12
20
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BucketStorageBatch.js","sourceRoot":"","sources":["../../src/storage/BucketStorageBatch.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,mCAAmC,GAAqC;IACnF,sBAAsB,EAAE,IAAI;IAC5B,uBAAuB,EAAE,IAAI;CAC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"BucketStorageBatch.js","sourceRoot":"","sources":["../../src/storage/BucketStorageBatch.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,mCAAmC,GAAqC;IACnF,sBAAsB,EAAE,IAAI;IAC5B,uBAAuB,EAAE,IAAI;CAC9B,CAAC;AAwHF,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,qCAAiB,CAAA;IACjB,qCAAiB,CAAA;AACnB,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B"}
|
|
@@ -19,9 +19,15 @@ export interface SyncRulesBucketStorage extends ObserverClient<SyncRulesBucketSt
|
|
|
19
19
|
*/
|
|
20
20
|
resolveTable(options: ResolveTableOptions): Promise<ResolveTableResult>;
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
22
|
+
* Create a new writer.
|
|
23
|
+
*
|
|
24
|
+
* The writer must be flushed and disposed when done.
|
|
25
|
+
*/
|
|
26
|
+
createWriter(options: CreateWriterOptions): Promise<BucketStorageBatch>;
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Use `createWriter()` with `await using` instead.
|
|
23
29
|
*/
|
|
24
|
-
startBatch(options:
|
|
30
|
+
startBatch(options: CreateWriterOptions, callback: (batch: BucketStorageBatch) => Promise<void>): Promise<FlushedResult | null>;
|
|
25
31
|
getParsedSyncRules(options: ParseSyncRulesOptions): HydratedSyncRules;
|
|
26
32
|
/**
|
|
27
33
|
* Terminate the sync rules.
|
|
@@ -123,7 +129,7 @@ export interface ResolveTableResult {
|
|
|
123
129
|
table: SourceTable;
|
|
124
130
|
dropTables: SourceTable[];
|
|
125
131
|
}
|
|
126
|
-
export interface
|
|
132
|
+
export interface CreateWriterOptions extends ParseSyncRulesOptions {
|
|
127
133
|
zeroLSN: string;
|
|
128
134
|
/**
|
|
129
135
|
* Whether or not to store a copy of the current data.
|
|
@@ -149,6 +155,11 @@ export interface StartBatchOptions extends ParseSyncRulesOptions {
|
|
|
149
155
|
markRecordUnavailable?: BucketStorageMarkRecordUnavailable;
|
|
150
156
|
logger?: Logger;
|
|
151
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* @deprecated Use `CreateWriterOptions`.
|
|
160
|
+
*/
|
|
161
|
+
export interface StartBatchOptions extends CreateWriterOptions {
|
|
162
|
+
}
|
|
152
163
|
export interface CompactOptions {
|
|
153
164
|
/**
|
|
154
165
|
* Heap memory limit for the compact process.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncRulesBucketStorage.js","sourceRoot":"","sources":["../../src/storage/SyncRulesBucketStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SyncRulesBucketStorage.js","sourceRoot":"","sources":["../../src/storage/SyncRulesBucketStorage.ts"],"names":[],"mappings":"AAyWA,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,kBAAkB,EAAE,IAAI,GAAG,EAAU;IACrC,qBAAqB,EAAE,IAAI;IAC3B,uBAAuB,EAAE,IAAI,GAAG,EAAU;IAC1C,0BAA0B,EAAE,IAAI;CACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "1.20.
|
|
8
|
+
"version": "1.20.2",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-ALv2",
|
|
11
11
|
"type": "module",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"uuid": "^11.1.0",
|
|
34
34
|
"winston": "^3.13.0",
|
|
35
35
|
"yaml": "^2.3.2",
|
|
36
|
-
"@powersync/lib-services-framework": "0.9.
|
|
36
|
+
"@powersync/lib-services-framework": "0.9.1",
|
|
37
37
|
"@powersync/service-jsonbig": "0.17.12",
|
|
38
|
-
"@powersync/service-rsocket-router": "0.2.
|
|
39
|
-
"@powersync/service-sync-rules": "0.
|
|
38
|
+
"@powersync/service-rsocket-router": "0.2.17",
|
|
39
|
+
"@powersync/service-sync-rules": "0.34.0",
|
|
40
40
|
"@powersync/service-types": "0.15.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
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
|
}
|
|
@@ -25,7 +25,9 @@ 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]`, 'Full bucket names, comma-separated (e.g., "global[],mybucket[\\"user1\\"]")')
|
|
28
|
+
.option(`-b, --buckets [buckets]`, 'Full bucket names, comma-separated (e.g., "global[],mybucket[\\"user1\\"]")')
|
|
29
|
+
.option('-p, --parameter-indexes', 'Compacting parameter indexes. Defaults to set unless --buckets is provided.')
|
|
30
|
+
.option('--no-parameter-indexes', 'Disabling compacting parameter indexes.');
|
|
29
31
|
|
|
30
32
|
wrapConfigCommand(compactCommand);
|
|
31
33
|
|
|
@@ -44,16 +46,31 @@ export function registerCompactAction(program: Command) {
|
|
|
44
46
|
process.exit(1);
|
|
45
47
|
}
|
|
46
48
|
}
|
|
49
|
+
|
|
50
|
+
let compactParameters: boolean | null = options.parameterIndexes;
|
|
51
|
+
|
|
47
52
|
if (buckets == null) {
|
|
48
53
|
logger.info('Compacting storage for all buckets...');
|
|
54
|
+
} else if (buckets.length == 0) {
|
|
55
|
+
logger.info('Skipping bucket compaction');
|
|
49
56
|
} else {
|
|
50
57
|
logger.info(`Compacting storage for ${buckets?.join(', ')}...`);
|
|
51
58
|
}
|
|
59
|
+
|
|
52
60
|
const config = await utils.loadConfig(extractRunnerOptions(options));
|
|
53
61
|
const serviceContext = new system.ServiceContextContainer({
|
|
54
62
|
serviceMode: system.ServiceContextMode.COMPACT,
|
|
55
63
|
configuration: config
|
|
56
64
|
});
|
|
65
|
+
const abortController = new AbortController();
|
|
66
|
+
const completion = Promise.withResolvers<void>();
|
|
67
|
+
|
|
68
|
+
serviceContext.lifeCycleEngine.withLifecycle(null, {
|
|
69
|
+
stop: async () => {
|
|
70
|
+
abortController.abort();
|
|
71
|
+
await completion.promise;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
57
74
|
|
|
58
75
|
// Register modules in order to allow custom module compacting
|
|
59
76
|
const moduleManager = container.getImplementation(modules.ModuleManager);
|
|
@@ -71,22 +88,29 @@ export function registerCompactAction(program: Command) {
|
|
|
71
88
|
logger.info('No active instance to compact');
|
|
72
89
|
return;
|
|
73
90
|
}
|
|
74
|
-
logger.info('Performing compaction...');
|
|
75
91
|
if (buckets != null) {
|
|
92
|
+
logger.info('Performing compaction...');
|
|
76
93
|
await active.compact({
|
|
77
94
|
memoryLimitMB: COMPACT_MEMORY_LIMIT_MB,
|
|
78
95
|
compactBuckets: buckets,
|
|
79
|
-
compactParameterData: false
|
|
96
|
+
compactParameterData: compactParameters ?? false,
|
|
97
|
+
signal: abortController.signal
|
|
80
98
|
});
|
|
81
99
|
} else {
|
|
82
|
-
await active.compact({
|
|
100
|
+
await active.compact({
|
|
101
|
+
memoryLimitMB: COMPACT_MEMORY_LIMIT_MB,
|
|
102
|
+
compactParameterData: compactParameters ?? true,
|
|
103
|
+
signal: abortController.signal
|
|
104
|
+
});
|
|
83
105
|
}
|
|
84
106
|
logger.info('Successfully compacted storage.');
|
|
85
107
|
} catch (e) {
|
|
86
|
-
logger.error(`Failed to compact
|
|
108
|
+
logger.error(`Failed to compact:`, e);
|
|
87
109
|
// Indirectly triggers lifeCycleEngine.stop
|
|
88
110
|
process.exit(1);
|
|
89
111
|
} finally {
|
|
112
|
+
// No need to propagate errors on completion - this merely signals that the process can exit.
|
|
113
|
+
completion.resolve();
|
|
90
114
|
// Indirectly triggers lifeCycleEngine.stop
|
|
91
115
|
process.exit(0);
|
|
92
116
|
}
|
|
@@ -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
|
*
|
|
@@ -30,10 +30,17 @@ export interface SyncRulesBucketStorage
|
|
|
30
30
|
resolveTable(options: ResolveTableOptions): Promise<ResolveTableResult>;
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* Create a new writer.
|
|
34
|
+
*
|
|
35
|
+
* The writer must be flushed and disposed when done.
|
|
36
|
+
*/
|
|
37
|
+
createWriter(options: CreateWriterOptions): Promise<BucketStorageBatch>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @deprecated Use `createWriter()` with `await using` instead.
|
|
34
41
|
*/
|
|
35
42
|
startBatch(
|
|
36
|
-
options:
|
|
43
|
+
options: CreateWriterOptions,
|
|
37
44
|
callback: (batch: BucketStorageBatch) => Promise<void>
|
|
38
45
|
): Promise<FlushedResult | null>;
|
|
39
46
|
|
|
@@ -162,7 +169,7 @@ export interface ResolveTableResult {
|
|
|
162
169
|
dropTables: SourceTable[];
|
|
163
170
|
}
|
|
164
171
|
|
|
165
|
-
export interface
|
|
172
|
+
export interface CreateWriterOptions extends ParseSyncRulesOptions {
|
|
166
173
|
zeroLSN: string;
|
|
167
174
|
/**
|
|
168
175
|
* Whether or not to store a copy of the current data.
|
|
@@ -192,6 +199,11 @@ export interface StartBatchOptions extends ParseSyncRulesOptions {
|
|
|
192
199
|
logger?: Logger;
|
|
193
200
|
}
|
|
194
201
|
|
|
202
|
+
/**
|
|
203
|
+
* @deprecated Use `CreateWriterOptions`.
|
|
204
|
+
*/
|
|
205
|
+
export interface StartBatchOptions extends CreateWriterOptions {}
|
|
206
|
+
|
|
195
207
|
export interface CompactOptions {
|
|
196
208
|
/**
|
|
197
209
|
* Heap memory limit for the compact process.
|
package/test/src/auth.test.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { RemoteJWKSCollector } from '../../src/auth/RemoteJWKSCollector.js';
|
|
|
7
7
|
import { KeyResult } from '../../src/auth/KeyCollector.js';
|
|
8
8
|
import { CachedKeyCollector } from '../../src/auth/CachedKeyCollector.js';
|
|
9
9
|
import { JwtPayload, StaticSupabaseKeyCollector } from '@/index.js';
|
|
10
|
-
import { debugKeyNotFound } from '../../src/auth/utils.js';
|
|
10
|
+
import { debugKeyNotFound, getSupabaseJwksUrl } from '../../src/auth/utils.js';
|
|
11
11
|
|
|
12
12
|
const publicKeyRSA: jose.JWK = {
|
|
13
13
|
use: 'sig',
|
|
@@ -496,6 +496,25 @@ describe('JWT Auth', () => {
|
|
|
496
496
|
expect(verified.parsedPayload.claim).toEqual('test-claim-2');
|
|
497
497
|
});
|
|
498
498
|
|
|
499
|
+
test('Supabase connection parsing', () => {
|
|
500
|
+
const details = getSupabaseJwksUrl({
|
|
501
|
+
type: 'postgresql',
|
|
502
|
+
uri: 'postgresql://db.abc123.supabase.co:5432/postgres'
|
|
503
|
+
});
|
|
504
|
+
expect(details).toEqual({
|
|
505
|
+
hostname: 'db.abc123.supabase.co',
|
|
506
|
+
projectId: 'abc123',
|
|
507
|
+
url: 'https://abc123.supabase.co/auth/v1/.well-known/jwks.json'
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
// supabase.com is not a supabase URI
|
|
511
|
+
const other = getSupabaseJwksUrl({
|
|
512
|
+
type: 'postgresql',
|
|
513
|
+
uri: 'postgresql://db.abc123.supabase.com:5432/postgres'
|
|
514
|
+
});
|
|
515
|
+
expect(other).toEqual(null);
|
|
516
|
+
});
|
|
517
|
+
|
|
499
518
|
describe('debugKeyNotFound', () => {
|
|
500
519
|
test('Supabase token with legacy auth not configured', async () => {
|
|
501
520
|
const keys = await StaticSupabaseKeyCollector.importKeys([]);
|