rwsdk 1.5.5 → 1.5.6

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.
@@ -201,6 +201,34 @@ describe("client-core", () => {
201
201
  serverSockets[0].close();
202
202
  await expect(getStatePromise).rejects.toThrow("WebSocket closed");
203
203
  });
204
+ it("resolves getState with undefined when the server has no state", async () => {
205
+ const client = createClient();
206
+ const getStatePromise = client.getState("counter");
207
+ await waitForOpen(clients[0]);
208
+ const serverSocket = await waitForCondition(() => serverSockets[0]);
209
+ await waitForCondition(() => serverMessages[0].length >= 1 ? serverMessages[0] : undefined);
210
+ expect(serverMessages[0][0]).toMatchObject({
211
+ v: 1,
212
+ kind: "getState",
213
+ key: "counter",
214
+ });
215
+ // When the server has no state it sends a getState response with no value
216
+ // property (because JSON.stringify omits undefined values).
217
+ send(serverSocket, {
218
+ kind: "getState",
219
+ key: "counter",
220
+ id: serverMessages[0][0].id,
221
+ });
222
+ await wait(0);
223
+ await vi.advanceTimersByTimeAsync(PENDING_REQUEST_TIMEOUT_MS + 1000);
224
+ await expect(getStatePromise).resolves.toBeUndefined();
225
+ // The pending timeout should not fire; the socket should stay open.
226
+ const firstSocket = clients[0];
227
+ const closeSpy = vi.fn();
228
+ firstSocket.once("close", closeSpy);
229
+ await vi.advanceTimersByTimeAsync(PENDING_REQUEST_TIMEOUT_MS + 1000);
230
+ expect(closeSpy).not.toHaveBeenCalled();
231
+ });
204
232
  it("queues messages sent before the socket opens", async () => {
205
233
  const client = createClient();
206
234
  const getStatePromise = client.getState("counter");
@@ -25,7 +25,7 @@ export type ClientMessage = {
25
25
  export type ServerMessage = {
26
26
  kind: "getState";
27
27
  key: string;
28
- value: SyncedStateValue | undefined;
28
+ value?: SyncedStateValue | undefined;
29
29
  id: string;
30
30
  } | {
31
31
  kind: "setState";
@@ -42,7 +42,7 @@ export type ServerMessage = {
42
42
  } | {
43
43
  kind: "update";
44
44
  key: string;
45
- value: SyncedStateValue;
45
+ value?: SyncedStateValue;
46
46
  } | {
47
47
  kind: "error";
48
48
  message: string;
@@ -26,13 +26,16 @@ function isClientMessage(message) {
26
26
  function isServerMessage(message) {
27
27
  switch (message.kind) {
28
28
  case "getState":
29
- return "id" in message && typeof message.id === "string" && "value" in message;
29
+ return ("id" in message &&
30
+ typeof message.id === "string" &&
31
+ "key" in message &&
32
+ typeof message.key === "string");
30
33
  case "setState":
31
34
  case "subscribe":
32
35
  case "unsubscribe":
33
36
  return "id" in message && typeof message.id === "string";
34
37
  case "update":
35
- return "value" in message;
38
+ return "key" in message && typeof message.key === "string";
36
39
  case "error":
37
40
  return "message" in message && typeof message.message === "string";
38
41
  default:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rwsdk",
3
- "version": "1.5.5",
3
+ "version": "1.5.6",
4
4
  "description": "Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime",
5
5
  "type": "module",
6
6
  "bin": {