CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-expo-modules-core

The core infrastructure for Expo Modules architecture enabling seamless integration between React Native applications and native platform code.

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

uuid-generation.mddocs/

UUID Generation

Native-backed UUID generation with support for both random (v4) and deterministic (v5) UUID creation.

Capabilities

UUID Generator Object

The main UUID utility object providing version 4 and version 5 UUID generation with native performance.

/**
 * Collection of utilities for generating Universally Unique Identifiers
 * Implementation is native-backed for optimal performance
 */
interface UUID {
  /**
   * Generates a random UUID v4 string
   * @returns Randomly generated UUID string
   */
  v4(): string;
  
  /**
   * Generates a UUID v5 based on name and namespace
   * Always produces the same result for the same inputs
   * @param name - String value to generate UUID from
   * @param namespace - Namespace UUID string or 16-byte array
   * @returns Deterministic UUID string based on inputs
   */
  v5(name: string, namespace: string | number[]): string;
  
  /**
   * Standard namespaces for UUID v5 generation
   */
  namespace: typeof Uuidv5Namespace;
}

const uuid: UUID;

Usage Examples:

import { uuid } from "expo-modules-core";

// Generate random UUIDs
const randomId1 = uuid.v4(); // e.g., "f47ac10b-58cc-4372-a567-0e02b2c3d479"
const randomId2 = uuid.v4(); // e.g., "6ba7b810-9dad-11d1-80b4-00c04fd430c8"

console.log("Random UUID:", randomId1);
console.log("Another random UUID:", randomId2);

// Generate deterministic UUIDs
const userId = "john.doe@example.com";
const deterministicId1 = uuid.v5(userId, uuid.namespace.dns);
const deterministicId2 = uuid.v5(userId, uuid.namespace.dns);

console.log("Deterministic UUID 1:", deterministicId1);
console.log("Deterministic UUID 2:", deterministicId2);
console.log("Are they equal?", deterministicId1 === deterministicId2); // true

// Different namespaces produce different UUIDs
const urlBasedId = uuid.v5("https://example.com/user/123", uuid.namespace.url);
const dnsBasedId = uuid.v5("example.com", uuid.namespace.dns);

console.log("URL-based UUID:", urlBasedId);
console.log("DNS-based UUID:", dnsBasedId);

Standard UUID v5 Namespaces

Predefined namespaces for UUID v5 generation as defined in RFC 4122.

/**
 * Default namespaces for UUID v5 defined in RFC 4122
 */
enum Uuidv5Namespace {
  /** DNS namespace - for domain names */
  dns = '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
  /** URL namespace - for URLs */
  url = '6ba7b811-9dad-11d1-80b4-00c04fd430c8', 
  /** OID namespace - for ISO OIDs */
  oid = '6ba7b812-9dad-11d1-80b4-00c04fd430c8',
  /** X.500 namespace - for X.500 DNs */
  x500 = '6ba7b814-9dad-11d1-80b4-00c04fd430c8',
}

Usage Examples:

import { uuid, Uuidv5Namespace } from "expo-modules-core";

// Use predefined namespaces
const domains = ["example.com", "google.com", "github.com"];
const domainUuids = domains.map(domain => ({
  domain,
  uuid: uuid.v5(domain, Uuidv5Namespace.dns)
}));

console.log("Domain UUIDs:", domainUuids);
// Each domain will always produce the same UUID

// URL-based UUIDs
const urls = [
  "https://api.example.com/users/123",
  "https://api.example.com/posts/456", 
  "https://cdn.example.com/images/789.jpg"
];

const urlUuids = urls.map(url => ({
  url,
  uuid: uuid.v5(url, Uuidv5Namespace.url)
}));

console.log("URL UUIDs:", urlUuids);

// X.500 Distinguished Names  
const distinguishedNames = [
  "CN=John Doe,OU=Engineering,O=ExampleCorp,C=US",
  "CN=Jane Smith,OU=Marketing,O=ExampleCorp,C=US"
];

const dnUuids = distinguishedNames.map(dn => ({
  dn,
  uuid: uuid.v5(dn, Uuidv5Namespace.x500)
}));

console.log("Distinguished Name UUIDs:", dnUuids);

Custom UUID v5 Namespaces

Using custom namespaces for UUID v5 generation in specific domains.

import { uuid } from "expo-modules-core";

// Create a custom namespace UUID for your application
const APP_NAMESPACE = "550e8400-e29b-41d4-a716-446655440000";

// Generate UUIDs for application-specific entities
function generateUserUuid(email: string): string {
  return uuid.v5(email, APP_NAMESPACE);
}

function generateSessionUuid(userId: string, timestamp: number): string {
  return uuid.v5(`${userId}:${timestamp}`, APP_NAMESPACE);
}

function generateResourceUuid(type: string, id: string): string {
  return uuid.v5(`${type}:${id}`, APP_NAMESPACE);
}

// Usage
const userEmail = "alice@example.com";
const userId = generateUserUuid(userEmail);
const sessionId = generateSessionUuid(userId, Date.now());
const documentId = generateResourceUuid("document", "readme.md");

console.log("User UUID:", userId);
console.log("Session UUID:", sessionId);
console.log("Document UUID:", documentId);

// Using byte array namespace
const customNamespaceBytes = [
  0x55, 0x0e, 0x84, 0x00, 0xe2, 0x9b, 0x41, 0xd4,
  0xa7, 0x16, 0x44, 0x66, 0x55, 0x44, 0x00, 0x00
];

const byteBasedUuid = uuid.v5("test-data", customNamespaceBytes);
console.log("Byte-based UUID:", byteBasedUuid);

UUID Validation and Utilities

Helper functions for working with generated UUIDs.

import { uuid } from "expo-modules-core";

// UUID validation (basic pattern matching)
function isValidUuid(str: string): boolean {
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
  return uuidRegex.test(str);
}

// Extract UUID version
function getUuidVersion(uuidStr: string): number | null {
  if (!isValidUuid(uuidStr)) return null;
  return parseInt(uuidStr.charAt(14), 16);
}

// UUID generation with validation
function generateValidatedUuid(): string {
  const id = uuid.v4();
  if (!isValidUuid(id)) {
    throw new Error("Generated invalid UUID");
  }
  return id;
}

// Batch UUID generation
function generateUuidBatch(count: number, type: 'v4' | 'v5' = 'v4', name?: string): string[] {
  const uuids: string[] = [];
  
  for (let i = 0; i < count; i++) {
    if (type === 'v4') {
      uuids.push(uuid.v4());
    } else if (type === 'v5' && name) {
      // Add index to make each UUID unique
      uuids.push(uuid.v5(`${name}:${i}`, uuid.namespace.dns));
    }
  }
  
  return uuids;
}

// Usage
const singleUuid = generateValidatedUuid();
console.log("Validated UUID:", singleUuid);
console.log("UUID version:", getUuidVersion(singleUuid)); // 4

// Generate batch of random UUIDs
const randomBatch = generateUuidBatch(5, 'v4');
console.log("Random UUID batch:", randomBatch);

// Generate batch of deterministic UUIDs
const deterministicBatch = generateUuidBatch(5, 'v5', 'user-session');
console.log("Deterministic UUID batch:", deterministicBatch);

Performance Considerations and Best Practices

Guidelines for optimal UUID usage in applications.

import { uuid } from "expo-modules-core";

// ✅ Good: Use v4 for unique identifiers
function createUniqueId(): string {
  return uuid.v4();
}

// ✅ Good: Use v5 for reproducible identifiers
function createReproducibleId(data: string, context: string): string {
  return uuid.v5(`${context}:${data}`, uuid.namespace.dns);
}

// ✅ Good: Cache namespace UUIDs
const NAMESPACE_CACHE = new Map<string, string>();

function getCachedNamespaceId(namespace: string): string {
  if (!NAMESPACE_CACHE.has(namespace)) {
    NAMESPACE_CACHE.set(namespace, uuid.v5(namespace, uuid.namespace.dns));
  }
  return NAMESPACE_CACHE.get(namespace)!;
}

// ✅ Good: Batch operations when possible
class UuidManager {
  private static batchGenerate(count: number): string[] {
    return Array.from({ length: count }, () => uuid.v4());
  }
  
  static generateIds(count: number): string[] {
    if (count <= 0) return [];
    if (count === 1) return [uuid.v4()];
    return this.batchGenerate(count);
  }
}

// ❌ Bad: Generating UUIDs in loops without caching
function badExample() {
  const items = ['a', 'b', 'c', 'd', 'e'];
  return items.map(item => {
    // Recalculates namespace each time
    return uuid.v5(item, uuid.v5('my-namespace', uuid.namespace.dns));
  });
}

// ✅ Good: Pre-calculate namespace
function goodExample() {
  const items = ['a', 'b', 'c', 'd', 'e'];
  const myNamespace = uuid.v5('my-namespace', uuid.namespace.dns);
  
  return items.map(item => uuid.v5(item, myNamespace));
}

// Application-specific UUID patterns
class ApplicationIds {
  private static readonly USER_NAMESPACE = uuid.v5('users', uuid.namespace.dns);
  private static readonly SESSION_NAMESPACE = uuid.v5('sessions', uuid.namespace.dns);
  
  static generateUserId(email: string): string {
    return uuid.v5(email.toLowerCase(), this.USER_NAMESPACE);
  }
  
  static generateSessionId(): string {
    // Combine deterministic and random elements
    const timestamp = Date.now().toString();
    const random = uuid.v4();
    return uuid.v5(`${timestamp}:${random}`, this.SESSION_NAMESPACE);
  }
  
  static generateRequestId(): string {
    // Always random for unique request tracking
    return uuid.v4();
  }
}

// Usage
const userId = ApplicationIds.generateUserId("user@example.com");
const sessionId = ApplicationIds.generateSessionId();
const requestId = ApplicationIds.generateRequestId();

console.log("Generated IDs:", { userId, sessionId, requestId });

Types

/**
 * UUID utility interface
 */
interface UUID {
  v4(): string;
  v5(name: string, namespace: string | number[]): string;
  namespace: typeof Uuidv5Namespace;
}

/**
 * Standard UUID v5 namespace enumeration
 */
enum Uuidv5Namespace {
  dns = '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
  url = '6ba7b811-9dad-11d1-80b4-00c04fd430c8',
  oid = '6ba7b812-9dad-11d1-80b4-00c04fd430c8',
  x500 = '6ba7b814-9dad-11d1-80b4-00c04fd430c8'
}

docs

app-utilities.md

error-handling.md

event-communication.md

index.md

native-modules.md

native-views.md

permissions.md

platform-utilities.md

shared-memory.md

uuid-generation.md

tile.json