Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/react-peer-dep.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"partysocket": patch
---

Declare `react` as an optional peer dependency so strict package managers like pnpm correctly resolve it for the `partysocket/react` and `partysocket/use-ws` subpath exports.
2 changes: 1 addition & 1 deletion fixtures/hono/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ app.use(
"*",
partyserverMiddleware<{ Bindings: Bindings }>({
options: {
onBeforeConnect(req, lobby, c) {
onBeforeConnect(req, _lobby, c) {
const url = new URL(req.url);
const token = url.searchParams.get("token");
if (!token) {
Expand Down
8 changes: 8 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions packages/partysocket/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,14 @@
"dependencies": {
"event-target-polyfill": "^0.0.4"
},
"peerDependencies": {
"react": ">=17"
},
"peerDependenciesMeta": {
"react": {
"optional": true
}
},
"devDependencies": {
"@testing-library/react": "^16.3.1",
"@types/ws": "^8.18.1"
Expand Down
8 changes: 4 additions & 4 deletions packages/partysocket/src/tests/react-hooks.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import { renderHook, waitFor } from "@testing-library/react";
import React from "react";
import { afterAll, beforeAll, describe, expect, test, vitest } from "vitest";
import { WebSocketServer } from "ws";
import { type WebSocket as WsWebSocket, WebSocketServer } from "ws";

import usePartySocket, { useWebSocket } from "../react";

Expand Down Expand Up @@ -320,7 +320,7 @@ describe.skipIf(!!process.env.GITHUB_ACTIONS)("usePartySocket", () => {
const onOpen = vitest.fn();

const connectionPromise = new Promise<void>((resolve) => {
wss.once("connection", (_ws: any) => {
wss.once("connection", (_ws: WsWebSocket) => {
resolve();
});
});
Expand Down Expand Up @@ -355,7 +355,7 @@ describe.skipIf(!!process.env.GITHUB_ACTIONS)("usePartySocket", () => {
const onMessage = vitest.fn();
const testMessage = "hello from server";

const connectionHandler = (ws: any) => {
const connectionHandler = (ws: WsWebSocket) => {
setTimeout(() => {
ws.send(testMessage);
}, 200);
Expand Down Expand Up @@ -453,7 +453,7 @@ describe.skipIf(!!process.env.GITHUB_ACTIONS)("usePartySocket", () => {
const onMessage1 = vitest.fn();
const onMessage2 = vitest.fn();

const connectionHandler = (ws: any) => {
const connectionHandler = (ws: WsWebSocket) => {
setTimeout(() => ws.send("message1"), 100);
setTimeout(() => ws.send("message2"), 200);
};
Expand Down
6 changes: 5 additions & 1 deletion packages/partysocket/src/use-socket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,12 @@ export function useStableSocket<
// extract enabled with default value of true
const { enabled = true } = options;

// ensure we only reconnect when necessary
// Returns a stable reference to options, only updating when the serialized
// key changes. This avoids reconnecting on every render when callers pass
// an inline options object (new reference each time) whose values haven't
// actually changed.
const shouldReconnect = createOptionsMemoKey(options);
// biome-ignore lint/correctness/useExhaustiveDependencies: shouldReconnect is a serialized key derived from options — we intentionally memo on the key, not the object reference
const socketOptions = useMemo(() => {
return options;
}, [shouldReconnect]);
Expand Down
Loading