forked from
slices.network/quickslice
Auto-indexing service and GraphQL API for AT Protocol Records
1-module(did_cache_ffi).
2-export([new_table/0, insert/4, lookup/2, delete/2, cleanup_expired/1, stats/1]).
3
4%% Create a new ETS table for DID document caching
5new_table() ->
6 ets:new(did_cache, [set, public, {read_concurrency, true}]).
7
8%% Insert a DID document with expiration timestamp
9%% Args: Table, DID (binary), Document (binary), ExpiresAt (integer, unix timestamp)
10insert(Table, DID, Document, ExpiresAt) ->
11 true = ets:insert(Table, {DID, Document, ExpiresAt}),
12 ok.
13
14%% Lookup a DID document, checking expiration
15%% Returns: {ok, Document} | {error, not_found} | {error, expired}
16lookup(Table, DID) ->
17 case ets:lookup(Table, DID) of
18 [] ->
19 {error, not_found};
20 [{_DID, Document, ExpiresAt}] ->
21 Now = erlang:system_time(second),
22 case Now < ExpiresAt of
23 true -> {ok, Document};
24 false ->
25 ets:delete(Table, DID),
26 {error, expired}
27 end
28 end.
29
30%% Delete a DID from the cache
31delete(Table, DID) ->
32 ets:delete(Table, DID),
33 ok.
34
35%% Remove all expired entries from the cache
36cleanup_expired(Table) ->
37 Now = erlang:system_time(second),
38 %% Select and delete expired entries
39 ets:select_delete(Table, [{{{'$1', '$2', '$3'}, [], [{'<', '$3', Now}]}}]),
40 ok.
41
42%% Get cache statistics
43%% Returns: {EntryCount, MemoryBytes}
44stats(Table) ->
45 Info = ets:info(Table),
46 Size = proplists:get_value(size, Info, 0),
47 Memory = proplists:get_value(memory, Info, 0) * erlang:system_info(wordsize),
48 {Size, Memory}.