npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@aetherius/react-native

v0.5.4

Published

Act II (Continuum) sur WebView : agent JavaScript injecte, RPC correlee, auto-attente et extraction DOM, pour React Native.

Readme

@aetherius/react-native

Le moteur Aetherius dans une application mobile : l'Act II sur l'appareil, et la surface que consomme l'application.

Ce paquet apporte ce que @aetherius/engine ne peut pas porter sans dependre d'une plateforme : le driver Continuum adosse a une WebView cachee pilotee par un agent JavaScript injecte, les secrets par le trousseau de l'OS, confirm en modal natif, la facade Aetherius, et la livraison des Blueprints — un socle embarque, une surcouche distante verifiee, un cache et un interrupteur d'arret.

C'est la reponse a un cas concret : une application mobile qui se connecte au portail d'une universite et en extrait des donnees. Aujourd'hui cela s'ecrit en JavaScript injecte sous forme de gabarits de chaine — non type, non verifiable, et fragile des que le site bouge. Avec Aetherius, le comportement redevient un Blueprint, les requetes partent du telephone de l'utilisateur, et les identifiants ne quittent jamais l'appareil.

Prise en main

import * as SecureStore from "expo-secure-store";
import {
  Aetherius, AetheriusConfirm, AetheriusWebView, describeFailure, keychainSecrets,
} from "@aetherius/react-native";

// Le magasin de secrets est *injecte* : expo-secure-store, react-native-keychain, ou le tien.
const client = new Aetherius({ secrets: keychainSecrets(SecureStore) });

// Une fois, haut dans l'arbre. La WebView n'est creee qu'au premier run `continuum` et liberee a la
// fin : une application qui ne joue que de l'Act I n'en porte aucune.
export function App() {
  return (
    <>
      <MesEcrans />
      <AetheriusWebView />
      <AetheriusConfirm />
    </>
  );
}

const result = await client.run(blueprint, { inputs, onEvent: setProgression });
const failure = describeFailure(result); // undefined quand le run a reussi

Les noms sont ceux du SDK daemon @aetherius/client : le choix d'embarquer un moteur ou d'en piloter un a distance ne doit pas se voir dans le code appelant.

Un Blueprint n'a pas a etre fige dans le binaire. Le registre resout entre le socle embarque et une surcouche distante verifiee — donc un site qui change se repare sans republier sur les stores :

import AsyncStorage from "@react-native-async-storage/async-storage";
import { BlueprintRegistry } from "@aetherius/react-native";

const registry = new BlueprintRegistry({
  bundled: { "ukit.planning.week": { version: "1", document: planning } },
  manifest: "https://cdn.exemple.fr/aetherius/manifest.json",
  cache: AsyncStorage,          // magasin injecte, comme le trousseau
});

const { blueprint, origin } = await registry.resolve("ukit.planning.week");  // aucun reseau
void registry.refresh();                                                    // hors du chemin critique

Le distant ne gagne que s'il est plus recent, entier et valide : empreinte SHA-256 verifiee a chaque lecture, secrets bornes par l'application, min_engine respecte, et un interrupteur d'arret des deux cotes. Format du manifeste et modele de menace : docs/embedded.md.

react, react-native et react-native-webview sont des peer dependencies : le paquet declare structurellement la surface qu'il utilise plutot que d'emprunter leurs types, ce qui le garde compilable et testable sans elles.

Ce qu'il y a dedans

| Module | Role | |--------|------| | aetherius.ts | La facade : validation, resolution des secrets declares, masquage, passerelle d'approbation, annulation. | | secrets/ | SecretResolver, l'adaptateur trousseau (magasin injecte), et le rideau qui masque les valeurs dans les evenements et les messages d'echec. | | confirm/ | Le rendez-vous d'approbation observable, le hook useApprovalRequest (la primitive) et <AetheriusConfirm /> (l'habillage par defaut). | | hooks/use-run.ts | useAetheriusRun : le flux d'evenements branche sur un ecran, annulation au demontage comprise. | | webview/protocol.ts | Le contrat de fil entre le driver et l'agent : vocabulaire ferme, parametres encodes en JSON, reponses correlees, jeton de generation. | | webview/rpc.ts | Correlation des appels, echeances, reassemblage des messages decoupes, invalidation a la navigation. | | webview/bridged-host.ts | Le cycle de vie de navigation, ecrit une fois : « pret » veut dire l'agent s'est annonce sur la generation courante. | | webview/lease.ts | Une vue, donc un run Act II a la fois : le second est refuse, pas mis en file. | | webview/agent/ | L'agent injecte — locators, auto-attente, operations, lecture DOM. Assemble au build en une chaine unique. | | webview/component.tsx | <AetheriusWebView /> : la WebView cachee, ses sessions et son mode debug. | | continuum/ | Le driver et sa table action → operation. | | delivery/ | Le registre : manifeste (parseur strict), integrite (SHA-256 ecrit a la main), cache (magasin injecte), perimetre des secrets et interrupteur d'arret. |

Le modele d'erreur (describeFailure et la hierarchie typee) est re-exporte depuis le moteur : une application n'a qu'une porte d'entree, et n'a pas a savoir ou vivent les classes.

Tester

npm test        # build (dont l'assemblage de l'agent) + suite complete
npm run conformance   # le corpus partage, Act II compris

Les tests pilotent la production : la vraie facade, le vrai BridgedHost, la vraie RPC et le vrai agent, contre un DOM jsdom au lieu d'une WebView. L'agent est en outre joue dans un vrai Chromium depuis les tests Python (tests/integration/test_webview_agent.py), et compare a Playwright sur la meme page.

Reference d'usage, protocole, limites declarees et sondes jouees : docs/embedded.md. Le cadrage de la phase et ses sept jalons : docs/phase-3/.

Etat. L'Act II s'execute (jalon 3-D) et la surface applicative est livree (jalon 3-E). La livraison distante des Blueprints — cache, integrite, interrupteur d'arret — est le jalon 3-F.