@gent-js/gent
Version:
template-based data generator.
52 lines (51 loc) • 1.62 kB
JavaScript
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();
}
}