Chat Synapx : confidentialité des échanges

Un chat temps réel pour votre site et vos applications métier.

  • ✓Messages non écrits sur disque côté serveur
  • ✓Conversations 1-1 isolées
  • ✓Aucun service tiers dans le SDK
JS vanilla Node.js
chat.js
import Synapx from '/sdk/Chats/index.js'; import { Widget } from '/sdk/Chats/Widget/index.js'; const synapx = new Synapx(); synapx.use(Widget); await synapx.init(); // JWT émis par votre serveur synapx.ws.connect([{ bearer: '<JWT>' }]); // Publication fiable (accusé serveur) const ack = await synapx.ws.publish({ body: 'bonjour' });

Un chat sur votre site et dans vos dossiers métier

Le chat Synapx permet d'échanger en temps réel sur votre site ou dans votre application métier. Dans une PME, vous pouvez rattacher une discussion à une facture ou à un dossier, comme dans l'ERP Adliss.

Vos développeurs l'intègrent avec un SDK en JavaScript vanilla. Une seule connexion WebSocket est partagée entre les onglets du navigateur grâce à SharedWorker.

Écouter la présentation 1 min 14s

Lire la transcription

Le chat Synapx permet d'échanger en temps réel, sur un site ou dans une application métier. Dans une PME, une discussion peut être rattachée à une facture ou à un dossier, comme dans l'ERP Adliss.

Côté développeurs, l'intégration passe par un SDK en JavaScript simple. Une seule connexion WebSocket est partagée entre tous les onglets du navigateur. Le SDK ne fait appel à aucun service tiers, ni CDN, ni mesure d'audience.

Après une coupure, les messages sont rattrapés depuis la mémoire vive du serveur, sans écriture sur disque ni en base. Cent messages par fil sont conservés, pendant vingt-quatre heures au maximum. Le contenu des messages n'est pas journalisé.

L'accès est contrôlé par un jeton signé, à durée limitée, qui fixe précisément ce qu'un utilisateur peut lire et écrire. Les conversations en tête-à-tête restent réservées à leurs deux participants. En revanche, il n'y a pas encore de chiffrement de bout en bout : la connexion est chiffrée jusqu'au serveur, mais celui-ci peut techniquement lire les messages échangés.

Le chat propose aussi les accusés de réception, l'édition et la suppression de ses messages, les réactions, les mentions et les messages privés ou en groupe.

Une démo publique est accessible depuis cette page. N'hésitez pas à l'essayer.

Où vont vos messages

Donnée Où Conservation ou accès
Messages à rattraper après une coupure En mémoire vive sur le serveur, sans écriture sur disque ni en base. 100 messages par fil, 24 h maximum. Cette fenêtre est perdue au redémarrage du serveur.
Événements techniques : présence, indicateur « écrit… » Transmis par le serveur. Non conservés.
Pièces jointes Conservées sur le serveur. Accès par un lien signé valable 7 jours.
Historique local Dans IndexedDB, sur l'appareil de l'utilisateur, non chiffré. Vous pouvez vider une conversation dans votre navigateur.

Le contenu des messages n'est pas journalisé. Pour la sécurité et le diagnostic, le serveur journalise des métadonnées de connexion : adresse IP, identifiant de l'utilisateur, tenant et flux. Un échantillon technique de 1 % des messages est tracé avec leurs identifiants et horodatages seulement.

Dans un salon, les membres voient qui est en ligne : le nom et l'arrivée des personnes présentes sont visibles.

Le SDK ne fait appel à aucun service tiers : ni CDN, ni outil de mesure d'audience, ni appel externe.

Contrôle d'accès et isolation

Votre serveur émet un jeton JWT signé en HS256, à durée de validité limitée. Il fixe l'espace client (tenant), les flux (streams) autorisés en lecture et en écriture, ainsi que les fils accessibles.

  • À chaque abonnement et publication : le serveur vérifie le tenant du jeton, le flux et le fil autorisés. Un abonné d'un autre tenant ne reçoit pas les messages.
  • Conversations 1-1 : seuls les deux participants peuvent y accéder. Un tiers ne peut ni s'y abonner, ni y publier, ni en recevoir ou rejouer les messages, même avec un jeton accordant des droits larges.
  • Limites : 256 Ko par message, un débit de publication limité par connexion et une liste de sites autorisés à ouvrir la connexion depuis un navigateur.

Chiffrement de bout en bout : ce qui existe, ce qui vient

Il n'y a pas de chiffrement de bout en bout aujourd'hui. La connexion WebSocket utilise TLS (wss://) : les messages sont chiffrés entre votre navigateur et le serveur, mais le serveur qui les relaie peut techniquement les lire.

Le prochain chantier prévoit des clés générées dans le navigateur avec WebCrypto. La clé privée ne quittera jamais l'appareil et le serveur ne relaiera alors que du contenu illisible. Aucune date n'est annoncée.

L'ancien générateur « Chatters », qui produisait les clés côté serveur, est retiré : cette approche ne permet pas un véritable chiffrement de bout en bout.

Fonctionnalités

  • Envoi et reconnexion : messages temps réel avec accusé de réception serveur et rattrapage des messages manqués sans doublon.
  • Édition et suppression : vous pouvez modifier ou supprimer vos propres messages. Un marqueur « modifié » signale une édition ; une mention remplace un message supprimé. L'historique n'est réécrit qu'à la demande de l'auteur.
  • Interactions : réactions emoji, indicateur « écrit… » et mentions @nom, avec l'événement synapx:mention transmis au site hôte.
  • Lecture et non-lus : les accusés de lecture se déclenchent à la visibilité réelle du message ; les compteurs de non-lus se resynchronisent au retour en ligne.
  • Conversations : canal général, messages privés 1-1, groupes et fils rattachés à un objet métier.
  • Mise en forme : gras, code et liens, sans injection HTML.

Essayer la démo

Le salon de démonstration est public et isolé des clients. Ouvrir la démo.

Le partage de l'empreinte du navigateur y est facultatif et désactivé par défaut. Si vous choisissez de la partager, seul un extrait est envoyé aux personnes présentes.

Installation

Importez le SDK et son widget, puis fournissez le jeton émis par votre serveur pour ouvrir la connexion.

import Synapx from '/sdk/Chats/index.js';
import { Widget } from '/sdk/Chats/Widget/index.js';

const synapx = new Synapx();
synapx.use(Widget);
await synapx.init();

// Le JWT est émis par votre serveur
synapx.ws.connect([{ bearer: '<JWT émis par votre serveur>' }]);

// Publication fiable : la promesse résout sur l'accusé serveur
const ack = await synapx.ws.publish({ type: 'chat', body: 'bonjour', thread_id: 'general' });

document.addEventListener('synapx:mention', (e) => console.log(e.detail));

Exemple de contenu d'un jeton

Exemple illustratif : ce jeton autorise le flux chat.support, le fil general et les fils rattachés aux factures.

{
  "sub": "alice",
  "tenant": "VOTRE_TENANT",
  "publish_streams": ["chat.support"],
  "subscribe_streams": ["chat.support"],
  "thread_scopes": ["general:*", "facture:*"],
  "exp": 1790000000
}