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
@@ -450,8 +450,8 @@ var BinaryReader = class {
450
450
  this.view = input instanceof DataView ? input : new DataView(input.buffer, input.byteOffset, input.byteLength);
451
451
  this.offset = 0;
452
452
  }
453
- reset(view) {
454
- this.view = view;
453
+ reset(input) {
454
+ this.view = input instanceof DataView ? input : new DataView(input.buffer, input.byteOffset, input.byteLength);
455
455
  this.offset = 0;
456
456
  }
457
457
  get remaining() {
@@ -643,6 +643,11 @@ var BinaryWriter = class {
643
643
  this.view.setUint8(this.offset, value);
644
644
  this.offset += 1;
645
645
  }
646
+ writeBytes(value) {
647
+ this.expandBuffer(value.length);
648
+ new Uint8Array(this.buffer.buffer, this.offset, value.length).set(value);
649
+ this.offset += value.length;
650
+ }
646
651
  writeI8(value) {
647
652
  this.expandBuffer(1);
648
653
  this.view.setInt8(this.offset, value);
@@ -1168,7 +1173,8 @@ writer.offset += ${primitiveSizes[tag]};` : `writer.write${tag}(value.${name});`
1168
1173
  const result = { ${ty.elements.map(getElementInitializer).join(", ")} };
1169
1174
  const view = reader.view;
1170
1175
  ${ty.elements.map(
1171
- ({ name, algebraicType: { tag } }) => tag in primitiveJSName ? `result.${name} = view.get${primitiveJSName[tag]}(reader.offset, ${primitiveSizes[tag] > 1 ? "true" : ""});
1176
+ ({ name, algebraicType: { tag } }) => tag in primitiveJSName ? tag === "Bool" ? `result.${name} = view.getUint8(reader.offset) !== 0;
1177
+ reader.offset += 1;` : `result.${name} = view.get${primitiveJSName[tag]}(reader.offset, ${primitiveSizes[tag] > 1 ? "true" : ""});
1172
1178
  reader.offset += ${primitiveSizes[tag]};` : `result.${name} = reader.read${tag}();`
1173
1179
  ).join("\n")}
1174
1180
  return result;`;
@@ -1714,6 +1720,7 @@ function classifyMembership(whereExpr, oldRow, newRow) {
1714
1720
  return "stayOut";
1715
1721
  }
1716
1722
  function useTable(query, callbacks) {
1723
+ const enabled = callbacks?.enabled ?? true;
1717
1724
  const accessorName = getQueryAccessorName(query);
1718
1725
  const whereExpr = getQueryWhereClause(query);
1719
1726
  const [subscribeApplied, setSubscribeApplied] = React.useState(false);
@@ -1729,6 +1736,9 @@ function useTable(query, callbacks) {
1729
1736
  const latestTransactionEventId = React.useRef(null);
1730
1737
  const lastSnapshotRef = React.useRef(null);
1731
1738
  const computeSnapshot = React.useCallback(() => {
1739
+ if (!enabled) {
1740
+ return [[], true];
1741
+ }
1732
1742
  const connection = connectionState.getConnection();
1733
1743
  if (!connection) {
1734
1744
  return [[], false];
@@ -1738,11 +1748,15 @@ function useTable(query, callbacks) {
1738
1748
  (row) => evaluateBooleanExpr(whereExpr, row)
1739
1749
  ) : Array.from(table.iter());
1740
1750
  return [result, subscribeApplied];
1741
- }, [connectionState, accessorName, querySql, subscribeApplied]);
1751
+ }, [connectionState, accessorName, querySql, subscribeApplied, enabled]);
1742
1752
  React.useEffect(() => {
1743
1753
  lastSnapshotRef.current = null;
1744
1754
  }, [computeSnapshot]);
1745
1755
  React.useEffect(() => {
1756
+ if (!enabled) {
1757
+ setSubscribeApplied(false);
1758
+ return;
1759
+ }
1746
1760
  const connection = connectionState.getConnection();
1747
1761
  if (connectionState.isActive && connection) {
1748
1762
  const cancel = connection.subscriptionBuilder().onApplied(() => {
@@ -1752,9 +1766,13 @@ function useTable(query, callbacks) {
1752
1766
  cancel.unsubscribe();
1753
1767
  };
1754
1768
  }
1755
- }, [querySql, connectionState.isActive, connectionState]);
1769
+ }, [querySql, connectionState.isActive, connectionState, enabled]);
1756
1770
  const subscribe = React.useCallback(
1757
1771
  (onStoreChange) => {
1772
+ if (!enabled) {
1773
+ return () => {
1774
+ };
1775
+ }
1758
1776
  const onInsert = (ctx, row) => {
1759
1777
  if (whereExpr && !evaluateBooleanExpr(whereExpr, row)) {
1760
1778
  return;
@@ -1813,14 +1831,18 @@ function useTable(query, callbacks) {
1813
1831
  table.removeOnUpdate?.(onUpdate);
1814
1832
  };
1815
1833
  },
1834
+ // TODO: investigating refactoring so that this is no longer necessary, as we have had genuine bugs with missed deps.
1835
+ // See https://github.com/clockworklabs/SpacetimeDB/pull/4580.
1816
1836
  // eslint-disable-next-line react-hooks/exhaustive-deps
1817
1837
  [
1818
1838
  connectionState,
1819
1839
  accessorName,
1820
1840
  querySql,
1841
+ computeSnapshot,
1821
1842
  callbacks?.onDelete,
1822
1843
  callbacks?.onInsert,
1823
- callbacks?.onUpdate
1844
+ callbacks?.onUpdate,
1845
+ enabled
1824
1846
  ]
1825
1847
  );
1826
1848
  const getSnapshot = React.useCallback(() => {
@@ -1862,8 +1884,42 @@ function useReducer(reducerDef) {
1862
1884
  [getConnection, reducerName]
1863
1885
  );
1864
1886
  }
1887
+ function useProcedure(procedureDef) {
1888
+ const { getConnection, isActive } = useSpacetimeDB();
1889
+ const procedureName = procedureDef.accessorName;
1890
+ const queueRef = React.useRef([]);
1891
+ React.useEffect(() => {
1892
+ const conn = getConnection();
1893
+ if (!conn) {
1894
+ return;
1895
+ }
1896
+ const fn = conn.procedures[procedureName];
1897
+ if (queueRef.current.length) {
1898
+ const pending = queueRef.current.splice(0);
1899
+ for (const item of pending) {
1900
+ fn(...item.params).then(item.resolve, item.reject);
1901
+ }
1902
+ }
1903
+ }, [getConnection, procedureName, isActive]);
1904
+ return React.useCallback(
1905
+ (...params) => {
1906
+ const conn = getConnection();
1907
+ if (!conn) {
1908
+ return new Promise(
1909
+ (resolve, reject) => {
1910
+ queueRef.current.push({ params, resolve, reject });
1911
+ }
1912
+ );
1913
+ }
1914
+ const fn = conn.procedures[procedureName];
1915
+ return fn(...params);
1916
+ },
1917
+ [getConnection, procedureName]
1918
+ );
1919
+ }
1865
1920
 
1866
1921
  exports.SpacetimeDBProvider = SpacetimeDBProvider;
1922
+ exports.useProcedure = useProcedure;
1867
1923
  exports.useReducer = useReducer;
1868
1924
  exports.useSpacetimeDB = useSpacetimeDB;
1869
1925
  exports.useTable = useTable;