SpacetimeDB: subscription-erfaringer, refresh med enrichFromPg, whitespace-fiks

- Dokumentert at subscriptions ikke støtter JOINs (feiler stille)
- refresh() kaller enrichFromPg() for å hente fersk metadata fra PG
- Whitespace-normalisering i autogenererte module_bindings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-16 09:18:45 +01:00
parent 531defe986
commit 88a22e131b
11 changed files with 128 additions and 104 deletions

View file

@ -107,5 +107,26 @@ Ny modell:
- SyncOutbox-events prosesseres hver 1. sekund
- Støtter: `messages/insert`, `messages/delete`, `messages/update`, `message_reactions/insert`, `message_reactions/delete`
## 7. Subscription-begrensninger
**SpacetimeDB-subscriptions støtter IKKE JOINs.** En subscription-query som `SELECT mr.* FROM message_reaction mr JOIN chat_message cm ON cm.id = mr.message_id WHERE ...` feiler stille — `onApplied` kalles aldri, og ingen data vises.
Bruk kun enkle `SELECT * FROM tabell WHERE ...`-queries i `.subscribe([...])`. Filtrer heller klient-side etter at data er lastet.
Eksempel:
```typescript
// FEIL — feiler stille, ingen data
.subscribe([
`SELECT * FROM chat_message WHERE channel_id = '${id}'`,
`SELECT mr.* FROM message_reaction mr JOIN chat_message cm ON cm.id = mr.message_id WHERE cm.channel_id = '${id}'`
]);
// RIKTIG — last alle reaksjoner, filtrer i koden
.subscribe([
`SELECT * FROM chat_message WHERE channel_id = '${id}'`,
`SELECT * FROM message_reaction`
]);
```
### Fallback
PG-polling adapter (`pg.svelte.ts`) brukes kun når SpacetimeDB ikke er konfigurert. Markeres som `readonly: true`.

View file

@ -156,3 +156,4 @@ export class DbConnection extends __DbConnectionImpl<typeof REMOTE_MODULE> {
return new SubscriptionBuilder(this);
};
}

View file

@ -42,3 +42,4 @@ export const SyncOutbox = __t.object("SyncOutbox", {
synced: __t.bool(),
});
export type SyncOutbox = __Infer<typeof SyncOutbox>;

View file

@ -25,3 +25,4 @@ export type LoadReactionsParams = __Infer<typeof LoadReactionsReducer>;
export type MarkSyncedParams = __Infer<typeof MarkSyncedReducer>;
export type RemoveReactionParams = __Infer<typeof RemoveReactionReducer>;
export type SendMessageParams = __Infer<typeof SendMessageReducer>;

View file

@ -325,7 +325,7 @@ export function createSpacetimeChat(
edit,
delete: del,
react,
refresh: async () => { rebuildMessages(); },
refresh: async () => { rebuildMessages(); await enrichFromPg(); },
destroy
};
}