@@ -6,75 +6,76 @@ export enum ProtocolType {
66 String ,
77 Buffer ,
88 Number ,
9- Int32 ,
109 JSONObject ,
1110 BigInt ,
1211 Array ,
13- Union ,
1412 Object ,
1513 Undefined ,
1614 Null ,
1715 Boolean ,
1816}
1917
2018export class AnySerializer {
21- constructor ( protected writer : BinaryWriter , protected reader : BinaryReader ) { }
19+ constructor (
20+ protected writer : BinaryWriter ,
21+ protected reader : BinaryReader ,
22+ protected objectTransfer ?: IObjectTransfer ,
23+ ) { }
2224
2325 write ( data : any ) {
2426 const { writer } = this ;
2527 const type = typeof data ;
2628 writer . reserve ( 1 ) ;
2729
28- switch ( type ) {
29- case 'undefined' :
30- writer . uint8 ( ProtocolType . Undefined ) ;
31- break ;
32- case 'string' :
33- writer . uint8 ( ProtocolType . String ) ;
34- writer . stringOfVarUInt32 ( data ) ;
35- break ;
36- case 'boolean' :
37- writer . reserve ( 1 ) ;
38- writer . uint8 ( ProtocolType . Boolean ) ;
39- writer . uint8 ( data ? 1 : 0 ) ;
40- break ;
41- case 'number' :
42- writer . reserve ( 8 ) ;
43- if ( ( data | 0 ) === data ) {
44- writer . uint8 ( ProtocolType . Int32 ) ;
45- writer . int32 ( data ) ;
46- } else {
47- writer . uint8 ( ProtocolType . Number ) ;
48- writer . double ( data ) ;
49- }
50- break ;
51- case 'bigint' :
52- writer . reserve ( 8 ) ;
53- writer . uint8 ( ProtocolType . BigInt ) ;
54- writer . int64 ( data ) ;
55- break ;
56- case 'object' :
57- if ( data === null ) {
58- writer . uint8 ( ProtocolType . Null ) ;
59- } else if ( Array . isArray ( data ) ) {
60- writer . reserve ( 4 ) ;
61- writer . uint8 ( ProtocolType . Array ) ;
62- writer . varUInt32 ( data . length ) ;
63- for ( const element of data ) {
64- this . write ( element ) ;
65- }
66- } else if ( isUint8Array ( data ) ) {
67- writer . reserve ( 4 ) ;
68- writer . uint8 ( ProtocolType . Buffer ) ;
69- writer . varUInt32 ( data . byteLength ) ;
70- writer . buffer ( data ) ;
71- } else {
72- writer . uint8 ( ProtocolType . JSONObject ) ;
73- writer . stringOfVarUInt32 ( JSON . stringify ( data , ObjectTransfer . replacer ) ) ;
74- }
75- break ;
30+ switch ( data ) {
31+ case null :
32+ writer . uint8 ( ProtocolType . Null ) ;
33+ return ;
7634 default :
77- throw new Error ( `Unknown type ${ type } ` ) ;
35+ switch ( type ) {
36+ case 'undefined' :
37+ writer . uint8 ( ProtocolType . Undefined ) ;
38+ break ;
39+ case 'string' :
40+ writer . uint8 ( ProtocolType . String ) ;
41+ writer . stringOfVarUInt32 ( data ) ;
42+ break ;
43+ case 'boolean' :
44+ writer . reserve ( 1 ) ;
45+ writer . uint8 ( ProtocolType . Boolean ) ;
46+ writer . uint8 ( data ? 1 : 0 ) ;
47+ break ;
48+ case 'number' :
49+ writer . reserve ( 8 ) ;
50+ writer . uint8 ( ProtocolType . Number ) ;
51+ writer . double ( data ) ;
52+ break ;
53+ case 'bigint' :
54+ writer . reserve ( 8 ) ;
55+ writer . uint8 ( ProtocolType . BigInt ) ;
56+ writer . int64 ( data ) ;
57+ break ;
58+ case 'object' :
59+ if ( Array . isArray ( data ) ) {
60+ writer . reserve ( 4 ) ;
61+ writer . uint8 ( ProtocolType . Array ) ;
62+ writer . varUInt32 ( data . length ) ;
63+ for ( const element of data ) {
64+ this . write ( element ) ;
65+ }
66+ } else if ( isUint8Array ( data ) ) {
67+ writer . reserve ( 4 ) ;
68+ writer . uint8 ( ProtocolType . Buffer ) ;
69+ writer . varUInt32 ( data . byteLength ) ;
70+ writer . buffer ( data ) ;
71+ } else {
72+ writer . uint8 ( ProtocolType . JSONObject ) ;
73+ writer . stringOfVarUInt32 ( JSON . stringify ( data , this . objectTransfer ?. replacer ) ) ;
74+ }
75+ break ;
76+ default :
77+ throw new Error ( `Unknown type ${ type } ` ) ;
78+ }
7879 }
7980 }
8081
@@ -93,13 +94,11 @@ export class AnySerializer {
9394 const length = reader . varUInt32 ( ) ;
9495 return reader . buffer ( length ) ;
9596 }
96- case ProtocolType . Int32 :
97- return reader . int32 ( ) ;
9897 case ProtocolType . Number :
9998 return reader . double ( ) ;
10099 case ProtocolType . JSONObject : {
101100 const json = reader . stringOfVarUInt32 ( ) ;
102- return JSON . parse ( json , ObjectTransfer . reviver ) ;
101+ return JSON . parse ( json , this . objectTransfer ? .reviver ) ;
103102 }
104103 case ProtocolType . BigInt :
105104 return reader . int64 ( ) ;
@@ -132,10 +131,19 @@ export class AnySerializer {
132131}
133132
134133enum EObjectTransferType {
135- CODE_URI = 'CODE_URI' ,
134+ CODE_URI = 'CodeURI' ,
135+ BUFFER = 'Buffer' ,
136136}
137137
138- class ObjectTransfer {
138+ export interface IObjectTransfer {
139+ replacer ( key : string | undefined , value : any ) : any ;
140+ reviver ( key : string | undefined , value : any ) : any ;
141+ }
142+
143+ /**
144+ * For transfering object between browser and extension
145+ */
146+ export class ExtObjectTransfer {
139147 static replacer ( key : string | undefined , value : any ) {
140148 if ( value ) {
141149 switch ( value . $mid ) {
@@ -148,6 +156,24 @@ class ObjectTransfer {
148156 } ;
149157 }
150158 }
159+
160+ if ( value instanceof Uint8Array || value instanceof Uint32Array || value instanceof Uint16Array ) {
161+ return {
162+ $type : 'Buffer' ,
163+ data : Array . from ( value ) ,
164+ } ;
165+ } else if ( value instanceof ArrayBuffer ) {
166+ return {
167+ $type : 'Buffer' ,
168+ data : Array . from ( new Uint8Array ( value ) ) ,
169+ } ;
170+ } else if ( value . type === 'Buffer' ) {
171+ // https://nodejs.org/api/buffer.html#buftojson
172+ return {
173+ $type : 'Buffer' ,
174+ data : value . data ,
175+ } ;
176+ }
151177 }
152178
153179 return value ;
@@ -157,6 +183,8 @@ class ObjectTransfer {
157183 switch ( value . $type ) {
158184 case EObjectTransferType . CODE_URI :
159185 return Uri . parse ( value . data ) ;
186+ case EObjectTransferType . BUFFER :
187+ return Uint8Array . from ( value . data ) ;
160188 }
161189 }
162190 return value ;
0 commit comments