Skip to main content

tokenizer

  • addToken - Adds a token to the system and returns tokenized array.
  • getToken - Retrieves a token by its key from the system.

Overview​

The Tokenizer module provides functionality for managing and retrieving tokens within the CodeBolt system. Tokens are used for authentication, session management, and various other system operations that require secure key-value storage.

Quick Start​

import codebolt from '@codebolt/codeboltjs';

// Add a token to the system
const result = await codebolt.tokenizer.addToken("api_key_12345");
console.log("Token added:", result.token);
console.log("Count:", result.count);

// Retrieve the token later
const retrieved = await codebolt.tokenizer.getToken("api_key_12345");
console.log("Retrieved tokens:", retrieved.tokens);

Common Workflows​

1. API Key Management​

class APIKeyManager {
async storeKey(service, apiKey) {
const tokenKey = `${service}_api_key`;
const result = await codebolt.tokenizer.addToken(apiKey);

if (result.success) {
console.log(`✅ API key stored for ${service}`);
return { success: true, service, tokenKey };
}

return { success: false, service, error: result.error };
}

async getKey(service) {
const tokenKey = `${service}_api_key`;
const result = await codebolt.tokenizer.getToken(tokenKey);

if (result.success && result.tokens) {
return {
success: true,
service,
apiKey: result.tokens[0]
};
}

return { success: false, service, error: result.error };
}
}

// Usage
const keyManager = new APIKeyManager();
await keyManager.storeKey("openai", "sk-...");
const key = await keyManager.getKey("openai");

2. Session Token Management​

class SessionManager {
constructor() {
this.sessionPrefix = "user_session_";
}

async createSession(userId) {
const sessionKey = `${this.sessionPrefix}${userId}_${Date.now()}`;
const result = await codebolt.tokenizer.addToken(sessionKey);

if (result.success) {
return {
success: true,
sessionKey,
userId,
createdAt: new Date().toISOString()
};
}

return { success: false, error: result.error };
}

async getSession(userId) {
// Find session tokens for user
const sessions = [];
for (let i = 0; i < 10; i++) {
const sessionKey = `${this.sessionPrefix}${userId}_${Date.now() - i * 1000}`;
try {
const result = await codebolt.tokenizer.getToken(sessionKey);
if (result.success && result.tokens) {
sessions.push(...result.tokens);
}
} catch (error) {
// Continue searching
}
}

return sessions;
}
}

// Usage
const sessionManager = new SessionManager();
const session = await sessionManager.createSession("user_123");

3. Token Caching Strategy​

class TokenCache {
constructor(ttl = 30 * 60 * 1000) { // 30 minutes
this.cache = new Map();
this.ttl = ttl;
}

async addToken(key, value) {
const result = await codebolt.tokenizer.addToken(value);

if (result.success) {
this.cache.set(key, {
value,
timestamp: Date.now(),
token: result.token
});
}

return result;
}

async getToken(key) {
const cached = this.cache.get(key);

if (cached && Date.now() - cached.timestamp < this.ttl) {
console.log('Cache hit for:', key);
return {
success: true,
tokens: [cached.value],
cached: true
};
}

console.log('Cache miss for:', key);
const result = await codebolt.tokenizer.getToken(key);

if (result.success && result.tokens) {
this.cache.set(key, {
value: result.tokens[0],
timestamp: Date.now()
});
}

return result;
}

clear() {
this.cache.clear();
console.log('Token cache cleared');
}
}

4. Batch Token Operations​

async function batchAddTokens(tokens) {
const batchSize = 10;
const results = [];

for (let i = 0; i < tokens.length; i += batchSize) {
const batch = tokens.slice(i, i + batchSize);

const batchResults = await Promise.all(
batch.map(token =>
codebolt.tokenizer.addToken(token)
.then(result => ({
token,
success: result.success,
count: result.count
}))
.catch(error => ({
token,
success: false,
error: error.message
}))
)
);

results.push(...batchResults);
console.log(`Processed batch ${Math.floor(i / batchSize) + 1}`);
}

return results;
}

// Usage
const tokens = [
"auth_token_1",
"session_token_2",
"api_key_3",
"refresh_token_4"
];

const results = await batchAddTokens(tokens);

Best Practices​

Token Naming Conventions​

// Good token naming practices
const tokenFormats = {
apiKeys: "service_api_key", // e.g., "openai_api_key"
sessions: "user_session_timestamp", // e.g., "user_123_session_1234567890"
auth: "auth_token_type", // e.g., "auth_token_bearer"
refresh: "refresh_token_userId" // e.g., "refresh_token_user_123"
};

async function addFormattedToken(format, ...args) {
const key = format.replace(/{(\d+)}/g, (_, index) => args[index]);
return await codebolt.tokenizer.addToken(key);
}

// Usage
await addFormattedToken(tokenFormats.apiKeys, "openai");
await addFormattedToken(tokenFormats.sessions, "user_123", Date.now());

Error Handling​

async function safeTokenOperation(operation, key, value = null) {
try {
let result;

if (operation === 'add') {
if (!value) {
throw new Error('Value required for add operation');
}
result = await codebolt.tokenizer.addToken(value);
} else if (operation === 'get') {
result = await codebolt.tokenizer.getToken(key);
} else {
throw new Error('Invalid operation');
}

if (!result.success) {
console.error(`Operation ${operation} failed:`, result.error);
return {
success: false,
operation,
key,
error: result.error
};
}

return {
success: true,
operation,
key,
result
};

} catch (error) {
console.error('Token operation error:', error.message);
return {
success: false,
operation,
key,
error: error.message
};
}
}

Token Validation​

class TokenValidator {
constructor() {
this.patterns = {
apiKey: /^[a-zA-Z0-9_-]{20,}$/,
session: /^[a-zA-Z0-9_-]{10,}$/,
bearer: /^Bearer\s+[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$/
};
}

validateToken(token, type = 'apiKey') {
const pattern = this.patterns[type];

if (!pattern) {
return {
valid: false,
error: `Unknown token type: ${type}`
};
}

const isValid = pattern.test(token);

return {
valid: isValid,
type,
token: isValid ? token : '***REDACTED***'
};
}

async addValidatedToken(token, type = 'apiKey') {
const validation = this.validateToken(token, type);

if (!validation.valid) {
console.error('Invalid token:', validation.error);
return {
success: false,
error: validation.error
};
}

return await codebolt.tokenizer.addToken(token);
}
}

// Usage
const validator = new TokenValidator();
const result = await validator.addValidatedToken("sk-1234567890abcdef", "apiKey");

Performance Considerations​

Token Pool Management​

class TokenPool {
constructor(size = 100) {
this.size = size;
this.pool = [];
}

async initialize() {
console.log(`Initializing token pool with ${this.size} tokens...`);

for (let i = 0; i < this.size; i++) {
const token = `pool_token_${i}_${Date.now()}`;
const result = await codebolt.tokenizer.addToken(token);

if (result.success) {
this.pool.push(result.token);
}
}

console.log(`✅ Token pool initialized with ${this.pool.length} tokens`);
}

async acquire() {
if (this.pool.length === 0) {
throw new Error('Token pool exhausted');
}

const token = this.pool.pop();
return token;
}

async release(token) {
this.pool.push(token);
console.log(`Token released: ${token}`);
}

getStats() {
return {
total: this.size,
available: this.pool.length,
inUse: this.size - this.pool.length
};
}
}

Rate Limiting​

class TokenRateLimiter {
constructor(maxTokensPerSecond = 10) {
this.maxTokensPerSecond = maxTokensPerSecond;
this.tokens = [];
this.lock = false;
}

async addToken(token) {
// Wait if rate limit exceeded
while (this.lock) {
await new Promise(resolve => setTimeout(resolve, 100));
}

this.lock = true;

try {
// Remove tokens older than 1 second
const now = Date.now();
this.tokens = this.tokens.filter(t => now - t.timestamp < 1000);

if (this.tokens.length >= this.maxTokensPerSecond) {
throw new Error('Rate limit exceeded');
}

const result = await codebolt.tokenizer.addToken(token);

if (result.success) {
this.tokens.push({ token, timestamp: now });
}

return result;

} finally {
this.lock = false;
}
}
}

Integration Examples​

With Chat Module​

async function chatWithAuthenticatedRequest(userMessage, authToken) {
// Store auth token
const tokenResult = await codebolt.tokenizer.addToken(authToken);

if (!tokenResult.success) {
throw new Error('Failed to store auth token');
}

// Send authenticated chat message
const response = await codebolt.chat.sendMessage({
message: userMessage,
authToken: authToken
});

return response;
}

With Project Module​

async function setupProjectTokens(projectPath) {
const projectInfo = await codebolt.project.getProjectPath();

if (!projectInfo.success) {
throw new Error('No project open');
}

// Project-specific tokens
const tokens = [
`${projectInfo.projectName}_api_token`,
`${projectInfo.projectName}_session_token`,
`${projectInfo.projectName}_refresh_token`
];

const results = [];

for (const token of tokens) {
const result = await codebolt.tokenizer.addToken(token);
results.push({ token, ...result });
}

return results;
}

With RAG Module​

async function indexWithAuthentication(docFile, authToken) {
// Store auth token
await codebolt.tokenizer.addToken(authToken);

// Use token to access protected content
const knowledge = await codebolt.rag.retrieve_related_knowledge(
"protected content query",
docFile
);

return knowledge;
}

Common Pitfalls​

Pitfall 1: Not Checking Success​

// ❌ Wrong - not checking success
const result = await codebolt.tokenizer.addToken("my_token");
console.log(result.token); // May be undefined

// ✅ Correct - check success first
const result = await codebolt.tokenizer.addToken("my_token");
if (result.success) {
console.log(result.token);
} else {
console.error('Failed to add token:', result.error);
}

Pitfall 2: Storing Sensitive Data Without Encryption​

// ❌ Wrong - plain text sensitive data
await codebolt.tokenizer.addToken("password_secret123");

// ✅ Correct - encrypt sensitive data
const encrypted = encrypt("password_secret123");
await codebolt.tokenizer.addToken(encrypted);

Pitfall 3: No Cleanup​

// ❌ Wrong - tokens accumulate
for (let i = 0; i < 1000; i++) {
await codebolt.tokenizer.addToken(`token_${i}`);
}

// ✅ Correct - implement cleanup
class TokenCleaner {
async cleanupOldTokens(maxAge = 24 * 60 * 60 * 1000) { // 24 hours
// Implementation depends on token storage
console.log('Cleaning up old tokens...');
}
}

Advanced Patterns​

Token Rotation​

class TokenRotator {
constructor() {
this.currentToken = null;
this.previousTokens = [];
}

async rotateToken(service) {
// Store old token
if (this.currentToken) {
this.previousTokens.push(this.currentToken);
}

// Generate new token
const newToken = `${service}_token_${Date.now()}`;
const result = await codebolt.tokenizer.addToken(newToken);

if (result.success) {
this.currentToken = newToken;
console.log(`✅ Token rotated for ${service}`);
return newToken;
}

throw new Error('Token rotation failed');
}

getCurrentToken() {
return this.currentToken;
}

async rollback() {
if (this.previousTokens.length === 0) {
throw new Error('No previous tokens to rollback to');
}

this.currentToken = this.previousTokens.pop();
console.log('✅ Rolled back to previous token');
return this.currentToken;
}
}

Distributed Token Management​

class DistributedTokenManager {
constructor() {
this.managers = [];
}

addManager(manager) {
this.managers.push(manager);
}

async distributeToken(token) {
const results = await Promise.all(
this.managers.map(manager =>
codebolt.tokenizer.addToken(token)
.then(result => ({
manager: manager.name,
success: result.success
}))
.catch(error => ({
manager: manager.name,
success: false,
error: error.message
}))
)
);

return {
token,
distribution: results,
successful: results.filter(r => r.success).length
};
}
}