New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

partysocket

Package Overview
Dependencies
Maintainers
1
Versions
933
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

partysocket - npm Package Compare versions

Comparing version

to
0.0.0-3eade95

dist/chunk-4SNNYC7I.mjs

154

dist/index.js

@@ -23,2 +23,3 @@ "use strict";

__export(src_exports, {
PartySocket: () => PartySocket,
WebSocket: () => ReconnectingWebSocket,

@@ -33,17 +34,7 @@ default: () => PartySocket

PartySocket requires a global 'EventTarget' class to be available!
You can use the 'event-target-shim' package to polyfill this. See https://www.npmjs.com/package/event-target-shim.
First, run:
You can polyfill this global by adding this to your code before any partysocket imports:
\`\`\`
npm install event-target-shim
import 'partysocket/event-target-polyfill';
\`\`\`
Then, add this in your code:
\`\`\`
import {Event, EventTarget} from 'event-target-shim';
if(!globalThis.Event) {
globalThis.Event = Event;
}
if(!globalThis.EventTarget) {
globalThis.EventTarget = EventTarget;
}
\`\`\`
Please file an issue at https://github.com/partykit/partykit if you're still having trouble.

@@ -85,15 +76,21 @@ `);

function cloneEventNode(e) {
const evt = new Event(e.type, e);
if ("data" in e) {
evt.data = e.data;
const evt2 = new MessageEvent(e.type, e);
return evt2;
}
if ("code" in e) {
evt.code = e.code;
if ("code" in e || "reason" in e) {
const evt2 = new CloseEvent(
// @ts-expect-error we need to fix event/listener types
e.code || 1999,
// @ts-expect-error we need to fix event/listener types
e.reason || "unknown reason",
e
);
return evt2;
}
if ("reason" in e) {
evt.reason = e.reason;
}
if ("error" in e) {
evt.error = e.error;
const evt2 = new ErrorEvent(e.error, e);
return evt2;
}
const evt = new Event(e.type, e);
return evt;

@@ -114,2 +111,3 @@ }

};
var didWarnAboutMissingWebSocket = false;
var ReconnectingWebSocket = class _ReconnectingWebSocket extends EventTarget {

@@ -125,2 +123,3 @@ _ws;

_messageQueue = [];
_debugLogger = console.log.bind(console);
_url;

@@ -137,2 +136,5 @@ _protocols;

}
if (this._options.debugLogger) {
this._debugLogger = this._options.debugLogger;
}
this._connect();

@@ -301,3 +303,3 @@ }

if (this._options.debug) {
console.log.apply(console, ["RWS>", ...args]);
this._debugLogger("RWS>", ...args);
}

@@ -327,4 +329,3 @@ }

_getNextProtocols(protocolsProvider) {
if (!protocolsProvider)
return Promise.resolve(null);
if (!protocolsProvider) return Promise.resolve(null);
if (typeof protocolsProvider === "string" || Array.isArray(protocolsProvider)) {

@@ -335,4 +336,3 @@ return Promise.resolve(protocolsProvider);

const protocols = protocolsProvider();
if (!protocols)
return Promise.resolve(null);
if (!protocols) return Promise.resolve(null);
if (typeof protocols === "string" || Array.isArray(protocols)) {

@@ -388,2 +388,19 @@ return Promise.resolve(protocols);

}
if (!this._options.WebSocket && typeof WebSocket === "undefined" && !didWarnAboutMissingWebSocket) {
console.error(`\u203C\uFE0F No WebSocket implementation available. You should define options.WebSocket.
For example, if you're using node.js, run \`npm install ws\`, and then in your code:
import PartySocket from 'partysocket';
import WS from 'ws';
const partysocket = new PartySocket({
host: "127.0.0.1:1999",
room: "test-room",
WebSocket: WS
});
`);
didWarnAboutMissingWebSocket = true;
}
const WS = this._options.WebSocket || WebSocket;

@@ -522,2 +539,3 @@ this._debug("connect", { url, protocols });

party,
prefix,
query

@@ -534,3 +552,3 @@ } = partySocketOptions;

const path = rawPath ? `/${rawPath}` : "";
const protocol = rawProtocol || (host.startsWith("localhost:") || host.startsWith("127.0.0.1:") ? (
const protocol = rawProtocol || (host.startsWith("localhost:") || host.startsWith("127.0.0.1:") || host.startsWith("192.168.") || host.startsWith("10.") || host.startsWith("172.") && host.split(".")[1] >= "16" && host.split(".")[1] <= "31" || host.startsWith("[::ffff:7f00:1]:") ? (
// http / ws

@@ -542,3 +560,3 @@ defaultProtocol

));
const baseUrl = `${protocol}://${host}/${party ? `parties/${party}` : "party"}/${room}${path}`;
const baseUrl = `${protocol}://${host}/${prefix || `parties/${name}/${room}`}${path}`;
const makeUrl = (query2 = {}) => `${baseUrl}?${new URLSearchParams([

@@ -561,23 +579,6 @@ ...Object.entries(defaultParams),

constructor(partySocketOptions) {
const {
id,
host: _host,
path: _path,
party: _party,
room: _room,
protocol: _protocol,
query: _query,
protocols,
...socketOptions
} = partySocketOptions;
const _pk = id || generateUUID();
const party = getPartyInfo(partySocketOptions, "ws", { _pk });
super(party.urlProvider, protocols, socketOptions);
const wsOptions = getWSOptions(partySocketOptions);
super(wsOptions.urlProvider, wsOptions.protocols, wsOptions.socketOptions);
this.partySocketOptions = partySocketOptions;
this._pk = _pk;
this._pkurl = party.partyUrl;
this.name = party.name;
this.room = party.room;
this.host = party.host;
this.path = party.path;
this.setWSProperties(wsOptions);
}

@@ -590,2 +591,32 @@ _pk;

path;
updateProperties(partySocketOptions) {
const wsOptions = getWSOptions({
...this.partySocketOptions,
...partySocketOptions,
host: partySocketOptions.host ?? this.host,
room: partySocketOptions.room ?? this.room,
path: partySocketOptions.path ?? this.path
});
this._url = wsOptions.urlProvider;
this._protocols = wsOptions.protocols;
this._options = wsOptions.socketOptions;
this.setWSProperties(wsOptions);
}
setWSProperties(wsOptions) {
const { _pk, _pkurl, name, room, host, path } = wsOptions;
this._pk = _pk;
this._pkurl = _pkurl;
this.name = name;
this.room = room;
this.host = host;
this.path = path;
}
reconnect(code, reason) {
if (!this.room || !this.host) {
throw new Error(
"The room and host must be set before connecting, use `updateProperties` method to set them or pass them to the constructor."
);
}
super.reconnect(code, reason);
}
get id() {

@@ -609,4 +640,31 @@ return this._pk;

};
function getWSOptions(partySocketOptions) {
const {
id,
host: _host,
path: _path,
party: _party,
room: _room,
protocol: _protocol,
query: _query,
protocols,
...socketOptions
} = partySocketOptions;
const _pk = id || generateUUID();
const party = getPartyInfo(partySocketOptions, "ws", { _pk });
return {
_pk,
_pkurl: party.partyUrl,
name: party.name,
room: party.room,
host: party.host,
path: party.path,
protocols,
socketOptions,
urlProvider: party.urlProvider
};
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
PartySocket,
WebSocket

@@ -613,0 +671,0 @@ });

@@ -33,17 +33,7 @@ "use strict";

PartySocket requires a global 'EventTarget' class to be available!
You can use the 'event-target-shim' package to polyfill this. See https://www.npmjs.com/package/event-target-shim.
First, run:
You can polyfill this global by adding this to your code before any partysocket imports:
\`\`\`
npm install event-target-shim
import 'partysocket/event-target-polyfill';
\`\`\`
Then, add this in your code:
\`\`\`
import {Event, EventTarget} from 'event-target-shim';
if(!globalThis.Event) {
globalThis.Event = Event;
}
if(!globalThis.EventTarget) {
globalThis.EventTarget = EventTarget;
}
\`\`\`
Please file an issue at https://github.com/partykit/partykit if you're still having trouble.

@@ -85,15 +75,21 @@ `);

function cloneEventNode(e) {
const evt = new Event(e.type, e);
if ("data" in e) {
evt.data = e.data;
const evt2 = new MessageEvent(e.type, e);
return evt2;
}
if ("code" in e) {
evt.code = e.code;
if ("code" in e || "reason" in e) {
const evt2 = new CloseEvent(
// @ts-expect-error we need to fix event/listener types
e.code || 1999,
// @ts-expect-error we need to fix event/listener types
e.reason || "unknown reason",
e
);
return evt2;
}
if ("reason" in e) {
evt.reason = e.reason;
}
if ("error" in e) {
evt.error = e.error;
const evt2 = new ErrorEvent(e.error, e);
return evt2;
}
const evt = new Event(e.type, e);
return evt;

@@ -114,2 +110,3 @@ }

};
var didWarnAboutMissingWebSocket = false;
var ReconnectingWebSocket = class _ReconnectingWebSocket extends EventTarget {

@@ -125,2 +122,3 @@ _ws;

_messageQueue = [];
_debugLogger = console.log.bind(console);
_url;

@@ -137,2 +135,5 @@ _protocols;

}
if (this._options.debugLogger) {
this._debugLogger = this._options.debugLogger;
}
this._connect();

@@ -301,3 +302,3 @@ }

if (this._options.debug) {
console.log.apply(console, ["RWS>", ...args]);
this._debugLogger("RWS>", ...args);
}

@@ -327,4 +328,3 @@ }

_getNextProtocols(protocolsProvider) {
if (!protocolsProvider)
return Promise.resolve(null);
if (!protocolsProvider) return Promise.resolve(null);
if (typeof protocolsProvider === "string" || Array.isArray(protocolsProvider)) {

@@ -335,4 +335,3 @@ return Promise.resolve(protocolsProvider);

const protocols = protocolsProvider();
if (!protocols)
return Promise.resolve(null);
if (!protocols) return Promise.resolve(null);
if (typeof protocols === "string" || Array.isArray(protocols)) {

@@ -388,2 +387,19 @@ return Promise.resolve(protocols);

}
if (!this._options.WebSocket && typeof WebSocket === "undefined" && !didWarnAboutMissingWebSocket) {
console.error(`\u203C\uFE0F No WebSocket implementation available. You should define options.WebSocket.
For example, if you're using node.js, run \`npm install ws\`, and then in your code:
import PartySocket from 'partysocket';
import WS from 'ws';
const partysocket = new PartySocket({
host: "127.0.0.1:1999",
room: "test-room",
WebSocket: WS
});
`);
didWarnAboutMissingWebSocket = true;
}
const WS = this._options.WebSocket || WebSocket;

@@ -522,2 +538,3 @@ this._debug("connect", { url, protocols });

party,
prefix,
query

@@ -534,3 +551,3 @@ } = partySocketOptions;

const path = rawPath ? `/${rawPath}` : "";
const protocol = rawProtocol || (host.startsWith("localhost:") || host.startsWith("127.0.0.1:") ? (
const protocol = rawProtocol || (host.startsWith("localhost:") || host.startsWith("127.0.0.1:") || host.startsWith("192.168.") || host.startsWith("10.") || host.startsWith("172.") && host.split(".")[1] >= "16" && host.split(".")[1] <= "31" || host.startsWith("[::ffff:7f00:1]:") ? (
// http / ws

@@ -542,3 +559,3 @@ defaultProtocol

));
const baseUrl = `${protocol}://${host}/${party ? `parties/${party}` : "party"}/${room}${path}`;
const baseUrl = `${protocol}://${host}/${prefix || `parties/${name}/${room}`}${path}`;
const makeUrl = (query2 = {}) => `${baseUrl}?${new URLSearchParams([

@@ -561,23 +578,6 @@ ...Object.entries(defaultParams),

constructor(partySocketOptions) {
const {
id,
host: _host,
path: _path,
party: _party,
room: _room,
protocol: _protocol,
query: _query,
protocols,
...socketOptions
} = partySocketOptions;
const _pk = id || generateUUID();
const party = getPartyInfo(partySocketOptions, "ws", { _pk });
super(party.urlProvider, protocols, socketOptions);
const wsOptions = getWSOptions(partySocketOptions);
super(wsOptions.urlProvider, wsOptions.protocols, wsOptions.socketOptions);
this.partySocketOptions = partySocketOptions;
this._pk = _pk;
this._pkurl = party.partyUrl;
this.name = party.name;
this.room = party.room;
this.host = party.host;
this.path = party.path;
this.setWSProperties(wsOptions);
}

@@ -590,2 +590,32 @@ _pk;

path;
updateProperties(partySocketOptions) {
const wsOptions = getWSOptions({
...this.partySocketOptions,
...partySocketOptions,
host: partySocketOptions.host ?? this.host,
room: partySocketOptions.room ?? this.room,
path: partySocketOptions.path ?? this.path
});
this._url = wsOptions.urlProvider;
this._protocols = wsOptions.protocols;
this._options = wsOptions.socketOptions;
this.setWSProperties(wsOptions);
}
setWSProperties(wsOptions) {
const { _pk, _pkurl, name, room, host, path } = wsOptions;
this._pk = _pk;
this._pkurl = _pkurl;
this.name = name;
this.room = room;
this.host = host;
this.path = path;
}
reconnect(code, reason) {
if (!this.room || !this.host) {
throw new Error(
"The room and host must be set before connecting, use `updateProperties` method to set them or pass them to the constructor."
);
}
super.reconnect(code, reason);
}
get id() {

@@ -609,5 +639,54 @@ return this._pk;

};
function getWSOptions(partySocketOptions) {
const {
id,
host: _host,
path: _path,
party: _party,
room: _room,
protocol: _protocol,
query: _query,
protocols,
...socketOptions
} = partySocketOptions;
const _pk = id || generateUUID();
const party = getPartyInfo(partySocketOptions, "ws", { _pk });
return {
_pk,
_pkurl: party.partyUrl,
name: party.name,
room: party.room,
host: party.host,
path: party.path,
protocols,
socketOptions,
urlProvider: party.urlProvider
};
}
// src/use-handlers.ts
var import_react = require("react");
var useAttachWebSocketEventHandlers = (socket, options) => {
const handlersRef = (0, import_react.useRef)(options);
handlersRef.current = options;
(0, import_react.useEffect)(() => {
const onOpen = (event) => handlersRef.current?.onOpen?.(event);
const onMessage = (event) => handlersRef.current?.onMessage?.(event);
const onClose = (event) => handlersRef.current?.onClose?.(event);
const onError = (event) => handlersRef.current?.onError?.(event);
socket.addEventListener("open", onOpen);
socket.addEventListener("close", onClose);
socket.addEventListener("error", onError);
socket.addEventListener("message", onMessage);
return () => {
socket.removeEventListener("open", onOpen);
socket.removeEventListener("close", onClose);
socket.removeEventListener("error", onError);
socket.removeEventListener("message", onMessage);
};
}, [socket]);
};
// src/use-socket.ts
var import_react = require("react");
var import_react2 = require("react");
var getOptionsThatShouldCauseRestartWhenChanged = (options) => [

@@ -630,6 +709,6 @@ options.startClosed,

const shouldReconnect = createOptionsMemoKey(options);
const socketOptions = (0, import_react.useMemo)(() => {
const socketOptions = (0, import_react2.useMemo)(() => {
return options;
}, [shouldReconnect]);
const [socket, setSocket] = (0, import_react.useState)(
const [socket, setSocket] = (0, import_react2.useState)(
() => (

@@ -640,6 +719,6 @@ // only connect on first mount

);
const socketInitializedRef = (0, import_react.useRef)(null);
const createSocketRef = (0, import_react.useRef)(createSocket);
const socketInitializedRef = (0, import_react2.useRef)(null);
const createSocketRef = (0, import_react2.useRef)(createSocket);
createSocketRef.current = createSocket;
(0, import_react.useEffect)(() => {
(0, import_react2.useEffect)(() => {
if (socketInitializedRef.current === socket) {

@@ -666,25 +745,2 @@ const newSocket = createSocketRef.current({

// src/use-handlers.ts
var import_react2 = require("react");
var useAttachWebSocketEventHandlers = (socket, options) => {
const handlersRef = (0, import_react2.useRef)(options);
handlersRef.current = options;
(0, import_react2.useEffect)(() => {
const onOpen = (event) => handlersRef.current?.onOpen?.(event);
const onMessage = (event) => handlersRef.current?.onMessage?.(event);
const onClose = (event) => handlersRef.current?.onClose?.(event);
const onError = (event) => handlersRef.current?.onError?.(event);
socket.addEventListener("open", onOpen);
socket.addEventListener("close", onClose);
socket.addEventListener("error", onError);
socket.addEventListener("message", onMessage);
return () => {
socket.removeEventListener("open", onOpen);
socket.removeEventListener("close", onClose);
socket.removeEventListener("error", onError);
socket.removeEventListener("message", onMessage);
};
}, [socket]);
};
// src/use-ws.ts

@@ -709,4 +765,8 @@ function useWebSocket(url, protocols, options = {}) {

function usePartySocket(options) {
const { host, ...otherOptions } = options;
const socket = useStableSocket({
options,
options: {
host: host || (typeof window !== "undefined" ? window.location.host : "dummy-domain.com"),
...otherOptions
},
createSocket: (options2) => new PartySocket(options2),

@@ -713,0 +773,0 @@ createSocketMemoKey: (options2) => JSON.stringify([

@@ -27,2 +27,78 @@ "use strict";

// src/use-handlers.ts
var import_react = require("react");
var useAttachWebSocketEventHandlers = (socket, options) => {
const handlersRef = (0, import_react.useRef)(options);
handlersRef.current = options;
(0, import_react.useEffect)(() => {
const onOpen = (event) => handlersRef.current?.onOpen?.(event);
const onMessage = (event) => handlersRef.current?.onMessage?.(event);
const onClose = (event) => handlersRef.current?.onClose?.(event);
const onError = (event) => handlersRef.current?.onError?.(event);
socket.addEventListener("open", onOpen);
socket.addEventListener("close", onClose);
socket.addEventListener("error", onError);
socket.addEventListener("message", onMessage);
return () => {
socket.removeEventListener("open", onOpen);
socket.removeEventListener("close", onClose);
socket.removeEventListener("error", onError);
socket.removeEventListener("message", onMessage);
};
}, [socket]);
};
// src/use-socket.ts
var import_react2 = require("react");
var getOptionsThatShouldCauseRestartWhenChanged = (options) => [
options.startClosed,
options.minUptime,
options.maxRetries,
options.connectionTimeout,
options.maxEnqueuedMessages,
options.maxReconnectionDelay,
options.minReconnectionDelay,
options.reconnectionDelayGrowFactor,
options.debug
];
function useStableSocket({
options,
createSocket,
createSocketMemoKey: createOptionsMemoKey
}) {
const shouldReconnect = createOptionsMemoKey(options);
const socketOptions = (0, import_react2.useMemo)(() => {
return options;
}, [shouldReconnect]);
const [socket, setSocket] = (0, import_react2.useState)(
() => (
// only connect on first mount
createSocket({ ...socketOptions, startClosed: true })
)
);
const socketInitializedRef = (0, import_react2.useRef)(null);
const createSocketRef = (0, import_react2.useRef)(createSocket);
createSocketRef.current = createSocket;
(0, import_react2.useEffect)(() => {
if (socketInitializedRef.current === socket) {
const newSocket = createSocketRef.current({
...socketOptions,
// when reconnecting because of options change, we always reconnect
// (startClosed only applies to initial mount)
startClosed: false
});
setSocket(newSocket);
} else {
if (!socketInitializedRef.current && socketOptions.startClosed !== true) {
socket.reconnect();
}
socketInitializedRef.current = socket;
return () => {
socket.close();
};
}
}, [socket, socketOptions]);
return socket;
}
// src/ws.ts

@@ -32,17 +108,7 @@ if (!globalThis.EventTarget || !globalThis.Event) {

PartySocket requires a global 'EventTarget' class to be available!
You can use the 'event-target-shim' package to polyfill this. See https://www.npmjs.com/package/event-target-shim.
First, run:
You can polyfill this global by adding this to your code before any partysocket imports:
\`\`\`
npm install event-target-shim
import 'partysocket/event-target-polyfill';
\`\`\`
Then, add this in your code:
\`\`\`
import {Event, EventTarget} from 'event-target-shim';
if(!globalThis.Event) {
globalThis.Event = Event;
}
if(!globalThis.EventTarget) {
globalThis.EventTarget = EventTarget;
}
\`\`\`
Please file an issue at https://github.com/partykit/partykit if you're still having trouble.

@@ -84,15 +150,21 @@ `);

function cloneEventNode(e) {
const evt = new Event(e.type, e);
if ("data" in e) {
evt.data = e.data;
const evt2 = new MessageEvent(e.type, e);
return evt2;
}
if ("code" in e) {
evt.code = e.code;
if ("code" in e || "reason" in e) {
const evt2 = new CloseEvent(
// @ts-expect-error we need to fix event/listener types
e.code || 1999,
// @ts-expect-error we need to fix event/listener types
e.reason || "unknown reason",
e
);
return evt2;
}
if ("reason" in e) {
evt.reason = e.reason;
}
if ("error" in e) {
evt.error = e.error;
const evt2 = new ErrorEvent(e.error, e);
return evt2;
}
const evt = new Event(e.type, e);
return evt;

@@ -113,2 +185,3 @@ }

};
var didWarnAboutMissingWebSocket = false;
var ReconnectingWebSocket = class _ReconnectingWebSocket extends EventTarget {

@@ -124,2 +197,3 @@ _ws;

_messageQueue = [];
_debugLogger = console.log.bind(console);
_url;

@@ -136,2 +210,5 @@ _protocols;

}
if (this._options.debugLogger) {
this._debugLogger = this._options.debugLogger;
}
this._connect();

@@ -300,3 +377,3 @@ }

if (this._options.debug) {
console.log.apply(console, ["RWS>", ...args]);
this._debugLogger("RWS>", ...args);
}

@@ -326,4 +403,3 @@ }

_getNextProtocols(protocolsProvider) {
if (!protocolsProvider)
return Promise.resolve(null);
if (!protocolsProvider) return Promise.resolve(null);
if (typeof protocolsProvider === "string" || Array.isArray(protocolsProvider)) {

@@ -334,4 +410,3 @@ return Promise.resolve(protocolsProvider);

const protocols = protocolsProvider();
if (!protocols)
return Promise.resolve(null);
if (!protocols) return Promise.resolve(null);
if (typeof protocols === "string" || Array.isArray(protocols)) {

@@ -387,2 +462,19 @@ return Promise.resolve(protocols);

}
if (!this._options.WebSocket && typeof WebSocket === "undefined" && !didWarnAboutMissingWebSocket) {
console.error(`\u203C\uFE0F No WebSocket implementation available. You should define options.WebSocket.
For example, if you're using node.js, run \`npm install ws\`, and then in your code:
import PartySocket from 'partysocket';
import WS from 'ws';
const partysocket = new PartySocket({
host: "127.0.0.1:1999",
room: "test-room",
WebSocket: WS
});
`);
didWarnAboutMissingWebSocket = true;
}
const WS = this._options.WebSocket || WebSocket;

@@ -494,78 +586,2 @@ this._debug("connect", { url, protocols });

// src/use-handlers.ts
var import_react = require("react");
var useAttachWebSocketEventHandlers = (socket, options) => {
const handlersRef = (0, import_react.useRef)(options);
handlersRef.current = options;
(0, import_react.useEffect)(() => {
const onOpen = (event) => handlersRef.current?.onOpen?.(event);
const onMessage = (event) => handlersRef.current?.onMessage?.(event);
const onClose = (event) => handlersRef.current?.onClose?.(event);
const onError = (event) => handlersRef.current?.onError?.(event);
socket.addEventListener("open", onOpen);
socket.addEventListener("close", onClose);
socket.addEventListener("error", onError);
socket.addEventListener("message", onMessage);
return () => {
socket.removeEventListener("open", onOpen);
socket.removeEventListener("close", onClose);
socket.removeEventListener("error", onError);
socket.removeEventListener("message", onMessage);
};
}, [socket]);
};
// src/use-socket.ts
var import_react2 = require("react");
var getOptionsThatShouldCauseRestartWhenChanged = (options) => [
options.startClosed,
options.minUptime,
options.maxRetries,
options.connectionTimeout,
options.maxEnqueuedMessages,
options.maxReconnectionDelay,
options.minReconnectionDelay,
options.reconnectionDelayGrowFactor,
options.debug
];
function useStableSocket({
options,
createSocket,
createSocketMemoKey: createOptionsMemoKey
}) {
const shouldReconnect = createOptionsMemoKey(options);
const socketOptions = (0, import_react2.useMemo)(() => {
return options;
}, [shouldReconnect]);
const [socket, setSocket] = (0, import_react2.useState)(
() => (
// only connect on first mount
createSocket({ ...socketOptions, startClosed: true })
)
);
const socketInitializedRef = (0, import_react2.useRef)(null);
const createSocketRef = (0, import_react2.useRef)(createSocket);
createSocketRef.current = createSocket;
(0, import_react2.useEffect)(() => {
if (socketInitializedRef.current === socket) {
const newSocket = createSocketRef.current({
...socketOptions,
// when reconnecting because of options change, we always reconnect
// (startClosed only applies to initial mount)
startClosed: false
});
setSocket(newSocket);
} else {
if (!socketInitializedRef.current && socketOptions.startClosed !== true) {
socket.reconnect();
}
socketInitializedRef.current = socket;
return () => {
socket.close();
};
}
}, [socket, socketOptions]);
return socket;
}
// src/use-ws.ts

@@ -572,0 +588,0 @@ function useWebSocket(url, protocols, options = {}) {

@@ -31,17 +31,7 @@ "use strict";

PartySocket requires a global 'EventTarget' class to be available!
You can use the 'event-target-shim' package to polyfill this. See https://www.npmjs.com/package/event-target-shim.
First, run:
You can polyfill this global by adding this to your code before any partysocket imports:
\`\`\`
npm install event-target-shim
import 'partysocket/event-target-polyfill';
\`\`\`
Then, add this in your code:
\`\`\`
import {Event, EventTarget} from 'event-target-shim';
if(!globalThis.Event) {
globalThis.Event = Event;
}
if(!globalThis.EventTarget) {
globalThis.EventTarget = EventTarget;
}
\`\`\`
Please file an issue at https://github.com/partykit/partykit if you're still having trouble.

@@ -83,15 +73,21 @@ `);

function cloneEventNode(e) {
const evt = new Event(e.type, e);
if ("data" in e) {
evt.data = e.data;
const evt2 = new MessageEvent(e.type, e);
return evt2;
}
if ("code" in e) {
evt.code = e.code;
if ("code" in e || "reason" in e) {
const evt2 = new CloseEvent(
// @ts-expect-error we need to fix event/listener types
e.code || 1999,
// @ts-expect-error we need to fix event/listener types
e.reason || "unknown reason",
e
);
return evt2;
}
if ("reason" in e) {
evt.reason = e.reason;
}
if ("error" in e) {
evt.error = e.error;
const evt2 = new ErrorEvent(e.error, e);
return evt2;
}
const evt = new Event(e.type, e);
return evt;

@@ -112,2 +108,3 @@ }

};
var didWarnAboutMissingWebSocket = false;
var ReconnectingWebSocket = class _ReconnectingWebSocket extends EventTarget {

@@ -123,2 +120,3 @@ _ws;

_messageQueue = [];
_debugLogger = console.log.bind(console);
_url;

@@ -135,2 +133,5 @@ _protocols;

}
if (this._options.debugLogger) {
this._debugLogger = this._options.debugLogger;
}
this._connect();

@@ -299,3 +300,3 @@ }

if (this._options.debug) {
console.log.apply(console, ["RWS>", ...args]);
this._debugLogger("RWS>", ...args);
}

@@ -325,4 +326,3 @@ }

_getNextProtocols(protocolsProvider) {
if (!protocolsProvider)
return Promise.resolve(null);
if (!protocolsProvider) return Promise.resolve(null);
if (typeof protocolsProvider === "string" || Array.isArray(protocolsProvider)) {

@@ -333,4 +333,3 @@ return Promise.resolve(protocolsProvider);

const protocols = protocolsProvider();
if (!protocols)
return Promise.resolve(null);
if (!protocols) return Promise.resolve(null);
if (typeof protocols === "string" || Array.isArray(protocols)) {

@@ -386,2 +385,19 @@ return Promise.resolve(protocols);

}
if (!this._options.WebSocket && typeof WebSocket === "undefined" && !didWarnAboutMissingWebSocket) {
console.error(`\u203C\uFE0F No WebSocket implementation available. You should define options.WebSocket.
For example, if you're using node.js, run \`npm install ws\`, and then in your code:
import PartySocket from 'partysocket';
import WS from 'ws';
const partysocket = new PartySocket({
host: "127.0.0.1:1999",
room: "test-room",
WebSocket: WS
});
`);
didWarnAboutMissingWebSocket = true;
}
const WS = this._options.WebSocket || WebSocket;

@@ -388,0 +404,0 @@ this._debug("connect", { url, protocols });

@@ -8,4 +8,5 @@ import ReconnectingWebSocket, { Options } from './ws.js';

host: string;
room: string;
room?: string;
party?: string;
prefix?: string;
protocol?: "ws" | "wss";

@@ -20,2 +21,3 @@ protocols?: string[];

party?: string;
prefix?: string;
path?: string;

@@ -31,6 +33,9 @@ protocol?: "http" | "https";

name: string;
room: string;
room?: string;
host: string;
path: string;
constructor(partySocketOptions: PartySocketOptions);
updateProperties(partySocketOptions: Partial<PartySocketOptions>): void;
private setWSProperties;
reconnect(code?: number | undefined, reason?: string | undefined): void;
get id(): string;

@@ -45,2 +50,2 @@ /**

export { type PartyFetchOptions, type PartySocketOptions, ReconnectingWebSocket as WebSocket, PartySocket as default };
export { type PartyFetchOptions, PartySocket, type PartySocketOptions, ReconnectingWebSocket as WebSocket, PartySocket as default };
{
"name": "partysocket",
"version": "0.0.0-3d4012c",
"description": "party hotline",
"version": "0.0.0-3eade95",
"description": "A better WebSocket that Just Works™",
"homepage": "https://docs.partykit.io/reference/partysocket-api",
"bugs": "https://github.com/partykit/partykit/issues",
"main": "./dist/index.js",

@@ -27,2 +29,7 @@ "module": "./dist/index.mjs",

"require": "./dist/use-ws.js"
},
"./event-target-polyfill": {
"types": "./event-target-polyfill.d.ts",
"import": "./dist/event-target-polyfill.mjs",
"require": "./dist/event-target-polyfill.js"
}

@@ -35,3 +42,4 @@ },

"src/ws.ts",
"src/use-ws.ts"
"src/use-ws.ts",
"src/event-target-polyfill.ts"
],

@@ -45,4 +53,4 @@ "format": [

"scripts": {
"clean": "shx rm -rf dist *.d.ts",
"post-build": "shx mv dist/*.d.ts* .",
"clean": "shx rm -rf dist *.d.ts *.d.mts event-target-polyfill.*",
"post-build": "shx mv dist/*.d.ts dist/*.d.mts* . && shx mv dist/event-target-polyfill.* .",
"build": "npm run clean && tsup --external react && npm run post-build",

@@ -53,7 +61,26 @@ "test": "echo \"Error: no test specified\" && exit 1"

"dist",
"*.d.ts"
"*.d.ts",
"event-target-polyfill.*"
],
"keywords": [],
"keywords": [
"websocket",
"client",
"reconnecting",
"reconnection",
"reconnect",
"forever",
"persistent",
"forever",
"automatic"
],
"repository": {
"type": "git",
"url": "https://github.com/partykit/partykit.git",
"directory": "packages/partykit"
},
"author": "",
"license": "ISC"
"license": "ISC",
"dependencies": {
"event-target-shim": "^6.0.2"
}
}

@@ -1,9 +0,11 @@

import PartySocket, { PartySocketOptions } from './index.js';
import { E as EventHandlerOptions } from './use-ws-YFPmbpmh.js';
export { u as useWebSocket } from './use-ws-YFPmbpmh.js';
import { PartySocket, PartySocketOptions } from './index.js';
import { E as EventHandlerOptions } from './use-ws-CnrrNZS2.js';
export { u as useWebSocket } from './use-ws-CnrrNZS2.js';
import './ws.js';
type UsePartySocketOptions = PartySocketOptions & EventHandlerOptions;
type UsePartySocketOptions = Omit<PartySocketOptions, "host"> & EventHandlerOptions & {
host?: string | undefined;
};
declare function usePartySocket(options: UsePartySocketOptions): PartySocket;
export { usePartySocket as default, usePartySocket };

@@ -49,2 +49,5 @@ # PartySocket

// optional: only needed if creating using inside node.js. Run `npm install ws`, and then add:
// import WS from "ws";
const ws = new PartySocket({

@@ -55,4 +58,15 @@ host: "project.name.partykit.dev", // or localhost:1999 in dev

// if not provided, a random id will be generated
id: "some-connection-id",
id: "some-connection-id"
// optional: if used from node.js, you need to pass the WebSocket polyfill imported from `ws`
// WebSocket: WS
});
// optionally, update the properties of the connection
// (e.g. to change the host or room)
ws.updateProperties({
host: "another-project.username.partykit.dev",
room: "my-new-room"
});
ws.reconnect(); // make sure to call reconnect() after updating the properties
```

@@ -74,3 +88,3 @@

"wss://your.site.com",
"wss://their.site.com",
"wss://their.site.com"
];

@@ -109,2 +123,3 @@ let urlIndex = 0;

import { WebSocket } from "partysocket";
const ws = new WebSocket("wss://your.site.com", "your protocol");

@@ -136,3 +151,3 @@ ```

connectionTimeout: 1000,
maxRetries: 10,
maxRetries: 10
};

@@ -139,0 +154,0 @@ const ws = new WebSocket("wss://my.site.com", [], options);

import './ws.js';
export { u as default } from './use-ws-YFPmbpmh.js';
export { u as default } from './use-ws-CnrrNZS2.js';

@@ -46,2 +46,3 @@ type TypedEventTarget<EventMap extends object> = {

debug?: boolean;
debugLogger?: (...args: any[]) => void;
};

@@ -62,5 +63,6 @@ type UrlProvider = string | (() => string) | (() => Promise<string>);

private _messageQueue;
private readonly _url;
private readonly _protocols?;
private readonly _options;
private _debugLogger;
protected _url: UrlProvider;
protected _protocols?: ProtocolsProvider;
protected _options: Options;
constructor(url: UrlProvider, protocols?: ProtocolsProvider, options?: Options);

@@ -67,0 +69,0 @@ static get CONNECTING(): number;

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet