Files
soroban-abacus-flashcards/client/node/example-server.ts
Thomas Hallock fb1b0470cf feat: add Node.js/TypeScript integration with clean function interface
- Add SorobanGenerator class with python-shell bridge
- No CLI arguments - clean TypeScript function calls
- Support for Express.js and Next.js integration
- Include comprehensive API documentation

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:45:47 -05:00

98 lines
2.6 KiB
TypeScript

/**
* Example TypeScript server using the Soroban generator
* This shows how to call the PDF generation directly from TypeScript
*/
import express from 'express';
import { SorobanGenerator } from './soroban-generator';
const app = express();
app.use(express.json());
// Initialize the generator once
const generator = new SorobanGenerator();
// Direct usage - just call the function from TypeScript
app.post('/api/generate-pdf', async (req, res) => {
try {
// Call the generator directly from TypeScript
const pdfBuffer = await generator.generate({
range: req.body.range || '0-9',
cardsPerPage: req.body.cardsPerPage || 6,
colorScheme: req.body.colorScheme || 'monochrome',
showCutMarks: req.body.showCutMarks || false,
// ... other config options
});
// Send PDF directly to client
res.contentType('application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=flashcards.pdf');
res.send(pdfBuffer);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Example: Generate specific sets programmatically
app.get('/api/presets/:preset', async (req, res) => {
try {
let config;
switch (req.params.preset) {
case 'basic':
config = { range: '0-9' };
break;
case 'counting-by-5':
config = { range: '0-100', step: 5 };
break;
case 'place-value':
config = {
range: '0-999',
colorScheme: 'place-value' as const,
coloredNumerals: true
};
break;
default:
return res.status(404).json({ error: 'Unknown preset' });
}
// Direct function call from TypeScript
const pdfBuffer = await generator.generate(config);
res.contentType('application/pdf');
res.send(pdfBuffer);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Simple usage in any async function
async function generateFlashcardsDirectly() {
const generator = new SorobanGenerator();
// Just call it like any TypeScript function
const pdfBuffer = await generator.generate({
range: '0-99',
cardsPerPage: 6,
colorScheme: 'place-value',
coloredNumerals: true
});
// Now you have the PDF as a Buffer, use it however you want
return pdfBuffer;
}
// Next.js API route example
export async function nextJsApiRoute(req: any, res: any) {
const generator = new SorobanGenerator();
// Direct call from TypeScript
const pdf = await generator.generate(req.body);
res.setHeader('Content-Type', 'application/pdf');
res.send(pdf);
}
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});