diff --git a/src/Ber/Reader.ts b/src/Ber/Reader.ts index b9ca796..ce4a82a 100644 --- a/src/Ber/Reader.ts +++ b/src/Ber/Reader.ts @@ -37,8 +37,10 @@ class ExtendedReader extends Reader { return { type: ParameterType.Octets, value: this.readString(UNIVERSAL(4), true) } case BERDataTypes.RELATIVE_OID: return { type: ParameterType.String, value: this.readOID(BERDataTypes.RELATIVE_OID) } - case BERDataTypes.NULL: - return { type: ParameterType.Null, value: null } // TODO should you read something + case BERDataTypes.NULL: // Note: No readNull in BER library but writer writes 2 bytes + this.readByte(false) // Read past - ASN1.NULL tag 0x05 + this.readByte(false) // and - 0x00 length + return { type: ParameterType.Null, value: null } default: throw new UnimplementedEmberTypeError(tag) } diff --git a/src/Ber/Writer.ts b/src/Ber/Writer.ts index 2a1672f..927f25f 100644 --- a/src/Ber/Writer.ts +++ b/src/Ber/Writer.ts @@ -95,9 +95,13 @@ class ExtendedWriter extends Writer { } else { value = arg1 as EmberValue } - // this is inconsistent with the original behavior, which would have thrown a TypeError if value was null or undef - // TypeScript won't allow doing a value.toString() if value can be null, not sure what to do here + + if (tag === BERDataTypes.NULL && (value === null || value === undefined)) { + this.writeNull() + return + } if (value === null || value === undefined) { + this.writeNull() return } @@ -230,6 +234,8 @@ function parameterTypetoBERTAG(parameterType: ParameterType): number { return BERDataTypes.INTEGER // TODO: guess case ParameterType.Octets: return BERDataTypes.OCTETSTRING + case ParameterType.Null: + return BERDataTypes.NULL default: throw new Error(``) } diff --git a/src/encodings/ber/__tests__/StreamEntry.spec.ts b/src/encodings/ber/__tests__/StreamEntry.spec.ts index 060ed00..949e669 100644 --- a/src/encodings/ber/__tests__/StreamEntry.spec.ts +++ b/src/encodings/ber/__tests__/StreamEntry.spec.ts @@ -110,7 +110,7 @@ describe('encodings/ber/StreamEntry', () => { expect(decoded).toEqual(se) }) - test('write and read stream entry - null', () => { + test.only('write and read stream entry - null', () => { const se = { identifier: 42, value: { type: ParameterType.Null, value: null } diff --git a/src/encodings/ber/__tests__/index.spec.ts b/src/encodings/ber/__tests__/index.spec.ts index acc412d..f74cd7a 100644 --- a/src/encodings/ber/__tests__/index.spec.ts +++ b/src/encodings/ber/__tests__/index.spec.ts @@ -33,7 +33,6 @@ describe('encoders/Ber/index', () => { ] if (!res[0].children) { fail(`Tree must have children`) - return } res[0].children[0].parent = res[0] roundTrip(res, RootType.Elements) @@ -46,7 +45,6 @@ describe('encoders/Ber/index', () => { ] if (!res[0].children) { fail(`Tree must have children`) - return } res[0].children[0].parent = res[0] roundTrip(res, RootType.Elements) diff --git a/src/encodings/ber/encoder/Command.ts b/src/encodings/ber/encoder/Command.ts index c1193c8..84e4748 100644 --- a/src/encodings/ber/encoder/Command.ts +++ b/src/encodings/ber/encoder/Command.ts @@ -1,9 +1,10 @@ import * as Ber from '../../../Ber' import { Command, CommandType, GetDirectory, FieldFlags, Invoke } from '../../../model/Command' import { encodeInvocation } from './Invocation' +import { CommandBERID } from '../constants' export function encodeCommand(el: Command, writer: Ber.Writer): void { - writer.startSequence(Ber.APPLICATION(2)) // TODO - make non magic number? + writer.startSequence(CommandBERID) // TODO - make non magic number? writer.startSequence(Ber.CONTEXT(0)) writer.writeInt(el.number) @@ -21,7 +22,7 @@ export function encodeCommand(el: Command, writer: Ber.Writer): void { writer.endSequence() } - writer.endSequence() // BER.APPLICATION(2) + writer.endSequence() // CommandBERID } function isInvoke(command: Command): command is Invoke {