spacetimedb 2.0.3 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/LICENSE.txt +2 -2
  2. package/dist/angular/index.cjs +3 -0
  3. package/dist/angular/index.cjs.map +1 -1
  4. package/dist/angular/index.mjs +3 -0
  5. package/dist/angular/index.mjs.map +1 -1
  6. package/dist/browser/angular/index.mjs +3 -0
  7. package/dist/browser/angular/index.mjs.map +1 -1
  8. package/dist/browser/react/index.mjs +3 -0
  9. package/dist/browser/react/index.mjs.map +1 -1
  10. package/dist/browser/svelte/index.mjs +3 -0
  11. package/dist/browser/svelte/index.mjs.map +1 -1
  12. package/dist/browser/vue/index.mjs +3 -0
  13. package/dist/browser/vue/index.mjs.map +1 -1
  14. package/dist/index.browser.mjs +126 -92
  15. package/dist/index.browser.mjs.map +1 -1
  16. package/dist/index.cjs +126 -92
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.mjs +126 -92
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/lib/binary_writer.d.ts +1 -0
  21. package/dist/lib/binary_writer.d.ts.map +1 -1
  22. package/dist/lib/indexes.d.ts +1 -1
  23. package/dist/lib/indexes.d.ts.map +1 -1
  24. package/dist/lib/query.d.ts +4 -2
  25. package/dist/lib/query.d.ts.map +1 -1
  26. package/dist/lib/schema.d.ts +2 -0
  27. package/dist/lib/schema.d.ts.map +1 -1
  28. package/dist/lib/table.d.ts +19 -1
  29. package/dist/lib/table.d.ts.map +1 -1
  30. package/dist/min/index.browser.mjs +1 -1
  31. package/dist/min/index.browser.mjs.map +1 -1
  32. package/dist/min/react/index.mjs +1 -1
  33. package/dist/min/react/index.mjs.map +1 -1
  34. package/dist/min/sdk/index.browser.mjs +1 -1
  35. package/dist/min/sdk/index.browser.mjs.map +1 -1
  36. package/dist/react/index.cjs +3 -0
  37. package/dist/react/index.cjs.map +1 -1
  38. package/dist/react/index.mjs +3 -0
  39. package/dist/react/index.mjs.map +1 -1
  40. package/dist/sdk/db_connection_impl.d.ts.map +1 -1
  41. package/dist/sdk/index.browser.mjs +126 -92
  42. package/dist/sdk/index.browser.mjs.map +1 -1
  43. package/dist/sdk/index.cjs +126 -92
  44. package/dist/sdk/index.cjs.map +1 -1
  45. package/dist/sdk/index.mjs +126 -92
  46. package/dist/sdk/index.mjs.map +1 -1
  47. package/dist/sdk/table_cache.d.ts.map +1 -1
  48. package/dist/sdk/websocket_decompress_adapter.d.ts +17 -7
  49. package/dist/sdk/websocket_decompress_adapter.d.ts.map +1 -1
  50. package/dist/sdk/websocket_test_adapter.d.ts +3 -2
  51. package/dist/sdk/websocket_test_adapter.d.ts.map +1 -1
  52. package/dist/server/index.mjs +65 -21
  53. package/dist/server/index.mjs.map +1 -1
  54. package/dist/svelte/index.cjs +3 -0
  55. package/dist/svelte/index.cjs.map +1 -1
  56. package/dist/svelte/index.mjs +3 -0
  57. package/dist/svelte/index.mjs.map +1 -1
  58. package/dist/tanstack/SpacetimeDBQueryClient.d.ts +1 -0
  59. package/dist/tanstack/SpacetimeDBQueryClient.d.ts.map +1 -1
  60. package/dist/tanstack/index.cjs +24 -0
  61. package/dist/tanstack/index.cjs.map +1 -1
  62. package/dist/tanstack/index.mjs +24 -0
  63. package/dist/tanstack/index.mjs.map +1 -1
  64. package/dist/vue/index.cjs +3 -0
  65. package/dist/vue/index.cjs.map +1 -1
  66. package/dist/vue/index.mjs +3 -0
  67. package/dist/vue/index.mjs.map +1 -1
  68. package/package.json +1 -1
  69. package/src/lib/binary_writer.ts +4 -0
  70. package/src/lib/indexes.ts +1 -1
  71. package/src/lib/query.ts +30 -6
  72. package/src/lib/schema.ts +66 -24
  73. package/src/lib/table.ts +41 -9
  74. package/src/sdk/db_connection_impl.ts +38 -43
  75. package/src/sdk/table_cache.ts +14 -11
  76. package/src/sdk/websocket_decompress_adapter.ts +42 -45
  77. package/src/sdk/websocket_test_adapter.ts +3 -2
  78. package/src/server/runtime.ts +7 -3
  79. package/src/server/schema.test-d.ts +37 -0
  80. package/src/server/view.test-d.ts +2 -0
  81. package/src/tanstack/SpacetimeDBQueryClient.ts +24 -0
@@ -60,3 +60,40 @@ spacetimedb.init(ctx => {
60
60
  // @ts-expect-error update() is NOT allowed on non-PK unique indexes
61
61
  const _update = ctx.db.person.name2.update;
62
62
  });
63
+
64
+ /**
65
+ * Regression coverage for the declared-vs-resolved index split:
66
+ * - declared table-level indexes must still produce typed accessors
67
+ * - field-level indexes must still produce typed accessors
68
+ * - non-indexed fields must not accidentally become index accessors
69
+ */
70
+ const account = table(
71
+ {
72
+ indexes: [
73
+ {
74
+ accessor: 'byEmailAndOrg',
75
+ algorithm: 'btree',
76
+ columns: ['email', 'orgId'] as const,
77
+ },
78
+ ] as const,
79
+ },
80
+ {
81
+ accountId: t.u32(),
82
+ email: t.string().index('hash'),
83
+ orgId: t.u32(),
84
+ nickname: t.string(),
85
+ }
86
+ );
87
+
88
+ const spacetimedbIndexSplit = schema({ account });
89
+
90
+ spacetimedbIndexSplit.init(ctx => {
91
+ // Explicit table-level index accessor from `table({ indexes: [...] })`.
92
+ ctx.db.account.byEmailAndOrg.filter(['a@example.com', 1]);
93
+
94
+ // Field-level index accessor derived from column metadata.
95
+ ctx.db.account.email.filter('a@example.com');
96
+
97
+ // @ts-expect-error `nickname` is not indexed, so no index accessor should exist.
98
+ const _nickname = ctx.db.account.nickname;
99
+ });
@@ -7,6 +7,7 @@ const person = table(
7
7
  name: 'person',
8
8
  indexes: [
9
9
  {
10
+ accessor: 'name_id_idx',
10
11
  name: 'name_id_idx',
11
12
  algorithm: 'btree',
12
13
  columns: ['name', 'id'] as const,
@@ -48,6 +49,7 @@ const order = table(
48
49
  name: 'order',
49
50
  indexes: [
50
51
  {
52
+ accessor: 'id_person_id',
51
53
  name: 'id_person_id', // We are adding this to make sure `person_id` still isn't considered indexed.
52
54
  algorithm: 'btree',
53
55
  columns: ['id', 'person_id'] as const,
@@ -96,6 +96,7 @@ export class SpacetimeDBQueryClient {
96
96
  setConnection(connection: SpacetimeConnection): void {
97
97
  this.connection = connection;
98
98
  this.processPendingQueries();
99
+ this.hydrateSubscriptions();
99
100
  }
100
101
 
101
102
  connect(queryClient: QueryClient): void {
@@ -289,6 +290,29 @@ export class SpacetimeDBQueryClient {
289
290
  }
290
291
  }
291
292
 
293
+ // subscribe to queries with SSR cached data but no active subscription
294
+ private hydrateSubscriptions(): void {
295
+ if (!this.connection || !this.queryClient) {
296
+ return;
297
+ }
298
+
299
+ for (const [querySql, { accessorName, whereExpr }] of queryRegistry) {
300
+ const queryKey = ['spacetimedb', accessorName, querySql] as const;
301
+ const keyStr = JSON.stringify(queryKey);
302
+
303
+ if (this.subscriptions.has(keyStr)) {
304
+ continue;
305
+ }
306
+ if (this.queryClient.getQueryData(queryKey) === undefined) {
307
+ continue;
308
+ }
309
+
310
+ this.setupSubscription(queryKey, accessorName, querySql, whereExpr).catch(
311
+ () => {}
312
+ );
313
+ }
314
+ }
315
+
292
316
  // clean up all subscriptions and disconnect
293
317
  disconnect(): void {
294
318
  if (this.cacheUnsubscribe) {