Skip to main content

Troubleshooting

This guide covers common issues and solutions when using the Moitribe JavaScript SDK.

Installation Issues​

Module Not Found Error​

Problem: Cannot find module '@veniso/moitribe-js'

Solutions:

# Check if package is installed
npm list @veniso/moitribe-js

# Reinstall if missing
npm install @veniso/moitribe-js

# Clear cache and reinstall
rm -rf node_modules package-lock.json
npm install
Private Package

The SDK is a private package. Ensure you have access credentials configured in your .npmrc file.

TypeScript Type Errors​

Problem: TypeScript cannot find type definitions

Solutions:

// tsconfig.json
{
"compilerOptions": {
"target": "ES2015",
"module": "ESNext",
"moduleResolution": "node",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"skipLibCheck": true
}
}
// Ensure proper import
import MoitribeSDK, { GameInitParams } from '@veniso/moitribe-js';

Authentication Issues​

Login Callback Never Called​

Problem: loginCallback in init() never executes

Solutions:

// Check browser console for errors
console.log('Initializing SDK...');

MoitribeSDK('your-game-id', 'init', {
loginCallback: function(result) {
console.log('Login callback called:', result);
}
});

// Verify network connectivity
fetch('https://api.moitribe.com/v6/api/gsReq.php')
.then(() => console.log('Network OK'))
.catch(err => console.error('Network error:', err));
Game ID

Ensure you're using the correct game ID from your Moitribe dashboard.

OTP Not Received​

Problem: OTP email/SMS not delivered

Solutions:

// Check if OTP generation succeeded
MoitribeSDK(GAME_ID, 'genOtp', {
emailid: 'user@example.com', // or phno: '+1234567890'
callback: function(result) {
if (result.success) {
console.log('OTP sent successfully');
// Show success message to user
} else {
console.error('OTP generation failed:', result.message);
// Show error message and retry option
}
}
});

Common causes:

  • Invalid email format or phone number
  • Rate limiting (wait 60 seconds between requests)
  • Email in spam folder
  • Phone number not in E.164 format

Social Login Fails​

Problem: Social login returns error

Solutions:

// Verify social platform data structure
const socialData = {
socialplat: 'google', // or 'facebook'
id: '123456789',
name: 'John Doe',
email: 'john@example.com',
picture: 'https://example.com/avatar.jpg'
};

// Validate required fields
const required = ['socialplat', 'id', 'name', 'email'];
const missing = required.filter(field => !socialData[field]);

if (missing.length > 0) {
console.error('Missing required fields:', missing);
return;
}

MoitribeSDK(GAME_ID, 'loginWithSocial', {
social: socialData,
callback: function(result) {
console.log('Social login result:', result);
}
});

Leaderboard Issues​

Score Submission Fails​

Problem: submitscore returns error

Solutions:

// Validate score before submission
function submitScore(leaderboardId, score) {
if (typeof leaderboardId !== 'string' || !leaderboardId.trim()) {
console.error('Invalid leaderboard ID');
return;
}

if (typeof score !== 'number' || isNaN(score)) {
console.error('Invalid score value');
return;
}

MoitribeSDK(GAME_ID, 'submitscore', {
leaderboardid: leaderboardId,
score: score,
scoretag: 'optional-metadata', // Optional
callback: function(result) {
if (result.success) {
console.log('Score submitted successfully');
} else {
console.error('Score submission failed:', result.message);
// Retry logic if needed
}
}
});
}

Common causes:

  • Invalid leaderboard ID
  • Score is not a number
  • Player not authenticated
  • Network connectivity issues

Leaderboard Data Not Loading​

Problem: loadleaderboardtopscores returns empty or error

Solutions:

// Check leaderboard metadata first
MoitribeSDK(GAME_ID, 'loadleaderboardmetadata', {
onlyData: true,
callback: function(result) {
if (result.success && result.leaderboards) {
const leaderboard = result.leaderboards.find(lb => lb.id === 'your-leaderboard-id');

if (leaderboard) {
console.log('Leaderboard found:', leaderboard);
loadScores(leaderboard.id);
} else {
console.error('Leaderboard not found');
}
}
}
});

function loadScores(leaderboardId) {
MoitribeSDK(GAME_ID, 'loadleaderboardtopscores', {
leaderboardid: leaderboardId,
collection: 1, // 0 = Social, 1 = Global
timespan: 0, // 0 = All-time, 1 = Weekly, 2 = Daily
maxresults: 25,
onlyData: true,
callback: function(result) {
console.log('Scores loaded:', result);
}
});
}

Real-Time Multiplayer Issues​

Room Creation Fails​

Problem: createstandardroom or createendlessroom fails

Solutions:

// Validate room parameters
function createStandardRoom() {
const params = {
variant: 0,
min_automatch_players: 2,
max_automatch_players: 4,
onRoomCreated: function(success, room) {
if (success) {
console.log('Room created:', room);
} else {
console.error('Room creation failed');
// Retry with different parameters
}
},
onMessageReceived: function(data, senderId, isReliable) {
console.log('Message received:', { data, senderId, isReliable });
}
};

// Validate parameters
if (params.min_automatch_players > params.max_automatch_players) {
console.error('Min players cannot exceed max players');
return;
}

MoitribeSDK(GAME_ID, 'createstandardroom', params);
}

Common causes:

  • Invalid player count parameters
  • Missing required callbacks
  • Network connectivity issues
  • Server-side room limits

Messages Not Received​

Problem: onMessageReceived callback not triggered

Solutions:

// Ensure message callback is properly set
const roomParams = {
// ... other parameters
onMessageReceived: function(data, senderId, isReliable) {
console.log('Message received:', {
data: data,
senderId: senderId,
isReliable: isReliable,
dataType: data.constructor.name
});

// Handle ArrayBuffer data
if (data instanceof ArrayBuffer) {
const view = new DataView(data);
// Process binary data
}
}
};

// Test message sending
function testMessage() {
const testData = new ArrayBuffer(4);
const view = new DataView(testData);
view.setUint32(0, 12345, true);

MoitribeSDK(GAME_ID, 'standardmessage', {
messageData: testData,
participantIds: [], // Empty for broadcast
isReliable: true
});
}

Connection Drops Frequently​

Problem: Room connections disconnect frequently

Solutions:

// Implement reconnection logic
class RoomManager {
constructor() {
this.reconnectAttempts = 0;
this.maxReconnectAttempts = 5;
this.reconnectDelay = 1000;
}

joinRoom(roomId) {
const params = {
// ... room parameters
onRoomDisconnected: () => {
console.log('Room disconnected, attempting to reconnect...');
this.handleReconnection(roomId);
},
onRoomConnected: () => {
console.log('Room connected successfully');
this.reconnectAttempts = 0;
}
};

MoitribeSDK(GAME_ID, 'joinstandardroominvcode', {
invitationID: roomId,
...params
});
}

handleReconnection(roomId) {
if (this.reconnectAttempts < this.maxReconnectAttempts) {
this.reconnectAttempts++;
const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);

setTimeout(() => {
console.log(`Reconnection attempt ${this.reconnectAttempts}...`);
this.joinRoom(roomId);
}, delay);
} else {
console.error('Max reconnection attempts reached');
// Show error to user
}
}
}

Tournament Issues​

Tournament Join Fails​

Problem: groupTournamentJoin returns error

Solutions:

// Check tournament availability first
function joinTournament(tournamentId) {
// Get tournament metadata
MoitribeSDK(GAME_ID, 'groupTournamentData', {
tournamentid: tournamentId,
callback: function(result) {
if (result.success && result.tournament) {
const tournament = result.tournament;

// Check if tournament is active
if (tournament.status !== 'active') {
console.error('Tournament is not active:', tournament.status);
return;
}

// Check if player is eligible
if (tournament.participants && tournament.participants.length >= tournament.maxParticipants) {
console.error('Tournament is full');
return;
}

// Join tournament
MoitribeSDK(GAME_ID, 'groupTournamentJoin', {
tournamentid: tournamentId,
callback: function(joinResult) {
if (joinResult.success) {
console.log('Successfully joined tournament');
} else {
console.error('Failed to join tournament:', joinResult.message);
}
}
});
}
}
});
}

Performance Issues​

Slow Loading Times​

Problem: SDK operations take too long

Solutions:

// Implement caching for frequently accessed data
class DataCache {
constructor() {
this.cache = new Map();
this.cacheTimeout = 5 * 60 * 1000; // 5 minutes
}

set(key, data) {
this.cache.set(key, {
data: data,
timestamp: Date.now()
});
}

get(key) {
const cached = this.cache.get(key);
if (!cached) return null;

if (Date.now() - cached.timestamp > this.cacheTimeout) {
this.cache.delete(key);
return null;
}

return cached.data;
}
}

const dataCache = new DataCache();

// Cached leaderboard loading
function loadLeaderboardScores(leaderboardId) {
const cacheKey = `scores_${leaderboardId}`;
const cached = dataCache.get(cacheKey);

if (cached) {
console.log('Loading from cache...');
return Promise.resolve(cached);
}

return new Promise((resolve) => {
MoitribeSDK(GAME_ID, 'loadleaderboardtopscores', {
leaderboardid: leaderboardId,
collection: 1,
timespan: 0,
maxresults: 25,
onlyData: true,
callback: function(result) {
if (result.success) {
dataCache.set(cacheKey, result.scores);
resolve(result.scores);
} else {
resolve([]);
}
}
});
});
}

Memory Usage High​

Problem: Memory usage increases over time

Solutions:

// Implement object pooling for frequently created objects
class ObjectPool {
constructor(createFn, resetFn, initialSize = 10) {
this.createFn = createFn;
this.resetFn = resetFn;
this.pool = [];

for (let i = 0; i < initialSize; i++) {
this.pool.push(this.createFn());
}
}

get() {
return this.pool.length > 0 ? this.pool.pop() : this.createFn();
}

release(obj) {
this.resetFn(obj);
this.pool.push(obj);
}
}

// Pool for message objects
const messagePool = new ObjectPool(
() => ({ data: null, timestamp: 0, senderId: null }),
(obj) => {
obj.data = null;
obj.timestamp = 0;
obj.senderId = null;
}
);

// Use pooled objects in message handler
function handleMessage(data, senderId, isReliable) {
const message = messagePool.get();
message.data = data;
message.timestamp = Date.now();
message.senderId = senderId;

// Process message...

// Release back to pool
messagePool.release(message);
}

Browser Compatibility Issues​

CORS Errors​

Problem: Cross-origin requests blocked

Solutions:

// Check if running in development
const isDevelopment = window.location.hostname === 'localhost' ||
window.location.hostname === '127.0.0.1';

if (isDevelopment) {
console.log('Running in development mode');
// CORS should not be an issue in development
} else {
console.log('Running in production mode');
// Ensure your domain is whitelisted in Moitribe dashboard
}

// Test API connectivity
function testConnectivity() {
return fetch('https://api.moitribe.com/v6/api/gsReq.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
test: true
})
})
.then(response => {
if (response.ok) {
console.log('API connectivity OK');
return true;
} else {
console.error('API connectivity failed:', response.status);
return false;
}
})
.catch(error => {
console.error('Network error:', error);
return false;
});
}

Internet Explorer Issues​

Problem: SDK doesn't work in IE11

Solutions:

<!-- Include polyfills for IE11 -->
<script src="https://polyfill.io/v3/polyfill.min.js?features=Promise,ArrayBuffer,DataView"></script>
<script src="node_modules/@veniso/moitribe-js/dist/moitribe-sdk.min.js"></script>

<script>
// Check browser compatibility
if (typeof ArrayBuffer === 'undefined' || typeof DataView === 'undefined') {
console.error('Browser not supported');
// Show upgrade browser message
document.getElementById('browser-warning').style.display = 'block';
} else {
// Initialize SDK
MoitribeSDK('your-game-id', 'init', {
loginCallback: function(result) {
console.log('SDK initialized:', result);
}
});
}
</script>

<style>
#browser-warning {
display: none;
background: #ff6b6b;
color: white;
padding: 20px;
text-align: center;
font-family: Arial, sans-serif;
}
</style>

<div id="browser-warning">
<h2>Browser Not Supported</h2>
<p>Please upgrade to a modern browser to use this application.</p>
<p>Recommended browsers: Chrome, Firefox, Safari, Edge</p>
</div>

Debugging Tips​

Enable Debug Logging​

// Enable debug logging in development
if (window.location.hostname === 'localhost') {
// Set log level if SDK supports it
if (window.MoitribeLogger) {
window.MoitribeLogger.setLevel('debug');
}
}

// Create debug wrapper
function debugLog(method, params, result) {
if (window.location.hostname === 'localhost') {
console.group(`Moitribe SDK: ${method}`);
console.log('Parameters:', params);
console.log('Result:', result);
console.groupEnd();
}
}

// Wrap SDK calls
function debugSDK(gameId, method, params, callback) {
const wrappedCallback = function(result) {
debugLog(method, params, result);
if (callback) callback(result);
};

MoitribeSDK(gameId, method, params, wrappedCallback);
}

Network Monitoring​

// Monitor network requests
class NetworkMonitor {
constructor() {
this.requests = [];
this.errors = [];
}

logRequest(method, params) {
this.requests.push({
method: method,
params: params,
timestamp: Date.now()
});
}

logError(method, error) {
this.errors.push({
method: method,
error: error,
timestamp: Date.now()
});
}

getStats() {
return {
totalRequests: this.requests.length,
totalErrors: this.errors.length,
errorRate: (this.errors.length / this.requests.length * 100).toFixed(2) + '%',
recentErrors: this.errors.slice(-5)
};
}
}

const networkMonitor = new NetworkMonitor();

// Use with SDK calls
function monitoredSDKCall(gameId, method, params, callback) {
networkMonitor.logRequest(method, params);

MoitribeSDK(gameId, method, params, function(result) {
if (!result.success) {
networkMonitor.logError(method, result.message);
}

if (callback) callback(result);
});
}

// Check network stats periodically
setInterval(() => {
console.log('Network Stats:', networkMonitor.getStats());
}, 30000); // Every 30 seconds

Getting Help​

If you're still experiencing issues:

  1. Check the Console: Always check browser console for error messages
  2. Verify Network: Ensure you can reach api.moitribe.com
  3. Review Parameters: Double-check all method parameters
  4. Test Isolation: Create a minimal test case to isolate the issue
  5. Contact Support: Reach out to the Veniso development team with:
    • SDK version (1.4.2)
    • Browser and version
    • Error messages from console
    • Steps to reproduce
    • Code example (minimal)
tip

When reporting issues, include the full error object from the callback, not just the message. This helps identify the root cause.

Common Error Codes​

Error CodeDescriptionSolution
NETWORK_ERRORCannot reach Moitribe serversCheck internet connection and firewall
INVALID_GAME_IDGame ID not foundVerify game ID in dashboard
NOT_AUTHENTICATEDPlayer not logged inCall authentication methods first
INVALID_PARAMETERSMethod parameters invalidCheck parameter types and values
RATE_LIMITEDToo many requestsWait and retry with exponential backoff
ROOM_FULLRoom at capacityJoin different room or wait
TOURNAMENT_ENDEDTournament no longer activeCheck tournament schedule

For complete error code reference, see API Reference - Constants.