Skip to content

Commit d462ad7

Browse files
perf: add serializer to hydrate
1 parent eebb055 commit d462ad7

File tree

6 files changed

+32
-8
lines changed

6 files changed

+32
-8
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"@flamework/components": "1.2.3",
2929
"@flamework/core": "1.2.3",
3030
"@flamework/networking": "1.2.3",
31+
"@rbxts/flamework-binary-serializer": "0.6.0",
3132
"@rbxts/inspect": "1.0.1",
3233
"@rbxts/janitor": "1.16.0-ts.0",
3334
"@rbxts/lapis": "0.3.3",

pnpm-lock.yaml

+14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/client/store/middleware/receiver.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { createBroadcastReceiver } from "@rbxts/reflex";
44
import { Events } from "client/network";
55
import { $NODE_ENV } from "rbxts-transform-env";
66
import { IS_EDIT } from "shared/constants";
7+
import { stateSerDes } from "shared/store";
78

89
/**
910
* A middleware that listens for actions dispatched from the server and
@@ -28,7 +29,7 @@ export function receiverMiddleware(): ProducerMiddleware {
2829
});
2930

3031
Events.store.hydrate.connect(state => {
31-
receiver.hydrate(state);
32+
receiver.hydrate(stateSerDes.deserialize(state.buffer, state.blobs));
3233
});
3334

3435
return receiver.middleware;

src/server/store/middleware/broadcaster.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { Players } from "@rbxts/services";
55
import { $NODE_ENV } from "rbxts-transform-env";
66
import { Events } from "server/network";
77
import { IS_EDIT } from "shared/constants";
8-
import type { SharedState } from "shared/store";
9-
import { slices } from "shared/store";
8+
import type { SerializedSharedState, SharedState } from "shared/store";
9+
import { slices, stateSerDes } from "shared/store";
1010

1111
export const ONCE_PER_MINUTE = 60;
1212

@@ -39,13 +39,16 @@ export function broadcasterMiddleware(): ProducerMiddleware {
3939

4040
function beforeHydrate(hydrated: Set<number>): (player: Player, state: SharedState) => SharedState {
4141
return (player: Player, state: SharedState) => {
42+
// The cast is necessary due to the typings of the reflex library.
43+
const serialized = stateSerDes.serialize(state) as unknown as SharedState;
44+
4245
const isInitialHydrate = !hydrated.has(player.UserId);
4346
if (!isInitialHydrate) {
44-
return state;
47+
return serialized;
4548
}
4649

4750
hydrated.add(player.UserId);
48-
return state;
51+
return serialized;
4952
};
5053
}
5154

@@ -54,5 +57,6 @@ function dispatch(player: Player, actions: Array<BroadcastAction>): void {
5457
}
5558

5659
function hydrate(player: Player, state: SharedState): void {
57-
Events.store.hydrate.fire(player, state);
60+
// The cast is necessary due to the typings of the reflex library.
61+
Events.store.hydrate.fire(player, state as unknown as SerializedSharedState);
5862
}

src/shared/network.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Networking } from "@flamework/networking";
22
import type { BroadcastAction } from "@rbxts/reflex";
33

4-
import type { SharedState } from "./store";
4+
import type { SerializedSharedState } from "./store";
55

66
/** Fired by client to server. */
77
interface ClientToServerEvents {
@@ -23,7 +23,7 @@ interface ServerToClientEvents {
2323
* @param actions - The actions to send to the client.
2424
*/
2525
dispatch: (actions: Array<BroadcastAction>) => void;
26-
hydrate: (state: SharedState) => void;
26+
hydrate: (state: SerializedSharedState) => void;
2727
};
2828
}
2929

src/shared/store/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
import { createBinarySerializer } from "@rbxts/flamework-binary-serializer";
12
import type { CombineStates } from "@rbxts/reflex";
23

34
import { persistentSlice } from "./persistent/persistent-slice";
45

56
export type SharedState = CombineStates<typeof slices>;
7+
export type SerializedSharedState = ReturnType<typeof stateSerDes.serialize>;
8+
9+
export const stateSerDes = createBinarySerializer<SharedState>();
610

711
export const slices = {
812
persistent: persistentSlice,

0 commit comments

Comments
 (0)