Zum Hauptinhalt springen

Elemente

import '@le-space/libp2p-webrtc-qr/elements'

Registriert sechs Custom Elements. Alle sind über CSS-Custom-Properties gestaltbar und über strings übersetzbar.

Die Klassen — QrInviteElement, QrScannerElement, QrListenElement, QrStatusElement, QrPeersElement, QrIntroElement — sind für Framework-Hüllen und für die Registrierung unter einem anderen Tag-Namen exportiert; für den Normalfall genügt der Import des Moduls.

<qr-invite> — zeigt eine Nutzlast als Code

Attributevalue, frame-interval
Eigenschaftenvalue, frameInterval, strings
Ereignisrender{ frames, modules, characters }
Zeichenkettenalt, part, recovery

Oberhalb von STATIC_QR_MAX_LENGTH wird die Nutzlast in animierte BC-UR-Einzelbilder zerlegt; frames > 1 am render-Ereignis sagt, dass es passiert ist. modules und characters sind das, was man protokolliert, wenn ein Code sich nicht scannen lässt.

<qr-scanner> — Kamera, Scan-Schleife, Zusammensetzung

Attributlabel
Eigenschaftenlabel, strings, validate, isOpen
Methodenopen(), close()
Ereignissescan{ text }, close, error{ error }
Zeichenkettenlabel, close, unsupported, insecure, denied, noDevice, starting, looking, stillLooking({ attempts }), rejected, animated({ received, total }), animatedUnknown

validate entscheidet, ob ein gescannter Code der ist, den dieser Bildschirm will — ein { ok: false, reason } lässt die Kamera weiterlaufen und zeigt den Grund an.

Das Element gibt die Kamera auf jedem Weg hinaus frei, auch bei Entfernung aus dem DOM.

<qr-listen> — Mikrofon, Dekodierung, Zusammensetzung

Attributlabel
Eigenschaftenlabel, strings, validate, createReceiver, isOpen
Methodenopen(), close()
Ereignissepayload{ text }, close, error{ error }
Stringslabel, close, unsupported, noAudio, starting, listening, quiet, progress({ received, total }), rejected, denied

Die andere Hälfte von <qr-scanner> und von derselben Bauart: das Element besitzt das Gerät, die Dekodierung und die Zusammensetzung, und validate entscheidet, ob das Gehörte die Nutzlast ist, auf die dieser Bildschirm wartet. { ok: false, reason } lässt das Mikrofon offen und zeigt den Grund.

createReceiver wird übergeben statt importiert: der Codec läge sonst im Elemente-Bundle für jede Seite, auch für die, die nie ein Mikrofon öffnen, und ggwaves WebAssembly-Glue nennt Nodes path und fs, die kein Browser-Bundle auflöst. Eine Zeile an der Aufrufstelle hält die optionale Abhängigkeit optional:

import { createAudioReceiver } from '@le-space/libp2p-webrtc-qr'

listen.createReceiver = createAudioReceiver

Es fordert das Mikrofon mit echoCancellation, noiseSuppression und autoGainControl aus an. Alle drei sind auf Sprache abgestimmt und hier schädlich: die Rauschunterdrückung ist gebaut, um genau solche gleichmäßigen Töne zu entfernen, die Echokompensation zieht ab, was die Lautsprecher spielen, und die Pegelregelung verwischt die Symbolgrenzen mitten in der Übertragung.

Die Pegelanzeige ist keine Dekoration — wer zwei Geräte aneinanderhält, hat sonst kein Mittel, ein abgelehntes Mikrofon von einem stillen Raum zu unterscheiden. Das Mikrofon wird auf jedem Weg hinaus freigegeben, auch beim Entfernen aus dem DOM.

Zum Träger selbst siehe Ton.

<qr-status> — was dieses Netz zulässt

Attributrows — aus browser ipv4 ipv6 camera overall, Vorgabe ipv4 ipv6 overall
Eigenschaftenstrings, rtcConfiguration, result
Methodenprobe(), renderResult(result)
Ereignisprobe → das Ergebnis
gespiegeltblocked, off-network-risk="blocked|unreliable"
Zeichenkettenbrowser, ipv4, ipv6, camera, overall, open, relay, symmetric, blocked, measuring, alarm, alarmUnreliable

Zeigt während der Messung einen Fortschrittsbalken und schlägt Alarm, wenn das Netz keinen Peer anderswo erreicht. renderResult stellt ein selbst gemessenes Urteil dar.

Ein Urteil ist eine Beobachtung über diesen Browser, nicht über das Netz. Siehe Netzbereitschaft.

<qr-peers> — wer verbunden ist

Eigenschaftenpeers[{ peerId, state }], count, strings
Ereignisdisconnect{ peerId }
Zeichenkettenconnected, connecting, disconnected, failed, closed, new, disconnect, disconnectFrom

Das Trennen auszuführen ist Sache des Hosts; die Liste ändert sich, wenn der Host sagt, dass er es getan hat.

Alles Sichtbare übersetzen

Jedes Element nimmt ein strings-Objekt, das über die Vorgaben gemerged wird — drei ersetzte Beschriftungen verlieren also den Rest nicht.

import { QR_STATUS_STRINGS } from '@le-space/libp2p-webrtc-qr/elements'

status.strings = { ipv4: 'IPv4', blocked: 'keins', measuring: 'Prüfe Netzwerk…' }

Werte sind Zeichenketten — oder Funktionen, wo eine Zahl im Spiel ist (stillLooking({ attempts }), animated({ received, total })). Das Paket zwingt einem Verbraucher seine Wortstellung nicht auf.

Vorgaben: QR_INVITE_STRINGS, QR_SCANNER_STRINGS, QR_LISTEN_STRINGS, QR_STATUS_STRINGS, QR_PEERS_STRINGS. mergeStrings und resolveText sind für alle exportiert, die darauf aufbauen.

QR-Rahmung

Für eine eigene Einladungsansicht statt <qr-invite>.

needsAnimation(text)liegt das über STATIC_QR_MAX_LENGTH
createFrameSource(text, options){ total, next() } — BC-UR-Einzelbilder
createPartAccumulator()receive(part) → Fortschritt oder die ganze Nutzlast
looksLikeUrPart(text)ist das ein Bild eines mehrteiligen Codes
preload()den Encoder vor dem ersten Bild aufwärmen
KonstantenFRAME_INTERVAL_MS, MAX_FRAGMENT_BYTES, STATIC_QR_MAX_LENGTH

Die Einzelbilder sind fountain-codiert: sie lassen sich in beliebiger Reihenfolge lesen, und ein verpasstes kostet nichts.

Gestaltung

CSS-Custom-Properties am Element oder an einem Vorfahren setzen.

qr-status {
--qr-status-open: #3edc97;
--qr-status-degraded: #ffc24b;
--qr-status-blocked: #ff6b5b;
--qr-status-chip-background: transparent;
--qr-status-chip-color: inherit;
}

Jedes Element dokumentiert seine eigenen Variablen am Kopf seiner Quelle. Durch das Shadow DOM dringt sonst nichts hinein oder hinaus.