Slide 32
Slide 32 text
The Server
โ Create a DNS server with dns2
โ Retrieve record for domain
โ Check if request is for sub-domain
โ JSON-decode metadata
โ Convert to DNS record format
https://www.npmjs.com/package/@types/dns2
require('dotenv').config();
const stripe = require('stripe')(process.env.SECRET_KEY);
const dns2 = require('dns2');
const { Packet } = dns2;
class StripeDnsServer {
constructor(options = {}) {
this.stripeClient = options.stripeClient || stripe;
this.port = options.port || 5333;
this.address = options.address || '0.0.0.0';
this.server = this._createServer();
}
...
async _handleRequest(request, send) {
const response = Pkt.createResponseFromRequest(request);
const [question] = request.questions;
const { name, type } = question;
try {
// Check for possible subdomain query
const { topDomain, subdomain } = parseDomain(name);
// Look up records
const recordSet = await lookupDnsRecords(
topDomain, subdomain
);
...
async lookupDnsRecords(domain, subdomain) {
const email = `dns@${domain}`;
const customers = await stripe.customers.list({
limit: 1,
email: email
});
const dnsRecords = JSON.parse(
customers.data[0].metadata.dns_records || '{}'
);
// Check for exact match, wildcard if no exact match
let recordSet = dnsRecords[subdomain];
if (!recordSet && subdomain !== '@') {
recordSet = dnsRecords['*'];
}
return recordSet || null;
}
addRecordsToResponse(response, name, recordSet, type) {
switch (type) {
case Packet.TYPE.A:
if (recordSet.A) {
recordSet.A.forEach(ip => {
this.addRecord(response, name, Packet.TYPE.A,
{ address: ip });
});
return true;
}
break;
case Packet.TYPE.CNAME:
if (recordSet.CNAME) {
...