Skip to content

Commit ab75253

Browse files
committed
fix number encoding
1 parent 91f15f5 commit ab75253

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

packages/seroval/src/binary/deserializer.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ import type { Plugin } from './plugin';
3838

3939
export interface DeserializerContextOptions {
4040
read(): Promise<Uint8Array | undefined>;
41-
refs: Map<number, unknown>;
41+
refs: Map<number, { value: unknown }>;
4242
plugins?: Plugin<any, any>[];
4343
}
4444

4545
export interface DeserializerContext {
4646
read(): Promise<Uint8Array | undefined>;
47-
refs: Map<number, unknown>;
47+
refs: Map<number, { value: unknown }>;
4848
plugins?: Plugin<any, any>[];
4949
root: PromiseConstructorResolver;
5050
done: boolean;
@@ -103,7 +103,7 @@ async function ensureChunk(ctx: DeserializerContext, requiredLength: number) {
103103
}
104104

105105
function upsert(ctx: DeserializerContext, id: number, value: unknown): unknown {
106-
ctx.refs.set(id, value);
106+
ctx.refs.set(id, { value });
107107
return value;
108108
}
109109

@@ -148,7 +148,7 @@ async function deserializeId(
148148
async function deserializeRef(ctx: DeserializerContext) {
149149
const ref = await deserializeInteger(ctx);
150150
if (ctx.refs.has(ref)) {
151-
return { value: ctx.refs.get(ref) };
151+
return ctx.refs.get(ref)!;
152152
}
153153
throw new SerovalMalformedBinaryError();
154154
}
@@ -161,7 +161,7 @@ async function deserializeConstant(ctx: DeserializerContext) {
161161

162162
async function deserializeNumber(ctx: DeserializerContext) {
163163
const id = await deserializeId(ctx, SerovalNodeType.Number);
164-
upsert(ctx, id, deserializeNumberValue(ctx));
164+
upsert(ctx, id, await deserializeNumberValue(ctx));
165165
}
166166

167167
async function deserializeString(ctx: DeserializerContext) {
@@ -273,7 +273,7 @@ async function deserializeObjectFlag(ctx: DeserializerContext) {
273273

274274
async function deserializeArray(ctx: DeserializerContext) {
275275
const id = await deserializeId(ctx, SerovalNodeType.Array);
276-
const length = await deserializeNumberValue(ctx);
276+
const length = await deserializeInteger(ctx);
277277
upsert(ctx, id, new Array(length));
278278
}
279279

packages/seroval/src/binary/encoder.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,17 @@ export function encodeString(value: string): Uint8Array {
5050
}
5151

5252
export function decodeNumber(value: Uint8Array): number {
53-
const float = new Float64Array(value);
54-
return float[0];
53+
const view = new DataView(
54+
value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength),
55+
);
56+
return view.getFloat64(0, true);
5557
}
5658

5759
export function decodeInteger(value: Uint8Array): number {
58-
const uint = new Uint32Array(value);
59-
return uint[0];
60+
const view = new DataView(
61+
value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength),
62+
);
63+
return view.getUint32(0, true);
6064
}
6165

6266
export function decodeString(value: Uint8Array): string {

0 commit comments

Comments
 (0)