nezuo / lapis

A DataStore abstraction library for Roblox
https://nezuo.github.io/lapis/
MIT License
55 stars 10 forks source link

Remove load promise caching #48

Closed nezuo closed 4 months ago

nezuo commented 4 months ago

The Issue

The Example Usage page in the docs contains an edge that can result in data loss. Here's an explanation of the edge case:

Collection:load caches load promises for each document. The promise is removed from the cache when Document:close is called.

  1. Player joins the server and Document:load is called which returns a promise that is cached.
  2. Player leaves and rejoins that same server.
  3. Document:load is called again, the promise from the first load never finished (meaning Document:close hasn't been called yet), so the cached promise from the first load is returned.
  4. The promise resolves, the original load calls Document:close because that Player instance is no longer in the game.
  5. The new load now has a closed document and none of their data will be saved at this point.

This edge case probably has not happened in practice because it would require a player rejoining the same server before their document loads. Nonetheless, it should absolutely be fixed. It could be fixed by modifying the example but I think changing Lapis makes more sense.

The Fix

Lapis no longer caches load promises. This is a breaking change, though I don't know if anyone relies on this behavior.