Skip to content

Commit 0010ce5

Browse files
committed
fix: make sure depthLimit is passed down from config
1 parent 0ad324f commit 0010ce5

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

packages/seroval/src/core/cross/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ export function toCrossJSONStream<T>(
161161
plugins,
162162
refs: options.refs,
163163
disabledFeatures: options.disabledFeatures,
164+
depthLimit: options.depthLimit,
164165
onParse: options.onParse,
165166
onError: options.onError,
166167
onDone: options.onDone,
@@ -183,6 +184,7 @@ export function fromCrossJSON<T>(
183184
refs: options.refs,
184185
features: options.features,
185186
disabledFeatures: options.disabledFeatures,
187+
depthLimit: options.depthLimit,
186188
});
187189
return deserializeTop(ctx, source) as T;
188190
}

packages/seroval/test/async-iterable.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@ const EXAMPLE = {
2121
},
2222
};
2323

24+
function makeDeepObject(depth: number): Record<string, unknown> {
25+
let current: Record<string, unknown> = {};
26+
const root = current;
27+
for (let i = 0; i < depth; i++) {
28+
current.next = {};
29+
current = current.next as Record<string, unknown>;
30+
}
31+
return root;
32+
}
33+
2434
describe('AsyncIterable', () => {
2535
describe('serializeAsync', () => {
2636
it('supports AsyncIterables', async () => {
@@ -125,5 +135,22 @@ describe('AsyncIterable', () => {
125135
},
126136
});
127137
}));
138+
it('respects depthLimit', async () =>
139+
new Promise<void>(resolve => {
140+
const deep = makeDeepObject(5);
141+
let parsed = false;
142+
toCrossJSONStream(deep, {
143+
depthLimit: 2,
144+
onParse() {
145+
parsed = true;
146+
},
147+
onError(error) {
148+
expect(error).toBeInstanceOf(Error);
149+
expect((error as Error).message).toContain('Depth limit');
150+
expect(parsed).toBe(false);
151+
resolve();
152+
},
153+
});
154+
}));
128155
});
129156
});

packages/seroval/test/iterable.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ const EXAMPLE = {
2424
},
2525
};
2626

27+
function makeDeepObject(depth: number): Record<string, unknown> {
28+
let current: Record<string, unknown> = {};
29+
const root = current;
30+
for (let i = 0; i < depth; i++) {
31+
current.next = {};
32+
current = current.next as Record<string, unknown>;
33+
}
34+
return root;
35+
}
36+
2737
describe('Iterable', () => {
2838
describe('serialize', () => {
2939
it('supports Iterables', () => {
@@ -181,5 +191,34 @@ describe('Iterable', () => {
181191
},
182192
});
183193
}));
194+
it('respects depthLimit', async () =>
195+
new Promise<void>(resolve => {
196+
const deep = makeDeepObject(5);
197+
let parsed = false;
198+
toCrossJSONStream(deep, {
199+
depthLimit: 2,
200+
onParse() {
201+
parsed = true;
202+
},
203+
onError(error) {
204+
expect(error).toBeInstanceOf(Error);
205+
expect((error as Error).message).toContain('Depth limit');
206+
expect(parsed).toBe(false);
207+
resolve();
208+
},
209+
});
210+
}));
211+
});
212+
describe('fromCrossJSON', () => {
213+
it('respects depthLimit', () => {
214+
const deep = makeDeepObject(5);
215+
const tree = toCrossJSON(deep);
216+
expect(() =>
217+
fromCrossJSON(tree, {
218+
depthLimit: 2,
219+
refs: new Map(),
220+
}),
221+
).toThrowError(/Depth limit/);
222+
});
184223
});
185224
});

0 commit comments

Comments
 (0)