Skip to content

Commit 8fdbf8d

Browse files
authored
Moved dynamic module loading to ModuleManager (#436)
1 parent bdfd287 commit 8fdbf8d

File tree

6 files changed

+21
-15
lines changed

6 files changed

+21
-15
lines changed

.changeset/nasty-snakes-double.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@powersync/service-core': patch
3+
'@powersync/service-image': patch
4+
---
5+
6+
- Rework dynamic module loading, fixing startup issues for migration and compact jobs in 1.18.0 / 1.18.1

packages/service-core/src/modules/ModuleManager.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { logger } from '@powersync/lib-services-framework';
22
import * as system from '../system/system-index.js';
33
import { AbstractModule, TearDownOptions } from './AbstractModule.js';
4+
import { loadModules, ModuleLoaders } from './loader.js';
45
/**
56
* The module manager keeps track of activated modules
67
*/
78
export class ModuleManager {
89
private readonly modules: Map<string, AbstractModule> = new Map();
10+
private moduleLoaders: ModuleLoaders | undefined;
911

1012
public register(modules: AbstractModule[]) {
1113
for (const module of modules) {
@@ -18,7 +20,18 @@ export class ModuleManager {
1820
}
1921
}
2022

23+
public registerDynamicModules(moduleLoaders: ModuleLoaders) {
24+
this.moduleLoaders = moduleLoaders;
25+
}
26+
2127
async initialize(serviceContext: system.ServiceContextContainer) {
28+
logger.info(`Loading dynamic modules...`);
29+
if (this.moduleLoaders) {
30+
const dynamicModules = await loadModules(serviceContext.configuration, this.moduleLoaders);
31+
this.register(dynamicModules);
32+
}
33+
logger.info(`Successfully loaded dynamic modules.`);
34+
2235
logger.info(`Initializing modules...`);
2336
for (const module of this.modules.values()) {
2437
await module.initialize(serviceContext);

service/src/entry.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import { startServer } from './runners/server.js';
66
import { startStreamRunner } from './runners/stream-worker.js';
77
import { startUnifiedRunner } from './runners/unified-runner.js';
88
import { createSentryReporter } from './util/alerting.js';
9+
import { DYNAMIC_MODULES } from './util/modules.js';
910

1011
// Initialize framework components
1112
container.registerDefaults();
1213
container.register(ContainerImplementation.REPORTER, createSentryReporter());
1314

1415
const moduleManager = new core.modules.ModuleManager();
1516
moduleManager.register([new CoreModule()]);
17+
moduleManager.registerDynamicModules(DYNAMIC_MODULES);
1618
// This is a bit of a hack. Commands such as the teardown command or even migrations might
1719
// want access to the ModuleManager in order to use modules
1820
container.register(core.ModuleManager, moduleManager);

service/src/runners/server.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { container, logger } from '@powersync/lib-services-framework';
22
import * as core from '@powersync/service-core';
33

44
import { logBooting } from '../util/version.js';
5-
import { DYNAMIC_MODULES } from '../util/modules.js';
65

76
/**
87
* Starts an API server
@@ -13,10 +12,6 @@ export async function startServer(runnerConfig: core.utils.RunnerConfig) {
1312
const config = await core.utils.loadConfig(runnerConfig);
1413

1514
const moduleManager = container.getImplementation(core.modules.ModuleManager);
16-
const modules = await core.loadModules(config, DYNAMIC_MODULES);
17-
if (modules.length > 0) {
18-
moduleManager.register(modules);
19-
}
2015

2116
const serviceContext = new core.system.ServiceContextContainer({
2217
serviceMode: core.system.ServiceContextMode.API,

service/src/runners/stream-worker.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { container, logger } from '@powersync/lib-services-framework';
22
import * as core from '@powersync/service-core';
33

44
import { logBooting } from '../util/version.js';
5-
import { DYNAMIC_MODULES } from '../util/modules.js';
65

76
/**
87
* Configures the replication portion on a {@link serviceContext}
@@ -24,10 +23,6 @@ export const startStreamRunner = async (runnerConfig: core.utils.RunnerConfig) =
2423
const config = await core.utils.loadConfig(runnerConfig);
2524

2625
const moduleManager = container.getImplementation(core.modules.ModuleManager);
27-
const modules = await core.loadModules(config, DYNAMIC_MODULES);
28-
if (modules.length > 0) {
29-
moduleManager.register(modules);
30-
}
3126

3227
// Self-hosted version allows for automatic migrations
3328
const serviceContext = new core.system.ServiceContextContainer({

service/src/runners/unified-runner.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import * as core from '@powersync/service-core';
33

44
import { logBooting } from '../util/version.js';
55
import { registerReplicationServices } from './stream-worker.js';
6-
import { DYNAMIC_MODULES } from '../util/modules.js';
76

87
/**
98
* Starts an API server
@@ -14,10 +13,6 @@ export const startUnifiedRunner = async (runnerConfig: core.utils.RunnerConfig)
1413
const config = await core.utils.loadConfig(runnerConfig);
1514

1615
const moduleManager = container.getImplementation(core.modules.ModuleManager);
17-
const modules = await core.loadModules(config, DYNAMIC_MODULES);
18-
if (modules.length > 0) {
19-
moduleManager.register(modules);
20-
}
2116

2217
const serviceContext = new core.system.ServiceContextContainer({
2318
serviceMode: core.system.ServiceContextMode.UNIFIED,

0 commit comments

Comments
 (0)