-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrpc.ts
87 lines (72 loc) · 1.84 KB
/
rpc.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import { PaginationRequest, PaginationResponse } from './pagination';
const RESPONSE_STATUSES = ['success', 'error'] as const;
export type ResponseStatus = (typeof RESPONSE_STATUSES)[number];
type BaseResponse = {
/**
* Status of the response
*/
status: ResponseStatus;
/**
* Computer-friendly code (e.g. OK or E_ACCESS_DENIED)
*/
code: string;
};
type BaseSuccessResponse = BaseResponse & {
status: 'success';
};
type SuccessResponseWithPayload<TPayload> = BaseSuccessResponse & {
/**
* Response payload
* @example { "userId": "123", "name": "John Doe" }
*/
payload: TPayload;
};
export type SuccessResponse<TPayload = void> = TPayload extends void
? BaseSuccessResponse
: SuccessResponseWithPayload<TPayload>;
type BaseErrorResponse = BaseResponse & {
status: 'error';
/**
* Human-friendly message (e.g. Failed to fetch data or Access denied)
* @example "Failed to fetch data"
*/
message: string;
};
type ErrorResponseWithPayload<TError> = BaseErrorResponse & {
/**
* Error payload
* @example { "code": "E_ACCESS_DENIED", "message": "Access denied" }
*/
payload: TError;
};
export type ErrorResponse<TError = void> = TError extends void
? BaseErrorResponse
: ErrorResponseWithPayload<TError>;
export type Response = SuccessResponse | ErrorResponse;
export type PaginatedResponse<TDataItem = any> = SuccessResponseWithPayload<
Array<TDataItem>
> & {
/**
* Pagination response
*/
pagination: PaginationResponse;
};
export type PaginatedRequest = {
/**
* Pagination request
*/
pagination: PaginationRequest;
};
export type FilteredRequest<TFilters = any> = {
/**
* Filtered request
*/
filters: TFilters;
};
export type RequestWithPayload<TPayload = any> = {
/**
* Request payload
* @example { "userId": "123", "name": "John Doe" }
*/
payload: TPayload;
};