@powersync/service-core 0.0.0-dev-20240718134716 → 0.0.0-dev-20240918082156

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 (352) hide show
  1. package/CHANGELOG.md +89 -6
  2. package/dist/api/RouteAPI.d.ts +68 -0
  3. package/dist/api/RouteAPI.js +2 -0
  4. package/dist/api/RouteAPI.js.map +1 -0
  5. package/dist/api/api-index.d.ts +1 -0
  6. package/dist/api/api-index.js +1 -0
  7. package/dist/api/api-index.js.map +1 -1
  8. package/dist/api/diagnostics.d.ts +4 -4
  9. package/dist/api/diagnostics.js +11 -65
  10. package/dist/api/diagnostics.js.map +1 -1
  11. package/dist/api/schema.d.ts +3 -5
  12. package/dist/api/schema.js +9 -79
  13. package/dist/api/schema.js.map +1 -1
  14. package/dist/auth/KeyStore.d.ts +7 -4
  15. package/dist/auth/KeyStore.js +1 -1
  16. package/dist/auth/KeyStore.js.map +1 -1
  17. package/dist/auth/auth-index.d.ts +0 -1
  18. package/dist/auth/auth-index.js +0 -1
  19. package/dist/auth/auth-index.js.map +1 -1
  20. package/dist/entry/cli-entry.js +4 -2
  21. package/dist/entry/cli-entry.js.map +1 -1
  22. package/dist/entry/commands/compact-action.d.ts +2 -0
  23. package/dist/entry/commands/compact-action.js +52 -0
  24. package/dist/entry/commands/compact-action.js.map +1 -0
  25. package/dist/entry/commands/migrate-action.js +4 -5
  26. package/dist/entry/commands/migrate-action.js.map +1 -1
  27. package/dist/entry/commands/teardown-action.js +2 -2
  28. package/dist/entry/commands/teardown-action.js.map +1 -1
  29. package/dist/entry/entry-index.d.ts +1 -0
  30. package/dist/entry/entry-index.js +1 -0
  31. package/dist/entry/entry-index.js.map +1 -1
  32. package/dist/index.d.ts +4 -2
  33. package/dist/index.js +4 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/metrics/Metrics.d.ts +6 -5
  36. package/dist/metrics/Metrics.js +53 -10
  37. package/dist/metrics/Metrics.js.map +1 -1
  38. package/dist/migrations/db/migrations/1684951997326-init.d.ts +2 -2
  39. package/dist/migrations/db/migrations/1684951997326-init.js +4 -2
  40. package/dist/migrations/db/migrations/1684951997326-init.js.map +1 -1
  41. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.d.ts +2 -2
  42. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js +4 -2
  43. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -1
  44. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.d.ts +2 -2
  45. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js +4 -2
  46. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js.map +1 -1
  47. package/dist/migrations/migrations.d.ts +8 -0
  48. package/dist/migrations/migrations.js +19 -7
  49. package/dist/migrations/migrations.js.map +1 -1
  50. package/dist/modules/AbstractModule.d.ts +26 -0
  51. package/dist/modules/AbstractModule.js +11 -0
  52. package/dist/modules/AbstractModule.js.map +1 -0
  53. package/dist/modules/ModuleManager.d.ts +11 -0
  54. package/dist/modules/ModuleManager.js +32 -0
  55. package/dist/modules/ModuleManager.js.map +1 -0
  56. package/dist/modules/modules-index.d.ts +2 -0
  57. package/dist/modules/modules-index.js +3 -0
  58. package/dist/modules/modules-index.js.map +1 -0
  59. package/dist/replication/AbstractReplicationJob.d.ts +38 -0
  60. package/dist/replication/AbstractReplicationJob.js +51 -0
  61. package/dist/replication/AbstractReplicationJob.js.map +1 -0
  62. package/dist/replication/AbstractReplicator.d.ts +53 -0
  63. package/dist/replication/AbstractReplicator.js +187 -0
  64. package/dist/replication/AbstractReplicator.js.map +1 -0
  65. package/dist/replication/ErrorRateLimiter.d.ts +0 -9
  66. package/dist/replication/ErrorRateLimiter.js +1 -42
  67. package/dist/replication/ErrorRateLimiter.js.map +1 -1
  68. package/dist/replication/ReplicationEngine.d.ts +18 -0
  69. package/dist/replication/ReplicationEngine.js +41 -0
  70. package/dist/replication/ReplicationEngine.js.map +1 -0
  71. package/dist/replication/ReplicationModule.d.ts +39 -0
  72. package/dist/replication/ReplicationModule.js +65 -0
  73. package/dist/replication/ReplicationModule.js.map +1 -0
  74. package/dist/replication/replication-index.d.ts +4 -6
  75. package/dist/replication/replication-index.js +4 -6
  76. package/dist/replication/replication-index.js.map +1 -1
  77. package/dist/routes/RouterEngine.d.ts +42 -0
  78. package/dist/routes/RouterEngine.js +80 -0
  79. package/dist/routes/RouterEngine.js.map +1 -0
  80. package/dist/routes/auth.d.ts +2 -2
  81. package/dist/routes/auth.js +11 -11
  82. package/dist/routes/auth.js.map +1 -1
  83. package/dist/routes/configure-fastify.d.ts +737 -0
  84. package/dist/routes/configure-fastify.js +57 -0
  85. package/dist/routes/configure-fastify.js.map +1 -0
  86. package/dist/routes/configure-rsocket.d.ts +13 -0
  87. package/dist/routes/configure-rsocket.js +47 -0
  88. package/dist/routes/configure-rsocket.js.map +1 -0
  89. package/dist/routes/endpoints/admin.d.ts +0 -34
  90. package/dist/routes/endpoints/admin.js +48 -89
  91. package/dist/routes/endpoints/admin.js.map +1 -1
  92. package/dist/routes/endpoints/checkpointing.d.ts +56 -16
  93. package/dist/routes/endpoints/checkpointing.js +33 -12
  94. package/dist/routes/endpoints/checkpointing.js.map +1 -1
  95. package/dist/routes/endpoints/route-endpoints-index.d.ts +0 -1
  96. package/dist/routes/endpoints/route-endpoints-index.js +0 -1
  97. package/dist/routes/endpoints/route-endpoints-index.js.map +1 -1
  98. package/dist/routes/endpoints/socket-route.js +46 -39
  99. package/dist/routes/endpoints/socket-route.js.map +1 -1
  100. package/dist/routes/endpoints/sync-rules.d.ts +1 -1
  101. package/dist/routes/endpoints/sync-rules.js +32 -23
  102. package/dist/routes/endpoints/sync-rules.js.map +1 -1
  103. package/dist/routes/endpoints/sync-stream.d.ts +10 -0
  104. package/dist/routes/endpoints/sync-stream.js +17 -13
  105. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  106. package/dist/routes/route-register.d.ts +1 -1
  107. package/dist/routes/route-register.js +1 -1
  108. package/dist/routes/route-register.js.map +1 -1
  109. package/dist/routes/router-socket.d.ts +5 -4
  110. package/dist/routes/router-socket.js +2 -1
  111. package/dist/routes/router-socket.js.map +1 -1
  112. package/dist/routes/router.d.ts +7 -2
  113. package/dist/routes/router.js.map +1 -1
  114. package/dist/routes/routes-index.d.ts +3 -0
  115. package/dist/routes/routes-index.js +3 -0
  116. package/dist/routes/routes-index.js.map +1 -1
  117. package/dist/runner/teardown.js +47 -76
  118. package/dist/runner/teardown.js.map +1 -1
  119. package/dist/storage/BucketStorage.d.ts +61 -20
  120. package/dist/storage/BucketStorage.js +0 -10
  121. package/dist/storage/BucketStorage.js.map +1 -1
  122. package/dist/storage/MongoBucketStorage.d.ts +4 -4
  123. package/dist/storage/MongoBucketStorage.js +19 -24
  124. package/dist/storage/MongoBucketStorage.js.map +1 -1
  125. package/dist/storage/SourceEntity.d.ts +20 -0
  126. package/dist/storage/SourceEntity.js +2 -0
  127. package/dist/storage/SourceEntity.js.map +1 -0
  128. package/dist/storage/SourceTable.d.ts +4 -5
  129. package/dist/storage/SourceTable.js +3 -4
  130. package/dist/storage/SourceTable.js.map +1 -1
  131. package/dist/storage/StorageEngine.d.ts +24 -0
  132. package/dist/storage/StorageEngine.js +43 -0
  133. package/dist/storage/StorageEngine.js.map +1 -0
  134. package/dist/storage/StorageProvider.d.ts +21 -0
  135. package/dist/storage/StorageProvider.js +2 -0
  136. package/dist/storage/StorageProvider.js.map +1 -0
  137. package/dist/storage/mongo/MongoBucketBatch.d.ts +1 -1
  138. package/dist/storage/mongo/MongoBucketBatch.js +6 -7
  139. package/dist/storage/mongo/MongoBucketBatch.js.map +1 -1
  140. package/dist/storage/mongo/MongoCompactor.d.ts +40 -0
  141. package/dist/storage/mongo/MongoCompactor.js +293 -0
  142. package/dist/storage/mongo/MongoCompactor.js.map +1 -0
  143. package/dist/storage/mongo/MongoPersistedSyncRulesContent.d.ts +2 -2
  144. package/dist/storage/mongo/MongoPersistedSyncRulesContent.js +2 -2
  145. package/dist/storage/mongo/MongoPersistedSyncRulesContent.js.map +1 -1
  146. package/dist/storage/mongo/MongoStorageProvider.d.ts +5 -0
  147. package/dist/storage/mongo/MongoStorageProvider.js +26 -0
  148. package/dist/storage/mongo/MongoStorageProvider.js.map +1 -0
  149. package/dist/storage/mongo/MongoSyncBucketStorage.d.ts +9 -7
  150. package/dist/storage/mongo/MongoSyncBucketStorage.js +43 -28
  151. package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -1
  152. package/dist/storage/mongo/MongoSyncRulesLock.js +1 -1
  153. package/dist/storage/mongo/MongoSyncRulesLock.js.map +1 -1
  154. package/dist/storage/mongo/OperationBatch.d.ts +7 -3
  155. package/dist/storage/mongo/OperationBatch.js +16 -7
  156. package/dist/storage/mongo/OperationBatch.js.map +1 -1
  157. package/dist/storage/mongo/PersistedBatch.d.ts +3 -3
  158. package/dist/storage/mongo/PersistedBatch.js +2 -2
  159. package/dist/storage/mongo/PersistedBatch.js.map +1 -1
  160. package/dist/storage/mongo/models.d.ts +17 -7
  161. package/dist/storage/mongo/models.js.map +1 -1
  162. package/dist/storage/mongo/util.d.ts +14 -0
  163. package/dist/storage/mongo/util.js +70 -0
  164. package/dist/storage/mongo/util.js.map +1 -1
  165. package/dist/storage/storage-index.d.ts +5 -2
  166. package/dist/storage/storage-index.js +5 -2
  167. package/dist/storage/storage-index.js.map +1 -1
  168. package/dist/sync/RequestTracker.js +2 -3
  169. package/dist/sync/RequestTracker.js.map +1 -1
  170. package/dist/sync/sync-index.d.ts +1 -0
  171. package/dist/sync/sync-index.js +1 -0
  172. package/dist/sync/sync-index.js.map +1 -1
  173. package/dist/sync/sync.d.ts +2 -1
  174. package/dist/sync/sync.js +56 -17
  175. package/dist/sync/sync.js.map +1 -1
  176. package/dist/system/ServiceContext.d.ts +37 -0
  177. package/dist/system/ServiceContext.js +48 -0
  178. package/dist/system/ServiceContext.js.map +1 -0
  179. package/dist/system/system-index.d.ts +1 -1
  180. package/dist/system/system-index.js +1 -1
  181. package/dist/system/system-index.js.map +1 -1
  182. package/dist/util/config/collectors/config-collector.d.ts +12 -0
  183. package/dist/util/config/collectors/config-collector.js +43 -0
  184. package/dist/util/config/collectors/config-collector.js.map +1 -1
  185. package/dist/util/config/compound-config-collector.d.ts +10 -29
  186. package/dist/util/config/compound-config-collector.js +28 -84
  187. package/dist/util/config/compound-config-collector.js.map +1 -1
  188. package/dist/util/config/sync-rules/sync-rules-provider.d.ts +9 -0
  189. package/dist/util/config/sync-rules/sync-rules-provider.js +15 -0
  190. package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -0
  191. package/dist/util/config/types.d.ts +6 -4
  192. package/dist/util/config/types.js.map +1 -1
  193. package/dist/util/config.d.ts +3 -4
  194. package/dist/util/config.js +5 -20
  195. package/dist/util/config.js.map +1 -1
  196. package/dist/util/protocol-types.d.ts +4 -0
  197. package/dist/util/protocol-types.js +5 -1
  198. package/dist/util/protocol-types.js.map +1 -1
  199. package/dist/util/util-index.d.ts +3 -6
  200. package/dist/util/util-index.js +3 -6
  201. package/dist/util/util-index.js.map +1 -1
  202. package/dist/util/utils.d.ts +10 -6
  203. package/dist/util/utils.js +45 -25
  204. package/dist/util/utils.js.map +1 -1
  205. package/package.json +7 -7
  206. package/src/api/RouteAPI.ts +78 -0
  207. package/src/api/api-index.ts +1 -0
  208. package/src/api/diagnostics.ts +16 -71
  209. package/src/api/schema.ts +13 -89
  210. package/src/auth/KeyStore.ts +9 -6
  211. package/src/auth/auth-index.ts +0 -1
  212. package/src/entry/cli-entry.ts +4 -2
  213. package/src/entry/commands/compact-action.ts +57 -0
  214. package/src/entry/commands/migrate-action.ts +5 -8
  215. package/src/entry/commands/teardown-action.ts +2 -2
  216. package/src/entry/entry-index.ts +1 -0
  217. package/src/index.ts +5 -2
  218. package/src/metrics/Metrics.ts +70 -15
  219. package/src/migrations/db/migrations/1684951997326-init.ts +9 -4
  220. package/src/migrations/db/migrations/1702295701188-sync-rule-state.ts +7 -4
  221. package/src/migrations/db/migrations/1711543888062-write-checkpoint-index.ts +6 -4
  222. package/src/migrations/migrations.ts +24 -8
  223. package/src/modules/AbstractModule.ts +37 -0
  224. package/src/modules/ModuleManager.ts +34 -0
  225. package/src/modules/modules-index.ts +2 -0
  226. package/src/replication/AbstractReplicationJob.ts +79 -0
  227. package/src/replication/AbstractReplicator.ts +227 -0
  228. package/src/replication/ErrorRateLimiter.ts +0 -44
  229. package/src/replication/ReplicationEngine.ts +43 -0
  230. package/src/replication/ReplicationModule.ts +101 -0
  231. package/src/replication/replication-index.ts +4 -6
  232. package/src/routes/RouterEngine.ts +120 -0
  233. package/src/routes/auth.ts +21 -12
  234. package/src/routes/configure-fastify.ts +101 -0
  235. package/src/routes/configure-rsocket.ts +60 -0
  236. package/src/routes/endpoints/admin.ts +74 -100
  237. package/src/routes/endpoints/checkpointing.ts +46 -12
  238. package/src/routes/endpoints/route-endpoints-index.ts +0 -1
  239. package/src/routes/endpoints/socket-route.ts +50 -42
  240. package/src/routes/endpoints/sync-rules.ts +41 -25
  241. package/src/routes/endpoints/sync-stream.ts +17 -13
  242. package/src/routes/route-register.ts +2 -2
  243. package/src/routes/router-socket.ts +6 -5
  244. package/src/routes/router.ts +7 -2
  245. package/src/routes/routes-index.ts +3 -0
  246. package/src/runner/teardown.ts +50 -88
  247. package/src/storage/BucketStorage.ts +74 -26
  248. package/src/storage/MongoBucketStorage.ts +23 -26
  249. package/src/storage/SourceEntity.ts +22 -0
  250. package/src/storage/SourceTable.ts +4 -6
  251. package/src/storage/StorageEngine.ts +55 -0
  252. package/src/storage/StorageProvider.ts +27 -0
  253. package/src/storage/mongo/MongoBucketBatch.ts +8 -8
  254. package/src/storage/mongo/MongoCompactor.ts +372 -0
  255. package/src/storage/mongo/MongoPersistedSyncRulesContent.ts +3 -3
  256. package/src/storage/mongo/MongoStorageProvider.ts +31 -0
  257. package/src/storage/mongo/MongoSyncBucketStorage.ts +64 -34
  258. package/src/storage/mongo/MongoSyncRulesLock.ts +1 -1
  259. package/src/storage/mongo/OperationBatch.ts +18 -11
  260. package/src/storage/mongo/PersistedBatch.ts +6 -5
  261. package/src/storage/mongo/models.ts +17 -7
  262. package/src/storage/mongo/util.ts +71 -1
  263. package/src/storage/storage-index.ts +5 -2
  264. package/src/sync/RequestTracker.ts +3 -3
  265. package/src/sync/sync-index.ts +1 -0
  266. package/src/sync/sync.ts +66 -17
  267. package/src/system/ServiceContext.ts +68 -0
  268. package/src/system/system-index.ts +1 -1
  269. package/src/util/config/collectors/config-collector.ts +48 -0
  270. package/src/util/config/compound-config-collector.ts +45 -110
  271. package/src/util/config/sync-rules/sync-rules-provider.ts +18 -0
  272. package/src/util/config/types.ts +6 -5
  273. package/src/util/config.ts +6 -23
  274. package/src/util/protocol-types.ts +6 -1
  275. package/src/util/util-index.ts +3 -6
  276. package/src/util/utils.ts +55 -39
  277. package/test/src/__snapshots__/sync.test.ts.snap +90 -5
  278. package/test/src/auth.test.ts +7 -7
  279. package/test/src/broadcast_iterable.test.ts +1 -1
  280. package/test/src/bucket_validation.test.ts +142 -0
  281. package/test/src/bucket_validation.ts +116 -0
  282. package/test/src/checksum_cache.test.ts +3 -3
  283. package/test/src/compacting.test.ts +216 -0
  284. package/test/src/data_storage.test.ts +275 -204
  285. package/test/src/env.ts +1 -3
  286. package/test/src/merge_iterable.test.ts +1 -6
  287. package/test/src/setup.ts +1 -1
  288. package/test/src/stream_utils.ts +42 -0
  289. package/test/src/sync.test.ts +209 -48
  290. package/test/src/util.ts +110 -55
  291. package/test/tsconfig.json +1 -1
  292. package/tsconfig.tsbuildinfo +1 -1
  293. package/dist/auth/SupabaseKeyCollector.d.ts +0 -22
  294. package/dist/auth/SupabaseKeyCollector.js +0 -61
  295. package/dist/auth/SupabaseKeyCollector.js.map +0 -1
  296. package/dist/replication/PgRelation.d.ts +0 -16
  297. package/dist/replication/PgRelation.js +0 -26
  298. package/dist/replication/PgRelation.js.map +0 -1
  299. package/dist/replication/WalConnection.d.ts +0 -34
  300. package/dist/replication/WalConnection.js +0 -190
  301. package/dist/replication/WalConnection.js.map +0 -1
  302. package/dist/replication/WalStream.d.ts +0 -57
  303. package/dist/replication/WalStream.js +0 -517
  304. package/dist/replication/WalStream.js.map +0 -1
  305. package/dist/replication/WalStreamManager.d.ts +0 -30
  306. package/dist/replication/WalStreamManager.js +0 -198
  307. package/dist/replication/WalStreamManager.js.map +0 -1
  308. package/dist/replication/WalStreamRunner.d.ts +0 -38
  309. package/dist/replication/WalStreamRunner.js +0 -155
  310. package/dist/replication/WalStreamRunner.js.map +0 -1
  311. package/dist/replication/util.d.ts +0 -9
  312. package/dist/replication/util.js +0 -62
  313. package/dist/replication/util.js.map +0 -1
  314. package/dist/routes/endpoints/dev.d.ts +0 -312
  315. package/dist/routes/endpoints/dev.js +0 -172
  316. package/dist/routes/endpoints/dev.js.map +0 -1
  317. package/dist/system/CorePowerSyncSystem.d.ts +0 -23
  318. package/dist/system/CorePowerSyncSystem.js +0 -52
  319. package/dist/system/CorePowerSyncSystem.js.map +0 -1
  320. package/dist/util/PgManager.d.ts +0 -24
  321. package/dist/util/PgManager.js +0 -55
  322. package/dist/util/PgManager.js.map +0 -1
  323. package/dist/util/migration_lib.d.ts +0 -11
  324. package/dist/util/migration_lib.js +0 -64
  325. package/dist/util/migration_lib.js.map +0 -1
  326. package/dist/util/pgwire_utils.d.ts +0 -24
  327. package/dist/util/pgwire_utils.js +0 -117
  328. package/dist/util/pgwire_utils.js.map +0 -1
  329. package/dist/util/populate_test_data.d.ts +0 -8
  330. package/dist/util/populate_test_data.js +0 -65
  331. package/dist/util/populate_test_data.js.map +0 -1
  332. package/src/auth/SupabaseKeyCollector.ts +0 -67
  333. package/src/replication/PgRelation.ts +0 -42
  334. package/src/replication/WalConnection.ts +0 -227
  335. package/src/replication/WalStream.ts +0 -628
  336. package/src/replication/WalStreamManager.ts +0 -213
  337. package/src/replication/WalStreamRunner.ts +0 -180
  338. package/src/replication/util.ts +0 -76
  339. package/src/routes/endpoints/dev.ts +0 -199
  340. package/src/system/CorePowerSyncSystem.ts +0 -64
  341. package/src/util/PgManager.ts +0 -64
  342. package/src/util/migration_lib.ts +0 -79
  343. package/src/util/pgwire_utils.ts +0 -139
  344. package/src/util/populate_test_data.ts +0 -78
  345. package/test/src/__snapshots__/pg_test.test.ts.snap +0 -256
  346. package/test/src/large_batch.test.ts +0 -194
  347. package/test/src/pg_test.test.ts +0 -450
  348. package/test/src/schema_changes.test.ts +0 -545
  349. package/test/src/slow_tests.test.ts +0 -296
  350. package/test/src/validation.test.ts +0 -63
  351. package/test/src/wal_stream.test.ts +0 -314
  352. package/test/src/wal_stream_utils.ts +0 -147
@@ -1,27 +1,38 @@
1
- import { container, errors, logger, schema } from '@powersync/lib-services-framework';
1
+ import { errors, logger, schema } from '@powersync/lib-services-framework';
2
2
  import { RequestParameters } from '@powersync/service-sync-rules';
3
3
  import { serialize } from 'bson';
4
4
 
5
5
  import { Metrics } from '../../metrics/Metrics.js';
6
- import { streamResponse } from '../../sync/sync.js';
6
+ import * as sync from '../../sync/sync-index.js';
7
7
  import * as util from '../../util/util-index.js';
8
8
  import { SocketRouteGenerator } from '../router-socket.js';
9
9
  import { SyncRoutes } from './sync-stream.js';
10
- import { RequestTracker } from '../../sync/RequestTracker.js';
11
10
 
12
11
  export const syncStreamReactive: SocketRouteGenerator = (router) =>
13
12
  router.reactiveStream<util.StreamingSyncRequest, any>(SyncRoutes.STREAM, {
14
- authorize: ({ context }) => {
15
- return {
16
- authorized: !!context.token_payload,
17
- errors: ['Authentication required'].concat(context.token_errors ?? [])
18
- };
19
- },
20
13
  validator: schema.createTsCodecValidator(util.StreamingSyncRequest, { allowAdditional: true }),
21
- handler: async ({ context, params, responder, observer, initialN }) => {
22
- const { system } = context;
14
+ handler: async ({ context, params, responder, observer, initialN, signal: upstreamSignal }) => {
15
+ const { service_context } = context;
16
+ const { routerEngine } = service_context;
23
17
 
24
- if (system.closed) {
18
+ // Create our own controller that we can abort directly
19
+ const controller = new AbortController();
20
+ upstreamSignal.addEventListener('abort', () => {
21
+ controller.abort();
22
+ });
23
+ if (upstreamSignal.aborted) {
24
+ controller.abort();
25
+ }
26
+ const signal = controller.signal;
27
+
28
+ let requestedN = initialN;
29
+ const disposer = observer.registerListener({
30
+ request(n) {
31
+ requestedN += n;
32
+ }
33
+ });
34
+
35
+ if (routerEngine!.closed) {
25
36
  responder.onError(
26
37
  new errors.JourneyError({
27
38
  status: 503,
@@ -33,13 +44,13 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
33
44
  return;
34
45
  }
35
46
 
36
- const controller = new AbortController();
37
-
38
47
  const syncParams = new RequestParameters(context.token_payload!, params.parameters ?? {});
39
48
 
40
- const storage = system.storage;
49
+ const {
50
+ storageEngine: { activeBucketStorage }
51
+ } = service_context;
41
52
  // Sanity check before we start the stream
42
- const cp = await storage.getActiveCheckpoint();
53
+ const cp = await activeBucketStorage.getActiveCheckpoint();
43
54
  if (!cp.hasSyncRules()) {
44
55
  responder.onError(
45
56
  new errors.JourneyError({
@@ -52,27 +63,16 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
52
63
  return;
53
64
  }
54
65
 
55
- let requestedN = initialN;
56
- const disposer = observer.registerListener({
57
- request(n) {
58
- requestedN += n;
59
- },
60
- cancel: () => {
61
- controller.abort();
62
- }
63
- });
64
-
65
- const removeStopHandler = system.addStopHandler(() => {
66
- observer.triggerCancel();
66
+ const removeStopHandler = routerEngine!.addStopHandler(() => {
67
+ controller.abort();
67
68
  });
68
69
 
69
- const metrics = container.getImplementation(Metrics);
70
-
71
- metrics.concurrent_connections.add(1);
72
- const tracker = new RequestTracker();
70
+ Metrics.getInstance().concurrent_connections.add(1);
71
+ const tracker = new sync.RequestTracker();
73
72
  try {
74
- for await (const data of streamResponse({
75
- storage,
73
+ for await (const data of sync.streamResponse({
74
+ storage: activeBucketStorage,
75
+ parseOptions: routerEngine!.getAPI().getParseSyncRulesOptions(),
76
76
  params: {
77
77
  ...params,
78
78
  binary_data: true // always true for web sockets
@@ -84,8 +84,11 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
84
84
  keep_alive: false
85
85
  },
86
86
  tracker,
87
- signal: controller.signal
87
+ signal
88
88
  })) {
89
+ if (signal.aborted) {
90
+ break;
91
+ }
89
92
  if (data == null) {
90
93
  // Empty value just to flush iterator memory
91
94
  continue;
@@ -102,7 +105,7 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
102
105
  tracker.addDataSynced(serialized.length);
103
106
  }
104
107
 
105
- if (requestedN <= 0) {
108
+ if (requestedN <= 0 && !signal.aborted) {
106
109
  await new Promise<void>((resolve) => {
107
110
  const l = observer.registerListener({
108
111
  request() {
@@ -110,14 +113,17 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
110
113
  // Management of updating the total requested items is done above
111
114
  resolve();
112
115
  l();
116
+ signal.removeEventListener('abort', onAbort);
113
117
  }
114
- },
115
- cancel: () => {
116
- // Don't wait here if the request is cancelled
117
- resolve();
118
- l();
119
118
  }
120
119
  });
120
+ const onAbort = () => {
121
+ // Don't wait here if the request is cancelled
122
+ resolve();
123
+ l();
124
+ signal.removeEventListener('abort', onAbort);
125
+ };
126
+ signal.addEventListener('abort', onAbort);
121
127
  });
122
128
  }
123
129
  }
@@ -133,10 +139,12 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
133
139
  disposer();
134
140
  logger.info(`Sync stream complete`, {
135
141
  user_id: syncParams.user_id,
142
+ client_id: params.client_id,
143
+ user_agent: context.user_agent,
136
144
  operations_synced: tracker.operationsSynced,
137
145
  data_synced_bytes: tracker.dataSyncedBytes
138
146
  });
139
- metrics.concurrent_connections.add(-1);
147
+ Metrics.getInstance().concurrent_connections.add(-1);
140
148
  }
141
149
  }
142
150
  });
@@ -1,12 +1,11 @@
1
- import * as t from 'ts-codec';
2
- import type { FastifyPluginAsync } from 'fastify';
3
- import * as pgwire from '@powersync/service-jpgwire';
4
1
  import { errors, router, schema } from '@powersync/lib-services-framework';
5
2
  import { SqlSyncRules, SyncRulesErrors } from '@powersync/service-sync-rules';
3
+ import type { FastifyPluginAsync } from 'fastify';
4
+ import * as t from 'ts-codec';
6
5
 
7
- import * as replication from '../../replication/replication-index.js';
8
6
  import { authApi } from '../auth.js';
9
7
  import { routeDefinition } from '../router.js';
8
+ import { RouteAPI } from '../../api/RouteAPI.js';
10
9
 
11
10
  const DeploySyncRulesRequest = t.object({
12
11
  content: t.string
@@ -39,7 +38,10 @@ export const deploySyncRules = routeDefinition({
39
38
  plugins: [yamlPlugin],
40
39
  validator: schema.createTsCodecValidator(DeploySyncRulesRequest, { allowAdditional: true }),
41
40
  handler: async (payload) => {
42
- if (payload.context.system.config.sync_rules.present) {
41
+ const { service_context } = payload.context;
42
+ const { storageEngine } = service_context;
43
+
44
+ if (service_context.configuration.sync_rules.present) {
43
45
  // If sync rules are configured via the config, disable deploy via the API.
44
46
  throw new errors.JourneyError({
45
47
  status: 422,
@@ -51,7 +53,12 @@ export const deploySyncRules = routeDefinition({
51
53
  const content = payload.params.content;
52
54
 
53
55
  try {
54
- SqlSyncRules.fromYaml(payload.params.content);
56
+ const apiHandler = service_context.routerEngine!.getAPI();
57
+ SqlSyncRules.fromYaml(payload.params.content, {
58
+ ...apiHandler.getParseSyncRulesOptions(),
59
+ // We don't do any schema-level validation at this point
60
+ schema: undefined
61
+ });
55
62
  } catch (e) {
56
63
  throw new errors.JourneyError({
57
64
  status: 422,
@@ -61,7 +68,7 @@ export const deploySyncRules = routeDefinition({
61
68
  });
62
69
  }
63
70
 
64
- const sync_rules = await payload.context.system.storage.updateSyncRules({
71
+ const sync_rules = await storageEngine.activeBucketStorage.updateSyncRules({
65
72
  content: content
66
73
  });
67
74
 
@@ -84,8 +91,10 @@ export const validateSyncRules = routeDefinition({
84
91
  validator: schema.createTsCodecValidator(ValidateSyncRulesRequest, { allowAdditional: true }),
85
92
  handler: async (payload) => {
86
93
  const content = payload.params.content;
94
+ const { service_context } = payload.context;
95
+ const apiHandler = service_context.routerEngine!.getAPI();
87
96
 
88
- const info = await debugSyncRules(payload.context.system.requirePgPool(), content);
97
+ const info = await debugSyncRules(apiHandler, content);
89
98
 
90
99
  return replyPrettyJson(info);
91
100
  }
@@ -96,8 +105,12 @@ export const currentSyncRules = routeDefinition({
96
105
  method: router.HTTPMethod.GET,
97
106
  authorize: authApi,
98
107
  handler: async (payload) => {
99
- const storage = payload.context.system.storage;
100
- const sync_rules = await storage.getActiveSyncRulesContent();
108
+ const { service_context } = payload.context;
109
+ const {
110
+ storageEngine: { activeBucketStorage }
111
+ } = service_context;
112
+
113
+ const sync_rules = await activeBucketStorage.getActiveSyncRulesContent();
101
114
  if (!sync_rules) {
102
115
  throw new errors.JourneyError({
103
116
  status: 422,
@@ -105,12 +118,12 @@ export const currentSyncRules = routeDefinition({
105
118
  description: 'No active sync rules'
106
119
  });
107
120
  }
108
- const info = await debugSyncRules(payload.context.system.requirePgPool(), sync_rules.sync_rules_content);
109
- const next = await storage.getNextSyncRulesContent();
110
121
 
111
- const next_info = next
112
- ? await debugSyncRules(payload.context.system.requirePgPool(), next.sync_rules_content)
113
- : null;
122
+ const apiHandler = service_context.routerEngine!.getAPI();
123
+ const info = await debugSyncRules(apiHandler, sync_rules.sync_rules_content);
124
+ const next = await activeBucketStorage.getNextSyncRulesContent();
125
+
126
+ const next_info = next ? await debugSyncRules(apiHandler, next.sync_rules_content) : null;
114
127
 
115
128
  const response = {
116
129
  current: {
@@ -140,8 +153,11 @@ export const reprocessSyncRules = routeDefinition({
140
153
  authorize: authApi,
141
154
  validator: schema.createTsCodecValidator(ReprocessSyncRulesRequest),
142
155
  handler: async (payload) => {
143
- const storage = payload.context.system.storage;
144
- const sync_rules = await storage.getActiveSyncRules();
156
+ const {
157
+ storageEngine: { activeBucketStorage }
158
+ } = payload.context.service_context;
159
+ const apiHandler = payload.context.service_context.routerEngine!.getAPI();
160
+ const sync_rules = await activeBucketStorage.getActiveSyncRules(apiHandler.getParseSyncRulesOptions());
145
161
  if (sync_rules == null) {
146
162
  throw new errors.JourneyError({
147
163
  status: 422,
@@ -150,7 +166,7 @@ export const reprocessSyncRules = routeDefinition({
150
166
  });
151
167
  }
152
168
 
153
- const new_rules = await storage.updateSyncRules({
169
+ const new_rules = await activeBucketStorage.updateSyncRules({
154
170
  content: sync_rules.sync_rules.content
155
171
  });
156
172
  return {
@@ -169,15 +185,15 @@ function replyPrettyJson(payload: any) {
169
185
  });
170
186
  }
171
187
 
172
- async function debugSyncRules(db: pgwire.PgClient, sync_rules: string) {
188
+ async function debugSyncRules(apiHandler: RouteAPI, sync_rules: string) {
173
189
  try {
174
- const rules = SqlSyncRules.fromYaml(sync_rules);
175
- const source_table_patterns = rules.getSourceTables();
176
- const wc = new replication.WalConnection({
177
- db: db,
178
- sync_rules: rules
190
+ const rules = SqlSyncRules.fromYaml(sync_rules, {
191
+ ...apiHandler.getParseSyncRulesOptions(),
192
+ // No schema-based validation at this point
193
+ schema: undefined
179
194
  });
180
- const resolved_tables = await wc.getDebugTablesInfo(source_table_patterns);
195
+ const source_table_patterns = rules.getSourceTables();
196
+ const resolved_tables = await apiHandler.getDebugTablesInfo(source_table_patterns, rules);
181
197
 
182
198
  return {
183
199
  valid: true,
@@ -1,4 +1,4 @@
1
- import { container, errors, logger, router, schema } from '@powersync/lib-services-framework';
1
+ import { errors, logger, router, schema } from '@powersync/lib-services-framework';
2
2
  import { RequestParameters } from '@powersync/service-sync-rules';
3
3
  import { Readable } from 'stream';
4
4
 
@@ -8,7 +8,6 @@ import * as util from '../../util/util-index.js';
8
8
  import { Metrics } from '../../metrics/Metrics.js';
9
9
  import { authUser } from '../auth.js';
10
10
  import { routeDefinition } from '../router.js';
11
- import { RequestTracker } from '../../sync/RequestTracker.js';
12
11
 
13
12
  export enum SyncRoutes {
14
13
  STREAM = '/sync/stream'
@@ -20,9 +19,13 @@ export const syncStreamed = routeDefinition({
20
19
  authorize: authUser,
21
20
  validator: schema.createTsCodecValidator(util.StreamingSyncRequest, { allowAdditional: true }),
22
21
  handler: async (payload) => {
23
- const system = payload.context.system;
22
+ const { service_context } = payload.context;
23
+ const { routerEngine, storageEngine } = service_context;
24
+ const headers = payload.request.headers;
25
+ const userAgent = headers['x-user-agent'] ?? headers['user-agent'];
26
+ const clientId = payload.params.client_id;
24
27
 
25
- if (system.closed) {
28
+ if (routerEngine!.closed) {
26
29
  throw new errors.JourneyError({
27
30
  status: 503,
28
31
  code: 'SERVICE_UNAVAILABLE',
@@ -33,9 +36,8 @@ export const syncStreamed = routeDefinition({
33
36
  const params: util.StreamingSyncRequest = payload.params;
34
37
  const syncParams = new RequestParameters(payload.context.token_payload!, payload.params.parameters ?? {});
35
38
 
36
- const storage = system.storage;
37
39
  // Sanity check before we start the stream
38
- const cp = await storage.getActiveCheckpoint();
40
+ const cp = await storageEngine.activeBucketStorage.getActiveCheckpoint();
39
41
  if (!cp.hasSyncRules()) {
40
42
  throw new errors.JourneyError({
41
43
  status: 500,
@@ -43,16 +45,16 @@ export const syncStreamed = routeDefinition({
43
45
  description: 'No sync rules available'
44
46
  });
45
47
  }
46
- const metrics = container.getImplementation(Metrics);
47
48
  const controller = new AbortController();
48
- const tracker = new RequestTracker();
49
+ const tracker = new sync.RequestTracker();
49
50
  try {
50
- metrics.concurrent_connections.add(1);
51
+ Metrics.getInstance().concurrent_connections.add(1);
51
52
  const stream = Readable.from(
52
53
  sync.transformToBytesTracked(
53
54
  sync.ndjson(
54
55
  sync.streamResponse({
55
- storage,
56
+ storage: storageEngine.activeBucketStorage,
57
+ parseOptions: routerEngine!.getAPI().getParseSyncRulesOptions(),
56
58
  params,
57
59
  syncParams,
58
60
  token: payload.context.token_payload!,
@@ -65,7 +67,7 @@ export const syncStreamed = routeDefinition({
65
67
  { objectMode: false, highWaterMark: 16 * 1024 }
66
68
  );
67
69
 
68
- const deregister = system.addStopHandler(() => {
70
+ const deregister = routerEngine!.addStopHandler(() => {
69
71
  // This error is not currently propagated to the client
70
72
  controller.abort();
71
73
  stream.destroy(new Error('Shutting down system'));
@@ -90,9 +92,11 @@ export const syncStreamed = routeDefinition({
90
92
  data: stream,
91
93
  afterSend: async () => {
92
94
  controller.abort();
93
- metrics.concurrent_connections.add(-1);
95
+ Metrics.getInstance().concurrent_connections.add(-1);
94
96
  logger.info(`Sync stream complete`, {
95
97
  user_id: syncParams.user_id,
98
+ client_id: clientId,
99
+ user_agent: userAgent,
96
100
  operations_synced: tracker.operationsSynced,
97
101
  data_synced_bytes: tracker.dataSyncedBytes
98
102
  });
@@ -100,7 +104,7 @@ export const syncStreamed = routeDefinition({
100
104
  });
101
105
  } catch (ex) {
102
106
  controller.abort();
103
- metrics.concurrent_connections.add(-1);
107
+ Metrics.getInstance().concurrent_connections.add(-1);
104
108
  }
105
109
  }
106
110
  });
@@ -1,6 +1,6 @@
1
- import fastify from 'fastify';
1
+ import type fastify from 'fastify';
2
2
 
3
- import { errors, router, HTTPMethod, logger } from '@powersync/lib-services-framework';
3
+ import { errors, HTTPMethod, logger, router } from '@powersync/lib-services-framework';
4
4
  import { Context, ContextProvider, RequestEndpoint, RequestEndpointHandlerPayload } from './router.js';
5
5
 
6
6
  export type FastifyEndpoint<I, O, C> = RequestEndpoint<I, O, C> & {
@@ -1,13 +1,14 @@
1
+ import { IReactiveStream, ReactiveSocketRouter } from '@powersync/service-rsocket-router';
1
2
  import * as t from 'ts-codec';
2
- import { ReactiveSocketRouter, IReactiveStream } from '@powersync/service-rsocket-router';
3
3
 
4
4
  import { Context } from './router.js';
5
5
 
6
- export const RSocketContextMeta = t.object({
7
- token: t.string
8
- });
9
-
10
6
  /**
11
7
  * Creates a socket route handler given a router instance
12
8
  */
13
9
  export type SocketRouteGenerator = (router: ReactiveSocketRouter<Context>) => IReactiveStream;
10
+
11
+ export const RSocketContextMeta = t.object({
12
+ token: t.string,
13
+ user_agent: t.string.optional()
14
+ });
@@ -1,16 +1,20 @@
1
1
  import { router } from '@powersync/lib-services-framework';
2
2
  import * as auth from '../auth/auth-index.js';
3
- import { CorePowerSyncSystem } from '../system/CorePowerSyncSystem.js';
3
+ import { ServiceContext } from '../system/ServiceContext.js';
4
4
 
5
5
  /**
6
6
  * Common context for routes
7
7
  */
8
8
  export type Context = {
9
9
  user_id?: string;
10
- system: CorePowerSyncSystem;
10
+ service_context: ServiceContext;
11
11
 
12
12
  token_payload?: auth.JwtPayload;
13
13
  token_errors?: string[];
14
+ /**
15
+ * Only on websocket endpoints.
16
+ */
17
+ user_agent?: string;
14
18
  };
15
19
 
16
20
  export type BasicRouterRequest = {
@@ -36,6 +40,7 @@ export type RequestEndpointHandlerPayload<
36
40
  request: Request;
37
41
  };
38
42
 
43
+ export type RouteDefinition<I = any, O = any> = RequestEndpoint<I, O>;
39
44
  /**
40
45
  * Helper function for making generics work well when defining routes
41
46
  */
@@ -1,6 +1,9 @@
1
1
  export * as auth from './auth.js';
2
+ export * from './configure-fastify.js';
3
+ export * from './configure-rsocket.js';
2
4
  export * as endpoints from './endpoints/route-endpoints-index.js';
3
5
  export * as hooks from './hooks.js';
4
6
  export * from './route-register.js';
5
7
  export * from './router-socket.js';
6
8
  export * from './router.js';
9
+ export * from './RouterEngine.js';
@@ -1,108 +1,70 @@
1
1
  // Script to tear down the data when deleting an instance.
2
- // This deletes:
3
- // 1. The replication slots on the source postgres instance (if available).
4
- // 2. The mongo database.
2
+ // This should:
3
+ // 1. Attempt to clean up any remote configuration of data sources that was set up.
4
+ // 2. Delete the storage
5
5
 
6
- import * as timers from 'timers/promises';
7
-
8
- import * as db from '../db/db-index.js';
6
+ import { container, logger } from '@powersync/lib-services-framework';
7
+ import * as modules from '../modules/modules-index.js';
8
+ import * as system from '../system/system-index.js';
9
9
  import * as storage from '../storage/storage-index.js';
10
10
  import * as utils from '../util/util-index.js';
11
- import * as replication from '../replication/replication-index.js';
12
- import { logger } from '@powersync/lib-services-framework';
11
+ import timers from 'timers/promises';
13
12
 
14
- /**
15
- * Attempt to terminate a single sync rules instance.
16
- *
17
- * This may fail with a lock error.
18
- */
19
- async function terminateReplicator(
20
- storageFactory: storage.BucketStorageFactory,
21
- connection: utils.ResolvedConnection,
22
- syncRules: storage.PersistedSyncRulesContent
23
- ) {
24
- // The lock may still be active if the current replication instance
25
- // hasn't stopped yet.
26
- const lock = await syncRules.lock();
13
+ export async function teardown(runnerConfig: utils.RunnerConfig) {
27
14
  try {
28
- const parsed = syncRules.parsed();
29
- const storage = storageFactory.getInstance(parsed);
30
- const stream = new replication.WalStreamRunner({
31
- factory: storageFactory,
32
- storage: storage,
33
- source_db: connection,
34
- lock
35
- });
15
+ logger.info(`Tearing down PowerSync instance...`);
16
+ const config = await utils.loadConfig(runnerConfig);
17
+ const serviceContext = new system.ServiceContextContainer(config);
18
+ const moduleManager = container.getImplementation(modules.ModuleManager);
19
+ await moduleManager.initialize(serviceContext);
20
+ // This is mostly done to ensure that the storage is ready
21
+ await serviceContext.lifeCycleEngine.start();
36
22
 
37
- logger.info(`Terminating replication slot ${stream.slot_name}`);
38
- await stream.terminate();
39
- logger.info(`Terminated replication slot ${stream.slot_name}`);
40
- } finally {
41
- await lock.release();
23
+ await terminateSyncRules(serviceContext.storageEngine.activeBucketStorage, moduleManager);
24
+ await serviceContext.storageEngine.activeStorage.tearDown();
25
+ logger.info(`Teardown complete.`);
26
+ process.exit(0);
27
+ } catch (e) {
28
+ logger.error(`Teardown failure`, e);
29
+ process.exit(1);
42
30
  }
43
31
  }
44
32
 
45
- /**
46
- * Terminate all replicating sync rules, deleting the replication slots.
47
- *
48
- * Retries lock and other errors for up to two minutes.
49
- *
50
- * This is a best-effot attempt. In some cases it may not be possible to delete the replication
51
- * slot, such as when the postgres instance is unreachable.
52
- */
53
- async function terminateReplicators(
54
- storageFactory: storage.BucketStorageFactory,
55
- connection: utils.ResolvedConnection
56
- ) {
33
+ async function terminateSyncRules(storageFactory: storage.BucketStorageFactory, moduleManager: modules.ModuleManager) {
34
+ logger.info(`Terminating sync rules...`);
57
35
  const start = Date.now();
58
- while (Date.now() - start < 12_000) {
36
+ const locks: storage.ReplicationLock[] = [];
37
+ while (Date.now() - start < 120_000) {
59
38
  let retry = false;
60
- const replicationRules = await storageFactory.getReplicatingSyncRules();
61
- for (let syncRules of replicationRules) {
62
- try {
63
- await terminateReplicator(storageFactory, connection, syncRules);
64
- } catch (e) {
65
- retry = true;
66
- console.error(e);
67
- logger.warn(`Failed to terminate ${syncRules.slot_name}`, e);
39
+ const replicatingSyncRules = await storageFactory.getReplicatingSyncRules();
40
+ // Lock all the replicating sync rules
41
+ for (const replicatingSyncRule of replicatingSyncRules) {
42
+ const lock = await replicatingSyncRule.lock();
43
+ locks.push(lock);
44
+ }
45
+
46
+ const stoppedSyncRules = await storageFactory.getStoppedSyncRules();
47
+ const combinedSyncRules = [...replicatingSyncRules, ...stoppedSyncRules];
48
+ try {
49
+ // Clean up any module specific configuration for the sync rules
50
+ await moduleManager.tearDown({ syncRules: combinedSyncRules });
51
+
52
+ // Mark the sync rules as terminated
53
+ for (let syncRules of combinedSyncRules) {
54
+ const syncRulesStorage = storageFactory.getInstance(syncRules);
55
+ // The storage will be dropped at the end of the teardown, so we don't need to clear it here
56
+ await syncRulesStorage.terminate({ clearStorage: false });
57
+ }
58
+ } catch (e) {
59
+ retry = true;
60
+ for (const lock of locks) {
61
+ await lock.release();
68
62
  }
69
63
  }
64
+
70
65
  if (!retry) {
71
66
  break;
72
67
  }
73
68
  await timers.setTimeout(5_000);
74
69
  }
75
70
  }
76
-
77
- export async function teardown(runnerConfig: utils.RunnerConfig) {
78
- const config = await utils.loadConfig(runnerConfig);
79
- const mongoDB = storage.createPowerSyncMongo(config.storage);
80
- try {
81
- logger.info(`Waiting for auth`);
82
- await db.mongo.waitForAuth(mongoDB.db);
83
-
84
- const bucketStorage = new storage.MongoBucketStorage(mongoDB, { slot_name_prefix: config.slot_name_prefix });
85
- const connection = config.connection;
86
-
87
- logger.info(`Terminating replication slots`);
88
-
89
- if (connection) {
90
- await terminateReplicators(bucketStorage, connection);
91
- }
92
-
93
- const database = mongoDB.db;
94
- logger.info(`Dropping database ${database.namespace}`);
95
- await database.dropDatabase();
96
- logger.info(`Done`);
97
- await mongoDB.client.close();
98
-
99
- // If there was an error connecting to postgress, the process may stay open indefinitely.
100
- // This forces an exit.
101
- // We do not consider those errors a teardown failure.
102
- process.exit(0);
103
- } catch (e) {
104
- logger.error(`Teardown failure`, e);
105
- await mongoDB.client.close();
106
- process.exit(1);
107
- }
108
- }