11import { Writer } from '@jsonjoy.com/util/lib/buffers/Writer' ;
2- import type { IWriter , IWriterGrowable } from '@jsonjoy.com/util/lib/buffers' ;
3- import type { Reader } from '@jsonjoy.com/buffers/lib/Reader' ;
2+ import { Reader } from '@jsonjoy.com/buffers/lib/Reader' ;
43import { RpcMsgType , RpcReplyStat , RPC_VERSION } from './constants' ;
54import { RpcEncodingError } from './errors' ;
65import {
@@ -10,6 +9,7 @@ import {
109 RpcRejectedReplyMessage ,
1110 RpcMessage ,
1211} from './messages' ;
12+ import type { IWriter , IWriterGrowable } from '@jsonjoy.com/util/lib/buffers' ;
1313
1414export class RpcMessageEncoder < W extends IWriter & IWriterGrowable = IWriter & IWriterGrowable > {
1515 constructor ( public readonly writer : W = new Writer ( ) as any ) { }
@@ -73,25 +73,29 @@ export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & I
7373 params ?: Reader | Uint8Array ,
7474 ) : void {
7575 const writer = this . writer ;
76- writer . u32 ( xid ) ;
77- writer . u32 ( RpcMsgType . CALL ) ;
78- writer . u32 ( RPC_VERSION ) ;
79- writer . u32 ( prog ) ;
80- writer . u32 ( vers ) ;
81- writer . u32 ( proc ) ;
76+ writer . ensureCapacity ( 16 * 4 ) ;
77+ const view = writer . view ;
78+ let x = writer . x ;
79+ view . setUint32 ( x , xid , false ) ;
80+ x += 4 ;
81+ view . setUint32 ( x , RpcMsgType . CALL , false ) ;
82+ x += 4 ;
83+ view . setUint32 ( x , RPC_VERSION , false ) ;
84+ x += 4 ;
85+ view . setUint32 ( x , prog , false ) ;
86+ x += 4 ;
87+ view . setUint32 ( x , vers , false ) ;
88+ x += 4 ;
89+ view . setUint32 ( x , proc , false ) ;
90+ x += 4 ;
91+ writer . x = x ;
8292 this . writeOpaqueAuth ( cred ) ;
8393 this . writeOpaqueAuth ( verf ) ;
84- if ( params ) {
85- if ( params instanceof Uint8Array ) {
86- if ( params . length > 0 ) {
87- writer . buf ( params , params . length ) ;
88- }
89- } else {
90- const size = params . size ( ) ;
91- if ( size > 0 ) {
92- writer . buf ( params . uint8 , size ) ;
93- }
94- }
94+ if ( params instanceof Uint8Array ) {
95+ if ( params . length > 0 ) writer . buf ( params , params . length ) ;
96+ } else if ( params instanceof Reader ) {
97+ const size = params . size ( ) ;
98+ if ( size > 0 ) writer . buf ( params . subarray ( 0 , size ) , size ) ;
9599 }
96100 }
97101
@@ -103,9 +107,16 @@ export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & I
103107 results ?: Reader | Uint8Array ,
104108 ) : void {
105109 const writer = this . writer ;
106- writer . u32 ( xid ) ;
107- writer . u32 ( RpcMsgType . REPLY ) ;
108- writer . u32 ( RpcReplyStat . MSG_ACCEPTED ) ;
110+ writer . ensureCapacity ( 16 * 4 ) ;
111+ const view = writer . view ;
112+ let x = writer . x ;
113+ view . setUint32 ( x , xid , false ) ;
114+ x += 4 ;
115+ view . setUint32 ( x , RpcMsgType . REPLY , false ) ;
116+ x += 4 ;
117+ view . setUint32 ( x , RpcReplyStat . MSG_ACCEPTED , false ) ;
118+ x += 4 ;
119+ writer . x = x ;
109120 this . writeOpaqueAuth ( verf ) ;
110121 writer . u32 ( acceptStat ) ;
111122 if ( mismatchInfo ) {
@@ -114,14 +125,10 @@ export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & I
114125 }
115126 if ( results ) {
116127 if ( results instanceof Uint8Array ) {
117- if ( results . length > 0 ) {
118- writer . buf ( results , results . length ) ;
119- }
128+ if ( results . length > 0 ) writer . buf ( results , results . length ) ;
120129 } else {
121130 const size = results . size ( ) ;
122- if ( size > 0 ) {
123- writer . buf ( results . uint8 , size ) ;
124- }
131+ if ( size > 0 ) writer . buf ( results . uint8 , size ) ;
125132 }
126133 }
127134 }
@@ -133,32 +140,52 @@ export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & I
133140 authStat ?: number ,
134141 ) : void {
135142 const writer = this . writer ;
136- writer . u32 ( xid ) ;
137- writer . u32 ( RpcMsgType . REPLY ) ;
138- writer . u32 ( RpcReplyStat . MSG_DENIED ) ;
139- writer . u32 ( rejectStat ) ;
143+ writer . ensureCapacity ( 7 * 4 ) ;
144+ const view = writer . view ;
145+ let x = writer . x ;
146+ view . setUint32 ( x , xid , false ) ;
147+ x += 4 ;
148+ view . setUint32 ( x , RpcMsgType . REPLY , false ) ;
149+ x += 4 ;
150+ view . setUint32 ( x , RpcReplyStat . MSG_DENIED , false ) ;
151+ x += 4 ;
152+ view . setUint32 ( x , rejectStat , false ) ;
153+ x += 4 ;
140154 if ( mismatchInfo ) {
141- writer . u32 ( mismatchInfo . low ) ;
142- writer . u32 ( mismatchInfo . high ) ;
155+ view . setUint32 ( x , mismatchInfo . low , false ) ;
156+ x += 4 ;
157+ view . setUint32 ( x , mismatchInfo . high , false ) ;
158+ x += 4 ;
143159 }
144160 if ( authStat !== undefined ) {
145- writer . u32 ( authStat ) ;
161+ view . setUint32 ( x , authStat , false ) ;
162+ x += 4 ;
146163 }
164+ writer . x = x ;
147165 }
148166
149167 private writeOpaqueAuth ( auth : RpcOpaqueAuth ) : void {
150168 const writer = this . writer ;
151- writer . u32 ( auth . flavor ) ;
152169 const body = auth . body ;
153170 const length = body . size ( ) ;
154171 if ( length > 400 ) throw new RpcEncodingError ( 'Auth body too large' ) ;
155- writer . u32 ( length ) ;
172+ writer . ensureCapacity ( 2 * 4 + length + 3 ) ;
173+ const view = writer . view ;
174+ let x = writer . x ;
175+ view . setUint32 ( x , auth . flavor , false ) ;
176+ x += 4 ;
177+ view . setUint32 ( x , length , false ) ;
178+ x += 4 ;
156179 if ( length > 0 ) {
180+ writer . x = x ;
157181 writer . buf ( body . subarray ( 0 , length ) , length ) ;
182+ x = writer . x ;
158183 const padding = ( 4 - ( length % 4 ) ) % 4 ;
159184 for ( let i = 0 ; i < padding ; i ++ ) {
160- writer . u8 ( 0 ) ;
185+ view . setUint8 ( x , 0 ) ;
186+ x += 1 ;
161187 }
162188 }
189+ writer . x = x ;
163190 }
164191}
0 commit comments