Maison >interface Web >js tutoriel >TypeID-JS : ID uniques sécurisés et triables par K pour Javascript

TypeID-JS : ID uniques sécurisés et triables par K pour Javascript

WBOY
WBOYoriginal
2024-07-16 21:31:00902parcourir

TypeID-JS: Type Safe, K-Sortable Unique IDs for Javascript

Depuis que nous avons annoncé TypeID pour la première fois l'année dernière, nous avons constaté une adoption et un intérêt significatifs de la part de la communauté, avec 23 clients linguistiques différents fournis par la communauté et 90 000 téléchargements NPM hebdomadaires de notre implémentation Typescript. .

La semaine dernière, nous avons publié la version 1.0 de notre implémentation Typescript, TypeID-JS. Pour célébrer cette version, nous voulions expliquer davantage pourquoi nous avons écrit TypeID et comment nous l'utilisons pour garantir la sécurité des types chez Jetify.

Type de sécurité et identifiants uniques

Nous avons développé l'idée de TypeID lors de la création de Jetify Cloud, notre solution de déploiement et de gestion de projets basés sur Devbox ou Docker au sein de votre équipe. L'architecture de Jetify Cloud comporte de nombreuses entités différentes que nous devons gérer : organisations, utilisateurs, déploiements, secrets et projets, qui nécessitent tous des identifiants uniques pour les distinguer.

À l'origine, nous avons commencé par suivre les meilleures pratiques et attribuer un UUID à chaque instance d'une entité. Pourtant, nous avons rapidement rencontré un problème : UUIDv7 manque de sécurité de type ! Prenons le code ci-dessous comme exemple :

export const getMember = async (
  memberId: UUID,
  orgId: UUID,
) => {
  const { member, organization } =
    await authClient.organizations.members.get({
      organization_id: orgId,
      member_id: memberId,
    });

  return { member, organization };
};

Cette fonction utilise deux UUID pour rechercher un membre et une organisation. Cependant, la fonction ne peut pas garantir que memberID et orgID représentent la bonne entité ! Si un développeur utilise accidentellement un identifiant de membre alors que nous attendions un identifiant d'organisation, nous ne découvririons le problème qu'au moment de l'exécution.

Alors que nous cherchions des solutions à ce problème, nous avons rencontré l'ID d'objet de Stripe, qui encode les informations de type en identifiants à l'aide d'un préfixe. Cela semblait être une excellente solution, mais malheureusement, nous n'avons pas pu trouver de norme bien définie pour implémenter de manière cohérente les identifiants saisis dans plusieurs langues.

TypeID : identifiants triables par K, de type sécurisé et uniques au monde

TypeID est notre tentative de créer une norme aussi cohérente. TypeID est un identifiant unique au monde, triable en K et de type sécurisé, inspiré des types préfixés de Stripe. TypeID fournit également une norme cohérente permettant à d'autres langages d'implémenter leurs clients et bibliothèques.

Les TypeID codent les identifiants uniques sous la forme d'une chaîne minuscule composée de trois parties :

  1. Un préfixe qui représente le type de l'ID (63 caractères, lettres ASCII minuscules)
  2. Un séparateur de trait de soulignement (_)
  3. Un UUIDv7 de 128 bits codé sous la forme d'une chaîne de 26 caractères en utilisant un codage base32 modifié.
  user_2x4y6z8a0b1c2d3e4f5g6h7j8k
  └──┘ └────────────────────────┘
  type    uuid suffix (base32)

Avec ce format, un client compatible TypeID peut encoder et décoder les informations de type dans vos identifiants, puis exécuter des vérifications au moment de la construction ou de la compilation pour vous assurer que vous utilisez le bon identifiant. Par exemple, si nous voulions créer un TypeID aléatoire pour une entité utilisateur, nous pourrions faire quelque chose comme ceci :

Avec TypeID, nous pouvons également ajouter des vérifications de type à nos fonctions et détecter les erreurs au moment de l'exécution. En réécrivant l'exemple ci-dessus, nous pouvons désormais être sûrs que les développeurs utiliseront les bons identifiants au bon endroit :

import { TypeID } from 'typeid-js';

export const getMember = async (
  memberId: TypeID<'member'>,
  orgId: TypeID<'org'>,
) => {
    ...
}

En plus de la sécurité des types, ce format possède quelques propriétés qui le rendent convivial à utiliser pour les développeurs :

  1. Compatible UUIDv7 : Vous pouvez facilement convertir un TypeID en UUID en supprimant le préfixe et en décodant le suffixe.
  2. K-sortable : Vous pouvez utiliser un TypeID comme clé primaire triable dans votre base de données avec une bonne localité.
  3. URL sécurisée : Nous utilisons des TypeID dans nos URL pour les rendre faciles à copier, coller et partager. L'inclusion des TypeID dans l'URL simplifie la génération de l'état de la page.
  4. Facilement sélectionnable : Vous pouvez le copier et le coller en double-cliquant (Essayez-le !)

Nouvelles fonctionnalités de TypeID-JS v1.0

Aujourd'hui, nous annonçons la version 1.0 de notre bibliothèque TypeID-JS. Cette mise à jour ajoute plusieurs nouvelles fonctionnalités pour améliorer la convivialité et la sécurité des types, notamment :

  1. TypeID non boxés, basés sur des fonctions et diffusables : cela permet de sérialiser les TypeID sans les convertir en chaînes et vous permet d'utiliser les TypeID comme clés dans les cartes et les ensembles.
  2. Vérification plus stricte du type et de l'exécution : TypeID génère désormais une erreur si vous tentez d'analyser une chaîne vide ou un typeid avec le mauvais préfixe.
  3. Compatibilité avec la spécification TypeID v3 : Les TypeID JS peuvent désormais utiliser des traits de soulignement dans le préfixe. Par exemple : pro_subscription_2x4y6z8a0b1c2d3e4f5g6h7j8k est un TypeID valide avec le préfixe pro_subscription.

Comment utiliser TypeID avec votre projet

Vous pouvez ajouter TypeID à votre projet JS à l'aide du gestionnaire de packages NodeJS de votre choix. Vous n'utilisez pas JS ? TypeID a 26 implémentations différentes, allant de Go to OCaml à SQL. Si vous souhaitez écrire votre propre implémentation de TypeID, vous pouvez consulter notre spécification formelle.

Vous cherchez à dynamiser votre équipe de développement ?

Notre équipe chez Jetify crée de puissants outils de développement. Simplifiez vos déploiements et projets avec Jetify Cloud, ou automatisez les environnements d'intégration et de développement avec Devbox. Vous pouvez nous suivre sur Twitter ou discuter avec nos développeurs en direct sur notre serveur Discord. Nous acceptons également les problèmes et les demandes d'extraction sur notre dépôt Github.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:MON PARCOURS DE CODAGEArticle suivant:MON PARCOURS DE CODAGE