Skip to content

Commit dd2a8a9

Browse files
[IC-165] storage stats endpoint (#94)
This change introduces a new canister query method returning storage stats: the number of registered users and the range of user numbers assigned to this canister.
1 parent 261d89f commit dd2a8a9

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

src/idp_service/idp_service.did

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ type GetDelegationResponse = variant {
6363
no_such_delegation
6464
};
6565

66+
type InternetIdentityStats = record {
67+
users_registered: nat64;
68+
assigned_user_number_range: record { nat64; nat64; };
69+
};
70+
6671
type InternetIdentityInit = record {
6772
assigned_user_number_range : record { nat64; nat64; };
6873
};
@@ -72,6 +77,7 @@ service : (opt InternetIdentityInit) -> {
7277
add : (UserNumber, DeviceData) -> ();
7378
remove : (UserNumber, DeviceKey) -> ();
7479
lookup : (UserNumber) -> (vec DeviceData) query;
80+
stats : () -> (InternetIdentityStats) query;
7581

7682
prepare_delegation : (UserNumber, FrontendHostname, SessionKey) -> (UserKey, Timestamp);
7783
get_delegation: (UserNumber, FrontendHostname, SessionKey, Timestamp) -> (GetDelegationResponse) query;

src/idp_service/src/main.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ struct StreamingCallbackHttpResponse {
8888
token: Option<Token>,
8989
}
9090

91+
#[derive(Clone, Debug, CandidType, Deserialize)]
92+
struct InternetIdentityStats {
93+
assigned_user_number_range: (UserNumber, UserNumber),
94+
users_registered: u64,
95+
}
96+
9197
#[derive(Clone, Debug, CandidType, Deserialize)]
9298
struct InternetIdentityInit {
9399
assigned_user_number_range: (UserNumber, UserNumber),
@@ -295,6 +301,17 @@ fn http_request(req: HttpRequest) -> HttpResponse {
295301
})
296302
}
297303

304+
#[query]
305+
fn stats() -> InternetIdentityStats {
306+
STATE.with(|state| {
307+
let storage = state.storage.borrow();
308+
InternetIdentityStats {
309+
assigned_user_number_range: storage.assigned_user_number_range(),
310+
users_registered: storage.user_count() as u64,
311+
}
312+
})
313+
}
314+
298315
// used both in init and post_upgrade
299316
fn init_assets() {
300317
ASSETS.with(|a| {

src/idp_service/src/storage.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,14 @@ impl<T: candid::CandidType + serde::de::DeserializeOwned> Storage<T> {
154154
stable_write(0, &buf);
155155
}
156156

157+
pub fn user_count(&self) -> usize {
158+
self.num_users as usize
159+
}
160+
161+
pub fn assigned_user_number_range(&self) -> (UserNumber, UserNumber) {
162+
self.user_number_range
163+
}
164+
157165
fn value_size_limit(&self) -> usize {
158166
self.entry_size as usize - std::mem::size_of::<u16>()
159167
}

0 commit comments

Comments
 (0)