@react-remote-state/client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,16 @@
1
+ import { Game } from '@react-remote-state/types';
2
+
3
+ declare function getPlayer<GameCustom, PlayerCustom>(playerId?: string, game?: Game<GameCustom, PlayerCustom>): {
4
+ id: string;
5
+ host: boolean;
6
+ custom: PlayerCustom | undefined;
7
+ } | undefined;
8
+ declare function isHost<GameCustom, PlayerCustom>(playerId?: string, game?: Game<GameCustom, PlayerCustom>): boolean | undefined;
9
+ type Reducer<GameCustom, PlayerCustom, Action> = (game: Game<GameCustom, PlayerCustom>, action: Action, playerId: string) => Game<GameCustom, PlayerCustom>;
10
+ declare function useRemoteReducer<GameCustom, PlayerCustom, Action>(uri: string, reducer: Reducer<GameCustom, PlayerCustom, Action>, gameId?: string): [
11
+ Game<GameCustom, PlayerCustom> | undefined,
12
+ string | undefined,
13
+ (action: Action) => void
14
+ ];
15
+
16
+ export { getPlayer, isHost, useRemoteReducer };
@@ -0,0 +1,16 @@
1
+ import { Game } from '@react-remote-state/types';
2
+
3
+ declare function getPlayer<GameCustom, PlayerCustom>(playerId?: string, game?: Game<GameCustom, PlayerCustom>): {
4
+ id: string;
5
+ host: boolean;
6
+ custom: PlayerCustom | undefined;
7
+ } | undefined;
8
+ declare function isHost<GameCustom, PlayerCustom>(playerId?: string, game?: Game<GameCustom, PlayerCustom>): boolean | undefined;
9
+ type Reducer<GameCustom, PlayerCustom, Action> = (game: Game<GameCustom, PlayerCustom>, action: Action, playerId: string) => Game<GameCustom, PlayerCustom>;
10
+ declare function useRemoteReducer<GameCustom, PlayerCustom, Action>(uri: string, reducer: Reducer<GameCustom, PlayerCustom, Action>, gameId?: string): [
11
+ Game<GameCustom, PlayerCustom> | undefined,
12
+ string | undefined,
13
+ (action: Action) => void
14
+ ];
15
+
16
+ export { getPlayer, isHost, useRemoteReducer };
package/dist/index.js ADDED
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
23
+ var __export = (target, all) => {
24
+ for (var name in all)
25
+ __defProp(target, name, { get: all[name], enumerable: true });
26
+ };
27
+ var __copyProps = (to, from, except, desc) => {
28
+ if (from && typeof from === "object" || typeof from === "function") {
29
+ for (let key of __getOwnPropNames(from))
30
+ if (!__hasOwnProp.call(to, key) && key !== except)
31
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
32
+ }
33
+ return to;
34
+ };
35
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
+
37
+ // src/index.ts
38
+ var src_exports = {};
39
+ __export(src_exports, {
40
+ getPlayer: () => getPlayer,
41
+ isHost: () => isHost,
42
+ useRemoteReducer: () => useRemoteReducer
43
+ });
44
+ module.exports = __toCommonJS(src_exports);
45
+ var import_react = require("react");
46
+ var import_socket = require("socket.io-client");
47
+ function getPlayer(playerId, game) {
48
+ if (!game || !playerId) {
49
+ return void 0;
50
+ }
51
+ return game.players.find((player) => player.id == playerId);
52
+ }
53
+ function isHost(playerId, game) {
54
+ let player = getPlayer(playerId, game);
55
+ return player == null ? void 0 : player.host;
56
+ }
57
+ function useRemoteReducer(uri, reducer, gameId) {
58
+ let [meta, setMeta] = (0, import_react.useState)({
59
+ isHostReady: false
60
+ });
61
+ let [game, setGame] = (0, import_react.useState)();
62
+ let dispatch = (action) => {
63
+ if (!!meta.client && !!game) {
64
+ meta.client.emit("notify", { gameId: game.id, action });
65
+ }
66
+ };
67
+ (0, import_react.useEffect)(() => {
68
+ if (!meta.client) {
69
+ meta.client = (0, import_socket.connect)(uri);
70
+ meta.client.on("error", console.error);
71
+ meta.client.on("connect", () => {
72
+ var _a, _b;
73
+ if (gameId == void 0) {
74
+ (_a = meta.client) == null ? void 0 : _a.emit("create");
75
+ } else {
76
+ (_b = meta.client) == null ? void 0 : _b.emit("join", { gameId });
77
+ }
78
+ });
79
+ meta.client.on("update", (update) => {
80
+ if (!meta.localPlayerId && !!update.playerId) {
81
+ setMeta(__spreadProps(__spreadValues({}, meta), { localPlayerId: update.playerId }));
82
+ }
83
+ setGame(update.game);
84
+ });
85
+ } else if (isHost(meta.localPlayerId, game) && !meta.isHostReady) {
86
+ meta.client.on("join", (join) => {
87
+ var _a;
88
+ (_a = meta.client) == null ? void 0 : _a.emit("accept", {
89
+ gameId: game == null ? void 0 : game.id,
90
+ playerId: join.playerId
91
+ });
92
+ });
93
+ meta.client.on("notify", (notify) => {
94
+ var _a;
95
+ if (!!game) {
96
+ (_a = meta.client) == null ? void 0 : _a.emit("update", {
97
+ game: reducer(game, notify.action, notify.playerId)
98
+ });
99
+ }
100
+ });
101
+ setMeta(__spreadProps(__spreadValues({}, meta), { isHostReady: true }));
102
+ }
103
+ });
104
+ return [game, meta.localPlayerId, dispatch];
105
+ }
106
+ // Annotate the CommonJS export names for ESM import in node:
107
+ 0 && (module.exports = {
108
+ getPlayer,
109
+ isHost,
110
+ useRemoteReducer
111
+ });
112
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Game } from \"@react-remote-state/types\";\nimport { useEffect, useState } from \"react\";\nimport { connect, Socket as Client } from \"socket.io-client\";\n\ntype Meta = {\n client?: Client;\n isHostReady: boolean;\n localPlayerId?: string;\n};\n\nexport function getPlayer<GameCustom, PlayerCustom>(\n playerId?: string,\n game?: Game<GameCustom, PlayerCustom>\n) {\n if (!game || !playerId) {\n return undefined;\n }\n\n return game.players.find((player) => player.id == playerId);\n}\n\nexport function isHost<GameCustom, PlayerCustom>(\n playerId?: string,\n game?: Game<GameCustom, PlayerCustom>\n) {\n let player = getPlayer(playerId, game);\n\n return player?.host;\n}\n\ntype Reducer<GameCustom, PlayerCustom, Action> = (\n game: Game<GameCustom, PlayerCustom>,\n action: Action,\n playerId: string\n) => Game<GameCustom, PlayerCustom>;\n\nexport function useRemoteReducer<GameCustom, PlayerCustom, Action>(\n uri: string,\n reducer: Reducer<GameCustom, PlayerCustom, Action>,\n gameId?: string\n): [\n Game<GameCustom, PlayerCustom> | undefined,\n string | undefined,\n (action: Action) => void\n] {\n let [meta, setMeta] = useState<Meta>({\n isHostReady: false,\n });\n\n let [game, setGame] = useState<Game<GameCustom, PlayerCustom>>();\n\n let dispatch = (action: Action) => {\n if (!!meta.client && !!game) {\n meta.client.emit(\"notify\", { gameId: game.id, action });\n }\n };\n\n useEffect(() => {\n if (!meta.client) {\n meta.client = connect(uri);\n meta.client.on(\"error\", console.error);\n meta.client.on(\"connect\", () => {\n if (gameId == undefined) {\n meta.client?.emit(\"create\");\n } else {\n meta.client?.emit(\"join\", { gameId });\n }\n });\n\n meta.client.on(\"update\", (update) => {\n if (!meta.localPlayerId && !!update.playerId) {\n setMeta({ ...meta, localPlayerId: update.playerId });\n }\n\n setGame(update.game);\n });\n } else if (isHost(meta.localPlayerId, game) && !meta.isHostReady) {\n meta.client.on(\"join\", (join) => {\n meta.client?.emit(\"accept\", {\n gameId: game?.id,\n playerId: join.playerId,\n });\n });\n\n meta.client.on(\"notify\", (notify) => {\n if (!!game) {\n meta.client?.emit(\"update\", {\n game: reducer(game, notify.action, notify.playerId),\n });\n }\n });\n\n setMeta({ ...meta, isHostReady: true });\n }\n });\n\n return [game, meta.localPlayerId, dispatch];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAoC;AACpC,oBAA0C;AAQnC,SAAS,UACd,UACA,MACA;AACA,MAAI,CAAC,QAAQ,CAAC,UAAU;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,MAAM,QAAQ;AAC5D;AAEO,SAAS,OACd,UACA,MACA;AACA,MAAI,SAAS,UAAU,UAAU,IAAI;AAErC,SAAO,iCAAQ;AACjB;AAQO,SAAS,iBACd,KACA,SACA,QAKA;AACA,MAAI,CAAC,MAAM,OAAO,QAAI,uBAAe;AAAA,IACnC,aAAa;AAAA,EACf,CAAC;AAED,MAAI,CAAC,MAAM,OAAO,QAAI,uBAAyC;AAE/D,MAAI,WAAW,CAAC,WAAmB;AACjC,QAAI,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,MAAM;AAC3B,WAAK,OAAO,KAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,OAAO,CAAC;AAAA,IACxD;AAAA,EACF;AAEA,8BAAU,MAAM;AACd,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,aAAS,uBAAQ,GAAG;AACzB,WAAK,OAAO,GAAG,SAAS,QAAQ,KAAK;AACrC,WAAK,OAAO,GAAG,WAAW,MAAM;AA7DtC;AA8DQ,YAAI,UAAU,QAAW;AACvB,qBAAK,WAAL,mBAAa,KAAK;AAAA,QACpB,OAAO;AACL,qBAAK,WAAL,mBAAa,KAAK,QAAQ,EAAE,OAAO;AAAA,QACrC;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,UAAU,CAAC,WAAW;AACnC,YAAI,CAAC,KAAK,iBAAiB,CAAC,CAAC,OAAO,UAAU;AAC5C,kBAAQ,iCAAK,OAAL,EAAW,eAAe,OAAO,SAAS,EAAC;AAAA,QACrD;AAEA,gBAAQ,OAAO,IAAI;AAAA,MACrB,CAAC;AAAA,IACH,WAAW,OAAO,KAAK,eAAe,IAAI,KAAK,CAAC,KAAK,aAAa;AAChE,WAAK,OAAO,GAAG,QAAQ,CAAC,SAAS;AA7EvC;AA8EQ,mBAAK,WAAL,mBAAa,KAAK,UAAU;AAAA,UAC1B,QAAQ,6BAAM;AAAA,UACd,UAAU,KAAK;AAAA,QACjB;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,UAAU,CAAC,WAAW;AApF3C;AAqFQ,YAAI,CAAC,CAAC,MAAM;AACV,qBAAK,WAAL,mBAAa,KAAK,UAAU;AAAA,YAC1B,MAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO,QAAQ;AAAA,UACpD;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAQ,iCAAK,OAAL,EAAW,aAAa,KAAK,EAAC;AAAA,IACxC;AAAA,EACF,CAAC;AAED,SAAO,CAAC,MAAM,KAAK,eAAe,QAAQ;AAC5C;","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,88 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
21
+ // src/index.ts
22
+ import { useEffect, useState } from "react";
23
+ import { connect } from "socket.io-client";
24
+ function getPlayer(playerId, game) {
25
+ if (!game || !playerId) {
26
+ return void 0;
27
+ }
28
+ return game.players.find((player) => player.id == playerId);
29
+ }
30
+ function isHost(playerId, game) {
31
+ let player = getPlayer(playerId, game);
32
+ return player == null ? void 0 : player.host;
33
+ }
34
+ function useRemoteReducer(uri, reducer, gameId) {
35
+ let [meta, setMeta] = useState({
36
+ isHostReady: false
37
+ });
38
+ let [game, setGame] = useState();
39
+ let dispatch = (action) => {
40
+ if (!!meta.client && !!game) {
41
+ meta.client.emit("notify", { gameId: game.id, action });
42
+ }
43
+ };
44
+ useEffect(() => {
45
+ if (!meta.client) {
46
+ meta.client = connect(uri);
47
+ meta.client.on("error", console.error);
48
+ meta.client.on("connect", () => {
49
+ var _a, _b;
50
+ if (gameId == void 0) {
51
+ (_a = meta.client) == null ? void 0 : _a.emit("create");
52
+ } else {
53
+ (_b = meta.client) == null ? void 0 : _b.emit("join", { gameId });
54
+ }
55
+ });
56
+ meta.client.on("update", (update) => {
57
+ if (!meta.localPlayerId && !!update.playerId) {
58
+ setMeta(__spreadProps(__spreadValues({}, meta), { localPlayerId: update.playerId }));
59
+ }
60
+ setGame(update.game);
61
+ });
62
+ } else if (isHost(meta.localPlayerId, game) && !meta.isHostReady) {
63
+ meta.client.on("join", (join) => {
64
+ var _a;
65
+ (_a = meta.client) == null ? void 0 : _a.emit("accept", {
66
+ gameId: game == null ? void 0 : game.id,
67
+ playerId: join.playerId
68
+ });
69
+ });
70
+ meta.client.on("notify", (notify) => {
71
+ var _a;
72
+ if (!!game) {
73
+ (_a = meta.client) == null ? void 0 : _a.emit("update", {
74
+ game: reducer(game, notify.action, notify.playerId)
75
+ });
76
+ }
77
+ });
78
+ setMeta(__spreadProps(__spreadValues({}, meta), { isHostReady: true }));
79
+ }
80
+ });
81
+ return [game, meta.localPlayerId, dispatch];
82
+ }
83
+ export {
84
+ getPlayer,
85
+ isHost,
86
+ useRemoteReducer
87
+ };
88
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Game } from \"@react-remote-state/types\";\nimport { useEffect, useState } from \"react\";\nimport { connect, Socket as Client } from \"socket.io-client\";\n\ntype Meta = {\n client?: Client;\n isHostReady: boolean;\n localPlayerId?: string;\n};\n\nexport function getPlayer<GameCustom, PlayerCustom>(\n playerId?: string,\n game?: Game<GameCustom, PlayerCustom>\n) {\n if (!game || !playerId) {\n return undefined;\n }\n\n return game.players.find((player) => player.id == playerId);\n}\n\nexport function isHost<GameCustom, PlayerCustom>(\n playerId?: string,\n game?: Game<GameCustom, PlayerCustom>\n) {\n let player = getPlayer(playerId, game);\n\n return player?.host;\n}\n\ntype Reducer<GameCustom, PlayerCustom, Action> = (\n game: Game<GameCustom, PlayerCustom>,\n action: Action,\n playerId: string\n) => Game<GameCustom, PlayerCustom>;\n\nexport function useRemoteReducer<GameCustom, PlayerCustom, Action>(\n uri: string,\n reducer: Reducer<GameCustom, PlayerCustom, Action>,\n gameId?: string\n): [\n Game<GameCustom, PlayerCustom> | undefined,\n string | undefined,\n (action: Action) => void\n] {\n let [meta, setMeta] = useState<Meta>({\n isHostReady: false,\n });\n\n let [game, setGame] = useState<Game<GameCustom, PlayerCustom>>();\n\n let dispatch = (action: Action) => {\n if (!!meta.client && !!game) {\n meta.client.emit(\"notify\", { gameId: game.id, action });\n }\n };\n\n useEffect(() => {\n if (!meta.client) {\n meta.client = connect(uri);\n meta.client.on(\"error\", console.error);\n meta.client.on(\"connect\", () => {\n if (gameId == undefined) {\n meta.client?.emit(\"create\");\n } else {\n meta.client?.emit(\"join\", { gameId });\n }\n });\n\n meta.client.on(\"update\", (update) => {\n if (!meta.localPlayerId && !!update.playerId) {\n setMeta({ ...meta, localPlayerId: update.playerId });\n }\n\n setGame(update.game);\n });\n } else if (isHost(meta.localPlayerId, game) && !meta.isHostReady) {\n meta.client.on(\"join\", (join) => {\n meta.client?.emit(\"accept\", {\n gameId: game?.id,\n playerId: join.playerId,\n });\n });\n\n meta.client.on(\"notify\", (notify) => {\n if (!!game) {\n meta.client?.emit(\"update\", {\n game: reducer(game, notify.action, notify.playerId),\n });\n }\n });\n\n setMeta({ ...meta, isHostReady: true });\n }\n });\n\n return [game, meta.localPlayerId, dispatch];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,SAAS,WAAW,gBAAgB;AACpC,SAAS,eAAiC;AAQnC,SAAS,UACd,UACA,MACA;AACA,MAAI,CAAC,QAAQ,CAAC,UAAU;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,MAAM,QAAQ;AAC5D;AAEO,SAAS,OACd,UACA,MACA;AACA,MAAI,SAAS,UAAU,UAAU,IAAI;AAErC,SAAO,iCAAQ;AACjB;AAQO,SAAS,iBACd,KACA,SACA,QAKA;AACA,MAAI,CAAC,MAAM,OAAO,IAAI,SAAe;AAAA,IACnC,aAAa;AAAA,EACf,CAAC;AAED,MAAI,CAAC,MAAM,OAAO,IAAI,SAAyC;AAE/D,MAAI,WAAW,CAAC,WAAmB;AACjC,QAAI,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,MAAM;AAC3B,WAAK,OAAO,KAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,OAAO,CAAC;AAAA,IACxD;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,QAAQ,GAAG;AACzB,WAAK,OAAO,GAAG,SAAS,QAAQ,KAAK;AACrC,WAAK,OAAO,GAAG,WAAW,MAAM;AA7DtC;AA8DQ,YAAI,UAAU,QAAW;AACvB,qBAAK,WAAL,mBAAa,KAAK;AAAA,QACpB,OAAO;AACL,qBAAK,WAAL,mBAAa,KAAK,QAAQ,EAAE,OAAO;AAAA,QACrC;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,UAAU,CAAC,WAAW;AACnC,YAAI,CAAC,KAAK,iBAAiB,CAAC,CAAC,OAAO,UAAU;AAC5C,kBAAQ,iCAAK,OAAL,EAAW,eAAe,OAAO,SAAS,EAAC;AAAA,QACrD;AAEA,gBAAQ,OAAO,IAAI;AAAA,MACrB,CAAC;AAAA,IACH,WAAW,OAAO,KAAK,eAAe,IAAI,KAAK,CAAC,KAAK,aAAa;AAChE,WAAK,OAAO,GAAG,QAAQ,CAAC,SAAS;AA7EvC;AA8EQ,mBAAK,WAAL,mBAAa,KAAK,UAAU;AAAA,UAC1B,QAAQ,6BAAM;AAAA,UACd,UAAU,KAAK;AAAA,QACjB;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,UAAU,CAAC,WAAW;AApF3C;AAqFQ,YAAI,CAAC,CAAC,MAAM;AACV,qBAAK,WAAL,mBAAa,KAAK,UAAU;AAAA,YAC1B,MAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO,QAAQ;AAAA,UACpD;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAQ,iCAAK,OAAL,EAAW,aAAa,KAAK,EAAC;AAAA,IACxC;AAAA,EACF,CAAC;AAED,SAAO,CAAC,MAAM,KAAK,eAAe,QAAQ;AAC5C;","names":[]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@react-remote-state/client",
3
+ "version": "0.0.1",
4
+ "description": "Client for React Remote State applications",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsup",
13
+ "test": "vitest"
14
+ },
15
+ "author": "",
16
+ "license": "ISC",
17
+ "devDependencies": {
18
+ "@react-remote-state/server": "^0.0.1",
19
+ "@sheerun/mutationobserver-shim": "^0.3.3",
20
+ "@testing-library/react": "^16.0.1",
21
+ "@types/lodash": "^4.17.12",
22
+ "@vitejs/plugin-react-swc": "^3.7.1",
23
+ "lodash": "^4.17.21",
24
+ "socket.io-client": "^4.8.1",
25
+ "ts-node": "^10.9.2",
26
+ "tsup": "^8.3.5",
27
+ "typescript": "^4.9.5",
28
+ "vitest": "^2.1.3"
29
+ },
30
+ "peerDependencies": {
31
+ "react": "^18.3.1"
32
+ },
33
+ "dependencies": {
34
+ "@react-remote-state/types": "^1.0.0",
35
+ "socket.io-client": "^4.8.1"
36
+ }
37
+ }