Aller au contenu

La couche communautaire

Vos utilisateurs voient ce qu’aucun gestionnaire routier ne publiera jamais

Relay transporte le flux routier national français : une application de navigation qui ne fait que lire est donc utile dès le premier jour. Cette page traite de l’autre sens : la partie précise et nommable du vocabulaire qui ne peut venir que d’un pare-brise — et ce qu’il vous en coûte de l’y mettre.

ce qu’un flux ne peut pas transporter

10 signalements qu’aucun flux de gestionnaire ne produit

Ce n’est pas un jugement sur les gestionnaires — c’est une conséquence de ce qu’est un gestionnaire. Une autorité routière publie ce vers quoi elle a dépêché une équipe, et un nid-de-poule, avant cette intervention, n’existe dans le système de personne. Les premières lignes sont des types entiers sans aucune source publique : personne ne publie ses propres contrôles de police, une voiture-radar banalisée ou un feu en panne avant que quelqu’un ne le signale par téléphone. Chaque ligne ci-dessous est un type ou une valeur qu’aucune correspondance d’un flux national que nous ingérons ne peut produire.

  • Contrôle de policepolice_check

    Aucune autorité ne publie ses propres contrôles, et aucune ne le fera jamais. C’est le bouton le plus utilisé de tous les réseaux communautaires qui ont existé — et celui qu’une petite application ne peut obtenir nulle part ailleurs, à aucun prix.

  • Radar · Radar mobilespeed_camera · mobile_camera

    Une voiture-radar se gare deux heures et n’apparaît dans aucun jeu de données. Les radars fixes sont en données ouvertes ; celui-ci n’existe que dans les pare-brise qui viennent de le croiser.

  • Panne d’équipementinfrastructure_fault

    Un feu tricolore éteint est signalé à la mairie par téléphone, aux heures de bureau, et n’atteint aucun flux. Tous les conducteurs à ce carrefour le savent en quelques secondes.

  • Travaux · Travaux d’urgenceroadworks · emergency_works

    Les travaux planifiés sont publiés des semaines à l’avance et nous ne les portons volontairement pas. La fouille ouverte à six heures ce matin n’est dans aucun planning.

  • Chaussée dégradée · Nid-de-pouleroad_damage · pothole

    Personne n’a encore envoyé d’équipe, donc rien dans le système d’aucun gestionnaire. Un capteur de suspension le remonte sans aucun conducteur.

  • Chaussée dégradée · Affaissementroad_damage · sinkhole

    La seule valeur de chaussée dégradée qui soit une urgence, et c’est d’abord une voiture qui la voit.

  • Objet sur la chaussée · Débrisobject_on_road · debris

    Le flux porte les chargements perdus et les arbres tombés. Les débris ordinaires, ce sont ceux qu’un conducteur évite sans que personne ne les déclare.

  • Personnes sur la chaussée · Ouvrier routierpeople_on_road · road_worker

    Une équipe sur la chaussée hors d’un chantier déclaré — le cas qu’un enregistrement de travaux planifiés ne couvre pas.

  • Personnes sur la chaussée · Agent de circulationpeople_on_road · traffic_officer

    Un agent qui régule la circulation à un carrefour. Réel, immédiat, et dans aucun flux.

  • Personnes sur la chaussée · Cyclistepeople_on_road · cyclist

    Un cycliste sur une route qui n’en attend pas. Un danger pour lui avant d’en être un pour quiconque.

Et sur tout ce que le flux transporte, vos utilisateurs arrivent plus tôt

C’est la plus grande moitié, et ce n’est pas une question de vocabulaire. Un gestionnaire publie quand il sait ; un signalement venu de l’intérieur du bouchon est le même événement, plus tôt, et sur les tronçons que personne ne surveille, c’est le seul signalement qu’il y aura.

  • Accident

    Le flux publie quand le gestionnaire est au courant. Quelqu’un dans la troisième voiture en arrière le sait avant.

  • Bouchon

    Un bouchon est déclaré quand il est détecté sur le réseau géré. Vos utilisateurs sont dedans.

  • Véhicule arrêté

    Sur la bande d’arrêt d’un tronçon non surveillé, un pare-brise est le seul capteur qui existe.

  • Danger météo

    Le verglas fait cent mètres. À cette résolution, la détection est une voiture, pas une station.

  • Route fermée

    Un gestionnaire déclare la fermeture qu’il avait prévue. Celle qu’un accident a causée il y a quatre minutes, ce sont les conducteurs déjà arrêtés devant qui l’annoncent.

l’intégration

Un bouton pour signaler, un bouton pour confirmer. C’est tout le mécanisme

Vous avez déjà le panneau de signalement — une grille d’icônes que vos utilisateurs touchent. Ce qui vous manque, c’est un endroit où envoyer ces signalements et quelqu’un pour les confirmer. Chacun tient en un appel HTTP, et publier est gratuit pour toujours.

1 · Un conducteur signale

Projetez votre panneau sur le vocabulaire une fois pour toutes. Filtrez sur type, affinez sur subtype— la liste générale grandit rarement, donc cette table s’écrit une fois et ne se périme pas. La durée de vie vient du type : vous n’expirez jamais un marqueur vous-même.

POST /v1/events
const API = "https://api.cudatus.com";

// Your report sheet, mapped onto the vocabulary once.
const SHEET = {
  police: { type: "police_check" },
  queue: { type: "congestion", subtype: "queue" },
  accident: { type: "accident" },
  roadClosed: { type: "road_closure", subtype: "full_closure" },
  speedCamera: { type: "speed_camera" },
  pothole: { type: "road_damage", subtype: "pothole" },
  trafficLightOut: { type: "infrastructure_fault", subtype: "traffic_signal" },
  roadworks: { type: "roadworks" },
  debris: { type: "object_on_road", subtype: "debris" },
  brokenDown: { type: "stopped_vehicle", subtype: "broken_down" },
  blackIce: { type: "weather_hazard", subtype: "black_ice" },
  personOnRoad: { type: "people_on_road", subtype: "pedestrian" },
};

// A driver taps a button. This is the whole publish path.
export async function report(kind, { lat, lon }, severity = "medium") {
  const res = await fetch(`${API}/v1/events`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.RELAY_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ ...SHEET[kind], lat, lon, severity }),
  });
  const event = await res.json();
  return event.event_id;   // it is on the stream before this line runs
}

2 · Le conducteur suivant répond

« Toujours là » prolonge la vie de l’événement ; « Plus là » est ce qui le retire. Assez d’infirmations y mettent fin plus tôt — pour tout le réseau, pas seulement pour vos utilisateurs — et une infirmation retire sans condamner : personne n’est accusé d’un faux signalement parce que la route a simplement été dégagée.

POST /v1/events/{id}/signals
// The marker is on screen. The driver says "still there" or "gone".
export async function answer(eventId, stillThere, device) {
  const res = await fetch(`${API}/v1/events/${eventId}/signals`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.RELAY_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      action: stillThere ? "confirm" : "deny",
      // What the quorum counts: one stable token per DEVICE.
      reporter_token: device.id,
      // Optional, and worth sending — a confirmation from the
      // scene is recorded as coming from the scene.
      lat: device.lat,
      lon: device.lon,
    }),
  });

  // 409: a quorum cleared it before this driver answered.
  if (res.status === 409) return "already over";
  return (await res.json()).verification;  // unverified | verified
}

reporter_token est le champ à soigner

Le quorum compte des véhiculesdistincts, pas des organisations. Envoyez un jeton stable par appareil, et cent de vos utilisateurs qui confirment un nid-de-poule font cent voix ; omettez-le, et toute votre application compte pour une seule, ce qui fonctionne toujours mais ne promeut rien. Il n’atteint jamais le réseau : il est salé avec votre organisation à son arrivée et la valeur brute n’est jamais stockée, si bien qu’il ne peut être relié à une personne ni par nous, ni par quiconque lit le réseau.

ce que vous obtenez en retour

Trois comportements que vous auriez sinon à construire

Ce qui rend une couche communautaire coûteuse, ce n’est jamais le bouton de signalement. C’est tout ce qui doit arriver à un signalement ensuite, et tout cela se passe de ce côté-ci du réseau.

  • Des marqueurs qui disparaissent d’eux-mêmes

    Chaque événement porte une durée de vie issue de son type — quelques minutes pour un bouchon, jusqu’à plusieurs semaines pour une chaussée dégradée. Un client le retire quand sa propre échéance passe, et rien n’a besoin d’être envoyé pour le dire. Aucun nettoyage des dangers périmés à écrire.

  • La confirmation sans équipe de modération

    Des véhicules distincts qui signalent la même chose la promeuvent ; assez de véhicules qui l’infirment la retirent. Ce n’est pas vous qui décidez si un signalement est vrai, ni nous — c’est la route.

  • Des signalements d’utilisateurs qui ne sont pas les vôtres

    C’est la part qu’une application seule ne peut acheter à aucun prix. Un nid-de-poule confirmé par les camions d’une flotte atteint aussi vos utilisateurs, parce que tout le monde sur le réseau lit le même flux.

celui que tout le monde demande

Les contrôles de police sont dans le vocabulaire, et la suspension explique pourquoi cela a pris du temps

C’est le type qu’on réclame en premier à une application communautaire. Il est livré, et la capacité sur laquelle il repose est, sur tout ce site, l’argument le plus net pour se brancher sur un tronc partagé.

La rediffusion des signalements de contrôles de police peut devoir être interrompue sur une zone donnée, pour une durée donnée, sur demande. Cette suspension relève du tronc plutôt que de chaque application : un petit nombre de zones actives, appliqué aux trois endroits où le réseau décide de ce qu’un abonné peut voir.

Chaque application de navigation fait face à cette exigence, et presque aucune n’a les moyens d’y répondre seule. La résoudre une fois pour tous ceux qui sont sur le réseau, c’est précisément la raison d’être d’un tronc partagé — et c’est une capacité que votre propre feuille de route n’atteindrait jamais.

démarrer

Publier est gratuit : tout commence donc dans la sandbox

Créez une clé sandbox, branchez les deux appels ci-dessus, et regardez vos propres signalements arriver sur le flux que vous lisez déjà. Une clé sandbox lit aussi le trafic national réel : votre carte n’est donc jamais vide pendant vos tests.