| 1 | module jsonrpc |
| 2 | |
| 3 | // EventInterceptor called on `jsonrpc.dispatch_event` |
| 4 | pub type EventInterceptor = fn (name string, data string) |
| 5 | |
| 6 | // EncodedRequestInterceptor called on `jsonrpc.intercept_encoded_request` |
| 7 | pub type EncodedRequestInterceptor = fn (req []u8) ! |
| 8 | |
| 9 | // RequestInterceptor called on `jsonrpc.intercept_request` |
| 10 | pub type RequestInterceptor = fn (req &Request) ! |
| 11 | |
| 12 | // ResponseInterceptor called on `jsonrpc.intercept_response` |
| 13 | pub type ResponseInterceptor = fn (resp &Response) |
| 14 | |
| 15 | // EncodedResponseInterceptor called on `jsonrpc.intercept_encoded_response` |
| 16 | pub type EncodedResponseInterceptor = fn (resp []u8) |
| 17 | |
| 18 | // Interceptors collection of all supported interceptors to be called on events |
| 19 | pub struct Interceptors { |
| 20 | pub mut: |
| 21 | event []EventInterceptor |
| 22 | encoded_request []EncodedRequestInterceptor |
| 23 | request []RequestInterceptor |
| 24 | response []ResponseInterceptor |
| 25 | encoded_response []EncodedResponseInterceptor |
| 26 | } |
| 27 | |
| 28 | // dispatch_event sends `event_name` and `data` to provided `jsonrpc.EventInterceptor`s |
| 29 | pub fn dispatch_event(ints []EventInterceptor, event_name string, data string) { |
| 30 | for i in ints { |
| 31 | i(event_name, data) |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | // intercept_encoded_request sends raw request data before attempting |
| 36 | // to decode it into `jsonrpc.Request` to provided `jsonrpc.EncodedRequestInterceptor`s |
| 37 | pub fn intercept_encoded_request(ints []EncodedRequestInterceptor, req []u8) ! { |
| 38 | for i in ints { |
| 39 | i(req)! |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | // intercept_request sends decoded `jsonrpc.Request` to provided `jsonrpc.RequestInterceptor`s |
| 44 | pub fn intercept_request(ints []RequestInterceptor, req &Request) ! { |
| 45 | for i in ints { |
| 46 | i(req)! |
| 47 | } |
| 48 | } |
| 49 | |
| 50 | // intercept_response sends decoded `jsonrpc.Response` to provided `jsonrpc.ResponseInterceptor`s |
| 51 | pub fn intercept_response(ints []ResponseInterceptor, resp &Response) { |
| 52 | for i in ints { |
| 53 | i(resp) |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | // intercept_encoded_response sends raw encoded data representing |
| 58 | // `jsonrpc.Response` to provided `jsonrpc.EncodedResponseInterceptor`s |
| 59 | pub fn intercept_encoded_response(ints []EncodedResponseInterceptor, resp []u8) { |
| 60 | for i in ints { |
| 61 | i(resp) |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | // is_interceptor_enabled checks if interceptor of provided type is enabled on `jsonrpc.Server` |
| 66 | pub fn (s &Server) is_interceptor_enabled[T]() bool { |
| 67 | s.get_interceptor[T]() or { return false } |
| 68 | return true |
| 69 | } |
| 70 | |
| 71 | // get_interceptor tries to find and return interceptor of provided type from `jsonrpc.Interceptors` |
| 72 | pub fn (i Interceptors) get_interceptor[T]() ?&T { |
| 73 | for inter in i.event { |
| 74 | if inter is T { |
| 75 | return inter |
| 76 | } |
| 77 | } |
| 78 | for inter in i.encoded_request { |
| 79 | if inter is T { |
| 80 | return inter |
| 81 | } |
| 82 | } |
| 83 | for inter in i.request { |
| 84 | if inter is T { |
| 85 | return inter |
| 86 | } |
| 87 | } |
| 88 | for inter in i.response { |
| 89 | if inter is T { |
| 90 | return inter |
| 91 | } |
| 92 | } |
| 93 | for inter in i.encoded_response { |
| 94 | if inter is T { |
| 95 | return inter |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | return none |
| 100 | } |
| 101 | |