LIVE · LANȚ DE AUDIT · UE
SISTEM · 99,99% UPTIME
v 1.0 ↗ FĂCUT ÎN UE

@nexbasira/embed

Un widget navigateur qui affiche l'expérience côté terrain de NexBasira dans votre propre application. Insérez un <div>, pointez-le vers une URL de session générée, écoutez les événements du cycle de vie. Aucun boilerplate d'iframe à écrire vous-même.

Installation

npm install @nexbasira/embed

Ou via une balise <script> pour un usage sans bundler — voir Balise script ci-dessous.

Utilisation de base

import { embed } from "@nexbasira/embed";

const widget = embed({
  container: "#nb-host",          // selector or HTMLElement
  sessionUrl: invite.url,          // minted by your backend via the Node/Python SDK
  width: "100%",
  height: "720px",
  onReady: () => console.log("iframe loaded"),
  onSessionJoined: (id) => console.log("field user joined", id),
  onEvidenceAdded: (ev) => console.log("evidence", ev),
  onSessionComplete: (id) => router.push(`/inspections/${id}`),
});

sessionUrl est l'URL signée à usage unique que votre backend récupère depuis sessions.invite(). N'intégrez jamais un secret d'API dans l'URL — uniquement le jeton de session terrain, à usage unique et épinglé à l'IP / au UA.

Méthodes impératives

Le handle widget retourné permet à la page hôte de piloter l'expérience côté terrain par programmation — généralement utilisé par une barre d'outils hors de l'iframe :

widget.requestSnapshot();    // operator-side trigger; field captures a frame
widget.openWhiteboard();
widget.closeWhiteboard();
widget.switchCamera();        // toggle front / rear on supported devices
widget.mute();
widget.unmute();
widget.endSession();
widget.destroy();             // tear down the iframe + remove listeners

Chaque méthode envoie un message à la fenêtre de l'iframe via postMessage avec l'expectedOrigin configuré ; le répartiteur interne de l'iframe les route vers le contrôle concerné.

Événements du cycle de vie

Chaque callback que vous passez à embed({ on... }) est invoqué lorsque le postMessage correspondant de l'iframe arrive. Le contrôle de l'origine est appliqué — les messages provenant de toute autre origine sont ignorés, vous pouvez donc vous fier à la forme de la charge utile.

CallbackDéclenché quandCharge utile
onReadyl'iframe a fini de charger + établi la poignée de main
onSessionJoinedL'utilisateur terrain a rejoint la sallesessionId
onSessionCompleteSession close (fin par l'opérateur ou expiration automatique)sessionId
onEvidenceAddedNouvelle capture / annotation / tableau blanc / clip{ id, kind }
onWhiteboardOpenedPanneau du tableau blanc ouvert
onWhiteboardSavedTableau blanc exporté vers les preuves{ id }
onParticipantJoined / onParticipantLeftChangement d'état d'un participant{ id, role }
onErrorToute erreur côté iframe{ message, code }

Balise script

Pour les consommateurs sans bundler :

<script src="https://unpkg.com/@nexbasira/embed@latest/dist/index.umd.js"></script>
<div id="nb-host" style="width: 100%; height: 720px"></div>
<script>
  const widget = NexBasira.embed({
    container: "#nb-host",
    sessionUrl: "<minted-by-your-backend>",
    onSessionComplete: (id) => alert("done: " + id),
  });
</script>

Le bundle attache NexBasira.embed sur window pour ce schéma.

Épinglage de l'origine

Par défaut, le widget déduit l'origine attendue de l'iframe à partir de l'URL que vous avez passée (sessionUrl) et rejette les messages de toute autre origine. Si vous hébergez l'expérience côté terrain sur un domaine personnalisé (offre Pro), passez explicitement expectedOrigin :

embed({
  container: "#nb-host",
  sessionUrl: "https://inspect.yourco.com/r/abc",
  expectedOrigin: "https://inspect.yourco.com",
  // ...
});

Application React ?

Utilisez @nexbasira/react à la place — même widget en dessous, API React idiomatique (composant <NexBasiraSession> + hook useNexBasiraSession()), callbacks à closure fraîche au fil des re-rendus.

Et ensuite