@@ -59,14 +59,41 @@ export default class OctetstreamCodec implements ContentCodec {
5959 debug ( "OctetstreamCodec parsing" , bytes ) ;
6060 debug ( "Parameters" , parameters ) ;
6161
62- const bigEndian = ! ( parameters . byteSeq ?. includes ( Endianness . LITTLE_ENDIAN ) === true ) ; // default to big endian
63- let signed = parameters . signed !== "false" ; // default to signed
62+ const length =
63+ parameters . length != null
64+ ? parseInt ( parameters . length )
65+ : ( warn ( "Missing 'length' parameter necessary for write. I'll do my best" ) , undefined ) ;
66+
67+ if ( length !== undefined ) {
68+ if ( isNaN ( length ) || length < 0 ) {
69+ throw new Error ( "'length' parameter must be a non-negative number" ) ;
70+ }
71+ if ( length !== bytes . length ) {
72+ throw new Error ( `Lengths do not match, required: ${ length } provided: ${ bytes . length } ` ) ;
73+ }
74+ }
75+
76+ let signed = true ; // default to signed
77+ if ( parameters . signed !== undefined ) {
78+ if ( parameters . signed !== "true" && parameters . signed !== "false" ) {
79+ throw new Error ( "'signed' parameter must be 'true' or 'false'" ) ;
80+ }
81+ signed = parameters . signed === "true" ;
82+ }
83+
84+ let bitLength = schema ?. [ "ex:bitLength" ] !== undefined ? parseInt ( schema [ "ex:bitLength" ] ) : bytes . length * 8 ;
85+
86+ if ( isNaN ( bitLength ) || bitLength < 0 ) {
87+ throw new Error ( "'ex:bitLength' must be a non-negative number" ) ;
88+ }
89+
6490 const offset = schema ?. [ "ex:bitOffset" ] !== undefined ? parseInt ( schema [ "ex:bitOffset" ] ) : 0 ;
65- if ( parameters . length != null && parseInt ( parameters . length ) !== bytes . length ) {
66- throw new Error ( "Lengths do not match, required: " + parameters . length + " provided: " + bytes . length ) ;
91+
92+ if ( isNaN ( offset ) || offset < 0 ) {
93+ throw new Error ( "'ex:bitOffset' must be a non-negative number" ) ;
6794 }
68- let bitLength : number =
69- schema ?. [ "ex:bitLength" ] !== undefined ? parseInt ( schema [ "ex:bitLength" ] ) : bytes . length * 8 ;
95+
96+ const bigEndian = ! ( parameters . byteSeq ?. includes ( Endianness . LITTLE_ENDIAN ) === true ) ; // default to big endian
7097 let dataType : string = schema ?. type ;
7198
7299 if ( ! dataType ) {
@@ -223,16 +250,38 @@ export default class OctetstreamCodec implements ContentCodec {
223250 valueToBytes ( value : unknown , schema ?: DataSchema , parameters : { [ key : string ] : string | undefined } = { } ) : Buffer {
224251 debug ( `OctetstreamCodec serializing '${ value } '` ) ;
225252
226- if ( parameters . length == null ) {
227- warn ( "Missing 'length' parameter necessary for write. I'll do my best" ) ;
253+ const bigEndian = ! ( parameters . byteSeq ?. includes ( Endianness . LITTLE_ENDIAN ) === true ) ; // default to big endian
254+
255+ let signed = true ; // default to true
256+
257+ if ( parameters . signed !== undefined ) {
258+ if ( parameters . signed !== "true" && parameters . signed !== "false" ) {
259+ throw new Error ( "'signed' parameter must be 'true' or 'false'" ) ;
260+ }
261+ signed = parameters . signed === "true" ;
262+ }
263+
264+ let length =
265+ parameters . length != null
266+ ? parseInt ( parameters . length )
267+ : ( warn ( "Missing 'length' parameter necessary for write. I'll do my best" ) , undefined ) ;
268+
269+ if ( length !== undefined && ( isNaN ( length ) || length < 0 ) ) {
270+ throw new Error ( "'length' parameter must be a non-negative number" ) ;
228271 }
229272
230- const bigEndian = ! ( parameters . byteSeq ?. includes ( Endianness . LITTLE_ENDIAN ) === true ) ; // default to big endian
231- let signed = parameters . signed !== "false" ; // default to signed
232- // byte length of the buffer to be returned
233- let length = parameters . length != null ? parseInt ( parameters . length ) : undefined ;
234273 let bitLength = schema ?. [ "ex:bitLength" ] !== undefined ? parseInt ( schema [ "ex:bitLength" ] ) : undefined ;
274+
275+ if ( bitLength !== undefined && ( isNaN ( bitLength ) || bitLength < 0 ) ) {
276+ throw new Error ( "'ex:bitLength' must be a non-negative number" ) ;
277+ }
278+
235279 const offset = schema ?. [ "ex:bitOffset" ] !== undefined ? parseInt ( schema [ "ex:bitOffset" ] ) : 0 ;
280+
281+ if ( isNaN ( offset ) || offset < 0 ) {
282+ throw new Error ( "'ex:bitOffset' must be a non-negative number" ) ;
283+ }
284+
236285 let dataType : string = schema ?. type ?? undefined ;
237286
238287 if ( value === undefined ) {
@@ -547,11 +596,11 @@ export default class OctetstreamCodec implements ContentCodec {
547596 const offset = schema [ "ex:bitOffset" ] !== undefined ? parseInt ( schema [ "ex:bitOffset" ] ) : 0 ;
548597
549598 if ( isNaN ( offset ) || offset < 0 ) {
550- throw new Error ( "ex:bitOffset must be a non-negative number" ) ;
599+ throw new Error ( "' ex:bitOffset' must be a non-negative number" ) ;
551600 }
552601
553602 if ( offset > length * 8 ) {
554- throw new Error ( `ex:bitOffset ${ offset } exceeds length ${ length } ` ) ;
603+ throw new Error ( `' ex:bitOffset' ${ offset } exceeds ' length' ${ length } ` ) ;
555604 }
556605
557606 result = result ?? Buffer . alloc ( length ) ;
0 commit comments