1
1
import chalk from "chalk" ;
2
2
import * as path from "path" ;
3
3
import { TSBuffer } from 'tsbuffer' ;
4
- import { ApiService , Counter , Flow , getCustomObjectIdTypes , MsgHandlerManager , MsgService , ParsedServerInput , ServiceMap , ServiceMapUtil , TransportDataUtil } from 'tsrpc-base-client' ;
4
+ import { Counter , Flow , getCustomObjectIdTypes , MsgHandlerManager , MsgService , ParsedServerInput , ServiceMap , ServiceMapUtil , TransportDataUtil } from 'tsrpc-base-client' ;
5
5
import { ApiReturn , ApiServiceDef , BaseServiceType , Logger , LogLevel , ServerInputData , ServiceProto , setLogLevel , TsrpcError , TsrpcErrorType } from 'tsrpc-proto' ;
6
6
import { getClassObjectId } from "../../models/getClassObjectId" ;
7
7
import { ApiCallInner } from "../inner/ApiCallInner" ;
@@ -59,7 +59,16 @@ export abstract class BaseServer<ServiceType extends BaseServiceType = BaseServi
59
59
* Before processing the received data, usually be used to encryption / decryption.
60
60
* Return `null | undefined` would ignore the buffer.
61
61
*/
62
- preRecvDataFlow : new Flow < { conn : BaseConnection < ServiceType > , data : string | Uint8Array | object , serviceName ?: string } > ( ) ,
62
+ preRecvDataFlow : new Flow < {
63
+ conn : BaseConnection < ServiceType > ,
64
+ data : string | Uint8Array | object ,
65
+ /**
66
+ * @deprecated use `serviceId` instead
67
+ */
68
+ serviceName ?: string ,
69
+ /** Parsed service id */
70
+ serviceId ?: number
71
+ } > ( ) ,
63
72
/**
64
73
* Before send out data to network, usually be used to encryption / decryption.
65
74
* Return `null | undefined` would not send the buffer.
@@ -221,7 +230,7 @@ export abstract class BaseServer<ServiceType extends BaseServiceType = BaseServi
221
230
/**
222
231
* Process the buffer, after the `preRecvBufferFlow`.
223
232
*/
224
- async _onRecvData ( conn : BaseConnection < ServiceType > , data : string | Uint8Array | object , serviceName ?: string ) {
233
+ async _onRecvData ( conn : BaseConnection < ServiceType > , data : string | Uint8Array | object , serviceId ?: number ) {
225
234
// 非 OPENED 状态 停止接受新的请求
226
235
if ( ! ( conn instanceof InnerConnection ) && this . status !== ServerStatus . Opened ) {
227
236
return ;
@@ -246,13 +255,28 @@ export abstract class BaseServer<ServiceType extends BaseServiceType = BaseServi
246
255
return ;
247
256
}
248
257
249
- let pre = await this . flows . preRecvDataFlow . exec ( { conn : conn , data : data , serviceName : serviceName } , conn . logger ) ;
258
+ // Pre flow
259
+ const preServiceName = serviceId ? this . serviceMap . id2Service [ serviceId ] . name : undefined ;
260
+ let pre = await this . flows . preRecvDataFlow . exec ( {
261
+ conn : conn ,
262
+ data : data ,
263
+ serviceId : serviceId ,
264
+ serviceName : preServiceName
265
+ } , conn . logger ) ;
250
266
if ( ! pre ) {
251
267
conn . logger . debug ( '[preRecvDataFlow] Canceled' ) ;
252
268
return ;
253
269
}
254
270
data = pre . data ;
255
- serviceName = pre . serviceName ;
271
+
272
+ // Pre flow res
273
+ if ( pre . serviceId !== serviceId ) {
274
+ serviceId = pre . serviceId
275
+ }
276
+ // @deprecated 兼容
277
+ else if ( pre . serviceName && pre . serviceName !== preServiceName ) {
278
+ serviceId = this . serviceMap . apiName2Service [ pre . serviceName ] ?. id ;
279
+ }
256
280
257
281
// @deprecated preRecvBuffer
258
282
if ( data instanceof Uint8Array ) {
@@ -265,7 +289,7 @@ export abstract class BaseServer<ServiceType extends BaseServiceType = BaseServi
265
289
}
266
290
267
291
// Parse Call
268
- let opInput = this . _parseServerInput ( this . tsbuffer , this . serviceMap , data , serviceName ) ;
292
+ let opInput = this . _parseServerInput ( this . tsbuffer , this . serviceMap , data , serviceId ) ;
269
293
if ( ! opInput . isSucc ) {
270
294
this . onInputDataError ( opInput . errMsg , conn , data ) ;
271
295
return ;
@@ -668,7 +692,8 @@ export abstract class BaseServer<ServiceType extends BaseServiceType = BaseServi
668
692
if ( apiName . startsWith ( '/' ) ) {
669
693
apiName = apiName . slice ( 1 ) ;
670
694
}
671
- if ( ! this . serviceMap . apiName2Service [ apiName ] ) {
695
+ const service = this . serviceMap . apiName2Service [ apiName ] ;
696
+ if ( ! service ) {
672
697
return {
673
698
isSucc : false ,
674
699
err : new TsrpcError ( `Invalid service name: ${ apiName } ` , {
@@ -690,7 +715,7 @@ export abstract class BaseServer<ServiceType extends BaseServiceType = BaseServi
690
715
}
691
716
} ) ;
692
717
693
- this . _onRecvData ( conn , req , apiName ) ;
718
+ this . _onRecvData ( conn , req , service . id ) ;
694
719
} )
695
720
}
696
721
@@ -716,7 +741,7 @@ export abstract class BaseServer<ServiceType extends BaseServiceType = BaseServi
716
741
} )
717
742
}
718
743
719
- protected _parseServerInput ( tsbuffer : TSBuffer , serviceMap : ServiceMap , data : string | Uint8Array | object , serviceName ?: string ) : { isSucc : true , result : ParsedServerInput } | { isSucc : false , errMsg : string } {
744
+ protected _parseServerInput ( tsbuffer : TSBuffer , serviceMap : ServiceMap , data : string | Uint8Array | object , serviceId ?: number ) : { isSucc : true , result : ParsedServerInput } | { isSucc : false , errMsg : string } {
720
745
if ( data instanceof Uint8Array ) {
721
746
let opServerInputData = TransportDataUtil . tsbuffer . decode ( data , 'ServerInputData' ) ;
722
747
@@ -773,31 +798,32 @@ export abstract class BaseServer<ServiceType extends BaseServiceType = BaseServi
773
798
let body : any ;
774
799
let sn : number | undefined ;
775
800
776
- // Parse serviceName / body / sn
777
- let service : ApiService | MsgService | undefined ;
778
- const oriServiceName = serviceName ;
779
- if ( serviceName == undefined ) {
801
+ // Parse serviceId / body / sn
802
+ if ( serviceId == undefined ) {
803
+ // 未指定 serviceId,必然是长连接,传入格式应该是数组 [serviceName, body, sn?]
780
804
if ( ! Array . isArray ( json ) ) {
781
805
return { isSucc : false , errMsg : `Invalid request format: unresolved service name.` } ;
782
806
}
783
- serviceName = json [ 0 ] as string ;
807
+
784
808
body = json [ 1 ] ;
785
809
sn = json [ 2 ] ;
810
+
811
+ // Parse serviceId
812
+ const serviceName = json [ 0 ] as string ;
813
+ const isMsg = sn === undefined ;
814
+ serviceId = ( isMsg ? serviceMap . msgName2Service : serviceMap . apiName2Service ) [ serviceName ] ?. id ;
815
+ if ( serviceId === undefined ) {
816
+ return { isSucc : false , errMsg : `Invalid ${ isMsg ? 'msg' : 'api' } path: ${ serviceName } ` } ;
817
+ }
786
818
}
787
819
else {
788
820
body = json ;
789
821
}
790
822
791
823
// Get Service
792
- service = serviceMap . apiName2Service [ serviceName ] ?? serviceMap . msgName2Service [ serviceName ] ;
824
+ let service = serviceMap . id2Service [ serviceId ] ;
793
825
if ( ! service ) {
794
- let errMsg = `Invalid service name: ${ chalk . cyan . underline ( serviceName ) } ` ;
795
-
796
- // 可能是 JSON 模式下,jsonHostPath 未设置妥当的原因,此时给予友好提示
797
- if ( oriServiceName ) {
798
- // TODO
799
- }
800
-
826
+ let errMsg = `Invalid service id: ${ chalk . cyan . underline ( serviceId ) } ` ;
801
827
return { isSucc : false , errMsg : errMsg } ;
802
828
}
803
829
0 commit comments