Skip to content

Commit 332c391

Browse files
committed
cleanup ExtData struct
1 parent 3f43d52 commit 332c391

File tree

6 files changed

+50
-45
lines changed

6 files changed

+50
-45
lines changed

benchmark/timestamp-ext.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { encode, decode } from "../src";
2+
3+
const data = new Array(100).fill(new Date());
4+
5+
// warm up
6+
const encoded = encode(data);
7+
decode(encoded);
8+
9+
// run
10+
11+
console.time("encode");
12+
for (let i = 0; i < 10000; i++) {
13+
encode(data);
14+
}
15+
console.timeEnd("encode");
16+
17+
console.time("decode");
18+
for (let i = 0; i < 10000; i++) {
19+
decode(encoded);
20+
}
21+
console.timeEnd("decode");

src/Encoder.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { utf8Encode, utf8Count } from "./utils/utf8";
2-
import { ExtensionCodec, ExtDataType } from "./ExtensionCodec";
2+
import { ExtensionCodec } from "./ExtensionCodec";
33
import { encodeInt64, encodeUint64 } from "./utils/int";
44
import { ensureUint8Array } from "./utils/typedArrays";
5+
import { ExtData } from "./ExtData";
56

67
export const DEFAULT_MAX_DEPTH = 100;
78
export const DEFAULT_INITIAL_BUFFER_SIZE = 1024;
@@ -223,7 +224,7 @@ export class Encoder {
223224
}
224225
}
225226

226-
encodeExtension(ext: ExtDataType) {
227+
encodeExtension(ext: ExtData) {
227228
const size = ext.data.length;
228229
if (size === 1) {
229230
// fixext 1

src/ExtData.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export class ExtData {
2+
constructor(readonly type: number, readonly data: Uint8Array) {}
3+
}

src/ExtensionCodec.ts

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { decodeInt64, encodeInt64 } from "./utils/int";
2+
import { ExtData } from "./ExtData";
23

34
export const EXT_TIMESTAMP = -1;
45

56
function isDate(object: unknown): object is Date {
6-
return Object.prototype.toString.call(object) === "[object Date]";
7+
return object instanceof Date;
78
}
89

910
export type TimeSpec = {
@@ -49,11 +50,11 @@ export function encodeDateToTimeSpec(date: Date): TimeSpec {
4950
const time = date.getTime();
5051
const sec = time < 0 ? Math.ceil(time / 1000) : Math.floor(time / 1000);
5152
const nsec = (time - sec * 1000) * 1e6;
52-
53+
const nsecInSec = Math.floor(nsec / 1e9);
5354
// Normalizes nsec to ensure it is unsigned.
5455
return {
55-
sec: sec + Math.floor(nsec / 1e9),
56-
nsec: nsec - Math.floor(nsec / 1e9) * 1e9,
56+
sec: sec + nsecInSec,
57+
nsec: nsec - nsecInSec * 1e9,
5758
};
5859
}
5960

@@ -107,35 +108,13 @@ export type ExtensionEncoderType = (input: unknown) => Uint8Array | null;
107108

108109
// immutable interfce to ExtensionCodec
109110
export type ExtensionCodecType = {
110-
tryToEncode(object: unknown): ExtDataType | null;
111+
tryToEncode(object: unknown): ExtData | null;
111112
decode(data: Uint8Array, extType: number): unknown;
112113
};
113114

114-
const $Extension = Symbol("MessagePack.extension");
115-
116-
export type ExtDataType = {
117-
[$Extension]: true;
118-
type: number;
119-
data: Uint8Array;
120-
};
121-
122115
export class ExtensionCodec implements ExtensionCodecType {
123116
public static readonly defaultCodec: ExtensionCodecType = new ExtensionCodec();
124117

125-
public static readonly Extension = $Extension;
126-
127-
public static createExtData(type: number, data: Uint8Array): ExtDataType {
128-
return {
129-
[$Extension]: true,
130-
type,
131-
data,
132-
};
133-
}
134-
135-
public static isExtData(object: any): object is ExtDataType {
136-
return object != null && !!object[ExtensionCodec.Extension];
137-
}
138-
139118
// built-in extensions
140119
private readonly builtInEncoders: Array<ExtensionEncoderType> = [];
141120
private readonly builtInDecoders: Array<ExtensionDecoderType> = [];
@@ -173,15 +152,15 @@ export class ExtensionCodec implements ExtensionCodecType {
173152
}
174153
}
175154

176-
public tryToEncode(object: unknown): ExtDataType | null {
155+
public tryToEncode(object: unknown): ExtData | null {
177156
// built-in extensions
178157
for (let i = 0; i < this.builtInEncoders.length; i++) {
179158
const encoder = this.builtInEncoders[i];
180159
if (encoder != null) {
181160
const data = encoder(object);
182161
if (data != null) {
183162
const type = -1 - i;
184-
return ExtensionCodec.createExtData(type, data);
163+
return new ExtData(type, data);
185164
}
186165
}
187166
}
@@ -193,12 +172,12 @@ export class ExtensionCodec implements ExtensionCodecType {
193172
const data = encoder(object);
194173
if (data != null) {
195174
const type = i;
196-
return ExtensionCodec.createExtData(type, data);
175+
return new ExtData(type, data);
197176
}
198177
}
199178
}
200179

201-
if (ExtensionCodec.isExtData(object)) {
180+
if (object instanceof ExtData) {
202181
// to keep ExtData as is
203182
return object;
204183
}
@@ -211,7 +190,7 @@ export class ExtensionCodec implements ExtensionCodecType {
211190
return decoder(data, type);
212191
} else {
213192
// decode() does not fail, returns ExtData instead.
214-
return ExtensionCodec.createExtData(type, data);
193+
return new ExtData(type, data);
215194
}
216195
}
217196
}

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ export {
88
ExtensionCodecType,
99
ExtensionDecoderType,
1010
ExtensionEncoderType,
11-
ExtDataType,
1211
EXT_TIMESTAMP,
1312
encodeTimestampExtension,
1413
encodeTimestampFromTimeSpec,
1514
decodeTimestampExtension,
1615
} from "./ExtensionCodec";
16+
17+
export { ExtData } from "./ExtData";

test/msgpack-ext.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import assert from "assert";
2-
import { encode, decode, ExtensionCodec, ExtDataType } from "../src";
2+
import { encode, decode, ExtData } from "../src";
33

44
function seq(n: number) {
55
const a: Array<number> = [];
@@ -11,15 +11,15 @@ function seq(n: number) {
1111

1212
describe("msgpack-ext", () => {
1313
const SPECS = {
14-
FIXEXT1: [0xd4, ExtensionCodec.createExtData(0, seq(1))],
15-
FIXEXT2: [0xd5, ExtensionCodec.createExtData(0, seq(2))],
16-
FIXEXT4: [0xd6, ExtensionCodec.createExtData(0, seq(4))],
17-
FIXEXT8: [0xd7, ExtensionCodec.createExtData(0, seq(8))],
18-
FIXEXT16: [0xd8, ExtensionCodec.createExtData(0, seq(16))],
19-
EXT8: [0xc7, ExtensionCodec.createExtData(0, seq(17))],
20-
EXT16: [0xc8, ExtensionCodec.createExtData(0, seq(0x100))],
21-
EXT32: [0xc9, ExtensionCodec.createExtData(0, seq(0x10000))],
22-
} as Record<string, [number, ExtDataType]>;
14+
FIXEXT1: [0xd4, new ExtData(0, seq(1))],
15+
FIXEXT2: [0xd5, new ExtData(0, seq(2))],
16+
FIXEXT4: [0xd6, new ExtData(0, seq(4))],
17+
FIXEXT8: [0xd7, new ExtData(0, seq(8))],
18+
FIXEXT16: [0xd8, new ExtData(0, seq(16))],
19+
EXT8: [0xc7, new ExtData(0, seq(17))],
20+
EXT16: [0xc8, new ExtData(0, seq(0x100))],
21+
EXT32: [0xc9, new ExtData(0, seq(0x10000))],
22+
} as Record<string, [number, ExtData]>;
2323

2424
for (const name of Object.keys(SPECS)) {
2525
const [msgpackType, extData] = SPECS[name];

0 commit comments

Comments
 (0)