Adding stream interface
Some checks failed
the build failed

This commit is contained in:
Fabian Stamm 2018-12-03 08:52:54 +01:00
parent da5285ac9b
commit 55354c2381
2 changed files with 20 additions and 6 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "nodename-core", "name": "nodename-core",
"version": "0.3.1", "version": "0.3.2",
"main": "lib/index.js", "main": "lib/index.js",
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"author": "Fabian Stamm <dev@fabianstamm.de>", "author": "Fabian Stamm <dev@fabianstamm.de>",

View File

@ -31,6 +31,10 @@ export interface Plugin {
init(core: DnsCore): Promise<void> init(core: DnsCore): Promise<void>
} }
export type ListenerCallback =
((data: Buffer, sender: string, max_size?: number) => Promise<Buffer>) |
((data: Buffer, sender: string, answer: Writable) => Promise<void>)
export interface ListenerPlugin extends Plugin { export interface ListenerPlugin extends Plugin {
/** /**
* This method is for registering a callback that is called * This method is for registering a callback that is called
@ -38,8 +42,7 @@ export interface ListenerPlugin extends Plugin {
* The function returns the Answer data. Errors shouldn't be possible * The function returns the Answer data. Errors shouldn't be possible
* by this function * by this function
*/ */
registerCallback(callback: (data: Buffer, sender: string, max_size?: number) => Promise<Buffer>): void registerCallback(callback: ListenerCallback): void
registerCallback(callback: (data: Buffer, sender: string, answer: Writable) => Promise<void>)
} }
export class ListenerManager { export class ListenerManager {
@ -53,7 +56,7 @@ export class ListenerManager {
return Promise.all(this._listener.map(e => e.init(core))) return Promise.all(this._listener.map(e => e.init(core)))
} }
registerCallback(callback: (data: Buffer, sender: string, max_size?: number) => Promise<Buffer>) { registerCallback(callback: ListenerCallback) {
this._listener.forEach(e => e.registerCallback(callback)) this._listener.forEach(e => e.registerCallback(callback))
} }
} }
@ -282,7 +285,13 @@ export class DnsCore {
this.listenerManager.registerCallback(this.onMessage.bind(this)); this.listenerManager.registerCallback(this.onMessage.bind(this));
} }
private async onMessage(data: Buffer, sender: string, max_size: number = 0) { private onMessage: ListenerCallback = async (data: Buffer, sender: string, r) => {
let max_size = 128 * 1024;
let stream = true;
if (typeof r === "number") {
max_size = r;
stream = false;
}
let request = new Request(data, sender, max_size); let request = new Request(data, sender, max_size);
let questionqueue: Promise<void>[] = []; let questionqueue: Promise<void>[] = [];
let handleQuestion = question => { let handleQuestion = question => {
@ -304,6 +313,11 @@ export class DnsCore {
} }
request.questions.map(q => handleQuestion(q)); request.questions.map(q => handleQuestion(q));
await Promise.all(questionqueue); await Promise.all(questionqueue);
return request.serialize(); let res = request.serialize();
if (stream) {
(<Writable>r).write(res);
} else {
return r;
}
} }
} }