@@ -24,7 +24,7 @@ class PCPFormat extends GenericFormat {
2424 if ( splitPos !== - 1 ) {
2525 const result = { } ;
2626 const message = data . substring ( splitPos + SEPARATOR . length ) ;
27- const pcpFields = extractPcpFields ( data . substring ( 0 , splitPos ) ) ;
27+ const pcpFields = this . extractPcpFields ( data . substring ( 0 , splitPos ) ) ;
2828 const operation = Object . values ( this . service . operations ) . find ( ( operation ) => {
2929 return (
3030 ( operation [ "@websocket.pcp.action" ] &&
@@ -41,14 +41,15 @@ class PCPFormat extends GenericFormat {
4141 if ( param [ "@websocket.pcp.message" ] || param [ "@ws.pcp.message" ] ) {
4242 result [ param . name ] = message ;
4343 } else if ( pcpFields [ param . name ] !== undefined ) {
44- result [ param . name ] = pcpFields [ param . name ] ;
44+ result [ param . name ] = this . parseStringValue ( pcpFields [ param . name ] , param . type ) ;
4545 }
4646 }
4747 return {
4848 event : this . localName ( operation . name ) ,
4949 data : result ,
5050 } ;
5151 }
52+ this . LOG ?. error ( `Operation could not be determined from action` , data ) ;
5253 }
5354 LOG ?. error ( "Error parsing pcp format" , data ) ;
5455 return {
@@ -75,79 +76,70 @@ class PCPFormat extends GenericFormat {
7576 } ) ;
7677 const pcpEvent =
7778 eventDefinition ?. [ "@websocket.pcp.event" ] || eventDefinition ?. [ "@ws.pcp.event" ] ? event : undefined ;
78- const pcpFields = serializePcpFields ( data , typeof pcpMessage , pcpAction , pcpEvent , eventDefinition ?. elements ) ;
79+ const pcpFields = this . serializePcpFields ( data , typeof pcpMessage , pcpAction , pcpEvent , eventDefinition ?. elements ) ;
7980 return pcpFields + pcpMessage ;
8081 }
81- }
8282
83- const serializePcpFields = ( pcpFields , messageType , pcpAction , pcpEvent , elements ) => {
84- let pcpBodyType = "" ;
85- if ( messageType === "string" ) {
86- pcpBodyType = "text" ;
87- } else if ( messageType === "blob" || messageType === "arraybuffer" ) {
88- pcpBodyType = "binary" ;
89- }
90- let serialized = "" ;
91- if ( pcpFields && typeof pcpFields === "object" ) {
92- for ( const fieldName in pcpFields ) {
93- const fieldValue = stringValue ( pcpFields [ fieldName ] ) ;
94- const element = elements ?. [ fieldName ] ;
95- if ( element ) {
96- if ( element [ "@websocket.ignore" ] || element [ "@ws.ignore" ] ) {
97- continue ;
98- }
99- if ( fieldValue && fieldName . indexOf ( "pcp-" ) !== 0 ) {
100- serialized += escape ( fieldName ) + ":" + escape ( fieldValue ) + "\n" ;
83+ serializePcpFields ( pcpFields , messageType , pcpAction , pcpEvent , elements ) {
84+ let pcpBodyType = "" ;
85+ if ( messageType === "string" ) {
86+ pcpBodyType = "text" ;
87+ } else if ( messageType === "blob" || messageType === "arraybuffer" ) {
88+ pcpBodyType = "binary" ;
89+ }
90+ let serialized = "" ;
91+ if ( pcpFields && typeof pcpFields === "object" ) {
92+ for ( const fieldName in pcpFields ) {
93+ const fieldValue = this . stringValue ( pcpFields [ fieldName ] ) ;
94+ const element = elements ?. [ fieldName ] ;
95+ if ( element ) {
96+ if ( element [ "@websocket.ignore" ] || element [ "@ws.ignore" ] ) {
97+ continue ;
98+ }
99+ if ( fieldValue && fieldName . indexOf ( "pcp-" ) !== 0 ) {
100+ serialized += this . escape ( fieldName ) + ":" + this . escape ( fieldValue ) + "\n" ;
101+ }
101102 }
102103 }
103104 }
105+ return (
106+ ( pcpAction ? "pcp-action:" + pcpAction + "\n" : "" ) +
107+ ( pcpEvent ? "pcp-event:" + pcpEvent + "\n" : "" ) +
108+ "pcp-body-type:" +
109+ pcpBodyType +
110+ "\n" +
111+ serialized +
112+ "\n"
113+ ) ;
104114 }
105- return (
106- ( pcpAction ? "pcp-action:" + pcpAction + "\n" : "" ) +
107- ( pcpEvent ? "pcp-event:" + pcpEvent + "\n" : "" ) +
108- "pcp-body-type:" +
109- pcpBodyType +
110- "\n" +
111- serialized +
112- "\n"
113- ) ;
114- } ;
115115
116- const extractPcpFields = ( header ) => {
117- const pcpFields = { } ;
118- for ( const field of header . split ( "\n" ) ) {
119- const lines = field . match ( DESERIALIZE_REGEX ) ;
120- if ( lines && lines . length === 3 ) {
121- pcpFields [ unescape ( lines [ 1 ] ) ] = unescape ( lines [ 2 ] ) ;
116+ extractPcpFields ( header ) {
117+ const pcpFields = { } ;
118+ for ( const field of header . split ( "\n" ) ) {
119+ const lines = field . match ( DESERIALIZE_REGEX ) ;
120+ if ( lines && lines . length === 3 ) {
121+ pcpFields [ this . unescape ( lines [ 1 ] ) ] = this . unescape ( lines [ 2 ] ) ;
122+ }
122123 }
124+ return pcpFields ;
123125 }
124- return pcpFields ;
125- } ;
126-
127- const escape = ( unescaped ) => {
128- return unescaped . replace ( / \\ / g, "\\\\" ) . replace ( / : / g, "\\:" ) . replace ( / \n / g, "\\n" ) ;
129- } ;
130126
131- const unescape = ( escaped ) => {
132- return escaped
133- . split ( "\u0008" )
134- . map ( ( part ) => {
135- return part
136- . replace ( / \\ \\ / g, "\u0008" )
137- . replace ( / \\ : / g, ":" )
138- . replace ( / \\ n / g, "\n" )
139- . replace ( / \u0008 / g, "\\" ) ;
140- } )
141- . join ( "\u0008" ) ;
142- } ;
127+ escape ( unescaped ) {
128+ return unescaped . replace ( / \\ / g, "\\\\" ) . replace ( / : / g, "\\:" ) . replace ( / \n / g, "\\n" ) ;
129+ }
143130
144- const stringValue = ( value ) => {
145- if ( value instanceof Date ) {
146- return value . toISOString ( ) ;
147- } else if ( value instanceof Object ) {
148- return JSON . stringify ( value ) ;
131+ unescape ( escaped ) {
132+ return escaped
133+ . split ( "\u0008" )
134+ . map ( ( part ) => {
135+ return part
136+ . replace ( / \\ \\ / g, "\u0008" )
137+ . replace ( / \\ : / g, ":" )
138+ . replace ( / \\ n / g, "\n" )
139+ . replace ( / \u0008 / g, "\\" ) ;
140+ } )
141+ . join ( "\u0008" ) ;
149142 }
150- return String ( value ) ;
151- } ;
143+ }
152144
153145module . exports = PCPFormat ;
0 commit comments