@fbrpc/fbrpc-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * fbrpc 错误类型。
3
+ * handler 内部 throw RpcError 时,框架自动转为统一错误响应。
4
+ */
5
+ export declare class RpcError extends Error {
6
+ code: string;
7
+ constructor(message: string, code?: string);
8
+ }
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAGxB,IAAI,EAAE,MAAM;gBADnB,OAAO,EAAE,MAAM,EACR,IAAI,GAAE,MAAoB;CAKpC"}
package/dist/errors.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * fbrpc 错误类型。
3
+ * handler 内部 throw RpcError 时,框架自动转为统一错误响应。
4
+ */
5
+ export class RpcError extends Error {
6
+ code;
7
+ constructor(message, code = "API_ERROR") {
8
+ super(message);
9
+ this.code = code;
10
+ this.name = "RpcError";
11
+ }
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGxB;IAFT,YACE,OAAe,EACR,OAAe,WAAW;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,SAAI,GAAJ,IAAI,CAAsB;QAGjC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export type { ApiDef, ReqOf, ResOf, Protocol, ApiCall, StreamCall, ApiHandler, StreamHandler, AnyApiHandler, AnyStreamHandler, ServiceHandlers, ApiModule, SuccResponse, ErrResponse, ApiResponse, } from "./types.js";
2
+ export { RpcError } from "./errors.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,MAAM,EACN,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { RpcError } from "./errors.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * fbrpc-core — 核心类型定义,零依赖。
3
+ *
4
+ * 设计目标:AI 打开一个文件就能理解全部 API 契约。
5
+ * 协议层只用纯 TS 接口,不引入任何框架类型。
6
+ */
7
+ /** 单个 API 的请求/响应类型对 */
8
+ export interface ApiDef<Req = unknown, Res = unknown> {
9
+ req: Req;
10
+ res: Res;
11
+ }
12
+ /** 从 ApiDef 提取请求类型 */
13
+ export type ReqOf<D extends ApiDef> = D["req"];
14
+ /** 从 ApiDef 提取响应类型 */
15
+ export type ResOf<D extends ApiDef> = D["res"];
16
+ /** 协议映射:{ 方法名: ApiDef } */
17
+ export type Protocol = Record<string, ApiDef>;
18
+ /**
19
+ * 普通 RPC 调用的 call 对象。
20
+ * handler 通过 call.succ() / call.error() 回传结果,
21
+ * 不抛异常、不 return 值。
22
+ */
23
+ export interface ApiCall<D extends ApiDef = ApiDef> {
24
+ /** 请求参数(协议定义的 req 类型) */
25
+ req: D["req"];
26
+ /**
27
+ * 元数据——由服务器鉴权函数注入。
28
+ * 通常包含 userId、sessionId 等横切信息。
29
+ */
30
+ meta: Record<string, unknown>;
31
+ /** 成功响应 */
32
+ succ(data: D["res"]): void;
33
+ /** 业务错误 */
34
+ error(message: string, code?: string): void;
35
+ }
36
+ /**
37
+ * SSE 流式调用的 call 对象。
38
+ * handler 调用 call.stream(fn),框架负责把 yield 转成 SSE 事件。
39
+ */
40
+ export interface StreamCall<D extends ApiDef<unknown, void> = ApiDef<unknown, void>> {
41
+ req: D["req"];
42
+ meta: Record<string, unknown>;
43
+ /**
44
+ * 启动流式输出。
45
+ * fn 接收 send 函数,每次 send(chunk) 输出一个 SSE 事件。
46
+ */
47
+ stream(fn: (send: (chunk: unknown) => Promise<void> | void) => Promise<void>): void;
48
+ /** 流式错误 */
49
+ error(message: string): void;
50
+ }
51
+ /** 普通 RPC 处理器(泛型——用于单一定义) */
52
+ export type ApiHandler<D extends ApiDef = ApiDef> = (call: ApiCall<D>) => Promise<void>;
53
+ /** SSE 流式处理器(泛型——用于单一定义) */
54
+ export type StreamHandler<D extends ApiDef<unknown, void> = ApiDef<unknown, void>> = (call: StreamCall<D>) => void;
55
+ /** 宽松版 handler——接受任意 ApiCall,用于模块导出 */
56
+ export type AnyApiHandler = (call: ApiCall<any>) => Promise<void>;
57
+ export type AnyStreamHandler = (call: StreamCall<any>) => void;
58
+ /**
59
+ * 从 Protocol 推导类型安全的 handler 映射。
60
+ *
61
+ * 用于 services 目录下各 api.ts 的 handlers 导出——
62
+ * `satisfies ServiceHandlers<Protocol>` 确保:
63
+ * 1. 所有协议方法都被实现(无遗漏)
64
+ * 2. key 精确对齐(无多余)
65
+ * 3. 每个 handler 的 call 参数自动推导 req/res 类型
66
+ *
67
+ * 配合 call 参数的类型注解(如 `ApiCall<Protocol["method"]>`),
68
+ * 达成全链路编译期类型安全。
69
+ */
70
+ export type ServiceHandlers<P> = {
71
+ [K in keyof P & string]: P[K] extends ApiDef<infer Req, infer Res> ? (call: ApiCall<ApiDef<Req, Res>>) => Promise<void> : never;
72
+ };
73
+ /**
74
+ * 一个服务模块的导出。
75
+ * services/<name>/api.ts 必须导出这个形状。
76
+ */
77
+ export interface ApiModule {
78
+ /** 普通 RPC 处理器。key = 方法名。 */
79
+ handlers: Record<string, AnyApiHandler>;
80
+ /** SSE 流式处理器。key = 方法名。 */
81
+ streams: Record<string, AnyStreamHandler>;
82
+ }
83
+ /** 统一成功响应 */
84
+ export interface SuccResponse<T = unknown> {
85
+ ok: true;
86
+ data: T;
87
+ }
88
+ /** 统一错误响应 */
89
+ export interface ErrResponse {
90
+ ok: false;
91
+ error: {
92
+ message: string;
93
+ code: string;
94
+ };
95
+ }
96
+ /** 统一响应 */
97
+ export type ApiResponse<T = unknown> = SuccResponse<T> | ErrResponse;
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * fbrpc-core — 核心类型定义,零依赖。
3
+ *
4
+ * 设计目标:AI 打开一个文件就能理解全部 API 契约。
5
+ * 协议层只用纯 TS 接口,不引入任何框架类型。
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@fbrpc/fbrpc-core",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^22.0.0",
19
+ "typescript": "^5.0.0"
20
+ },
21
+ "description": "fbrpc core types — protocol definition, ApiCall, StreamCall, ApiModule. Zero dependencies.",
22
+ "author": "birderr",
23
+ "license": "MIT",
24
+ "keywords": [
25
+ "rpc",
26
+ "fastify",
27
+ "type-safe",
28
+ "protocol"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/fbrpc/fbrpc"
33
+ }
34
+ }
package/src/errors.ts ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * fbrpc 错误类型。
3
+ * handler 内部 throw RpcError 时,框架自动转为统一错误响应。
4
+ */
5
+ export class RpcError extends Error {
6
+ constructor(
7
+ message: string,
8
+ public code: string = "API_ERROR",
9
+ ) {
10
+ super(message);
11
+ this.name = "RpcError";
12
+ }
13
+ }
package/src/index.ts ADDED
@@ -0,0 +1,18 @@
1
+ export type {
2
+ ApiDef,
3
+ ReqOf,
4
+ ResOf,
5
+ Protocol,
6
+ ApiCall,
7
+ StreamCall,
8
+ ApiHandler,
9
+ StreamHandler,
10
+ AnyApiHandler,
11
+ AnyStreamHandler,
12
+ ServiceHandlers,
13
+ ApiModule,
14
+ SuccResponse,
15
+ ErrResponse,
16
+ ApiResponse,
17
+ } from "./types.js";
18
+ export { RpcError } from "./errors.js";
package/src/types.ts ADDED
@@ -0,0 +1,123 @@
1
+ /**
2
+ * fbrpc-core — 核心类型定义,零依赖。
3
+ *
4
+ * 设计目标:AI 打开一个文件就能理解全部 API 契约。
5
+ * 协议层只用纯 TS 接口,不引入任何框架类型。
6
+ */
7
+
8
+ // ── API 定义 ──
9
+
10
+ /** 单个 API 的请求/响应类型对 */
11
+ export interface ApiDef<Req = unknown, Res = unknown> {
12
+ req: Req;
13
+ res: Res;
14
+ }
15
+
16
+ /** 从 ApiDef 提取请求类型 */
17
+ export type ReqOf<D extends ApiDef> = D["req"];
18
+
19
+ /** 从 ApiDef 提取响应类型 */
20
+ export type ResOf<D extends ApiDef> = D["res"];
21
+
22
+ /** 协议映射:{ 方法名: ApiDef } */
23
+ export type Protocol = Record<string, ApiDef>;
24
+
25
+ // ── call 对象 ──
26
+
27
+ /**
28
+ * 普通 RPC 调用的 call 对象。
29
+ * handler 通过 call.succ() / call.error() 回传结果,
30
+ * 不抛异常、不 return 值。
31
+ */
32
+ export interface ApiCall<D extends ApiDef = ApiDef> {
33
+ /** 请求参数(协议定义的 req 类型) */
34
+ req: D["req"];
35
+ /**
36
+ * 元数据——由服务器鉴权函数注入。
37
+ * 通常包含 userId、sessionId 等横切信息。
38
+ */
39
+ meta: Record<string, unknown>;
40
+ /** 成功响应 */
41
+ succ(data: D["res"]): void;
42
+ /** 业务错误 */
43
+ error(message: string, code?: string): void;
44
+ }
45
+
46
+ /**
47
+ * SSE 流式调用的 call 对象。
48
+ * handler 调用 call.stream(fn),框架负责把 yield 转成 SSE 事件。
49
+ */
50
+ export interface StreamCall<D extends ApiDef<unknown, void> = ApiDef<unknown, void>> {
51
+ req: D["req"];
52
+ meta: Record<string, unknown>;
53
+ /**
54
+ * 启动流式输出。
55
+ * fn 接收 send 函数,每次 send(chunk) 输出一个 SSE 事件。
56
+ */
57
+ stream(fn: (send: (chunk: unknown) => Promise<void> | void) => Promise<void>): void;
58
+ /** 流式错误 */
59
+ error(message: string): void;
60
+ }
61
+
62
+ // ── 处理器 ──
63
+
64
+ /** 普通 RPC 处理器(泛型——用于单一定义) */
65
+ export type ApiHandler<D extends ApiDef = ApiDef> = (call: ApiCall<D>) => Promise<void>;
66
+
67
+ /** SSE 流式处理器(泛型——用于单一定义) */
68
+ export type StreamHandler<D extends ApiDef<unknown, void> = ApiDef<unknown, void>> = (call: StreamCall<D>) => void;
69
+
70
+ /** 宽松版 handler——接受任意 ApiCall,用于模块导出 */
71
+ export type AnyApiHandler = (call: ApiCall<any>) => Promise<void>;
72
+ export type AnyStreamHandler = (call: StreamCall<any>) => void;
73
+
74
+ /**
75
+ * 从 Protocol 推导类型安全的 handler 映射。
76
+ *
77
+ * 用于 services 目录下各 api.ts 的 handlers 导出——
78
+ * `satisfies ServiceHandlers<Protocol>` 确保:
79
+ * 1. 所有协议方法都被实现(无遗漏)
80
+ * 2. key 精确对齐(无多余)
81
+ * 3. 每个 handler 的 call 参数自动推导 req/res 类型
82
+ *
83
+ * 配合 call 参数的类型注解(如 `ApiCall<Protocol["method"]>`),
84
+ * 达成全链路编译期类型安全。
85
+ */
86
+ export type ServiceHandlers<P> = {
87
+ [K in keyof P & string]: P[K] extends ApiDef<infer Req, infer Res>
88
+ ? (call: ApiCall<ApiDef<Req, Res>>) => Promise<void>
89
+ : never
90
+ };
91
+
92
+ // ── 模块描述 ──
93
+
94
+ /**
95
+ * 一个服务模块的导出。
96
+ * services/<name>/api.ts 必须导出这个形状。
97
+ */
98
+ export interface ApiModule {
99
+ /** 普通 RPC 处理器。key = 方法名。 */
100
+ handlers: Record<string, AnyApiHandler>;
101
+ /** SSE 流式处理器。key = 方法名。 */
102
+ streams: Record<string, AnyStreamHandler>;
103
+ }
104
+
105
+ // ── 响应格式 ──
106
+
107
+ /** 统一成功响应 */
108
+ export interface SuccResponse<T = unknown> {
109
+ ok: true;
110
+ data: T;
111
+ }
112
+
113
+ /** 统一错误响应 */
114
+ export interface ErrResponse {
115
+ ok: false;
116
+ error: {
117
+ message: string;
118
+ code: string;
119
+ };
120
+ }
121
+
122
+ /** 统一响应 */
123
+ export type ApiResponse<T = unknown> = SuccResponse<T> | ErrResponse;
package/tsconfig.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src"
6
+ }
7
+ }