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
|
|
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
|
|
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 &&
|
|
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 "
|
|
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:
|