Skip to content

Commit 9feb097

Browse files
committed
Update subscription function signatures
1 parent 8f3dbbc commit 9feb097

File tree

11 files changed

+74
-48
lines changed

11 files changed

+74
-48
lines changed

packages/base/cards-grid.gts

+4-3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ import Captions from '@cardstack/boxel-icons/captions';
4545
import CardsIcon from '@cardstack/boxel-icons/cards';
4646
import { registerDestructor } from '@ember/destroyable';
4747

48+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
49+
4850
type IconComponent = typeof Captions;
4951
interface SortOption {
5052
displayName: string;
@@ -469,9 +471,8 @@ class Isolated extends Component<typeof CardsGrid> {
469471
) ?? this.filters[0];
470472
});
471473

472-
private refreshFilterList = (ev: MessageEvent) => {
473-
let data = JSON.parse(ev.data);
474-
if (ev.type === 'index' && data.type === 'incremental') {
474+
private refreshFilterList = (ev: RealmEventEventContent) => {
475+
if (ev.eventName === 'index' && ev.indexType === 'incremental') {
475476
this.loadFilterList.perform();
476477
}
477478
};

packages/host/app/components/prerendered-card-search.gts

+7-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import { type HTMLComponent, htmlComponent } from '../lib/html-component';
2626
import type CardService from '../services/card-service';
2727
import type LoaderService from '../services/loader-service';
2828

29+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
30+
2931
const waiter = buildWaiter('prerendered-card-search:waiter');
3032

3133
export interface PrerenderedCardData {
@@ -252,8 +254,11 @@ export default class PrerenderedCardSearch extends Component<Signature> {
252254
}
253255
}
254256

255-
private markRealmNeedsRefreshing = (ev: MessageEvent, realm: string) => {
256-
if (ev.type === 'index') {
257+
private markRealmNeedsRefreshing = (
258+
ev: RealmEventEventContent,
259+
realm: string,
260+
) => {
261+
if (ev.eventName === 'index') {
257262
this.realmsNeedingRefresh.add(realm);
258263
}
259264
};

packages/host/app/helpers/subscribe-to-realms.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import { isEqual } from 'lodash';
44

55
import { subscribeToRealm } from '@cardstack/runtime-common';
66

7+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
8+
79
interface Signature {
810
Args: {
911
Positional: [
1012
realms: string[],
11-
callback: (ev: MessageEvent, realmURL: string) => void,
13+
callback: (ev: RealmEventEventContent, realmURL: string) => void,
1214
];
1315
};
1416
Return: void;

packages/host/app/resources/directory.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import type LoaderService from '../services/loader-service';
1616
import type MessageService from '../services/message-service';
1717
import type NetworkService from '../services/network';
1818

19+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
20+
1921
const log = logger('resource:directory');
2022

2123
interface Args {
@@ -65,16 +67,16 @@ export class DirectoryResource extends Resource<Args> {
6567
url: realmURL.href,
6668
unsubscribe: this.messageService.subscribe(
6769
realmURL.href,
68-
({ type, data: dataStr }) => {
70+
(event: RealmEventEventContent) => {
6971
if (!this.directoryURL) {
7072
return;
7173
}
72-
let eventData = JSON.parse(dataStr);
73-
if (type !== 'index' || !eventData.updatedFile) {
74+
75+
if (event.eventName !== 'index' || !event.updatedFile) {
7476
return;
7577
}
7678

77-
let { updatedFile } = eventData as { updatedFile: string };
79+
let { updatedFile } = event as { updatedFile: string };
7880
let segments = updatedFile.split('/');
7981
segments.pop();
8082
let updatedDir = segments.join('/').replace(/([^/])$/, '$1/'); // directories always end in '/'

packages/host/app/resources/file.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import type LoaderService from '../services/loader-service';
1919
import type MessageService from '../services/message-service';
2020
import type NetworkService from '../services/network';
2121

22+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
23+
2224
const log = logger('resource:file');
2325
const utf8 = new TextDecoder();
2426
const encoder = new TextEncoder();
@@ -91,7 +93,7 @@ class _FileResource extends Resource<Args> {
9193

9294
private setSubscription(
9395
realmURL: string,
94-
callback: (ev: { type: string; data: string }) => void,
96+
callback: (ev: RealmEventEventContent) => void,
9597
) {
9698
if (this.subscription && this.subscription.url !== realmURL) {
9799
this.subscription.unsubscribe();
@@ -197,19 +199,18 @@ class _FileResource extends Resource<Args> {
197199
},
198200
});
199201

200-
this.setSubscription(realmURL, (event: { type: string; data: string }) => {
201-
let eventData = JSON.parse(event.data);
202+
this.setSubscription(realmURL, (event: RealmEventEventContent) => {
202203
if (
203-
event.type !== 'index' ||
204+
event.eventName !== 'index' ||
204205
// we wait specifically for the index complete event ("incremental") so
205206
// that the subsequent index read retrieves the latest contents of the file
206-
eventData.type !== 'incremental' ||
207-
!Array.isArray(eventData.invalidations)
207+
event.indexType !== 'incremental' ||
208+
!Array.isArray(event.invalidations)
208209
) {
209210
return;
210211
}
211212

212-
let { invalidations } = eventData as { invalidations: string[] };
213+
let { invalidations } = event as { invalidations: string[] };
213214
let normalizedURL = this.url.endsWith('.json')
214215
? this.url.replace(/\.json$/, '')
215216
: this.url;

packages/host/app/resources/search.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { type CardResource, getCard } from './card-resource';
2727

2828
import type CardService from '../services/card-service';
2929
import type RealmServerService from '../services/realm-server';
30+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
3031

3132
const waiter = buildWaiter('search-resource:search-waiter');
3233

@@ -66,13 +67,15 @@ export class Search extends Resource<Args> {
6667
url: `${realm}_message`,
6768
unsubscribe: subscribeToRealm(
6869
realm,
69-
({ type, data }: { type: string; data: string }) => {
70+
(event: RealmEventEventContent) => {
7071
if (query === undefined) {
7172
return;
7273
}
73-
let eventData = JSON.parse(data);
7474
// we are only interested in incremental index events
75-
if (type !== 'index' || eventData.type !== 'incremental') {
75+
if (
76+
event.eventName !== 'index' ||
77+
event.indexType !== 'incremental'
78+
) {
7679
return;
7780
}
7881
this.search.perform(query);

packages/host/app/services/matrix-service.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import {
4646
APP_BOXEL_COMMAND_RESULT_WITH_NO_OUTPUT_MSGTYPE,
4747
APP_BOXEL_COMMAND_RESULT_WITH_OUTPUT_MSGTYPE,
4848
APP_BOXEL_MESSAGE_MSGTYPE,
49+
APP_BOXEL_REALM_EVENT_EVENT_TYPE,
4950
APP_BOXEL_REALM_SERVER_EVENT_MSGTYPE,
5051
APP_BOXEL_REALMS_EVENT_TYPE,
5152
APP_BOXEL_ACTIVE_LLM,
@@ -1353,22 +1354,19 @@ export default class MatrixService extends Service {
13531354
) {
13541355
await this.realmServer.handleEvent(event);
13551356
} else if (
1356-
event.type === 'm.room.message' &&
1357-
event.content?.msgtype === 'app.boxel.sse' &&
1357+
event.type === APP_BOXEL_REALM_EVENT_EVENT_TYPE &&
13581358
event.sender
13591359
) {
13601360
// FIXME provenance should be checked
13611361
console.log('received sse event', event);
1362-
let parsedEventContent = JSON.parse(event.content.body);
1363-
console.log('relayMatrixSSE', parsedEventContent);
13641362

13651363
let realmInfoForSender = this.realm.realmOfMatrixUsername(event.sender);
13661364
if (!realmInfoForSender) {
13671365
console.log('ignoring sse event because no realm found', event);
13681366
} else {
13691367
this.messageService.relayMatrixSSE(
13701368
realmInfoForSender.url,
1371-
parsedEventContent,
1369+
event.content,
13721370
);
13731371
}
13741372
}

packages/host/app/services/message-service.ts

+13-10
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,24 @@ import { SessionLocalStorageKey } from '../utils/local-storage-keys';
1212

1313
import type NetworkService from './network';
1414

15+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
16+
1517
export default class MessageService extends Service {
1618
@tracked subscriptions: Map<string, EventSource> = new Map();
17-
@tracked listenerCallbacks: Map<string, ((ev: MessageEvent) => void)[]> =
18-
new Map();
19-
@service private declare network: NetworkService;
19+
@tracked listenerCallbacks: Map<
20+
string,
21+
((ev: RealmEventEventContent) => void)[]
22+
> = new Map();
23+
@service declare private network: NetworkService;
2024

2125
register() {
2226
(globalThis as any)._CARDSTACK_REALM_SUBSCRIBE = this;
2327
}
2428

25-
subscribe(realmURL: string, cb: (ev: MessageEvent) => void): () => void {
29+
subscribe(
30+
realmURL: string,
31+
cb: (ev: RealmEventEventContent) => void,
32+
): () => void {
2633
console.log('subscribe', realmURL, cb);
2734
if (isTesting()) {
2835
// only use Matrix-y callbacks in testing
@@ -66,14 +73,10 @@ export default class MessageService extends Service {
6673
};
6774
}
6875

69-
relayMatrixSSE(realmURL: string, event: any) {
76+
relayMatrixSSE(realmURL: string, event: RealmEventEventContent) {
7077
console.log('relaying matrix sse event', realmURL, event);
7178
this.listenerCallbacks.get(realmURL)?.forEach((cb) => {
72-
let eventWithStringData = {
73-
type: event.type,
74-
data: JSON.stringify(event.data),
75-
} as MessageEvent;
76-
cb(eventWithStringData);
79+
cb(event);
7780
});
7881
}
7982
}

packages/host/app/services/realm.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ import type MessageService from './message-service';
4141
import type NetworkService from './network';
4242
import type RealmServerService from './realm-server';
4343
import type ResetService from './reset';
44+
import type {
45+
IndexRealmEventContent,
46+
RealmEventEventContent,
47+
} from '@cardstack/base/matrix-event';
4448

4549
const log = logger('service:realm');
4650

@@ -151,21 +155,21 @@ class RealmResource {
151155
this.subscription = {
152156
unsubscribe: this.messageService.subscribe(
153157
this.realmURL,
154-
({ type, data: dataStr }: { type: string; data: string }) => {
158+
(event: RealmEventEventContent) => {
155159
if (!this.info) {
156160
console.warn(
157161
`No realm info exists for ${this.realmURL} when trying to set indexing status`,
158162
);
159163
return;
160164
}
161-
if (type !== 'index') {
165+
if (event.eventName !== 'index') {
162166
return;
163167
}
164-
let data = JSON.parse(dataStr) as IndexEventData;
165-
if (data.type === 'full') {
168+
let data = event as IndexRealmEventContent;
169+
if (data.indexType === 'full') {
166170
return;
167171
}
168-
switch (data.type) {
172+
switch (data.indexType) {
169173
case 'incremental-index-initiation':
170174
this.info.isIndexing = true;
171175
break;

packages/host/app/services/store.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import type RealmService from './realm';
3030

3131
import type { CardResource } from '../resources/card-resource';
3232

33+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
34+
3335
class ResettableIdentityContext implements IdentityContext {
3436
#cards = new Map<
3537
string,
@@ -227,15 +229,15 @@ export default class StoreService extends Service {
227229
return { url, card, error };
228230
}
229231

230-
private handleInvalidations = ({ type, data: dataStr }: MessageEvent) => {
231-
if (type !== 'index') {
232+
private handleInvalidations = (event: RealmEventEventContent) => {
233+
if (event.eventName !== 'index') {
232234
return;
233235
}
234-
let data = JSON.parse(dataStr);
235-
if (data.type !== 'incremental') {
236+
237+
if (event.indexType !== 'incremental') {
236238
return;
237239
}
238-
let invalidations = data.invalidations as string[];
240+
let invalidations = event.invalidations as string[];
239241

240242
if (invalidations.find((i) => hasExecutableExtension(i))) {
241243
// the invalidation included code changes too. in this case we
@@ -259,7 +261,7 @@ export default class StoreService extends Service {
259261
// Do not reload if the event is a result of a request that we made. Otherwise we risk overwriting
260262
// the inputs with past values. This can happen if the user makes edits in the time between the auto
261263
// save request and the arrival SSE event.
262-
if (!this.cardService.clientRequestIds.has(data.clientRequestId)) {
264+
if (!this.cardService.clientRequestIds.has(event.clientRequestId)) {
263265
this.reload.perform(liveCard);
264266
}
265267
} else if (!this.identityContext.get(invalidation)) {

packages/runtime-common/index.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { CardResource } from './card-document';
22

3+
import type { RealmEventEventContent } from '@cardstack/base/matrix-event';
4+
35
// a card resource but with optional "id" and "type" props
46
export type LooseCardResource = Omit<CardResource, 'id' | 'type'> & {
57
type?: 'card';
@@ -322,12 +324,15 @@ export async function createNewCard<T extends CardDef>(
322324
}
323325

324326
export interface RealmSubscribe {
325-
subscribe(realmURL: string, cb: (ev: MessageEvent) => void): () => void;
327+
subscribe(
328+
realmURL: string,
329+
cb: (ev: RealmEventEventContent) => void,
330+
): () => void;
326331
}
327332

328333
export function subscribeToRealm(
329334
realmURL: string,
330-
cb: (ev: MessageEvent) => void,
335+
cb: (ev: RealmEventEventContent) => void,
331336
): () => void {
332337
let here = globalThis as any;
333338
if (!here._CARDSTACK_REALM_SUBSCRIBE) {

0 commit comments

Comments
 (0)