spacetimedb 2.0.4 → 2.2.0

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 (116) hide show
  1. package/LICENSE.txt +2 -2
  2. package/dist/angular/index.cjs +9 -3
  3. package/dist/angular/index.cjs.map +1 -1
  4. package/dist/angular/index.mjs +9 -3
  5. package/dist/angular/index.mjs.map +1 -1
  6. package/dist/browser/angular/index.mjs +9 -3
  7. package/dist/browser/angular/index.mjs.map +1 -1
  8. package/dist/browser/react/index.mjs +62 -7
  9. package/dist/browser/react/index.mjs.map +1 -1
  10. package/dist/browser/svelte/index.mjs +9 -3
  11. package/dist/browser/svelte/index.mjs.map +1 -1
  12. package/dist/browser/vue/index.mjs +9 -3
  13. package/dist/browser/vue/index.mjs.map +1 -1
  14. package/dist/index.browser.mjs +481 -146
  15. package/dist/index.browser.mjs.map +1 -1
  16. package/dist/index.cjs +481 -146
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.mjs +481 -146
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/lib/algebraic_type.d.ts.map +1 -1
  21. package/dist/lib/binary_reader.d.ts +1 -1
  22. package/dist/lib/binary_reader.d.ts.map +1 -1
  23. package/dist/lib/binary_writer.d.ts +2 -1
  24. package/dist/lib/binary_writer.d.ts.map +1 -1
  25. package/dist/lib/filter.d.ts +2 -1
  26. package/dist/lib/filter.d.ts.map +1 -1
  27. package/dist/lib/query.d.ts +10 -5
  28. package/dist/lib/query.d.ts.map +1 -1
  29. package/dist/lib/table.d.ts +12 -1
  30. package/dist/lib/table.d.ts.map +1 -1
  31. package/dist/min/index.browser.mjs +1 -1
  32. package/dist/min/index.browser.mjs.map +1 -1
  33. package/dist/min/react/index.mjs +1 -1
  34. package/dist/min/react/index.mjs.map +1 -1
  35. package/dist/min/sdk/index.browser.mjs +1 -1
  36. package/dist/min/sdk/index.browser.mjs.map +1 -1
  37. package/dist/react/index.cjs +62 -6
  38. package/dist/react/index.cjs.map +1 -1
  39. package/dist/react/index.d.ts +1 -0
  40. package/dist/react/index.d.ts.map +1 -1
  41. package/dist/react/index.mjs +62 -7
  42. package/dist/react/index.mjs.map +1 -1
  43. package/dist/react/useProcedure.d.ts +4 -0
  44. package/dist/react/useProcedure.d.ts.map +1 -0
  45. package/dist/react/useTable.d.ts +2 -0
  46. package/dist/react/useTable.d.ts.map +1 -1
  47. package/dist/sdk/db_connection_builder.d.ts +3 -3
  48. package/dist/sdk/db_connection_builder.d.ts.map +1 -1
  49. package/dist/sdk/db_connection_impl.d.ts +3 -3
  50. package/dist/sdk/db_connection_impl.d.ts.map +1 -1
  51. package/dist/sdk/decompress.d.ts +1 -1
  52. package/dist/sdk/decompress.d.ts.map +1 -1
  53. package/dist/sdk/index.browser.mjs +477 -144
  54. package/dist/sdk/index.browser.mjs.map +1 -1
  55. package/dist/sdk/index.cjs +477 -144
  56. package/dist/sdk/index.cjs.map +1 -1
  57. package/dist/sdk/index.mjs +477 -144
  58. package/dist/sdk/index.mjs.map +1 -1
  59. package/dist/sdk/table_cache.d.ts +1 -0
  60. package/dist/sdk/table_cache.d.ts.map +1 -1
  61. package/dist/sdk/type_utils.d.ts +4 -1
  62. package/dist/sdk/type_utils.d.ts.map +1 -1
  63. package/dist/sdk/websocket_decompress_adapter.d.ts +5 -21
  64. package/dist/sdk/websocket_decompress_adapter.d.ts.map +1 -1
  65. package/dist/sdk/websocket_protocols.d.ts +6 -0
  66. package/dist/sdk/websocket_protocols.d.ts.map +1 -0
  67. package/dist/sdk/websocket_test_adapter.d.ts +14 -18
  68. package/dist/sdk/websocket_test_adapter.d.ts.map +1 -1
  69. package/dist/sdk/websocket_v3_frames.d.ts +9 -0
  70. package/dist/sdk/websocket_v3_frames.d.ts.map +1 -0
  71. package/dist/sdk/ws.d.ts +26 -1
  72. package/dist/sdk/ws.d.ts.map +1 -1
  73. package/dist/server/http_internal.d.ts.map +1 -1
  74. package/dist/server/index.d.ts +2 -1
  75. package/dist/server/index.d.ts.map +1 -1
  76. package/dist/server/index.mjs +76 -15
  77. package/dist/server/index.mjs.map +1 -1
  78. package/dist/server/runtime.d.ts +29 -2
  79. package/dist/server/runtime.d.ts.map +1 -1
  80. package/dist/svelte/index.cjs +9 -3
  81. package/dist/svelte/index.cjs.map +1 -1
  82. package/dist/svelte/index.mjs +9 -3
  83. package/dist/svelte/index.mjs.map +1 -1
  84. package/dist/tanstack/index.cjs +9 -3
  85. package/dist/tanstack/index.cjs.map +1 -1
  86. package/dist/tanstack/index.mjs +9 -3
  87. package/dist/tanstack/index.mjs.map +1 -1
  88. package/dist/vue/index.cjs +9 -3
  89. package/dist/vue/index.cjs.map +1 -1
  90. package/dist/vue/index.mjs +9 -3
  91. package/dist/vue/index.mjs.map +1 -1
  92. package/package.json +2 -2
  93. package/src/lib/algebraic_type.ts +5 -1
  94. package/src/lib/binary_reader.ts +5 -2
  95. package/src/lib/binary_writer.ts +7 -1
  96. package/src/lib/filter.ts +12 -1
  97. package/src/lib/query.ts +60 -19
  98. package/src/lib/table.ts +15 -2
  99. package/src/react/index.ts +1 -0
  100. package/src/react/useProcedure.ts +60 -0
  101. package/src/react/useTable.ts +22 -2
  102. package/src/sdk/db_connection_builder.ts +16 -7
  103. package/src/sdk/db_connection_impl.ts +404 -89
  104. package/src/sdk/decompress.ts +7 -23
  105. package/src/sdk/table_cache.ts +5 -5
  106. package/src/sdk/type_utils.ts +10 -1
  107. package/src/sdk/websocket_decompress_adapter.ts +15 -77
  108. package/src/sdk/websocket_protocols.ts +25 -0
  109. package/src/sdk/websocket_test_adapter.ts +65 -29
  110. package/src/sdk/websocket_v3_frames.ts +126 -0
  111. package/src/sdk/ws.ts +81 -3
  112. package/src/server/http_internal.ts +10 -1
  113. package/src/server/index.ts +2 -1
  114. package/src/server/runtime.ts +39 -1
  115. package/src/server/sys.d.ts +4 -0
  116. package/src/server/view.test-d.ts +4 -0
@@ -429,8 +429,8 @@ var BinaryReader = class {
429
429
  this.view = input instanceof DataView ? input : new DataView(input.buffer, input.byteOffset, input.byteLength);
430
430
  this.offset = 0;
431
431
  }
432
- reset(view) {
433
- this.view = view;
432
+ reset(input) {
433
+ this.view = input instanceof DataView ? input : new DataView(input.buffer, input.byteOffset, input.byteLength);
434
434
  this.offset = 0;
435
435
  }
436
436
  get remaining() {
@@ -622,6 +622,11 @@ var BinaryWriter = class {
622
622
  this.view.setUint8(this.offset, value);
623
623
  this.offset += 1;
624
624
  }
625
+ writeBytes(value) {
626
+ this.expandBuffer(value.length);
627
+ new Uint8Array(this.buffer.buffer, this.offset, value.length).set(value);
628
+ this.offset += value.length;
629
+ }
625
630
  writeI8(value) {
626
631
  this.expandBuffer(1);
627
632
  this.view.setInt8(this.offset, value);
@@ -1147,7 +1152,8 @@ writer.offset += ${primitiveSizes[tag]};` : `writer.write${tag}(value.${name});`
1147
1152
  const result = { ${ty.elements.map(getElementInitializer).join(", ")} };
1148
1153
  const view = reader.view;
1149
1154
  ${ty.elements.map(
1150
- ({ name, algebraicType: { tag } }) => tag in primitiveJSName ? `result.${name} = view.get${primitiveJSName[tag]}(reader.offset, ${primitiveSizes[tag] > 1 ? "true" : ""});
1155
+ ({ name, algebraicType: { tag } }) => tag in primitiveJSName ? tag === "Bool" ? `result.${name} = view.getUint8(reader.offset) !== 0;
1156
+ reader.offset += 1;` : `result.${name} = view.get${primitiveJSName[tag]}(reader.offset, ${primitiveSizes[tag] > 1 ? "true" : ""});
1151
1157
  reader.offset += ${primitiveSizes[tag]};` : `result.${name} = reader.read${tag}();`
1152
1158
  ).join("\n")}
1153
1159
  return result;`;
@@ -1693,6 +1699,7 @@ function classifyMembership(whereExpr, oldRow, newRow) {
1693
1699
  return "stayOut";
1694
1700
  }
1695
1701
  function useTable(query, callbacks) {
1702
+ const enabled = callbacks?.enabled ?? true;
1696
1703
  const accessorName = getQueryAccessorName(query);
1697
1704
  const whereExpr = getQueryWhereClause(query);
1698
1705
  const [subscribeApplied, setSubscribeApplied] = useState(false);
@@ -1708,6 +1715,9 @@ function useTable(query, callbacks) {
1708
1715
  const latestTransactionEventId = useRef(null);
1709
1716
  const lastSnapshotRef = useRef(null);
1710
1717
  const computeSnapshot = useCallback(() => {
1718
+ if (!enabled) {
1719
+ return [[], true];
1720
+ }
1711
1721
  const connection = connectionState.getConnection();
1712
1722
  if (!connection) {
1713
1723
  return [[], false];
@@ -1717,11 +1727,15 @@ function useTable(query, callbacks) {
1717
1727
  (row) => evaluateBooleanExpr(whereExpr, row)
1718
1728
  ) : Array.from(table.iter());
1719
1729
  return [result, subscribeApplied];
1720
- }, [connectionState, accessorName, querySql, subscribeApplied]);
1730
+ }, [connectionState, accessorName, querySql, subscribeApplied, enabled]);
1721
1731
  useEffect(() => {
1722
1732
  lastSnapshotRef.current = null;
1723
1733
  }, [computeSnapshot]);
1724
1734
  useEffect(() => {
1735
+ if (!enabled) {
1736
+ setSubscribeApplied(false);
1737
+ return;
1738
+ }
1725
1739
  const connection = connectionState.getConnection();
1726
1740
  if (connectionState.isActive && connection) {
1727
1741
  const cancel = connection.subscriptionBuilder().onApplied(() => {
@@ -1731,9 +1745,13 @@ function useTable(query, callbacks) {
1731
1745
  cancel.unsubscribe();
1732
1746
  };
1733
1747
  }
1734
- }, [querySql, connectionState.isActive, connectionState]);
1748
+ }, [querySql, connectionState.isActive, connectionState, enabled]);
1735
1749
  const subscribe = useCallback(
1736
1750
  (onStoreChange) => {
1751
+ if (!enabled) {
1752
+ return () => {
1753
+ };
1754
+ }
1737
1755
  const onInsert = (ctx, row) => {
1738
1756
  if (whereExpr && !evaluateBooleanExpr(whereExpr, row)) {
1739
1757
  return;
@@ -1792,14 +1810,18 @@ function useTable(query, callbacks) {
1792
1810
  table.removeOnUpdate?.(onUpdate);
1793
1811
  };
1794
1812
  },
1813
+ // TODO: investigating refactoring so that this is no longer necessary, as we have had genuine bugs with missed deps.
1814
+ // See https://github.com/clockworklabs/SpacetimeDB/pull/4580.
1795
1815
  // eslint-disable-next-line react-hooks/exhaustive-deps
1796
1816
  [
1797
1817
  connectionState,
1798
1818
  accessorName,
1799
1819
  querySql,
1820
+ computeSnapshot,
1800
1821
  callbacks?.onDelete,
1801
1822
  callbacks?.onInsert,
1802
- callbacks?.onUpdate
1823
+ callbacks?.onUpdate,
1824
+ enabled
1803
1825
  ]
1804
1826
  );
1805
1827
  const getSnapshot = useCallback(() => {
@@ -1841,7 +1863,40 @@ function useReducer(reducerDef) {
1841
1863
  [getConnection, reducerName]
1842
1864
  );
1843
1865
  }
1866
+ function useProcedure(procedureDef) {
1867
+ const { getConnection, isActive } = useSpacetimeDB();
1868
+ const procedureName = procedureDef.accessorName;
1869
+ const queueRef = useRef([]);
1870
+ useEffect(() => {
1871
+ const conn = getConnection();
1872
+ if (!conn) {
1873
+ return;
1874
+ }
1875
+ const fn = conn.procedures[procedureName];
1876
+ if (queueRef.current.length) {
1877
+ const pending = queueRef.current.splice(0);
1878
+ for (const item of pending) {
1879
+ fn(...item.params).then(item.resolve, item.reject);
1880
+ }
1881
+ }
1882
+ }, [getConnection, procedureName, isActive]);
1883
+ return useCallback(
1884
+ (...params) => {
1885
+ const conn = getConnection();
1886
+ if (!conn) {
1887
+ return new Promise(
1888
+ (resolve, reject) => {
1889
+ queueRef.current.push({ params, resolve, reject });
1890
+ }
1891
+ );
1892
+ }
1893
+ const fn = conn.procedures[procedureName];
1894
+ return fn(...params);
1895
+ },
1896
+ [getConnection, procedureName]
1897
+ );
1898
+ }
1844
1899
 
1845
- export { SpacetimeDBProvider, useReducer, useSpacetimeDB, useTable };
1900
+ export { SpacetimeDBProvider, useProcedure, useReducer, useSpacetimeDB, useTable };
1846
1901
  //# sourceMappingURL=index.mjs.map
1847
1902
  //# sourceMappingURL=index.mjs.map