@mingzey/typedrpc 1.0.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.
- package/LICENSE +21 -0
- package/README.md +228 -0
- package/README.zh-CN.md +228 -0
- package/dist/api.d.ts +16 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +52 -0
- package/dist/api.js.map +1 -0
- package/dist/client.d.ts +28 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +50 -0
- package/dist/client.js.map +1 -0
- package/dist/connecitons/basic.d.ts +42 -0
- package/dist/connecitons/basic.d.ts.map +1 -0
- package/dist/connecitons/basic.js +9 -0
- package/dist/connecitons/basic.js.map +1 -0
- package/dist/connecitons/http.d.ts +38 -0
- package/dist/connecitons/http.d.ts.map +1 -0
- package/dist/connecitons/http.js +143 -0
- package/dist/connecitons/http.js.map +1 -0
- package/dist/connecitons/socket.d.ts +33 -0
- package/dist/connecitons/socket.d.ts.map +1 -0
- package/dist/connecitons/socket.js +210 -0
- package/dist/connecitons/socket.js.map +1 -0
- package/dist/connecitons/socketio.d.ts +32 -0
- package/dist/connecitons/socketio.d.ts.map +1 -0
- package/dist/connecitons/socketio.js +162 -0
- package/dist/connecitons/socketio.js.map +1 -0
- package/dist/connection.d.ts +5 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +5 -0
- package/dist/connection.js.map +1 -0
- package/dist/context.d.ts +13 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/core.d.ts +40 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +97 -0
- package/dist/core.js.map +1 -0
- package/dist/define.d.ts +14 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +40 -0
- package/dist/define.js.map +1 -0
- package/dist/handler.d.ts +30 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +172 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/packet.d.ts +36 -0
- package/dist/packet.d.ts.map +1 -0
- package/dist/packet.js +40 -0
- package/dist/packet.js.map +1 -0
- package/dist/server.d.ts +34 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +51 -0
- package/dist/server.js.map +1 -0
- package/dist/test/TestCase.d.ts +6 -0
- package/dist/test/TestCase.d.ts.map +1 -0
- package/dist/test/TestCase.js +5 -0
- package/dist/test/TestCase.js.map +1 -0
- package/dist/test/authorization.d.ts +8 -0
- package/dist/test/authorization.d.ts.map +1 -0
- package/dist/test/authorization.js +169 -0
- package/dist/test/authorization.js.map +1 -0
- package/dist/test/basic.d.ts +7 -0
- package/dist/test/basic.d.ts.map +1 -0
- package/dist/test/basic.js +35 -0
- package/dist/test/basic.js.map +1 -0
- package/dist/test/context.d.ts +7 -0
- package/dist/test/context.d.ts.map +1 -0
- package/dist/test/context.js +55 -0
- package/dist/test/context.js.map +1 -0
- package/dist/test/expressmix.d.ts +7 -0
- package/dist/test/expressmix.d.ts.map +1 -0
- package/dist/test/expressmix.js +63 -0
- package/dist/test/expressmix.js.map +1 -0
- package/dist/test/full-duplex.d.ts +12 -0
- package/dist/test/full-duplex.d.ts.map +1 -0
- package/dist/test/full-duplex.js +77 -0
- package/dist/test/full-duplex.js.map +1 -0
- package/dist/test/socket.d.ts +8 -0
- package/dist/test/socket.d.ts.map +1 -0
- package/dist/test/socket.js +71 -0
- package/dist/test/socket.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +33 -0
- package/dist/test.js.map +1 -0
- package/dist/utils.d.ts +40 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +46 -0
- package/dist/utils.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { IdMaker, TypedEmitter } from "../utils.js";
|
|
2
|
+
import { TypeRPCConnection, TypeRPCConnectionProvider } from "./basic.js";
|
|
3
|
+
class TypeRPCConnectionSocketIO extends TypeRPCConnection {
|
|
4
|
+
socket;
|
|
5
|
+
msgEmitter = new TypedEmitter();
|
|
6
|
+
currentId = 1;
|
|
7
|
+
requests = new Map();
|
|
8
|
+
constructor(socket) {
|
|
9
|
+
super();
|
|
10
|
+
this.socket = socket;
|
|
11
|
+
// 处理外部请求
|
|
12
|
+
this.msgEmitter.on('receive', (data) => {
|
|
13
|
+
// console.log(`[${this.socket.id}][R]:${data}`);
|
|
14
|
+
const recivePlayload = JSON.parse(data);
|
|
15
|
+
if (recivePlayload.type == 'request'
|
|
16
|
+
&& recivePlayload.id) {
|
|
17
|
+
this.emitter.emit('request', {
|
|
18
|
+
data: recivePlayload.data,
|
|
19
|
+
response: (data) => {
|
|
20
|
+
const sendPlayout = {
|
|
21
|
+
type: 'response',
|
|
22
|
+
id: recivePlayload.id,
|
|
23
|
+
data: data,
|
|
24
|
+
};
|
|
25
|
+
this.socket.send(JSON.stringify(sendPlayout));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else if (recivePlayload.type == 'response'
|
|
30
|
+
&& recivePlayload.id) {
|
|
31
|
+
this.requests.get(recivePlayload.id)?.resolve(recivePlayload.data);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async request(data) {
|
|
36
|
+
const requestId = `${this.currentId++}`;
|
|
37
|
+
const payload = {
|
|
38
|
+
type: 'request',
|
|
39
|
+
id: requestId,
|
|
40
|
+
data: data,
|
|
41
|
+
};
|
|
42
|
+
const requestPromise = new Promise((resolve) => {
|
|
43
|
+
this.requests.set(requestId, {
|
|
44
|
+
resolve: resolve
|
|
45
|
+
});
|
|
46
|
+
// 发送数据
|
|
47
|
+
// console.log(`[${this.socket.id}][T]:${JSON.stringify(payload)}`);
|
|
48
|
+
this.socket.send(JSON.stringify(payload));
|
|
49
|
+
}).finally(() => {
|
|
50
|
+
this.requests.delete(requestId);
|
|
51
|
+
});
|
|
52
|
+
return await requestPromise;
|
|
53
|
+
}
|
|
54
|
+
getId() {
|
|
55
|
+
return this.socket.id;
|
|
56
|
+
}
|
|
57
|
+
close() {
|
|
58
|
+
return this.socket.close();
|
|
59
|
+
}
|
|
60
|
+
isClosed() {
|
|
61
|
+
return this.socket.isClosed();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
class TypeRPCConnectionProviderSocketIO extends TypeRPCConnectionProvider {
|
|
65
|
+
io = null;
|
|
66
|
+
async listen(config) {
|
|
67
|
+
const httpModule = await import("http").catch(() => null);
|
|
68
|
+
if (!httpModule) {
|
|
69
|
+
throw new Error("http module not found");
|
|
70
|
+
}
|
|
71
|
+
const socketIOServerModule = await import("socket.io").catch(() => null);
|
|
72
|
+
if (!socketIOServerModule) {
|
|
73
|
+
throw new Error("socket.io module not found");
|
|
74
|
+
}
|
|
75
|
+
const server = httpModule.createServer();
|
|
76
|
+
const io = new socketIOServerModule.Server(server, {
|
|
77
|
+
cors: {
|
|
78
|
+
origin: "*",
|
|
79
|
+
methods: ["GET", "POST"],
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
io.on('connection', (socket) => {
|
|
83
|
+
const connection = new TypeRPCConnectionSocketIO({
|
|
84
|
+
id: socket.id,
|
|
85
|
+
send: (data) => {
|
|
86
|
+
socket.emit('message', data);
|
|
87
|
+
},
|
|
88
|
+
close: () => {
|
|
89
|
+
socket.disconnect();
|
|
90
|
+
return true;
|
|
91
|
+
},
|
|
92
|
+
isClosed: () => {
|
|
93
|
+
return socket.disconnected;
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
this.emitter.emit('connection', connection); // 告知TypeRPCHandler有新连接
|
|
97
|
+
socket.on('message', (data) => {
|
|
98
|
+
connection.msgEmitter.emit('receive', data);
|
|
99
|
+
});
|
|
100
|
+
socket.on('close', () => {
|
|
101
|
+
connection.close();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
this.io = io;
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
server.listen(config.port, config.hostname, () => {
|
|
107
|
+
resolve(true);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async close() {
|
|
112
|
+
return new Promise((resolve, reject) => {
|
|
113
|
+
if (!this.io) {
|
|
114
|
+
return resolve(true);
|
|
115
|
+
}
|
|
116
|
+
this.io.sockets.sockets.forEach((socket) => {
|
|
117
|
+
socket.disconnect();
|
|
118
|
+
});
|
|
119
|
+
this.io.close((err) => {
|
|
120
|
+
if (err) {
|
|
121
|
+
reject(err);
|
|
122
|
+
}
|
|
123
|
+
resolve(true);
|
|
124
|
+
});
|
|
125
|
+
this.io = null;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
async connect(target) {
|
|
129
|
+
const SocketIOClientModule = await import("socket.io-client").catch(() => null);
|
|
130
|
+
if (!SocketIOClientModule) {
|
|
131
|
+
throw new Error("socket.io-client module not found");
|
|
132
|
+
}
|
|
133
|
+
return new Promise((resolve, reject) => {
|
|
134
|
+
const socket = SocketIOClientModule.io(`ws://${target}`);
|
|
135
|
+
const connection = new TypeRPCConnectionSocketIO({
|
|
136
|
+
id: socket.id || IdMaker.makeId(),
|
|
137
|
+
send: (data) => {
|
|
138
|
+
socket.emit('message', data);
|
|
139
|
+
},
|
|
140
|
+
close: () => {
|
|
141
|
+
socket.disconnect();
|
|
142
|
+
return true;
|
|
143
|
+
},
|
|
144
|
+
isClosed: () => {
|
|
145
|
+
return socket.disconnected;
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
this.emitter.emit('connection', connection); // 告知TypeRPCHandler有新连接
|
|
149
|
+
socket.on('connect', () => {
|
|
150
|
+
resolve(connection);
|
|
151
|
+
});
|
|
152
|
+
socket.on('message', (data) => {
|
|
153
|
+
connection.msgEmitter.emit('receive', data);
|
|
154
|
+
});
|
|
155
|
+
socket.on('close', () => {
|
|
156
|
+
connection.close();
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export { TypeRPCConnectionSocketIO, TypeRPCConnectionProviderSocketIO, };
|
|
162
|
+
//# sourceMappingURL=socketio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socketio.js","sourceRoot":"","sources":["../../src/connecitons/socketio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { TypeRPCConnectionHTTP, TypeRPCConnectionProviderHTTP } from "./connecitons/http.js";
|
|
2
|
+
declare const TypeRPCConnectionDefault: typeof TypeRPCConnectionHTTP;
|
|
3
|
+
declare const TypeRPCConnectionProviderDefault: typeof TypeRPCConnectionProviderHTTP;
|
|
4
|
+
export { TypeRPCConnectionDefault, TypeRPCConnectionProviderDefault, };
|
|
5
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAG7F,QAAA,MAAM,wBAAwB,8BAAwB,CAAC;AACvD,QAAA,MAAM,gCAAgC,sCAAgC,CAAC;AAEvE,OAAO,EACH,wBAAwB,EACxB,gCAAgC,GACnC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { TypeRPCConnectionHTTP, TypeRPCConnectionProviderHTTP } from "./connecitons/http.js";
|
|
2
|
+
const TypeRPCConnectionDefault = TypeRPCConnectionHTTP;
|
|
3
|
+
const TypeRPCConnectionProviderDefault = TypeRPCConnectionProviderHTTP;
|
|
4
|
+
export { TypeRPCConnectionDefault, TypeRPCConnectionProviderDefault, };
|
|
5
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAG7F,MAAM,wBAAwB,GAAG,qBAAqB,CAAC;AACvD,MAAM,gCAAgC,GAAG,6BAA6B,CAAC;AAEvE,OAAO,EACH,wBAAwB,EACxB,gCAAgC,GACnC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TypeRPCConnection } from "./connecitons/basic.js";
|
|
2
|
+
import type { TypeRPCPacket } from "./packet.js";
|
|
3
|
+
type TypeRPCContext = {
|
|
4
|
+
connection: TypeRPCConnection;
|
|
5
|
+
inbound?: TypeRPCPacket;
|
|
6
|
+
outbound?: TypeRPCPacket;
|
|
7
|
+
};
|
|
8
|
+
export declare const TypeRPCContextSymbol: unique symbol;
|
|
9
|
+
interface TypeRPCContextAware {
|
|
10
|
+
[TypeRPCContextSymbol]: TypeRPCContext | null;
|
|
11
|
+
}
|
|
12
|
+
export type { TypeRPCContextAware, TypeRPCContext, };
|
|
13
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,KAAK,cAAc,GAAG;IAClB,UAAU,EAAC,iBAAiB,CAAC;IAC7B,OAAO,CAAC,EAAC,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAC,aAAa,CAAC;CAC3B,CAAA;AAED,eAAO,MAAM,oBAAoB,eAA2B,CAAC;AAC7D,UAAU,mBAAmB;IACzB,CAAC,oBAAoB,CAAC,EAAC,cAAc,GAAG,IAAI,CAAC;CAChD;AAED,YAAY,EACR,mBAAmB,EACnB,cAAc,GACjB,CAAA"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC"}
|
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { TypeRPCConnection, TypeRPCConnectionProvider } from "./connecitons/basic.js";
|
|
2
|
+
import { TypeRPCHandler } from "./handler.js";
|
|
3
|
+
import { type TypeRPCRequestPacket, type TypeRPCResponsePacket } from "./packet.js";
|
|
4
|
+
import { TypedEmitter } from "./utils.js";
|
|
5
|
+
type TypeRPCCoreConfig = {
|
|
6
|
+
connection?: {
|
|
7
|
+
provider: TypeRPCConnectionProvider;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
type TypeRPCCoreEvents = {
|
|
11
|
+
connection: (connection: TypeRPCConnection) => void;
|
|
12
|
+
};
|
|
13
|
+
declare class TypeRPCCore {
|
|
14
|
+
emitter: TypedEmitter<TypeRPCCoreEvents>;
|
|
15
|
+
private config;
|
|
16
|
+
handler: TypeRPCHandler;
|
|
17
|
+
constructor(config: TypeRPCCoreConfig);
|
|
18
|
+
private init;
|
|
19
|
+
get hook(): (serviceName: string, methodName: string, config: {
|
|
20
|
+
handler: (...args: any[]) => any;
|
|
21
|
+
bind?: any;
|
|
22
|
+
}) => void;
|
|
23
|
+
request(config: {
|
|
24
|
+
connection: TypeRPCConnection;
|
|
25
|
+
serviceName: string;
|
|
26
|
+
methodName: string;
|
|
27
|
+
args: any[];
|
|
28
|
+
}): Promise<{
|
|
29
|
+
request: TypeRPCRequestPacket;
|
|
30
|
+
response: TypeRPCResponsePacket;
|
|
31
|
+
}>;
|
|
32
|
+
listen(config: {
|
|
33
|
+
port: number;
|
|
34
|
+
hostname?: string;
|
|
35
|
+
}): Promise<boolean>;
|
|
36
|
+
close(): Promise<boolean>;
|
|
37
|
+
connect(target: string): Promise<TypeRPCConnection>;
|
|
38
|
+
}
|
|
39
|
+
export { TypeRPCCore };
|
|
40
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAE1F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAwB,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACzG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,KAAK,iBAAiB,GAAG;IACrB,UAAU,CAAC,EAAC;QACR,QAAQ,EAAC,yBAAyB,CAAC;KACtC,CAAA;CACJ,CAAA;AAED,KAAK,iBAAiB,GAAG;IACrB,UAAU,EAAC,CAAC,UAAU,EAAC,iBAAiB,KAAG,IAAI,CAAC;CACnD,CAAA;AAED,cAAM,WAAW;IAEN,OAAO,kCAAyC;IACvD,OAAO,CAAC,MAAM,CAAmB;IAC1B,OAAO,EAAC,cAAc,CAAC;gBAElB,MAAM,EAAC,iBAAiB;IAWpC,OAAO,CAAC,IAAI;IA4BZ,IAAI,IAAI;kBAoE0iE,GAAG;YAA+B,CAAC;eAlEplE;IAEY,OAAO,CAAC,MAAM,EAAC;QACxB,UAAU,EAAC,iBAAiB,CAAC;QAC7B,WAAW,EAAC,MAAM,CAAC;QACnB,UAAU,EAAC,MAAM,CAAC;QAClB,IAAI,EAAC,GAAG,EAAE,CAAC;KACd,GAAE,OAAO,CAAC;QACP,OAAO,EAAC,oBAAoB,CAAC;QAC7B,QAAQ,EAAC,qBAAqB,CAAC;KAClC,CAAC;IAwBW,MAAM,CAAC,MAAM,EAAC;QACvB,IAAI,EAAC,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAC,MAAM,CAAC;KACpB,GAAE,OAAO,CAAC,OAAO,CAAC;IAQN,KAAK,IAAG,OAAO,CAAC,OAAO,CAAC;IAQxB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAC;CASlE;AAED,OAAO,EACH,WAAW,EACd,CAAA"}
|
package/dist/core.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { TypeRPCConnectionProviderDefault } from "./connection.js";
|
|
2
|
+
import { TypeRPCHandler } from "./handler.js";
|
|
3
|
+
import { TypeRPCPacketFactory } from "./packet.js";
|
|
4
|
+
import { TypedEmitter } from "./utils.js";
|
|
5
|
+
class TypeRPCCore {
|
|
6
|
+
emitter = new TypedEmitter();
|
|
7
|
+
config;
|
|
8
|
+
handler;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
const defaultConfig = {
|
|
11
|
+
connection: {
|
|
12
|
+
provider: new TypeRPCConnectionProviderDefault(),
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
this.config = { ...defaultConfig, ...config };
|
|
16
|
+
this.handler = new TypeRPCHandler();
|
|
17
|
+
this.init();
|
|
18
|
+
}
|
|
19
|
+
init() {
|
|
20
|
+
const provider = this.config.connection?.provider;
|
|
21
|
+
if (provider) {
|
|
22
|
+
provider.emitter.on('connection', (connection) => {
|
|
23
|
+
this.emitter.emit('connection', connection);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
this.emitter.on('connection', (connection) => {
|
|
27
|
+
// 提供对向请求处理
|
|
28
|
+
connection.emitter.on('request', (context) => {
|
|
29
|
+
try {
|
|
30
|
+
const requestPacket = JSON.parse(context.data);
|
|
31
|
+
if (!TypeRPCPacketFactory.isRequestPacket(requestPacket)) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.handler.handle(connection, requestPacket, (responsePacket) => {
|
|
35
|
+
if (!responsePacket) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
context.response(JSON.stringify(responsePacket));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
console.error(e);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
get hook() {
|
|
48
|
+
return this.handler.hook.bind(this.handler);
|
|
49
|
+
}
|
|
50
|
+
async request(config) {
|
|
51
|
+
const requestPacket = TypeRPCPacketFactory.createRequestPacket({
|
|
52
|
+
serviceName: config.serviceName,
|
|
53
|
+
methodName: config.methodName,
|
|
54
|
+
args: config.args,
|
|
55
|
+
});
|
|
56
|
+
const responsePacket = await this.handler.request(config.connection, requestPacket).catch((e) => {
|
|
57
|
+
return TypeRPCPacketFactory.createResponsePacket({
|
|
58
|
+
requestId: requestPacket.id,
|
|
59
|
+
error: e
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
if (!TypeRPCPacketFactory.isResponsePacket(responsePacket)) {
|
|
63
|
+
throw new Error(`Invalid response packet:\n${JSON.stringify(responsePacket)}`);
|
|
64
|
+
}
|
|
65
|
+
if (responsePacket.requestId != requestPacket.id) {
|
|
66
|
+
throw new Error(`Invalid response packet:request id not match\n${JSON.stringify(requestPacket)}\n${JSON.stringify(responsePacket)}`);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
request: requestPacket,
|
|
70
|
+
response: responsePacket,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async listen(config) {
|
|
74
|
+
const provider = this.config.connection?.provider;
|
|
75
|
+
if (!provider) {
|
|
76
|
+
throw new Error("Connection provider not found");
|
|
77
|
+
}
|
|
78
|
+
return provider.listen(config);
|
|
79
|
+
}
|
|
80
|
+
async close() {
|
|
81
|
+
const provider = this.config.connection?.provider;
|
|
82
|
+
if (!provider) {
|
|
83
|
+
throw new Error("Connection provider not found");
|
|
84
|
+
}
|
|
85
|
+
return provider.close();
|
|
86
|
+
}
|
|
87
|
+
async connect(target) {
|
|
88
|
+
const provider = this.config.connection?.provider;
|
|
89
|
+
if (!provider) {
|
|
90
|
+
throw new Error("Connection provider not found");
|
|
91
|
+
}
|
|
92
|
+
const connection = await provider.connect(target);
|
|
93
|
+
return connection;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export { TypeRPCCore };
|
|
97
|
+
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/define.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type TypeRPCAPIDefineType = Record<string, Record<string, any>>;
|
|
2
|
+
declare class TypeRPCAPIDefine<T extends TypeRPCAPIDefineType> {
|
|
3
|
+
static TypeRPCService: symbol;
|
|
4
|
+
static TypeRPCMethod: symbol;
|
|
5
|
+
static TypeRPCMethodList: symbol;
|
|
6
|
+
constructor(config?: TypeRPCAPIDefineType);
|
|
7
|
+
static method(): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
|
|
8
|
+
static isService(target: any): boolean;
|
|
9
|
+
static isMethod(method: any): boolean;
|
|
10
|
+
static getMethodList(service: any): string[];
|
|
11
|
+
}
|
|
12
|
+
export type { TypeRPCAPIDefineType, };
|
|
13
|
+
export { TypeRPCAPIDefine, };
|
|
14
|
+
//# sourceMappingURL=define.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AACA,KAAK,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;AAQ/D,cAAM,gBAAgB,CAAC,CAAC,SAAS,oBAAoB;IAEjD,MAAM,CAAC,cAAc,SAA4B;IACjD,MAAM,CAAC,aAAa,SAA2B;IAC/C,MAAM,CAAC,iBAAiB,SAA+B;gBAE3C,MAAM,CAAC,EAAC,oBAAoB;IAIxC,MAAM,CAAC,MAAM,KACQ,QAAO,GAAG,EAAE,aAAY,MAAM,EAAE,YAAW,kBAAkB;IAYlF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAC,GAAG;IAI3B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAC,GAAG;IAW1B,MAAM,CAAC,aAAa,CAAC,OAAO,EAAC,GAAG,GAAE,MAAM,EAAE;CAM7C;AAGD,YAAY,EACR,oBAAoB,GACvB,CAAA;AAED,OAAO,EACH,gBAAgB,GACnB,CAAA"}
|
package/dist/define.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
class TypeRPCAPIDefine {
|
|
2
|
+
static TypeRPCService = Symbol('TypeRPCService');
|
|
3
|
+
static TypeRPCMethod = Symbol('TypeRPCMethod');
|
|
4
|
+
static TypeRPCMethodList = Symbol('TypeRPCMethodList');
|
|
5
|
+
constructor(config) {
|
|
6
|
+
}
|
|
7
|
+
static method() {
|
|
8
|
+
return function (target, propertyKey, descriptor) {
|
|
9
|
+
descriptor.value[TypeRPCAPIDefine.TypeRPCMethod] = true;
|
|
10
|
+
if (!target[TypeRPCAPIDefine.TypeRPCService]) {
|
|
11
|
+
target[TypeRPCAPIDefine.TypeRPCService] = true;
|
|
12
|
+
}
|
|
13
|
+
if (!target[TypeRPCAPIDefine.TypeRPCMethodList]) {
|
|
14
|
+
target[TypeRPCAPIDefine.TypeRPCMethodList] = new Set();
|
|
15
|
+
}
|
|
16
|
+
target[TypeRPCAPIDefine.TypeRPCMethodList].add(propertyKey);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
static isService(target) {
|
|
20
|
+
return target[TypeRPCAPIDefine.TypeRPCService] === true;
|
|
21
|
+
}
|
|
22
|
+
static isMethod(method) {
|
|
23
|
+
// 判断是否是方法
|
|
24
|
+
if (typeof method !== 'function') {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (method[TypeRPCAPIDefine.TypeRPCMethod] != true) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
static getMethodList(service) {
|
|
33
|
+
if (!TypeRPCAPIDefine.isService(service)) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
return Array.from(service[TypeRPCAPIDefine.TypeRPCMethodList]);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export { TypeRPCAPIDefine, };
|
|
40
|
+
//# sourceMappingURL=define.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AASA,MAAM,gBAAgB;IAElB,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACjD,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAEvD,YAAY,MAA4B;IAExC,CAAC;IAED,MAAM,CAAC,MAAM;QACT,OAAQ,UAAS,MAAU,EAAE,WAAkB,EAAE,UAA6B;YAC1E,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;YACxD,IAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAC,CAAC;gBACzC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;YACnD,CAAC;YACD,IAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAC,CAAC;gBAC5C,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,IAAI,GAAG,EAAU,CAAC;YACnE,CAAC;YACD,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChE,CAAC,CAAA;IACL,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,MAAU;QACvB,OAAO,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,MAAU;QACtB,UAAU;QACV,IAAG,OAAO,MAAM,KAAK,UAAU,EAAC,CAAC;YAC7B,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,IAAI,EAAC,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,OAAW;QAC5B,IAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAC,CAAC;YACrC,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACnE,CAAC;;AAQL,OAAO,EACH,gBAAgB,GACnB,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TypeRPCConnection } from "./connecitons/basic.js";
|
|
2
|
+
import { type TypeRPCContext } from "./context.js";
|
|
3
|
+
import { type TypeRPCPacket, type TypeRPCRequestPacket, type TypeRPCResponsePacket } from "./packet.js";
|
|
4
|
+
import { TypedEmitter } from "./utils.js";
|
|
5
|
+
declare class TypeRPCHandlerMiddleware {
|
|
6
|
+
inbound(context: TypeRPCContext): Promise<TypeRPCContext>;
|
|
7
|
+
outbound(context: TypeRPCContext): Promise<TypeRPCContext>;
|
|
8
|
+
}
|
|
9
|
+
type TypeRPCHandlerEvents = {};
|
|
10
|
+
/**
|
|
11
|
+
* 处理所有TypeRPC数据包,管理入站出站
|
|
12
|
+
*/
|
|
13
|
+
declare class TypeRPCHandler {
|
|
14
|
+
emitter: TypedEmitter<TypeRPCHandlerEvents>;
|
|
15
|
+
private middlewares;
|
|
16
|
+
private hooks;
|
|
17
|
+
constructor();
|
|
18
|
+
use(middleware: TypeRPCHandlerMiddleware): this;
|
|
19
|
+
private middlewareProcesser;
|
|
20
|
+
outbound(context: TypeRPCContext): Promise<TypeRPCContext>;
|
|
21
|
+
inbound(context: TypeRPCContext): Promise<TypeRPCContext>;
|
|
22
|
+
request(connection: TypeRPCConnection, request: TypeRPCRequestPacket): Promise<TypeRPCPacket>;
|
|
23
|
+
handle(connection: TypeRPCConnection, request: TypeRPCRequestPacket, response: (packet: TypeRPCResponsePacket) => void): Promise<null | undefined>;
|
|
24
|
+
hook(serviceName: string, methodName: string, config: {
|
|
25
|
+
handler: (...args: any[]) => any;
|
|
26
|
+
bind?: any;
|
|
27
|
+
}): void;
|
|
28
|
+
}
|
|
29
|
+
export { TypeRPCHandler, TypeRPCHandlerMiddleware };
|
|
30
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAwB,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9H,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ1C,cAAM,wBAAwB;IACpB,OAAO,CAAC,OAAO,EAAC,cAAc,GAAE,OAAO,CAAC,cAAc,CAAC;IAGvD,QAAQ,CAAC,OAAO,EAAC,cAAc,GAAE,OAAO,CAAC,cAAc,CAAC;CAGjE;AAED,KAAK,oBAAoB,GAAG,EAE3B,CAAA;AACD;;GAEG;AACH,cAAM,cAAc;IAET,OAAO,qCAA4C;IAE1D,OAAO,CAAC,WAAW,CAAiC;IAEpD,OAAO,CAAC,KAAK,CAGJ;;IAwDF,GAAG,CAAC,UAAU,EAAC,wBAAwB;YAKhC,mBAAmB;IAqBpB,QAAQ,CAAC,OAAO,EAAC,cAAc,GAAE,OAAO,CAAC,cAAc,CAAC;IAOxD,OAAO,CAAC,OAAO,EAAC,cAAc,GAAE,OAAO,CAAC,cAAc,CAAC;IAOvD,OAAO,CAAC,UAAU,EAAC,iBAAiB,EAAC,OAAO,EAAC,oBAAoB,GAAE,OAAO,CAAC,aAAa,CAAC;IAiCzF,MAAM,CAAC,UAAU,EAAC,iBAAiB,EAAC,OAAO,EAAC,oBAAoB,EAAC,QAAQ,EAAC,CAAC,MAAM,EAAC,qBAAqB,KAAK,IAAI;IAiB7H,IAAI,CAAC,WAAW,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM,EAAC,MAAM,EAAC;QAC7C,OAAO,EAAC,CAAC,GAAG,IAAI,EAAC,GAAG,EAAE,KAAG,GAAG,CAAC;QAC7B,IAAI,CAAC,EAAC,GAAG,CAAC;KACb;CAWJ;AAED,OAAO,EACH,cAAc,EACd,wBAAwB,EAC3B,CAAA"}
|
package/dist/handler.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { TypeRPCContextSymbol } from "./context.js";
|
|
2
|
+
import { TypeRPCPacketFactory } from "./packet.js";
|
|
3
|
+
import { TypedEmitter } from "./utils.js";
|
|
4
|
+
// interface TypeRPCHandlerMiddleware{
|
|
5
|
+
// inbound?:(context:TypeRPCContext) => Promise<TypeRPCContext>;
|
|
6
|
+
// outbound?:(context:TypeRPCContext) => Promise<TypeRPCContext>;
|
|
7
|
+
// }
|
|
8
|
+
class TypeRPCHandlerMiddleware {
|
|
9
|
+
async inbound(context) {
|
|
10
|
+
return context;
|
|
11
|
+
}
|
|
12
|
+
async outbound(context) {
|
|
13
|
+
return context;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 处理所有TypeRPC数据包,管理入站出站
|
|
18
|
+
*/
|
|
19
|
+
class TypeRPCHandler {
|
|
20
|
+
emitter = new TypedEmitter();
|
|
21
|
+
middlewares = [];
|
|
22
|
+
hooks = {};
|
|
23
|
+
constructor() {
|
|
24
|
+
this.use({
|
|
25
|
+
inbound: async (context) => {
|
|
26
|
+
// Fallback 托底返回错误
|
|
27
|
+
if (context.inbound && !context.outbound) {
|
|
28
|
+
context.outbound = TypeRPCPacketFactory.createResponsePacket({
|
|
29
|
+
requestId: context.inbound.id,
|
|
30
|
+
error: "service not available or not found",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return context;
|
|
34
|
+
},
|
|
35
|
+
outbound: async (context) => {
|
|
36
|
+
return context;
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
this.use({
|
|
40
|
+
inbound: async (context) => {
|
|
41
|
+
if (!context.inbound
|
|
42
|
+
|| !TypeRPCPacketFactory.isRequestPacket(context.inbound)) {
|
|
43
|
+
return context;
|
|
44
|
+
}
|
|
45
|
+
// 如果已经有出站包,直接返回
|
|
46
|
+
if (context.outbound) {
|
|
47
|
+
return context;
|
|
48
|
+
}
|
|
49
|
+
const serviceName = context.inbound.serviceName;
|
|
50
|
+
const methodName = context.inbound.methodName;
|
|
51
|
+
const args = context.inbound.args;
|
|
52
|
+
const hook = this.hooks[serviceName]?.[methodName];
|
|
53
|
+
if (!hook) {
|
|
54
|
+
return context;
|
|
55
|
+
}
|
|
56
|
+
const result = await hook.handler.call(new Proxy(hook.bind || {}, {
|
|
57
|
+
get(target, prop) {
|
|
58
|
+
if (prop === TypeRPCContextSymbol) {
|
|
59
|
+
return context;
|
|
60
|
+
}
|
|
61
|
+
return Reflect.get(target, prop);
|
|
62
|
+
}
|
|
63
|
+
}), ...args);
|
|
64
|
+
const response = TypeRPCPacketFactory.createResponsePacket({
|
|
65
|
+
requestId: context.inbound.id,
|
|
66
|
+
result: result,
|
|
67
|
+
});
|
|
68
|
+
context.outbound = response;
|
|
69
|
+
return context;
|
|
70
|
+
},
|
|
71
|
+
outbound: async (context) => {
|
|
72
|
+
return context;
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
use(middleware) {
|
|
77
|
+
this.middlewares.push(middleware);
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
async middlewareProcesser(context, index, direction) {
|
|
81
|
+
const middleware = this.middlewares[index];
|
|
82
|
+
if (!middleware) {
|
|
83
|
+
return context;
|
|
84
|
+
}
|
|
85
|
+
// 执行中间件
|
|
86
|
+
if (direction == 'inbound') {
|
|
87
|
+
if (middleware.inbound) {
|
|
88
|
+
context = await middleware.inbound(context);
|
|
89
|
+
}
|
|
90
|
+
index--;
|
|
91
|
+
}
|
|
92
|
+
if (direction == 'outbound') {
|
|
93
|
+
if (middleware.outbound) {
|
|
94
|
+
context = await middleware.outbound(context);
|
|
95
|
+
}
|
|
96
|
+
index++;
|
|
97
|
+
}
|
|
98
|
+
return this.middlewareProcesser(context, index, direction);
|
|
99
|
+
}
|
|
100
|
+
async outbound(context) {
|
|
101
|
+
if (this.middlewares.length <= 0) {
|
|
102
|
+
return context;
|
|
103
|
+
}
|
|
104
|
+
return this.middlewareProcesser(context, 0, 'outbound');
|
|
105
|
+
}
|
|
106
|
+
async inbound(context) {
|
|
107
|
+
if (this.middlewares.length <= 0) {
|
|
108
|
+
return context;
|
|
109
|
+
}
|
|
110
|
+
return this.middlewareProcesser(context, this.middlewares.length - 1, 'inbound');
|
|
111
|
+
}
|
|
112
|
+
async request(connection, request) {
|
|
113
|
+
let context = {
|
|
114
|
+
connection: connection,
|
|
115
|
+
outbound: request,
|
|
116
|
+
};
|
|
117
|
+
context = await this.outbound(context);
|
|
118
|
+
if (!context.outbound) {
|
|
119
|
+
throw new Error("Request failed: outbound is empty");
|
|
120
|
+
}
|
|
121
|
+
const res = await connection.request(JSON.stringify(context.outbound));
|
|
122
|
+
if (!res) {
|
|
123
|
+
throw new Error("Response is empty");
|
|
124
|
+
}
|
|
125
|
+
let responseObject = null;
|
|
126
|
+
try {
|
|
127
|
+
responseObject = JSON.parse(res);
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
throw new Error("Response is not a valid JSON string:" + res);
|
|
131
|
+
}
|
|
132
|
+
if (!TypeRPCPacketFactory.isPacket(responseObject)) {
|
|
133
|
+
throw new Error("Response is not a TypeRPCPacket");
|
|
134
|
+
}
|
|
135
|
+
if (!TypeRPCPacketFactory.isResponsePacket(responseObject)) {
|
|
136
|
+
throw new Error("Response is not a TypeRPCResponsePacket");
|
|
137
|
+
}
|
|
138
|
+
context.inbound = responseObject;
|
|
139
|
+
context = await this.inbound(context);
|
|
140
|
+
if (!context.inbound) {
|
|
141
|
+
throw new Error("Request failed: inbound is empty");
|
|
142
|
+
}
|
|
143
|
+
return context.inbound;
|
|
144
|
+
}
|
|
145
|
+
async handle(connection, request, response) {
|
|
146
|
+
let context = {
|
|
147
|
+
connection: connection,
|
|
148
|
+
inbound: request,
|
|
149
|
+
};
|
|
150
|
+
context = await this.inbound(context);
|
|
151
|
+
if (!context.outbound) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
context = await this.outbound(context);
|
|
155
|
+
if (!context.outbound
|
|
156
|
+
|| !TypeRPCPacketFactory.isResponsePacket(context.outbound)) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
response(context.outbound);
|
|
160
|
+
}
|
|
161
|
+
hook(serviceName, methodName, config) {
|
|
162
|
+
if (!this.hooks[serviceName]) {
|
|
163
|
+
this.hooks[serviceName] = {};
|
|
164
|
+
}
|
|
165
|
+
this.hooks[serviceName][methodName] = {
|
|
166
|
+
handler: config.handler,
|
|
167
|
+
bind: config.bind,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export { TypeRPCHandler, TypeRPCHandlerMiddleware };
|
|
172
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
|