@powersync/service-core 1.10.3 → 1.11.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 (155) hide show
  1. package/CHANGELOG.md +13 -2
  2. package/dist/api/api-index.d.ts +1 -0
  3. package/dist/api/api-index.js +1 -0
  4. package/dist/api/api-index.js.map +1 -1
  5. package/dist/api/api-metrics.d.ts +11 -0
  6. package/dist/api/api-metrics.js +30 -0
  7. package/dist/api/api-metrics.js.map +1 -0
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.js +2 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/metrics/MetricsEngine.d.ts +21 -0
  12. package/dist/metrics/MetricsEngine.js +79 -0
  13. package/dist/metrics/MetricsEngine.js.map +1 -0
  14. package/dist/metrics/metrics-index.d.ts +5 -0
  15. package/dist/metrics/metrics-index.js +6 -0
  16. package/dist/metrics/metrics-index.js.map +1 -0
  17. package/dist/metrics/metrics-interfaces.d.ts +36 -0
  18. package/dist/metrics/metrics-interfaces.js +6 -0
  19. package/dist/metrics/metrics-interfaces.js.map +1 -0
  20. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.d.ts +10 -0
  21. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js +51 -0
  22. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js.map +1 -0
  23. package/dist/metrics/open-telemetry/util.d.ts +6 -0
  24. package/dist/metrics/open-telemetry/util.js +62 -0
  25. package/dist/metrics/open-telemetry/util.js.map +1 -0
  26. package/dist/metrics/register-metrics.d.ts +11 -0
  27. package/dist/metrics/register-metrics.js +44 -0
  28. package/dist/metrics/register-metrics.js.map +1 -0
  29. package/dist/replication/AbstractReplicationJob.d.ts +2 -0
  30. package/dist/replication/AbstractReplicationJob.js.map +1 -1
  31. package/dist/replication/AbstractReplicator.d.ts +3 -0
  32. package/dist/replication/AbstractReplicator.js +3 -0
  33. package/dist/replication/AbstractReplicator.js.map +1 -1
  34. package/dist/replication/ReplicationModule.d.ts +7 -0
  35. package/dist/replication/ReplicationModule.js +1 -0
  36. package/dist/replication/ReplicationModule.js.map +1 -1
  37. package/dist/replication/replication-index.d.ts +1 -0
  38. package/dist/replication/replication-index.js +1 -0
  39. package/dist/replication/replication-index.js.map +1 -1
  40. package/dist/replication/replication-metrics.d.ts +11 -0
  41. package/dist/replication/replication-metrics.js +39 -0
  42. package/dist/replication/replication-metrics.js.map +1 -0
  43. package/dist/routes/endpoints/socket-route.js +5 -5
  44. package/dist/routes/endpoints/socket-route.js.map +1 -1
  45. package/dist/routes/endpoints/sync-stream.js +6 -6
  46. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  47. package/dist/storage/storage-index.d.ts +1 -0
  48. package/dist/storage/storage-index.js +1 -0
  49. package/dist/storage/storage-index.js.map +1 -1
  50. package/dist/storage/storage-metrics.d.ts +4 -0
  51. package/dist/storage/storage-metrics.js +56 -0
  52. package/dist/storage/storage-metrics.js.map +1 -0
  53. package/dist/sync/RequestTracker.d.ts +3 -0
  54. package/dist/sync/RequestTracker.js +8 -3
  55. package/dist/sync/RequestTracker.js.map +1 -1
  56. package/dist/system/ServiceContext.d.ts +3 -3
  57. package/dist/system/ServiceContext.js +7 -3
  58. package/dist/system/ServiceContext.js.map +1 -1
  59. package/dist/util/config/compound-config-collector.js +1 -0
  60. package/dist/util/config/compound-config-collector.js.map +1 -1
  61. package/dist/util/config/types.d.ts +1 -0
  62. package/dist/util/env.d.ts +0 -1
  63. package/dist/util/env.js +0 -4
  64. package/dist/util/env.js.map +1 -1
  65. package/package.json +7 -7
  66. package/src/api/api-index.ts +1 -0
  67. package/src/api/api-metrics.ts +35 -0
  68. package/src/index.ts +2 -2
  69. package/src/metrics/MetricsEngine.ts +98 -0
  70. package/src/metrics/metrics-index.ts +5 -0
  71. package/src/metrics/metrics-interfaces.ts +41 -0
  72. package/src/metrics/open-telemetry/OpenTelemetryMetricsFactory.ts +66 -0
  73. package/src/metrics/open-telemetry/util.ts +80 -0
  74. package/src/metrics/register-metrics.ts +56 -0
  75. package/src/replication/AbstractReplicationJob.ts +2 -0
  76. package/src/replication/AbstractReplicator.ts +7 -0
  77. package/src/replication/ReplicationModule.ts +10 -0
  78. package/src/replication/replication-index.ts +1 -0
  79. package/src/replication/replication-metrics.ts +45 -0
  80. package/src/routes/endpoints/socket-route.ts +6 -5
  81. package/src/routes/endpoints/sync-stream.ts +7 -6
  82. package/src/storage/storage-index.ts +1 -0
  83. package/src/storage/storage-metrics.ts +67 -0
  84. package/src/sync/RequestTracker.ts +9 -3
  85. package/src/system/ServiceContext.ts +9 -4
  86. package/src/util/config/compound-config-collector.ts +1 -0
  87. package/src/util/config/types.ts +1 -0
  88. package/src/util/env.ts +0 -4
  89. package/tsconfig.tsbuildinfo +1 -1
  90. package/.probes/poll +0 -1
  91. package/dist/metrics/Metrics.d.ts +0 -30
  92. package/dist/metrics/Metrics.js +0 -202
  93. package/dist/metrics/Metrics.js.map +0 -1
  94. package/src/metrics/Metrics.ts +0 -255
  95. package/test/dist/auth.test.d.ts +0 -1
  96. package/test/dist/auth.test.js +0 -332
  97. package/test/dist/auth.test.js.map +0 -1
  98. package/test/dist/broadcast_iterable.test.d.ts +0 -1
  99. package/test/dist/broadcast_iterable.test.js +0 -131
  100. package/test/dist/broadcast_iterable.test.js.map +0 -1
  101. package/test/dist/bucket_validation.d.ts +0 -26
  102. package/test/dist/bucket_validation.js +0 -56
  103. package/test/dist/bucket_validation.js.map +0 -1
  104. package/test/dist/bucket_validation.test.d.ts +0 -1
  105. package/test/dist/bucket_validation.test.js +0 -134
  106. package/test/dist/bucket_validation.test.js.map +0 -1
  107. package/test/dist/checksum_cache.test.d.ts +0 -1
  108. package/test/dist/checksum_cache.test.js +0 -375
  109. package/test/dist/checksum_cache.test.js.map +0 -1
  110. package/test/dist/compacting.test.d.ts +0 -1
  111. package/test/dist/compacting.test.js +0 -254
  112. package/test/dist/compacting.test.js.map +0 -1
  113. package/test/dist/data_storage.test.d.ts +0 -1
  114. package/test/dist/data_storage.test.js +0 -1306
  115. package/test/dist/data_storage.test.js.map +0 -1
  116. package/test/dist/demultiplexer.test.d.ts +0 -1
  117. package/test/dist/demultiplexer.test.js +0 -166
  118. package/test/dist/demultiplexer.test.js.map +0 -1
  119. package/test/dist/env.d.ts +0 -3
  120. package/test/dist/env.js +0 -5
  121. package/test/dist/env.js.map +0 -1
  122. package/test/dist/merge_iterable.test.d.ts +0 -1
  123. package/test/dist/merge_iterable.test.js +0 -321
  124. package/test/dist/merge_iterable.test.js.map +0 -1
  125. package/test/dist/routes/probes.integration.test.d.ts +0 -1
  126. package/test/dist/routes/probes.integration.test.js +0 -192
  127. package/test/dist/routes/probes.integration.test.js.map +0 -1
  128. package/test/dist/routes/probes.test.d.ts +0 -1
  129. package/test/dist/routes/probes.test.js +0 -119
  130. package/test/dist/routes/probes.test.js.map +0 -1
  131. package/test/dist/setup.d.ts +0 -1
  132. package/test/dist/setup.js +0 -7
  133. package/test/dist/setup.js.map +0 -1
  134. package/test/dist/stream_utils.d.ts +0 -6
  135. package/test/dist/stream_utils.js +0 -37
  136. package/test/dist/stream_utils.js.map +0 -1
  137. package/test/dist/sync/BucketChecksumState.test.d.ts +0 -1
  138. package/test/dist/sync/BucketChecksumState.test.js +0 -499
  139. package/test/dist/sync/BucketChecksumState.test.js.map +0 -1
  140. package/test/dist/sync/checksum_state.test.d.ts +0 -1
  141. package/test/dist/sync/checksum_state.test.js +0 -21
  142. package/test/dist/sync/checksum_state.test.js.map +0 -1
  143. package/test/dist/sync/util.test.d.ts +0 -1
  144. package/test/dist/sync/util.test.js +0 -28
  145. package/test/dist/sync/util.test.js.map +0 -1
  146. package/test/dist/sync.test.d.ts +0 -1
  147. package/test/dist/sync.test.js +0 -428
  148. package/test/dist/sync.test.js.map +0 -1
  149. package/test/dist/util.d.ts +0 -36
  150. package/test/dist/util.js +0 -114
  151. package/test/dist/util.js.map +0 -1
  152. package/test/dist/util.test.d.ts +0 -1
  153. package/test/dist/util.test.js +0 -45
  154. package/test/dist/util.test.js.map +0 -1
  155. package/test/tsconfig.tsbuildinfo +0 -1
@@ -1,332 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../src/auth.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,131 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"broadcast_iterable.test.js","sourceRoot":"","sources":["../src/broadcast_iterable.test.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { OplogEntry } from '@/util/protocol-types.js';
2
- /**
3
- * Validate this property, as described in /docs/bucket-properties.md:
4
- *
5
- * $r(B_{[..id_n]}) = r(r(B_{[..id_i]}) \cup B_{[id_{i+1}..id_n]}) \;\forall\; i \in [1..n]$
6
- *
7
- * We test that a client syncing the entire bucket in one go (left side of the equation),
8
- * ends up with the same result as another client syncing up to operation id_i, then sync
9
- * the rest.
10
- */
11
- export declare function validateBucket(bucket: OplogEntry[]): void;
12
- /**
13
- * Validate these properties for a bucket $B$ and its compacted version $B'$,:
14
- * as described in /docs/bucket-properties.md:
15
- *
16
- * 1. $r(B) = r(B')$
17
- * 2. $r(B_{[..c]}) = r(r(B_{[..c_i]}) \cup B'_{[c_i+1..c]}) \;\forall\; c_i \in B$
18
- *
19
- * The first one is that the result of syncing the original bucket is the same as
20
- * syncing the compacted bucket.
21
- *
22
- * The second property is that result of syncing the entire original bucket, is the same
23
- * as syncing any partial version of that (up to op $c_i$), and then continue syncing
24
- * using the compacted bucket.
25
- */
26
- export declare function validateCompactedBucket(bucket: OplogEntry[], compacted: OplogEntry[]): void;
@@ -1,56 +0,0 @@
1
- import { reduceBucket } from '@/util/utils.js';
2
- import { expect } from 'vitest';
3
- /**
4
- * Validate this property, as described in /docs/bucket-properties.md:
5
- *
6
- * $r(B_{[..id_n]}) = r(r(B_{[..id_i]}) \cup B_{[id_{i+1}..id_n]}) \;\forall\; i \in [1..n]$
7
- *
8
- * We test that a client syncing the entire bucket in one go (left side of the equation),
9
- * ends up with the same result as another client syncing up to operation id_i, then sync
10
- * the rest.
11
- */
12
- export function validateBucket(bucket) {
13
- const r1 = reduceBucket(bucket);
14
- for (let i = 0; i <= bucket.length; i++) {
15
- const r2 = reduceBucket(bucket.slice(0, i + 1));
16
- const b3 = bucket.slice(i + 1);
17
- const r3 = r2.concat(b3);
18
- const r4 = reduceBucket(r3);
19
- expect(r4).toEqual(r1);
20
- }
21
- // This is the same check, just implemented differently
22
- validateCompactedBucket(bucket, bucket);
23
- }
24
- /**
25
- * Validate these properties for a bucket $B$ and its compacted version $B'$,:
26
- * as described in /docs/bucket-properties.md:
27
- *
28
- * 1. $r(B) = r(B')$
29
- * 2. $r(B_{[..c]}) = r(r(B_{[..c_i]}) \cup B'_{[c_i+1..c]}) \;\forall\; c_i \in B$
30
- *
31
- * The first one is that the result of syncing the original bucket is the same as
32
- * syncing the compacted bucket.
33
- *
34
- * The second property is that result of syncing the entire original bucket, is the same
35
- * as syncing any partial version of that (up to op $c_i$), and then continue syncing
36
- * using the compacted bucket.
37
- */
38
- export function validateCompactedBucket(bucket, compacted) {
39
- // r(B_{[..c]})
40
- const r1 = reduceBucket(bucket);
41
- // r(B) = r(B')
42
- expect(reduceBucket(compacted)).toEqual(r1);
43
- for (let i = 0; i < bucket.length; i++) {
44
- // r(B_{[..c_i]})
45
- const r2 = reduceBucket(bucket.slice(0, i + 1));
46
- const c_i = BigInt(bucket[i].op_id);
47
- // B'_{[c_i+1..c]}
48
- const b3 = compacted.filter((op) => BigInt(op.op_id) > c_i);
49
- // r(B_{[..c_i]}) \cup B'_{[c_i+1..c]}
50
- const r3 = r2.concat(b3);
51
- // r(r(B_{[..c_i]}) \cup B'_{[c_i+1..c]})
52
- const r4 = reduceBucket(r3);
53
- expect(r4).toEqual(r1);
54
- }
55
- }
56
- //# sourceMappingURL=bucket_validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bucket_validation.js","sourceRoot":"","sources":["../src/bucket_validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,uDAAuD;IACvD,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAoB,EAAE,SAAuB;IACnF,eAAe;IACf,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,eAAe;IACf,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,iBAAiB;QACjB,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpC,kBAAkB;QAClB,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QAC5D,sCAAsC;QACtC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,yCAAyC;QACzC,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -1 +0,0 @@
1
- export {};