@powersync/service-core 1.10.1 → 1.10.3
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/.probes/poll +1 -0
- package/CHANGELOG.md +12 -0
- package/dist/sync/sync.js +8 -1
- package/dist/sync/sync.js.map +1 -1
- package/package.json +3 -3
- package/src/sync/sync.ts +8 -1
- package/test/dist/auth.test.d.ts +1 -0
- package/test/dist/auth.test.js +332 -0
- package/test/dist/auth.test.js.map +1 -0
- package/test/dist/broadcast_iterable.test.d.ts +1 -0
- package/test/dist/broadcast_iterable.test.js +131 -0
- package/test/dist/broadcast_iterable.test.js.map +1 -0
- package/test/dist/bucket_validation.d.ts +26 -0
- package/test/dist/bucket_validation.js +56 -0
- package/test/dist/bucket_validation.js.map +1 -0
- package/test/dist/bucket_validation.test.d.ts +1 -0
- package/test/dist/bucket_validation.test.js +134 -0
- package/test/dist/bucket_validation.test.js.map +1 -0
- package/test/dist/checksum_cache.test.d.ts +1 -0
- package/test/dist/checksum_cache.test.js +375 -0
- package/test/dist/checksum_cache.test.js.map +1 -0
- package/test/dist/compacting.test.d.ts +1 -0
- package/test/dist/compacting.test.js +254 -0
- package/test/dist/compacting.test.js.map +1 -0
- package/test/dist/data_storage.test.d.ts +1 -0
- package/test/dist/data_storage.test.js +1306 -0
- package/test/dist/data_storage.test.js.map +1 -0
- package/test/dist/demultiplexer.test.d.ts +1 -0
- package/test/dist/demultiplexer.test.js +166 -0
- package/test/dist/demultiplexer.test.js.map +1 -0
- package/test/dist/env.d.ts +3 -0
- package/test/dist/env.js +5 -0
- package/test/dist/env.js.map +1 -0
- package/test/dist/merge_iterable.test.d.ts +1 -0
- package/test/dist/merge_iterable.test.js +321 -0
- package/test/dist/merge_iterable.test.js.map +1 -0
- package/test/dist/routes/probes.integration.test.d.ts +1 -0
- package/test/dist/routes/probes.integration.test.js +192 -0
- package/test/dist/routes/probes.integration.test.js.map +1 -0
- package/test/dist/routes/probes.test.d.ts +1 -0
- package/test/dist/routes/probes.test.js +119 -0
- package/test/dist/routes/probes.test.js.map +1 -0
- package/test/dist/setup.d.ts +1 -0
- package/test/dist/setup.js +7 -0
- package/test/dist/setup.js.map +1 -0
- package/test/dist/stream_utils.d.ts +6 -0
- package/test/dist/stream_utils.js +37 -0
- package/test/dist/stream_utils.js.map +1 -0
- package/test/dist/sync/BucketChecksumState.test.d.ts +1 -0
- package/test/dist/sync/BucketChecksumState.test.js +499 -0
- package/test/dist/sync/BucketChecksumState.test.js.map +1 -0
- package/test/dist/sync/checksum_state.test.d.ts +1 -0
- package/test/dist/sync/checksum_state.test.js +21 -0
- package/test/dist/sync/checksum_state.test.js.map +1 -0
- package/test/dist/sync/util.test.d.ts +1 -0
- package/test/dist/sync/util.test.js +28 -0
- package/test/dist/sync/util.test.js.map +1 -0
- package/test/dist/sync.test.d.ts +1 -0
- package/test/dist/sync.test.js +428 -0
- package/test/dist/sync.test.js.map +1 -0
- package/test/dist/util.d.ts +36 -0
- package/test/dist/util.js +114 -0
- package/test/dist/util.js.map +1 -0
- package/test/dist/util.test.d.ts +1 -0
- package/test/dist/util.test.js +45 -0
- package/test/dist/util.test.js.map +1 -0
- package/test/tsconfig.tsbuildinfo +1 -0
- package/tsconfig.tsbuildinfo +1 -1
package/.probes/poll
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1728387790131
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @powersync/service-core
|
|
2
2
|
|
|
3
|
+
## 1.10.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 4f7bd0f: Fix slow clearing of bucket_parameters collection.
|
|
8
|
+
|
|
9
|
+
## 1.10.2
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- a9b79a5: Fix hanging sync connections due to checkpoint interruptions.
|
|
14
|
+
|
|
3
15
|
## 1.10.1
|
|
4
16
|
|
|
5
17
|
## 1.10.0
|
package/dist/sync/sync.js
CHANGED
|
@@ -115,7 +115,14 @@ async function* streamResponseInner(syncContext, bucketStorage, syncRules, param
|
|
|
115
115
|
function markOperationsSent(operations) {
|
|
116
116
|
syncedOperations += operations;
|
|
117
117
|
tracker.addOperationsSynced(operations);
|
|
118
|
-
|
|
118
|
+
// Disable interrupting checkpoints for now.
|
|
119
|
+
// There is a bug with interrupting checkpoints where:
|
|
120
|
+
// 1. User is in the middle of syncing a large batch of data (for example initial sync).
|
|
121
|
+
// 2. A new checkpoint comes in, which interrupts the batch.
|
|
122
|
+
// 3. However, the new checkpoint does not contain any new data for this connection, so nothing further is synced.
|
|
123
|
+
// This then causes the client to wait indefinitely for the remaining data or checkpoint_complete message. That is
|
|
124
|
+
// only resolved when a new checkpoint comes in that does have data for this connection, or the connection is restarted.
|
|
125
|
+
// maybeRaceForNewCheckpoint();
|
|
119
126
|
}
|
|
120
127
|
// This incrementally updates dataBuckets with each individual bucket position.
|
|
121
128
|
// At the end of this, we can be sure that all buckets have data up to the checkpoint.
|
package/dist/sync/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "1.10.
|
|
8
|
+
"version": "1.10.3",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-Apache-2.0",
|
|
11
11
|
"type": "module",
|
|
@@ -34,9 +34,9 @@
|
|
|
34
34
|
"yaml": "^2.3.2",
|
|
35
35
|
"@powersync/lib-services-framework": "0.5.3",
|
|
36
36
|
"@powersync/service-jsonbig": "0.17.10",
|
|
37
|
+
"@powersync/service-types": "0.9.0",
|
|
37
38
|
"@powersync/service-rsocket-router": "0.0.20",
|
|
38
|
-
"@powersync/service-sync-rules": "0.25.0"
|
|
39
|
-
"@powersync/service-types": "0.9.0"
|
|
39
|
+
"@powersync/service-sync-rules": "0.25.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/async": "^3.2.24",
|
package/src/sync/sync.ts
CHANGED
|
@@ -180,7 +180,14 @@ async function* streamResponseInner(
|
|
|
180
180
|
function markOperationsSent(operations: number) {
|
|
181
181
|
syncedOperations += operations;
|
|
182
182
|
tracker.addOperationsSynced(operations);
|
|
183
|
-
|
|
183
|
+
// Disable interrupting checkpoints for now.
|
|
184
|
+
// There is a bug with interrupting checkpoints where:
|
|
185
|
+
// 1. User is in the middle of syncing a large batch of data (for example initial sync).
|
|
186
|
+
// 2. A new checkpoint comes in, which interrupts the batch.
|
|
187
|
+
// 3. However, the new checkpoint does not contain any new data for this connection, so nothing further is synced.
|
|
188
|
+
// This then causes the client to wait indefinitely for the remaining data or checkpoint_complete message. That is
|
|
189
|
+
// only resolved when a new checkpoint comes in that does have data for this connection, or the connection is restarted.
|
|
190
|
+
// maybeRaceForNewCheckpoint();
|
|
184
191
|
}
|
|
185
192
|
|
|
186
193
|
// This incrementally updates dataBuckets with each individual bucket position.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { StaticKeyCollector } from '../../src/auth/StaticKeyCollector.js';
|
|
3
|
+
import * as jose from 'jose';
|
|
4
|
+
import { KeyStore } from '../../src/auth/KeyStore.js';
|
|
5
|
+
import { KeySpec } from '../../src/auth/KeySpec.js';
|
|
6
|
+
import { RemoteJWKSCollector } from '../../src/auth/RemoteJWKSCollector.js';
|
|
7
|
+
import { CachedKeyCollector } from '../../src/auth/CachedKeyCollector.js';
|
|
8
|
+
const publicKeyRSA = {
|
|
9
|
+
use: 'sig',
|
|
10
|
+
kty: 'RSA',
|
|
11
|
+
e: 'AQAB',
|
|
12
|
+
kid: 'f2e82732b971a135cf1416e8b46dae04d80894e7',
|
|
13
|
+
alg: 'RS256',
|
|
14
|
+
n: 'v7wW9w5vzvACxbo2Ldqt0IHBy0LCloQvnfIr-nhEKmqgBJeBgF2cZSGz0Fe-grRaAvhhDrxaOft2JvZlbUM8vFFnxx-52dYViDBxv8vDxmV1HeEGV69DYrGxnsOLrHQWKkPSeyxtidiwGrNVYuyC21PG1heScTYppxVSHBUh_D9di56ql16Xytv97FJHeBtEYUmyzLQsWGhfzuLBwYSSuZxia4p3-azlztHisht4Ai1KYpX0HWLjh9NGIMzimk2cNdKZjIO1Mm4Tu5S1z9dCauZdocpE5csFHyeLHY3oeXFNgl9GanyM9IAg-0T5QLJA-C6M9lUO4WuVmOtLM_iGlw'
|
|
15
|
+
};
|
|
16
|
+
const sharedKey = {
|
|
17
|
+
kid: 'k1',
|
|
18
|
+
alg: 'HS256',
|
|
19
|
+
kty: 'oct',
|
|
20
|
+
k: Buffer.from('mysecret1', 'utf-8').toString('base64url')
|
|
21
|
+
};
|
|
22
|
+
const sharedKey2 = {
|
|
23
|
+
alg: 'HS256',
|
|
24
|
+
kty: 'oct',
|
|
25
|
+
k: Buffer.from('mysecret2', 'utf-8').toString('base64url')
|
|
26
|
+
};
|
|
27
|
+
const privateKeyEdDSA = {
|
|
28
|
+
use: 'sig',
|
|
29
|
+
kty: 'OKP',
|
|
30
|
+
crv: 'Ed25519',
|
|
31
|
+
kid: 'k2',
|
|
32
|
+
x: 'nfaqgxakPaiiEdAtRGrubgh_SQ1mr6gAUx3--N-ehvo',
|
|
33
|
+
d: 'wweBqMbTrME6oChSEMYAOyYzxsGisQb-C1t0XMjb_Ng',
|
|
34
|
+
alg: 'EdDSA'
|
|
35
|
+
};
|
|
36
|
+
const privateKeyECDSA = {
|
|
37
|
+
use: 'sig',
|
|
38
|
+
kty: 'EC',
|
|
39
|
+
crv: 'P-256',
|
|
40
|
+
kid: 'k3',
|
|
41
|
+
x: 'Y37HQjG1YvlQZ16CzO7UQxgkY_us-NfPxMPcHUDN-PE',
|
|
42
|
+
y: 'W3Jqs5_qlIh2UH79l8L3ApqNu14aFetM5oc9oCjAEaw',
|
|
43
|
+
d: 'p2HQaJApdgaAemVuVsL1hscCFOTd0r9uGxRnzvAelFU',
|
|
44
|
+
alg: 'ES256'
|
|
45
|
+
};
|
|
46
|
+
describe('JWT Auth', () => {
|
|
47
|
+
test('KeyStore basics', async () => {
|
|
48
|
+
const keys = await StaticKeyCollector.importKeys([sharedKey]);
|
|
49
|
+
const store = new KeyStore(keys);
|
|
50
|
+
const signKey = (await jose.importJWK(sharedKey));
|
|
51
|
+
const signedJwt = await new jose.SignJWT({})
|
|
52
|
+
.setProtectedHeader({ alg: 'HS256', kid: 'k1' })
|
|
53
|
+
.setSubject('f1')
|
|
54
|
+
.setIssuedAt()
|
|
55
|
+
.setIssuer('tester')
|
|
56
|
+
.setAudience('tests')
|
|
57
|
+
.setExpirationTime('5m')
|
|
58
|
+
.sign(signKey);
|
|
59
|
+
const verified = await store.verifyJwt(signedJwt, {
|
|
60
|
+
defaultAudiences: ['tests'],
|
|
61
|
+
maxAge: '6m'
|
|
62
|
+
});
|
|
63
|
+
expect(verified.sub).toEqual('f1');
|
|
64
|
+
await expect(store.verifyJwt(signedJwt, {
|
|
65
|
+
defaultAudiences: ['other'],
|
|
66
|
+
maxAge: '6m'
|
|
67
|
+
})).rejects.toThrow('unexpected "aud" claim value');
|
|
68
|
+
await expect(store.verifyJwt(signedJwt, {
|
|
69
|
+
defaultAudiences: [],
|
|
70
|
+
maxAge: '6m'
|
|
71
|
+
})).rejects.toThrow('unexpected "aud" claim value');
|
|
72
|
+
await expect(store.verifyJwt(signedJwt, {
|
|
73
|
+
defaultAudiences: ['tests'],
|
|
74
|
+
maxAge: '1m'
|
|
75
|
+
})).rejects.toThrow('Token must expire in a maximum of');
|
|
76
|
+
const signedJwt2 = await new jose.SignJWT({})
|
|
77
|
+
.setProtectedHeader({ alg: 'HS256', kid: 'k1' })
|
|
78
|
+
.setIssuedAt()
|
|
79
|
+
.setIssuer('tester')
|
|
80
|
+
.setAudience('tests')
|
|
81
|
+
.setExpirationTime('5m')
|
|
82
|
+
.sign(signKey);
|
|
83
|
+
await expect(store.verifyJwt(signedJwt2, {
|
|
84
|
+
defaultAudiences: ['tests'],
|
|
85
|
+
maxAge: '5m'
|
|
86
|
+
})).rejects.toThrow('missing required "sub" claim');
|
|
87
|
+
});
|
|
88
|
+
test('Algorithm validation', async () => {
|
|
89
|
+
const keys = await StaticKeyCollector.importKeys([publicKeyRSA]);
|
|
90
|
+
const store = new KeyStore(keys);
|
|
91
|
+
// Bad attempt at signing token with rsa public key
|
|
92
|
+
const spoofedKey = {
|
|
93
|
+
kty: 'oct',
|
|
94
|
+
kid: publicKeyRSA.kid,
|
|
95
|
+
alg: 'HS256',
|
|
96
|
+
k: publicKeyRSA.n
|
|
97
|
+
};
|
|
98
|
+
const signKey = (await jose.importJWK(spoofedKey));
|
|
99
|
+
const signedJwt = await new jose.SignJWT({})
|
|
100
|
+
.setProtectedHeader({ alg: 'HS256', kid: publicKeyRSA.kid })
|
|
101
|
+
.setSubject('f1')
|
|
102
|
+
.setIssuedAt()
|
|
103
|
+
.setIssuer('tester')
|
|
104
|
+
.setAudience('tests')
|
|
105
|
+
.setExpirationTime('5m')
|
|
106
|
+
.sign(signKey);
|
|
107
|
+
await expect(store.verifyJwt(signedJwt, {
|
|
108
|
+
defaultAudiences: ['tests'],
|
|
109
|
+
maxAge: '6m'
|
|
110
|
+
})).rejects.toThrow('Unexpected token algorithm HS256');
|
|
111
|
+
});
|
|
112
|
+
test('key selection for key with kid', async () => {
|
|
113
|
+
const keys = await StaticKeyCollector.importKeys([publicKeyRSA, sharedKey, sharedKey2]);
|
|
114
|
+
const store = new KeyStore(keys);
|
|
115
|
+
const signKey = (await jose.importJWK(sharedKey));
|
|
116
|
+
const signKey2 = (await jose.importJWK(sharedKey2));
|
|
117
|
+
// No kid
|
|
118
|
+
const signedJwt = await new jose.SignJWT({})
|
|
119
|
+
.setProtectedHeader({ alg: 'HS256' })
|
|
120
|
+
.setSubject('f1')
|
|
121
|
+
.setIssuedAt()
|
|
122
|
+
.setIssuer('tester')
|
|
123
|
+
.setAudience('tests')
|
|
124
|
+
.setExpirationTime('5m')
|
|
125
|
+
.sign(signKey);
|
|
126
|
+
await expect(store.verifyJwt(signedJwt, {
|
|
127
|
+
defaultAudiences: ['tests'],
|
|
128
|
+
maxAge: '6m'
|
|
129
|
+
})).rejects.toThrow('Could not find an appropriate key in the keystore. The key is missing or no key matched the token KID');
|
|
130
|
+
// Wrong kid
|
|
131
|
+
const signedJwt2 = await new jose.SignJWT({})
|
|
132
|
+
.setProtectedHeader({ alg: 'HS256', kid: 'other' })
|
|
133
|
+
.setSubject('f1')
|
|
134
|
+
.setIssuedAt()
|
|
135
|
+
.setIssuer('tester')
|
|
136
|
+
.setAudience('tests')
|
|
137
|
+
.setExpirationTime('5m')
|
|
138
|
+
.sign(signKey);
|
|
139
|
+
await expect(store.verifyJwt(signedJwt2, {
|
|
140
|
+
defaultAudiences: ['tests'],
|
|
141
|
+
maxAge: '6m'
|
|
142
|
+
})).rejects.toThrow('Could not find an appropriate key in the keystore. The key is missing or no key matched the token KID');
|
|
143
|
+
// No kid, matches sharedKey2
|
|
144
|
+
const signedJwt3 = await new jose.SignJWT({})
|
|
145
|
+
.setProtectedHeader({ alg: 'HS256' })
|
|
146
|
+
.setSubject('f1')
|
|
147
|
+
.setIssuedAt()
|
|
148
|
+
.setIssuer('tester')
|
|
149
|
+
.setAudience('tests')
|
|
150
|
+
.setExpirationTime('5m')
|
|
151
|
+
.sign(signKey2);
|
|
152
|
+
await expect(store.verifyJwt(signedJwt3, {
|
|
153
|
+
defaultAudiences: ['tests'],
|
|
154
|
+
maxAge: '6m'
|
|
155
|
+
})).resolves.toMatchObject({ sub: 'f1' });
|
|
156
|
+
// Random kid, matches sharedKey2
|
|
157
|
+
const signedJwt4 = await new jose.SignJWT({})
|
|
158
|
+
.setProtectedHeader({ alg: 'HS256', kid: 'other' })
|
|
159
|
+
.setSubject('f1')
|
|
160
|
+
.setIssuedAt()
|
|
161
|
+
.setIssuer('tester')
|
|
162
|
+
.setAudience('tests')
|
|
163
|
+
.setExpirationTime('5m')
|
|
164
|
+
.sign(signKey2);
|
|
165
|
+
await expect(store.verifyJwt(signedJwt4, {
|
|
166
|
+
defaultAudiences: ['tests'],
|
|
167
|
+
maxAge: '6m'
|
|
168
|
+
})).resolves.toMatchObject({ sub: 'f1' });
|
|
169
|
+
});
|
|
170
|
+
test('KeyOptions', async () => {
|
|
171
|
+
const keys = new StaticKeyCollector([
|
|
172
|
+
await KeySpec.importKey(sharedKey, {
|
|
173
|
+
// This overrides the default validation options
|
|
174
|
+
requiresAudience: ['other'],
|
|
175
|
+
maxLifetimeSeconds: 3600
|
|
176
|
+
})
|
|
177
|
+
]);
|
|
178
|
+
const store = new KeyStore(keys);
|
|
179
|
+
const signKey = (await jose.importJWK(sharedKey));
|
|
180
|
+
const signedJwt = await new jose.SignJWT({})
|
|
181
|
+
.setProtectedHeader({ alg: 'HS256', kid: 'k1' })
|
|
182
|
+
.setSubject('f1')
|
|
183
|
+
.setIssuedAt()
|
|
184
|
+
.setIssuer('tester')
|
|
185
|
+
.setAudience('other')
|
|
186
|
+
.setExpirationTime('50m')
|
|
187
|
+
.sign(signKey);
|
|
188
|
+
const verified = await store.verifyJwt(signedJwt, {
|
|
189
|
+
defaultAudiences: ['tests'],
|
|
190
|
+
maxAge: '6m'
|
|
191
|
+
});
|
|
192
|
+
expect(verified.sub).toEqual('f1');
|
|
193
|
+
const signedJwt2 = await new jose.SignJWT({})
|
|
194
|
+
.setProtectedHeader({ alg: 'HS256', kid: 'k1' })
|
|
195
|
+
.setSubject('f1')
|
|
196
|
+
.setIssuedAt()
|
|
197
|
+
.setIssuer('tester')
|
|
198
|
+
.setAudience('tests') // Doesn't match KeyOptions audience
|
|
199
|
+
.setExpirationTime('50m')
|
|
200
|
+
.sign(signKey);
|
|
201
|
+
await expect(store.verifyJwt(signedJwt2, {
|
|
202
|
+
defaultAudiences: ['tests'],
|
|
203
|
+
maxAge: '6m'
|
|
204
|
+
})).rejects.toThrow('unexpected "aud" claim value');
|
|
205
|
+
const signedJwt3 = await new jose.SignJWT({})
|
|
206
|
+
.setProtectedHeader({ alg: 'HS256', kid: 'k1' })
|
|
207
|
+
.setSubject('f1')
|
|
208
|
+
.setIssuedAt()
|
|
209
|
+
.setIssuer('tester')
|
|
210
|
+
.setAudience('other')
|
|
211
|
+
.setExpirationTime('70m') // longer than KeyOptions expiration
|
|
212
|
+
.sign(signKey);
|
|
213
|
+
await expect(store.verifyJwt(signedJwt3, {
|
|
214
|
+
defaultAudiences: ['tests'],
|
|
215
|
+
maxAge: '6m'
|
|
216
|
+
})).rejects.toThrow('Token must expire in a maximum of');
|
|
217
|
+
});
|
|
218
|
+
test('http', { timeout: 20_000 }, async () => {
|
|
219
|
+
// Not ideal to rely on an external endpoint for tests, but it is good to test that this
|
|
220
|
+
// one actually works.
|
|
221
|
+
const remote = new RemoteJWKSCollector('https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com');
|
|
222
|
+
const { keys, errors } = await remote.getKeys();
|
|
223
|
+
expect(errors).toEqual([]);
|
|
224
|
+
expect(keys.length).toBeGreaterThanOrEqual(1);
|
|
225
|
+
// Domain names are resolved when retrieving keys
|
|
226
|
+
const invalid = new RemoteJWKSCollector('https://localhost/.well-known/jwks.json', {
|
|
227
|
+
lookupOptions: {
|
|
228
|
+
reject_ip_ranges: ['local']
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
await expect(invalid.getKeys()).rejects.toThrow('IPs in this range are not supported');
|
|
232
|
+
// IPs throw an error immediately
|
|
233
|
+
expect(() => new RemoteJWKSCollector('https://127.0.0.1/.well-known/jwks.json', {
|
|
234
|
+
lookupOptions: {
|
|
235
|
+
reject_ip_ranges: ['local']
|
|
236
|
+
}
|
|
237
|
+
})).toThrowError('IPs in this range are not supported');
|
|
238
|
+
});
|
|
239
|
+
test('http not blocking local IPs', async () => {
|
|
240
|
+
// Not ideal to rely on an external endpoint for tests, but it is good to test that this
|
|
241
|
+
// one actually works.
|
|
242
|
+
const remote = new RemoteJWKSCollector('https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com');
|
|
243
|
+
const { keys, errors } = await remote.getKeys();
|
|
244
|
+
expect(errors).toEqual([]);
|
|
245
|
+
expect(keys.length).toBeGreaterThanOrEqual(1);
|
|
246
|
+
const invalid = new RemoteJWKSCollector('https://127.0.0.1/.well-known/jwks.json');
|
|
247
|
+
// Should try and fetch
|
|
248
|
+
await expect(invalid.getKeys()).rejects.toThrow();
|
|
249
|
+
const invalid2 = new RemoteJWKSCollector('https://localhost/.well-known/jwks.json');
|
|
250
|
+
// Should try and fetch
|
|
251
|
+
await expect(invalid2.getKeys()).rejects.toThrow();
|
|
252
|
+
});
|
|
253
|
+
test('caching', async () => {
|
|
254
|
+
let currentResponse;
|
|
255
|
+
const cached = new CachedKeyCollector({
|
|
256
|
+
async getKeys() {
|
|
257
|
+
return currentResponse;
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
currentResponse = Promise.resolve({
|
|
261
|
+
errors: [],
|
|
262
|
+
keys: [await KeySpec.importKey(publicKeyRSA)]
|
|
263
|
+
});
|
|
264
|
+
let key = (await cached.getKeys()).keys[0];
|
|
265
|
+
expect(key.kid).toEqual(publicKeyRSA.kid);
|
|
266
|
+
currentResponse = undefined;
|
|
267
|
+
key = (await cached.getKeys()).keys[0];
|
|
268
|
+
expect(key.kid).toEqual(publicKeyRSA.kid);
|
|
269
|
+
cached.addTimeForTests(301_000);
|
|
270
|
+
currentResponse = Promise.reject('refresh failed');
|
|
271
|
+
// Uses the promise, refreshes in the background
|
|
272
|
+
let response = await cached.getKeys();
|
|
273
|
+
expect(response.keys[0].kid).toEqual(publicKeyRSA.kid);
|
|
274
|
+
expect(response.errors).toEqual([]);
|
|
275
|
+
// Wait for refresh to finish
|
|
276
|
+
await cached.addTimeForTests(0);
|
|
277
|
+
response = await cached.getKeys();
|
|
278
|
+
// Still have the cached key, but also have the error
|
|
279
|
+
expect(response.keys[0].kid).toEqual(publicKeyRSA.kid);
|
|
280
|
+
expect(response.errors[0].message).toMatch('Failed to fetch');
|
|
281
|
+
await cached.addTimeForTests(3601_000);
|
|
282
|
+
response = await cached.getKeys();
|
|
283
|
+
// Now the keys have expired, and the request still fails
|
|
284
|
+
expect(response.keys).toEqual([]);
|
|
285
|
+
expect(response.errors[0].message).toMatch('Failed to fetch');
|
|
286
|
+
currentResponse = Promise.resolve({
|
|
287
|
+
errors: [],
|
|
288
|
+
keys: [await KeySpec.importKey(publicKeyRSA)]
|
|
289
|
+
});
|
|
290
|
+
// After a delay, we can refresh again
|
|
291
|
+
await cached.addTimeForTests(30_000);
|
|
292
|
+
key = (await cached.getKeys()).keys[0];
|
|
293
|
+
expect(key.kid).toEqual(publicKeyRSA.kid);
|
|
294
|
+
});
|
|
295
|
+
test('signing with EdDSA', async () => {
|
|
296
|
+
const keys = await StaticKeyCollector.importKeys([privateKeyEdDSA]);
|
|
297
|
+
const store = new KeyStore(keys);
|
|
298
|
+
const signKey = (await jose.importJWK(privateKeyEdDSA));
|
|
299
|
+
const signedJwt = await new jose.SignJWT({ claim: 'test-claim' })
|
|
300
|
+
.setProtectedHeader({ alg: 'EdDSA', kid: 'k2' })
|
|
301
|
+
.setSubject('f1')
|
|
302
|
+
.setIssuedAt()
|
|
303
|
+
.setIssuer('tester')
|
|
304
|
+
.setAudience('tests')
|
|
305
|
+
.setExpirationTime('5m')
|
|
306
|
+
.sign(signKey);
|
|
307
|
+
const verified = (await store.verifyJwt(signedJwt, {
|
|
308
|
+
defaultAudiences: ['tests'],
|
|
309
|
+
maxAge: '6m'
|
|
310
|
+
}));
|
|
311
|
+
expect(verified.claim).toEqual('test-claim');
|
|
312
|
+
});
|
|
313
|
+
test('signing with ECDSA', async () => {
|
|
314
|
+
const keys = await StaticKeyCollector.importKeys([privateKeyECDSA]);
|
|
315
|
+
const store = new KeyStore(keys);
|
|
316
|
+
const signKey = (await jose.importJWK(privateKeyECDSA));
|
|
317
|
+
const signedJwt = await new jose.SignJWT({ claim: 'test-claim-2' })
|
|
318
|
+
.setProtectedHeader({ alg: 'ES256', kid: 'k3' })
|
|
319
|
+
.setSubject('f1')
|
|
320
|
+
.setIssuedAt()
|
|
321
|
+
.setIssuer('tester')
|
|
322
|
+
.setAudience('tests')
|
|
323
|
+
.setExpirationTime('5m')
|
|
324
|
+
.sign(signKey);
|
|
325
|
+
const verified = (await store.verifyJwt(signedJwt, {
|
|
326
|
+
defaultAudiences: ['tests'],
|
|
327
|
+
maxAge: '6m'
|
|
328
|
+
}));
|
|
329
|
+
expect(verified.claim).toEqual('test-claim-2');
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
//# sourceMappingURL=auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../src/auth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { BroadcastIterable } from '@/streams/BroadcastIterable.js';
|
|
2
|
+
import { AsyncIterableX, interval } from 'ix/asynciterable/index.js';
|
|
3
|
+
import { delayEach } from 'ix/asynciterable/operators/delayeach.js';
|
|
4
|
+
import { take } from 'ix/asynciterable/operators/take.js';
|
|
5
|
+
import { wrapWithAbort } from 'ix/asynciterable/operators/withabort.js';
|
|
6
|
+
import { toArray } from 'ix/asynciterable/toarray.js';
|
|
7
|
+
import * as timers from 'timers/promises';
|
|
8
|
+
import { describe, expect, it } from 'vitest';
|
|
9
|
+
describe('BroadcastIterable', () => {
|
|
10
|
+
it('should iterate', async () => {
|
|
11
|
+
const range = AsyncIterableX.from([1, 2, 3]);
|
|
12
|
+
const broadcast = new BroadcastIterable(() => range);
|
|
13
|
+
const results = await toArray(broadcast);
|
|
14
|
+
expect(results).toEqual([1, 2, 3]);
|
|
15
|
+
expect(broadcast.active).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
it('should skip values if sink is slow', async () => {
|
|
18
|
+
const range = AsyncIterableX.from([1, 2, 3]);
|
|
19
|
+
const broadcast = new BroadcastIterable(() => range);
|
|
20
|
+
// Delay reading each element
|
|
21
|
+
const delayed = delayEach(1)(broadcast);
|
|
22
|
+
const results = await toArray(delayed);
|
|
23
|
+
// We only get a single value, then done.
|
|
24
|
+
expect(results).toEqual([1]);
|
|
25
|
+
expect(broadcast.active).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it('should abort', async () => {
|
|
28
|
+
const range = AsyncIterableX.from([1, 2, 3]);
|
|
29
|
+
let recordedSignal;
|
|
30
|
+
const broadcast = new BroadcastIterable((signal) => {
|
|
31
|
+
recordedSignal = signal;
|
|
32
|
+
return range;
|
|
33
|
+
});
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
const iter = broadcast[Symbol.asyncIterator](controller.signal);
|
|
36
|
+
await iter.next();
|
|
37
|
+
controller.abort();
|
|
38
|
+
await expect(iter.next()).rejects.toThrow('The operation has been aborted');
|
|
39
|
+
expect(recordedSignal.aborted).toEqual(true);
|
|
40
|
+
});
|
|
41
|
+
it('should handle indefinite sources', async () => {
|
|
42
|
+
const source = (signal) => {
|
|
43
|
+
return wrapWithAbort(interval(1), signal);
|
|
44
|
+
};
|
|
45
|
+
const broadcast = new BroadcastIterable(source);
|
|
46
|
+
const delayed = delayEach(10)(broadcast);
|
|
47
|
+
expect(broadcast.active).toBe(false);
|
|
48
|
+
const results = await toArray(take(5)(delayed));
|
|
49
|
+
expect(results.length).toEqual(5);
|
|
50
|
+
expect(results[0]).toEqual(0);
|
|
51
|
+
expect(results[4]).toBeGreaterThan(10);
|
|
52
|
+
expect(results[4]).toBeLessThan(40);
|
|
53
|
+
expect(broadcast.active).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
it('should handle multiple subscribers', async () => {
|
|
56
|
+
let sourceIndex = 0;
|
|
57
|
+
const source = async function* (signal) {
|
|
58
|
+
// Test value out by 1000 means it may have used the wrong iteration of the source
|
|
59
|
+
const base = (sourceIndex += 1000);
|
|
60
|
+
const abortedPromise = new Promise((resolve) => {
|
|
61
|
+
signal.addEventListener('abort', resolve, { once: true });
|
|
62
|
+
});
|
|
63
|
+
for (let i = 0; !signal.aborted; i++) {
|
|
64
|
+
yield base + i;
|
|
65
|
+
await Promise.race([abortedPromise, timers.setTimeout(1)]);
|
|
66
|
+
}
|
|
67
|
+
// Test value out by 100 means this wasn't reached
|
|
68
|
+
sourceIndex += 100;
|
|
69
|
+
};
|
|
70
|
+
const broadcast = new BroadcastIterable(source);
|
|
71
|
+
const delayed1 = delayEach(9)(broadcast);
|
|
72
|
+
const delayed2 = delayEach(10)(broadcast);
|
|
73
|
+
expect(broadcast.active).toBe(false);
|
|
74
|
+
const results1Promise = toArray(take(5)(delayed1));
|
|
75
|
+
const results2Promise = toArray(take(5)(delayed2));
|
|
76
|
+
const [results1, results2] = [await results1Promise, await results2Promise];
|
|
77
|
+
expect(broadcast.active).toBe(false);
|
|
78
|
+
expect(results1.length).toEqual(5);
|
|
79
|
+
expect(results1[0]).toEqual(1000);
|
|
80
|
+
expect(results1[4]).toBeGreaterThan(1010);
|
|
81
|
+
expect(results1[4]).toBeLessThan(1045);
|
|
82
|
+
expect(results2.length).toEqual(5);
|
|
83
|
+
expect(results2[0]).toEqual(1000);
|
|
84
|
+
expect(results2[4]).toBeGreaterThan(1010);
|
|
85
|
+
expect(results2[4]).toBeLessThan(1045);
|
|
86
|
+
// This starts a new source
|
|
87
|
+
const delayed3 = delayEach(10)(broadcast);
|
|
88
|
+
const results3 = await toArray(take(5)(delayed3));
|
|
89
|
+
expect(results3.length).toEqual(5);
|
|
90
|
+
expect(results3[0]).toEqual(2100);
|
|
91
|
+
expect(results3[4]).toBeGreaterThan(2110);
|
|
92
|
+
expect(results3[4]).toBeLessThan(2145);
|
|
93
|
+
});
|
|
94
|
+
it('should handle errors on multiple subscribers', async () => {
|
|
95
|
+
let sourceIndex = 0;
|
|
96
|
+
const source = async function* (signal) {
|
|
97
|
+
// Test value out by 1000 means it may have used the wrong iteration of the source
|
|
98
|
+
const base = (sourceIndex += 1000);
|
|
99
|
+
const abortedPromise = new Promise((resolve) => {
|
|
100
|
+
signal.addEventListener('abort', resolve, { once: true });
|
|
101
|
+
});
|
|
102
|
+
for (let i = 0; !signal.aborted; i++) {
|
|
103
|
+
if (base + i == 1005) {
|
|
104
|
+
throw new Error('simulated failure');
|
|
105
|
+
}
|
|
106
|
+
yield base + i;
|
|
107
|
+
await Promise.race([abortedPromise, timers.setTimeout(1)]);
|
|
108
|
+
}
|
|
109
|
+
// Test value out by 100 means this wasn't reached
|
|
110
|
+
sourceIndex += 100;
|
|
111
|
+
};
|
|
112
|
+
const broadcast = new BroadcastIterable(source);
|
|
113
|
+
const delayed1 = delayEach(9)(broadcast);
|
|
114
|
+
const delayed2 = delayEach(10)(broadcast);
|
|
115
|
+
expect(broadcast.active).toBe(false);
|
|
116
|
+
const results1Promise = toArray(take(5)(delayed1));
|
|
117
|
+
const results2Promise = toArray(take(5)(delayed2));
|
|
118
|
+
const [r1, r2] = await Promise.allSettled([results1Promise, results2Promise]);
|
|
119
|
+
expect(r1).toEqual({ status: 'rejected', reason: new Error('simulated failure') });
|
|
120
|
+
expect(r2).toEqual({ status: 'rejected', reason: new Error('simulated failure') });
|
|
121
|
+
expect(broadcast.active).toBe(false);
|
|
122
|
+
// This starts a new source
|
|
123
|
+
const delayed3 = delayEach(10)(broadcast);
|
|
124
|
+
const results3 = await toArray(take(5)(delayed3));
|
|
125
|
+
expect(results3.length).toEqual(5);
|
|
126
|
+
expect(results3[0]).toEqual(2000);
|
|
127
|
+
expect(results3[4]).toBeGreaterThan(2010);
|
|
128
|
+
expect(results3[4]).toBeLessThan(2045);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=broadcast_iterable.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast_iterable.test.js","sourceRoot":"","sources":["../src/broadcast_iterable.test.ts"],"names":[],"mappings":"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"}
|