Skip to content

Commit e60cdd1

Browse files
Claudehotlong
andauthored
Phase 2.1: Integrate MetadataManager with IRealtimeService
- Add IRealtimeService import to MetadataManager - Add setRealtimeService() method to MetadataManager - Publish metadata.{type}.created events in register() - Publish metadata.{type}.deleted events in unregister() - Bridge realtime service in MetadataPlugin.start() Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/6a38da2b-8234-4c22-b456-ec507a8f82f2 Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 7b752b1 commit e60cdd1

2 files changed

Lines changed: 73 additions & 0 deletions

File tree

packages/metadata/src/metadata-manager.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import type {
2828
MetadataImportOptions,
2929
MetadataImportResult,
3030
MetadataTypeInfo,
31+
IRealtimeService,
32+
RealtimeEventPayload,
3133
} from '@objectstack/spec/contracts';
3234
import type {
3335
MetadataQuery,
@@ -83,6 +85,9 @@ export class MetadataManager implements IMetadataService {
8385
// Dependency tracking: "type:name" -> dependencies
8486
private dependencies = new Map<string, MetadataDependency[]>();
8587

88+
// Realtime service for event publishing
89+
private realtimeService?: IRealtimeService;
90+
8691
constructor(config: MetadataManagerOptions) {
8792
this.config = config;
8893
this.logger = createLogger({ level: 'info', format: 'pretty' });
@@ -139,6 +144,17 @@ export class MetadataManager implements IMetadataService {
139144
this.logger.info('DatabaseLoader configured', { datasource: this.config.datasource, tableName });
140145
}
141146

147+
/**
148+
* Set the realtime service for publishing metadata change events.
149+
* Should be called after kernel resolves the realtime service.
150+
*
151+
* @param service - An IRealtimeService instance for event publishing
152+
*/
153+
setRealtimeService(service: IRealtimeService): void {
154+
this.realtimeService = service;
155+
this.logger.info('RealtimeService configured for metadata events');
156+
}
157+
142158
/**
143159
* Register a new metadata loader (data source)
144160
*/
@@ -171,6 +187,28 @@ export class MetadataManager implements IMetadataService {
171187
await loader.save(type, name, data);
172188
}
173189
}
190+
191+
// Publish metadata.{type}.created event to realtime service
192+
if (this.realtimeService) {
193+
const event: RealtimeEventPayload = {
194+
type: `metadata.${type}.created`,
195+
object: type,
196+
payload: {
197+
metadataType: type,
198+
name,
199+
definition: data,
200+
packageId: (data as any)?.packageId,
201+
},
202+
timestamp: new Date().toISOString(),
203+
};
204+
205+
try {
206+
await this.realtimeService.publish(event);
207+
this.logger.debug(`Published metadata.${type}.created event`, { name });
208+
} catch (error) {
209+
this.logger.warn(`Failed to publish metadata event`, { type, name, error });
210+
}
211+
}
174212
}
175213

176214
/**
@@ -246,6 +284,26 @@ export class MetadataManager implements IMetadataService {
246284
}
247285
}
248286
}
287+
288+
// Publish metadata.{type}.deleted event to realtime service
289+
if (this.realtimeService) {
290+
const event: RealtimeEventPayload = {
291+
type: `metadata.${type}.deleted`,
292+
object: type,
293+
payload: {
294+
metadataType: type,
295+
name,
296+
},
297+
timestamp: new Date().toISOString(),
298+
};
299+
300+
try {
301+
await this.realtimeService.publish(event);
302+
this.logger.debug(`Published metadata.${type}.deleted event`, { name });
303+
} catch (error) {
304+
this.logger.warn(`Failed to publish metadata event`, { type, name, error });
305+
}
306+
}
249307
}
250308

251309
/**

packages/metadata/src/plugin.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,5 +125,20 @@ export class MetadataPlugin implements Plugin {
125125
error: e.message,
126126
});
127127
}
128+
129+
// Bridge realtime service from kernel service registry to MetadataManager.
130+
// RealtimeServicePlugin registers as 'realtime' service during init().
131+
// This enables MetadataManager to publish metadata change events.
132+
try {
133+
const realtimeService = ctx.getService('realtime');
134+
if (realtimeService) {
135+
ctx.logger.info('[MetadataPlugin] Bridging realtime service to MetadataManager for event publishing');
136+
this.manager.setRealtimeService(realtimeService);
137+
}
138+
} catch (e: any) {
139+
ctx.logger.debug('[MetadataPlugin] No realtime service found — metadata events will not be published', {
140+
error: e.message,
141+
});
142+
}
128143
}
129144
}

0 commit comments

Comments
 (0)