@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.
Files changed (68) hide show
  1. package/.probes/poll +1 -0
  2. package/CHANGELOG.md +12 -0
  3. package/dist/sync/sync.js +8 -1
  4. package/dist/sync/sync.js.map +1 -1
  5. package/package.json +3 -3
  6. package/src/sync/sync.ts +8 -1
  7. package/test/dist/auth.test.d.ts +1 -0
  8. package/test/dist/auth.test.js +332 -0
  9. package/test/dist/auth.test.js.map +1 -0
  10. package/test/dist/broadcast_iterable.test.d.ts +1 -0
  11. package/test/dist/broadcast_iterable.test.js +131 -0
  12. package/test/dist/broadcast_iterable.test.js.map +1 -0
  13. package/test/dist/bucket_validation.d.ts +26 -0
  14. package/test/dist/bucket_validation.js +56 -0
  15. package/test/dist/bucket_validation.js.map +1 -0
  16. package/test/dist/bucket_validation.test.d.ts +1 -0
  17. package/test/dist/bucket_validation.test.js +134 -0
  18. package/test/dist/bucket_validation.test.js.map +1 -0
  19. package/test/dist/checksum_cache.test.d.ts +1 -0
  20. package/test/dist/checksum_cache.test.js +375 -0
  21. package/test/dist/checksum_cache.test.js.map +1 -0
  22. package/test/dist/compacting.test.d.ts +1 -0
  23. package/test/dist/compacting.test.js +254 -0
  24. package/test/dist/compacting.test.js.map +1 -0
  25. package/test/dist/data_storage.test.d.ts +1 -0
  26. package/test/dist/data_storage.test.js +1306 -0
  27. package/test/dist/data_storage.test.js.map +1 -0
  28. package/test/dist/demultiplexer.test.d.ts +1 -0
  29. package/test/dist/demultiplexer.test.js +166 -0
  30. package/test/dist/demultiplexer.test.js.map +1 -0
  31. package/test/dist/env.d.ts +3 -0
  32. package/test/dist/env.js +5 -0
  33. package/test/dist/env.js.map +1 -0
  34. package/test/dist/merge_iterable.test.d.ts +1 -0
  35. package/test/dist/merge_iterable.test.js +321 -0
  36. package/test/dist/merge_iterable.test.js.map +1 -0
  37. package/test/dist/routes/probes.integration.test.d.ts +1 -0
  38. package/test/dist/routes/probes.integration.test.js +192 -0
  39. package/test/dist/routes/probes.integration.test.js.map +1 -0
  40. package/test/dist/routes/probes.test.d.ts +1 -0
  41. package/test/dist/routes/probes.test.js +119 -0
  42. package/test/dist/routes/probes.test.js.map +1 -0
  43. package/test/dist/setup.d.ts +1 -0
  44. package/test/dist/setup.js +7 -0
  45. package/test/dist/setup.js.map +1 -0
  46. package/test/dist/stream_utils.d.ts +6 -0
  47. package/test/dist/stream_utils.js +37 -0
  48. package/test/dist/stream_utils.js.map +1 -0
  49. package/test/dist/sync/BucketChecksumState.test.d.ts +1 -0
  50. package/test/dist/sync/BucketChecksumState.test.js +499 -0
  51. package/test/dist/sync/BucketChecksumState.test.js.map +1 -0
  52. package/test/dist/sync/checksum_state.test.d.ts +1 -0
  53. package/test/dist/sync/checksum_state.test.js +21 -0
  54. package/test/dist/sync/checksum_state.test.js.map +1 -0
  55. package/test/dist/sync/util.test.d.ts +1 -0
  56. package/test/dist/sync/util.test.js +28 -0
  57. package/test/dist/sync/util.test.js.map +1 -0
  58. package/test/dist/sync.test.d.ts +1 -0
  59. package/test/dist/sync.test.js +428 -0
  60. package/test/dist/sync.test.js.map +1 -0
  61. package/test/dist/util.d.ts +36 -0
  62. package/test/dist/util.js +114 -0
  63. package/test/dist/util.js.map +1 -0
  64. package/test/dist/util.test.d.ts +1 -0
  65. package/test/dist/util.test.js +45 -0
  66. package/test/dist/util.test.js.map +1 -0
  67. package/test/tsconfig.tsbuildinfo +1 -0
  68. 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
- maybeRaceForNewCheckpoint();
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.
@@ -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.1",
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
- maybeRaceForNewCheckpoint();
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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"}