TypeScript SDK
@philiprehberger/docgen
Generated client + hand-tuned pollRender helper. View source on GitHub.
Install
shell
npm install @philiprehberger/docgenQuickstart
Author a template, freeze a version, submit a render, poll until terminal.
typescript
import {
Configuration,
TemplatesApi,
RendersApi,
pollRender,
} from '@philiprehberger/docgen';
const config = new Configuration({
basePath: 'https://api.docgen.philiprehberger.com',
accessToken: process.env.DOCGEN_API_KEY, // docgen_live_…
});
const templates = new TemplatesApi(config);
const renders = new RendersApi(config);
// 1. Create a template
const template = await templates.createTemplate({
templateCreate: {
name: 'Invoice',
body: '<h1>Invoice {{ number }}</h1><p>Total: {{ total }}</p>',
},
});
// 2. Freeze v1
await templates.createTemplateVersion({ templateId: template.id });
// 3. Submit a render
const render = await renders.createRender({
renderCreate: {
templateId: template.id,
formats: ['pdf'],
data: { number: 'INV-001', total: '$2,625.00' },
},
});
// 4. Poll until terminal
const done = await pollRender(renders, render.id);
if (done.status === 'succeeded') {
const pdfUrl = done.outputs.find((o) => o.format === 'pdf')!.url;
console.log(`Download: ${pdfUrl}`);
}The pollRender helper
Exponential backoff (500ms → 5s ceiling), configurable wall-clock budget.
typescript
import { pollRender, PollRenderTimeout } from '@philiprehberger/docgen';
const controller = new AbortController();
try {
const done = await pollRender(renders, render.id, {
maxWaitMs: 30_000,
signal: controller.signal,
});
} catch (e) {
if (e instanceof PollRenderTimeout) {
// Render didn't finish in time; the job is still running.
}
}Sync mode. Add ?sync=true to the request via the runtime override to block up to 15s for an inline response — useful for single-page renders where you don't want to poll.
AbortSignal. The signal option threads through the polling loop, so you can wire it to a UI cancel button without leaving an orphan timer running.