Première impression depuis le navigateur
En mode local, votre page web parle directement à l'agent du même ordinateur. Chaque requête est signée par votre backend : un site quelconque ne peut donc pas imprimer sur les imprimantes de vos clients.
Il vous faut un agent installé et activé, et Node 18.4 ou plus récent pour le point de signature.
1. Autoriser votre site
Tableau de bord → Développeurs → Origines autorisées → Ajouter, par exemple https://pos.example.com. Une origine est un schéma, un hôte et un port, sans chemin.
Pendant le développement sur http://localhost:3000, activez plutôt le mode développement sur la même page : il autorise tous les ports de http://localhost.
2. Créer une clé de signature
Tableau de bord → Développeurs → Clés de signature → Créer. Le tableau de bord affiche :
- l'identifiant de clé (par exemple
sk_01J9…), - l'identifiant de votre organisation (
org_…), - la clé privée, affichée une seule fois.
Rangez la clé privée dans les secrets de votre serveur, par exemple dans la variable d'environnement JODAPRINT_SIGNING_KEY. Ne la mettez jamais dans la page web. Les agents reçoivent la clé publique avec leur configuration en quelques secondes.
3. Ajouter le point de signature à votre serveur
npm install @jodaprint/node
// server.ts (Express)
import express from "express";
import { createSigner, signRequestHandler } from "@jodaprint/node";
const signer = createSigner({
orgId: "org_123",
keyId: "sk_01J9ABC",
privateKey: process.env.JODAPRINT_SIGNING_KEY!,
});
const app = express();
app.post(
"/jodaprint/sign",
express.json(),
signRequestHandler(signer, {
// Obligatoire : décidez qui peut imprimer. Ici, tout utilisateur connecté.
authorize: (req) => Boolean(req.session?.user),
}),
);
app.listen(3000);
Le même gestionnaire fonctionne avec les route handlers Next.js, Bun, Deno et Hono :
// app/jodaprint/sign/route.ts
export const POST = signRequestHandler(signer, { authorize: async (req) => isLoggedIn(req) });
4. Imprimer depuis la page
npm install @jodaprint/sdk
import { JodaPrint, httpSigner } from "@jodaprint/sdk";
const jp = new JodaPrint({ orgId: "org_123", signer: httpSigner("/jodaprint/sign"), locale: "fr" });
await jp.connect(); // trouve l'agent sur wss://localhost:8182, 8283, 8384 ou 8485
const printers = await jp.printers.list();
console.log(printers.map((p) => `${p.id} ${p.name}`));
const job = await jp.printAndWait({
type: "receipt",
data: jp.receipt().text("Bonjour !").bold().center().feed(3).cut(),
idempotencyKey: "commande-10492",
});
console.log(job.state); // "printed"
Sans printer, le travail part sur l'imprimante par défaut. Pour en choisir une : printer: { id: "prn_…" }, { alias: "receipt" } ou { name: "EPSON TM-T20III" }.
Sans bundler, chargez la version UMD. Elle définit window.JodaPrint :
<script src="https://cdn.jsdelivr.net/npm/@jodaprint/sdk/dist/jodaprint.umd.min.js"></script>
<script>
const jp = new JodaPrint({ orgId: "org_123", signer: JodaPrint.httpSigner("/jodaprint/sign") });
</script>
En cas de problème
| Erreur | Signification |
|---|---|
AGENT_NOT_FOUND | Aucun agent ne répond. Installez-le ou démarrez-le ; error.helpUrl pointe vers la page de téléchargement. |
AGENT_CERT_UNTRUSTED | L'agent tourne mais le navigateur ne fait pas confiance à son certificat. Voir Dépannage. |
ORIGIN_NOT_ALLOWED | Ajoutez l'origine de la page (étape 1). |
SIGNATURE_INVALID | Mauvais identifiant de clé, organisation ou clé privée côté serveur. |
Chaque erreur a un code, un message et retryable. Avec l'option locale: "fr", les messages propres au SDK sont en français. La liste complète est dans Codes d'erreur.
Ensuite
- Décrire de vrais tickets : Tickets.
- Le fonctionnement de la signature : Sécurité et signature.
- Tous les appels du SDK : Référence du SDK JavaScript.