Skip to content

Commit 7767442

Browse files
Claudehotlong
andauthored
Fix TypeScript build errors in realtime event implementation
- Fixed type errors in objectql/engine.ts for recordId extraction - Added type guards in objectql/plugin.ts and metadata/plugin.ts - Fixed client initialization order with getter for events API - Suppressed intentionally unused fields in RealtimeAPI - Fixed unused parameter in useAutoRefresh hook Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/22f63fd8-a2de-4140-be84-0f902aaa8d33 Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 53c9c10 commit 7767442

6 files changed

Lines changed: 24 additions & 14 deletions

File tree

packages/client-react/src/realtime-hooks.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ export function useAutoRefresh(
253253
refetch: () => void,
254254
options?: { recordId?: string }
255255
): void {
256-
const handleEvent = useCallback((event: DataEvent) => {
256+
const handleEvent = useCallback((_event: DataEvent) => {
257257
// Refetch on any data change
258258
refetch();
259259
}, [refetch]);

packages/client/src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,9 @@ export class ObjectStackClient {
896896
* Event Subscription API
897897
* Provides real-time event subscriptions for metadata and data changes
898898
*/
899-
events = this.realtimeAPI;
899+
get events() {
900+
return this.realtimeAPI;
901+
}
900902

901903
/**
902904
* Permissions Services

packages/client/src/realtime-api.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@ export type RealtimeEventHandler = (event: RealtimeEventPayload) => void;
2525

2626
/**
2727
* Realtime API for subscribing to server events
28+
*
29+
* Note: Currently uses in-memory adapter. WebSocket/SSE transport planned for future.
2830
*/
2931
export class RealtimeAPI {
30-
private baseUrl: string;
31-
private token?: string;
32+
// @ts-expect-error - Reserved for future WebSocket/SSE implementation
33+
private _baseUrl: string;
34+
// @ts-expect-error - Reserved for future WebSocket/SSE implementation
35+
private _token?: string;
3236
private subscriptions = new Map<string, {
3337
filter: RealtimeSubscriptionFilter;
3438
handler: RealtimeEventHandler;
@@ -37,8 +41,8 @@ export class RealtimeAPI {
3741
private eventBuffer: RealtimeEventPayload[] = [];
3842

3943
constructor(baseUrl: string, token?: string) {
40-
this.baseUrl = baseUrl;
41-
this.token = token;
44+
this._baseUrl = baseUrl;
45+
this._token = token;
4246
}
4347

4448
/**

packages/metadata/src/plugin.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ export class MetadataPlugin implements Plugin {
131131
// This enables MetadataManager to publish metadata change events.
132132
try {
133133
const realtimeService = ctx.getService('realtime');
134-
if (realtimeService) {
134+
if (realtimeService && typeof realtimeService === 'object' && 'publish' in realtimeService) {
135135
ctx.logger.info('[MetadataPlugin] Bridging realtime service to MetadataManager for event publishing');
136-
this.manager.setRealtimeService(realtimeService);
136+
this.manager.setRealtimeService(realtimeService as any);
137137
}
138138
} catch (e: any) {
139139
ctx.logger.debug('[MetadataPlugin] No realtime service found — metadata events will not be published', {

packages/objectql/src/engine.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -992,18 +992,20 @@ export class ObjectQL implements IDataEngine {
992992
// Publish data.record.updated event to realtime service
993993
if (this.realtimeService) {
994994
try {
995+
const resultId = (typeof result === 'object' && result && 'id' in result) ? (result as any).id : undefined;
996+
const recordId = String(hookContext.input.id || resultId || '');
995997
const event: RealtimeEventPayload = {
996998
type: 'data.record.updated',
997999
object,
9981000
payload: {
999-
recordId: hookContext.input.id || result?.id,
1001+
recordId,
10001002
changes: hookContext.input.data,
10011003
after: result,
10021004
},
10031005
timestamp: new Date().toISOString(),
10041006
};
10051007
await this.realtimeService.publish(event);
1006-
this.logger.debug('Published data.record.updated event', { object, recordId: hookContext.input.id });
1008+
this.logger.debug('Published data.record.updated event', { object, recordId });
10071009
} catch (error) {
10081010
this.logger.warn('Failed to publish data event', { object, error });
10091011
}
@@ -1066,16 +1068,18 @@ export class ObjectQL implements IDataEngine {
10661068
// Publish data.record.deleted event to realtime service
10671069
if (this.realtimeService) {
10681070
try {
1071+
const resultId = (typeof result === 'object' && result && 'id' in result) ? (result as any).id : undefined;
1072+
const recordId = String(hookContext.input.id || resultId || '');
10691073
const event: RealtimeEventPayload = {
10701074
type: 'data.record.deleted',
10711075
object,
10721076
payload: {
1073-
recordId: hookContext.input.id || result?.id,
1077+
recordId,
10741078
},
10751079
timestamp: new Date().toISOString(),
10761080
};
10771081
await this.realtimeService.publish(event);
1078-
this.logger.debug('Published data.record.deleted event', { object, recordId: hookContext.input.id });
1082+
this.logger.debug('Published data.record.deleted event', { object, recordId });
10791083
} catch (error) {
10801084
this.logger.warn('Failed to publish data event', { object, error });
10811085
}

packages/objectql/src/plugin.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ export class ObjectQLPlugin implements Plugin {
119119
// This enables ObjectQL to publish data change events.
120120
try {
121121
const realtimeService = ctx.getService('realtime');
122-
if (realtimeService) {
122+
if (realtimeService && typeof realtimeService === 'object' && 'publish' in realtimeService) {
123123
ctx.logger.info('[ObjectQLPlugin] Bridging realtime service to ObjectQL for event publishing');
124-
this.ql.setRealtimeService(realtimeService);
124+
this.ql.setRealtimeService(realtimeService as any);
125125
}
126126
} catch (e: any) {
127127
ctx.logger.debug('[ObjectQLPlugin] No realtime service found — data events will not be published', {

0 commit comments

Comments
 (0)