UNPKG

@gent-js/gent

Version:

template-based data generator.

52 lines (51 loc) 1.62 kB
import * as dgram from "node:dgram"; import * as dnsPromises from "node:dns/promises"; import * as stream from "node:stream"; import { GeneratingDocument } from "../document/index.js"; export class UdpDocumentStream extends stream.Writable { address; port; socketType; constructor(options) { super({ highWaterMark: 0, objectMode: true, }); this.address = options.address; this.port = options.port; } _construct(callback) { dnsPromises .lookup(this.address, { verbatim: true, }) .then((lookupAddress) => { this.socketType = lookupAddress.family === 4 ? "udp4" : "udp6"; callback(); }) .catch((reason) => callback(reason)); } _write(chunk, encoding, callback) { if (!(chunk instanceof GeneratingDocument)) { callback(new Error(`Unexpected chunk type(${typeof chunk}). Cannot process any chunk type except Document.`)); return; } const socketType = this.socketType; if (socketType === undefined) { callback(new Error("called write before socketType has not been determined.")); return; } const client = dgram.createSocket(socketType); client.send(chunk.stamp(), this.port, this.address, (error, bytes) => { client.close(); if (error !== null) { callback(error); return; } callback(); }); } _final(callback) { callback(); } }