@astronautlabs/amf
Version:
Action Message Format (AMF0/3)
46 lines (40 loc) • 1.93 kB
text/typescript
import { BitstreamElement, BitstreamReader, BitstreamWriter, FieldDefinition, IncompleteReadResult, resolveLength, Serializer } from "@astronautlabs/bitstream";
export class FloatSerializer implements Serializer {
*read(reader: BitstreamReader, type: any, parent: BitstreamElement, field: FieldDefinition): Generator<IncompleteReadResult, any> {
let length : number;
try {
length = resolveLength(field.length, parent, field);
} catch (e) {
throw new Error(`Failed to resolve length of number via 'length' determinant: ${e.message}`);
}
if (!reader.isAvailable(length))
yield { remaining: length };
if (length === 8) {
return Buffer.from([ reader.readSync(8) ]).readFloatBE();
} else if (length === 16) {
return Buffer.from([ reader.readSync(8), reader.readSync(8) ]).readDoubleBE();
} else {
throw new Error(`FloatSerializer supports only 1-byte (8 bit) or 2-byte (16 bit) values`);
}
}
write(writer: BitstreamWriter, type: any, parent: BitstreamElement, field: FieldDefinition, value: any) {
let length : number;
try {
length = resolveLength(field.length, parent, field);
} catch (e) {
throw new Error(`Failed to resolve length of number via 'length' determinant: ${e.message}`);
}
if (length === 8) {
let buf = Buffer.alloc(1);
buf.writeFloatBE(value);
writer.write(8, buf[0]);
} else if (length === 16) {
let buf = Buffer.alloc(2);
buf.writeDoubleBE(value);
writer.write(8, buf[0]);
writer.write(8, buf[1]);
} else {
throw new Error(`FloatSerializer supports only 1-byte (8 bit) or 2-byte (16 bit) values`);
}
}
}