# lite graph design
## Key features
- Postgres as event storage
- Hasura as gql/rest provider
- Parsers are written in any wasm compiled language
- Parser api should be based on Cloudflare workers design
## Parser api
Parser api looks like this:
```rust
pub struct Message();
pub struct Transaction();
pub struct Block();
pub struct ParserContext{
pub block: Block,
pub database: Database,
}
pub struct Hash(String);
pub struct Address(String);
pub struct ContractState(Vec<u8>);
pub struct DbRecord{
pub table: String,
pub message_hash: Hash,
pub transaction_hash: Hash,
pub data: serde_json::Value,
}
impl ParserContext{
pub async fn save_record(&self, record: DbRecord) -> Result<()>{
...
}
pub fn get_contract_state(&self, address: Address) -> Option<ContractState>{
...
}
}
pub trait Parser{
async fn handle_message(ctx: ParserContext, message: Message);
async fn handle_transaction(ctx: ParserContext, transaction: Transaction){
for message in transaction.messages{
handle_message(ctx, message).await;
}
}
async fn handle_block(ctx: ParserContext, block: Block){
for transaction in block.transactions{
handle_transaction(ctx, transaction).await;
}
}
}
```
Every target language should implement this API in a Wasm wrapper.
## Flow
- `npx lite-graph init my-awesome-parser`
- User implements a parser in his language of choice
- User fills db schema or predefined `json | yaml` config
- `npx lite-graph compile` produces Wasm file
- `npx lite-graph load path/to/binary.wasm` loads binary
- `npx lite-graph serve` starts parsing using new config and code. Hasura server starts listening for requests
## Components
- lite-graph core:
- Wasm interpreter
- data storage layer
- lite-graph cli:
- init
- compile
- load
- serve
- lite-graph hasura:
- hasura server
- hasura migrations generator
- hasura metadata generator
- ts bindings for core api
- rust bindings for core api
- python bindings for core api