Portal WebSocket Protocol
The Portal WebSocket Protocol is the communication layer of the DragonFire Semantic Network, enabling semantic routing through geometric pathways. It organizes communication based on intent using a port-based architecture that maps directly to geometric forms.
Core Concepts
Semantic Ports
The Portal WebSocket Protocol uses semantic ports (numbered channels) to route messages based on their intent and purpose. Each port corresponds to a specific geometric form, creating natural mathematical pathways for different types of operations:
- 000-099 (Point/0D): System operations
- 100-199 (Line/1D): User interactions and authentication
- 200-299 (Triangle/2D): Data operations and profiles
- 300-399 (Tetrahedron/3D): Financial transactions
- 400-499 (Cube/3D): Storage operations
- 500-599 (Octahedron/3D): Knowledge operations and AI
- 600-699 (Icosahedron/3D): DragonFire core operations
- 700-799 (Dodecahedron/3D): Portal gateway functions
Message Structure
Portal messages follow a consistent structure that includes the semantic port, command, and payload:
{ "port": 100, // Semantic port number "command": "LOGIN", // Command to execute "payload": { // Data associated with command "token": "auth_token_value" } }
Implementation
The following example demonstrates how to initialize a Portal WebSocket connection and handle messages based on semantic ports:
// Initialize a Portal connection (client-side) const initPortalConnection = async (endpoint, authToken) => { // Establish WebSocket connection const ws = new WebSocket(`wss://${endpoint}/dragonfire`); // Set up message handling ws.onopen = async () => { console.log("Portal connection established"); // Immediately send authentication on port 100 (Auth) const authMessage = { port: 100, // Semantic authentication port command: "LOGIN", payload: { token: authToken } }; await sendPortalMessage(ws, authMessage); }; // Message handler with semantic port routing ws.onmessage = (event) => { const message = JSON.parse(event.data); const { port, command, payload } = message; // Route message to appropriate handler based on semantic port switch(port) { case 100: // Auth port handleAuthMessages(command, payload); break; case 210: // Personal profile data handleProfileData(command, payload); break; case 300: // Purchase channel handlePurchaseMessages(command, payload); break; // Other semantic ports... } }; return ws; }; // Send a message on the Portal const sendPortalMessage = async (ws, message) => { return new Promise((resolve) => { ws.send(JSON.stringify(message)); resolve(); }); };
Working with Semantic Ports
Authentication (Port 100)
The authentication port (100) represents a Line (1D) geometric form, symbolizing the connection between the user and the system. This is typically the first port you'll interact with:
// Client-side authentication example const loginUser = async (portalConnection, username, password) => { try { // Send login command on authentication port const response = await portalConnection.sendMessage({ port: 100, command: "LOGIN", payload: { user: username, pass: password } }); if (response.status === "OK") { // Store token for future requests localStorage.setItem("dragonfire_token", response.value); return true; } else { console.error("Login failed:", response.message); return false; } } catch (error) { console.error("Authentication error:", error); return false; } };
Profile Data (Port 210)
The profile data port (210) represents a Triangle (2D) geometric form, reflecting the stable structure needed for personal data storage and retrieval:
// Subscribe to profile updates dragonfire.subscribe(210, (profileData) => { console.log("Profile updated:", profileData); updateUserInterface(profileData); }); // Request profile data await portalConnection.sendMessage({ port: 210, command: "GET", payload: { sections: ["basic", "preferences", "history"] } });
Purchases (Port 300)
The purchase port (300) represents a Tetrahedron (3D) geometric form, providing the stable foundation needed for financial transactions:
// Make a purchase const response = await portalConnection.sendMessage({ port: 300, command: "BUY", payload: { item: productId, quantity: quantity, payment: "cardTokenXYZ", shipAddress: "addrTokenABC" } });
Best Practices
Port Selection
When implementing a Portal WebSocket integration, choose ports based on operation intent to align with the geometric nature of the operation:
- Use point-based ports (000-099) for system-level operations
- Use line-based ports (100-199) for user connections and authentication
- Use triangle-based ports (200-299) for stable data operations
- Use tetrahedron-based ports (300-399) for financial exchanges
- Use appropriate 3D form ports (400-799) for complex operations
Error Handling
Implement robust error handling to manage connection issues, message parsing errors, and application-specific errors:
// Error handling example ws.onerror = (error) => { console.error("WebSocket error:", error); initiateReconnection(); }; ws.onclose = (event) => { console.log(`Connection closed. Code: ${event.code}, Reason: ${event.reason}`); if (event.code !== 1000) { // Normal closure initiateReconnection(); } }; // Helper to handle reconnection const initiateReconnection = () => { // Implement exponential backoff strategy const backoffTime = calculateBackoff(attemptCount); setTimeout(() => { console.log(`Attempting reconnection (${attemptCount})...`); initPortalConnection(endpoint, authToken); }, backoffTime); };