Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove ability to remove events #38

Merged
merged 1 commit into from
Feb 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions rs/canister/api/can.did
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ type EventsArgs = record { start : nat64; length : nat64 };
type EventsResponse = record {
events : vec IndexedEvent;
latest_event_index : opt nat64;
earliest_event_index_stored : opt nat64;
};
type IdempotentEvent = record {
source : opt text;
Expand All @@ -21,24 +20,16 @@ type IndexedEvent = record {
payload : vec nat8;
};
type InitArgs = record {
remove_events_whitelist : vec principal;
push_events_whitelist : vec principal;
read_events_whitelist : vec principal;
};
type PushEventsArgs = record { events : vec IdempotentEvent };
type RemoveEventsArgs = record { up_to_inclusive : nat64 };
type RemoveEventsResponse = record {
latest_event_index : opt nat64;
earliest_event_index_stored : opt nat64;
};
type WhitelistedPrincipals = record {
remove : vec principal;
push : vec principal;
read : vec principal;
};
service : (InitArgs) -> {
events : (EventsArgs) -> (EventsResponse) query;
push_events : (PushEventsArgs) -> ();
remove_events : (RemoveEventsArgs) -> (RemoveEventsResponse);
whitelisted_principals : () -> (WhitelistedPrincipals) query;
}
1 change: 0 additions & 1 deletion rs/canister/api/src/lifecycle/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,4 @@ use serde::Serialize;
pub struct InitArgs {
pub push_events_whitelist: Vec<Principal>,
pub read_events_whitelist: Vec<Principal>,
pub remove_events_whitelist: Vec<Principal>,
}
1 change: 0 additions & 1 deletion rs/canister/api/src/queries/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,4 @@ pub struct EventsArgs {
pub struct EventsResponse {
pub events: Vec<IndexedEvent>,
pub latest_event_index: Option<u64>,
pub earliest_event_index_stored: Option<u64>,
}
1 change: 0 additions & 1 deletion rs/canister/api/src/queries/whitelisted_principals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,4 @@ use serde::Serialize;
pub struct WhitelistedPrincipals {
pub read: Vec<Principal>,
pub push: Vec<Principal>,
pub remove: Vec<Principal>,
}
2 changes: 0 additions & 2 deletions rs/canister/api/src/updates/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
mod push_events;
mod remove_events;

pub use push_events::*;
pub use remove_events::*;
13 changes: 0 additions & 13 deletions rs/canister/api/src/updates/remove_events.rs

This file was deleted.

8 changes: 0 additions & 8 deletions rs/canister/impl/src/guards.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,6 @@ pub fn caller_can_read_events() -> Result<(), String> {
}
}

pub fn caller_can_remove_events() -> Result<(), String> {
if state::read(|s| s.can_caller_remove_events()) {
Ok(())
} else {
Err(err_message("remove"))
}
}

fn err_message(action: &'static str) -> String {
format!("Caller is not authorized to {action} events")
}
1 change: 0 additions & 1 deletion rs/canister/impl/src/lifecycle/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,5 @@ fn init(args: InitArgs) {
state::init(State::new(
args.push_events_whitelist.into_iter().collect(),
args.read_events_whitelist.into_iter().collect(),
args.remove_events_whitelist.into_iter().collect(),
));
}
25 changes: 2 additions & 23 deletions rs/canister/impl/src/model/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,8 @@ pub struct Events {

impl Events {
pub fn get(&self, start: u64, length: u64) -> Vec<IndexedEvent> {
if let Some(start_index) = self
.earliest_event_index_stored()
.and_then(|i| start.checked_sub(i))
.map(|i| i as usize)
.filter(|i| *i < self.events.len())
{
let start_index = start as usize;
if start_index < self.events.len() {
self.events
.range(start_index..)
.take(length as usize)
Expand All @@ -40,30 +36,13 @@ impl Events {
self.latest_event_index = Some(index);
}

pub fn remove(&mut self, up_to_inclusive: u64) {
while self
.events
.front()
.filter(|e| e.index <= up_to_inclusive)
.is_some()
{
self.events.pop_front();
}
}

pub fn stats(&self) -> EventsStats {
EventsStats {
earliest_event_index_stored: self.earliest_event_index_stored(),
latest_event_index: self.latest_event_index,
}
}

fn earliest_event_index_stored(&self) -> Option<u64> {
self.events.front().map(|e| e.index)
}
}

pub struct EventsStats {
pub earliest_event_index_stored: Option<u64>,
pub latest_event_index: Option<u64>,
}
1 change: 0 additions & 1 deletion rs/canister/impl/src/queries/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ fn events(args: EventsArgs) -> EventsResponse {
EventsResponse {
events,
latest_event_index: stats.latest_event_index,
earliest_event_index_stored: stats.earliest_event_index_stored,
}
})
}
9 changes: 0 additions & 9 deletions rs/canister/impl/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ thread_local! {
pub struct State {
push_events_whitelist: HashSet<Principal>,
read_events_whitelist: HashSet<Principal>,
remove_events_whitelist: HashSet<Principal>,
pub events: Events,
pub event_deduper: EventDeduper,
}
Expand Down Expand Up @@ -49,12 +48,10 @@ impl State {
pub fn new(
push_events_whitelist: HashSet<Principal>,
read_events_whitelist: HashSet<Principal>,
remove_events_whitelist: HashSet<Principal>,
) -> State {
State {
push_events_whitelist,
read_events_whitelist,
remove_events_whitelist,
events: Events::default(),
event_deduper: EventDeduper::default(),
}
Expand All @@ -70,16 +67,10 @@ impl State {
self.read_events_whitelist.contains(&caller)
}

pub fn can_caller_remove_events(&self) -> bool {
let caller = env::caller();
self.remove_events_whitelist.contains(&caller)
}

pub fn whitelisted_principals(&self) -> WhitelistedPrincipals {
WhitelistedPrincipals {
push: self.push_events_whitelist.iter().copied().collect(),
read: self.read_events_whitelist.iter().copied().collect(),
remove: self.remove_events_whitelist.iter().copied().collect(),
}
}
}
1 change: 0 additions & 1 deletion rs/canister/impl/src/updates/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
mod push_events;
mod remove_events;
17 changes: 0 additions & 17 deletions rs/canister/impl/src/updates/remove_events.rs

This file was deleted.

14 changes: 2 additions & 12 deletions rs/integration_tests/src/client.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use candid::{CandidType, Principal};
use event_sink_canister::{
EventsArgs, EventsResponse, PushEventsArgs, RemoveEventsArgs, RemoveEventsResponse,
};
use event_sink_canister::{EventsArgs, EventsResponse, PushEventsArgs};
use pocket_ic::{PocketIc, UserError, WasmResult};
use serde::de::DeserializeOwned;

Expand All @@ -23,15 +21,6 @@ pub fn push_events(
execute_update_no_response(env, sender, canister_id, "push_events", args)
}

pub fn remove_events(
env: &mut PocketIc,
sender: Principal,
canister_id: Principal,
args: &RemoveEventsArgs,
) -> RemoveEventsResponse {
execute_update(env, sender, canister_id, "remove_events", args)
}

fn execute_query<P: CandidType, R: CandidType + DeserializeOwned>(
env: &PocketIc,
sender: Principal,
Expand All @@ -47,6 +36,7 @@ fn execute_query<P: CandidType, R: CandidType + DeserializeOwned>(
))
}

#[allow(dead_code)]
fn execute_update<P: CandidType, R: CandidType + DeserializeOwned>(
env: &mut PocketIc,
sender: Principal,
Expand Down
21 changes: 2 additions & 19 deletions rs/integration_tests/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
use crate::rng::{random, random_bytes, random_principal, random_string};
use crate::setup::setup_new_env;
use candid::Principal;
use event_sink_canister::{
EventsArgs, IdempotentEvent, InitArgs, PushEventsArgs, RemoveEventsArgs,
};
use event_sink_canister::{EventsArgs, IdempotentEvent, InitArgs, PushEventsArgs};
use pocket_ic::PocketIc;
use std::fs::File;
use std::io::Read;
Expand All @@ -20,17 +18,15 @@ pub struct TestEnv {
pub controller: Principal,
pub push_principals: Vec<Principal>,
pub read_principals: Vec<Principal>,
pub remove_principals: Vec<Principal>,
}

#[test]
fn read_push_remove_events_succeeds() {
fn push_then_read_events_succeeds() {
let TestEnv {
mut env,
canister_id,
push_principals,
read_principals,
remove_principals,
..
} = install_canister(None);

Expand Down Expand Up @@ -66,17 +62,6 @@ fn read_push_remove_events_succeeds() {
assert_eq!(read_response.events.first().unwrap().index, 0);
assert_eq!(read_response.events.last().unwrap().index, 4);
assert_eq!(read_response.latest_event_index, Some(9));
assert_eq!(read_response.earliest_event_index_stored, Some(0));

let remove_response = client::remove_events(
&mut env,
*remove_principals.first().unwrap(),
canister_id,
&RemoveEventsArgs { up_to_inclusive: 5 },
);

assert_eq!(remove_response.latest_event_index, Some(9));
assert_eq!(remove_response.earliest_event_index_stored, Some(6));
}

fn install_canister(init_args: Option<InitArgs>) -> TestEnv {
Expand All @@ -86,7 +71,6 @@ fn install_canister(init_args: Option<InitArgs>) -> TestEnv {
let init_args = init_args.unwrap_or_else(|| InitArgs {
push_events_whitelist: vec![random_principal()],
read_events_whitelist: vec![random_principal()],
remove_events_whitelist: vec![random_principal()],
});

let canister_id = env.create_canister_with_settings(Some(controller), None);
Expand All @@ -104,7 +88,6 @@ fn install_canister(init_args: Option<InitArgs>) -> TestEnv {
controller,
push_principals: init_args.push_events_whitelist,
read_principals: init_args.read_events_whitelist,
remove_principals: init_args.remove_events_whitelist,
}
}

Expand Down
1 change: 0 additions & 1 deletion ts/consumer/src/candid/idl.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import type { IDL } from "@dfinity/candid";
export type {
IndexedEvent as CandidEvent,
EventsResponse as CandidEventsResponse,
RemoveEventsResponse as CandidRemoveEventsResponse,
_SERVICE as EventSinkCanister,
} from "./types";

Expand Down
12 changes: 4 additions & 8 deletions ts/consumer/src/candid/idl.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
export const idlFactory = ({ IDL }) => {
const InitArgs = IDL.Record({
'remove_events_whitelist' : IDL.Vec(IDL.Principal),
'push_events_whitelist' : IDL.Vec(IDL.Principal),
'read_events_whitelist' : IDL.Vec(IDL.Principal),
});
Expand All @@ -16,7 +15,6 @@ export const idlFactory = ({ IDL }) => {
const EventsResponse = IDL.Record({
'events' : IDL.Vec(IndexedEvent),
'latest_event_index' : IDL.Opt(IDL.Nat64),
'earliest_event_index_stored' : IDL.Opt(IDL.Nat64),
});
const IdempotentEvent = IDL.Record({
'source' : IDL.Opt(IDL.Text),
Expand All @@ -27,20 +25,18 @@ export const idlFactory = ({ IDL }) => {
'idempotency_key' : IDL.Nat,
});
const PushEventsArgs = IDL.Record({ 'events' : IDL.Vec(IdempotentEvent) });
const RemoveEventsArgs = IDL.Record({ 'up_to_inclusive' : IDL.Nat64 });
const RemoveEventsResponse = IDL.Record({
'latest_event_index' : IDL.Opt(IDL.Nat64),
'earliest_event_index_stored' : IDL.Opt(IDL.Nat64),
const WhitelistedPrincipals = IDL.Record({
'push' : IDL.Vec(IDL.Principal),
'read' : IDL.Vec(IDL.Principal),
});
return IDL.Service({
'events' : IDL.Func([EventsArgs], [EventsResponse], ['query']),
'push_events' : IDL.Func([PushEventsArgs], [], []),
'remove_events' : IDL.Func([RemoveEventsArgs], [RemoveEventsResponse], []),
'whitelisted_principals' : IDL.Func([], [WhitelistedPrincipals], ['query']),
});
};
export const init = ({ IDL }) => {
const InitArgs = IDL.Record({
'remove_events_whitelist' : IDL.Vec(IDL.Principal),
'push_events_whitelist' : IDL.Vec(IDL.Principal),
'read_events_whitelist' : IDL.Vec(IDL.Principal),
});
Expand Down
11 changes: 4 additions & 7 deletions ts/consumer/src/candid/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ export interface EventsArgs { 'start' : bigint, 'length' : bigint }
export interface EventsResponse {
'events' : Array<IndexedEvent>,
'latest_event_index' : [] | [bigint],
'earliest_event_index_stored' : [] | [bigint],
}
export interface IdempotentEvent {
'source' : [] | [string],
Expand All @@ -24,18 +23,16 @@ export interface IndexedEvent {
'payload' : Uint8Array | number[],
}
export interface InitArgs {
'remove_events_whitelist' : Array<Principal>,
'push_events_whitelist' : Array<Principal>,
'read_events_whitelist' : Array<Principal>,
}
export interface PushEventsArgs { 'events' : Array<IdempotentEvent> }
export interface RemoveEventsArgs { 'up_to_inclusive' : bigint }
export interface RemoveEventsResponse {
'latest_event_index' : [] | [bigint],
'earliest_event_index_stored' : [] | [bigint],
export interface WhitelistedPrincipals {
'push' : Array<Principal>,
'read' : Array<Principal>,
}
export interface _SERVICE {
'events' : ActorMethod<[EventsArgs], EventsResponse>,
'push_events' : ActorMethod<[PushEventsArgs], undefined>,
'remove_events' : ActorMethod<[RemoveEventsArgs], RemoveEventsResponse>,
'whitelisted_principals' : ActorMethod<[], WhitelistedPrincipals>,
}
Loading
Loading