Skip to content

Commit

Permalink
feat(arns): add subdomain support
Browse files Browse the repository at this point in the history
Enables the arns feature to work when the node is hosted
on a subdomain.

Added to allow hosting on exiting domains.
  • Loading branch information
kay-is authored and djwhitt committed Sep 26, 2023
1 parent e71bda8 commit 5057c6d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 16 deletions.
1 change: 1 addition & 0 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ if (config.ARNS_ROOT_HOST !== undefined) {
app.use(
createArnsMiddleware({
dataHandler,
rootHost: config.ARNS_ROOT_HOST,
nameResolver: system.nameResolver,
}),
);
Expand Down
41 changes: 25 additions & 16 deletions src/middleware/arns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,33 +25,42 @@ const EXCLUDED_SUBDOMAINS = new Set('www');

export const createArnsMiddleware = ({
dataHandler,
rootHost,
nameResolver,
}: {
dataHandler: Handler;
rootHost: string;
nameResolver: NameResolver;
}): Handler =>
asyncMiddleware(async (req, res, next) => {
const rootHostSubdomainLength = rootHost.split('.').length - 2;
if (
Array.isArray(req.subdomains) &&
req.subdomains.length === 1 &&
!EXCLUDED_SUBDOMAINS.has(req.subdomains[0]) &&
// Ignore subdomains that are part of the ArNS root hostname.
!Array.isArray(req.subdomains) ||
req.subdomains.length === rootHostSubdomainLength
) {
next();
return;
}
const arnsSubdomain = req.subdomains[req.subdomains.length - 1];
if (
EXCLUDED_SUBDOMAINS.has(arnsSubdomain) ||
// Avoid collisions with sandbox URLs by ensuring the subdomain length
// is below the mininimum length of a sandbox subdomain. Undernames are
// are an exception because they can be longer and '_' cannot appear in
// base32.
(req.subdomains[0].length <= 48 || req.subdomains[0].match(/_/))
(arnsSubdomain.length > 48 && !arnsSubdomain.match(/_/))
) {
const { resolvedId, ttl } = await nameResolver.resolve(req.subdomains[0]);
if (resolvedId !== undefined) {
res.header('X-ArNS-Resolved-Id', resolvedId);
res.header('X-ArNS-TTL-Seconds', ttl.toString());
res.header('Cache-Control', `public, max-age=${ttl}`);
dataHandler(req, res, next);
return;
} else {
sendNotFound(res);
return;
}
next();
return;
}
const { resolvedId, ttl } = await nameResolver.resolve(arnsSubdomain);
if (resolvedId === undefined) {
sendNotFound(res);
return;
}
next();
res.header('X-ArNS-Resolved-Id', resolvedId);
res.header('X-ArNS-TTL-Seconds', ttl.toString());
res.header('Cache-Control', `public, max-age=${ttl}`);
dataHandler(req, res, next);
});

0 comments on commit 5057c6d

Please sign in to comment.