Skip to main content

Network Updates

When player data changes, you often need to notify clients to keep their UI in sync. Lyra provides a callback system through changedCallbacks to help manage these network updates.

Understanding Change Callbacks​

Change callbacks are functions that run whenever data changes, whether through updates or transactions. They receive three parameters:

  • The key (player UserId as a string)
  • The new data (frozen to prevent mutations)
  • The previous data (if any, also frozen)

Here's a basic example:

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Network = require(ReplicatedStorage.Network)

local function syncWithClient(key: string, newData, oldData)
local player = Players:GetPlayerByUserId(tonumber(key))
if not player then return end

if oldData == nil then
-- First time data is loaded
Network.PlayerData:FireClient(player, newData)
return
end

-- Send only changed data
local changes = {}
if newData.coins ~= oldData.coins then
changes.coins = newData.coins
end
if not Tables.deepEquals(newData.inventory, oldData.inventory) then
changes.inventory = newData.inventory
end

-- Send changes to client
Network.PlayerData:FireClient(player, changes)
end

local store = Lyra.createPlayerStore({
name = "PlayerData",
template = template,
schema = schema,
changedCallbacks = { syncWithClient },
})
tip

Compare old and new data to send only changed values, reducing network traffic.

Multiple Callbacks​

While changedCallbacks are primarily used for networking, you can register multiple callbacks if needed. Each callback receives the same read-only data:

local store = Lyra.createPlayerStore({
changedCallbacks = {
-- Keep clients in sync
syncWithClient,

-- Log changes for debugging
function(key, newData, oldData)
print(`Player {key} data changed`)
end,
},
})

Data Safety​

Change callbacks receive frozen copies of the data. This means the data is read-only and cannot be modified:

local function callback(key, newData, oldData)
-- ❌ This will error - data is frozen
newData.coins = 100
end

See Also​