-module(spoke@core@ets_storage). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/spoke/core/ets_storage.gleam"). -export([new/0, load_from_file/1, store_to_file/2, read/1, delete/1, update/2]). -export_type([ets_storage/0, ets_error/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(" Provides ETS-backed session storage on the Erlang target.\n"). -type ets_storage() :: any(). -type ets_error() :: any(). -file("src/spoke/core/ets_storage.gleam", 13). ?DOC(" Create a new empty ETS storage.\n"). -spec new() -> ets_storage(). new() -> spoke_ets_ffi:new(). -file("src/spoke/core/ets_storage.gleam", 17). ?DOC(" Loads a session previously stored to a file using `store_to_file`.\n"). -spec load_from_file(binary()) -> {ok, ets_storage()} | {error, ets_error()}. load_from_file(Filename) -> spoke_ets_ffi:load_from_file(Filename). -file("src/spoke/core/ets_storage.gleam", 21). ?DOC(" Stores the ETS table to a file, using Erlang's serialization.\n"). -spec store_to_file(ets_storage(), binary()) -> {ok, nil} | {error, ets_error()}. store_to_file(Storage, Filename) -> spoke_ets_ffi:store_to_file(Storage, Filename). -file("src/spoke/core/ets_storage.gleam", 28). ?DOC(" Reads the currently stored session state.\n"). -spec read(ets_storage()) -> spoke@core@session_state:session_state(). read(Storage) -> spoke_ets_ffi:read(Storage). -file("src/spoke/core/ets_storage.gleam", 32). ?DOC(" Deletes the associated ETS table.\n"). -spec delete(ets_storage()) -> nil. delete(Storage) -> ets:delete(Storage). -file("src/spoke/core/ets_storage.gleam", 35). ?DOC(" Updates the state of the storage.\n"). -spec update(ets_storage(), spoke@core@session_state:storage_update()) -> nil. update(Storage, What) -> case What of {clear_packet_state, Id} -> ets:delete(Storage, Id); clear_session -> ets:delete_all_objects(Storage); {store_next_packet_id, Id@1} -> spoke_ets_ffi:update_next_id(Storage, Id@1); {update_packet_state, Id@2, State} -> ets:insert(Storage, {Id@2, State}) end.