feat: Update path to not need /hns
This commit is contained in:
@@ -57,7 +57,7 @@ npm start
|
|||||||
```
|
```
|
||||||
|
|
||||||
Then access Handshake+IPFS content via:
|
Then access Handshake+IPFS content via:
|
||||||
- `http://localhost:3000/hns/example/` (replace "example" with a Handshake domain)
|
- `http://localhost:3000/ipfs.act` (replace "ipfs.act" with a Handshake domain)
|
||||||
- Direct web interface at `http://localhost:3000`
|
- Direct web interface at `http://localhost:3000`
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
@@ -74,5 +74,4 @@ curl http://localhost:3000/api/status
|
|||||||
### 2. Testing with Sample Handshake Domains
|
### 2. Testing with Sample Handshake Domains
|
||||||
You can test with known Handshake domains that have IPFS content:
|
You can test with known Handshake domains that have IPFS content:
|
||||||
|
|
||||||
- `http://localhost:3000/hns/welcome/` - The Handshake welcome page
|
- `http://localhost:3000/ipfs.act` - Example
|
||||||
- `http://localhost:3000/hns/blog.namebase/` - Namebase blog
|
|
||||||
@@ -29,7 +29,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Function to navigate to HNS domain
|
// Function to navigate to HNS domain (using new URL format)
|
||||||
function navigateToHnsDomain() {
|
function navigateToHnsDomain() {
|
||||||
const domain = domainInput.value.trim();
|
const domain = domainInput.value.trim();
|
||||||
|
|
||||||
@@ -41,8 +41,8 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
// Clean up domain input (remove trailing slashes)
|
// Clean up domain input (remove trailing slashes)
|
||||||
const cleanDomain = domain.replace(/\/+$/, '');
|
const cleanDomain = domain.replace(/\/+$/, '');
|
||||||
|
|
||||||
// Navigate to the HNS domain
|
// Navigate to the HNS domain using new format
|
||||||
window.location.href = `/hns/${cleanDomain}`;
|
window.location.href = `/${cleanDomain}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check server status
|
// Check server status
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>IPFS.act</title>
|
<title>IPFS.act</title>
|
||||||
|
<link rel="icon" href="https://woodburn.au/favicon.png" type="image/png">
|
||||||
</head>
|
</head>
|
||||||
<body style="background-color: black; color: blueviolet;text-align: center;">
|
<body style="background-color: black; color: blueviolet;text-align: center;">
|
||||||
<h1>IPFS.act</h1>
|
<h1>IPFS.act</h1>
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<strong>URL format:</strong> <code>https://ipfs.woodburn.au/hns/[domain]/[path]</code><br>
|
<strong>URL format:</strong> <code>https://ipfs.woodburn.au/[domain]/[path]</code><br>
|
||||||
Replace <code>[domain]</code> with any Handshake domain and <code>[path]</code> with an optional path.
|
Replace <code>[domain]</code> with any Handshake domain and <code>[path]</code> with an optional path.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
132
server.js
132
server.js
@@ -13,9 +13,134 @@ const app = express();
|
|||||||
app.use(cors());
|
app.use(cors());
|
||||||
app.use(morgan('dev'));
|
app.use(morgan('dev'));
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
|
|
||||||
|
// Define reserved paths that should not be treated as Handshake domains
|
||||||
|
const RESERVED_PATHS = [
|
||||||
|
'api',
|
||||||
|
'hns',
|
||||||
|
'public',
|
||||||
|
'assets',
|
||||||
|
'static',
|
||||||
|
'images',
|
||||||
|
'css',
|
||||||
|
'js',
|
||||||
|
'favicon.ico'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Serve static files
|
||||||
app.use(express.static(path.join(__dirname, 'public')));
|
app.use(express.static(path.join(__dirname, 'public')));
|
||||||
|
|
||||||
// Routes
|
// Status endpoint
|
||||||
|
app.get('/api/status', (req, res) => {
|
||||||
|
res.json({ status: 'online', version: '0.1.1' });
|
||||||
|
});
|
||||||
|
|
||||||
|
// New route: Handle root domain requests with direct domain format
|
||||||
|
app.get('/:domain', async (req, res, next) => {
|
||||||
|
const domain = req.params.domain;
|
||||||
|
|
||||||
|
// Skip this handler for reserved paths
|
||||||
|
if (RESERVED_PATHS.includes(domain)) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
console.log(`Processing request for domain root: ${domain}`);
|
||||||
|
|
||||||
|
// Resolve Handshake domain to get IPFS CID
|
||||||
|
const cid = await resolveHandshake(domain);
|
||||||
|
|
||||||
|
if (!cid) {
|
||||||
|
console.warn(`No IPFS CID found for domain: ${domain}`);
|
||||||
|
return res.status(404).json({
|
||||||
|
error: 'Domain not found or has no IPFS record',
|
||||||
|
domain: domain
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Resolved ${domain} to IPFS CID: ${cid}`);
|
||||||
|
|
||||||
|
// Fetch content from IPFS (root path)
|
||||||
|
const content = await fetchFromIpfs(cid, '');
|
||||||
|
|
||||||
|
if (!content) {
|
||||||
|
return res.status(404).json({
|
||||||
|
error: 'Content not found on IPFS network',
|
||||||
|
cid: cid
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set appropriate content type
|
||||||
|
if (content.mimeType) {
|
||||||
|
res.setHeader('Content-Type', content.mimeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the content
|
||||||
|
res.send(content.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error handling request:', error);
|
||||||
|
res.status(500).json({
|
||||||
|
error: 'Server error processing request',
|
||||||
|
message: error.message
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// New route: Handle domain requests with subpaths using direct domain format
|
||||||
|
app.get('/:domain/*', async (req, res, next) => {
|
||||||
|
const domain = req.params.domain;
|
||||||
|
|
||||||
|
// Skip this handler for reserved paths
|
||||||
|
if (RESERVED_PATHS.includes(domain)) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const subPath = req.params[0] || '';
|
||||||
|
|
||||||
|
console.log(`Processing request for domain: ${domain}, path: ${subPath}`);
|
||||||
|
|
||||||
|
// Resolve Handshake domain to get IPFS CID
|
||||||
|
const cid = await resolveHandshake(domain);
|
||||||
|
|
||||||
|
if (!cid) {
|
||||||
|
console.warn(`No IPFS CID found for domain: ${domain}`);
|
||||||
|
return res.status(404).json({
|
||||||
|
error: 'Domain not found or has no IPFS record',
|
||||||
|
domain: domain
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Resolved ${domain} to IPFS CID: ${cid}`);
|
||||||
|
|
||||||
|
// Fetch content from IPFS
|
||||||
|
const content = await fetchFromIpfs(cid, subPath);
|
||||||
|
|
||||||
|
if (!content) {
|
||||||
|
return res.status(404).json({
|
||||||
|
error: 'Content not found on IPFS network',
|
||||||
|
cid: cid,
|
||||||
|
path: subPath
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set appropriate content type
|
||||||
|
if (content.mimeType) {
|
||||||
|
res.setHeader('Content-Type', content.mimeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the content
|
||||||
|
res.send(content.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error handling request:', error);
|
||||||
|
res.status(500).json({
|
||||||
|
error: 'Server error processing request',
|
||||||
|
message: error.message
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Routes (keeping original routes for backward compatibility)
|
||||||
app.get('/hns/:domain/*', async (req, res) => {
|
app.get('/hns/:domain/*', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const domain = req.params.domain;
|
const domain = req.params.domain;
|
||||||
@@ -109,11 +234,6 @@ app.get('/hns/:domain', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Status endpoint
|
|
||||||
app.get('/api/status', (req, res) => {
|
|
||||||
res.json({ status: 'online', version: '0.1.0' });
|
|
||||||
});
|
|
||||||
|
|
||||||
// Start server
|
// Start server
|
||||||
app.listen(PORT, () => {
|
app.listen(PORT, () => {
|
||||||
console.log(`Fire Portal server running on port ${PORT}`);
|
console.log(`Fire Portal server running on port ${PORT}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user