Skip to content

Commit fa03f54

Browse files
committed
Add jsonParse and receiveBody
PR-URL: #92
1 parent ff01ac5 commit fa03f54

7 files changed

Lines changed: 51 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
## [Unreleased][unreleased]
44

55
- Add `Pool` method `isFree(item: object): boolean`
6+
- Add function `jsonParse(buffer: Buffer): object | null`
7+
- Add function `receiveBody(req: IncomingMessage): Promise<string | null>`
68

79
## [3.5.15][] - 2021-09-23
810

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
- `parseHost(host?: string): string`
4444
- `parseCookies(cookie: string): object`
4545
- `fetch(url: string): Promise<string>`
46+
- `jsonParse(buffer: Buffer): object | null`
47+
- `receiveBody(req: IncomingMessage): Promise<Buffer | null>`
4648

4749
## Crypto utilities
4850

lib/network.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,12 @@ const fetch = async (url) => {
2323
});
2424
};
2525

26-
module.exports = { fetch };
26+
const receiveBody = async (req) => {
27+
const buffers = [];
28+
for await (const chunk of req) {
29+
buffers.push(chunk);
30+
}
31+
return Buffer.concat(buffers);
32+
};
33+
34+
module.exports = { fetch, receiveBody };

lib/utilities.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,15 @@ const parseCookies = (cookie) => {
291291
return values;
292292
};
293293

294+
const jsonParse = (buffer) => {
295+
if (buffer.length === 0) return null;
296+
try {
297+
return JSON.parse(buffer);
298+
} catch {
299+
return null;
300+
}
301+
};
302+
294303
module.exports = {
295304
random,
296305
sample,
@@ -316,4 +325,5 @@ module.exports = {
316325
makePrivate,
317326
protect,
318327
parseCookies,
328+
jsonParse,
319329
};

metautil.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { EventEmitter } from 'events';
2+
import { IncomingMessage } from 'http';
23

34
export function cryptoRandom(): number;
45
export function generateKey(length: number, possible: string): string;
@@ -104,3 +105,5 @@ export class Pool {
104105
}
105106

106107
export function fetch(url: string): Promise<string>;
108+
export function jsonParse(buffer: Buffer): object | null;
109+
export function receiveBody(req: IncomingMessage): Promise<Buffer | null>;

test/network.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,22 @@ metatests.test('Fetch', async (test) => {
2222
test.strictSame(rate, 1);
2323
test.end();
2424
});
25+
26+
metatests.test('receiveBody', async (test) => {
27+
const value = Buffer.from('{ "a": 5 }');
28+
let done = false;
29+
const body = {
30+
[Symbol.asyncIterator]() {
31+
return {
32+
async next() {
33+
const res = { value, done };
34+
done = true;
35+
return res;
36+
},
37+
};
38+
},
39+
};
40+
const data = await metautil.receiveBody(body);
41+
test.strictSame(data.toString(), '{ "a": 5 }');
42+
test.end();
43+
});

test/utilities.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,12 @@ metatests.case(
289289
['domain.com:8080', 'domain.com'],
290290
['localhost:8080', 'localhost'],
291291
],
292+
'metautil.jsonParse': [
293+
['{}', {}],
294+
['{ "a": 5 }', { a: 5 }],
295+
['{', null],
296+
['', null],
297+
],
292298
}
293299
);
294300

0 commit comments

Comments
 (0)